@kb.ui/react 0.11.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +79 -66
  2. package/dist/components/ConfirmAction/ConfirmAction.d.ts +42 -0
  3. package/dist/components/Dashboard/Dashboard.d.ts +17 -0
  4. package/dist/components/Form/Form.d.ts +19 -0
  5. package/dist/components/FormSection/FormSection.d.ts +26 -0
  6. package/dist/components/Gallery/Gallery.d.ts +26 -0
  7. package/dist/components/PageHeader/PageHeader.d.ts +27 -0
  8. package/dist/components/Panel/Panel.d.ts +3 -1
  9. package/dist/components/Settings/Settings.d.ts +11 -0
  10. package/dist/components/Skeleton/Skeleton.d.ts +8 -6
  11. package/dist/components/Stack/Stack.d.ts +15 -0
  12. package/dist/components/StatsRow/StatsRow.d.ts +33 -0
  13. package/dist/components/SupportingPane/SupportingPane.d.ts +15 -0
  14. package/dist/index.d.ts +10 -0
  15. package/dist/index.js +718 -333
  16. package/dist/index.js.map +1 -1
  17. package/dist/styles.css +1 -1
  18. package/docs/components/Accordion.md +9 -9
  19. package/docs/components/Avatar.md +4 -4
  20. package/docs/components/Badge.md +4 -4
  21. package/docs/components/Button.md +8 -8
  22. package/docs/components/Callout.md +3 -3
  23. package/docs/components/Card.md +4 -4
  24. package/docs/components/Checkbox.md +5 -5
  25. package/docs/components/Code.md +2 -2
  26. package/docs/components/CodeBlock.md +7 -7
  27. package/docs/components/Collection.md +5 -5
  28. package/docs/components/CollectionList.md +6 -6
  29. package/docs/components/CollectionRow.md +11 -11
  30. package/docs/components/Combobox.md +3 -3
  31. package/docs/components/ConfirmAction.md +100 -0
  32. package/docs/components/Container.md +2 -2
  33. package/docs/components/CopyableText.md +9 -9
  34. package/docs/components/Dashboard.md +81 -0
  35. package/docs/components/DescriptionList.md +3 -3
  36. package/docs/components/Dialog.md +7 -7
  37. package/docs/components/Disclosure.md +4 -4
  38. package/docs/components/EmptyState.md +1 -1
  39. package/docs/components/ErrorSummary.md +5 -3
  40. package/docs/components/Fieldset.md +6 -6
  41. package/docs/components/FileInput.md +5 -5
  42. package/docs/components/Form.md +67 -0
  43. package/docs/components/FormActions.md +3 -3
  44. package/docs/components/FormSection.md +57 -0
  45. package/docs/components/Gallery.md +84 -0
  46. package/docs/components/Grid.md +13 -13
  47. package/docs/components/Heading.md +3 -3
  48. package/docs/components/Image.md +3 -3
  49. package/docs/components/Inline.md +3 -3
  50. package/docs/components/Input.md +3 -3
  51. package/docs/components/Link.md +2 -2
  52. package/docs/components/Menu.md +5 -5
  53. package/docs/components/MultiSelect.md +2 -2
  54. package/docs/components/NumberField.md +5 -5
  55. package/docs/components/PageHeader.md +68 -0
  56. package/docs/components/Panel.md +11 -3
  57. package/docs/components/Popover.md +9 -9
  58. package/docs/components/Progress.md +1 -1
  59. package/docs/components/RadioGroup.md +3 -3
  60. package/docs/components/ScrollArea.md +1 -1
  61. package/docs/components/Select.md +2 -2
  62. package/docs/components/Separator.md +3 -3
  63. package/docs/components/Settings.md +57 -0
  64. package/docs/components/Skeleton.md +56 -16
  65. package/docs/components/Spinner.md +9 -4
  66. package/docs/components/Split.md +4 -4
  67. package/docs/components/Stack.md +54 -0
  68. package/docs/components/Stat.md +1 -1
  69. package/docs/components/StatsRow.md +80 -0
  70. package/docs/components/Status.md +7 -6
  71. package/docs/components/SupportingPane.md +59 -0
  72. package/docs/components/Switch.md +5 -5
  73. package/docs/components/Table.md +12 -12
  74. package/docs/components/Tabs.md +10 -10
  75. package/docs/components/Text.md +2 -2
  76. package/docs/components/Textarea.md +4 -4
  77. package/docs/components/Thumbnail.md +7 -7
  78. package/docs/components/Toast.md +9 -9
  79. package/docs/components/Toolbar.md +4 -4
  80. package/docs/components/Tooltip.md +3 -3
  81. package/package.json +1 -1
@@ -23,7 +23,7 @@ export function Example() {
23
23
 
24
24
  - [Document hierarchy](https://kbui.kcb.pro/storybook/?path=/story/components-heading--hierarchy): Compare semantic heading ranks.
25
25
  - [Visual hierarchy](https://kbui.kcb.pro/storybook/?path=/story/components-heading--sizes): Compare sizes separately from heading rank.
26
- - [A complete article](https://kbui.kcb.pro/storybook/?path=/story/components-heading--article): Combine Heading, Text, Link, and Code.
26
+ - [A complete article](https://kbui.kcb.pro/storybook/?path=/story/components-heading--article): Combine `Heading`, `Text`, `Link`, and `Code`.
27
27
 
28
28
  ## Reference
29
29
 
@@ -33,8 +33,8 @@ export function Example() {
33
33
  | `size` | `sm` \| `md` \| `lg` \| `xl` \| `display` | From level | Levels 1–6 map to xl, lg, md, sm, sm, sm; display is an explicit hero size |
34
34
  | `className`, `ref` | Native heading props | unset | Classes merge; ref targets native heading |
35
35
 
36
- Use one page title and nest section ranks without skipping levels. Adjust `size` for context without changing the outline. Headings have no margin; use Grid or parent layout for spacing. See [Typography](https://github.com/KhallilB/kbui/blob/main/docs/guides/typography.md) for composition, CSS recipes and accessibility guidance.
36
+ Use one page title and nest section ranks without skipping levels. Adjust `size` for context without changing the outline. Headings have no margin; use `Grid` or parent layout for spacing. See [Typography](https://github.com/KhallilB/kbui/blob/main/docs/guides/typography.md) for composition, CSS recipes and accessibility guidance.
37
37
 
38
38
  ## Related components
39
39
 
40
- Pair with [Text](Text.md), [Link](Link.md), and [Code](Code.md) for readable document content.
40
+ Pair with [`Text`](Text.md), [`Link`](Link.md), and [`Code`](Code.md) for readable document content.
@@ -53,10 +53,10 @@ export function Example() {
53
53
 
54
54
  The frame exposes `data-state="empty|loading|loaded|error"`, `data-ratio`, and `data-fit`. The internal native image is hidden from assistive technology; the outer image role owns the alternative across all states. `aria-label`, `aria-labelledby`, and `aria-describedby` belong to the frame. An empty `alt` always hides the complete image.
55
55
 
56
- `auto` uses positive width and height; without both, it falls back to the landscape ratio. The image remains within the reserved frame, including after failure. A caller `style.aspectRatio` overrides framing. Image fetches follow native browser behavior; the component adds no timeout, retry loop, cache, upload or URL policy. A new source starts a fresh request; to retry the same URL intentionally, change the component key.
56
+ `auto` uses positive width and height; without both, it falls back to the landscape ratio. The image remains within the reserved frame, including after failure. A caller `style.aspectRatio` overrides framing. `Image` fetches follow native browser behavior; the component adds no timeout, retry loop, cache, upload or URL policy. A new source starts a fresh request; to retry the same URL intentionally, change the component key.
57
57
 
58
- Fallback content is visual-only and must contain no controls. Place a named replacement/retry Button and meaningful error text outside the frame. Use [media recipes](../../../../docs/guides/media-and-identity.md) for responsive sources, localized errors and CSS-only markup.
58
+ Fallback content is visual-only and must contain no controls. Place a named replacement/retry `Button` and meaningful error text outside the frame. Use [media recipes](../../../../docs/guides/media-and-identity.md) for responsive sources, localized errors and CSS-only markup.
59
59
 
60
60
  ## Related components
61
61
 
62
- Use [Avatar](Avatar.md) for fixed-size identity, [Thumbnail](Thumbnail.md) for captions and metadata, and [Grid](Grid.md) for responsive collections.
62
+ Use [`Avatar`](Avatar.md) for fixed-size identity, [`Thumbnail`](Thumbnail.md) for captions and metadata, and [`Grid`](Grid.md) for responsive collections.
@@ -1,6 +1,6 @@
1
1
  # Inline
2
2
 
3
- Wrapping row for independent content or controls. Adds no toolbar role or keyboard handling; controls retain native tab order. Native props and matching ref pass through.
3
+ Use `Inline` for a row of content or controls that wraps when space runs out. Each control keeps its normal Tab stop; the row adds no toolbar role or keyboard handling. Native HTML props and the matching `ref` pass through.
4
4
 
5
5
  [All components](../../README.md#components) · [Usage](#usage) · [Examples](#more-examples) · [Reference](#reference) · [Live examples and accessibility](https://kbui.kcb.pro/storybook/?path=/docs/layout-inline--docs)
6
6
 
@@ -35,8 +35,8 @@ export function Example() {
35
35
  | `align` | `start` `center` `end` `baseline` `stretch` | `center` |
36
36
  | `justify` | `start` `center` `end` `between` | `start` |
37
37
 
38
- Non-default generic native elements require an explicit `as`. Lists retain markers and native list spacing. Use li children. Choose Toolbar when actions require its coordinated arrow-key model. See [Layout composition](https://github.com/KhallilB/kbui/blob/main/docs/guides/layout.md).
38
+ Set `as` explicitly when using an element other than the default. Lists keep their markers and outer spacing; `gap` controls spacing between `<li>` children. Choose `Toolbar` when actions need arrow-key navigation. See [Layout composition](https://github.com/KhallilB/kbui/blob/main/docs/guides/layout.md).
39
39
 
40
40
  ## Related components
41
41
 
42
- Use [Toolbar](Toolbar.md) when actions need coordinated arrow-key navigation. Use [Grid](Grid.md) when items need shared columns.
42
+ Use [`Toolbar`](Toolbar.md) when actions need coordinated arrow-key navigation. Use [`Stack`](Stack.md) for vertical flow and [`Grid`](Grid.md) when items need shared columns.
@@ -1,6 +1,6 @@
1
1
  # Input
2
2
 
3
- Use Input for text entry. It keeps the label, help text, and error message together, and has space for icons or actions at either end.
3
+ Use `Input` for text entry. It keeps the label, help text, and error message together, and has space for icons or actions at either end.
4
4
 
5
5
  [All components](../../README.md#components) · [Usage](#usage) · [Examples](#more-examples) · [Reference](#reference) · [Live examples and accessibility](https://kbui.kcb.pro/storybook/?path=/docs/components-input--docs)
6
6
 
@@ -33,7 +33,7 @@ export function Example() {
33
33
  | `size` | `"sm" \| "md" \| "lg"` | `"md"` | Field height. Replaces the native `size` attribute |
34
34
  | `className` | `string` | | Applied to the wrapper, not the input element |
35
35
 
36
- Other native input props, including `value` and `defaultValue`, pass through to the input. Base UI's `onValueChange` is also supported.
36
+ Other native `input` props, including `value` and `defaultValue`, pass through to the input. Base UI's `onValueChange` is also supported.
37
37
 
38
38
  ## Search composition
39
39
 
@@ -79,4 +79,4 @@ The field label names the input. Give each action its own accessible name, and h
79
79
 
80
80
  ## Related components
81
81
 
82
- Use [Textarea](Textarea.md) for multiline answers, [NumberField](NumberField.md) for numeric stepping, and [Combobox](Combobox.md) for a searchable choice from existing values.
82
+ Use [`Textarea`](Textarea.md) for multiline answers, [`NumberField`](NumberField.md) for numeric stepping, and [`Combobox`](Combobox.md) for a searchable choice from existing values.
@@ -28,7 +28,7 @@ export function Example() {
28
28
  | `target`, `rel`, `download`, `aria-current` | Native anchor props | unset | Passed through without rewriting |
29
29
  | `className`, `ref` | Native anchor props | unset | Ref targets anchor |
30
30
 
31
- Use descriptive link text. Use Button for an action. Links inherit surrounding type size; Tab focuses, Enter follows, and Space retains native behavior. Callers own new-tab wording and target/rel policy. No disabled link is provided. Color, underline and focus must remain visible.
31
+ Use descriptive link text. Use `Button` for an action. Links inherit surrounding type size; Tab focuses, Enter follows, and Space retains native behavior. Callers own new-tab wording and target/rel policy. No disabled link is provided. Color, underline and focus must remain visible.
32
32
 
33
33
  ### Router links
34
34
 
@@ -49,4 +49,4 @@ const AppLink = ({ href, ...props }: LinkProps) => <RouterLink to={href} {...pro
49
49
 
50
50
  ## Related components
51
51
 
52
- Use [Button](Button.md) for an action and [Card](Card.md) to group content around a destination.
52
+ Use [`Button`](Button.md) for an action and [`Card`](Card.md) to group content around a destination.
@@ -1,6 +1,6 @@
1
1
  # Menu
2
2
 
3
- Offer a short list of actions without leaving the current context. Use a Select when people are choosing a saved field value.
3
+ Offer a short list of actions without leaving the current context. Use a `Select` when people are choosing a saved field value.
4
4
 
5
5
  [All components](../../README.md#components) · [Usage](#usage) · [Examples](#more-examples) · [Reference](#reference) · [Live examples and accessibility](https://kbui.kcb.pro/storybook/?path=/docs/components-menu--docs)
6
6
 
@@ -25,14 +25,14 @@ export function Example() {
25
25
  ## More examples
26
26
 
27
27
  - [Keyboard interaction](https://kbui.kcb.pro/storybook/?path=/story/components-menu--default): Try the trigger, arrow keys, and dismissal.
28
- - [A themed popup](https://kbui.kcb.pro/storybook/?path=/story/components-menu--nested-theme): Keep a portaled popup within its intended theme.
28
+ - [A themed popup](https://kbui.kcb.pro/storybook/?path=/story/components-menu--nested-theme): Check that the popup uses its parent theme.
29
29
 
30
30
  ## Reference
31
31
 
32
32
  | Part | Props and responsibility |
33
33
  | ---------------- | ---------------------------------------------------------------------------------------- |
34
- | `Menu` | Root; use open/defaultOpen and onOpenChange when your app controls visibility |
35
- | `Menu.Trigger` | Named trigger; render a Button for shared styling |
34
+ | `Menu` | Root; use open/`defaultOpen` and `onOpenChange` when your app controls visibility |
35
+ | `Menu.Trigger` | Named trigger; render a `Button` for shared styling |
36
36
  | `Menu.Content` | Popup; side defaults to bottom, align to start; container chooses the themed portal host |
37
37
  | `Menu.Item` | Action text and click handler; disabled prevents selection |
38
38
  | `Menu.Separator` | Divides related groups without adding a focus stop |
@@ -41,4 +41,4 @@ Name the trigger, keep action labels specific, and retain the default arrow-key
41
41
 
42
42
  ## Related components
43
43
 
44
- Use [Select](Select.md) for a saved field value and [Dialog](Dialog.md) for a focused task with content or fields.
44
+ Use [`Select`](Select.md) for a saved field value and [`Dialog`](Dialog.md) for a focused task with content or fields.
@@ -1,6 +1,6 @@
1
1
  # MultiSelect
2
2
 
3
- Use MultiSelect when people need to search a longer list and keep multiple selections visible as removable chips. Selected values render inside a named chip toolbar with keyboard arrow/Backspace/Delete support and per-chip remove buttons. Choosing or deselecting an option keeps the popup open and preserves the filter. Escape, an outside click, or the toggle closes it.
3
+ Use `MultiSelect` when people need to search a longer list and keep multiple selections visible as removable chips. Selected values render inside a named chip toolbar with keyboard arrow/Backspace/Delete support and per-chip remove buttons. Choosing or deselecting an option keeps the popup open and preserves the filter. Escape, an outside click, or the toggle closes it.
4
4
 
5
5
  [All components](../../README.md#components) · [Usage](#usage) · [Examples](#more-examples) · [Reference](#reference) · [Live examples and accessibility](https://kbui.kcb.pro/storybook/?path=/docs/components-multiselect--docs)
6
6
 
@@ -56,4 +56,4 @@ export function ScopeMultiSelect() {
56
56
 
57
57
  ## Related components
58
58
 
59
- Use [Combobox](Combobox.md) for one searchable choice and [Checkbox](Checkbox.md) for independent choices that should remain visible.
59
+ Use [`Combobox`](Combobox.md) for one searchable choice and [`Checkbox`](Checkbox.md) for independent choices that should remain visible.
@@ -1,6 +1,6 @@
1
1
  # NumberField
2
2
 
3
- Use NumberField for quantities people can type or adjust with step buttons. Your app sets the range and validates the value. See [Numeric fields](https://github.com/KhallilB/kbui/blob/main/docs/guides/number-fields.md) for examples, keyboard behavior, and styling. Available since v0.6.0.
3
+ Use `NumberField` for quantities people can type or adjust with step buttons. Your app sets the range and validates the value. See [Numeric fields](https://github.com/KhallilB/kbui/blob/main/docs/guides/number-fields.md) for examples, keyboard behavior, and styling. Available since v0.6.0.
4
4
 
5
5
  [All components](../../README.md#components) · [Usage](#usage) · [Examples](#more-examples) · [Reference](#reference) · [Live examples and accessibility](https://kbui.kcb.pro/storybook/?path=/docs/components-numberfield--docs)
6
6
 
@@ -31,11 +31,11 @@ export function Example() {
31
31
  }
32
32
  ```
33
33
 
34
- The field can be empty (`null`), and directly typed values remain available for your app to validate. The example validates a whole-number quantity; `min`, `max`, and `step` govern stepping. See [numeric-field state and interaction](https://github.com/KhallilB/kbui/blob/main/docs/guides/number-fields.md#state-and-interaction) for locale and draft behavior.
34
+ The field can be empty (`null`), and directly typed values remain available for your app to validate. The example validates a whole-number quantity; `min`, `max`, and `step` control the step buttons and stepping keys. See [numeric-field state and interaction](https://github.com/KhallilB/kbui/blob/main/docs/guides/number-fields.md#state-and-interaction) for locale and draft behavior.
35
35
 
36
36
  ## More examples
37
37
 
38
- - [An unanswered quantity](https://kbui.kcb.pro/storybook/?path=/story/components-numberfield--empty): Represent an empty field with null.
38
+ - [An unanswered quantity](https://kbui.kcb.pro/storybook/?path=/story/components-numberfield--empty): Use `null` for an empty field.
39
39
  - [Validation feedback](https://kbui.kcb.pro/storybook/?path=/story/components-numberfield--invalid): Explain a value that needs correction.
40
40
  - [Fractional steps](https://kbui.kcb.pro/storybook/?path=/story/components-numberfield--fractional): Compare non-integer increments.
41
41
 
@@ -58,8 +58,8 @@ The field can be empty (`null`), and directly typed values remain available for
58
58
  | `inputRef`, `inputProps` | input ref / native props | unset | Visible input access and supported native event or ARIA extensions |
59
59
  | `className`, `groupClassName`, `inputClassName` | `string` | unset | Classes for root, step group, and input |
60
60
 
61
- Native div props and the root ref pass through to the wrapper. Any `aria-describedby` values from the root and `inputProps` are added after the help and error IDs. Use the explicit NumberField props for the input’s value, type, disabled/read-only state, name, required state, and ref; `inputProps` cannot override those. Custom event handlers can prevent defaults, so take care to preserve keyboard behavior.
61
+ Native `<div>` props and the root `ref` apply to the wrapper. Root and `inputProps` descriptions follow the help and error IDs in `aria-describedby`. Set the input’s value, type, disabled/read-only state, name, required state and ref through `NumberField` props; `inputProps` cannot override them. Custom event handlers can prevent default actions, so check keyboard behavior after adding them.
62
62
 
63
63
  ## Related components
64
64
 
65
- Use [Input](Input.md) for text or identifiers whose leading zeroes and exact characters must be preserved.
65
+ Use [`Input`](Input.md) for text or identifiers whose leading zeroes and exact characters must be preserved.
@@ -0,0 +1,68 @@
1
+ # PageHeader
2
+
3
+ Open a screen with its title, short context, status and page-level actions. Use one per screen, at the top of `main`.
4
+
5
+ [All components](../../README.md#components) · [Usage](#usage) · [Examples](#more-examples) · [Reference](#reference) · [Live examples and accessibility](https://kbui.kcb.pro/storybook/?path=/docs/components-pageheader--docs)
6
+
7
+ ## Usage
8
+
9
+ ```tsx
10
+ import "@kb.ui/react/styles.css";
11
+ import { Badge, Button, Link, PageHeader } from "@kb.ui/react";
12
+
13
+ export function Example() {
14
+ return (
15
+ <main>
16
+ <PageHeader
17
+ navigation={<Link href="/orders">← All orders</Link>}
18
+ eyebrow="Order"
19
+ title="#10482"
20
+ meta={<Badge tone="success">Paid</Badge>}
21
+ description="Placed on 12 October 2026 by Ana Ruiz · 3 items · €184.00"
22
+ actions={
23
+ <>
24
+ <Button variant="secondary">Refund</Button>
25
+ <Button>Fulfil order</Button>
26
+ </>
27
+ }
28
+ />
29
+ </main>
30
+ );
31
+ }
32
+ ```
33
+
34
+ The title renders as an `h1`. Actions sit at the end of the title row. Below 40rem of header width they take their own row under the heading, still end-aligned; wider headers move them below only when the heading's minimum width no longer fits.
35
+
36
+ ## More examples
37
+
38
+ - [Detail with status](https://kbui.kcb.pro/storybook/?path=/story/components-pageheader--detail-with-status): Add a back link, an object-type eyebrow and status badges to a record screen.
39
+ - [Breadcrumbs](https://kbui.kcb.pro/storybook/?path=/story/components-pageheader--breadcrumbs): Place a labelled breadcrumb `nav` in `navigation` for nested settings.
40
+ - [With tabs](https://kbui.kcb.pro/storybook/?path=/story/components-pageheader--with-tabs): Put a `Tabs.List` in the body and draw a divider above the panels.
41
+ - [Sizes](https://kbui.kcb.pro/storybook/?path=/story/components-pageheader--sizes): Choose `sm` for dense app shells and `lg` for landing screens.
42
+ - [Narrow wrap](https://kbui.kcb.pro/storybook/?path=/story/components-pageheader--narrow-wrap): See long titles wrap and actions move below the heading at 320 pixels.
43
+
44
+ ## Reference
45
+
46
+ | Prop | Type | Default | Notes |
47
+ | -------------- | --------------- | -------- | --------------------------------------------------------------------------------------------------------------------- |
48
+ | `title` | `ReactNode` | required | Page name, rendered as the heading |
49
+ | `description` | `ReactNode` | unset | One or two sentences of context below the title |
50
+ | `eyebrow` | `ReactNode` | unset | Short section or object-type label above the title |
51
+ | `navigation` | `ReactNode` | unset | Back link or breadcrumb `nav` above the heading |
52
+ | `meta` | `ReactNode` | unset | `Status` badges or metadata beside the title; kept out of the heading's accessible name |
53
+ | `actions` | `ReactNode` | unset | Page-level buttons or links; end-aligned, wrapping below the heading when narrow |
54
+ | `headingLevel` | `1` / `2` / `3` | `1` | Heading rank; lower it only when the header introduces a region below an existing `h1` |
55
+ | `size` | `sm` / `md` / `lg` | `md` | Title scale: `sm` uses the `h2` size, `md` the `h1` size, `lg` the display size |
56
+ | `divider` | `boolean` | `false` | Draws a rule below the header |
57
+ | `children` | `ReactNode` | unset | Header body below the title row, such as a `Tabs.List` or filters |
58
+ | `classNames` | keyed classes | unset | Style `navigation`, `main`, `heading`, `eyebrow`, `headline`, `title`, `meta`, `description`, `actions`, `body` |
59
+
60
+ The root is a `div`, not `header`. A `header` outside `main` or a sectioning element becomes a banner landmark and would compete with the site header. Other native `div` props pass through to the root.
61
+
62
+ Keep one primary action. Put secondary actions before it and move rarely used actions into a [`Menu`](Menu.md).
63
+
64
+ For breadcrumbs, use a labelled `nav` with an ordered list and mark the current item with `aria-current="page"`. Reset list-item margins when using flex layout with `gap`, allow the trail to wrap, and hide decorative separators from assistive technology. Links keep their normal Tab order. See the [breadcrumb example](https://kbui.kcb.pro/storybook/?path=/story/components-pageheader--breadcrumbs) and [WAI breadcrumb pattern](https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/).
65
+
66
+ ## Related components
67
+
68
+ Use [`Heading`](Heading.md) for section titles inside the page, [`EmptyState`](EmptyState.md) when the page has no content yet, [`Toolbar`](Toolbar.md) for a dense group of controls that act on the content below, and [`Container`](Container.md) to set the page width the header shares with its content.
@@ -1,6 +1,6 @@
1
1
  # Panel
2
2
 
3
- Use Panel for a section that needs a header, body, and actions. Its parts help keep those areas aligned. Give the section an accessible name with `aria-labelledby`, pointing to the heading in `Panel.Header`.
3
+ Use `Panel` for a section that needs a header, body, and actions. Its parts help keep those areas aligned. Give the section an accessible name with `aria-labelledby`, pointing to the heading in `Panel.Header`.
4
4
 
5
5
  [All components](../../README.md#components) · [Usage](#usage) · [Examples](#more-examples) · [Reference](#reference) · [Live examples and accessibility](https://kbui.kcb.pro/storybook/?path=/docs/components-panel--docs)
6
6
 
@@ -30,6 +30,7 @@ export function Example() {
30
30
  - [Optional details](https://kbui.kcb.pro/storybook/?path=/story/components-panel--collapsible): Expand and collapse a section from its toggle.
31
31
  - [Section actions](https://kbui.kcb.pro/storybook/?path=/story/components-panel--toolbar): Group actions alongside the section heading.
32
32
  - [Nested sections](https://kbui.kcb.pro/storybook/?path=/story/components-panel--nested): Inspect depth and grouping inside a parent panel.
33
+ - [Opaque surface](https://kbui.kcb.pro/storybook/?path=/story/components-panel--opaque): Compare a glass panel with one that drops the blur.
33
34
 
34
35
  ## Reference
35
36
 
@@ -53,7 +54,8 @@ export function Example() {
53
54
  | `tone` | `quiet` / `default` / `sunken` / `active` / `critical` | `default` | Changes the surface emphasis; pair state colors with explanatory text |
54
55
  | `rail` | `none` / `accent` / `status` | `none` | Accent stays the accent color; status follows the current tone |
55
56
  | `density` | `compact` / `standard` | `standard` | Changes padding without changing semantics |
56
- | `collapsible` | `boolean` | `false` | Enables Panel.Toggle and collapsible body behavior |
57
+ | `opaque` | `boolean` | `false` | Solid fill with no backdrop filter, whatever the theme sets |
58
+ | `collapsible` | `boolean` | `false` | Enables `Panel.Toggle` and collapsible body behavior |
57
59
  | `open` | `boolean` | uncontrolled | Current body visibility when collapsible is enabled |
58
60
  | `defaultOpen` | `boolean` | `false` | Initial visibility for an uncontrolled collapsible panel |
59
61
  | `onOpenChange` | `(open: boolean) => void` | unset | Update open here when your app controls visibility |
@@ -62,6 +64,12 @@ export function Example() {
62
64
 
63
65
  For additional lighting, use `--kb-panel-sheen`, `--kb-panel-backdrop`, `--kb-panel-glow`, `--kb-panel-glow-active`, and `--kb-panel-glow-critical`. These effects stay off by default. Active and critical tones change the upper rim and glow colors. The rail follows the panel’s rounded corners.
64
66
 
67
+ `opaque` turns off the theme’s glass for one panel: it drops `--kb-panel-backdrop` and paints the tone fill over the `--kb-panel-background-opaque` base. Use it under content that redraws often, such as a live terminal or log, where a backdrop blur costs memory and compositing work. It fills even a `quiet` panel. Nested panels keep their own glass; give each one that holds live content `opaque` too. Set `--kb-panel-background-opaque` in your theme to change the base; keep it a solid color that contrasts with `--kb-color-fg` in light and dark.
68
+
69
+ ```tsx
70
+ <Panel opaque aria-labelledby="terminal-title">…</Panel>
71
+ ```
72
+
65
73
  ## Resizable panels
66
74
 
67
75
  Put `Panel.Handle` between two panels in a `Panel.Group` to let people resize them. The handle sizes the panel before it, as a percentage of the group; the panel after it takes the remaining space. Name each handle with `aria-label` or `aria-labelledby`. A column group needs a height.
@@ -80,7 +88,7 @@ The handle follows the window splitter pattern. Arrow keys along the group's dir
80
88
 
81
89
  ## Related components
82
90
 
83
- Use [Card](Card.md) for a self-contained item and [Grid](Grid.md) or [Split](Split.md) to arrange sections.
91
+ Use [`Card`](Card.md) for a self-contained item and [`Grid`](Grid.md) or [`Split`](Split.md) to arrange sections.
84
92
 
85
93
  ## Resizing without dragging
86
94
 
@@ -37,27 +37,27 @@ export function ViewOptions() {
37
37
 
38
38
  | Part / prop | Type | Default | Purpose |
39
39
  |---|---|---|---|
40
- | `Popover` | Base UI Popover root props | — | Groups parts without adding a DOM element. |
40
+ | `Popover` | Base UI `Popover` root props | — | Groups parts without adding a DOM element. |
41
41
  | `open` / `defaultOpen` | `boolean` | `false` | Controlled or initial open state. |
42
42
  | `onOpenChange` | `(open, details) => void` | — | Requests opening/dismissal; supports `details.cancel()`. |
43
43
  | `modal` | `boolean` or `"trap-focus"` | `false` | Configures interaction containment. Include Close for modal focus containment and touch-screen-reader escape. |
44
- | `Popover.Trigger` | Base UI Popover trigger props | `button` | Supports Button composition, refs and native disabled. |
45
- | `Popover.Content` | Base UI Popover popup props | `div` | Portaled interactive popup with ref and native attributes. |
44
+ | `Popover.Trigger` | Base UI `Popover` trigger props | `button` | Supports `Button` composition, refs and native disabled. |
45
+ | `Popover.Content` | Base UI `Popover` popup props | `div` | Portaled interactive popup with ref and native attributes. |
46
46
  | `Content.title` / `description` | `ReactNode` | — | Adds associated Title and Description inside Header; omit when composing those parts. |
47
47
  | `Content.container` | Base UI portal container | `document.body` | Targets a stable theme host, including refs. |
48
48
  | `Content.side` / `align` | Base UI positioner values | `bottom` / `start` | Preferred placement; collision handling may adjust it. |
49
49
  | `Content.sideOffset` | Base UI side offset | `6` | Gap from trigger in CSS pixels. |
50
- | `Content.positionerProps` | Base UI positioner props | — | Advanced collision boundary/padding, offsets, custom anchor, styles and ref; excludes children, className, side, align and sideOffset. |
50
+ | `Content.positionerProps` | Base UI positioner props | — | Advanced collision boundary/padding, offsets, custom anchor, styles and ref; excludes children, `className`, side, align and `sideOffset`. |
51
51
  | `Content.initialFocus` / `finalFocus` | Base UI focus target | Primitive defaults | Customize entry and return focus; supports refs and callbacks. |
52
52
  | `Content.className` | `string` | — | Additional popup class. |
53
53
  | `Content.classNames` | `{ positioner?: string }` | — | Additional class on positioning wrapper. |
54
- | `Popover.Title` / `Description` | Base UI naming part props | — | Compose accessible names and descriptions; accepts string className and refs. |
54
+ | `Popover.Title` / `Description` | Base UI naming part props | — | Compose accessible names and descriptions; accepts string `className` and refs. |
55
55
  | `Popover.Header` / `Body` / `Footer` | Native `div` props and refs | `div` | Header and Footer stay outside Body scrolling. Body must be a direct Content child; Footer holds visible actions. |
56
56
  | `Popover.Close` | Base UI close props | `button` | Dismisses without performing an application action. |
57
57
 
58
- Name every popup with title, Title or aria-label. Include a visible Close action, especially for touch and modal usage. Escape closes the popup and restores focus; a non-modal outside press dismisses while allowing outside interaction. Default keyboard opening focuses the first tabbable control or the popup; touch opening can focus the popup to avoid launching a virtual keyboard. Keep required instructions available outside temporary content.
58
+ Name every popup with title, Title or `aria-label`. Include a visible Close action, especially for touch and modal usage. Escape closes the popup and restores focus; a non-modal outside press dismisses while allowing outside interaction. Default keyboard opening focuses the first tabbable control or the popup; touch opening can focus the popup to avoid launching a virtual keyboard. Keep required instructions available outside temporary content.
59
59
 
60
- Keep popovers short: show the relevant controls and a visible Done/Close action together. Avoid artificial height caps, large descriptions or long lists of secondary content. Use Dialog, Drawer or inline Disclosure when a task needs more room.
60
+ Keep popovers short: show the relevant controls and a visible Done/Close action together. Avoid artificial height caps, large descriptions or long lists of secondary content. Use `Dialog`, Drawer or inline `Disclosure` when a task needs more room.
61
61
 
62
62
  For constrained viewports, compose direct Header, Body and Footer children. Content title/description props create Header automatically. Only Body shrinks and scrolls; Footer actions and the heading stay visible. A long scrollable Body needs a name and `tabIndex={0}` for keyboard scrolling; keep essential instructions and actions outside it. The outer popup can still scroll as a fallback when enlarged header/footer content alone exceeds available space. The popup fits the positioning engine's available width/height. `positionerProps` retains Base UI collision and anchor configuration. Set `container` for nested themes and keep the host outside clipping/transformed ancestors when needed. See [theme hosts and portals](../../../../docs/guides/forms-and-overlays.md#theme-hosts-and-portals).
63
63
 
@@ -76,7 +76,7 @@ Choose one update model and explain it:
76
76
 
77
77
  The Default and Controlled stories implement these two models. Do not label a dismiss-only button Save, and do not silently commit a draft on outside dismissal. Keep asynchronous operations and error recovery application-owned.
78
78
 
79
- Test the actual embedding viewport. A portal escapes DOM clipping but cannot escape an iframe's viewport. Leave space around the trigger for the complete panel and its actions; a tiny host must offer a larger preview or compose Dialog/Drawer. Do not accept a Body that collapses to zero height while a field technically remains in the accessibility tree. Catalog previews reserve the popup footprint and open the real panel at mobile/desktop widths, including paired themes.
79
+ Test the actual embedding viewport. A portal escapes DOM clipping but cannot escape an iframe's viewport. Leave space around the trigger for the complete panel and its actions; a tiny host must offer a larger preview or compose `Dialog`/Drawer. Do not accept a Body that collapses to zero height while a field technically remains in the accessibility tree. Catalog previews reserve the popup footprint and open the real panel at mobile/desktop widths, including paired themes.
80
80
 
81
81
  Follow the [Base UI focus/positioning contract](https://base-ui.com/react/components/popover) and [WAI non-modal dialog guidance](https://www.w3.org/TR/wai-aria-1.2/#dialog). For complex tasks on compact screens, use an explicit sheet/dialog composition and preserve its modal semantics rather than changing modes during an open interaction.
82
82
 
@@ -86,4 +86,4 @@ Run `bun run test:overlays` for Chromium, Firefox and WebKit checks in both them
86
86
 
87
87
  ## Related components
88
88
 
89
- Use [Tooltip](Tooltip.md) for brief non-interactive hints, [Menu](Menu.md) for action lists, [Disclosure](Disclosure.md) for inline details, and [Dialog](Dialog.md) for modal tasks and the documented drawer/confirmation patterns.
89
+ Use [`Tooltip`](Tooltip.md) for brief non-interactive hints, [`Menu`](Menu.md) for action lists, [`Disclosure`](Disclosure.md) for inline details, and [`Dialog`](Dialog.md) for modal tasks and the documented drawer/confirmation patterns.
@@ -34,4 +34,4 @@ The current value stays available to assistive technology. Your app owns task co
34
34
 
35
35
  ## Related components
36
36
 
37
- Use [Status](Status.md) for a textual state and [Stat](Stat.md) for a headline measure without completion semantics.
37
+ Use [`Status`](Status.md) for a textual state and [`Stat`](Stat.md) for a headline measure without completion semantics.
@@ -1,6 +1,6 @@
1
1
  # RadioGroup
2
2
 
3
- Use RadioGroup when people need to choose one option and see all the choices at once. Give the group a label and each item a unique string value. Arrow keys change the selection and skip disabled options.
3
+ Use `RadioGroup` when people need to choose one option and see all the choices at once. Give the group a label and each item a unique string value. Arrow keys change the selection and skip disabled options.
4
4
 
5
5
  [All components](../../README.md#components) · [Usage](#usage) · [Examples](#more-examples) · [Reference](#reference) · [Live examples and accessibility](https://kbui.kcb.pro/storybook/?path=/docs/components-radiogroup--docs)
6
6
 
@@ -25,7 +25,7 @@ export function Example() {
25
25
  ## More examples
26
26
 
27
27
  - [An unanswered choice](https://kbui.kcb.pro/storybook/?path=/story/components-radiogroup--empty-selection): Start without a selected option.
28
- - [Segmented choices](https://kbui.kcb.pro/storybook/?path=/story/components-radiogroup--segmented): Compare a visual treatment with the same single-choice contract.
28
+ - [Segmented choices](https://kbui.kcb.pro/storybook/?path=/story/components-radiogroup--segmented): Show a compact layout with the same single-choice behavior.
29
29
  - [Validation feedback](https://kbui.kcb.pro/storybook/?path=/story/components-radiogroup--invalid): Explain why a choice is required.
30
30
 
31
31
  ## Reference
@@ -66,4 +66,4 @@ In dark mode, the primary pill uses a darker orange with white text for contrast
66
66
 
67
67
  ## Related components
68
68
 
69
- Use [Checkbox](Checkbox.md) for independent choices and [Select](Select.md) when the options belong in a dropdown.
69
+ Use [`Checkbox`](Checkbox.md) for independent choices and [`Select`](Select.md) when the options belong in a dropdown.
@@ -37,4 +37,4 @@ Tab reaches the viewport so keyboard users can scroll it. Keep the focus indicat
37
37
 
38
38
  ## Related components
39
39
 
40
- Use [Panel](Panel.md) to group the scrolling content with its heading and actions.
40
+ Use [`Panel`](Panel.md) to group the scrolling content with its heading and actions.
@@ -1,6 +1,6 @@
1
1
  # Select
2
2
 
3
- Use Select to choose one option from a dropdown. Each option has a string value, a visible label, and an optional disabled flag. Pass `null` to show the placeholder. Your app stores the selected value and decides whether it is valid.
3
+ Use `Select` to choose one option from a dropdown. Each option has a string value, a visible label, and an optional disabled flag. Pass `null` to show the placeholder. Your app stores the selected value and decides whether it is valid.
4
4
 
5
5
  [All components](../../README.md#components) · [Usage](#usage) · [Examples](#more-examples) · [Reference](#reference) · [Live examples and accessibility](https://kbui.kcb.pro/storybook/?path=/docs/components-select--docs)
6
6
 
@@ -68,4 +68,4 @@ By default, the popup mounts inside the field root and inherits its theme. If yo
68
68
 
69
69
  ## Related components
70
70
 
71
- Use [RadioGroup](RadioGroup.md) for a visible set of choices and [Menu](Menu.md) for actions.
71
+ Use [`RadioGroup`](RadioGroup.md) for a visible set of choices and [`Menu`](Menu.md) for actions.
@@ -1,6 +1,6 @@
1
1
  # Separator
2
2
 
3
- Native hr thematic break; decorative dividers are hidden from assistive technology. Native hr props and ref pass through; orientation and decorative own role, aria-hidden and aria-orientation.
3
+ Use `Separator` for a thematic break or a decorative divider. It renders a native `<hr>` and accepts its props and `ref`. The `orientation` and `decorative` props set `role`, `aria-hidden` and `aria-orientation`; decorative dividers are hidden from assistive technology.
4
4
 
5
5
  [All components](../../README.md#components) · [Usage](#usage) · [Examples](#more-examples) · [Reference](#reference) · [Live examples and accessibility](https://kbui.kcb.pro/storybook/?path=/docs/layout-separator--docs)
6
6
 
@@ -33,8 +33,8 @@ export function Example() {
33
33
  | `orientation` | `horizontal` `vertical` | `horizontal` |
34
34
  | `decorative` | Hide a visual-only divider from assistive technology | `false` |
35
35
 
36
- Vertical rules stretch inside Inline and have a 1rem minimum height. No tab stop or resizing interaction is added. See [Layout composition](https://github.com/KhallilB/kbui/blob/main/docs/guides/layout.md).
36
+ Vertical rules stretch inside `Inline` and have a 1rem minimum height. No tab stop or resizing interaction is added. See [Layout composition](https://github.com/KhallilB/kbui/blob/main/docs/guides/layout.md).
37
37
 
38
38
  ## Related components
39
39
 
40
- Use [Inline](Inline.md) to arrange a row and [Panel](Panel.md) to group a complete section.
40
+ Use [`Inline`](Inline.md) to arrange a row and [`Panel`](Panel.md) to group a complete section.
@@ -0,0 +1,57 @@
1
+ # Settings
2
+
3
+ Use `Settings` for a page of preferences or account management: sections of fields, and managed lists such as members, API keys or sessions with row actions. Each section is saved on its own. `Settings` renders a header region and a sections region with a rule between sections; [`FormSection`](FormSection.md) children put their heading beside their fields on wide screens and above them on narrow ones. Record rows from [`CollectionRow`](CollectionRow.md) keep their status and actions end-aligned, on one line beside the main text from 40rem of page width. For one task with a single submit, use [`Form`](Form.md).
4
+
5
+ [All components](../../README.md#components) · [Usage](#usage) · [Examples](#more-examples) · [Reference](#reference) · [Live examples and accessibility](https://kbui.kcb.pro/storybook/?path=/docs/layout-settings--docs)
6
+
7
+ ## Usage
8
+
9
+ ```tsx
10
+ import "@kb.ui/react/styles.css";
11
+ import { Button, Container, FormSection, Heading, Input, Settings, Switch } from "@kb.ui/react";
12
+ import { useState } from "react";
13
+
14
+ export function Example() {
15
+ const [digest, setDigest] = useState(true);
16
+ return (
17
+ <Container as="main">
18
+ <Settings header={<Heading level={1}>Account</Heading>}>
19
+ <form onSubmit={(event) => event.preventDefault()}>
20
+ <FormSection
21
+ title="Profile"
22
+ description="Shown to everyone in your workspace."
23
+ actions={<Button type="submit">Save profile</Button>}
24
+ >
25
+ <Input label="Display name" name="name" />
26
+ </FormSection>
27
+ </form>
28
+ <FormSection title="Email" description="Sent to the address on your profile.">
29
+ <Switch label="Weekly digest" checked={digest} onCheckedChange={setDigest} />
30
+ </FormSection>
31
+ </Settings>
32
+ </Container>
33
+ );
34
+ }
35
+ ```
36
+
37
+ ## More examples
38
+
39
+ - [Notifications](https://kbui.kcb.pro/storybook/?path=/story/layout-settings--notifications): Email, push and quiet-hours sections with switches, a frequency select and event checkboxes.
40
+ - [Team members](https://kbui.kcb.pro/storybook/?path=/story/layout-settings--team-members): An invite form beside a member list with role changes and a confirmed removal.
41
+
42
+ ## Reference
43
+
44
+ | Prop | Type | Default | Notes |
45
+ | --- | --- | --- | --- |
46
+ | `header` | `ReactNode` | unset | Page title and intro above the sections |
47
+ | `classNames` | `{ header?, sections? }` | unset | Classes for the regions |
48
+
49
+ Other native `div` props and `ref` pass through. Direct children of the sections region are separated by a rule; wrap a section in its own `form` when it saves fields, and leave list sections unwrapped.
50
+
51
+ A `FormSection` inside `Settings` uses the split layout unless you set its `layout`: header in one third, fields in two thirds from 40rem of section width, stacked below it. Tokens: `--kb-settings-gap` and `--kb-settings-divider`.
52
+
53
+ Start the header with an `h1` and keep section headings at `h2`. Put destructive row actions behind a confirmation such as [`Dialog`](Dialog.md), and announce saved or failed sections with a status message. Your app owns saving, list data and permissions.
54
+
55
+ ## Related components
56
+
57
+ Use [`FormSection`](FormSection.md) for each section, [`CollectionList`](CollectionList.md) for managed lists and [`Form`](Form.md) for a single task.
@@ -19,28 +19,68 @@ export function Example() {
19
19
  }
20
20
  ```
21
21
 
22
+ ## Shape from content
23
+
24
+ Set `variant="auto"` and pass the real layout as children. While `loading` is true, Skeleton renders the children inert and hidden from assistive technology. kbui avatars, buttons, badges, status chips, images, form fields, headings and text then become placeholders in their own size and shape. Leave data-driven fields empty while loading: empty headings and text still reserve one line. Other text elements fall back to plain text bars. Skeleton marks itself `aria-busy` and announces `label` once, so callers do not write placeholder copy.
25
+
26
+ ```tsx
27
+ import "@kb.ui/react/styles.css";
28
+ import { Avatar, Card, Heading, Inline, Skeleton, Text } from "@kb.ui/react";
29
+
30
+ type Person = { name: string; role: string };
31
+
32
+ export function Example({ person }: { person?: Person | undefined }) {
33
+ return (
34
+ <Skeleton variant="auto" loading={!person} label="Loading profile">
35
+ <Card>
36
+ <Inline gap="md" align="center">
37
+ <Avatar name={person?.name ?? ""} decorative />
38
+ <div>
39
+ <Heading level={3} size="sm">
40
+ {person?.name}
41
+ </Heading>
42
+ <Text size="sm" tone="muted">
43
+ {person?.role}
44
+ </Text>
45
+ </div>
46
+ </Inline>
47
+ </Card>
48
+ </Skeleton>
49
+ );
50
+ }
51
+ ```
52
+
53
+ Skeleton cannot know how many items a list will hold. Render a fixed number of empty rows while loading. Without children, `auto` falls back to `text` lines.
54
+
22
55
  ## More examples
23
56
 
24
- - [Wave, pulse, and accent synthesis](https://kbui.kcb.pro/storybook/?path=/story/components-skeleton--wave-and-pulse): Choreograph staggered multi-line wave cascades, breathing pulse blocks, and warm accent-tinted synthesis placeholders.
25
- - [Structured card placeholder](https://kbui.kcb.pro/storybook/?path=/story/components-skeleton--card-placeholder): Combine avatar circles, pills, rectangular wells, and multi-line text placeholders.
57
+ - [Animations](https://kbui.kcb.pro/storybook/?path=/story/components-skeleton--animations): Compare `shimmer`, `pulse`, and `wave` motion.
58
+ - [Tones](https://kbui.kcb.pro/storybook/?path=/story/components-skeleton--tones): Compare the `default`, `subtle`, and `accent` surfaces.
59
+ - [Profile card](https://kbui.kcb.pro/storybook/?path=/story/components-skeleton--profile-card): Combine circle, pill, block, and text placeholders into a card layout.
26
60
  - [Shapes and sizes](https://kbui.kcb.pro/storybook/?path=/story/components-skeleton--shapes-and-sizes): Compare `text`, `rect`, `circle`, and `pill` geometry across the size scale.
27
- - [Loading-to-content transition](https://kbui.kcb.pro/storybook/?path=/story/components-skeleton--content-transition): Toggle `loading` to swap placeholder bars for resolved children without layout shift.
61
+ - [Content transition](https://kbui.kcb.pro/storybook/?path=/story/components-skeleton--content-transition): Toggle `loading` to swap placeholder bars for resolved children without layout shift.
62
+ - [Auto](https://kbui.kcb.pro/storybook/?path=/story/components-skeleton--auto): Shape placeholders from a real profile card and toggle `loading` to reveal it in place.
63
+
64
+ ## Motion
65
+
66
+ Shimmer moves a soft light band across the placeholder, with a short rest between passes. Pulse and wave use a restrained brightness change so the reserved shape stays visible. In `auto`, one animation drives every placeholder in step, and `wave` fades without a stagger. Existing `--kb-skeleton-*` motion tokens control timing; reduced-motion preferences and forced-colors mode use static placeholders.
28
67
 
29
68
  ## Reference
30
69
 
31
- | Prop | Type | Default | Notes |
32
- | ------------ | ------------------------------------- | ----------- | ----------------------------------------------------------------------------------------- |
33
- | `variant` | `text` / `rect` / `circle` / `pill` | `text` | Matches incoming typography, media blocks, avatars, or status chips |
34
- | `size` | `sm` / `md` / `lg` | `md` | Scales line height and circle diameter |
35
- | `lines` | `number` | `1` | Number of stacked lines when `variant="text"`; the final line shortens naturally |
36
- | `width` | `number` / `string` | unset | Explicit inline size override (`px` number or CSS length) |
37
- | `height` | `number` / `string` | unset | Explicit block size override (`px` number or CSS length) |
38
- | `animated` | `boolean` | `true` | Enables motion that stops automatically under `prefers-reduced-motion` |
39
- | `animation` | `shimmer` / `pulse` / `wave` / `none` | `"shimmer"` | Selects specular sweep, breathing pulse, staggered multi-line wave, or static placeholder |
40
- | `tone` | `default` / `subtle` / `accent` | `"default"` | Surface treatment (`default` surface, `subtle` recessed well, or `accent` synthesis tint) |
41
- | `loading` | `boolean` | `true` | Renders decorative placeholders when `true`, or `children` inside `.kb-skeleton-content` |
42
- | `classNames` | keyed classes | unset | Style `line` or `content` |
70
+ | Prop | Type | Default | Notes |
71
+ | ------------ | -------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------- |
72
+ | `variant` | `text` / `rect` / `circle` / `pill` / `auto` | `text` | Matches typography, media blocks, avatars, or status chips; `auto` shapes from `children` |
73
+ | `size` | `sm` / `md` / `lg` | `md` | Scales line height and circle diameter |
74
+ | `lines` | `number` | `1` | Number of stacked lines when `variant="text"`; the final line shortens naturally |
75
+ | `width` | `number` / `string` | unset | Explicit inline size override (`px` number or CSS length) |
76
+ | `height` | `number` / `string` | unset | Explicit block size override (`px` number or CSS length) |
77
+ | `animated` | `boolean` | `true` | Enables motion that stops automatically under `prefers-reduced-motion` |
78
+ | `animation` | `shimmer` / `pulse` / `wave` / `none` | `"shimmer"` | Light sweep, fade, staggered fade across lines, or a static placeholder |
79
+ | `tone` | `default` / `subtle` / `accent` | `"default"` | Surface treatment: `default`, `subtle` recessed, or `accent` tinted |
80
+ | `loading` | `boolean` | `true` | Renders decorative placeholders when `true`, or `children` inside `.kb-skeleton-content` |
81
+ | `label` | `string` | `"Loading"` | Status announced while `variant="auto"` is loading |
82
+ | `classNames` | keyed classes | unset | Style `line`, `content`, or `status` |
43
83
 
44
84
  ## Related components
45
85
 
46
- Use [Spinner](Spinner.md) for compact indeterminate waits, [EmptyState](EmptyState.md) when a query resolves with zero items, and [Card](Card.md) as the owning surface with `aria-busy="true"`.
86
+ Use [`Spinner`](Spinner.md) for compact indeterminate waits, [`EmptyState`](EmptyState.md) when a query resolves with zero items, and [`Card`](Card.md) as the owning surface with `aria-busy="true"`.