@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.
- package/ai/component-catalog.json +3 -1
- package/ai/components/list-action-row.md +1 -0
- package/ai/components/list-item.md +1 -0
- package/ai/public-api-signatures-v1.md +24 -10
- package/ai/skill.md +4 -4
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/catalog-resources.d.ts +1 -1
- package/dist/catalog.d.ts +18 -4
- package/dist/catalog.js +6 -2
- package/dist/catalog.js.map +1 -1
- package/dist/{chunk-BU23Z5HZ.js → chunk-527IAEWG.js} +5 -3
- package/dist/chunk-527IAEWG.js.map +1 -0
- package/dist/{chunk-AYHC62OZ.js → chunk-AZWE2FB5.js} +15 -15
- package/dist/chunk-AZWE2FB5.js.map +1 -0
- package/dist/{nav-stack-BvSKY448.d.ts → nav-stack-Cp3Y8kJ9.d.ts} +5 -1
- package/dist/nav-stack.d.ts +1 -1
- package/dist/nav-stack.js +1 -1
- package/dist/select-register.js +11 -0
- package/dist/select-register.js.map +1 -1
- package/dist/split-view.d.ts +1 -1
- package/dist/split-view.js +1 -1
- package/dist/styles/catalog/components/catalog-example-stack.css +5 -0
- package/dist/styles/components/actions/popup-menu/popup-menu.css +7 -0
- package/dist/styles/components/actions/toolbar/toolbar.css +19 -0
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +11 -3
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +9 -0
- package/dist/styles/components/collections/list-action-row/list-action-row.css +14 -0
- package/dist/styles/components/collections/list-item/list-item.css +14 -0
- package/dist/styles/components/forms/select/select.css +1 -0
- package/dist/styles/components/forms/token-search-field/token-search-field.css +23 -5
- package/dist/styles/foundation.css +26 -0
- package/dist/styles/list-action-row.css +14 -0
- package/dist/styles/list-item.css +14 -0
- package/dist/styles/popup-menu.css +7 -0
- package/dist/styles/select.css +1 -0
- package/dist/styles/token-search-field.css +23 -5
- package/dist/styles/toolbar-control-group.css +11 -3
- package/dist/styles/toolbar-text.css +9 -0
- package/dist/styles/toolbar.css +19 -0
- package/dist/styles/webawesome.css +18 -0
- package/dist/wire-catalog.d.ts +1 -1
- package/dist/workbench.d.ts +1 -1
- package/dist/workbench.js +1 -1
- package/docs/catalog.md +7 -1
- package/docs/component-contract.md +10 -2
- package/docs/component-selection.md +20 -1
- package/docs/nav-stack.md +20 -6
- package/docs/webawesome-theme.md +7 -0
- package/llms.txt +14 -1
- package/package.json +1 -1
- package/dist/chunk-AYHC62OZ.js.map +0 -1
- 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"]}
|
package/dist/split-view.d.ts
CHANGED
|
@@ -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-
|
|
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';
|
package/dist/split-view.js
CHANGED
|
@@ -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;
|
|
236
|
-
|
|
237
|
-
--_kui-toolbar-group-
|
|
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,
|
|
@@ -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
|
|
288
|
-
to 0s: the field is the group's width on every frame instead of
|
|
289
|
-
second, lagging width transition that left an empty band beside
|
|
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-
|
|
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
|
package/dist/styles/select.css
CHANGED
|
@@ -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
|
|
288
|
-
to 0s: the field is the group's width on every frame instead of
|
|
289
|
-
second, lagging width transition that left an empty band beside
|
|
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-
|
|
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;
|
|
236
|
-
|
|
237
|
-
--_kui-toolbar-group-
|
|
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
|
}
|
package/dist/styles/toolbar.css
CHANGED
|
@@ -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
|
package/dist/wire-catalog.d.ts
CHANGED
|
@@ -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-
|
|
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';
|
package/dist/workbench.d.ts
CHANGED
|
@@ -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-
|
|
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