actual-css 0.1.0
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/CHANGELOG.md +11 -0
- package/LICENSE +21 -0
- package/README.md +166 -0
- package/dist/actual.css +4929 -0
- package/dist/actual.js +3 -0
- package/dist/actual.js.map +31 -0
- package/dist/actual.min.css +1 -0
- package/docs/README.md +26 -0
- package/docs/components.md +860 -0
- package/docs/design-notes/accessibility-decisions.md +32 -0
- package/docs/design-notes/browser-support.md +93 -0
- package/docs/design-notes/cascade-layer.md +52 -0
- package/docs/design-notes/css-anchor.md +33 -0
- package/docs/design-notes/naming.md +37 -0
- package/docs/design-notes/previous-work.md +5 -0
- package/docs/design-notes/references.md +324 -0
- package/docs/forms.md +1265 -0
- package/docs/javascript.md +426 -0
- package/docs/layout.md +480 -0
- package/docs/mental-model.md +73 -0
- package/docs/patterns.md +415 -0
- package/docs/reserved.md +7 -0
- package/docs/tokens.md +455 -0
- package/docs/typography.md +159 -0
- package/docs/ui.md +937 -0
- package/docs/utilities.md +384 -0
- package/llms.txt +17 -0
- package/package.json +101 -0
- package/src/css/actual.css +17 -0
- package/src/css/actual.full.css +2 -0
- package/src/css/actual.layer.css +3 -0
- package/src/css/base.css +70 -0
- package/src/css/components/accordion.css +97 -0
- package/src/css/components/actions.css +21 -0
- package/src/css/components/alert.css +137 -0
- package/src/css/components/avatar.css +199 -0
- package/src/css/components/badge.css +143 -0
- package/src/css/components/breadcrumb.css +56 -0
- package/src/css/components/busy.css +44 -0
- package/src/css/components/button.css +216 -0
- package/src/css/components/card.css +140 -0
- package/src/css/components/drawer.css +122 -0
- package/src/css/components/flyout.css +243 -0
- package/src/css/components/index.css +41 -0
- package/src/css/components/join.css +106 -0
- package/src/css/components/key.css +25 -0
- package/src/css/components/meter.css +81 -0
- package/src/css/components/modal.css +162 -0
- package/src/css/components/navbar.css +98 -0
- package/src/css/components/overline.css +49 -0
- package/src/css/components/pagination.css +30 -0
- package/src/css/components/progress.css +126 -0
- package/src/css/components/scrollspy.css +27 -0
- package/src/css/components/skeleton.css +67 -0
- package/src/css/components/spinner.css +60 -0
- package/src/css/components/status-bar.css +82 -0
- package/src/css/components/surface.css +48 -0
- package/src/css/components/tab.css +128 -0
- package/src/css/components/table.css +64 -0
- package/src/css/components/tooltip.css +107 -0
- package/src/css/dialog-fallback.css +56 -0
- package/src/css/focus.css +13 -0
- package/src/css/forms/choice-card.css +158 -0
- package/src/css/forms/choice.css +196 -0
- package/src/css/forms/control.css +106 -0
- package/src/css/forms/custom-select.css +93 -0
- package/src/css/forms/form-actions.css +43 -0
- package/src/css/forms/form.css +57 -0
- package/src/css/forms/index.css +15 -0
- package/src/css/forms/input-icon.css +36 -0
- package/src/css/forms/native.css +68 -0
- package/src/css/forms/select.css +36 -0
- package/src/css/forms/switch.css +127 -0
- package/src/css/forms/validation.css +63 -0
- package/src/css/grid.css +95 -0
- package/src/css/intents.css +33 -0
- package/src/css/layout.css +80 -0
- package/src/css/optional/index.css +5 -0
- package/src/css/optional/layout-extra.css +55 -0
- package/src/css/optional/scroll-snap.css +51 -0
- package/src/css/optional/scroller.css +51 -0
- package/src/css/optional/typography-fluid.css +48 -0
- package/src/css/optional/utilities-extra.css +289 -0
- package/src/css/print.css +47 -0
- package/src/css/prose.css +187 -0
- package/src/css/reset.css +56 -0
- package/src/css/theme.css +186 -0
- package/src/css/themes/corporate.css +60 -0
- package/src/css/themes/cyberpunk.css +60 -0
- package/src/css/themes/dark.css +32 -0
- package/src/css/themes/dim.css +33 -0
- package/src/css/themes/edge.css +143 -0
- package/src/css/themes/forest.css +65 -0
- package/src/css/themes/gradient.css +97 -0
- package/src/css/themes/index.css +43 -0
- package/src/css/themes/lavender.css +66 -0
- package/src/css/themes/mono.css +60 -0
- package/src/css/themes/neon.css +66 -0
- package/src/css/themes/ocean.css +60 -0
- package/src/css/themes/petrol.css +64 -0
- package/src/css/themes/spruce.css +64 -0
- package/src/css/themes/square.css +68 -0
- package/src/css/themes/sunset.css +66 -0
- package/src/css/tokens.css +122 -0
- package/src/css/utilities.css +162 -0
- package/src/css/variants.css +118 -0
- package/src/js/command.js +165 -0
- package/src/js/context-menu.js +291 -0
- package/src/js/dialog-fallback.js +163 -0
- package/src/js/dialog.js +503 -0
- package/src/js/enhance.js +208 -0
- package/src/js/events.js +22 -0
- package/src/js/filter.js +122 -0
- package/src/js/floating.js +462 -0
- package/src/js/flyout.js +187 -0
- package/src/js/focus.js +35 -0
- package/src/js/index.js +26 -0
- package/src/js/input.js +47 -0
- package/src/js/keys.js +30 -0
- package/src/js/mask.js +184 -0
- package/src/js/menu.js +88 -0
- package/src/js/password.js +98 -0
- package/src/js/scrollspy.js +121 -0
- package/src/js/selectors.js +59 -0
- package/src/js/status.js +158 -0
- package/src/js/surface.js +358 -0
- package/src/js/tab.js +173 -0
- package/src/js/tooltip.js +374 -0
- package/src/js/validation.js +419 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["..\\src\\js\\enhance.js", "..\\src\\js\\focus.js", "..\\src\\js\\keys.js", "..\\src\\js\\menu.js", "..\\src\\js\\selectors.js", "..\\src\\js\\events.js", "..\\src\\js\\floating.js", "..\\src\\js\\surface.js", "..\\src\\js\\flyout.js", "..\\src\\js\\context-menu.js", "..\\src\\js\\command.js", "..\\src\\js\\dialog.js", "..\\src\\js\\dialog-fallback.js", "..\\src\\js\\tab.js", "..\\src\\js\\tooltip.js", "..\\src\\js\\scrollspy.js", "..\\src\\js\\input.js", "..\\src\\js\\filter.js", "..\\src\\js\\mask.js", "..\\src\\js\\password.js", "..\\src\\js\\validation.js", "..\\src\\js\\status.js"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/*\n * Enhance — DOM lifecycle engine for behavioral enhancers.\n *\n * One MutationObserver per root watches DOM insertions/removals. Multiple calls\n * to enhance() share that observer while keeping separate teardown handles.\n *\n * Sweep (not removedNodes scanning) is the key design choice: it reasons\n * about final state after a batch, so a moved element (removed then\n * reinserted in the same batch) survives without a spurious disconnect.\n *\n * Attribute changes are intentionally not observed. Call refresh(node) after\n * adding a behavior attribute to an already-connected element. Behavior\n * attributes are setup-time contracts, not live enable/disable switches.\n *\n * enhancers: { [selector]: (el) => cleanup | void }\n * Returns: { refresh, forget, disconnect }\n */\n\nconst registries = new WeakMap();\n\nfunction noopRuntime() {\n return {\n refresh() {},\n forget() {},\n disconnect() {},\n };\n}\n\nfunction canScan(node) {\n return (\n node?.nodeType === Node.ELEMENT_NODE ||\n node?.nodeType === Node.DOCUMENT_NODE ||\n node?.nodeType === Node.DOCUMENT_FRAGMENT_NODE\n );\n}\n\nfunction createRegistry(root) {\n const records = new Set();\n let selectorString = \"\";\n\n function isValidSelector(selector) {\n try {\n root.querySelector?.(selector);\n if (root instanceof Element) root.matches(selector);\n return true;\n } catch (error) {\n console.error(`Invalid enhancer selector \"${selector}\"`, error);\n return false;\n }\n }\n\n function updateSelectorString() {\n selectorString = [...records].flatMap((record) => record.selectors).join(\",\");\n }\n\n function start(record, el) {\n if (!(el instanceof Element)) return;\n let active = record.instances.get(el);\n\n for (const selector of record.selectors) {\n if (!el.matches(selector)) continue;\n if (active?.has(selector)) continue;\n\n let cleanup;\n try {\n cleanup = record.enhancers[selector](el);\n } catch (error) {\n console.error(`Enhancer failed for selector \"${selector}\"`, error);\n continue;\n }\n if (!active) {\n active = new Map();\n record.instances.set(el, active);\n }\n active.set(selector, typeof cleanup === \"function\" ? cleanup : null);\n }\n }\n\n function stop(record, el) {\n const active = record.instances.get(el);\n if (!active) return;\n for (const cleanup of active.values()) {\n cleanup?.();\n }\n record.instances.delete(el);\n }\n\n function scanFor(record, node) {\n if (!canScan(node)) return;\n if (node instanceof Element) start(record, node);\n if (record.selectorString) {\n node.querySelectorAll?.(record.selectorString).forEach((el) => {\n start(record, el);\n });\n }\n }\n\n function scan(node) {\n if (!canScan(node) || !selectorString) return;\n if (node instanceof Element) {\n for (const record of records) start(record, node);\n }\n node.querySelectorAll?.(selectorString).forEach((el) => {\n for (const record of records) start(record, el);\n });\n }\n\n function sweepDisconnected() {\n for (const record of records) {\n for (const el of Array.from(record.instances.keys())) {\n if (!el.isConnected) stop(record, el);\n }\n }\n }\n\n const observer = new MutationObserver((mutationRecords) => {\n let hasRemoval = false;\n for (const mutationRecord of mutationRecords) {\n for (const node of mutationRecord.addedNodes) {\n scan(node);\n }\n if (mutationRecord.removedNodes.length > 0) {\n hasRemoval = true;\n }\n }\n if (hasRemoval) sweepDisconnected();\n });\n\n observer.observe(root, { childList: true, subtree: true });\n\n return {\n add(enhancers) {\n const selectors = Object.keys(enhancers).filter(isValidSelector);\n if (!selectors.length) return null;\n const validEnhancers = Object.fromEntries(\n selectors.map((selector) => [selector, enhancers[selector]]),\n );\n\n const record = {\n disconnected: false,\n enhancers: validEnhancers,\n instances: new Map(),\n selectors,\n selectorString: selectors.join(\",\"),\n };\n records.add(record);\n updateSelectorString();\n scanFor(record, root);\n return record;\n },\n refresh(record, node) {\n if (record.disconnected) return;\n scanFor(record, node);\n },\n forget(record, el) {\n if (record.disconnected) return;\n record.instances.delete(el);\n },\n remove(record) {\n if (record.disconnected) return;\n record.disconnected = true;\n for (const el of Array.from(record.instances.keys())) {\n stop(record, el);\n }\n records.delete(record);\n updateSelectorString();\n if (records.size === 0) {\n observer.disconnect();\n registries.delete(root);\n }\n },\n };\n}\n\nfunction registryFor(root) {\n let registry = registries.get(root);\n if (!registry) {\n registry = createRegistry(root);\n registries.set(root, registry);\n }\n return registry;\n}\n\n/**\n * @param {Record<string, (el: Element) => (() => void) | void>} enhancers\n * @param {Document | Element | DocumentFragment} [root]\n * @returns {{ refresh: (node: Node) => void, forget: (el: Element) => void, disconnect: () => void }}\n */\nexport default function enhance(enhancers, root) {\n if (typeof document === \"undefined\") {\n return noopRuntime();\n }\n\n root ??= document.documentElement;\n const registry = registryFor(root);\n const record = registry.add(enhancers);\n if (!record) return noopRuntime();\n\n return {\n refresh: (node) => registry.refresh(record, node),\n forget: (el) => {\n registry.forget(record, el);\n },\n disconnect: () => {\n registry.remove(record);\n },\n };\n}\n",
|
|
6
|
+
"const FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button\",\n \"input\",\n \"select\",\n \"textarea\",\n \"summary\",\n \"[contenteditable]:not([contenteditable='false'])\",\n \"[tabindex]\",\n].join(\",\");\n\nexport function isElementVisible(el) {\n if (!el || el.hidden) return false;\n if (typeof el.checkVisibility === \"function\") return el.checkVisibility();\n return el.getClientRects().length > 0;\n}\n\nfunction isFocusable(el) {\n return (\n el.tabIndex >= 0 &&\n !el.matches(\":disabled\") &&\n isElementVisible(el) &&\n !el.closest('[inert], [aria-hidden=\"true\"]')\n );\n}\n\nexport function getFocusable(root) {\n return [...root.querySelectorAll(FOCUSABLE_SELECTOR)].filter(isFocusable);\n}\n\nexport function focusFirstDescendant(root) {\n const target = getFocusable(root)[0];\n target?.focus();\n return !!target;\n}\n",
|
|
7
|
+
"/*\n * Keyboard helpers for small roving-focus widgets.\n *\n * Components still own key dispatch and side effects. These helpers only\n * centralize item lookup, edge handling, and optional wrapping.\n */\n\nexport function firstItem(items) {\n return items[0] || null;\n}\n\nexport function lastItem(items) {\n return items[items.length - 1] || null;\n}\n\nexport function nextItem(items, current, delta, opts = {}) {\n if (!items.length) return null;\n\n const wrap = opts.wrap !== false;\n const idx = items.indexOf(current);\n if (idx === -1) {\n return delta > 0 ? firstItem(items) : lastItem(items);\n }\n\n const next = idx + delta;\n if (!wrap) return items[next] || null;\n\n const wrapped = ((next % items.length) + items.length) % items.length;\n return items[wrapped];\n}\n",
|
|
8
|
+
"import { isElementVisible } from \"./focus.js\";\nimport { firstItem, lastItem, nextItem } from \"./keys.js\";\n\nconst MENU_ITEM_TARGET_SELECTORS = [\"button\", \"a\", '[role=\"menuitem\"]'];\n// Item contract, mirrored from flyout.css: a button, link, or menuitem\n// directly in the flyout or directly in any of its <li>. Prefixed with\n// .flyout rather than :scope because hasMenuItem() matches it via closest(),\n// where :scope would resolve to the target element instead of the flyout.\nexport const MENU_ITEM_SELECTOR = MENU_ITEM_TARGET_SELECTORS.flatMap((target) => [\n `.flyout > ${target}`,\n `.flyout li > ${target}`,\n]).join(\",\");\n\nfunction isUsableMenuItem(item) {\n return (\n !item.disabled &&\n item.getAttribute(\"aria-disabled\") !== \"true\" &&\n isElementVisible(item) &&\n !item.closest(\"[hidden], [inert], [aria-hidden='true']\")\n );\n}\n\nexport function getMenuItems(menu) {\n return [...menu.querySelectorAll(MENU_ITEM_SELECTOR)].filter(isUsableMenuItem);\n}\n\nfunction isAriaMenuItem(item) {\n return item.getAttribute(\"role\") === \"menuitem\";\n}\n\nfunction activateCurrentItem(menu) {\n const item = document.activeElement;\n if (!menu.contains(item) || !isAriaMenuItem(item)) return false;\n\n item.click();\n return true;\n}\n\nexport function hasMenuItems(menu) {\n return getMenuItems(menu).length > 0;\n}\n\nexport function hasMenuItem(target) {\n return !!target.closest?.(MENU_ITEM_SELECTOR);\n}\n\nexport function focusFirstMenuItem(menu) {\n firstItem(getMenuItems(menu))?.focus();\n}\n\nexport function focusLastMenuItem(menu) {\n lastItem(getMenuItems(menu))?.focus();\n}\n\nexport function onMenuKeydown(e, { close }) {\n const menu = e.currentTarget;\n const items = getMenuItems(menu);\n if (!items.length) return;\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n nextItem(items, document.activeElement, 1, { wrap: true })?.focus();\n break;\n case \"ArrowUp\":\n e.preventDefault();\n nextItem(items, document.activeElement, -1, { wrap: true })?.focus();\n break;\n case \"Home\":\n e.preventDefault();\n firstItem(items)?.focus();\n break;\n case \"End\":\n e.preventDefault();\n lastItem(items)?.focus();\n break;\n case \"Tab\":\n close(menu);\n break;\n case \"Enter\":\n case \" \":\n if (activateCurrentItem(menu)) {\n e.preventDefault();\n close(menu);\n }\n break;\n }\n}\n",
|
|
9
|
+
"/*\n * Selectors — the CSS class names this runtime looks for or writes, gathered\n * in one file.\n *\n * Every module that matches against or toggles one of Actual's own class\n * names imports its token from here instead of writing the string inline.\n * To run this runtime against a different CSS framework, edit this file (or\n * alias it in a bundler) — no other module needs to change.\n *\n * data-* attributes and ARIA are not listed: they are each module's own\n * behavior API, not CSS vocabulary, so they stay framework-neutral by\n * construction and never need remapping. A module with no entry here (see\n * status.js) has no CSS class dependency at all.\n */\nexport const CLASSES = {\n // flyout.js, context-menu.js — opt-in class on the panel/menu element.\n flyout: \"flyout\",\n // tab.js — opt-in class on the tablist element.\n tabs: \"tabs\",\n // scrollspy.js — opt-in class on the nav element.\n scrollspy: \"scrollspy\",\n // validation.js — opt-in class on the <form>.\n needsValidation: \"needs-validation\",\n // validation.js — written on <form> after the first submit attempt.\n wasValidated: \"was-validated\",\n // validation.js — read on the element an aria-describedby id resolves to.\n fieldError: \"field-error\",\n // validation.js — ancestor container searched for aria-invalid/danger state.\n field: \"field\",\n // validation.js — intents.css vocabulary class toggled on the field\n // container while any control inside it is invalid.\n danger: \"danger\",\n // surface.js — state class on the open flyout/menu/dialog surface.\n open: \"is-open\",\n // surface.js — state class while the surface renders as a mobile sheet.\n sheet: \"is-sheet\",\n // surface.js — class name written on the generated sheet backdrop.\n backdrop: \"surface-backdrop\",\n // dialog.js — transient class for the \"can't dismiss\" shake animation.\n static: \"is-static\",\n // dialog-fallback.js — marker written on a dialog controlled by the legacy\n // shim (browsers without native <dialog>); dialog-fallback.css keys its\n // emulated dialog presentation on it.\n dialogFallback: \"dialog-fallback\",\n // dialog-fallback.js — state class on a shimmed dialog while it is open as\n // a modal; carries the fixed positioning and simulated backdrop.\n fallbackModal: \"is-fallback-modal\",\n // dialog.js — written on <html> while any modal dialog is open.\n modalOpen: \"has-modal-open\",\n // dialog.js — written on <html> when the viewport had a classic scrollbar\n // before the first modal lock.\n hadScrollbar: \"had-scrollbar\",\n // tooltip.js — class name written on a shorthand-generated tooltip element.\n tooltip: \"tooltip\",\n // status.js — required alongside [data-status]. \"status\" is a common\n // domain word (order status, task status, …); the class keeps a\n // document-wide querySelector from matching an unrelated app element.\n statusBar: \"status-bar\",\n};\n",
|
|
10
|
+
"export const ACTUAL_EVENT_PREFIX = \"actual\";\n\nexport const EVENTS = {\n reposition: `${ACTUAL_EVENT_PREFIX}:reposition`,\n hide: `${ACTUAL_EVENT_PREFIX}:hide`,\n outOfView: `${ACTUAL_EVENT_PREFIX}:out-of-view`,\n // Cancelable: dispatched by a surface before it opens.\n // detail: { surface, options }\n surfaceOpen: `${ACTUAL_EVENT_PREFIX}:surface-open`,\n // Cancelable: dispatched by a context target before its menu opens.\n // detail: { menu, context, origin, trigger }\n contextMenu: `${ACTUAL_EVENT_PREFIX}:context-menu`,\n // Dispatched to show or clear the singleton status bar.\n // detail: { message, intent, duration } (or {} to clear)\n status: `${ACTUAL_EVENT_PREFIX}:status`,\n // Dispatched by a form after validation blocks submission.\n // detail: { form, firstInvalid, message }\n invalid: `${ACTUAL_EVENT_PREFIX}:invalid`,\n // Cancelable: dispatched by dialog.js before handling native cancel close.\n // detail: { dialog, sourceEvent }\n dialogCancel: `${ACTUAL_EVENT_PREFIX}:dialog-cancel`,\n};\n",
|
|
11
|
+
"/*\n * Compact positioning engine for menus, tooltips, and popovers.\n *\n * Core math ported from Floating UI. Uses a single global scroll/resize\n * listener to reposition all registered floating elements via rAF.\n */\n\nimport { EVENTS } from \"./events.js\";\n\n/* ── Placement parsing ────────────────────────────────── */\n\nfunction getSide(p) {\n return p.split(\"-\")[0];\n}\n\nfunction getAlignment(p) {\n return p.split(\"-\")[1] || null;\n}\n\nfunction getMainAxis(p) {\n return [\"top\", \"bottom\"].includes(getSide(p)) ? \"x\" : \"y\";\n}\n\nfunction flipSide(s) {\n if (s === \"top\") return \"bottom\";\n if (s === \"bottom\") return \"top\";\n if (s === \"left\") return \"right\";\n if (s === \"right\") return \"left\";\n}\n\n/* ── Coordinate math ──────────────────────────────────── */\n\nfunction computeCoords(reference, floating, placement, rtl) {\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const mainAxis = getMainAxis(placement);\n const commonAlign =\n reference[mainAxis === \"x\" ? \"width\" : \"height\"] / 2 -\n floating[mainAxis === \"x\" ? \"width\" : \"height\"] / 2;\n const side = getSide(placement);\n\n let coords;\n switch (side) {\n case \"top\":\n coords = { x: commonX, y: reference.y - floating.height };\n break;\n case \"bottom\":\n coords = { x: commonX, y: reference.y + reference.height };\n break;\n case \"right\":\n coords = { x: reference.x + reference.width, y: commonY };\n break;\n case \"left\":\n coords = { x: reference.x - floating.width, y: commonY };\n break;\n default:\n coords = { x: reference.x, y: reference.y };\n }\n\n const align = getAlignment(placement);\n const isVertical = mainAxis === \"x\";\n if (align === \"start\") coords[mainAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n if (align === \"end\") coords[mainAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n\n return coords;\n}\n\nfunction applyOffset(coords, side, offset, rtl) {\n switch (side) {\n case \"top\":\n coords.y -= offset;\n break;\n case \"bottom\":\n coords.y += offset;\n break;\n case \"left\":\n coords.x += rtl ? offset : -offset;\n break;\n case \"right\":\n coords.x += rtl ? -offset : offset;\n break;\n }\n}\n\nfunction getInlineOverflow(coords, floating, minX, maxX) {\n return Math.max(minX - coords.x, 0) + Math.max(coords.x + floating.width - maxX, 0);\n}\n\nfunction toBoundary(rect) {\n return {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height,\n };\n}\n\nconst supportsDirSelector = typeof CSS !== \"undefined\" && CSS.supports(\"selector(:dir(rtl))\");\n\nfunction isRTL(el) {\n if (el.dir === \"rtl\") return true;\n if (el.dir === \"ltr\") return false;\n if (supportsDirSelector) return el.matches(\":dir(rtl)\");\n return el.ownerDocument?.dir === \"rtl\";\n}\n\nfunction getDocEl(doc) {\n return doc.documentElement;\n}\n\nfunction toNumber(value) {\n const number = Number.parseFloat(value);\n return Number.isFinite(number) ? number : 0;\n}\n\nconst STABLE_SCROLLBAR_MAX_WIDTH = 25;\nconst NARROW_INLINE_FLIP_FALLBACK = 128;\n\nfunction getViewportBoundary(doc) {\n const win = doc.defaultView || window;\n const docEl = getDocEl(doc);\n const visualViewport = win.visualViewport;\n const x = visualViewport?.offsetLeft || 0;\n const y = visualViewport?.offsetTop || 0;\n let width = visualViewport?.width || docEl.clientWidth || win.innerWidth;\n const height = visualViewport?.height || docEl.clientHeight || win.innerHeight;\n\n const body = doc.body;\n if (body?.clientWidth > 0) {\n const bodyStyle = win.getComputedStyle?.(body);\n const bodyMargin =\n doc.compatMode === \"CSS1Compat\"\n ? toNumber(bodyStyle?.marginLeft) + toNumber(bodyStyle?.marginRight)\n : 0;\n // Classic stable scrollbars reserve inline space on the body. Subtract only\n // plausible scrollbar widths so unusual body sizing does not shrink the viewport.\n const stableScrollbar = Math.abs(docEl.clientWidth - body.clientWidth - bodyMargin);\n if (stableScrollbar <= STABLE_SCROLLBAR_MAX_WIDTH) {\n width -= stableScrollbar;\n }\n }\n\n return toBoundary({ x, y, width, height });\n}\n\nfunction getBoundary(ref, opts) {\n if (!opts.scope) return getViewportBoundary(ref.ownerDocument);\n const rect = opts.scope.getBoundingClientRect();\n return toBoundary({\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n });\n}\n\nfunction isOutsideBoundary(rect, boundary) {\n return (\n rect.right < boundary.x ||\n rect.left > boundary.right ||\n rect.bottom < boundary.y ||\n rect.top > boundary.bottom\n );\n}\n\nfunction getAvailableHeight(refRect, side, boundary, distance, padding) {\n if (side === \"top\") {\n return Math.max(0, refRect.top - boundary.y - distance - padding);\n }\n if (side === \"bottom\") {\n return Math.max(0, boundary.bottom - refRect.bottom - distance - padding);\n }\n return Math.max(0, boundary.height - padding * 2);\n}\n\nfunction isVisible(el) {\n if (el.hidden) return false;\n if (typeof el.checkVisibility === \"function\") return el.checkVisibility();\n return el.getClientRects().length > 0;\n}\n\nfunction topVisibleTracked() {\n const elements = [...tracked];\n for (let i = elements.length - 1; i >= 0; i--) {\n const el = elements[i];\n if (el.isConnected && isVisible(el)) return el;\n }\n return null;\n}\n\nfunction getFloatingSize(float) {\n const rect = float.getBoundingClientRect();\n return {\n width: float.offsetWidth || rect.width,\n height: float.offsetHeight || rect.height,\n };\n}\n\n/* ── Global scroll / resize tracking ──────────────────── */\n\nconst tracked = new Set();\nlet resizeObserver = null;\nlet tick = false;\nconst pendingTypes = new Set();\n\nfunction notify(type) {\n if (type === \"escape\") {\n const el = topVisibleTracked();\n if (!el) return;\n el.dispatchEvent(\n new CustomEvent(EVENTS.hide, {\n bubbles: false,\n detail: { type: \"escape\" },\n }),\n );\n return;\n }\n\n for (const el of tracked) {\n el.dispatchEvent(\n new CustomEvent(EVENTS.reposition, {\n bubbles: false,\n detail: { type },\n }),\n );\n }\n}\n\nfunction hasOpenSurface() {\n return topVisibleTracked() !== null;\n}\n\nfunction rafNotify(e) {\n if (e?.type) pendingTypes.add(e.type);\n if (!tick) {\n requestAnimationFrame(() => {\n const types = [...pendingTypes];\n pendingTypes.clear();\n for (const type of types) notify(type);\n tick = false;\n });\n }\n tick = true;\n}\n\nfunction getResizeObserver() {\n if (resizeObserver || typeof window === \"undefined\" || !window.ResizeObserver) {\n return resizeObserver;\n }\n\n resizeObserver = new window.ResizeObserver((entries, observer) => {\n for (const entry of entries) {\n observer.unobserve(entry.target);\n rafNotify({ type: \"element-resize\" });\n requestAnimationFrame(() => {\n if (tracked.has(entry.target)) observer.observe(entry.target);\n });\n }\n });\n return resizeObserver;\n}\n\n// Global document listeners run at import time; keep SSR imports inert.\nif (typeof document !== \"undefined\") {\n document.addEventListener(\"scroll\", rafNotify, { passive: true, capture: true });\n document.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Escape\" && !e.ctrlKey && !e.altKey && !e.shiftKey) {\n if (!hasOpenSurface()) return;\n e.preventDefault();\n notify(\"escape\");\n }\n });\n}\n// Global window listener runs at import time; keep SSR imports inert.\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", rafNotify, { passive: true });\n}\n\n/* ── Public API ────────────────────────────────────────── */\n\n/**\n * Register a floating element for auto-reposition on scroll/resize.\n * Returns a cleanup function that removes the element from tracking.\n */\nexport function track(el) {\n tracked.add(el);\n getResizeObserver()?.observe(el);\n return () => {\n tracked.delete(el);\n resizeObserver?.unobserve(el);\n };\n}\n\n/**\n * Compute and apply position for a floating element relative to a reference.\n *\n * @param {Element} ref\n * @param {HTMLElement} float\n * @param {object} [opts]\n * @param {string} [opts.placement] default \"bottom-start\"\n * @param {number} [opts.distance] px offset from reference\n * @param {boolean} [opts.flip] flip if overflows viewport\n * @param {boolean} [opts.shift] shift if overflows x-axis\n * @param {number} [opts.shiftPadding] px padding when shifting\n * @param {Element} [opts.scope] constrain to a bounding element\n */\nexport function reposition(ref, float, opts = {}) {\n if (!isVisible(float)) return;\n\n const placement = opts.placement || \"bottom-start\";\n const distance = opts.distance || 0;\n const flip = opts.flip !== false;\n const shift = opts.shift !== false;\n const shiftPad = opts.shiftPadding || 4;\n const rtl = isRTL(ref);\n\n const rects = ref.getClientRects();\n const refRect = placement.startsWith(\"bottom\") ? rects[rects.length - 1] : rects[0];\n if (!refRect) return;\n\n const boundary = getBoundary(ref, opts);\n if (isOutsideBoundary(refRect, boundary)) {\n float.dispatchEvent(\n new CustomEvent(EVENTS.outOfView, {\n bubbles: false,\n detail: { type: \"out-of-view\" },\n }),\n );\n return;\n }\n\n const floatRect = getFloatingSize(float);\n const sx = boundary.x;\n const sy = boundary.y;\n const cw = boundary.right;\n const ch = boundary.bottom;\n\n let side = getSide(placement);\n const align = getAlignment(placement);\n let axis = getMainAxis(placement);\n let current = placement;\n let coords = computeCoords(refRect, floatRect, current, rtl);\n applyOffset(coords, side, distance, rtl);\n\n if (flip) {\n const cx = Math.ceil(coords.x);\n const cy = Math.ceil(coords.y);\n\n if (\n (axis === \"x\" && (cy < sy || cy + floatRect.height >= ch)) ||\n (axis === \"y\" && (cx < sx || cx + floatRect.width >= cw))\n ) {\n side = flipSide(side);\n current = align ? `${side}-${align}` : side;\n coords = computeCoords(refRect, floatRect, current, rtl);\n applyOffset(coords, side, distance, rtl);\n }\n\n // Narrow side placements can fit neither left nor right. In that case,\n // fall back to top so compact mobile layouts get a usable placement.\n if (\n axis === \"y\" &&\n (coords.x < sx || coords.x + floatRect.width > cw) &&\n boundary.width - floatRect.width < NARROW_INLINE_FLIP_FALLBACK\n ) {\n side = \"top\";\n axis = \"x\";\n current = align ? `${side}-${align}` : side;\n coords = computeCoords(refRect, floatRect, current, rtl);\n applyOffset(coords, side, distance, rtl);\n }\n }\n\n if (axis === \"x\" && shift && getAlignment(current)) {\n const minX = sx + shiftPad;\n const maxX = cw - shiftPad;\n const currentOverflow = getInlineOverflow(coords, floatRect, minX, maxX);\n\n if (currentOverflow > 0) {\n const nextAlign = getAlignment(current) === \"end\" ? \"start\" : \"end\";\n const candidatePlacement = `${side}-${nextAlign}`;\n const candidate = computeCoords(refRect, floatRect, candidatePlacement, rtl);\n applyOffset(candidate, side, distance, rtl);\n\n if (getInlineOverflow(candidate, floatRect, minX, maxX) < currentOverflow) {\n current = candidatePlacement;\n coords = candidate;\n }\n }\n }\n\n // shift on x axis\n let p = 50;\n if (shift || floatRect.width > refRect.width) {\n const minX = sx + shiftPad;\n const maxX = cw - floatRect.width - shiftPad;\n\n if (coords.x < minX) {\n const total = minX - coords.x;\n coords.x = minX;\n p = 50 - (total / floatRect.width) * 100;\n } else if (coords.x > maxX) {\n const total = maxX - coords.x;\n coords.x = Math.max(sx, maxX);\n p = 50 + (total / floatRect.width) * 100;\n }\n }\n\n let py = 50;\n if (axis === \"y\" && (shift || floatRect.height > refRect.height)) {\n const minY = sy + shiftPad;\n const maxY = ch - floatRect.height - shiftPad;\n\n if (coords.y < minY) {\n const total = minY - coords.y;\n coords.y = minY;\n py = 50 - (total / floatRect.height) * 100;\n } else if (coords.y > maxY) {\n const total = maxY - coords.y;\n coords.y = Math.max(sy, maxY);\n py = 50 + (total / floatRect.height) * 100;\n }\n }\n\n const availableHeight = getAvailableHeight(refRect, side, boundary, distance, shiftPad);\n float.style.setProperty(\"--arrow-x\", `${p}%`);\n float.style.setProperty(\"--arrow-y\", `${py}%`);\n float.style.setProperty(\"--available-height\", `${availableHeight}px`);\n float.dataset.placement = current;\n Object.assign(float.style, {\n left: `${coords.x}px`,\n top: `${coords.y}px`,\n });\n}\n\nexport function repositionAt(x, y, float, opts = {}) {\n const doc = float.ownerDocument;\n const docEl = doc.documentElement;\n const win = doc.defaultView || window;\n const direction = doc.dir || docEl?.dir || win.getComputedStyle?.(docEl).direction || \"\";\n const ref = {\n ownerDocument: doc,\n dir: direction,\n matches: (selector) => selector === \":dir(rtl)\" && direction === \"rtl\",\n getClientRects: () => [\n {\n x,\n y,\n left: x,\n top: y,\n right: x,\n bottom: y,\n width: 0,\n height: 0,\n },\n ],\n };\n\n reposition(ref, float, opts);\n}\n",
|
|
12
|
+
"import { EVENTS } from \"./events.js\";\nimport { reposition, repositionAt, track } from \"./floating.js\";\nimport { hasMenuItem, onMenuKeydown } from \"./menu.js\";\nimport { CLASSES } from \"./selectors.js\";\n\nconst DEFAULT_BREAKPOINT = 768;\nconst BREAKPOINTS = {\n sm: 640,\n md: 768,\n lg: 1024,\n};\nconst openSurfaces = new Set();\nconst surfaceMap = new WeakMap();\nconst mountedSurfaces = new WeakMap();\n\nfunction waitForAnimations(...elements) {\n const animations = elements\n .filter(Boolean)\n .flatMap((el) =>\n typeof el.getAnimations === \"function\" ? el.getAnimations({ subtree: true }) : [],\n );\n\n return Promise.allSettled(animations.map((animation) => animation.finished));\n}\n\nfunction getSurfaceRoot(menu, anchor) {\n return anchor?.closest(\"dialog\") || menu.closest(\"dialog\") || menu.ownerDocument.body;\n}\n\nfunction mountSurface(menu, anchor) {\n if (mountedSurfaces.has(menu)) return;\n\n const root = getSurfaceRoot(menu, anchor);\n const parent = menu.parentNode;\n if (!root || !parent || parent === root) return;\n\n mountedSurfaces.set(menu, { parent, next: menu.nextSibling });\n root.append(menu);\n}\n\nfunction restoreSurface(menu) {\n const mount = mountedSurfaces.get(menu);\n if (!mount) return;\n\n if (mount.parent.isConnected) {\n const next = mount.next?.parentNode === mount.parent ? mount.next : null;\n mount.parent.insertBefore(menu, next);\n } else {\n menu.remove();\n }\n\n mountedSurfaces.delete(menu);\n}\n\nfunction getBreakpoint(menu) {\n const value = menu.dataset.flyoutBreakpoint || \"\";\n const raw = Number.parseInt(BREAKPOINTS[value] || value, 10);\n return Number.isFinite(raw) ? raw : DEFAULT_BREAKPOINT;\n}\n\nfunction getMobileMode(menu, mode) {\n return mode || menu.dataset.flyoutMobile || \"auto\";\n}\n\nfunction getPlacement(menu, placement) {\n return placement || menu.dataset.flyoutPlacement || \"bottom-start\";\n}\n\nfunction getDistance(menu, distance) {\n if (distance != null) return distance;\n const value = Number.parseFloat(menu.dataset.flyoutDistance);\n return Number.isFinite(value) ? value : 4;\n}\n\nfunction getAutoCloseMode(menu, value) {\n const mode = String(value ?? menu.dataset.flyoutAutoClose ?? \"true\").toLowerCase();\n if (mode === \"inside\" || mode === \"outside\" || mode === \"false\") return mode;\n return \"true\";\n}\n\nfunction shouldUseSheet(menu, mode) {\n const mobile = getMobileMode(menu, mode);\n if (mobile === \"none\" || mobile === \"anchored\") return false;\n if (mobile === \"sheet\") return true;\n\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n\n const breakpoint = getBreakpoint(menu);\n return (\n window.matchMedia(\"(pointer: coarse)\").matches &&\n window.matchMedia(`(max-width: ${breakpoint}px)`).matches\n );\n}\n\nfunction linkedTriggers(menu) {\n if (!menu.id) return [];\n return [...menu.ownerDocument.querySelectorAll(`[aria-controls=\"${CSS.escape(menu.id)}\"]`)];\n}\n\nfunction syncExpanded(menu, expanded) {\n for (const trigger of linkedTriggers(menu)) {\n trigger.setAttribute(\"aria-expanded\", expanded ? \"true\" : \"false\");\n }\n}\n\nfunction ensureBackdrop(menu, state) {\n if (!state.isSheet) {\n state.backdrop?.remove();\n state.backdrop = null;\n return;\n }\n\n if (state.backdrop?.isConnected) {\n state.backdrop.hidden = false;\n return;\n }\n\n const backdrop = menu.ownerDocument.createElement(\"div\");\n backdrop.className = CLASSES.backdrop;\n backdrop.hidden = false;\n backdrop.addEventListener(\"click\", () => {\n closeSurface(menu);\n });\n\n menu.before(backdrop);\n state.backdrop = backdrop;\n}\n\nfunction applyPresentation(menu, state) {\n state.isSheet = shouldUseSheet(menu, state.mobile);\n if (state.isSheet) {\n menu.style.removeProperty(\"left\");\n menu.style.removeProperty(\"top\");\n }\n menu.classList.toggle(CLASSES.sheet, state.isSheet);\n ensureBackdrop(menu, state);\n}\n\nfunction positionSurface(menu) {\n const state = surfaceMap.get(menu);\n if (!state || state.isSheet) return;\n\n if (state.trigger) {\n const triggerWidth = state.trigger.getBoundingClientRect().width;\n menu.style.setProperty(\"--flyout-trigger-width\", `${triggerWidth}px`);\n } else {\n menu.style.removeProperty(\"--flyout-trigger-width\");\n }\n\n const opts = {\n placement: state.placement || \"bottom-start\",\n distance: state.distance ?? 4,\n flip: state.flip !== false,\n shift: state.shift !== false,\n shiftPadding: state.shiftPadding ?? 4,\n scope: state.scope,\n };\n\n if (state.point) {\n repositionAt(state.point.x, state.point.y, menu, opts);\n return;\n }\n\n const anchor = state.trigger || state.source;\n if (anchor) reposition(anchor, menu, opts);\n}\n\nfunction ensureSurfaceWired(menu) {\n if (surfaceMap.has(menu)) return surfaceMap.get(menu);\n\n const controller = new AbortController();\n const state = {\n controller,\n untrack: track(menu),\n backdrop: null,\n trigger: null,\n source: null,\n point: null,\n mobile: \"auto\",\n placement: \"bottom-start\",\n distance: 4,\n flip: true,\n shift: true,\n shiftPadding: 4,\n autoClose: \"true\",\n isSheet: false,\n closeId: 0,\n };\n\n menu.addEventListener(\n EVENTS.reposition,\n (e) => {\n if (menu.hidden) return;\n if (e.detail?.type === \"scroll\" && surfaceMap.get(menu)?.point) {\n closeSurface(menu);\n return;\n }\n const state = surfaceMap.get(menu);\n if (!state) return;\n applyPresentation(menu, state);\n positionSurface(menu);\n },\n { signal: controller.signal },\n );\n\n menu.addEventListener(\n EVENTS.hide,\n (e) => {\n if (!menu.hidden) closeSurface(menu, { restoreFocus: e.detail?.type === \"escape\" });\n },\n { signal: controller.signal },\n );\n\n menu.addEventListener(\n EVENTS.outOfView,\n () => {\n if (!menu.hidden) closeSurface(menu);\n },\n { signal: controller.signal },\n );\n\n menu.addEventListener(\n \"keydown\",\n (e) => onMenuKeydown(e, { close: (target) => closeSurface(target) }),\n { signal: controller.signal },\n );\n\n menu.addEventListener(\n \"click\",\n (e) => {\n const state = surfaceMap.get(menu);\n const disabledItem = e.target.closest?.(\":disabled, [aria-disabled='true']\");\n if (disabledItem && menu.contains(disabledItem)) {\n e.preventDefault();\n return;\n }\n if (!state || state.autoClose === \"outside\" || state.autoClose === \"false\") return;\n if (hasMenuItem(e.target)) closeSurface(menu);\n },\n { signal: controller.signal },\n );\n\n surfaceMap.set(menu, state);\n return state;\n}\n\nexport function isSurfaceOpen(menu) {\n return menu.classList.contains(CLASSES.open) && !menu.hidden;\n}\n\nexport function prepareSurface(menu) {\n if (!menu) return;\n menu.style.position = \"fixed\";\n menu.hidden = true;\n syncExpanded(menu, false);\n}\n\nexport function openSurface(menu, opts = {}) {\n if (!menu?.isConnected) return false;\n if (isSurfaceOpen(menu)) return false;\n\n const beforeOpen = new CustomEvent(EVENTS.surfaceOpen, {\n bubbles: true,\n cancelable: true,\n detail: { surface: menu, options: opts },\n });\n if (!menu.dispatchEvent(beforeOpen)) return false;\n\n for (const other of openSurfaces) {\n if (other !== menu) closeSurface(other);\n }\n\n const anchor = opts.trigger || opts.source || null;\n mountSurface(menu, anchor);\n prepareSurface(menu);\n const state = ensureSurfaceWired(menu);\n state.trigger = opts.trigger || null;\n state.source = opts.source || null;\n state.point =\n Number.isFinite(opts.x) && Number.isFinite(opts.y) ? { x: opts.x, y: opts.y } : null;\n state.mobile = getMobileMode(menu, opts.mobile);\n state.autoClose = getAutoCloseMode(menu, opts.autoClose);\n state.placement = getPlacement(menu, opts.placement);\n state.distance = getDistance(menu, opts.distance);\n state.flip = opts.flip !== false;\n state.shift = opts.shift !== false;\n state.shiftPadding = opts.shiftPadding ?? 4;\n state.scope = opts.scope;\n state.restoreFocusTo = opts.restoreFocusTo || opts.trigger || opts.source || null;\n state.closeId++;\n\n menu.classList.add(CLASSES.open);\n menu.hidden = false;\n openSurfaces.add(menu);\n applyPresentation(menu, state);\n syncExpanded(menu, true);\n positionSurface(menu);\n return true;\n}\n\nexport function closeSurface(menu, opts = {}) {\n if (!menu || !isSurfaceOpen(menu)) return;\n\n const state = surfaceMap.get(menu);\n const closeId = state ? ++state.closeId : 0;\n const wasSheet = state?.isSheet === true;\n const activeElement = menu.ownerDocument.activeElement;\n const shouldRestoreFocus = opts.restoreFocus ?? menu.contains(activeElement);\n menu.classList.remove(CLASSES.open);\n if (!wasSheet) {\n menu.classList.remove(CLASSES.sheet);\n }\n menu.hidden = true;\n const backdrop = state?.backdrop || null;\n if (backdrop) backdrop.hidden = true;\n openSurfaces.delete(menu);\n syncExpanded(menu, false);\n\n if (shouldRestoreFocus && state?.restoreFocusTo?.isConnected) {\n state.restoreFocusTo.focus({ preventScroll: true });\n }\n\n waitForAnimations(menu, backdrop).then(() => {\n if (!state || state.closeId !== closeId) return;\n state.isSheet = false;\n menu.classList.remove(CLASSES.sheet);\n backdrop?.remove();\n if (state.backdrop === backdrop) state.backdrop = null;\n restoreSurface(menu);\n });\n}\n\nexport function disconnectSurface(menu) {\n if (!menu) return;\n closeSurface(menu);\n const state = surfaceMap.get(menu);\n if (state) {\n state.backdrop?.remove();\n state.untrack();\n state.controller.abort();\n surfaceMap.delete(menu);\n }\n restoreSurface(menu);\n}\n\n// Global outside-click listener runs at import time; keep SSR imports inert.\nif (typeof document !== \"undefined\") {\n document.addEventListener(\"click\", (e) => {\n for (const menu of openSurfaces) {\n const state = surfaceMap.get(menu);\n if (!state || state.autoClose === \"inside\" || state.autoClose === \"false\") continue;\n if (menu.contains(e.target) || state?.trigger?.contains(e.target)) continue;\n closeSurface(menu);\n }\n });\n}\n",
|
|
13
|
+
"/*\n * Flyout trigger — trigger adapter over the shared action-surface runtime.\n *\n * App menus keep roving focus and menuitem activation. Nav panels reuse the\n * same surface lifecycle without menu semantics.\n */\n\nimport enhance from \"./enhance.js\";\nimport { focusFirstDescendant } from \"./focus.js\";\nimport { focusFirstMenuItem, focusLastMenuItem, getMenuItems } from \"./menu.js\";\nimport { CLASSES } from \"./selectors.js\";\nimport {\n closeSurface,\n disconnectSurface,\n isSurfaceOpen,\n openSurface,\n prepareSurface,\n} from \"./surface.js\";\n\n// trigger -> { flyout, controller }\nconst triggerMap = new WeakMap();\nconst FLYOUT_SELECTOR = `.${CLASSES.flyout}`;\nconst FLYOUT_TRIGGER_SELECTOR = \"[aria-controls][aria-expanded]\";\n\nfunction openFlyout(flyout, trigger) {\n openSurface(flyout, { trigger, source: trigger });\n}\n\nfunction flyoutFor(trigger) {\n const flyoutId = trigger.getAttribute(\"aria-controls\");\n const flyout = flyoutId && trigger.ownerDocument.getElementById(flyoutId);\n return flyout?.matches(FLYOUT_SELECTOR) ? flyout : null;\n}\n\nfunction isMenuFlyout(flyout) {\n return flyout.matches(\"menu\");\n}\n\nfunction resolveCurrentFlyout(trigger, state) {\n if (state.flyout?.isConnected) return state.flyout;\n\n const flyout = flyoutFor(trigger);\n if (!flyout) return null;\n\n state.flyout = flyout;\n prepareSurface(flyout);\n if (!trigger.hasAttribute(\"aria-haspopup\") && isMenuFlyout(flyout)) {\n trigger.setAttribute(\"aria-haspopup\", \"menu\");\n }\n return flyout;\n}\n\nfunction openAndFocusPanel(flyout, trigger) {\n if (!isSurfaceOpen(flyout)) openFlyout(flyout, trigger);\n focusFirstDescendant(flyout);\n}\n\nfunction onTriggerClick(e) {\n const trigger = e.currentTarget;\n const state = triggerMap.get(trigger);\n if (!state) return;\n e.stopPropagation();\n const flyout = resolveCurrentFlyout(trigger, state);\n if (!flyout) return;\n if (isSurfaceOpen(flyout)) closeSurface(flyout);\n else openFlyout(flyout, trigger);\n}\n\nfunction onTriggerKeydown(e) {\n const trigger = e.currentTarget;\n const state = triggerMap.get(trigger);\n if (!state) return;\n const flyout = resolveCurrentFlyout(trigger, state);\n if (!flyout) return;\n const items = getMenuItems(flyout);\n const isActionList = items.length > 0;\n\n if (!isActionList) {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n openAndFocusPanel(flyout, trigger);\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n if (isSurfaceOpen(flyout)) closeSurface(flyout);\n else openAndFocusPanel(flyout, trigger);\n break;\n case \"Tab\":\n if (isSurfaceOpen(flyout) && !e.shiftKey && focusFirstDescendant(flyout)) {\n e.preventDefault();\n }\n break;\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n if (!isSurfaceOpen(flyout)) openFlyout(flyout, trigger);\n focusFirstMenuItem(flyout);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (!isSurfaceOpen(flyout)) openFlyout(flyout, trigger);\n focusLastMenuItem(flyout);\n break;\n case \"Home\":\n e.preventDefault();\n if (!isSurfaceOpen(flyout)) openFlyout(flyout, trigger);\n focusFirstMenuItem(flyout);\n break;\n case \"End\":\n e.preventDefault();\n if (!isSurfaceOpen(flyout)) openFlyout(flyout, trigger);\n focusLastMenuItem(flyout);\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n if (!isSurfaceOpen(flyout)) {\n openFlyout(flyout, trigger);\n focusFirstMenuItem(flyout);\n } else {\n closeSurface(flyout);\n }\n break;\n case \"Tab\":\n if (isSurfaceOpen(flyout)) closeSurface(flyout);\n break;\n }\n}\n\nfunction connectTrigger(trigger) {\n if (triggerMap.has(trigger)) return;\n const flyout = flyoutFor(trigger);\n if (!flyout) return;\n\n const controller = new AbortController();\n triggerMap.set(trigger, { flyout, controller });\n\n prepareSurface(flyout);\n if (!trigger.hasAttribute(\"aria-expanded\")) {\n trigger.setAttribute(\"aria-expanded\", \"false\");\n }\n if (!trigger.hasAttribute(\"aria-haspopup\") && isMenuFlyout(flyout)) {\n trigger.setAttribute(\"aria-haspopup\", \"menu\");\n }\n\n trigger.addEventListener(\"click\", onTriggerClick, { signal: controller.signal });\n trigger.addEventListener(\"keydown\", onTriggerKeydown, { signal: controller.signal });\n}\n\nfunction disconnectTrigger(trigger) {\n const state = triggerMap.get(trigger);\n if (!state) return;\n state.controller.abort();\n triggerMap.delete(trigger);\n}\n\nfunction connectFlyout(flyout) {\n if (!flyout.id) return;\n const triggers = flyout.ownerDocument.querySelectorAll(\n `${FLYOUT_TRIGGER_SELECTOR}[aria-controls=\"${CSS.escape(flyout.id)}\"]`,\n );\n for (const trigger of triggers) {\n if (!triggerMap.has(trigger)) connectTrigger(trigger);\n }\n}\n\nfunction disconnectFlyout(flyout) {\n if (!flyout) return;\n disconnectSurface(flyout);\n}\n\nenhance({\n [FLYOUT_TRIGGER_SELECTOR]: (trigger) => {\n connectTrigger(trigger);\n return () => disconnectTrigger(trigger);\n },\n [FLYOUT_SELECTOR]: (flyout) => {\n connectFlyout(flyout);\n return () => disconnectFlyout(flyout);\n },\n});\n",
|
|
14
|
+
"import enhance from \"./enhance.js\";\nimport { EVENTS } from \"./events.js\";\nimport { focusFirstMenuItem, hasMenuItems } from \"./menu.js\";\nimport { CLASSES } from \"./selectors.js\";\nimport {\n closeSurface,\n disconnectSurface,\n isSurfaceOpen,\n openSurface,\n prepareSurface,\n} from \"./surface.js\";\n\nconst LONG_PRESS_MS = 450;\nconst MOVE_TOLERANCE = 10;\nconst CONTEXT_MENU_SELECTOR = `menu.${CLASSES.flyout}`;\nconst CONTEXT_TARGET_SELECTOR = \"[data-context-menu]\";\nconst contextMap = new WeakMap();\nconst contextByMenu = new WeakMap();\n\n// Returns the detail from the last accepted `actual:context-menu` event for a\n// menu. This is intentionally optional: static menus need no application JS.\nexport function contextFor(menu) {\n return contextByMenu.get(menu) || null;\n}\n\nfunction menuFor(target) {\n const id = target.getAttribute(\"data-context-menu\");\n const menu = id ? target.ownerDocument.getElementById(id) : null;\n return menu?.matches(CONTEXT_MENU_SELECTOR) ? menu : null;\n}\n\nfunction shouldIgnoreNativeTarget(target) {\n return !!target.closest?.(\n \"a, button, input, textarea, select, option, [contenteditable], [role='button'], [role='link'], [data-context-menu-ignore]\",\n );\n}\n\nfunction getContextScope(target) {\n if (!target.hasAttribute(\"data-context-menu-scope\")) return null;\n\n const value = target.getAttribute(\"data-context-menu-scope\").trim();\n if (!value || value === \"self\") return target;\n if (value === \"parent\") return target.parentElement;\n\n try {\n return target.closest(value) || target.ownerDocument.querySelector(value);\n } catch {\n return null;\n }\n}\n\nfunction getLongPressDelay(target, menu) {\n const value = target.dataset.contextMenuLongPress ?? menu.dataset.contextMenuLongPress;\n if (value == null || value === \"false\" || value === \"none\") return null;\n if (value === \"\") return LONG_PRESS_MS;\n\n const delay = Number.parseInt(value, 10);\n return Number.isFinite(delay) ? delay : LONG_PRESS_MS;\n}\n\nfunction focusMenuContainer(menu) {\n if (!menu.hasAttribute(\"tabindex\")) {\n menu.tabIndex = -1;\n }\n menu.focus();\n}\n\n// Pointer-triggered opens (right-click, long-press) focus the menu container,\n// not the first item: a pointer-set focus ring is invisible (:focus-visible\n// doesn't match), so focusing \"Open\" makes the first ArrowDown look like it\n// skips to the second item. Focusing the container keeps the ring hidden and\n// lets keys.js's out-of-list fallback (indexOf === -1) land ArrowDown/ArrowUp\n// on the first/last item, matching native OS context menus. Keyboard-triggered\n// opens (openFromKeyboard) still focus the first item directly.\nfunction focusMenu(menu, mode) {\n if (!hasMenuItems(menu)) return;\n if (mode === \"first-item\") {\n focusFirstMenuItem(menu);\n } else {\n focusMenuContainer(menu);\n }\n}\n\nfunction requestContextMenu(context, menu, opts = {}) {\n const detail = {\n menu,\n context,\n origin: opts.origin || context,\n trigger: opts.trigger,\n };\n const event = new CustomEvent(EVENTS.contextMenu, {\n bubbles: true,\n cancelable: true,\n detail,\n });\n if (!context.dispatchEvent(event)) return null;\n contextByMenu.set(menu, detail);\n return detail;\n}\n\nfunction openContextMenu(context, menu, opts = {}) {\n if (!requestContextMenu(context, menu, opts)) return;\n if (isSurfaceOpen(menu)) closeSurface(menu);\n if (\n openSurface(menu, {\n source: context,\n x: opts.x,\n y: opts.y,\n placement: opts.placement || \"bottom-start\",\n distance: opts.distance ?? 2,\n mobile: opts.mobile || menu.dataset.flyoutMobile || \"auto\",\n scope: opts.scope || getContextScope(context),\n restoreFocusTo: opts.restoreFocusTo,\n })\n ) {\n focusMenu(menu, opts.focus);\n }\n}\n\nfunction openFromKeyboard(context, menu, origin = context, restoreFocusTo) {\n const rect = origin.getBoundingClientRect();\n openContextMenu(context, menu, {\n x: rect.left,\n y: rect.bottom,\n placement: \"bottom-start\",\n distance: 4,\n focus: \"first-item\",\n origin,\n trigger: \"keyboard\",\n restoreFocusTo,\n });\n}\n\nfunction clearLongPress(state) {\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n state.pointerId = null;\n}\n\nfunction connectContextTarget(target) {\n if (contextMap.has(target)) return;\n const menu = menuFor(target);\n if (!menu) return;\n\n prepareSurface(menu);\n const controller = new AbortController();\n const state = {\n controller,\n menu,\n timer: null,\n pointerId: null,\n startX: 0,\n startY: 0,\n suppressClickUntil: 0,\n };\n\n target.addEventListener(\n \"contextmenu\",\n (e) => {\n if (shouldIgnoreNativeTarget(e.target)) return;\n e.preventDefault();\n e.stopPropagation();\n openContextMenu(target, menu, {\n x: e.clientX,\n y: e.clientY,\n origin: e.target,\n trigger: \"pointer\",\n });\n },\n { signal: controller.signal },\n );\n\n target.addEventListener(\n \"keydown\",\n (e) => {\n if (e.key !== \"ContextMenu\" && !(e.shiftKey && e.key === \"F10\")) return;\n if (shouldIgnoreNativeTarget(e.target)) return;\n e.preventDefault();\n openFromKeyboard(target, menu, e.target, target);\n },\n { signal: controller.signal },\n );\n\n target.addEventListener(\n \"pointerdown\",\n (e) => {\n const delay = getLongPressDelay(target, menu);\n if (e.pointerType !== \"touch\" || delay == null || shouldIgnoreNativeTarget(e.target)) {\n return;\n }\n\n clearLongPress(state);\n state.pointerId = e.pointerId;\n state.startX = e.clientX;\n state.startY = e.clientY;\n state.timer = setTimeout(() => {\n state.timer = null;\n state.suppressClickUntil = Date.now() + 750;\n openContextMenu(target, menu, {\n x: state.startX,\n y: state.startY,\n origin: e.target,\n trigger: \"touch\",\n });\n }, delay);\n },\n { signal: controller.signal, passive: true },\n );\n\n target.addEventListener(\n \"pointermove\",\n (e) => {\n if (e.pointerId !== state.pointerId || !state.timer) return;\n if (\n Math.abs(e.clientX - state.startX) > MOVE_TOLERANCE ||\n Math.abs(e.clientY - state.startY) > MOVE_TOLERANCE\n ) {\n clearLongPress(state);\n }\n },\n { signal: controller.signal, passive: true },\n );\n\n for (const type of [\"pointerup\", \"pointercancel\", \"pointerleave\"]) {\n target.addEventListener(\n type,\n (e) => {\n if (e.pointerId === state.pointerId) clearLongPress(state);\n },\n { signal: controller.signal, passive: true },\n );\n }\n\n target.addEventListener(\n \"click\",\n (e) => {\n if (Date.now() <= state.suppressClickUntil) {\n e.preventDefault();\n e.stopPropagation();\n state.suppressClickUntil = 0;\n }\n },\n { signal: controller.signal, capture: true },\n );\n\n contextMap.set(target, state);\n}\n\nfunction disconnectContextTarget(target) {\n const state = contextMap.get(target);\n if (!state) return;\n clearLongPress(state);\n state.controller.abort();\n if (contextFor(state.menu)?.context === target) contextByMenu.delete(state.menu);\n contextMap.delete(target);\n}\n\nfunction connectContextMenu(menu) {\n const controller = new AbortController();\n menu.addEventListener(\n EVENTS.surfaceOpen,\n (event) => {\n const options = event.detail?.options;\n const trigger = options?.trigger;\n const context = trigger?.closest?.(CONTEXT_TARGET_SELECTOR);\n if (!context || menuFor(context) !== menu) return;\n if (!requestContextMenu(context, menu, { origin: trigger, trigger: \"button\" })) {\n event.preventDefault();\n return;\n }\n options.source = context;\n options.restoreFocusTo = trigger;\n },\n { signal: controller.signal },\n );\n return () => {\n controller.abort();\n contextByMenu.delete(menu);\n disconnectSurface(menu);\n };\n}\n\nenhance({\n [CONTEXT_TARGET_SELECTOR]: (target) => {\n connectContextTarget(target);\n return () => disconnectContextTarget(target);\n },\n [CONTEXT_MENU_SELECTOR]: (menu) => connectContextMenu(menu),\n});\n",
|
|
15
|
+
"/*\n * Command — stateless command/commandfor routing.\n *\n * The registry tracks command handlers, never triggers or targets. One click\n * listener per document reads the current DOM at event time, resolves the\n * current commandfor target, and routes the action. Newly inserted triggers,\n * late targets, changed commandfor values, and same-id replacements therefore\n * work immediately without an observer, scan, refresh call, or per-element\n * listener.\n */\n\n/* One registry per document owns its delegated listener and command handlers.\n * The WeakMap does not retain discarded documents; registry entries contain\n * behavior definitions only, never DOM triggers or resolved targets. */\nconst registries = new WeakMap();\n\nfunction commandNames(commands, caller) {\n const names = Array.isArray(commands) ? commands : [commands];\n if (!names.length || names.some((name) => typeof name !== \"string\" || !name)) {\n throw new TypeError(`${caller} requires one or more command names.`);\n }\n return [...new Set(names)];\n}\n\n// Native command keywords are ASCII case-insensitive. Custom commands keep\n// their exact spelling, as required by the command invoker contract.\nfunction commandKey(command) {\n return command.startsWith(\"--\")\n ? command\n : command.replace(/[A-Z]/g, (character) => character.toLowerCase());\n}\n\n/**\n * Resolve a trigger's current `commandfor` target in the same document or\n * shadow root.\n *\n * @param {Element} trigger Element carrying the `commandfor` attribute.\n * @returns {Element | null} The current target, or `null` when it cannot be resolved.\n */\nexport function targetFor(trigger) {\n const id = trigger.getAttribute(\"commandfor\");\n if (!id) return null;\n\n const root = trigger.getRootNode();\n return root.getElementById?.(id) ?? null;\n}\n\n/**\n * Build the button selector corresponding to one or more command names.\n *\n * @param {string | string[]} commands Command name or names to include.\n * @returns {string} A selector matching command buttons with `commandfor`.\n * @throws {TypeError} When no valid command name is provided.\n */\nexport function commandSelector(commands) {\n const attributes = commandNames(commands, \"commandSelector()\").map(\n (name) => `[command=\"${name.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"')}\"]`,\n );\n return `button[commandfor]:is(${attributes.join(\", \")})`;\n}\n\nfunction triggerFromEvent(event, doc) {\n const ElementClass = doc.defaultView?.Element;\n if (!ElementClass) return null;\n\n for (const node of event.composedPath?.() ?? [event.target]) {\n if (node instanceof ElementClass && node.matches(\"button[commandfor][command]\")) {\n return node;\n }\n if (node === doc) break;\n }\n\n return null;\n}\n\nfunction createRegistry(doc) {\n const commands = new Map();\n\n function route(event) {\n if (event.defaultPrevented) return;\n\n const trigger = triggerFromEvent(event, doc);\n if (!trigger || trigger.disabled) return;\n\n const command = commandKey(trigger.getAttribute(\"command\"));\n const registration = commands.get(command);\n if (!registration) return;\n\n const target = registration.resolve(trigger);\n if (!target) return;\n\n registration.prepare?.(trigger, target, command);\n registration.handle(event, trigger, target, command);\n }\n\n doc.addEventListener(\"click\", route);\n return { commands, route };\n}\n\n/**\n * Register one behavior for one or more command names.\n *\n * `prepare`, when present, runs immediately before `handle` on every matching\n * action. It must be idempotent; it is useful for semantics derived from the\n * resolved target, without introducing a connection lifecycle.\n *\n * @param {string | string[]} commands Command name or names owned by this behavior.\n * @param {object} options Behavior callbacks.\n * @param {(trigger: HTMLButtonElement) => Element | null} [options.resolve=targetFor]\n * Resolver evaluated for every action.\n * @param {(trigger: HTMLButtonElement, target: Element, command: string) => void} [options.prepare]\n * Optional idempotent callback run immediately before the handler.\n * @param {(event: MouseEvent, trigger: HTMLButtonElement, target: Element, command: string) => void} options.handle\n * Command handler.\n * @returns {{ disconnect: () => void }} An idempotent registration teardown handle.\n * @throws {TypeError} When command names or callbacks are invalid.\n * @throws {Error} When a command already has an owner in the current document.\n */\nexport function registerCommands(commands, { resolve = targetFor, prepare, handle } = {}) {\n const names = [\n ...new Set(commandNames(commands, \"registerCommands()\").map((name) => commandKey(name))),\n ];\n if (\n typeof resolve !== \"function\" ||\n (prepare !== undefined && typeof prepare !== \"function\") ||\n typeof handle !== \"function\"\n ) {\n throw new TypeError(\"registerCommands() requires function callbacks.\");\n }\n if (typeof document === \"undefined\") return { disconnect() {} };\n\n const doc = document;\n let registry = registries.get(doc);\n if (!registry) {\n registry = createRegistry(doc);\n registries.set(doc, registry);\n }\n\n const conflict = names.find((name) => registry.commands.has(name));\n if (conflict) {\n throw new Error(`Command \"${conflict}\" is already registered in this document.`);\n }\n\n const registration = { resolve, prepare, handle };\n for (const name of names) registry.commands.set(name, registration);\n\n let connected = true;\n return {\n disconnect() {\n if (!connected) return;\n connected = false;\n\n for (const name of names) {\n if (registry.commands.get(name) === registration) {\n registry.commands.delete(name);\n }\n }\n\n if (!registry.commands.size) {\n doc.removeEventListener(\"click\", registry.route);\n registries.delete(doc);\n }\n },\n };\n}\n",
|
|
16
|
+
"/*\n * Dialog — thin declarative layer over native <dialog>.\n *\n * Trigger: <button commandfor=\"dialog-id\" command=\"show-modal\">\n * Close button: <button commandfor=\"dialog-id\" command=\"request-close\">\n * Dialog: <dialog id=\"dialog-id\" data-dialog-dismissible>\n *\n * Command semantics are explicit: show-modal calls showModal(), show calls\n * show(). data-dialog-modal still defines the default for direct openDialog()\n * calls when no command mode is forced.\n * Dismissible means backdrop click/light dismiss is allowed.\n *\n * View transitions (opt-in via data-dialog-view-transition):\n * When the browser supports document.startViewTransition and the user allows\n * motion, the dialog morphs to/from its trigger using a shared\n * view-transition-name. Otherwise native dialog behavior remains the\n * baseline: the dialog simply opens and closes.\n *\n * Browsers without native <dialog> can get a rudimentary per-element shim\n * from the optional, standalone dialog-fallback.js module; this module has\n * no dependency on it and alerts when no shim or polyfill made the target\n * controllable.\n */\n\nimport { registerCommands, targetFor } from \"./command.js\";\nimport enhance from \"./enhance.js\";\nimport { EVENTS } from \"./events.js\";\nimport { CLASSES } from \"./selectors.js\";\n\nconst dialogMap = new WeakMap();\nconst wiredDialogs = new Set();\nconst DIALOG_COMMANDS = [\"show-modal\", \"show\", \"request-close\", \"close\"];\nconst DIALOG_SELECTOR = \"dialog\";\nconst DIALOG_TITLE_SELECTOR = \"[data-title], h1, h2, h3, h4, h5, h6\";\nconst DEFAULT_UNSUPPORTED_MESSAGE =\n \"This dialog cannot open because this browser does not support this feature.\";\nlet uid = 0;\n\nfunction supportsDialog() {\n return (\n typeof HTMLDialogElement !== \"undefined\" &&\n typeof HTMLDialogElement.prototype.showModal === \"function\"\n );\n}\nfunction isDialogElement(el) {\n return (\n typeof Node !== \"undefined\" && el?.nodeType === Node.ELEMENT_NODE && el.localName === \"dialog\"\n );\n}\n\nfunction canControlDialog(el) {\n // Optional polyfills may patch registered <dialog> elements without making\n // supportsDialog() true globally, so check the actual element before opening.\n return (\n isDialogElement(el) &&\n typeof el.show === \"function\" &&\n typeof el.showModal === \"function\" &&\n typeof el.close === \"function\"\n );\n}\n\nfunction isDialog(el) {\n return canControlDialog(el);\n}\n\nfunction boolData(el, name) {\n return el.hasAttribute(name) && el.getAttribute(name) !== \"false\";\n}\n\nfunction ensureId(el, prefix) {\n if (!el.id) {\n uid++;\n el.id = `${prefix}-${uid}`;\n }\n return el.id;\n}\n\nfunction syncDialogSemantics(dialog, modal = isModal(dialog)) {\n if (modal) {\n dialog.setAttribute(\"aria-modal\", \"true\");\n } else {\n dialog.removeAttribute(\"aria-modal\");\n }\n\n if (dialog.hasAttribute(\"aria-label\") || dialog.hasAttribute(\"aria-labelledby\")) {\n return;\n }\n\n const label = dialog.getAttribute(\"data-title\")?.trim();\n if (label) {\n dialog.setAttribute(\"aria-label\", label);\n return;\n }\n\n const title = dialog.querySelector(DIALOG_TITLE_SELECTOR);\n if (title) {\n dialog.setAttribute(\"aria-labelledby\", ensureId(title, \"dialog-title\"));\n }\n}\n\n// Reached only when neither the optional dialog-fallback module nor an\n// adopter polyfill made the target controllable on a legacy browser.\nfunction notifyUnsupportedDialog(trigger) {\n const win = trigger.ownerDocument.defaultView;\n win?.alert?.(DEFAULT_UNSUPPORTED_MESSAGE);\n}\n\nfunction isModal(dialog) {\n return dialog.getAttribute(\"data-dialog-modal\") !== \"false\";\n}\n\nfunction resolveModalMode(dialog, forcedModal = null) {\n return forcedModal == null ? isModal(dialog) : forcedModal;\n}\n\nfunction isModalOpen(dialog) {\n if (!dialog.open) return false;\n // :modal distinguishes a top-layer showModal() dialog from one opened via\n // show() or a bare `open` attribute in the initial HTML (never modal per\n // spec, whatever data-dialog-modal says).\n try {\n return dialog.matches(\":modal\");\n } catch {\n // Selector unsupported: the only way a dialog is open before we wire it\n // is the `open` attribute, which is non-modal.\n return false;\n }\n}\n\nfunction syncModalOpenClass(doc = document) {\n let hasOpenModal = false;\n\n for (const dialog of wiredDialogs) {\n const state = dialogMap.get(dialog);\n if (\n dialog.ownerDocument === doc &&\n dialog.isConnected &&\n dialog.open &&\n state?.modalOpen === true\n ) {\n hasOpenModal = true;\n break;\n }\n }\n\n const root = doc.documentElement;\n const wasOpen = root.classList.contains(CLASSES.modalOpen);\n\n if (hasOpenModal && !wasOpen) {\n const viewportWidth = doc.defaultView?.innerWidth;\n root.classList.toggle(\n CLASSES.hadScrollbar,\n Number.isFinite(viewportWidth) && viewportWidth > root.clientWidth,\n );\n } else if (!hasOpenModal) {\n root.classList.remove(CLASSES.hadScrollbar);\n }\n\n root.classList.toggle(CLASSES.modalOpen, hasOpenModal);\n}\n\nfunction isDismissible(dialog) {\n return boolData(dialog, \"data-dialog-dismissible\");\n}\n\nfunction wantsViewTransition(dialog) {\n return boolData(dialog, \"data-dialog-view-transition\");\n}\n\nconst VT_NAME = \"actual-dialog\";\n\nfunction supportsViewTransitions(doc = document) {\n return typeof doc.startViewTransition === \"function\";\n}\n\nfunction motionAllowed(doc = document) {\n return !doc.defaultView?.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nfunction setVtName(target, name) {\n if (target) target.style.viewTransitionName = name;\n}\n\nfunction clearVtName(...targets) {\n for (const target of targets) {\n if (target) target.style.viewTransitionName = \"\";\n }\n}\n\nfunction canViewTransition(dialog, trigger) {\n const doc = dialog.ownerDocument;\n return (\n wantsViewTransition(dialog) &&\n supportsViewTransitions(doc) &&\n motionAllowed(doc) &&\n trigger?.isConnected === true\n );\n}\n\nfunction openDialogWithViewTransition(dialog, trigger, forcedModal = null) {\n if (!canViewTransition(dialog, trigger)) {\n openDialog(dialog, trigger, forcedModal);\n return;\n }\n\n setVtName(trigger, VT_NAME);\n\n const transition = dialog.ownerDocument.startViewTransition(() => {\n clearVtName(trigger);\n setVtName(dialog, VT_NAME);\n openDialog(dialog, trigger, forcedModal);\n });\n\n transition.finished.finally(() => clearVtName(dialog, trigger)).catch(() => {});\n}\n\nfunction isOutsideDialog(dialog, event) {\n const rect = dialog.getBoundingClientRect();\n\n return (\n event.clientX < rect.left ||\n event.clientX > rect.right ||\n event.clientY < rect.top ||\n event.clientY > rect.bottom\n );\n}\n\nfunction flashStatic(dialog) {\n const state = ensureDialogWired(dialog);\n\n if (state.staticTimer) {\n window.clearTimeout(state.staticTimer);\n }\n\n dialog.classList.remove(CLASSES.static);\n void dialog.offsetWidth;\n dialog.classList.add(CLASSES.static);\n\n state.staticTimer = window.setTimeout(() => {\n dialog.classList.remove(CLASSES.static);\n state.staticTimer = null;\n }, 250);\n}\n\nfunction finishClose(dialog, returnValue = \"\") {\n const state = dialogMap.get(dialog);\n\n if (state) {\n state.closing = false;\n state.returnValue = \"\";\n }\n\n if (dialog.open) {\n dialog.close(returnValue);\n }\n}\n\nexport function closeDialog(dialog, returnValue = \"\") {\n if (!isDialog(dialog) || !dialog.open) return;\n\n const state = ensureDialogWired(dialog);\n if (state.closing) return;\n\n const trigger = state.restoreFocusTo;\n if (canViewTransition(dialog, trigger)) {\n state.closing = true;\n setVtName(dialog, VT_NAME);\n\n const transition = dialog.ownerDocument.startViewTransition(() => {\n clearVtName(dialog);\n setVtName(trigger, VT_NAME);\n dialog.close(returnValue);\n });\n\n transition.finished\n .finally(() => {\n state.closing = false;\n clearVtName(trigger);\n })\n .catch(() => {});\n return;\n }\n\n finishClose(dialog, returnValue);\n}\n\nexport function requestDialogClose(dialog, returnValue = \"\") {\n if (!isDialog(dialog) || !dialog.open) return;\n\n if (typeof dialog.requestClose === \"function\") {\n ensureDialogWired(dialog).returnValue = returnValue;\n dialog.requestClose(returnValue);\n return;\n }\n\n closeDialog(dialog, returnValue);\n}\n\nexport function openDialog(dialog, trigger = null, forcedModal = null) {\n if (!isDialog(dialog) || dialog.open || !dialog.isConnected) return;\n\n const state = ensureDialogWired(dialog);\n const modal = resolveModalMode(dialog, forcedModal);\n syncDialogSemantics(dialog, modal);\n\n state.closing = false;\n state.restoreFocusTo = trigger || document.activeElement;\n\n if (modal) {\n dialog.showModal();\n state.modalOpen = true;\n } else {\n dialog.show();\n state.modalOpen = false;\n }\n\n syncModalOpenClass(dialog.ownerDocument);\n}\n\nfunction handleDialogClick(event) {\n const dialog = event.currentTarget;\n\n if (event.target !== dialog || !isOutsideDialog(dialog, event)) return;\n\n event.preventDefault();\n\n if (isDismissible(dialog)) {\n requestDialogClose(dialog);\n return;\n }\n\n flashStatic(dialog);\n}\n\nfunction handleDialogSubmit(event) {\n const dialog = event.currentTarget;\n const form = event.target;\n\n if (!(form instanceof HTMLFormElement)) return;\n if (form.method.toLowerCase() !== \"dialog\") return;\n if (!canViewTransition(dialog, dialogMap.get(dialog)?.restoreFocusTo)) return;\n\n event.preventDefault();\n closeDialog(dialog, event.submitter?.value || \"\");\n}\n\nfunction handleDialogCancel(event) {\n const dialog = event.currentTarget;\n\n if (!isDismissible(dialog)) {\n event.preventDefault();\n flashStatic(dialog);\n return;\n }\n\n const request = new CustomEvent(EVENTS.dialogCancel, {\n bubbles: true,\n cancelable: true,\n detail: { dialog, sourceEvent: event },\n });\n if (!dialog.dispatchEvent(request)) {\n event.preventDefault();\n return;\n }\n\n event.preventDefault();\n closeDialog(dialog, dialogMap.get(dialog)?.returnValue || \"\");\n}\n\nfunction handleDialogClose(event) {\n const dialog = event.currentTarget;\n const state = dialogMap.get(dialog);\n\n clearVtName(dialog);\n\n if (!state) return;\n\n if (state.staticTimer) {\n window.clearTimeout(state.staticTimer);\n state.staticTimer = null;\n }\n\n dialog.classList.remove(CLASSES.static);\n state.closing = false;\n state.returnValue = \"\";\n state.modalOpen = false;\n syncModalOpenClass(dialog.ownerDocument);\n\n const restoreFocusTo = state.restoreFocusTo;\n state.restoreFocusTo = null;\n\n if (restoreFocusTo?.isConnected) {\n restoreFocusTo.focus();\n }\n}\n\nfunction ensureDialogWired(dialog) {\n if (dialogMap.has(dialog)) return dialogMap.get(dialog);\n\n const controller = new AbortController();\n const state = {\n controller,\n closing: false,\n modalOpen: isModalOpen(dialog),\n restoreFocusTo: null,\n returnValue: \"\",\n staticTimer: null,\n };\n\n syncDialogSemantics(dialog);\n\n dialog.addEventListener(\"click\", handleDialogClick, { signal: controller.signal });\n dialog.addEventListener(\"submit\", handleDialogSubmit, { signal: controller.signal });\n dialog.addEventListener(\"cancel\", handleDialogCancel, { signal: controller.signal });\n dialog.addEventListener(\"close\", handleDialogClose, { signal: controller.signal });\n\n // Let modern browsers know the intended native close policy. Backdrop click\n // is still handled above so animation remains consistent across browsers.\n if (\"closedBy\" in dialog) {\n // Keep native Esc/back close requests, but handle backdrop clicks ourselves\n // so animated light dismiss behaves consistently across browsers.\n dialog.closedBy = \"closerequest\";\n }\n\n dialogMap.set(dialog, state);\n wiredDialogs.add(dialog);\n syncModalOpenClass(dialog.ownerDocument);\n return state;\n}\n\nfunction connectDialog(dialog) {\n ensureDialogWired(dialog);\n}\n\nfunction disconnectDialog(dialog) {\n const state = dialogMap.get(dialog);\n if (!state) return;\n\n if (state.staticTimer) {\n window.clearTimeout(state.staticTimer);\n }\n\n state.controller.abort();\n dialog.classList.remove(CLASSES.static);\n state.modalOpen = false;\n dialogMap.delete(dialog);\n wiredDialogs.delete(dialog);\n syncModalOpenClass(dialog.ownerDocument);\n}\n\nregisterCommands(DIALOG_COMMANDS, {\n resolve: (trigger) => {\n const dialog = targetFor(trigger);\n return isDialogElement(dialog) ? dialog : null;\n },\n prepare: (trigger, dialog, command) => {\n if (isDialog(dialog)) {\n ensureDialogWired(dialog);\n }\n\n trigger.setAttribute(\"aria-controls\", dialog.id);\n\n if (\n !trigger.hasAttribute(\"aria-haspopup\") &&\n (command === \"show-modal\" || command === \"show\")\n ) {\n trigger.setAttribute(\"aria-haspopup\", \"dialog\");\n }\n },\n handle: (event, trigger, dialog, command) => {\n event.preventDefault();\n\n if (!isDialog(dialog)) {\n if (command === \"show-modal\" || command === \"show\") {\n notifyUnsupportedDialog(trigger);\n }\n return;\n }\n\n if (command === \"show-modal\" || command === \"show\") {\n openDialogWithViewTransition(dialog, trigger, command === \"show-modal\");\n return;\n }\n\n if (command === \"request-close\") {\n requestDialogClose(dialog, trigger.value || \"\");\n return;\n }\n\n if (command === \"close\") {\n closeDialog(dialog, trigger.value || \"\");\n }\n },\n});\n\nif (supportsDialog()) {\n enhance({\n [DIALOG_SELECTOR]: (dialog) => {\n connectDialog(dialog);\n return () => disconnectDialog(dialog);\n },\n });\n}\n",
|
|
17
|
+
"/*\n * Dialog fallback — minimal per-element shim for browsers without native\n * <dialog> support (Safari <= 15.3, Firefox <= 97, both below Baseline 2023).\n *\n * Standalone side-effect module: the default runtime imports it, a custom\n * build opts out by omitting it — dialog.js has no dependency on this file\n * and falls back to its acknowledgement alert without it. On supporting\n * browsers importing this module registers nothing.\n *\n * Not a polyfill: no top layer, no focus trap, no inert background. It only\n * provides show()/showModal()/close(), an `open` property, and the\n * form[method=dialog] close-on-submit contract (otherwise those forms really\n * navigate on legacy browsers), so dialog.js can run its normal wiring —\n * backdrop click, Escape cancel, close events, focus restore, and the scroll\n * lock all come from that wiring, not from here.\n *\n * Presentation lives in dialog-fallback.css, keyed on the classes written\n * below. The simulated backdrop is split in two there: a spread box-shadow\n * for the dimming, and a transparent ::before covering the viewport for\n * hit-testing — clicks on it target the dialog element outside its own box,\n * which dialog.js already treats as a backdrop click, and it blocks pointer\n * interaction with the page behind the modal.\n *\n * An adopter-provided polyfill (e.g. dialog-polyfill) still wins: elements it\n * already patched expose showModal() and are left untouched.\n */\n\nimport { targetFor } from \"./command.js\";\nimport enhance from \"./enhance.js\";\nimport { CLASSES } from \"./selectors.js\";\n\nfunction supportsDialog() {\n return (\n typeof HTMLDialogElement !== \"undefined\" &&\n typeof HTMLDialogElement.prototype.showModal === \"function\"\n );\n}\n\nfunction focusInitial(dialog) {\n const target = dialog.querySelector(\"[autofocus]\") || dialog;\n if (target === dialog && !dialog.hasAttribute(\"tabindex\")) {\n dialog.setAttribute(\"tabindex\", \"-1\");\n }\n target.focus?.();\n}\n\n/**\n * Patch one dialog element with rudimentary show/showModal/close support.\n * No-op when the element is already controllable (native or polyfilled).\n *\n * @param {HTMLElement} dialog A <dialog> element.\n */\nexport default function shimDialog(dialog) {\n if (\n typeof dialog.show === \"function\" &&\n typeof dialog.showModal === \"function\" &&\n typeof dialog.close === \"function\"\n ) {\n return;\n }\n\n const doc = dialog.ownerDocument;\n let escController = null;\n let savedScroll = null;\n\n function stopEscapeListener() {\n escController?.abort();\n escController = null;\n }\n\n function handleSubmit(event) {\n const form = event.target;\n // Read the attribute: on these browsers \"dialog\" is an invalid method\n // value, so the reflected form.method property reports \"get\" and the\n // form would otherwise really submit and navigate away.\n if (form?.getAttribute?.(\"method\")?.toLowerCase() !== \"dialog\") return;\n event.preventDefault();\n const submitter =\n event.submitter || (doc.activeElement?.form === form ? doc.activeElement : null);\n dialog.close(submitter?.value || \"\");\n }\n\n function handleEscape(event) {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n const cancel = new Event(\"cancel\", { cancelable: true });\n // dialog.js always claims the cancel event and decides itself whether to\n // close; only an unwired dialog falls through to the direct close.\n if (dialog.dispatchEvent(cancel)) {\n dialog.close();\n }\n }\n\n function open(modal) {\n if (dialog.open) return;\n // Old WebKit clamps the scroll position to 0 when the root element gains\n // overflow:hidden (the has-modal-open lock applied right after this),\n // losing the user's place. Remember it and put it back after close.\n const win = doc.defaultView;\n savedScroll = modal && win ? { x: win.scrollX, y: win.scrollY } : null;\n dialog.setAttribute(\"open\", \"\");\n dialog.classList.toggle(CLASSES.fallbackModal, modal);\n if (modal) {\n escController = new AbortController();\n doc.addEventListener(\"keydown\", handleEscape, { signal: escController.signal });\n }\n focusInitial(dialog);\n }\n\n Object.defineProperty(dialog, \"open\", {\n configurable: true,\n get() {\n return this.hasAttribute(\"open\");\n },\n set(value) {\n this.toggleAttribute(\"open\", Boolean(value));\n },\n });\n\n dialog.returnValue = \"\";\n dialog.classList.add(CLASSES.dialogFallback);\n dialog.addEventListener(\"submit\", handleSubmit);\n dialog.show = () => open(false);\n dialog.showModal = () => open(true);\n dialog.close = (returnValue = \"\") => {\n if (!dialog.open) return;\n stopEscapeListener();\n dialog.returnValue = returnValue;\n dialog.removeAttribute(\"open\");\n dialog.classList.remove(CLASSES.fallbackModal);\n dialog.dispatchEvent(new Event(\"close\"));\n // After the close event: dialog.js has lifted the scroll lock and moved\n // focus back to the trigger, so the restored position sticks.\n if (savedScroll) {\n doc.defaultView?.scrollTo?.(savedScroll.x, savedScroll.y);\n savedScroll = null;\n }\n };\n}\n\nif (typeof document !== \"undefined\" && !supportsDialog()) {\n enhance({\n dialog: (el) => {\n shimDialog(el);\n },\n });\n\n // A dialog inserted right before its trigger's click may not be scanned by\n // enhance() yet, so shim command targets in capture phase too — before the\n // delegated command routing resolves them.\n document.addEventListener(\n \"click\",\n (event) => {\n const trigger = event.target?.closest?.(\"button[commandfor][command]\");\n if (!trigger) return;\n const dialog = targetFor(trigger);\n if (dialog?.localName === \"dialog\") {\n shimDialog(dialog);\n }\n },\n true,\n );\n}\n",
|
|
18
|
+
"/*\n * Tabs — in-place panel switcher using real tab semantics.\n *\n * Tab list: .tabs[role=\"tablist\"]\n * Tab: [role=\"tab\"] with aria-selected, aria-controls, id, tabindex\n * Panel: [role=\"tabpanel\"] with id matching aria-controls\n *\n * Keyboard: ArrowLeft/Right, Home/End (select tab, wrapping)\n * ArrowUp/Down for aria-orientation=\"vertical\"\n * ArrowDown (focus selected panel)\n *\n * Self-registers via enhance: injected tablists wire automatically.\n * The tab→panel map is rebuilt from the live tablist on each interaction,\n * so tabs added after connect are picked up with no extra work.\n * Cleanup is the AbortController.abort() returned to enhance.\n */\n\nimport enhance from \"./enhance.js\";\nimport { firstItem, lastItem, nextItem } from \"./keys.js\";\nimport { CLASSES } from \"./selectors.js\";\n\nconst TABLIST_SELECTOR = `.${CLASSES.tabs}[role=\"tablist\"]`;\n\nfunction tabsOf(list) {\n return [...list.querySelectorAll('[role=\"tab\"]')];\n}\n\nfunction panelsOf(tabs) {\n const panels = new Map();\n for (const tab of tabs) {\n const panel = panelFor(tab);\n if (panel) panels.set(tab, panel);\n }\n return panels;\n}\n\nfunction panelFor(tab) {\n const panelId = tab.getAttribute(\"aria-controls\");\n return panelId ? document.getElementById(panelId) : null;\n}\n\nfunction isTabDisabled(tab) {\n return tab.disabled || tab.getAttribute(\"aria-disabled\") === \"true\";\n}\n\nfunction activatableTabs(list) {\n return tabsOf(list).filter((tab) => !isTabDisabled(tab) && panelFor(tab));\n}\n\nfunction makePanelFocusable(panel) {\n if (!panel.hasAttribute(\"tabindex\")) {\n panel.tabIndex = -1;\n }\n}\n\nfunction activate(tab) {\n if (!tab || isTabDisabled(tab) || !panelFor(tab)) return;\n const list = tab.closest(TABLIST_SELECTOR);\n if (!list) return;\n const tabs = tabsOf(list);\n const panels = panelsOf(tabs);\n\n for (const t of tabs) {\n t.setAttribute(\"aria-selected\", \"false\");\n t.tabIndex = -1;\n }\n for (const [, panel] of panels) {\n panel.hidden = true;\n }\n tab.setAttribute(\"aria-selected\", \"true\");\n tab.tabIndex = 0;\n const panel = panels.get(tab);\n if (panel) {\n makePanelFocusable(panel);\n panel.hidden = false;\n }\n}\n\nfunction activateAndFocus(tab) {\n if (!tab) return;\n activate(tab);\n tab.focus();\n}\n\nfunction initialize(list) {\n const tabs = activatableTabs(list);\n if (!tabs.length) return;\n const selected = tabs.find((tab) => tab.getAttribute(\"aria-selected\") === \"true\") || tabs[0];\n activate(selected);\n}\n\nfunction onKeydown(e) {\n const tab = e.target.closest('[role=\"tab\"]');\n if (!tab) return;\n const list = tab.closest(TABLIST_SELECTOR);\n if (!list) return;\n\n const tabs = activatableTabs(list);\n if (!tabs.length || !tabs.includes(tab)) return;\n const isVertical = list.getAttribute(\"aria-orientation\") === \"vertical\";\n let next;\n\n switch (e.key) {\n case \"ArrowRight\":\n if (isVertical) break;\n e.preventDefault();\n next = nextItem(tabs, tab, 1, { wrap: true });\n if (next) activateAndFocus(next);\n break;\n case \"ArrowLeft\":\n if (isVertical) break;\n e.preventDefault();\n next = nextItem(tabs, tab, -1, { wrap: true });\n if (next) activateAndFocus(next);\n break;\n case \"ArrowDown\":\n if (!isVertical) {\n e.preventDefault();\n const panel = panelFor(tab);\n if (panel) {\n makePanelFocusable(panel);\n panel.focus();\n }\n break;\n }\n e.preventDefault();\n next = nextItem(tabs, tab, 1, { wrap: true });\n if (next) activateAndFocus(next);\n break;\n case \"ArrowUp\":\n if (!isVertical) break;\n e.preventDefault();\n next = nextItem(tabs, tab, -1, { wrap: true });\n if (next) activateAndFocus(next);\n break;\n case \"Home\":\n e.preventDefault();\n activateAndFocus(firstItem(tabs));\n break;\n case \"End\":\n e.preventDefault();\n activateAndFocus(lastItem(tabs));\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n activate(tab);\n break;\n }\n}\n\nfunction onClick(e) {\n const tab = e.target.closest('[role=\"tab\"]');\n if (!tab) return;\n if (isTabDisabled(tab)) {\n e.preventDefault();\n return;\n }\n e.preventDefault();\n if (tab.getAttribute(\"aria-selected\") === \"true\") return;\n activate(tab);\n tab.focus();\n}\n\nenhance({\n [TABLIST_SELECTOR]: (list) => {\n const controller = new AbortController();\n initialize(list);\n list.addEventListener(\"click\", onClick, { signal: controller.signal });\n list.addEventListener(\"keydown\", onKeydown, { signal: controller.signal });\n return () => controller.abort();\n },\n});\n",
|
|
19
|
+
"/*\n * Tooltip — supplemental label shown on hover and focus.\n *\n * Shorthand: <button data-tooltip=\"Help text\" data-tooltip-placement=\"right\">\n * Explicit: <button data-tooltip aria-describedby=\"tooltip-id\">\n * <div role=\"tooltip\" id=\"tooltip-id\" hidden>Help <strong>text</strong></div>\n * Options: data-tooltip-click toggles on click instead of hover/focus.\n * data-tooltip-visible keeps the tooltip visible.\n *\n * Discovery: [data-tooltip] only. An empty data-tooltip marks an explicit\n * tooltip that points at an aria-describedby target; a non-empty\n * data-tooltip generates the tooltip element lazily.\n * Plain aria-describedby (form help, error text) is never\n * treated as a tooltip trigger.\n *\n * Sharing: an explicit tooltip may be referenced by several triggers. The\n * tooltip element is wired once (floating listeners + tracking);\n * each trigger only registers itself and the wiring is torn down\n * when the last trigger leaves the DOM.\n *\n * Lazy: tooltip elements are created (shorthand) or wired (explicit) on\n * first mouseover / focusin. No page-load scan, no DOM overhead\n * for tooltips that are never triggered. AJAX-loaded triggers\n * work automatically via bubbling delegated listeners.\n *\n * Show: hover + focus (150ms delay), click toggle, or always visible\n * Hide: blur, pointer leave, Escape\n */\n\nimport enhance from \"./enhance.js\";\nimport { EVENTS } from \"./events.js\";\nimport { reposition, track } from \"./floating.js\";\nimport { CLASSES } from \"./selectors.js\";\n\nconst SHOW_DELAY_MS = 150;\nconst HIDE_DELAY_MS = 100;\n\n/**\n * @typedef {object} TooltipState\n * @property {Set<Element>} refs Triggers that currently reference this tip.\n * @property {Element | null} activeRef Trigger that last showed this tip.\n * @property {AbortController} controller Tip-level event listener cleanup.\n * @property {() => void} untrack Floating-position cleanup.\n * @property {boolean} generated True when the tip was created from data-tooltip text.\n * @property {{ parent: Node, next: ChildNode | null } | null} mount Original DOM position for explicit tips moved into a dialog/body root.\n * @property {ReturnType<typeof setTimeout> | null} timer Pending delayed show.\n * @property {ReturnType<typeof setTimeout> | null} hideTimer Pending delayed hide.\n * @property {boolean} overRef Pointer is over the active trigger.\n * @property {boolean} overTip Pointer is over the tooltip.\n */\n\nlet uid = 0;\nconst triggerStates = new WeakMap(); // trigger -> { tip, cleanup }\n/** @type {WeakMap<Element, TooltipState>} */\nconst tipStates = new WeakMap(); // tip -> { refs, activeRef, controller, untrack, generated, mount, timer }\n\nfunction mountTip(tip, trigger) {\n const root = trigger.closest(\"dialog\") || trigger.ownerDocument.body;\n const parent = tip.parentNode;\n if (!root || !parent || parent === root) return null;\n\n const mount = { parent, next: tip.nextSibling };\n root.append(tip);\n return mount;\n}\n\nfunction restoreTip(tip, state) {\n const mount = state.mount;\n if (!mount) return;\n\n if (mount.parent.isConnected) {\n const next = mount.next?.parentNode === mount.parent ? mount.next : null;\n mount.parent.insertBefore(tip, next);\n } else {\n tip.remove();\n }\n}\n\nfunction placementFor(ref) {\n return ref?.getAttribute(\"data-tooltip-placement\") || \"top\";\n}\n\nfunction hasOption(trigger, name) {\n const value = trigger?.getAttribute(name);\n return value !== null && value.toLowerCase() !== \"false\";\n}\n\nfunction isClickTrigger(trigger) {\n return hasOption(trigger, \"data-tooltip-click\");\n}\n\nfunction isAlwaysVisible(trigger) {\n return hasOption(trigger, \"data-tooltip-visible\");\n}\n\nfunction describedByIds(trigger) {\n return (trigger.getAttribute(\"aria-describedby\") || \"\").split(/\\s+/).filter(Boolean);\n}\n\nfunction addDescription(trigger, id) {\n const ids = describedByIds(trigger);\n if (ids.includes(id)) return false;\n trigger.setAttribute(\"aria-describedby\", [...ids, id].join(\" \"));\n return true;\n}\n\nfunction removeDescription(trigger, id) {\n const ids = describedByIds(trigger).filter((candidate) => candidate !== id);\n if (ids.length) {\n trigger.setAttribute(\"aria-describedby\", ids.join(\" \"));\n } else {\n trigger.removeAttribute(\"aria-describedby\");\n }\n}\n\nfunction explicitTipFor(trigger) {\n const doc = trigger.ownerDocument;\n for (const id of describedByIds(trigger)) {\n const candidate = doc.getElementById(id);\n if (candidate?.getAttribute(\"role\") === \"tooltip\") return candidate;\n }\n return null;\n}\n\nfunction nextTooltipId(doc) {\n let id;\n do {\n uid++;\n id = `tooltip-${uid}`;\n } while (doc.getElementById(id));\n return id;\n}\n\nfunction repositionTip(ref, tip) {\n reposition(ref, tip, {\n placement: placementFor(ref),\n distance: 6,\n flip: true,\n shift: true,\n });\n}\n\nfunction hideTip(tip, force = false) {\n const state = tipStates.get(tip);\n if (!force && isAlwaysVisible(state?.activeRef)) return;\n if (state?.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n if (state?.hideTimer) {\n clearTimeout(state.hideTimer);\n state.hideTimer = null;\n }\n tip.hidden = true;\n}\n\nfunction clearHide(tip) {\n const state = tipStates.get(tip);\n if (!state?.hideTimer) return;\n clearTimeout(state.hideTimer);\n state.hideTimer = null;\n}\n\nfunction scheduleHide(tip) {\n const state = tipStates.get(tip);\n if (!state) return;\n if (isClickTrigger(state.activeRef) || isAlwaysVisible(state.activeRef)) return;\n if (state.overRef || state.overTip) return;\n if (state.hideTimer) clearTimeout(state.hideTimer);\n state.hideTimer = setTimeout(() => {\n state.hideTimer = null;\n if (!state.overRef && !state.overTip) hideTip(tip);\n }, HIDE_DELAY_MS);\n}\n\n// Tip-level wiring happens once per tooltip element, even when an explicit\n// tooltip is shared by several triggers. activeRef is the trigger that last\n// showed the tip, so reposition follows the right reference.\nfunction wireTip(tip, options = {}) {\n let state = tipStates.get(tip);\n if (state) return state;\n\n const controller = new AbortController();\n state = {\n refs: new Set(),\n activeRef: null,\n controller,\n untrack: track(tip),\n generated: options.generated === true,\n mount: options.mount || null,\n timer: null,\n hideTimer: null,\n overRef: false,\n overTip: false,\n };\n\n const onHide = () => hideTip(tip);\n const onOutOfView = () => hideTip(tip, true);\n const onReposition = () => {\n if (isAlwaysVisible(state.activeRef)) tip.hidden = false;\n if (!tip.hidden && state.activeRef) repositionTip(state.activeRef, tip);\n };\n\n tip.addEventListener(EVENTS.reposition, onReposition, { signal: controller.signal });\n tip.addEventListener(EVENTS.hide, onHide, { signal: controller.signal });\n tip.addEventListener(EVENTS.outOfView, onOutOfView, { signal: controller.signal });\n tip.addEventListener(\n \"mouseenter\",\n () => {\n state.overTip = true;\n clearHide(tip);\n },\n { signal: controller.signal },\n );\n tip.addEventListener(\n \"mouseleave\",\n () => {\n state.overTip = false;\n scheduleHide(tip);\n },\n { signal: controller.signal },\n );\n\n tipStates.set(tip, state);\n return state;\n}\n\nfunction ensureTip(trigger) {\n const existing = triggerStates.get(trigger);\n if (existing) return existing.tip;\n\n let tip;\n let generated = false;\n let mount = null;\n let descriptionAdded = false;\n const text = trigger.getAttribute(\"data-tooltip\");\n const doc = trigger.ownerDocument;\n\n // shorthand: data-tooltip=\"text\" → create element lazily\n if (text) {\n tip = doc.createElement(\"div\");\n tip.className = CLASSES.tooltip;\n tip.role = \"tooltip\";\n tip.id = nextTooltipId(doc);\n tip.textContent = text;\n tip.hidden = true;\n tip.style.position = \"fixed\";\n generated = true;\n\n const parent = trigger.closest(\"dialog\") || doc.body;\n parent.appendChild(tip);\n descriptionAdded = addDescription(trigger, tip.id);\n }\n\n // explicit: data-tooltip (empty) + aria-describedby → find existing element\n if (!tip) {\n tip = explicitTipFor(trigger);\n if (!tip) return null;\n tip.hidden = true;\n tip.style.position = \"fixed\";\n\n if (!tipStates.has(tip)) {\n mount = mountTip(tip, trigger);\n }\n }\n\n const state = wireTip(tip, { generated, mount });\n state.refs.add(trigger);\n\n const triggerController = new AbortController();\n const onLeave = () => {\n state.overRef = false;\n scheduleHide(tip);\n };\n trigger.addEventListener(\"mouseleave\", onLeave, { signal: triggerController.signal });\n trigger.addEventListener(\"blur\", onLeave, { signal: triggerController.signal });\n\n const cleanup = () => {\n triggerController.abort();\n triggerStates.delete(trigger);\n if (descriptionAdded) removeDescription(trigger, tip.id);\n\n state.refs.delete(trigger);\n if (state.activeRef === trigger) {\n hideTip(tip, true);\n state.activeRef = null;\n }\n // Other triggers still share this tooltip: keep the tip wiring alive.\n if (state.refs.size > 0) return;\n\n hideTip(tip, true);\n state.controller.abort();\n state.untrack();\n tipStates.delete(tip);\n if (state.generated) tip.remove();\n else restoreTip(tip, state);\n };\n\n triggerStates.set(trigger, { tip, cleanup });\n return tip;\n}\n\nfunction cleanupTrigger(trigger) {\n if (trigger.isConnected) return;\n triggerStates.get(trigger)?.cleanup?.();\n}\n\nfunction show(tip, ref, immediate = false) {\n const state = tipStates.get(tip);\n if (!state) return;\n\n state.activeRef = ref;\n state.overRef = true;\n clearHide(tip);\n if (state.timer) clearTimeout(state.timer);\n const reveal = () => {\n state.timer = null;\n tip.hidden = false;\n repositionTip(ref, tip);\n };\n\n if (immediate) reveal();\n else state.timer = setTimeout(reveal, SHOW_DELAY_MS);\n}\n\n// ── Delegated discovery (mouseover + focusin bubble) ───\n\nconst SEL = \"[data-tooltip]\";\n\nfunction handleTriggerIntent(e) {\n const trigger = e.target.closest?.(SEL);\n if (!trigger) return;\n if (isClickTrigger(trigger) || isAlwaysVisible(trigger)) return;\n if (\n e.type === \"mouseover\" &&\n e.relatedTarget instanceof Node &&\n trigger.contains(e.relatedTarget)\n )\n return;\n\n const tip = ensureTip(trigger);\n if (tip) show(tip, trigger);\n}\n\nfunction handleTriggerClick(e) {\n const trigger = e.target.closest?.(SEL);\n if (!trigger || !isClickTrigger(trigger) || isAlwaysVisible(trigger)) return;\n\n const tip = ensureTip(trigger);\n if (!tip) return;\n\n e.preventDefault();\n if (tip.hidden) show(tip, trigger, true);\n else hideTip(tip, true);\n}\n\n// Delegated discovery listeners run at import time; keep SSR imports inert.\nif (typeof document !== \"undefined\") {\n document.addEventListener(\"mouseover\", handleTriggerIntent);\n document.addEventListener(\"focusin\", handleTriggerIntent);\n document.addEventListener(\"click\", handleTriggerClick);\n\n enhance({\n [SEL]: (trigger) => {\n // Ordinary and click-triggered tooltips stay lazy. The always-visible\n // option necessarily opts into eager creation/wiring.\n if (isAlwaysVisible(trigger)) {\n const tip = ensureTip(trigger);\n if (tip) show(tip, trigger, true);\n }\n return () => cleanupTrigger(trigger);\n },\n });\n}\n",
|
|
20
|
+
"/*\n * Scrollspy — navigation that highlights the active section on scroll.\n *\n * Nav: .scrollspy containing <a href=\"#section-id\"> links\n * Target: elements referenced by the href fragments\n *\n * Uses IntersectionObserver. Falls back gracefully: links still work\n * even if IntersectionObserver isn't available.\n *\n * Optional root: data-scrollspy-root=\"#scroll-container\" observes section\n * visibility within a scroll container instead of the viewport.\n *\n * Self-registers via enhance: injected .scrollspy navs wire automatically.\n * Cleanup disconnects the IntersectionObserver and the small MutationObserver\n * that refreshes the link→section map as nav links or sections are injected.\n */\n\nimport enhance from \"./enhance.js\";\nimport { CLASSES } from \"./selectors.js\";\n\nfunction rootFor(nav) {\n const selector = nav.getAttribute(\"data-scrollspy-root\");\n if (!selector) return null;\n\n try {\n return nav.ownerDocument.querySelector(selector);\n } catch {\n return null;\n }\n}\n\nfunction sectionsFor(nav) {\n const links = [...nav.querySelectorAll(\"a[href^='#']\")];\n const sections = [];\n\n for (const link of links) {\n const id = link.getAttribute(\"href\").slice(1);\n const section = id ? nav.ownerDocument.getElementById(id) : null;\n if (section) sections.push({ link, section });\n }\n\n return sections;\n}\n\nconst navState = new WeakMap();\n\nexport function refreshScrollspy(nav) {\n navState.get(nav)?.rebuild();\n}\n\nfunction setupNav(nav) {\n if (typeof IntersectionObserver === \"undefined\") return;\n let io = null;\n let sections = [];\n const activeEntries = new Map();\n let scheduled = false;\n\n function rebuild() {\n scheduled = false;\n io?.disconnect();\n sections = sectionsFor(nav);\n activeEntries.clear();\n if (!sections.length) return;\n\n io = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n activeEntries.set(entry.target, entry);\n } else {\n activeEntries.delete(entry.target);\n }\n }\n\n const visible = [...activeEntries.values()].sort(\n (a, b) => a.boundingClientRect.top - b.boundingClientRect.top,\n );\n\n const id = visible[0]?.target.id;\n for (const { link } of sections) {\n if (id && link.getAttribute(\"href\") === `#${id}`) {\n link.setAttribute(\"aria-current\", \"location\");\n } else {\n link.removeAttribute(\"aria-current\");\n }\n }\n },\n {\n root: rootFor(nav),\n rootMargin: \"-20% 0px -70% 0px\",\n threshold: 0,\n },\n );\n\n for (const { section } of sections) {\n io.observe(section);\n }\n }\n\n function scheduleRebuild() {\n if (scheduled) return;\n scheduled = true;\n queueMicrotask(rebuild);\n }\n\n const mo = new MutationObserver(scheduleRebuild);\n mo.observe(nav, { childList: true, subtree: true });\n navState.set(nav, { rebuild: scheduleRebuild });\n\n rebuild();\n\n return () => {\n io?.disconnect();\n mo.disconnect();\n navState.delete(nav);\n };\n}\n\nenhance({\n [`.${CLASSES.scrollspy}`]: setupNav,\n});\n",
|
|
21
|
+
"/*\n * Input helpers shared by text-entry enhancers.\n */\n\nexport function selectionStart(el) {\n return typeof el.selectionStart === \"number\" ? el.selectionStart : el.value.length;\n}\n\nexport function setCaret(el, position) {\n if (document.activeElement !== el) return;\n if (typeof el.setSelectionRange !== \"function\") return;\n try {\n el.setSelectionRange(position, position);\n } catch {\n // Some input types do not support text selection.\n }\n}\n\nexport function dispatchInput(el) {\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n}\n\nexport function onTextInput(el, handler, signal) {\n let composing = false;\n\n function run(event) {\n if (composing || event.isComposing) return;\n handler(event);\n }\n\n el.addEventListener(\n \"compositionstart\",\n () => {\n composing = true;\n },\n { signal },\n );\n el.addEventListener(\n \"compositionend\",\n (event) => {\n composing = false;\n run(event);\n },\n { signal },\n );\n el.addEventListener(\"input\", run, { signal });\n}\n",
|
|
22
|
+
"/*\n * Input filter — opt-in filtering for simple text policies.\n *\n * inputmode only hints the virtual keyboard; it never filters input on its\n * own. data-filter is the explicit, separate contract for rewriting the\n * value as the user types — data-filter=\"numeric\" / \"decimal\" is\n * intentionally destructive, unlike inputmode.\n */\n\nimport enhance from \"./enhance.js\";\nimport { dispatchInput, onTextInput, selectionStart, setCaret } from \"./input.js\";\n\nconst SELECTOR = \"input[data-filter]\";\nconst FILTERS = new Map([\n [\"numeric\", filterNumeric],\n [\"decimal\", filterDecimal],\n [\"lower\", filterLower],\n [\"upper\", filterUpper],\n [\"letters\", filterLetters],\n [\"slug\", filterSlug],\n]);\n\nfunction filterNumeric(value) {\n return value.replace(/\\D/gu, \"\");\n}\n\nfunction filterDecimal(value) {\n const normalized = value.replace(/,/g, \".\");\n let out = \"\";\n let hasDot = false;\n\n for (const char of normalized) {\n if (/^\\d$/u.test(char)) {\n out += char;\n } else if (char === \".\" && !hasDot) {\n out += \".\";\n hasDot = true;\n }\n }\n\n return out;\n}\n\nfunction filterLower(value) {\n return value.toLocaleLowerCase();\n}\n\nfunction filterUpper(value) {\n return value.toLocaleUpperCase();\n}\n\nfunction filterLetters(value) {\n return value.replace(/[^\\p{L}]/gu, \"\");\n}\n\nfunction normalizeText(value) {\n return value.normalize(\"NFKD\").replace(/\\p{M}/gu, \"\");\n}\n\nfunction filterSlug(value, event) {\n const keepTrailingSeparator = event?.inputType === \"insertText\" && /[^\\p{L}\\p{N}]$/u.test(value);\n const slug = normalizeText(value)\n .toLocaleLowerCase()\n .replace(/[^\\p{L}\\p{N}]+/gu, \"-\")\n .replace(/-{2,}/g, \"-\")\n .replace(/^-+/g, \"\");\n\n return keepTrailingSeparator ? slug : slug.replace(/-+$/g, \"\");\n}\n\nfunction filterValue(value, modes, event) {\n return modes.reduce((next, mode) => FILTERS.get(mode)(next, event), value);\n}\n\nfunction explicitFilterModes(value) {\n return value\n .split(\"|\")\n .map((mode) => mode.trim().toLowerCase())\n .filter((mode) => FILTERS.has(mode));\n}\n\nfunction filterModes(el) {\n const explicit = el.getAttribute(\"data-filter\")?.trim().toLowerCase();\n return explicit ? explicitFilterModes(explicit) : [];\n}\n\nfunction connectFilter(el) {\n const modes = filterModes(el);\n if (!modes.length) return;\n\n const controller = new AbortController();\n let filtering = false;\n\n onTextInput(\n el,\n (event) => {\n if (filtering) return;\n\n const caret = selectionStart(el);\n const previous = el.value;\n const next = filterValue(previous, modes, event);\n\n if (next === previous) return;\n\n el.value = next;\n setCaret(el, filterValue(previous.slice(0, caret), modes, event).length);\n try {\n filtering = true;\n dispatchInput(el);\n } finally {\n filtering = false;\n }\n },\n controller.signal,\n );\n\n return () => controller.abort();\n}\n\nenhance({\n [SELECTOR]: connectFilter,\n});\n",
|
|
23
|
+
"/*\n * Mask — token-based input masks for fixed-shape values.\n *\n * data-mask=\"999-aaa\" applies a token mask.\n */\n\nimport enhance from \"./enhance.js\";\nimport { dispatchInput, onTextInput, selectionStart, setCaret } from \"./input.js\";\n\nconst SELECTOR = \"input[data-mask]\";\nconst TOKEN_TESTS = {\n 9: (char) => /^\\d$/u.test(char),\n a: (char) => /^\\p{L}$/u.test(char),\n \"*\": () => true,\n};\n\nfunction isToken(char) {\n return Object.hasOwn(TOKEN_TESTS, char);\n}\n\nfunction parseMaskValue(value, mask) {\n const pattern = [...mask];\n const raw = [];\n const positions = [];\n let maskIndex = 0;\n let valueIndex = 0;\n\n valueLoop: for (const char of value) {\n valueIndex += char.length;\n\n while (maskIndex < pattern.length) {\n const part = pattern[maskIndex];\n\n if (!isToken(part)) {\n maskIndex++;\n if (char === part) continue valueLoop;\n continue;\n }\n\n if (TOKEN_TESTS[part](char)) {\n raw.push(char);\n positions.push(valueIndex);\n maskIndex++;\n }\n continue valueLoop;\n }\n\n break;\n }\n\n return { positions, raw };\n}\n\nfunction rawMaskChars(value, mask) {\n return parseMaskValue(value, mask).raw;\n}\n\nfunction appendFollowingLiterals(mask, start) {\n let out = \"\";\n for (let i = start; i < mask.length && !isToken(mask[i]); i++) {\n out += mask[i];\n }\n return out;\n}\n\nfunction formatRaw(raw, mask, inputType = \"\") {\n const autoLiteral = inputType.startsWith(\"insert\");\n let rawIndex = 0;\n let out = \"\";\n\n for (let i = 0; i < mask.length; i++) {\n const token = mask[i];\n\n if (!isToken(token)) {\n if (rawIndex < raw.length) out += token;\n continue;\n }\n\n let matched = false;\n while (rawIndex < raw.length) {\n const char = raw[rawIndex];\n rawIndex++;\n if (!TOKEN_TESTS[token](char)) continue;\n out += char;\n matched = true;\n break;\n }\n\n if (!matched) break;\n\n if (autoLiteral && rawIndex >= raw.length) {\n out += appendFollowingLiterals(mask, i + 1);\n break;\n }\n }\n\n return out;\n}\n\nfunction applyMask(value, mask, inputType = \"\") {\n if (!mask) return value;\n return formatRaw(rawMaskChars(value, mask), mask, inputType);\n}\n\nfunction caretForMask(value, mask, rawCount) {\n if (rawCount <= 0) return 0;\n\n const position = parseMaskValue(value, mask).positions[rawCount - 1];\n if (position == null) return value.length;\n\n const pattern = [...mask];\n let tokenCount = 0;\n let patternIndex = 0;\n for (; patternIndex < pattern.length; patternIndex++) {\n if (!isToken(pattern[patternIndex])) continue;\n tokenCount++;\n if (tokenCount === rawCount) break;\n }\n\n let caret = position;\n for (patternIndex++; patternIndex < pattern.length; patternIndex++) {\n const literal = pattern[patternIndex];\n if (isToken(literal) || !value.startsWith(literal, caret)) break;\n caret += literal.length;\n }\n return caret;\n}\n\nfunction connectMask(el) {\n const mask = el.dataset.mask || \"\";\n if (!mask) return;\n const controller = new AbortController();\n let masking = false;\n // Last value this handler produced/saw. Distinguishes \"backspaced only a\n // literal\" (delete the raw character before it) from a selection deletion\n // that removed raw characters (just reformat, literals may come back).\n let lastValue = el.value;\n\n onTextInput(\n el,\n (event) => {\n if (masking) return;\n\n const inputType = event.inputType || \"\";\n const caret = selectionStart(el);\n let rawBeforeCaret = rawMaskChars(el.value.slice(0, caret), mask).length;\n const previous = el.value;\n let next = applyMask(previous, mask, inputType);\n const onlyLiteralsRemoved =\n rawMaskChars(previous, mask).length === rawMaskChars(lastValue, mask).length;\n\n if (inputType.startsWith(\"delete\") && onlyLiteralsRemoved && next.length > previous.length) {\n const raw = rawMaskChars(previous, mask);\n const deleteIndex =\n inputType === \"deleteContentForward\" ? rawBeforeCaret : rawBeforeCaret - 1;\n\n if (deleteIndex >= 0 && deleteIndex < raw.length) {\n raw.splice(deleteIndex, 1);\n rawBeforeCaret = Math.max(0, deleteIndex);\n next = formatRaw(raw, mask, inputType);\n }\n }\n\n lastValue = next;\n if (next === previous) return;\n\n el.value = next;\n setCaret(el, caretForMask(next, mask, rawBeforeCaret));\n try {\n masking = true;\n dispatchInput(el);\n } finally {\n masking = false;\n }\n },\n controller.signal,\n );\n\n return () => controller.abort();\n}\n\nenhance({\n [SELECTOR]: connectMask,\n});\n",
|
|
24
|
+
"/*\n * Password — show/hide toggle for password inputs.\n *\n * Declarative, through the command invoker pattern:\n *\n * <div class=\"join\">\n * <input class=\"input\" type=\"password\" id=\"pw\" autocomplete=\"current-password\">\n * <button class=\"btn outline\" type=\"button\" commandfor=\"pw\"\n * command=\"--password-toggle\" aria-controls=\"pw\"\n * aria-label=\"Show password\" aria-pressed=\"false\"></button>\n * </div>\n *\n * The module flips the input between type=\"password\" and type=\"text\" and\n * mirrors the state on every linked trigger through aria-pressed (styled by\n * .btn[aria-pressed=\"true\"]). Keep the trigger label stable — aria-pressed\n * already announces the state, so a label that flips to \"Hide\" reads as a\n * double negation to screen readers.\n *\n * A revealed value does not survive navigation: a non-canceled form submit and\n * pagehide (bfcache) both revert the input to type=\"password\", so returning to\n * the page cannot land on a readable password. A canceled submit (validation,\n * ajax) keeps the value revealed — nothing navigated away.\n */\nimport { commandSelector, registerCommands, targetFor } from \"./command.js\";\n\nconst PASSWORD_COMMANDS = [\"--password-toggle\"];\nconst TRIGGER_SELECTOR = commandSelector(PASSWORD_COMMANDS);\n\n// Inputs currently revealed by this module — the only ones ever reverted.\n// This set is intentionally iterable so pagehide also covers closed shadow\n// roots. Entries leave the set as soon as their input is masked again.\nconst revealed = new Set();\nconst submitRoots = new WeakSet();\n\nfunction resolvePasswordInput(trigger) {\n const target = targetFor(trigger);\n const isPassword =\n target?.localName === \"input\" && (target.type === \"password\" || revealed.has(target));\n return isPassword ? target : null;\n}\n\nfunction linkedTriggers(input) {\n if (!input.id) return [];\n return input\n .getRootNode()\n .querySelectorAll(`${TRIGGER_SELECTOR}[commandfor=\"${CSS.escape(input.id)}\"]`);\n}\n\nfunction setRevealed(input, reveal) {\n input.type = reveal ? \"text\" : \"password\";\n if (reveal) {\n revealed.add(input);\n } else {\n revealed.delete(input);\n }\n for (const trigger of linkedTriggers(input)) {\n trigger.setAttribute(\"aria-pressed\", String(reveal));\n }\n}\n\nfunction handleSubmit(event) {\n if (event.defaultPrevented) return;\n for (const element of event.target.elements ?? []) {\n if (revealed.has(element)) setRevealed(element, false);\n }\n}\n\nfunction watchSubmitRoot(input) {\n const root = input.getRootNode();\n if (submitRoots.has(root)) return;\n submitRoots.add(root);\n root.addEventListener(\"submit\", handleSubmit);\n}\n\nregisterCommands(PASSWORD_COMMANDS, {\n resolve: resolvePasswordInput,\n prepare: (trigger, input) => {\n trigger.setAttribute(\"aria-controls\", input.id);\n if (!trigger.hasAttribute(\"aria-pressed\")) {\n trigger.setAttribute(\"aria-pressed\", \"false\");\n }\n },\n handle: (event, _trigger, input) => {\n event.preventDefault();\n const reveal = input.type === \"password\";\n if (reveal) watchSubmitRoot(input);\n setRevealed(input, reveal);\n },\n});\n\nif (typeof document !== \"undefined\") {\n submitRoots.add(document);\n document.addEventListener(\"submit\", handleSubmit);\n\n window.addEventListener(\"pagehide\", () => {\n for (const input of revealed) setRevealed(input, false);\n });\n}\n",
|
|
25
|
+
"/*\n * Validation — optional form validation enhancer.\n *\n * Native HTML constraint validation runs first. This enhancer prevents\n * premature error display, adds invalid state on submit, focuses the first\n * invalid field, and supports a few small custom rules through\n * data-validation-rules. It is a progressive enhancement, not a validation\n * framework: server / AJAX validation lives in app code and feeds results\n * back through FormValidator.setErrors().\n *\n * Opt in with the .needs-validation class. Importing the module registers\n * the behavior; there is no init call.\n *\n * The .needs-validation class is a static, init-time contract: this module\n * does not observe attribute mutations, so toggling the class after connect\n * only takes effect on the next focusout/input event, not immediately. A\n * submit that races that window can still bypass native validation (the\n * managed novalidate attribute is still present). Treat the class as fixed\n * for a form's lifetime rather than something toggled at runtime. Removing\n * the form from the DOM, however, is fully supported: the enhance() sweep\n * runs the cleanup below, which aborts all listeners, removes the managed\n * novalidate attribute, and releases the form's internal state.\n */\n\nimport enhance from \"./enhance.js\";\nimport { EVENTS } from \"./events.js\";\nimport { CLASSES } from \"./selectors.js\";\n\nconst NOVALIDATE = \"novalidate\";\nconst WAS_VALIDATED_CLASS = CLASSES.wasValidated;\nconst NEEDS_VALIDATION_CLASS = CLASSES.needsValidation;\nconst FIELD_CLASS = CLASSES.field;\nconst DANGER_CLASS = CLASSES.danger;\nconst MANAGED_NOVALIDATE_ATTR = \"validationManagedNovalidate\";\nconst connectedForms = new WeakMap();\nconst warnedRules = new WeakMap();\n\nfunction validDateParts(year, month, day) {\n if (month < 1 || month > 12 || day < 1) return false;\n const days = new Date(Date.UTC(year, month, 0)).getUTCDate();\n return day <= days;\n}\n\nfunction isValidDate(value) {\n const v = value.trim();\n const iso = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(v);\n if (iso) {\n return validDateParts(Number(iso[1]), Number(iso[2]), Number(iso[3]));\n }\n\n const local = /^(\\d{1,2})([/.-])(\\d{1,2})\\2(\\d{4})$/.exec(v);\n if (!local) return false;\n\n const first = Number(local[1]);\n const second = Number(local[3]);\n const year = Number(local[4]);\n return validDateParts(year, second, first) || validDateParts(year, first, second);\n}\n\nfunction warnUnknownRuleOnce(el, name) {\n let warned = warnedRules.get(el);\n if (!warned) {\n warned = new Set();\n warnedRules.set(el, warned);\n }\n if (warned.has(name)) return;\n warned.add(name);\n console.warn(`Unknown validation rule \"${name}\" on ${el.name || el.id || \"field\"}`);\n}\n\nconst rules = {\n same(v, el, selector) {\n if (!selector) return false;\n try {\n const target = el.form?.querySelector(selector);\n if (!target) return false;\n return v === target.value;\n } catch {\n return false;\n }\n },\n number(v) {\n return !Number.isNaN(Number(v));\n },\n digits(v) {\n return /^\\d+$/.test(v);\n },\n alnum(v) {\n return /^[a-z0-9]+$/i.test(v);\n },\n date(v) {\n return isValidDate(v);\n },\n};\n\nfunction isFormElement(el) {\n return typeof HTMLFormElement !== \"undefined\" && el instanceof HTMLFormElement;\n}\n\nfunction ignoreField(field) {\n return (\n !field ||\n field.disabled ||\n field.willValidate === false ||\n typeof field.checkValidity !== \"function\" ||\n typeof field.setCustomValidity !== \"function\"\n );\n}\n\nfunction fieldContainer(el) {\n return el.closest?.(`.${FIELD_CLASS}`) || null;\n}\n\n// .field.danger is validation-owned state, added/removed here based on\n// aria-invalid/data-validation-errors on the field's controls. A .danger\n// applied manually by app code for an unrelated reason will be removed the\n// next time this runs.\nfunction syncFieldDangerState(el) {\n const field = fieldContainer(el);\n if (!field) return;\n\n if (field.querySelector('[aria-invalid=\"true\"], [data-validation-errors]')) {\n field.classList.add(DANGER_CLASS);\n } else {\n field.classList.remove(DANGER_CLASS);\n }\n}\n\nfunction checkRules(el) {\n if (el.dataset.validationErrors === \"server\") {\n return false;\n }\n el.setCustomValidity(\"\");\n delete el.dataset.validationErrors;\n\n let valid = el.checkValidity();\n\n const rulesAttr = el.dataset.validationRules;\n if (rulesAttr) {\n const hasValue = el.value.trim().length > 0;\n const failed = [];\n for (const entry of rulesAttr.split(\",\")) {\n if (!hasValue) continue;\n const trimmed = entry.trim();\n if (!trimmed) continue;\n const [name, ...opts] = trimmed.split(/\\s+/);\n const handler = rules[name];\n if (!handler) {\n warnUnknownRuleOnce(el, name);\n failed.push(name);\n continue;\n }\n\n let result = false;\n try {\n result = handler(el.value, el, ...opts);\n } catch (error) {\n console.warn(`Validation rule \"${name}\" failed on ${el.name || el.id || \"field\"}`, error);\n }\n\n if (!result) {\n failed.push(name);\n }\n }\n if (failed.length > 0) {\n valid = false;\n el.setCustomValidity(failed.join(\", \"));\n el.dataset.validationErrors = failed.join(\",\");\n }\n }\n\n return valid;\n}\n\nfunction errorEl(el) {\n const ids = el.getAttribute(\"aria-describedby\");\n if (!ids) return null;\n for (const id of ids.split(/\\s+/)) {\n const node = el.ownerDocument.getElementById(id);\n if (node?.classList.contains(CLASSES.fieldError)) {\n return node;\n }\n }\n return null;\n}\n\nfunction markInvalid(el) {\n el.setAttribute(\"aria-invalid\", \"true\");\n fieldContainer(el)?.classList.add(DANGER_CLASS);\n}\n\nfunction markValid(el) {\n el.removeAttribute(\"aria-invalid\");\n delete el.dataset.validationErrors;\n syncFieldDangerState(el);\n}\n\nfunction hydrateServerErrors(form) {\n for (const el of form.elements) {\n if (ignoreField(el)) continue;\n if (el.getAttribute(\"aria-invalid\") === \"true\" && !el.dataset.validationErrors) {\n el.dataset.validationErrors = \"server\";\n }\n syncFieldDangerState(el);\n }\n}\n\nfunction ensureManagedNoValidate(form) {\n if (!form.classList.contains(NEEDS_VALIDATION_CLASS)) return;\n if (form.hasAttribute(NOVALIDATE)) return;\n\n form.setAttribute(NOVALIDATE, \"\");\n form.dataset[MANAGED_NOVALIDATE_ATTR] = \"\";\n}\n\nfunction releaseManagedNoValidate(form) {\n if (form.dataset[MANAGED_NOVALIDATE_ATTR] === undefined) return;\n form.removeAttribute(NOVALIDATE);\n delete form.dataset[MANAGED_NOVALIDATE_ATTR];\n}\n\nfunction validateField(el, trigger) {\n const form = el.form;\n if (!form?.classList.contains(NEEDS_VALIDATION_CLASS)) return;\n if (ignoreField(el)) return;\n\n if (trigger === \"input\" && el.dataset.validationErrors === \"server\") {\n delete el.dataset.validationErrors;\n el.setCustomValidity(\"\");\n }\n\n const validationTrigger = el.dataset.validationTrigger || \"\";\n const alreadyInvalid = el.getAttribute(\"aria-invalid\") === \"true\" || el.dataset.validationErrors;\n const wantsTrigger =\n trigger === \"blur\" || (validationTrigger.includes(trigger) && el.value.length > 0);\n\n if (!wantsTrigger && !alreadyInvalid) return;\n\n if (checkRules(el)) {\n markValid(el);\n } else {\n markInvalid(el);\n }\n}\n\nfunction connectForm(form) {\n const existing = connectedForms.get(form);\n if (existing) return existing;\n\n const controller = new AbortController();\n\n if (!form.hasAttribute(NOVALIDATE)) {\n form.setAttribute(NOVALIDATE, \"\");\n form.dataset[MANAGED_NOVALIDATE_ATTR] = \"\";\n }\n\n hydrateServerErrors(form);\n\n form.addEventListener(\n \"focusout\",\n (event) => {\n const el = event.target;\n if (el instanceof Element && el.form === form) {\n if (!form.classList.contains(NEEDS_VALIDATION_CLASS)) {\n releaseManagedNoValidate(form);\n return;\n }\n ensureManagedNoValidate(form);\n validateField(el, \"blur\");\n }\n },\n { signal: controller.signal },\n );\n\n form.addEventListener(\n \"input\",\n (event) => {\n const el = event.target;\n if (el instanceof Element && el.form === form) {\n if (!form.classList.contains(NEEDS_VALIDATION_CLASS)) {\n releaseManagedNoValidate(form);\n return;\n }\n ensureManagedNoValidate(form);\n validateField(el, \"input\");\n }\n },\n { signal: controller.signal },\n );\n\n form.addEventListener(\n \"reset\",\n () => {\n form.classList.remove(WAS_VALIDATED_CLASS);\n for (const el of form.elements) {\n if (ignoreField(el)) continue;\n el.setCustomValidity(\"\");\n markValid(el);\n }\n },\n { signal: controller.signal },\n );\n\n form.addEventListener(\n \"submit\",\n (event) => {\n if (event.submitter?.formNoValidate) return;\n\n if (!form.classList.contains(NEEDS_VALIDATION_CLASS)) {\n releaseManagedNoValidate(form);\n return;\n }\n\n ensureManagedNoValidate(form);\n\n let firstInvalid = null;\n\n for (const el of form.elements) {\n if (ignoreField(el)) continue;\n\n if (checkRules(el)) {\n markValid(el);\n continue;\n }\n\n markInvalid(el);\n if (!firstInvalid) firstInvalid = el;\n }\n\n form.classList.add(WAS_VALIDATED_CLASS);\n\n if (!firstInvalid) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n try {\n firstInvalid.focus();\n } catch {\n // Some environments do not implement focus on detached elements.\n }\n\n form.dispatchEvent(\n new CustomEvent(EVENTS.invalid, {\n bubbles: true,\n detail: {\n form,\n firstInvalid,\n message: form.dataset.validationMessage ?? \"\",\n },\n }),\n );\n },\n { signal: controller.signal },\n );\n\n const cleanup = () => {\n controller.abort();\n releaseManagedNoValidate(form);\n connectedForms.delete(form);\n };\n connectedForms.set(form, cleanup);\n return cleanup;\n}\n\n// biome-ignore lint/complexity/noStaticOnlyClass: Stable public namespace for validation helpers and rules.\nexport class FormValidator {\n static get rules() {\n return rules;\n }\n\n static registerRule(name, callback) {\n rules[name] = callback;\n }\n\n static init(selector = `.${NEEDS_VALIDATION_CLASS}`) {\n if (typeof document === \"undefined\") return;\n for (const form of document.querySelectorAll(selector)) {\n if (isFormElement(form)) connectForm(form);\n }\n }\n\n static setFieldError(el, message) {\n el.setCustomValidity(message || \"invalid\");\n el.dataset.validationErrors = \"server\";\n markInvalid(el);\n const error = errorEl(el);\n if (error && message) error.textContent = message;\n }\n\n static clearFieldError(el) {\n delete el.dataset.validationErrors;\n markValid(el);\n el.setCustomValidity(\"\");\n }\n\n static setErrors(form, errors) {\n if (!isFormElement(form)) return;\n for (const [name, message] of Object.entries(errors)) {\n const found = form.elements[name];\n if (!found) continue;\n if (found instanceof Element) {\n FormValidator.setFieldError(found, message);\n continue;\n }\n for (const el of found) {\n FormValidator.setFieldError(el, message);\n }\n }\n }\n}\n\nif (typeof document !== \"undefined\") {\n enhance({\n [`form.${NEEDS_VALIDATION_CLASS}`]: (form) => connectForm(form),\n });\n}\n\nexport default FormValidator;\n",
|
|
26
|
+
"/*\n * Status — singleton floating status bar.\n *\n * A status bar is a transient, non-critical feedback area. Keep one element in\n * the HTML, empty by default; JavaScript only updates its text content. It is\n * hidden visually when empty but stays available as a live region.\n *\n * Importing the module auto-wires it to Actual's validation: a form that fails\n * to submit shows its data-validation-message in the status bar. The bar is a\n * view, not a validation mechanism, so validation and status stay decoupled.\n *\n * import \"actual-css/js/status\";\n *\n * Three ways to trigger it, all funneling through the same `actual:status`\n * event so any of them can be observed the same way:\n *\n * - Programmatic (bundlers, third-party code): `import { status } from\n * \"actual-css/js/status\"`, then `status()` / `status.clear()`.\n * - Declarative, no JS required beyond the runtime:\n * <button commandfor=\"app-status\" command=\"--status\"\n * data-status-message=\"Saved.\" data-status-intent=\"success\">\n * <button commandfor=\"app-status\" command=\"--status-clear\">\n * (the status bar element itself needs the matching `id=\"app-status\"`.)\n * - Any other code, without importing this module: dispatch `actual:status`\n * directly — `detail: { message, intent, duration }`, or `{}` to clear.\n *\n * The element contract is `.status-bar[data-status]`. Both are required:\n * \"status\" is a generic domain word, so the class keeps the document-wide\n * lookup from matching an unrelated app element that happens to carry its own\n * `data-status`. `intent` is applied verbatim as one or more classes on the\n * target (space-separated for more than one, e.g. \"danger uppercase\").\n * status.js does not know or validate any specific names — .danger, .success,\n * and friends are Actual's own intents.css vocabulary, not something this\n * module hardcodes. Each call removes the intent classes the previous call\n * added (tracked in data-status-classes on the target itself), then adds the\n * current call's, so stale intent classes never accumulate and classes the\n * app added independently are left alone.\n */\nimport { registerCommands, targetFor } from \"./command.js\";\nimport { EVENTS } from \"./events.js\";\nimport { CLASSES } from \"./selectors.js\";\n\nconst STATUS_SELECTOR = `.${CLASSES.statusBar}[data-status]`;\nconst STATUS_CLASSES_ATTR = \"statusClasses\";\n\nlet statusTimer;\n\nfunction statusTarget() {\n if (typeof document === \"undefined\") return null;\n return document.querySelector(STATUS_SELECTOR);\n}\n\nfunction intentClasses(value) {\n return typeof value === \"string\" ? value.trim().split(/\\s+/).filter(Boolean) : [];\n}\n\nfunction clearIntentClasses(target) {\n const previous = target.dataset[STATUS_CLASSES_ATTR];\n if (previous) {\n target.classList.remove(...previous.split(\" \"));\n }\n delete target.dataset[STATUS_CLASSES_ATTR];\n}\n\nexport function status(message, options = {}) {\n const target = statusTarget();\n if (!target || message == null) return;\n\n clearTimeout(statusTimer);\n\n clearIntentClasses(target);\n const intent = intentClasses(options.intent);\n if (intent.length) {\n target.classList.add(...intent);\n target.dataset[STATUS_CLASSES_ATTR] = intent.join(\" \");\n }\n\n target.textContent = message;\n\n if (options.duration !== false) {\n statusTimer = setTimeout(() => status.clear(), options.duration ?? 3000);\n }\n}\n\nstatus.clear = function clear() {\n const target = statusTarget();\n if (target) {\n target.textContent = \"\";\n clearIntentClasses(target);\n }\n clearTimeout(statusTimer);\n};\n\nconst STATUS_SHOW_COMMANDS = [\"--status\"];\nconst STATUS_CLEAR_COMMANDS = [\"--status-clear\"];\n\nfunction dispatchStatusEvent(source, detail) {\n source.dispatchEvent(new CustomEvent(EVENTS.status, { bubbles: true, detail }));\n}\n\nfunction readDuration(trigger) {\n const raw = trigger.getAttribute(\"data-status-duration\");\n if (raw === null) return undefined;\n if (raw === \"false\") return false;\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction resolveStatusTrigger(trigger) {\n const target = targetFor(trigger);\n return target && target === statusTarget() ? target : null;\n}\n\nfunction connectStatusTrigger(trigger, target) {\n trigger.setAttribute(\"aria-controls\", target.id);\n}\n\nif (typeof document !== \"undefined\") {\n document.addEventListener(EVENTS.invalid, (event) => {\n const message = event.detail?.message;\n if (message) status(message, { intent: \"danger\" });\n });\n\n // Public contract: any code can trigger the status bar this way, without\n // importing this module. A message shows it; omitting one clears it.\n document.addEventListener(EVENTS.status, (event) => {\n const { message, intent, duration } = event.detail ?? {};\n if (message) {\n status(message, { intent, duration });\n } else {\n status.clear();\n }\n });\n\n registerCommands(STATUS_SHOW_COMMANDS, {\n resolve: resolveStatusTrigger,\n prepare: connectStatusTrigger,\n handle: (event, trigger) => {\n event.preventDefault();\n dispatchStatusEvent(trigger, {\n message: trigger.getAttribute(\"data-status-message\"),\n intent: trigger.getAttribute(\"data-status-intent\") ?? undefined,\n duration: readDuration(trigger),\n });\n },\n });\n\n registerCommands(STATUS_CLEAR_COMMANDS, {\n resolve: resolveStatusTrigger,\n prepare: connectStatusTrigger,\n handle: (event, trigger) => {\n event.preventDefault();\n dispatchStatusEvent(trigger, {});\n },\n });\n}\n\nexport default status;\n"
|
|
27
|
+
],
|
|
28
|
+
"mappings": "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",
|
|
29
|
+
"debugId": "212AD9ADABD2786D64756E2164756E21",
|
|
30
|
+
"names": []
|
|
31
|
+
}
|