@flux-ui/internals 3.1.0 → 3.1.3
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/composable-DPolUL3R.js.map +1 -1
- package/dist/directive/index.d.ts +2 -2
- package/dist/directive/index.js +1 -1
- package/dist/{directive-Bti3pKwZ.js → directive-CYxYO4lS.js} +2 -2
- package/dist/directive-CYxYO4lS.js.map +1 -0
- package/dist/index-CoMAE6BT.d.ts +10 -0
- package/dist/index-CoMAE6BT.d.ts.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/util-BGzD1ED0.js.map +1 -1
- package/package.json +6 -6
- package/src/directive/focusTrap.ts +4 -2
- package/dist/directive-Bti3pKwZ.js.map +0 -1
- package/dist/index-ZutYFtKs.d.ts +0 -14
- package/dist/index-ZutYFtKs.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composable-DPolUL3R.js","names":["unrefTemplateElement","unrefTemplateElement","unrefTemplateElement","FOCUS_TRAP_LOCKS","unrefTemplateElement","useFocusTrapLock","unrefTemplateElement","getFocusableElements","isActiveElement","FOCUS_TRAP_LOCKS","getFocusableElements","isActiveElement","getBidirectionalFocusElement","getFocusableElement"],"sources":["../src/composable/useCalendar.ts","../src/composable/useCalendarMonthSwitcher.ts","../src/composable/useCalendarTimeGrid.ts","../src/composable/useCalendarYearSwitcher.ts","../src/composable/useKeyboardGrab.ts","../src/composable/useEventListener.ts","../src/composable/useInView.ts","../src/composable/useRemembered.ts","../src/composable/useScrollEdges.ts","../src/composable/useScrollPosition.ts","../src/composable/useFocusTrapLock.ts","../src/composable/useFocusTrapReturn.ts","../src/composable/useFocusTrap.ts","../src/composable/useFocusTrapSubscription.ts","../src/composable/useFocusZone.ts"],"sourcesContent":["import type { DateTime } from 'luxon';\nimport { computed, ref, type Ref, unref } from 'vue';\n\nexport default function (initialDate: DateTime, options?: UseCalendarOptions): UseCalendarReturn {\n const isTransitioningToPast = ref(false);\n const viewDate = ref(initialDate);\n\n const dates = computed<DateTime[]>(() => {\n const dates: DateTime[] = [];\n const month = unref(viewDate).month;\n let current = unref(viewDate).startOf('month');\n\n do {\n dates.push(current);\n current = current.plus({day: 1});\n } while (current.month === month);\n\n const first = dates[0];\n const last = dates[dates.length - 1];\n\n for (let i = 1; i < first.weekday; ++i) {\n dates.unshift(first.minus({day: i}));\n }\n\n for (let i = last.weekday + 1; i <= 7; ++i) {\n dates.push(last.plus({day: i - last.weekday}));\n }\n\n while (dates.length / 7 < 6) {\n const last = dates[dates.length - 1];\n\n for (let i = 1; i <= 7; ++i) {\n dates.push(last.plus({day: i}));\n }\n }\n\n return dates;\n });\n\n const days = computed(() => unref(dates)\n .slice(0, 7)\n .map(d => d.toLocaleString({weekday: options?.weekDayLength ?? 'short'})));\n\n const viewDateNext = computed(() => unref(viewDate).plus({month: 1}));\n const viewDatePrevious = computed(() => unref(viewDate).minus({month: 1}));\n const viewMonth = computed(() => unref(viewDate).toLocaleString({month: options?.monthLength ?? 'long'}));\n const viewYear = computed(() => unref(viewDate).year.toString());\n\n function setViewDate(date: DateTime): void {\n isTransitioningToPast.value = viewDate.value > date;\n viewDate.value = date;\n }\n\n function nextMonth(): void {\n setViewDate(unref(viewDate).plus({month: 1}));\n }\n\n function previousMonth(): void {\n setViewDate(unref(viewDate).minus({month: 1}));\n }\n\n return {\n isTransitioningToPast,\n viewDate,\n viewDateNext,\n viewDatePrevious,\n viewMonth,\n viewYear,\n dates,\n days,\n setViewDate,\n nextMonth,\n previousMonth\n };\n}\n\ntype UseCalendarOptions = {\n readonly monthLength?: 'short' | 'long';\n readonly weekDayLength?: 'short' | 'long';\n};\n\ntype UseCalendarReturn = {\n readonly isTransitioningToPast: Ref<boolean>;\n readonly viewDate: Ref<DateTime>;\n readonly viewDateNext: Ref<DateTime>;\n readonly viewDatePrevious: Ref<DateTime>;\n readonly viewMonth: Ref<string>;\n readonly viewYear: Ref<string>;\n readonly dates: Ref<DateTime[]>;\n readonly days: Ref<string[]>;\n\n setViewDate(date: DateTime): void;\n nextMonth(): void;\n previousMonth(): void;\n};\n","import type { DateTime } from 'luxon';\nimport { computed, type Ref, unref } from 'vue';\n\nexport default function (currentDate: Ref<DateTime>, displayLength: 'short' | 'long'): UseCalendarMonthSwitcherReturn {\n const months = computed(() => {\n const months: MonthEntry[] = [];\n const now = unref(currentDate);\n let current = now.startOf('year');\n\n while (current.month <= 12 && current.year === now.year) {\n months.push({\n date: current,\n label: current.toLocaleString({month: displayLength})\n });\n current = current.plus({months: 1});\n }\n\n return months;\n });\n\n return {\n months\n };\n}\n\ntype MonthEntry = {\n readonly date: DateTime;\n readonly label: string;\n};\n\ntype UseCalendarMonthSwitcherReturn = {\n readonly months: Ref<MonthEntry[]>;\n};\n","import type { DateTime } from 'luxon';\nimport { computed, type ComputedRef, type MaybeRefOrGetter, ref, type Ref, toValue, unref, watch } from 'vue';\n\nexport type UseCalendarTimeGridDayCount = 1 | 2 | 7;\n\nexport type UseCalendarTimeGridReturn = {\n readonly isTransitioningToPast: Ref<boolean>;\n readonly viewDate: Ref<DateTime>;\n readonly viewDates: ComputedRef<DateTime[]>;\n readonly rangeLabel: ComputedRef<string>;\n\n setViewDate(date: DateTime): void;\n next(): void;\n previous(): void;\n};\n\nfunction getAnchor(date: DateTime, dayCount: UseCalendarTimeGridDayCount): DateTime {\n return dayCount === 7 ? date.startOf('week') : date.startOf('day');\n}\n\nfunction stepDuration(dayCount: UseCalendarTimeGridDayCount): { day?: number; week?: number } {\n if (dayCount === 7) {\n return {week: 1};\n }\n\n if (dayCount === 2) {\n return {day: 2};\n }\n\n return {day: 1};\n}\n\nexport default function (\n initialDate: DateTime,\n dayCount: MaybeRefOrGetter<UseCalendarTimeGridDayCount>\n): UseCalendarTimeGridReturn {\n const isTransitioningToPast = ref(false);\n const viewDate = ref<DateTime>(getAnchor(initialDate, toValue(dayCount)));\n\n // Re-anchor on dayCount change (e.g. switching from week to two-days view).\n watch(() => toValue(dayCount), (count) => {\n viewDate.value = getAnchor(unref(viewDate), count);\n });\n\n const viewDates = computed<DateTime[]>(() => {\n const anchor = unref(viewDate);\n const count = toValue(dayCount);\n const out: DateTime[] = [];\n\n for (let i = 0; i < count; ++i) {\n out.push(anchor.plus({day: i}));\n }\n\n return out;\n });\n\n const rangeLabel = computed<string>(() => {\n const dates = unref(viewDates);\n const first = dates[0];\n const last = dates[dates.length - 1];\n const count = toValue(dayCount);\n\n if (count === 1) {\n return first.toLocaleString({weekday: 'long', day: 'numeric', month: 'long', year: 'numeric'});\n }\n\n const sameMonth = first.month === last.month;\n const sameYear = first.year === last.year;\n\n const firstFmt = first.toLocaleString(\n sameMonth && sameYear\n ? {weekday: 'short', day: 'numeric'}\n : {weekday: 'short', day: 'numeric', month: 'short'}\n );\n const lastFmt = last.toLocaleString({weekday: 'short', day: 'numeric', month: 'short', year: sameYear ? undefined : 'numeric'});\n\n return `${firstFmt} – ${lastFmt}`;\n });\n\n function setViewDate(date: DateTime): void {\n const anchor = getAnchor(date, toValue(dayCount));\n isTransitioningToPast.value = unref(viewDate) > anchor;\n viewDate.value = anchor;\n }\n\n function next(): void {\n setViewDate(unref(viewDate).plus(stepDuration(toValue(dayCount))));\n }\n\n function previous(): void {\n setViewDate(unref(viewDate).minus(stepDuration(toValue(dayCount))));\n }\n\n return {\n isTransitioningToPast,\n viewDate,\n viewDates,\n rangeLabel,\n setViewDate,\n next,\n previous\n };\n}\n","import type { DateTime } from 'luxon';\nimport { computed, ref, type Ref, unref, watch } from 'vue';\n\nexport default function (currentDate: Ref<DateTime>, limit: number = 10): UseCalendarYearSwitcherReturn {\n const index = ref(0);\n\n const years = computed(() => {\n const year = unref(currentDate).year;\n const years: number[] = [];\n const start = year - (year % limit) + unref(index) * limit;\n\n for (let i = 0; i < limit; ++i) {\n years.push(start + i);\n }\n\n return years;\n });\n\n function next(): void {\n ++index.value;\n }\n\n function previous(): void {\n --index.value;\n }\n\n watch(currentDate, () => index.value = 0);\n\n return {\n years,\n\n next,\n previous\n };\n}\n\ntype UseCalendarYearSwitcherReturn = {\n readonly years: Ref<number[]>;\n\n next(): void;\n previous(): void;\n};\n","import { computed, type ComputedRef, ref, type Ref, unref } from 'vue';\n\nexport type KeyboardGrabDirection = 'up' | 'down' | 'left' | 'right';\n\nexport type UseKeyboardGrabOptions<TPos> = {\n readonly isDraggable: Ref<boolean>;\n readonly itemId: Ref<string | number | null | undefined>;\n readonly grabbedId: Ref<string | number | null>;\n onGrab(): TPos;\n onMove(direction: KeyboardGrabDirection): void;\n onCommit(origin: TPos): void;\n onCancel(origin: TPos): void;\n announce?(message: string): void;\n};\n\nexport type UseKeyboardGrabReturn = {\n readonly isGrabbed: ComputedRef<boolean>;\n handleKeyDown(evt: KeyboardEvent): void;\n release(): void;\n};\n\nlet liveRegion: HTMLElement | null = null;\n\nfunction ensureLiveRegion(): HTMLElement {\n if (liveRegion) {\n return liveRegion;\n }\n\n if (typeof document === 'undefined') {\n return null as unknown as HTMLElement;\n }\n\n const region = document.createElement('div');\n region.setAttribute('role', 'status');\n region.setAttribute('aria-live', 'polite');\n region.setAttribute('aria-atomic', 'true');\n region.style.cssText = 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0';\n document.body.appendChild(region);\n liveRegion = region;\n return region;\n}\n\nexport function defaultAnnounce(message: string): void {\n const region = ensureLiveRegion();\n\n if (!region) {\n return;\n }\n\n region.textContent = '';\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n}\n\n/**\n * Generic keyboard-grab state machine. Maps Space/Enter/Escape/Arrow keys\n * onto grab/commit/cancel/move callbacks. The actual movement logic is\n * delegated to `onMove` since it depends on the host component's topology.\n */\nexport default function useKeyboardGrab<TPos>(options: UseKeyboardGrabOptions<TPos>): UseKeyboardGrabReturn {\n const origin = ref<TPos | null>(null);\n const announce = options.announce ?? defaultAnnounce;\n\n const isGrabbed = computed<boolean>(() => {\n const id = unref(options.itemId);\n const grabbed = unref(options.grabbedId);\n\n return id != null && grabbed === id;\n });\n\n function release(): void {\n origin.value = null;\n }\n\n function handleKeyDown(evt: KeyboardEvent): void {\n if (!unref(options.isDraggable)) {\n return;\n }\n\n const id = unref(options.itemId);\n\n if (id == null) {\n return;\n }\n\n if (!isGrabbed.value) {\n if (evt.key === ' ' || evt.key === 'Enter') {\n evt.preventDefault();\n origin.value = options.onGrab() as TPos;\n announce('Grabbed, use arrow keys to move');\n }\n\n return;\n }\n\n switch (evt.key) {\n case 'ArrowUp':\n evt.preventDefault();\n options.onMove('up');\n announce('Moved up');\n break;\n\n case 'ArrowDown':\n evt.preventDefault();\n options.onMove('down');\n announce('Moved down');\n break;\n\n case 'ArrowLeft':\n evt.preventDefault();\n options.onMove('left');\n announce('Moved left');\n break;\n\n case 'ArrowRight':\n evt.preventDefault();\n options.onMove('right');\n announce('Moved right');\n break;\n\n case ' ':\n case 'Enter': {\n evt.preventDefault();\n const originValue = origin.value;\n origin.value = null;\n\n if (originValue !== null) {\n options.onCommit(originValue);\n announce('Dropped');\n }\n\n break;\n }\n\n case 'Escape': {\n evt.preventDefault();\n const originValue = origin.value;\n origin.value = null;\n\n if (originValue !== null) {\n options.onCancel(originValue);\n announce('Cancelled');\n }\n\n break;\n }\n }\n }\n\n return {\n isGrabbed,\n handleKeyDown,\n release\n };\n}\n","import { watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function <K extends keyof HTMLElementEventMap>(elementRef: TemplateRef<HTMLElement>, eventName: K, listener: (evt: HTMLElementEventMap[K]) => any, options: AddEventListenerOptions = {passive: true}): void {\n watch(elementRef, (value, _, onCleanup) => {\n const element: EventTarget | null = unrefTemplateElement(elementRef) ?? (value instanceof EventTarget ? value : null);\n\n if (!element) {\n return;\n }\n\n element.addEventListener(eventName, listener as EventListener, options);\n\n onCleanup(() => element.removeEventListener(eventName, listener as EventListener, options));\n }, {immediate: true});\n}\n","import { ref, type Ref, watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function <TElement extends HTMLElement>(containerRef: TemplateRef<TElement>, options: UseInViewOptions = {}): Ref<boolean> {\n const inView = ref(options.initial ?? false);\n\n watch(containerRef, (_, __, onCleanup) => {\n const container = unrefTemplateElement(containerRef);\n\n if (!container) {\n return;\n }\n\n const observer = new IntersectionObserver(entries => inView.value = entries[0]?.isIntersecting ?? false, options);\n observer.observe(container);\n\n onCleanup(() => observer.disconnect());\n }, {immediate: true});\n\n return inView;\n}\n\ntype UseInViewOptions = IntersectionObserverInit & {\n readonly initial?: boolean;\n};\n","import { DateTime } from 'luxon';\nimport { ref, type Ref, watch } from 'vue';\nimport { isSSR } from '../util';\n\nexport default function <T>(key: string, initialValue: T): Ref<T> {\n if (isSSR) {\n return ref(initialValue) as Ref<T>;\n }\n\n const realKey = `flux/${key}`;\n const value = ref<T>(get() ?? initialValue);\n\n function get(): T | null {\n const storedValue = localStorage.getItem(realKey);\n\n if (storedValue === null) {\n return null;\n }\n\n try {\n let storageValue = JSON.parse(storedValue);\n\n if (Array.isArray(storageValue) && storageValue[0] === 'DateTime') {\n storageValue = DateTime.fromISO(storageValue[1]);\n }\n\n return storageValue;\n } catch {\n return null;\n }\n }\n\n watch(value, value => {\n let _value: T = value as T;\n\n if (DateTime.isDateTime(value)) {\n _value = ['DateTime', value.toISO({\n includeOffset: true,\n extendedZone: true\n })] as unknown as T;\n }\n\n try {\n localStorage.setItem(realKey, JSON.stringify(_value));\n } catch {\n // Storage can be unavailable or full (e.g. private browsing); remembering is best-effort.\n }\n });\n\n return value as Ref<T>;\n}\n","import { ref, type Ref, watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function <TElement extends HTMLElement>(elementRef: TemplateRef<TElement>): UseScrollEdgesReturn {\n const isAtStart = ref(true);\n const isAtEnd = ref(true);\n const isAtLeft = ref(true);\n const isAtRight = ref(true);\n\n watch(elementRef, (_, __, onCleanup) => {\n const element = unrefTemplateElement(elementRef);\n\n if (!element) {\n return;\n }\n\n const update = (): void => {\n const {scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth} = element;\n\n isAtStart.value = scrollTop <= 0;\n isAtEnd.value = Math.ceil(scrollTop + clientHeight) >= scrollHeight;\n isAtLeft.value = scrollLeft <= 0;\n isAtRight.value = Math.ceil(scrollLeft + clientWidth) >= scrollWidth;\n };\n\n const resizeObserver = new ResizeObserver(update);\n resizeObserver.observe(element);\n\n for (const child of Array.from(element.children)) {\n resizeObserver.observe(child);\n }\n\n const mutationObserver = new MutationObserver(mutations => {\n for (const mutation of mutations) {\n for (const node of Array.from(mutation.addedNodes)) {\n if (node instanceof Element) {\n resizeObserver.observe(node);\n }\n }\n\n for (const node of Array.from(mutation.removedNodes)) {\n if (node instanceof Element) {\n resizeObserver.unobserve(node);\n }\n }\n }\n\n update();\n });\n\n mutationObserver.observe(element, {childList: true});\n element.addEventListener('scroll', update, {passive: true});\n\n update();\n\n onCleanup(() => {\n element.removeEventListener('scroll', update);\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n });\n }, {immediate: true});\n\n return {\n isAtStart,\n isAtEnd,\n isAtLeft,\n isAtRight\n };\n}\n\nexport type UseScrollEdgesReturn = {\n readonly isAtStart: Ref<boolean>;\n readonly isAtEnd: Ref<boolean>;\n readonly isAtLeft: Ref<boolean>;\n readonly isAtRight: Ref<boolean>;\n};\n","import { ref, type Ref, unref, watch } from 'vue';\nimport { isSSR, type TemplateRef } from '../util';\nimport useEventListener from './useEventListener';\n\nexport default function <TElement extends HTMLElement>(elementRef?: TemplateRef<TElement>): UseScrollPositionReturn {\n const x = ref(0);\n const y = ref(0);\n\n if (isSSR) {\n return {\n x,\n y\n };\n }\n\n const targetRef = elementRef ?? ref(document);\n\n const update = (): void => {\n let element = unref(targetRef);\n\n if (element instanceof Document) {\n element = element.scrollingElement;\n }\n\n x.value = element?.scrollLeft ?? 0;\n y.value = element?.scrollTop ?? 0;\n };\n\n useEventListener(targetRef, 'scroll', update);\n\n watch(targetRef, () => update(), {immediate: true});\n\n return {\n x,\n y\n };\n}\n\nexport type UseScrollPositionReturn = {\n readonly x: Ref<number>;\n readonly y: Ref<number>;\n};\n","import { onMounted, onUnmounted, ref, type Ref, unref } from 'vue';\nimport { FOCUS_TRAP_LOCKS } from '../util';\n\nlet lockId = 0;\n\nexport default function (autoFocus: boolean = false): Ref<boolean> {\n const id = ref(`focus-trap-${++lockId}`);\n const enabled = ref(false);\n\n onMounted(() => FOCUS_TRAP_LOCKS.add(unref(id), isEnabled => enabled.value = isEnabled, autoFocus));\n onUnmounted(() => FOCUS_TRAP_LOCKS.remove(unref(id)));\n\n return enabled;\n}\n","import { type Ref, unref, watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function (containerRef: TemplateRef<HTMLElement>, disabled: Ref<boolean>): void {\n watch(containerRef, (_, __, onCleanup) => {\n const container = unrefTemplateElement(containerRef);\n\n if (!container || unref(disabled)) {\n return;\n }\n\n const previousTarget = document.activeElement as HTMLElement | null;\n\n onCleanup(() => {\n requestAnimationFrame(() => previousTarget?.focus());\n });\n });\n}\n","import { ref, type Ref, unref, watch } from 'vue';\nimport { getFocusableElements, isActiveElement, isSSR, type TemplateRef, unrefTemplateElement, wrapFocus } from '../util';\nimport useFocusTrapLock from './useFocusTrapLock';\nimport useFocusTrapReturn from './useFocusTrapReturn';\n\nexport default function (containerRef: TemplateRef<HTMLElement>, options: UseFocusTrapOptions = {}): void {\n if (isSSR) {\n return;\n }\n\n const {disable = ref(false), disableReturn = ref(false), attachTo = null} = options;\n const enabled = useFocusTrapLock(!unref(disable));\n\n useFocusTrapReturn(containerRef, disableReturn);\n\n watch(containerRef, (_, __, onCleanup) => {\n const container = unrefTemplateElement(containerRef);\n const attach = attachTo || document;\n\n if (enabled.value && container && document.activeElement && !container.contains(document.activeElement) && !container.querySelector('[autofocus]')) {\n wrapFocus(container, document.activeElement, true);\n }\n\n function onFocusIn(evt: FocusEvent): void {\n if (!enabled.value || !container) {\n return;\n }\n\n const newFocusElement = (evt.target as HTMLElement | null) || document.body;\n\n if (container.contains(newFocusElement)) {\n return;\n }\n\n evt.preventDefault();\n evt.stopImmediatePropagation();\n\n wrapFocus(container, newFocusElement);\n }\n\n function onFocusOut(evt: FocusEvent): void {\n if (!enabled.value || !container) {\n return;\n }\n\n if (!evt.relatedTarget || evt.relatedTarget === document.body) {\n evt.preventDefault();\n container.focus();\n }\n\n const newFocusElement = (evt.target as HTMLElement | null) || document.body;\n\n if (container.contains(newFocusElement)) {\n return;\n }\n\n wrapFocus(container, newFocusElement);\n }\n\n attach.addEventListener('focusin', onFocusIn as EventListener, {capture: true});\n attach.addEventListener('focusout', onFocusOut as EventListener, {capture: true});\n\n if (container) {\n const autofocusElement = container.querySelector<HTMLElement>('[autofocus]');\n\n if (autofocusElement) {\n autofocusElement.focus();\n } else {\n const elements = getFocusableElements(container);\n const isActiveIndex = elements.findIndex(elm => isActiveElement(elm) && !elm.hasAttribute('aria-disabled'));\n const notDisabledIndex = elements.findIndex(elm => !elm.hasAttribute('aria-disabled'));\n let element = elements[0];\n\n if (isActiveIndex > -1) {\n element = elements[isActiveIndex];\n } else if (notDisabledIndex > -1) {\n element = elements[notDisabledIndex];\n }\n\n if (element) {\n element.focus();\n } else {\n container.focus();\n }\n }\n }\n\n onCleanup(() => {\n attach.removeEventListener('focusin', onFocusIn as EventListener);\n attach.removeEventListener('focusout', onFocusOut as EventListener);\n });\n }, {immediate: true});\n\n watch(disable, disabled => {\n const container = unrefTemplateElement(containerRef);\n enabled.value = !disabled;\n\n if (disabled || !container) {\n return;\n }\n\n const elements = getFocusableElements(container as HTMLElement);\n\n if (elements.includes(document.activeElement as HTMLElement)) {\n return;\n }\n\n elements[0]?.focus();\n }, {immediate: true});\n}\n\ntype UseFocusTrapOptions = {\n attachTo?: HTMLElement | Document;\n disable?: Ref<boolean>;\n disableReturn?: Ref<boolean>;\n};\n","import { onMounted, onUnmounted, ref } from 'vue';\nimport { FOCUS_TRAP_LOCKS, type FocusTrapListener } from '../util';\n\nexport default function (listener: FocusTrapListener): void {\n const unsubscribe = ref<Function | null>(null);\n\n onMounted(() => unsubscribe.value = FOCUS_TRAP_LOCKS.subscribe(listener));\n onUnmounted(() => unsubscribe.value?.());\n}\n","import { unwrapElement, useMutationObserver } from '@basmilius/common';\nimport { type ComponentPublicInstance, type Ref, watch } from 'vue';\nimport { getBidirectionalFocusElement, getFocusableElement, getFocusableElements, isActiveElement } from '../util';\n\ntype EligibleElement = ComponentPublicInstance | HTMLElement;\n\nexport default function <TElement extends EligibleElement>(containerRef: Ref<TElement>, {cycle = true, direction = 'bidirectional'}: UseFocusZoneOptions = {}): void {\n useMutationObserver(containerRef, () => updateFocus(findInitialIndex(), false), {childList: true, subtree: true});\n\n function findInitialIndex(): number {\n const container = unwrapElement(containerRef);\n const elements = getFocusableElements(container);\n const isActiveIndex = elements.findIndex(elm => isActiveElement(elm) && !elm.hasAttribute('aria-disabled'));\n const notDisabledIndex = elements.findIndex(elm => !elm.hasAttribute('aria-disabled'));\n\n if (isActiveIndex > -1) {\n return isActiveIndex;\n }\n\n if (notDisabledIndex > -1) {\n return notDisabledIndex;\n }\n\n return 0;\n }\n\n function updateFocus(elementIndex: number, doFocus: boolean = true): void {\n const container = unwrapElement(containerRef)!;\n const elements = getFocusableElements(container);\n elements.forEach((elm, index) => elm.tabIndex = index === elementIndex ? 0 : -1);\n\n doFocus && elements[elementIndex]?.focus();\n }\n\n function onKeyDown(evt: KeyboardEvent): void {\n const container = unwrapElement(containerRef)!;\n const elements = getFocusableElements(container);\n\n if (['Enter', ' '].includes(evt.key)) {\n return;\n }\n\n switch (direction) {\n case 'bidirectional':\n handleBidirectionalFocus(evt, container, elements, updateFocus);\n break;\n\n case 'horizontal':\n case 'vertical':\n handleDirectionalFocus(evt, container, cycle, direction, elements, updateFocus);\n break;\n }\n }\n\n watch(containerRef, (_, __, onCleanup) => {\n const container = unwrapElement(containerRef);\n\n if (!container) {\n return;\n }\n\n container.addEventListener('keydown', onKeyDown);\n\n updateFocus(findInitialIndex(), false);\n\n onCleanup(() => container.removeEventListener('keydown', onKeyDown));\n }, {immediate: true});\n}\n\nfunction handleBidirectionalFocus(evt: KeyboardEvent, container: HTMLElement, elements: HTMLElement[], updateFocus: (index: number) => void): void {\n let dir: 'up' | 'down' | 'left' | 'right';\n\n switch (evt.key) {\n case 'ArrowUp':\n dir = 'up';\n break;\n\n case 'ArrowDown':\n dir = 'down';\n break;\n\n case 'ArrowLeft':\n dir = 'left';\n break;\n\n case 'ArrowRight':\n dir = 'right';\n break;\n\n default:\n return;\n }\n\n const element = getBidirectionalFocusElement(container, document.activeElement as HTMLElement, dir);\n\n if (element) {\n updateFocus(elements.indexOf(element));\n }\n\n evt.preventDefault();\n}\n\nfunction handleDirectionalFocus(evt: KeyboardEvent, container: HTMLElement, cycle: boolean, direction: 'horizontal' | 'vertical', elements: HTMLElement[], updateFocus: (index: number) => void): void {\n let dir: number;\n\n if (evt.key === (direction === 'horizontal' ? 'ArrowLeft' : 'ArrowUp')) {\n dir = -1;\n } else if (evt.key === (direction === 'horizontal' ? 'ArrowRight' : 'ArrowDown')) {\n dir = 1;\n } else {\n return;\n }\n\n const element = getFocusableElement(container, dir);\n\n if (element) {\n updateFocus(elements.indexOf(element));\n } else if (cycle) {\n updateFocus(dir === 1 ? 0 : elements.length - 1);\n }\n\n evt.preventDefault();\n}\n\ntype UseFocusZoneOptions = {\n readonly cycle?: boolean;\n readonly direction?: 'bidirectional' | 'horizontal' | 'vertical';\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"composable-DPolUL3R.js","names":["unrefTemplateElement","unrefTemplateElement","unrefTemplateElement","FOCUS_TRAP_LOCKS","unrefTemplateElement","useFocusTrapLock","unrefTemplateElement","getFocusableElements","isActiveElement","FOCUS_TRAP_LOCKS","getFocusableElements","isActiveElement","getBidirectionalFocusElement","getFocusableElement"],"sources":["../src/composable/useCalendar.ts","../src/composable/useCalendarMonthSwitcher.ts","../src/composable/useCalendarTimeGrid.ts","../src/composable/useCalendarYearSwitcher.ts","../src/composable/useKeyboardGrab.ts","../src/composable/useEventListener.ts","../src/composable/useInView.ts","../src/composable/useRemembered.ts","../src/composable/useScrollEdges.ts","../src/composable/useScrollPosition.ts","../src/composable/useFocusTrapLock.ts","../src/composable/useFocusTrapReturn.ts","../src/composable/useFocusTrap.ts","../src/composable/useFocusTrapSubscription.ts","../src/composable/useFocusZone.ts"],"sourcesContent":["import type { DateTime } from 'luxon';\nimport { computed, ref, type Ref, unref } from 'vue';\n\nexport default function (initialDate: DateTime, options?: UseCalendarOptions): UseCalendarReturn {\n const isTransitioningToPast = ref(false);\n const viewDate = ref(initialDate);\n\n const dates = computed<DateTime[]>(() => {\n const dates: DateTime[] = [];\n const month = unref(viewDate).month;\n let current = unref(viewDate).startOf('month');\n\n do {\n dates.push(current);\n current = current.plus({day: 1});\n } while (current.month === month);\n\n const first = dates[0];\n const last = dates[dates.length - 1];\n\n for (let i = 1; i < first.weekday; ++i) {\n dates.unshift(first.minus({day: i}));\n }\n\n for (let i = last.weekday + 1; i <= 7; ++i) {\n dates.push(last.plus({day: i - last.weekday}));\n }\n\n while (dates.length / 7 < 6) {\n const last = dates[dates.length - 1];\n\n for (let i = 1; i <= 7; ++i) {\n dates.push(last.plus({day: i}));\n }\n }\n\n return dates;\n });\n\n const days = computed(() => unref(dates)\n .slice(0, 7)\n .map(d => d.toLocaleString({weekday: options?.weekDayLength ?? 'short'})));\n\n const viewDateNext = computed(() => unref(viewDate).plus({month: 1}));\n const viewDatePrevious = computed(() => unref(viewDate).minus({month: 1}));\n const viewMonth = computed(() => unref(viewDate).toLocaleString({month: options?.monthLength ?? 'long'}));\n const viewYear = computed(() => unref(viewDate).year.toString());\n\n function setViewDate(date: DateTime): void {\n isTransitioningToPast.value = viewDate.value > date;\n viewDate.value = date;\n }\n\n function nextMonth(): void {\n setViewDate(unref(viewDate).plus({month: 1}));\n }\n\n function previousMonth(): void {\n setViewDate(unref(viewDate).minus({month: 1}));\n }\n\n return {\n isTransitioningToPast,\n viewDate,\n viewDateNext,\n viewDatePrevious,\n viewMonth,\n viewYear,\n dates,\n days,\n setViewDate,\n nextMonth,\n previousMonth\n };\n}\n\ntype UseCalendarOptions = {\n readonly monthLength?: 'short' | 'long';\n readonly weekDayLength?: 'short' | 'long';\n};\n\ntype UseCalendarReturn = {\n readonly isTransitioningToPast: Ref<boolean>;\n readonly viewDate: Ref<DateTime>;\n readonly viewDateNext: Ref<DateTime>;\n readonly viewDatePrevious: Ref<DateTime>;\n readonly viewMonth: Ref<string>;\n readonly viewYear: Ref<string>;\n readonly dates: Ref<DateTime[]>;\n readonly days: Ref<string[]>;\n\n setViewDate(date: DateTime): void;\n nextMonth(): void;\n previousMonth(): void;\n};\n","import type { DateTime } from 'luxon';\nimport { computed, type Ref, unref } from 'vue';\n\nexport default function (currentDate: Ref<DateTime>, displayLength: 'short' | 'long'): UseCalendarMonthSwitcherReturn {\n const months = computed(() => {\n const months: MonthEntry[] = [];\n const now = unref(currentDate);\n let current = now.startOf('year');\n\n while (current.month <= 12 && current.year === now.year) {\n months.push({\n date: current,\n label: current.toLocaleString({month: displayLength})\n });\n current = current.plus({months: 1});\n }\n\n return months;\n });\n\n return {\n months\n };\n}\n\ntype MonthEntry = {\n readonly date: DateTime;\n readonly label: string;\n};\n\ntype UseCalendarMonthSwitcherReturn = {\n readonly months: Ref<MonthEntry[]>;\n};\n","import type { DateTime } from 'luxon';\nimport { computed, type ComputedRef, type MaybeRefOrGetter, ref, type Ref, toValue, unref, watch } from 'vue';\n\nexport type UseCalendarTimeGridDayCount = 1 | 2 | 7;\n\nexport type UseCalendarTimeGridReturn = {\n readonly isTransitioningToPast: Ref<boolean>;\n readonly viewDate: Ref<DateTime>;\n readonly viewDates: ComputedRef<DateTime[]>;\n readonly rangeLabel: ComputedRef<string>;\n\n setViewDate(date: DateTime): void;\n next(): void;\n previous(): void;\n};\n\nfunction getAnchor(date: DateTime, dayCount: UseCalendarTimeGridDayCount): DateTime {\n return dayCount === 7 ? date.startOf('week') : date.startOf('day');\n}\n\nfunction stepDuration(dayCount: UseCalendarTimeGridDayCount): { day?: number; week?: number } {\n if (dayCount === 7) {\n return {week: 1};\n }\n\n if (dayCount === 2) {\n return {day: 2};\n }\n\n return {day: 1};\n}\n\nexport default function (\n initialDate: DateTime,\n dayCount: MaybeRefOrGetter<UseCalendarTimeGridDayCount>\n): UseCalendarTimeGridReturn {\n const isTransitioningToPast = ref(false);\n const viewDate = ref<DateTime>(getAnchor(initialDate, toValue(dayCount)));\n\n // Re-anchor on dayCount change (e.g. switching from week to two-days view).\n watch(() => toValue(dayCount), (count) => {\n viewDate.value = getAnchor(unref(viewDate), count);\n });\n\n const viewDates = computed<DateTime[]>(() => {\n const anchor = unref(viewDate);\n const count = toValue(dayCount);\n const out: DateTime[] = [];\n\n for (let i = 0; i < count; ++i) {\n out.push(anchor.plus({day: i}));\n }\n\n return out;\n });\n\n const rangeLabel = computed<string>(() => {\n const dates = unref(viewDates);\n const first = dates[0];\n const last = dates[dates.length - 1];\n const count = toValue(dayCount);\n\n if (count === 1) {\n return first.toLocaleString({weekday: 'long', day: 'numeric', month: 'long', year: 'numeric'});\n }\n\n const sameMonth = first.month === last.month;\n const sameYear = first.year === last.year;\n\n const firstFmt = first.toLocaleString(\n sameMonth && sameYear\n ? {weekday: 'short', day: 'numeric'}\n : {weekday: 'short', day: 'numeric', month: 'short'}\n );\n const lastFmt = last.toLocaleString({weekday: 'short', day: 'numeric', month: 'short', year: sameYear ? undefined : 'numeric'});\n\n return `${firstFmt} – ${lastFmt}`;\n });\n\n function setViewDate(date: DateTime): void {\n const anchor = getAnchor(date, toValue(dayCount));\n isTransitioningToPast.value = unref(viewDate) > anchor;\n viewDate.value = anchor;\n }\n\n function next(): void {\n setViewDate(unref(viewDate).plus(stepDuration(toValue(dayCount))));\n }\n\n function previous(): void {\n setViewDate(unref(viewDate).minus(stepDuration(toValue(dayCount))));\n }\n\n return {\n isTransitioningToPast,\n viewDate,\n viewDates,\n rangeLabel,\n setViewDate,\n next,\n previous\n };\n}\n","import type { DateTime } from 'luxon';\nimport { computed, ref, type Ref, unref, watch } from 'vue';\n\nexport default function (currentDate: Ref<DateTime>, limit: number = 10): UseCalendarYearSwitcherReturn {\n const index = ref(0);\n\n const years = computed(() => {\n const year = unref(currentDate).year;\n const years: number[] = [];\n const start = year - (year % limit) + unref(index) * limit;\n\n for (let i = 0; i < limit; ++i) {\n years.push(start + i);\n }\n\n return years;\n });\n\n function next(): void {\n ++index.value;\n }\n\n function previous(): void {\n --index.value;\n }\n\n watch(currentDate, () => index.value = 0);\n\n return {\n years,\n\n next,\n previous\n };\n}\n\ntype UseCalendarYearSwitcherReturn = {\n readonly years: Ref<number[]>;\n\n next(): void;\n previous(): void;\n};\n","import { computed, type ComputedRef, ref, type Ref, unref } from 'vue';\n\nexport type KeyboardGrabDirection = 'up' | 'down' | 'left' | 'right';\n\nexport type UseKeyboardGrabOptions<TPos> = {\n readonly isDraggable: Ref<boolean>;\n readonly itemId: Ref<string | number | null | undefined>;\n readonly grabbedId: Ref<string | number | null>;\n onGrab(): TPos;\n onMove(direction: KeyboardGrabDirection): void;\n onCommit(origin: TPos): void;\n onCancel(origin: TPos): void;\n announce?(message: string): void;\n};\n\nexport type UseKeyboardGrabReturn = {\n readonly isGrabbed: ComputedRef<boolean>;\n handleKeyDown(evt: KeyboardEvent): void;\n release(): void;\n};\n\nlet liveRegion: HTMLElement | null = null;\n\nfunction ensureLiveRegion(): HTMLElement {\n if (liveRegion) {\n return liveRegion;\n }\n\n if (typeof document === 'undefined') {\n return null as unknown as HTMLElement;\n }\n\n const region = document.createElement('div');\n region.setAttribute('role', 'status');\n region.setAttribute('aria-live', 'polite');\n region.setAttribute('aria-atomic', 'true');\n region.style.cssText = 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0';\n document.body.appendChild(region);\n liveRegion = region;\n return region;\n}\n\nexport function defaultAnnounce(message: string): void {\n const region = ensureLiveRegion();\n\n if (!region) {\n return;\n }\n\n region.textContent = '';\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n}\n\n/**\n * Generic keyboard-grab state machine. Maps Space/Enter/Escape/Arrow keys\n * onto grab/commit/cancel/move callbacks. The actual movement logic is\n * delegated to `onMove` since it depends on the host component's topology.\n */\nexport default function useKeyboardGrab<TPos>(options: UseKeyboardGrabOptions<TPos>): UseKeyboardGrabReturn {\n const origin = ref<TPos | null>(null);\n const announce = options.announce ?? defaultAnnounce;\n\n const isGrabbed = computed<boolean>(() => {\n const id = unref(options.itemId);\n const grabbed = unref(options.grabbedId);\n\n return id != null && grabbed === id;\n });\n\n function release(): void {\n origin.value = null;\n }\n\n function handleKeyDown(evt: KeyboardEvent): void {\n if (!unref(options.isDraggable)) {\n return;\n }\n\n const id = unref(options.itemId);\n\n if (id == null) {\n return;\n }\n\n if (!isGrabbed.value) {\n if (evt.key === ' ' || evt.key === 'Enter') {\n evt.preventDefault();\n origin.value = options.onGrab() as TPos;\n announce('Grabbed, use arrow keys to move');\n }\n\n return;\n }\n\n switch (evt.key) {\n case 'ArrowUp':\n evt.preventDefault();\n options.onMove('up');\n announce('Moved up');\n break;\n\n case 'ArrowDown':\n evt.preventDefault();\n options.onMove('down');\n announce('Moved down');\n break;\n\n case 'ArrowLeft':\n evt.preventDefault();\n options.onMove('left');\n announce('Moved left');\n break;\n\n case 'ArrowRight':\n evt.preventDefault();\n options.onMove('right');\n announce('Moved right');\n break;\n\n case ' ':\n case 'Enter': {\n evt.preventDefault();\n const originValue = origin.value;\n origin.value = null;\n\n if (originValue !== null) {\n options.onCommit(originValue);\n announce('Dropped');\n }\n\n break;\n }\n\n case 'Escape': {\n evt.preventDefault();\n const originValue = origin.value;\n origin.value = null;\n\n if (originValue !== null) {\n options.onCancel(originValue);\n announce('Cancelled');\n }\n\n break;\n }\n }\n }\n\n return {\n isGrabbed,\n handleKeyDown,\n release\n };\n}\n","import { watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function <K extends keyof HTMLElementEventMap>(elementRef: TemplateRef<HTMLElement>, eventName: K, listener: (evt: HTMLElementEventMap[K]) => any, options: AddEventListenerOptions = {passive: true}): void {\n watch(elementRef, (value, _, onCleanup) => {\n const element: EventTarget | null = unrefTemplateElement(elementRef) ?? (value instanceof EventTarget ? value : null);\n\n if (!element) {\n return;\n }\n\n element.addEventListener(eventName, listener as EventListener, options);\n\n onCleanup(() => element.removeEventListener(eventName, listener as EventListener, options));\n }, {immediate: true});\n}\n","import { ref, type Ref, watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function <TElement extends HTMLElement>(containerRef: TemplateRef<TElement>, options: UseInViewOptions = {}): Ref<boolean> {\n const inView = ref(options.initial ?? false);\n\n watch(containerRef, (_, __, onCleanup) => {\n const container = unrefTemplateElement(containerRef);\n\n if (!container) {\n return;\n }\n\n const observer = new IntersectionObserver(entries => inView.value = entries[0]?.isIntersecting ?? false, options);\n observer.observe(container);\n\n onCleanup(() => observer.disconnect());\n }, {immediate: true});\n\n return inView;\n}\n\ntype UseInViewOptions = IntersectionObserverInit & {\n readonly initial?: boolean;\n};\n","import { DateTime } from 'luxon';\nimport { ref, type Ref, watch } from 'vue';\nimport { isSSR } from '../util';\n\nexport default function <T>(key: string, initialValue: T): Ref<T> {\n if (isSSR) {\n return ref(initialValue) as Ref<T>;\n }\n\n const realKey = `flux/${key}`;\n const value = ref<T>(get() ?? initialValue);\n\n function get(): T | null {\n const storedValue = localStorage.getItem(realKey);\n\n if (storedValue === null) {\n return null;\n }\n\n try {\n let storageValue = JSON.parse(storedValue);\n\n if (Array.isArray(storageValue) && storageValue[0] === 'DateTime') {\n storageValue = DateTime.fromISO(storageValue[1]);\n }\n\n return storageValue;\n } catch {\n return null;\n }\n }\n\n watch(value, value => {\n let _value: T = value as T;\n\n if (DateTime.isDateTime(value)) {\n _value = ['DateTime', value.toISO({\n includeOffset: true,\n extendedZone: true\n })] as unknown as T;\n }\n\n try {\n localStorage.setItem(realKey, JSON.stringify(_value));\n } catch {\n // Storage can be unavailable or full (e.g. private browsing); remembering is best-effort.\n }\n });\n\n return value as Ref<T>;\n}\n","import { ref, type Ref, watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function <TElement extends HTMLElement>(elementRef: TemplateRef<TElement>): UseScrollEdgesReturn {\n const isAtStart = ref(true);\n const isAtEnd = ref(true);\n const isAtLeft = ref(true);\n const isAtRight = ref(true);\n\n watch(elementRef, (_, __, onCleanup) => {\n const element = unrefTemplateElement(elementRef);\n\n if (!element) {\n return;\n }\n\n const update = (): void => {\n const {scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth} = element;\n\n isAtStart.value = scrollTop <= 0;\n isAtEnd.value = Math.ceil(scrollTop + clientHeight) >= scrollHeight;\n isAtLeft.value = scrollLeft <= 0;\n isAtRight.value = Math.ceil(scrollLeft + clientWidth) >= scrollWidth;\n };\n\n const resizeObserver = new ResizeObserver(update);\n resizeObserver.observe(element);\n\n for (const child of Array.from(element.children)) {\n resizeObserver.observe(child);\n }\n\n const mutationObserver = new MutationObserver(mutations => {\n for (const mutation of mutations) {\n for (const node of Array.from(mutation.addedNodes)) {\n if (node instanceof Element) {\n resizeObserver.observe(node);\n }\n }\n\n for (const node of Array.from(mutation.removedNodes)) {\n if (node instanceof Element) {\n resizeObserver.unobserve(node);\n }\n }\n }\n\n update();\n });\n\n mutationObserver.observe(element, {childList: true});\n element.addEventListener('scroll', update, {passive: true});\n\n update();\n\n onCleanup(() => {\n element.removeEventListener('scroll', update);\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n });\n }, {immediate: true});\n\n return {\n isAtStart,\n isAtEnd,\n isAtLeft,\n isAtRight\n };\n}\n\nexport type UseScrollEdgesReturn = {\n readonly isAtStart: Ref<boolean>;\n readonly isAtEnd: Ref<boolean>;\n readonly isAtLeft: Ref<boolean>;\n readonly isAtRight: Ref<boolean>;\n};\n","import { ref, type Ref, unref, watch } from 'vue';\nimport { isSSR, type TemplateRef } from '../util';\nimport useEventListener from './useEventListener';\n\nexport default function <TElement extends HTMLElement>(elementRef?: TemplateRef<TElement>): UseScrollPositionReturn {\n const x = ref(0);\n const y = ref(0);\n\n if (isSSR) {\n return {\n x,\n y\n };\n }\n\n const targetRef = elementRef ?? ref(document);\n\n const update = (): void => {\n let element = unref(targetRef);\n\n if (element instanceof Document) {\n element = element.scrollingElement;\n }\n\n x.value = element?.scrollLeft ?? 0;\n y.value = element?.scrollTop ?? 0;\n };\n\n useEventListener(targetRef, 'scroll', update);\n\n watch(targetRef, () => update(), {immediate: true});\n\n return {\n x,\n y\n };\n}\n\nexport type UseScrollPositionReturn = {\n readonly x: Ref<number>;\n readonly y: Ref<number>;\n};\n","import { onMounted, onUnmounted, ref, type Ref, unref } from 'vue';\nimport { FOCUS_TRAP_LOCKS } from '../util';\n\nlet lockId = 0;\n\nexport default function (autoFocus: boolean = false): Ref<boolean> {\n const id = ref(`focus-trap-${++lockId}`);\n const enabled = ref(false);\n\n onMounted(() => FOCUS_TRAP_LOCKS.add(unref(id), isEnabled => enabled.value = isEnabled, autoFocus));\n onUnmounted(() => FOCUS_TRAP_LOCKS.remove(unref(id)));\n\n return enabled;\n}\n","import { type Ref, unref, watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function (containerRef: TemplateRef<HTMLElement>, disabled: Ref<boolean>): void {\n watch(containerRef, (_, __, onCleanup) => {\n const container = unrefTemplateElement(containerRef);\n\n if (!container || unref(disabled)) {\n return;\n }\n\n const previousTarget = document.activeElement as HTMLElement | null;\n\n onCleanup(() => {\n requestAnimationFrame(() => previousTarget?.focus());\n });\n });\n}\n","import { ref, type Ref, unref, watch } from 'vue';\nimport { getFocusableElements, isActiveElement, isSSR, type TemplateRef, unrefTemplateElement, wrapFocus } from '../util';\nimport useFocusTrapLock from './useFocusTrapLock';\nimport useFocusTrapReturn from './useFocusTrapReturn';\n\nexport default function (containerRef: TemplateRef<HTMLElement>, options: UseFocusTrapOptions = {}): void {\n if (isSSR) {\n return;\n }\n\n const {disable = ref(false), disableReturn = ref(false), attachTo = null} = options;\n const enabled = useFocusTrapLock(!unref(disable));\n\n useFocusTrapReturn(containerRef, disableReturn);\n\n watch(containerRef, (_, __, onCleanup) => {\n const container = unrefTemplateElement(containerRef);\n const attach = attachTo || document;\n\n if (enabled.value && container && document.activeElement && !container.contains(document.activeElement) && !container.querySelector('[autofocus]')) {\n wrapFocus(container, document.activeElement, true);\n }\n\n function onFocusIn(evt: FocusEvent): void {\n if (!enabled.value || !container) {\n return;\n }\n\n const newFocusElement = (evt.target as HTMLElement | null) || document.body;\n\n if (container.contains(newFocusElement)) {\n return;\n }\n\n evt.preventDefault();\n evt.stopImmediatePropagation();\n\n wrapFocus(container, newFocusElement);\n }\n\n function onFocusOut(evt: FocusEvent): void {\n if (!enabled.value || !container) {\n return;\n }\n\n if (!evt.relatedTarget || evt.relatedTarget === document.body) {\n evt.preventDefault();\n container.focus();\n }\n\n const newFocusElement = (evt.target as HTMLElement | null) || document.body;\n\n if (container.contains(newFocusElement)) {\n return;\n }\n\n wrapFocus(container, newFocusElement);\n }\n\n attach.addEventListener('focusin', onFocusIn as EventListener, {capture: true});\n attach.addEventListener('focusout', onFocusOut as EventListener, {capture: true});\n\n if (container) {\n const autofocusElement = container.querySelector<HTMLElement>('[autofocus]');\n\n if (autofocusElement) {\n autofocusElement.focus();\n } else {\n const elements = getFocusableElements(container);\n const isActiveIndex = elements.findIndex(elm => isActiveElement(elm) && !elm.hasAttribute('aria-disabled'));\n const notDisabledIndex = elements.findIndex(elm => !elm.hasAttribute('aria-disabled'));\n let element = elements[0];\n\n if (isActiveIndex > -1) {\n element = elements[isActiveIndex];\n } else if (notDisabledIndex > -1) {\n element = elements[notDisabledIndex];\n }\n\n if (element) {\n element.focus();\n } else {\n container.focus();\n }\n }\n }\n\n onCleanup(() => {\n attach.removeEventListener('focusin', onFocusIn as EventListener);\n attach.removeEventListener('focusout', onFocusOut as EventListener);\n });\n }, {immediate: true});\n\n watch(disable, disabled => {\n const container = unrefTemplateElement(containerRef);\n enabled.value = !disabled;\n\n if (disabled || !container) {\n return;\n }\n\n const elements = getFocusableElements(container as HTMLElement);\n\n if (elements.includes(document.activeElement as HTMLElement)) {\n return;\n }\n\n elements[0]?.focus();\n }, {immediate: true});\n}\n\ntype UseFocusTrapOptions = {\n attachTo?: HTMLElement | Document;\n disable?: Ref<boolean>;\n disableReturn?: Ref<boolean>;\n};\n","import { onMounted, onUnmounted, ref } from 'vue';\nimport { FOCUS_TRAP_LOCKS, type FocusTrapListener } from '../util';\n\nexport default function (listener: FocusTrapListener): void {\n const unsubscribe = ref<Function | null>(null);\n\n onMounted(() => unsubscribe.value = FOCUS_TRAP_LOCKS.subscribe(listener));\n onUnmounted(() => unsubscribe.value?.());\n}\n","import { unwrapElement, useMutationObserver } from '@basmilius/common';\nimport { type ComponentPublicInstance, type Ref, watch } from 'vue';\nimport { getBidirectionalFocusElement, getFocusableElement, getFocusableElements, isActiveElement } from '../util';\n\ntype EligibleElement = ComponentPublicInstance | HTMLElement;\n\nexport default function <TElement extends EligibleElement>(containerRef: Ref<TElement>, {cycle = true, direction = 'bidirectional'}: UseFocusZoneOptions = {}): void {\n useMutationObserver(containerRef, () => updateFocus(findInitialIndex(), false), {childList: true, subtree: true});\n\n function findInitialIndex(): number {\n const container = unwrapElement(containerRef);\n const elements = getFocusableElements(container);\n const isActiveIndex = elements.findIndex(elm => isActiveElement(elm) && !elm.hasAttribute('aria-disabled'));\n const notDisabledIndex = elements.findIndex(elm => !elm.hasAttribute('aria-disabled'));\n\n if (isActiveIndex > -1) {\n return isActiveIndex;\n }\n\n if (notDisabledIndex > -1) {\n return notDisabledIndex;\n }\n\n return 0;\n }\n\n function updateFocus(elementIndex: number, doFocus: boolean = true): void {\n const container = unwrapElement(containerRef)!;\n const elements = getFocusableElements(container);\n elements.forEach((elm, index) => elm.tabIndex = index === elementIndex ? 0 : -1);\n\n doFocus && elements[elementIndex]?.focus();\n }\n\n function onKeyDown(evt: KeyboardEvent): void {\n const container = unwrapElement(containerRef)!;\n const elements = getFocusableElements(container);\n\n if (['Enter', ' '].includes(evt.key)) {\n return;\n }\n\n switch (direction) {\n case 'bidirectional':\n handleBidirectionalFocus(evt, container, elements, updateFocus);\n break;\n\n case 'horizontal':\n case 'vertical':\n handleDirectionalFocus(evt, container, cycle, direction, elements, updateFocus);\n break;\n }\n }\n\n watch(containerRef, (_, __, onCleanup) => {\n const container = unwrapElement(containerRef);\n\n if (!container) {\n return;\n }\n\n container.addEventListener('keydown', onKeyDown);\n\n updateFocus(findInitialIndex(), false);\n\n onCleanup(() => container.removeEventListener('keydown', onKeyDown));\n }, {immediate: true});\n}\n\nfunction handleBidirectionalFocus(evt: KeyboardEvent, container: HTMLElement, elements: HTMLElement[], updateFocus: (index: number) => void): void {\n let dir: 'up' | 'down' | 'left' | 'right';\n\n switch (evt.key) {\n case 'ArrowUp':\n dir = 'up';\n break;\n\n case 'ArrowDown':\n dir = 'down';\n break;\n\n case 'ArrowLeft':\n dir = 'left';\n break;\n\n case 'ArrowRight':\n dir = 'right';\n break;\n\n default:\n return;\n }\n\n const element = getBidirectionalFocusElement(container, document.activeElement as HTMLElement, dir);\n\n if (element) {\n updateFocus(elements.indexOf(element));\n }\n\n evt.preventDefault();\n}\n\nfunction handleDirectionalFocus(evt: KeyboardEvent, container: HTMLElement, cycle: boolean, direction: 'horizontal' | 'vertical', elements: HTMLElement[], updateFocus: (index: number) => void): void {\n let dir: number;\n\n if (evt.key === (direction === 'horizontal' ? 'ArrowLeft' : 'ArrowUp')) {\n dir = -1;\n } else if (evt.key === (direction === 'horizontal' ? 'ArrowRight' : 'ArrowDown')) {\n dir = 1;\n } else {\n return;\n }\n\n const element = getFocusableElement(container, dir);\n\n if (element) {\n updateFocus(elements.indexOf(element));\n } else if (cycle) {\n updateFocus(dir === 1 ? 0 : elements.length - 1);\n }\n\n evt.preventDefault();\n}\n\ntype UseFocusZoneOptions = {\n readonly cycle?: boolean;\n readonly direction?: 'bidirectional' | 'horizontal' | 'vertical';\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as
|
|
2
|
-
export {
|
|
1
|
+
import { n as focusTrapDirective, t as _default } from "../index-CoMAE6BT.js";
|
|
2
|
+
export { focusTrapDirective as vFocusTrap, _default as vHeightTransition };
|
package/dist/directive/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e,t}from"../directive-
|
|
1
|
+
import{n as e,t}from"../directive-CYxYO4lS.js";export{e as vFocusTrap,t as vHeightTransition};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{s as e}from"./util-BGzD1ED0.js";var t=class{#e;#t;constructor(e){this.#t=[],this.#e=e,this.onKeyDown=this.onKeyDown.bind(this)}focusElement(e,t=!0){if(this.#t[e]){for(let t=0;t<this.#t.length;++t)this.#t[t].tabIndex=t===e?0:-1;t&&this.#t[e]?.focus()}}register(){this.#t=e(this.#e),this.#e.addEventListener(`keydown`,this.onKeyDown),this.focusElement(0,!1)}unregister(){this.#e.removeEventListener(`keydown`,this.onKeyDown)}onKeyDown(e){let t=this.#e.querySelector(`[tabindex="0"]`),n=this.#t.findIndex(e=>e===t)??0;switch(e.key){case`ArrowUp`:case`ArrowLeft`:this.focusElement(n-1);break;case`ArrowDown`:case`ArrowRight`:this.focusElement(n+1);break;default:return}e.preventDefault(),e.stopPropagation()}}
|
|
2
|
-
//# sourceMappingURL=directive-
|
|
1
|
+
import{s as e}from"./util-BGzD1ED0.js";var t=class{#e;#t;constructor(e){this.#t=[],this.#e=e,this.onKeyDown=this.onKeyDown.bind(this)}focusElement(e,t=!0){if(this.#t[e]){for(let t=0;t<this.#t.length;++t)this.#t[t].tabIndex=t===e?0:-1;t&&this.#t[e]?.focus()}}register(){this.#t=e(this.#e),this.#e.addEventListener(`keydown`,this.onKeyDown),this.focusElement(0,!1)}unregister(){this.#e.removeEventListener(`keydown`,this.onKeyDown)}onKeyDown(e){let t=this.#e.querySelector(`[tabindex="0"]`),n=this.#t.findIndex(e=>e===t)??0;switch(e.key){case`ArrowUp`:case`ArrowLeft`:this.focusElement(n-1);break;case`ArrowDown`:case`ArrowRight`:this.focusElement(n+1);break;default:return}e.preventDefault(),e.stopPropagation()}};const n={beforeUnmount(e){r.get(e)?.unregister(),r.delete(e)},mounted(e){let n=new t(e);n.register(),r.set(e,n)},getSSRProps(){return{}}},r=new WeakMap;var i=class{#e;#t;constructor(e){this.#e=e,this.#t=new MutationObserver(this.onMutation.bind(this))}register(){this.#t.observe(this.#e,{childList:!0,subtree:!0}),requestAnimationFrame(this.onMutation.bind(this))}unregister(){this.#t.disconnect()}onMutation(){let{height:e}=getComputedStyle(this.#e);this.#e.style.height=`auto`;let{height:t}=getComputedStyle(this.#e);this.#e.style.height=e,t!==e&&(getComputedStyle(this.#e),requestAnimationFrame(()=>this.#e.style.height=t))}},a={beforeUnmount(e){o.get(e)?.unregister(),o.delete(e)},mounted(e){let t=new i(e);t.register(),o.set(e,t)},getSSRProps(){return{}}};const o=new WeakMap;export{n,a as t};
|
|
2
|
+
//# sourceMappingURL=directive-CYxYO4lS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directive-CYxYO4lS.js","names":["#root","#elements","getKeyboardFocusableElements","#root","#observer"],"sources":["../src/directive/focusTrap.ts","../src/directive/heightTransition.ts"],"sourcesContent":["import type { Directive } from 'vue';\nimport { getKeyboardFocusableElements } from '../util';\n\nclass FocusTrap {\n readonly #root: HTMLElement;\n #elements: HTMLElement[];\n\n constructor(root: HTMLElement) {\n this.#elements = [];\n this.#root = root;\n\n this.onKeyDown = this.onKeyDown.bind(this);\n }\n\n focusElement(index: number, focus: boolean = true): void {\n if (!this.#elements[index]) {\n return;\n }\n\n for (let i = 0; i < this.#elements.length; ++i) {\n this.#elements[i].tabIndex = i === index ? 0 : -1;\n }\n\n if (focus) {\n this.#elements[index]?.focus();\n }\n }\n\n register(): void {\n this.#elements = getKeyboardFocusableElements(this.#root);\n this.#root.addEventListener('keydown', this.onKeyDown);\n this.focusElement(0, false);\n }\n\n unregister(): void {\n this.#root.removeEventListener('keydown', this.onKeyDown);\n }\n\n onKeyDown(evt: KeyboardEvent): void {\n const currentElement = this.#root.querySelector('[tabindex=\"0\"]');\n const currentIndex = this.#elements.findIndex(elm => elm === currentElement) ?? 0;\n\n switch (evt.key) {\n case 'ArrowUp':\n case 'ArrowLeft':\n this.focusElement(currentIndex - 1);\n break;\n\n case 'ArrowDown':\n case 'ArrowRight':\n this.focusElement(currentIndex + 1);\n break;\n\n default:\n return;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n }\n}\n\nconst focusTrapDirective: Directive = {\n beforeUnmount(elm: HTMLElement): void {\n const focusTrap = focusTraps.get(elm);\n focusTrap?.unregister();\n focusTraps.delete(elm);\n },\n\n mounted(elm: HTMLElement): void {\n const focusTrap = new FocusTrap(elm);\n focusTrap.register();\n focusTraps.set(elm, focusTrap);\n },\n\n getSSRProps(): Record<string, unknown> {\n return {};\n }\n};\n\nexport default focusTrapDirective;\n\nconst focusTraps: WeakMap<HTMLElement, FocusTrap> = new WeakMap();\n","import type { Directive } from 'vue';\n\nclass HeightTransition {\n readonly #root: HTMLElement;\n readonly #observer: MutationObserver;\n\n constructor(root: HTMLElement) {\n this.#root = root;\n this.#observer = new MutationObserver(this.onMutation.bind(this));\n }\n\n register(): void {\n this.#observer.observe(this.#root, {\n childList: true,\n subtree: true\n });\n\n requestAnimationFrame(this.onMutation.bind(this));\n }\n\n unregister(): void {\n this.#observer.disconnect();\n }\n\n onMutation(): void {\n const {height: currentHeight} = getComputedStyle(this.#root);\n this.#root.style.height = 'auto';\n\n const {height} = getComputedStyle(this.#root);\n this.#root.style.height = currentHeight;\n\n if (height === currentHeight) {\n return;\n }\n\n getComputedStyle(this.#root);\n requestAnimationFrame(() => this.#root.style.height = height);\n }\n}\n\nexport default {\n beforeUnmount(elm: HTMLElement): void {\n const heightTransition = heightTransitions.get(elm);\n heightTransition?.unregister();\n heightTransitions.delete(elm);\n },\n\n mounted(elm: HTMLElement): void {\n const heightTransition = new HeightTransition(elm);\n heightTransition.register();\n heightTransitions.set(elm, heightTransition);\n },\n\n getSSRProps(): Record<string, unknown> {\n return {};\n }\n} satisfies Directive as Directive;\n\nconst heightTransitions: WeakMap<HTMLElement, HeightTransition> = new WeakMap();\n"],"mappings":"uCAGA,IAAM,EAAN,KAAgB,CACZ,GACA,GAEA,YAAY,EAAmB,CAC3B,KAAKC,GAAY,CAAC,EAClB,KAAKD,GAAQ,EAEb,KAAK,UAAY,KAAK,UAAU,KAAK,IAAI,CAC7C,CAEA,aAAa,EAAe,EAAiB,GAAY,CAChD,QAAKC,GAAU,GAIpB,KAAK,IAAI,EAAI,EAAG,EAAI,KAAKA,GAAU,OAAQ,EAAE,EACzC,KAAKA,GAAU,EAAE,CAAC,SAAW,IAAM,EAAQ,EAAI,GAG/C,GACA,KAAKA,GAAU,EAAM,EAAE,MAAM,CAJkB,CAMvD,CAEA,UAAiB,CACb,KAAKA,GAAYC,EAA6B,KAAKF,EAAK,EACxD,KAAKA,GAAM,iBAAiB,UAAW,KAAK,SAAS,EACrD,KAAK,aAAa,EAAG,EAAK,CAC9B,CAEA,YAAmB,CACf,KAAKA,GAAM,oBAAoB,UAAW,KAAK,SAAS,CAC5D,CAEA,UAAU,EAA0B,CAChC,IAAM,EAAiB,KAAKA,GAAM,cAAc,gBAAgB,EAC1D,EAAe,KAAKC,GAAU,UAAU,GAAO,IAAQ,CAAc,GAAK,EAEhF,OAAQ,EAAI,IAAZ,CACI,IAAK,UACL,IAAK,YACD,KAAK,aAAa,EAAe,CAAC,EAClC,MAEJ,IAAK,YACL,IAAK,aACD,KAAK,aAAa,EAAe,CAAC,EAClC,MAEJ,QACI,MACR,CAEA,EAAI,eAAe,EACnB,EAAI,gBAAgB,CACxB,CACJ,EAEA,MAAM,EAAgC,CAClC,cAAc,EAAwB,CAElC,EAD6B,IAAI,CACzB,CAAC,EAAE,WAAW,EACtB,EAAW,OAAO,CAAG,CACzB,EAEA,QAAQ,EAAwB,CAC5B,IAAM,EAAY,IAAI,EAAU,CAAG,EACnC,EAAU,SAAS,EACnB,EAAW,IAAI,EAAK,CAAS,CACjC,EAEA,aAAuC,CACnC,MAAO,CAAC,CACZ,CACJ,EAIM,EAA8C,IAAI,QChFxD,IAAM,EAAN,KAAuB,CACnB,GACA,GAEA,YAAY,EAAmB,CAC3B,KAAKE,GAAQ,EACb,KAAKC,GAAY,IAAI,iBAAiB,KAAK,WAAW,KAAK,IAAI,CAAC,CACpE,CAEA,UAAiB,CACb,KAAKA,GAAU,QAAQ,KAAKD,GAAO,CAC/B,UAAW,GACX,QAAS,EACb,CAAC,EAED,sBAAsB,KAAK,WAAW,KAAK,IAAI,CAAC,CACpD,CAEA,YAAmB,CACf,KAAKC,GAAU,WAAW,CAC9B,CAEA,YAAmB,CACf,GAAM,CAAC,OAAQ,GAAiB,iBAAiB,KAAKD,EAAK,EAC3D,KAAKA,GAAM,MAAM,OAAS,OAE1B,GAAM,CAAC,UAAU,iBAAiB,KAAKA,EAAK,EAC5C,KAAKA,GAAM,MAAM,OAAS,EAEtB,IAAW,IAIf,iBAAiB,KAAKA,EAAK,EAC3B,0BAA4B,KAAKA,GAAM,MAAM,OAAS,CAAM,EAChE,CACJ,EAEA,EAAe,CACX,cAAc,EAAwB,CAElC,EAD2C,IAAI,CAChC,CAAC,EAAE,WAAW,EAC7B,EAAkB,OAAO,CAAG,CAChC,EAEA,QAAQ,EAAwB,CAC5B,IAAM,EAAmB,IAAI,EAAiB,CAAG,EACjD,EAAiB,SAAS,EAC1B,EAAkB,IAAI,EAAK,CAAgB,CAC/C,EAEA,aAAuC,CACnC,MAAO,CAAC,CACZ,CACJ,EAEA,MAAM,EAA4D,IAAI"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Directive } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/directive/focusTrap.d.ts
|
|
4
|
+
declare const focusTrapDirective: Directive;
|
|
5
|
+
//#endregion
|
|
6
|
+
//#region src/directive/heightTransition.d.ts
|
|
7
|
+
declare const _default: Directive;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { focusTrapDirective as n, _default as t };
|
|
10
|
+
//# sourceMappingURL=index-CoMAE6BT.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CoMAE6BT.d.ts","names":[],"sources":["../src/directive/focusTrap.ts","../src/directive/heightTransition.ts"],"mappings":";;;cA8DM,kBAAA,EAAoB,SAAA;;;cCtB1B,QAAA,EAgByB,SAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { a as export_default$15, c as export_default$21, d as defaultAnnounce, f as useKeyboardGrab, g as export_default$10, h as export_default$11, i as export_default$16, l as export_default$20, m as export_default$12, n as export_default$18, o as export_default$23, p as export_default$13, r as export_default$17, s as export_default$22, t as export_default$19, u as export_default$14 } from "./index-BXp0Gr5f.js";
|
|
2
2
|
import { _ as flattenVNodeTree, a as export_default$24, c as export_default$9, d as export_default$6, f as export_default$5, g as export_default$1, h as export_default$2, i as export_default$25, l as export_default$8, m as export_default$3, n as FocusTrapListener, o as TemplateElement, p as export_default$4, r as _default, s as TemplateRef, t as isSSR, u as export_default$7, v as export_default } from "./index-Bf3XnnIf.js";
|
|
3
3
|
import { amber100, amber200, amber300, amber400, amber50, amber500, amber600, amber700, amber800, amber900, amber950, blue100, blue200, blue300, blue400, blue50, blue500, blue600, blue700, blue800, blue900, blue950, cyan100, cyan200, cyan300, cyan400, cyan50, cyan500, cyan600, cyan700, cyan800, cyan900, cyan950, emerald100, emerald200, emerald300, emerald400, emerald50, emerald500, emerald600, emerald700, emerald800, emerald900, emerald950, fuchsia100, fuchsia200, fuchsia300, fuchsia400, fuchsia50, fuchsia500, fuchsia600, fuchsia700, fuchsia800, fuchsia900, fuchsia950, gray100, gray200, gray300, gray400, gray50, gray500, gray600, gray700, gray800, gray900, gray950, green100, green200, green300, green400, green50, green500, green600, green700, green800, green900, green950, indigo100, indigo200, indigo300, indigo400, indigo50, indigo500, indigo600, indigo700, indigo800, indigo900, indigo950, lime100, lime200, lime300, lime400, lime50, lime500, lime600, lime700, lime800, lime900, lime950, neutral100, neutral200, neutral300, neutral400, neutral50, neutral500, neutral600, neutral700, neutral800, neutral900, neutral950, orange100, orange200, orange300, orange400, orange50, orange500, orange600, orange700, orange800, orange900, orange950, pink100, pink200, pink300, pink400, pink50, pink500, pink600, pink700, pink800, pink900, pink950, purple100, purple200, purple300, purple400, purple50, purple500, purple600, purple700, purple800, purple900, purple950, red100, red200, red300, red400, red50, red500, red600, red700, red800, red900, red950, rose100, rose200, rose300, rose400, rose50, rose500, rose600, rose700, rose800, rose900, rose950, sky100, sky200, sky300, sky400, sky50, sky500, sky600, sky700, sky800, sky900, sky950, slate100, slate200, slate300, slate400, slate50, slate500, slate600, slate700, slate800, slate900, slate950, stone100, stone200, stone300, stone400, stone50, stone500, stone600, stone700, stone800, stone900, stone950, teal100, teal200, teal300, teal400, teal50, teal500, teal600, teal700, teal800, teal900, teal950, violet100, violet200, violet300, violet400, violet50, violet500, violet600, violet700, violet800, violet900, violet950, yellow100, yellow200, yellow300, yellow400, yellow50, yellow500, yellow600, yellow700, yellow800, yellow900, yellow950, zinc100, zinc200, zinc300, zinc400, zinc50, zinc500, zinc600, zinc700, zinc800, zinc900, zinc950 } from "./data/index.js";
|
|
4
|
-
import { n as
|
|
5
|
-
export { _default as FOCUS_TRAP_LOCKS, type FocusTrapListener, type TemplateElement, type TemplateRef, amber100, amber200, amber300, amber400, amber50, amber500, amber600, amber700, amber800, amber900, amber950, export_default as animationFrameDebounce, blue100, blue200, blue300, blue400, blue50, blue500, blue600, blue700, blue800, blue900, blue950, cyan100, cyan200, cyan300, cyan400, cyan50, cyan500, cyan600, cyan700, cyan800, cyan900, cyan950, defaultAnnounce as defaultKeyboardGrabAnnounce, emerald100, emerald200, emerald300, emerald400, emerald50, emerald500, emerald600, emerald700, emerald800, emerald900, emerald950, flattenVNodeTree, fuchsia100, fuchsia200, fuchsia300, fuchsia400, fuchsia50, fuchsia500, fuchsia600, fuchsia700, fuchsia800, fuchsia900, fuchsia950, export_default$1 as getBidirectionalFocusElement, export_default$2 as getComponentName, export_default$3 as getComponentProps, export_default$4 as getExposedRef, export_default$5 as getFocusableElement, export_default$6 as getFocusableElements, export_default$7 as getKeyboardFocusableElements, gray100, gray200, gray300, gray400, gray50, gray500, gray600, gray700, gray800, gray900, gray950, green100, green200, green300, green400, green50, green500, green600, green700, green800, green900, green950, indigo100, indigo200, indigo300, indigo400, indigo50, indigo500, indigo600, indigo700, indigo800, indigo900, indigo950, export_default$8 as isActiveElement, isSSR, lime100, lime200, lime300, lime400, lime50, lime500, lime600, lime700, lime800, lime900, lime950, neutral100, neutral200, neutral300, neutral400, neutral50, neutral500, neutral600, neutral700, neutral800, neutral900, neutral950, orange100, orange200, orange300, orange400, orange50, orange500, orange600, orange700, orange800, orange900, orange950, pink100, pink200, pink300, pink400, pink50, pink500, pink600, pink700, pink800, pink900, pink950, purple100, purple200, purple300, purple400, purple50, purple500, purple600, purple700, purple800, purple900, purple950, red100, red200, red300, red400, red50, red500, red600, red700, red800, red900, red950, rose100, rose200, rose300, rose400, rose50, rose500, rose600, rose700, rose800, rose900, rose950, sky100, sky200, sky300, sky400, sky50, sky500, sky600, sky700, sky800, sky900, sky950, slate100, slate200, slate300, slate400, slate50, slate500, slate600, slate700, slate800, slate900, slate950, stone100, stone200, stone300, stone400, stone50, stone500, stone600, stone700, stone800, stone900, stone950, teal100, teal200, teal300, teal400, teal50, teal500, teal600, teal700, teal800, teal900, teal950, export_default$9 as unrefTemplateElement, export_default$10 as useCalendar, export_default$11 as useCalendarMonthSwitcher, export_default$12 as useCalendarTimeGrid, export_default$13 as useCalendarYearSwitcher, export_default$14 as useEventListener, export_default$15 as useFocusTrap, export_default$16 as useFocusTrapLock, export_default$17 as useFocusTrapReturn, export_default$18 as useFocusTrapSubscription, export_default$19 as useFocusZone, export_default$20 as useInView, useKeyboardGrab, export_default$21 as useRemembered, export_default$22 as useScrollEdges, export_default$23 as useScrollPosition,
|
|
4
|
+
import { n as focusTrapDirective, t as _default$1 } from "./index-CoMAE6BT.js";
|
|
5
|
+
export { _default as FOCUS_TRAP_LOCKS, type FocusTrapListener, type TemplateElement, type TemplateRef, amber100, amber200, amber300, amber400, amber50, amber500, amber600, amber700, amber800, amber900, amber950, export_default as animationFrameDebounce, blue100, blue200, blue300, blue400, blue50, blue500, blue600, blue700, blue800, blue900, blue950, cyan100, cyan200, cyan300, cyan400, cyan50, cyan500, cyan600, cyan700, cyan800, cyan900, cyan950, defaultAnnounce as defaultKeyboardGrabAnnounce, emerald100, emerald200, emerald300, emerald400, emerald50, emerald500, emerald600, emerald700, emerald800, emerald900, emerald950, flattenVNodeTree, fuchsia100, fuchsia200, fuchsia300, fuchsia400, fuchsia50, fuchsia500, fuchsia600, fuchsia700, fuchsia800, fuchsia900, fuchsia950, export_default$1 as getBidirectionalFocusElement, export_default$2 as getComponentName, export_default$3 as getComponentProps, export_default$4 as getExposedRef, export_default$5 as getFocusableElement, export_default$6 as getFocusableElements, export_default$7 as getKeyboardFocusableElements, gray100, gray200, gray300, gray400, gray50, gray500, gray600, gray700, gray800, gray900, gray950, green100, green200, green300, green400, green50, green500, green600, green700, green800, green900, green950, indigo100, indigo200, indigo300, indigo400, indigo50, indigo500, indigo600, indigo700, indigo800, indigo900, indigo950, export_default$8 as isActiveElement, isSSR, lime100, lime200, lime300, lime400, lime50, lime500, lime600, lime700, lime800, lime900, lime950, neutral100, neutral200, neutral300, neutral400, neutral50, neutral500, neutral600, neutral700, neutral800, neutral900, neutral950, orange100, orange200, orange300, orange400, orange50, orange500, orange600, orange700, orange800, orange900, orange950, pink100, pink200, pink300, pink400, pink50, pink500, pink600, pink700, pink800, pink900, pink950, purple100, purple200, purple300, purple400, purple50, purple500, purple600, purple700, purple800, purple900, purple950, red100, red200, red300, red400, red50, red500, red600, red700, red800, red900, red950, rose100, rose200, rose300, rose400, rose50, rose500, rose600, rose700, rose800, rose900, rose950, sky100, sky200, sky300, sky400, sky50, sky500, sky600, sky700, sky800, sky900, sky950, slate100, slate200, slate300, slate400, slate50, slate500, slate600, slate700, slate800, slate900, slate950, stone100, stone200, stone300, stone400, stone50, stone500, stone600, stone700, stone800, stone900, stone950, teal100, teal200, teal300, teal400, teal50, teal500, teal600, teal700, teal800, teal900, teal950, export_default$9 as unrefTemplateElement, export_default$10 as useCalendar, export_default$11 as useCalendarMonthSwitcher, export_default$12 as useCalendarTimeGrid, export_default$13 as useCalendarYearSwitcher, export_default$14 as useEventListener, export_default$15 as useFocusTrap, export_default$16 as useFocusTrapLock, export_default$17 as useFocusTrapReturn, export_default$18 as useFocusTrapSubscription, export_default$19 as useFocusZone, export_default$20 as useInView, useKeyboardGrab, export_default$21 as useRemembered, export_default$22 as useScrollEdges, export_default$23 as useScrollPosition, focusTrapDirective as vFocusTrap, _default$1 as vHeightTransition, violet100, violet200, violet300, violet400, violet50, violet500, violet600, violet700, violet800, violet900, violet950, export_default$24 as warn, export_default$25 as wrapFocus, yellow100, yellow200, yellow300, yellow400, yellow50, yellow500, yellow600, yellow700, yellow800, yellow900, yellow950, zinc100, zinc200, zinc300, zinc400, zinc50, zinc500, zinc600, zinc700, zinc800, zinc900, zinc950 };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,c as t,d as n,f as r,g as i,h as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,s as p,t as m,u as h}from"./composable-DPolUL3R.js";import{a as g,c as _,d as v,f as y,h as b,i as x,l as S,m as C,n as w,o as T,p as E,r as D,s as O,t as k,u as A}from"./util-BGzD1ED0.js";import{amber100 as j,amber200 as M,amber300 as N,amber400 as P,amber50 as F,amber500 as I,amber600 as L,amber700 as R,amber800 as z,amber900 as B,amber950 as V,blue100 as H,blue200 as U,blue300 as W,blue400 as G,blue50 as K,blue500 as q,blue600 as J,blue700 as Y,blue800 as X,blue900 as Z,blue950 as Q,cyan100 as $,cyan200 as ee,cyan300 as te,cyan400 as ne,cyan50 as re,cyan500 as ie,cyan600 as ae,cyan700 as oe,cyan800 as se,cyan900 as ce,cyan950 as le,emerald100 as ue,emerald200 as de,emerald300 as fe,emerald400 as pe,emerald50 as me,emerald500 as he,emerald600 as ge,emerald700 as _e,emerald800 as ve,emerald900 as ye,emerald950 as be,fuchsia100 as xe,fuchsia200 as Se,fuchsia300 as Ce,fuchsia400 as we,fuchsia50 as Te,fuchsia500 as Ee,fuchsia600 as De,fuchsia700 as Oe,fuchsia800 as ke,fuchsia900 as Ae,fuchsia950 as je,gray100 as Me,gray200 as Ne,gray300 as Pe,gray400 as Fe,gray50 as Ie,gray500 as Le,gray600 as Re,gray700 as ze,gray800 as Be,gray900 as Ve,gray950 as He,green100 as Ue,green200 as We,green300 as Ge,green400 as Ke,green50 as qe,green500 as Je,green600 as Ye,green700 as Xe,green800 as Ze,green900 as Qe,green950 as $e,indigo100 as et,indigo200 as tt,indigo300 as nt,indigo400 as rt,indigo50 as it,indigo500 as at,indigo600 as ot,indigo700 as st,indigo800 as ct,indigo900 as lt,indigo950 as ut,lime100 as dt,lime200 as ft,lime300 as pt,lime400 as mt,lime50 as ht,lime500 as gt,lime600 as _t,lime700 as vt,lime800 as yt,lime900 as bt,lime950 as xt,neutral100 as St,neutral200 as Ct,neutral300 as wt,neutral400 as Tt,neutral50 as Et,neutral500 as Dt,neutral600 as Ot,neutral700 as kt,neutral800 as At,neutral900 as jt,neutral950 as Mt,orange100 as Nt,orange200 as Pt,orange300 as Ft,orange400 as It,orange50 as Lt,orange500 as Rt,orange600 as zt,orange700 as Bt,orange800 as Vt,orange900 as Ht,orange950 as Ut,pink100 as Wt,pink200 as Gt,pink300 as Kt,pink400 as qt,pink50 as Jt,pink500 as Yt,pink600 as Xt,pink700 as Zt,pink800 as Qt,pink900 as $t,pink950 as en,purple100 as tn,purple200 as nn,purple300 as rn,purple400 as an,purple50 as on,purple500 as sn,purple600 as cn,purple700 as ln,purple800 as un,purple900 as dn,purple950 as fn,red100 as pn,red200 as mn,red300 as hn,red400 as gn,red50 as _n,red500 as vn,red600 as yn,red700 as bn,red800 as xn,red900 as Sn,red950 as Cn,rose100 as wn,rose200 as Tn,rose300 as En,rose400 as Dn,rose50 as On,rose500 as kn,rose600 as An,rose700 as jn,rose800 as Mn,rose900 as Nn,rose950 as Pn,sky100 as Fn,sky200 as In,sky300 as Ln,sky400 as Rn,sky50 as zn,sky500 as Bn,sky600 as Vn,sky700 as Hn,sky800 as Un,sky900 as Wn,sky950 as Gn,slate100 as Kn,slate200 as qn,slate300 as Jn,slate400 as Yn,slate50 as Xn,slate500 as Zn,slate600 as Qn,slate700 as $n,slate800 as er,slate900 as tr,slate950 as nr,stone100 as rr,stone200 as ir,stone300 as ar,stone400 as or,stone50 as sr,stone500 as cr,stone600 as lr,stone700 as ur,stone800 as dr,stone900 as fr,stone950 as pr,teal100 as mr,teal200 as hr,teal300 as gr,teal400 as _r,teal50 as vr,teal500 as yr,teal600 as br,teal700 as xr,teal800 as Sr,teal900 as Cr,teal950 as wr,violet100 as Tr,violet200 as Er,violet300 as Dr,violet400 as Or,violet50 as kr,violet500 as Ar,violet600 as jr,violet700 as Mr,violet800 as Nr,violet900 as Pr,violet950 as Fr,yellow100 as Ir,yellow200 as Lr,yellow300 as Rr,yellow400 as zr,yellow50 as Br,yellow500 as Vr,yellow600 as Hr,yellow700 as Ur,yellow800 as Wr,yellow900 as Gr,yellow950 as Kr,zinc100 as qr,zinc200 as Jr,zinc300 as Yr,zinc400 as Xr,zinc50 as Zr,zinc500 as Qr,zinc600 as $r,zinc700 as ei,zinc800 as ti,zinc900 as ni,zinc950 as ri}from"./data/index.js";import{n as ii,t as ai}from"./directive-
|
|
1
|
+
import{a as e,c as t,d as n,f as r,g as i,h as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,s as p,t as m,u as h}from"./composable-DPolUL3R.js";import{a as g,c as _,d as v,f as y,h as b,i as x,l as S,m as C,n as w,o as T,p as E,r as D,s as O,t as k,u as A}from"./util-BGzD1ED0.js";import{amber100 as j,amber200 as M,amber300 as N,amber400 as P,amber50 as F,amber500 as I,amber600 as L,amber700 as R,amber800 as z,amber900 as B,amber950 as V,blue100 as H,blue200 as U,blue300 as W,blue400 as G,blue50 as K,blue500 as q,blue600 as J,blue700 as Y,blue800 as X,blue900 as Z,blue950 as Q,cyan100 as $,cyan200 as ee,cyan300 as te,cyan400 as ne,cyan50 as re,cyan500 as ie,cyan600 as ae,cyan700 as oe,cyan800 as se,cyan900 as ce,cyan950 as le,emerald100 as ue,emerald200 as de,emerald300 as fe,emerald400 as pe,emerald50 as me,emerald500 as he,emerald600 as ge,emerald700 as _e,emerald800 as ve,emerald900 as ye,emerald950 as be,fuchsia100 as xe,fuchsia200 as Se,fuchsia300 as Ce,fuchsia400 as we,fuchsia50 as Te,fuchsia500 as Ee,fuchsia600 as De,fuchsia700 as Oe,fuchsia800 as ke,fuchsia900 as Ae,fuchsia950 as je,gray100 as Me,gray200 as Ne,gray300 as Pe,gray400 as Fe,gray50 as Ie,gray500 as Le,gray600 as Re,gray700 as ze,gray800 as Be,gray900 as Ve,gray950 as He,green100 as Ue,green200 as We,green300 as Ge,green400 as Ke,green50 as qe,green500 as Je,green600 as Ye,green700 as Xe,green800 as Ze,green900 as Qe,green950 as $e,indigo100 as et,indigo200 as tt,indigo300 as nt,indigo400 as rt,indigo50 as it,indigo500 as at,indigo600 as ot,indigo700 as st,indigo800 as ct,indigo900 as lt,indigo950 as ut,lime100 as dt,lime200 as ft,lime300 as pt,lime400 as mt,lime50 as ht,lime500 as gt,lime600 as _t,lime700 as vt,lime800 as yt,lime900 as bt,lime950 as xt,neutral100 as St,neutral200 as Ct,neutral300 as wt,neutral400 as Tt,neutral50 as Et,neutral500 as Dt,neutral600 as Ot,neutral700 as kt,neutral800 as At,neutral900 as jt,neutral950 as Mt,orange100 as Nt,orange200 as Pt,orange300 as Ft,orange400 as It,orange50 as Lt,orange500 as Rt,orange600 as zt,orange700 as Bt,orange800 as Vt,orange900 as Ht,orange950 as Ut,pink100 as Wt,pink200 as Gt,pink300 as Kt,pink400 as qt,pink50 as Jt,pink500 as Yt,pink600 as Xt,pink700 as Zt,pink800 as Qt,pink900 as $t,pink950 as en,purple100 as tn,purple200 as nn,purple300 as rn,purple400 as an,purple50 as on,purple500 as sn,purple600 as cn,purple700 as ln,purple800 as un,purple900 as dn,purple950 as fn,red100 as pn,red200 as mn,red300 as hn,red400 as gn,red50 as _n,red500 as vn,red600 as yn,red700 as bn,red800 as xn,red900 as Sn,red950 as Cn,rose100 as wn,rose200 as Tn,rose300 as En,rose400 as Dn,rose50 as On,rose500 as kn,rose600 as An,rose700 as jn,rose800 as Mn,rose900 as Nn,rose950 as Pn,sky100 as Fn,sky200 as In,sky300 as Ln,sky400 as Rn,sky50 as zn,sky500 as Bn,sky600 as Vn,sky700 as Hn,sky800 as Un,sky900 as Wn,sky950 as Gn,slate100 as Kn,slate200 as qn,slate300 as Jn,slate400 as Yn,slate50 as Xn,slate500 as Zn,slate600 as Qn,slate700 as $n,slate800 as er,slate900 as tr,slate950 as nr,stone100 as rr,stone200 as ir,stone300 as ar,stone400 as or,stone50 as sr,stone500 as cr,stone600 as lr,stone700 as ur,stone800 as dr,stone900 as fr,stone950 as pr,teal100 as mr,teal200 as hr,teal300 as gr,teal400 as _r,teal50 as vr,teal500 as yr,teal600 as br,teal700 as xr,teal800 as Sr,teal900 as Cr,teal950 as wr,violet100 as Tr,violet200 as Er,violet300 as Dr,violet400 as Or,violet50 as kr,violet500 as Ar,violet600 as jr,violet700 as Mr,violet800 as Nr,violet900 as Pr,violet950 as Fr,yellow100 as Ir,yellow200 as Lr,yellow300 as Rr,yellow400 as zr,yellow50 as Br,yellow500 as Vr,yellow600 as Hr,yellow700 as Ur,yellow800 as Wr,yellow900 as Gr,yellow950 as Kr,zinc100 as qr,zinc200 as Jr,zinc300 as Yr,zinc400 as Xr,zinc50 as Zr,zinc500 as Qr,zinc600 as $r,zinc700 as ei,zinc800 as ti,zinc900 as ni,zinc950 as ri}from"./data/index.js";import{n as ii,t as ai}from"./directive-CYxYO4lS.js";export{w as FOCUS_TRAP_LOCKS,j as amber100,M as amber200,N as amber300,P as amber400,F as amber50,I as amber500,L as amber600,R as amber700,z as amber800,B as amber900,V as amber950,b as animationFrameDebounce,H as blue100,U as blue200,W as blue300,G as blue400,K as blue50,q as blue500,J as blue600,Y as blue700,X as blue800,Z as blue900,Q as blue950,$ as cyan100,ee as cyan200,te as cyan300,ne as cyan400,re as cyan50,ie as cyan500,ae as cyan600,oe as cyan700,se as cyan800,ce as cyan900,le as cyan950,n as defaultKeyboardGrabAnnounce,ue as emerald100,de as emerald200,fe as emerald300,pe as emerald400,me as emerald50,he as emerald500,ge as emerald600,_e as emerald700,ve as emerald800,ye as emerald900,be as emerald950,C as flattenVNodeTree,xe as fuchsia100,Se as fuchsia200,Ce as fuchsia300,we as fuchsia400,Te as fuchsia50,Ee as fuchsia500,De as fuchsia600,Oe as fuchsia700,ke as fuchsia800,Ae as fuchsia900,je as fuchsia950,y as getBidirectionalFocusElement,v as getComponentName,A as getComponentProps,S as getExposedRef,_ as getFocusableElement,E as getFocusableElements,O as getKeyboardFocusableElements,Me as gray100,Ne as gray200,Pe as gray300,Fe as gray400,Ie as gray50,Le as gray500,Re as gray600,ze as gray700,Be as gray800,Ve as gray900,He as gray950,Ue as green100,We as green200,Ge as green300,Ke as green400,qe as green50,Je as green500,Ye as green600,Xe as green700,Ze as green800,Qe as green900,$e as green950,et as indigo100,tt as indigo200,nt as indigo300,rt as indigo400,it as indigo50,at as indigo500,ot as indigo600,st as indigo700,ct as indigo800,lt as indigo900,ut as indigo950,T as isActiveElement,k as isSSR,dt as lime100,ft as lime200,pt as lime300,mt as lime400,ht as lime50,gt as lime500,_t as lime600,vt as lime700,yt as lime800,bt as lime900,xt as lime950,St as neutral100,Ct as neutral200,wt as neutral300,Tt as neutral400,Et as neutral50,Dt as neutral500,Ot as neutral600,kt as neutral700,At as neutral800,jt as neutral900,Mt as neutral950,Nt as orange100,Pt as orange200,Ft as orange300,It as orange400,Lt as orange50,Rt as orange500,zt as orange600,Bt as orange700,Vt as orange800,Ht as orange900,Ut as orange950,Wt as pink100,Gt as pink200,Kt as pink300,qt as pink400,Jt as pink50,Yt as pink500,Xt as pink600,Zt as pink700,Qt as pink800,$t as pink900,en as pink950,tn as purple100,nn as purple200,rn as purple300,an as purple400,on as purple50,sn as purple500,cn as purple600,ln as purple700,un as purple800,dn as purple900,fn as purple950,pn as red100,mn as red200,hn as red300,gn as red400,_n as red50,vn as red500,yn as red600,bn as red700,xn as red800,Sn as red900,Cn as red950,wn as rose100,Tn as rose200,En as rose300,Dn as rose400,On as rose50,kn as rose500,An as rose600,jn as rose700,Mn as rose800,Nn as rose900,Pn as rose950,Fn as sky100,In as sky200,Ln as sky300,Rn as sky400,zn as sky50,Bn as sky500,Vn as sky600,Hn as sky700,Un as sky800,Wn as sky900,Gn as sky950,Kn as slate100,qn as slate200,Jn as slate300,Yn as slate400,Xn as slate50,Zn as slate500,Qn as slate600,$n as slate700,er as slate800,tr as slate900,nr as slate950,rr as stone100,ir as stone200,ar as stone300,or as stone400,sr as stone50,cr as stone500,lr as stone600,ur as stone700,dr as stone800,fr as stone900,pr as stone950,mr as teal100,hr as teal200,gr as teal300,_r as teal400,vr as teal50,yr as teal500,br as teal600,xr as teal700,Sr as teal800,Cr as teal900,wr as teal950,g as unrefTemplateElement,i as useCalendar,a as useCalendarMonthSwitcher,c as useCalendarTimeGrid,d as useCalendarYearSwitcher,h as useEventListener,f as useFocusTrap,e as useFocusTrapLock,o as useFocusTrapReturn,l as useFocusTrapSubscription,m as useFocusZone,s as useInView,r as useKeyboardGrab,t as useRemembered,p as useScrollEdges,u as useScrollPosition,ii as vFocusTrap,ai as vHeightTransition,Tr as violet100,Er as violet200,Dr as violet300,Or as violet400,kr as violet50,Ar as violet500,jr as violet600,Mr as violet700,Nr as violet800,Pr as violet900,Fr as violet950,x as warn,D as wrapFocus,Ir as yellow100,Lr as yellow200,Rr as yellow300,zr as yellow400,Br as yellow50,Vr as yellow500,Hr as yellow600,Ur as yellow700,Wr as yellow800,Gr as yellow900,Kr as yellow950,qr as zinc100,Jr as zinc200,Yr as zinc300,Xr as zinc400,Zr as zinc50,Qr as zinc500,$r as zinc600,ei as zinc700,ti as zinc800,ni as zinc900,ri as zinc950};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util-BGzD1ED0.js","names":["getFocusableElements","getFocusableElements","#traps","#listeners"],"sources":["../src/util/animationFrameDebounce.ts","../src/util/flattenVNodeTree.ts","../src/util/getFocusableElements.ts","../src/util/getBidirectionalFocusElement.ts","../src/util/getComponentName.ts","../src/util/getComponentProps.ts","../src/util/getExposedRef.ts","../src/util/getFocusableElement.ts","../src/util/getKeyboardFocusableElements.ts","../src/util/isActiveElement.ts","../src/util/unrefTemplateElement.ts","../src/util/warn.ts","../src/util/wrapFocus.ts","../src/util/focusTrap.ts","../src/util/index.ts"],"sourcesContent":["import type { FluxMaybePromise } from '@flux-ui/types';\n\nexport default function <T extends () => FluxMaybePromise<void>>(fn: T): T {\n if (typeof requestAnimationFrame === 'undefined') {\n return (() => {\n }) as T;\n }\n\n let animationFrame = 0;\n\n return (() => {\n cancelAnimationFrame(animationFrame);\n animationFrame = requestAnimationFrame(fn);\n }) as T;\n}\n","import { Fragment, type VNode } from 'vue';\n\nexport default function flattenVNodeTree(vnodes: VNode[]): VNode[] {\n const flattened: VNode[] = [];\n\n for (const vnode of vnodes) {\n if (vnode.type === Fragment && Array.isArray(vnode.children)) {\n flattened.push(...flattenVNodeTree(vnode.children as VNode[]));\n continue;\n }\n\n flattened.push(vnode);\n }\n\n return flattened;\n}\n","import { isHtmlElement } from '@basmilius/utils';\n\nconst FOCUSABLE_ELEMENTS = [\n 'a[href]:not([disabled])',\n 'button:not([disabled])',\n 'input:not([type=hidden]):not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[contenteditable]:not([contenteditable=false])',\n '[tabindex]:not([disabled]):not([tabindex=\"-1\"])'\n].join(',');\n\nexport default function (container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll(FOCUSABLE_ELEMENTS))\n .filter(isHtmlElement)\n .filter(elm => elm.offsetWidth > 0 || elm.offsetHeight > 0 || elm === document.activeElement);\n}\n","import getFocusableElements from './getFocusableElements';\n\nexport default function (container: HTMLElement, currentElement: HTMLElement, direction: 'up' | 'down' | 'left' | 'right'): HTMLElement | null {\n const elements = getFocusableElements(container);\n const currentIndex = elements.indexOf(currentElement);\n\n if (currentIndex === -1) {\n return null;\n }\n\n const elementInfos = getBidirectionalInfoForElements(elements);\n\n calculateBidirectionalDistances(elementInfos, currentIndex, direction);\n\n let candidate = determineBidirectionalCandidate(currentIndex, direction, elementInfos, elements);\n\n if (!candidate) {\n if (direction === 'up' || direction === 'left') {\n candidate = elements[currentIndex - 1];\n }\n\n if (direction === 'down' || direction === 'right') {\n candidate = elements[currentIndex + 1];\n }\n }\n\n return candidate;\n}\n\nfunction calculateBidirectionalDistances(elementInfos: BidirectionalInfo[], currentIndex: number, direction: 'up' | 'down' | 'left' | 'right'): void {\n const current = elementInfos[currentIndex];\n\n elementInfos.forEach(r => {\n let point = r.center;\n\n switch (direction) {\n case 'up':\n point = {x: point.x, y: r.top + r.height};\n break;\n\n case 'down':\n point = {x: point.x, y: r.top};\n break;\n\n case 'left':\n point = {x: r.left + r.width, y: point.y};\n break;\n\n case 'right':\n point = {x: r.left, y: point.y};\n break;\n }\n\n r.distance = Math.sqrt(Math.pow(current.center.x - point.x, 2) + Math.pow(current.center.y - point.y, 2));\n });\n}\n\nfunction determineBidirectionalCandidate(currentIndex: number, direction: 'up' | 'down' | 'left' | 'right', elementInfos: BidirectionalInfo[], elements: HTMLElement[]): HTMLElement | null {\n const current = elementInfos[currentIndex];\n let distances: number[] = [];\n\n switch (direction) {\n case 'up':\n distances = elementInfos.map((r, index) => index === currentIndex || r.top + r.height > current.top ? Number.MAX_SAFE_INTEGER : r.distance);\n break;\n\n case 'down':\n distances = elementInfos.map((r, index) => index === currentIndex || r.top < current.top + current.height ? Number.MAX_SAFE_INTEGER : r.distance);\n break;\n\n case 'left':\n distances = elementInfos.map((r, index) => index === currentIndex || r.left + r.width > current.left ? Number.MAX_SAFE_INTEGER : r.distance);\n break;\n\n case 'right':\n distances = elementInfos.map((r, index) => index === currentIndex || r.left < current.left + current.width ? Number.MAX_SAFE_INTEGER : r.distance);\n break;\n }\n\n const candidateIndex = distances.indexOf(Math.min(...distances));\n\n if (distances[candidateIndex] !== Number.MAX_SAFE_INTEGER) {\n return elements[candidateIndex];\n }\n\n return null;\n}\n\nfunction getBidirectionalInfoForElements(elements: HTMLElement[]): BidirectionalInfo[] {\n return elements\n .map(elm => elm.getBoundingClientRect())\n .map(rect => ({\n height: rect.height,\n width: rect.width,\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n center: {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2\n },\n distance: 0\n }));\n}\n\ntype BidirectionalInfo = Omit<DOMRect, 'x' | 'y' | 'toJSON'> & {\n center: { x: number; y: number; };\n distance: number;\n};\n","import type { VNode } from 'vue';\n\nexport default function (component: ExtendedVNode): string {\n let name = 'UnknownComponent';\n\n if (component.type && component.type.__name) {\n name = component.type.__name;\n }\n\n return name;\n}\n\ntype ExtendedVNode = {\n readonly type: VNode['type'] & {\n readonly __name?: string;\n };\n};\n","import { camelCase } from 'lodash-es';\n\nexport default function <T extends object>(component: any): T {\n return Object.fromEntries(\n Object.entries(component.props ?? {})\n .map(([key, value]) => [camelCase(key), value])\n ) as T;\n}\n","import type { ComponentInternalInstance, Ref } from 'vue';\n\nexport default function <T>(instance: ComponentInternalInstance, key: string): Ref<T> {\n if (!instance.exposed || !(key in instance.exposed)) {\n throw new Error(`'${key}' was not exposed by the component.`);\n }\n\n return instance.exposed[key];\n}\n","import { isHtmlElement } from '@basmilius/utils';\nimport getFocusableElements from './getFocusableElements';\n\nexport default function (container: HTMLElement, direction: number, activeElement: HTMLElement | undefined = undefined): HTMLElement | undefined {\n const elements = getFocusableElements(container);\n const focusedElement = activeElement || document.activeElement;\n\n if (!focusedElement || !isHtmlElement(focusedElement)) {\n return elements[0] || undefined;\n }\n\n const currentIndex = elements.indexOf(focusedElement);\n\n return elements[currentIndex + direction] || undefined;\n}\n","export default function (root: HTMLElement): HTMLElement[] {\n return Array.from<HTMLElement>(root.querySelectorAll('a[href], button, input, textarea, select, details, [tabindex]:not([tabindex=\"-1\"])'))\n .filter(elm => !elm.hasAttribute('disabled'))\n .filter(elm => !elm.hasAttribute('aria-disabled') || elm.getAttribute('aria-disabled') !== 'true');\n}\n","const ACTIVE_ELEMENT_SELECTOR = '[aria-selected=\"true\"], [aria-checked=\"true\"], [aria-current]';\n\nexport default function (element: HTMLElement): boolean {\n return element.matches(ACTIVE_ELEMENT_SELECTOR);\n}\n","import { isHtmlElement } from '@basmilius/utils';\nimport { type ComponentPublicInstance, type ShallowRef, unref } from 'vue';\n\nexport type TemplateElement<TElement extends HTMLElement> = ComponentPublicInstance<any, any, any, any, any, any, any, any, any, any, any, any, any, any, TElement> | TElement | null;\nexport type TemplateRef<TElement extends HTMLElement> = Readonly<ShallowRef<TemplateElement<TElement>>>;\n\nexport default function <T extends HTMLElement>(ref: TemplateRef<T>): T | null {\n const value = unref(ref);\n\n if (isHtmlElement(value)) {\n return value as T;\n }\n\n return value?.$el;\n}\n","export default function (...data: any): void {\n console.warn('[Flux]', ...data);\n}\n","export default function (elm: HTMLElement, targetElm: Element, forceFirst: boolean = false): void {\n const walker = createFocusWalker(elm);\n const position = targetElm.compareDocumentPosition(elm);\n let wrappedTarget: HTMLElement | null;\n\n if ((position & Node.DOCUMENT_POSITION_PRECEDING) !== 0 || forceFirst) {\n wrappedTarget = walker.firstChild() as HTMLElement | null;\n } else {\n wrappedTarget = walker.lastChild() as HTMLElement | null;\n }\n\n const newFocus = wrappedTarget !== null ? wrappedTarget : elm;\n newFocus.focus();\n}\n\nfunction createFocusWalker(elm: HTMLElement): TreeWalker {\n return document.createTreeWalker(elm, NodeFilter.SHOW_ELEMENT, {\n acceptNode: (node: HTMLButtonElement) => node.tabIndex >= 0 && !node.disabled ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP\n });\n}\n","class FocusTrapLockStack {\n get active(): boolean {\n return this.current?.isEnabled ?? false;\n }\n\n get current(): FocusTrap | null {\n return this.#traps[this.#traps.length - 1] ?? null;\n }\n\n #listeners: FocusTrapListener[] = [];\n #traps: FocusTrap[] = [];\n\n add(id: FocusTrap['id'], setEnabled: FocusTrap['setEnabled'], autoFocus: boolean = true): void {\n const trap: FocusTrap = {id, setEnabled, isEnabled: false};\n\n if (autoFocus) {\n this.current && this.toggle(this.current, false);\n this.#traps.push(trap);\n this.toggle(trap, true);\n } else {\n this.#traps.push(trap);\n }\n\n this.emit();\n }\n\n remove(id: FocusTrap['id']): void {\n const trap = this.#traps.find(t => t.id === id);\n trap && this.toggle(trap, false);\n\n const current = this.current;\n const wasCurrent = current?.id === id;\n this.#traps = this.#traps.filter(t => t.id !== id);\n\n wasCurrent && this.current && this.toggle(this.current, true);\n this.emit();\n }\n\n emit(): void {\n this.#listeners.forEach(listener => listener(this.active, this.#traps));\n }\n\n subscribe(listener: FocusTrapListener): () => void {\n this.#listeners.push(listener);\n listener(this.active, this.#traps);\n\n return () => this.#listeners = this.#listeners.filter(l => l !== listener);\n }\n\n toggle(trap: FocusTrap, isEnabled: boolean): void {\n trap.setEnabled(isEnabled);\n trap.isEnabled = isEnabled;\n }\n}\n\ninterface FocusTrap {\n id: string;\n isEnabled: boolean;\n\n setEnabled(isEnabled: boolean): void;\n}\n\nexport type FocusTrapListener = (isEnabled: boolean, focusTraps: FocusTrap[]) => void;\n\nconst _default: FocusTrapLockStack = new FocusTrapLockStack();\nexport default _default;\n","export { default as animationFrameDebounce } from './animationFrameDebounce';\nexport { default as flattenVNodeTree } from './flattenVNodeTree';\nexport { default as getBidirectionalFocusElement } from './getBidirectionalFocusElement';\nexport { default as getComponentName } from './getComponentName';\nexport { default as getComponentProps } from './getComponentProps';\nexport { default as getExposedRef } from './getExposedRef';\nexport { default as getFocusableElement } from './getFocusableElement';\nexport { default as getFocusableElements } from './getFocusableElements';\nexport { default as getKeyboardFocusableElements } from './getKeyboardFocusableElements';\nexport { default as isActiveElement } from './isActiveElement';\nexport { default as unrefTemplateElement, type TemplateElement, type TemplateRef } from './unrefTemplateElement';\nexport { default as warn } from './warn';\nexport { default as wrapFocus } from './wrapFocus';\n\nexport { default as FOCUS_TRAP_LOCKS, type FocusTrapListener } from './focusTrap';\n\nexport const isSSR: boolean = !globalThis.document;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"util-BGzD1ED0.js","names":["getFocusableElements","getFocusableElements","#traps","#listeners"],"sources":["../src/util/animationFrameDebounce.ts","../src/util/flattenVNodeTree.ts","../src/util/getFocusableElements.ts","../src/util/getBidirectionalFocusElement.ts","../src/util/getComponentName.ts","../src/util/getComponentProps.ts","../src/util/getExposedRef.ts","../src/util/getFocusableElement.ts","../src/util/getKeyboardFocusableElements.ts","../src/util/isActiveElement.ts","../src/util/unrefTemplateElement.ts","../src/util/warn.ts","../src/util/wrapFocus.ts","../src/util/focusTrap.ts","../src/util/index.ts"],"sourcesContent":["import type { FluxMaybePromise } from '@flux-ui/types';\n\nexport default function <T extends () => FluxMaybePromise<void>>(fn: T): T {\n if (typeof requestAnimationFrame === 'undefined') {\n return (() => {\n }) as T;\n }\n\n let animationFrame = 0;\n\n return (() => {\n cancelAnimationFrame(animationFrame);\n animationFrame = requestAnimationFrame(fn);\n }) as T;\n}\n","import { Fragment, type VNode } from 'vue';\n\nexport default function flattenVNodeTree(vnodes: VNode[]): VNode[] {\n const flattened: VNode[] = [];\n\n for (const vnode of vnodes) {\n if (vnode.type === Fragment && Array.isArray(vnode.children)) {\n flattened.push(...flattenVNodeTree(vnode.children as VNode[]));\n continue;\n }\n\n flattened.push(vnode);\n }\n\n return flattened;\n}\n","import { isHtmlElement } from '@basmilius/utils';\n\nconst FOCUSABLE_ELEMENTS = [\n 'a[href]:not([disabled])',\n 'button:not([disabled])',\n 'input:not([type=hidden]):not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[contenteditable]:not([contenteditable=false])',\n '[tabindex]:not([disabled]):not([tabindex=\"-1\"])'\n].join(',');\n\nexport default function (container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll(FOCUSABLE_ELEMENTS))\n .filter(isHtmlElement)\n .filter(elm => elm.offsetWidth > 0 || elm.offsetHeight > 0 || elm === document.activeElement);\n}\n","import getFocusableElements from './getFocusableElements';\n\nexport default function (container: HTMLElement, currentElement: HTMLElement, direction: 'up' | 'down' | 'left' | 'right'): HTMLElement | null {\n const elements = getFocusableElements(container);\n const currentIndex = elements.indexOf(currentElement);\n\n if (currentIndex === -1) {\n return null;\n }\n\n const elementInfos = getBidirectionalInfoForElements(elements);\n\n calculateBidirectionalDistances(elementInfos, currentIndex, direction);\n\n let candidate = determineBidirectionalCandidate(currentIndex, direction, elementInfos, elements);\n\n if (!candidate) {\n if (direction === 'up' || direction === 'left') {\n candidate = elements[currentIndex - 1];\n }\n\n if (direction === 'down' || direction === 'right') {\n candidate = elements[currentIndex + 1];\n }\n }\n\n return candidate;\n}\n\nfunction calculateBidirectionalDistances(elementInfos: BidirectionalInfo[], currentIndex: number, direction: 'up' | 'down' | 'left' | 'right'): void {\n const current = elementInfos[currentIndex];\n\n elementInfos.forEach(r => {\n let point = r.center;\n\n switch (direction) {\n case 'up':\n point = {x: point.x, y: r.top + r.height};\n break;\n\n case 'down':\n point = {x: point.x, y: r.top};\n break;\n\n case 'left':\n point = {x: r.left + r.width, y: point.y};\n break;\n\n case 'right':\n point = {x: r.left, y: point.y};\n break;\n }\n\n r.distance = Math.sqrt(Math.pow(current.center.x - point.x, 2) + Math.pow(current.center.y - point.y, 2));\n });\n}\n\nfunction determineBidirectionalCandidate(currentIndex: number, direction: 'up' | 'down' | 'left' | 'right', elementInfos: BidirectionalInfo[], elements: HTMLElement[]): HTMLElement | null {\n const current = elementInfos[currentIndex];\n let distances: number[] = [];\n\n switch (direction) {\n case 'up':\n distances = elementInfos.map((r, index) => index === currentIndex || r.top + r.height > current.top ? Number.MAX_SAFE_INTEGER : r.distance);\n break;\n\n case 'down':\n distances = elementInfos.map((r, index) => index === currentIndex || r.top < current.top + current.height ? Number.MAX_SAFE_INTEGER : r.distance);\n break;\n\n case 'left':\n distances = elementInfos.map((r, index) => index === currentIndex || r.left + r.width > current.left ? Number.MAX_SAFE_INTEGER : r.distance);\n break;\n\n case 'right':\n distances = elementInfos.map((r, index) => index === currentIndex || r.left < current.left + current.width ? Number.MAX_SAFE_INTEGER : r.distance);\n break;\n }\n\n const candidateIndex = distances.indexOf(Math.min(...distances));\n\n if (distances[candidateIndex] !== Number.MAX_SAFE_INTEGER) {\n return elements[candidateIndex];\n }\n\n return null;\n}\n\nfunction getBidirectionalInfoForElements(elements: HTMLElement[]): BidirectionalInfo[] {\n return elements\n .map(elm => elm.getBoundingClientRect())\n .map(rect => ({\n height: rect.height,\n width: rect.width,\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n center: {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2\n },\n distance: 0\n }));\n}\n\ntype BidirectionalInfo = Omit<DOMRect, 'x' | 'y' | 'toJSON'> & {\n center: { x: number; y: number; };\n distance: number;\n};\n","import type { VNode } from 'vue';\n\nexport default function (component: ExtendedVNode): string {\n let name = 'UnknownComponent';\n\n if (component.type && component.type.__name) {\n name = component.type.__name;\n }\n\n return name;\n}\n\ntype ExtendedVNode = {\n readonly type: VNode['type'] & {\n readonly __name?: string;\n };\n};\n","import { camelCase } from 'lodash-es';\n\nexport default function <T extends object>(component: any): T {\n return Object.fromEntries(\n Object.entries(component.props ?? {})\n .map(([key, value]) => [camelCase(key), value])\n ) as T;\n}\n","import type { ComponentInternalInstance, Ref } from 'vue';\n\nexport default function <T>(instance: ComponentInternalInstance, key: string): Ref<T> {\n if (!instance.exposed || !(key in instance.exposed)) {\n throw new Error(`'${key}' was not exposed by the component.`);\n }\n\n return instance.exposed[key];\n}\n","import { isHtmlElement } from '@basmilius/utils';\nimport getFocusableElements from './getFocusableElements';\n\nexport default function (container: HTMLElement, direction: number, activeElement: HTMLElement | undefined = undefined): HTMLElement | undefined {\n const elements = getFocusableElements(container);\n const focusedElement = activeElement || document.activeElement;\n\n if (!focusedElement || !isHtmlElement(focusedElement)) {\n return elements[0] || undefined;\n }\n\n const currentIndex = elements.indexOf(focusedElement);\n\n return elements[currentIndex + direction] || undefined;\n}\n","export default function (root: HTMLElement): HTMLElement[] {\n return Array.from<HTMLElement>(root.querySelectorAll('a[href], button, input, textarea, select, details, [tabindex]:not([tabindex=\"-1\"])'))\n .filter(elm => !elm.hasAttribute('disabled'))\n .filter(elm => !elm.hasAttribute('aria-disabled') || elm.getAttribute('aria-disabled') !== 'true');\n}\n","const ACTIVE_ELEMENT_SELECTOR = '[aria-selected=\"true\"], [aria-checked=\"true\"], [aria-current]';\n\nexport default function (element: HTMLElement): boolean {\n return element.matches(ACTIVE_ELEMENT_SELECTOR);\n}\n","import { isHtmlElement } from '@basmilius/utils';\nimport { type ComponentPublicInstance, type ShallowRef, unref } from 'vue';\n\nexport type TemplateElement<TElement extends HTMLElement> = ComponentPublicInstance<any, any, any, any, any, any, any, any, any, any, any, any, any, any, TElement> | TElement | null;\nexport type TemplateRef<TElement extends HTMLElement> = Readonly<ShallowRef<TemplateElement<TElement>>>;\n\nexport default function <T extends HTMLElement>(ref: TemplateRef<T>): T | null {\n const value = unref(ref);\n\n if (isHtmlElement(value)) {\n return value as T;\n }\n\n return value?.$el;\n}\n","export default function (...data: any): void {\n console.warn('[Flux]', ...data);\n}\n","export default function (elm: HTMLElement, targetElm: Element, forceFirst: boolean = false): void {\n const walker = createFocusWalker(elm);\n const position = targetElm.compareDocumentPosition(elm);\n let wrappedTarget: HTMLElement | null;\n\n if ((position & Node.DOCUMENT_POSITION_PRECEDING) !== 0 || forceFirst) {\n wrappedTarget = walker.firstChild() as HTMLElement | null;\n } else {\n wrappedTarget = walker.lastChild() as HTMLElement | null;\n }\n\n const newFocus = wrappedTarget !== null ? wrappedTarget : elm;\n newFocus.focus();\n}\n\nfunction createFocusWalker(elm: HTMLElement): TreeWalker {\n return document.createTreeWalker(elm, NodeFilter.SHOW_ELEMENT, {\n acceptNode: (node: HTMLButtonElement) => node.tabIndex >= 0 && !node.disabled ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP\n });\n}\n","class FocusTrapLockStack {\n get active(): boolean {\n return this.current?.isEnabled ?? false;\n }\n\n get current(): FocusTrap | null {\n return this.#traps[this.#traps.length - 1] ?? null;\n }\n\n #listeners: FocusTrapListener[] = [];\n #traps: FocusTrap[] = [];\n\n add(id: FocusTrap['id'], setEnabled: FocusTrap['setEnabled'], autoFocus: boolean = true): void {\n const trap: FocusTrap = {id, setEnabled, isEnabled: false};\n\n if (autoFocus) {\n this.current && this.toggle(this.current, false);\n this.#traps.push(trap);\n this.toggle(trap, true);\n } else {\n this.#traps.push(trap);\n }\n\n this.emit();\n }\n\n remove(id: FocusTrap['id']): void {\n const trap = this.#traps.find(t => t.id === id);\n trap && this.toggle(trap, false);\n\n const current = this.current;\n const wasCurrent = current?.id === id;\n this.#traps = this.#traps.filter(t => t.id !== id);\n\n wasCurrent && this.current && this.toggle(this.current, true);\n this.emit();\n }\n\n emit(): void {\n this.#listeners.forEach(listener => listener(this.active, this.#traps));\n }\n\n subscribe(listener: FocusTrapListener): () => void {\n this.#listeners.push(listener);\n listener(this.active, this.#traps);\n\n return () => this.#listeners = this.#listeners.filter(l => l !== listener);\n }\n\n toggle(trap: FocusTrap, isEnabled: boolean): void {\n trap.setEnabled(isEnabled);\n trap.isEnabled = isEnabled;\n }\n}\n\ninterface FocusTrap {\n id: string;\n isEnabled: boolean;\n\n setEnabled(isEnabled: boolean): void;\n}\n\nexport type FocusTrapListener = (isEnabled: boolean, focusTraps: FocusTrap[]) => void;\n\nconst _default: FocusTrapLockStack = new FocusTrapLockStack();\nexport default _default;\n","export { default as animationFrameDebounce } from './animationFrameDebounce';\nexport { default as flattenVNodeTree } from './flattenVNodeTree';\nexport { default as getBidirectionalFocusElement } from './getBidirectionalFocusElement';\nexport { default as getComponentName } from './getComponentName';\nexport { default as getComponentProps } from './getComponentProps';\nexport { default as getExposedRef } from './getExposedRef';\nexport { default as getFocusableElement } from './getFocusableElement';\nexport { default as getFocusableElements } from './getFocusableElements';\nexport { default as getKeyboardFocusableElements } from './getKeyboardFocusableElements';\nexport { default as isActiveElement } from './isActiveElement';\nexport { default as unrefTemplateElement, type TemplateElement, type TemplateRef } from './unrefTemplateElement';\nexport { default as warn } from './warn';\nexport { default as wrapFocus } from './wrapFocus';\n\nexport { default as FOCUS_TRAP_LOCKS, type FocusTrapListener } from './focusTrap';\n\nexport const isSSR: boolean = !globalThis.document;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flux-ui/internals",
|
|
3
3
|
"description": "Contains internal workings of Flux UI packages.",
|
|
4
|
-
"version": "3.1.
|
|
4
|
+
"version": "3.1.3",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"funding": "https://github.com/sponsors/basmilius",
|
|
@@ -59,18 +59,18 @@
|
|
|
59
59
|
}
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@basmilius/common": "^3.
|
|
63
|
-
"@basmilius/utils": "^3.
|
|
64
|
-
"@flux-ui/types": "3.1.
|
|
62
|
+
"@basmilius/common": "^3.43.0",
|
|
63
|
+
"@basmilius/utils": "^3.43.0",
|
|
64
|
+
"@flux-ui/types": "3.1.3",
|
|
65
65
|
"lodash-es": "^4.18.1"
|
|
66
66
|
},
|
|
67
67
|
"peerDependencies": {
|
|
68
68
|
"luxon": "^3.7.2",
|
|
69
|
-
"vue": "^3.6.0-beta.
|
|
69
|
+
"vue": "^3.6.0-beta.16"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
72
|
"@types/bun": "^1.3.14",
|
|
73
73
|
"@types/luxon": "^3.7.1",
|
|
74
|
-
"tsdown": "^0.22.
|
|
74
|
+
"tsdown": "^0.22.3"
|
|
75
75
|
}
|
|
76
76
|
}
|
|
@@ -60,7 +60,7 @@ class FocusTrap {
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
const focusTrapDirective: Directive = {
|
|
64
64
|
beforeUnmount(elm: HTMLElement): void {
|
|
65
65
|
const focusTrap = focusTraps.get(elm);
|
|
66
66
|
focusTrap?.unregister();
|
|
@@ -76,6 +76,8 @@ export default {
|
|
|
76
76
|
getSSRProps(): Record<string, unknown> {
|
|
77
77
|
return {};
|
|
78
78
|
}
|
|
79
|
-
}
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export default focusTrapDirective;
|
|
80
82
|
|
|
81
83
|
const focusTraps: WeakMap<HTMLElement, FocusTrap> = new WeakMap();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"directive-Bti3pKwZ.js","names":["#root","#elements","getKeyboardFocusableElements","#root","#observer"],"sources":["../src/directive/focusTrap.ts","../src/directive/heightTransition.ts"],"sourcesContent":["import type { Directive } from 'vue';\nimport { getKeyboardFocusableElements } from '../util';\n\nclass FocusTrap {\n readonly #root: HTMLElement;\n #elements: HTMLElement[];\n\n constructor(root: HTMLElement) {\n this.#elements = [];\n this.#root = root;\n\n this.onKeyDown = this.onKeyDown.bind(this);\n }\n\n focusElement(index: number, focus: boolean = true): void {\n if (!this.#elements[index]) {\n return;\n }\n\n for (let i = 0; i < this.#elements.length; ++i) {\n this.#elements[i].tabIndex = i === index ? 0 : -1;\n }\n\n if (focus) {\n this.#elements[index]?.focus();\n }\n }\n\n register(): void {\n this.#elements = getKeyboardFocusableElements(this.#root);\n this.#root.addEventListener('keydown', this.onKeyDown);\n this.focusElement(0, false);\n }\n\n unregister(): void {\n this.#root.removeEventListener('keydown', this.onKeyDown);\n }\n\n onKeyDown(evt: KeyboardEvent): void {\n const currentElement = this.#root.querySelector('[tabindex=\"0\"]');\n const currentIndex = this.#elements.findIndex(elm => elm === currentElement) ?? 0;\n\n switch (evt.key) {\n case 'ArrowUp':\n case 'ArrowLeft':\n this.focusElement(currentIndex - 1);\n break;\n\n case 'ArrowDown':\n case 'ArrowRight':\n this.focusElement(currentIndex + 1);\n break;\n\n default:\n return;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n }\n}\n\nexport default {\n beforeUnmount(elm: HTMLElement): void {\n const focusTrap = focusTraps.get(elm);\n focusTrap?.unregister();\n focusTraps.delete(elm);\n },\n\n mounted(elm: HTMLElement): void {\n const focusTrap = new FocusTrap(elm);\n focusTrap.register();\n focusTraps.set(elm, focusTrap);\n },\n\n getSSRProps(): Record<string, unknown> {\n return {};\n }\n} satisfies Directive;\n\nconst focusTraps: WeakMap<HTMLElement, FocusTrap> = new WeakMap();\n","import type { Directive } from 'vue';\n\nclass HeightTransition {\n readonly #root: HTMLElement;\n readonly #observer: MutationObserver;\n\n constructor(root: HTMLElement) {\n this.#root = root;\n this.#observer = new MutationObserver(this.onMutation.bind(this));\n }\n\n register(): void {\n this.#observer.observe(this.#root, {\n childList: true,\n subtree: true\n });\n\n requestAnimationFrame(this.onMutation.bind(this));\n }\n\n unregister(): void {\n this.#observer.disconnect();\n }\n\n onMutation(): void {\n const {height: currentHeight} = getComputedStyle(this.#root);\n this.#root.style.height = 'auto';\n\n const {height} = getComputedStyle(this.#root);\n this.#root.style.height = currentHeight;\n\n if (height === currentHeight) {\n return;\n }\n\n getComputedStyle(this.#root);\n requestAnimationFrame(() => this.#root.style.height = height);\n }\n}\n\nexport default {\n beforeUnmount(elm: HTMLElement): void {\n const heightTransition = heightTransitions.get(elm);\n heightTransition?.unregister();\n heightTransitions.delete(elm);\n },\n\n mounted(elm: HTMLElement): void {\n const heightTransition = new HeightTransition(elm);\n heightTransition.register();\n heightTransitions.set(elm, heightTransition);\n },\n\n getSSRProps(): Record<string, unknown> {\n return {};\n }\n} satisfies Directive as Directive;\n\nconst heightTransitions: WeakMap<HTMLElement, HeightTransition> = new WeakMap();\n"],"mappings":"uCAGA,IAAM,EAAN,KAAgB,CACZ,GACA,GAEA,YAAY,EAAmB,CAC3B,KAAKC,GAAY,CAAC,EAClB,KAAKD,GAAQ,EAEb,KAAK,UAAY,KAAK,UAAU,KAAK,IAAI,CAC7C,CAEA,aAAa,EAAe,EAAiB,GAAY,CAChD,QAAKC,GAAU,GAIpB,KAAK,IAAI,EAAI,EAAG,EAAI,KAAKA,GAAU,OAAQ,EAAE,EACzC,KAAKA,GAAU,GAAG,SAAW,IAAM,EAAQ,EAAI,GAG/C,GACA,KAAKA,GAAU,IAAQ,MAAM,CAJkB,CAMvD,CAEA,UAAiB,CACb,KAAKA,GAAYC,EAA6B,KAAKF,EAAK,EACxD,KAAKA,GAAM,iBAAiB,UAAW,KAAK,SAAS,EACrD,KAAK,aAAa,EAAG,EAAK,CAC9B,CAEA,YAAmB,CACf,KAAKA,GAAM,oBAAoB,UAAW,KAAK,SAAS,CAC5D,CAEA,UAAU,EAA0B,CAChC,IAAM,EAAiB,KAAKA,GAAM,cAAc,gBAAgB,EAC1D,EAAe,KAAKC,GAAU,UAAU,GAAO,IAAQ,CAAc,GAAK,EAEhF,OAAQ,EAAI,IAAZ,CACI,IAAK,UACL,IAAK,YACD,KAAK,aAAa,EAAe,CAAC,EAClC,MAEJ,IAAK,YACL,IAAK,aACD,KAAK,aAAa,EAAe,CAAC,EAClC,MAEJ,QACI,MACR,CAEA,EAAI,eAAe,EACnB,EAAI,gBAAgB,CACxB,CACJ,EAEA,EAAe,CACX,cAAc,EAAwB,CAElC,EAD6B,IAAI,CACzB,GAAG,WAAW,EACtB,EAAW,OAAO,CAAG,CACzB,EAEA,QAAQ,EAAwB,CAC5B,IAAM,EAAY,IAAI,EAAU,CAAG,EACnC,EAAU,SAAS,EACnB,EAAW,IAAI,EAAK,CAAS,CACjC,EAEA,aAAuC,CACnC,MAAO,CAAC,CACZ,CACJ,EAEA,MAAM,EAA8C,IAAI,QC9ExD,IAAM,EAAN,KAAuB,CACnB,GACA,GAEA,YAAY,EAAmB,CAC3B,KAAKE,GAAQ,EACb,KAAKC,GAAY,IAAI,iBAAiB,KAAK,WAAW,KAAK,IAAI,CAAC,CACpE,CAEA,UAAiB,CACb,KAAKA,GAAU,QAAQ,KAAKD,GAAO,CAC/B,UAAW,GACX,QAAS,EACb,CAAC,EAED,sBAAsB,KAAK,WAAW,KAAK,IAAI,CAAC,CACpD,CAEA,YAAmB,CACf,KAAKC,GAAU,WAAW,CAC9B,CAEA,YAAmB,CACf,GAAM,CAAC,OAAQ,GAAiB,iBAAiB,KAAKD,EAAK,EAC3D,KAAKA,GAAM,MAAM,OAAS,OAE1B,GAAM,CAAC,UAAU,iBAAiB,KAAKA,EAAK,EAC5C,KAAKA,GAAM,MAAM,OAAS,EAEtB,IAAW,IAIf,iBAAiB,KAAKA,EAAK,EAC3B,0BAA4B,KAAKA,GAAM,MAAM,OAAS,CAAM,EAChE,CACJ,EAEA,EAAe,CACX,cAAc,EAAwB,CAElC,EAD2C,IAAI,CAChC,GAAG,WAAW,EAC7B,EAAkB,OAAO,CAAG,CAChC,EAEA,QAAQ,EAAwB,CAC5B,IAAM,EAAmB,IAAI,EAAiB,CAAG,EACjD,EAAiB,SAAS,EAC1B,EAAkB,IAAI,EAAK,CAAgB,CAC/C,EAEA,aAAuC,CACnC,MAAO,CAAC,CACZ,CACJ,EAEA,MAAM,EAA4D,IAAI"}
|
package/dist/index-ZutYFtKs.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Directive } from "vue";
|
|
2
|
-
|
|
3
|
-
//#region src/directive/focusTrap.d.ts
|
|
4
|
-
declare const _default$1: {
|
|
5
|
-
beforeUnmount(elm: HTMLElement): void;
|
|
6
|
-
mounted(elm: HTMLElement): void;
|
|
7
|
-
getSSRProps(): Record<string, unknown>;
|
|
8
|
-
};
|
|
9
|
-
//#endregion
|
|
10
|
-
//#region src/directive/heightTransition.d.ts
|
|
11
|
-
declare const _default: Directive;
|
|
12
|
-
//#endregion
|
|
13
|
-
export { _default$1 as n, _default as t };
|
|
14
|
-
//# sourceMappingURL=index-ZutYFtKs.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-ZutYFtKs.d.ts","names":[],"sources":["../src/directive/focusTrap.ts","../src/directive/heightTransition.ts"],"mappings":";;;cA8DA,UAAA;EACI,aAAA,CAAc,GAAA,EAAK,WAAA;EAMnB,OAAA,CAAQ,GAAA,EAAK,WAAA;EAMb,WAAA,IAAe,MAAA;AAAA;;;cCnCnB,QAAA,EAgByB,SAAA"}
|