@dogsbay/primitives 0.2.0-beta.122 → 0.2.0-beta.124
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/dist/chunk-CS5YCYCO.js +0 -1
- package/dist/chunk-HN6LBLTZ.js +0 -1
- package/dist/chunk-I6QJ4ATJ.js +0 -1
- package/dist/chunk-LN2MVY72.js +0 -1
- package/dist/chunk-M46BYUQY.js +0 -1
- package/dist/chunk-N2FDXX6C.js +0 -1
- package/dist/chunk-OKZYYVLM.js +0 -1
- package/dist/chunk-Q2HX4RL6.js +0 -1
- package/dist/chunk-QFU7X4UD.js +0 -1
- package/dist/collapsible.js +0 -1
- package/dist/composite.js +0 -1
- package/dist/dismiss.js +0 -1
- package/dist/floating.js +0 -1
- package/dist/focus-trap.js +0 -1
- package/dist/index.js +0 -1
- package/dist/inert.js +0 -1
- package/dist/merge-props.js +0 -1
- package/dist/portal.js +0 -1
- package/dist/scroll-lock.js +0 -1
- package/dist/typeahead.js +0 -1
- package/package.json +1 -1
- package/dist/chunk-CS5YCYCO.js.map +0 -1
- package/dist/chunk-HN6LBLTZ.js.map +0 -1
- package/dist/chunk-I6QJ4ATJ.js.map +0 -1
- package/dist/chunk-LN2MVY72.js.map +0 -1
- package/dist/chunk-M46BYUQY.js.map +0 -1
- package/dist/chunk-N2FDXX6C.js.map +0 -1
- package/dist/chunk-OKZYYVLM.js.map +0 -1
- package/dist/chunk-Q2HX4RL6.js.map +0 -1
- package/dist/chunk-QFU7X4UD.js.map +0 -1
- package/dist/collapsible.js.map +0 -1
- package/dist/composite.js.map +0 -1
- package/dist/dismiss.js.map +0 -1
- package/dist/floating.js.map +0 -1
- package/dist/focus-trap.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/inert.js.map +0 -1
- package/dist/merge-props.js.map +0 -1
- package/dist/portal.js.map +0 -1
- package/dist/scroll-lock.js.map +0 -1
- package/dist/typeahead.js.map +0 -1
package/dist/chunk-CS5YCYCO.js
CHANGED
package/dist/chunk-HN6LBLTZ.js
CHANGED
package/dist/chunk-I6QJ4ATJ.js
CHANGED
package/dist/chunk-LN2MVY72.js
CHANGED
package/dist/chunk-M46BYUQY.js
CHANGED
package/dist/chunk-N2FDXX6C.js
CHANGED
package/dist/chunk-OKZYYVLM.js
CHANGED
package/dist/chunk-Q2HX4RL6.js
CHANGED
package/dist/chunk-QFU7X4UD.js
CHANGED
package/dist/collapsible.js
CHANGED
package/dist/composite.js
CHANGED
package/dist/dismiss.js
CHANGED
package/dist/floating.js
CHANGED
package/dist/focus-trap.js
CHANGED
package/dist/index.js
CHANGED
package/dist/inert.js
CHANGED
package/dist/merge-props.js
CHANGED
package/dist/portal.js
CHANGED
package/dist/scroll-lock.js
CHANGED
package/dist/typeahead.js
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dismiss.ts"],"sourcesContent":["export type DismissReason = \"escape-key\" | \"outside-press\";\n\nexport interface DismissOptions {\n /** Called when the user dismisses the element. */\n onDismiss: (reason: DismissReason) => void;\n /** Whether pressing Escape dismisses. Defaults to true. */\n escapeKey?: boolean;\n /** Whether clicking outside dismisses. Can be a predicate. Defaults to true. */\n outsidePress?: boolean | ((event: PointerEvent) => boolean);\n}\n\n/**\n * Stack of active dismiss controllers. Only the topmost controller\n * handles Escape — this prevents nested dialogs from all closing\n * on a single Escape press.\n */\nconst dismissStack: DismissController[] = [];\n\nfunction globalEscapeHandler(e: KeyboardEvent) {\n if (e.key !== \"Escape\") return;\n if (dismissStack.length === 0) return;\n\n // Only the topmost controller handles Escape\n const top = dismissStack[dismissStack.length - 1];\n if (top.escapePrevented) return;\n\n // preventDefault as well: inside a modal <dialog>, an uncancelled Escape is also\n // the dialog's close request, which would close the dialog with the popup.\n e.preventDefault();\n e.stopPropagation();\n top.opts.onDismiss(\"escape-key\");\n}\n\n// Single global listener, registered once\nlet globalEscapeRegistered = false;\n\nfunction ensureGlobalEscapeListener() {\n if (globalEscapeRegistered) return;\n globalEscapeRegistered = true;\n document.addEventListener(\"keydown\", globalEscapeHandler);\n}\n\n/**\n * Handles dismissal of floating/overlay elements via Escape key\n * and outside pointer press.\n *\n * Uses a global stack so that only the topmost (most recently opened)\n * controller handles Escape. This prevents nested dialogs from all\n * closing on a single keypress.\n *\n * Delays the outside-press listener by one animation frame to prevent\n * the opening click from immediately triggering a dismiss.\n */\nexport class DismissController {\n private root: HTMLElement;\n /** @internal */ opts: {\n onDismiss: (reason: DismissReason) => void;\n escapeKey: boolean;\n outsidePress: boolean | ((event: PointerEvent) => boolean);\n };\n private outsideHandler: ((e: PointerEvent) => void) | null = null;\n private active = false;\n private frameId: number | null = null;\n /** @internal */ escapePrevented = false;\n\n constructor(root: HTMLElement, opts: DismissOptions) {\n this.root = root;\n this.opts = {\n onDismiss: opts.onDismiss,\n escapeKey: opts.escapeKey ?? true,\n outsidePress: opts.outsidePress ?? true,\n };\n }\n\n activate() {\n if (this.active) return;\n this.active = true;\n\n if (this.opts.escapeKey) {\n ensureGlobalEscapeListener();\n dismissStack.push(this);\n }\n\n if (this.opts.outsidePress) {\n this.outsideHandler = (e: PointerEvent) => {\n // Only the topmost controller handles outside press.\n // This prevents a nested dialog's close button click from\n // being seen as an \"outside press\" by the parent dialog.\n if (\n dismissStack.length > 0 &&\n dismissStack[dismissStack.length - 1] !== this\n ) {\n return;\n }\n\n const target = e.target as Node;\n if (this.root.contains(target)) return;\n\n // Don't dismiss if clicking the trigger that owns this element\n const controlsId = this.root.id;\n if (controlsId) {\n const trigger = document.querySelector(\n `[aria-controls=\"${controlsId}\"]`,\n );\n if (trigger?.contains(target)) return;\n }\n const triggerId = this.root.getAttribute(\"aria-labelledby\");\n if (triggerId) {\n const trigger = document.getElementById(triggerId);\n if (trigger?.contains(target)) return;\n }\n\n if (typeof this.opts.outsidePress === \"function\") {\n if (!this.opts.outsidePress(e)) return;\n }\n\n this.opts.onDismiss(\"outside-press\");\n };\n\n // Delay to avoid the opening click triggering immediate dismiss\n this.frameId = requestAnimationFrame(() => {\n this.frameId = null;\n if (this.outsideHandler) {\n document.addEventListener(\"pointerdown\", this.outsideHandler);\n }\n });\n }\n }\n\n deactivate() {\n if (!this.active) return;\n this.active = false;\n\n // Remove from stack\n const idx = dismissStack.indexOf(this);\n if (idx !== -1) dismissStack.splice(idx, 1);\n\n if (this.frameId !== null) {\n cancelAnimationFrame(this.frameId);\n this.frameId = null;\n }\n\n if (this.outsideHandler) {\n document.removeEventListener(\"pointerdown\", this.outsideHandler);\n this.outsideHandler = null;\n }\n }\n\n isActive() {\n return this.active;\n }\n}\n"],"mappings":";AAgBA,IAAM,eAAoC,CAAC;AAE3C,SAAS,oBAAoB,GAAkB;AAC7C,MAAI,EAAE,QAAQ,SAAU;AACxB,MAAI,aAAa,WAAW,EAAG;AAG/B,QAAM,MAAM,aAAa,aAAa,SAAS,CAAC;AAChD,MAAI,IAAI,gBAAiB;AAIzB,IAAE,eAAe;AACjB,IAAE,gBAAgB;AAClB,MAAI,KAAK,UAAU,YAAY;AACjC;AAGA,IAAI,yBAAyB;AAE7B,SAAS,6BAA6B;AACpC,MAAI,uBAAwB;AAC5B,2BAAyB;AACzB,WAAS,iBAAiB,WAAW,mBAAmB;AAC1D;AAaO,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA;AAAA,EACS;AAAA,EAKT,iBAAqD;AAAA,EACrD,SAAS;AAAA,EACT,UAAyB;AAAA;AAAA,EAChB,kBAAkB;AAAA,EAEnC,YAAY,MAAmB,MAAsB;AACnD,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,MACV,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK,aAAa;AAAA,MAC7B,cAAc,KAAK,gBAAgB;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,WAAW;AACT,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS;AAEd,QAAI,KAAK,KAAK,WAAW;AACvB,iCAA2B;AAC3B,mBAAa,KAAK,IAAI;AAAA,IACxB;AAEA,QAAI,KAAK,KAAK,cAAc;AAC1B,WAAK,iBAAiB,CAAC,MAAoB;AAIzC,YACE,aAAa,SAAS,KACtB,aAAa,aAAa,SAAS,CAAC,MAAM,MAC1C;AACA;AAAA,QACF;AAEA,cAAM,SAAS,EAAE;AACjB,YAAI,KAAK,KAAK,SAAS,MAAM,EAAG;AAGhC,cAAM,aAAa,KAAK,KAAK;AAC7B,YAAI,YAAY;AACd,gBAAM,UAAU,SAAS;AAAA,YACvB,mBAAmB,UAAU;AAAA,UAC/B;AACA,cAAI,SAAS,SAAS,MAAM,EAAG;AAAA,QACjC;AACA,cAAM,YAAY,KAAK,KAAK,aAAa,iBAAiB;AAC1D,YAAI,WAAW;AACb,gBAAM,UAAU,SAAS,eAAe,SAAS;AACjD,cAAI,SAAS,SAAS,MAAM,EAAG;AAAA,QACjC;AAEA,YAAI,OAAO,KAAK,KAAK,iBAAiB,YAAY;AAChD,cAAI,CAAC,KAAK,KAAK,aAAa,CAAC,EAAG;AAAA,QAClC;AAEA,aAAK,KAAK,UAAU,eAAe;AAAA,MACrC;AAGA,WAAK,UAAU,sBAAsB,MAAM;AACzC,aAAK,UAAU;AACf,YAAI,KAAK,gBAAgB;AACvB,mBAAS,iBAAiB,eAAe,KAAK,cAAc;AAAA,QAC9D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,aAAa;AACX,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,SAAS;AAGd,UAAM,MAAM,aAAa,QAAQ,IAAI;AACrC,QAAI,QAAQ,GAAI,cAAa,OAAO,KAAK,CAAC;AAE1C,QAAI,KAAK,YAAY,MAAM;AACzB,2BAAqB,KAAK,OAAO;AACjC,WAAK,UAAU;AAAA,IACjB;AAEA,QAAI,KAAK,gBAAgB;AACvB,eAAS,oBAAoB,eAAe,KAAK,cAAc;AAC/D,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/portal.ts"],"sourcesContent":["/**\n * Moves an element to the end of `document.body` inside a portal container.\n *\n * Returns a cleanup function that removes the portal container and\n * unregisters the View Transitions cleanup listener.\n */\nexport function createPortal(content: HTMLElement, id: string): () => void {\n const container = document.createElement(\"div\");\n container.setAttribute(\"data-base-astro-portal\", id);\n document.body.appendChild(container);\n container.appendChild(content);\n\n // Clean up portals during Astro View Transitions\n const cleanupHandler = () => {\n if (container.parentElement) {\n container.remove();\n }\n };\n document.addEventListener(\"astro:before-preparation\", cleanupHandler);\n\n return () => {\n document.removeEventListener(\"astro:before-preparation\", cleanupHandler);\n if (container.parentElement) {\n container.remove();\n }\n };\n}\n"],"mappings":";AAMO,SAAS,aAAa,SAAsB,IAAwB;AACzE,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,aAAa,0BAA0B,EAAE;AACnD,WAAS,KAAK,YAAY,SAAS;AACnC,YAAU,YAAY,OAAO;AAG7B,QAAM,iBAAiB,MAAM;AAC3B,QAAI,UAAU,eAAe;AAC3B,gBAAU,OAAO;AAAA,IACnB;AAAA,EACF;AACA,WAAS,iBAAiB,4BAA4B,cAAc;AAEpE,SAAO,MAAM;AACX,aAAS,oBAAoB,4BAA4B,cAAc;AACvE,QAAI,UAAU,eAAe;AAC3B,gBAAU,OAAO;AAAA,IACnB;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/merge-props.ts"],"sourcesContent":["type AnyProps = Record<string, unknown>;\n\n/**\n * Merges multiple prop objects, composing event handlers and\n * concatenating class names.\n *\n * - Event handlers (`on*`): all handlers run; latest set first.\n * - `class` / `className`: concatenated with spaces.\n * - `style` (object): shallow-merged, later values win.\n * - All other props: later values win.\n */\nexport function mergeProps<T extends AnyProps>(\n ...propSets: Array<T | undefined>\n): T {\n const result: AnyProps = {};\n\n for (const props of propSets) {\n if (!props) continue;\n\n for (const [key, value] of Object.entries(props)) {\n if (value === undefined) continue;\n\n const isHandler =\n key.length > 2 &&\n key.startsWith(\"on\") &&\n key[2] === key[2]?.toUpperCase();\n\n if (isHandler && typeof value === \"function\") {\n const existing = result[key] as\n | ((...args: unknown[]) => void)\n | undefined;\n if (existing) {\n result[key] = (...args: unknown[]) => {\n (value as (...a: unknown[]) => void)(...args);\n existing(...args);\n };\n } else {\n result[key] = value;\n }\n } else if (key === \"class\" || key === \"className\") {\n result[key] = [result[key], value].filter(Boolean).join(\" \");\n } else if (\n key === \"style\" &&\n typeof value === \"object\" &&\n value !== null\n ) {\n result[key] = { ...(result[key] as object | undefined), ...value };\n } else {\n result[key] = value;\n }\n }\n }\n\n return result as T;\n}\n"],"mappings":";AAWO,SAAS,cACX,UACA;AACH,QAAM,SAAmB,CAAC;AAE1B,aAAW,SAAS,UAAU;AAC5B,QAAI,CAAC,MAAO;AAEZ,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,UAAI,UAAU,OAAW;AAEzB,YAAM,YACJ,IAAI,SAAS,KACb,IAAI,WAAW,IAAI,KACnB,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,YAAY;AAEjC,UAAI,aAAa,OAAO,UAAU,YAAY;AAC5C,cAAM,WAAW,OAAO,GAAG;AAG3B,YAAI,UAAU;AACZ,iBAAO,GAAG,IAAI,IAAI,SAAoB;AACpC,YAAC,MAAoC,GAAG,IAAI;AAC5C,qBAAS,GAAG,IAAI;AAAA,UAClB;AAAA,QACF,OAAO;AACL,iBAAO,GAAG,IAAI;AAAA,QAChB;AAAA,MACF,WAAW,QAAQ,WAAW,QAAQ,aAAa;AACjD,eAAO,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC7D,WACE,QAAQ,WACR,OAAO,UAAU,YACjB,UAAU,MACV;AACA,eAAO,GAAG,IAAI,EAAE,GAAI,OAAO,GAAG,GAA0B,GAAG,MAAM;AAAA,MACnE,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/composite.ts"],"sourcesContent":["export type Orientation = \"horizontal\" | \"vertical\" | \"both\";\n\nexport interface CompositeOptions {\n /** Which arrow keys navigate. Defaults to \"horizontal\". */\n orientation?: Orientation;\n /** Whether navigation wraps from end to start. Defaults to true. */\n loop?: boolean;\n /** Whether Home/End keys are handled. Defaults to true. */\n homeEnd?: boolean;\n /** Called when the highlighted index changes. */\n onHighlightedIndexChange?: (index: number) => void;\n}\n\n/**\n * Returns true if the element should be considered disabled.\n * Checks `disabled` attribute and `aria-disabled=\"true\"`.\n */\nfunction isDisabled(el: HTMLElement): boolean {\n return (\n el.hasAttribute(\"disabled\") || el.getAttribute(\"aria-disabled\") === \"true\"\n );\n}\n\n/**\n * Finds the next non-disabled index in a list, walking forward or backward.\n */\nfunction findNonDisabledIndex(\n items: HTMLElement[],\n startIndex: number,\n decrement: boolean,\n): number {\n let index = startIndex;\n do {\n index += decrement ? -1 : 1;\n } while (index >= 0 && index < items.length && isDisabled(items[index]));\n return index;\n}\n\n/**\n * Manages roving tabindex keyboard navigation for a list of items.\n *\n * Ported from Base UI's composite navigation pattern. Handles arrow keys,\n * Home/End, disabled item skipping, orientation, RTL, and loop wrapping.\n *\n * Used by: Tabs, Menu, Select, RadioGroup, ToggleGroup.\n */\nexport class CompositeNavigation {\n private container: HTMLElement;\n private itemSelector: string;\n private opts: Required<CompositeOptions>;\n private keydownHandler: ((e: KeyboardEvent) => void) | null = null;\n private active = false;\n\n constructor(\n container: HTMLElement,\n itemSelector: string,\n opts: CompositeOptions = {},\n ) {\n this.container = container;\n this.itemSelector = itemSelector;\n this.opts = {\n orientation: opts.orientation ?? \"horizontal\",\n loop: opts.loop ?? true,\n homeEnd: opts.homeEnd ?? true,\n onHighlightedIndexChange: opts.onHighlightedIndexChange ?? (() => {}),\n };\n }\n\n private getItems(): HTMLElement[] {\n return Array.from(\n this.container.querySelectorAll(this.itemSelector),\n ) as HTMLElement[];\n }\n\n private isForwardKey(key: string, isRtl: boolean): boolean {\n const { orientation } = this.opts;\n if (orientation === \"horizontal\" || orientation === \"both\") {\n if (key === (isRtl ? \"ArrowLeft\" : \"ArrowRight\")) return true;\n }\n if (orientation === \"vertical\" || orientation === \"both\") {\n if (key === \"ArrowDown\") return true;\n }\n return false;\n }\n\n private isBackwardKey(key: string, isRtl: boolean): boolean {\n const { orientation } = this.opts;\n if (orientation === \"horizontal\" || orientation === \"both\") {\n if (key === (isRtl ? \"ArrowRight\" : \"ArrowLeft\")) return true;\n }\n if (orientation === \"vertical\" || orientation === \"both\") {\n if (key === \"ArrowUp\") return true;\n }\n return false;\n }\n\n activate() {\n if (this.active) return;\n this.active = true;\n\n this.keydownHandler = (e: KeyboardEvent) => {\n const items = this.getItems();\n if (items.length === 0) return;\n\n // Skip if modifier keys are held\n if (e.ctrlKey || e.altKey || e.metaKey) return;\n\n const isRtl = getComputedStyle(this.container).direction === \"rtl\";\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n if (currentIndex === -1) return;\n\n let nextIndex: number | null = null;\n\n if (this.isForwardKey(e.key, isRtl)) {\n nextIndex = findNonDisabledIndex(items, currentIndex, false);\n if (nextIndex >= items.length) {\n nextIndex = this.opts.loop\n ? findNonDisabledIndex(items, -1, false)\n : currentIndex;\n }\n } else if (this.isBackwardKey(e.key, isRtl)) {\n nextIndex = findNonDisabledIndex(items, currentIndex, true);\n if (nextIndex < 0) {\n nextIndex = this.opts.loop\n ? findNonDisabledIndex(items, items.length, true)\n : currentIndex;\n }\n } else if (this.opts.homeEnd && e.key === \"Home\") {\n nextIndex = findNonDisabledIndex(items, -1, false);\n } else if (this.opts.homeEnd && e.key === \"End\") {\n nextIndex = findNonDisabledIndex(items, items.length, true);\n }\n\n if (nextIndex === null) return;\n if (nextIndex < 0 || nextIndex >= items.length) return;\n if (nextIndex === currentIndex) return;\n\n e.preventDefault();\n\n // Update roving tabindex\n items[currentIndex].setAttribute(\"tabindex\", \"-1\");\n items[nextIndex].setAttribute(\"tabindex\", \"0\");\n items[nextIndex].focus();\n\n this.opts.onHighlightedIndexChange(nextIndex);\n };\n\n this.container.addEventListener(\"keydown\", this.keydownHandler);\n }\n\n deactivate() {\n if (!this.active) return;\n this.active = false;\n\n if (this.keydownHandler) {\n this.container.removeEventListener(\"keydown\", this.keydownHandler);\n this.keydownHandler = null;\n }\n }\n\n /** Set the roving tabindex so only the given index is tabbable. */\n setActiveIndex(items: HTMLElement[], index: number) {\n items.forEach((item, i) => {\n item.setAttribute(\"tabindex\", i === index ? \"0\" : \"-1\");\n });\n }\n\n isActive() {\n return this.active;\n }\n}\n"],"mappings":";AAiBA,SAAS,WAAW,IAA0B;AAC5C,SACE,GAAG,aAAa,UAAU,KAAK,GAAG,aAAa,eAAe,MAAM;AAExE;AAKA,SAAS,qBACP,OACA,YACA,WACQ;AACR,MAAI,QAAQ;AACZ,KAAG;AACD,aAAS,YAAY,KAAK;AAAA,EAC5B,SAAS,SAAS,KAAK,QAAQ,MAAM,UAAU,WAAW,MAAM,KAAK,CAAC;AACtE,SAAO;AACT;AAUO,IAAM,sBAAN,MAA0B;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAsD;AAAA,EACtD,SAAS;AAAA,EAEjB,YACE,WACA,cACA,OAAyB,CAAC,GAC1B;AACA,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,SAAK,OAAO;AAAA,MACV,aAAa,KAAK,eAAe;AAAA,MACjC,MAAM,KAAK,QAAQ;AAAA,MACnB,SAAS,KAAK,WAAW;AAAA,MACzB,0BAA0B,KAAK,6BAA6B,MAAM;AAAA,MAAC;AAAA,IACrE;AAAA,EACF;AAAA,EAEQ,WAA0B;AAChC,WAAO,MAAM;AAAA,MACX,KAAK,UAAU,iBAAiB,KAAK,YAAY;AAAA,IACnD;AAAA,EACF;AAAA,EAEQ,aAAa,KAAa,OAAyB;AACzD,UAAM,EAAE,YAAY,IAAI,KAAK;AAC7B,QAAI,gBAAgB,gBAAgB,gBAAgB,QAAQ;AAC1D,UAAI,SAAS,QAAQ,cAAc,cAAe,QAAO;AAAA,IAC3D;AACA,QAAI,gBAAgB,cAAc,gBAAgB,QAAQ;AACxD,UAAI,QAAQ,YAAa,QAAO;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,KAAa,OAAyB;AAC1D,UAAM,EAAE,YAAY,IAAI,KAAK;AAC7B,QAAI,gBAAgB,gBAAgB,gBAAgB,QAAQ;AAC1D,UAAI,SAAS,QAAQ,eAAe,aAAc,QAAO;AAAA,IAC3D;AACA,QAAI,gBAAgB,cAAc,gBAAgB,QAAQ;AACxD,UAAI,QAAQ,UAAW,QAAO;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,WAAW;AACT,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS;AAEd,SAAK,iBAAiB,CAAC,MAAqB;AAC1C,YAAM,QAAQ,KAAK,SAAS;AAC5B,UAAI,MAAM,WAAW,EAAG;AAGxB,UAAI,EAAE,WAAW,EAAE,UAAU,EAAE,QAAS;AAExC,YAAM,QAAQ,iBAAiB,KAAK,SAAS,EAAE,cAAc;AAC7D,YAAM,eAAe,MAAM,QAAQ,SAAS,aAA4B;AACxE,UAAI,iBAAiB,GAAI;AAEzB,UAAI,YAA2B;AAE/B,UAAI,KAAK,aAAa,EAAE,KAAK,KAAK,GAAG;AACnC,oBAAY,qBAAqB,OAAO,cAAc,KAAK;AAC3D,YAAI,aAAa,MAAM,QAAQ;AAC7B,sBAAY,KAAK,KAAK,OAClB,qBAAqB,OAAO,IAAI,KAAK,IACrC;AAAA,QACN;AAAA,MACF,WAAW,KAAK,cAAc,EAAE,KAAK,KAAK,GAAG;AAC3C,oBAAY,qBAAqB,OAAO,cAAc,IAAI;AAC1D,YAAI,YAAY,GAAG;AACjB,sBAAY,KAAK,KAAK,OAClB,qBAAqB,OAAO,MAAM,QAAQ,IAAI,IAC9C;AAAA,QACN;AAAA,MACF,WAAW,KAAK,KAAK,WAAW,EAAE,QAAQ,QAAQ;AAChD,oBAAY,qBAAqB,OAAO,IAAI,KAAK;AAAA,MACnD,WAAW,KAAK,KAAK,WAAW,EAAE,QAAQ,OAAO;AAC/C,oBAAY,qBAAqB,OAAO,MAAM,QAAQ,IAAI;AAAA,MAC5D;AAEA,UAAI,cAAc,KAAM;AACxB,UAAI,YAAY,KAAK,aAAa,MAAM,OAAQ;AAChD,UAAI,cAAc,aAAc;AAEhC,QAAE,eAAe;AAGjB,YAAM,YAAY,EAAE,aAAa,YAAY,IAAI;AACjD,YAAM,SAAS,EAAE,aAAa,YAAY,GAAG;AAC7C,YAAM,SAAS,EAAE,MAAM;AAEvB,WAAK,KAAK,yBAAyB,SAAS;AAAA,IAC9C;AAEA,SAAK,UAAU,iBAAiB,WAAW,KAAK,cAAc;AAAA,EAChE;AAAA,EAEA,aAAa;AACX,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,SAAS;AAEd,QAAI,KAAK,gBAAgB;AACvB,WAAK,UAAU,oBAAoB,WAAW,KAAK,cAAc;AACjE,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGA,eAAe,OAAsB,OAAe;AAClD,UAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,WAAK,aAAa,YAAY,MAAM,QAAQ,MAAM,IAAI;AAAA,IACxD,CAAC;AAAA,EACH;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/focus-trap.ts"],"sourcesContent":["import { tabbable } from \"tabbable\";\n\nexport interface FocusTrapOptions {\n /** Where to place focus when the trap activates. Defaults to \"first\". */\n initialFocus?: HTMLElement | \"first\" | \"container\";\n /** Whether to return focus to the previously focused element on deactivate. Defaults to true. */\n returnFocus?: boolean;\n}\n\n/**\n * Traps keyboard focus within a container element.\n *\n * Re-queries tabbable elements on every Tab press so dynamically\n * added/removed elements are handled correctly. Uses the `tabbable`\n * library for accurate focusable-element detection.\n */\nexport class FocusTrap {\n private root: HTMLElement;\n private opts: Required<FocusTrapOptions>;\n private previouslyFocused: HTMLElement | null = null;\n private keydownHandler: ((e: KeyboardEvent) => void) | null = null;\n private active = false;\n\n constructor(root: HTMLElement, opts: FocusTrapOptions = {}) {\n this.root = root;\n this.opts = {\n initialFocus: opts.initialFocus ?? \"first\",\n returnFocus: opts.returnFocus ?? true,\n };\n }\n\n activate() {\n if (this.active) return;\n this.active = true;\n this.previouslyFocused = document.activeElement as HTMLElement;\n\n this.keydownHandler = (e: KeyboardEvent) => {\n if (e.key !== \"Tab\") return;\n\n // Re-query on every Tab to handle dynamic content\n const targets = tabbable(this.root);\n if (targets.length === 0) {\n // Nothing tabbable — prevent Tab from leaving\n e.preventDefault();\n return;\n }\n\n const first = targets[0] as HTMLElement;\n const last = targets[targets.length - 1] as HTMLElement;\n\n if (e.shiftKey) {\n if (document.activeElement === first) {\n last.focus();\n e.preventDefault();\n }\n } else {\n if (document.activeElement === last) {\n first.focus();\n e.preventDefault();\n }\n }\n };\n\n document.addEventListener(\"keydown\", this.keydownHandler);\n\n // Set initial focus\n requestAnimationFrame(() => {\n if (!this.active) return;\n const targets = tabbable(this.root);\n\n if (\n this.opts.initialFocus instanceof HTMLElement &&\n this.root.contains(this.opts.initialFocus)\n ) {\n this.opts.initialFocus.focus();\n } else if (this.opts.initialFocus === \"container\") {\n if (!this.root.hasAttribute(\"tabindex\")) {\n this.root.setAttribute(\"tabindex\", \"-1\");\n }\n this.root.focus();\n } else {\n // \"first\" — default\n (targets[0] as HTMLElement | undefined)?.focus();\n }\n });\n }\n\n deactivate() {\n if (!this.active) return;\n this.active = false;\n\n if (this.keydownHandler) {\n document.removeEventListener(\"keydown\", this.keydownHandler);\n this.keydownHandler = null;\n }\n\n if (this.opts.returnFocus && this.previouslyFocused) {\n if (document.contains(this.previouslyFocused)) {\n this.previouslyFocused.focus();\n }\n }\n this.previouslyFocused = null;\n }\n\n isActive() {\n return this.active;\n }\n}\n"],"mappings":";AAAA,SAAS,gBAAgB;AAgBlB,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA;AAAA,EACA,oBAAwC;AAAA,EACxC,iBAAsD;AAAA,EACtD,SAAS;AAAA,EAEjB,YAAY,MAAmB,OAAyB,CAAC,GAAG;AAC1D,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,MACV,cAAc,KAAK,gBAAgB;AAAA,MACnC,aAAa,KAAK,eAAe;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,WAAW;AACT,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS;AACd,SAAK,oBAAoB,SAAS;AAElC,SAAK,iBAAiB,CAAC,MAAqB;AAC1C,UAAI,EAAE,QAAQ,MAAO;AAGrB,YAAM,UAAU,SAAS,KAAK,IAAI;AAClC,UAAI,QAAQ,WAAW,GAAG;AAExB,UAAE,eAAe;AACjB;AAAA,MACF;AAEA,YAAM,QAAQ,QAAQ,CAAC;AACvB,YAAM,OAAO,QAAQ,QAAQ,SAAS,CAAC;AAEvC,UAAI,EAAE,UAAU;AACd,YAAI,SAAS,kBAAkB,OAAO;AACpC,eAAK,MAAM;AACX,YAAE,eAAe;AAAA,QACnB;AAAA,MACF,OAAO;AACL,YAAI,SAAS,kBAAkB,MAAM;AACnC,gBAAM,MAAM;AACZ,YAAE,eAAe;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,aAAS,iBAAiB,WAAW,KAAK,cAAc;AAGxD,0BAAsB,MAAM;AAC1B,UAAI,CAAC,KAAK,OAAQ;AAClB,YAAM,UAAU,SAAS,KAAK,IAAI;AAElC,UACE,KAAK,KAAK,wBAAwB,eAClC,KAAK,KAAK,SAAS,KAAK,KAAK,YAAY,GACzC;AACA,aAAK,KAAK,aAAa,MAAM;AAAA,MAC/B,WAAW,KAAK,KAAK,iBAAiB,aAAa;AACjD,YAAI,CAAC,KAAK,KAAK,aAAa,UAAU,GAAG;AACvC,eAAK,KAAK,aAAa,YAAY,IAAI;AAAA,QACzC;AACA,aAAK,KAAK,MAAM;AAAA,MAClB,OAAO;AAEL,QAAC,QAAQ,CAAC,GAA+B,MAAM;AAAA,MACjD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,aAAa;AACX,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,SAAS;AAEd,QAAI,KAAK,gBAAgB;AACvB,eAAS,oBAAoB,WAAW,KAAK,cAAc;AAC3D,WAAK,iBAAiB;AAAA,IACxB;AAEA,QAAI,KAAK,KAAK,eAAe,KAAK,mBAAmB;AACnD,UAAI,SAAS,SAAS,KAAK,iBAAiB,GAAG;AAC7C,aAAK,kBAAkB,MAAM;AAAA,MAC/B;AAAA,IACF;AACA,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/inert.ts"],"sourcesContent":["/**\n * Marks all elements outside the given element as `aria-hidden=\"true\"`,\n * making only the target element visible to screen readers.\n *\n * Returns a cleanup function that restores the original `aria-hidden`\n * values. Handles elements that already had `aria-hidden` set.\n */\nexport function markOthersInert(element: HTMLElement): () => void {\n const restore: Array<{ el: Element; prev: string | null }> = [];\n\n // Walk up to body, hiding siblings at each level\n let current: Element | null = element;\n while (current && current !== document.body) {\n const parent: Element | null = current.parentElement;\n if (!parent) break;\n\n for (let i = 0; i < parent.children.length; i++) {\n const sibling = parent.children[i];\n if (sibling === current) continue;\n if (sibling.contains(element)) continue;\n\n // Skip script/style elements\n const tag = sibling.tagName;\n if (tag === \"SCRIPT\" || tag === \"STYLE\" || tag === \"LINK\") continue;\n\n const prev = sibling.getAttribute(\"aria-hidden\");\n if (prev === \"true\") continue; // already hidden, don't touch\n\n restore.push({ el: sibling, prev });\n sibling.setAttribute(\"aria-hidden\", \"true\");\n }\n\n current = parent;\n }\n\n return () => {\n for (const { el, prev } of restore) {\n if (prev === null) {\n el.removeAttribute(\"aria-hidden\");\n } else {\n el.setAttribute(\"aria-hidden\", prev);\n }\n }\n };\n}\n"],"mappings":";AAOO,SAAS,gBAAgB,SAAkC;AAChE,QAAM,UAAuD,CAAC;AAG9D,MAAI,UAA0B;AAC9B,SAAO,WAAW,YAAY,SAAS,MAAM;AAC3C,UAAM,SAAyB,QAAQ;AACvC,QAAI,CAAC,OAAQ;AAEb,aAAS,IAAI,GAAG,IAAI,OAAO,SAAS,QAAQ,KAAK;AAC/C,YAAM,UAAU,OAAO,SAAS,CAAC;AACjC,UAAI,YAAY,QAAS;AACzB,UAAI,QAAQ,SAAS,OAAO,EAAG;AAG/B,YAAM,MAAM,QAAQ;AACpB,UAAI,QAAQ,YAAY,QAAQ,WAAW,QAAQ,OAAQ;AAE3D,YAAM,OAAO,QAAQ,aAAa,aAAa;AAC/C,UAAI,SAAS,OAAQ;AAErB,cAAQ,KAAK,EAAE,IAAI,SAAS,KAAK,CAAC;AAClC,cAAQ,aAAa,eAAe,MAAM;AAAA,IAC5C;AAEA,cAAU;AAAA,EACZ;AAEA,SAAO,MAAM;AACX,eAAW,EAAE,IAAI,KAAK,KAAK,SAAS;AAClC,UAAI,SAAS,MAAM;AACjB,WAAG,gBAAgB,aAAa;AAAA,MAClC,OAAO;AACL,WAAG,aAAa,eAAe,IAAI;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/typeahead.ts"],"sourcesContent":["export interface TypeaheadOptions {\n /** Called when a match is found. Receives the matching index. */\n onMatch: (index: number) => void;\n /** Returns the text content for the item at the given index. */\n getItemText: (index: number) => string;\n /** Total number of items. */\n getItemCount: () => number;\n /** Timeout in ms before the search buffer resets. Defaults to 1000. */\n timeout?: number;\n}\n\n/**\n * Handles type-to-select behavior for lists.\n *\n * Accumulates typed characters into a buffer. On each keystroke, searches\n * for an item whose text starts with the buffer (case-insensitive).\n * Resets the buffer after a configurable timeout of inactivity.\n *\n * Used by: Select, Menu, Combobox, Listbox.\n */\nexport class Typeahead {\n private opts: TypeaheadOptions;\n private buffer = \"\";\n private timerId: ReturnType<typeof setTimeout> | null = null;\n private timeout: number;\n\n constructor(opts: TypeaheadOptions) {\n this.opts = opts;\n this.timeout = opts.timeout ?? 1000;\n }\n\n /**\n * Handle a keydown event. Call this from your component's keydown handler.\n * Returns true if the key was consumed (a printable character), false otherwise.\n */\n handle(key: string): boolean {\n // Only handle single printable characters\n if (key.length !== 1) return false;\n\n // Reset timer\n if (this.timerId !== null) {\n clearTimeout(this.timerId);\n }\n\n this.buffer += key.toLowerCase();\n\n this.timerId = setTimeout(() => {\n this.buffer = \"\";\n this.timerId = null;\n }, this.timeout);\n\n // Search for a match\n const count = this.opts.getItemCount();\n for (let i = 0; i < count; i++) {\n const text = this.opts.getItemText(i).toLowerCase();\n if (text.startsWith(this.buffer)) {\n this.opts.onMatch(i);\n return true;\n }\n }\n\n return true; // consumed the character even if no match\n }\n\n /** Reset the buffer immediately. */\n reset() {\n this.buffer = \"\";\n if (this.timerId !== null) {\n clearTimeout(this.timerId);\n this.timerId = null;\n }\n }\n}\n"],"mappings":";AAoBO,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA,SAAS;AAAA,EACT,UAAgD;AAAA,EAChD;AAAA,EAER,YAAY,MAAwB;AAClC,SAAK,OAAO;AACZ,SAAK,UAAU,KAAK,WAAW;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,KAAsB;AAE3B,QAAI,IAAI,WAAW,EAAG,QAAO;AAG7B,QAAI,KAAK,YAAY,MAAM;AACzB,mBAAa,KAAK,OAAO;AAAA,IAC3B;AAEA,SAAK,UAAU,IAAI,YAAY;AAE/B,SAAK,UAAU,WAAW,MAAM;AAC9B,WAAK,SAAS;AACd,WAAK,UAAU;AAAA,IACjB,GAAG,KAAK,OAAO;AAGf,UAAM,QAAQ,KAAK,KAAK,aAAa;AACrC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,OAAO,KAAK,KAAK,YAAY,CAAC,EAAE,YAAY;AAClD,UAAI,KAAK,WAAW,KAAK,MAAM,GAAG;AAChC,aAAK,KAAK,QAAQ,CAAC;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,QAAQ;AACN,SAAK,SAAS;AACd,QAAI,KAAK,YAAY,MAAM;AACzB,mBAAa,KAAK,OAAO;AACzB,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/floating.ts"],"sourcesContent":["import {\n computePosition,\n flip,\n shift,\n offset as offsetMiddleware,\n size,\n autoUpdate,\n type Placement,\n type Strategy,\n} from \"@floating-ui/dom\";\n\nexport interface FloatingOptions {\n /** Placement relative to the reference element. Defaults to \"bottom-start\". */\n placement?: Placement;\n /** Positioning strategy. Defaults to \"absolute\". */\n strategy?: Strategy;\n /** Offset distance in pixels. Defaults to 4. */\n offset?: number;\n /** Whether to flip when there's not enough space. Defaults to true. */\n flip?: boolean;\n /** Whether to shift to stay in viewport. Defaults to true. */\n shift?: boolean;\n /** Padding from viewport edge in pixels. Defaults to 8. */\n padding?: number;\n /** Whether to match the width of the reference element. Defaults to false. */\n matchWidth?: boolean;\n}\n\n/**\n * Positions a floating element relative to a reference element.\n *\n * Uses @floating-ui/dom for positioning with flip, shift, and offset\n * middleware. Returns a cleanup function that stops auto-updating.\n *\n * Used by: Select, Popover, Tooltip, Menu, Combobox.\n */\nexport function setupFloating(\n reference: HTMLElement,\n floating: HTMLElement,\n opts: FloatingOptions = {},\n): () => void {\n const {\n placement = \"bottom-start\",\n strategy = \"absolute\",\n offset = 4,\n flip: enableFlip = true,\n shift: enableShift = true,\n padding = 8,\n matchWidth = false,\n } = opts;\n\n const middleware = [\n offsetMiddleware(offset),\n ...(enableFlip ? [flip({ padding })] : []),\n ...(enableShift ? [shift({ padding })] : []),\n ...(matchWidth\n ? [\n size({\n apply({ rects }) {\n Object.assign(floating.style, {\n width: `${rects.reference.width}px`,\n });\n },\n }),\n ]\n : []),\n ];\n\n floating.style.position = strategy;\n\n const cleanup = autoUpdate(reference, floating, async () => {\n const result = await computePosition(reference, floating, {\n placement,\n strategy,\n middleware,\n });\n\n Object.assign(floating.style, {\n left: `${result.x}px`,\n top: `${result.y}px`,\n });\n\n // Set data-side for CSS styling (e.g., arrow direction)\n const side = result.placement.split(\"-\")[0];\n floating.setAttribute(\"data-side\", side);\n });\n\n return cleanup;\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,OAGK;AA2BA,SAAS,cACd,WACA,UACA,OAAwB,CAAC,GACb;AACZ,QAAM;AAAA,IACJ,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,IACT,MAAM,aAAa;AAAA,IACnB,OAAO,cAAc;AAAA,IACrB,UAAU;AAAA,IACV,aAAa;AAAA,EACf,IAAI;AAEJ,QAAM,aAAa;AAAA,IACjB,iBAAiB,MAAM;AAAA,IACvB,GAAI,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC;AAAA,IACxC,GAAI,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC;AAAA,IAC1C,GAAI,aACA;AAAA,MACE,KAAK;AAAA,QACH,MAAM,EAAE,MAAM,GAAG;AACf,iBAAO,OAAO,SAAS,OAAO;AAAA,YAC5B,OAAO,GAAG,MAAM,UAAU,KAAK;AAAA,UACjC,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,IACA,CAAC;AAAA,EACP;AAEA,WAAS,MAAM,WAAW;AAE1B,QAAM,UAAU,WAAW,WAAW,UAAU,YAAY;AAC1D,UAAM,SAAS,MAAM,gBAAgB,WAAW,UAAU;AAAA,MACxD;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO,OAAO,SAAS,OAAO;AAAA,MAC5B,MAAM,GAAG,OAAO,CAAC;AAAA,MACjB,KAAK,GAAG,OAAO,CAAC;AAAA,IAClB,CAAC;AAGD,UAAM,OAAO,OAAO,UAAU,MAAM,GAAG,EAAE,CAAC;AAC1C,aAAS,aAAa,aAAa,IAAI;AAAA,EACzC,CAAC;AAED,SAAO;AACT;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/scroll-lock.ts"],"sourcesContent":["/**\n * Prevents body scrolling while a modal is open.\n *\n * Uses a reference count so nested modals don't unlock prematurely.\n * Compensates for the scrollbar width to prevent layout shift.\n */\nexport class ScrollLock {\n private static count = 0;\n private static originalStyles: {\n overflow: string;\n paddingRight: string;\n } | null = null;\n\n /** Lock body scroll. Safe to call multiple times (reference counted). */\n static activate() {\n ScrollLock.count++;\n if (ScrollLock.count > 1) return;\n\n const scrollBarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n\n ScrollLock.originalStyles = {\n overflow: document.body.style.overflow,\n paddingRight: document.body.style.paddingRight,\n };\n\n document.body.style.overflow = \"hidden\";\n if (scrollBarWidth > 0) {\n document.body.style.paddingRight = `${scrollBarWidth}px`;\n }\n }\n\n /** Unlock body scroll. Only actually unlocks when the last caller releases. */\n static deactivate() {\n ScrollLock.count = Math.max(0, ScrollLock.count - 1);\n if (ScrollLock.count > 0) return;\n\n if (ScrollLock.originalStyles) {\n document.body.style.overflow = ScrollLock.originalStyles.overflow;\n document.body.style.paddingRight = ScrollLock.originalStyles.paddingRight;\n ScrollLock.originalStyles = null;\n }\n }\n\n /** Reset internal state. Useful for testing. */\n static reset() {\n ScrollLock.count = 0;\n ScrollLock.originalStyles = null;\n }\n}\n"],"mappings":";AAMO,IAAM,aAAN,MAAM,YAAW;AAAA,EACtB,OAAe,QAAQ;AAAA,EACvB,OAAe,iBAGJ;AAAA;AAAA,EAGX,OAAO,WAAW;AAChB,gBAAW;AACX,QAAI,YAAW,QAAQ,EAAG;AAE1B,UAAM,iBACJ,OAAO,aAAa,SAAS,gBAAgB;AAE/C,gBAAW,iBAAiB;AAAA,MAC1B,UAAU,SAAS,KAAK,MAAM;AAAA,MAC9B,cAAc,SAAS,KAAK,MAAM;AAAA,IACpC;AAEA,aAAS,KAAK,MAAM,WAAW;AAC/B,QAAI,iBAAiB,GAAG;AACtB,eAAS,KAAK,MAAM,eAAe,GAAG,cAAc;AAAA,IACtD;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,aAAa;AAClB,gBAAW,QAAQ,KAAK,IAAI,GAAG,YAAW,QAAQ,CAAC;AACnD,QAAI,YAAW,QAAQ,EAAG;AAE1B,QAAI,YAAW,gBAAgB;AAC7B,eAAS,KAAK,MAAM,WAAW,YAAW,eAAe;AACzD,eAAS,KAAK,MAAM,eAAe,YAAW,eAAe;AAC7D,kBAAW,iBAAiB;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,QAAQ;AACb,gBAAW,QAAQ;AACnB,gBAAW,iBAAiB;AAAA,EAC9B;AACF;","names":[]}
|
package/dist/collapsible.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/collapsible.ts"],"sourcesContent":["let idCounter = 0;\nfunction uniqueId(prefix: string) {\n return `${prefix}-${++idCounter}`;\n}\n\nexport interface CollapsibleOptions {\n /** Called when state changes. */\n onToggle?: (open: boolean) => void;\n}\n\n/**\n * Manages the expand/collapse state of a trigger + content pair.\n *\n * Handles:\n * - `aria-expanded` on trigger\n * - `aria-controls` / `aria-labelledby` linkage\n * - `hidden` attribute on content\n * - `data-state` on both trigger and content\n * - Click handler on trigger\n *\n * Used directly for standalone collapsible sections, and composed\n * by Accordion which adds coordination (single/multiple mode) and\n * keyboard navigation between triggers.\n */\nexport class Collapsible {\n readonly trigger: HTMLElement;\n readonly content: HTMLElement;\n private _open = false;\n private opts: CollapsibleOptions;\n\n constructor(\n trigger: HTMLElement,\n content: HTMLElement,\n opts: CollapsibleOptions = {},\n ) {\n this.trigger = trigger;\n this.content = content;\n this.opts = opts;\n\n // Generate IDs for ARIA linkage if missing\n const id = uniqueId(\"base-collapsible\");\n if (!trigger.id) trigger.id = `${id}-trigger`;\n if (!content.id) content.id = `${id}-content`;\n\n trigger.setAttribute(\"aria-controls\", content.id);\n content.setAttribute(\"aria-labelledby\", trigger.id);\n content.setAttribute(\"role\", \"region\");\n trigger.setAttribute(\"aria-expanded\", \"false\");\n\n // Click handler\n trigger.addEventListener(\"click\", () => {\n if (\n trigger.hasAttribute(\"disabled\") ||\n trigger.getAttribute(\"aria-disabled\") === \"true\"\n ) {\n return;\n }\n this.toggle();\n });\n }\n\n get isOpen() {\n return this._open;\n }\n\n toggle() {\n if (this._open) {\n this.collapse();\n } else {\n this.expand();\n }\n }\n\n expand() {\n if (this._open) return;\n this._open = true;\n this.trigger.setAttribute(\"aria-expanded\", \"true\");\n this.content.hidden = false;\n this.content.setAttribute(\"data-state\", \"open\");\n this.opts.onToggle?.(true);\n }\n\n collapse() {\n if (!this._open) return;\n this._open = false;\n this.trigger.setAttribute(\"aria-expanded\", \"false\");\n this.content.hidden = true;\n this.content.removeAttribute(\"data-state\");\n this.opts.onToggle?.(false);\n }\n}\n"],"mappings":";AAAA,IAAI,YAAY;AAChB,SAAS,SAAS,QAAgB;AAChC,SAAO,GAAG,MAAM,IAAI,EAAE,SAAS;AACjC;AAqBO,IAAM,cAAN,MAAkB;AAAA,EACd;AAAA,EACA;AAAA,EACD,QAAQ;AAAA,EACR;AAAA,EAER,YACE,SACA,SACA,OAA2B,CAAC,GAC5B;AACA,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,OAAO;AAGZ,UAAM,KAAK,SAAS,kBAAkB;AACtC,QAAI,CAAC,QAAQ,GAAI,SAAQ,KAAK,GAAG,EAAE;AACnC,QAAI,CAAC,QAAQ,GAAI,SAAQ,KAAK,GAAG,EAAE;AAEnC,YAAQ,aAAa,iBAAiB,QAAQ,EAAE;AAChD,YAAQ,aAAa,mBAAmB,QAAQ,EAAE;AAClD,YAAQ,aAAa,QAAQ,QAAQ;AACrC,YAAQ,aAAa,iBAAiB,OAAO;AAG7C,YAAQ,iBAAiB,SAAS,MAAM;AACtC,UACE,QAAQ,aAAa,UAAU,KAC/B,QAAQ,aAAa,eAAe,MAAM,QAC1C;AACA;AAAA,MACF;AACA,WAAK,OAAO;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAS;AACP,QAAI,KAAK,OAAO;AACd,WAAK,SAAS;AAAA,IAChB,OAAO;AACL,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA,EAEA,SAAS;AACP,QAAI,KAAK,MAAO;AAChB,SAAK,QAAQ;AACb,SAAK,QAAQ,aAAa,iBAAiB,MAAM;AACjD,SAAK,QAAQ,SAAS;AACtB,SAAK,QAAQ,aAAa,cAAc,MAAM;AAC9C,SAAK,KAAK,WAAW,IAAI;AAAA,EAC3B;AAAA,EAEA,WAAW;AACT,QAAI,CAAC,KAAK,MAAO;AACjB,SAAK,QAAQ;AACb,SAAK,QAAQ,aAAa,iBAAiB,OAAO;AAClD,SAAK,QAAQ,SAAS;AACtB,SAAK,QAAQ,gBAAgB,YAAY;AACzC,SAAK,KAAK,WAAW,KAAK;AAAA,EAC5B;AACF;","names":[]}
|
package/dist/composite.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/dismiss.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/floating.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/focus-trap.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/inert.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/merge-props.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/portal.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/scroll-lock.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/typeahead.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|