@kerfjs/ui 5.0.0-beta.75 → 5.0.0-beta.77
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 +41 -1
- package/ai/component-catalog.json +235 -30
- package/ai/component-composition.json +131 -14
- package/ai/components/README.md +1 -1
- package/ai/components/badge.md +1 -1
- package/ai/components/chip.md +1 -1
- package/ai/components/content-item.md +8 -5
- package/ai/components/document-baseline.md +2 -2
- package/ai/components/grid.md +5 -3
- package/ai/components/lucide-icon.md +11 -0
- package/ai/components/nav-stack.md +1 -0
- package/ai/components/select.md +1 -0
- package/ai/components/split-view.md +1 -0
- package/ai/components/text.md +4 -2
- package/ai/components/toolbar-control-group.md +20 -3
- package/ai/components/toolbar-text.md +19 -4
- package/ai/components/toolbar.md +10 -4
- package/ai/public-api-signatures-v1.md +141 -66
- package/ai/skill.md +58 -5
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/index.mjs +11 -1
- package/dist/app-tab.js +1 -1
- package/dist/badge.d.ts +5 -3
- package/dist/badge.js +1 -1
- package/dist/browser/catalog.js +7 -7
- package/dist/browser/collapsible-panel.js +3 -3
- package/dist/browser/list-header.js +1 -1
- package/dist/browser/nav-stack.js +1 -1
- package/dist/browser/select.js +1 -1
- package/dist/browser/split-view.js +1 -1
- package/dist/browser/workbench.js +4 -4
- package/dist/catalog-resources.d.ts +6 -6
- package/dist/catalog-resources.js +1 -1
- package/dist/catalog-resources.js.map +1 -1
- package/dist/catalog.d.ts +5 -5
- package/dist/catalog.js +13 -13
- package/dist/catalog.js.map +1 -1
- package/dist/chip.d.ts +3 -2
- package/dist/chip.js +1 -1
- package/dist/{chunk-SVLDRGPJ.js → chunk-3RE2JMZU.js} +7 -3
- package/dist/chunk-3RE2JMZU.js.map +1 -0
- package/dist/{chunk-YDGNU2OD.js → chunk-4Y4L5YEI.js} +7 -2
- package/dist/chunk-4Y4L5YEI.js.map +1 -0
- package/dist/{chunk-V4WLBOVJ.js → chunk-5BZBIRQG.js} +4 -4
- package/dist/chunk-5BZBIRQG.js.map +1 -0
- package/dist/{chunk-SX7FJXPJ.js → chunk-5D3WDMIK.js} +4 -4
- package/dist/chunk-5D3WDMIK.js.map +1 -0
- package/dist/{chunk-O5GM2JAM.js → chunk-6VQPLV3O.js} +9 -9
- package/dist/chunk-6VQPLV3O.js.map +1 -0
- package/dist/{chunk-JA4J7Y4C.js → chunk-75I3SNUJ.js} +2 -2
- package/dist/chunk-75I3SNUJ.js.map +1 -0
- package/dist/{chunk-K47P7QZC.js → chunk-7QQ3HE47.js} +2 -2
- package/dist/chunk-7QQ3HE47.js.map +1 -0
- package/dist/{chunk-5I7QGQVT.js → chunk-AN5IWMTM.js} +2 -2
- package/dist/chunk-AN5IWMTM.js.map +1 -0
- package/dist/{chunk-3BYFWTP3.js → chunk-AOAW55JN.js} +2 -2
- package/dist/chunk-AOAW55JN.js.map +1 -0
- package/dist/{chunk-5UGLKFBF.js → chunk-ARZ4RSQO.js} +5 -6
- package/dist/chunk-ARZ4RSQO.js.map +1 -0
- package/dist/{chunk-TCXDZNCX.js → chunk-BJLXE56E.js} +6 -6
- package/dist/chunk-BJLXE56E.js.map +1 -0
- package/dist/{chunk-RGS4WX2M.js → chunk-BYHGRKC3.js} +2 -2
- package/dist/chunk-BYHGRKC3.js.map +1 -0
- package/dist/{chunk-ZLKZFKLW.js → chunk-CEJ5FK6G.js} +2 -2
- package/dist/chunk-CEJ5FK6G.js.map +1 -0
- package/dist/{chunk-SMZGAPCU.js → chunk-DQDTZE4W.js} +2 -2
- package/dist/chunk-DQDTZE4W.js.map +1 -0
- package/dist/{chunk-JGIV6ZDA.js → chunk-EFDCALR3.js} +2 -2
- package/dist/chunk-EFDCALR3.js.map +1 -0
- package/dist/{chunk-FKPKGP2H.js → chunk-G4VKQP7B.js} +2 -2
- package/dist/chunk-G4VKQP7B.js.map +1 -0
- package/dist/{chunk-DPAUKNB6.js → chunk-GS2QD3N7.js} +3 -3
- package/dist/chunk-GS2QD3N7.js.map +1 -0
- package/dist/{chunk-SLWCCHNP.js → chunk-H45DAZBL.js} +2 -2
- package/dist/chunk-H45DAZBL.js.map +1 -0
- package/dist/{chunk-DA3HS64I.js → chunk-H7ZJEI3H.js} +3 -3
- package/dist/chunk-H7ZJEI3H.js.map +1 -0
- package/dist/{chunk-V4GAQ74C.js → chunk-HFLGWMG3.js} +4 -4
- package/dist/chunk-HFLGWMG3.js.map +1 -0
- package/dist/{chunk-HXTAPIHQ.js → chunk-HFQDSSED.js} +6 -6
- package/dist/chunk-HFQDSSED.js.map +1 -0
- package/dist/{chunk-WF75U3V4.js → chunk-HPREYDKV.js} +2 -2
- package/dist/chunk-HPREYDKV.js.map +1 -0
- package/dist/{chunk-VA5TN5PR.js → chunk-I4SDIMFA.js} +2 -2
- package/dist/chunk-I4SDIMFA.js.map +1 -0
- package/dist/{chunk-4SQK27MR.js → chunk-IM3GKYOG.js} +2 -2
- package/dist/chunk-IM3GKYOG.js.map +1 -0
- package/dist/{chunk-ALGYHYXP.js → chunk-J3AWE5I4.js} +2 -2
- package/dist/chunk-J3AWE5I4.js.map +1 -0
- package/dist/{chunk-OXO2QJWV.js → chunk-JOR5LGYE.js} +2 -2
- package/dist/chunk-JOR5LGYE.js.map +1 -0
- package/dist/{chunk-SRSJO5QE.js → chunk-LAZLBC2Q.js} +2 -2
- package/dist/chunk-LAZLBC2Q.js.map +1 -0
- package/dist/{chunk-RFGW735Q.js → chunk-LRAIS3YB.js} +2 -2
- package/dist/chunk-LRAIS3YB.js.map +1 -0
- package/dist/{chunk-PL26TKNK.js → chunk-M6BWQMQY.js} +8 -8
- package/dist/chunk-M6BWQMQY.js.map +1 -0
- package/dist/{chunk-AYUHMAI6.js → chunk-MXNIVEVL.js} +2 -2
- package/dist/chunk-MXNIVEVL.js.map +1 -0
- package/dist/{chunk-4NG4Y2Q6.js → chunk-NJZMR7HM.js} +2 -2
- package/dist/chunk-NJZMR7HM.js.map +1 -0
- package/dist/{chunk-DG6G5EPF.js → chunk-NMWDHZVM.js} +2 -2
- package/dist/chunk-NMWDHZVM.js.map +1 -0
- package/dist/{chunk-X5QSICJ3.js → chunk-NS2TBYM4.js} +2 -2
- package/dist/chunk-NS2TBYM4.js.map +1 -0
- package/dist/{chunk-5TTZPGUY.js → chunk-NVKRZ5DI.js} +6 -6
- package/dist/chunk-NVKRZ5DI.js.map +1 -0
- package/dist/{chunk-4FEVHE7C.js → chunk-NVRJ7C3W.js} +4 -4
- package/dist/chunk-NVRJ7C3W.js.map +1 -0
- package/dist/{chunk-BFPBS5Y4.js → chunk-O27D24CA.js} +2 -2
- package/dist/chunk-O27D24CA.js.map +1 -0
- package/dist/{chunk-DUBUXJA3.js → chunk-PQQQXJGV.js} +4 -2
- package/dist/chunk-PQQQXJGV.js.map +1 -0
- package/dist/{chunk-6DFDTWGG.js → chunk-QYXKMLHO.js} +2 -2
- package/dist/chunk-QYXKMLHO.js.map +1 -0
- package/dist/{chunk-TOICTHR2.js → chunk-RRCD3A6G.js} +14 -6
- package/dist/chunk-RRCD3A6G.js.map +1 -0
- package/dist/{chunk-I3Q7KKYM.js → chunk-S3ECMF23.js} +2 -2
- package/dist/chunk-S3ECMF23.js.map +1 -0
- package/dist/{chunk-PSHUSWQH.js → chunk-S4ZGTDSG.js} +2 -2
- package/dist/chunk-S4ZGTDSG.js.map +1 -0
- package/dist/{chunk-HKVJ5MW3.js → chunk-VHXHLZ6R.js} +12 -3
- package/dist/chunk-VHXHLZ6R.js.map +1 -0
- package/dist/{chunk-NPNSKX3K.js → chunk-VLPE6OPN.js} +2 -2
- package/dist/chunk-VLPE6OPN.js.map +1 -0
- package/dist/{chunk-NCSWXG7G.js → chunk-VLQUXZKA.js} +9 -3
- package/dist/chunk-VLQUXZKA.js.map +1 -0
- package/dist/{chunk-EHIMH4J7.js → chunk-VR7MWD2X.js} +10 -4
- package/dist/chunk-VR7MWD2X.js.map +1 -0
- package/dist/chunk-WJN3V2H5.js +256 -0
- package/dist/chunk-WJN3V2H5.js.map +1 -0
- package/dist/{chunk-NN6GYOA2.js → chunk-XIZRXI7N.js} +2 -2
- package/dist/chunk-XIZRXI7N.js.map +1 -0
- package/dist/{chunk-TDN5EE3S.js → chunk-Y6KT7ZTR.js} +2 -2
- package/dist/chunk-Y6KT7ZTR.js.map +1 -0
- package/dist/{chunk-LHSUPNSE.js → chunk-YLJ6X3AC.js} +2 -2
- package/dist/chunk-YLJ6X3AC.js.map +1 -0
- package/dist/{chunk-OYQIONQF.js → chunk-Z4EPMX25.js} +5 -5
- package/dist/chunk-Z4EPMX25.js.map +1 -0
- package/dist/{chunk-GRHJQWV2.js → chunk-Z6PE5T7N.js} +6 -6
- package/dist/chunk-Z6PE5T7N.js.map +1 -0
- package/dist/collapsible-panel.d.ts +6 -6
- package/dist/collapsible-panel.js +3 -3
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/content-item.d.ts +13 -2
- package/dist/content-item.js +1 -1
- package/dist/css-values.js +1 -1
- package/dist/device-class.js +1 -1
- package/dist/device-class.js.map +1 -1
- package/dist/disclosure-arrow.js +1 -1
- package/dist/empty-state.js +1 -1
- package/dist/floating-toolbar.d.ts +1 -1
- package/dist/floating-toolbar.js +1 -1
- package/dist/grid.d.ts +10 -3
- package/dist/grid.js +1 -1
- package/dist/help-tags-register.js +1 -1
- package/dist/help-tags-register.js.map +1 -1
- package/dist/index.d.ts +28 -26
- package/dist/index.js +41 -40
- package/dist/list-action-row.js +1 -1
- package/dist/list-header.d.ts +1 -0
- package/dist/list-header.js +1 -1
- package/dist/list-inset-control.js +1 -1
- package/dist/list-inset-text.js +1 -1
- package/dist/list-item.js +1 -1
- package/dist/list.d.ts +2 -2
- package/dist/list.js +1 -1
- package/dist/loading-spinner.d.ts +4 -2
- package/dist/loading-spinner.js +1 -1
- package/dist/lucide-icon.d.ts +3 -1
- package/dist/lucide-icon.js +1 -1
- package/dist/nav-stack.d.ts +2 -1
- package/dist/nav-stack.js +1 -1
- package/dist/pane.js +1 -1
- package/dist/popup-menu-register.js +7 -7
- package/dist/popup-menu-register.js.map +1 -1
- package/dist/popup-menu.js +1 -1
- package/dist/resizable-region.d.ts +1 -1
- package/dist/resizable-region.js +1 -1
- package/dist/row.d.ts +2 -2
- package/dist/row.js +1 -1
- package/dist/segmented-control.js +1 -1
- package/dist/select-register.js +9 -6
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +2 -1
- package/dist/select.js +1 -1
- package/dist/semantic-tone-CdW013KF.d.ts +4 -0
- package/dist/skeleton.js +1 -1
- package/dist/spacer.js +1 -1
- package/dist/split-view.d.ts +2 -2
- package/dist/split-view.js +2 -2
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.d.ts +5 -3
- package/dist/state-banner.js +1 -1
- package/dist/styles/badge.css +1 -1
- package/dist/styles/chip.css +1 -1
- package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
- package/dist/styles/components/actions/popup-menu/popup-menu.css +285 -0
- package/dist/styles/components/actions/toolbar/toolbar.css +424 -0
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +841 -0
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +164 -0
- package/dist/styles/components/collections/list/list.css +133 -0
- package/dist/styles/components/collections/list-action-row/list-action-row.css +258 -0
- package/dist/styles/components/collections/list-header/list-header.css +229 -0
- package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
- package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
- package/dist/styles/components/collections/list-item/list-item.css +255 -0
- package/dist/styles/components/data-display/value-table/value-table.css +105 -0
- package/dist/styles/components/feedback/badge/badge.css +118 -0
- package/dist/styles/components/feedback/chip/chip.css +138 -0
- package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
- package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
- package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
- package/dist/styles/components/feedback/state-banner/state-banner.css +248 -0
- package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
- package/dist/styles/components/forms/select/select.css +454 -0
- package/dist/styles/components/forms/token-search-field/token-search-field.css +381 -0
- package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +575 -0
- package/dist/styles/components/layout/grid/grid.css +85 -0
- package/dist/styles/components/layout/pane/pane.css +263 -0
- package/dist/styles/components/layout/resizable-region/resizable-region.css +545 -0
- package/dist/styles/components/layout/row/row.css +111 -0
- package/dist/styles/components/layout/spacer/spacer.css +11 -0
- package/dist/styles/components/layout/split-view/split-view.css +146 -0
- package/dist/styles/components/layout/workbench/workbench.css +1067 -0
- package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
- package/dist/styles/components/navigation/app-tab/app-tab.css +376 -0
- package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +23 -0
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +248 -0
- package/dist/styles/components/navigation/tab-bar/tab-bar.css +183 -0
- package/dist/styles/components/navigation/tab-scaffold/tab-scaffold.css +207 -0
- package/dist/styles/components/surfaces/content-item/content-item.css +120 -0
- package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +29 -0
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +56 -0
- package/dist/styles/components/typography/text/text.css +158 -0
- package/dist/styles/content-item.css +46 -1
- package/dist/styles/document.css +10 -0
- package/dist/styles/foundation.css +9 -6
- package/dist/styles/grid.css +50 -0
- package/dist/styles/lucide-icon.css +4 -0
- package/dist/styles/nav-stack.css +11 -0
- package/dist/styles/text.css +19 -0
- package/dist/styles/toolbar-control-group.css +51 -0
- package/dist/styles/toolbar-text.css +11 -0
- package/dist/styles/toolbar.css +32 -0
- package/dist/styles/webawesome.css +23 -6
- package/dist/sunken-panel.d.ts +1 -1
- package/dist/sunken-panel.js +1 -1
- package/dist/surface-scaffold.js +1 -1
- package/dist/tab-bar.js +1 -1
- package/dist/tab-scaffold.d.ts +1 -1
- package/dist/tab-scaffold.js +1 -1
- package/dist/tab-scaffold.js.map +1 -1
- package/dist/text.d.ts +16 -9
- package/dist/text.js +1 -1
- package/dist/token-search-field.d.ts +1 -1
- package/dist/token-search-field.js +1 -1
- package/dist/{token-search-field-CVGwDn2y.d.ts → token-search-model-DTcTXWMS.d.ts} +54 -54
- package/dist/token-search-model.d.ts +1 -1
- package/dist/token-search-model.js +1 -1
- package/dist/toolbar-control-group.d.ts +14 -2
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar-text.d.ts +10 -2
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +1 -1
- package/dist/toolbar.js +1 -1
- package/dist/value-table.js +1 -1
- package/dist/wire-catalog.js +2 -2
- package/dist/wire-catalog.js.map +1 -1
- package/dist/wire-content-items.js +1 -1
- package/dist/wire-content-items.js.map +1 -1
- package/dist/wire-nav-stack.js +59 -23
- package/dist/wire-nav-stack.js.map +1 -1
- package/dist/wire-resizable-regions.js +1 -1
- package/dist/wire-scroll-dividers.js +1 -1
- package/dist/wire-sidebar.js +1 -1
- package/dist/wire-sidebar.js.map +1 -1
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-tab-scaffold.js +1 -1
- package/dist/wire-tab-scaffold.js.map +1 -1
- package/dist/wire-token-search-fields.d.ts +1 -1
- package/dist/wire-token-search-fields.js +1 -1
- package/dist/wire-toolbar-visibility.d.ts +13 -0
- package/dist/wire-toolbar-visibility.js +3 -0
- package/dist/wire-toolbar-visibility.js.map +1 -0
- package/dist/wire-workbench.js +1 -1
- package/dist/workbench.d.ts +3 -3
- package/dist/workbench.js +1 -1
- package/docs/accessibility.md +15 -0
- package/docs/collapsible-panel.md +5 -1
- package/docs/component-contract.md +56 -7
- package/docs/component-selection.md +73 -5
- package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
- package/docs/design/templates/empty-state/filtered.svg +1 -1
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
- package/docs/design/templates/empty-state/with-action.svg +1 -1
- package/docs/design/templates/empty-state-dark.svg +1 -1
- package/docs/design/templates/empty-state.svg +1 -1
- package/docs/design/templates/list/stack-dark.svg +1 -1
- package/docs/design/templates/list/stack.svg +1 -1
- package/docs/design/templates/list-dark.svg +1 -1
- package/docs/design/templates/list-header/action-dark.svg +1 -1
- package/docs/design/templates/list-header/action.svg +1 -1
- package/docs/design/templates/list-header/count-dark.svg +1 -1
- package/docs/design/templates/list-header/count.svg +1 -1
- package/docs/design/templates/list-header/inline-action-dark.svg +1 -1
- package/docs/design/templates/list-header/inline-action.svg +1 -1
- package/docs/design/templates/list-header/size-l-dark.svg +1 -1
- package/docs/design/templates/list-header/size-l.svg +1 -1
- package/docs/design/templates/list-header/size-m-dark.svg +1 -1
- package/docs/design/templates/list-header/size-m.svg +1 -1
- package/docs/design/templates/list-header/size-xl-dark.svg +1 -1
- package/docs/design/templates/list-header/size-xl.svg +1 -1
- package/docs/design/templates/list-header/size-xs-dark.svg +1 -1
- package/docs/design/templates/list-header/size-xs.svg +1 -1
- package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
- package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
- package/docs/design/templates/list-header-dark.svg +1 -1
- package/docs/design/templates/list-header.svg +1 -1
- package/docs/design/templates/list.svg +1 -1
- package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
- package/docs/design/templates/segmented-control/equal.svg +1 -1
- package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
- package/docs/design/templates/segmented-control/pill-small.svg +1 -1
- package/docs/design/templates/segmented-control-dark.svg +1 -1
- package/docs/design/templates/segmented-control.svg +1 -1
- package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
- package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
- package/docs/design/templates/tab-bar-dark.svg +1 -1
- package/docs/design/templates/tab-bar.svg +1 -1
- package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
- package/docs/design/templates/token-search-field/empty.svg +1 -1
- package/docs/design/templates/token-search-field/tokens-dark.svg +1 -1
- package/docs/design/templates/token-search-field/tokens.svg +1 -1
- package/docs/design/templates/token-search-field-dark.svg +1 -1
- package/docs/design/templates/token-search-field.svg +1 -1
- package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
- package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
- package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
- package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
- package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
- package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
- package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
- package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
- package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
- package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
- package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
- package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group.svg +1 -1
- package/docs/design/templates/toolbar-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
- package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/default.svg +1 -1
- package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/large.svg +1 -1
- package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/small.svg +1 -1
- package/docs/design/templates/toolbar-text-dark.svg +1 -1
- package/docs/design/templates/toolbar-text.svg +1 -1
- package/docs/design/templates/toolbar.svg +1 -1
- package/docs/design/templates/value-table/details-dark.svg +1 -1
- package/docs/design/templates/value-table/details.svg +1 -1
- package/docs/design/templates/value-table-dark.svg +1 -1
- package/docs/design/templates/value-table.svg +1 -1
- package/docs/design/templates.md +2 -0
- package/docs/document-baseline.md +4 -0
- package/docs/layout.md +23 -6
- package/docs/nav-stack.md +5 -1
- package/docs/sunken-panel.md +7 -7
- package/docs/ui-analyzer.md +12 -1
- package/docs/ui-doctor.md +12 -2
- package/docs/webawesome-theme.md +29 -59
- package/doctor/index.mjs +39 -30
- package/llms.txt +42 -1
- package/package.json +7 -2
- package/dist/chunk-3BYFWTP3.js.map +0 -1
- package/dist/chunk-4FEVHE7C.js.map +0 -1
- package/dist/chunk-4NG4Y2Q6.js.map +0 -1
- package/dist/chunk-4SQK27MR.js.map +0 -1
- package/dist/chunk-5I7QGQVT.js.map +0 -1
- package/dist/chunk-5TTZPGUY.js.map +0 -1
- package/dist/chunk-5UGLKFBF.js.map +0 -1
- package/dist/chunk-6DFDTWGG.js.map +0 -1
- package/dist/chunk-ALGYHYXP.js.map +0 -1
- package/dist/chunk-AYUHMAI6.js.map +0 -1
- package/dist/chunk-BFPBS5Y4.js.map +0 -1
- package/dist/chunk-DA3HS64I.js.map +0 -1
- package/dist/chunk-DG6G5EPF.js.map +0 -1
- package/dist/chunk-DPAUKNB6.js.map +0 -1
- package/dist/chunk-DUBUXJA3.js.map +0 -1
- package/dist/chunk-EHIMH4J7.js.map +0 -1
- package/dist/chunk-FKPKGP2H.js.map +0 -1
- package/dist/chunk-GRHJQWV2.js.map +0 -1
- package/dist/chunk-HKVJ5MW3.js.map +0 -1
- package/dist/chunk-HXTAPIHQ.js.map +0 -1
- package/dist/chunk-I3Q7KKYM.js.map +0 -1
- package/dist/chunk-JA4J7Y4C.js.map +0 -1
- package/dist/chunk-JGIV6ZDA.js.map +0 -1
- package/dist/chunk-K47P7QZC.js.map +0 -1
- package/dist/chunk-LHSUPNSE.js.map +0 -1
- package/dist/chunk-NCSWXG7G.js.map +0 -1
- package/dist/chunk-NN6GYOA2.js.map +0 -1
- package/dist/chunk-NPNSKX3K.js.map +0 -1
- package/dist/chunk-O5GM2JAM.js.map +0 -1
- package/dist/chunk-OXO2QJWV.js.map +0 -1
- package/dist/chunk-OYQIONQF.js.map +0 -1
- package/dist/chunk-PL26TKNK.js.map +0 -1
- package/dist/chunk-PSHUSWQH.js.map +0 -1
- package/dist/chunk-RFGW735Q.js.map +0 -1
- package/dist/chunk-RGS4WX2M.js.map +0 -1
- package/dist/chunk-SLWCCHNP.js.map +0 -1
- package/dist/chunk-SMZGAPCU.js.map +0 -1
- package/dist/chunk-SRSJO5QE.js.map +0 -1
- package/dist/chunk-SVLDRGPJ.js.map +0 -1
- package/dist/chunk-SX7FJXPJ.js.map +0 -1
- package/dist/chunk-TCXDZNCX.js.map +0 -1
- package/dist/chunk-TDN5EE3S.js.map +0 -1
- package/dist/chunk-TOICTHR2.js.map +0 -1
- package/dist/chunk-V4GAQ74C.js.map +0 -1
- package/dist/chunk-V4WLBOVJ.js.map +0 -1
- package/dist/chunk-VA5TN5PR.js.map +0 -1
- package/dist/chunk-WF75U3V4.js.map +0 -1
- package/dist/chunk-X5QSICJ3.js.map +0 -1
- package/dist/chunk-YDGNU2OD.js.map +0 -1
- package/dist/chunk-ZLKZFKLW.js.map +0 -1
- package/dist/{panel-toolbar-DDKh4uKd.d.ts → panel-toolbar-CL9tYOkh.d.ts} +1 -1
- package/dist/{types-BuHELdXR.d.ts → types-C9BubXfz.d.ts} +1 -1
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
`@kerfjs/ui` components are plain functions that return Kerf `SafeHtml`. They have no component instance or lifecycle.
|
|
4
4
|
|
|
5
|
+
### Shared semantic tones
|
|
6
|
+
|
|
7
|
+
`SemanticTone` is the shared color-role type for `Badge`, `Chip`, `StateBanner`,
|
|
8
|
+
and semantic `ContentItem` appearances: `neutral`, `info`, `pop`, `success`,
|
|
9
|
+
`warning`, and `danger`. Import it as a type from `@kerfjs/ui`,
|
|
10
|
+
`@kerfjs/ui/badge`, `@kerfjs/ui/state-banner`, or `@kerfjs/ui/content-item`.
|
|
11
|
+
Use `info` for the role backed by the existing `--kui-color-brand-*` tokens.
|
|
12
|
+
Migrate Badge/Chip `tone="brand"` to `tone="info"`; `BadgeTone` and
|
|
13
|
+
`StateBannerTone` remain deprecated aliases of `SemanticTone`.
|
|
14
|
+
|
|
5
15
|
## Selection boundary
|
|
6
16
|
|
|
7
17
|
Begin with the [need-first component matrix](./component-selection.md). Reuse a
|
|
@@ -271,11 +281,11 @@ against the combined Kerf and consumer catalogs; do not duplicate a Kerf id.
|
|
|
271
281
|
For Doctor's opt-in component ownership mode, add `styleSources` with the CSS
|
|
272
282
|
paths each entry owns, relative to the consumer package root.
|
|
273
283
|
|
|
274
|
-
- Components own semantic markup, stable anatomy, documented variants, ARIA projection, and package CSS hooks.
|
|
284
|
+
- Components own semantic markup, stable anatomy, documented variants, ARIA projection, and package CSS hooks. They may render and style raw HTML or Web Awesome implementation elements they create and control. A nested Kerf or application component remains its own owner even when the parent renders it.
|
|
275
285
|
- Applications own signals/stores, product copy, domain-state mapping, persistence, routing, permissions, and transport.
|
|
276
286
|
- Actions are `data-action` strings. Wire them at a stable root with `delegate()` or `delegateActions()` and retain the disposer.
|
|
277
287
|
- A reusable component never owns per-instance mutable module state.
|
|
278
|
-
- Consumers configure presentation through component props and documented `--kui-*` semantic tokens. Foundation tokens provide opinionated neutral, brand/info, non-status pop, success, warning, and danger fill/border/foreground roles. Application stylesheets must not select package component classes or descendants. If genuinely new structure needs CSS, encapsulate that structure and its stylesheet in an application-owned component; configure any nested Kerf components through their public APIs.
|
|
288
|
+
- Consumers configure presentation through component props and documented `--kui-*` semantic tokens. Foundation tokens provide opinionated neutral, brand/info, non-status pop, success, warning, and danger fill/border/foreground roles. Application stylesheets must not select package component classes or descendants. If genuinely new structure needs CSS, encapsulate that structure and its stylesheet in an application-owned component; configure any nested Kerf components through their public APIs. A thin composition that only connects other components should normally have no stylesheet. It may style only raw elements or layout it owns, never its component children.
|
|
279
289
|
|
|
280
290
|
`ListItem.rootAttributes`, `ListActionRow.rootAttributes`,
|
|
281
291
|
`ListHeader.rootAttributes`, `AppTab.rootAttributes`,
|
|
@@ -307,6 +317,8 @@ Both row components align a leading icon with the first label line when
|
|
|
307
317
|
`multiline` allows the label to wrap; additional lines extend below that fixed
|
|
308
318
|
visual anchor.
|
|
309
319
|
|
|
320
|
+
`ToolbarControlGroup.tileTone` selects `neutral`, `brand`, `success`, `warning`, or `danger` quiet fill, matching quiet border, and on-quiet foreground for a non-interactive icon tile. Compose a contained `single` group whose only child is a direct decorative LucideIcon (`aria-hidden="true"`). Omission preserves the normal group palette. The prop does not recolor interactive, mixed, multi-control, or borderless groups; keep real actions in controls with their existing focus/hover/pressed treatments.
|
|
321
|
+
|
|
310
322
|
### Public CSS anatomy
|
|
311
323
|
|
|
312
324
|
The `publicClasses` array on each entry in
|
|
@@ -336,9 +348,10 @@ elements keyed on a child's state, naming the child by class inside `:has()`
|
|
|
336
348
|
holds compact tabs), and it keeps styling raw native and raw Web
|
|
337
349
|
Awesome children no kerf component owns, excluding kerf children by class
|
|
338
350
|
(`wa-dropdown:not(.kui-popup-menu)`). `npm run check:css-ownership` enforces
|
|
339
|
-
this in every component stylesheet (a
|
|
340
|
-
component), deriving the component names,
|
|
341
|
-
renders, and its composed children from
|
|
351
|
+
this in every component stylesheet (a same-basename `.css` and `.tsx` pair
|
|
352
|
+
under `src/components/<family>/<component>/`), deriving the component names,
|
|
353
|
+
the Web Awesome tags each component renders, and its composed children from the
|
|
354
|
+
colocated component source:
|
|
342
355
|
|
|
343
356
|
- **Foreign classes.** Another component's class or `[data-component]` may
|
|
344
357
|
appear only in an ancestor compound or inside `:has()` / `:not()`; the
|
|
@@ -507,7 +520,11 @@ declarations.
|
|
|
507
520
|
`ContentItem` (`@kerfjs/ui/content-item`, rendering `.kui-content-item`) gives
|
|
508
521
|
one child 8px inline margin, a real 1px border, 8px padding, and 12px corners;
|
|
509
522
|
the border stays transparent unless `frame="framed"`, so framing never changes
|
|
510
|
-
geometry. `shape="pill"` selects the 22px radius.
|
|
523
|
+
geometry. `shape="pill"` selects the 22px radius. `appearance="surface"`
|
|
524
|
+
paints the base surface, while `neutral`, `info`, `pop`, `success`, `warning`,
|
|
525
|
+
and `danger` coordinate the same quiet background, border, and readable
|
|
526
|
+
foreground tokens as `StateBanner`. The default `transparent` appearance
|
|
527
|
+
preserves the surrounding surface.
|
|
511
528
|
`flush` removes block padding and borders while preserving inline geometry;
|
|
512
529
|
`title` passes through as the native tooltip. Interactive hover uses the normal
|
|
513
530
|
neutral fill so it remains visible on a lowered surface. For a card with
|
|
@@ -562,6 +579,8 @@ compact segment never becomes an oval. An icon-only `Select` joins a group as
|
|
|
562
579
|
one more segment with its siblings' inset, radius, hover, and focus ring; only a
|
|
563
580
|
lone Select grows the group to its icon-and-caret pill.
|
|
564
581
|
|
|
582
|
+
Select menus use native viewport shifting with 10px gutters: default menus grow to content (up to 20rem), while `fitMenu` matches trigger width and long labels wrap. Keep popup sizing and position repairs out of consumer CSS.
|
|
583
|
+
|
|
565
584
|
For a rail view heading, use `Select presentation="title"`: its intrinsic
|
|
566
585
|
36px borderless trigger has a bold large label flush with its leading edge and
|
|
567
586
|
a caret beside that label. Set `focusRingInset` when a NavStack or panel clips
|
|
@@ -746,6 +765,9 @@ triangle. The SVG uses `fill="currentColor"`, so fill follows the icon's text
|
|
|
746
765
|
color without styling its internal SVG from the application. Choose a Lucide
|
|
747
766
|
node whose geometry supports a solid fill; the prop does not replace an icon
|
|
748
767
|
node's own fill attributes.
|
|
768
|
+
The SVG is block-level by default. Pass `inline` when it belongs inside a
|
|
769
|
+
sentence or `Text`: the SVG becomes `inline-block`, keeps its inherited 1em
|
|
770
|
+
size unless `size` is supplied, and stays decorative unless `label` is set.
|
|
749
771
|
|
|
750
772
|
`LoadingSpinner` accepts the same `size` steps as `LucideIcon`: `xs`, `s`, `m`,
|
|
751
773
|
`l`, `xl` (12/16/20/24/32px at a 16px root) or a positive finite pixel
|
|
@@ -820,7 +842,7 @@ alphas, and dark raises them (`--wa-shadow-s` 14% to 50% black, `-m` 11% to
|
|
|
820
842
|
page.
|
|
821
843
|
Kerf owns the light `brand`, `success`, and `warning` `on-quiet` values in that
|
|
822
844
|
theme layer: each keeps its hue but is dark enough to clear WCAG AA (4.5:1) on
|
|
823
|
-
the lowered page background (`--kui-color-surface-lowered`, `#f2f2f7`), not
|
|
845
|
+
the lowered page background (`--kui-color-surface-lowered`, approximately `#f2f2f7` over white), not
|
|
824
846
|
only on the white surface, so toned text reads on every background a page
|
|
825
847
|
paints. It likewise owns every tone's loud pair: each `on-loud` text color
|
|
826
848
|
clears AA on its `fill-loud` in both schemes. Light brand and danger keep white
|
|
@@ -846,3 +868,30 @@ Keep product adapters outside the package: connection-state maps, ticket empty-s
|
|
|
846
868
|
## Testing contract
|
|
847
869
|
|
|
848
870
|
Each behavior has focused unit coverage and a real-browser flow through the production-backed catalog. Consumer bundle tests enforce subpath CSS reachability, transitive component styles, root/SSR isolation, optional registration boundaries, and the CSS-only Web Awesome theme boundary. `npm run check:css-ownership` rejects application selectors into Kerf or Web Awesome components, a non-minimal catalog compatibility stylesheet, or a return of the shared recipe stylesheet. Visual evidence supplements—never replaces—keyboard, focus, state, and event assertions.
|
|
871
|
+
|
|
872
|
+
### Toolbar width visibility
|
|
873
|
+
|
|
874
|
+
`ToolbarText` and `ToolbarControlGroup` accept typed `hideBelow` and
|
|
875
|
+
`showBelow` CSS lengths. Call `wireToolbarVisibility(root)` from
|
|
876
|
+
`@kerfjs/ui/wire-toolbar-visibility` after mounting, and call its disposer when
|
|
877
|
+
the application unmounts. The nearest Toolbar's **content-box width**, excluding
|
|
878
|
+
padding, borders, and safe-area insets, determines visibility. `hideBelow={px(416)}`
|
|
879
|
+
hides strictly below 416px; `showBelow={px(416)}` shows strictly below 416px. At
|
|
880
|
+
416px the first is visible and the second hidden. Together they define the visible
|
|
881
|
+
interval `[hideBelow, showBelow)`. Width rules intersect existing visibility and
|
|
882
|
+
expanded-state rules; they never force a CSS-hidden group visible.
|
|
883
|
+
|
|
884
|
+
Use `px`, `rem`, `em`, `pct`, `space`, `lengthVar`, or `calc`/`plus` to construct
|
|
885
|
+
lengths. Percentages resolve against that content box, `em` uses the child item's
|
|
886
|
+
font size, and custom properties use its inherited and own token context. The
|
|
887
|
+
helper follows resizes, theme/token/font changes, inserted items, nested toolbars,
|
|
888
|
+
and relocated groups. Invalid, unresolved, negative, or contradictory thresholds
|
|
889
|
+
leave the item visible under this width policy. Server-rendered content is visible
|
|
890
|
+
until wiring runs; without browser observers, initial wiring and window resize
|
|
891
|
+
still update it. Probe context and lengths are reconciled only when their CSSOM
|
|
892
|
+
values change, so unrelated DOM observers can redraw without feeding an ongoing
|
|
893
|
+
mutation loop. Dispose to remove measurement probes and restore prior markers.
|
|
894
|
+
|
|
895
|
+
Hidden controls leave layout and keyboard navigation. A hidden busy group also
|
|
896
|
+
hides only its own adjacent busy status. Keep primary actions always available;
|
|
897
|
+
show a complementary overflow group for secondary actions at narrow widths.
|
|
@@ -25,11 +25,23 @@ Kerf or Web Awesome component from that stylesheet. See
|
|
|
25
25
|
[`design-philosophy.md`](./design-philosophy.md) "Reach for the primitive, not for
|
|
26
26
|
CSS".
|
|
27
27
|
|
|
28
|
+
### Shared semantic tones
|
|
29
|
+
|
|
30
|
+
`SemanticTone` is the shared color-role type for `Badge`, `Chip`, `StateBanner`,
|
|
31
|
+
and semantic `ContentItem` appearances: `neutral`, `info`, `pop`, `success`,
|
|
32
|
+
`warning`, and `danger`. Import it as a type from `@kerfjs/ui`,
|
|
33
|
+
`@kerfjs/ui/badge`, `@kerfjs/ui/state-banner`, or `@kerfjs/ui/content-item`.
|
|
34
|
+
Use `info` for the role backed by the existing `--kui-color-brand-*` tokens.
|
|
35
|
+
Migrate Badge/Chip `tone="brand"` to `tone="info"`; `BadgeTone` and
|
|
36
|
+
`StateBannerTone` remain deprecated aliases of `SemanticTone`.
|
|
37
|
+
|
|
28
38
|
## Foundation tokens
|
|
29
39
|
|
|
30
40
|
Import the opt-in `@kerfjs/ui/document.css` baseline when the application wants
|
|
31
41
|
Kerf UI to own global box sizing, body typography/colors, plain-link color, and
|
|
32
|
-
the definite full-height chain.
|
|
42
|
+
the definite full-height chain. It also lets native table cells and form controls
|
|
43
|
+
inherit the surrounding font metrics without removing table-header emphasis.
|
|
44
|
+
Put `.kui-app-root` on the one direct mount
|
|
33
45
|
container only for a full-height shell; ordinary flowing pages can omit it. See
|
|
34
46
|
[Document baseline](document-baseline.md).
|
|
35
47
|
|
|
@@ -86,6 +98,8 @@ keywords for width/height); and `SelectChoice.color` takes a
|
|
|
86
98
|
role, or a `*-text` alias), from `foregroundColorVar()`, or from `foregroundColor()` via the `foregroundColor` helper for an application-chosen CSS color. `LucideIcon.color` accepts the same foreground type and otherwise inherits surrounding text color. The bare `success`,
|
|
87
99
|
`warning`, `danger`, `pop`, and `accent` tokens are quiet fills, not
|
|
88
100
|
foregrounds, and are rejected there; `colorVar()` returns a plain `CssColor`.
|
|
101
|
+
`LucideIcon` is block-level by default; set `inline` to let it flow inside
|
|
102
|
+
`Text` or other prose without changing its size or accessibility semantics.
|
|
89
103
|
Do not substitute one brand for another. Row components
|
|
90
104
|
have no declaration-string `style` prop; use `className`, documented public
|
|
91
105
|
tokens, and semantic component props. Catalog media queries remain strings and
|
|
@@ -146,16 +160,16 @@ beside a `ContentItem` value, and connect its id to the preview group's
|
|
|
146
160
|
| Application toolbar or heading — `Toolbar` | Leading identity, optional centered content, and trailing controls form one horizontal app bar or a page/panel/dialog heading. | Do not add bespoke heading geometry or a private wrapper; use the same zone contract everywhere. | Put identity/title text directly in a zone as `ToolbarText`; group controls and icon tiles in `ToolbarControlGroup`. | Actions, command availability, responsive relocation, state, and supporting copy below a heading. | `@kerfjs/ui/toolbar` | [Toolbar composition](../README.md#component-subpaths) |
|
|
147
161
|
| Toolbar control cluster — `ToolbarControlGroup`, `ToolbarActionLink` | Related toolbar buttons, semantic links, compact/tight controls, avatar actions, or a dropdown trigger/menu surface need one configured chrome contract. | Do not use it merely to align unrelated controls. Do not restyle anchors or dropdown parts in application CSS; use `ToolbarActionLink`, `overflow`, and `menuInset`. Web Awesome `wa-button-group` is only for an exceptional grouped-action contract. | Delegate child actions; use `ToolbarActionLink` for native navigation, `overflow="scroll"` for bounded action rows, and `menuInset` for dropdown surface padding. Use `avatarImage` instead of inserting an `img`; use `SegmentedControl` for an exclusive choice. | Actions, destinations, pressed/expanded state, content, and policy. | `@kerfjs/ui/toolbar-control-group` | [Component ownership](./component-contract.md#ownership-boundaries) |
|
|
148
162
|
| Floating controls over content — `FloatingToolbar` | A small cluster of controls (e.g. a drawer restore) must float over scrolling content — distinct and forced-dark — inside a positioned container. | Do not use it for a primary page or panel toolbar (use `Toolbar`), or for anything that must sit above dialogs/overlays — it is not top-layer. | Compose `ToolbarControlGroup`s and delegate their actions; the app owns visibility and position. | Controls, visibility, and position. | `@kerfjs/ui/floating-toolbar` | [Component subpaths](../README.md#component-subpaths) |
|
|
149
|
-
| Toolbar identity text — `ToolbarText` | A toolbar needs extra-large (page/panel title), large, default, or compact textual identity. | Plain text is not a heading by default; when a title needs heading semantics pass `headingLevel`. Sizes below `xlarge` are intentionally quiet identity text
|
|
163
|
+
| Toolbar identity text — `ToolbarText` | A toolbar needs extra-large (page/panel title), large, default, or compact textual identity. | Plain text is not a heading by default; when a title needs heading semantics pass `headingLevel`. Sizes below `xlarge` are intentionally quiet identity text in default tone — do not use them as a normal-color subsection title; use `Text` with an `h2`–`h6` variant, or `ListHeader` for a list section. | Optional `headingLevel` for `role="heading"` + `aria-level`. Defaults to one line, ellipsized when it does not fit; `wrap` flows onto multiple lines, `ellipsis` toggles the trailing …, and `maxLines` caps a wrap. | Text, heading level, overflow behavior, and responsive priority. | `@kerfjs/ui/toolbar-text` | [Toolbar composition](../README.md#component-subpaths) |
|
|
150
164
|
| Semantic block or inline text — `Text` | Ordinary application copy needs native `h1`–`h6` or `p` semantics plus standard geometry, or inline secondary copy needs a native `span` without box geometry. | Do not choose heading levels for appearance alone or recreate muted, error, small, or code utility classes. Use `ToolbarText` for toolbar identity/title content and `ListInsetText` when list-aligned prose needs full margin/border/padding geometry. | Omit `variant` for the default `p`, choose `h1`–`h6` from the document outline, or choose `span` inside a row, label, or table cell. Independently compose `tone="quiet | danger"`, `size="compact"`, and `font="monospace"`; ordinary native global, `data-_`, and `aria-_` attributes pass through. | Copy, localization, semantic variant, presentation roles, and document heading hierarchy. | `@kerfjs/ui/text` | [Text](./layout.md#text) |
|
|
151
165
|
| Vertical stack — `List` | Rows, sections, or arbitrary components need a consistent vertical stretch layout, optional standard/custom gap, flex growth, one vertical scroll owner, or edge dividers. | It is layout-only and does not provide `ul`/`ol` semantics. Do not nest scroll owners or use it when a horizontal layout is required. | Choose `gap`, `flex`, `scrollable`, and canonical `dividerSides` (`t`, `r`, `b`, `l` combinations in that order); bound the block size when scrolling. | Child semantics/content, containing height, and which optional layout behaviors apply. | `@kerfjs/ui/list` | [Pane geometry](../README.md#pane-and-content-geometry) |
|
|
152
|
-
| Equal-width columns — `Grid` | Equal-width sibling columns need a fixed count or should collapse as their container narrows, while preserving equal tracks despite intrinsic child widths. | Do not use it for intrinsic, asymmetric, spanning, or masonry tracks; use application-owned CSS grid. Do not use it for a user-operable separator; use `ResizableRegion`. | Choose fixed `columns` or typed `minColumnWidth`, plus
|
|
166
|
+
| Equal-width columns — `Grid` | Equal-width sibling columns need a fixed count or should collapse as their container narrows, while preserving equal tracks despite intrinsic child widths. | Do not use it for intrinsic, asymmetric, spanning, or masonry tracks; use application-owned CSS grid. Do not use it for a user-operable separator; use `ResizableRegion`. | Choose fixed `columns` or typed `minColumnWidth`, plus typed `gap`, optional `flex`, and physical-side `textInsets` / `controlInsets` when the track group needs a standard text or control inset; text wins on overlap. | Child semantics/content, outer width, fixed count or minimum width, and typed gap/flex/inset choices. | `@kerfjs/ui/grid` | [Grid](./layout.md#grid) |
|
|
153
167
|
| Navigation row — `ListItem` | A pane or navigation area needs a selectable, disabled, dormant-trailing, or multiline action row. | Do not put a control in `trailing`; use `ListActionRow` when the trailing region must be independently interactive. Use an `<a>` for navigation that must retain link behavior, a native `<button>` for an ordinary action, or implement the complete ARIA menu widget. | Delegate its `data-action`; compose inside a `.kui-content` section. Put domain event/drop metadata in `rootAttributes` rather than adding wrapper markup. The rounded root clips overflowing descendants; set `multiline` when the primary label should wrap. | Routing, selection, permissions, copy, action handling, and domain `data-*` values. | `@kerfjs/ui/list-item` | [Pane geometry](../README.md#pane-and-content-geometry) |
|
|
154
168
|
| Navigation row with trailing action — `ListActionRow` | A full-width row needs a selectable primary action and an independently focusable trailing action. | Use `ListItem` when trailing content is dormant metadata. Do not put controls inside the row's `label`, `icon`, or `trailingActionIcon` SafeHtml slots. Do not use `AppTab` outside tablist semantics or `ToolbarControlGroup` outside a toolbar. | Delegate both action strings; update controlled selection and any popover/context-menu state in the app. | Routing, selection, both action policies, domain metadata, and popover/context-menu behavior. | `@kerfjs/ui/list-action-row` | [Accessibility](./accessibility.md#listactionrow) |
|
|
155
169
|
| Navigation section heading — `ListHeader` | A menu section needs a full-width label, semantic count, non-count badge, logical-end action, or real disclosure state. | Do not concatenate counts into `label` or put numeric content in `badge`; use `count` with the localized full phrase in `countLabel`. Do not add a disclosure arrow to navigation that reveals nothing. Keep its 44px hit target; do not resize its 36px square. Do not use it as a page, panel, or dialog title; use a heading `Toolbar`. | Delegate its optional action; the app controls expanded state and revealed content. Toggle mode supplies `DisclosureArrow` unless `actionIcon` replaces it. Use `triggerAttributes` only for domain `data-*` or a native popover relationship. | Section organization, valid count and localized count label, disclosure state and content, non-count badge content, popover target behavior, and policy. | `@kerfjs/ui/list-header` | [Pane geometry](../README.md#pane-and-content-geometry) |
|
|
156
170
|
| Inset self-bordered control — `ListInsetControl` | A control that owns its own border and padding but no outer margin (a search input, a `SegmentedControl`) must line up inside a `.kui-content` list with the standard 8px inline margins and stretch to fill the row. | Do not wrap a `.kui-content-item` or a `ListItem`/`ListHeader` that already owns its inline margin — that double-insets it. Do not add ad-hoc `margin`/`padding` around a bare control to align it; use this instead. | Place the self-bordered control(s) as children; they stretch to fill. It applies only the inline margin, flex stretch, and 8px gap — the child owns its own border and padding. | The control(s), their state, and action wiring. | `@kerfjs/ui/list-inset-control` | [Pane geometry](../README.md#component-subpaths) |
|
|
157
171
|
| Inset bare text — `ListInsetText` | A plain string or inline content with no margin, border, or padding of its own must sit in a `.kui-content` list with its text edge aligned to the bordered items around it. | Do not use it to wrap a component that already owns content-item geometry (`ListItem`, `StateBanner`, a `.kui-content-item`) — that double-insets it. Do not hand-roll the 8px margin / 1px border / 8px padding. | Pass the text or inline `SafeHtml` as children; it supplies the 8px inline margin, 1px transparent border, and 8px padding so the text edge lands at the standard 17px inset. Pass `sides="rl"` to keep that horizontal inset but drop the vertical margin, border, and padding for tight text layout. | The text, copy, and localization. | `@kerfjs/ui/list-inset-text` | [Pane geometry](../README.md#component-subpaths) |
|
|
158
|
-
| Self-contained content child — `ContentItem` | An ordinary surface-like child of a `Pane` or `.kui-content` stack needs the shared 8px margin / 1px border / 8px padding geometry; pass `frame="framed"` only when it marks a real distinction
|
|
172
|
+
| Self-contained content child — `ContentItem` | An ordinary surface-like child of a `Pane` or `.kui-content` stack needs the shared 8px margin / 1px border / 8px padding geometry; pass `frame="framed"` only when it marks a real distinction, `appearance="surface"` or a semantic appearance for coordinated surface colors, and `shape="pill"` for the 22px radius. | Do not wrap a component that already owns content-item geometry (`ListItem`, `ListHeader`, `StateBanner`, `Toolbar`, `ValueTable`) or pad around it — that double-insets. Do not frame an item only to make it look contained. Use `SunkenPanel` for a lowered inset stack and `ListInsetText` for bare text that only needs to align. | Pass the item content as children; choose `appearance` (`transparent` default, `surface`, or a semantic status), `frame`, and `shape` instead of writing CSS. Put safe `data-*` metadata in `rootAttributes`; `ariaLabel` names a distinct region and `focusTarget` makes it a programmatic focus target. | The content, surface or status appearance, and whether it marks a distinction worth a visible frame. | `@kerfjs/ui/content-item` | [Content items](./layout.md#content-items) |
|
|
159
173
|
| Application column — `Pane` | A sidebar, main area, inspector, or dialog needs shared vertical header/content/footer organization, one scroll owner, and optional edge separators. | Do not pad the pane shell, wrap child-owned geometry in competing insets, invent unrelated centered measures, or leave an icon-only rail for a hidden pane. | Import `Pane`, use `children` for its homogeneous primary content and the named `SafeHtml` prop slots `header`/`footer` for optional fixed chrome, then opt into only the needed logical-edge separators; add `ContentItem` children as needed. A visible pane owns collapse in its toolbar; move a hidden inline-start pane's restore control to the main toolbar leading edge and an inline-end pane's restore control to its trailing edge. | Layout hierarchy, reading width, responsive relocation, pane visibility state, slot semantics, labels, and separator placement. | `@kerfjs/ui/pane` | [Pane anatomy](./layout.md#anatomy) |
|
|
160
174
|
| Scroll dividers — `wireScrollDividers` | Pinned chrome (a `Pane` header or footer, a `NavStack` top chrome or bottom toolbar, a `TabScaffold` bar, the sides of a `TabBar` strip, or app-owned chrome around a scroller) needs a divider only while content is scrolled away beneath it. | Do not keep a static toolbar divider to fake it or write a border onto another component; each component draws its own line from the wiring's state. | Call `wireScrollDividers` once at the app root and retain the disposer; it covers every `Pane`, `NavStack`, `TabScaffold`, and `TabBar` below it. Name app-owned arrangements in `targets` by id; a `Toolbar` or `List` named as chrome draws its facing side. Configure a pane with `chromeDividers` (`scroll` default, `always`, `none`). | Which panes follow the scroll, app-owned targets, and the disposer. | `@kerfjs/ui/wire-scroll-dividers` | [Scroll dividers](./layout.md#scroll-dividers) |
|
|
161
175
|
| One-pane navigation — `NavStack` | A compact flow pushes into details while keeping earlier views mounted, or a single-pane screen needs the same stable layout contract. | Do not use it when list and detail should remain visible together; use `SplitView`. Do not use it alone for co-equal top-level destinations; use one stack per `TabScaffold` tab. | Keep the ordered view array controlled, put view-specific bottom chrome on each view (or use the component fallback), import its CSS explicitly, and call `wireNavStack` for back delegation, content-slide/chrome-cross-fade transitions, and focus move/restore. Mark a preferred initial target with `data-nav-focus` when DOM order is insufficient. | View keys/content/titles, push and pop actions, preferred initial focus targets, and per-view or persistent bottom toolbar content. | `@kerfjs/ui/nav-stack` | [App-layout decision matrix](./app-layouts.md#decision-matrix) |
|
|
@@ -379,8 +393,14 @@ When the expanded toolbar field has focus, its inset surface uses
|
|
|
379
393
|
`--kui-token-search-background` or the default surface color if that token is
|
|
380
394
|
unset.
|
|
381
395
|
|
|
396
|
+
`ToolbarControlGroup.tileTone` selects `neutral`, `brand`, `success`, `warning`, or `danger` quiet fill, matching quiet border, and on-quiet foreground for a non-interactive icon tile. Compose a contained `single` group whose only child is a direct decorative LucideIcon (`aria-hidden="true"`). Omission preserves the normal group palette. The prop does not recolor interactive, mixed, multi-control, or borderless groups; keep real actions in controls with their existing focus/hover/pressed treatments.
|
|
397
|
+
|
|
382
398
|
## Toolbar composition
|
|
383
399
|
|
|
400
|
+
Use `ToolbarText tone="dark"` on a loud or photo-backed toolbar surface to
|
|
401
|
+
match dark control groups. It applies to read-only headings and actionable
|
|
402
|
+
titles at every size; default tone retains existing identity and heading colors.
|
|
403
|
+
|
|
384
404
|
A `FloatingToolbar` accepts `ToolbarControlGroup` directly as its children in
|
|
385
405
|
both floating and inline placement. Name the toolbar with `label`; group its
|
|
386
406
|
controls as you would in a `Toolbar` zone.
|
|
@@ -445,6 +465,29 @@ the control's dimensions, shows `LoadingSpinner` in its icon slot, sets
|
|
|
445
465
|
| A command menu | `<ToolbarControlGroup single nestedDropdown><PopupMenu … /></ToolbarControlGroup>` | Register `@kerfjs/ui/popup-menu/register` once; set `menuInset` on the group |
|
|
446
466
|
| A collapsible search box | `<ToolbarControlGroup single><TokenSearchField collapsible … /></ToolbarControlGroup>` | The group animates the iconic ↔ expanded states; `wireTokenSearchFields` manages expand/collapse/focus by default |
|
|
447
467
|
|
|
468
|
+
### Application surfaces below search
|
|
469
|
+
|
|
470
|
+
Pass `expandedOverflow="visible"` to `ToolbarControlGroup content="search"`
|
|
471
|
+
when an application-owned suggestion list, date picker, or help surface extends
|
|
472
|
+
below it. The group is the positioning containing block, retains auto height,
|
|
473
|
+
and permits overflow only while `expanded` is true. Omission or `"clip"` keeps
|
|
474
|
+
existing behavior, including Kerf's built-in suggestions. Other content modes
|
|
475
|
+
and collapsed searches keep their existing overflow rules.
|
|
476
|
+
|
|
477
|
+
```tsx
|
|
478
|
+
<ToolbarControlGroup content="search" expanded={open} expandedOverflow="visible">
|
|
479
|
+
<TokenSearchField id="ticket-search" label="Search tickets" presentation="toolbar-group" collapsible expanded={open} />
|
|
480
|
+
{open ? <AppDatePicker data-token-search-keep-open /> : null}
|
|
481
|
+
</ToolbarControlGroup>
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
The application owns placement (for example absolute positioning below the
|
|
485
|
+
group), stacking, dismissal, and hiding/removing its surface on collapse. Mark
|
|
486
|
+
focusable floating content `data-token-search-keep-open`, or configure
|
|
487
|
+
`collapsible.keepOpenOn`, to keep an empty field open when focus enters it.
|
|
488
|
+
This prop does not escape clipping imposed by an ancestor or create a top-layer
|
|
489
|
+
popover. Do not override the group's position, height, or overflow in app CSS.
|
|
490
|
+
|
|
448
491
|
### Popup menu migration
|
|
449
492
|
|
|
450
493
|
A **popup menu in a toolbar** is a `PopupMenu` (`@kerfjs/ui/popup-menu`) in a
|
|
@@ -593,7 +636,7 @@ requires a string label so the title cannot lose text hidden inside markup.
|
|
|
593
636
|
```tsx
|
|
594
637
|
<Chip
|
|
595
638
|
size="compact"
|
|
596
|
-
tone="
|
|
639
|
+
tone="info"
|
|
597
640
|
itemId={tag.id}
|
|
598
641
|
removeAction="remove-tag"
|
|
599
642
|
removeLabel={`Remove ${tag.name} tag`}
|
|
@@ -631,3 +674,28 @@ replaces it (`PopupMenu` renders `wa-dropdown`; `Select` renders `wa-select` /
|
|
|
631
674
|
|
|
632
675
|
All other entries in the [Web Awesome theme contract](./webawesome-theme.md#coverage)
|
|
633
676
|
remain supported when their native semantic contract matches the product need.
|
|
677
|
+
|
|
678
|
+
### Toolbar width visibility
|
|
679
|
+
|
|
680
|
+
`ToolbarText` and `ToolbarControlGroup` accept typed `hideBelow` and
|
|
681
|
+
`showBelow` CSS lengths. Call `wireToolbarVisibility` with the application root from
|
|
682
|
+
`@kerfjs/ui/wire-toolbar-visibility` after mounting, and call its disposer when
|
|
683
|
+
the application unmounts. The nearest Toolbar's **content-box width**, excluding
|
|
684
|
+
padding, borders, and safe-area insets, determines visibility. `hideBelow={px(416)}`
|
|
685
|
+
hides strictly below 416px; `showBelow={px(416)}` shows strictly below 416px. At
|
|
686
|
+
416px the first is visible and the second hidden. Together they define the visible
|
|
687
|
+
interval `[hideBelow, showBelow)`. Width rules intersect existing visibility and
|
|
688
|
+
expanded-state rules; they never force a CSS-hidden group visible.
|
|
689
|
+
|
|
690
|
+
Use `px`, `rem`, `em`, `pct`, `space`, `lengthVar`, or `calc`/`plus` to construct
|
|
691
|
+
lengths. Percentages resolve against that content box, `em` uses the child item's
|
|
692
|
+
font size, and custom properties use its inherited and own token context. The
|
|
693
|
+
helper follows resizes, theme/token/font changes, inserted items, nested toolbars,
|
|
694
|
+
and relocated groups. Invalid, unresolved, negative, or contradictory thresholds
|
|
695
|
+
leave the item visible under this width policy. Server-rendered content is visible
|
|
696
|
+
until wiring runs; without browser observers, initial wiring and window resize
|
|
697
|
+
still update it. Dispose to remove measurement probes and restore prior markers.
|
|
698
|
+
|
|
699
|
+
Hidden controls leave layout and keyboard navigation. A hidden busy group also
|
|
700
|
+
hides only its own adjacent busy status. Keep primary actions always available;
|
|
701
|
+
show a complementary overflow group for secondary actions at narrow widths.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 190" width="460" height="190"><defs><clipPath id="cp0"><rect x="214" y="66" width="32" height="32.3"/></clipPath><clipPath id="ct2"><rect x="174.4" y="114.3" width="111.2" height="23"/></clipPath><clipPath id="ct3"><rect x="115.7" y="145.3" width="228.6" height="20.3"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="191" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g color="rgb(
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 190" width="460" height="190"><defs><clipPath id="cp0"><rect x="214" y="66" width="32" height="32.3"/></clipPath><clipPath id="ct2"><rect x="174.4" y="114.3" width="111.2" height="23"/></clipPath><clipPath id="ct3"><rect x="115.7" y="145.3" width="228.6" height="20.3"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="191" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g color="rgb(194, 194, 198)"><clipPath id="svgic1"><rect x="214" y="66.3" width="32" height="32"/></clipPath><g clip-path="url(#svgic1)"><g transform="translate(214 66.344)scale(1.33333)"><path d="M10 20a1 1 0 0 0 .6.9l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .5-1.3l7.2-8A1 1 0 0 0 21 3H3a1 1 0 0 0-.7 1.7l7.2 8A2 2 0 0 1 10 14Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 194, 198)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="174.42" y="133.34" font-family="system-ui, "-apple-system", sans-serif" font-size="20" font-weight="650" fill="rgb(245,245,247)">No matches</text><text x="115.72" y="160.34" font-family="system-ui, "-apple-system", sans-serif" font-size="14" fill="rgb(194,194,198)">No tickets match the current filters.</text></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 190" width="460" height="190"><defs><clipPath id="cp0"><rect x="214" y="66" width="32" height="32.3"/></clipPath><clipPath id="ct2"><rect x="174.4" y="114.3" width="111.2" height="23"/></clipPath><clipPath id="ct3"><rect x="115.7" y="145.3" width="228.6" height="20.3"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="191" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g color="rgb(
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 190" width="460" height="190"><defs><clipPath id="cp0"><rect x="214" y="66" width="32" height="32.3"/></clipPath><clipPath id="ct2"><rect x="174.4" y="114.3" width="111.2" height="23"/></clipPath><clipPath id="ct3"><rect x="115.7" y="145.3" width="228.6" height="20.3"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="191" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g color="rgb(98, 98, 103)"><clipPath id="svgic1"><rect x="214" y="66.3" width="32" height="32"/></clipPath><g clip-path="url(#svgic1)"><g transform="translate(214 66.344)scale(1.33333)"><path d="M10 20a1 1 0 0 0 .6.9l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .5-1.3l7.2-8A1 1 0 0 0 21 3H3a1 1 0 0 0-.7 1.7l7.2 8A2 2 0 0 1 10 14Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(98, 98, 103)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="174.42" y="133.34" font-family="system-ui, "-apple-system", sans-serif" font-size="20" font-weight="650" fill="rgb(29,29,31)">No matches</text><text x="115.72" y="160.34" font-family="system-ui, "-apple-system", sans-serif" font-size="14" fill="rgb(98,98,103)">No tickets match the current filters.</text></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 220" width="460" height="220"><defs><clipPath id="cp0"><rect x="214" y="53" width="32" height="32"/></clipPath><clipPath id="ct2"><rect x="157.7" y="101" width="144.7" height="23"/></clipPath><clipPath id="ct3"><rect x="73.7" y="132" width="312.7" height="20.3"/></clipPath><clipPath id="ct4"><rect x="179.6" y="168.3" width="100.8" height="32"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="212" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g color="rgb(
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 220" width="460" height="220"><defs><clipPath id="cp0"><rect x="214" y="53" width="32" height="32"/></clipPath><clipPath id="ct2"><rect x="157.7" y="101" width="144.7" height="23"/></clipPath><clipPath id="ct3"><rect x="73.7" y="132" width="312.7" height="20.3"/></clipPath><clipPath id="ct4"><rect x="179.6" y="168.3" width="100.8" height="32"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="212" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g color="rgb(194, 194, 198)"><clipPath id="svgic1"><rect x="214" y="53" width="32" height="32"/></clipPath><g clip-path="url(#svgic1)"><g transform="translate(214 53)scale(1.33333)"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 194, 198)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M5.5 5.1 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.4-6.9A2 2 0 0 0 16.8 4H7.2a2 2 0 0 0-1.7 1.1" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 194, 198)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="157.67" y="120" font-family="system-ui, "-apple-system", sans-serif" font-size="20" font-weight="650" fill="rgb(245,245,247)">No open tickets</text><text x="73.67" y="147" font-family="system-ui, "-apple-system", sans-serif" font-size="14" fill="rgb(194,194,198)">When someone files a ticket it will show up here.</text><rect x="179.6" y="168.3" width="100.8" height="32" rx="16" fill="rgb(44,44,46)"/><text x="191.63" y="190.3" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(245,245,247)">New ticket</text></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 220" width="460" height="220"><defs><clipPath id="cp0"><rect x="214" y="53" width="32" height="32"/></clipPath><clipPath id="ct2"><rect x="157.7" y="101" width="144.7" height="23"/></clipPath><clipPath id="ct3"><rect x="73.7" y="132" width="312.7" height="20.3"/></clipPath><clipPath id="ct4"><rect x="179.6" y="168.3" width="100.8" height="32"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="212" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g color="rgb(
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 220" width="460" height="220"><defs><clipPath id="cp0"><rect x="214" y="53" width="32" height="32"/></clipPath><clipPath id="ct2"><rect x="157.7" y="101" width="144.7" height="23"/></clipPath><clipPath id="ct3"><rect x="73.7" y="132" width="312.7" height="20.3"/></clipPath><clipPath id="ct4"><rect x="179.6" y="168.3" width="100.8" height="32"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="212" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g color="rgb(98, 98, 103)"><clipPath id="svgic1"><rect x="214" y="53" width="32" height="32"/></clipPath><g clip-path="url(#svgic1)"><g transform="translate(214 53)scale(1.33333)"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(98, 98, 103)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M5.5 5.1 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.4-6.9A2 2 0 0 0 16.8 4H7.2a2 2 0 0 0-1.7 1.1" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(98, 98, 103)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="157.67" y="120" font-family="system-ui, "-apple-system", sans-serif" font-size="20" font-weight="650" fill="rgb(29,29,31)">No open tickets</text><text x="73.67" y="147" font-family="system-ui, "-apple-system", sans-serif" font-size="14" fill="rgb(98,98,103)">When someone files a ticket it will show up here.</text><rect x="179.6" y="168.3" width="100.8" height="32" rx="16" fill="rgb(255,255,255)"/><text x="191.63" y="190.3" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(29,29,31)">New ticket</text></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 492 502" width="492" height="502"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="220"/></clipPath><clipPath id="cp1"><rect x="16" y="296" width="460" height="190"/></clipPath><clipPath id="ct2"><rect x="16" y="16" width="460" height="22"/></clipPath><clipPath id="irc3"><rect x="16" y="38" width="460" height="220" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="274" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="296" width="460" height="190" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="502" rx="0" fill="rgb(28,28,30)"/><text x="16" y="28" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(174,174,178)">Icon, title, detail, and action</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="220"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="214" y="53" width="32" height="32"/></clipPath><clipPath id="svgimg4ct2"><rect x="157.7" y="101" width="144.7" height="23"/></clipPath><clipPath id="svgimg4ct3"><rect x="73.7" y="132" width="312.7" height="20.3"/></clipPath><clipPath id="svgimg4ct4"><rect x="179.6" y="168.3" width="100.8" height="32"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="212" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg4cp0)"><g color="rgb(
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 492 502" width="492" height="502"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="220"/></clipPath><clipPath id="cp1"><rect x="16" y="296" width="460" height="190"/></clipPath><clipPath id="ct2"><rect x="16" y="16" width="460" height="22"/></clipPath><clipPath id="irc3"><rect x="16" y="38" width="460" height="220" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="274" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="296" width="460" height="190" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="502" rx="0" fill="rgb(28,28,30)"/><text x="16" y="28" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(174,174,178)">Icon, title, detail, and action</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="220"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="214" y="53" width="32" height="32"/></clipPath><clipPath id="svgimg4ct2"><rect x="157.7" y="101" width="144.7" height="23"/></clipPath><clipPath id="svgimg4ct3"><rect x="73.7" y="132" width="312.7" height="20.3"/></clipPath><clipPath id="svgimg4ct4"><rect x="179.6" y="168.3" width="100.8" height="32"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="212" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg4cp0)"><g color="rgb(194, 194, 198)"><clipPath id="svgimg4svgic1"><rect x="214" y="53" width="32" height="32"/></clipPath><g clip-path="url(#svgimg4svgic1)"><g transform="translate(214 53)scale(1.33333)"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 194, 198)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M5.5 5.1 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.4-6.9A2 2 0 0 0 16.8 4H7.2a2 2 0 0 0-1.7 1.1" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 194, 198)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="157.67" y="120" font-family="system-ui, "-apple-system", sans-serif" font-size="20" font-weight="650" fill="rgb(245,245,247)">No open tickets</text><text x="73.67" y="147" font-family="system-ui, "-apple-system", sans-serif" font-size="14" fill="rgb(194,194,198)">When someone files a ticket it will show up here.</text><rect x="179.6" y="168.3" width="100.8" height="32" rx="16" fill="rgb(44,44,46)"/><text x="191.63" y="190.3" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(245,245,247)">New ticket</text></g></g></g></g><text x="16" y="286" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(174,174,178)">No results for a filter</text><g clip-path="url(#cp1)"><g clip-path="url(#irc6)"><clipPath id="svgimg7vclip"><rect x="16" y="296" width="460" height="190"/></clipPath><g clip-path="url(#svgimg7vclip)"><g transform="translate(16 296)"><defs><clipPath id="svgimg7cp0"><rect x="214" y="66" width="32" height="32.3"/></clipPath><clipPath id="svgimg7ct2"><rect x="174.4" y="114.3" width="111.2" height="23"/></clipPath><clipPath id="svgimg7ct3"><rect x="115.7" y="145.3" width="228.6" height="20.3"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="191" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg7cp0)"><g color="rgb(194, 194, 198)"><clipPath id="svgimg7svgic1"><rect x="214" y="66.3" width="32" height="32"/></clipPath><g clip-path="url(#svgimg7svgic1)"><g transform="translate(214 66.344)scale(1.33333)"><path d="M10 20a1 1 0 0 0 .6.9l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .5-1.3l7.2-8A1 1 0 0 0 21 3H3a1 1 0 0 0-.7 1.7l7.2 8A2 2 0 0 1 10 14Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 194, 198)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="174.42" y="133.34" font-family="system-ui, "-apple-system", sans-serif" font-size="20" font-weight="650" fill="rgb(245,245,247)">No matches</text><text x="115.72" y="160.34" font-family="system-ui, "-apple-system", sans-serif" font-size="14" fill="rgb(194,194,198)">No tickets match the current filters.</text></g></g></g></g></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 492 502" width="492" height="502"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="220"/></clipPath><clipPath id="cp1"><rect x="16" y="296" width="460" height="190"/></clipPath><clipPath id="ct2"><rect x="16" y="16" width="460" height="22"/></clipPath><clipPath id="irc3"><rect x="16" y="38" width="460" height="220" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="274" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="296" width="460" height="190" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="502" 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)">Icon, title, detail, and action</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="220"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="214" y="53" width="32" height="32"/></clipPath><clipPath id="svgimg4ct2"><rect x="157.7" y="101" width="144.7" height="23"/></clipPath><clipPath id="svgimg4ct3"><rect x="73.7" y="132" width="312.7" height="20.3"/></clipPath><clipPath id="svgimg4ct4"><rect x="179.6" y="168.3" width="100.8" height="32"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="212" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg4cp0)"><g color="rgb(
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 492 502" width="492" height="502"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="220"/></clipPath><clipPath id="cp1"><rect x="16" y="296" width="460" height="190"/></clipPath><clipPath id="ct2"><rect x="16" y="16" width="460" height="22"/></clipPath><clipPath id="irc3"><rect x="16" y="38" width="460" height="220" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="274" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="296" width="460" height="190" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="502" 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)">Icon, title, detail, and action</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="220"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="214" y="53" width="32" height="32"/></clipPath><clipPath id="svgimg4ct2"><rect x="157.7" y="101" width="144.7" height="23"/></clipPath><clipPath id="svgimg4ct3"><rect x="73.7" y="132" width="312.7" height="20.3"/></clipPath><clipPath id="svgimg4ct4"><rect x="179.6" y="168.3" width="100.8" height="32"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="212" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg4cp0)"><g color="rgb(98, 98, 103)"><clipPath id="svgimg4svgic1"><rect x="214" y="53" width="32" height="32"/></clipPath><g clip-path="url(#svgimg4svgic1)"><g transform="translate(214 53)scale(1.33333)"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(98, 98, 103)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M5.5 5.1 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.4-6.9A2 2 0 0 0 16.8 4H7.2a2 2 0 0 0-1.7 1.1" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(98, 98, 103)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="157.67" y="120" font-family="system-ui, "-apple-system", sans-serif" font-size="20" font-weight="650" fill="rgb(29,29,31)">No open tickets</text><text x="73.67" y="147" font-family="system-ui, "-apple-system", sans-serif" font-size="14" fill="rgb(98,98,103)">When someone files a ticket it will show up here.</text><rect x="179.6" y="168.3" width="100.8" height="32" rx="16" fill="rgb(255,255,255)"/><text x="191.63" y="190.3" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(29,29,31)">New ticket</text></g></g></g></g><text x="16" y="286" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">No results for a filter</text><g clip-path="url(#cp1)"><g clip-path="url(#irc6)"><clipPath id="svgimg7vclip"><rect x="16" y="296" width="460" height="190"/></clipPath><g clip-path="url(#svgimg7vclip)"><g transform="translate(16 296)"><defs><clipPath id="svgimg7cp0"><rect x="214" y="66" width="32" height="32.3"/></clipPath><clipPath id="svgimg7ct2"><rect x="174.4" y="114.3" width="111.2" height="23"/></clipPath><clipPath id="svgimg7ct3"><rect x="115.7" y="145.3" width="228.6" height="20.3"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="191" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg7cp0)"><g color="rgb(98, 98, 103)"><clipPath id="svgimg7svgic1"><rect x="214" y="66.3" width="32" height="32"/></clipPath><g clip-path="url(#svgimg7svgic1)"><g transform="translate(214 66.344)scale(1.33333)"><path d="M10 20a1 1 0 0 0 .6.9l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .5-1.3l7.2-8A1 1 0 0 0 21 3H3a1 1 0 0 0-.7 1.7l7.2 8A2 2 0 0 1 10 14Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(98, 98, 103)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="174.42" y="133.34" font-family="system-ui, "-apple-system", sans-serif" font-size="20" font-weight="650" fill="rgb(29,29,31)">No matches</text><text x="115.72" y="160.34" font-family="system-ui, "-apple-system", sans-serif" font-size="14" fill="rgb(98,98,103)">No tickets match the current filters.</text></g></g></g></g></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 230" width="420" height="230"><defs><clipPath id="cp0"><rect x="29" y="26.5" width="97.8" height="31"/></clipPath><clipPath id="ct1"><rect x="29" y="26.5" width="97.8" height="31"/></clipPath><clipPath id="ct2"><rect x="134.8" y="32" width="20.3" height="20"/></clipPath><clipPath id="cp3"><rect x="28" y="72" width="324" height="44"/></clipPath><clipPath id="ov4"><rect x="29" y="73" width="322" height="42" rx="11"/></clipPath><clipPath id="cp5"><rect x="37" y="85" width="18" height="18"/></clipPath><clipPath id="cp7"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="ov8"><rect x="63" y="85" width="272" height="18" rx="0"/></clipPath><clipPath id="cp9"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="ct10"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="cp11"><rect x="28" y="124" width="324" height="44"/></clipPath><clipPath id="ov12"><rect x="29" y="125" width="322" height="42" rx="11"/></clipPath><clipPath id="cp13"><rect x="37" y="137" width="18" height="18"/></clipPath><clipPath id="cp15"><rect x="63" y="137" width="272" height="18"/></clipPath><clipPath id="ov16"><rect x="63" y="137" width="272" height="18" rx="0"/></clipPath><clipPath id="cp17"><rect x="63" y="137" width="272" height="18"/></clipPath><clipPath id="ct18"><rect x="63" y="137" width="272" height="18"/></clipPath></defs><rect x="28.5" y="20.5" width="323" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g clip-path="url(#ct1)"><text x="37" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 230" width="420" height="230"><defs><clipPath id="cp0"><rect x="29" y="26.5" width="97.8" height="31"/></clipPath><clipPath id="ct1"><rect x="29" y="26.5" width="97.8" height="31"/></clipPath><clipPath id="ct2"><rect x="134.8" y="32" width="20.3" height="20"/></clipPath><clipPath id="cp3"><rect x="28" y="72" width="324" height="44"/></clipPath><clipPath id="ov4"><rect x="29" y="73" width="322" height="42" rx="11"/></clipPath><clipPath id="cp5"><rect x="37" y="85" width="18" height="18"/></clipPath><clipPath id="cp7"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="ov8"><rect x="63" y="85" width="272" height="18" rx="0"/></clipPath><clipPath id="cp9"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="ct10"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="cp11"><rect x="28" y="124" width="324" height="44"/></clipPath><clipPath id="ov12"><rect x="29" y="125" width="322" height="42" rx="11"/></clipPath><clipPath id="cp13"><rect x="37" y="137" width="18" height="18"/></clipPath><clipPath id="cp15"><rect x="63" y="137" width="272" height="18"/></clipPath><clipPath id="ov16"><rect x="63" y="137" width="272" height="18" rx="0"/></clipPath><clipPath id="cp17"><rect x="63" y="137" width="272" height="18"/></clipPath><clipPath id="ct18"><rect x="63" y="137" width="272" height="18"/></clipPath></defs><rect x="28.5" y="20.5" width="323" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g clip-path="url(#ct1)"><text x="37" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(194,194,198)">WORKSPACE</text></g></g><rect x="134.8" y="32" width="20.3" height="20" rx="10" fill="rgba(228,228,255,0.075)"/><rect x="135.5" y="32.5" width="19" height="19" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="141.41" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(194,194,198)">2</text><g clip-path="url(#cp3)"><rect x="28" y="72" width="324" height="44" rx="12" fill="rgb(40,57,66)"/><rect x="28.5" y="72.5" width="323" height="43" rx="11.5" fill="none" stroke="rgb(53,92,109)" stroke-width="1"/><g clip-path="url(#ov4)"><g clip-path="url(#cp5)"><g color="rgb(245, 245, 247)"><clipPath id="svgic6"><rect x="37" y="85" width="18" height="18"/></clipPath><g clip-path="url(#svgic6)"><g transform="matrix(.75 0 0 .75 37 85)"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(245, 245, 247)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M5.5 5.1 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.4-6.9A2 2 0 0 0 16.8 4H7.2a2 2 0 0 0-1.7 1.1" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(245, 245, 247)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><g clip-path="url(#cp7)"><g clip-path="url(#ov8)"><g clip-path="url(#cp9)"><g clip-path="url(#ct10)"><text x="63" y="100" font-family="system-ui, "-apple-system", sans-serif" font-size="16" font-weight="650" fill="rgb(245,245,247)">Inbox</text></g></g></g></g></g></g><g clip-path="url(#cp11)"><rect x="28.5" y="124.5" width="323" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#ov12)"><g clip-path="url(#cp13)"><g color="rgb(245, 245, 247)"><clipPath id="svgic14"><rect x="37" y="137" width="18" height="18"/></clipPath><g clip-path="url(#svgic14)"><g transform="matrix(.75 0 0 .75 37 137)"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.7-.9l-.8-1.2A2 2 0 0 0 7.9 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(245, 245, 247)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><g clip-path="url(#cp15)"><g clip-path="url(#ov16)"><g clip-path="url(#cp17)"><g clip-path="url(#ct18)"><text x="63" y="152" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(245,245,247)">Projects</text></g></g></g></g></g></g></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 230" width="420" height="230"><defs><clipPath id="cp0"><rect x="29" y="26.5" width="97.8" height="31"/></clipPath><clipPath id="ct1"><rect x="29" y="26.5" width="97.8" height="31"/></clipPath><clipPath id="ct2"><rect x="134.8" y="32" width="20.3" height="20"/></clipPath><clipPath id="cp3"><rect x="28" y="72" width="324" height="44"/></clipPath><clipPath id="ov4"><rect x="29" y="73" width="322" height="42" rx="11"/></clipPath><clipPath id="cp5"><rect x="37" y="85" width="18" height="18"/></clipPath><clipPath id="cp7"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="ov8"><rect x="63" y="85" width="272" height="18" rx="0"/></clipPath><clipPath id="cp9"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="ct10"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="cp11"><rect x="28" y="124" width="324" height="44"/></clipPath><clipPath id="ov12"><rect x="29" y="125" width="322" height="42" rx="11"/></clipPath><clipPath id="cp13"><rect x="37" y="137" width="18" height="18"/></clipPath><clipPath id="cp15"><rect x="63" y="137" width="272" height="18"/></clipPath><clipPath id="ov16"><rect x="63" y="137" width="272" height="18" rx="0"/></clipPath><clipPath id="cp17"><rect x="63" y="137" width="272" height="18"/></clipPath><clipPath id="ct18"><rect x="63" y="137" width="272" height="18"/></clipPath></defs><rect x="28.5" y="20.5" width="323" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g clip-path="url(#ct1)"><text x="37" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 230" width="420" height="230"><defs><clipPath id="cp0"><rect x="29" y="26.5" width="97.8" height="31"/></clipPath><clipPath id="ct1"><rect x="29" y="26.5" width="97.8" height="31"/></clipPath><clipPath id="ct2"><rect x="134.8" y="32" width="20.3" height="20"/></clipPath><clipPath id="cp3"><rect x="28" y="72" width="324" height="44"/></clipPath><clipPath id="ov4"><rect x="29" y="73" width="322" height="42" rx="11"/></clipPath><clipPath id="cp5"><rect x="37" y="85" width="18" height="18"/></clipPath><clipPath id="cp7"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="ov8"><rect x="63" y="85" width="272" height="18" rx="0"/></clipPath><clipPath id="cp9"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="ct10"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="cp11"><rect x="28" y="124" width="324" height="44"/></clipPath><clipPath id="ov12"><rect x="29" y="125" width="322" height="42" rx="11"/></clipPath><clipPath id="cp13"><rect x="37" y="137" width="18" height="18"/></clipPath><clipPath id="cp15"><rect x="63" y="137" width="272" height="18"/></clipPath><clipPath id="ov16"><rect x="63" y="137" width="272" height="18" rx="0"/></clipPath><clipPath id="cp17"><rect x="63" y="137" width="272" height="18"/></clipPath><clipPath id="ct18"><rect x="63" y="137" width="272" height="18"/></clipPath></defs><rect x="28.5" y="20.5" width="323" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g clip-path="url(#ct1)"><text x="37" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(98,98,103)">WORKSPACE</text></g></g><rect x="134.8" y="32" width="20.3" height="20" rx="10" fill="rgba(0,0,98,0.05)"/><rect x="135.5" y="32.5" width="19" height="19" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="141.41" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(98,98,103)">2</text><g clip-path="url(#cp3)"><rect x="28" y="72" width="324" height="44" rx="12" fill="rgb(214,233,249)"/><rect x="28.5" y="72.5" width="323" height="43" rx="11.5" fill="none" stroke="rgb(166,207,242)" stroke-width="1"/><g clip-path="url(#ov4)"><g clip-path="url(#cp5)"><g color="rgb(29, 29, 31)"><clipPath id="svgic6"><rect x="37" y="85" width="18" height="18"/></clipPath><g clip-path="url(#svgic6)"><g transform="matrix(.75 0 0 .75 37 85)"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M5.5 5.1 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.4-6.9A2 2 0 0 0 16.8 4H7.2a2 2 0 0 0-1.7 1.1" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><g clip-path="url(#cp7)"><g clip-path="url(#ov8)"><g clip-path="url(#cp9)"><g clip-path="url(#ct10)"><text x="63" y="100" font-family="system-ui, "-apple-system", sans-serif" font-size="16" font-weight="650" fill="rgb(29,29,31)">Inbox</text></g></g></g></g></g></g><g clip-path="url(#cp11)"><rect x="28.5" y="124.5" width="323" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#ov12)"><g clip-path="url(#cp13)"><g color="rgb(29, 29, 31)"><clipPath id="svgic14"><rect x="37" y="137" width="18" height="18"/></clipPath><g clip-path="url(#svgic14)"><g transform="matrix(.75 0 0 .75 37 137)"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.7-.9l-.8-1.2A2 2 0 0 0 7.9 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><g clip-path="url(#cp15)"><g clip-path="url(#ov16)"><g clip-path="url(#cp17)"><g clip-path="url(#ct18)"><text x="63" y="152" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(29,29,31)">Projects</text></g></g></g></g></g></g></svg>
|