Buttons
Inline Link Button
A borderless link button living inside a sentence: it inherits the paragraph's type, and its underline is a dotted rule painted from the background.
- button
- link
- inline
- typography
Preview
Use it with AI
- 1. Copy the link.
- 2. Write to your agent in your own words and drop the link into the sentence.
- 3. The agent opens the link and installs the component from the registry.
put this in the header: https://vibeui.ru/c/button-035?lang=en
We charge on the 30th. You can в любой момент.
Show the full instructions
What the link says, spelled out. Use it when your agent cannot open links — paste this text instead.
# Install and place "button-035" (Inline Link Button) from VibeUI
## 1. Install first — do not skip, do not recreate
Run this exact command before writing any code:
npx shadcn@latest add https://vibeui.ru/r/button-035.json
Registry item: https://vibeui.ru/r/button-035.json
Installs to: components/vibeui/button-035.tsx (the exact path follows this project's components.json aliases).
npm dependencies: none.
Registry dependencies: none.
Install it from the registry. Do not recreate it from the description,
do not substitute a similar component from another library, and do not
rewrite it to match the project's existing style.
## 2. What it is
A borderless link button living inside a sentence: it inherits the paragraph's type, and its underline is a dotted rule painted from the background.
A textual action inside a paragraph. The button sets neither size nor height — it takes them from the line through font:inherit, so the leading never breaks. At rest the underline is dotted and painted as a background rule; on hover and focus it thickens into a solid line and the colour deepens. Zero dependencies, one file.
## 3. How to use it
import { Button035 } from "@/components/vibeui/button-035"
<Button035 before="We charge on the 30th. You can " after=" at any time." onClick={openBilling}>
change payment method
</Button035>
Read the installed file for the full prop list.
## 4. Where to place it
This is a small inline component. Put it exactly where the user asked,
inside the existing markup. Do not create a new page, section or
wrapper for it. If a similar control already sits in that spot,
replace it instead of adding a second one.
Placement: ___
(The user fills this line in. If it is still blank, ask where to put it
instead of guessing.)
## 5. Keep exactly as installed
- font:inherit and zero padding on the button: any type size of its own tears the line apart
- the underline via background-image and background-size rather than text-decoration — only that way can its weight be driven
- the text before and after the button: the component demonstrates behaviour in flow, not a standalone control
- the underline change on focus-visible, not only on hover
- the separate focus ring above the underline: an underline on its own is not a focus indicator
- the paper background of the paragraph — it is what makes the dark text visible
## 6. You may change
- the label
- the surrounding text through the before and after props
- the accent colour through the accent prop
- the onClick handler
- the paragraph's type size and leading: the button follows on its own
## 7. Rules
- Do not give the button a height or padding: it has to stay part of the line rather than become an inline chip.
- Do not swap <button> for an <a> without href — navigation needs a real link, while this one acts in place.
- Do not strip the surrounding text and keep the button alone: the component is about behaviour inside a sentence.
- Do not lift the CSS variables into globals.css: the component has to stay a single file.
## 8. Verify
- it renders with no console errors;
- it looks like the preview on the VibeUI page you copied this from;
- if it does not, you changed something listed in section 5 — put it back.For developers
npx shadcn@latest add https://vibeui.ru/r/button-035.jsonhttps://vibeui.ru/r/button-035.jsonКомпонент самодостаточен: один файл, без зависимостей, собственная палитра в локальных переменных --vibeui-button-035-*. Серверный компонент. Корень — <p> с текстом до и после кнопки: без окружения проверить наследование типографики нельзя, поэтому оно часть компонента. Сама кнопка объявлена font:inherit и padding:0, поэтому не ломает строку; подчёркивание сделано background-image с background-size, а не text-decoration, — так его толщина и отступ управляются точно и анимируются.
Component source
The same file your agent installs. Here in case you would rather copy it by hand.
import type {
ComponentPropsWithoutRef,
CSSProperties,
MouseEventHandler,
} from "react"
export type Button035Props = Omit<
ComponentPropsWithoutRef<"p">,
"children" | "onClick"
> & {
children?: string
/** Текст до кнопки: она рассчитана стоять внутри фразы. */
before?: string
after?: string
onClick?: MouseEventHandler<HTMLButtonElement>
accent?: string
}
// Идея компонента: действие внутри фразы. У кнопки нет ни рамки, ни фона,
// ни своего кегля — font:inherit и baseline-выравнивание берут типографику
// у абзаца, поэтому строка не разъезжается. Подчёркивание нарисовано
// фоновой линейкой, а не text-decoration: его толщину и отступ видно на глаз.
const STYLES = `
:where([data-vibeui-block="button-035"]){
--vibeui-button-035-surface:oklch(1 0 0);
--vibeui-button-035-border:oklch(0.91 0.005 265);
--vibeui-button-035-fg:oklch(0.42 0.012 265);
--vibeui-button-035-accent:oklch(0.53 0.19 285);
--vibeui-button-035-font:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
}
[data-vibeui-block="button-035"]{
box-sizing:border-box;width:100%;max-width:24rem;margin:0;
padding:0.875rem 1rem;border:1px solid var(--vibeui-button-035-border);
border-radius:0.75rem;background:var(--vibeui-button-035-surface);
font-family:var(--vibeui-button-035-font);font-size:0.9375rem;line-height:1.6;
color:var(--vibeui-button-035-fg);
}
[data-vibeui-block="button-035"] [data-part="button"]{
appearance:none;border:0;background:transparent;padding:0;margin:0;cursor:pointer;
font:inherit;color:var(--vibeui-button-035-accent);font-weight:600;
/* Пунктир как фоновая линейка: толщина и отступ задаются точно. */
background-image:linear-gradient(to right,currentColor 55%,transparent 55%);
background-size:5px 1px;background-repeat:repeat-x;background-position:0 1.15em;
transition:background-size .16s ease,color .16s ease;
}
[data-vibeui-block="button-035"] [data-part="button"]:hover:not(:disabled),
[data-vibeui-block="button-035"] [data-part="button"]:focus-visible{
background-size:5px 2px;
color:color-mix(in oklab,var(--vibeui-button-035-accent) 80%,black);
}
[data-vibeui-block="button-035"] [data-part="button"]:focus-visible{
outline:2px solid var(--vibeui-button-035-accent);outline-offset:2px;border-radius:2px;
}
[data-vibeui-block="button-035"] [data-part="button"]:disabled{cursor:not-allowed;opacity:.5}
@media (prefers-reduced-motion:reduce){[data-vibeui-block="button-035"] *{animation:none!important;transition:none!important}}
`
/**
* Кнопка-ссылка без рамки: наследует кегль и цвет строки, в которой стоит.
* Один файл, ноль зависимостей, собственная палитра.
*/
export function Button035({
children = "изменить способ оплаты",
before = "Списание произойдёт 30 числа. Можно ",
after = " в любой момент.",
onClick,
accent,
className,
style,
...props
}: Button035Props) {
const palette = {
...(accent ? { "--vibeui-button-035-accent": accent } : null),
...style,
} as CSSProperties
return (
<>
<style href="vibeui-button-035" precedence="medium">
{STYLES}
</style>
<p
{...props}
data-vibeui-block="button-035"
className={className}
style={palette}
>
{before}
<button type="button" data-part="button" onClick={onClick}>
{children}
</button>
{after}
</p>
</>
)
}