@kerfjs/ui 5.0.0-beta.95 → 5.0.0-beta.96
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 +95 -55
- package/ai/component-catalog.json +1328 -94
- package/ai/component-composition-rules.json +11 -0
- package/ai/component-composition.d.ts +3 -0
- package/ai/component-composition.json +955 -23
- package/ai/component-composition.schema.json +4 -0
- package/ai/components/README.md +12 -0
- package/ai/components/badge.md +6 -2
- package/ai/components/choice-chips.md +80 -0
- package/ai/components/column-track.md +78 -0
- package/ai/components/combobox.md +88 -0
- package/ai/components/content-item.md +2 -0
- package/ai/components/content-swap.md +78 -0
- package/ai/components/corner-status.md +88 -0
- package/ai/components/document-baseline.md +3 -1
- package/ai/components/edge-activity-indicator.md +81 -0
- package/ai/components/file-picker.md +88 -0
- package/ai/components/foundation.md +1 -1
- package/ai/components/framed-list.md +80 -0
- package/ai/components/grid.md +2 -1
- package/ai/components/icon-button.md +82 -0
- package/ai/components/icon-toggle-button.md +80 -0
- package/ai/components/list-action-row.md +19 -7
- package/ai/components/list-item.md +16 -7
- package/ai/components/list.md +5 -2
- package/ai/components/nav-stack.md +2 -1
- package/ai/components/popup-menu.md +2 -2
- package/ai/components/row.md +1 -1
- package/ai/components/select.md +2 -1
- package/ai/components/split-button.md +80 -0
- package/ai/components/split-view.md +1 -1
- package/ai/components/state-banner.md +4 -2
- package/ai/components/summary-row.md +85 -0
- package/ai/components/sunken-panel.md +1 -1
- package/ai/components/surface-scaffold.md +8 -2
- package/ai/components/text.md +3 -0
- package/ai/components/toolbar-control-group.md +4 -2
- package/ai/components/toolbar-text.md +1 -0
- package/ai/components/toolbar.md +1 -0
- package/ai/components/value-table.md +9 -2
- package/ai/components/wa-button-group.md +2 -1
- package/ai/components/wa-button.md +5 -1
- package/ai/public-api-signatures-v1.md +1063 -52
- package/ai/skill.md +54 -52
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/anchored-surface.d.ts +13 -2
- package/dist/anchored-surface.js +1 -1
- package/dist/app-tab.js +1 -1
- package/dist/badge.d.ts +31 -2
- package/dist/badge.js +2 -1
- package/dist/browser/choice-chips.js +3 -0
- package/dist/browser/column-track.js +3 -0
- package/dist/browser/combobox.js +3 -0
- package/dist/browser/content-swap.js +3 -0
- package/dist/browser/corner-status.js +3 -0
- package/dist/browser/edge-activity-indicator.js +3 -0
- package/dist/browser/file-picker.js +3 -0
- package/dist/browser/framed-list.js +3 -0
- package/dist/browser/icon-button.js +4 -0
- package/dist/browser/icon-toggle-button.js +4 -0
- package/dist/browser/list-action-row.js +1 -0
- package/dist/browser/split-button.js +5 -0
- package/dist/browser/summary-row.js +3 -0
- package/dist/catalog-resources.d.ts +1 -0
- package/dist/catalog.d.ts +1 -0
- package/dist/catalog.js +16 -13
- package/dist/catalog.js.map +1 -1
- package/dist/chip.d.ts +1 -0
- package/dist/choice-chips.d.ts +58 -0
- package/dist/choice-chips.js +3 -0
- package/dist/choice-chips.js.map +1 -0
- package/dist/chunk-2MSPNRWJ.js +82 -0
- package/dist/chunk-2MSPNRWJ.js.map +1 -0
- package/dist/{chunk-3PO7JEK7.js → chunk-36TL6BCR.js} +18 -4
- package/dist/chunk-36TL6BCR.js.map +1 -0
- package/dist/{chunk-MORVLMDG.js → chunk-44A6LP54.js} +3 -3
- package/dist/chunk-44A6LP54.js.map +1 -0
- package/dist/{chunk-7QQ3HE47.js → chunk-4LOK4634.js} +7 -3
- package/dist/chunk-4LOK4634.js.map +1 -0
- package/dist/chunk-4UB5Z3ZZ.js +68 -0
- package/dist/chunk-4UB5Z3ZZ.js.map +1 -0
- package/dist/{chunk-PGL6TXFW.js → chunk-6BRRUPJY.js} +6 -2
- package/dist/chunk-6BRRUPJY.js.map +1 -0
- package/dist/{chunk-KAJVVN7Q.js → chunk-6NOLL5KG.js} +2 -2
- package/dist/{chunk-KAJVVN7Q.js.map → chunk-6NOLL5KG.js.map} +1 -1
- package/dist/{chunk-IOS2NXW7.js → chunk-76PWEN5Y.js} +13 -2
- package/dist/chunk-76PWEN5Y.js.map +1 -0
- package/dist/{chunk-B3TROLC2.js → chunk-7IUEBNCO.js} +7 -3
- package/dist/chunk-7IUEBNCO.js.map +1 -0
- package/dist/{chunk-75YOTZ25.js → chunk-AYHC62OZ.js} +10 -6
- package/dist/chunk-AYHC62OZ.js.map +1 -0
- package/dist/{chunk-RZYQFGMM.js → chunk-BBU2SPRE.js} +4 -4
- package/dist/{chunk-RZYQFGMM.js.map → chunk-BBU2SPRE.js.map} +1 -1
- package/dist/{chunk-QCLLBMLA.js → chunk-BU23Z5HZ.js} +37 -12
- package/dist/chunk-BU23Z5HZ.js.map +1 -0
- package/dist/{chunk-BYHGRKC3.js → chunk-CMLPFIC5.js} +3 -1
- package/dist/chunk-CMLPFIC5.js.map +1 -0
- package/dist/{chunk-3XPGJUUQ.js → chunk-D5RGM3XA.js} +3 -2
- package/dist/chunk-D5RGM3XA.js.map +1 -0
- package/dist/chunk-EIET4QLK.js +51 -0
- package/dist/chunk-EIET4QLK.js.map +1 -0
- package/dist/chunk-ETCWQLJV.js +85 -0
- package/dist/chunk-ETCWQLJV.js.map +1 -0
- package/dist/chunk-FDZNYD4C.js +138 -0
- package/dist/chunk-FDZNYD4C.js.map +1 -0
- package/dist/{chunk-XKZPBRU7.js → chunk-FOQK4F3L.js} +25 -5
- package/dist/chunk-FOQK4F3L.js.map +1 -0
- package/dist/{chunk-FL6J644M.js → chunk-GJYQ27C2.js} +4 -2
- package/dist/chunk-GJYQ27C2.js.map +1 -0
- package/dist/{chunk-DL55BSQX.js → chunk-GZE2XVKC.js} +8 -1
- package/dist/chunk-GZE2XVKC.js.map +1 -0
- package/dist/{chunk-YP2G67S7.js → chunk-HO6FU3G7.js} +2 -2
- package/dist/{chunk-YP2G67S7.js.map → chunk-HO6FU3G7.js.map} +1 -1
- package/dist/{chunk-3DXHNLME.js → chunk-IGTWXPTN.js} +25 -8
- package/dist/chunk-IGTWXPTN.js.map +1 -0
- package/dist/chunk-IKS72C6P.js +53 -0
- package/dist/chunk-IKS72C6P.js.map +1 -0
- package/dist/chunk-JYD7G4RG.js +130 -0
- package/dist/chunk-JYD7G4RG.js.map +1 -0
- package/dist/{chunk-LAZLBC2Q.js → chunk-KH4KEMSP.js} +33 -2
- package/dist/chunk-KH4KEMSP.js.map +1 -0
- package/dist/chunk-LL45C7BB.js +122 -0
- package/dist/chunk-LL45C7BB.js.map +1 -0
- package/dist/chunk-M2NRCFRO.js +45 -0
- package/dist/chunk-M2NRCFRO.js.map +1 -0
- package/dist/chunk-MJ5RU6XT.js +173 -0
- package/dist/chunk-MJ5RU6XT.js.map +1 -0
- package/dist/{chunk-GIUOXAVL.js → chunk-P74VXMB6.js} +39 -19
- package/dist/chunk-P74VXMB6.js.map +1 -0
- package/dist/{chunk-TKDDTLG5.js → chunk-PBT3CPPY.js} +31 -3
- package/dist/chunk-PBT3CPPY.js.map +1 -0
- package/dist/chunk-PRG4CL3Q.js +88 -0
- package/dist/chunk-PRG4CL3Q.js.map +1 -0
- package/dist/chunk-QH5KOFNS.js +39 -0
- package/dist/chunk-QH5KOFNS.js.map +1 -0
- package/dist/{chunk-CD5TOO22.js → chunk-QIAPOWHH.js} +2 -2
- package/dist/{chunk-CD5TOO22.js.map → chunk-QIAPOWHH.js.map} +1 -1
- package/dist/chunk-QQ3TTWFH.js +29 -0
- package/dist/chunk-QQ3TTWFH.js.map +1 -0
- package/dist/chunk-QYMJHS4K.js +36 -0
- package/dist/chunk-QYMJHS4K.js.map +1 -0
- package/dist/chunk-R42D2BAO.js +44 -0
- package/dist/chunk-R42D2BAO.js.map +1 -0
- package/dist/chunk-S2XULQEK.js +52 -0
- package/dist/chunk-S2XULQEK.js.map +1 -0
- package/dist/{chunk-NMWDHZVM.js → chunk-S4Y3YTAI.js} +2 -2
- package/dist/{chunk-NMWDHZVM.js.map → chunk-S4Y3YTAI.js.map} +1 -1
- package/dist/{chunk-O27D24CA.js → chunk-TDMHA7C3.js} +3 -2
- package/dist/chunk-TDMHA7C3.js.map +1 -0
- package/dist/chunk-U6QYTMDB.js +85 -0
- package/dist/chunk-U6QYTMDB.js.map +1 -0
- package/dist/{chunk-QQICWWNX.js → chunk-V6W56V3N.js} +18 -7
- package/dist/chunk-V6W56V3N.js.map +1 -0
- package/dist/chunk-W4IK7AWD.js +73 -0
- package/dist/chunk-W4IK7AWD.js.map +1 -0
- package/dist/{chunk-TNG3XKHB.js → chunk-Y3LC7JQO.js} +26 -8
- package/dist/chunk-Y3LC7JQO.js.map +1 -0
- package/dist/chunk-YWQGSUF2.js +84 -0
- package/dist/chunk-YWQGSUF2.js.map +1 -0
- package/dist/{chunk-MTCTX25G.js → chunk-YXOMI7ES.js} +1 -1
- package/dist/chunk-YXOMI7ES.js.map +1 -0
- package/dist/chunk-ZKKO4MHC.js +25 -0
- package/dist/chunk-ZKKO4MHC.js.map +1 -0
- package/dist/collapsible-panel.d.ts +10 -3
- package/dist/collapsible-panel.js +8 -5
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/column-track.d.ts +41 -0
- package/dist/column-track.js +4 -0
- package/dist/column-track.js.map +1 -0
- package/dist/combobox.d.ts +40 -0
- package/dist/combobox.js +3 -0
- package/dist/combobox.js.map +1 -0
- package/dist/content-item.d.ts +21 -4
- package/dist/content-item.js +1 -1
- package/dist/content-swap.d.ts +34 -0
- package/dist/content-swap.js +3 -0
- package/dist/content-swap.js.map +1 -0
- package/dist/corner-status.d.ts +36 -0
- package/dist/corner-status.js +3 -0
- package/dist/corner-status.js.map +1 -0
- package/dist/edge-activity-indicator.d.ts +28 -0
- package/dist/edge-activity-indicator.js +3 -0
- package/dist/edge-activity-indicator.js.map +1 -0
- package/dist/extension-attributes-mu8MFUl0.d.ts +13 -0
- package/dist/file-picker.d.ts +47 -0
- package/dist/file-picker.js +3 -0
- package/dist/file-picker.js.map +1 -0
- package/dist/framed-list.d.ts +47 -0
- package/dist/framed-list.js +4 -0
- package/dist/framed-list.js.map +1 -0
- package/dist/grid.js +1 -1
- package/dist/help-tags-register.js +1 -1
- package/dist/icon-button.d.ts +46 -0
- package/dist/icon-button.js +6 -0
- package/dist/icon-button.js.map +1 -0
- package/dist/icon-toggle-button.d.ts +42 -0
- package/dist/icon-toggle-button.js +6 -0
- package/dist/icon-toggle-button.js.map +1 -0
- package/dist/index.d.ts +23 -6
- package/dist/index.js +44 -27
- package/dist/list-action-row.d.ts +47 -10
- package/dist/list-action-row.js +2 -1
- package/dist/list-header.js +1 -1
- package/dist/list-inset-text.js +1 -1
- package/dist/list-item.d.ts +10 -2
- package/dist/list-item.js +1 -1
- package/dist/list.d.ts +37 -5
- package/dist/list.js +1 -1
- package/dist/nav-stack.d.ts +1 -0
- package/dist/nav-stack.js +2 -1
- package/dist/pane.js +2 -1
- package/dist/popup-menu-register.js +18 -1
- package/dist/popup-menu-register.js.map +1 -1
- package/dist/popup-menu.d.ts +28 -3
- package/dist/popup-menu.js +1 -1
- package/dist/row.d.ts +6 -2
- package/dist/row.js +1 -1
- package/dist/select-register.js +1 -1
- package/dist/select.js +2 -1
- package/dist/split-button.d.ts +57 -0
- package/dist/split-button.js +7 -0
- package/dist/split-button.js.map +1 -0
- package/dist/split-view.d.ts +20 -2
- package/dist/split-view.js +22 -1
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.d.ts +17 -2
- package/dist/state-banner.js +2 -1
- package/dist/styles/badge.css +27 -0
- package/dist/styles/catalog/components/catalog-example.css +7 -3
- package/dist/styles/choice-chips.css +154 -0
- package/dist/styles/column-track.css +57 -0
- package/dist/styles/combobox.css +113 -0
- package/dist/styles/components/actions/icon-button/icon-button.css +22 -0
- package/dist/styles/components/actions/icon-toggle-button/icon-toggle-button.css +83 -0
- package/dist/styles/components/actions/popup-menu/popup-menu.css +69 -1
- package/dist/styles/components/actions/split-button/split-button.css +95 -0
- package/dist/styles/components/actions/toolbar/toolbar.css +16 -9
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +144 -48
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +23 -0
- package/dist/styles/components/collections/framed-list/framed-list.css +47 -0
- package/dist/styles/components/collections/list/list.css +44 -0
- package/dist/styles/components/collections/list-action-row/list-action-row.css +39 -0
- package/dist/styles/components/collections/list-item/list-item.css +45 -0
- package/dist/styles/components/collections/summary-row/summary-row.css +161 -0
- package/dist/styles/components/data-display/value-table/value-table.css +76 -0
- package/dist/styles/components/feedback/badge/badge.css +27 -0
- package/dist/styles/components/feedback/corner-status/corner-status.css +60 -0
- package/dist/styles/components/feedback/edge-activity-indicator/edge-activity-indicator.css +127 -0
- package/dist/styles/components/feedback/state-banner/state-banner.css +38 -0
- package/dist/styles/components/forms/choice-chips/choice-chips.css +154 -0
- package/dist/styles/components/forms/combobox/combobox.css +113 -0
- package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
- package/dist/styles/components/forms/token-search-field/token-search-field.css +12 -1
- package/dist/styles/components/layout/column-track/column-track.css +57 -0
- package/dist/styles/components/layout/content-swap/content-swap.css +154 -0
- package/dist/styles/components/layout/pane/pane.css +2 -8
- package/dist/styles/components/layout/workbench/workbench.css +2 -8
- package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +1 -4
- package/dist/styles/components/surfaces/content-item/content-item.css +18 -0
- package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +1 -4
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +119 -0
- package/dist/styles/components/typography/text/text.css +62 -0
- package/dist/styles/content-item.css +18 -0
- package/dist/styles/content-swap.css +154 -0
- package/dist/styles/corner-status.css +60 -0
- package/dist/styles/document.css +65 -0
- package/dist/styles/edge-activity-indicator.css +127 -0
- package/dist/styles/file-picker.css +81 -0
- package/dist/styles/foundation.css +8 -0
- package/dist/styles/framed-list.css +47 -0
- package/dist/styles/icon-button.css +22 -0
- package/dist/styles/icon-toggle-button.css +83 -0
- package/dist/styles/list-action-row.css +39 -0
- package/dist/styles/list-item.css +45 -0
- package/dist/styles/list.css +44 -0
- package/dist/styles/pane.css +2 -8
- package/dist/styles/popup-menu.css +69 -1
- package/dist/styles/split-button.css +95 -0
- package/dist/styles/state-banner.css +38 -0
- package/dist/styles/styles.css +12 -0
- package/dist/styles/summary-row.css +161 -0
- package/dist/styles/sunken-panel.css +1 -4
- package/dist/styles/surface-scaffold.css +119 -0
- package/dist/styles/tab-navigator.css +1 -4
- package/dist/styles/text.css +62 -0
- package/dist/styles/token-search-field.css +12 -1
- package/dist/styles/toolbar-control-group.css +144 -48
- package/dist/styles/toolbar-text.css +23 -0
- package/dist/styles/toolbar.css +16 -9
- package/dist/styles/value-table.css +76 -0
- package/dist/styles/webawesome.css +4 -4
- package/dist/styles/workbench.css +2 -8
- package/dist/summary-row.d.ts +56 -0
- package/dist/summary-row.js +4 -0
- package/dist/summary-row.js.map +1 -0
- package/dist/sunken-panel.d.ts +8 -1
- package/dist/sunken-panel.js +2 -1
- package/dist/surface-scaffold-register.js +7 -1
- package/dist/surface-scaffold-register.js.map +1 -1
- package/dist/surface-scaffold.d.ts +75 -2
- package/dist/surface-scaffold.js +2 -1
- package/dist/tab-navigator.js +4 -1
- package/dist/tab-navigator.js.map +1 -1
- package/dist/text.d.ts +39 -4
- package/dist/text.js +1 -1
- package/dist/toolbar-control-group.d.ts +8 -1
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar-text.d.ts +14 -1
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +14 -3
- package/dist/toolbar.js +1 -1
- package/dist/value-table.d.ts +20 -2
- package/dist/value-table.js +1 -1
- package/dist/wire-catalog.d.ts +1 -0
- package/dist/wire-comboboxes.d.ts +26 -0
- package/dist/wire-comboboxes.js +3 -0
- package/dist/wire-comboboxes.js.map +1 -0
- package/dist/wire-corner-status.d.ts +11 -0
- package/dist/wire-corner-status.js +3 -0
- package/dist/wire-corner-status.js.map +1 -0
- package/dist/wire-file-pickers.d.ts +26 -0
- package/dist/wire-file-pickers.js +3 -0
- package/dist/wire-file-pickers.js.map +1 -0
- package/dist/wire-list-reorder.d.ts +41 -0
- package/dist/wire-list-reorder.js +3 -0
- package/dist/wire-list-reorder.js.map +1 -0
- package/dist/wire-token-search-fields.js +1 -1
- package/dist/workbench.d.ts +1 -0
- package/dist/workbench.js +2 -1
- package/docs/accessibility.md +45 -2
- package/docs/anchored-surface.md +15 -7
- package/docs/app-layouts.md +2 -1
- package/docs/component-contract.md +26 -6
- package/docs/component-selection.md +149 -13
- package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
- package/docs/design/templates/choice-chips/color-palette.svg +1 -0
- package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
- package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
- package/docs/design/templates/choice-chips-dark.svg +1 -0
- package/docs/design/templates/choice-chips.svg +1 -0
- package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -0
- package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
- package/docs/design/templates/list-action-row-dark.svg +1 -1
- package/docs/design/templates/list-action-row.svg +1 -1
- package/docs/design/templates/state-banner/strip-dark.svg +1 -0
- package/docs/design/templates/state-banner/strip.svg +1 -0
- package/docs/design/templates/state-banner-dark.svg +1 -1
- package/docs/design/templates/state-banner.svg +1 -1
- package/docs/design/templates.md +1 -1
- package/docs/document-baseline.md +51 -0
- package/docs/layout.md +52 -1
- package/docs/split-view.md +20 -2
- package/docs/sunken-panel.md +13 -0
- package/docs/surface-scaffold.md +66 -1
- package/docs/ux-demo.md +1 -0
- package/docs/webawesome-theme.md +6 -2
- package/llms.txt +125 -16
- package/package.json +89 -1
- package/dist/chunk-3DXHNLME.js.map +0 -1
- package/dist/chunk-3PO7JEK7.js.map +0 -1
- package/dist/chunk-3XPGJUUQ.js.map +0 -1
- package/dist/chunk-4Y4L5YEI.js +0 -66
- package/dist/chunk-4Y4L5YEI.js.map +0 -1
- package/dist/chunk-75YOTZ25.js.map +0 -1
- package/dist/chunk-7QQ3HE47.js.map +0 -1
- package/dist/chunk-A7DYEERU.js +0 -59
- package/dist/chunk-A7DYEERU.js.map +0 -1
- package/dist/chunk-B3TROLC2.js.map +0 -1
- package/dist/chunk-BYHGRKC3.js.map +0 -1
- package/dist/chunk-DL55BSQX.js.map +0 -1
- package/dist/chunk-FL6J644M.js.map +0 -1
- package/dist/chunk-GIUOXAVL.js.map +0 -1
- package/dist/chunk-IOS2NXW7.js.map +0 -1
- package/dist/chunk-J3AWE5I4.js +0 -50
- package/dist/chunk-J3AWE5I4.js.map +0 -1
- package/dist/chunk-LAZLBC2Q.js.map +0 -1
- package/dist/chunk-MORVLMDG.js.map +0 -1
- package/dist/chunk-MTCTX25G.js.map +0 -1
- package/dist/chunk-O27D24CA.js.map +0 -1
- package/dist/chunk-PGL6TXFW.js.map +0 -1
- package/dist/chunk-QCLLBMLA.js.map +0 -1
- package/dist/chunk-QQICWWNX.js.map +0 -1
- package/dist/chunk-TKDDTLG5.js.map +0 -1
- package/dist/chunk-TNG3XKHB.js.map +0 -1
- package/dist/chunk-XKZPBRU7.js.map +0 -1
|
@@ -239,6 +239,10 @@
|
|
|
239
239
|
"additionalProperties": false
|
|
240
240
|
}
|
|
241
241
|
},
|
|
242
|
+
"actions": {
|
|
243
|
+
"description": "data-action values the application must handle with a root-delegated listener (delegate or delegateActions) instead of a named helper. Required wiring names at least one helper or action.",
|
|
244
|
+
"$ref": "#/$defs/stringList"
|
|
245
|
+
},
|
|
242
246
|
"obligations": { "$ref": "#/$defs/stringList" },
|
|
243
247
|
"stateAttributes": {
|
|
244
248
|
"description": "Wiring-owned state attributes: data-* attributes a wiring helper writes at runtime, which the application must not render, remove, or treat as its own state. Optional for extension catalogs; first-party entries always list it, empty when their helpers write none.",
|
package/ai/components/README.md
CHANGED
|
@@ -33,8 +33,12 @@ Exact prop and callback types live in [`public-api-signatures-v1.md`](../public-
|
|
|
33
33
|
- [Text](./text.md) — Render paragraph semantics by default, h1 through h6 when selected, or geometry-free inline secondary text as a span while independently configuring quiet or danger tone, compact through extra-large size, or monospace font.
|
|
34
34
|
- [Headers](./headers.md) — Page, dialog, and definition-list hierarchy.
|
|
35
35
|
- [ValueTable](./value-table.md) — Key/value rows with optional icons and aligned separators.
|
|
36
|
+
- [FramedList](./framed-list.md) — Group settings-style rows of arbitrary content (copy, keycaps, controls) in one framed surface with between-row dividers and an optional highlighted row, without app list CSS.
|
|
37
|
+
- [SummaryRow](./summary-row.md) — Present dense item summaries (tickets, tasks, messages) as selectable list rows or board cards with Kerf-owned selection, hover, focus, rail, clamping, list-edge rounding, and narrow compaction, without app row CSS.
|
|
36
38
|
- [Row](./row.md) — Arrange related content horizontally with consistent spacing, optional physical-side text/control insets, and explicit left/center/right/full plus top/middle/bottom/full/baseline alignment instead of application-owned flex wrappers.
|
|
37
39
|
- [Grid](./grid.md) — Arrange related siblings in equal-width columns with either a fixed count or automatic container-width collapse.
|
|
40
|
+
- [ColumnTrack](./column-track.md) — Lay out a board of columns (kanban) as one horizontal scroll owner: equal columns that never shrink below a minimum, or a paged phone layout with a peeking next column and start snapping, without app track CSS.
|
|
41
|
+
- [ContentSwap](./content-swap.md) — Swap arbitrary content in place (a dialog body that steps to a second page, a label or footer whose actions change) with Kerf-owned push or crossfade motion, reduced-motion handling, and an inert, hidden inactive side.
|
|
38
42
|
- [Spacer](./spacer.md) — Express an intentional empty dimension or consume remaining flex space without application-owned spacer markup or raw CSS lengths.
|
|
39
43
|
- [ListInsetControl](./list-inset-control.md) — 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.
|
|
40
44
|
- [ListInsetText](./list-inset-text.md) — 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.
|
|
@@ -53,16 +57,24 @@ Exact prop and callback types live in [`public-api-signatures-v1.md`](../public-
|
|
|
53
57
|
## Kerf UI — Controls
|
|
54
58
|
|
|
55
59
|
- [SegmentedControl](./segmented-control.md) — Controlled exclusive choices in toolbar, rounded-rectangle, and pill presentations.
|
|
60
|
+
- [ChoiceChips](./choice-chips.md) — Choose one value from a visible set too large for a segmented track, such as a color palette with labeled swatches.
|
|
56
61
|
- [TokenSearchField](./token-search-field.md) — Token-controlled, optionally collapsible search editor with ordered, editable, removable filter chips.
|
|
57
62
|
- [ResizableRegion](./resize.md) — Pointer and keyboard-operable split region with a customizable handle icon.
|
|
58
63
|
- [Select](./select.md) — Choose one or more controlled values, keep unavailable choices visible, and optionally select all enabled choices or clear a multiple selection.
|
|
64
|
+
- [Combobox](./combobox.md) — Let people pick an existing value or create a new one by typing (tags, labels, recipients), with the themed field chrome, the ARIA combobox pattern, and a touch-safe font size, without a native datalist or app CSS.
|
|
59
65
|
- [PopupMenu](./popup-menu.md) — A typed action menu with nested choices, selected state, and optional pointer-anchored context opening, built on the Web Awesome dropdown.
|
|
66
|
+
- [IconButton](./icon-button.md) — Render an icon-only action as a square one form-control height on each side, so it matches an adjacent wa-input or Select, without ::part overrides.
|
|
67
|
+
- [IconToggleButton](./icon-toggle-button.md) — Render an icon-only aria-pressed toggle in content or a pane footer, where a Toolbar does not belong, with the 44px contained geometry and raised pressed face of a single ToolbarControlGroup.
|
|
68
|
+
- [SplitButton](./split-button.md) — Render a prominent primary action plus an options trigger (provider, model, target) as one control with a semantic tone, full-width sizing, a busy presentation, and native aria-expanded on the trigger, outside any Toolbar.
|
|
69
|
+
- [FilePicker](./file-picker.md) — Let people choose or drop files (attachments, evidence, imports) without app CSS: a link-toned browse trigger and a dashed drop target that highlights while dragging, both around visually hidden native file inputs.
|
|
60
70
|
|
|
61
71
|
## Kerf UI — Feedback
|
|
62
72
|
|
|
63
73
|
- [AnchoredSurface](./anchored-surface.md) — Present arbitrary app-owned content next to an element or pointer with Kerf UI surface styling and kerfjs/overlay lifecycle.
|
|
64
74
|
- [Feedback](./feedback.md) — Banners, empty states, and labeled progress.
|
|
65
75
|
- [StateBanner](./state-banner.md) — Present persistent inline feedback or attractive non-status emphasis with a named semantic tone.
|
|
76
|
+
- [CornerStatus](./corner-status.md) — Show ongoing app-level progress such as "Loading…" or "Updating tickets… 3 of 12" in a viewport corner above page chrome and any dialog opened before it, without a close button, light dismiss, Escape, or focus change.
|
|
77
|
+
- [EdgeActivityIndicator](./edge-activity-indicator.md) — Signal ambient background activity (server work, sync) along the top edge of the viewport without allocating layout or taking the pointer, with Kerf-owned motion and reduced-motion handling.
|
|
66
78
|
- [EmptyState](./empty-state.md) — Actionable empty and busy content states.
|
|
67
79
|
- [LoadingSpinner](./loading-spinner.md) — Meaningfully labeled or decorative progress.
|
|
68
80
|
- [Skeleton](./skeleton.md) — A subtle, unanimated loading placeholder block for a not-yet-known value slot.
|
package/ai/components/badge.md
CHANGED
|
@@ -34,6 +34,9 @@ Exact prop names and types: [`@kerfjs/ui/badge`](../public-api-signatures-v1.md#
|
|
|
34
34
|
- pill or rounded shape
|
|
35
35
|
- compact or default size, or a text-free dot (size: 'dot')
|
|
36
36
|
- labeled or decorative duplicate
|
|
37
|
+
- leading icon
|
|
38
|
+
- title tooltip and data-\* rootAttributes
|
|
39
|
+
- maxWidth caps the badge and truncates long text with an ellipsis, defaulting the title to string or number content
|
|
37
40
|
|
|
38
41
|
## Composition
|
|
39
42
|
|
|
@@ -55,14 +58,15 @@ Margin: none · border: self · padding: self (layout role: foundation). `self`
|
|
|
55
58
|
|
|
56
59
|
- Badge is non-interactive. Supply label when visible content is abbreviated, and ariaHidden when it repeats an accessible name owned by the surrounding component. A text-free dot must take either label (exposed as an image) or ariaHidden, which the types enforce.
|
|
57
60
|
- Keep meaningful text visible because tone is supplementary.
|
|
61
|
+
- A label replaces abbreviated or symbolic visible text; the badge is then a labeled image (role img).
|
|
58
62
|
|
|
59
63
|
## Styling boundary
|
|
60
64
|
|
|
61
65
|
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
62
66
|
|
|
63
|
-
Public class hooks (select for layout placement only, never to change the component's look): `kui-badge`.
|
|
67
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-badge`, `kui-badge__icon`, `kui-badge__label`.
|
|
64
68
|
|
|
65
|
-
Never put `kui-badge` on an element you write; render `Badge` instead (`KUI-L103`).
|
|
69
|
+
Never put `kui-badge`, `kui-badge__icon`, `kui-badge__label` on an element you write; render `Badge` instead (`KUI-L103`).
|
|
66
70
|
|
|
67
71
|
Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
|
|
68
72
|
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# ChoiceChips
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:choice-chips` · Kerf UI · component · Controls
|
|
6
|
+
|
|
7
|
+
An exclusive, wrapping set of separated pill chips backed by native radios, with optional leading color swatches or icons.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
Choose one value from a visible set too large for a segmented track, such as a color palette with labeled swatches.
|
|
12
|
+
|
|
13
|
+
- Expose one exclusive choice among several visible options that must wrap onto more rows, such as a labeled color palette with swatches.
|
|
14
|
+
|
|
15
|
+
**Not when:**
|
|
16
|
+
|
|
17
|
+
- Use SegmentedControl for a few compact choices on one track.
|
|
18
|
+
- Use Select when the choice list is long or space is tight.
|
|
19
|
+
- Do not use it for removable tags (Chip) or for multiple selection.
|
|
20
|
+
|
|
21
|
+
**Alternatives:**
|
|
22
|
+
|
|
23
|
+
- [SegmentedControl](./segmented-control.md) (nearest)
|
|
24
|
+
- [Select](./select.md) (nearest)
|
|
25
|
+
- [Radio Group](./wa-radio-group.md) (prefer-over) — Use ChoiceChips instead of button-appearance radios that must wrap; a joined button group wraps into ragged rows with shared borders.
|
|
26
|
+
|
|
27
|
+
## Imports
|
|
28
|
+
|
|
29
|
+
- JavaScript: `@kerfjs/ui/choice-chips` — exports `ChoiceChips`.
|
|
30
|
+
- CSS: the browser build of `@kerfjs/ui/choice-chips` pulls its CSS automatically; import `@kerfjs/ui/choice-chips.css` manually only without the `browser` export condition.
|
|
31
|
+
- Declared side effects: browser-condition-css.
|
|
32
|
+
|
|
33
|
+
## Props
|
|
34
|
+
|
|
35
|
+
Exact prop names and types: [`@kerfjs/ui/choice-chips`](../public-api-signatures-v1.md#kerfjsuichoice-chips) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
36
|
+
|
|
37
|
+
**Variants (configure, do not restyle):**
|
|
38
|
+
|
|
39
|
+
- color swatch, transparent (struck-through) swatch, icon, or text-only choices
|
|
40
|
+
- default or compact size
|
|
41
|
+
- disabled group or disabled choices
|
|
42
|
+
- required
|
|
43
|
+
|
|
44
|
+
## Composition
|
|
45
|
+
|
|
46
|
+
- Parents: any.
|
|
47
|
+
- Contexts: `wrapping-exclusive-choice`.
|
|
48
|
+
- Children: unrestricted.
|
|
49
|
+
- Built from: [LucideIcon](./lucide-icon.md).
|
|
50
|
+
|
|
51
|
+
## State and wiring
|
|
52
|
+
|
|
53
|
+
- value — controlled
|
|
54
|
+
|
|
55
|
+
No wiring helper.
|
|
56
|
+
|
|
57
|
+
## Geometry
|
|
58
|
+
|
|
59
|
+
Margin: none · border: self · padding: self (layout role: controls). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
60
|
+
|
|
61
|
+
## Accessibility
|
|
62
|
+
|
|
63
|
+
- Name the radio group with label or with labelledBy pointing at a visible heading.
|
|
64
|
+
- Every choice keeps a visible text label; a swatch or icon is decorative.
|
|
65
|
+
|
|
66
|
+
## Styling boundary
|
|
67
|
+
|
|
68
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
69
|
+
|
|
70
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-choice-chips`.
|
|
71
|
+
|
|
72
|
+
Never put `kui-choice-chips` on an element you write; render `ChoiceChips` instead (`KUI-L103`).
|
|
73
|
+
|
|
74
|
+
Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
|
|
75
|
+
|
|
76
|
+
## Related
|
|
77
|
+
|
|
78
|
+
- Components: [LucideIcon](./lucide-icon.md), [SegmentedControl](./segmented-control.md), [Select](./select.md), [Radio Group](./wa-radio-group.md).
|
|
79
|
+
- Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/accessibility.md#choicechips`](../../docs/accessibility.md#choicechips).
|
|
80
|
+
- UX catalog route: `?component=choice-chips`.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# ColumnTrack
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:column-track` · Kerf UI · component · Structure
|
|
6
|
+
|
|
7
|
+
A horizontal track of equal, min-width columns that scrolls sideways, or pages one column at a time with peek and snapping.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
Lay out a board of columns (kanban) as one horizontal scroll owner: equal columns that never shrink below a minimum, or a paged phone layout with a peeking next column and start snapping, without app track CSS.
|
|
12
|
+
|
|
13
|
+
- A board shows several parallel columns (kanban lanes) that must keep a readable width and scroll sideways, or page one at a time on a phone.
|
|
14
|
+
|
|
15
|
+
**Not when:**
|
|
16
|
+
|
|
17
|
+
- Do not use for a responsive grid that wraps; use Grid.
|
|
18
|
+
- Do not use for two resizable panes; use SplitView or ResizableRegion.
|
|
19
|
+
- Do not re-track a Grid from application CSS to get overflowing columns.
|
|
20
|
+
|
|
21
|
+
**Alternatives:**
|
|
22
|
+
|
|
23
|
+
- [Grid](./grid.md) (nearest) — Use Grid when columns should wrap or collapse instead of scrolling.
|
|
24
|
+
|
|
25
|
+
## Imports
|
|
26
|
+
|
|
27
|
+
- JavaScript: `@kerfjs/ui/column-track` — exports `ColumnTrack`.
|
|
28
|
+
- CSS: the browser build of `@kerfjs/ui/column-track` pulls its CSS automatically; import `@kerfjs/ui/column-track.css` manually only without the `browser` export condition.
|
|
29
|
+
- Declared side effects: browser-condition-css.
|
|
30
|
+
|
|
31
|
+
## Props
|
|
32
|
+
|
|
33
|
+
Exact prop names and types: [`@kerfjs/ui/column-track`](../public-api-signatures-v1.md#kerfjsuicolumn-track) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
34
|
+
|
|
35
|
+
**Variants (configure, do not restyle):**
|
|
36
|
+
|
|
37
|
+
- scroll with a minimum column width
|
|
38
|
+
- paged with peek and mandatory snapping
|
|
39
|
+
|
|
40
|
+
## Composition
|
|
41
|
+
|
|
42
|
+
- Parents: any.
|
|
43
|
+
- Contexts: `application-ui`.
|
|
44
|
+
- Children: unrestricted.
|
|
45
|
+
|
|
46
|
+
## State and wiring
|
|
47
|
+
|
|
48
|
+
**The app owns:** the columns and their content; choosing scroll or paged layout (for example by device class); drag and drop between columns.
|
|
49
|
+
|
|
50
|
+
No wiring helper.
|
|
51
|
+
|
|
52
|
+
## Geometry
|
|
53
|
+
|
|
54
|
+
Margin: none · border: none · padding: self (layout role: structure). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
55
|
+
|
|
56
|
+
- The track pads 8px inline and fills its parent's height; columns sit flush and own their insets and vertical scrolling.
|
|
57
|
+
|
|
58
|
+
## Accessibility
|
|
59
|
+
|
|
60
|
+
- Name the track with aria-label through rootAttributes when it is a landmark-like region; give each column a region name. Paged scrolling is smooth unless reduced motion is preferred.
|
|
61
|
+
|
|
62
|
+
## Styling boundary
|
|
63
|
+
|
|
64
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
65
|
+
|
|
66
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-column-track`, `kui-column-track__columns`.
|
|
67
|
+
|
|
68
|
+
Never put `kui-column-track`, `kui-column-track__columns` on an element you write; render `ColumnTrack` instead (`KUI-L103`).
|
|
69
|
+
|
|
70
|
+
Public tokens it reads: `--kui-layout-inline-margin`. Set a token only where its public contract allows; prefer a prop.
|
|
71
|
+
|
|
72
|
+
Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
|
|
73
|
+
|
|
74
|
+
## Related
|
|
75
|
+
|
|
76
|
+
- Components: [Grid](./grid.md).
|
|
77
|
+
- Docs: [`docs/layout.md`](../../docs/layout.md), [`docs/component-selection.md#problem-to-component-matrix`](../../docs/component-selection.md#problem-to-component-matrix).
|
|
78
|
+
- UX catalog route: `?component=column-track`.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Combobox
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:combobox` · Kerf UI · component · Controls
|
|
6
|
+
|
|
7
|
+
A free-text field with a filtered suggestion list that can also create a new value.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
Let people pick an existing value or create a new one by typing (tags, labels, recipients), with the themed field chrome, the ARIA combobox pattern, and a touch-safe font size, without a native datalist or app CSS.
|
|
12
|
+
|
|
13
|
+
- People type to find an existing value among many, or create a new one (tags, labels, recipients).
|
|
14
|
+
|
|
15
|
+
**Not when:**
|
|
16
|
+
|
|
17
|
+
- Do not use when only existing values are allowed and nothing needs typing; use Select.
|
|
18
|
+
- Do not use for free text plus removable filter tokens in one editor; use TokenSearchField.
|
|
19
|
+
- Do not style a native input with a datalist from app CSS.
|
|
20
|
+
|
|
21
|
+
**Alternatives:**
|
|
22
|
+
|
|
23
|
+
- [Select](./select.md) (nearest) — Use Select when only existing values are allowed.
|
|
24
|
+
- [TokenSearchField](./token-search-field.md) (nearest) — Use TokenSearchField for search text with removable filter tokens.
|
|
25
|
+
|
|
26
|
+
## Imports
|
|
27
|
+
|
|
28
|
+
- JavaScript: `@kerfjs/ui/combobox` — exports `Combobox`, `wireComboboxes`.
|
|
29
|
+
- CSS: the browser build of `@kerfjs/ui/combobox` pulls its CSS automatically; import `@kerfjs/ui/combobox.css` manually only without the `browser` export condition.
|
|
30
|
+
- Wiring: `wireComboboxes` from `@kerfjs/ui/wire-comboboxes` (required).
|
|
31
|
+
- Declared side effects: browser-condition-css.
|
|
32
|
+
|
|
33
|
+
## Props
|
|
34
|
+
|
|
35
|
+
Exact prop names and types: [`@kerfjs/ui/combobox`](../public-api-signatures-v1.md#kerfjsuicombobox) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
36
|
+
|
|
37
|
+
**Variants (configure, do not restyle):**
|
|
38
|
+
|
|
39
|
+
- with create
|
|
40
|
+
- suggestions only (createLabel={false})
|
|
41
|
+
- hint
|
|
42
|
+
- disabled
|
|
43
|
+
|
|
44
|
+
## Composition
|
|
45
|
+
|
|
46
|
+
- Parents: any.
|
|
47
|
+
- Contexts: `application-ui`.
|
|
48
|
+
- Children: unrestricted.
|
|
49
|
+
|
|
50
|
+
## State and wiring
|
|
51
|
+
|
|
52
|
+
**The app owns:** the suggestions and the committed values; normalizing and validating created values; clearing the field after a commit.
|
|
53
|
+
|
|
54
|
+
**Wiring:** `wireComboboxes` is required.
|
|
55
|
+
|
|
56
|
+
- Filters suggestions, moves the active option, and reports commits; without it the list never opens.
|
|
57
|
+
|
|
58
|
+
**Wiring-owned state attributes** — never render, remove, or branch on these as app state:
|
|
59
|
+
|
|
60
|
+
- `data-value` on `the create option (kui-combobox__option[data-create])` (`wireComboboxes`): The typed text the create option would commit; rewritten as the person types.
|
|
61
|
+
|
|
62
|
+
## Geometry
|
|
63
|
+
|
|
64
|
+
Margin: none · border: self · padding: self (layout role: controls). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
65
|
+
|
|
66
|
+
- Label and hint sit on the value's text column (1px border + 8px padding); the 44px field matches a themed wa-input.
|
|
67
|
+
|
|
68
|
+
## Accessibility
|
|
69
|
+
|
|
70
|
+
- Native input with role=combobox, aria-autocomplete=list, aria-expanded, aria-controls, and aria-activedescendant; options are role=option in a listbox. The visible label is a real label; the hint is aria-describedby.
|
|
71
|
+
|
|
72
|
+
## Styling boundary
|
|
73
|
+
|
|
74
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
75
|
+
|
|
76
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-combobox`, `kui-combobox__label`, `kui-combobox__hint`, `kui-combobox__control`, `kui-combobox__input`, `kui-combobox__listbox`, `kui-combobox__option`.
|
|
77
|
+
|
|
78
|
+
Never put `kui-combobox`, `kui-combobox__label`, `kui-combobox__hint`, `kui-combobox__control`, `kui-combobox__input`, `kui-combobox__listbox`, `kui-combobox__option` on an element you write; render `Combobox` instead (`KUI-L103`).
|
|
79
|
+
|
|
80
|
+
Public tokens it reads: `--kui-combobox-z-index`, `--kui-color-neutral-on-quiet`, `--kui-color-text-quiet`, `--kui-color-neutral-border-normal`, `--kui-color-text`, `--kui-color-surface`, `--kui-color-surface-raised`, `--kui-color-text-link`, `--kui-color-brand-fill-quiet`, `--kui-font-xs`, `--kui-font-s`, `--kui-layout-item-padding`, `--kui-layout-rounded-radius`, `--kui-shadow-l`, `--kui-space-2xs`, `--kui-space-xs`. Set a token only where its public contract allows; prefer a prop.
|
|
81
|
+
|
|
82
|
+
Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
|
|
83
|
+
|
|
84
|
+
## Related
|
|
85
|
+
|
|
86
|
+
- Components: [Select](./select.md), [TokenSearchField](./token-search-field.md).
|
|
87
|
+
- Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#problem-to-component-matrix`](../../docs/component-selection.md#problem-to-component-matrix).
|
|
88
|
+
- UX catalog route: `?component=combobox`.
|
|
@@ -47,6 +47,8 @@ Exact prop names and types: [`@kerfjs/ui/content-item`](../public-api-signatures
|
|
|
47
47
|
- framed pill item
|
|
48
48
|
- base surface item
|
|
49
49
|
- neutral, info, pop, success, warning, or danger semantic item
|
|
50
|
+
- brand-loud item (solid brand fill, on-loud foreground)
|
|
51
|
+
- chat bubble at the start or end of the row (bubble), fit to its content up to 80%
|
|
50
52
|
- named focus-target region
|
|
51
53
|
- multi-select rich grid row
|
|
52
54
|
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# ContentSwap
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:content-swap` · Kerf UI · component · Structure
|
|
6
|
+
|
|
7
|
+
Two content sides sharing one cell, swapped in place with a push, a crossfade, or no motion.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
Swap arbitrary content in place (a dialog body that steps to a second page, a label or footer whose actions change) with Kerf-owned push or crossfade motion, reduced-motion handling, and an inert, hidden inactive side.
|
|
12
|
+
|
|
13
|
+
- A region swaps between two contents in place, such as a dialog's two steps or a footer's action sets, and the change should read as motion.
|
|
14
|
+
|
|
15
|
+
**Not when:**
|
|
16
|
+
|
|
17
|
+
- Do not use for full navigation views with their own toolbars; use NavStack.
|
|
18
|
+
- Do not use to swap more than two states at once; render the current pair.
|
|
19
|
+
- Do not hand-roll stacked cells, inert handling, or push keyframes in app CSS.
|
|
20
|
+
|
|
21
|
+
**Alternatives:**
|
|
22
|
+
|
|
23
|
+
- [NavStack](./nav-stack.md) (nearest) — Use NavStack for full views with toolbars and back navigation.
|
|
24
|
+
|
|
25
|
+
## Imports
|
|
26
|
+
|
|
27
|
+
- JavaScript: `@kerfjs/ui/content-swap` — exports `ContentSwap`.
|
|
28
|
+
- CSS: the browser build of `@kerfjs/ui/content-swap` pulls its CSS automatically; import `@kerfjs/ui/content-swap.css` manually only without the `browser` export condition.
|
|
29
|
+
- Declared side effects: browser-condition-css.
|
|
30
|
+
|
|
31
|
+
## Props
|
|
32
|
+
|
|
33
|
+
Exact prop names and types: [`@kerfjs/ui/content-swap`](../public-api-signatures-v1.md#kerfjsuicontent-swap) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
34
|
+
|
|
35
|
+
**Variants (configure, do not restyle):**
|
|
36
|
+
|
|
37
|
+
- push forward or backward
|
|
38
|
+
- crossfade
|
|
39
|
+
- none
|
|
40
|
+
- full-width slot region
|
|
41
|
+
|
|
42
|
+
## Composition
|
|
43
|
+
|
|
44
|
+
- Parents: any.
|
|
45
|
+
- Contexts: `application-ui`.
|
|
46
|
+
- Children: unrestricted.
|
|
47
|
+
|
|
48
|
+
## State and wiring
|
|
49
|
+
|
|
50
|
+
**The app owns:** which side is active and the push direction; both sides' content; the region's name.
|
|
51
|
+
|
|
52
|
+
No wiring helper.
|
|
53
|
+
|
|
54
|
+
## Geometry
|
|
55
|
+
|
|
56
|
+
Margin: none · border: none · padding: none (layout role: structure). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
57
|
+
|
|
58
|
+
- Both sides share one grid cell; the region keeps the active side's height and clips the motion.
|
|
59
|
+
|
|
60
|
+
## Accessibility
|
|
61
|
+
|
|
62
|
+
- The inactive side is inert and aria-hidden; label makes the swap a named region. Push mirrors in right-to-left documents. Reduced motion replaces the slide with a short fade.
|
|
63
|
+
|
|
64
|
+
## Styling boundary
|
|
65
|
+
|
|
66
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
67
|
+
|
|
68
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-content-swap`, `kui-content-swap__side`.
|
|
69
|
+
|
|
70
|
+
Never put `kui-content-swap`, `kui-content-swap__side` on an element you write; render `ContentSwap` instead (`KUI-L103`).
|
|
71
|
+
|
|
72
|
+
Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
|
|
73
|
+
|
|
74
|
+
## Related
|
|
75
|
+
|
|
76
|
+
- Components: [NavStack](./nav-stack.md).
|
|
77
|
+
- Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#problem-to-component-matrix`](../../docs/component-selection.md#problem-to-component-matrix).
|
|
78
|
+
- UX catalog route: `?component=content-swap`.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# CornerStatus
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:corner-status` · Kerf UI · component · Feedback
|
|
6
|
+
|
|
7
|
+
Non-dismissible app-level status pinned to a viewport corner in the top layer, hosting StateBanner.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
Show ongoing app-level progress such as "Loading…" or "Updating tickets… 3 of 12" in a viewport corner above page chrome and any dialog opened before it, without a close button, light dismiss, Escape, or focus change.
|
|
12
|
+
|
|
13
|
+
- Show ongoing app-level progress or status that has no better home beside the affected work and must stay visible until the work ends.
|
|
14
|
+
|
|
15
|
+
**Not when:**
|
|
16
|
+
|
|
17
|
+
- Do not use for transient, dismissible confirmation; use a toast.
|
|
18
|
+
- Do not use for status that belongs beside the affected work; place a StateBanner there.
|
|
19
|
+
- Do not position a StateBanner with fixed-position application CSS; use CornerStatus.
|
|
20
|
+
|
|
21
|
+
**Alternatives:**
|
|
22
|
+
|
|
23
|
+
- [StateBanner](./state-banner.md) (composes-with) — Compose one or more StateBanners (urgency="status") inside it; they stack.
|
|
24
|
+
- [Toast](./wa-toast.md) (prefer-over) — A toast item is transient and always dismissible; CornerStatus stays until the application removes it.
|
|
25
|
+
|
|
26
|
+
## Imports
|
|
27
|
+
|
|
28
|
+
- JavaScript: `@kerfjs/ui/corner-status` — exports `CornerStatus`, `wireCornerStatus`.
|
|
29
|
+
- CSS: the browser build of `@kerfjs/ui/corner-status` pulls its CSS automatically; import `@kerfjs/ui/corner-status.css` manually only without the `browser` export condition.
|
|
30
|
+
- Wiring: `wireCornerStatus` from `@kerfjs/ui/wire-corner-status` (required).
|
|
31
|
+
- Declared side effects: browser-condition-css.
|
|
32
|
+
|
|
33
|
+
## Props
|
|
34
|
+
|
|
35
|
+
Exact prop names and types: [`@kerfjs/ui/corner-status`](../public-api-signatures-v1.md#kerfjsuicorner-status) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
36
|
+
|
|
37
|
+
**Variants (configure, do not restyle):**
|
|
38
|
+
|
|
39
|
+
- bottom-end
|
|
40
|
+
- bottom-start
|
|
41
|
+
- top-end
|
|
42
|
+
- top-start
|
|
43
|
+
- embedded (in flow)
|
|
44
|
+
|
|
45
|
+
## Composition
|
|
46
|
+
|
|
47
|
+
- Parents: any.
|
|
48
|
+
- Contexts: `application-ui`.
|
|
49
|
+
- Children: unrestricted.
|
|
50
|
+
- Built from: [StateBanner](./state-banner.md).
|
|
51
|
+
|
|
52
|
+
## State and wiring
|
|
53
|
+
|
|
54
|
+
**The app owns:** status lifetime (render while the work runs, remove when it ends); the composed StateBanner copy and progress; corner placement.
|
|
55
|
+
|
|
56
|
+
**Wiring:** `wireCornerStatus` is required.
|
|
57
|
+
|
|
58
|
+
- Opens each overlay host in the top layer as renders insert it; without it the Popover API keeps the host hidden.
|
|
59
|
+
|
|
60
|
+
## Geometry
|
|
61
|
+
|
|
62
|
+
Margin: none · border: child · padding: child (layout role: feedback). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
63
|
+
|
|
64
|
+
- Placement owns the 16px viewport gutter plus device safe-area insets; a StateBanner inside drops its inline margin and gains elevation.
|
|
65
|
+
|
|
66
|
+
## Accessibility
|
|
67
|
+
|
|
68
|
+
- The host adds no role; the composed StateBanner with urgency="status" is the polite live region.
|
|
69
|
+
- Opening never moves focus, and there is no close button, light dismiss, or Escape handling to compete with dialogs.
|
|
70
|
+
- A modal dialog opened while it shows stacks above it and makes it inert (unannounced); show progress the dialog's task depends on inside the dialog.
|
|
71
|
+
|
|
72
|
+
## Styling boundary
|
|
73
|
+
|
|
74
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
75
|
+
|
|
76
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-corner-status`.
|
|
77
|
+
|
|
78
|
+
Never put `kui-corner-status` on an element you write; render `CornerStatus` instead (`KUI-L103`).
|
|
79
|
+
|
|
80
|
+
Public tokens it reads: `--kui-corner-status-gutter`, `--kui-corner-status-z-index`, `--kui-safe-area-block-end`, `--kui-safe-area-block-start`, `--kui-safe-area-inline-end`, `--kui-safe-area-inline-start`, `--kui-space-m`, `--kui-space-xs`. Set a token only where its public contract allows; prefer a prop.
|
|
81
|
+
|
|
82
|
+
Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
|
|
83
|
+
|
|
84
|
+
## Related
|
|
85
|
+
|
|
86
|
+
- Components: [StateBanner](./state-banner.md), [Toast](./wa-toast.md).
|
|
87
|
+
- Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#ambiguous-choices`](../../docs/component-selection.md#ambiguous-choices).
|
|
88
|
+
- UX catalog route: `?component=corner-status`.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
`@kerfjs/ui:document-baseline` · Kerf UI · CSS composition · Foundation
|
|
6
6
|
|
|
7
|
-
Opt-in document-level defaults: border-box sizing, body margin/font/surface, native table-cell and form-control font metrics, link color, and the html → body → .kui-app-root full-height chain.
|
|
7
|
+
Opt-in document-level defaults: border-box sizing, body margin/font/surface, native table-cell and form-control font metrics, semantic control cursors, link color, and the html → body → .kui-app-root full-height chain.
|
|
8
8
|
|
|
9
9
|
## When to use
|
|
10
10
|
|
|
@@ -35,6 +35,7 @@ No props: this entry has no JavaScript API.
|
|
|
35
35
|
|
|
36
36
|
- document-flow page (no .kui-app-root)
|
|
37
37
|
- full-height application root
|
|
38
|
+
- viewport-locked application root (data-viewport="locked" on a body-child .kui-app-root: 100dvh and overflow clip on html, body, and the root)
|
|
38
39
|
|
|
39
40
|
## Composition
|
|
40
41
|
|
|
@@ -57,6 +58,7 @@ Margin: none · border: none · padding: none (layout role: foundation). `self`
|
|
|
57
58
|
## Accessibility
|
|
58
59
|
|
|
59
60
|
- Links keep the semantic link color at zero specificity so application focus and link styles still apply.
|
|
61
|
+
- Native controls get semantic cursors at zero specificity: pointer on enabled buttons, links, role=button, checkbox/radio/button-type inputs, selects, and checkbox/radio labels; not-allowed on disabled controls, aria-disabled role=button, and a disabled wa-button's base part; text on text-like inputs and textareas.
|
|
60
62
|
|
|
61
63
|
## Styling boundary
|
|
62
64
|
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# EdgeActivityIndicator
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:edge-activity-indicator` · Kerf UI · component · Feedback
|
|
6
|
+
|
|
7
|
+
A layout-free top-edge activity strip with a traveling wave and an optional hanging status pill.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
Signal ambient background activity (server work, sync) along the top edge of the viewport without allocating layout or taking the pointer, with Kerf-owned motion and reduced-motion handling.
|
|
12
|
+
|
|
13
|
+
- Ambient, app-wide background activity (server work, sync) should be visible without a modal, a banner, or any layout shift.
|
|
14
|
+
|
|
15
|
+
**Not when:**
|
|
16
|
+
|
|
17
|
+
- Do not use for progress the user waits on or must read; use CornerStatus or a StateBanner.
|
|
18
|
+
- Do not use for known progress; use a progress bar.
|
|
19
|
+
- Do not use it as the only record of important state; the bars are hidden from assistive technology.
|
|
20
|
+
|
|
21
|
+
**Alternatives:**
|
|
22
|
+
|
|
23
|
+
- [CornerStatus](./corner-status.md) (nearest) — Use CornerStatus for readable, non-dismissible app-level progress.
|
|
24
|
+
- [LoadingSpinner](./loading-spinner.md) (nearest) — Use LoadingSpinner for local activity beside the affected control.
|
|
25
|
+
|
|
26
|
+
## Imports
|
|
27
|
+
|
|
28
|
+
- JavaScript: `@kerfjs/ui/edge-activity-indicator` — exports `EdgeActivityIndicator`.
|
|
29
|
+
- CSS: the browser build of `@kerfjs/ui/edge-activity-indicator` pulls its CSS automatically; import `@kerfjs/ui/edge-activity-indicator.css` manually only without the `browser` export condition.
|
|
30
|
+
- Declared side effects: browser-condition-css.
|
|
31
|
+
|
|
32
|
+
## Props
|
|
33
|
+
|
|
34
|
+
Exact prop names and types: [`@kerfjs/ui/edge-activity-indicator`](../public-api-signatures-v1.md#kerfjsuiedge-activity-indicator) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
35
|
+
|
|
36
|
+
**Variants (configure, do not restyle):**
|
|
37
|
+
|
|
38
|
+
- busy or idle
|
|
39
|
+
- with or without a status pill
|
|
40
|
+
- semantic tone
|
|
41
|
+
- safe-area inset or flush
|
|
42
|
+
|
|
43
|
+
## Composition
|
|
44
|
+
|
|
45
|
+
- Parents: any.
|
|
46
|
+
- Contexts: `application-ui`.
|
|
47
|
+
- Children: unrestricted.
|
|
48
|
+
|
|
49
|
+
## State and wiring
|
|
50
|
+
|
|
51
|
+
**The app owns:** the busy state; the optional status message; the tone.
|
|
52
|
+
|
|
53
|
+
No wiring helper.
|
|
54
|
+
|
|
55
|
+
## Geometry
|
|
56
|
+
|
|
57
|
+
Margin: none · border: none · padding: none (layout role: feedback). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
58
|
+
|
|
59
|
+
- Fixed to the top edge below the device safe area; it allocates no layout.
|
|
60
|
+
|
|
61
|
+
## Accessibility
|
|
62
|
+
|
|
63
|
+
- The strip is aria-hidden and pointer-inert; the optional pill is a polite live region that holds text only while it shows. Under reduced motion the wave and scale stop and the strip and pill only fade.
|
|
64
|
+
|
|
65
|
+
## Styling boundary
|
|
66
|
+
|
|
67
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
68
|
+
|
|
69
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-edge-activity-indicator`, `kui-edge-activity-indicator__strip`, `kui-edge-activity-indicator__message`.
|
|
70
|
+
|
|
71
|
+
Never put `kui-edge-activity-indicator`, `kui-edge-activity-indicator__strip`, `kui-edge-activity-indicator__message` on an element you write; render `EdgeActivityIndicator` instead (`KUI-L103`).
|
|
72
|
+
|
|
73
|
+
Public tokens it reads: `--kui-edge-activity-indicator-z-index`, `--kui-safe-area-block-start`, `--kui-color-brand-fill-loud`, `--kui-color-brand-on-loud`, `--kui-color-neutral-fill-loud`, `--kui-color-neutral-on-loud`, `--kui-color-pop-fill-loud`, `--kui-color-pop-on-loud`, `--kui-color-success-fill-loud`, `--kui-color-success-on-loud`, `--kui-color-warning-fill-loud`, `--kui-color-warning-on-loud`, `--kui-color-danger-fill-loud`, `--kui-color-danger-on-loud`, `--kui-font-2xs`, `--kui-space-m`, `--kui-space-s`. Set a token only where its public contract allows; prefer a prop.
|
|
74
|
+
|
|
75
|
+
Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
|
|
76
|
+
|
|
77
|
+
## Related
|
|
78
|
+
|
|
79
|
+
- Components: [CornerStatus](./corner-status.md), [LoadingSpinner](./loading-spinner.md).
|
|
80
|
+
- Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#problem-to-component-matrix`](../../docs/component-selection.md#problem-to-component-matrix).
|
|
81
|
+
- UX catalog route: `?component=edge-activity-indicator`.
|