@kerfjs/ui 5.0.0-beta.96 → 5.0.0-beta.98

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 (52) hide show
  1. package/ai/component-catalog.json +3 -1
  2. package/ai/components/list-action-row.md +1 -0
  3. package/ai/components/list-item.md +1 -0
  4. package/ai/public-api-signatures-v1.md +24 -10
  5. package/ai/skill.md +4 -4
  6. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  7. package/dist/catalog-resources.d.ts +1 -1
  8. package/dist/catalog.d.ts +18 -4
  9. package/dist/catalog.js +6 -2
  10. package/dist/catalog.js.map +1 -1
  11. package/dist/{chunk-BU23Z5HZ.js → chunk-527IAEWG.js} +5 -3
  12. package/dist/chunk-527IAEWG.js.map +1 -0
  13. package/dist/{chunk-AYHC62OZ.js → chunk-AZWE2FB5.js} +15 -15
  14. package/dist/chunk-AZWE2FB5.js.map +1 -0
  15. package/dist/{nav-stack-BvSKY448.d.ts → nav-stack-Cp3Y8kJ9.d.ts} +5 -1
  16. package/dist/nav-stack.d.ts +1 -1
  17. package/dist/nav-stack.js +1 -1
  18. package/dist/select-register.js +11 -0
  19. package/dist/select-register.js.map +1 -1
  20. package/dist/split-view.d.ts +1 -1
  21. package/dist/split-view.js +1 -1
  22. package/dist/styles/catalog/components/catalog-example-stack.css +5 -0
  23. package/dist/styles/components/actions/popup-menu/popup-menu.css +7 -0
  24. package/dist/styles/components/actions/toolbar/toolbar.css +19 -0
  25. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +11 -3
  26. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +9 -0
  27. package/dist/styles/components/collections/list-action-row/list-action-row.css +14 -0
  28. package/dist/styles/components/collections/list-item/list-item.css +14 -0
  29. package/dist/styles/components/forms/select/select.css +1 -0
  30. package/dist/styles/components/forms/token-search-field/token-search-field.css +23 -5
  31. package/dist/styles/foundation.css +26 -0
  32. package/dist/styles/list-action-row.css +14 -0
  33. package/dist/styles/list-item.css +14 -0
  34. package/dist/styles/popup-menu.css +7 -0
  35. package/dist/styles/select.css +1 -0
  36. package/dist/styles/token-search-field.css +23 -5
  37. package/dist/styles/toolbar-control-group.css +11 -3
  38. package/dist/styles/toolbar-text.css +9 -0
  39. package/dist/styles/toolbar.css +19 -0
  40. package/dist/styles/webawesome.css +18 -0
  41. package/dist/wire-catalog.d.ts +1 -1
  42. package/dist/workbench.d.ts +1 -1
  43. package/dist/workbench.js +1 -1
  44. package/docs/catalog.md +7 -1
  45. package/docs/component-contract.md +10 -2
  46. package/docs/component-selection.md +20 -1
  47. package/docs/nav-stack.md +20 -6
  48. package/docs/webawesome-theme.md +7 -0
  49. package/llms.txt +14 -1
  50. package/package.json +1 -1
  51. package/dist/chunk-AYHC62OZ.js.map +0 -1
  52. package/dist/chunk-BU23Z5HZ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/forms/select/internal/install-select-actions.ts","../src/components/forms/select/internal/animate-select-popup.ts","../src/components/forms/select/internal/install-select-lifecycle.ts","../src/components/forms/select/internal/install-select-multiple.ts","../src/components/forms/select/register/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 | 'classList'\n | 'listbox'\n | 'currentOption'\n | 'selectedOptions'\n | 'dispatchEvent'\n | 'handleOpenChange'\n | 'updateComplete'\n> {\n // Native Popup starts with no sync policy; its declaration omits undefined.\n popup: Omit<WaSelect['popup'], 'sync'> & {\n sync?: WaSelect['popup']['sync'];\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 // Measure the visible menu rather than a trigger-width wrapper. Native\n // shift/auto-size can then contain the complete surface at either edge.\n host.popup.sync = host.classList.contains('kui-select--fit-menu')\n ? 'width'\n : undefined;\n host.popup.autoSize = 'both';\n host.popup.shiftPadding = 10;\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 '../../../../integrations/webawesome/help-tags/install-help-tag.js';\nimport { installSelectActions } from '../internal/install-select-actions.js';\nimport { installSelectLifecycle } from '../internal/install-select-lifecycle.js';\nimport { installSelectMultiple } from '../internal/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"]}
1
+ {"version":3,"sources":["../src/components/forms/select/internal/install-select-actions.ts","../src/components/forms/select/internal/animate-select-popup.ts","../src/components/forms/select/internal/install-select-lifecycle.ts","../src/components/forms/select/internal/install-select-multiple.ts","../src/components/forms/select/register/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 | 'classList'\n | 'listbox'\n | 'currentOption'\n | 'selectedOptions'\n | 'dispatchEvent'\n | 'handleOpenChange'\n | 'updateComplete'\n> {\n // Native Popup starts with no sync policy; its declaration omits undefined.\n popup: Omit<WaSelect['popup'], 'sync'> & {\n sync?: WaSelect['popup']['sync'];\n };\n getFirstOption(): WaSelect['currentOption'];\n setCurrentOption(option: WaSelect['currentOption']): void;\n addOpenListeners(): void;\n removeOpenListeners(): void;\n}\n\n/**\n * WebKit keeps a closed popover's last box in its scroll container's overflow\n * when the popup leaves the top layer, so a Select in a scrolling dialog body\n * scrolls into blank space after its listbox closes. Re-laying out the popup's\n * `display: contents` host for one synchronous layout recomputes that overflow\n * without hiding the trigger, so focus and the caret stay put.\n */\nfunction releaseClosedPopupOverflow(popup: HTMLElement): void {\n const display = popup.style.getPropertyValue('display');\n const priority = popup.style.getPropertyPriority('display');\n popup.style.setProperty('display', 'block');\n void popup.offsetHeight;\n if (display) popup.style.setProperty('display', display, priority);\n else popup.style.removeProperty('display');\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 // Measure the visible menu rather than a trigger-width wrapper. Native\n // shift/auto-size can then contain the complete surface at either edge.\n host.popup.sync = host.classList.contains('kui-select--fit-menu')\n ? 'width'\n : undefined;\n host.popup.autoSize = 'both';\n host.popup.shiftPadding = 10;\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 void host.popup.updateComplete.then(() => {\n if (!host.open) releaseClosedPopupOverflow(host.popup);\n });\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 '../../../../integrations/webawesome/help-tags/install-help-tag.js';\nimport { installSelectActions } from '../internal/install-select-actions.js';\nimport { installSelectLifecycle } from '../internal/install-select-lifecycle.js';\nimport { installSelectMultiple } from '../internal/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"]}
@@ -1,6 +1,6 @@
1
1
  import * as kerfjs from 'kerfjs';
2
2
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
- import { N as NavStackProps, a as NavStackView } from './nav-stack-BvSKY448.js';
3
+ import { N as NavStackProps, a as NavStackView } from './nav-stack-Cp3Y8kJ9.js';
4
4
  import { ResizableRegionProps } from './resizable-region.js';
5
5
  import './list.js';
6
6
  import './extension-attributes-mu8MFUl0.js';
@@ -1,4 +1,4 @@
1
- import { NavStack } from './chunk-AYHC62OZ.js';
1
+ import { NavStack } from './chunk-AZWE2FB5.js';
2
2
 
3
3
  import { ResizableRegion } from './chunk-Y6KT7ZTR.js';
4
4
 
@@ -7,3 +7,8 @@
7
7
  flex-direction: column;
8
8
  gap: 1rem;
9
9
  }
10
+
11
+ /* Application-width compositions span the stage instead of a reading measure. */
12
+ .kui-catalog-example-stack[data-width="full"] {
13
+ max-width: none;
14
+ }
@@ -28,10 +28,17 @@
28
28
  90%. Holding the scale leaves the shared fade. */
29
29
  .kui-popup-menu::part(menu) {
30
30
  padding: var(--_kui-popup-inset);
31
+ background: var(--_kui-popup-scroll-cue);
31
32
  gap: var(--_kui-popup-row-gap);
32
33
  scale: none !important;
33
34
  }
34
35
 
36
+ /* A submenu capped beside its parent menu (a phone placement) scrolls with
37
+ the same edge cue as the menu and a Select's listbox. */
38
+ .kui-popup-menu wa-dropdown-item::part(submenu) {
39
+ background: var(--_kui-popup-scroll-cue);
40
+ }
41
+
35
42
  .kui-popup-menu wa-dropdown-item {
36
43
  /* A plain command starts at the checkbox glyph's leading edge. The glyph
37
44
  sits half a smaller-font em beyond the row's base inset; its label starts
@@ -97,6 +97,25 @@
97
97
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
98
98
  }
99
99
 
100
+ /* A lone title in a balanced center (a navigation bar's title beside a back
101
+ control) centers on the toolbar while the side zones leave room, moves away
102
+ from a wider side when they do not, and truncates before it reaches a side
103
+ control: the side tracks keep their content width and the title's track
104
+ may shrink to nothing, so the title, unlike center controls, gives way
105
+ first. */
106
+ .kui-toolbar[data-center-align="balanced"][data-has-center="true"]:has(
107
+ > .kui-toolbar__center > .kui-toolbar-text:only-child
108
+ ) {
109
+ grid-template-columns:
110
+ minmax(max-content, 1fr) minmax(0, max-content)
111
+ minmax(max-content, 1fr);
112
+ }
113
+
114
+ .kui-toolbar[data-center-align="balanced"]
115
+ > .kui-toolbar__center:has(> .kui-toolbar-text:only-child) {
116
+ min-width: 0;
117
+ }
118
+
100
119
  .kui-toolbar[data-responsive="trailing-priority"][data-has-center="false"]:has(
101
120
  > .kui-toolbar__trailing [data-expanded="true"]
102
121
  ) {
@@ -173,6 +173,13 @@
173
173
  align-self: center;
174
174
  }
175
175
  .kui-toolbar-control-group[data-content="search"] {
176
+ /* The group owns the open/close width motion, and a collapsible search
177
+ inside follows it on every frame (no second, lagging width transition,
178
+ which left an empty band). For the length of the opening it also asks the
179
+ search to keep its query on one line, so the group's clip reveals the
180
+ query instead of re-wrapping it every frame (KF-CXQB30). */
181
+ --_kui-toolbar-group-search-width-duration: 0s;
182
+ --_kui-toolbar-group-search-reveal-duration: 0.25s;
176
183
  width: min(var(--kui-token-search-expanded-width, 30rem), 100%);
177
184
  max-width: 100%;
178
185
  height: auto;
@@ -232,9 +239,9 @@
232
239
  inside animated, leaving an empty band (KF-50K0JM). The collapsed state names
233
240
  a definite basis and minimum so all three flex lengths interpolate. */
234
241
  .kui-toolbar-control-group[data-content="search"][data-sizing="grow"] {
235
- /* The group owns this motion; a collapsible search inside follows it on
236
- every frame rather than running its own width transition. */
237
- --_kui-toolbar-group-grow-search-width-duration: 0s;
242
+ /* The group's flex size owns this motion; its basis-wide minimum (above)
243
+ already keeps the query on one line. */
244
+ --_kui-toolbar-group-search-reveal-duration: 0s;
238
245
  transition-property:
239
246
  width, flex-basis, flex-grow, min-width, background-color, border-color;
240
247
  transition-duration: 0.25s, 0.25s, 0.25s, 0.25s, 0.2s, 0.2s;
@@ -845,6 +852,7 @@
845
852
  @media (prefers-reduced-motion: reduce) {
846
853
  .kui-toolbar-control-group[data-content="search"],
847
854
  .kui-toolbar-control-group[data-content="search"][data-sizing="grow"] {
855
+ --_kui-toolbar-group-search-reveal-duration: 0s;
848
856
  transition-duration: 0s;
849
857
  }
850
858
 
@@ -129,6 +129,15 @@ button.kui-toolbar-text:focus-visible {
129
129
  font-size: var(--kui-font-2xs);
130
130
  }
131
131
 
132
+ /* A lone title in a balanced center is a navigation bar's title (a NavStack
133
+ view beside its back control): it keeps the page-title color it had leading
134
+ at the root, at whatever size, so the title does not dim as it centers. */
135
+ .kui-toolbar[data-center-align="balanced"]
136
+ > .kui-toolbar__center
137
+ > .kui-toolbar-text:only-child:not([data-tone]) {
138
+ color: var(--kui-color-text);
139
+ }
140
+
132
141
  .kui-toolbar-text[data-tone="dark"] {
133
142
  color: var(--kui-color-neutral-on-loud);
134
143
  }
@@ -46,6 +46,20 @@
46
46
  border-end-end-radius: 0;
47
47
  }
48
48
 
49
+ /* In a divided list, a corner is flat wherever its edge carries a divider
50
+ line, whichever row draws it (see ListItem). */
51
+ :is([data-divider="after"], [data-divider="both"]) + .kui-list-action-row {
52
+ border-start-start-radius: 0;
53
+ border-start-end-radius: 0;
54
+ }
55
+
56
+ .kui-list-action-row:has(
57
+ + :is([data-divider="before"], [data-divider="both"])
58
+ ) {
59
+ border-end-start-radius: 0;
60
+ border-end-end-radius: 0;
61
+ }
62
+
49
63
  .kui-list-action-row:not([data-placeholder="true"]):has(
50
64
  .kui-list-action-row__primary:hover
51
65
  ) {
@@ -68,6 +68,20 @@
68
68
  border-end-end-radius: 0;
69
69
  }
70
70
 
71
+ /* In a divided list, a corner is flat wherever its edge carries a divider
72
+ line, whichever row draws it: the previous row's after line squares this
73
+ row's top, and the next row's before line squares its bottom. So first,
74
+ middle, last, and only rows round just their outer corners. */
75
+ :is([data-divider="after"], [data-divider="both"]) + .kui-list-item {
76
+ border-start-start-radius: 0;
77
+ border-start-end-radius: 0;
78
+ }
79
+
80
+ .kui-list-item:has(+ :is([data-divider="before"], [data-divider="both"])) {
81
+ border-end-start-radius: 0;
82
+ border-end-end-radius: 0;
83
+ }
84
+
71
85
  .kui-list-item[data-has-icon="true"] {
72
86
  grid-template-columns: var(
73
87
  --kui-list-item-columns,
@@ -213,6 +213,7 @@
213
213
  }
214
214
  .kui-select::part(listbox) {
215
215
  padding: var(--_kui-popup-inset);
216
+ background: var(--_kui-popup-scroll-cue);
216
217
  width: max-content;
217
218
  min-width: 100%;
218
219
  max-width: min(20rem, calc(100vw - 1.25rem));
@@ -284,12 +284,12 @@
284
284
  no-grow / may-shrink behavior a toolbar row wants without leaking the width
285
285
  into the cross axis. */
286
286
  flex: 0 1 auto;
287
- /* A grow search group animates the open/close itself and sets this duration
288
- to 0s: the field is the group's width on every frame instead of running a
289
- second, lagging width transition that left an empty band beside a wrapped
290
- query (KF-50K0JM). */
287
+ /* A search toolbar group animates the open/close itself and sets this
288
+ duration to 0s: the field is the group's width on every frame instead of
289
+ running a second, lagging width transition that left an empty band beside
290
+ a wrapped query (KF-50K0JM, KF-CXQB30). */
291
291
  transition:
292
- width var(--_kui-toolbar-group-grow-search-width-duration, 0.25s) ease,
292
+ width var(--_kui-toolbar-group-search-width-duration, 0.25s) ease,
293
293
  background-color 0.2s ease,
294
294
  border-color 0.2s ease;
295
295
  }
@@ -301,6 +301,24 @@
301
301
  min-width: var(--_kui-toolbar-group-grow-search-min-width, 0px);
302
302
  }
303
303
 
304
+ /* While a search group opens, keep the query on one line: the group's clip
305
+ reveals it instead of re-wrapping it in the narrow, still-growing field.
306
+ Wrapping returns when the opening ends. The duration is 0s (no effect)
307
+ outside a search group and under reduced motion. */
308
+ .kui-token-search[data-collapsible="true"][data-expanded="true"]
309
+ > .kui-token-search__editor {
310
+ animation: kui-token-search-reveal
311
+ var(--_kui-toolbar-group-search-reveal-duration, 0s) linear;
312
+ }
313
+
314
+ @keyframes kui-token-search-reveal {
315
+ from,
316
+ to {
317
+ overflow-wrap: normal;
318
+ white-space: pre;
319
+ }
320
+ }
321
+
304
322
  .kui-token-search[data-collapsible="true"][data-expanded="true"][data-fill="true"] {
305
323
  width: 100%;
306
324
  flex: 1 1 auto;
@@ -104,6 +104,32 @@
104
104
  --_kui-popup-row-current-color: var(--kui-color-brand-on-fill);
105
105
  --_kui-popup-group-title-padding: 0.2rem 0.75rem 0.3rem;
106
106
  --_kui-popup-group-title-font-weight: 750;
107
+ /* A capped, scrolling popup shows that it scrolls: a soft shadow along an
108
+ edge while more choices lie beyond it. Covers painted in the surface
109
+ color scroll with the content (`local`) and hide each shadow (`scroll`,
110
+ fixed to the box) only while the list rests at that edge, so a popup
111
+ whose choices all fit, or one scrolled to its end, draws no cue there.
112
+ CSS alone, so it works in every engine with no listeners, and it leaves
113
+ the popup's own border, radius, and drop shadow untouched. */
114
+ --_kui-popup-scroll-cue-color: light-dark(rgb(0 0 0 / 0.2), rgb(0 0 0 / 0.9));
115
+ --_kui-popup-scroll-cue:
116
+ linear-gradient(var(--kui-color-surface-raised) 30%, transparent) center
117
+ top / 100% 1.5rem no-repeat local,
118
+ linear-gradient(transparent, var(--kui-color-surface-raised) 70%) center
119
+ bottom / 100% 1.5rem no-repeat local,
120
+ radial-gradient(
121
+ farthest-side at 50% 0,
122
+ var(--_kui-popup-scroll-cue-color),
123
+ transparent
124
+ )
125
+ center top / 100% 0.75rem no-repeat scroll,
126
+ radial-gradient(
127
+ farthest-side at 50% 100%,
128
+ var(--_kui-popup-scroll-cue-color),
129
+ transparent
130
+ )
131
+ center bottom / 100% 0.75rem no-repeat scroll,
132
+ var(--kui-color-surface-raised);
107
133
  --_kui-popup-caret-open-rotation: -180deg;
108
134
  --_kui-popup-caret-transition: rotate var(--wa-transition-slow, 0.3s)
109
135
  var(--wa-transition-easing, ease);
@@ -46,6 +46,20 @@
46
46
  border-end-end-radius: 0;
47
47
  }
48
48
 
49
+ /* In a divided list, a corner is flat wherever its edge carries a divider
50
+ line, whichever row draws it (see ListItem). */
51
+ :is([data-divider="after"], [data-divider="both"]) + .kui-list-action-row {
52
+ border-start-start-radius: 0;
53
+ border-start-end-radius: 0;
54
+ }
55
+
56
+ .kui-list-action-row:has(
57
+ + :is([data-divider="before"], [data-divider="both"])
58
+ ) {
59
+ border-end-start-radius: 0;
60
+ border-end-end-radius: 0;
61
+ }
62
+
49
63
  .kui-list-action-row:not([data-placeholder="true"]):has(
50
64
  .kui-list-action-row__primary:hover
51
65
  ) {
@@ -68,6 +68,20 @@
68
68
  border-end-end-radius: 0;
69
69
  }
70
70
 
71
+ /* In a divided list, a corner is flat wherever its edge carries a divider
72
+ line, whichever row draws it: the previous row's after line squares this
73
+ row's top, and the next row's before line squares its bottom. So first,
74
+ middle, last, and only rows round just their outer corners. */
75
+ :is([data-divider="after"], [data-divider="both"]) + .kui-list-item {
76
+ border-start-start-radius: 0;
77
+ border-start-end-radius: 0;
78
+ }
79
+
80
+ .kui-list-item:has(+ :is([data-divider="before"], [data-divider="both"])) {
81
+ border-end-start-radius: 0;
82
+ border-end-end-radius: 0;
83
+ }
84
+
71
85
  .kui-list-item[data-has-icon="true"] {
72
86
  grid-template-columns: var(
73
87
  --kui-list-item-columns,
@@ -28,10 +28,17 @@
28
28
  90%. Holding the scale leaves the shared fade. */
29
29
  .kui-popup-menu::part(menu) {
30
30
  padding: var(--_kui-popup-inset);
31
+ background: var(--_kui-popup-scroll-cue);
31
32
  gap: var(--_kui-popup-row-gap);
32
33
  scale: none !important;
33
34
  }
34
35
 
36
+ /* A submenu capped beside its parent menu (a phone placement) scrolls with
37
+ the same edge cue as the menu and a Select's listbox. */
38
+ .kui-popup-menu wa-dropdown-item::part(submenu) {
39
+ background: var(--_kui-popup-scroll-cue);
40
+ }
41
+
35
42
  .kui-popup-menu wa-dropdown-item {
36
43
  /* A plain command starts at the checkbox glyph's leading edge. The glyph
37
44
  sits half a smaller-font em beyond the row's base inset; its label starts
@@ -213,6 +213,7 @@
213
213
  }
214
214
  .kui-select::part(listbox) {
215
215
  padding: var(--_kui-popup-inset);
216
+ background: var(--_kui-popup-scroll-cue);
216
217
  width: max-content;
217
218
  min-width: 100%;
218
219
  max-width: min(20rem, calc(100vw - 1.25rem));
@@ -284,12 +284,12 @@
284
284
  no-grow / may-shrink behavior a toolbar row wants without leaking the width
285
285
  into the cross axis. */
286
286
  flex: 0 1 auto;
287
- /* A grow search group animates the open/close itself and sets this duration
288
- to 0s: the field is the group's width on every frame instead of running a
289
- second, lagging width transition that left an empty band beside a wrapped
290
- query (KF-50K0JM). */
287
+ /* A search toolbar group animates the open/close itself and sets this
288
+ duration to 0s: the field is the group's width on every frame instead of
289
+ running a second, lagging width transition that left an empty band beside
290
+ a wrapped query (KF-50K0JM, KF-CXQB30). */
291
291
  transition:
292
- width var(--_kui-toolbar-group-grow-search-width-duration, 0.25s) ease,
292
+ width var(--_kui-toolbar-group-search-width-duration, 0.25s) ease,
293
293
  background-color 0.2s ease,
294
294
  border-color 0.2s ease;
295
295
  }
@@ -301,6 +301,24 @@
301
301
  min-width: var(--_kui-toolbar-group-grow-search-min-width, 0px);
302
302
  }
303
303
 
304
+ /* While a search group opens, keep the query on one line: the group's clip
305
+ reveals it instead of re-wrapping it in the narrow, still-growing field.
306
+ Wrapping returns when the opening ends. The duration is 0s (no effect)
307
+ outside a search group and under reduced motion. */
308
+ .kui-token-search[data-collapsible="true"][data-expanded="true"]
309
+ > .kui-token-search__editor {
310
+ animation: kui-token-search-reveal
311
+ var(--_kui-toolbar-group-search-reveal-duration, 0s) linear;
312
+ }
313
+
314
+ @keyframes kui-token-search-reveal {
315
+ from,
316
+ to {
317
+ overflow-wrap: normal;
318
+ white-space: pre;
319
+ }
320
+ }
321
+
304
322
  .kui-token-search[data-collapsible="true"][data-expanded="true"][data-fill="true"] {
305
323
  width: 100%;
306
324
  flex: 1 1 auto;
@@ -173,6 +173,13 @@
173
173
  align-self: center;
174
174
  }
175
175
  .kui-toolbar-control-group[data-content="search"] {
176
+ /* The group owns the open/close width motion, and a collapsible search
177
+ inside follows it on every frame (no second, lagging width transition,
178
+ which left an empty band). For the length of the opening it also asks the
179
+ search to keep its query on one line, so the group's clip reveals the
180
+ query instead of re-wrapping it every frame (KF-CXQB30). */
181
+ --_kui-toolbar-group-search-width-duration: 0s;
182
+ --_kui-toolbar-group-search-reveal-duration: 0.25s;
176
183
  width: min(var(--kui-token-search-expanded-width, 30rem), 100%);
177
184
  max-width: 100%;
178
185
  height: auto;
@@ -232,9 +239,9 @@
232
239
  inside animated, leaving an empty band (KF-50K0JM). The collapsed state names
233
240
  a definite basis and minimum so all three flex lengths interpolate. */
234
241
  .kui-toolbar-control-group[data-content="search"][data-sizing="grow"] {
235
- /* The group owns this motion; a collapsible search inside follows it on
236
- every frame rather than running its own width transition. */
237
- --_kui-toolbar-group-grow-search-width-duration: 0s;
242
+ /* The group's flex size owns this motion; its basis-wide minimum (above)
243
+ already keeps the query on one line. */
244
+ --_kui-toolbar-group-search-reveal-duration: 0s;
238
245
  transition-property:
239
246
  width, flex-basis, flex-grow, min-width, background-color, border-color;
240
247
  transition-duration: 0.25s, 0.25s, 0.25s, 0.25s, 0.2s, 0.2s;
@@ -845,6 +852,7 @@
845
852
  @media (prefers-reduced-motion: reduce) {
846
853
  .kui-toolbar-control-group[data-content="search"],
847
854
  .kui-toolbar-control-group[data-content="search"][data-sizing="grow"] {
855
+ --_kui-toolbar-group-search-reveal-duration: 0s;
848
856
  transition-duration: 0s;
849
857
  }
850
858
 
@@ -129,6 +129,15 @@ button.kui-toolbar-text:focus-visible {
129
129
  font-size: var(--kui-font-2xs);
130
130
  }
131
131
 
132
+ /* A lone title in a balanced center is a navigation bar's title (a NavStack
133
+ view beside its back control): it keeps the page-title color it had leading
134
+ at the root, at whatever size, so the title does not dim as it centers. */
135
+ .kui-toolbar[data-center-align="balanced"]
136
+ > .kui-toolbar__center
137
+ > .kui-toolbar-text:only-child:not([data-tone]) {
138
+ color: var(--kui-color-text);
139
+ }
140
+
132
141
  .kui-toolbar-text[data-tone="dark"] {
133
142
  color: var(--kui-color-neutral-on-loud);
134
143
  }
@@ -97,6 +97,25 @@
97
97
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
98
98
  }
99
99
 
100
+ /* A lone title in a balanced center (a navigation bar's title beside a back
101
+ control) centers on the toolbar while the side zones leave room, moves away
102
+ from a wider side when they do not, and truncates before it reaches a side
103
+ control: the side tracks keep their content width and the title's track
104
+ may shrink to nothing, so the title, unlike center controls, gives way
105
+ first. */
106
+ .kui-toolbar[data-center-align="balanced"][data-has-center="true"]:has(
107
+ > .kui-toolbar__center > .kui-toolbar-text:only-child
108
+ ) {
109
+ grid-template-columns:
110
+ minmax(max-content, 1fr) minmax(0, max-content)
111
+ minmax(max-content, 1fr);
112
+ }
113
+
114
+ .kui-toolbar[data-center-align="balanced"]
115
+ > .kui-toolbar__center:has(> .kui-toolbar-text:only-child) {
116
+ min-width: 0;
117
+ }
118
+
100
119
  .kui-toolbar[data-responsive="trailing-priority"][data-has-center="false"]:has(
101
120
  > .kui-toolbar__trailing [data-expanded="true"]
102
121
  ) {
@@ -484,6 +484,24 @@
484
484
  gap: var(--kui-layout-item-gap, 0.5rem);
485
485
  }
486
486
 
487
+ /* The built-in close control matches a borderless single
488
+ ToolbarControlGroup button (the close in a toolbar-composed dialog): a
489
+ 40px circle, no border, and the toolbar's neutral hover fill, in place of
490
+ Web Awesome's 35px rounded square. */
491
+ :is(wa-dialog, wa-drawer)::part(close-button__base) {
492
+ width: 2.5rem;
493
+ min-width: 2.5rem;
494
+ height: 2.5rem;
495
+ padding: 0;
496
+ border-color: transparent;
497
+ border-radius: var(--kui-radius-circle);
498
+ justify-content: center;
499
+ }
500
+
501
+ :is(wa-dialog, wa-drawer)::part(close-button__base):hover {
502
+ background-color: var(--kui-color-neutral-fill-normal);
503
+ }
504
+
487
505
  /* Dialogs that provide their own dismissal affordance can opt out of Web
488
506
  Awesome's header action region without reaching through the shadow root.
489
507
  `header-actions` is a directly exported part, so it must be targeted from
@@ -5,7 +5,7 @@ import './semantic-content-BbzjvSu9.js';
5
5
  import './sides-BPSWde0A.js';
6
6
  import './pane.js';
7
7
  import './workbench.js';
8
- import './nav-stack-BvSKY448.js';
8
+ import './nav-stack-Cp3Y8kJ9.js';
9
9
  import './list.js';
10
10
  import './extension-attributes-mu8MFUl0.js';
11
11
  import './flex-alignment-4ms8ZbV8.js';
@@ -1,6 +1,6 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
2
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
- import { b as NavPane, N as NavStackProps } from './nav-stack-BvSKY448.js';
3
+ import { b as NavPane, N as NavStackProps } from './nav-stack-Cp3Y8kJ9.js';
4
4
  import { ListConfig } from './list.js';
5
5
  import { PaneConfig } from './pane.js';
6
6
  import { ResizableRegionSeparator, ResizableRegionCollapseMotion, ResizableRegionContentOverflow, ResizableRegionPresentation, ResizableRegionRestorePosition } from './resizable-region.js';
package/dist/workbench.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Workbench } from './chunk-BU23Z5HZ.js';
1
+ export { Workbench } from './chunk-527IAEWG.js';
2
2
 
3
3
 
4
4