@kerfjs/ui 5.0.0-beta.60 → 5.0.0-beta.62
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 +1 -0
- package/ai/component-catalog.json +141 -24
- package/ai/component-composition-rules.json +8 -0
- package/ai/component-composition.d.ts +10 -0
- package/ai/component-composition.json +117 -8
- package/ai/component-composition.schema.json +21 -0
- package/ai/components/README.md +5 -4
- package/ai/components/chip.md +72 -0
- package/ai/components/grid.md +10 -7
- package/ai/components/list-item.md +10 -7
- package/ai/components/pane.md +3 -2
- package/ai/components/select.md +6 -2
- package/ai/components/tabs.md +8 -4
- package/ai/components/toolbar-text.md +2 -1
- package/ai/components/toolbar.md +3 -2
- package/ai/public-api-signatures-v1.md +116 -24
- package/ai/skill.md +24 -4
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/app-tab.d.ts +12 -2
- package/dist/app-tab.js +1 -1
- package/dist/browser/chip.js +3 -0
- package/dist/catalog.js +8 -8
- package/dist/chip.d.ts +29 -0
- package/dist/chip.js +3 -0
- package/dist/chip.js.map +1 -0
- package/dist/{chunk-WPLIO5WJ.js → chunk-4MG3KXJM.js} +40 -5
- package/dist/chunk-4MG3KXJM.js.map +1 -0
- package/dist/{chunk-F7F7KRO2.js → chunk-4SQK27MR.js} +33 -18
- package/dist/chunk-4SQK27MR.js.map +1 -0
- package/dist/chunk-EAC4CDY7.js +57 -0
- package/dist/chunk-EAC4CDY7.js.map +1 -0
- package/dist/{chunk-T57AXDFM.js → chunk-ENGVYQPG.js} +4 -3
- package/dist/chunk-ENGVYQPG.js.map +1 -0
- package/dist/{chunk-5PESG2VP.js → chunk-KYDDCJXU.js} +4 -3
- package/dist/chunk-KYDDCJXU.js.map +1 -0
- package/dist/{chunk-MERWRTBG.js → chunk-N2DRU35S.js} +1 -1
- package/dist/chunk-N2DRU35S.js.map +1 -0
- package/dist/{chunk-EZVNC4J6.js → chunk-OD2VXAPL.js} +4 -1
- package/dist/chunk-OD2VXAPL.js.map +1 -0
- package/dist/{chunk-T66UNBXL.js → chunk-Q6YU3BT7.js} +11 -2
- package/dist/chunk-Q6YU3BT7.js.map +1 -0
- package/dist/{chunk-N3GKMPDW.js → chunk-RKTTF3L4.js} +3 -1
- package/dist/chunk-RKTTF3L4.js.map +1 -0
- package/dist/chunk-SWVW56CV.js +188 -0
- package/dist/chunk-SWVW56CV.js.map +1 -0
- package/dist/{chunk-46263QLK.js → chunk-UA6JW52D.js} +53 -7
- package/dist/chunk-UA6JW52D.js.map +1 -0
- package/dist/{chunk-AGXQQFKZ.js → chunk-UCKKT6KO.js} +13 -4
- package/dist/chunk-UCKKT6KO.js.map +1 -0
- package/dist/{chunk-3SXMEK3B.js → chunk-V3DX3K65.js} +1 -1
- package/dist/chunk-V3DX3K65.js.map +1 -0
- package/dist/{chunk-UWONG4QE.js → chunk-VCBTX62E.js} +11 -3
- package/dist/chunk-VCBTX62E.js.map +1 -0
- package/dist/{chunk-2OXQHM7I.js → chunk-X6ADHJNI.js} +45 -20
- package/dist/chunk-X6ADHJNI.js.map +1 -0
- package/dist/collapsible-panel.js +2 -2
- package/dist/grid.d.ts +13 -5
- package/dist/grid.js +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.js +17 -16
- package/dist/list-item.d.ts +11 -1
- package/dist/list-item.js +1 -1
- package/dist/nav-stack.d.ts +3 -1
- package/dist/nav-stack.js +1 -1
- package/dist/pane.d.ts +8 -3
- package/dist/pane.js +1 -1
- package/dist/popup-menu.d.ts +2 -2
- package/dist/popup-menu.js +1 -1
- package/dist/select-register.js +46 -0
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +16 -0
- package/dist/select.js +1 -1
- package/dist/split-view.d.ts +1 -1
- package/dist/split-view.js +1 -1
- package/dist/styles/app-tab.css +119 -0
- package/dist/styles/chip.css +118 -0
- package/dist/styles/grid.css +7 -0
- package/dist/styles/list-item.css +14 -9
- package/dist/styles/nav-stack.css +13 -0
- package/dist/styles/pane.css +33 -0
- package/dist/styles/popup-menu.css +2 -1
- package/dist/styles/resizable-region.css +9 -0
- package/dist/styles/segmented-control.css +2 -1
- package/dist/styles/select.css +45 -0
- package/dist/styles/split-view.css +6 -0
- package/dist/styles/styles.css +1 -0
- package/dist/styles/tab-bar.css +3 -0
- package/dist/styles/tab-scaffold.css +13 -0
- package/dist/styles/toolbar-text.css +15 -6
- package/dist/styles/toolbar.css +15 -5
- package/dist/styles/workbench.css +117 -93
- package/dist/tab-bar.d.ts +6 -2
- package/dist/tab-bar.js +1 -1
- package/dist/tab-scaffold.d.ts +3 -0
- package/dist/tab-scaffold.js +1 -0
- package/dist/tab-scaffold.js.map +1 -1
- package/dist/{token-search-field-CCke1yvQ.d.ts → token-search-field-DvgFLhLL.d.ts} +6 -2
- package/dist/token-search-field.d.ts +1 -1
- package/dist/token-search-model.d.ts +1 -1
- package/dist/token-search-model.js +1 -1
- package/dist/toolbar-text.d.ts +1 -1
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +2 -2
- package/dist/toolbar.js +1 -1
- package/dist/wire-catalog.js +1 -1
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-token-search-fields.d.ts +1 -1
- package/dist/workbench.js +1 -1
- package/docs/accessibility.md +29 -3
- package/docs/collapsible-panel.md +4 -3
- package/docs/component-contract.md +5 -0
- package/docs/component-selection.md +92 -11
- 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/layout.md +51 -9
- package/docs/nav-stack.md +5 -0
- package/docs/split-view.md +5 -0
- package/docs/sunken-panel.md +12 -0
- package/docs/tab-scaffold.md +5 -0
- package/docs/webawesome-theme.md +62 -0
- package/docs/workbench.md +22 -10
- package/llms.txt +40 -8
- package/package.json +7 -1
- package/dist/chunk-2OXQHM7I.js.map +0 -1
- package/dist/chunk-3SXMEK3B.js.map +0 -1
- package/dist/chunk-46263QLK.js.map +0 -1
- package/dist/chunk-5I7OHCIP.js +0 -96
- package/dist/chunk-5I7OHCIP.js.map +0 -1
- package/dist/chunk-5PESG2VP.js.map +0 -1
- package/dist/chunk-AGXQQFKZ.js.map +0 -1
- package/dist/chunk-EZVNC4J6.js.map +0 -1
- package/dist/chunk-F7F7KRO2.js.map +0 -1
- package/dist/chunk-MERWRTBG.js.map +0 -1
- package/dist/chunk-N3GKMPDW.js.map +0 -1
- package/dist/chunk-T57AXDFM.js.map +0 -1
- package/dist/chunk-T66UNBXL.js.map +0 -1
- package/dist/chunk-UWONG4QE.js.map +0 -1
- package/dist/chunk-WPLIO5WJ.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 492 268" width="492" height="268"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="88"/></clipPath><clipPath id="cp1"><rect x="16" y="164" width="460" height="88"/></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="88" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="142" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="164" width="460" height="88" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="268" 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)">Equal-width rounded</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="88"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="20" y="20" width="210.3" height="44"/></clipPath><clipPath id="svgimg4ov1"><rect x="21" y="21" width="208.3" height="42" rx="11"/></clipPath><filter id="svgimg4sh2" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg4ct3"><rect x="38.7" y="36" width="35.3" height="12"/></clipPath><clipPath id="svgimg4ct4"><rect x="114.1" y="36" width="22" height="12"/></clipPath><clipPath id="svgimg4ct5"><rect x="168.5" y="36" width="50.8" height="12"/></clipPath></defs><g clip-path="url(#svgimg4cp0)"><rect x="20" y="20" width="210.3" height="44" rx="12" fill="rgb(58,58,60)"/><rect x="20.5" y="20.5" width="209" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/></g><g clip-path="url(#svgimg4cp0)"><g clip-path="url(#svgimg4ov1)"><rect x="22" y="23" width="68.8" height="40" rx="10" fill="rgba(0,0,0,0.5)" filter="url(#svgimg4sh2)"/><rect x="22" y="22" width="68.8" height="40" rx="10" fill="rgb(28,28,30)"/><rect x="22.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgb(72,72,74)" stroke-width="1"/><text x="38.7" y="46" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(138,203,255)">Board</text><rect x="91.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="114.13" y="46" 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 492 268" width="492" height="268"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="88"/></clipPath><clipPath id="cp1"><rect x="16" y="164" width="460" height="88"/></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="88" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="142" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="164" width="460" height="88" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="268" 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)">Equal-width rounded</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="88"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="20" y="20" width="210.3" height="44"/></clipPath><clipPath id="svgimg4ov1"><rect x="21" y="21" width="208.3" height="42" rx="11"/></clipPath><filter id="svgimg4sh2" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg4ct3"><rect x="38.7" y="36" width="35.3" height="12"/></clipPath><clipPath id="svgimg4ct4"><rect x="114.1" y="36" width="22" height="12"/></clipPath><clipPath id="svgimg4ct5"><rect x="168.5" y="36" width="50.8" height="12"/></clipPath></defs><g clip-path="url(#svgimg4cp0)"><rect x="20" y="20" width="210.3" height="44" rx="12" fill="rgb(58,58,60)"/><rect x="20.5" y="20.5" width="209" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/></g><g clip-path="url(#svgimg4cp0)"><g clip-path="url(#svgimg4ov1)"><rect x="22" y="23" width="68.8" height="40" rx="10" fill="rgba(0,0,0,0.5)" filter="url(#svgimg4sh2)"/><rect x="22" y="22" width="68.8" height="40" rx="10" fill="rgb(28,28,30)"/><rect x="22.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgb(72,72,74)" stroke-width="1"/><text x="38.7" y="46" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(138,203,255)">Board</text><rect x="91.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="114.13" y="46" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(245,245,247)">List</text><rect x="160.5" y="22.5" width="67" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="168.5" y="46" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(245,245,247)">Timeline</text></g></g></g></g></g></g><text x="16" y="154" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(174,174,178)">Pill, small</text><g clip-path="url(#cp1)"><g clip-path="url(#irc6)"><clipPath id="svgimg7vclip"><rect x="16" y="164" width="460" height="88"/></clipPath><g clip-path="url(#svgimg7vclip)"><g transform="translate(16 164)"><defs><clipPath id="svgimg7cp0"><rect x="20" y="20" width="141.4" height="44"/></clipPath><clipPath id="svgimg7ov1"><rect x="21" y="21" width="139.4" height="42" rx="21"/></clipPath><clipPath id="svgimg7ct2"><rect x="31.5" y="36.5" width="21.1" height="11"/></clipPath><filter id="svgimg7sh3" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg7ct4"><rect x="70" y="36.5" width="30.3" height="11"/></clipPath><clipPath id="svgimg7ct5"><rect x="116.3" y="36.5" width="35.1" height="11"/></clipPath></defs><g clip-path="url(#svgimg7cp0)"><rect x="20" y="20" width="141.4" height="44" rx="22" fill="rgb(58,58,60)"/><rect x="20.5" y="20.5" width="140" height="43" rx="21.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg7ov1)"><rect x="22.5" y="22.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="31.47" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(245,245,247)">Day</text><rect x="62" y="23" width="46.3" height="40" rx="20" fill="rgba(0,0,0,0.5)" filter="url(#svgimg7sh3)"/><rect x="62" y="22" width="46.3" height="40" rx="20" fill="rgb(28,28,30)"/><rect x="62.5" y="22.5" width="45" height="39" rx="19.5" fill="none" stroke="rgb(72,72,74)" stroke-width="1"/><text x="70" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(138,203,255)">Week</text><rect x="108.5" y="22.5" width="50" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="116.28" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(245,245,247)">Month</text></g></g></g></g></g></g></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 492 268" width="492" height="268"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="88"/></clipPath><clipPath id="cp1"><rect x="16" y="164" width="460" height="88"/></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="88" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="142" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="164" width="460" height="88" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="268" 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)">Equal-width rounded</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="88"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="20" y="20" width="210.3" height="44"/></clipPath><clipPath id="svgimg4ov1"><rect x="21" y="21" width="208.3" height="42" rx="11"/></clipPath><filter id="svgimg4sh2" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg4ct3"><rect x="38.7" y="36" width="35.3" height="12"/></clipPath><clipPath id="svgimg4ct4"><rect x="114.1" y="36" width="22" height="12"/></clipPath><clipPath id="svgimg4ct5"><rect x="168.5" y="36" width="50.8" height="12"/></clipPath></defs><g clip-path="url(#svgimg4cp0)"><rect x="20" y="20" width="210.3" height="44" rx="12" fill="rgb(229,229,234)"/><rect x="20.5" y="20.5" width="209" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/></g><g clip-path="url(#svgimg4cp0)"><g clip-path="url(#svgimg4ov1)"><rect x="22" y="23" width="68.8" height="40" rx="10" fill="rgba(0,0,0,0.14)" filter="url(#svgimg4sh2)"/><rect x="22" y="22" width="68.8" height="40" rx="10" fill="rgb(255,255,255)"/><rect x="22.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgb(209,209,214)" stroke-width="1"/><text x="38.7" y="46" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(12,98,243)">Board</text><rect x="91.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="114.13" y="46" 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 492 268" width="492" height="268"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="88"/></clipPath><clipPath id="cp1"><rect x="16" y="164" width="460" height="88"/></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="88" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="142" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="164" width="460" height="88" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="268" 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)">Equal-width rounded</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="88"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="20" y="20" width="210.3" height="44"/></clipPath><clipPath id="svgimg4ov1"><rect x="21" y="21" width="208.3" height="42" rx="11"/></clipPath><filter id="svgimg4sh2" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg4ct3"><rect x="38.7" y="36" width="35.3" height="12"/></clipPath><clipPath id="svgimg4ct4"><rect x="114.1" y="36" width="22" height="12"/></clipPath><clipPath id="svgimg4ct5"><rect x="168.5" y="36" width="50.8" height="12"/></clipPath></defs><g clip-path="url(#svgimg4cp0)"><rect x="20" y="20" width="210.3" height="44" rx="12" fill="rgb(229,229,234)"/><rect x="20.5" y="20.5" width="209" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/></g><g clip-path="url(#svgimg4cp0)"><g clip-path="url(#svgimg4ov1)"><rect x="22" y="23" width="68.8" height="40" rx="10" fill="rgba(0,0,0,0.14)" filter="url(#svgimg4sh2)"/><rect x="22" y="22" width="68.8" height="40" rx="10" fill="rgb(255,255,255)"/><rect x="22.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgb(209,209,214)" stroke-width="1"/><text x="38.7" y="46" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(12,98,243)">Board</text><rect x="91.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="114.13" y="46" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(29,29,31)">List</text><rect x="160.5" y="22.5" width="67" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="168.5" y="46" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(29,29,31)">Timeline</text></g></g></g></g></g></g><text x="16" y="154" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Pill, small</text><g clip-path="url(#cp1)"><g clip-path="url(#irc6)"><clipPath id="svgimg7vclip"><rect x="16" y="164" width="460" height="88"/></clipPath><g clip-path="url(#svgimg7vclip)"><g transform="translate(16 164)"><defs><clipPath id="svgimg7cp0"><rect x="20" y="20" width="141.4" height="44"/></clipPath><clipPath id="svgimg7ov1"><rect x="21" y="21" width="139.4" height="42" rx="21"/></clipPath><clipPath id="svgimg7ct2"><rect x="31.5" y="36.5" width="21.1" height="11"/></clipPath><filter id="svgimg7sh3" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg7ct4"><rect x="70" y="36.5" width="30.3" height="11"/></clipPath><clipPath id="svgimg7ct5"><rect x="116.3" y="36.5" width="35.1" height="11"/></clipPath></defs><g clip-path="url(#svgimg7cp0)"><rect x="20" y="20" width="141.4" height="44" rx="22" fill="rgb(229,229,234)"/><rect x="20.5" y="20.5" width="140" height="43" rx="21.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg7ov1)"><rect x="22.5" y="22.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="31.47" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(29,29,31)">Day</text><rect x="62" y="23" width="46.3" height="40" rx="20" fill="rgba(0,0,0,0.14)" filter="url(#svgimg7sh3)"/><rect x="62" y="22" width="46.3" height="40" rx="20" fill="rgb(255,255,255)"/><rect x="62.5" y="22.5" width="45" height="39" rx="19.5" fill="none" stroke="rgb(209,209,214)" stroke-width="1"/><text x="70" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(12,98,243)">Week</text><rect x="108.5" y="22.5" width="50" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="116.28" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(29,29,31)">Month</text></g></g></g></g></g></g></svg>
|
package/docs/layout.md
CHANGED
|
@@ -36,6 +36,37 @@ size) tall, and below that lets the whole pane scroll as one column, header,
|
|
|
36
36
|
content, and footer together, so the content keeps its natural height. The
|
|
37
37
|
default `fixed` always pins them.
|
|
38
38
|
|
|
39
|
+
### Lowered work surfaces
|
|
40
|
+
|
|
41
|
+
Set `appearance="sunken"` when the work area itself should use the lowered
|
|
42
|
+
surface color, including blank space below short content and the scroll
|
|
43
|
+
viewport. The default appearance is unchanged. The fixed Pane paints its
|
|
44
|
+
content scroller; with `chromePlacement="auto"`, the Pane root paints the
|
|
45
|
+
surface because it becomes the scroller in a short viewport. Header and footer
|
|
46
|
+
chrome stay on the normal surface. No second scroll container or
|
|
47
|
+
`SunkenPanel` wrapper is needed.
|
|
48
|
+
For custom chrome colors in auto mode, set `--kui-pane-chrome-background`
|
|
49
|
+
on the Pane; it defaults to `--kui-color-surface`.
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
<Pane appearance="sunken" footer={<Composer />}>
|
|
53
|
+
<Conversation />
|
|
54
|
+
</Pane>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
`PaneConfig.appearance` forwards through Workbench `mainPane`, panel `pane`,
|
|
58
|
+
and CollapsiblePanel `pane`. Workbench also applies that choice to its main or
|
|
59
|
+
panel region when it renders no Pane chrome. Set `appearance: "sunken"` on a
|
|
60
|
+
`NavStackView` or `TabScaffoldTab` when its view or scene owns scrolling.
|
|
61
|
+
For a `SplitView`, put a `Pane` in the list or detail region and set its
|
|
62
|
+
appearance; SplitView only arranges the regions and does not own their scroll.
|
|
63
|
+
Choose the innermost owner when composing layouts.
|
|
64
|
+
|
|
65
|
+
The color uses `--kui-sunken-panel-background`, falling back to
|
|
66
|
+
`--kui-color-surface-lowered`, just like `SunkenPanel`. Select one scroll owner
|
|
67
|
+
in a nested layout so a translucent override paints once. The public color
|
|
68
|
+
override may be set at a Pane or layout boundary.
|
|
69
|
+
|
|
39
70
|
Pass any combination of logical sides to `separators`: `block-start`,
|
|
40
71
|
`block-end`, `inline-start`, and `inline-end`. Every line is off by default and
|
|
41
72
|
each enabled side uses `--kui-pane-separator-width` (1px) and
|
|
@@ -331,26 +362,37 @@ insets.
|
|
|
331
362
|
|
|
332
363
|
## Grid
|
|
333
364
|
|
|
334
|
-
Use `Grid` from `@kerfjs/ui/grid` when
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
365
|
+
Use `Grid` from `@kerfjs/ui/grid` when equal-width columns must share the
|
|
366
|
+
available width. Set a fixed positive `columns` count or a typed
|
|
367
|
+
`minColumnWidth` for automatic container-width collapse. Fixed tracks use
|
|
368
|
+
`minmax(0, 1fr)`; responsive tracks use `auto-fit` and cap their minimum at
|
|
369
|
+
100% so a narrow container keeps one column without overflow. Grid defaults
|
|
370
|
+
to the `xs` gap and accepts the same finite spacing names, complete typed
|
|
371
|
+
`CssLength` values, and typed flex-participation contract as Row.
|
|
339
372
|
|
|
340
373
|
```tsx
|
|
341
374
|
import { Grid } from "@kerfjs/ui/grid";
|
|
375
|
+
import { px } from "@kerfjs/ui/css-values";
|
|
342
376
|
|
|
343
377
|
<Grid columns={2} gap="m">
|
|
344
378
|
<label>Quantity <input /></label>
|
|
345
379
|
<label>Unit <input /></label>
|
|
346
380
|
</Grid>;
|
|
381
|
+
|
|
382
|
+
<Grid minColumnWidth={px(376)} gap="m">
|
|
383
|
+
<label>Provider <input /></label>
|
|
384
|
+
<label>Endpoint <input /></label>
|
|
385
|
+
</Grid>;
|
|
347
386
|
```
|
|
348
387
|
|
|
349
388
|
`columns` must be a positive safe integer; invalid counts throw instead of
|
|
350
|
-
silently producing invalid CSS.
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
389
|
+
silently producing invalid CSS. Import `px` from `@kerfjs/ui/css-values` for a
|
|
390
|
+
pixel minimum. `columns` and `minColumnWidth` are mutually exclusive. In the
|
|
391
|
+
responsive mode, the container width decides how many equal tracks fit; constrain
|
|
392
|
+
the Grid's outer width when the form should have a maximum count. Grid is
|
|
393
|
+
layout-only and adds no ARIA grid role. The application owns child semantics.
|
|
394
|
+
Use application-owned CSS grid for intrinsic, asymmetric, spanning, or masonry
|
|
395
|
+
tracks, and use `ResizableRegion` when people must adjust a boundary.
|
|
354
396
|
|
|
355
397
|
## Row and List alignment
|
|
356
398
|
|
package/docs/nav-stack.md
CHANGED
|
@@ -60,6 +60,11 @@ optional per-view `bottomToolbar`. The component-level
|
|
|
60
60
|
The back control appears automatically once the stack has more than one entry;
|
|
61
61
|
`wireNavStack`'s `onBack` is where the app pops its own signal.
|
|
62
62
|
|
|
63
|
+
Set a view's `appearance: "sunken"` to paint its scroll viewport with the
|
|
64
|
+
shared lowered-surface color, including space after short content. When the
|
|
65
|
+
view holds a `Pane` as its only child, set the appearance on the Pane instead
|
|
66
|
+
if its content owns scrolling. See [Lowered work surfaces](layout.md#lowered-work-surfaces).
|
|
67
|
+
|
|
63
68
|
## The top toolbar
|
|
64
69
|
|
|
65
70
|
The top chrome is a real `Toolbar`, so it follows the same zone,
|
package/docs/split-view.md
CHANGED
|
@@ -26,6 +26,11 @@ shared interior edge. A pane whose only child is a `Pane` lets that child own
|
|
|
26
26
|
the insets, and the compact form hands them to its `NavStack`. See
|
|
27
27
|
[Choosing an app layout › Safe areas](app-layouts.md#safe-areas).
|
|
28
28
|
|
|
29
|
+
For a lowered list or detail background, render a `Pane` in that region with
|
|
30
|
+
`appearance="sunken"`. SplitView arranges regions but does not own their
|
|
31
|
+
vertical scroll; its compact NavStack form can use the view's or nested Pane's
|
|
32
|
+
appearance. See [Lowered work surfaces](layout.md#lowered-work-surfaces).
|
|
33
|
+
|
|
29
34
|
## Responsive by device class
|
|
30
35
|
|
|
31
36
|
`SplitView` is declarative; the app derives `compact` from the device class and
|
package/docs/sunken-panel.md
CHANGED
|
@@ -38,6 +38,10 @@ Do not use `SunkenPanel` merely to add padding, as a substitute for pane
|
|
|
38
38
|
header/content/footer anatomy, or around a child that already owns the same
|
|
39
39
|
outer surface.
|
|
40
40
|
|
|
41
|
+
For a lowered scrolling work area with Pane chrome, use
|
|
42
|
+
[`Pane appearance="sunken"`](layout.md#lowered-work-surfaces). It paints the
|
|
43
|
+
scroll viewport and empty space without adding a second scroller.
|
|
44
|
+
|
|
41
45
|
## Public styling boundary
|
|
42
46
|
|
|
43
47
|
Override the public properties at the composition boundary:
|
|
@@ -48,6 +52,14 @@ Override the public properties at the composition boundary:
|
|
|
48
52
|
- `--kui-sunken-panel-gap`
|
|
49
53
|
- `--kui-sunken-panel-radius`
|
|
50
54
|
|
|
55
|
+
`--kui-sunken-panel-background` can be overridden for a known backdrop. Keep
|
|
56
|
+
the default lowered surface opaque; a translucent override compounds when
|
|
57
|
+
sunken panels nest. See [Contextual transparency](./webawesome-theme.md#contextual-transparency)
|
|
58
|
+
for the color and contrast evaluation and its opt-in bounded prototype. The
|
|
59
|
+
prototype also compares Pane and Web Awesome sunken surfaces. Assign its
|
|
60
|
+
first, second, and transparent deeper tints on application-owned wrappers;
|
|
61
|
+
a single translucent override on every nested surface has no depth cap.
|
|
62
|
+
|
|
51
63
|
The public root class is `.kui-sunken-panel`. Prefer the properties above over
|
|
52
64
|
styling descendants. The `square` shape deliberately overrides the radius
|
|
53
65
|
property with zero; use `rounded` when customizing the radius token.
|
package/docs/tab-scaffold.md
CHANGED
|
@@ -59,6 +59,11 @@ truncate horizontally with an ellipsis when a destination name exceeds its
|
|
|
59
59
|
share of the bar. On larger device classes, promote the tab set to a
|
|
60
60
|
`Workbench` rail or a persistent sidebar instead of a bottom bar.
|
|
61
61
|
|
|
62
|
+
Set a tab's `appearance: "sunken"` when its scene owns scrolling and should
|
|
63
|
+
paint the lowered surface behind short or long content. For a scene whose
|
|
64
|
+
only child is a `Pane` or `NavStack`, set appearance on that child's scroll
|
|
65
|
+
owner. See [Lowered work surfaces](layout.md#lowered-work-surfaces).
|
|
66
|
+
|
|
62
67
|
## Scroll divider
|
|
63
68
|
|
|
64
69
|
The bar has no permanent top border. With `wireScrollDividers(appRoot)`
|
package/docs/webawesome-theme.md
CHANGED
|
@@ -131,6 +131,68 @@ tiers:
|
|
|
131
131
|
content stays compact and the action group has a clearer boundary. These two
|
|
132
132
|
parts do not inherit the dialog's shared `--spacing` value.
|
|
133
133
|
|
|
134
|
+
## Contextual transparency
|
|
135
|
+
|
|
136
|
+
Keep the shared `--kui-color-*` semantic fills, foregrounds, and borders opaque
|
|
137
|
+
by default. Their light and dark values mirror the Web Awesome theme, and the
|
|
138
|
+
contrast checks in `tests/browser/tone-contrast.spec.ts` assume known surfaces.
|
|
139
|
+
Compositing those tokens over arbitrary app backgrounds changes text contrast
|
|
140
|
+
and makes the same token mean a different visible color in each container.
|
|
141
|
+
|
|
142
|
+
The strongest candidate for transparency is a **component-scoped sunken
|
|
143
|
+
background**, through the existing `--kui-sunken-panel-background` and
|
|
144
|
+
`--kui-wa-sunken-background` overrides. A simple black overlay of 5.5% over
|
|
145
|
+
white approximates `#f1f1f1`, near the current light lowered surface; a second
|
|
146
|
+
nesting level becomes `#e4e4e4`. Matching the current dark lowered surface from
|
|
147
|
+
`#1c1c1e` takes about 39% black, and a second layer becomes near-black
|
|
148
|
+
`#0a0a0b`. An alpha that works for one level therefore needs a separate nesting
|
|
149
|
+
rule or a lighter dark treatment before it can become a default. The existing
|
|
150
|
+
opaque `--kui-color-surface-lowered` remains appropriate for page backgrounds.
|
|
151
|
+
|
|
152
|
+
| Candidate | Finding |
|
|
153
|
+
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
154
|
+
| Selected `ListItem` fill and border | A translucent brand layer would preserve a tinted or textured backdrop. Keep it in the component's existing `--kui-list-item-selected-*` overrides: making the shared brand fill translucent would also affect components that put `--kui-color-brand-on-fill` text on it. A 16% brand overlay gives about 4.35:1 for that text over the light lowered surface and 3.99:1 over a warm `#eee7dc` surface, below the 4.5:1 text target. |
|
|
155
|
+
| `ToolbarControlGroup` fill and border | A light 10% black layer approximates the current fill over white, and a dark 13% white layer approximates it over the dark surface. On a warm `#eee7dc` backdrop, the light layer puts the existing quiet text at about 3.31:1. Its dark tone already uses a translucent fill. Keep default control chrome opaque until a backdrop matrix validates its text, icons, borders, and selected state. |
|
|
156
|
+
| Quiet or disabled text and icons | Keep normal and quiet text/foreground tokens opaque; alpha changes their contrast with every backdrop. Disabled controls may use component-owned opacity, as they do now, without weakening shared foreground tokens. |
|
|
157
|
+
| Dividers and borders | Decorative separators can use scoped alpha over a known surface. Control boundaries and focus indicators need reliable contrast; do not replace the shared border or focus tokens with alpha globally. |
|
|
158
|
+
|
|
159
|
+
### Bounded translucent prototype
|
|
160
|
+
|
|
161
|
+
The opt-in catalog prototype (`SunkenPanel` → Backdrop-aware prototype) uses
|
|
162
|
+
the existing public background overrides on `SunkenPanel`, `Pane`, and Web
|
|
163
|
+
Awesome sunken Card/Details. It does not change shared semantic tokens or
|
|
164
|
+
component defaults. The application assigns a depth class to each
|
|
165
|
+
application-owned wrapper; the component inside inherits its public color
|
|
166
|
+
override:
|
|
167
|
+
|
|
168
|
+
| Depth | Light tint | Dark tint | Treatment |
|
|
169
|
+
| ---------------- | ----------- | ----------- | ----------------------------------------------- |
|
|
170
|
+
| First | 5.5% black | 12% black | Shows the backdrop through the lowered surface. |
|
|
171
|
+
| Second | 3.5% black | 5% black | Adds a smaller inset step. |
|
|
172
|
+
| Third and deeper | transparent | transparent | Caps accumulated darkening. |
|
|
173
|
+
|
|
174
|
+
Over default white, the light levels approximate `#f1f1f1` then `#e9e9e9`;
|
|
175
|
+
over dark default `#1c1c1e`, they approximate `#19191a` then `#171719`.
|
|
176
|
+
The dark lowered backdrop reaches roughly `#0f0f11` then `#0e0e10`, which is
|
|
177
|
+
still visually close to black. Warm and textured backdrops retain their tone
|
|
178
|
+
and pattern; the first and second layers remain discernible in light mode but
|
|
179
|
+
are subtle in dark mode. These values are sRGB estimates; actual rendering
|
|
180
|
+
depends on backdrop and browser.
|
|
181
|
+
|
|
182
|
+
The browser matrix covers one and two layers on default, lowered, warm, and
|
|
183
|
+
two textured stripe colors in light and dark, across Chromium, Firefox, and
|
|
184
|
+
WebKit. It composites computed text and control colors with each tint and
|
|
185
|
+
requires at least 4.5:1 for panel text, an opaque button, Card text, and
|
|
186
|
+
Details text. It also checks a visible focus outline with forced colors and
|
|
187
|
+
the third layer's transparent cap. Theme colors must finish transitioning
|
|
188
|
+
before contrast is measured. The prototype keeps controls on opaque semantic
|
|
189
|
+
surfaces for predictable contrast.
|
|
190
|
+
|
|
191
|
+
Keep this treatment opt-in. It needs explicit depth assignment, and the dark
|
|
192
|
+
lowered case has too little separation to replace the opaque default. A
|
|
193
|
+
future default would need a stronger depth and contrast rule for arbitrary
|
|
194
|
+
backdrops, especially dark textures and nested mixed components.
|
|
195
|
+
|
|
134
196
|
Add `class="hide-actions"` to a `wa-dialog` when the dialog supplies its own
|
|
135
197
|
dismissal affordance and should omit Web Awesome's header action region. The
|
|
136
198
|
theme sets `display: none` on the directly exported `header-actions` part; it
|
package/docs/workbench.md
CHANGED
|
@@ -80,8 +80,9 @@ an optional `label`. Common shell behavior is configured rather than restyled:
|
|
|
80
80
|
- `separator: "auto" | "hidden"` controls the owned dock-edge separator;
|
|
81
81
|
- `collapseMotion: "slide" | "fade-slide" | "none"` keeps the track change
|
|
82
82
|
instant while choosing composited content motion;
|
|
83
|
-
- `contentOverflow: "clip" | "auto" | "visible"`
|
|
84
|
-
|
|
83
|
+
- `contentOverflow: "clip" | "auto" | "visible"` chooses the resting overflow
|
|
84
|
+
policy. An open descendant `PopupMenu` or Web Awesome dropdown temporarily
|
|
85
|
+
releases rail/drawer clipping and raises its popup layer automatically;
|
|
85
86
|
- `presentation: "inline" | "overlay" | "hidden"` supports compact overlays
|
|
86
87
|
or a responsive replacement. An overlay rail spans the Workbench height at
|
|
87
88
|
its side and an overlay drawer spans the work-area column at the bottom,
|
|
@@ -236,11 +237,14 @@ The `Pane`s and `List`s the Workbench composes around your content are
|
|
|
236
237
|
configurable the same way:
|
|
237
238
|
|
|
238
239
|
- `mainPane` (`PaneConfig`: `contentElement`, `contentLabel`, `separators`,
|
|
239
|
-
`safeAreaEdges`, `chromeDividers`) configures the work area's
|
|
240
|
-
work area has a toolbar, `mainHeader`, or
|
|
240
|
+
`safeAreaEdges`, `chromeDividers`, `appearance`) configures the work area's
|
|
241
|
+
`Pane`, which exists whenever the work area has a toolbar, `mainHeader`, or
|
|
242
|
+
`mainFooter`. Without that chrome, `appearance: "sunken"` paints the main
|
|
243
|
+
region's own scroll surface;
|
|
241
244
|
- a panel's `pane` configures the `Pane` a `toolbar` panel's `content` renders
|
|
242
245
|
in — for example `{ contentElement: "nav", contentLabel: "Files" }` for a
|
|
243
|
-
navigator rail
|
|
246
|
+
navigator rail. Without a toolbar, `appearance: "sunken"` paints the panel
|
|
247
|
+
scroll region;
|
|
244
248
|
- `mainHeaderList` / `mainFooterList` (`ListConfig`: `gap`, `hAlign`,
|
|
245
249
|
`vAlign`, `dividerSides`, `textInsets`, `controlInsets`) configure the
|
|
246
250
|
`List`s holding `mainHeader` / `mainFooter`.
|
|
@@ -310,8 +314,8 @@ const stop = wireWorkbench(root, {
|
|
|
310
314
|
```
|
|
311
315
|
|
|
312
316
|
- **Pointer:** dragging the separator resizes the panel live (the wire marks
|
|
313
|
-
|
|
314
|
-
size to the signal on release.
|
|
317
|
+
the rail or drawer `data-resizing` and suppresses its content transform
|
|
318
|
+
transition) and commits the final size to the signal on release.
|
|
315
319
|
- **Keyboard:** focus the separator; arrow keys resize by `step` (16px),
|
|
316
320
|
Shift+arrow by `largeStep` (64px), Home/End jump to `min`/`max`. The
|
|
317
321
|
separator's `aria-valuenow`/`aria-valuemin`/`aria-valuemax` report the size
|
|
@@ -506,7 +510,6 @@ with state-derived props:
|
|
|
506
510
|
collapsed={!drawerVisible.value}
|
|
507
511
|
separator={magnified.value ? "hidden" : "auto"}
|
|
508
512
|
collapseMotion="fade-slide"
|
|
509
|
-
contentOverflow={createMenuOpen.value ? "visible" : "clip"}
|
|
510
513
|
presentation={mobile.value ? "overlay" : "inline"}
|
|
511
514
|
restoreControl={
|
|
512
515
|
<ToolbarControlGroup label="Terminals" single>
|
|
@@ -528,8 +531,10 @@ collapse slides it out at the resized width. A collapsed,
|
|
|
528
531
|
overlay, or hidden region is not resizeable. Together these policies replace
|
|
529
532
|
app CSS for separator suppression, instant-track/composited-content collapse,
|
|
530
533
|
popup overflow, mobile overlay/hidden replacement, resize-transition guards,
|
|
531
|
-
and safe-area restore placement.
|
|
532
|
-
|
|
534
|
+
and safe-area restore placement. A descendant `PopupMenu` or Web Awesome
|
|
535
|
+
dropdown with `open` releases clipping for its lifecycle, so menu events need
|
|
536
|
+
not rerender the region. The app still owns the other signals and decides when
|
|
537
|
+
each policy applies.
|
|
533
538
|
|
|
534
539
|
## Public styling boundary
|
|
535
540
|
|
|
@@ -556,6 +561,13 @@ takes that edge away, and collapsing it (or presenting it as an overlay) hands
|
|
|
556
561
|
the edge back. A region whose only child is a `Pane` or layout lets that child
|
|
557
562
|
own the insets. See [Choosing an app layout › Safe areas](app-layouts.md#safe-areas).
|
|
558
563
|
|
|
564
|
+
Workbench projects panel presentation, collapse, and responsive breakpoint
|
|
565
|
+
state onto its own region attributes. Its stylesheet then matches those local
|
|
566
|
+
attributes instead of searching descendants during list updates. It clears the
|
|
567
|
+
edge context on each region, while a sole Pane or layout child receives the
|
|
568
|
+
insets it owns. Applications still pass arbitrary `main` and panel content;
|
|
569
|
+
they need no marker classes or extra wrappers.
|
|
570
|
+
|
|
559
571
|
## How the collapse animates
|
|
560
572
|
|
|
561
573
|
Collapsing snaps the panel's flex track to zero in a single reflow (so the work
|
package/llms.txt
CHANGED
|
@@ -161,6 +161,9 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
161
161
|
expanded trailing control to a full second row at `responsiveAt`; the leading
|
|
162
162
|
title remains above it. Public leading-min-width, trailing-gap/justify, and
|
|
163
163
|
per-zone inline-padding tokens cover app-specific toolbar geometry.
|
|
164
|
+
`--kui-toolbar-inset: 0px` removes an embedded Toolbar's outer padding and
|
|
165
|
+
corresponding minimum-height allowance while preserving its zone gap and
|
|
166
|
+
safe-area compensation.
|
|
164
167
|
- **Position region restore controls declaratively.** A ResizableRegion has a
|
|
165
168
|
background token, `contentOverflow="visible"` for an anchored popup,
|
|
166
169
|
top/bottom `restorePosition`, typed `restoreInset`, and
|
|
@@ -172,6 +175,9 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
172
175
|
`divider` owns row separators and `state="drag-target"` paints the drop
|
|
173
176
|
target. Public ListItem tokens set row, icon, label, and trailing geometry;
|
|
174
177
|
ListHeader height, title padding, and border tokens tune section density.
|
|
178
|
+
For a filled command list, scope `--kui-list-item-background`,
|
|
179
|
+
`--kui-list-item-border`, `--kui-list-item-hover-border`, and
|
|
180
|
+
`--kui-list-item-selected-border` at the list or row boundary.
|
|
175
181
|
- **Use `Row` for horizontal and `List` for vertical layout.** Both expose
|
|
176
182
|
physical `hAlign`/`vAlign` props and typed gaps. Row defaults to left/full,
|
|
177
183
|
an `xs` gap, and no wrapping; List retains full/top and zero-gap defaults.
|
|
@@ -190,11 +196,11 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
190
196
|
or `foregroundColorVar()`; fill tokens such as `uiColor('success-fill-quiet')` do not
|
|
191
197
|
type-check. These brands are intentionally
|
|
192
198
|
not interchangeable; rows use classes/tokens/props rather than raw `style`.
|
|
193
|
-
- **Use `Grid` for a fixed positive
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
199
|
+
- **Use `Grid` for equal-width columns.** Set a fixed positive `columns` count
|
|
200
|
+
or typed `minColumnWidth` for automatic container-width collapse, never both.
|
|
201
|
+
The app owns the outer width and child semantics; use custom CSS grid for
|
|
202
|
+
asymmetric/intrinsic tracks and `ResizableRegion` for adjustable boundaries.
|
|
203
|
+
`Grid.gap` and `Grid.flex` use the same typed grammars as Row.
|
|
198
204
|
- **Give a layout root `fill`, not a frame `Pane`.** A Row, List, or Grid that
|
|
199
205
|
is the sole layout root of a definite-height parent takes its full height
|
|
200
206
|
with `fill` and carries safe `data-*` markers through `rootAttributes`.
|
|
@@ -234,6 +240,13 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
234
240
|
toolbar filter menu adds `selectedPresentation="icon-only"` and a fixed
|
|
235
241
|
`triggerIcon`: the trigger shows that icon plus a count badge while any
|
|
236
242
|
choice is chosen, and its accessible name ends with the chosen labels.
|
|
243
|
+
Set `caret={false}` on an icon-only toolbar Select to make a round trigger;
|
|
244
|
+
the default keeps the visible caret.
|
|
245
|
+
`SelectChoice.disabled` keeps an unavailable option visible but unselectable;
|
|
246
|
+
`disabledReason` adds its tooltip. For multiple selects, opt in to
|
|
247
|
+
`selectAllLabel` and `clearLabel` footer buttons to select enabled choices
|
|
248
|
+
or clear the value through ordinary change events. The app owns the updated
|
|
249
|
+
controlled value and localized action labels.
|
|
237
250
|
Icon-only Selects (single or multiple) and icon-only `PopupMenu`s show an
|
|
238
251
|
`aria-hidden` Web Awesome help tag repeating that name (and a Select's
|
|
239
252
|
choice) on hover and keyboard focus, hidden while the popup is open; the
|
|
@@ -264,7 +277,8 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
264
277
|
in a `single` `ToolbarControlGroup` with `nestedDropdown`; never hand-write
|
|
265
278
|
`wa-dropdown` markup for a menu. Let the group size the trigger from its icon,
|
|
266
279
|
localized text, and caret. `PopupMenu` items also support nested `submenu`
|
|
267
|
-
actions, checked or trailing choice marks, danger tone,
|
|
280
|
+
actions, headings, dividers, checked or trailing choice marks, danger tone,
|
|
281
|
+
and disabled reasons; nested headings/dividers stay out of keyboard choices;
|
|
268
282
|
use `context` with `openPopupMenuAt`/`closePopupMenu` for pointer-anchored row
|
|
269
283
|
menus. Do not force a dropdown or button width. Nothing
|
|
270
284
|
wraps inside a group: an icon sits beside its label on one row, and a
|
|
@@ -285,6 +299,8 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
285
299
|
app-owned content below. Do not create a private heading wrapper or restyle the
|
|
286
300
|
toolbar. A narrow peripheral rail or drawer, where extra-large would truncate
|
|
287
301
|
at its minimum size, names itself with the default `ToolbarText` size.
|
|
302
|
+
`ToolbarText size="xlarge-fixed"` keeps the 20px `--kui-font-l` heading step;
|
|
303
|
+
`xlarge` retains the responsive page-title clamp.
|
|
288
304
|
- **Use `Text` for ordinary semantic headings, paragraphs, and inline secondary
|
|
289
305
|
text outside toolbar title zones.** Omit `variant` for the default `p`, pass
|
|
290
306
|
`h1`–`h6` based on the document outline, or use `variant="span"` inside a row,
|
|
@@ -358,7 +374,14 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
358
374
|
Select All deletion does the same; deletion
|
|
359
375
|
restoration finishes before the next keystroke rather than on a delayed frame.
|
|
360
376
|
Persist both query and remaining tokens read from an edited field; change
|
|
361
|
-
`revision` to replace
|
|
377
|
+
`revision` to replace unmanaged DOM-owned text programmatically, or call
|
|
378
|
+
`model.replace({ query, tokens })` for a model-managed field. In grammar-assisted
|
|
379
|
+
search, a model rule's `suggest(input, state)` receives current committed tokens
|
|
380
|
+
so suggestions can omit selected values; one-argument callbacks still work.
|
|
381
|
+
A sibling helper can call `model.commit(value)` for the active `name:` prefix
|
|
382
|
+
even when that value is not suggested; invalid values and missing prefixes
|
|
383
|
+
leave state unchanged.
|
|
384
|
+
The one richer case is `wireTokenSearchFields`, which manages the
|
|
362
385
|
collapsible field's expand/collapse/focus by default (on, per-behavior opt-out) and
|
|
363
386
|
exposes the `expanded` signal on its handle — bind it in render or hand in your own
|
|
364
387
|
via `collapsible.signals`. Do not hand-roll open/collapse/focus that helper
|
|
@@ -404,8 +427,13 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
404
427
|
closed value ellipsizes when space runs out.
|
|
405
428
|
- **Configure application tabs at their owners.** AppTab's `icon-only`
|
|
406
429
|
presentation keeps `name` accessible, `labelMaxWidth` ellipsizes a long name,
|
|
407
|
-
|
|
430
|
+
`nameOverflow="visible"` shows the full name during inline loading, and
|
|
431
|
+
`dropTarget` highlights a drag-over without changing selection. `attention`
|
|
432
|
+
uses `--kui-app-tab-attention-color`. TabBar's public
|
|
408
433
|
`--kui-tab-bar-strip-*` tokens set compact strip geometry.
|
|
434
|
+
Set `pinned` on the first AppTab to keep it visible within a scrolling
|
|
435
|
+
tablist; it remains in keyboard order. Use `--kui-app-tab-pinned-background`
|
|
436
|
+
for the surrounding surface and keep that backdrop opaque.
|
|
409
437
|
- **Use `Badge` for compact non-interactive metadata.** Configure its semantic
|
|
410
438
|
tone, appearance, shape, and size instead of creating badge CSS in an app or
|
|
411
439
|
consuming component. Use a real button or link for interactive content.
|
|
@@ -413,6 +441,10 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
413
441
|
takes no children, and needs a `label` (announced as an image) or
|
|
414
442
|
`ariaHidden` when its owner announces it. A `TabScaffold` tab shows the dot
|
|
415
443
|
with `badge: true` plus its required `badgeLabel`.
|
|
444
|
+
- **Use `Chip` for removable tags.** Give the native remove button a delegated
|
|
445
|
+
`removeAction` and a specific `removeLabel`; the application updates the tag
|
|
446
|
+
list. `itemId` identifies the chip to the action handler. `size="compact"`
|
|
447
|
+
gives a 20px chip and 16px remove button; `disabled` disables removal.
|
|
416
448
|
|
|
417
449
|
## Public exports
|
|
418
450
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kerfjs/ui",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.62",
|
|
4
4
|
"description": "Accessible, composable UI primitives for kerf applications.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -65,6 +65,11 @@
|
|
|
65
65
|
"browser": "./dist/browser/badge.js",
|
|
66
66
|
"import": "./dist/badge.js"
|
|
67
67
|
},
|
|
68
|
+
"./chip": {
|
|
69
|
+
"types": "./dist/chip.d.ts",
|
|
70
|
+
"browser": "./dist/browser/chip.js",
|
|
71
|
+
"import": "./dist/chip.js"
|
|
72
|
+
},
|
|
68
73
|
"./toolbar": {
|
|
69
74
|
"types": "./dist/toolbar.d.ts",
|
|
70
75
|
"browser": "./dist/browser/toolbar.js",
|
|
@@ -336,6 +341,7 @@
|
|
|
336
341
|
"./styles.css": "./dist/styles/styles.css",
|
|
337
342
|
"./lucide-icon.css": "./dist/styles/lucide-icon.css",
|
|
338
343
|
"./badge.css": "./dist/styles/badge.css",
|
|
344
|
+
"./chip.css": "./dist/styles/chip.css",
|
|
339
345
|
"./disclosure-arrow.css": "./dist/styles/disclosure-arrow.css",
|
|
340
346
|
"./toolbar.css": "./dist/styles/toolbar.css",
|
|
341
347
|
"./toolbar-control-group.css": "./dist/styles/toolbar-control-group.css",
|