@kerfjs/ui 5.0.0-beta.34 → 5.0.0-beta.36

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 (53) hide show
  1. package/README.md +19 -4
  2. package/ai/component-catalog-v2.json +15 -5
  3. package/ai/component-catalog.json +45 -19
  4. package/ai/public-api-signatures-v1.md +107 -11
  5. package/ai/skill.md +2 -2
  6. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  7. package/dist/catalog.js +2 -2
  8. package/dist/{chunk-MFR2IIFG.js → chunk-2TYUFZUC.js} +3 -1
  9. package/dist/chunk-2TYUFZUC.js.map +1 -0
  10. package/dist/{chunk-OC275HHS.js → chunk-5FJ53EOF.js} +5 -1
  11. package/dist/chunk-5FJ53EOF.js.map +1 -0
  12. package/dist/{chunk-OKRCKIVO.js → chunk-AVZ2IMWG.js} +13 -2
  13. package/dist/chunk-AVZ2IMWG.js.map +1 -0
  14. package/dist/{chunk-KFUUFNTS.js → chunk-EYALJQQD.js} +12 -2
  15. package/dist/chunk-EYALJQQD.js.map +1 -0
  16. package/dist/{chunk-7JQAQWVC.js → chunk-TNXDXSGP.js} +5 -1
  17. package/dist/chunk-TNXDXSGP.js.map +1 -0
  18. package/dist/divider-sides-BzB6rphT.d.ts +6 -0
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.js +5 -5
  21. package/dist/list-header.d.ts +4 -1
  22. package/dist/list-header.js +1 -1
  23. package/dist/list-inset-control.d.ts +5 -2
  24. package/dist/list-inset-control.js +1 -1
  25. package/dist/list-inset-text.d.ts +6 -3
  26. package/dist/list-inset-text.js +1 -1
  27. package/dist/list.d.ts +7 -3
  28. package/dist/list.js +1 -1
  29. package/dist/row.d.ts +10 -3
  30. package/dist/row.js +1 -1
  31. package/dist/styles/list-header.css +27 -0
  32. package/dist/styles/list-inset-control.css +17 -1
  33. package/dist/styles/list-inset-text.css +27 -11
  34. package/dist/styles/list.css +46 -0
  35. package/dist/styles/row.css +47 -0
  36. package/dist/toolbar.d.ts +1 -1
  37. package/docs/component-contract.md +9 -5
  38. package/docs/component-integration.md +63 -0
  39. package/docs/component-selection.md +1 -1
  40. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  41. package/docs/design/templates/list-header/inline-action.svg +1 -0
  42. package/docs/design/templates/list-header-dark.svg +1 -1
  43. package/docs/design/templates/list-header.svg +1 -1
  44. package/docs/layout.md +20 -0
  45. package/docs/ux-demo.md +10 -0
  46. package/llms.txt +4 -0
  47. package/package.json +9 -3
  48. package/dist/chunk-7JQAQWVC.js.map +0 -1
  49. package/dist/chunk-KFUUFNTS.js.map +0 -1
  50. package/dist/chunk-MFR2IIFG.js.map +0 -1
  51. package/dist/chunk-OC275HHS.js.map +0 -1
  52. package/dist/chunk-OKRCKIVO.js.map +0 -1
  53. package/dist/divider-sides-267FA7sY.d.ts +0 -4
package/README.md CHANGED
@@ -4,6 +4,15 @@ Accessible, composable UI primitives for [kerf](https://github.com/brianwestphal
4
4
 
5
5
  Start interface work with the [need-first component selection matrix](./docs/component-selection.md). It distinguishes direct reuse, composition, thin application adapters, and genuinely custom semantics, with imports, required wiring, application ownership, alternatives, and recipes for every public primitive.
6
6
 
7
+ When adding a first-party public component, follow the
8
+ [component integration workflow](./docs/component-integration.md). The catalog
9
+ entry drives one validator across package, build, barrel, CSS, demo, route, and
10
+ AI signature projections, with a non-mutating dry-run report.
11
+
12
+ Browser verification always builds current source: both `npm run test:e2e`
13
+ and direct focused Playwright commands run the catalog/conformance preflights
14
+ and production build before preview. See the [UX catalog contract](./docs/ux-demo.md).
15
+
7
16
  When authoring a component gallery, follow the single
8
17
  [Catalog demo authoring contract](./docs/catalog.md#catalog-demo-authoring-contract)
9
18
  for focused-versus-composition modes, helper nesting, specimen selection,
@@ -129,10 +138,15 @@ Use `Row` for horizontal flex composition and `List` for vertical composition.
129
138
  Both accept `hAlign` (`left`, `center`, `right`, `full`) and `vAlign` (`top`,
130
139
  `middle`, `bottom`, `full`), plus their documented short/CSS aliases. `Row`
131
140
  defaults to left/full alignment, the `xs` gap, and `wrap={false}`; List keeps
132
- its existing full/top alignment and zero-gap defaults.
141
+ its existing full/top alignment and zero-gap defaults. Set `textInsets` or
142
+ `controlInsets` with canonical physical sides in `t`/`r`/`b`/`l` order (for
143
+ example, `textInsets="tbl"` or `controlInsets="r"`). Text geometry takes
144
+ precedence where both select the same side. `ListInsetText` and
145
+ `ListInsetControl` inset all four sides by default and accept the same `sides`
146
+ grammar for selective insets.
133
147
 
134
148
  The same property-specific boundary applies beyond spacing: use `flex()` (or a
135
- finite keyword) for `List.flex`; length builders and intrinsic-size keywords for
149
+ finite keyword) for `Row.flex` and `List.flex`; length builders and intrinsic-size keywords for
136
150
  `Skeleton.width`/`height`; length builders for `Skeleton.radius`; and
137
151
  `uiColor()` or `colorVar()` for `SelectChoice.color`. These grammars are not
138
152
  interchangeable. `ListItem` and `ListActionRow` deliberately expose no raw
@@ -212,8 +226,9 @@ transform is applied. Direction changes take the shortest rotation path; a
212
226
  real controlled content and preserve the button's stable label; ordinary
213
227
  navigation must not display a disclosure arrow. A custom `actionIcon` remains
214
228
  an escape hatch and replaces the default arrow entirely. The header fills its
215
- available inline width, keeping a separate action at the logical end in a 44px
216
- target. Its visible action glyph defaults to 18px through
229
+ available inline width by default; set `inline` to shrink-wrap it beside other
230
+ content and remove its root margin, border, and padding. It keeps a separate
231
+ action at the logical end. Its visible action glyph defaults to 18px through
217
232
  `--kui-list-header-action-icon-size`.
218
233
 
219
234
  ## Machine-readable catalog
@@ -1424,7 +1424,7 @@
1424
1424
  "required": false
1425
1425
  },
1426
1426
  {
1427
- "id": "typed gap overrides",
1427
+ "id": "typed gap and flex choices",
1428
1428
  "owner": "application",
1429
1429
  "required": false
1430
1430
  }
@@ -1436,9 +1436,9 @@
1436
1436
  "geometry": {
1437
1437
  "margin": "none",
1438
1438
  "border": "none",
1439
- "padding": "none",
1439
+ "padding": "conditional",
1440
1440
  "notes": [
1441
- "Row adds no margin, border, or padding; it owns only flex alignment, wrapping, and the gap between children."
1441
+ "Row adds no margin or border. textInsets adds the full 17px content inset and controlInsets adds 8px on selected physical sides; text wins when both select a side."
1442
1442
  ]
1443
1443
  }
1444
1444
  },
@@ -1463,6 +1463,16 @@
1463
1463
  "gap={space(\"m\")}",
1464
1464
  "gap={calc(plus(rem(0.25), pct(10)))}"
1465
1465
  ]
1466
+ },
1467
+ {
1468
+ "path": "flex",
1469
+ "grammar": "flex",
1470
+ "helpers": ["flex"],
1471
+ "shorthands": ["none", "auto", "initial"],
1472
+ "canonicalShorthands": ["none", "auto", "initial"],
1473
+ "exceptionalShorthands": [],
1474
+ "rawPolicy": "forbid",
1475
+ "examples": ["flex", "flex=\"none\"", "flex={flex(1, 1, rem(20))}"]
1466
1476
  }
1467
1477
  ],
1468
1478
  "boundaries": {
@@ -1511,9 +1521,9 @@
1511
1521
  "geometry": {
1512
1522
  "margin": "none",
1513
1523
  "border": "conditional",
1514
- "padding": "none",
1524
+ "padding": "conditional",
1515
1525
  "notes": [
1516
- "List adds no margin or padding; dividerSides draws only the selected physical edges without changing box geometry."
1526
+ "List adds no margin. dividerSides draws selected physical edges without changing geometry; textInsets adds the full 17px content inset and controlInsets adds 8px on selected sides, with text winning on overlap."
1517
1527
  ]
1518
1528
  }
1519
1529
  },
@@ -1642,9 +1642,9 @@
1642
1642
  "category": "Structure",
1643
1643
  "kind": "component",
1644
1644
  "source": "kerf",
1645
- "description": "A horizontal flex row with physical-axis alignment, a typed xs gap by default, and opt-in wrapping.",
1645
+ "description": "A horizontal flex row with physical-axis alignment, side-selectable text/control insets, a typed xs gap by default, flex participation, and opt-in wrapping.",
1646
1646
  "uses": [],
1647
- "purpose": "Arrange related content horizontally with consistent spacing and explicit left/center/right/full plus top/middle/bottom/full alignment instead of application-owned flex wrappers.",
1647
+ "purpose": "Arrange related content horizontally with consistent spacing, optional physical-side text/control insets, and explicit left/center/right/full plus top/middle/bottom/full alignment instead of application-owned flex wrappers.",
1648
1648
  "publicExports": ["Row"],
1649
1649
  "cssValueProps": [
1650
1650
  {
@@ -1657,16 +1657,28 @@
1657
1657
  "exceptionalShorthands": ["s", "xl"],
1658
1658
  "rawPolicy": "forbid",
1659
1659
  "examples": ["gap=\"xs\"", "gap={space(\"m\")}", "gap={calc(plus(rem(0.25), pct(10)))}"]
1660
+ },
1661
+ {
1662
+ "path": "flex",
1663
+ "grammar": "flex",
1664
+ "helpers": ["flex"],
1665
+ "shorthands": ["none", "auto", "initial"],
1666
+ "canonicalShorthands": ["none", "auto", "initial"],
1667
+ "exceptionalShorthands": [],
1668
+ "rawPolicy": "forbid",
1669
+ "examples": ["flex", "flex=\"none\"", "flex={flex(1, 1, rem(20))}"]
1660
1670
  }
1661
1671
  ],
1662
1672
  "useWhen": [
1663
1673
  "Arrange a group of sibling components horizontally.",
1664
1674
  "Choose physical horizontal distribution and vertical alignment without writing one-off flex CSS.",
1675
+ "Use a finite flex keyword or the flex() builder when Row participates in a flexible parent layout.",
1665
1676
  "Allow a bounded group to wrap while retaining the same typed gap and alignment contract."
1677
+ ,"Apply the standard text or control inset to selected physical sides without an application wrapper."
1666
1678
  ],
1667
1679
  "avoidWhen": [
1668
1680
  "Do not use Row when content belongs in a semantic list or when a named-zone component such as Toolbar owns the composition.",
1669
- "Do not pass raw CSS strings to gap or use s/xl spacing steps without a deliberate exception.",
1681
+ "Do not pass raw CSS strings to gap or flex, mix their distinct grammars, or use s/xl spacing steps without a deliberate exception.",
1670
1682
  "Do not use alignment to replace semantic grouping or responsive relocation."
1671
1683
  ],
1672
1684
  "alternatives": [
@@ -1684,14 +1696,16 @@
1684
1696
  "appOwns": [
1685
1697
  "child semantics and content",
1686
1698
  "alignment and wrapping policy",
1687
- "typed gap overrides"
1699
+ "typed gap and flex choices"
1688
1700
  ],
1689
1701
  "variants": [
1690
1702
  "left/center/right/full horizontal alignment with l/c/r/f and flex aliases",
1691
1703
  "top/middle/bottom/full vertical alignment with t/m/c/b/f and flex aliases",
1692
1704
  "named none/2xs/xs/s/m/l/xl token gap",
1693
1705
  "typed CssLength gap",
1694
- "nowrap or wrapping"
1706
+ "boolean, finite-keyword, or typed CssFlex flex",
1707
+ "nowrap or wrapping",
1708
+ "top/right/bottom/left text and control inset combinations"
1695
1709
  ],
1696
1710
  "accessibility": [
1697
1711
  "Row adds layout only and no grouping role; children retain responsibility for native or ARIA semantics.",
@@ -1700,9 +1714,9 @@
1700
1714
  "geometry": {
1701
1715
  "margin": "none",
1702
1716
  "border": "none",
1703
- "padding": "none",
1717
+ "padding": "conditional",
1704
1718
  "notes": [
1705
- "Row adds no margin, border, or padding; it owns only flex alignment, wrapping, and the gap between children."
1719
+ "Row adds no margin or border. textInsets adds the full 17px content inset and controlInsets adds 8px on selected physical sides; text wins when both select a side."
1706
1720
  ]
1707
1721
  },
1708
1722
  "delivery": {
@@ -1725,13 +1739,13 @@
1725
1739
  "category": "Navigation",
1726
1740
  "kind": "component",
1727
1741
  "source": "kerf",
1728
- "description": "A vertical stack with physical-axis alignment, optional typed token/length gap, flex growth, vertical scrolling, and independently selectable divider edges.",
1742
+ "description": "A vertical stack with physical-axis alignment, side-selectable text/control insets, optional typed token/length gap, flex growth, vertical scrolling, and independently selectable divider edges.",
1729
1743
  "uses": [
1730
1744
  "list-header",
1731
1745
  "list-action-row",
1732
1746
  "list-item"
1733
1747
  ],
1734
- "purpose": "Standardize vertical component layout and its scroll/divider ownership instead of repeating ad-hoc flex-column wrappers.",
1748
+ "purpose": "Standardize vertical component layout, optional physical-side text/control insets, and scroll/divider ownership instead of repeating ad-hoc flex-column wrappers.",
1735
1749
  "publicExports": [
1736
1750
  "List",
1737
1751
  "px",
@@ -1771,7 +1785,8 @@
1771
1785
  "Arrange component rows or sections in a vertical stretch-aligned stack.",
1772
1786
  "Let one bounded list own vertical scrolling, flex growth, or one or more physical-edge dividers.",
1773
1787
  "Choose a finite gap shorthand such as xs or m, or compose a typed length with @kerfjs/ui/css-values when the spacing scale is insufficient.",
1774
- "Use a finite flex keyword or the flex() builder when List participates in flexible layout."
1788
+ "Use a finite flex keyword or the flex() builder when List participates in flexible layout.",
1789
+ "Apply the standard text or control inset to selected physical sides without an application wrapper."
1775
1790
  ,"Align children horizontally or distribute them vertically with the same physical alignment vocabulary as Row."
1776
1791
  ],
1777
1792
  "avoidWhen": [
@@ -1794,7 +1809,8 @@
1794
1809
  "scrollable",
1795
1810
  "left/center/right/full horizontal alignment",
1796
1811
  "top/middle/bottom/full vertical alignment",
1797
- "top/right/bottom/left divider combinations"
1812
+ "top/right/bottom/left divider combinations",
1813
+ "top/right/bottom/left text and control inset combinations"
1798
1814
  ],
1799
1815
  "accessibility": [
1800
1816
  "List adds layout only and no list role; children retain responsibility for their native or ARIA semantics.",
@@ -1803,9 +1819,9 @@
1803
1819
  "geometry": {
1804
1820
  "margin": "none",
1805
1821
  "border": "conditional",
1806
- "padding": "none",
1822
+ "padding": "conditional",
1807
1823
  "notes": [
1808
- "List adds no margin or padding; dividerSides draws only the selected physical edges without changing box geometry."
1824
+ "List adds no margin. dividerSides draws selected physical edges without changing geometry; textInsets adds the full 17px content inset and controlInsets adds 8px on selected sides, with text winning on overlap."
1809
1825
  ]
1810
1826
  },
1811
1827
  "delivery": {
@@ -1837,12 +1853,12 @@
1837
1853
  "category": "Navigation",
1838
1854
  "kind": "component",
1839
1855
  "source": "kerf",
1840
- "description": "Configurable section headings with semantic count/status indicators, density, group dividers, a logical-end action, disclosure states, and protected native-popover trigger metadata.",
1856
+ "description": "Configurable section headings with full-width or shrink-wrapped inline presentation, semantic count/status indicators, density, group dividers, a logical-end action, disclosure states, and protected native-popover trigger metadata.",
1841
1857
  "uses": [
1842
1858
  "lucide-icon",
1843
1859
  "disclosure-arrow"
1844
1860
  ],
1845
- "purpose": "Fill the available section width while splitting a dormant title and mutually exclusive semantic count or legacy badge from an optional logical-end 44px action with an 18px visual, or render that title cluster as a disclosure button with a default production DisclosureArrow.",
1861
+ "purpose": "Fill the available section width by default, or shrink-wrap without outer geometry when inline, while splitting a dormant title and mutually exclusive semantic count or legacy badge from an optional logical-end action with an 18px visual; disclosure mode renders the title cluster as a button with a default production DisclosureArrow.",
1846
1862
  "publicExports": [
1847
1863
  "ListHeader"
1848
1864
  ],
@@ -1875,6 +1891,7 @@
1875
1891
  "action",
1876
1892
  "toggle",
1877
1893
  "placeholder (loading)",
1894
+ "inline shrink-wrapped presentation",
1878
1895
  "compact density",
1879
1896
  "neutral, accent, pop, or danger indicator tone",
1880
1897
  "before, after, or paired group divider"
@@ -2174,9 +2191,9 @@
2174
2191
  "category": "Structure",
2175
2192
  "kind": "component",
2176
2193
  "source": "kerf",
2177
- "description": "Insets a self-bordered control into a pane/list content region.",
2194
+ "description": "Insets selected physical sides of a self-bordered control in a pane/list content region.",
2178
2195
  "uses": [],
2179
- "purpose": "Insets a self-bordered control into a pane/list content region.",
2196
+ "purpose": "Apply the standard 8px outer margin to all physical sides of a self-bordered control by default, or only the sides selected with the canonical Sides contract.",
2180
2197
  "publicExports": [
2181
2198
  "ListInsetControl"
2182
2199
  ],
@@ -2195,6 +2212,10 @@
2195
2212
  "appOwns": [
2196
2213
  "the wrapped control and its behavior"
2197
2214
  ],
2215
+ "variants": [
2216
+ "all-side inset by default",
2217
+ "top/right/bottom/left inset combinations"
2218
+ ],
2198
2219
  "accessibility": [
2199
2220
  "A layout wrapper only; it adds no role or name — the wrapped control keeps its own."
2200
2221
  ],
@@ -2229,9 +2250,9 @@
2229
2250
  "category": "Structure",
2230
2251
  "kind": "component",
2231
2252
  "source": "kerf",
2232
- "description": "Gives bare text the content-item geometry so it lines up with bordered items.",
2253
+ "description": "Gives selected physical sides of bare text the content-item geometry so it lines up with bordered items.",
2233
2254
  "uses": [],
2234
- "purpose": "Gives bare text the content-item geometry so it lines up with bordered items.",
2255
+ "purpose": "Apply the full 8px margin + 1px transparent border + 8px padding to all physical sides of bare text by default, or only the sides selected with the canonical Sides contract.",
2235
2256
  "publicExports": [
2236
2257
  "ListInsetText"
2237
2258
  ],
@@ -2250,6 +2271,11 @@
2250
2271
  "appOwns": [
2251
2272
  "the text content"
2252
2273
  ],
2274
+ "variants": [
2275
+ "all-side inset by default",
2276
+ "top/right/bottom/left inset combinations",
2277
+ "deprecated horizontalOnly compatibility alias for sides=\"rl\""
2278
+ ],
2253
2279
  "accessibility": [
2254
2280
  "A layout wrapper only; it adds no role or name."
2255
2281
  ],
@@ -1,6 +1,6 @@
1
1
  # Public API signatures for the UI authoring corpus
2
2
 
3
- Generated from emitted declarations for `@kerfjs/ui@5.0.0-beta.34` and `kerfjs@5.0.0-beta.34`. This bounded reference covers only APIs used by the seven-task corpus. It is interface evidence, not an implementation or runtime guarantee.
3
+ Generated from emitted declarations for `@kerfjs/ui@5.0.0-beta.36` and `kerfjs@5.0.0-beta.36`. This bounded reference covers only APIs used by the seven-task corpus. It is interface evidence, not an implementation or runtime guarantee.
4
4
 
5
5
  ## `@kerfjs/ui/css-values`
6
6
 
@@ -105,7 +105,7 @@ export { DisclosureArrow, type DisclosureArrowProps, type DisclosureDirection };
105
105
 
106
106
  ```ts
107
107
  import * as kerfjs from 'kerfjs';
108
- import { D as DividerSides } from './divider-sides-267FA7sY.js';
108
+ import { D as DividerSides } from './divider-sides-BzB6rphT.js';
109
109
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
110
110
 
111
111
  interface ToolbarProps {
@@ -257,6 +257,7 @@ type ListHeaderRootAttributes = Readonly<Record<`data-${string}`, string | undef
257
257
  'data-has-count'?: never;
258
258
  'data-density'?: never;
259
259
  'data-divider'?: never;
260
+ 'data-inline'?: never;
260
261
  'data-indicator-tone'?: never;
261
262
  'data-toggle'?: never;
262
263
  }>;
@@ -271,6 +272,8 @@ interface ListHeaderBaseProps {
271
272
  label: string;
272
273
  density?: 'standard' | 'compact';
273
274
  divider?: 'none' | 'before' | 'after' | 'both';
275
+ /** Shrink-wrap the header without its default outer margin, border, or padding. */
276
+ inline?: boolean;
274
277
  indicatorTone?: 'neutral' | 'accent' | 'pop' | 'danger';
275
278
  /** Render as an unanimated loading skeleton: keep the label and action affordance, disable interaction. */
276
279
  placeholder?: boolean;
@@ -322,7 +325,7 @@ type ListHeaderIndicatorProps = {
322
325
  status?: SafeHtml;
323
326
  };
324
327
  type ListHeaderProps = ListHeaderBaseProps & ListHeaderIndicatorProps & ListHeaderModeProps;
325
- declare function ListHeader({ label, count, countLabel, badge, status, density, divider, indicatorTone, action, actionLabel, actionIcon, actionDisabled, disabledReason, expanded, toggle, placeholder, rootAttributes, triggerAttributes, }: ListHeaderProps): SafeHtml;
328
+ declare function ListHeader({ label, count, countLabel, badge, status, density, divider, inline, indicatorTone, action, actionLabel, actionIcon, actionDisabled, disabledReason, expanded, toggle, placeholder, rootAttributes, triggerAttributes, }: ListHeaderProps): SafeHtml;
326
329
 
327
330
  export { ListHeader, type ListHeaderProps };
328
331
  ```
@@ -332,7 +335,7 @@ export { ListHeader, type ListHeaderProps };
332
335
  ```ts
333
336
  import * as kerfjs from 'kerfjs';
334
337
  import { UiSpaceName, CssLength, CssFlexKeyword, CssFlex } from './css-values.js';
335
- import { D as DividerSides } from './divider-sides-267FA7sY.js';
338
+ import { D as DividerSides, S as Sides } from './divider-sides-BzB6rphT.js';
336
339
  import { H as HorizontalAlignment, V as VerticalAlignment } from './flex-alignment-CF8NLj7i.js';
337
340
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
338
341
 
@@ -350,12 +353,16 @@ interface ListProps {
350
353
  scrollable?: boolean;
351
354
  /** Physical divider edges in canonical top/right/bottom/left order. */
352
355
  dividerSides?: DividerSides;
356
+ /** Physical sides that receive the standard 17px text inset. */
357
+ textInsets?: Sides;
358
+ /** Physical sides that receive the standard 8px control inset. Text insets win on overlap. */
359
+ controlInsets?: Sides;
353
360
  className?: string;
354
361
  }
355
362
  /** A stretch-aligned vertical stack with optional gap, flex, scroll, and dividers. */
356
- declare function List({ children, gap, flex, hAlign, vAlign, scrollable, dividerSides, className, }: ListProps): kerfjs.SafeHtml;
363
+ declare function List({ children, gap, flex, hAlign, vAlign, scrollable, dividerSides, textInsets, controlInsets, className, }: ListProps): kerfjs.SafeHtml;
357
364
 
358
- export { CssFlex, CssFlexKeyword, CssLength, DividerSides, HorizontalAlignment, List, type ListProps, UiSpaceName, VerticalAlignment };
365
+ export { CssFlex, CssFlexKeyword, CssLength, DividerSides, HorizontalAlignment, List, type ListProps, Sides, UiSpaceName, VerticalAlignment };
359
366
  ```
360
367
 
361
368
  ## `@kerfjs/ui/list-action-row`
@@ -478,11 +485,14 @@ export { ListItem, type ListItemProps };
478
485
 
479
486
  ```ts
480
487
  import * as kerfjs from 'kerfjs';
488
+ import { S as Sides } from './divider-sides-BzB6rphT.js';
481
489
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
482
490
 
483
491
  interface ListInsetControlProps {
484
492
  /** Control(s) that own their own border and padding (e.g. an input, a `wa-*`). */
485
493
  children: KerfUiContent;
494
+ /** Physical inset sides in canonical top/right/bottom/left order. Defaults to all sides. */
495
+ sides?: Sides;
486
496
  className?: string;
487
497
  }
488
498
  /**
@@ -491,22 +501,25 @@ interface ListInsetControlProps {
491
501
  * Use it for controls that carry their own border and padding but no outer margin
492
502
  * — the wrapper adds only the alignment margin and layout, not a second inset.
493
503
  */
494
- declare function ListInsetControl({ children, className, }: ListInsetControlProps): kerfjs.SafeHtml;
504
+ declare function ListInsetControl({ children, sides, className, }: ListInsetControlProps): kerfjs.SafeHtml;
495
505
 
496
- export { ListInsetControl, type ListInsetControlProps };
506
+ export { ListInsetControl, type ListInsetControlProps, Sides };
497
507
  ```
498
508
 
499
509
  ## `@kerfjs/ui/list-inset-text`
500
510
 
501
511
  ```ts
502
512
  import * as kerfjs from 'kerfjs';
513
+ import { S as Sides } from './divider-sides-BzB6rphT.js';
503
514
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
504
515
 
505
516
  interface ListInsetTextProps {
506
517
  /** Text (or inline content) that carries no margin, border, or padding of its own. */
507
518
  children: KerfUiContent | string;
519
+ /** Physical inset sides in canonical top/right/bottom/left order. Defaults to all sides. */
520
+ sides?: Sides;
508
521
  /**
509
- * Keep only the horizontal geometry (inline margin, left/right border, and
522
+ * @deprecated Pass `sides="rl"` instead. Keep only the horizontal geometry (inline margin, left/right border, and
510
523
  * left/right padding) and drop the vertical margin, border, and padding. Use it
511
524
  * when the text edge must still align with bordered items but the line should not
512
525
  * add its own vertical box space — tight text layout inside a content region.
@@ -522,9 +535,9 @@ interface ListInsetTextProps {
522
535
  * Pass `horizontalOnly` to keep the horizontal inset but drop the vertical box
523
536
  * space for tight text layout.
524
537
  */
525
- declare function ListInsetText({ children, horizontalOnly, className, }: ListInsetTextProps): kerfjs.SafeHtml;
538
+ declare function ListInsetText({ children, sides, horizontalOnly, className, }: ListInsetTextProps): kerfjs.SafeHtml;
526
539
 
527
- export { ListInsetText, type ListInsetTextProps };
540
+ export { ListInsetText, type ListInsetTextProps, Sides };
528
541
  ```
529
542
 
530
543
  ## `@kerfjs/ui/value-table`
@@ -1940,3 +1953,86 @@ declare function delegateActions<E extends Element = Element>(root: HTMLElement,
1940
1953
 
1941
1954
  export { type ActionHandler, type DelegateActionsOptions, action, delegateActions };
1942
1955
  ```
1956
+
1957
+ ## `@kerfjs/ui/lucide-icon`
1958
+
1959
+ ```ts
1960
+ import * as kerfjs from 'kerfjs';
1961
+ import { IconNode } from 'lucide';
1962
+
1963
+ type LucideNode = IconNode;
1964
+ interface LucideIconProps {
1965
+ icon: LucideNode;
1966
+ name: string;
1967
+ className?: string;
1968
+ label?: string;
1969
+ }
1970
+ /** Render a Lucide-compatible icon node without copying icon SVG strings. */
1971
+ declare function LucideIcon({ icon, name, className, label }: LucideIconProps): kerfjs.SafeHtml;
1972
+
1973
+ export { LucideIcon, type LucideIconProps, type LucideNode };
1974
+ ```
1975
+
1976
+ ## `@kerfjs/ui/surface-scaffold`
1977
+
1978
+ ```ts
1979
+ import * as kerfjs from 'kerfjs';
1980
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1981
+
1982
+ type DialogSurfaceSize = 'small' | 'medium' | 'large';
1983
+ type DialogSurfacePresentation = 'modal' | 'side-sheet' | 'fullscreen';
1984
+ type SurfaceInset = 'none' | 'compact' | 'comfortable';
1985
+ interface DialogSurfaceProps {
1986
+ children: KerfUiContent;
1987
+ size?: DialogSurfaceSize;
1988
+ presentation?: DialogSurfacePresentation;
1989
+ bodyInset?: SurfaceInset;
1990
+ footerInset?: SurfaceInset;
1991
+ className?: string;
1992
+ }
1993
+ /** Configure recurring Web Awesome dialog geometry without consumer ::part() CSS. */
1994
+ declare function DialogSurface({ children, size, presentation, bodyInset, footerInset, className, }: DialogSurfaceProps): kerfjs.SafeHtml;
1995
+ type PopupSurfaceInset = 'standard' | 'compact' | 'list-zero';
1996
+ interface PopupSurfaceProps {
1997
+ children: KerfUiContent;
1998
+ inset?: PopupSurfaceInset;
1999
+ className?: string;
2000
+ }
2001
+ /** Configure recurring Web Awesome dropdown-menu geometry without consumer ::part() CSS. */
2002
+ declare function PopupSurface({ children, inset, className, }: PopupSurfaceProps): kerfjs.SafeHtml;
2003
+
2004
+ export { DialogSurface, type DialogSurfacePresentation, type DialogSurfaceProps, type DialogSurfaceSize, PopupSurface, type PopupSurfaceInset, type PopupSurfaceProps, type SurfaceInset };
2005
+ ```
2006
+
2007
+ ## `@kerfjs/ui/row`
2008
+
2009
+ ```ts
2010
+ import * as kerfjs from 'kerfjs';
2011
+ import { UiSpaceName, CssLength, CssFlexKeyword, CssFlex } from './css-values.js';
2012
+ import { S as Sides } from './divider-sides-BzB6rphT.js';
2013
+ import { H as HorizontalAlignment, V as VerticalAlignment } from './flex-alignment-CF8NLj7i.js';
2014
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2015
+
2016
+ interface RowProps {
2017
+ children?: KerfUiContent;
2018
+ /** Horizontal distribution. Defaults to left. */
2019
+ hAlign?: HorizontalAlignment;
2020
+ /** Vertical alignment and wrapped-line distribution. Defaults to full. */
2021
+ vAlign?: VerticalAlignment;
2022
+ /** A named UI spacing token or typed CSS length. Defaults to xs. */
2023
+ gap?: UiSpaceName | CssLength;
2024
+ /** Allow this row to grow/shrink, use a keyword, or supply a typed CSS flex shorthand. */
2025
+ flex?: boolean | CssFlexKeyword | CssFlex;
2026
+ /** Allow children to wrap onto additional lines. */
2027
+ wrap?: boolean;
2028
+ /** Physical sides that receive the standard 17px text inset. */
2029
+ textInsets?: Sides;
2030
+ /** Physical sides that receive the standard 8px control inset. Text insets win on overlap. */
2031
+ controlInsets?: Sides;
2032
+ className?: string;
2033
+ }
2034
+ /** A horizontal flex row with explicit physical-axis alignment and spacing. */
2035
+ declare function Row({ children, hAlign, vAlign, gap, flex, wrap, textInsets, controlInsets, className, }: RowProps): kerfjs.SafeHtml;
2036
+
2037
+ export { CssFlex, CssFlexKeyword, CssLength, HorizontalAlignment, Row, type RowProps, Sides, UiSpaceName, VerticalAlignment };
2038
+ ```
package/ai/skill.md CHANGED
@@ -128,9 +128,9 @@ Hard rules:
128
128
  12. Demo work uses public production component subpaths and their browser-selected CSS. Give every public visual component its own category-grouped catalog route; list themed third-party components under a clearly labeled collapsible ecosystem section, with a focused route for each. For the complete focused/composition decision, `CatalogExample` / `CatalogExampleStack` row/group nesting, exact specimen selection, geometry-overlay legend and exclusions, skip-marker behavior, and metadata ownership, follow the single [Catalog demo authoring contract](../docs/catalog.md#catalog-demo-authoring-contract), discovered machine-readably through [`catalog-authoring.json`](./catalog-authoring.json). Never infer structure from private `kui-catalog-*` classes. Project each component's deterministic repository-relative demo source and existing documentation path so the detail can expose `View demo source` and `Read guidance` links without a runtime export; also derive first-party component implementation paths from their canonical browser imports, and label Web Awesome documentation as Kerf integration guidance. Declare direct `uses` relationships so `Used by` stays derivable, and theme shell chrome through the same semantic tokens as the stage instead of drawing a substitute. Enable `wireCatalog({ revealSelection: true })` for long desktop sidebars so controlled selections remain visible without moving focus; keep its default compact media guard unless compact scrolling is an explicit product behavior, and use `revealCatalogEntry` for an initial deep link.
129
129
  13. The Web Awesome theme makes Tooltip and Popover arrowless by default. Keep that default unless a pointer materially clarifies the anchor; opt back in with `--wa-tooltip-arrow-size`, `--kui-wa-popover-arrow-size`, or a popover's public `--arrow-size`, and use `without-arrow` when local no-arrow intent should survive theme changes. Its non-field chrome uses `--kui-wa-control-inset` (8px controls/items), `--kui-wa-surface-margin` / `--kui-wa-surface-inset` (8px around/inside Accordion, Card, Details, Callout, and Include), and `--kui-wa-container-inset` (16px Tab Panel content); Dialog maps its body to the 8px surface tier and its footer to the 16px container tier independently of `--spacing`. Override those tiers instead of restyling individual parts. When a dialog provides another dismissal affordance, put `hide-actions` on the `wa-dialog` host to hide its directly exported `header-actions` part; never chain `::part()` selectors through internal parts. Checkbox and Radio Group option regions, the Color Picker trigger, and Slider's complete interactive region receive the shared 8px logical inline outer inset because those controls have no bordered field shell. Known Date field captions and bordered text-like field hints align with values at the 9px border-plus-padding inset. OTP Input's label uses the same uppercase xs/650 treatment as other field labels, and both its label and hint use that 9px inset.
130
130
  14. Treat the complete Web Awesome catalog as support coverage, not a recommendation list. Its UX sidebar marks superseded and exceptional entries `Discouraged`. Consider Popup when it replaces custom anchored positioning. Prefer Kerf `Select` over direct Dropdown/Dropdown Item/Select/Option composition, `SegmentedControl` over Button Group, `TabBar` or `SegmentedControl` over Web Awesome Tabs, `LucideIcon` over Web Awesome Icon, and `ResizableRegion` over Split Panel. Use Tree/Tree Item, Animated Image, and Comparison only for a specific required behavior; avoid Zoomable Frame.
131
- 15. Build sidebars, main areas, inspectors, and dialogs from `@kerfjs/ui/layout.css`: an unpadded `.kui-pane`, optional `.kui-pane__toolbar`, one scrolling `.kui-pane__content`, and optional `.kui-pane__footer`. Use `Row` instead of a hand-written flex-row wrapper and `List` instead of a hand-written flex-column wrapper when children need shared physical-axis alignment and typed spacing. `Row` defaults to left/full with an `xs` gap and no wrapping; `List` retains full/top and zero-gap defaults. Use `List` when rows or sections also need flex growth, one vertical scroll owner, or physical-edge dividers; `dividerSides` uses canonical `t`/`r`/`b`/`l` order. A dialog body is generally a `List`: set `DialogSurface bodyInset="none"` when its list children own geometry, and wrap bare dialog prose in `ListInsetText` so it aligns with bordered siblings without a second inset. Add `.kui-content` for 24px major vertical separation and `.kui-content-item` for a child-owned 8px inline margin, 1px transparent-or-visible border, 8px padding, and 12px radius. Use the pill modifier for 22px. Do not pad pane shells, duplicate item geometry in wrappers, or create nested scroll owners.
131
+ 15. Build sidebars, main areas, inspectors, and dialogs from `@kerfjs/ui/layout.css`: an unpadded `.kui-pane`, optional `.kui-pane__toolbar`, one scrolling `.kui-pane__content`, and optional `.kui-pane__footer`. Use `Row` instead of a hand-written flex-row wrapper and `List` instead of a hand-written flex-column wrapper when children need shared physical-axis alignment and typed spacing. `Row` defaults to left/full with an `xs` gap and no wrapping; `List` retains full/top and zero-gap defaults. Use `List` when rows or sections also need flex growth, one vertical scroll owner, or physical-edge dividers. `dividerSides`, `textInsets`, and `controlInsets` use canonical physical `t`/`r`/`b`/`l` order; text geometry wins where text and control selections overlap. `ListInsetText` and `ListInsetControl` inset all four sides by default and accept the same `sides` grammar for selective edges. A dialog body is generally a `List`: set `DialogSurface bodyInset="none"` when its list children own geometry, and wrap bare dialog prose in `ListInsetText` so it aligns with bordered siblings without a second inset. Add `.kui-content` for 24px major vertical separation and `.kui-content-item` for a child-owned 8px inline margin, 1px transparent-or-visible border, 8px padding, and 12px radius. Use the pill modifier for 22px. Do not pad pane shells, duplicate item geometry in wrappers, or create nested scroll owners.
132
132
  16. Keep a visible collapsible pane's collapse control in its own toolbar. When hidden, move its restore control into the adjacent main toolbar on the corresponding logical edge: leading for an inline-start sidebar and trailing for an inline-end inspector. Collapse the pane completely; do not preserve an empty icon-only rail.
133
- 17. The only direct children of a `Toolbar` zone (`leading`/`center`/`trailing`) are `ToolbarText` (identity/title text) and `ToolbarControlGroup`; never drop bare buttons, inputs, links, or arbitrary markup straight into a zone. Put identity/title text directly in the zone as `ToolbarText`; wrap interactive controls and icon tiles in `ToolbarControlGroup`. `SegmentedControl`, `Select`, a collapsible `TokenSearchField`, and Web Awesome controls all live inside a group. For an ordinary icon/action control inside a group, use a plain `<button>` (the group styles `> button` fully) — that is the default; reach for `wa-button` only when you need a Web Awesome feature, chiefly a `wa-dropdown` popup trigger. A popup menu in a toolbar is a `single` group wrapping a `wa-dropdown` whose `slot="trigger"` `wa-button` is the toolbar button and whose `wa-dropdown-item`s are the menu, with the dropdown kept under `data-morph-skip-children`. For a compact mixed group, keep the standard item padding and raised selected chrome; the selected item paints over the outer border without an internal separator. For an avatar control, set `content="avatar"` and `avatarImage` on the group instead of inserting an `img`: a lone control paints the contained image on the outer group and a multi-button group paints it only on the pressed selection highlight. Compose panel/dialog/page headings with a direct extra-large `ToolbarText`, optional grouped icon, grouped trailing controls, and app-owned supporting copy below. A group remains 44px outside (`calc(2px + remify(42px))`) when its border/background are transparent; use 8px between groups and inside items. Split dormant and interactive regions: `ListHeader` fills the available inline width and keeps its label and mutually exclusive semantic count or non-count `badge` together, with an independent logical-end 44px action unless disclosure mode makes the title cluster the button. Its action visual defaults to 18px through `--kui-list-header-action-icon-size`; never shrink the target to match it. Pass every non-negative safe-integer section quantity through `count` with a localized full spoken `countLabel`; never concatenate it into `label` or put a number in `badge`. `ListItem.trailing` is dormant; use `ListActionRow` when primary and trailing actions need sibling 44px native buttons. Its `label`, `icon`, and `trailingActionIcon` slots are also dormant and cannot contain controls. Let panes relocate at narrow widths instead of shrinking targets.
133
+ 17. The only direct children of a `Toolbar` zone (`leading`/`center`/`trailing`) are `ToolbarText` (identity/title text) and `ToolbarControlGroup`; never drop bare buttons, inputs, links, or arbitrary markup straight into a zone. Put identity/title text directly in the zone as `ToolbarText`; wrap interactive controls and icon tiles in `ToolbarControlGroup`. `SegmentedControl`, `Select`, a collapsible `TokenSearchField`, and Web Awesome controls all live inside a group. For an ordinary icon/action control inside a group, use a plain `<button>` (the group styles `> button` fully) — that is the default; reach for `wa-button` only when you need a Web Awesome feature, chiefly a `wa-dropdown` popup trigger. A popup menu in a toolbar is a `single` group wrapping a `wa-dropdown` whose `slot="trigger"` `wa-button` is the toolbar button and whose `wa-dropdown-item`s are the menu, with the dropdown kept under `data-morph-skip-children`. For a compact mixed group, keep the standard item padding and raised selected chrome; the selected item paints over the outer border without an internal separator. For an avatar control, set `content="avatar"` and `avatarImage` on the group instead of inserting an `img`: a lone control paints the contained image on the outer group and a multi-button group paints it only on the pressed selection highlight. Compose panel/dialog/page headings with a direct extra-large `ToolbarText`, optional grouped icon, grouped trailing controls, and app-owned supporting copy below. A group remains 44px outside (`calc(2px + remify(42px))`) when its border/background are transparent; use 8px between groups and inside items. Split dormant and interactive regions: `ListHeader` fills the available inline width by default; set `inline` only when it should shrink-wrap in surrounding content without outer margin, border, or padding. It keeps its label and mutually exclusive semantic count or non-count `badge` together, with an independent logical-end action unless disclosure mode makes the title cluster the button. Its action visual defaults to 18px through `--kui-list-header-action-icon-size`; never shrink the target to match it. Pass every non-negative safe-integer section quantity through `count` with a localized full spoken `countLabel`; never concatenate it into `label` or put a number in `badge`. `ListItem.trailing` is dormant; use `ListActionRow` when primary and trailing actions need sibling native buttons. Its `label`, `icon`, and `trailingActionIcon` slots are also dormant and cannot contain controls. Let panes relocate at narrow widths instead of shrinking targets.
134
134
  18. When a recurring concept has no matching export or production recipe, keep its semantics in a thin application adapter while reusing the public layout vocabulary. The composer recipe uses one visible form surface, toolbar title/supporting-copy ids, shared 8px field/action gutters, 24px major rhythm, and a conditional StateBanner as its only nested semantic surface; do not turn every section into a card or double-inset intrinsically bordered controls. The application-local `../docs/examples/command-palette-adapter.tsx` is reference source for one such missing concept, not an `@kerfjs/ui` runtime export or catalog recipe. The application owns its registration, ranking, history, permissions, availability, shortcut policy, focus policy, dispatch, and copy. If a missing concept recurs across products, open an upstream component or recipe request.
135
135
  19. Compose `ValueTable` from typed `ValueTableRow` entries instead of handwritten `dt`/`dd` wrappers. Pass `icon` for the optional 24px leading visual; the row owns 8px of root-scaled top and bottom padding, the 8px iconless or 40px icon-bearing separator start, and the common 8px right inset.
136
136
  20. Use the standard direct `Toolbar` composition for a panel, dialog, or page heading, not a private wrapper or custom heading row. Put an optional icon in a `ToolbarControlGroup`, the title directly in the leading zone as extra-large `ToolbarText`, and actions in a trailing group. Set `headingLevel` for page/section landmarks. Supporting copy stays below the toolbar as app-owned content. The app owns modal behavior, focus, dismissal, command policy, ids, and action handling.
@@ -1,6 +1,6 @@
1
1
  # Web Awesome JSX signatures for the UI authoring corpus
2
2
 
3
- Generated from the emitted `@kerfjs/ui@5.0.0-beta.34` declaration boundary. Import `@kerfjs/ui/webawesome` for type effects when authoring direct `wa-*` JSX. The module emits no runtime behavior and does not register custom elements.
3
+ Generated from the emitted `@kerfjs/ui@5.0.0-beta.36` declaration boundary. Import `@kerfjs/ui/webawesome` for type effects when authoring direct `wa-*` JSX. The module emits no runtime behavior and does not register custom elements.
4
4
 
5
5
  ```ts
6
6
  import { KerfCustomElement } from 'kerfjs/jsx-runtime';
package/dist/catalog.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { ToolbarControlGroup } from './chunk-B6JYRX3P.js';
2
2
  import { Toolbar } from './chunk-VXFGMDA7.js';
3
3
  import { Pane } from './chunk-I4V3UDSA.js';
4
- import { ListHeader } from './chunk-OC275HHS.js';
4
+ import { ListHeader } from './chunk-5FJ53EOF.js';
5
5
  import { ListItem } from './chunk-I45QO2IZ.js';
6
- import { List } from './chunk-7JQAQWVC.js';
6
+ import { List } from './chunk-TNXDXSGP.js';
7
7
 
8
8
  import { filterDataAttributes } from './chunk-SRSJO5QE.js';
9
9
 
@@ -3,6 +3,7 @@ import { jsx } from 'kerfjs/jsx-runtime';
3
3
  // src/list-inset-control.tsx
4
4
  function ListInsetControl({
5
5
  children,
6
+ sides = "trbl",
6
7
  className = ""
7
8
  }) {
8
9
  return /* @__PURE__ */ jsx(
@@ -10,6 +11,7 @@ function ListInsetControl({
10
11
  {
11
12
  class: `kui-list-inset-control ${className}`.trim(),
12
13
  "data-component": "list-inset-control",
14
+ "data-sides": sides,
13
15
  children
14
16
  }
15
17
  );
@@ -17,4 +19,4 @@ function ListInsetControl({
17
19
 
18
20
  export { ListInsetControl };
19
21
 
20
- //# sourceMappingURL=chunk-MFR2IIFG.js.map
22
+ //# sourceMappingURL=chunk-2TYUFZUC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/list-inset-control.tsx"],"names":[],"mappings":";;;AAiBO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,KAAA,GAAQ,MAAA;AAAA,EACR,SAAA,GAAY;AACd,CAAA,EAA0B;AACxB,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,uBAAA,EAA0B,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAClD,gBAAA,EAAe,oBAAA;AAAA,MACf,YAAA,EAAY,KAAA;AAAA,MAEX;AAAA;AAAA,GACH;AAEJ","file":"chunk-2TYUFZUC.js","sourcesContent":["import type { Sides } from './divider-sides.js';\nimport type { KerfUiContent } from './semantic-content.js';\n\nexport interface ListInsetControlProps {\n /** Control(s) that own their own border and padding (e.g. an input, a `wa-*`). */\n children: KerfUiContent;\n /** Physical inset sides in canonical top/right/bottom/left order. Defaults to all sides. */\n sides?: Sides;\n className?: string;\n}\n\n/**\n * Insets a control into a pane/list content region: an 8px inline margin (so its\n * edges line up with `.kui-content` items) and a stretch flex row with an 8px gap.\n * Use it for controls that carry their own border and padding but no outer margin\n * — the wrapper adds only the alignment margin and layout, not a second inset.\n */\nexport function ListInsetControl({\n children,\n sides = 'trbl',\n className = '',\n}: ListInsetControlProps) {\n return (\n <div\n class={`kui-list-inset-control ${className}`.trim()}\n data-component=\"list-inset-control\"\n data-sides={sides}\n >\n {children}\n </div>\n );\n}\n\nexport type { Sides } from './divider-sides.js';\n"]}
@@ -11,6 +11,7 @@ var PROTECTED_ROOT_DATA_ATTRIBUTES = /* @__PURE__ */ new Set([
11
11
  "data-has-count",
12
12
  "data-density",
13
13
  "data-divider",
14
+ "data-inline",
14
15
  "data-indicator-tone",
15
16
  "data-toggle"
16
17
  ]);
@@ -23,6 +24,7 @@ function ListHeader({
23
24
  status,
24
25
  density = "standard",
25
26
  divider = "none",
27
+ inline = false,
26
28
  indicatorTone = "neutral",
27
29
  action,
28
30
  actionLabel,
@@ -61,6 +63,7 @@ function ListHeader({
61
63
  "data-has-count": String(normalizedCount !== void 0),
62
64
  "data-density": density,
63
65
  "data-divider": divider,
66
+ "data-inline": String(inline),
64
67
  "data-indicator-tone": indicatorTone,
65
68
  "data-toggle": "true",
66
69
  "data-placeholder": placeholder ? "true" : void 0,
@@ -96,6 +99,7 @@ function ListHeader({
96
99
  "data-has-count": String(normalizedCount !== void 0),
97
100
  "data-density": density,
98
101
  "data-divider": divider,
102
+ "data-inline": String(inline),
99
103
  "data-indicator-tone": indicatorTone,
100
104
  "data-toggle": "false",
101
105
  "data-placeholder": placeholder ? "true" : void 0,
@@ -125,4 +129,4 @@ function ListHeader({
125
129
 
126
130
  export { ListHeader };
127
131
 
128
- //# sourceMappingURL=chunk-OC275HHS.js.map
132
+ //# sourceMappingURL=chunk-5FJ53EOF.js.map