@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.
Files changed (142) hide show
  1. package/README.md +1 -0
  2. package/ai/component-catalog.json +141 -24
  3. package/ai/component-composition-rules.json +8 -0
  4. package/ai/component-composition.d.ts +10 -0
  5. package/ai/component-composition.json +117 -8
  6. package/ai/component-composition.schema.json +21 -0
  7. package/ai/components/README.md +5 -4
  8. package/ai/components/chip.md +72 -0
  9. package/ai/components/grid.md +10 -7
  10. package/ai/components/list-item.md +10 -7
  11. package/ai/components/pane.md +3 -2
  12. package/ai/components/select.md +6 -2
  13. package/ai/components/tabs.md +8 -4
  14. package/ai/components/toolbar-text.md +2 -1
  15. package/ai/components/toolbar.md +3 -2
  16. package/ai/public-api-signatures-v1.md +116 -24
  17. package/ai/skill.md +24 -4
  18. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  19. package/dist/app-tab.d.ts +12 -2
  20. package/dist/app-tab.js +1 -1
  21. package/dist/browser/chip.js +3 -0
  22. package/dist/catalog.js +8 -8
  23. package/dist/chip.d.ts +29 -0
  24. package/dist/chip.js +3 -0
  25. package/dist/chip.js.map +1 -0
  26. package/dist/{chunk-WPLIO5WJ.js → chunk-4MG3KXJM.js} +40 -5
  27. package/dist/chunk-4MG3KXJM.js.map +1 -0
  28. package/dist/{chunk-F7F7KRO2.js → chunk-4SQK27MR.js} +33 -18
  29. package/dist/chunk-4SQK27MR.js.map +1 -0
  30. package/dist/chunk-EAC4CDY7.js +57 -0
  31. package/dist/chunk-EAC4CDY7.js.map +1 -0
  32. package/dist/{chunk-T57AXDFM.js → chunk-ENGVYQPG.js} +4 -3
  33. package/dist/chunk-ENGVYQPG.js.map +1 -0
  34. package/dist/{chunk-5PESG2VP.js → chunk-KYDDCJXU.js} +4 -3
  35. package/dist/chunk-KYDDCJXU.js.map +1 -0
  36. package/dist/{chunk-MERWRTBG.js → chunk-N2DRU35S.js} +1 -1
  37. package/dist/chunk-N2DRU35S.js.map +1 -0
  38. package/dist/{chunk-EZVNC4J6.js → chunk-OD2VXAPL.js} +4 -1
  39. package/dist/chunk-OD2VXAPL.js.map +1 -0
  40. package/dist/{chunk-T66UNBXL.js → chunk-Q6YU3BT7.js} +11 -2
  41. package/dist/chunk-Q6YU3BT7.js.map +1 -0
  42. package/dist/{chunk-N3GKMPDW.js → chunk-RKTTF3L4.js} +3 -1
  43. package/dist/chunk-RKTTF3L4.js.map +1 -0
  44. package/dist/chunk-SWVW56CV.js +188 -0
  45. package/dist/chunk-SWVW56CV.js.map +1 -0
  46. package/dist/{chunk-46263QLK.js → chunk-UA6JW52D.js} +53 -7
  47. package/dist/chunk-UA6JW52D.js.map +1 -0
  48. package/dist/{chunk-AGXQQFKZ.js → chunk-UCKKT6KO.js} +13 -4
  49. package/dist/chunk-UCKKT6KO.js.map +1 -0
  50. package/dist/{chunk-3SXMEK3B.js → chunk-V3DX3K65.js} +1 -1
  51. package/dist/chunk-V3DX3K65.js.map +1 -0
  52. package/dist/{chunk-UWONG4QE.js → chunk-VCBTX62E.js} +11 -3
  53. package/dist/chunk-VCBTX62E.js.map +1 -0
  54. package/dist/{chunk-2OXQHM7I.js → chunk-X6ADHJNI.js} +45 -20
  55. package/dist/chunk-X6ADHJNI.js.map +1 -0
  56. package/dist/collapsible-panel.js +2 -2
  57. package/dist/grid.d.ts +13 -5
  58. package/dist/grid.js +1 -1
  59. package/dist/index.d.ts +5 -4
  60. package/dist/index.js +17 -16
  61. package/dist/list-item.d.ts +11 -1
  62. package/dist/list-item.js +1 -1
  63. package/dist/nav-stack.d.ts +3 -1
  64. package/dist/nav-stack.js +1 -1
  65. package/dist/pane.d.ts +8 -3
  66. package/dist/pane.js +1 -1
  67. package/dist/popup-menu.d.ts +2 -2
  68. package/dist/popup-menu.js +1 -1
  69. package/dist/select-register.js +46 -0
  70. package/dist/select-register.js.map +1 -1
  71. package/dist/select.d.ts +16 -0
  72. package/dist/select.js +1 -1
  73. package/dist/split-view.d.ts +1 -1
  74. package/dist/split-view.js +1 -1
  75. package/dist/styles/app-tab.css +119 -0
  76. package/dist/styles/chip.css +118 -0
  77. package/dist/styles/grid.css +7 -0
  78. package/dist/styles/list-item.css +14 -9
  79. package/dist/styles/nav-stack.css +13 -0
  80. package/dist/styles/pane.css +33 -0
  81. package/dist/styles/popup-menu.css +2 -1
  82. package/dist/styles/resizable-region.css +9 -0
  83. package/dist/styles/segmented-control.css +2 -1
  84. package/dist/styles/select.css +45 -0
  85. package/dist/styles/split-view.css +6 -0
  86. package/dist/styles/styles.css +1 -0
  87. package/dist/styles/tab-bar.css +3 -0
  88. package/dist/styles/tab-scaffold.css +13 -0
  89. package/dist/styles/toolbar-text.css +15 -6
  90. package/dist/styles/toolbar.css +15 -5
  91. package/dist/styles/workbench.css +117 -93
  92. package/dist/tab-bar.d.ts +6 -2
  93. package/dist/tab-bar.js +1 -1
  94. package/dist/tab-scaffold.d.ts +3 -0
  95. package/dist/tab-scaffold.js +1 -0
  96. package/dist/tab-scaffold.js.map +1 -1
  97. package/dist/{token-search-field-CCke1yvQ.d.ts → token-search-field-DvgFLhLL.d.ts} +6 -2
  98. package/dist/token-search-field.d.ts +1 -1
  99. package/dist/token-search-model.d.ts +1 -1
  100. package/dist/token-search-model.js +1 -1
  101. package/dist/toolbar-text.d.ts +1 -1
  102. package/dist/toolbar-text.js +1 -1
  103. package/dist/toolbar.d.ts +2 -2
  104. package/dist/toolbar.js +1 -1
  105. package/dist/wire-catalog.js +1 -1
  106. package/dist/wire-tab-bars.js +1 -1
  107. package/dist/wire-token-search-fields.d.ts +1 -1
  108. package/dist/workbench.js +1 -1
  109. package/docs/accessibility.md +29 -3
  110. package/docs/collapsible-panel.md +4 -3
  111. package/docs/component-contract.md +5 -0
  112. package/docs/component-selection.md +92 -11
  113. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  114. package/docs/design/templates/segmented-control/equal.svg +1 -1
  115. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  116. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  117. package/docs/design/templates/segmented-control-dark.svg +1 -1
  118. package/docs/design/templates/segmented-control.svg +1 -1
  119. package/docs/layout.md +51 -9
  120. package/docs/nav-stack.md +5 -0
  121. package/docs/split-view.md +5 -0
  122. package/docs/sunken-panel.md +12 -0
  123. package/docs/tab-scaffold.md +5 -0
  124. package/docs/webawesome-theme.md +62 -0
  125. package/docs/workbench.md +22 -10
  126. package/llms.txt +40 -8
  127. package/package.json +7 -1
  128. package/dist/chunk-2OXQHM7I.js.map +0 -1
  129. package/dist/chunk-3SXMEK3B.js.map +0 -1
  130. package/dist/chunk-46263QLK.js.map +0 -1
  131. package/dist/chunk-5I7OHCIP.js +0 -96
  132. package/dist/chunk-5I7OHCIP.js.map +0 -1
  133. package/dist/chunk-5PESG2VP.js.map +0 -1
  134. package/dist/chunk-AGXQQFKZ.js.map +0 -1
  135. package/dist/chunk-EZVNC4J6.js.map +0 -1
  136. package/dist/chunk-F7F7KRO2.js.map +0 -1
  137. package/dist/chunk-MERWRTBG.js.map +0 -1
  138. package/dist/chunk-N3GKMPDW.js.map +0 -1
  139. package/dist/chunk-T57AXDFM.js.map +0 -1
  140. package/dist/chunk-T66UNBXL.js.map +0 -1
  141. package/dist/chunk-UWONG4QE.js.map +0 -1
  142. package/dist/chunk-WPLIO5WJ.js.map +0 -1
@@ -11,6 +11,51 @@ import { WaAfterShowEvent } from '@awesome.me/webawesome/dist/events/after-show.
11
11
  import { WaHideEvent } from '@awesome.me/webawesome/dist/events/hide.js';
12
12
  import { WaShowEvent } from '@awesome.me/webawesome/dist/events/show.js';
13
13
 
14
+ // src/install-select-actions.ts
15
+ function runSelectAction(host, action) {
16
+ if (host.disabled || !host.multiple) return false;
17
+ const enabled = host.getAllOptions().filter((option) => !option.disabled);
18
+ const next = action === "all" ? enabled : [];
19
+ const current = host.selectedOptions;
20
+ if (current.length === next.length && current.every((option) => next.includes(option)))
21
+ return false;
22
+ host.hasInteracted = true;
23
+ host.valueHasChanged = true;
24
+ host.setSelectedOptions(next);
25
+ void host.updateComplete.then(() => {
26
+ host.dispatchEvent(
27
+ new InputEvent("input", { bubbles: true, composed: true })
28
+ );
29
+ host.dispatchEvent(new Event("change", { bubbles: true, composed: true }));
30
+ });
31
+ return true;
32
+ }
33
+ var installedDocuments = /* @__PURE__ */ new WeakSet();
34
+ function installSelectActions(doc = document) {
35
+ if (installedDocuments.has(doc)) return;
36
+ installedDocuments.add(doc);
37
+ doc.addEventListener("keydown", (event) => {
38
+ if (event.key === "Escape" || event.key === "Tab") return;
39
+ if (!(event.target instanceof Element)) return;
40
+ const button = event.target.closest("button[data-select-action]");
41
+ if (button?.closest('wa-select[data-component="select"]'))
42
+ event.stopImmediatePropagation();
43
+ });
44
+ doc.addEventListener("click", (event) => {
45
+ if (!(event.target instanceof Element)) return;
46
+ const button = event.target.closest(
47
+ "button[data-select-action]"
48
+ );
49
+ if (!button || button.hasAttribute("disabled")) return;
50
+ const host = button.closest(
51
+ 'wa-select[data-component="select"]'
52
+ );
53
+ if (!host) return;
54
+ const action = button.dataset.selectAction;
55
+ if (action === "all" || action === "clear") runSelectAction(host, action);
56
+ });
57
+ }
58
+
14
59
  // src/animate-select-popup.ts
15
60
  function animateSelectPopup(popup, phase, signal) {
16
61
  return new Promise((resolve) => {
@@ -197,6 +242,7 @@ function installSelectMultiple(selectPrototype, optionPrototype) {
197
242
  // src/select-register.ts
198
243
  installSelectLifecycle(WaSelect.prototype);
199
244
  installSelectMultiple(WaSelect.prototype, WaOption.prototype);
245
+ installSelectActions();
200
246
  installHelpTags();
201
247
  var selectElementsRegistered = true;
202
248
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/animate-select-popup.ts","../src/install-select-lifecycle.ts","../src/install-select-multiple.ts","../src/select-register.ts"],"names":["option"],"mappings":"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","file":"select-register.js","sourcesContent":["/** Run one native Select CSS animation; a reversal owns cancellation and cleanup. */\nexport function animateSelectPopup(\n popup: HTMLElement,\n phase: 'show' | 'hide',\n signal: AbortSignal,\n): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n let frame = 0;\n const finish = () => {\n if (settled) return;\n settled = true;\n window.cancelAnimationFrame(frame);\n signal.removeEventListener('abort', finish);\n popup.classList.remove(phase);\n resolve();\n };\n signal.addEventListener('abort', finish, { once: true });\n popup.classList.add(phase);\n // Activation renders asynchronously. Check for reduced/absent motion only\n // after the native popup has had its normal render opportunity.\n frame = window.requestAnimationFrame(() => {\n // Observe these exact animations. An old CSS animationcancel event can\n // arrive after the next phase starts and must not finish that new phase.\n void Promise.all(\n popup\n .getAnimations()\n .map((animation) => animation.finished.catch(() => undefined)),\n ).then(finish);\n });\n if (signal.aborted) finish();\n });\n}\n","import type WaSelect from '@awesome.me/webawesome/dist/components/select/select.js';\nimport { WaAfterHideEvent } from '@awesome.me/webawesome/dist/events/after-hide.js';\nimport { WaAfterShowEvent } from '@awesome.me/webawesome/dist/events/after-show.js';\nimport { WaHideEvent } from '@awesome.me/webawesome/dist/events/hide.js';\nimport { WaShowEvent } from '@awesome.me/webawesome/dist/events/show.js';\n\nimport { animateSelectPopup } from './animate-select-popup.js';\n\n// Web Awesome 3.12/3.13 expose the lifecycle method but not these helper types.\n// Keep this integration boundary local: native option selection, dismissal\n// listeners, popup positioning and rendering remain owned by Web Awesome.\ninterface SelectHost extends Pick<\n WaSelect,\n | 'open'\n | 'disabled'\n | 'isConnected'\n | 'dataset'\n | 'popup'\n | 'listbox'\n | 'currentOption'\n | 'selectedOptions'\n | 'dispatchEvent'\n | 'handleOpenChange'\n | 'updateComplete'\n> {\n getFirstOption(): WaSelect['currentOption'];\n setCurrentOption(option: WaSelect['currentOption']): void;\n addOpenListeners(): void;\n removeOpenListeners(): void;\n}\n\n/** Install once at the explicit registration boundary, only for Kerf Selects. */\nexport function installSelectLifecycle(\n prototype: Pick<WaSelect, 'handleOpenChange' | 'handleDisabledChange'>,\n): void {\n const installed = Symbol.for('@kerfjs/ui/select-lifecycle');\n if (Object.prototype.hasOwnProperty.call(prototype, installed)) return;\n Object.defineProperty(prototype, installed, { value: true });\n const original = prototype.handleOpenChange;\n const originalDisabled = prototype.handleDisabledChange;\n prototype.handleDisabledChange = function () {\n const host = this as unknown as SelectHost;\n const wasOpen = host.open;\n originalDisabled.call(this);\n // WA's disabled watcher runs after its open watcher in the same Lit update.\n // Its open=false mutation otherwise misses the open lifecycle altogether.\n if (host.dataset.component === 'select' && wasOpen && !host.open) {\n void host.handleOpenChange();\n }\n };\n const transitions = new WeakMap<SelectHost, AbortController>();\n const restorations = new WeakMap<SelectHost, { open: boolean }>();\n prototype.handleOpenChange = async function () {\n const host = this as unknown as SelectHost;\n if (host.dataset.component !== 'select') return original.call(this);\n const restoring = restorations.get(host)?.open === host.open;\n restorations.delete(host);\n if (restoring) return;\n const transition = new AbortController();\n const opening = host.open && !host.disabled;\n const current = () =>\n !transition.signal.aborted &&\n host.isConnected &&\n (host.open && !host.disabled) === opening;\n try {\n if (!host.isConnected) return;\n if (opening) {\n host.setCurrentOption(host.selectedOptions[0] || host.getFirstOption());\n }\n const event = opening ? new WaShowEvent() : new WaHideEvent();\n host.dispatchEvent(event);\n if (event.defaultPrevented) {\n // Restore the accepted state without emitting the opposite transition.\n // Clear at the update checkpoint too: Lit can coalesce a restoration.\n host.open = !opening;\n const restoration = { open: host.open };\n restorations.set(host, restoration);\n void host.updateComplete.then(() => {\n if (restorations.get(host) === restoration) restorations.delete(host);\n });\n return;\n }\n // A consumer can reverse the request synchronously in a lifecycle event.\n if (!current()) return;\n // A rejected reversal must not cancel the previously accepted animation.\n transitions.get(host)?.abort();\n transitions.set(host, transition);\n if (opening) {\n host.addOpenListeners();\n host.listbox.hidden = false;\n host.popup.active = true;\n window.requestAnimationFrame(() => {\n if (current()) host.setCurrentOption(host.currentOption);\n });\n } else {\n host.removeOpenListeners();\n }\n await animateSelectPopup(\n host.popup.popup,\n opening ? 'show' : 'hide',\n transition.signal,\n );\n if (!transition.signal.aborted && !host.isConnected) {\n host.removeOpenListeners();\n host.listbox.hidden = true;\n host.popup.active = false;\n }\n if (!current()) return;\n if (opening) {\n // Match native vertical, immediate option reveal without scrolling an\n // ancestor page or moving focus after animation completion.\n const option = host.currentOption;\n if (option) {\n const list = host.listbox;\n const offset = Math.round(\n option.getBoundingClientRect().top -\n list.getBoundingClientRect().top,\n );\n if (offset < 0)\n list.scrollTo({ top: list.scrollTop + offset, behavior: 'auto' });\n else if (offset + option.clientHeight > list.offsetHeight) {\n list.scrollTo({\n top:\n list.scrollTop +\n offset -\n list.offsetHeight +\n option.clientHeight,\n behavior: 'auto',\n });\n }\n }\n host.dispatchEvent(new WaAfterShowEvent());\n } else {\n host.listbox.hidden = true;\n host.popup.active = false;\n host.dispatchEvent(new WaAfterHideEvent());\n }\n } finally {\n if (transitions.get(host) === transition) transitions.delete(host);\n }\n };\n}\n","// Web Awesome's multiple select keeps its popup open while choices toggle and\n// closes on an outside press, Escape, or focus leaving; Kerf keeps that\n// behavior. This boundary adapts the rest to Kerf's rendering model, only for\n// Kerf Selects (`data-component=\"select\"`):\n// - the closed control summarizes the chosen labels instead of drawing a\n// removable tag per choice or a \"N options selected\" count; an icon-only\n// trigger (whose value text is hidden) ends its accessible name with that\n// summary instead;\n// - the rendered `selected` attributes are the controlled value, so a\n// re-render that changes them updates the selection (Web Awesome otherwise\n// reads them only until the first interaction).\n\ninterface MultipleOption extends HTMLElement {\n value: string;\n label: string;\n selected: boolean;\n defaultSelected: boolean;\n}\n\ninterface MultipleSelectHost extends HTMLElement {\n multiple: boolean;\n hasUpdated: boolean;\n displayLabel: string;\n value: string | string[] | null;\n selectedOptions: MultipleOption[];\n getAllOptions(): MultipleOption[];\n selectionChanged(): void;\n}\n\ninterface SelectPrototype {\n selectionChanged(this: MultipleSelectHost): void;\n}\n\ninterface OptionPrototype {\n syncDefaultSelected(this: MultipleOption): void;\n}\n\nfunction kerfMultiple(host: Element | null): host is MultipleSelectHost {\n return (\n host instanceof HTMLElement &&\n host.dataset.component === 'select' &&\n (host as MultipleSelectHost).multiple\n );\n}\n\nfunction listLocale(host: HTMLElement): string | undefined {\n const lang = host.closest<HTMLElement>('[lang]')?.lang;\n return lang || undefined;\n}\n\n/** The closed-control text: chosen labels in choice order, as a short list. */\nfunction summarizeSelection(\n labels: readonly string[],\n locale?: string,\n): string {\n if (labels.length === 0) return '';\n try {\n return new Intl.ListFormat(locale, {\n type: 'unit',\n style: 'short',\n }).format(labels);\n } catch {\n return labels.join(', ');\n }\n}\n\n/** Install once at the explicit registration boundary, only for Kerf Selects. */\nexport function installSelectMultiple(\n selectPrototype: object,\n optionPrototype: object,\n): void {\n const installed = Symbol.for('@kerfjs/ui/select-multiple');\n if (Object.prototype.hasOwnProperty.call(selectPrototype, installed)) return;\n Object.defineProperty(selectPrototype, installed, { value: true });\n\n const select = selectPrototype as SelectPrototype;\n const selectionChanged = select.selectionChanged;\n select.selectionChanged = function () {\n selectionChanged.call(this);\n if (!kerfMultiple(this)) return;\n const chosen = new Set(this.selectedOptions);\n const summary = summarizeSelection(\n this.getAllOptions()\n .filter((option) => chosen.has(option))\n .map((option) => option.label),\n listLocale(this),\n );\n const nameSummary = this.querySelector(\n ':scope > [slot=\"label\"] > .kui-select__name-summary',\n );\n if (this.dataset.selectedPresentation === 'icon-only' && nameSummary) {\n // An icon-only trigger carries the summary in its accessible name, so\n // the (visually hidden) value stays empty rather than repeating it.\n nameSummary.textContent = summary ? `: ${summary}` : '';\n this.displayLabel = '';\n return;\n }\n this.displayLabel = summary;\n };\n\n // The summary replaces Web Awesome's per-choice tags.\n const tags = Object.getOwnPropertyDescriptor(selectPrototype, 'tags');\n if (tags?.get) {\n const getTags = tags.get;\n Object.defineProperty(selectPrototype, 'tags', {\n configurable: true,\n get(this: MultipleSelectHost) {\n return kerfMultiple(this) ? [] : getTags.call(this);\n },\n });\n }\n\n const option = optionPrototype as OptionPrototype;\n const syncDefaultSelected = option.syncDefaultSelected;\n option.syncDefaultSelected = function () {\n const host: Element | null = this.closest('[data-component=\"select\"]');\n if (!kerfMultiple(host) || !host.hasUpdated) {\n syncDefaultSelected.call(this);\n return;\n }\n // A re-render changed which options carry `selected`: that is the new\n // controlled value, whether or not the person has interacted.\n host.value = host\n .getAllOptions()\n .filter((candidate) => candidate.hasAttribute('selected'))\n .map((candidate) => candidate.value);\n };\n}\n","import '@awesome.me/webawesome/dist/components/button/button.js';\nimport '@awesome.me/webawesome/dist/components/divider/divider.js';\nimport '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';\nimport '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\nimport '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';\n\nimport WaOption from '@awesome.me/webawesome/dist/components/option/option.js';\nimport WaSelect from '@awesome.me/webawesome/dist/components/select/select.js';\n\nimport { installHelpTags } from './install-help-tag.js';\nimport { installSelectLifecycle } from './install-select-lifecycle.js';\nimport { installSelectMultiple } from './install-select-multiple.js';\n\ninstallSelectLifecycle(WaSelect.prototype);\ninstallSelectMultiple(WaSelect.prototype, WaOption.prototype);\ninstallHelpTags();\n\n/**\n * Marker export for tests and tooling; importing this module performs registration.\n * Registers both the `Select` elements and the `Catalog` related-entries popup-menu\n * elements (`wa-dropdown` / `wa-dropdown-item` / `wa-button`).\n */\nexport const selectElementsRegistered = true;\n"]}
1
+ {"version":3,"sources":["../src/install-select-actions.ts","../src/animate-select-popup.ts","../src/install-select-lifecycle.ts","../src/install-select-multiple.ts","../src/select-register.ts"],"names":["option"],"mappings":"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","file":"select-register.js","sourcesContent":["type SelectAction = 'all' | 'clear';\n\ninterface SelectActionOption extends HTMLElement {\n disabled: boolean;\n}\n\ninterface SelectActionHost extends HTMLElement {\n multiple: boolean;\n disabled: boolean;\n hasInteracted: boolean;\n valueHasChanged: boolean;\n selectedOptions: SelectActionOption[];\n updateComplete: Promise<unknown>;\n getAllOptions(): SelectActionOption[];\n setSelectedOptions(options: SelectActionOption[]): void;\n}\n\n/** Apply one footer action through Web Awesome's ordinary selection path. */\nexport function runSelectAction(\n host: SelectActionHost,\n action: SelectAction,\n): boolean {\n if (host.disabled || !host.multiple) return false;\n const enabled = host.getAllOptions().filter((option) => !option.disabled);\n const next = action === 'all' ? enabled : [];\n const current = host.selectedOptions;\n if (\n current.length === next.length &&\n current.every((option) => next.includes(option))\n )\n return false;\n host.hasInteracted = true;\n host.valueHasChanged = true;\n host.setSelectedOptions(next);\n void host.updateComplete.then(() => {\n host.dispatchEvent(\n new InputEvent('input', { bubbles: true, composed: true }),\n );\n host.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n });\n return true;\n}\n\nconst installedDocuments = new WeakSet<Document>();\n\n/** Wire opt-in multiple-select footer buttons at the registration boundary. */\nexport function installSelectActions(doc: Document = document): void {\n if (installedDocuments.has(doc)) return;\n installedDocuments.add(doc);\n // Web Awesome listens for keydown on document while the popup is open. Its\n // option shortcuts would otherwise consume Enter/Space from these native\n // footer buttons before the browser can activate them.\n doc.addEventListener('keydown', (event) => {\n if (event.key === 'Escape' || event.key === 'Tab') return;\n if (!(event.target instanceof Element)) return;\n const button = event.target.closest('button[data-select-action]');\n if (button?.closest('wa-select[data-component=\"select\"]'))\n event.stopImmediatePropagation();\n });\n doc.addEventListener('click', (event) => {\n if (!(event.target instanceof Element)) return;\n const button = event.target.closest<HTMLElement>(\n 'button[data-select-action]',\n );\n if (!button || button.hasAttribute('disabled')) return;\n const host = button.closest<SelectActionHost>(\n 'wa-select[data-component=\"select\"]',\n );\n if (!host) return;\n const action = button.dataset.selectAction;\n if (action === 'all' || action === 'clear') runSelectAction(host, action);\n });\n}\n","/** Run one native Select CSS animation; a reversal owns cancellation and cleanup. */\nexport function animateSelectPopup(\n popup: HTMLElement,\n phase: 'show' | 'hide',\n signal: AbortSignal,\n): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n let frame = 0;\n const finish = () => {\n if (settled) return;\n settled = true;\n window.cancelAnimationFrame(frame);\n signal.removeEventListener('abort', finish);\n popup.classList.remove(phase);\n resolve();\n };\n signal.addEventListener('abort', finish, { once: true });\n popup.classList.add(phase);\n // Activation renders asynchronously. Check for reduced/absent motion only\n // after the native popup has had its normal render opportunity.\n frame = window.requestAnimationFrame(() => {\n // Observe these exact animations. An old CSS animationcancel event can\n // arrive after the next phase starts and must not finish that new phase.\n void Promise.all(\n popup\n .getAnimations()\n .map((animation) => animation.finished.catch(() => undefined)),\n ).then(finish);\n });\n if (signal.aborted) finish();\n });\n}\n","import type WaSelect from '@awesome.me/webawesome/dist/components/select/select.js';\nimport { WaAfterHideEvent } from '@awesome.me/webawesome/dist/events/after-hide.js';\nimport { WaAfterShowEvent } from '@awesome.me/webawesome/dist/events/after-show.js';\nimport { WaHideEvent } from '@awesome.me/webawesome/dist/events/hide.js';\nimport { WaShowEvent } from '@awesome.me/webawesome/dist/events/show.js';\n\nimport { animateSelectPopup } from './animate-select-popup.js';\n\n// Web Awesome 3.12/3.13 expose the lifecycle method but not these helper types.\n// Keep this integration boundary local: native option selection, dismissal\n// listeners, popup positioning and rendering remain owned by Web Awesome.\ninterface SelectHost extends Pick<\n WaSelect,\n | 'open'\n | 'disabled'\n | 'isConnected'\n | 'dataset'\n | 'popup'\n | 'listbox'\n | 'currentOption'\n | 'selectedOptions'\n | 'dispatchEvent'\n | 'handleOpenChange'\n | 'updateComplete'\n> {\n getFirstOption(): WaSelect['currentOption'];\n setCurrentOption(option: WaSelect['currentOption']): void;\n addOpenListeners(): void;\n removeOpenListeners(): void;\n}\n\n/** Install once at the explicit registration boundary, only for Kerf Selects. */\nexport function installSelectLifecycle(\n prototype: Pick<WaSelect, 'handleOpenChange' | 'handleDisabledChange'>,\n): void {\n const installed = Symbol.for('@kerfjs/ui/select-lifecycle');\n if (Object.prototype.hasOwnProperty.call(prototype, installed)) return;\n Object.defineProperty(prototype, installed, { value: true });\n const original = prototype.handleOpenChange;\n const originalDisabled = prototype.handleDisabledChange;\n prototype.handleDisabledChange = function () {\n const host = this as unknown as SelectHost;\n const wasOpen = host.open;\n originalDisabled.call(this);\n // WA's disabled watcher runs after its open watcher in the same Lit update.\n // Its open=false mutation otherwise misses the open lifecycle altogether.\n if (host.dataset.component === 'select' && wasOpen && !host.open) {\n void host.handleOpenChange();\n }\n };\n const transitions = new WeakMap<SelectHost, AbortController>();\n const restorations = new WeakMap<SelectHost, { open: boolean }>();\n prototype.handleOpenChange = async function () {\n const host = this as unknown as SelectHost;\n if (host.dataset.component !== 'select') return original.call(this);\n const restoring = restorations.get(host)?.open === host.open;\n restorations.delete(host);\n if (restoring) return;\n const transition = new AbortController();\n const opening = host.open && !host.disabled;\n const current = () =>\n !transition.signal.aborted &&\n host.isConnected &&\n (host.open && !host.disabled) === opening;\n try {\n if (!host.isConnected) return;\n if (opening) {\n host.setCurrentOption(host.selectedOptions[0] || host.getFirstOption());\n }\n const event = opening ? new WaShowEvent() : new WaHideEvent();\n host.dispatchEvent(event);\n if (event.defaultPrevented) {\n // Restore the accepted state without emitting the opposite transition.\n // Clear at the update checkpoint too: Lit can coalesce a restoration.\n host.open = !opening;\n const restoration = { open: host.open };\n restorations.set(host, restoration);\n void host.updateComplete.then(() => {\n if (restorations.get(host) === restoration) restorations.delete(host);\n });\n return;\n }\n // A consumer can reverse the request synchronously in a lifecycle event.\n if (!current()) return;\n // A rejected reversal must not cancel the previously accepted animation.\n transitions.get(host)?.abort();\n transitions.set(host, transition);\n if (opening) {\n host.addOpenListeners();\n host.listbox.hidden = false;\n host.popup.active = true;\n window.requestAnimationFrame(() => {\n if (current()) host.setCurrentOption(host.currentOption);\n });\n } else {\n host.removeOpenListeners();\n }\n await animateSelectPopup(\n host.popup.popup,\n opening ? 'show' : 'hide',\n transition.signal,\n );\n if (!transition.signal.aborted && !host.isConnected) {\n host.removeOpenListeners();\n host.listbox.hidden = true;\n host.popup.active = false;\n }\n if (!current()) return;\n if (opening) {\n // Match native vertical, immediate option reveal without scrolling an\n // ancestor page or moving focus after animation completion.\n const option = host.currentOption;\n if (option) {\n const list = host.listbox;\n const offset = Math.round(\n option.getBoundingClientRect().top -\n list.getBoundingClientRect().top,\n );\n if (offset < 0)\n list.scrollTo({ top: list.scrollTop + offset, behavior: 'auto' });\n else if (offset + option.clientHeight > list.offsetHeight) {\n list.scrollTo({\n top:\n list.scrollTop +\n offset -\n list.offsetHeight +\n option.clientHeight,\n behavior: 'auto',\n });\n }\n }\n host.dispatchEvent(new WaAfterShowEvent());\n } else {\n host.listbox.hidden = true;\n host.popup.active = false;\n host.dispatchEvent(new WaAfterHideEvent());\n }\n } finally {\n if (transitions.get(host) === transition) transitions.delete(host);\n }\n };\n}\n","// Web Awesome's multiple select keeps its popup open while choices toggle and\n// closes on an outside press, Escape, or focus leaving; Kerf keeps that\n// behavior. This boundary adapts the rest to Kerf's rendering model, only for\n// Kerf Selects (`data-component=\"select\"`):\n// - the closed control summarizes the chosen labels instead of drawing a\n// removable tag per choice or a \"N options selected\" count; an icon-only\n// trigger (whose value text is hidden) ends its accessible name with that\n// summary instead;\n// - the rendered `selected` attributes are the controlled value, so a\n// re-render that changes them updates the selection (Web Awesome otherwise\n// reads them only until the first interaction).\n\ninterface MultipleOption extends HTMLElement {\n value: string;\n label: string;\n selected: boolean;\n defaultSelected: boolean;\n}\n\ninterface MultipleSelectHost extends HTMLElement {\n multiple: boolean;\n hasUpdated: boolean;\n displayLabel: string;\n value: string | string[] | null;\n selectedOptions: MultipleOption[];\n getAllOptions(): MultipleOption[];\n selectionChanged(): void;\n}\n\ninterface SelectPrototype {\n selectionChanged(this: MultipleSelectHost): void;\n}\n\ninterface OptionPrototype {\n syncDefaultSelected(this: MultipleOption): void;\n}\n\nfunction kerfMultiple(host: Element | null): host is MultipleSelectHost {\n return (\n host instanceof HTMLElement &&\n host.dataset.component === 'select' &&\n (host as MultipleSelectHost).multiple\n );\n}\n\nfunction listLocale(host: HTMLElement): string | undefined {\n const lang = host.closest<HTMLElement>('[lang]')?.lang;\n return lang || undefined;\n}\n\n/** The closed-control text: chosen labels in choice order, as a short list. */\nfunction summarizeSelection(\n labels: readonly string[],\n locale?: string,\n): string {\n if (labels.length === 0) return '';\n try {\n return new Intl.ListFormat(locale, {\n type: 'unit',\n style: 'short',\n }).format(labels);\n } catch {\n return labels.join(', ');\n }\n}\n\n/** Install once at the explicit registration boundary, only for Kerf Selects. */\nexport function installSelectMultiple(\n selectPrototype: object,\n optionPrototype: object,\n): void {\n const installed = Symbol.for('@kerfjs/ui/select-multiple');\n if (Object.prototype.hasOwnProperty.call(selectPrototype, installed)) return;\n Object.defineProperty(selectPrototype, installed, { value: true });\n\n const select = selectPrototype as SelectPrototype;\n const selectionChanged = select.selectionChanged;\n select.selectionChanged = function () {\n selectionChanged.call(this);\n if (!kerfMultiple(this)) return;\n const chosen = new Set(this.selectedOptions);\n const summary = summarizeSelection(\n this.getAllOptions()\n .filter((option) => chosen.has(option))\n .map((option) => option.label),\n listLocale(this),\n );\n const nameSummary = this.querySelector(\n ':scope > [slot=\"label\"] > .kui-select__name-summary',\n );\n if (this.dataset.selectedPresentation === 'icon-only' && nameSummary) {\n // An icon-only trigger carries the summary in its accessible name, so\n // the (visually hidden) value stays empty rather than repeating it.\n nameSummary.textContent = summary ? `: ${summary}` : '';\n this.displayLabel = '';\n return;\n }\n this.displayLabel = summary;\n };\n\n // The summary replaces Web Awesome's per-choice tags.\n const tags = Object.getOwnPropertyDescriptor(selectPrototype, 'tags');\n if (tags?.get) {\n const getTags = tags.get;\n Object.defineProperty(selectPrototype, 'tags', {\n configurable: true,\n get(this: MultipleSelectHost) {\n return kerfMultiple(this) ? [] : getTags.call(this);\n },\n });\n }\n\n const option = optionPrototype as OptionPrototype;\n const syncDefaultSelected = option.syncDefaultSelected;\n option.syncDefaultSelected = function () {\n const host: Element | null = this.closest('[data-component=\"select\"]');\n if (!kerfMultiple(host) || !host.hasUpdated) {\n syncDefaultSelected.call(this);\n return;\n }\n // A re-render changed which options carry `selected`: that is the new\n // controlled value, whether or not the person has interacted.\n host.value = host\n .getAllOptions()\n .filter((candidate) => candidate.hasAttribute('selected'))\n .map((candidate) => candidate.value);\n };\n}\n","import '@awesome.me/webawesome/dist/components/button/button.js';\nimport '@awesome.me/webawesome/dist/components/divider/divider.js';\nimport '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';\nimport '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\nimport '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';\n\nimport WaOption from '@awesome.me/webawesome/dist/components/option/option.js';\nimport WaSelect from '@awesome.me/webawesome/dist/components/select/select.js';\n\nimport { installHelpTags } from './install-help-tag.js';\nimport { installSelectActions } from './install-select-actions.js';\nimport { installSelectLifecycle } from './install-select-lifecycle.js';\nimport { installSelectMultiple } from './install-select-multiple.js';\n\ninstallSelectLifecycle(WaSelect.prototype);\ninstallSelectMultiple(WaSelect.prototype, WaOption.prototype);\ninstallSelectActions();\ninstallHelpTags();\n\n/**\n * Marker export for tests and tooling; importing this module performs registration.\n * Registers both the `Select` elements and the `Catalog` related-entries popup-menu\n * elements (`wa-dropdown` / `wa-dropdown-item` / `wa-button`).\n */\nexport const selectElementsRegistered = true;\n"]}
package/dist/select.d.ts CHANGED
@@ -18,6 +18,10 @@ interface SelectChoice<Value extends string = string> {
18
18
  */
19
19
  color?: CssForegroundColor;
20
20
  group?: string;
21
+ /** Keep an unavailable choice visible but prevent selection. */
22
+ disabled?: boolean;
23
+ /** Optional explanation exposed as the disabled option's native tooltip. */
24
+ disabledReason?: string;
21
25
  /**
22
26
  * Draw a divider between this choice and the previous choice in the same
23
27
  * list. A group boundary is already a separator, so the first choice of a
@@ -54,6 +58,8 @@ interface SelectBaseProps<Value extends string = string> {
54
58
  size?: SelectSize;
55
59
  /** Closed trigger width; omit to keep the presentation's default. */
56
60
  triggerWidth?: SelectTriggerWidth;
61
+ /** Show the disclosure caret (default); omit it for a compact icon-only trigger. */
62
+ caret?: boolean;
57
63
  /** Let an enclosing ToolbarControlGroup paint the composed focus ring. */
58
64
  focusRingOwner?: SelectFocusRingOwner;
59
65
  /** Maximum closed-control label width in CSS pixels before ellipsis. */
@@ -69,6 +75,8 @@ interface SelectSingleValueProps<Value extends string = string> {
69
75
  /** Show only the selected choice icon while retaining the Select's accessible name. */
70
76
  selectedPresentation?: SelectSelectedPresentation;
71
77
  triggerIcon?: never;
78
+ selectAllLabel?: never;
79
+ clearLabel?: never;
72
80
  }
73
81
  /**
74
82
  * Any number of chosen values. The popup stays open while the person toggles
@@ -81,6 +89,10 @@ interface SelectMultipleLabelProps<Value extends string = string> {
81
89
  renderSelected?: never;
82
90
  selectedPresentation?: 'label';
83
91
  triggerIcon?: never;
92
+ /** Opt in to a footer action that selects every enabled choice. */
93
+ selectAllLabel?: string;
94
+ /** Opt in to a footer action that clears the current selection. */
95
+ clearLabel?: string;
84
96
  }
85
97
  /**
86
98
  * A multiple Select drawn as an icon-only toolbar trigger, such as a
@@ -99,6 +111,10 @@ interface SelectMultipleIconProps<Value extends string = string> {
99
111
  * purpose (a funnel for a filter), independent of the selection.
100
112
  */
101
113
  triggerIcon: KerfUiContent;
114
+ /** Opt in to a footer action that selects every enabled choice. */
115
+ selectAllLabel?: string;
116
+ /** Opt in to a footer action that clears the current selection. */
117
+ clearLabel?: string;
102
118
  }
103
119
  type SelectMultipleValueProps<Value extends string = string> = SelectMultipleLabelProps<Value> | SelectMultipleIconProps<Value>;
104
120
  type SelectProps<Value extends string = string> = SelectBaseProps<Value> & SelectAccessibleName & (SelectSingleValueProps<Value> | SelectMultipleValueProps<Value>);
package/dist/select.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Select } from './chunk-WPLIO5WJ.js';
1
+ export { Select } from './chunk-4MG3KXJM.js';
2
2
 
3
3
 
4
4
 
@@ -2,8 +2,8 @@ import * as kerfjs from 'kerfjs';
2
2
  import { NavStackProps, NavStackView } from './nav-stack.js';
3
3
  import { ResizableRegionProps } from './resizable-region.js';
4
4
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
5
- import './toolbar.js';
6
5
  import './pane.js';
6
+ import './toolbar.js';
7
7
  import './sides-BPSWde0A.js';
8
8
  import './toolbar-text.js';
9
9
  import './css-values.js';
@@ -1,4 +1,4 @@
1
- import { NavStack } from './chunk-5PESG2VP.js';
1
+ import { NavStack } from './chunk-KYDDCJXU.js';
2
2
  import { ResizableRegion } from './chunk-KLJKU6ZL.js';
3
3
 
4
4
 
@@ -13,6 +13,9 @@
13
13
  transparent
14
14
  );
15
15
  --kui-app-tab-drop-indicator: var(--kui-color-brand-border-normal);
16
+ --kui-app-tab-drop-target-background: var(--kui-color-brand-fill-quiet);
17
+ --kui-app-tab-drop-target-ring: var(--kui-color-brand-border-normal);
18
+ --kui-app-tab-drop-target-color: var(--kui-color-brand-on-quiet);
16
19
  position: relative;
17
20
  display: flex;
18
21
  width: max-content;
@@ -26,6 +29,28 @@
26
29
  align-items: center;
27
30
  flex: none;
28
31
  }
32
+ .kui-app-tab[data-pinned="true"] {
33
+ position: sticky;
34
+ z-index: 1;
35
+ inset-inline-start: 0;
36
+ background: var(
37
+ --kui-app-tab-pinned-background,
38
+ var(--_kui-app-tab-pinned-default-background, var(--kui-color-surface))
39
+ );
40
+ }
41
+ .kui-tab-bar[data-presentation="segmented"] .kui-app-tab[data-pinned="true"],
42
+ .kui-tab-bar[data-presentation="inspector"] .kui-app-tab[data-pinned="true"] {
43
+ --_kui-app-tab-pinned-default-background: var(
44
+ --kui-tab-bar-strip-background,
45
+ var(--kui-color-neutral-fill-quiet)
46
+ );
47
+ }
48
+ .kui-app-tab[data-pinned="true"]:not([data-selected="true"]):hover {
49
+ background: var(
50
+ --kui-app-tab-pinned-hover-background,
51
+ var(--kui-color-neutral-fill-quiet)
52
+ );
53
+ }
29
54
  .kui-app-tab[data-size="compact"] {
30
55
  height: 2rem;
31
56
  }
@@ -43,6 +68,11 @@
43
68
  background: var(--kui-app-tab-selected-background);
44
69
  box-shadow: var(--kui-shadow-s);
45
70
  }
71
+ .kui-app-tab[data-drop-target="true"] {
72
+ color: var(--kui-app-tab-drop-target-color);
73
+ background: var(--kui-app-tab-drop-target-background);
74
+ box-shadow: inset 0 0 0 2px var(--kui-app-tab-drop-target-ring);
75
+ }
46
76
  .kui-app-tab[data-tab-dragging="true"] {
47
77
  opacity: 0.55;
48
78
  }
@@ -106,6 +136,11 @@
106
136
  text-overflow: ellipsis;
107
137
  white-space: nowrap;
108
138
  }
139
+ .kui-app-tab[data-name-overflow="visible"] .kui-app-tab__name {
140
+ max-width: none;
141
+ overflow: visible;
142
+ text-overflow: clip;
143
+ }
109
144
  .kui-app-tab[data-attention="true"] .kui-app-tab__name {
110
145
  color: var(--kui-app-tab-attention-color, var(--kui-color-warning-on-quiet));
111
146
  }
@@ -127,6 +162,90 @@
127
162
  width: 2rem;
128
163
  min-width: 2rem;
129
164
  }
165
+ /* TabBar owns the tablist width query; AppTab owns its own responsive
166
+ geometry and visually hidden name. The name remains in the accessibility
167
+ tree, so the tab keeps its accessible name without a rerender. */
168
+ @container kui-tab-bar-tabs (max-width: 52rem) {
169
+ .kui-tab-bar[data-icon-only-at="wide"]
170
+ .kui-tab-bar__tabs
171
+ > .kui-app-tab[data-presentation="segmented"] {
172
+ width: 2rem;
173
+ min-width: 2rem;
174
+ flex: none;
175
+ }
176
+ .kui-tab-bar[data-icon-only-at="wide"]
177
+ .kui-app-tab[data-presentation="segmented"]
178
+ .kui-app-tab__select {
179
+ width: 100%;
180
+ justify-content: center;
181
+ }
182
+ .kui-tab-bar[data-icon-only-at="wide"]
183
+ .kui-app-tab[data-presentation="segmented"]
184
+ .kui-app-tab__name {
185
+ position: absolute;
186
+ width: 1px;
187
+ height: 1px;
188
+ padding: 0;
189
+ overflow: hidden;
190
+ clip: rect(0, 0, 0, 0);
191
+ white-space: nowrap;
192
+ clip-path: inset(50%);
193
+ }
194
+ }
195
+ @container kui-tab-bar-tabs (max-width: 44rem) {
196
+ .kui-tab-bar[data-icon-only-at="narrow"]
197
+ .kui-tab-bar__tabs
198
+ > .kui-app-tab[data-presentation="segmented"] {
199
+ width: 2rem;
200
+ min-width: 2rem;
201
+ flex: none;
202
+ }
203
+ .kui-tab-bar[data-icon-only-at="narrow"]
204
+ .kui-app-tab[data-presentation="segmented"]
205
+ .kui-app-tab__select {
206
+ width: 100%;
207
+ justify-content: center;
208
+ }
209
+ .kui-tab-bar[data-icon-only-at="narrow"]
210
+ .kui-app-tab[data-presentation="segmented"]
211
+ .kui-app-tab__name {
212
+ position: absolute;
213
+ width: 1px;
214
+ height: 1px;
215
+ padding: 0;
216
+ overflow: hidden;
217
+ clip: rect(0, 0, 0, 0);
218
+ white-space: nowrap;
219
+ clip-path: inset(50%);
220
+ }
221
+ }
222
+ @container kui-tab-bar-tabs (max-width: 28rem) {
223
+ .kui-tab-bar[data-icon-only-at="compact"]
224
+ .kui-tab-bar__tabs
225
+ > .kui-app-tab[data-presentation="segmented"] {
226
+ width: 2rem;
227
+ min-width: 2rem;
228
+ flex: none;
229
+ }
230
+ .kui-tab-bar[data-icon-only-at="compact"]
231
+ .kui-app-tab[data-presentation="segmented"]
232
+ .kui-app-tab__select {
233
+ width: 100%;
234
+ justify-content: center;
235
+ }
236
+ .kui-tab-bar[data-icon-only-at="compact"]
237
+ .kui-app-tab[data-presentation="segmented"]
238
+ .kui-app-tab__name {
239
+ position: absolute;
240
+ width: 1px;
241
+ height: 1px;
242
+ padding: 0;
243
+ overflow: hidden;
244
+ clip: rect(0, 0, 0, 0);
245
+ white-space: nowrap;
246
+ clip-path: inset(50%);
247
+ }
248
+ }
130
249
  /* In a TabBar, the tab styles itself in the context of its parent strip. A
131
250
  segmented strip's outer ends follow the pill track: the first tab's leading
132
251
  corners, and a filled strip's last tab's trailing corners, are pill-rounded
@@ -0,0 +1,118 @@
1
+ .kui-chip {
2
+ --_kui-chip-fill-quiet: var(--kui-color-neutral-fill-quiet);
3
+ --_kui-chip-fill-solid: var(--kui-color-neutral-on-normal);
4
+ --_kui-chip-border: var(--kui-color-neutral-border-normal);
5
+ --_kui-chip-on-quiet: var(--kui-color-neutral-on-quiet);
6
+ --_kui-chip-on-solid: var(--kui-color-surface);
7
+
8
+ display: inline-flex;
9
+ min-width: 0;
10
+ min-height: 1.75rem;
11
+ padding-inline: 0.5rem;
12
+ box-sizing: border-box;
13
+ border: 1px solid transparent;
14
+ border-radius: var(--kui-layout-pill-radius, calc(1px + 1.3125rem));
15
+ color: var(--_kui-chip-on-quiet);
16
+ background: var(--_kui-chip-fill-quiet);
17
+ align-items: center;
18
+ gap: 0.25rem;
19
+ font-size: var(--kui-font-xs);
20
+ font-weight: 650;
21
+ line-height: 1;
22
+ white-space: nowrap;
23
+ }
24
+
25
+ .kui-chip[data-tone="brand"] {
26
+ --_kui-chip-fill-quiet: var(--kui-color-brand-fill-quiet);
27
+ --_kui-chip-fill-solid: var(--kui-color-brand-on-fill);
28
+ --_kui-chip-border: var(--kui-color-brand-border-normal);
29
+ --_kui-chip-on-quiet: var(--kui-color-brand-on-fill);
30
+ }
31
+
32
+ .kui-chip[data-tone="pop"] {
33
+ --_kui-chip-fill-quiet: var(--kui-color-pop-fill-quiet);
34
+ --_kui-chip-fill-solid: var(--kui-color-pop-on-fill);
35
+ --_kui-chip-border: var(--kui-color-pop-border-normal);
36
+ --_kui-chip-on-quiet: var(--kui-color-pop-on-fill);
37
+ }
38
+
39
+ .kui-chip[data-tone="success"] {
40
+ --_kui-chip-fill-quiet: var(--kui-color-success-fill-quiet);
41
+ --_kui-chip-fill-solid: var(--kui-color-success-on-fill);
42
+ --_kui-chip-border: var(--kui-color-success-border-normal);
43
+ --_kui-chip-on-quiet: var(--kui-color-success-on-fill);
44
+ }
45
+
46
+ .kui-chip[data-tone="warning"] {
47
+ --_kui-chip-fill-quiet: var(--kui-color-warning-fill-quiet);
48
+ --_kui-chip-fill-solid: var(--kui-color-warning-on-fill);
49
+ --_kui-chip-border: var(--kui-color-warning-border-normal);
50
+ --_kui-chip-on-quiet: var(--kui-color-warning-on-fill);
51
+ }
52
+
53
+ .kui-chip[data-tone="danger"] {
54
+ --_kui-chip-fill-quiet: var(--kui-color-danger-fill-quiet);
55
+ --_kui-chip-fill-solid: var(--kui-color-danger-on-fill);
56
+ --_kui-chip-border: var(--kui-color-danger-border-normal);
57
+ --_kui-chip-on-quiet: var(--kui-color-danger-on-fill);
58
+ }
59
+
60
+ .kui-chip[data-appearance="solid"] {
61
+ color: var(--_kui-chip-on-solid);
62
+ background: var(--_kui-chip-fill-solid);
63
+ }
64
+
65
+ .kui-chip[data-appearance="outline"] {
66
+ border-color: var(--_kui-chip-border);
67
+ background: transparent;
68
+ }
69
+
70
+ .kui-chip[data-shape="rounded"] {
71
+ border-radius: var(--kui-radius-s);
72
+ }
73
+
74
+ .kui-chip[data-size="compact"] {
75
+ min-height: 1.25rem;
76
+ padding-inline: 0.3125rem;
77
+ font-size: var(--kui-font-2xs);
78
+ }
79
+
80
+ .kui-chip[data-disabled] {
81
+ opacity: 0.5;
82
+ pointer-events: none;
83
+ }
84
+
85
+ .kui-chip__label {
86
+ min-width: 0;
87
+ overflow: hidden;
88
+ text-overflow: ellipsis;
89
+ }
90
+
91
+ .kui-chip__remove {
92
+ display: inline-grid;
93
+ width: 1.25rem;
94
+ height: 1.25rem;
95
+ padding: 0;
96
+ border: 0;
97
+ border-radius: 50%;
98
+ color: inherit;
99
+ background: transparent;
100
+ align-items: center;
101
+ justify-items: center;
102
+ cursor: pointer;
103
+ flex: none;
104
+ }
105
+
106
+ .kui-chip[data-size="compact"] .kui-chip__remove {
107
+ width: 1rem;
108
+ height: 1rem;
109
+ }
110
+
111
+ .kui-chip__remove:hover {
112
+ background: color-mix(in srgb, currentColor 12%, transparent);
113
+ }
114
+
115
+ .kui-chip__remove:focus-visible {
116
+ outline: var(--kui-focus-ring);
117
+ outline-offset: 1px;
118
+ }
@@ -14,6 +14,13 @@
14
14
  gap: var(--_kui-grid-gap, var(--kui-grid-gap));
15
15
  }
16
16
 
17
+ .kui-grid[data-min-column-width="true"] {
18
+ grid-template-columns: repeat(
19
+ auto-fit,
20
+ minmax(min(100%, var(--_kui-grid-min-column-width)), 1fr)
21
+ );
22
+ }
23
+
17
24
  /* `fill`: the layout root of a definite-height parent (an app root or a
18
25
  fixed-height frame) takes its full height. Inside a flex layout use `flex`. */
19
26
  .kui-grid[data-fill="true"] {
@@ -1,12 +1,8 @@
1
1
  .kui-list-item {
2
2
  --kui-list-group-divider-color: var(--kui-color-neutral-border-quiet);
3
3
  --kui-list-item-color: var(--kui-color-neutral-on-normal);
4
- --kui-list-item-border: transparent;
5
- --kui-list-item-background: transparent;
6
- --kui-list-item-hover-border: var(--kui-color-neutral-border-normal);
7
4
  --kui-list-item-hover-background: var(--kui-color-neutral-fill-quiet);
8
5
  --kui-list-item-selected-color: var(--kui-color-neutral-on-normal);
9
- --kui-list-item-selected-border: var(--kui-color-brand-border-quiet);
10
6
  --kui-list-item-selected-background: var(--kui-color-brand-fill-normal);
11
7
  display: grid;
12
8
  width: calc(100% - (2 * var(--kui-layout-inline-margin, 0.5rem)));
@@ -23,19 +19,20 @@
23
19
  );
24
20
  box-sizing: border-box;
25
21
  border: var(--kui-list-item-border-width, 1px) solid
26
- var(--kui-list-item-border);
22
+ var(--kui-list-item-border, transparent);
27
23
  border-radius: var(
28
24
  --kui-list-item-radius,
29
25
  var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
30
26
  );
31
27
  color: var(--kui-list-item-color);
32
- background: var(--kui-list-item-background);
28
+ background: var(--kui-list-item-background, transparent);
33
29
  cursor: pointer;
34
30
  grid-template-columns: var(--kui-list-item-columns, minmax(0, 1fr) auto);
35
31
  align-items: var(--kui-list-item-align-items, center);
36
32
  column-gap: var(--kui-list-item-gap, var(--kui-layout-item-gap, 0.5rem));
37
33
  font: inherit;
38
34
  text-align: start;
35
+ text-decoration: none;
39
36
  }
40
37
 
41
38
  .kui-list-item[data-density="compact"] {
@@ -98,7 +95,10 @@
98
95
  }
99
96
 
100
97
  .kui-list-item:hover:not([data-placeholder="true"]) {
101
- border-color: var(--kui-list-item-hover-border);
98
+ border-color: var(
99
+ --kui-list-item-hover-border,
100
+ var(--kui-color-neutral-border-normal)
101
+ );
102
102
  background: var(--kui-list-item-hover-background);
103
103
  }
104
104
 
@@ -112,13 +112,18 @@
112
112
  opacity: 0.58;
113
113
  }
114
114
 
115
- .kui-list-item:disabled:not([data-placeholder="true"]) {
115
+ .kui-list-item:is(:disabled, [aria-disabled="true"]):not(
116
+ [data-placeholder="true"]
117
+ ) {
116
118
  cursor: not-allowed;
117
119
  }
118
120
 
119
121
  .kui-list-item[aria-current="page"],
120
122
  .kui-list-item[aria-pressed="true"] {
121
- border-color: var(--kui-list-item-selected-border);
123
+ border-color: var(
124
+ --kui-list-item-selected-border,
125
+ var(--kui-color-brand-border-quiet)
126
+ );
122
127
  color: var(--kui-list-item-selected-color);
123
128
  background: var(--kui-list-item-selected-background);
124
129
  font-weight: 650;
@@ -100,6 +100,13 @@
100
100
  inset: 0;
101
101
  }
102
102
 
103
+ .kui-nav-stack__view[data-appearance="sunken"] {
104
+ background: var(
105
+ --kui-sunken-panel-background,
106
+ var(--kui-color-surface-lowered)
107
+ );
108
+ }
109
+
103
110
  /* Each view is its region's scroll owner: block insets become padding inside
104
111
  the scroller so content scrolls under an unsafe edge but can always be
105
112
  scrolled clear. A view whose only child is a Pane or layout lets that child
@@ -217,4 +224,10 @@
217
224
  :is([data-workbench-main], [data-workbench-panel-content])
218
225
  > [data-component="nav-stack"]:only-child {
219
226
  height: 100%;
227
+ --kui-edge-inset-block-start: var(--_kui-workbench-content-edge-block-start);
228
+ --kui-edge-inset-block-end: var(--_kui-workbench-content-edge-block-end);
229
+ --kui-edge-inset-inline-start: var(
230
+ --_kui-workbench-content-edge-inline-start
231
+ );
232
+ --kui-edge-inset-inline-end: var(--_kui-workbench-content-edge-inline-end);
220
233
  }
@@ -22,6 +22,33 @@
22
22
  grid-template-rows: auto minmax(0, 1fr) auto;
23
23
  }
24
24
 
25
+ /* Paint the active scroll owner once, so alpha lowered colors do not stack.
26
+ Fixed chrome leaves the content slot scrolling; auto chrome lets the Pane
27
+ root scroll in its short mode, while its content remains transparent. */
28
+ .kui-pane[data-appearance="sunken"] > .kui-pane__content {
29
+ background: var(
30
+ --kui-sunken-panel-background,
31
+ var(--kui-color-surface-lowered)
32
+ );
33
+ }
34
+
35
+ .kui-pane[data-appearance="sunken"][data-chrome-placement="auto"] {
36
+ background: var(
37
+ --kui-sunken-panel-background,
38
+ var(--kui-color-surface-lowered)
39
+ );
40
+ }
41
+
42
+ .kui-pane[data-appearance="sunken"][data-chrome-placement="auto"]
43
+ > .kui-pane__content {
44
+ background: transparent;
45
+ }
46
+
47
+ .kui-pane[data-appearance="sunken"][data-chrome-placement="auto"]
48
+ > :is(.kui-pane__header, .kui-pane__footer) {
49
+ background: var(--kui-pane-chrome-background, var(--kui-color-surface));
50
+ }
51
+
25
52
  /* Safe areas. The pane root never pads, so its background and separators paint
26
53
  through an unsafe area; its slots compensate on the edges the pane still
27
54
  touches. The inherited `--kui-edge-inset-*` context says how far each edge
@@ -217,6 +244,12 @@
217
244
  :is([data-workbench-main], [data-workbench-panel-content])
218
245
  > [data-component="pane"]:only-child {
219
246
  height: 100%;
247
+ --kui-edge-inset-block-start: var(--_kui-workbench-content-edge-block-start);
248
+ --kui-edge-inset-block-end: var(--_kui-workbench-content-edge-block-end);
249
+ --kui-edge-inset-inline-start: var(
250
+ --_kui-workbench-content-edge-inline-start
251
+ );
252
+ --kui-edge-inset-inline-end: var(--_kui-workbench-content-edge-inline-end);
220
253
  }
221
254
 
222
255
  /* As the only child of a NavStack view or a TabScaffold scene, a Pane fills