@flux-ui/internals 3.0.0-next.67 → 3.0.0-next.69
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composable-5ooZTjm_.js","names":["unrefTemplateElement","unrefTemplateElement","FOCUS_TRAP_LOCKS","unrefTemplateElement","useFocusTrapLock","unrefTemplateElement","getFocusableElements","FOCUS_TRAP_LOCKS","getFocusableElements","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 }\n\n return;\n }\n\n switch (evt.key) {\n case 'ArrowUp':\n evt.preventDefault();\n options.onMove('up');\n break;\n\n case 'ArrowDown':\n evt.preventDefault();\n options.onMove('down');\n break;\n\n case 'ArrowLeft':\n evt.preventDefault();\n options.onMove('left');\n break;\n\n case 'ArrowRight':\n evt.preventDefault();\n options.onMove('right');\n break;\n\n case ' ':\n case 'Enter': {\n evt.preventDefault();\n const o = origin.value;\n origin.value = null;\n\n if (o !== null) {\n options.onCommit(o);\n }\n\n break;\n }\n\n case 'Escape': {\n evt.preventDefault();\n const o = origin.value;\n origin.value = null;\n\n if (o !== null) {\n options.onCancel(o);\n }\n\n break;\n }\n }\n\n // Suppress unused-warning when announce is unused inside the function.\n void announce;\n }\n\n return {\n isGrabbed,\n handleKeyDown,\n release\n };\n}\n","import { watch } from 'vue';\nimport type { TemplateRef } 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, (element: HTMLElement, _, onCleanup) => {\n if (!element) {\n return;\n }\n\n element.addEventListener(eventName, listener, options);\n\n onCleanup(() => element.removeEventListener(eventName, listener));\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';\n\nexport default function <T>(key: string, initialValue: T): Ref<T> {\n const realKey = `flux/${key}`;\n const value = ref<T>(get() ?? initialValue);\n\n function get(): T | null {\n if (realKey in localStorage) {\n let storageValue = JSON.parse(localStorage.getItem(realKey)!);\n\n if (Array.isArray(storageValue) && storageValue[0] === 'DateTime') {\n storageValue = DateTime.fromISO(storageValue[1]);\n }\n\n return storageValue;\n }\n\n return null;\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 localStorage.setItem(realKey, JSON.stringify(_value));\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 } from 'vue';\nimport 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 (!elementRef) {\n elementRef = ref(document);\n }\n\n useEventListener(elementRef, 'scroll', () => {\n let element = unref(elementRef);\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 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, watch } from 'vue';\nimport { getFocusableElements, 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(!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(e => e.classList.contains('is-active'));\n const notDisabledIndex = elements.findIndex(e => !e.hasAttribute('aria-disabled'));\n let element = elements[0];\n\n if (isActiveIndex > -1) {\n element = elements[isActiveIndex];\n }\n\n 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, () => {\n const container = unrefTemplateElement(containerRef);\n enabled.value = !disable;\n\n if (disable || !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 } 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));\n\n function findInitialIndex(): number {\n const container = unwrapElement(containerRef);\n const elements = getFocusableElements(container);\n const isActiveIndex = elements.findIndex(e => e.classList.contains('is-active'));\n const notDisabledIndex = elements.findIndex(e => !e.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-5ooZTjm_.js","names":["unrefTemplateElement","unrefTemplateElement","FOCUS_TRAP_LOCKS","unrefTemplateElement","useFocusTrapLock","unrefTemplateElement","getFocusableElements","FOCUS_TRAP_LOCKS","getFocusableElements","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 }\n\n return;\n }\n\n switch (evt.key) {\n case 'ArrowUp':\n evt.preventDefault();\n options.onMove('up');\n break;\n\n case 'ArrowDown':\n evt.preventDefault();\n options.onMove('down');\n break;\n\n case 'ArrowLeft':\n evt.preventDefault();\n options.onMove('left');\n break;\n\n case 'ArrowRight':\n evt.preventDefault();\n options.onMove('right');\n break;\n\n case ' ':\n case 'Enter': {\n evt.preventDefault();\n const o = origin.value;\n origin.value = null;\n\n if (o !== null) {\n options.onCommit(o);\n }\n\n break;\n }\n\n case 'Escape': {\n evt.preventDefault();\n const o = origin.value;\n origin.value = null;\n\n if (o !== null) {\n options.onCancel(o);\n }\n\n break;\n }\n }\n\n // Suppress unused-warning when announce is unused inside the function.\n void announce;\n }\n\n return {\n isGrabbed,\n handleKeyDown,\n release\n };\n}\n","import { watch } from 'vue';\nimport type { TemplateRef } 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, (element: HTMLElement, _, onCleanup) => {\n if (!element) {\n return;\n }\n\n element.addEventListener(eventName, listener, options);\n\n onCleanup(() => element.removeEventListener(eventName, listener));\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';\n\nexport default function <T>(key: string, initialValue: T): Ref<T> {\n const realKey = `flux/${key}`;\n const value = ref<T>(get() ?? initialValue);\n\n function get(): T | null {\n if (realKey in localStorage) {\n let storageValue = JSON.parse(localStorage.getItem(realKey)!);\n\n if (Array.isArray(storageValue) && storageValue[0] === 'DateTime') {\n storageValue = DateTime.fromISO(storageValue[1]);\n }\n\n return storageValue;\n }\n\n return null;\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 localStorage.setItem(realKey, JSON.stringify(_value));\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 } from 'vue';\nimport 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 (!elementRef) {\n elementRef = ref(document);\n }\n\n useEventListener(elementRef, 'scroll', () => {\n let element = unref(elementRef);\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 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, watch } from 'vue';\nimport { getFocusableElements, 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(!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(e => e.classList.contains('is-active'));\n const notDisabledIndex = elements.findIndex(e => !e.hasAttribute('aria-disabled'));\n let element = elements[0];\n\n if (isActiveIndex > -1) {\n element = elements[isActiveIndex];\n }\n\n 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, () => {\n const container = unrefTemplateElement(containerRef);\n enabled.value = !disable;\n\n if (disable || !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 } 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));\n\n function findInitialIndex(): number {\n const container = unwrapElement(containerRef);\n const elements = getFocusableElements(container);\n const isActiveIndex = elements.findIndex(e => e.classList.contains('is-active'));\n const notDisabledIndex = elements.findIndex(e => !e.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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directive-Dprka-AO.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,
|
|
1
|
+
{"version":3,"file":"directive-Dprka-AO.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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-7w0u9Q_D.d.ts","names":[],"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/useFocusTrap.ts","../src/composable/useFocusTrapLock.ts","../src/composable/useFocusTrapReturn.ts","../src/composable/useFocusTrapSubscription.ts","../src/composable/useFocusZone.ts"],"mappings":";;;;;iBAC+C,iBAAA,CAEtB,WAAA,EAAa,QAAA,EAAU,OAAA,GAAU,kBAAA,GAAqB,iBAAA;AAAA,KAyE1E,kBAAA;EAAA,SACQ,WAAA;EAAA,SACA,aAAA;AAAA;AAAA,KAGR,iBAAA;EAAA,SACQ,qBAAA,EAAuB,GAAA;EAAA,SACvB,QAAA,EAAU,GAAA,CAAI,QAAA;EAAA,SACd,YAAA,EAAc,GAAA,CAAI,QAAA;EAAA,SAClB,gBAAA,EAAkB,GAAA,CAAI,QAAA;EAAA,SACtB,SAAA,EAAW,GAAA;EAAA,SACX,QAAA,EAAU,GAAA;EAAA,SACV,KAAA,EAAO,GAAA,CAAI,QAAA;EAAA,SACX,IAAA,EAAM,GAAA;EAEf,WAAA,CAAY,IAAA,EAAM,QAAA;EAClB,SAAA;EACA,aAAA;AAAA;;;iBC5FsC,iBAAA,CAEjB,WAAA,EAAa,GAAA,CAAI,QAAA,GAAW,aAAA,qBAAkC,8BAAA;AAAA,KAsBlF,UAAA;EAAA,SACQ,IAAA,EAAM,QAAA;EAAA,SACN,KAAA;AAAA;AAAA,KAGR,8BAAA;EAAA,SACQ,MAAA,EAAQ,GAAA,CAAI,UAAA;AAAA;;;KC5Bb,2BAAA;AAAA,KAEA,yBAAA;EAAA,SACC,qBAAA,EAAuB,GAAA;EAAA,SACvB,QAAA,EAAU,GAAA,CAAI,QAAA;EAAA,SACd,SAAA,EAAW,WAAA,CAAY,QAAA;EAAA,SACvB,UAAA,EAAY,WAAA;EAErB,WAAA,CAAY,IAAA,EAAM,QAAA;EAClB,IAAA;EACA,QAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"index-7w0u9Q_D.d.ts","names":[],"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/useFocusTrap.ts","../src/composable/useFocusTrapLock.ts","../src/composable/useFocusTrapReturn.ts","../src/composable/useFocusTrapSubscription.ts","../src/composable/useFocusZone.ts"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-B79OP5Th.d.ts","names":[],"sources":["../src/util/animationFrameDebounce.ts","../src/util/flattenVNodeTree.ts","../src/util/getBidirectionalFocusElement.ts","../src/util/getComponentName.ts","../src/util/getComponentProps.ts","../src/util/getExposedRef.ts","../src/util/getFocusableElement.ts","../src/util/getFocusableElements.ts","../src/util/getKeyboardFocusableElements.ts","../src/util/unrefTemplateElement.ts","../src/util/warn.ts","../src/util/wrapFocus.ts","../src/util/focusTrap.ts","../src/util/index.ts"],"mappings":";;;;iBAAsC,iBAAA,iBAEG,gBAAA,OAAA,CAAwB,EAAA,EAAI,CAAA,GAAI,CAAA;;;iBCFpC,iBAAA,CAEZ,MAAA,EAAQ,KAAA,KAAU,KAAA;;;kCCAlB,SAAA,EAAW,WAAA,EAAa,cAAA,EAAgB,WAAA,EAAa,SAAA,qCAA8C,WAAA;;;iBCFjG,gBAAA,CAEF,
|
|
1
|
+
{"version":3,"file":"index-B79OP5Th.d.ts","names":[],"sources":["../src/util/animationFrameDebounce.ts","../src/util/flattenVNodeTree.ts","../src/util/getBidirectionalFocusElement.ts","../src/util/getComponentName.ts","../src/util/getComponentProps.ts","../src/util/getExposedRef.ts","../src/util/getFocusableElement.ts","../src/util/getFocusableElements.ts","../src/util/getKeyboardFocusableElements.ts","../src/util/unrefTemplateElement.ts","../src/util/warn.ts","../src/util/wrapFocus.ts","../src/util/focusTrap.ts","../src/util/index.ts"],"mappings":";;;;iBAAsC,iBAAA,iBAEG,gBAAA,OAAA,CAAwB,EAAA,EAAI,CAAA,GAAI,CAAA;;;iBCFpC,iBAAA,CAEZ,MAAA,EAAQ,KAAA,KAAU,KAAA;;;kCCAlB,SAAA,EAAW,WAAA,EAAa,cAAA,EAAgB,WAAA,EAAa,SAAA,qCAA8C,WAAA;;;iBCFjG,gBAAA,CAEF,SAAW,EAAA,aAAA;AAAA,KAU/B,aAAA;EAAA,SACQ,IAAA,EAAM,KAAA;IAAA,SACF,MAAA;EAAA;AAAA;;;oDCZ0B,SAAA,QAAiB,CAAA;;;iBCFR,gBAAA,GAAA,CAExB,QAAA,EAAU,yBAAA,EAA2B,GAAA,WAAc,GAAA,CAAI,CAAA;;;kCCC1D,SAAA,EAAW,WAAA,EAAa,SAAA,UAAmB,aAAA,GAAe,WAAA,eAAsC,WAAA;;;kCCQhG,SAAA,EAAW,WAAA,GAAc,WAAA;;;kCCXzB,IAAA,EAAM,WAAA,GAAc,WAAA;;;KCGjC,eAAA,kBAAiC,WAAA,IAAe,uBAAA,uEAA8F,QAAA,IAAY,QAAA;AAAA,KAC1J,WAAA,kBAA6B,WAAA,IAAe,QAAA,CAAS,UAAA,CAAW,eAAA,CAAgB,QAAA;AAAA,iBAAA,gBAAA,WAEzD,WAAA,CAAA,CAAa,GAAA,EAAK,WAAA,CAAY,CAAA,IAAK,CAAA;;;qCCN1C,IAAA;;;gCCAH,GAAA,EAAK,WAAA,EAAa,SAAA,EAAW,OAAA,EAAS,UAAA;;;cCAzD,kBAAA;EAAA;MACE,MAAA,CAAA;EAAA,IAIA,OAAA,CAAA,GAAW,SAAA;EAOf,GAAA,CAAI,EAAA,EAAI,SAAA,QAAiB,UAAA,EAAY,SAAA,gBAAyB,SAAA;EAW9D,MAAA,CAAO,EAAA,EAAI,SAAA;EAYX,IAAA,CAAA;EAIA,SAAA,CAAU,QAAA,EAAU,iBAAA;EAOpB,MAAA,CAAO,IAAA,EAAM,SAAA,EAAW,SAAA;AAAA;AAAA,UAMlB,SAAA;EACN,EAAA;EACA,SAAA;EAEA,UAAA,CAAW,SAAA;AAAA;AAAA,KAGH,iBAAA,IAAqB,SAAA,WAAoB,UAAA,EAAY,SAAA;AAAA,cAE3D,QAAA,EAAU,kBAAA;;;cC9CH,KAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util-CwaOsSvo.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/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 (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(...(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:not([disabled])',\n 'button:not([disabled])',\n 'input[type=checkbox]:not([disabled])',\n 'input[type=radio]:not([disabled])',\n 'input[type=text]:not([disabled])',\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 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') || elm.getAttribute('disabled') !== 'true')\n .filter(elm => !elm.hasAttribute('aria-disabled') || elm.getAttribute('aria-disabled') !== 'true');\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 || 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: true};\n this.current && this.toggle(this.current, false);\n this.#traps.push(trap);\n\n if (autoFocus) {\n this.toggle(trap, true);\n this.emit();\n }\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 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-CwaOsSvo.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/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 (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(...(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:not([disabled])',\n 'button:not([disabled])',\n 'input[type=checkbox]:not([disabled])',\n 'input[type=radio]:not([disabled])',\n 'input[type=text]:not([disabled])',\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 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') || elm.getAttribute('disabled') !== 'true')\n .filter(elm => !elm.hasAttribute('aria-disabled') || elm.getAttribute('aria-disabled') !== 'true');\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 || 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: true};\n this.current && this.toggle(this.current, false);\n this.#traps.push(trap);\n\n if (autoFocus) {\n this.toggle(trap, true);\n this.emit();\n }\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 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.0.0-next.
|
|
4
|
+
"version": "3.0.0-next.69",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"funding": "https://github.com/sponsors/basmilius",
|
|
@@ -59,17 +59,17 @@
|
|
|
59
59
|
}
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@basmilius/common": "^3.
|
|
63
|
-
"@basmilius/utils": "^3.
|
|
64
|
-
"@flux-ui/types": "3.0.0-next.
|
|
62
|
+
"@basmilius/common": "^3.33.0",
|
|
63
|
+
"@basmilius/utils": "^3.33.0",
|
|
64
|
+
"@flux-ui/types": "3.0.0-next.69",
|
|
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.12"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
|
-
"@types/bun": "^1.3.
|
|
72
|
+
"@types/bun": "^1.3.14",
|
|
73
73
|
"@types/luxon": "^3.7.1",
|
|
74
74
|
"tsdown": "^0.22.0"
|
|
75
75
|
}
|