@kerfjs/ui 5.0.0-beta.95 → 5.0.0-beta.97
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 +1330 -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 +20 -7
- package/ai/components/list-item.md +17 -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 +55 -53
- 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 +152 -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 +53 -0
- package/dist/styles/components/collections/list-item/list-item.css +59 -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 +30 -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 +53 -0
- package/dist/styles/list-item.css +59 -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 +30 -1
- package/dist/styles/toolbar-control-group.css +152 -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 +30 -6
- package/docs/component-selection.md +165 -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 +138 -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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# FilePicker
|
|
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:file-picker` · Kerf UI · component · Controls
|
|
6
|
+
|
|
7
|
+
A compact browse trigger and a dashed drop zone around native file inputs, with wiring that reports chosen and dropped files.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
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.
|
|
12
|
+
|
|
13
|
+
- People attach or import files by browsing or by dropping them onto a target.
|
|
14
|
+
|
|
15
|
+
**Not when:**
|
|
16
|
+
|
|
17
|
+
- Do not style a native file input or label from app CSS; use these components.
|
|
18
|
+
- Do not rely on the drop zone alone; it also opens the chooser when clicked or activated from the keyboard.
|
|
19
|
+
|
|
20
|
+
**Alternatives:**
|
|
21
|
+
|
|
22
|
+
- [Button](./wa-button.md) (prefer-over) — A button cannot open the native chooser without script; the trigger is a label around the input.
|
|
23
|
+
|
|
24
|
+
## Imports
|
|
25
|
+
|
|
26
|
+
- JavaScript: `@kerfjs/ui/file-picker` — exports `FilePickerTrigger`, `FileDropZone`, `wireFilePickers`, `fileMatchesAccept`.
|
|
27
|
+
- CSS: the browser build of `@kerfjs/ui/file-picker` pulls its CSS automatically; import `@kerfjs/ui/file-picker.css` manually only without the `browser` export condition.
|
|
28
|
+
- Wiring: `wireFilePickers` from `@kerfjs/ui/wire-file-pickers` (required).
|
|
29
|
+
- Declared side effects: browser-condition-css.
|
|
30
|
+
|
|
31
|
+
## Props
|
|
32
|
+
|
|
33
|
+
Exact prop names and types: [`@kerfjs/ui/file-picker`](../public-api-signatures-v1.md#kerfjsuifile-picker) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
34
|
+
|
|
35
|
+
**Variants (configure, do not restyle):**
|
|
36
|
+
|
|
37
|
+
- browse trigger
|
|
38
|
+
- drop zone
|
|
39
|
+
- dragging
|
|
40
|
+
- disabled
|
|
41
|
+
- accept filter
|
|
42
|
+
- multiple or single
|
|
43
|
+
|
|
44
|
+
## Composition
|
|
45
|
+
|
|
46
|
+
- Parents: any.
|
|
47
|
+
- Contexts: `application-ui`.
|
|
48
|
+
- Children: unrestricted.
|
|
49
|
+
|
|
50
|
+
## State and wiring
|
|
51
|
+
|
|
52
|
+
**The app owns:** what happens to the reported files (upload, validation, limits); the list of chosen files; copy and accepted types.
|
|
53
|
+
|
|
54
|
+
**Wiring:** `wireFilePickers` is required.
|
|
55
|
+
|
|
56
|
+
- Reports chosen and dropped files and accepts drops on the zone; without it drops open the file in the browser.
|
|
57
|
+
|
|
58
|
+
**Wiring-owned state attributes** — never render, remove, or branch on these as app state:
|
|
59
|
+
|
|
60
|
+
- `data-dragging` on `kui-file-picker (drop zone)` (`wireFilePickers`): "true" while files are dragged over the zone.
|
|
61
|
+
|
|
62
|
+
## Geometry
|
|
63
|
+
|
|
64
|
+
Margin: self · 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
|
+
- The drop zone carries the 8px content-item inline margin; the trigger is a compact 32px inline control.
|
|
67
|
+
|
|
68
|
+
## Accessibility
|
|
69
|
+
|
|
70
|
+
- Each control is a label around a real file input that receives keyboard focus; the visible control shows the focus ring. Give the input an accessibleLabel when the visible copy is short.
|
|
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-file-picker`, `kui-file-picker__title`, `kui-file-picker__detail`, `kui-file-picker__input`, `kui-file-picker__icon`.
|
|
77
|
+
|
|
78
|
+
Never put `kui-file-picker`, `kui-file-picker__title`, `kui-file-picker__detail`, `kui-file-picker__input`, `kui-file-picker__icon` on an element you write; render `FilePickerTrigger` or `FileDropZone` instead (`KUI-L103`).
|
|
79
|
+
|
|
80
|
+
Public tokens it reads: `--kui-color-text-link`, `--kui-color-brand-fill-quiet`, `--kui-color-neutral-border-loud`, `--kui-color-neutral-on-quiet`, `--kui-color-text`, `--kui-focus-ring`, `--kui-font-xs`, `--kui-font-2xs`, `--kui-font-weight-semibold`, `--kui-layout-inline-margin`, `--kui-layout-rounded-radius`, `--kui-radius-pill`, `--kui-space-2xs`, `--kui-space-s`, `--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: [Button](./wa-button.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=file-picker`.
|
|
@@ -55,7 +55,7 @@ Margin: none · border: none · padding: none (layout role: foundation). `self`
|
|
|
55
55
|
|
|
56
56
|
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
57
57
|
|
|
58
|
-
Public tokens it reads: `--kui-font-sans`, `--kui-font-mono`, `--kui-font-2xs`, `--kui-font-xs`, `--kui-font-s`, `--kui-font-m`, `--kui-font-l`, `--kui-font-xl`, `--kui-font-2xl`, `--kui-font-weight-semibold`, `--kui-space-none`, `--kui-space-2xs`, `--kui-space-xs`, `--kui-space-s`, `--kui-space-m`, `--kui-space-l`, `--kui-space-xl`, `--kui-bp-mobile`, `--kui-bp-tablet`, `--kui-bp-desktop`, `--kui-bp-xl-desktop`, `--kui-layout-inline-margin`, `--kui-layout-item-border-width`, `--kui-layout-item-padding`, `--kui-layout-item-gap`, `--kui-layout-content-gap`, `--kui-layout-control-gap`, `--kui-layout-metadata-gap`, `--kui-layout-highlight-inset`, `--kui-layout-rounded-radius`, `--kui-layout-pill-radius`, `--kui-toolbar-group-inner-size`, `--kui-toolbar-group-size`, `--kui-toolbar-gap`, `--kui-safe-area-block-start`, `--kui-safe-area-block-end`, `--kui-safe-area-inline-start`, `--kui-safe-area-inline-end`, `--kui-radius-s`, `--kui-radius-m`, `--kui-radius-l`, `--kui-radius-circle`, `--kui-radius-pill`, `--kui-disclosure-icon-scale`, `--kui-color-surface`, `--kui-color-surface-raised`, `--kui-color-surface-lowered`, `--kui-color-text`, `--kui-color-text-quiet`, `--kui-color-text-link`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-fill-loud`, `--kui-color-neutral-border-quiet`, `--kui-color-neutral-border-normal`, `--kui-color-neutral-border-loud`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-loud`, `--kui-color-brand-fill-loud`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-brand-border-quiet`, `--kui-color-brand-border-normal`, `--kui-color-brand-border-loud`, `--kui-color-brand-on-quiet`, `--kui-color-brand-on-normal`, `--kui-color-brand-on-loud`, `--kui-color-brand-on-fill`, `--kui-color-pop-fill-loud`, `--kui-color-pop-fill-quiet`, `--kui-color-pop-fill-normal`, `--kui-color-pop-border-quiet`, `--kui-color-pop-border-normal`, `--kui-color-pop-border-loud`, `--kui-color-pop-on-quiet`, `--kui-color-pop-on-normal`, `--kui-color-pop-on-loud`, `--kui-color-pop-on-fill`, `--kui-color-success-fill-loud`, `--kui-color-success-fill-quiet`, `--kui-color-success-fill-normal`, `--kui-color-success-border-quiet`, `--kui-color-success-border-normal`, `--kui-color-success-border-loud`, `--kui-color-success-on-quiet`, `--kui-color-success-on-normal`, `--kui-color-success-on-loud`, `--kui-color-success-on-fill`, `--kui-color-warning-fill-loud`, `--kui-color-warning-fill-quiet`, `--kui-color-warning-fill-normal`, `--kui-color-warning-border-quiet`, `--kui-color-warning-border-normal`, `--kui-color-warning-border-loud`, `--kui-color-warning-on-quiet`, `--kui-color-warning-on-normal`, `--kui-color-warning-on-loud`, `--kui-color-warning-on-fill`, `--kui-color-danger-fill-loud`, `--kui-color-danger-fill-quiet`, `--kui-color-danger-fill-normal`, `--kui-color-danger-border-quiet`, `--kui-color-danger-border-normal`, `--kui-color-danger-border-loud`, `--kui-color-danger-on-quiet`, `--kui-color-danger-on-normal`, `--kui-color-danger-on-loud`, `--kui-color-danger-on-fill`, `--kui-focus-ring`, `--kui-shadow-s`, `--kui-shadow-l`. Set a token only where its public contract allows; prefer a prop.
|
|
58
|
+
Public tokens it reads: `--kui-font-sans`, `--kui-font-mono`, `--kui-font-2xs`, `--kui-font-xs`, `--kui-font-s`, `--kui-font-m`, `--kui-font-l`, `--kui-font-xl`, `--kui-font-2xl`, `--kui-font-weight-semibold`, `--kui-space-none`, `--kui-space-2xs`, `--kui-space-xs`, `--kui-space-s`, `--kui-space-m`, `--kui-space-l`, `--kui-space-xl`, `--kui-bp-mobile`, `--kui-bp-tablet`, `--kui-bp-desktop`, `--kui-bp-xl-desktop`, `--kui-layout-inline-margin`, `--kui-layout-item-border-width`, `--kui-layout-item-padding`, `--kui-layout-item-gap`, `--kui-layout-content-gap`, `--kui-layout-control-gap`, `--kui-layout-metadata-gap`, `--kui-layout-highlight-inset`, `--kui-layout-rounded-radius`, `--kui-layout-pill-radius`, `--kui-toolbar-group-inner-size`, `--kui-toolbar-group-size`, `--kui-toolbar-gap`, `--kui-safe-area-block-start`, `--kui-safe-area-block-end`, `--kui-safe-area-inline-start`, `--kui-safe-area-inline-end`, `--kui-radius-s`, `--kui-radius-m`, `--kui-radius-l`, `--kui-radius-circle`, `--kui-radius-pill`, `--kui-disclosure-icon-scale`, `--kui-color-surface`, `--kui-color-surface-raised`, `--kui-color-surface-lowered`, `--kui-sunken-texture`, `--kui-sunken-surface`, `--kui-color-text`, `--kui-color-text-quiet`, `--kui-color-text-link`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-fill-loud`, `--kui-color-neutral-border-quiet`, `--kui-color-neutral-border-normal`, `--kui-color-neutral-border-loud`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-loud`, `--kui-color-brand-fill-loud`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-brand-border-quiet`, `--kui-color-brand-border-normal`, `--kui-color-brand-border-loud`, `--kui-color-brand-on-quiet`, `--kui-color-brand-on-normal`, `--kui-color-brand-on-loud`, `--kui-color-brand-on-fill`, `--kui-color-pop-fill-loud`, `--kui-color-pop-fill-quiet`, `--kui-color-pop-fill-normal`, `--kui-color-pop-border-quiet`, `--kui-color-pop-border-normal`, `--kui-color-pop-border-loud`, `--kui-color-pop-on-quiet`, `--kui-color-pop-on-normal`, `--kui-color-pop-on-loud`, `--kui-color-pop-on-fill`, `--kui-color-success-fill-loud`, `--kui-color-success-fill-quiet`, `--kui-color-success-fill-normal`, `--kui-color-success-border-quiet`, `--kui-color-success-border-normal`, `--kui-color-success-border-loud`, `--kui-color-success-on-quiet`, `--kui-color-success-on-normal`, `--kui-color-success-on-loud`, `--kui-color-success-on-fill`, `--kui-color-warning-fill-loud`, `--kui-color-warning-fill-quiet`, `--kui-color-warning-fill-normal`, `--kui-color-warning-border-quiet`, `--kui-color-warning-border-normal`, `--kui-color-warning-border-loud`, `--kui-color-warning-on-quiet`, `--kui-color-warning-on-normal`, `--kui-color-warning-on-loud`, `--kui-color-warning-on-fill`, `--kui-color-danger-fill-loud`, `--kui-color-danger-fill-quiet`, `--kui-color-danger-fill-normal`, `--kui-color-danger-border-quiet`, `--kui-color-danger-border-normal`, `--kui-color-danger-border-loud`, `--kui-color-danger-on-quiet`, `--kui-color-danger-on-normal`, `--kui-color-danger-on-loud`, `--kui-color-danger-on-fill`, `--kui-focus-ring`, `--kui-shadow-s`, `--kui-shadow-l`. Set a token only where its public contract allows; prefer a prop.
|
|
59
59
|
|
|
60
60
|
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`).
|
|
61
61
|
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# FramedList
|
|
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:framed-list` · Kerf UI · component · Structure
|
|
6
|
+
|
|
7
|
+
An inset-grouped list: one rounded, bordered frame with dividers between rows of arbitrary content.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
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.
|
|
12
|
+
|
|
13
|
+
- Settings rows, account or source cards, or shortcut lists group several rows of arbitrary content in one framed surface.
|
|
14
|
+
|
|
15
|
+
**Not when:**
|
|
16
|
+
|
|
17
|
+
- Do not use for read-only label/value facts; use ValueTable.
|
|
18
|
+
- Do not use for selectable navigation rows; use List with ListItem.
|
|
19
|
+
- Do not pad or border its rows from application CSS; FramedListRow owns the inset and divider.
|
|
20
|
+
|
|
21
|
+
**Alternatives:**
|
|
22
|
+
|
|
23
|
+
- [ValueTable](./value-table.md) (nearest) — Use ValueTable when every row is a label and a value.
|
|
24
|
+
- [List](./list.md) (nearest) — Use List with ListItem for navigation or selectable rows.
|
|
25
|
+
|
|
26
|
+
## Imports
|
|
27
|
+
|
|
28
|
+
- JavaScript: `@kerfjs/ui/framed-list` — exports `FramedList`, `FramedListRow`.
|
|
29
|
+
- CSS: the browser build of `@kerfjs/ui/framed-list` pulls its CSS automatically; import `@kerfjs/ui/framed-list.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/framed-list`](../public-api-signatures-v1.md#kerfjsuiframed-list) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
35
|
+
|
|
36
|
+
**Variants (configure, do not restyle):**
|
|
37
|
+
|
|
38
|
+
- lowered surface
|
|
39
|
+
- base surface
|
|
40
|
+
- highlighted row
|
|
41
|
+
|
|
42
|
+
## Composition
|
|
43
|
+
|
|
44
|
+
- Parents: any.
|
|
45
|
+
- Contexts: `application-ui`.
|
|
46
|
+
- Children: unrestricted.
|
|
47
|
+
|
|
48
|
+
## State and wiring
|
|
49
|
+
|
|
50
|
+
**The app owns:** row content and its controls; which row is highlighted; the list's accessible name.
|
|
51
|
+
|
|
52
|
+
No wiring helper.
|
|
53
|
+
|
|
54
|
+
## Geometry
|
|
55
|
+
|
|
56
|
+
Margin: self · border: self · padding: self (layout role: structure). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
57
|
+
|
|
58
|
+
- Rows own the 8px inset and the inset 1px divider above them; the frame owns the 8px margin, border, and radius.
|
|
59
|
+
|
|
60
|
+
## Accessibility
|
|
61
|
+
|
|
62
|
+
- Renders a list (ul role=list, li rows); pass label when no heading names it. Highlight is visual; carry its meaning in row content or a control's state.
|
|
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-framed-list`, `kui-framed-list__row`.
|
|
69
|
+
|
|
70
|
+
Never put `kui-framed-list`, `kui-framed-list__row` on an element you write; render `FramedList` instead (`KUI-L103`).
|
|
71
|
+
|
|
72
|
+
Public tokens it reads: `--kui-framed-list-border`, `--kui-color-neutral-border-normal`, `--kui-color-surface-lowered`, `--kui-color-surface`, `--kui-color-brand-fill-quiet`, `--kui-layout-inline-margin`, `--kui-layout-item-padding`, `--kui-layout-rounded-radius`. Set a token only where its public contract allows; prefer a prop.
|
|
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: [ValueTable](./value-table.md), [List](./list.md).
|
|
79
|
+
- 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).
|
|
80
|
+
- UX catalog route: `?component=framed-list`.
|
package/ai/components/grid.md
CHANGED
|
@@ -27,6 +27,7 @@ Arrange related siblings in equal-width columns with either a fixed count or aut
|
|
|
27
27
|
- [Row](./row.md) (axis-alternative) — Use Row for one horizontal flex line, alignment, or wrapping rather than fixed equal tracks.
|
|
28
28
|
- [List](./list.md) (axis-alternative) — Use List when the main layout axis is vertical.
|
|
29
29
|
- [ResizableRegion](./resize.md) (interactive-alternative) — Use ResizableRegion when people must adjust the boundary between tracks.
|
|
30
|
+
- [ColumnTrack](./column-track.md) (nearest) — Use ColumnTrack for a board of columns that scroll sideways or page instead of wrapping.
|
|
30
31
|
|
|
31
32
|
## Imports
|
|
32
33
|
|
|
@@ -95,6 +96,6 @@ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-
|
|
|
95
96
|
|
|
96
97
|
## Related
|
|
97
98
|
|
|
98
|
-
- Components: [Row](./row.md), [List](./list.md), [ResizableRegion](./resize.md).
|
|
99
|
+
- Components: [Row](./row.md), [List](./list.md), [ResizableRegion](./resize.md), [ColumnTrack](./column-track.md).
|
|
99
100
|
- Docs: [`docs/layout.md`](../../docs/layout.md), [`docs/layout.md#grid`](../../docs/layout.md#grid).
|
|
100
101
|
- UX catalog route: `?component=grid`.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# IconButton
|
|
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:icon-button` · Kerf UI · component · Controls
|
|
6
|
+
|
|
7
|
+
Square, icon-only Web Awesome button with a LucideIcon and a required accessible name.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
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.
|
|
12
|
+
|
|
13
|
+
- An icon-only action stands alone or beside a form field, such as a Browse button next to a path input.
|
|
14
|
+
|
|
15
|
+
**Not when:**
|
|
16
|
+
|
|
17
|
+
- Do not use inside a ToolbarControlGroup; the group owns its controls' geometry, so compose a native button with a LucideIcon there.
|
|
18
|
+
- Do not use when the action needs a visible text label; use wa-button with text.
|
|
19
|
+
- Do not override wa-button::part(base) width, min-height, or padding to square an icon button; use IconButton.
|
|
20
|
+
|
|
21
|
+
**Alternatives:**
|
|
22
|
+
|
|
23
|
+
- [Button](./wa-button.md) (prefer-over) — Web Awesome squares a button only for a lone wa-icon; with a LucideIcon use IconButton.
|
|
24
|
+
- [ListInsetControl](./list-inset-control.md) (composes-with) — Beside a field in a ListInsetControl the square keeps its size and aligns with the field below its label.
|
|
25
|
+
|
|
26
|
+
## Imports
|
|
27
|
+
|
|
28
|
+
- JavaScript: `@kerfjs/ui/icon-button` — exports `IconButton`.
|
|
29
|
+
- CSS: the browser build of `@kerfjs/ui/icon-button` pulls its CSS automatically; import `@kerfjs/ui/icon-button.css` manually only without the `browser` export condition.
|
|
30
|
+
- Theme CSS: import `@kerfjs/ui/webawesome.css` once.
|
|
31
|
+
- Registration: import `@awesome.me/webawesome/dist/components/button/button.js` once (a side effect).
|
|
32
|
+
- Declared side effects: browser-condition-css, custom-element-registration.
|
|
33
|
+
|
|
34
|
+
## Props
|
|
35
|
+
|
|
36
|
+
Exact prop names and types: [`@kerfjs/ui/icon-button`](../public-api-signatures-v1.md#kerfjsuiicon-button) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
37
|
+
|
|
38
|
+
**Variants (configure, do not restyle):**
|
|
39
|
+
|
|
40
|
+
- default appearance
|
|
41
|
+
- plain
|
|
42
|
+
- outlined
|
|
43
|
+
- danger variant
|
|
44
|
+
- disabled
|
|
45
|
+
- xs, s, m, l, or xl size
|
|
46
|
+
|
|
47
|
+
## Composition
|
|
48
|
+
|
|
49
|
+
- Parents: any.
|
|
50
|
+
- Contexts: `application-ui`.
|
|
51
|
+
- Children: unrestricted.
|
|
52
|
+
- Built from: [Button](./wa-button.md), [LucideIcon](./lucide-icon.md).
|
|
53
|
+
|
|
54
|
+
## State and wiring
|
|
55
|
+
|
|
56
|
+
**The app owns:** the delegated action; the accessible name; appearance, variant, and size choice.
|
|
57
|
+
|
|
58
|
+
No wiring helper.
|
|
59
|
+
|
|
60
|
+
## Geometry
|
|
61
|
+
|
|
62
|
+
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.
|
|
63
|
+
|
|
64
|
+
## Accessibility
|
|
65
|
+
|
|
66
|
+
- label is required and names the button through its LucideIcon (role img), since the button shows no text.
|
|
67
|
+
|
|
68
|
+
## Styling boundary
|
|
69
|
+
|
|
70
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
71
|
+
|
|
72
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-icon-button`.
|
|
73
|
+
|
|
74
|
+
Never put `kui-icon-button` on an element you write; render `IconButton` instead (`KUI-L103`).
|
|
75
|
+
|
|
76
|
+
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`).
|
|
77
|
+
|
|
78
|
+
## Related
|
|
79
|
+
|
|
80
|
+
- Components: [Button](./wa-button.md), [LucideIcon](./lucide-icon.md), [ListInsetControl](./list-inset-control.md).
|
|
81
|
+
- 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).
|
|
82
|
+
- UX catalog route: `?component=icon-button`.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# IconToggleButton
|
|
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:icon-toggle-button` · Kerf UI · component · Controls
|
|
6
|
+
|
|
7
|
+
A standalone icon-only toggle with a single contained toolbar group's geometry and pressed chrome.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
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.
|
|
12
|
+
|
|
13
|
+
- An icon-only on/off control (show a panel, a conversation) sits in content or a pane footer outside any Toolbar.
|
|
14
|
+
|
|
15
|
+
**Not when:**
|
|
16
|
+
|
|
17
|
+
- Do not use inside a Toolbar; compose a ToolbarControlGroup there.
|
|
18
|
+
- Do not use for a momentary action; use IconButton.
|
|
19
|
+
- Do not use for one-of-several choices; use SegmentedControl.
|
|
20
|
+
|
|
21
|
+
**Alternatives:**
|
|
22
|
+
|
|
23
|
+
- [ToolbarControlGroup](./toolbar-control-group.md) (nearest) — Inside a Toolbar, a single ToolbarControlGroup with a pressed button is the same control.
|
|
24
|
+
- [IconButton](./icon-button.md) (nearest) — Use IconButton for a momentary icon-only action.
|
|
25
|
+
|
|
26
|
+
## Imports
|
|
27
|
+
|
|
28
|
+
- JavaScript: `@kerfjs/ui/icon-toggle-button` — exports `IconToggleButton`.
|
|
29
|
+
- CSS: the browser build of `@kerfjs/ui/icon-toggle-button` pulls its CSS automatically; import `@kerfjs/ui/icon-toggle-button.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/icon-toggle-button`](../public-api-signatures-v1.md#kerfjsuiicon-toggle-button) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
35
|
+
|
|
36
|
+
**Variants (configure, do not restyle):**
|
|
37
|
+
|
|
38
|
+
- pressed
|
|
39
|
+
- unpressed
|
|
40
|
+
- pill or rounded shape
|
|
41
|
+
- disabled
|
|
42
|
+
|
|
43
|
+
## Composition
|
|
44
|
+
|
|
45
|
+
- Parents: any.
|
|
46
|
+
- Contexts: `application-ui`.
|
|
47
|
+
- Children: unrestricted.
|
|
48
|
+
- Built from: [LucideIcon](./lucide-icon.md).
|
|
49
|
+
|
|
50
|
+
## State and wiring
|
|
51
|
+
|
|
52
|
+
**The app owns:** the pressed state and its delegated action; the accessible name.
|
|
53
|
+
|
|
54
|
+
No wiring helper.
|
|
55
|
+
|
|
56
|
+
## Geometry
|
|
57
|
+
|
|
58
|
+
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.
|
|
59
|
+
|
|
60
|
+
## Accessibility
|
|
61
|
+
|
|
62
|
+
- Native button with aria-pressed and a required aria-label; with help tags registered it shows that label on hover and keyboard focus.
|
|
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-icon-toggle-button`, `kui-icon-toggle-button__face`.
|
|
69
|
+
|
|
70
|
+
Never put `kui-icon-toggle-button`, `kui-icon-toggle-button__face` on an element you write; render `IconToggleButton` instead (`KUI-L103`).
|
|
71
|
+
|
|
72
|
+
Public tokens it reads: `--kui-color-neutral-border-normal`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-on-quiet`, `--kui-color-surface`, `--kui-color-brand-on-quiet`, `--kui-shadow-s`, `--kui-focus-ring`, `--kui-layout-pill-radius`, `--kui-layout-rounded-radius`, `--kui-layout-highlight-inset`. Set a token only where its public contract allows; prefer a prop.
|
|
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), [ToolbarControlGroup](./toolbar-control-group.md), [IconButton](./icon-button.md).
|
|
79
|
+
- 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).
|
|
80
|
+
- UX catalog route: `?component=icon-toggle-button`.
|
|
@@ -4,13 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
`@kerfjs/ui:list-action-row` · Kerf UI · component · Navigation
|
|
6
6
|
|
|
7
|
-
Configurable navigation rows with structured labels, status/busy metadata, density, group dividers, and
|
|
7
|
+
Configurable navigation rows with structured labels, status/busy metadata, density, group dividers, and a primary native-button action beside a sibling trailing native button or trailing overflow PopupMenu.
|
|
8
8
|
|
|
9
9
|
## When to use
|
|
10
10
|
|
|
11
11
|
Keep a selectable primary row action and an independently named trailing action as sibling native controls inside one noninteractive visual row.
|
|
12
12
|
|
|
13
13
|
- A navigation or item row needs both a primary selectable action and an independently focusable trailing action.
|
|
14
|
+
- A command row needs a trailing "…" overflow menu (trailingMenu), optionally also opened at the pointer from the row's contextmenu with openPopupMenuAt.
|
|
14
15
|
|
|
15
16
|
**Not when:**
|
|
16
17
|
|
|
@@ -26,11 +27,13 @@ Keep a selectable primary row action and an independently named trailing action
|
|
|
26
27
|
|
|
27
28
|
- JavaScript: `@kerfjs/ui/list-action-row` — exports `ListActionRow`.
|
|
28
29
|
- CSS: the browser build of `@kerfjs/ui/list-action-row` pulls its CSS automatically; import `@kerfjs/ui/list-action-row.css` manually only without the `browser` export condition.
|
|
30
|
+
- Wiring: `wireListReorder` from `@kerfjs/ui/wire-list-reorder` (optional).
|
|
31
|
+
- Wiring: `reorderListItems` from `@kerfjs/ui/wire-list-reorder` (optional).
|
|
29
32
|
- Declared side effects: browser-condition-css.
|
|
30
33
|
|
|
31
34
|
## Props
|
|
32
35
|
|
|
33
|
-
Exact prop names and types: [`@kerfjs/ui/list-action-row`](../public-api-signatures-v1.md#kerfjsuilist-action-row) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
36
|
+
Exact prop names and types: [`@kerfjs/ui/list-action-row`](../public-api-signatures-v1.md#kerfjsuilist-action-row), [`@kerfjs/ui/wire-list-reorder`](../public-api-signatures-v1.md#kerfjsuiwire-list-reorder) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
34
37
|
|
|
35
38
|
**Variants (configure, do not restyle):**
|
|
36
39
|
|
|
@@ -44,7 +47,10 @@ Exact prop names and types: [`@kerfjs/ui/list-action-row`](../public-api-signatu
|
|
|
44
47
|
- description and status
|
|
45
48
|
- busy while retaining content
|
|
46
49
|
- interaction-revealed trailing action
|
|
50
|
+
- trailing overflow menu
|
|
47
51
|
- before, after, or paired group divider
|
|
52
|
+
- position-aware divided-list corners: flat wherever a divider line (this row's or a neighbor's) meets the edge
|
|
53
|
+
- draggable row with dragging and drop-before / drop-after insertion states
|
|
48
54
|
|
|
49
55
|
**CSS-value props** (typed builders from `@kerfjs/ui/css-values`; raw CSS strings are rejected):
|
|
50
56
|
|
|
@@ -55,13 +61,18 @@ Exact prop names and types: [`@kerfjs/ui/list-action-row`](../public-api-signatu
|
|
|
55
61
|
- Parents: any.
|
|
56
62
|
- Contexts: `application-ui`.
|
|
57
63
|
- Children: unrestricted.
|
|
58
|
-
- Built from: [LucideIcon](./lucide-icon.md), [LoadingSpinner](./loading-spinner.md).
|
|
64
|
+
- Built from: [LucideIcon](./lucide-icon.md), [LoadingSpinner](./loading-spinner.md), [PopupMenu](./popup-menu.md).
|
|
59
65
|
|
|
60
66
|
## State and wiring
|
|
61
67
|
|
|
62
|
-
**The app owns:** routing; selection; action handling; domain data attributes; popover or context-menu policy.
|
|
68
|
+
**The app owns:** routing; selection; action handling; domain data attributes; popover or context-menu policy; row order.
|
|
63
69
|
|
|
64
|
-
|
|
70
|
+
**Wiring:** `wireListReorder`, `reorderListItems` is optional.
|
|
71
|
+
|
|
72
|
+
**Wiring-owned state attributes** — never render, remove, or branch on these as app state:
|
|
73
|
+
|
|
74
|
+
- `data-dragging` on `ListActionRow rows being dragged` (`wireListReorder`): "true" on every row a pointer drag is moving (the dragged row, or every selected row of its list when the dragged row is selected). Same attribute the `dragging` prop renders.
|
|
75
|
+
- `data-drop-position` on `ListActionRow row under the pointer` (`wireListReorder`): "before" or "after": the edge of this row the dragged rows would land beside. Same attribute the `dropPosition` prop renders.
|
|
65
76
|
|
|
66
77
|
## Geometry
|
|
67
78
|
|
|
@@ -70,7 +81,9 @@ Margin: self · border: self · padding: self (layout role: navigation). `self`
|
|
|
70
81
|
## Accessibility
|
|
71
82
|
|
|
72
83
|
- The noninteractive root contains two sibling native buttons in primary-then-trailing focus order; each button has its own action, item identity, accessible name, and disabled state.
|
|
84
|
+
- A trailingMenu replaces the trailing button with a PopupMenu trigger in the same position: an icon-only button named by trailingMenu.label that exposes aria-haspopup="menu" and aria-expanded, moves focus into the menu, and returns focus to the trigger on Escape or a choice.
|
|
73
85
|
- Selection semantics are exposed only by the primary button; label, icon, and trailingActionIcon are dormant SafeHtml and must not contain interactive descendants; never place an interactive descendant in ListItem.trailing.
|
|
86
|
+
- A draggable row is dragged by its noninteractive root; with wireListReorder, Alt+Shift+ArrowUp/ArrowDown on its primary button moves it, and focus returns to that button after the application re-renders.
|
|
74
87
|
|
|
75
88
|
## Styling boundary
|
|
76
89
|
|
|
@@ -80,12 +93,12 @@ Public class hooks (select for layout placement only, never to change the compon
|
|
|
80
93
|
|
|
81
94
|
Never put `kui-list-action-row`, `kui-list-action-row__icon`, `kui-list-action-row__label`, `kui-list-action-row__primary-label`, `kui-list-action-row__description`, `kui-list-action-row__status`, `kui-list-action-row__primary`, `kui-list-action-row__trailing-action` on an element you write; render `ListActionRow` instead (`KUI-L103`).
|
|
82
95
|
|
|
83
|
-
Public tokens it reads: `--kui-color-brand-border-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-neutral-border-normal`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-border-quiet`, `--kui-focus-ring`, `--kui-layout-inline-margin`, `--kui-layout-item-gap`, `--kui-layout-item-padding`, `--kui-layout-rounded-radius`, `--kui-radius-pill`, `--kui-list-action-row-background`, `--kui-list-action-row-border`, `--kui-list-action-row-color`, `--kui-list-action-row-hover-background`, `--kui-list-action-row-hover-border`, `--kui-list-action-row-selected-background`, `--kui-list-action-row-selected-border`, `--kui-list-action-row-selected-color`, `--kui-list-action-row-trailing-hover-background`, `--kui-list-group-divider-color`, `--kui-font-xs`. Set a token only where its public contract allows; prefer a prop.
|
|
96
|
+
Public tokens it reads: `--kui-color-brand-border-loud`, `--kui-color-brand-border-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-neutral-border-normal`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-border-quiet`, `--kui-focus-ring`, `--kui-layout-inline-margin`, `--kui-layout-item-gap`, `--kui-layout-item-padding`, `--kui-layout-rounded-radius`, `--kui-radius-pill`, `--kui-list-action-row-background`, `--kui-list-action-row-border`, `--kui-list-action-row-color`, `--kui-list-action-row-dragging-opacity`, `--kui-list-action-row-drop-indicator`, `--kui-list-action-row-drop-indicator-width`, `--kui-list-action-row-hover-background`, `--kui-list-action-row-hover-border`, `--kui-list-action-row-selected-background`, `--kui-list-action-row-selected-border`, `--kui-list-action-row-selected-color`, `--kui-list-action-row-trailing-hover-background`, `--kui-list-group-divider-color`, `--kui-font-xs`. Set a token only where its public contract allows; prefer a prop.
|
|
84
97
|
|
|
85
98
|
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`).
|
|
86
99
|
|
|
87
100
|
## Related
|
|
88
101
|
|
|
89
|
-
- Components: [LucideIcon](./lucide-icon.md), [LoadingSpinner](./loading-spinner.md), [ListItem](./list-item.md), [AppTab](./tabs.md).
|
|
102
|
+
- Components: [LucideIcon](./lucide-icon.md), [LoadingSpinner](./loading-spinner.md), [PopupMenu](./popup-menu.md), [ListItem](./list-item.md), [AppTab](./tabs.md).
|
|
90
103
|
- 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).
|
|
91
104
|
- UX catalog route: `?component=list-action-row`.
|
|
@@ -20,16 +20,19 @@ Selectable, disabled, trailing, and multiline action or link rows.
|
|
|
20
20
|
**Alternatives:**
|
|
21
21
|
|
|
22
22
|
- [ListActionRow](./list-action-row.md) (nearest) — The trailing region must be independently interactive.
|
|
23
|
+
- [SummaryRow](./summary-row.md) (nearest) — Use SummaryRow for dense selectable item summaries with metadata.
|
|
23
24
|
|
|
24
25
|
## Imports
|
|
25
26
|
|
|
26
|
-
- JavaScript: `@kerfjs/ui/list-item` — exports `ListItem`, `ListItemLink`.
|
|
27
|
+
- JavaScript: `@kerfjs/ui/list-item` — exports `ListItem`, `ListItemLink`, `wireListReorder`, `reorderListItems`.
|
|
27
28
|
- CSS: the browser build of `@kerfjs/ui/list-item` pulls its CSS automatically; import `@kerfjs/ui/list-item.css` manually only without the `browser` export condition.
|
|
29
|
+
- Wiring: `wireListReorder` from `@kerfjs/ui/wire-list-reorder` (optional).
|
|
30
|
+
- Wiring: `reorderListItems` from `@kerfjs/ui/wire-list-reorder` (optional).
|
|
28
31
|
- Declared side effects: browser-condition-css.
|
|
29
32
|
|
|
30
33
|
## Props
|
|
31
34
|
|
|
32
|
-
Exact prop names and types: [`@kerfjs/ui/list-item`](../public-api-signatures-v1.md#kerfjsuilist-item) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
35
|
+
Exact prop names and types: [`@kerfjs/ui/list-item`](../public-api-signatures-v1.md#kerfjsuilist-item), [`@kerfjs/ui/wire-list-reorder`](../public-api-signatures-v1.md#kerfjsuiwire-list-reorder) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
33
36
|
|
|
34
37
|
**Variants (configure, do not restyle):**
|
|
35
38
|
|
|
@@ -44,9 +47,11 @@ Exact prop names and types: [`@kerfjs/ui/list-item`](../public-api-signatures-v1
|
|
|
44
47
|
- spacious density
|
|
45
48
|
- centered icon beside a multiline label
|
|
46
49
|
- drag-target state
|
|
50
|
+
- draggable row with dragging and drop-before / drop-after insertion states
|
|
47
51
|
- description and status
|
|
48
52
|
- busy while retaining content
|
|
49
53
|
- before, after, or paired group divider
|
|
54
|
+
- position-aware divided-list corners: flat wherever a divider line (this row's or a neighbor's) meets the edge
|
|
50
55
|
|
|
51
56
|
**CSS-value props** (typed builders from `@kerfjs/ui/css-values`; raw CSS strings are rejected):
|
|
52
57
|
|
|
@@ -61,9 +66,14 @@ Exact prop names and types: [`@kerfjs/ui/list-item`](../public-api-signatures-v1
|
|
|
61
66
|
|
|
62
67
|
## State and wiring
|
|
63
68
|
|
|
64
|
-
**The app owns:** routing; link destinations; selection; permissions; action handling; domain data attributes.
|
|
69
|
+
**The app owns:** routing; link destinations; selection; permissions; action handling; domain data attributes; row order.
|
|
65
70
|
|
|
66
|
-
|
|
71
|
+
**Wiring:** `wireListReorder`, `reorderListItems` is optional.
|
|
72
|
+
|
|
73
|
+
**Wiring-owned state attributes** — never render, remove, or branch on these as app state:
|
|
74
|
+
|
|
75
|
+
- `data-dragging` on `ListItem / ListItemLink rows being dragged` (`wireListReorder`): "true" on every row a pointer drag is moving (the dragged row, or every selected row of its list when the dragged row is selected). Same attribute the `dragging` prop renders.
|
|
76
|
+
- `data-drop-position` on `ListItem / ListItemLink row under the pointer` (`wireListReorder`): "before" or "after": the edge of this row the dragged rows would land beside. Same attribute the `dropPosition` prop renders.
|
|
67
77
|
|
|
68
78
|
## Geometry
|
|
69
79
|
|
|
@@ -73,7 +83,7 @@ Margin: self · border: self · padding: self (layout role: navigation). `self`
|
|
|
73
83
|
|
|
74
84
|
## Accessibility
|
|
75
85
|
|
|
76
|
-
- ListItem uses native button activation and pressed maps to aria-pressed; ListItemLink uses native anchor activation and external opens a new tab with safe rel and an announced default label. Both map selected to aria-current; disabled or loading links omit href and leave the tab order. rootAttributes cannot add role=menuitem or replace owned ARIA; trailing is dormant content and must not contain controls.
|
|
86
|
+
- ListItem uses native button activation and pressed maps to aria-pressed; ListItemLink uses native anchor activation and external opens a new tab with safe rel and an announced default label. Both map selected to aria-current; disabled or loading links omit href and leave the tab order. rootAttributes cannot add role=menuitem or replace owned ARIA; trailing is dormant content and must not contain controls. A draggable row reorders by pointer drag or, with wireListReorder, Alt+Shift+ArrowUp/ArrowDown; a placeholder is never draggable.
|
|
77
87
|
|
|
78
88
|
## Styling boundary
|
|
79
89
|
|
|
@@ -83,12 +93,12 @@ Public class hooks (select for layout placement only, never to change the compon
|
|
|
83
93
|
|
|
84
94
|
Never put `kui-list-item`, `kui-list-item__icon`, `kui-list-item__label`, `kui-list-item__primary-label`, `kui-list-item__description`, `kui-list-item__status`, `kui-list-item__trailing` on an element you write; render `ListItem` instead (`KUI-L103`).
|
|
85
95
|
|
|
86
|
-
Public tokens it reads: `--kui-color-brand-border-normal`, `--kui-color-brand-border-quiet`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-border-quiet`, `--kui-color-neutral-border-normal`, `--kui-focus-ring`, `--kui-list-item-color`, `--kui-list-item-background`, `--kui-list-item-align-items`, `--kui-list-item-border-width`, `--kui-list-item-border`, `--kui-list-item-columns`, `--kui-list-item-drag-target-background`, `--kui-list-item-drag-target-outline`, `--kui-list-item-drag-target-outline-offset`, `--kui-list-item-gap`, `--kui-list-item-hover-background`, `--kui-list-item-hover-border`, `--kui-list-item-icon-color`, `--kui-list-item-icon-size`, `--kui-list-item-label-max-width`, `--kui-list-item-label-weight`, `--kui-list-item-min-height`, `--kui-list-item-padding-block`, `--kui-list-item-padding-inline`, `--kui-list-item-radius`, `--kui-list-item-selected-background`, `--kui-list-item-selected-border`, `--kui-list-item-selected-color`, `--kui-list-item-trailing-color`, `--kui-list-group-divider-color`, `--kui-font-xs`, `--kui-layout-inline-margin`, `--kui-layout-item-gap`, `--kui-layout-item-padding`, `--kui-layout-rounded-radius`. Set a token only where its public contract allows; prefer a prop.
|
|
96
|
+
Public tokens it reads: `--kui-color-brand-border-loud`, `--kui-color-brand-border-normal`, `--kui-color-brand-border-quiet`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-border-quiet`, `--kui-color-neutral-border-normal`, `--kui-radius-pill`, `--kui-focus-ring`, `--kui-list-item-color`, `--kui-list-item-background`, `--kui-list-item-align-items`, `--kui-list-item-border-width`, `--kui-list-item-border`, `--kui-list-item-columns`, `--kui-list-item-drag-target-background`, `--kui-list-item-drag-target-outline`, `--kui-list-item-drag-target-outline-offset`, `--kui-list-item-dragging-opacity`, `--kui-list-item-drop-indicator`, `--kui-list-item-drop-indicator-width`, `--kui-list-item-gap`, `--kui-list-item-hover-background`, `--kui-list-item-hover-border`, `--kui-list-item-icon-color`, `--kui-list-item-icon-size`, `--kui-list-item-label-max-width`, `--kui-list-item-label-weight`, `--kui-list-item-min-height`, `--kui-list-item-padding-block`, `--kui-list-item-padding-inline`, `--kui-list-item-radius`, `--kui-list-item-selected-background`, `--kui-list-item-selected-border`, `--kui-list-item-selected-color`, `--kui-list-item-trailing-color`, `--kui-list-group-divider-color`, `--kui-font-xs`, `--kui-layout-inline-margin`, `--kui-layout-item-gap`, `--kui-layout-item-padding`, `--kui-layout-rounded-radius`. Set a token only where its public contract allows; prefer a prop.
|
|
87
97
|
|
|
88
98
|
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`).
|
|
89
99
|
|
|
90
100
|
## Related
|
|
91
101
|
|
|
92
|
-
- Components: [LucideIcon](./lucide-icon.md), [LoadingSpinner](./loading-spinner.md), [ListActionRow](./list-action-row.md).
|
|
102
|
+
- Components: [LucideIcon](./lucide-icon.md), [LoadingSpinner](./loading-spinner.md), [ListActionRow](./list-action-row.md), [SummaryRow](./summary-row.md).
|
|
93
103
|
- 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).
|
|
94
104
|
- UX catalog route: `?component=list-item`.
|
package/ai/components/list.md
CHANGED
|
@@ -44,12 +44,14 @@ Exact prop names and types: [`@kerfjs/ui/list`](../public-api-signatures-v1.md#k
|
|
|
44
44
|
- typed CssLength gap
|
|
45
45
|
- boolean, finite-keyword, or typed CssFlex flex
|
|
46
46
|
- scrollable
|
|
47
|
+
- base or raised solid surface
|
|
48
|
+
- document reading inset
|
|
47
49
|
- left/center/right/full horizontal alignment
|
|
48
50
|
- top/middle/bottom/full vertical alignment
|
|
49
51
|
- top/right/bottom/left divider combinations
|
|
50
52
|
- top/right/bottom/left text and control inset combinations
|
|
51
53
|
- fill: the layout root fills a definite-height parent
|
|
52
|
-
- rootAttributes: safe data
|
|
54
|
+
- rootAttributes: safe data-\*, aria-\*, and structural role on the root
|
|
53
55
|
- scroll dividers when named as wireScrollDividers targets chrome
|
|
54
56
|
- multi-select grid for rich ContentItem rows
|
|
55
57
|
|
|
@@ -86,6 +88,7 @@ Margin: none · border: conditional · padding: conditional (layout role: naviga
|
|
|
86
88
|
|
|
87
89
|
- List adds layout only and no list role by default; selectionMode="multiple" makes it an aria-multiselectable grid with a required ariaLabel for selectable ContentItem rows.
|
|
88
90
|
- Give a scrollable List a bounded block size and keep keyboard focus visible as its contents scroll.
|
|
91
|
+
- A focused scrollable List (a keyboard-focusable scroller) draws the theme focus ring inset and rounded inside its own box, so a rounded or clipping parent never cuts it off; do not restyle its focus.
|
|
89
92
|
|
|
90
93
|
## Styling boundary
|
|
91
94
|
|
|
@@ -95,7 +98,7 @@ Public class hooks (select for layout placement only, never to change the compon
|
|
|
95
98
|
|
|
96
99
|
Never put `kui-list` on an element you write; render `List` instead (`KUI-L103`).
|
|
97
100
|
|
|
98
|
-
Public tokens it reads: `--kui-color-neutral-border-normal`, `--kui-layout-item-gap`, `--kui-list-divider-color`, `--kui-list-gap`. Set a token only where its public contract allows; prefer a prop.
|
|
101
|
+
Public tokens it reads: `--kui-color-neutral-border-normal`, `--kui-color-surface`, `--kui-color-surface-raised`, `--kui-layout-item-gap`, `--kui-list-divider-color`, `--kui-list-gap`, `--kui-space-l`, `--kui-space-m`, `--kui-space-xl`. Set a token only where its public contract allows; prefer a prop.
|
|
99
102
|
|
|
100
103
|
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`).
|
|
101
104
|
|
|
@@ -22,6 +22,7 @@ Present a single linear or drill-down flow while preserving each prior view's st
|
|
|
22
22
|
|
|
23
23
|
- [SplitView](./split-view.md) (roomy-alternative) — Promote a list-to-detail stack to SplitView once both regions fit together.
|
|
24
24
|
- [TabNavigator](./tab-navigator.md) (composes-with) — Use one NavStack as each TabNavigator tab's persistent content.
|
|
25
|
+
- [ContentSwap](./content-swap.md) (nearest) — Use ContentSwap to swap content in place inside one region without navigation chrome.
|
|
25
26
|
|
|
26
27
|
## Imports
|
|
27
28
|
|
|
@@ -100,6 +101,6 @@ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-
|
|
|
100
101
|
|
|
101
102
|
## Related
|
|
102
103
|
|
|
103
|
-
- Components: [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [ToolbarText](./toolbar-text.md), [SplitView](./split-view.md), [TabNavigator](./tab-navigator.md).
|
|
104
|
+
- Components: [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [ToolbarText](./toolbar-text.md), [SplitView](./split-view.md), [TabNavigator](./tab-navigator.md), [ContentSwap](./content-swap.md).
|
|
104
105
|
- Docs: [`docs/nav-stack.md`](../../docs/nav-stack.md), [`docs/app-layouts.md#decision-matrix`](../../docs/app-layouts.md#decision-matrix).
|
|
105
106
|
- UX catalog route: `?component=nav-stack`.
|
|
@@ -24,7 +24,7 @@ A typed action menu with nested choices, selected state, and optional pointer-an
|
|
|
24
24
|
|
|
25
25
|
## Imports
|
|
26
26
|
|
|
27
|
-
- JavaScript: `@kerfjs/ui/popup-menu` — exports `PopupMenu`, `openPopupMenuAt`, `closePopupMenu`.
|
|
27
|
+
- JavaScript: `@kerfjs/ui/popup-menu` — exports `PopupMenu`, `openPopupMenu`, `openPopupMenuAt`, `closePopupMenu`.
|
|
28
28
|
- CSS: the browser build of `@kerfjs/ui/popup-menu` pulls its CSS automatically; import `@kerfjs/ui/popup-menu.css` manually only without the `browser` export condition.
|
|
29
29
|
- Theme CSS: import `@kerfjs/ui/webawesome.css` once.
|
|
30
30
|
- Registration: import `@kerfjs/ui/popup-menu/register` once (a side effect).
|
|
@@ -45,7 +45,7 @@ Exact prop names and types: [`@kerfjs/ui/popup-menu`](../public-api-signatures-v
|
|
|
45
45
|
- nested actions
|
|
46
46
|
- checked choices and trailing details
|
|
47
47
|
- danger tone and disabled reasons
|
|
48
|
-
- context trigger
|
|
48
|
+
- context trigger with a rendered anchor point and a zero-footprint anchor host
|
|
49
49
|
- placement
|
|
50
50
|
|
|
51
51
|
## Composition
|
package/ai/components/row.md
CHANGED
|
@@ -47,7 +47,7 @@ Exact prop names and types: [`@kerfjs/ui/row`](../public-api-signatures-v1.md#ke
|
|
|
47
47
|
- nowrap or wrapping
|
|
48
48
|
- top/right/bottom/left text and control inset combinations
|
|
49
49
|
- fill: the layout root fills a definite-height parent
|
|
50
|
-
- rootAttributes: safe data
|
|
50
|
+
- rootAttributes: safe data-\*, aria-\*, and structural role metadata on the root
|
|
51
51
|
|
|
52
52
|
**CSS-value props** (typed builders from `@kerfjs/ui/css-values`; raw CSS strings are rejected):
|
|
53
53
|
|
package/ai/components/select.md
CHANGED
|
@@ -23,6 +23,7 @@ Choose one or more controlled values, keep unavailable choices visible, and opti
|
|
|
23
23
|
- [SegmentedControl](./segmented-control.md) (nearest)
|
|
24
24
|
- [Select](./wa-select.md) (prefer-over)
|
|
25
25
|
- [Dropdown](./wa-dropdown.md) (prefer-over)
|
|
26
|
+
- [Combobox](./combobox.md) (nearest) — Use Combobox when people may type to filter or create a new value.
|
|
26
27
|
|
|
27
28
|
## Imports
|
|
28
29
|
|
|
@@ -110,6 +111,6 @@ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-
|
|
|
110
111
|
|
|
111
112
|
## Related
|
|
112
113
|
|
|
113
|
-
- Components: [LucideIcon](./lucide-icon.md), [Badge](./badge.md), [Select](./wa-select.md), [Option](./wa-option.md), [SegmentedControl](./segmented-control.md), [Dropdown](./wa-dropdown.md).
|
|
114
|
+
- Components: [LucideIcon](./lucide-icon.md), [Badge](./badge.md), [Select](./wa-select.md), [Option](./wa-option.md), [SegmentedControl](./segmented-control.md), [Dropdown](./wa-dropdown.md), [Combobox](./combobox.md).
|
|
114
115
|
- Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#web-awesome-overlap-policy`](../../docs/component-selection.md#web-awesome-overlap-policy).
|
|
115
116
|
- UX catalog route: `?component=select`.
|