@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.
- package/README.md +19 -4
- package/ai/component-catalog-v2.json +15 -5
- package/ai/component-catalog.json +45 -19
- package/ai/public-api-signatures-v1.md +107 -11
- package/ai/skill.md +2 -2
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/catalog.js +2 -2
- package/dist/{chunk-MFR2IIFG.js → chunk-2TYUFZUC.js} +3 -1
- package/dist/chunk-2TYUFZUC.js.map +1 -0
- package/dist/{chunk-OC275HHS.js → chunk-5FJ53EOF.js} +5 -1
- package/dist/chunk-5FJ53EOF.js.map +1 -0
- package/dist/{chunk-OKRCKIVO.js → chunk-AVZ2IMWG.js} +13 -2
- package/dist/chunk-AVZ2IMWG.js.map +1 -0
- package/dist/{chunk-KFUUFNTS.js → chunk-EYALJQQD.js} +12 -2
- package/dist/chunk-EYALJQQD.js.map +1 -0
- package/dist/{chunk-7JQAQWVC.js → chunk-TNXDXSGP.js} +5 -1
- package/dist/chunk-TNXDXSGP.js.map +1 -0
- package/dist/divider-sides-BzB6rphT.d.ts +6 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +5 -5
- package/dist/list-header.d.ts +4 -1
- package/dist/list-header.js +1 -1
- package/dist/list-inset-control.d.ts +5 -2
- package/dist/list-inset-control.js +1 -1
- package/dist/list-inset-text.d.ts +6 -3
- package/dist/list-inset-text.js +1 -1
- package/dist/list.d.ts +7 -3
- package/dist/list.js +1 -1
- package/dist/row.d.ts +10 -3
- package/dist/row.js +1 -1
- package/dist/styles/list-header.css +27 -0
- package/dist/styles/list-inset-control.css +17 -1
- package/dist/styles/list-inset-text.css +27 -11
- package/dist/styles/list.css +46 -0
- package/dist/styles/row.css +47 -0
- package/dist/toolbar.d.ts +1 -1
- package/docs/component-contract.md +9 -5
- package/docs/component-integration.md +63 -0
- package/docs/component-selection.md +1 -1
- package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
- package/docs/design/templates/list-header/inline-action.svg +1 -0
- package/docs/design/templates/list-header-dark.svg +1 -1
- package/docs/design/templates/list-header.svg +1 -1
- package/docs/layout.md +20 -0
- package/docs/ux-demo.md +10 -0
- package/llms.txt +4 -0
- package/package.json +9 -3
- package/dist/chunk-7JQAQWVC.js.map +0 -1
- package/dist/chunk-KFUUFNTS.js.map +0 -1
- package/dist/chunk-MFR2IIFG.js.map +0 -1
- package/dist/chunk-OC275HHS.js.map +0 -1
- package/dist/chunk-OKRCKIVO.js.map +0 -1
- 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
|
|
216
|
-
|
|
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
|
|
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": "
|
|
1439
|
+
"padding": "conditional",
|
|
1440
1440
|
"notes": [
|
|
1441
|
-
"Row adds no margin
|
|
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": "
|
|
1524
|
+
"padding": "conditional",
|
|
1515
1525
|
"notes": [
|
|
1516
|
-
"List adds no margin
|
|
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
|
|
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
|
-
"
|
|
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": "
|
|
1717
|
+
"padding": "conditional",
|
|
1704
1718
|
"notes": [
|
|
1705
|
-
"Row adds no margin
|
|
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
|
|
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": "
|
|
1822
|
+
"padding": "conditional",
|
|
1807
1823
|
"notes": [
|
|
1808
|
-
"List adds no margin
|
|
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
|
|
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
|
|
2194
|
+
"description": "Insets selected physical sides of a self-bordered control in a pane/list content region.",
|
|
2178
2195
|
"uses": [],
|
|
2179
|
-
"purpose": "
|
|
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": "
|
|
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.
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
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.
|
|
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-
|
|
4
|
+
import { ListHeader } from './chunk-5FJ53EOF.js';
|
|
5
5
|
import { ListItem } from './chunk-I45QO2IZ.js';
|
|
6
|
-
import { List } from './chunk-
|
|
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-
|
|
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-
|
|
132
|
+
//# sourceMappingURL=chunk-5FJ53EOF.js.map
|