@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
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 592 786" width="592" height="786"><defs><clipPath id="cp0"><rect x="16" y="38" width="560" height="116"/></clipPath><clipPath id="cp1"><rect x="16" y="192" width="560" height="116"/></clipPath><clipPath id="cp2"><rect x="16" y="346" width="560" height="116"/></clipPath><clipPath id="cp3"><rect x="16" y="500" width="560" height="116"/></clipPath><clipPath id="cp4"><rect x="16" y="654" width="560" height="116"/></clipPath><clipPath id="ct5"><rect x="16" y="16" width="560" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="38" width="560" height="116" rx="0"/></clipPath><clipPath id="ct8"><rect x="16" y="170" width="560" height="22"/></clipPath><clipPath id="irc9"><rect x="16" y="192" width="560" height="116" rx="0"/></clipPath><clipPath id="ct11"><rect x="16" y="324" width="560" height="22"/></clipPath><clipPath id="irc12"><rect x="16" y="346" width="560" height="116" rx="0"/></clipPath><clipPath id="ct14"><rect x="16" y="478" width="560" height="22"/></clipPath><clipPath id="irc15"><rect x="16" y="500" width="560" height="116" rx="0"/></clipPath><clipPath id="ct17"><rect x="16" y="632" width="560" height="22"/></clipPath><clipPath id="irc18"><rect x="16" y="654" width="560" height="116" rx="0"/></clipPath></defs><rect x="0" y="0" width="592" height="786" rx="0" fill="rgb(255,255,255)"/><text x="16" y="28" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Info</text><g clip-path="url(#cp0)"><g clip-path="url(#irc6)"><clipPath id="svgimg7vclip"><rect x="16" y="38" width="560" height="116"/></clipPath><g clip-path="url(#svgimg7vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg7cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg7ct2"><rect x="61" y="29.4" width="116.7" height="15"/></clipPath><clipPath id="svgimg7cp3"><rect x="61" y="44.4" width="254.4" height="13"/></clipPath><clipPath id="svgimg7ct4"><rect x="61" y="44.4" width="254.4" height="13"/></clipPath><clipPath id="svgimg7ct5"><rect x="437.6" y="29" width="65.4" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(235,244,252)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(166,207,242)" stroke-width="1"/><g clip-path="url(#svgimg7cp0)"><g color="rgb(26, 93, 207)"><clipPath id="svgimg7svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg7svgic1)"><g transform="translate(37 35.39)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12" y1="8" y2="12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12.01" y1="16" y2="16" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41.39" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="700" fill="rgb(26,93,207)">Draft not published</text><g clip-path="url(#svgimg7cp3)"><g clip-path="url(#svgimg7ct4)"><text x="61" y="55.39" font-family="system-ui, "-apple-system", sans-serif" font-size="11" fill="rgb(26,93,207)">Changes are saved but only visible to your team.</text></g></g><rect x="437.6" y="29" width="65.4" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="438.5" y="29.5" width="64" height="28" rx="13.9" fill="none" stroke="rgb(26,93,207)" stroke-width="1"/><text x="449.83" y="47.89" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(26,93,207)">Publish</text></g></g></g></g><text x="16" y="182" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Info with badge</text><g clip-path="url(#cp1)"><g clip-path="url(#irc9)"><clipPath id="svgimg10vclip"><rect x="16" y="192" width="560" height="116"/></clipPath><g clip-path="url(#svgimg10vclip)"><g transform="translate(16 192)"><defs><clipPath id="svgimg10cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg10ct2"><rect x="61" y="35.9" width="137.6" height="15"/></clipPath><clipPath id="svgimg10ct3"><rect x="206.6" y="33.4" width="20" height="20"/></clipPath><clipPath id="svgimg10ct4"><rect x="437.3" y="29" width="65.7" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(235,244,252)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(166,207,242)" stroke-width="1"/><g clip-path="url(#svgimg10cp0)"><g color="rgb(26, 93, 207)"><clipPath id="svgimg10svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg10svgic1)"><g transform="translate(37 35.39)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12" y1="8" y2="12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12.01" y1="16" y2="16" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="47.89" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="700" fill="rgb(26,93,207)">Unanswered questions</text><rect x="206.6" y="33.4" width="20" height="20" rx="10" fill="rgb(26,93,207)"/><rect x="207.5" y="33.5" width="19" height="19" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="213.83" y="47.89" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(255,255,255)">1</text><rect x="437.3" y="29" width="65.7" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="437.5" y="29.5" width="65" height="28" rx="13.9" fill="none" stroke="rgb(26,93,207)" stroke-width="1"/><text x="449.47" y="47.89" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(26,93,207)">Answer</text></g></g></g></g><text x="16" y="336" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Success</text><g clip-path="url(#cp2)"><g clip-path="url(#irc12)"><clipPath id="svgimg13vclip"><rect x="16" y="346" width="560" height="116"/></clipPath><g clip-path="url(#svgimg13vclip)"><g transform="translate(16 346)"><defs><clipPath id="svgimg13cp0"><rect x="37" y="35" width="16" height="16"/></clipPath><clipPath id="svgimg13ct2"><rect x="61" y="29" width="132.1" height="15"/></clipPath><clipPath id="svgimg13cp3"><rect x="61" y="44" width="259.7" height="13"/></clipPath><clipPath id="svgimg13ct4"><rect x="61" y="44" width="259.7" height="13"/></clipPath></defs><rect x="28" y="20" width="484" height="46" rx="12" fill="rgb(227,247,232)"/><rect x="28.5" y="20.5" width="483" height="45" rx="11.5" fill="none" stroke="rgb(154,227,172)" stroke-width="1"/><g clip-path="url(#svgimg13cp0)"><g color="rgb(0, 121, 44)"><clipPath id="svgimg13svgic1"><rect x="37" y="35" width="16" height="16"/></clipPath><g clip-path="url(#svgimg13svgic1)"><g transform="translate(37 35)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(0, 121, 44)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="m16 9-5.5 5.5L8 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(0, 121, 44)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="700" fill="rgb(0,121,44)">Deployment complete</text><g clip-path="url(#svgimg13cp3)"><g clip-path="url(#svgimg13ct4)"><text x="61" y="55" font-family="system-ui, "-apple-system", sans-serif" font-size="11" fill="rgb(0,121,44)">production.example.com is serving the new build.</text></g></g></g></g></g></g><text x="16" y="490" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Warning</text><g clip-path="url(#cp3)"><g clip-path="url(#irc15)"><clipPath id="svgimg16vclip"><rect x="16" y="500" width="560" height="116"/></clipPath><g clip-path="url(#svgimg16vclip)"><g transform="translate(16 500)"><defs><clipPath id="svgimg16cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg16ct2"><rect x="61" y="29.4" width="166.1" height="15"/></clipPath><clipPath id="svgimg16cp3"><rect x="61" y="44.4" width="261" height="13"/></clipPath><clipPath id="svgimg16ct4"><rect x="61" y="44.4" width="261" height="13"/></clipPath><clipPath id="svgimg16ct5"><rect x="431.1" y="29" width="71.9" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(255,250,232)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(160,131,13)" stroke-width="1"/><g clip-path="url(#svgimg16cp0)"><g color="rgb(143, 94, 0)"><clipPath id="svgimg16svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg16svgic1)"><g transform="translate(37 35.39)scale(.66667)"><path d="m21.7 18-8-14a2 2 0 0 0-3.4 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M12 9v4" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M12 17z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41.39" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="700" fill="rgb(143,94,0)">Approaching your plan limit</text><g clip-path="url(#svgimg16cp3)"><g clip-path="url(#svgimg16ct4)"><text x="61" y="55.39" font-family="system-ui, "-apple-system", sans-serif" font-size="11" fill="rgb(143,94,0)">You have used 92% of this month’s build minutes.</text></g></g><rect x="431.1" y="29" width="71.9" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="431.5" y="29.5" width="71" height="28" rx="13.9" fill="none" stroke="rgb(143,94,0)" stroke-width="1"/><text x="443.28" y="47.89" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(143,94,0)">Upgrade</text></g></g></g></g><text x="16" y="644" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Danger (alert)</text><g clip-path="url(#cp4)"><g clip-path="url(#irc18)"><clipPath id="svgimg19vclip"><rect x="16" y="654" width="560" height="116"/></clipPath><g clip-path="url(#svgimg19vclip)"><g transform="translate(16 654)"><defs><clipPath id="svgimg19cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg19ct2"><rect x="61" y="29.4" width="67.5" height="15"/></clipPath><clipPath id="svgimg19cp3"><rect x="61" y="44.4" width="158.6" height="13"/></clipPath><clipPath id="svgimg19ct4"><rect x="61" y="44.4" width="158.6" height="13"/></clipPath><clipPath id="svgimg19ct5"><rect x="431.7" y="29" width="71.3" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(254,237,238)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(249,173,175)" stroke-width="1"/><g clip-path="url(#svgimg19cp0)"><g color="rgb(194, 11, 32)"><clipPath id="svgimg19svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg19svgic1)"><g transform="translate(37 35.39)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 11, 32)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12" y1="8" y2="12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 11, 32)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12.01" y1="16" y2="16" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 11, 32)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41.39" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="700" fill="rgb(194,11,32)">Build failed</text><g clip-path="url(#svgimg19cp3)"><g clip-path="url(#svgimg19ct4)"><text x="61" y="55.39" font-family="system-ui, "-apple-system", sans-serif" font-size="11" fill="rgb(194,11,32)">Step “test” exited with code 1.</text></g></g><rect x="431.7" y="29" width="71.3" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="432.5" y="29.5" width="70" height="28" rx="13.9" fill="none" stroke="rgb(194,11,32)" stroke-width="1"/><text x="443.88" y="47.89" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(194,11,32)">View log</text></g></g></g></g></svg>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 592 940" width="592" height="940"><defs><clipPath id="cp0"><rect x="16" y="38" width="560" height="116"/></clipPath><clipPath id="cp1"><rect x="16" y="192" width="560" height="116"/></clipPath><clipPath id="cp2"><rect x="16" y="346" width="560" height="116"/></clipPath><clipPath id="cp3"><rect x="16" y="500" width="560" height="116"/></clipPath><clipPath id="cp4"><rect x="16" y="654" width="560" height="116"/></clipPath><clipPath id="cp5"><rect x="16" y="808" width="560" height="116"/></clipPath><clipPath id="ct6"><rect x="16" y="16" width="560" height="22"/></clipPath><clipPath id="irc7"><rect x="16" y="38" width="560" height="116" rx="0"/></clipPath><clipPath id="ct9"><rect x="16" y="170" width="560" height="22"/></clipPath><clipPath id="irc10"><rect x="16" y="192" width="560" height="116" rx="0"/></clipPath><clipPath id="ct12"><rect x="16" y="324" width="560" height="22"/></clipPath><clipPath id="irc13"><rect x="16" y="346" width="560" height="116" rx="0"/></clipPath><clipPath id="ct15"><rect x="16" y="478" width="560" height="22"/></clipPath><clipPath id="irc16"><rect x="16" y="500" width="560" height="116" rx="0"/></clipPath><clipPath id="ct18"><rect x="16" y="632" width="560" height="22"/></clipPath><clipPath id="irc19"><rect x="16" y="654" width="560" height="116" rx="0"/></clipPath><clipPath id="ct21"><rect x="16" y="786" width="560" height="22"/></clipPath><clipPath id="irc22"><rect x="16" y="808" width="560" height="116" rx="0"/></clipPath></defs><rect x="0" y="0" width="592" height="940" rx="0" fill="rgb(255,255,255)"/><text x="16" y="28" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Info</text><g clip-path="url(#cp0)"><g clip-path="url(#irc7)"><clipPath id="svgimg8vclip"><rect x="16" y="38" width="560" height="116"/></clipPath><g clip-path="url(#svgimg8vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg8cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg8ct2"><rect x="61" y="29.4" width="116.7" height="15"/></clipPath><clipPath id="svgimg8cp3"><rect x="61" y="44.4" width="254.4" height="13"/></clipPath><clipPath id="svgimg8ct4"><rect x="61" y="44.4" width="254.4" height="13"/></clipPath><clipPath id="svgimg8ct5"><rect x="437.6" y="29" width="65.4" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(235,244,252)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(166,207,242)" stroke-width="1"/><g clip-path="url(#svgimg8cp0)"><g color="rgb(26, 93, 207)"><clipPath id="svgimg8svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg8svgic1)"><g transform="translate(37 35.39)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12" y1="8" y2="12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12.01" y1="16" y2="16" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41.39" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="700" fill="rgb(26,93,207)">Draft not published</text><g clip-path="url(#svgimg8cp3)"><g clip-path="url(#svgimg8ct4)"><text x="61" y="55.39" font-family="system-ui, "-apple-system", sans-serif" font-size="11" fill="rgb(26,93,207)">Changes are saved but only visible to your team.</text></g></g><rect x="437.6" y="29" width="65.4" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="438.5" y="29.5" width="64" height="28" rx="13.9" fill="none" stroke="rgb(26,93,207)" stroke-width="1"/><text x="449.83" y="47.89" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(26,93,207)">Publish</text></g></g></g></g><text x="16" y="182" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Info with badge</text><g clip-path="url(#cp1)"><g clip-path="url(#irc10)"><clipPath id="svgimg11vclip"><rect x="16" y="192" width="560" height="116"/></clipPath><g clip-path="url(#svgimg11vclip)"><g transform="translate(16 192)"><defs><clipPath id="svgimg11cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg11ct2"><rect x="61" y="35.9" width="137.6" height="15"/></clipPath><clipPath id="svgimg11ct3"><rect x="206.6" y="33.4" width="20" height="20"/></clipPath><clipPath id="svgimg11ct4"><rect x="437.3" y="29" width="65.7" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(235,244,252)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(166,207,242)" stroke-width="1"/><g clip-path="url(#svgimg11cp0)"><g color="rgb(26, 93, 207)"><clipPath id="svgimg11svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg11svgic1)"><g transform="translate(37 35.39)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12" y1="8" y2="12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12.01" y1="16" y2="16" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="47.89" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="700" fill="rgb(26,93,207)">Unanswered questions</text><rect x="206.6" y="33.4" width="20" height="20" rx="10" fill="rgb(26,93,207)"/><rect x="207.5" y="33.5" width="19" height="19" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="213.83" y="47.89" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(255,255,255)">1</text><rect x="437.3" y="29" width="65.7" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="437.5" y="29.5" width="65" height="28" rx="13.9" fill="none" stroke="rgb(26,93,207)" stroke-width="1"/><text x="449.47" y="47.89" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(26,93,207)">Answer</text></g></g></g></g><text x="16" y="336" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Success</text><g clip-path="url(#cp2)"><g clip-path="url(#irc13)"><clipPath id="svgimg14vclip"><rect x="16" y="346" width="560" height="116"/></clipPath><g clip-path="url(#svgimg14vclip)"><g transform="translate(16 346)"><defs><clipPath id="svgimg14cp0"><rect x="37" y="35" width="16" height="16"/></clipPath><clipPath id="svgimg14ct2"><rect x="61" y="29" width="132.1" height="15"/></clipPath><clipPath id="svgimg14cp3"><rect x="61" y="44" width="259.7" height="13"/></clipPath><clipPath id="svgimg14ct4"><rect x="61" y="44" width="259.7" height="13"/></clipPath></defs><rect x="28" y="20" width="484" height="46" rx="12" fill="rgb(227,247,232)"/><rect x="28.5" y="20.5" width="483" height="45" rx="11.5" fill="none" stroke="rgb(154,227,172)" stroke-width="1"/><g clip-path="url(#svgimg14cp0)"><g color="rgb(0, 121, 44)"><clipPath id="svgimg14svgic1"><rect x="37" y="35" width="16" height="16"/></clipPath><g clip-path="url(#svgimg14svgic1)"><g transform="translate(37 35)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(0, 121, 44)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="m16 9-5.5 5.5L8 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(0, 121, 44)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="700" fill="rgb(0,121,44)">Deployment complete</text><g clip-path="url(#svgimg14cp3)"><g clip-path="url(#svgimg14ct4)"><text x="61" y="55" font-family="system-ui, "-apple-system", sans-serif" font-size="11" fill="rgb(0,121,44)">production.example.com is serving the new build.</text></g></g></g></g></g></g><text x="16" y="490" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Warning</text><g clip-path="url(#cp3)"><g clip-path="url(#irc16)"><clipPath id="svgimg17vclip"><rect x="16" y="500" width="560" height="116"/></clipPath><g clip-path="url(#svgimg17vclip)"><g transform="translate(16 500)"><defs><clipPath id="svgimg17cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg17ct2"><rect x="61" y="29.4" width="166.1" height="15"/></clipPath><clipPath id="svgimg17cp3"><rect x="61" y="44.4" width="261" height="13"/></clipPath><clipPath id="svgimg17ct4"><rect x="61" y="44.4" width="261" height="13"/></clipPath><clipPath id="svgimg17ct5"><rect x="431.1" y="29" width="71.9" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(255,250,232)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(160,131,13)" stroke-width="1"/><g clip-path="url(#svgimg17cp0)"><g color="rgb(143, 94, 0)"><clipPath id="svgimg17svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg17svgic1)"><g transform="translate(37 35.39)scale(.66667)"><path d="m21.7 18-8-14a2 2 0 0 0-3.4 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M12 9v4" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M12 17z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41.39" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="700" fill="rgb(143,94,0)">Approaching your plan limit</text><g clip-path="url(#svgimg17cp3)"><g clip-path="url(#svgimg17ct4)"><text x="61" y="55.39" font-family="system-ui, "-apple-system", sans-serif" font-size="11" fill="rgb(143,94,0)">You have used 92% of this month’s build minutes.</text></g></g><rect x="431.1" y="29" width="71.9" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="431.5" y="29.5" width="71" height="28" rx="13.9" fill="none" stroke="rgb(143,94,0)" stroke-width="1"/><text x="443.28" y="47.89" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(143,94,0)">Upgrade</text></g></g></g></g><text x="16" y="644" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Danger (alert)</text><g clip-path="url(#cp4)"><g clip-path="url(#irc19)"><clipPath id="svgimg20vclip"><rect x="16" y="654" width="560" height="116"/></clipPath><g clip-path="url(#svgimg20vclip)"><g transform="translate(16 654)"><defs><clipPath id="svgimg20cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg20ct2"><rect x="61" y="29.4" width="67.5" height="15"/></clipPath><clipPath id="svgimg20cp3"><rect x="61" y="44.4" width="158.6" height="13"/></clipPath><clipPath id="svgimg20ct4"><rect x="61" y="44.4" width="158.6" height="13"/></clipPath><clipPath id="svgimg20ct5"><rect x="431.7" y="29" width="71.3" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(254,237,238)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(249,173,175)" stroke-width="1"/><g clip-path="url(#svgimg20cp0)"><g color="rgb(194, 11, 32)"><clipPath id="svgimg20svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg20svgic1)"><g transform="translate(37 35.39)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 11, 32)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12" y1="8" y2="12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 11, 32)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12.01" y1="16" y2="16" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 11, 32)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41.39" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="700" fill="rgb(194,11,32)">Build failed</text><g clip-path="url(#svgimg20cp3)"><g clip-path="url(#svgimg20ct4)"><text x="61" y="55.39" font-family="system-ui, "-apple-system", sans-serif" font-size="11" fill="rgb(194,11,32)">Step “test” exited with code 1.</text></g></g><rect x="431.7" y="29" width="71.3" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="432.5" y="29.5" width="70" height="28" rx="13.9" fill="none" stroke="rgb(194,11,32)" stroke-width="1"/><text x="443.88" y="47.89" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(194,11,32)">View log</text></g></g></g></g><text x="16" y="798" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Strip (full-width band)</text><g clip-path="url(#cp5)"><g clip-path="url(#irc22)"><clipPath id="svgimg23vclip"><rect x="16" y="808" width="560" height="116"/></clipPath><g clip-path="url(#svgimg23vclip)"><g transform="translate(16 808)"><defs><clipPath id="svgimg23cp0"><rect x="37" y="36" width="16" height="16"/></clipPath><clipPath id="svgimg23ct2"><rect x="61" y="28" width="125" height="15"/></clipPath><clipPath id="svgimg23ct3"><rect x="61" y="47" width="230.7" height="13"/></clipPath><clipPath id="svgimg23ct4"><rect x="434.6" y="29.6" width="68.4" height="28.8"/></clipPath></defs><rect x="20" y="20" width="500" height="49" rx="0" fill="rgb(255,250,232)"/><polygon points="520,69 20,69 20,68 520,68" fill="rgb(160,131,13)"/><g clip-path="url(#svgimg23cp0)"><g color="rgb(143, 94, 0)"><clipPath id="svgimg23svgic1"><rect x="37" y="36" width="16" height="16"/></clipPath><g clip-path="url(#svgimg23svgic1)"><g transform="translate(37 36)scale(.66667)"><path d="m21.7 18-8-14a2 2 0 0 0-3.4 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M12 9v4" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M12 17z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="40" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="700" fill="rgb(143,94,0)">Notifications paused</text><text x="61" y="58" font-family="system-ui, "-apple-system", sans-serif" font-size="11" fill="rgb(143,94,0)">Desktop alerts resume when you reconnect.</text><rect x="434.6" y="29.6" width="68.4" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="435.5" y="30.5" width="67" height="27" rx="13.5" fill="none" stroke="rgb(143,94,0)" stroke-width="1"/><text x="446.83" y="48.48" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(143,94,0)">Resume</text></g></g></g></g></svg>
|
package/docs/design/templates.md
CHANGED
|
@@ -137,4 +137,4 @@ regenerate both themes and library sheets when that geometry changes. The browse
|
|
|
137
137
|
pane/sidebar geometry checks cover the resulting 43px icon-label offset from the
|
|
138
138
|
section edge (17px content inset + 18px icon + 8px gap).
|
|
139
139
|
|
|
140
|
-
For a focused update, pass component names: `npm run design-templates:build -- toolbar`. Omit them to capture all components. Toolbar width variants use the real `wireToolbarVisibility` helper after rendering typed props.
|
|
140
|
+
For a focused update, pass component names: `npm run design-templates:build -- toolbar`. Omit them to capture all components. Toolbar width variants use the real `wireToolbarVisibility` helper after rendering typed props. The `ListActionRow` "Trailing overflow menu" variant renders a real `trailingMenu` `PopupMenu`. Its trigger is a native button inside Web Awesome's shadow root, and domotion cannot read that button's author styles. A registered trigger would therefore be captured as a raster image, which also stops the library sheet from flattening. The capture instead leaves the PopupMenu unregistered. The template-only `staticPopupMenuTriggerCss` gives the trigger host the geometry `popup-menu.css` gives its `::part(base)` in a row: a 44px-wide box, as tall as the row, with the 16px icon centered. It also hides the closed menu's items. The icon lands at the same position as in a registered capture.
|
|
@@ -22,6 +22,22 @@ Native table cells (`th`, `td`) and form controls (`button`, `input`, `select`,
|
|
|
22
22
|
zero-specificity selectors. Table headers keep their native bold weight and
|
|
23
23
|
alignment, and application styles can override the baseline.
|
|
24
24
|
|
|
25
|
+
Native controls also get semantic cursors, again at zero specificity so a
|
|
26
|
+
component's or application's own cursor wins:
|
|
27
|
+
|
|
28
|
+
- `pointer` on enabled `button`, `a[href]`, `[role="button"]` (unless
|
|
29
|
+
`aria-disabled="true"`), `summary`, `select`, checkbox / radio / color /
|
|
30
|
+
file / button / reset / submit inputs, and a `label` wrapping an enabled
|
|
31
|
+
checkbox or radio;
|
|
32
|
+
- `not-allowed` on disabled `button`, `input`, `select`, and `textarea`, on
|
|
33
|
+
`[role="button"][aria-disabled="true"]`, and on a disabled `wa-button`'s
|
|
34
|
+
`base` part (Web Awesome leaves a pointer there);
|
|
35
|
+
- `text` on enabled `textarea` and text-like inputs (`text`, `search`,
|
|
36
|
+
`email`, `url`, `tel`, `password`, `number`, and untyped).
|
|
37
|
+
|
|
38
|
+
Applications no longer need their own global cursor policy for native
|
|
39
|
+
controls.
|
|
40
|
+
|
|
25
41
|
`html`, `body`, and `.kui-app-root` form a definite `height: 100%` chain. Add
|
|
26
42
|
`.kui-app-root` to the one direct mount container of a full-height application
|
|
27
43
|
whose child is a `Workbench`, `SplitView`, `NavStack`, or another percentage-
|
|
@@ -32,6 +48,41 @@ The class sets `height: 100%`, not a viewport minimum; the direct child shell
|
|
|
32
48
|
must also fill its parent (for example with its `fill` prop). If the host page
|
|
33
49
|
already supplies a definite height, use that host geometry instead.
|
|
34
50
|
|
|
51
|
+
### Viewport-locked application shell
|
|
52
|
+
|
|
53
|
+
A shell that fills the whole window (a `Workbench` app such as Hot Sheet) can
|
|
54
|
+
also lock the document to the viewport:
|
|
55
|
+
|
|
56
|
+
```html
|
|
57
|
+
<body>
|
|
58
|
+
<div id="app" class="kui-app-root" data-viewport="locked"></div>
|
|
59
|
+
</body>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
With `data-viewport="locked"` on a `.kui-app-root` that is a direct child of
|
|
63
|
+
`body`, `html`, `body`, and the root take `height: 100dvh` and
|
|
64
|
+
`overflow: clip`:
|
|
65
|
+
|
|
66
|
+
- The **dynamic** viewport height tracks the visible area as mobile browser
|
|
67
|
+
toolbars show and hide (iOS Safari, WKWebView), so the root is never taller
|
|
68
|
+
than what the person can see.
|
|
69
|
+
- `overflow: clip` (rather than `hidden`) leaves the document with no scroll
|
|
70
|
+
container at all. Neither the person, nor `scrollIntoView()`, nor focus can
|
|
71
|
+
leave the page scrolled: only the shell's `Pane`s scroll.
|
|
72
|
+
|
|
73
|
+
**On-screen keyboard.** `100dvh` does not shrink for the on-screen keyboard.
|
|
74
|
+
When a field near the bottom takes focus, iOS pans the _visual_ viewport to
|
|
75
|
+
reveal it and pans back when the keyboard closes; because the document itself
|
|
76
|
+
cannot scroll, there is no leftover document offset to restore. A field
|
|
77
|
+
inside a scrolling `Pane` is revealed by that Pane's own scroll. If the
|
|
78
|
+
layout should instead shrink above the keyboard, add
|
|
79
|
+
`interactive-widget=resizes-content` to the viewport meta tag on engines
|
|
80
|
+
that support it. Do not add scroll-restoration handlers for the document:
|
|
81
|
+
the locked document has no scroll position.
|
|
82
|
+
|
|
83
|
+
Leave the attribute off for document-flow pages and embedded shells; the
|
|
84
|
+
default `height: 100%` chain keeps those scrolling normally.
|
|
85
|
+
|
|
35
86
|
`kui-app-root` is the public class of the component catalog's
|
|
36
87
|
`document-baseline` entry, so `kerf-ui-doctor` and the
|
|
37
88
|
`kerfjs/ui-public-boundaries` ESLint rule accept it (no KUI-L101 finding).
|
package/docs/layout.md
CHANGED
|
@@ -473,6 +473,17 @@ width. On `normal` or `anywhere`, set a positive integer `maxLines` to clamp
|
|
|
473
473
|
wrapped text with an ellipsis. Omit `maxLines` for unlimited lines. The cap is
|
|
474
474
|
incompatible with `nowrap` and `truncate`.
|
|
475
475
|
|
|
476
|
+
With `wrap="truncate"`, `truncate` chooses where the ellipsis goes: `end`
|
|
477
|
+
(default) keeps the start; `start` keeps the tail, for a branch name or the
|
|
478
|
+
end of an identifier; and `middle` keeps the start and a suffix, for a file
|
|
479
|
+
path. `truncateKeep` sets that suffix: `segment` (default) keeps the last path
|
|
480
|
+
segment with its `/` or `\` separator (the last 10 characters when there is
|
|
481
|
+
none), or a number keeps that many trailing characters. `middle` needs string
|
|
482
|
+
or number children so it can split them. Both positions are for left-to-right
|
|
483
|
+
identifiers and paths, keep the whole value in the DOM in order for assistive
|
|
484
|
+
technology, and show it as the element's `title` unless you pass your own.
|
|
485
|
+
Never hand-roll these with `direction: rtl` or split spans in app CSS.
|
|
486
|
+
|
|
476
487
|
```tsx
|
|
477
488
|
import { Text } from "@kerfjs/ui/text";
|
|
478
489
|
|
|
@@ -486,6 +497,8 @@ import { Text } from "@kerfjs/ui/text";
|
|
|
486
497
|
<Text tone="danger" font="monospace">ERR_INVALID_ID</Text>;
|
|
487
498
|
<Text wrap="anywhere">A-very-long-unbroken-identifier</Text>;
|
|
488
499
|
<Text wrap="truncate" variant="span">Long vendor name</Text>;
|
|
500
|
+
<Text wrap="truncate" truncate="middle" font="monospace">{path}</Text>;
|
|
501
|
+
<Text wrap="truncate" truncate="start" variant="span">{branchName}</Text>;
|
|
489
502
|
<Text wrap="normal" maxLines={2}>A long summary capped at two lines.</Text>;
|
|
490
503
|
```
|
|
491
504
|
|
|
@@ -572,6 +585,17 @@ semantics.
|
|
|
572
585
|
Use application-owned CSS grid for intrinsic, asymmetric, spanning, or masonry
|
|
573
586
|
tracks, and use `ResizableRegion` when people must adjust a boundary.
|
|
574
587
|
|
|
588
|
+
## Column tracks
|
|
589
|
+
|
|
590
|
+
A board of parallel columns (kanban lanes) is a `ColumnTrack`: one horizontal
|
|
591
|
+
scroll owner that fills its parent's height, with columns that sit flush and
|
|
592
|
+
own their insets and vertical scrolling. By default columns share the width
|
|
593
|
+
equally but never narrow below `minColumnWidth` (250px), so a narrow board
|
|
594
|
+
scrolls sideways instead of crushing them. `layout="paged"` gives each column
|
|
595
|
+
nearly the visible width, lets the next one `peek` in (24px), snaps to column
|
|
596
|
+
starts, hides the scrollbar, and scrolls smoothly unless reduced motion is
|
|
597
|
+
preferred. Choose the layout per device class in the app.
|
|
598
|
+
|
|
575
599
|
## Row and List alignment
|
|
576
600
|
|
|
577
601
|
Use `Row` for a horizontal flex layout and `List` for a vertical one. `Row`
|
|
@@ -610,10 +634,37 @@ frame), pass `fill` instead: the root takes the parent's full height
|
|
|
610
634
|
(`height: 100%`), so its `flex` children can grow into it. Use `fill` only on
|
|
611
635
|
that sole layout root; a sibling inside a flex layout keeps using `flex`.
|
|
612
636
|
|
|
637
|
+
A `scrollable` List owns its overflow: its rows keep their natural height and
|
|
638
|
+
scroll rather than shrink. To bound one by an ancestor's `max-height` instead
|
|
639
|
+
of a definite height, make that ancestor a flex column and pass `flex` (not
|
|
640
|
+
`fill`): `<List flex scrollable>` takes at most the remaining height and
|
|
641
|
+
scrolls the rest, with no app-owned scrolling wrapper.
|
|
642
|
+
|
|
643
|
+
A scrollable List is also a keyboard-focusable scroller: Chromium gives it a
|
|
644
|
+
Tab stop when it holds no focusable rows, and a dialog may focus it first.
|
|
645
|
+
When it has focus it draws the theme focus ring inset by the ring width and
|
|
646
|
+
rounded with `--kui-radius-m`, so a rounded or `overflow: hidden` parent
|
|
647
|
+
never clips it. Do not style `.kui-list` focus yourself.
|
|
648
|
+
|
|
649
|
+
For long reading content, such as a reader view, pass `inset="document"`: 24px
|
|
650
|
+
block and 32px inline on all four sides, narrowing to 16px inline below 576px.
|
|
651
|
+
It replaces any `textInsets`/`controlInsets` on that List.
|
|
652
|
+
|
|
653
|
+
A List is transparent by default. Pass `surface="base"` (the page surface) or
|
|
654
|
+
`surface="raised"` to paint a solid background behind the stack and its
|
|
655
|
+
insets — for example a banner strip above a sunken work area, which otherwise
|
|
656
|
+
shows the lowered tint around the banner. Give that strip `controlInsets="tb"`
|
|
657
|
+
so the banner's own inline margin, not a second List inset, sets its edges. A
|
|
658
|
+
lowered region is a `SunkenPanel`, not a List surface.
|
|
659
|
+
|
|
613
660
|
Put route, test, or recipe metadata on the same root with `rootAttributes`,
|
|
614
661
|
which accepts safe `data-*` pairs and keeps each component's structural
|
|
615
662
|
attributes (`data-component`, `data-flex`, `data-fill`, alignment, inset, and
|
|
616
|
-
column markers) protected
|
|
663
|
+
column markers) protected. A `List` or `Row` root also takes `aria-*`
|
|
664
|
+
attributes and a structural `role` (`region`, `group`, `list`, `status`, a
|
|
665
|
+
landmark, …), so a labeled drop-target region or an `aria-busy` stack needs no
|
|
666
|
+
wrapper; widget roles are dropped, and a multi-select `List` keeps its own
|
|
667
|
+
grid role and name:
|
|
617
668
|
|
|
618
669
|
```tsx
|
|
619
670
|
<Row gap="none" fill rootAttributes={{ "data-recipe": "sidebar" }}>
|
package/docs/split-view.md
CHANGED
|
@@ -55,14 +55,32 @@ const selected = signal<string | null>(null);
|
|
|
55
55
|
|
|
56
56
|
- **Roomy** (`compact: false`): both panes show. With `resizable`, the list sits
|
|
57
57
|
in a `ResizableRegion` (wire it with `wireResizableRegions`); without it the
|
|
58
|
-
list takes a fixed
|
|
59
|
-
|
|
58
|
+
list takes a fixed width and the detail fills the rest. Set it with
|
|
59
|
+
`listWidth`: a number of CSS pixels (default 320), or `{ size, maxFraction }`
|
|
60
|
+
to cap the preferred size at that share of the SplitView's own width, so a
|
|
61
|
+
narrow container (a dialog, a small window) always leaves the detail in view —
|
|
62
|
+
`listWidth={{ size: 432, maxFraction: 0.5 }}` is 432px until the split is
|
|
63
|
+
narrower than 864px, then half of it. `listWidth` is for the fixed split; a
|
|
64
|
+
resizable list is sized by `resizable` (combining them throws). The
|
|
65
|
+
`--kui-split-view-list-width` token remains for theme-level defaults; the
|
|
66
|
+
prop wins over it.
|
|
60
67
|
- **Compact** (`compact: true`): the split collapses to a `NavStack`. The list is
|
|
61
68
|
the root; when `detailActive` is true the detail is pushed over it with an
|
|
62
69
|
automatic back control (wire it with `wireNavStack`, whose `onBack` clears the
|
|
63
70
|
app's selection). This is the portrait-tablet / handset presentation; as a
|
|
64
71
|
dialog the compact form is a full-screen or large partial-cover modal.
|
|
65
72
|
|
|
73
|
+
## Filling its container
|
|
74
|
+
|
|
75
|
+
A SplitView fills its container's block size: give the container a definite
|
|
76
|
+
height (a fixed or viewport-bounded `height`, a flex item that grows, a grid
|
|
77
|
+
row) and the split stretches to it, with each `Pane` owning its own scrolling.
|
|
78
|
+
That holds in a block box, a fixed-size native popover or dialog, a flex column
|
|
79
|
+
below a header, and a grid; no app-side `display: grid` /
|
|
80
|
+
`grid-template-rows: minmax(0, 1fr)` wrapper is needed. A container sized only
|
|
81
|
+
by `max-height` has no height to fill, so the split takes its content height;
|
|
82
|
+
give such a container a `height` instead.
|
|
83
|
+
|
|
66
84
|
## Configuring the list region and the compact stack
|
|
67
85
|
|
|
68
86
|
`resizable` forwards the list's `ResizableRegion` configuration alongside
|
package/docs/sunken-panel.md
CHANGED
|
@@ -88,6 +88,19 @@ See [Contextual transparency](./webawesome-theme.md#contextual-transparency).
|
|
|
88
88
|
Keep ordinary composition on these defaults; public properties are theming
|
|
89
89
|
escape hatches, not a reason to restyle each demo or nesting level.
|
|
90
90
|
|
|
91
|
+
Every sunken surface — SunkenPanel, `Pane appearance="sunken"`, sunken
|
|
92
|
+
Workbench regions and TabNavigator scenes, and Web Awesome
|
|
93
|
+
`appearance="sunken"` — paints `--kui-sunken-surface`: a fine, monochrome
|
|
94
|
+
grain (a seeded 100px tile at 4% maximum opacity) over the lowered color. The
|
|
95
|
+
tile is drawn once per page, at runtime, by the first sunken surface that
|
|
96
|
+
renders (nothing ships as an asset; server rendering paints the flat color
|
|
97
|
+
until the browser renders one). Translucent children such as a `ValueTable`
|
|
98
|
+
let the grain show through rather than adding their own. Set
|
|
99
|
+
`--kui-sunken-texture: none` at `:root` for a flat lowered surface, or to
|
|
100
|
+
another image; call `ensureSunkenTexture()` (exported from
|
|
101
|
+
`@kerfjs/ui/sunken-panel`) on a page whose only sunken surfaces are Web Awesome
|
|
102
|
+
elements.
|
|
103
|
+
|
|
91
104
|
The public root class is `.kui-sunken-panel`. Prefer the properties above over
|
|
92
105
|
styling descendants. The `square` shape deliberately overrides the radius
|
|
93
106
|
property with zero; use `rounded` when customizing the radius token.
|
package/docs/surface-scaffold.md
CHANGED
|
@@ -19,6 +19,24 @@ respectively, before the viewport width cap. Set `preferredWidth` to a branded
|
|
|
19
19
|
desktop preferences can share the same responsive dialog without changing its
|
|
20
20
|
resource tracks or preview aspect sizing.
|
|
21
21
|
|
|
22
|
+
### Sibling dialogs keep their identity
|
|
23
|
+
|
|
24
|
+
Every `DialogSurface` root has the same structure, so two sibling dialogs that
|
|
25
|
+
are rendered conditionally are matched by position when the page re-renders:
|
|
26
|
+
one open dialog's element (with its accessible name and open state) can be
|
|
27
|
+
reused for another, and Web Awesome events such as `wa-after-hide` fire on the
|
|
28
|
+
wrong dialog or not at all. Give each sibling a stable key on its root with
|
|
29
|
+
`rootAttributes`, instead of wrapping it in an app `div`:
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
<DialogSurface rootAttributes={{ "data-key": "project-setup" }}>
|
|
33
|
+
<wa-dialog label="Set up project">…</wa-dialog>
|
|
34
|
+
</DialogSurface>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`rootAttributes` takes `data-*` identity only; the surface's own configuration
|
|
38
|
+
attributes (`data-size`, `data-presentation`, …) stay protected.
|
|
39
|
+
|
|
22
40
|
### Modal viewport bounds
|
|
23
41
|
|
|
24
42
|
`viewportGutter` accepts a branded `CssLength` from `@kerfjs/ui/css-values`.
|
|
@@ -56,6 +74,24 @@ An application can configure device-class breakpoints when its phone policy
|
|
|
56
74
|
differs from the default. Prefer a typed cap such as `maxHeight={remify(640)}`
|
|
57
75
|
when the modal should stop growing before the viewport bound.
|
|
58
76
|
|
|
77
|
+
### Filling the dialog
|
|
78
|
+
|
|
79
|
+
`maxHeight` caps a modal that sizes to its content. A layout that fills the
|
|
80
|
+
dialog (a list-detail `SplitView`, a `Pane` with its own chrome and scroller)
|
|
81
|
+
needs a height to fill instead: set `height` to a branded length or
|
|
82
|
+
`"viewport"`. It is bounded exactly like `maxHeight` (the dynamic viewport minus
|
|
83
|
+
both gutters) and takes precedence over it. `bodyLayout="fill"` then gives the
|
|
84
|
+
body's whole height to its one child, which owns its own scrolling; the body
|
|
85
|
+
itself stops scrolling. Combine it with `bodyInset="none"`.
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
<DialogSurface size="large" height={remify(640)} viewportGutter={remify(8)} bodyInset="none" bodyLayout="fill">
|
|
89
|
+
<wa-dialog label="Repository status">
|
|
90
|
+
<SplitView id="repo-split" label="Changes" listWidth={{ size: 432, maxFraction: 0.5 }} list={list} detail={detail} />
|
|
91
|
+
</wa-dialog>
|
|
92
|
+
</DialogSurface>;
|
|
93
|
+
```
|
|
94
|
+
|
|
59
95
|
Treat a dialog body as a `List` by default. When its rows or sections own their
|
|
60
96
|
standard list geometry, set `bodyInset="none"` so the dialog does not add a
|
|
61
97
|
second inset. Bare prose is still a list child: wrap it in `ListInsetText` so its
|
|
@@ -64,6 +100,35 @@ padding and aligns with bordered siblings. Reserve `compact` or `comfortable`
|
|
|
64
100
|
body insets for exceptional content that does not already have list/content-item
|
|
65
101
|
geometry.
|
|
66
102
|
|
|
103
|
+
## Non-modal dialogs: `PopoverDialogSurface`
|
|
104
|
+
|
|
105
|
+
`wa-dialog` is modal: it makes the page inert until it closes. When a dialog
|
|
106
|
+
should leave the page interactive and close on Escape or a press outside (a
|
|
107
|
+
status panel, a quick inspector), render `PopoverDialogSurface` instead of a
|
|
108
|
+
hand-built popover with application chrome CSS. It is a native
|
|
109
|
+
`popover="auto"` section with `role="dialog"` that owns Kerf's dialog chrome
|
|
110
|
+
(raised surface, border, large radius and shadow, and a backdrop) and the
|
|
111
|
+
same geometry props as a modal `DialogSurface`: `size`, `preferredWidth`,
|
|
112
|
+
`viewportGutter` (16px by default), `height` / `maxHeight`, and `bodyLayout`.
|
|
113
|
+
Name it with `label` or `labelledBy`.
|
|
114
|
+
|
|
115
|
+
Open it with a control's `popoverTarget` (or `showPopover()`); the browser
|
|
116
|
+
places it centered in the top layer, light-dismisses it, and restores nothing
|
|
117
|
+
else, so move focus into it with `autofocus` on its first control when that
|
|
118
|
+
matters. A closed surface stays hidden; only the open one lays out.
|
|
119
|
+
`presentation="embedded"` renders the same surface in flow, with no top
|
|
120
|
+
layer and never wider than its container, for a catalog specimen or an inline
|
|
121
|
+
preview.
|
|
122
|
+
|
|
123
|
+
```tsx
|
|
124
|
+
<button type="button" popoverTarget="repository-status">Repository status</button>
|
|
125
|
+
<PopoverDialogSurface id="repository-status" label="Repository status" preferredWidth={remify(1024)} height={remify(640)} viewportGutter={remify(8)} bodyLayout="fill">
|
|
126
|
+
<SplitView id="repo-split" label="Changes" list={list} detail={detail} />
|
|
127
|
+
</PopoverDialogSurface>;
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Use `DialogSurface` with `wa-dialog` whenever the task must block the page.
|
|
131
|
+
|
|
67
132
|
Wrap one `PopupMenu` (or another single `wa-dropdown`) with `PopupSurface`. `inset="list-zero"` removes menu
|
|
68
133
|
padding for a child that already owns row insets, `compact` uses 4px, and
|
|
69
134
|
`standard` uses the shared 8px surface inset. Keep the dropdown trigger named and
|
|
@@ -71,4 +136,4 @@ preserve `data-morph-skip-children` when its upgraded light-DOM items must retai
|
|
|
71
136
|
identity across Kerf rerenders. Import `@kerfjs/ui/popup-menu/register` once for
|
|
72
137
|
the focus handoff fix when wrapping a raw `wa-dropdown`.
|
|
73
138
|
|
|
74
|
-
Import `@kerfjs/ui/surface-scaffold/register` once when using `DialogSurface`: it registers `wa-dialog` and repairs Web Awesome 3.12 native dialog names before the first modal opening. Headed dialogs reference the rendered title, including live slotted labels; headerless dialogs use the public `label`. Explicit host `aria-label` and pre-existing native names are preserved. Geometry-only markup stays CSS-free and does not register Web Awesome implicitly.
|
|
139
|
+
Import `@kerfjs/ui/surface-scaffold/register` once when using `DialogSurface`: it registers `wa-dialog` and repairs Web Awesome 3.12 native dialog names before the first modal opening. Headed dialogs reference the rendered title, including live slotted labels; headerless dialogs use the public `label`. Explicit host `aria-label` and pre-existing native names are preserved. A host that is itself an explicit dialog (`role="dialog"` or `"alertdialog"` with its own name) keeps that name alone: the native panel is left unnamed, so one dialog carries the name. Geometry-only markup stays CSS-free and does not register Web Awesome implicitly.
|
package/docs/ux-demo.md
CHANGED
|
@@ -21,6 +21,7 @@ Each `?component=recipe-*` route uses public package primitives, real wiring,
|
|
|
21
21
|
deterministic state, and semantic layout owners from the [recipe guide](./recipes.md).
|
|
22
22
|
|
|
23
23
|
- It imports public component subpaths, exercising their browser-selected reachable CSS rather than a catalog-only style path.
|
|
24
|
+
- The `ListActionRow` route's Run tests row composes a trailing `PopupMenu` (`trailingMenu`) with Edit and Delete commands, revealed on interaction, that also opens at the pointer when the row's primary button is right-clicked.
|
|
24
25
|
- The `ListActionRow` route demonstrates sibling primary/trailing native controls, independent disabled states, controlled selection, first-line leading-icon alignment for wrapped labels, and an application-owned native popover relationship without nesting controls. The `ListItem` route demonstrates the same multiline leading-icon anchor alongside its single-control navigation contract.
|
|
25
26
|
- The `PopupMenu` route's context example opens one app-owned menu either at the row's right-click point or below its adjacent, keyboard-operable Demand actions button. The Nested decisions example shows the automatic phone-width submenu placement above or below its parent list, with native ArrowLeft return, Escape dismissal, and child selection.
|
|
26
27
|
- The `AppTab` and `TabBar` routes are focused component specimens: AppTab shows its selected, compact, segmented, icon-only, truncation, placeholder, pending, metadata, and close-icon axes inside the required tablist context; TabBar shows its rail, segmented, inspector, allocation, placement, and accessory-zone axes, including an adjacent action plus a separately pinned end action whose tabs overflow at narrow widths, without application readouts. The pinned leading-tab specimen uses native strip scrolling so momentum and the final tab's end position remain natural; `snapTabs` stays an opt-in for applications that want whole-tab settling. The separate `Application tabs` composition route demonstrates controlled selection, matching panel content, overflow, adding (a new tab opens `pending` with a spinner and stays selectable while its panel shows a `Skeleton` heading until a simulated load completes), closing, keyboard/pointer reordering, and application-owned ordering. The `ResizableRegion` route likewise replaces only the decorative handle glyph while retaining separator semantics and shared wiring.
|
package/docs/webawesome-theme.md
CHANGED
|
@@ -131,8 +131,12 @@ tiers:
|
|
|
131
131
|
trigger and the 8px surface inset on the body, while framed Accordion items
|
|
132
132
|
use the 16px container inset for both regions.
|
|
133
133
|
- `appearance="sunken"` is a Kerf theme extension for Accordion, Card, and
|
|
134
|
-
Details. It removes raised chrome, paints the
|
|
135
|
-
|
|
134
|
+
Details. It removes raised chrome, paints the shared sunken surface
|
|
135
|
+
(`--kui-sunken-surface`: the lowered semantic color with the same fine grain
|
|
136
|
+
texture as every Kerf sunken surface), and uses the shared rounded-rectangle
|
|
137
|
+
radius. The texture is generated by the first Kerf sunken component that
|
|
138
|
+
renders; a page with only Web Awesome sunken surfaces calls
|
|
139
|
+
`ensureSunkenTexture()` once. Override
|
|
136
140
|
`--kui-wa-sunken-background` or `--kui-wa-sunken-radius` on an instance or
|
|
137
141
|
containing scope when that surface needs different tokens.
|
|
138
142
|
- `--kui-wa-container-inset` defaults to the 16px homogeneous-group step. Tab
|