@iris-ui-kit/vue 0.2.25 → 0.2.26
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/admin.cjs +390 -170
- package/dist/admin.cjs.map +1 -1
- package/dist/admin.d.cts +3 -2
- package/dist/admin.d.ts +3 -2
- package/dist/admin.js +2 -2
- package/dist/behaviors.cjs +49 -0
- package/dist/behaviors.cjs.map +1 -1
- package/dist/behaviors.d.cts +57 -1
- package/dist/behaviors.d.ts +57 -1
- package/dist/behaviors.js +1 -1
- package/dist/{chunk-WL67XCH5.js → chunk-IN3DQ55U.js} +2 -2
- package/dist/chunk-IN3DQ55U.js.map +1 -0
- package/dist/{chunk-7L6UB6MD.js → chunk-IOMKC5OI.js} +53 -5
- package/dist/chunk-IOMKC5OI.js.map +1 -0
- package/dist/{chunk-3FJUCHCC.js → chunk-IPR5JAVF.js} +11 -3
- package/dist/chunk-IPR5JAVF.js.map +1 -0
- package/dist/{chunk-BEPH6PPL.js → chunk-LWABTQCB.js} +57 -37
- package/dist/chunk-LWABTQCB.js.map +1 -0
- package/dist/{chunk-DNRQVM3Q.js → chunk-QBFYIDY7.js} +3 -2
- package/dist/chunk-QBFYIDY7.js.map +1 -0
- package/dist/{chunk-QQ25RKOO.js → chunk-ZWFSGMOB.js} +385 -173
- package/dist/chunk-ZWFSGMOB.js.map +1 -0
- package/dist/data.cjs +1 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.cts +4 -2
- package/dist/data.d.ts +4 -2
- package/dist/data.js +1 -1
- package/dist/floating.cjs +9 -1
- package/dist/floating.cjs.map +1 -1
- package/dist/floating.d.cts +6 -0
- package/dist/floating.d.ts +6 -0
- package/dist/floating.js +1 -1
- package/dist/index.cjs +1908 -681
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +171 -7
- package/dist/index.d.ts +171 -7
- package/dist/index.js +1412 -475
- package/dist/index.js.map +1 -1
- package/dist/layouts.cjs.map +1 -1
- package/dist/layouts.d.cts +1 -1
- package/dist/layouts.d.ts +1 -1
- package/dist/layouts.js +1 -1
- package/dist/skeletons.cjs +55 -35
- package/dist/skeletons.cjs.map +1 -1
- package/dist/skeletons.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-3FJUCHCC.js.map +0 -1
- package/dist/chunk-7L6UB6MD.js.map +0 -1
- package/dist/chunk-BEPH6PPL.js.map +0 -1
- package/dist/chunk-DNRQVM3Q.js.map +0 -1
- package/dist/chunk-QQ25RKOO.js.map +0 -1
- package/dist/chunk-WL67XCH5.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/primitives/icon/Icon.ts","../src/admin/styles.ts","../src/admin/NavMenu.ts","../src/primitives/breadcrumb/Breadcrumb.ts","../src/primitives/breadcrumb/BreadcrumbItem.ts","../src/admin/AdminBreadcrumb.ts","../src/admin/useTabsNav.ts","../src/primitives/dropdown/context.ts","../src/primitives/dropdown/Dropdown.ts","../src/primitives/dropdown/DropdownTrigger.ts","../src/primitives/dropdown/DropdownMenu.ts","../src/primitives/dropdown/DropdownItem.ts","../src/admin/AdminTabs.ts","../src/admin/useAdminShell.ts","../src/admin/AdminLayout.ts","../src/admin/useAdminPreferences.ts"],"names":["defineComponent","h","ref","onBeforeUnmount","computed","watch","inject","nextTick","findNavPath"],"mappings":"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","file":"chunk-ZWFSGMOB.js","sourcesContent":["import { defineComponent, h, inject, type PropType, type VNode } from 'vue'\nimport { defaultIconRegistry, resolveThemedIcon, type IrisIconRegistry } from '@iris-ui-kit/icons'\nimport { IrisThemeKey } from '../../theme'\n\n/**\n * Renders a registered icon as inline SVG. Resolves `name` through an\n * `@iris-ui-kit/icons` registry and renders the icon's structured nodes as real\n * SVG child elements (no raw-HTML injection). Colors follow `currentColor`, so\n * the surrounding CSS `color` themes it. Renders nothing for an unresolved name.\n */\nexport const IrisIcon = defineComponent({\n name: 'IrisIcon',\n inheritAttrs: false,\n props: {\n /** Semantic icon name resolved via the registry (e.g. 'check'). */\n name: { type: String, required: true },\n /** Width & height (number → px). */\n size: { type: [Number, String] as PropType<number | string>, default: 24 },\n /** Stroke width for line icons. */\n strokeWidth: { type: Number, default: 2 },\n /** Render as a filled glyph instead of a stroked line icon. */\n fill: { type: Boolean, default: false },\n /** Accessible title; sets role=\"img\" + aria-label. Omit for decorative icons. */\n title: { type: String, default: undefined },\n /** Registry to resolve `name` against. Defaults to the built-in set. */\n registry: { type: Object as PropType<IrisIconRegistry>, default: () => defaultIconRegistry },\n },\n setup(props, { attrs }) {\n const themeCtx = inject(IrisThemeKey, undefined)\n return () => {\n const icon = resolveThemedIcon(props.registry, props.name, themeCtx?.current.value)\n if (!icon) return null\n\n const paint = props.fill\n ? { fill: 'currentColor' }\n : {\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': props.strokeWidth,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }\n\n const children: VNode[] = icon.nodes.map((node, i) => h(node.tag, { key: i, ...node.attrs }))\n if (props.title) children.unshift(h('title', props.title))\n\n return h(\n 'svg',\n {\n ...attrs,\n xmlns: 'http://www.w3.org/2000/svg',\n viewBox: icon.viewBox ?? '0 0 24 24',\n width: props.size,\n height: props.size,\n ...paint,\n role: props.title ? 'img' : undefined,\n 'aria-label': props.title || undefined,\n 'aria-hidden': props.title ? undefined : 'true',\n 'data-iris-icon': props.name,\n style: {\n display: 'inline-block',\n verticalAlign: 'middle',\n flexShrink: 0,\n ...((attrs.style as Record<string, string>) ?? {}),\n },\n },\n children,\n )\n }\n },\n})\n","export const __NAV_MENU_STYLE_ID = 'iris-nav-menu-styles'\n\nconst CSS = `\n:where(.iris-nav-menu) {\n --iris-nav-indent-step: 16px;\n --iris-nav-item-padding-inline: 12px;\n --iris-nav-item-padding-block: 8px;\n --iris-nav-item-border-radius: var(--iris-radius-md, 6px);\n --iris-nav-item-hover: var(--iris-surface-hover, var(--iris-surface));\n --iris-nav-item-height: 34px;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--iris-space-xxs, 4px);\n width: 100%;\n}\n\n:where(.iris-nav-menu--horizontal) {\n flex-direction: row;\n align-items: center;\n width: auto;\n}\n\n:where(.iris-nav-menu-group) {\n position: relative;\n}\n\n:where(.iris-nav-menu-item) {\n appearance: none;\n box-sizing: border-box;\n display: flex;\n flex: 0 1 auto;\n align-items: center;\n width: 100%;\n min-height: var(--iris-nav-item-height);\n border: none;\n border-radius: var(--iris-nav-item-border-radius);\n background: transparent;\n color: var(--iris-foreground);\n font: inherit;\n font-size: var(--iris-font-size-md, 14px);\n line-height: 1.2;\n font-weight: 400;\n text-align: start;\n cursor: pointer;\n opacity: 1;\n margin: 0;\n gap: var(--iris-space-sm, 12px);\n padding-block: var(--iris-nav-item-padding-block);\n padding-inline: var(--iris-nav-item-padding-inline);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n:where(.iris-nav-menu--horizontal > .iris-nav-menu-group > .iris-nav-menu-item) {\n width: auto;\n padding-inline-start: var(--iris-nav-item-padding-inline);\n}\n\n:where(.iris-nav-menu-item[data-depth='0']) {\n --iris-nav-item-padding-inline-start: 12px;\n}\n\n:where(.iris-nav-menu-item[data-depth='1']) {\n --iris-nav-item-padding-inline-start: calc(12px + var(--iris-nav-indent-step));\n}\n\n:where(.iris-nav-menu-item[data-depth='2']) {\n --iris-nav-item-padding-inline-start: calc(12px + var(--iris-nav-indent-step) * 2);\n}\n\n:where(.iris-nav-menu-item[data-depth='3']) {\n --iris-nav-item-padding-inline-start: calc(12px + var(--iris-nav-indent-step) * 3);\n}\n\n:where(.iris-nav-menu-item[data-depth='4']) {\n --iris-nav-item-padding-inline-start: calc(12px + var(--iris-nav-indent-step) * 4);\n}\n\n:where(.iris-nav-menu-item[data-depth='5']) {\n --iris-nav-item-padding-inline-start: calc(12px + var(--iris-nav-indent-step) * 5);\n}\n\n:where(.iris-nav-menu-item[data-depth='6']) {\n --iris-nav-item-padding-inline-start: calc(12px + var(--iris-nav-indent-step) * 6);\n}\n\n:where(.iris-nav-menu-item[data-depth='7']) {\n --iris-nav-item-padding-inline-start: calc(12px + var(--iris-nav-indent-step) * 7);\n}\n\n:where(.iris-nav-menu-item[data-depth='8']) {\n --iris-nav-item-padding-inline-start: calc(12px + var(--iris-nav-indent-step) * 8);\n}\n\n:where(.iris-nav-menu-item[data-depth='9']) {\n --iris-nav-item-padding-inline-start: calc(12px + var(--iris-nav-indent-step) * 9);\n}\n\n:where(.iris-nav-menu--vertical .iris-nav-menu-item[data-depth]) {\n padding-inline-start: var(--iris-nav-item-padding-inline-start);\n}\n\n:where(.iris-nav-menu-item:hover),\n:where(.iris-nav-menu-item.is-hovered):not([disabled], .is-disabled) {\n background: var(--iris-nav-item-hover);\n}\n\n.iris-nav-menu-item[data-active='true'] {\n background: var(--iris-primary);\n color: var(--iris-primary-foreground, #fff);\n font-weight: 600;\n}\n\n:where(.iris-nav-menu-item[data-active-trail='true']) {\n color: var(--iris-primary);\n font-weight: 600;\n}\n\n:where(.iris-nav-menu-item[disabled], .iris-nav-menu-item.is-disabled) {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n:where(.iris-nav-menu-item:focus-visible) {\n outline: 2px solid var(--iris-ring, var(--iris-primary));\n outline-offset: 1px;\n}\n\n:where(.iris-nav-menu-label) {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n:where(.iris-nav-menu-badge) {\n margin-inline-start: var(--iris-space-xs, 8px);\n font-size: var(--iris-font-size-xs, 12px);\n line-height: 1;\n padding: var(--iris-space-xxs, 4px) var(--iris-space-xs, 8px);\n border-radius: 999px;\n background: var(--iris-danger, #ef4444);\n color: var(--iris-primary-foreground, #fff);\n flex: 0 0 auto;\n}\n\n:where(.iris-nav-menu-arrow) {\n flex: 0 0 auto;\n opacity: 0.6;\n transform: rotate(0deg);\n transform-origin: center;\n transition: transform 160ms ease;\n margin-inline-start: auto;\n}\n\n:where(.iris-nav-menu-arrow[data-reversed='true']) {\n transform: rotate(180deg);\n}\n\n:where(.iris-nav-menu-fallback-icon) {\n display: inline-flex;\n width: 20px;\n height: 20px;\n align-items: center;\n justify-content: center;\n font-weight: 700;\n}\n\n:where(.iris-nav-menu-item.is-disabled) .iris-nav-menu-label {\n opacity: 0.75;\n}\n\n/* Vertical branches stay in the DOM and animate height via the grid-rows\n trick (0fr → 1fr); the inner wrapper provides the overflow clipping so the\n transition is a smooth accordion without a max-height cap. */\n:where(.iris-nav-menu--vertical .iris-nav-menu-group > .iris-nav-menu-children) {\n display: grid;\n grid-template-rows: 0fr;\n opacity: 0;\n visibility: hidden;\n transition:\n grid-template-rows 200ms ease,\n opacity 150ms ease,\n visibility 0s linear 200ms;\n}\n\n:where(.iris-nav-menu--vertical .iris-nav-menu-group > .iris-nav-menu-children > .iris-nav-menu-children-inner) {\n overflow: hidden;\n min-height: 0;\n}\n\n:where(.iris-nav-menu--vertical .iris-nav-menu-group[data-open='true'] > .iris-nav-menu-children) {\n grid-template-rows: 1fr;\n opacity: 1;\n visibility: visible;\n transition:\n grid-template-rows 200ms ease,\n opacity 150ms ease;\n}\n\n/* Flyout popups (horizontal mode + the collapsed rail) share the popup chrome\n and are hard-hidden when closed (no height animation needed). */\n:where(.iris-nav-menu--horizontal .iris-nav-menu-group > .iris-nav-menu-children),\n:where(.iris-nav-menu--collapsed .iris-nav-menu-group > .iris-nav-menu-children) {\n display: none;\n position: absolute;\n min-width: 220px;\n padding: var(--iris-space-xs, 8px);\n border: 1px solid var(--iris-border);\n border-radius: var(--iris-radius-md, 6px);\n background: var(--iris-surface);\n box-shadow: var(--iris-shadow-md);\n}\n\n:where(.iris-nav-menu--horizontal .iris-nav-menu-group[data-open='true'] > .iris-nav-menu-children),\n:where(.iris-nav-menu--collapsed .iris-nav-menu-group[data-open='true'] > .iris-nav-menu-children) {\n display: block;\n}\n\n:where(.iris-nav-menu--horizontal .iris-nav-menu-group[data-depth='0'] > .iris-nav-menu-children) {\n inset-block-start: 100%;\n inset-inline-start: 0;\n z-index: 60;\n}\n\n/* A9: the collapsed rail popup opens to the right of the icon. */\n:where(.iris-nav-menu--collapsed .iris-nav-menu-group[data-depth='0'] > .iris-nav-menu-children) {\n inset-block-start: 0;\n inset-inline-start: 100%;\n z-index: 60;\n}\n\n:where(.iris-nav-menu--horizontal .iris-nav-menu-group[data-depth]:not([data-depth='0']) > .iris-nav-menu-children),\n:where(.iris-nav-menu--collapsed .iris-nav-menu-group[data-depth]:not([data-depth='0']) > .iris-nav-menu-children) {\n inset-block-start: 0;\n inset-inline-start: 100%;\n z-index: 61;\n}\n\n:where(.iris-nav-menu--collapsed .iris-nav-menu-item) {\n justify-content: center;\n padding-inline-start: var(--iris-nav-item-padding-inline);\n}\n\n:where(.iris-nav-menu-item.is-collapsed) {\n justify-content: center;\n padding-inline: var(--iris-nav-item-padding-inline);\n}\n\n/* A9: the collapsed rail stays centered even though rows carry data-depth\n (the vertical indent rules would otherwise win the specificity tie). */\n:where(.iris-nav-menu--collapsed .iris-nav-menu-item[data-depth]) {\n justify-content: center;\n padding-inline: var(--iris-nav-item-padding-inline);\n}\n\n@media (prefers-reduced-motion: reduce) {\n :where(.iris-nav-menu-arrow) {\n transition: none;\n }\n :where(.iris-nav-menu--vertical .iris-nav-menu-group > .iris-nav-menu-children) {\n transition: none;\n }\n}\n`.trim()\n\nlet installed = false\n\nexport function installNavMenuStyles(): void {\n if (installed) return\n if (typeof document === 'undefined') return\n if (document.getElementById(__NAV_MENU_STYLE_ID)) {\n installed = true\n return\n }\n const style = document.createElement('style')\n style.id = __NAV_MENU_STYLE_ID\n style.textContent = CSS\n document.head.appendChild(style)\n installed = true\n}\n\n/** Test-only: remove the singleton stylesheet and reset installation state. */\nexport function __resetNavMenuStyles(): void {\n installed = false\n if (typeof document !== 'undefined') {\n document.getElementById(__NAV_MENU_STYLE_ID)?.remove()\n }\n}\n","import {\n computed,\n defineComponent,\n h,\n nextTick,\n onBeforeUnmount,\n ref,\n shallowRef,\n watch,\n type PropType,\n type VNode,\n} from 'vue'\nimport {\n branchTrail,\n createExpansion,\n findNavNode,\n findNavPath,\n isBranch,\n visibleNav,\n firstLeaf,\n type NavNode,\n} from '@iris-ui-kit/core'\nimport { IrisIcon } from '../primitives/icon/Icon'\nimport { useI18n } from '../i18n'\nimport { installNavMenuStyles } from './styles'\n\n/** Hover open/close latencies for flyouts (horizontal mode + collapsed rail). */\nconst HOVER_OPEN_DELAY = 100\nconst HOVER_CLOSE_DELAY = 150\n\n/**\n * Data-driven nested navigation menu — the sidebar nav of the admin shell.\n * Renders a normalized `NavNode[]` tree as an accordion of expandable branches\n * and selectable leaves; the active leaf and its ancestor branches are\n * highlighted, and the active branch trail auto-expands. Router-agnostic: it\n * takes `activeKey` + emits `select(key, node)`; the host owns navigation.\n *\n * `collapsed` switches to an icon-only rail (top-level items only); hovering a\n * branch pops the full submenu flyout out to the right and a branch click\n * jumps to its first leaf.\n */\nexport const IrisNavMenu = defineComponent({\n name: 'IrisNavMenu',\n inheritAttrs: false,\n props: {\n /** Normalized nav tree. */\n items: { type: Array as PropType<NavNode[]>, required: true },\n /** Key of the active leaf. */\n activeKey: { type: String, default: undefined },\n /** Controlled expanded branch keys (v-model:expandedKeys). */\n expandedKeys: { type: Array as PropType<string[]>, default: undefined },\n /** Initial expanded keys when uncontrolled (else the active trail expands). */\n defaultExpandedKeys: { type: Array as PropType<string[]>, default: undefined },\n /** Icon-only rail (top-level items only). */\n collapsed: { type: Boolean, default: false },\n orientation: {\n type: String as PropType<'vertical' | 'horizontal'>,\n default: 'vertical',\n },\n ariaLabel: { type: String, default: undefined },\n },\n emits: {\n select: (_key: string, _node: NavNode) => true,\n 'update:expandedKeys': (_keys: string[]) => true,\n },\n setup(props, { emit, attrs }) {\n installNavMenuStyles()\n const { t } = useI18n()\n const tree = computed(() => visibleNav(props.items))\n const activePath = computed(() =>\n props.activeKey ? findNavPath(props.items, props.activeKey).map((n) => n.key) : [],\n )\n\n // Branches with flyouts (horizontal popups + the collapsed rail popup) use\n // the hover/focus/click state instead of the vertical expansion model.\n const flyoutMode = computed(() => props.orientation === 'horizontal' || props.collapsed)\n\n const isControlled = computed(() => props.expandedKeys !== undefined)\n\n // The expand/collapse set — toggle, dedup and the active-trail union — lives in\n // the core expansion model; this component only layers on the controlled /\n // uncontrolled split. v-model here is *strict*: while controlled, rendering\n // reads the `expandedKeys` prop (not the store) so a toggle stays closed until\n // the parent updates it. The model therefore backs the uncontrolled state, and\n // `branchTrail` feeds the auto-open union through `merge`.\n const model = createExpansion({\n mode: 'multiple',\n defaultExpanded:\n props.defaultExpandedKeys ??\n (props.activeKey ? branchTrail(props.items, props.activeKey) : []),\n })\n const internalExpanded = shallowRef<string[]>(model.get())\n onBeforeUnmount(\n model.store.subscribe((keys) => {\n internalExpanded.value = keys\n }),\n )\n const expanded = computed(() =>\n isControlled.value ? (props.expandedKeys as string[]) : internalExpanded.value,\n )\n\n // Auto-open the active branch trail as the active leaf changes *or as the\n // tree arrives late* (async navigation data: the mount-time seed may have\n // seen `items = []`). `merge` is a union, so manual collapses survive and\n // repeated pushes are idempotent.\n watch([() => props.activeKey, () => props.items], ([key]) => {\n if (!isControlled.value) model.merge(key ? branchTrail(props.items, key) : [])\n })\n\n const toggle = (key: string): void => {\n if (isControlled.value) {\n const cur = props.expandedKeys as string[]\n emit(\n 'update:expandedKeys',\n cur.includes(key) ? cur.filter((k) => k !== key) : [...cur, key],\n )\n } else {\n model.toggle(key)\n emit('update:expandedKeys', model.get())\n }\n }\n\n const hovered = ref<string | null>(null)\n const hoveredBranches = ref<string[]>([])\n const focusedBranches = ref<string[]>([])\n /** Branches pinned open by a click (horizontal mode) — sticky across hover. */\n const clickedBranches = ref<string[]>([])\n /** Set while Escape is returning focus to a trigger: the group focusin\n * handler must not re-open the flyout it just closed. */\n let suppressFocusOpen = false\n\n // Hover open/close latencies: a single open timer plus per-branch close\n // timers so fast pointer travel across branches never flickers a popup.\n let openTimer: ReturnType<typeof setTimeout> | null = null\n const closeTimers = new Map<string, ReturnType<typeof setTimeout>>()\n\n const clearOpenTimer = (): void => {\n if (openTimer) {\n clearTimeout(openTimer)\n openTimer = null\n }\n }\n const cancelClose = (key: string): void => {\n const timer = closeTimers.get(key)\n if (timer) {\n clearTimeout(timer)\n closeTimers.delete(key)\n }\n }\n const cancelAllTimers = (): void => {\n clearOpenTimer()\n for (const timer of closeTimers.values()) clearTimeout(timer)\n closeTimers.clear()\n }\n onBeforeUnmount(cancelAllTimers)\n\n // --- Flyout viewport pinning ----------------------------------------\n // Top-level flyout popups (horizontal + collapsed rail) are rendered\n // in-flow, but the admin shell hosts the rail inside scroll containers\n // (sidebar overflow) — plain `position: absolute` popups get clipped.\n // Pin each top-level popup to the viewport with `position: fixed` from\n // the trigger's rect and keep it glued while open via scroll/resize\n // listeners. Nested popups stay absolute: their containing block is the\n // already-pinned top-level popup.\n const flyoutTriggers = new Map<string, HTMLElement>()\n const flyoutPanels = new Map<string, HTMLElement>()\n\n const setFlyoutRef = (map: Map<string, HTMLElement>, key: string, el: unknown): void => {\n if (el instanceof HTMLElement) map.set(key, el)\n else map.delete(key)\n }\n\n const positionFlyout = (key: string): void => {\n const trigger = flyoutTriggers.get(key)\n const panel = flyoutPanels.get(key)\n if (!trigger || !panel || typeof document === 'undefined') return\n const rect = trigger.getBoundingClientRect()\n const dir = getComputedStyle(trigger).direction\n panel.style.position = 'fixed'\n panel.style.top = `${props.collapsed ? rect.top : rect.bottom}px`\n if (dir === 'rtl') {\n // Rail: popup opens on the inline-start side (left in RTL).\n panel.style.left = ''\n panel.style.right = `${window.innerWidth - (props.collapsed ? rect.left : rect.right)}px`\n } else {\n panel.style.right = ''\n panel.style.left = `${props.collapsed ? rect.right : rect.left}px`\n }\n }\n\n onBeforeUnmount(() => {\n detachViewportListeners()\n flyoutTriggers.clear()\n flyoutPanels.clear()\n })\n\n /** Menubar semantics: at most one flyout per depth. Opening (hover / click\n * / keyboard) a branch closes any other branch's popup at the same depth,\n * so a pinned popup never coexists with a sibling hover popup and clicking\n * a sibling branch visibly switches the open popup. */\n const isolateAtDepth = (key: string): void => {\n const depth = findNavPath(props.items, key).length - 1\n const isSameDepthOther = (k: string): boolean =>\n k !== key && findNavPath(props.items, k).length - 1 === depth\n for (const state of [hoveredBranches, clickedBranches, focusedBranches]) {\n if (state.value.some(isSameDepthOther)) {\n state.value = state.value.filter((k) => !isSameDepthOther(k))\n }\n }\n }\n\n const scheduleOpen = (key: string): void => {\n clearOpenTimer()\n openTimer = setTimeout(() => {\n openTimer = null\n isolateAtDepth(key)\n setBranchInteraction(hoveredBranches, key, true)\n }, HOVER_OPEN_DELAY)\n }\n const scheduleClose = (key: string): void => {\n cancelClose(key)\n closeTimers.set(\n key,\n setTimeout(() => {\n closeTimers.delete(key)\n setBranchInteraction(hoveredBranches, key, false)\n }, HOVER_CLOSE_DELAY),\n )\n }\n\n const closeHorizontalMenus = (): void => {\n if (!flyoutMode.value) return\n cancelAllTimers()\n hovered.value = null\n hoveredBranches.value = []\n focusedBranches.value = []\n clickedBranches.value = []\n }\n\n const select = (node: NavNode): void => {\n if (node.disabled) return\n closeHorizontalMenus()\n emit('select', node.key, node)\n }\n\n /** Horizontal branch click: toggle the flyout without touching expandedKeys. */\n const toggleFlyout = (key: string): void => {\n cancelAllTimers()\n const current = clickedBranches.value\n if (current.includes(key)) {\n clickedBranches.value = current.filter((k) => k !== key)\n setBranchInteraction(hoveredBranches, key, false)\n setBranchInteraction(focusedBranches, key, false)\n } else {\n // Clicking a sibling branch switches the pinned popup (antd behavior).\n isolateAtDepth(key)\n clickedBranches.value = [...clickedBranches.value, key]\n }\n }\n\n /** Keyboard open: mark the branch as focused (instant, menubar pattern). */\n const openFlyout = (key: string): void => {\n cancelAllTimers()\n isolateAtDepth(key)\n setBranchInteraction(focusedBranches, key, true)\n }\n\n const setBranchInteraction = (\n state: typeof hoveredBranches,\n key: string,\n enabled: boolean,\n ): void => {\n const current = state.value\n if (enabled) {\n if (!current.includes(key)) state.value = [...current, key]\n } else if (current.includes(key)) {\n state.value = current.filter((item) => item !== key)\n }\n }\n\n const keepsPointerInside = (\n container: EventTarget | null,\n event: { relatedTarget?: EventTarget | null },\n ): boolean => {\n if (!container || !(container instanceof HTMLElement)) return false\n const next = event.relatedTarget\n return !!(next && next instanceof Node && container.contains(next))\n }\n\n const interactionKeyAtDepth = (keys: string[], depth: number): string | undefined =>\n keys.find((key) => findNavPath(props.items, key).length === depth + 1)\n\n const horizontalBranchVisible = (key: string, depth: number): boolean => {\n const hoveredAtDepth = interactionKeyAtDepth(hoveredBranches.value, depth)\n if (hoveredAtDepth) return hoveredAtDepth === key\n const clickedAtDepth = interactionKeyAtDepth(clickedBranches.value, depth)\n if (clickedAtDepth) return clickedAtDepth === key\n return interactionKeyAtDepth(focusedBranches.value, depth) === key\n }\n\n // Watch the set of currently-visible top-level flyouts: pin each to the\n // viewport as it opens and keep them glued via scroll/resize listeners.\n const shownFlyoutKeys = computed(() => {\n if (!flyoutMode.value) return []\n const keys: string[] = []\n for (const node of tree.value) {\n if (isBranch(node) && horizontalBranchVisible(node.key, 0)) keys.push(node.key)\n }\n return keys\n })\n\n const repositionOpenFlyouts = (): void => {\n for (const key of shownFlyoutKeys.value) positionFlyout(key)\n }\n\n let viewportListenersActive = false\n const attachViewportListeners = (): void => {\n if (viewportListenersActive || typeof document === 'undefined') return\n viewportListenersActive = true\n // Capture phase: sidebar/header scroll containers don't bubble scroll.\n document.addEventListener('scroll', repositionOpenFlyouts, true)\n window.addEventListener('resize', repositionOpenFlyouts)\n }\n const detachViewportListeners = (): void => {\n if (!viewportListenersActive || typeof document === 'undefined') return\n viewportListenersActive = false\n document.removeEventListener('scroll', repositionOpenFlyouts, true)\n window.removeEventListener('resize', repositionOpenFlyouts)\n }\n\n watch(\n shownFlyoutKeys,\n (keys, prev) => {\n if (keys.length > 0 && prev.length === 0) attachViewportListeners()\n else if (keys.length === 0 && prev.length > 0) detachViewportListeners()\n for (const key of keys) positionFlyout(key)\n },\n { flush: 'post' },\n )\n\n const itemClass = (opts: {\n depth: number\n active: boolean\n trail: boolean\n hovered: boolean\n open: boolean\n disabled: boolean\n branch: boolean\n }): string[] => {\n const depth = Math.min(9, opts.depth)\n return [\n 'iris-nav-menu-item',\n `iris-nav-menu-item--depth-${depth}`,\n `iris-nav-menu-item--${opts.branch ? 'branch' : 'leaf'}`,\n opts.active ? 'is-active' : undefined,\n opts.trail ? 'is-trail' : undefined,\n opts.hovered ? 'is-hovered' : undefined,\n opts.open ? 'is-open' : undefined,\n opts.disabled ? 'is-disabled' : undefined,\n ].filter(Boolean) as string[]\n }\n\n const iconNode = (node: NavNode, size = 18): VNode | null =>\n node.icon ? h(IrisIcon, { name: node.icon, size }) : null\n\n const badgeNode = (node: NavNode): VNode | null =>\n node.badge !== undefined && node.badge !== '' && !props.collapsed\n ? h(\n 'span',\n {\n class: 'iris-nav-menu-badge',\n 'data-iris-nav-badge': '',\n },\n String(node.badge),\n )\n : null\n\n const renderItem = (node: NavNode, depth: number): VNode => {\n const branch = isBranch(node)\n const horizontal = flyoutMode.value\n const open = expanded.value.includes(node.key)\n const shown = horizontal ? horizontalBranchVisible(node.key, depth) : open\n const active = node.key === props.activeKey\n const trail = branch && !active && activePath.value.includes(node.key)\n // A6: keep the row highlighted while its flyout stays open (pointer has\n // moved from the trigger into the popup).\n const rowHovered = hovered.value === node.key || (horizontal && shown)\n const arrowReversed = branch && !node.disabled && (active || trail || shown || rowHovered)\n\n // Top-level flyout popups are pinned to the viewport (fixed) so they\n // escape ancestor overflow; their trigger + panel refs feed that.\n const isFlyoutRoot = horizontal && branch && depth === 0\n\n const row = h(\n 'button',\n {\n type: 'button',\n ref: (el: unknown) => {\n if (isFlyoutRoot) setFlyoutRef(flyoutTriggers, node.key, el)\n },\n class: [\n ...itemClass({\n depth,\n active,\n trail,\n hovered: rowHovered,\n open: branch ? shown : false,\n disabled: !!node.disabled,\n branch,\n }),\n ...(props.collapsed && depth === 0 ? ['is-collapsed'] : []),\n ],\n 'data-iris-nav-item': '',\n 'data-key': node.key,\n 'data-branch': branch ? 'true' : undefined,\n 'data-active': active ? 'true' : undefined,\n 'data-active-trail': trail ? 'true' : undefined,\n 'data-open': branch && shown ? 'true' : undefined,\n 'data-hovered': rowHovered ? 'true' : undefined,\n 'data-depth': String(depth),\n 'data-orientation': props.orientation,\n disabled: node.disabled,\n title: props.collapsed ? node.title : undefined,\n 'aria-label': props.collapsed\n ? branch\n ? `${node.title} (section)`\n : node.title\n : undefined,\n 'aria-expanded': branch ? (shown ? 'true' : 'false') : undefined,\n 'aria-current': active ? 'page' : undefined,\n onMouseenter: () => {\n if (!node.disabled) hovered.value = node.key\n },\n onMouseleave: (event: MouseEvent) => {\n if (hovered.value === node.key && !keepsPointerInside(event.currentTarget, event)) {\n hovered.value = null\n }\n },\n onClick: () => {\n if (props.collapsed && branch) {\n select(firstLeaf(node))\n } else if (horizontal && branch) {\n // A2: horizontal clicks drive the flyout, not the expansion set.\n toggleFlyout(node.key)\n } else if (branch) {\n toggle(node.key)\n } else {\n select(node)\n }\n },\n },\n [\n iconNode(node),\n h(\n 'span',\n {\n class: 'iris-nav-menu-label',\n },\n node.title,\n ),\n badgeNode(node),\n branch && !(props.collapsed && depth === 0)\n ? h(IrisIcon, {\n name:\n horizontal && depth === 0 && !props.collapsed ? 'chevron-down' : 'chevron-right',\n size: 16,\n class: 'iris-nav-menu-arrow',\n 'data-reversed': arrowReversed ? 'true' : undefined,\n })\n : null,\n ],\n )\n\n // Children are always in the DOM (vertical: animated height via CSS;\n // horizontal/collapsed: flyout popups); `aria-hidden` keeps hidden items\n // out of the a11y tree and out of arrow-key navigation.\n return h(\n 'div',\n {\n key: node.key,\n 'data-iris-nav-group': branch ? '' : undefined,\n 'data-open': branch && shown ? 'true' : undefined,\n 'data-depth': String(depth),\n class: ['iris-nav-menu-group', `iris-nav-menu-group--depth-${Math.min(9, depth)}`],\n ...(horizontal && branch\n ? {\n onMouseenter: (event: MouseEvent) => {\n if (!node.disabled && !keepsPointerInside(event.currentTarget, event)) {\n cancelClose(node.key)\n scheduleOpen(node.key)\n }\n },\n onMouseover: (event: MouseEvent) => {\n if (!node.disabled && !keepsPointerInside(event.currentTarget, event)) {\n cancelClose(node.key)\n scheduleOpen(node.key)\n }\n },\n onMouseout: (event: MouseEvent) => {\n if (!node.disabled && !keepsPointerInside(event.currentTarget, event)) {\n scheduleClose(node.key)\n }\n },\n onMouseleave: (event: MouseEvent) => {\n if (!node.disabled && !keepsPointerInside(event.currentTarget, event)) {\n scheduleClose(node.key)\n }\n },\n onFocusin: () => {\n if (suppressFocusOpen) return\n setBranchInteraction(focusedBranches, node.key, true)\n },\n onFocusout: (event: FocusEvent) => {\n const group = event.currentTarget as HTMLElement\n const next = event.relatedTarget as Node | null\n if (!next || !group.contains(next)) {\n setBranchInteraction(focusedBranches, node.key, false)\n }\n },\n }\n : {}),\n },\n [\n row,\n branch\n ? h(\n 'div',\n {\n class: 'iris-nav-menu-children',\n 'data-iris-nav-children': '',\n ref: (el: unknown) => {\n if (isFlyoutRoot) setFlyoutRef(flyoutPanels, node.key, el)\n },\n role: 'group',\n 'aria-hidden': shown ? undefined : 'true',\n },\n [\n h(\n 'div',\n { class: 'iris-nav-menu-children-inner' },\n (node.children ?? []).map((child) => renderItem(child, depth + 1)),\n ),\n ],\n )\n : null,\n ],\n )\n }\n\n // Keep the active item in view when the tree or active key changes (deep\n // links into long menus). jsdom-safe: no scrollIntoView / matchMedia there.\n const rootRef = shallowRef<HTMLElement | null>(null)\n watch(\n [() => props.activeKey, () => props.items],\n () => {\n if (!props.activeKey) return\n const root = rootRef.value\n if (!root) return\n const el = root.querySelector<HTMLElement>('[data-iris-nav-item][data-active=\"true\"]')\n if (!el || typeof el.scrollIntoView !== 'function') return\n let behavior: ScrollBehavior = 'auto'\n if (\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n !window.matchMedia('(prefers-reduced-motion: reduce)').matches\n ) {\n behavior = 'smooth'\n }\n el.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior })\n },\n { flush: 'post' },\n )\n\n // Arrow-key navigation over the visible items (Tab still works as a fallback).\n // Up/Down/Home/End move focus; Right expands a branch then steps into it;\n // Left collapses an open branch else moves to the parent. In flyout mode\n // (horizontal / collapsed) Down/Right open the popup and step into it,\n // Up/Left close it, and Escape closes everything (focus returns to the\n // owning top-level trigger).\n const onKeydown = (e: KeyboardEvent): void => {\n const root = e.currentTarget as HTMLElement\n const buttons = Array.from(root.querySelectorAll<HTMLElement>('[data-iris-nav-item]')).filter(\n (button) => !button.closest('[data-iris-nav-children][aria-hidden=\"true\"]'),\n )\n if (buttons.length === 0) return\n const idx = buttons.indexOf(document.activeElement as HTMLElement)\n const focusAt = (i: number): void => buttons[(i + buttons.length) % buttons.length]?.focus()\n const key = idx >= 0 ? buttons[idx]?.getAttribute('data-key') : undefined\n const node = key ? findNavNode(props.items, key) : undefined\n const depth = idx >= 0 ? Number(buttons[idx]?.getAttribute('data-depth') ?? 0) : 0\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n // A4: flyout mode — Down on a branch opens its popup and steps in.\n if (flyoutMode.value && node && isBranch(node)) {\n openFlyout(key!)\n const group = buttons[idx]!.closest('[data-iris-nav-group]')\n void nextTick(() => {\n group\n ?.querySelector<HTMLElement>('[data-iris-nav-children] [data-iris-nav-item]')\n ?.focus()\n })\n return\n }\n focusAt(idx < 0 ? 0 : idx + 1)\n return\n }\n case 'ArrowUp': {\n e.preventDefault()\n // A4: Up on an open flyout trigger closes it and keeps focus there\n // (clears the click-pinned state too, so ArrowUp closes pinned popups\n // exactly like ArrowLeft).\n if (flyoutMode.value && node && isBranch(node) && horizontalBranchVisible(key!, depth)) {\n setBranchInteraction(focusedBranches, key!, false)\n setBranchInteraction(clickedBranches, key!, false)\n return\n }\n focusAt(idx < 0 ? buttons.length - 1 : idx - 1)\n return\n }\n case 'Home':\n e.preventDefault()\n buttons[0]?.focus()\n return\n case 'End':\n e.preventDefault()\n buttons[buttons.length - 1]?.focus()\n return\n case 'Escape': {\n // A3: Escape closes open flyouts and returns focus to the trigger.\n if (flyoutMode.value) {\n const openKeys = [\n ...hoveredBranches.value,\n ...clickedBranches.value,\n ...focusedBranches.value,\n ]\n if (openKeys.length > 0) {\n e.preventDefault()\n const openTop = openKeys.find((k) => findNavPath(props.items, k).length === 1)\n closeHorizontalMenus()\n if (openTop) {\n suppressFocusOpen = true\n buttons.find((b) => b.getAttribute('data-key') === openTop)?.focus()\n void nextTick(() => {\n suppressFocusOpen = false\n })\n }\n }\n }\n return\n }\n }\n\n if (props.collapsed || idx < 0 || !key || !node) return\n\n if (e.key === 'ArrowRight') {\n e.preventDefault()\n if (isBranch(node)) {\n if (flyoutMode.value || !expanded.value.includes(key)) {\n // A4 (flyout) / A5 (vertical): open and step into the first child.\n if (flyoutMode.value) openFlyout(key)\n else toggle(key)\n const group = buttons[idx]!.closest('[data-iris-nav-group]')\n void nextTick(() => {\n group\n ?.querySelector<HTMLElement>('[data-iris-nav-children] [data-iris-nav-item]')\n ?.focus()\n })\n } else {\n focusAt(idx + 1)\n }\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault()\n if (flyoutMode.value && isBranch(node)) {\n setBranchInteraction(focusedBranches, key, false)\n setBranchInteraction(clickedBranches, key, false)\n return\n }\n if (isBranch(node) && expanded.value.includes(key)) {\n toggle(key)\n } else {\n const parentKey = findNavPath(props.items, key).at(-2)?.key\n if (parentKey) {\n buttons.find((b) => b.getAttribute('data-key') === parentKey)?.focus()\n }\n }\n }\n }\n\n const menuClass = [\n 'iris-nav-menu',\n `iris-nav-menu--${props.orientation}`,\n props.collapsed ? 'iris-nav-menu--collapsed' : 'iris-nav-menu--expanded',\n ]\n\n return () =>\n h(\n 'nav',\n {\n ...attrs,\n ref: (el: unknown) => {\n rootRef.value = (el ?? null) as HTMLElement | null\n },\n class: [...menuClass, attrs.class as unknown as string | string[] | undefined],\n 'data-iris-nav-menu': '',\n 'data-collapsed': props.collapsed ? 'true' : undefined,\n 'data-orientation': props.orientation,\n 'aria-label': props.ariaLabel ?? t('admin.nav'),\n onKeydown,\n style: attrs.style as Record<string, string> | undefined,\n },\n tree.value.map((node) => renderItem(node, 0)),\n )\n },\n})\n","import { Fragment, defineComponent, h, type VNode } from 'vue'\nimport { useI18n } from '../../i18n'\n\n/**\n * Container for breadcrumb navigation. Renders a `<nav>` with `<ol>` per\n * WAI-ARIA. The `separator` slot (or prop) is inserted between items;\n * defaults to `/`.\n *\n * Children should be `IrisBreadcrumbItem`s.\n */\nexport const IrisBreadcrumb = defineComponent({\n name: 'IrisBreadcrumb',\n inheritAttrs: false,\n props: {\n /** String separator. Ignored if the `separator` slot is provided. */\n separator: { type: String, default: '/' },\n },\n setup(props, { slots, attrs }) {\n const { t } = useI18n()\n return () => {\n const children = slots.default?.() ?? []\n // Flatten Fragment / array children to a flat list of VNodes.\n const flat: VNode[] = []\n const walk = (nodes: VNode[] | undefined) => {\n if (!nodes) return\n nodes.forEach((n) => {\n if (n.type === Fragment) walk(n.children as VNode[])\n else flat.push(n)\n })\n }\n walk(children as VNode[])\n\n const total = flat.length\n const slotsSep = slots.separator\n const sep = (key: number) =>\n h(\n 'li',\n {\n key: `sep-${key}`,\n 'data-iris-breadcrumb-separator': '',\n 'aria-hidden': 'true',\n style: { color: 'var(--iris-muted)', display: 'inline-flex', alignItems: 'center' },\n },\n slotsSep ? slotsSep() : props.separator,\n )\n\n const items: VNode[] = []\n flat.forEach((child, i) => {\n // Inject is-last hint so the item can self-mark as `aria-current=page`.\n const isLast = i === total - 1\n const wrapped = h(\n 'li',\n {\n key: `item-${i}`,\n 'data-iris-breadcrumb-item': '',\n 'data-iris-breadcrumb-last': isLast ? 'true' : undefined,\n style: { display: 'inline-flex', alignItems: 'center' },\n },\n // Pass isCurrent=true to the last child so it self-marks aria-current.\n h(\n child.type as never,\n { ...(child.props ?? {}), isCurrent: isLast } as Record<string, unknown>,\n child.children as never,\n ),\n )\n items.push(wrapped)\n if (!isLast) items.push(sep(i))\n })\n\n return h(\n 'nav',\n {\n ...attrs,\n 'aria-label': t('breadcrumb.label'),\n 'data-iris-breadcrumb': '',\n },\n h(\n 'ol',\n {\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--iris-space-xs, 8px)',\n margin: '0',\n padding: '0',\n listStyle: 'none',\n fontSize: 'var(--iris-font-size-md, 14px)',\n },\n },\n items,\n ),\n )\n }\n },\n})\n","import { defineComponent, h } from 'vue'\n\n/**\n * A single breadcrumb crumb. Renders an `<a>` when `href` is given and the\n * crumb is not the last one; otherwise a `<span>`.\n *\n * The `isCurrent` flag (set by the parent IrisBreadcrumb based on position)\n * adds `aria-current=\"page\"` and switches to the non-link rendering.\n */\nexport const IrisBreadcrumbItem = defineComponent({\n name: 'IrisBreadcrumbItem',\n inheritAttrs: false,\n props: {\n href: { type: String, default: '' },\n /** Internal: set by parent IrisBreadcrumb when this is the last item. */\n isCurrent: { type: Boolean, default: false },\n },\n setup(props, { slots, attrs }) {\n return () => {\n const last = props.isCurrent\n const baseStyle: Record<string, string> = {\n color: last ? 'var(--iris-muted)' : 'var(--iris-primary)',\n textDecoration: 'none',\n cursor: last ? 'default' : props.href ? 'pointer' : 'default',\n }\n\n const baseAttrs = {\n ...attrs,\n 'aria-current': last ? 'page' : undefined,\n 'data-iris-breadcrumb-crumb': '',\n style: { ...baseStyle, ...((attrs.style as Record<string, string> | undefined) ?? {}) },\n }\n\n if (props.href && !last) {\n return h('a', { ...baseAttrs, href: props.href }, slots.default?.())\n }\n return h('span', baseAttrs, slots.default?.())\n }\n },\n})\n","import { defineComponent, h, type PropType, type VNode } from 'vue'\nimport type { NavNode } from '@iris-ui-kit/core'\nimport { IrisBreadcrumb } from '../primitives/breadcrumb/Breadcrumb'\nimport { IrisBreadcrumbItem } from '../primitives/breadcrumb/BreadcrumbItem'\nimport { IrisIcon } from '../primitives/icon/Icon'\n\n/**\n * Breadcrumb trail for the admin header, driven by a `NavNode[]` ancestor chain\n * (typically `findNavPath(menus, activeKey)`). The last crumb is the current\n * page (auto-marked `aria-current` by IrisBreadcrumb); earlier crumbs are\n * clickable and emit `select(key, node)` so the host can navigate.\n */\nexport const IrisAdminBreadcrumb = defineComponent({\n name: 'IrisAdminBreadcrumb',\n inheritAttrs: false,\n props: {\n /** Root→current ancestor chain. */\n trail: { type: Array as PropType<NavNode[]>, required: true },\n /** Show each node's icon before its title. */\n showIcon: { type: Boolean, default: true },\n /** Hide the breadcrumb when the trail has a single crumb. */\n hideSingle: { type: Boolean, default: false },\n separator: { type: String, default: '/' },\n },\n emits: {\n select: (_key: string, _node: NavNode) => true,\n },\n setup(props, { emit, attrs }) {\n return () => {\n const trail = props.trail\n if (trail.length === 0 || (props.hideSingle && trail.length === 1)) return null\n\n return h(\n IrisBreadcrumb,\n { ...attrs, separator: props.separator },\n {\n default: () =>\n trail.map((node, i) => {\n const last = i === trail.length - 1\n const content: VNode[] = []\n if (props.showIcon && node.icon) {\n content.push(\n h(IrisIcon, { name: node.icon, size: 14, style: { marginInlineEnd: '4px' } }),\n )\n }\n content.push(h('span', node.title))\n return h(\n IrisBreadcrumbItem,\n {\n key: node.key,\n 'data-iris-admin-crumb': '',\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n cursor: last ? 'default' : 'pointer',\n },\n onClick: last ? undefined : () => emit('select', node.key, node),\n },\n { default: () => content },\n )\n }),\n },\n )\n }\n },\n})\n","import { computed, onBeforeUnmount, ref, type ComputedRef, type Ref } from 'vue'\nimport type { TabsNav, TabsNavState, TabItem } from '@iris-ui-kit/core'\n\nexport interface UseTabsNavReturn {\n tabs: ComputedRef<TabItem[]>\n activeKey: ComputedRef<string | undefined>\n /** Keep-alive include-set (composite cache keys of all open tabs). */\n cacheKeys: ComputedRef<string[]>\n open: TabsNav['open']\n activate: TabsNav['activate']\n close: TabsNav['close']\n closeOthers: TabsNav['closeOthers']\n closeAll: TabsNav['closeAll']\n closeLeft: TabsNav['closeLeft']\n closeRight: TabsNav['closeRight']\n refresh: TabsNav['refresh']\n setPinned: TabsNav['setPinned']\n move: TabsNav['move']\n cacheKey: TabsNav['cacheKey']\n}\n\n/**\n * Vue binding for a framework-agnostic {@link TabsNav} store. Pass a shared\n * `createTabsNav()` instance (the host owns it so the tab bar and the keep-alive\n * content can read the same state) and get reactive `tabs` / `activeKey` /\n * `cacheKeys` plus the store's mutators.\n *\n * ```ts\n * const nav = createTabsNav({ tabs: [{ key: 'home', title: 'Home', pinned: true }] })\n * const { tabs, activeKey, open, close } = useTabsNav(nav)\n * ```\n */\nexport function useTabsNav(nav: TabsNav): UseTabsNavReturn {\n const state = ref(nav.getState()) as Ref<TabsNavState>\n const unsubscribe = nav.subscribe((next) => {\n state.value = next\n })\n onBeforeUnmount(unsubscribe)\n\n return {\n tabs: computed(() => state.value.tabs),\n activeKey: computed(() => state.value.activeKey),\n cacheKeys: computed(() => state.value.tabs.map((t) => nav.cacheKey(t.key))),\n open: nav.open,\n activate: nav.activate,\n close: nav.close,\n closeOthers: nav.closeOthers,\n closeAll: nav.closeAll,\n closeLeft: nav.closeLeft,\n closeRight: nav.closeRight,\n refresh: nav.refresh,\n setPinned: nav.setPinned,\n move: nav.move,\n cacheKey: nav.cacheKey,\n }\n}\n","import type { ComputedRef, InjectionKey, Ref } from 'vue'\nimport type { Placement } from '@iris-ui-kit/core'\n\nexport interface DropdownContext {\n open: ComputedRef<boolean>\n setOpen: (value: boolean) => void\n triggerRef: Ref<HTMLElement | null>\n contentRef: Ref<HTMLElement | null>\n contentId: string\n placement: Placement\n offset: number\n}\n\nexport const DropdownContextKey: InjectionKey<DropdownContext> = Symbol('IrisDropdown')\n","import { computed, defineComponent, provide, ref, useId, watch, type PropType } from 'vue'\nimport { createFloatingMachine, type Placement } from '@iris-ui-kit/core'\nimport { useMachine } from '../../machine/useMachine'\nimport { DropdownContextKey } from './context'\n\n/**\n * Dropdown menu root. Composes `createFloatingMachine` (state) with\n * `useFloating` (positioning) and `useDismiss` (close-on-outside / Escape) —\n * all delegated to the standard hooks used by `IrisPopover`. The dropdown\n * panel's semantics differ from a popover: it uses `role=\"menu\"`, supports\n * arrow-key navigation among items, and items auto-close the menu when\n * selected.\n *\n * @example\n * <IrisDropdown placement=\"bottom-end\">\n * <IrisDropdownTrigger as-child>\n * <IrisButton>Actions</IrisButton>\n * </IrisDropdownTrigger>\n * <IrisDropdownMenu>\n * <IrisDropdownItem @select=\"onCopy\">Copy</IrisDropdownItem>\n * <IrisDropdownItem @select=\"onDelete\">Delete</IrisDropdownItem>\n * </IrisDropdownMenu>\n * </IrisDropdown>\n */\nexport const IrisDropdown = defineComponent({\n name: 'IrisDropdown',\n props: {\n open: { type: Boolean, default: undefined },\n defaultOpen: { type: Boolean, default: false },\n placement: { type: String as PropType<Placement>, default: 'bottom-start' },\n offset: { type: Number, default: 6 },\n },\n emits: {\n 'update:open': (_value: boolean) => true,\n },\n setup(props, { slots, emit }) {\n const isControlled = computed(() => props.open !== undefined)\n const machine = createFloatingMachine(props.defaultOpen ? 'open' : 'closed')\n const { state, send } = useMachine(machine)\n\n watch(\n () => props.open,\n (value) => {\n if (value === undefined) return\n const currentlyOpen = state.value.value === 'open'\n if (value && !currentlyOpen) send({ type: 'OPEN' })\n if (!value && currentlyOpen) send({ type: 'CLOSE' })\n },\n { immediate: true },\n )\n\n const open = computed(() =>\n isControlled.value ? Boolean(props.open) : state.value.value === 'open',\n )\n\n const setOpen = (value: boolean) => {\n if (!isControlled.value) send({ type: value ? 'OPEN' : 'CLOSE' })\n emit('update:open', value)\n }\n\n provide(DropdownContextKey, {\n open,\n setOpen,\n triggerRef: ref(null),\n contentRef: ref(null),\n contentId: useId(),\n placement: props.placement,\n offset: props.offset,\n })\n\n return () => slots.default?.()\n },\n})\n","import { defineComponent, h, inject, type VNode } from 'vue'\nimport { findFirstElement, mergeSlotProps } from '../slot/Slot'\nimport { DropdownContextKey } from './context'\n\nexport const IrisDropdownTrigger = defineComponent({\n name: 'IrisDropdownTrigger',\n inheritAttrs: false,\n props: {\n asChild: { type: Boolean, default: false },\n },\n setup(props, { slots, attrs }) {\n const ctx = inject(DropdownContextKey)\n if (!ctx) {\n throw new Error('[iris-ui] IrisDropdownTrigger must be a descendant of IrisDropdown')\n }\n\n const onClick = (event: MouseEvent) => {\n if (event.defaultPrevented) return\n ctx.setOpen(!ctx.open.value)\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n // Pressing ArrowDown / Enter / Space on the trigger opens AND focuses the menu.\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n ctx.setOpen(true)\n }\n }\n\n const captureRef = (el: unknown) => {\n ctx.triggerRef.value = (el ?? null) as HTMLElement | null\n }\n\n return () => {\n const triggerProps: Record<string, unknown> = {\n 'aria-haspopup': 'menu',\n 'aria-expanded': ctx.open.value ? 'true' : 'false',\n 'aria-controls': ctx.contentId,\n 'data-state': ctx.open.value ? 'open' : 'closed',\n onClick,\n onKeydown: onKeyDown,\n ref: captureRef,\n }\n\n if (props.asChild) {\n const root = findFirstElement(slots.default?.())\n if (!root) {\n if (typeof process === 'undefined' || process.env?.NODE_ENV !== 'production') {\n console.warn('[iris-ui] IrisDropdownTrigger: as-child requires a single child element')\n }\n return null\n }\n const merged = mergeSlotProps(\n { ...triggerProps, ...attrs },\n (root.props ?? {}) as Record<string, unknown>,\n )\n return h(root.type as string, merged, root.children as unknown as VNode[])\n }\n\n return h('button', { type: 'button', ...attrs, ...triggerProps }, slots.default?.())\n }\n },\n})\n","import { Teleport, defineComponent, h, inject, nextTick, ref, watch, type PropType } from 'vue'\nimport { matchTypeahead, nextEnabledIndex } from '@iris-ui-kit/core'\nimport { useFloating } from '../floating/useFloating'\nimport { useDismiss } from '../floating/useDismiss'\nimport { DropdownContextKey } from './context'\n\n/**\n * The menu surface. Renders `role=\"menu\"` and handles ArrowUp/Down navigation\n * across child `IrisDropdownItem`s. Closes on Escape and outside pointerdown.\n * Teleports to body by default.\n */\nexport const IrisDropdownMenu = defineComponent({\n name: 'IrisDropdownMenu',\n inheritAttrs: false,\n props: {\n teleport: {\n type: [String, Object, Boolean] as PropType<string | HTMLElement | false>,\n default: 'body',\n },\n },\n setup(props, { slots, attrs }) {\n const ctx = inject(DropdownContextKey)\n if (!ctx) {\n throw new Error('[iris-ui] IrisDropdownMenu must be a descendant of IrisDropdown')\n }\n\n const innerRef = ref<HTMLElement | null>(null)\n watch(innerRef, (el) => {\n ctx.contentRef.value = el\n })\n\n const { floatingStyles } = useFloating({\n anchor: ctx.triggerRef,\n floating: innerRef,\n open: ctx.open,\n placement: ctx.placement,\n offset: ctx.offset,\n })\n\n useDismiss({\n enabled: ctx.open,\n exclude: [ctx.triggerRef, innerRef],\n onDismiss: () => ctx.setOpen(false),\n })\n\n // Focus first menu item on open.\n watch(ctx.open, async (open) => {\n if (open) {\n await nextTick()\n const items = innerRef.value?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]')\n items?.[0]?.focus()\n } else {\n // Restore focus to trigger.\n ctx.triggerRef.value?.focus?.()\n }\n })\n\n // Typeahead buffer: accumulated printable chars, reset after a ~500ms pause.\n // Plain closure state — does not need to be reactive.\n const typeahead: { buffer: string; timer: ReturnType<typeof setTimeout> | null } = {\n buffer: '',\n timer: null,\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!ctx.open.value) return\n const items = Array.from(\n innerRef.value?.querySelectorAll<HTMLElement>(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])',\n ) ?? [],\n )\n if (items.length === 0) return\n const current = document.activeElement as HTMLElement | null\n const index = current ? items.indexOf(current) : -1\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault()\n items[nextEnabledIndex(index, 1, items.length)]?.focus()\n break\n }\n case 'ArrowUp': {\n event.preventDefault()\n items[nextEnabledIndex(index, -1, items.length)]?.focus()\n break\n }\n case 'Home':\n event.preventDefault()\n items[0]?.focus()\n break\n case 'End':\n event.preventDefault()\n items[items.length - 1]?.focus()\n break\n case 'Tab':\n // Tab closes the menu and lets focus continue.\n ctx.setOpen(false)\n break\n default: {\n // Typeahead: a single printable char jumps to (and repeated chars\n // cycle through) items whose label matches the accumulated buffer.\n if (event.key.length === 1 && !event.metaKey && !event.ctrlKey && !event.altKey) {\n typeahead.buffer += event.key\n if (typeahead.timer) clearTimeout(typeahead.timer)\n typeahead.timer = setTimeout(() => {\n typeahead.buffer = ''\n }, 500)\n const match = matchTypeahead(\n items.map((it) => it.textContent ?? ''),\n typeahead.buffer,\n index,\n )\n if (match >= 0) {\n event.preventDefault()\n items[match]?.focus()\n }\n }\n }\n }\n }\n\n return () => {\n if (!ctx.open.value) return null\n const menuNode = h(\n 'div',\n {\n ...attrs,\n ref: (el: unknown) => {\n innerRef.value = (el ?? null) as HTMLElement | null\n },\n id: ctx.contentId,\n role: 'menu',\n tabindex: -1,\n 'data-iris-dropdown-menu': '',\n 'data-state': 'open',\n onKeydown: onKeyDown,\n style: {\n ...floatingStyles.value,\n background: 'var(--iris-surface-floating)',\n color: 'var(--iris-foreground)',\n border: '1px solid var(--iris-border)',\n borderRadius: 'var(--iris-radius-md)',\n padding: 'var(--iris-padding-sm)',\n boxShadow: 'var(--iris-shadow-lg)',\n minWidth: '160px',\n outline: 'none',\n zIndex: '1000',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n slots.default?.(),\n )\n if (props.teleport === false) return menuNode\n return h(Teleport, { to: props.teleport as string | HTMLElement }, [menuNode])\n }\n },\n})\n","import { defineComponent, h, inject, ref } from 'vue'\nimport { DropdownContextKey } from './context'\n\n/**\n * A single selectable menu item. Emits `select` (with the underlying event)\n * and auto-closes the parent dropdown after selection. Disabled items are\n * skipped by arrow-key navigation in the parent menu.\n */\nexport const IrisDropdownItem = defineComponent({\n name: 'IrisDropdownItem',\n inheritAttrs: false,\n props: {\n disabled: { type: Boolean, default: false },\n /** When true, selecting does NOT close the dropdown. Useful for sub-actions. */\n keepOpen: { type: Boolean, default: false },\n },\n emits: {\n select: (_event: Event) => true,\n },\n setup(props, { slots, attrs, emit }) {\n const ctx = inject(DropdownContextKey)\n if (!ctx) {\n throw new Error('[iris-ui] IrisDropdownItem must be a descendant of IrisDropdownMenu')\n }\n\n const hovered = ref(false)\n\n const fire = (event: Event) => {\n if (props.disabled) return\n emit('select', event)\n if (!props.keepOpen) ctx.setOpen(false)\n }\n\n const onClick = (event: MouseEvent) => {\n if (event.defaultPrevented) return\n fire(event)\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n fire(event)\n }\n }\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n role: 'menuitem',\n tabindex: props.disabled ? -1 : 0,\n 'aria-disabled': props.disabled ? 'true' : undefined,\n 'data-iris-dropdown-item': '',\n 'data-disabled': props.disabled ? '' : undefined,\n onClick,\n onKeydown: onKeyDown,\n onPointerenter: () => (hovered.value = true),\n onPointerleave: () => (hovered.value = false),\n onFocus: () => (hovered.value = true),\n onBlur: () => (hovered.value = false),\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-gap-sm)',\n padding: 'var(--iris-padding-sm, 6px) var(--iris-padding-md)',\n borderRadius: 'var(--iris-radius-sm)',\n cursor: props.disabled ? 'not-allowed' : 'pointer',\n opacity: props.disabled ? '0.5' : '1',\n background:\n hovered.value && !props.disabled ? 'var(--iris-surface-hover)' : 'transparent',\n color: 'inherit',\n outline: 'none',\n fontSize: 'var(--iris-font-size-md, 14px)',\n transition: 'background-color 80ms ease',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n slots.default?.(),\n )\n },\n})\n\n/** Visual divider between groups of items. */\nexport const IrisDropdownSeparator = defineComponent({\n name: 'IrisDropdownSeparator',\n inheritAttrs: false,\n setup(_, { attrs }) {\n return () =>\n h('div', {\n ...attrs,\n role: 'separator',\n 'data-iris-dropdown-separator': '',\n style: {\n height: '1px',\n background: 'var(--iris-border)',\n margin: '4px 0',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n })\n },\n})\n","import { defineComponent, h, nextTick, type PropType, type VNode } from 'vue'\nimport { isClosable, type TabsNav, type TabItem } from '@iris-ui-kit/core'\nimport { useTabsNav } from './useTabsNav'\nimport { IrisIcon } from '../primitives/icon/Icon'\nimport { IrisDropdown } from '../primitives/dropdown/Dropdown'\nimport { IrisDropdownTrigger } from '../primitives/dropdown/DropdownTrigger'\nimport { IrisDropdownMenu } from '../primitives/dropdown/DropdownMenu'\nimport { IrisDropdownItem, IrisDropdownSeparator } from '../primitives/dropdown/DropdownItem'\nimport { IrisSortable } from '../behaviors/Sortable'\nimport { useI18n } from '../i18n'\n\n/**\n * Vben-style multi-tab bar over a shared {@link TabsNav} store. Each open page\n * is a closable chip; clicking activates (`@change`), the × closes, and a\n * trailing actions dropdown runs Refresh / Close / Close-others / Close-all on\n * the active tab. The store owns the tab list + active key; the host watches it\n * to sync routing + keep-alive.\n *\n * Keyboard (WAI-ARIA tablist, automatic activation): ←/→ move + activate the\n * adjacent tab, Home/End jump to the first/last, Delete/Backspace closes the\n * focused tab. Roving tabindex keeps a single tab stop.\n */\nexport const IrisAdminTabs = defineComponent({\n name: 'IrisAdminTabs',\n inheritAttrs: false,\n props: {\n /** Shared tabs store (from `createTabsNav`). */\n nav: { type: Object as PropType<TabsNav>, required: true },\n reorderable: { type: Boolean, default: true },\n },\n emits: {\n change: (_key: string) => true,\n close: (_key: string) => true,\n refresh: (_key: string) => true,\n reorder: (_tabs: TabItem[]) => true,\n },\n setup(props, { emit, attrs }) {\n const { t: tr } = useI18n()\n const t = useTabsNav(props.nav)\n\n const activate = (key: string): void => {\n props.nav.activate(key)\n emit('change', key)\n }\n const close = (key: string): void => {\n props.nav.close(key)\n emit('close', key)\n }\n const refresh = (key: string): void => {\n props.nav.refresh(key)\n emit('refresh', key)\n }\n const reorder = (tabs: TabItem[]): void => {\n tabs.forEach((tab, index) => props.nav.move(tab.key, index))\n emit('reorder', tabs)\n }\n\n const focusTab = (root: HTMLElement | null, key: string | undefined): void => {\n if (!root || !key) return\n const labels = root.querySelectorAll<HTMLElement>('[data-iris-tab-label]')\n labels.forEach((el) => {\n if (el.getAttribute('data-key') === key) el.focus()\n })\n }\n\n const onTablistKeydown = (e: KeyboardEvent): void => {\n const root = e.currentTarget as HTMLElement\n const tabs = t.tabs.value\n const idx = tabs.findIndex((x) => x.key === t.activeKey.value)\n if (idx < 0 || tabs.length === 0) return\n\n if (e.key === 'Delete' || e.key === 'Backspace') {\n const cur = tabs[idx]\n if (cur && isClosable(cur)) {\n e.preventDefault()\n close(cur.key)\n void nextTick(() => focusTab(root, props.nav.getState().activeKey))\n }\n return\n }\n\n let target = -1\n if (e.key === 'ArrowRight') target = (idx + 1) % tabs.length\n else if (e.key === 'ArrowLeft') target = (idx - 1 + tabs.length) % tabs.length\n else if (e.key === 'Home') target = 0\n else if (e.key === 'End') target = tabs.length - 1\n else return\n\n e.preventDefault()\n const key = tabs[target]?.key\n if (!key) return\n activate(key)\n void nextTick(() => focusTab(root, key))\n }\n\n const chip = (tab: TabItem): VNode => {\n const active = tab.key === t.activeKey.value\n const closable = isClosable(tab)\n const labelChildren: VNode[] = []\n if (tab.icon) labelChildren.push(h(IrisIcon, { name: tab.icon, size: 14 }))\n labelChildren.push(h('span', { style: { whiteSpace: 'nowrap' } }, tab.title))\n\n const label = h(\n 'button',\n {\n type: 'button',\n role: 'tab',\n 'data-iris-tab-label': '',\n 'data-key': tab.key,\n 'aria-selected': active ? 'true' : 'false',\n 'aria-current': active ? 'page' : undefined,\n tabindex: active ? 0 : -1,\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--iris-space-xs, 8px)',\n border: 'none',\n background: 'transparent',\n color: 'inherit',\n font: 'inherit',\n fontSize: 'var(--iris-font-size-sm, 13px)',\n cursor: 'pointer',\n padding: '0',\n },\n onClick: () => activate(tab.key),\n },\n labelChildren,\n )\n\n const closeBtn = closable\n ? h(\n 'button',\n {\n type: 'button',\n tabindex: -1,\n 'data-iris-tab-close': '',\n 'aria-label': tr('admin.closeTab', { title: tab.title }),\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n border: 'none',\n borderRadius: '4px',\n background: 'transparent',\n color: 'inherit',\n cursor: 'pointer',\n padding: '0',\n opacity: '0.6',\n },\n onClick: (e: Event) => {\n e.stopPropagation()\n close(tab.key)\n const root = (e.currentTarget as HTMLElement).closest(\n '[role=\"tablist\"]',\n ) as HTMLElement | null\n void nextTick(() => focusTab(root, props.nav.getState().activeKey))\n },\n },\n [h(IrisIcon, { name: 'x', size: 12 })],\n )\n : tab.pinned\n ? h(IrisIcon, { name: 'check-circle', size: 12, style: { opacity: '0.5' } })\n : null\n\n return h(\n 'div',\n {\n key: tab.key,\n 'data-iris-tab': '',\n 'data-active': active ? 'true' : undefined,\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding:\n 'var(--iris-padding-sm, 6px) var(--iris-space-xs, 8px) var(--iris-padding-sm, 6px) var(--iris-space-sm, 12px)',\n borderRadius: 'var(--iris-radius-md, 6px)',\n border: `1px solid ${active ? 'var(--iris-primary)' : 'var(--iris-border)'}`,\n background: active ? 'var(--iris-primary)' : 'var(--iris-surface)',\n color: active ? 'var(--iris-primary-foreground, #fff)' : 'var(--iris-foreground)',\n flex: '0 0 auto',\n },\n },\n [label, closeBtn],\n )\n }\n\n const action = (label: string, run: () => void, disabled = false): VNode =>\n h(IrisDropdownItem, { disabled, onSelect: run }, { default: () => label })\n\n const actionsMenu = (): VNode =>\n h(IrisDropdown, null, {\n default: () => [\n h(\n IrisDropdownTrigger,\n {\n 'aria-label': tr('admin.tabActions'),\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '28px',\n height: '28px',\n borderRadius: 'var(--iris-radius-md, 6px)',\n border: '1px solid var(--iris-border)',\n background: 'var(--iris-surface)',\n color: 'var(--iris-foreground)',\n cursor: 'pointer',\n },\n },\n {\n default: () => h(IrisIcon, { name: 'more-horizontal', size: 16 }),\n },\n ),\n h(IrisDropdownMenu, null, {\n default: () => {\n const key = t.activeKey.value\n if (!key) return [action('No active tab', () => {}, true)]\n return [\n action(tr('admin.refresh'), () => refresh(key)),\n action(tr('admin.close'), () => close(key)),\n h(IrisDropdownSeparator),\n action(tr('admin.closeLeft'), () => props.nav.closeLeft(key)),\n action(tr('admin.closeRight'), () => props.nav.closeRight(key)),\n action(tr('admin.closeOthers'), () => props.nav.closeOthers(key)),\n action(tr('admin.closeAll'), () => props.nav.closeAll()),\n ]\n },\n }),\n ],\n })\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n 'data-iris-admin-tabs': '',\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-space-xs, 8px)',\n padding: 'var(--iris-space-xs, 8px) var(--iris-space-sm, 12px)',\n borderBottom: '1px solid var(--iris-border)',\n background: 'var(--iris-background)',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n h(\n 'div',\n {\n 'data-iris-tabs-scroll': '',\n role: 'tablist',\n 'aria-label': tr('admin.openPages'),\n onKeydown: onTablistKeydown,\n style: {\n overflowX: 'auto',\n flex: '1',\n },\n },\n [\n h(\n IrisSortable,\n {\n items: t.tabs.value,\n getKey: (item: unknown) => (item as TabItem).key,\n onReorder: (items: unknown[]) => reorder(items as TabItem[]),\n disabled: !props.reorderable,\n orientation: 'horizontal',\n style: {\n alignItems: 'center',\n gap: 'var(--iris-space-xs, 8px)',\n width: 'max-content',\n },\n },\n { default: () => t.tabs.value.map((tab) => chip(tab)) },\n ),\n ],\n ),\n actionsMenu(),\n ],\n )\n },\n})\n","import { computed, watch, watchEffect, type ComputedRef, type MaybeRefOrGetter, toValue } from 'vue'\nimport {\n createAdminShell,\n findNavPath,\n type AdminShell,\n type NavNode,\n type TabsNav,\n} from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\n\nexport interface UseAdminShellConfig {\n /** Normalized nav tree driving menu + breadcrumb. */\n menus: MaybeRefOrGetter<NavNode[]>\n /** Active page key (controlled); undefined = uncontrolled. */\n activeKey?: MaybeRefOrGetter<string | undefined>\n defaultActiveKey?: string\n onActiveKeyChange?: (key: string) => void\n /** Fired whenever a nav node / tab becomes active, with the resolved leaf node. */\n onSelect?: (key: string, node: NavNode) => void\n /** Optional shared tabs store; the shell opens/reconciles tabs through it. */\n tabs?: TabsNav\n}\n\nexport interface UseAdminShellReturn {\n /** Current active leaf key ('' when none). */\n activeKey: ComputedRef<string>\n /** Select a nav node: a branch redirects to its first leaf, opens its tab. */\n navigate: (node: NavNode) => void\n /** Reconcile when the active TAB changed (e.g. a close picked a neighbor). */\n syncFromTab: (key: string) => void\n /** Ancestor→node breadcrumb trail of the active key. */\n breadcrumb: ComputedRef<NavNode[]>\n}\n\n/**\n * Vue binding for the framework-agnostic {@link createAdminShell} controller —\n * the menu→tab→active-key wiring that every AdminLayout used to re-implement\n * byte-for-byte. The composable owns the controlled/uncontrolled `activeKey`\n * reconciliation (idiomatic to Vue) and delegates navigate / syncFromTab /\n * branch-resolution / breadcrumb to the shared core shell.\n *\n * Controlled mode renders from the prop directly (no flicker); a watcher keeps\n * the shell's guard-base synced to the prop so the active-change callback fires\n * with the same semantics as before.\n */\nexport function useAdminShell(config: UseAdminShellConfig): UseAdminShellReturn {\n const { defaultActiveKey, onActiveKeyChange, onSelect, tabs } = config\n\n const menus = (): NavNode[] => toValue(config.menus)\n const activeKeyProp = (): string | undefined => toValue(config.activeKey)\n const activeControlled = (): boolean => activeKeyProp() !== undefined\n\n // The shell instance is stable for the composable's lifetime; it reads the\n // latest callbacks via the closure-captured config.\n const shell: AdminShell = createAdminShell({\n menus: menus(),\n defaultActiveKey: activeKeyProp() ?? defaultActiveKey,\n tabs,\n onActiveChange: (key, node) => {\n onActiveKeyChange?.(key)\n if (node) onSelect?.(key, node)\n },\n })\n const state = useStore(shell.store)\n\n // Keep the shell reconciling against the live menu tree.\n watch(menus, (next) => shell.setMenus(next), { flush: 'sync' })\n\n // Controlled: keep the shell's guard-base aligned with the prop (silent — no\n // callback), so navigate fires the active-change callback exactly as before\n // even when a controlled parent does not write the new key back.\n watchEffect(() => {\n const prop = activeKeyProp()\n if (prop !== undefined && shell.getActiveKey() !== prop) {\n shell.store.setState({ activeKey: prop })\n }\n })\n\n const activeKey = computed(() =>\n activeControlled() ? (activeKeyProp() ?? '') : (state.value.activeKey ?? ''),\n )\n\n return {\n activeKey,\n navigate: shell.navigate,\n syncFromTab: shell.syncFromTab,\n breadcrumb: computed(() => (activeKey.value ? findNavPath(menus(), activeKey.value) : [])),\n }\n}\n","import {\n computed,\n defineComponent,\n h,\n onBeforeUnmount,\n ref,\n watch,\n type PropType,\n type VNode,\n} from 'vue'\nimport { type NavNode, type TabsNav } from '@iris-ui-kit/core'\nimport { IrisSidebarLayout } from '../layouts/SidebarLayout'\nimport { IrisHeaderLayout } from '../layouts/HeaderLayout'\nimport { IrisNavMenu } from './NavMenu'\nimport { IrisAdminBreadcrumb } from './AdminBreadcrumb'\nimport { IrisAdminTabs } from './AdminTabs'\nimport { IrisIcon } from '../primitives/icon/Icon'\nimport { useI18n } from '../i18n'\nimport { useAdminShell } from './useAdminShell'\n\nexport type IrisAdminLayoutMode = 'sidebar' | 'horizontal' | 'full-content'\nexport type IrisAdminMenuAlign = 'start' | 'center' | 'end'\nexport type IrisAdminContentWidth = 'fluid' | 'centered'\nexport type IrisAdminContentHeight = 'auto' | 'viewport'\n\n/**\n * The CMS / admin shell — a Vben-style, router-agnostic, data-driven layout that\n * composes IrisSidebarLayout + IrisHeaderLayout with the admin nav pieces. One\n * `menus` tree drives the collapsible sidebar nav, the header breadcrumb, and\n * (when a `tabs` store is passed) the multi-tab bar; `activeKey` is the current\n * page (v-model). The host owns routing: react to `@select` / `update:activeKey`\n * and render the page in the default slot (wrap it in `<KeepAlive>` keyed by\n * `tabs.cacheKey` for Vben-style tab caching).\n *\n * Slots: `logo({ collapsed })`, `toolbar` (header end), default `({ activeKey })`,\n * `footer`. Modes: `sidebar` (default) and `full-content` (chrome hidden).\n */\nexport const IrisAdminLayout = defineComponent({\n name: 'IrisAdminLayout',\n inheritAttrs: false,\n props: {\n /** Normalized nav tree driving menu + breadcrumb. */\n menus: { type: Array as PropType<NavNode[]>, required: true },\n /** Active page key (v-model:activeKey). */\n activeKey: { type: String, default: undefined },\n /** Initial active page key when `activeKey` is uncontrolled. */\n defaultActiveKey: { type: String, default: undefined },\n /** Sidebar collapsed (v-model:collapsed); undefined = uncontrolled. */\n collapsed: { type: Boolean as PropType<boolean | undefined>, default: undefined },\n defaultCollapsed: { type: Boolean, default: false },\n mode: { type: String as PropType<IrisAdminLayoutMode>, default: 'sidebar' },\n /** Brand text shown next to the logo when expanded. */\n appTitle: { type: String, default: 'Iris Admin' },\n /** Optional shared tabs store; when present the tab bar is rendered. */\n tabs: { type: Object as PropType<TabsNav>, default: undefined },\n showTabs: { type: Boolean, default: true },\n showBreadcrumb: { type: Boolean, default: true },\n stickyHeader: { type: Boolean, default: true },\n stickyTabs: { type: Boolean, default: true },\n menuAlign: { type: String as PropType<IrisAdminMenuAlign>, default: 'start' },\n contentWidth: { type: String as PropType<IrisAdminContentWidth>, default: 'fluid' },\n contentHeight: {\n type: String as PropType<IrisAdminContentHeight>,\n default: 'viewport',\n },\n sidebarWidth: { type: [Number, String] as PropType<number | string>, default: 240 },\n collapsedWidth: { type: [Number, String] as PropType<number | string>, default: 64 },\n },\n emits: {\n 'update:activeKey': (_key: string) => true,\n 'update:collapsed': (_value: boolean) => true,\n select: (_key: string, _node: NavNode) => true,\n },\n setup(props, { emit, slots, attrs }) {\n const { t } = useI18n()\n\n const {\n activeKey,\n navigate,\n syncFromTab,\n breadcrumb: trail,\n } = useAdminShell({\n menus: () => props.menus,\n activeKey: () => props.activeKey,\n defaultActiveKey: props.defaultActiveKey,\n tabs: props.tabs,\n onActiveKeyChange: (key) => emit('update:activeKey', key),\n onSelect: (key, node) => emit('select', key, node),\n })\n\n const collapseControlled = computed(() => props.collapsed !== undefined)\n const internalCollapsed = ref(props.defaultCollapsed)\n const collapsed = computed(() =>\n collapseControlled.value ? (props.collapsed as boolean) : internalCollapsed.value,\n )\n const setCollapsed = (value: boolean): void => {\n if (!collapseControlled.value) internalCollapsed.value = value\n emit('update:collapsed', value)\n }\n\n // NavMenu / Breadcrumb emit (key, node); route the node through navigate.\n const onSelect = (_key: string, node: NavNode): void => navigate(node)\n\n // Tab activation (incl. close → neighbor) is the store's job; mirror it into\n // the layout's active key so the breadcrumb + content stay in sync.\n if (props.tabs) {\n const tabsActive = ref(props.tabs.getState().activeKey)\n const unsubscribe = props.tabs.subscribe((s) => {\n tabsActive.value = s.activeKey\n })\n onBeforeUnmount(unsubscribe)\n watch(tabsActive, (key) => {\n if (key) syncFromTab(key)\n })\n }\n\n const renderLogo = (state: { collapsed: boolean }): VNode | VNode[] => {\n if (slots.logo) return slots.logo(state) as VNode[]\n return h(\n 'div',\n {\n 'data-iris-admin-logo': '',\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-space-sm, 12px)',\n height: '52px',\n padding: '0 var(--iris-space-md, 16px)',\n color: 'var(--iris-foreground)',\n fontWeight: '700',\n fontSize: 'var(--iris-font-size-lg, 16px)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n flexShrink: 0,\n },\n },\n [\n h(\n 'span',\n {\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '28px',\n height: '28px',\n borderRadius: 'var(--iris-radius-md, 6px)',\n background: 'var(--iris-primary)',\n color: 'var(--iris-primary-foreground, #fff)',\n flexShrink: 0,\n },\n },\n [h(IrisIcon, { name: 'menu', size: 18 })],\n ),\n state.collapsed ? null : h('span', props.appTitle),\n ],\n )\n }\n\n const collapseToggle = (): VNode =>\n h(\n 'button',\n {\n type: 'button',\n 'data-iris-admin-collapse': '',\n 'aria-label': collapsed.value ? t('admin.expandSidebar') : t('admin.collapseSidebar'),\n 'aria-pressed': collapsed.value ? 'true' : 'false',\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n borderRadius: 'var(--iris-radius-md, 6px)',\n background: 'transparent',\n color: 'var(--iris-foreground)',\n cursor: 'pointer',\n flexShrink: 0,\n },\n onClick: () => setCollapsed(!collapsed.value),\n },\n [h(IrisIcon, { name: collapsed.value ? 'chevron-right' : 'menu', size: 18 })],\n )\n\n const renderHeaderBar = (): VNode =>\n h(\n 'div',\n {\n 'data-iris-admin-headerbar': '',\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n height: '52px',\n padding: '0 16px',\n borderBottom: '1px solid var(--iris-border)',\n background: 'var(--iris-background)',\n },\n },\n [\n collapseToggle(),\n props.showBreadcrumb\n ? h(IrisAdminBreadcrumb, { trail: trail.value, hideSingle: false, onSelect })\n : null,\n h('div', { style: { flex: '1' } }),\n slots.toolbar\n ? h(\n 'div',\n {\n 'data-iris-admin-toolbar': '',\n style: { display: 'flex', alignItems: 'center', gap: '8px' },\n },\n slots.toolbar(),\n )\n : null,\n ],\n )\n\n const renderContent = (horizontal = false): VNode =>\n h(\n 'div',\n {\n 'data-iris-admin-content': '',\n 'data-width': props.contentWidth,\n style: {\n boxSizing: 'border-box',\n width: '100%',\n maxWidth: props.contentWidth === 'centered' ? '72rem' : undefined,\n marginInline: props.contentWidth === 'centered' ? 'auto' : undefined,\n padding: '16px',\n },\n },\n [\n horizontal && props.showBreadcrumb\n ? h(IrisAdminBreadcrumb, { trail: trail.value, hideSingle: false, onSelect })\n : null,\n ...(slots.default?.({ activeKey: activeKey.value }) ?? []),\n ],\n )\n\n const renderTabs = (): VNode | null =>\n props.tabs && props.showTabs\n ? h(\n 'div',\n {\n 'data-iris-admin-tabs-region': '',\n 'data-sticky': props.stickyTabs ? 'true' : undefined,\n style: {\n position: props.stickyTabs && !props.stickyHeader ? 'sticky' : 'relative',\n top: '0',\n zIndex: '49',\n },\n },\n [h(IrisAdminTabs, { nav: props.tabs })],\n )\n : null\n\n return () => {\n if (props.mode === 'full-content') {\n return h(\n 'div',\n {\n ...attrs,\n 'data-iris-admin-layout': '',\n 'data-mode': 'full-content',\n style: {\n height: '100%',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n slots.default?.({ activeKey: activeKey.value }) ?? [],\n )\n }\n\n if (props.mode === 'horizontal') {\n const justifyContent =\n props.menuAlign === 'center'\n ? 'center'\n : props.menuAlign === 'end'\n ? 'flex-end'\n : 'flex-start'\n return h(\n 'div',\n {\n ...attrs,\n 'data-iris-admin-layout': '',\n 'data-mode': 'horizontal',\n style: {\n height: props.contentHeight === 'viewport' ? '100vh' : 'auto',\n minHeight: '100vh',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n h(\n IrisHeaderLayout,\n { sticky: props.stickyHeader },\n {\n header: () =>\n h('div', { 'data-iris-admin-header': '' }, [\n h(\n 'div',\n {\n 'data-iris-admin-headerbar': '',\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n minHeight: '52px',\n padding: '0 16px',\n background: 'var(--iris-background)',\n },\n },\n [\n renderLogo({ collapsed: false }),\n h(\n 'div',\n {\n 'data-iris-admin-topnav': '',\n style: {\n display: 'flex',\n flex: '1',\n minWidth: '0',\n justifyContent,\n },\n },\n [\n h(IrisNavMenu, {\n items: props.menus,\n activeKey: activeKey.value,\n orientation: 'horizontal',\n onSelect,\n }),\n ],\n ),\n slots.toolbar\n ? h(\n 'div',\n {\n 'data-iris-admin-toolbar': '',\n style: { display: 'flex', alignItems: 'center', gap: '8px' },\n },\n slots.toolbar(),\n )\n : null,\n ],\n ),\n renderTabs(),\n ]),\n default: () => renderContent(true),\n ...(slots.footer ? { footer: () => slots.footer!() } : {}),\n },\n ),\n ],\n )\n }\n\n return h(\n IrisSidebarLayout,\n {\n ...attrs,\n collapsed: collapsed.value,\n width: props.sidebarWidth,\n collapsedWidth: props.collapsedWidth,\n 'onUpdate:collapsed': setCollapsed,\n 'data-iris-admin-layout': '',\n 'data-mode': 'sidebar',\n style: {\n height: '100vh',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n {\n sidebar: (state: { collapsed: boolean }) =>\n h(\n 'div',\n {\n 'data-iris-admin-sidebar': '',\n style: {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n borderInlineEnd: '1px solid var(--iris-border)',\n background: 'var(--iris-surface)',\n },\n },\n [\n renderLogo(state),\n h(\n 'div',\n { style: { flex: '1', overflowY: 'auto', overflowX: 'hidden', padding: '8px' } },\n [\n h(IrisNavMenu, {\n items: props.menus,\n activeKey: activeKey.value,\n collapsed: state.collapsed,\n onSelect,\n }),\n ],\n ),\n ],\n ),\n default: () =>\n h(\n IrisHeaderLayout,\n { sticky: props.stickyHeader },\n {\n header: () =>\n h('div', { 'data-iris-admin-header': '' }, [renderHeaderBar(), renderTabs()]),\n default: () => renderContent(),\n ...(slots.footer ? { footer: () => slots.footer!() } : {}),\n },\n ),\n },\n )\n }\n },\n})\n\n/** Public input/event surface inferred from the runtime Vue component. */\nexport type IrisAdminLayoutProps = InstanceType<typeof IrisAdminLayout>['$props']\n","import { computed, onBeforeUnmount, onMounted, ref, type ComputedRef, type Ref } from 'vue'\nimport type { AdminPreferences, AdminPreferencesState } from '@iris-ui-kit/core'\n\nexport interface UseAdminPreferencesReturn {\n state: ComputedRef<AdminPreferencesState>\n set: AdminPreferences['set']\n patch: AdminPreferences['patch']\n reset: AdminPreferences['reset']\n hydrate: AdminPreferences['hydrate']\n flush: AdminPreferences['flush']\n}\n\n/** Thin Vue bridge for the framework-agnostic admin preferences controller. */\nexport function useAdminPreferences(\n preferences: AdminPreferences,\n hydrate = true,\n): UseAdminPreferencesReturn {\n const state = ref(preferences.getState()) as Ref<AdminPreferencesState>\n const unsubscribe = preferences.subscribe((next) => {\n state.value = next\n })\n onMounted(() => {\n if (hydrate) void preferences.hydrate()\n })\n onBeforeUnmount(unsubscribe)\n return {\n state: computed(() => state.value),\n set: preferences.set,\n patch: preferences.patch,\n reset: preferences.reset,\n hydrate: preferences.hydrate,\n flush: preferences.flush,\n }\n}\n"]}
|
package/dist/data.cjs
CHANGED
|
@@ -30,6 +30,7 @@ function useGroupedView(config) {
|
|
|
30
30
|
});
|
|
31
31
|
return {
|
|
32
32
|
store: controller.store,
|
|
33
|
+
expansion: controller.expansion,
|
|
33
34
|
setRows: (rows, columns) => controller.setRows(rows, columns),
|
|
34
35
|
toggleGroup: (key) => controller.toggleGroup(key),
|
|
35
36
|
expandGroup: (key) => controller.expandGroup(key),
|
package/dist/data.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/useStore.ts","../src/data/useDataSource.ts","../src/data/useGroupedView.ts"],"names":["shallowRef","onScopeDispose","createDataSource","onMounted","createGroupedView","computed"],"mappings":";;;;;;AASO,SAAS,SAAY,KAAA,EAAkD;AAC5E,EAAA,MAAM,KAAA,GAAQA,cAAA,CAAW,KAAA,CAAM,QAAA,EAAU,CAAA;AACzC,EAAAC,kBAAA,CAAe,MAAM,SAAA,CAAU,CAAC,SAAU,KAAA,CAAM,KAAA,GAAQ,IAAK,CAAC,CAAA;AAC9D,EAAA,OAAO,KAAA;AACT;;;ACqBO,SAAS,cAAiB,MAAA,EAA+C;AAC9E,EAAA,MAAM,aAAaC,qBAAA,CAAiB,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA;AACnE,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,KAAc,KAAA;AAEvC,EAAA,IAAI,SAAA,EAAW;AACb,IAAAC,aAAA,CAAU,MAAM,KAAK,UAAA,CAAW,IAAA,EAAM,CAAA;AAAA,EACxC;AAGA,EAAAF,kBAAAA,CAAe,MAAM,UAAA,CAAW,OAAA,EAAS,CAAA;AAEzC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AACvC,EAAA,OAAO,EAAE,GAAG,UAAA,EAAY,KAAA,EAAM;AAChC;
|
|
1
|
+
{"version":3,"sources":["../src/useStore.ts","../src/data/useDataSource.ts","../src/data/useGroupedView.ts"],"names":["shallowRef","onScopeDispose","createDataSource","onMounted","createGroupedView","computed"],"mappings":";;;;;;AASO,SAAS,SAAY,KAAA,EAAkD;AAC5E,EAAA,MAAM,KAAA,GAAQA,cAAA,CAAW,KAAA,CAAM,QAAA,EAAU,CAAA;AACzC,EAAAC,kBAAA,CAAe,MAAM,SAAA,CAAU,CAAC,SAAU,KAAA,CAAM,KAAA,GAAQ,IAAK,CAAC,CAAA;AAC9D,EAAA,OAAO,KAAA;AACT;;;ACqBO,SAAS,cAAiB,MAAA,EAA+C;AAC9E,EAAA,MAAM,aAAaC,qBAAA,CAAiB,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA;AACnE,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,KAAc,KAAA;AAEvC,EAAA,IAAI,SAAA,EAAW;AACb,IAAAC,aAAA,CAAU,MAAM,KAAK,UAAA,CAAW,IAAA,EAAM,CAAA;AAAA,EACxC;AAGA,EAAAF,kBAAAA,CAAe,MAAM,UAAA,CAAW,OAAA,EAAS,CAAA;AAEzC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AACvC,EAAA,OAAO,EAAE,GAAG,UAAA,EAAY,KAAA,EAAM;AAChC;ACjBO,SAAS,eACd,MAAA,EACwB;AACxB,EAAA,MAAM,UAAA,GAAaG,uBAA0B,MAAM,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQC,aAAS,MAAM;AAC3B,IAAA,MAAM,IAAI,QAAA,CAAS,KAAA;AACnB,IAAA,OAAO,CAAA,CAAE,KAAA;AAAA,EACX,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAO,UAAA,CAAW,KAAA;AAAA,IAClB,WAAW,UAAA,CAAW,SAAA;AAAA,IACtB,SAAS,CAAC,IAAA,EAAM,YAAY,UAAA,CAAW,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,IAC5D,WAAA,EAAa,CAAC,GAAA,KAAQ,UAAA,CAAW,YAAY,GAAG,CAAA;AAAA,IAChD,WAAA,EAAa,CAAC,GAAA,KAAQ,UAAA,CAAW,YAAY,GAAG,CAAA;AAAA,IAChD,aAAA,EAAe,CAAC,GAAA,KAAQ,UAAA,CAAW,cAAc,GAAG,CAAA;AAAA,IACpD,SAAA,EAAW,MAAM,UAAA,CAAW,SAAA,EAAU;AAAA,IACtC,WAAA,EAAa,MAAM,UAAA,CAAW,WAAA,EAAY;AAAA,IAC1C,KAAA;AAAA,IACA,SAAA,EAAW,CAAC,OAAA,KAAY,UAAA,CAAW,UAAU,OAAO;AAAA,GACtD;AACF","file":"data.cjs","sourcesContent":["import { shallowRef, onScopeDispose, type ShallowRef } from 'vue'\nimport type { ReadonlyStore, Store } from '@iris-ui-kit/core'\n\n/**\n * Bridge a framework-agnostic `@iris-ui-kit/core` store into a Vue ref — updates on\n * every store emission. The mirror of React's `useSyncExternalStore`, Solid's\n * `createSignal`, and Svelte's `readable`. Seeds synchronously from\n * `store.getState()` (SSR-safe); detaches on scope dispose.\n */\nexport function useStore<T>(store: ReadonlyStore<T>): Readonly<ShallowRef<T>> {\n const state = shallowRef(store.getState()) as ShallowRef<T>\n onScopeDispose(store.subscribe((next) => (state.value = next)))\n return state\n}\n\n/**\n * Subscribe to a DERIVED slice of a core store — the ref updates only when\n * `selector(state)` changes per `equals` (default `Object.is`), not on every\n * store emission. Built on {@link Store.subscribeWith}.\n */\nexport function useStoreSelector<T, U>(\n store: Store<T>,\n selector: (state: T) => U,\n equals?: (a: U, b: U) => boolean,\n): Readonly<ShallowRef<U>> {\n const slice = shallowRef(selector(store.getState())) as ShallowRef<U>\n onScopeDispose(store.subscribeWith(selector, (v) => (slice.value = v), equals))\n return slice\n}\n","import { onMounted, onScopeDispose, type ShallowRef } from 'vue'\nimport {\n createDataSource,\n type DataSourceController,\n type DataSourceConfig,\n type DataSourceState,\n} from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\n\nexport interface UseDataSource<T> extends DataSourceController<T> {\n /**\n * The live data-source state as a reactive ref: rows, total, page/pageSize,\n * sort/multiSort, filters/filterRules, loading/loadingMore, hasMore,\n * selectedKeys, and the per-row pendingRows/rowErrors.\n */\n state: ShallowRef<DataSourceState<T>>\n}\n\n/**\n * Vue bridge over the framework-agnostic {@link createDataSource} — the unified\n * data engine (paged/infinite + multi-sort + typed filters + selection +\n * per-row + optimistic mutate). Creates the controller once in `setup()`,\n * mirrors its store into a reactive ref, and returns the controller plus its\n * live `state`. A thin bridge — all logic lives in `@iris-ui-kit/core`.\n *\n * Constructed with `immediate: false` so no fetch fires during `setup()`\n * (SSR-safe: server rendering never runs `onMounted`); the initial load is\n * kicked from `onMounted` when the caller's config says `immediate !== false`.\n * The `onMounted` registration is conditional on that flag — inside a bare\n * `effectScope` there is no component instance and Vue would warn on an\n * unconditional registration. The controller is torn down on scope dispose\n * (aborting any in-flight fetch), so a late response never writes back to a\n * torn-down instance.\n */\nexport function useDataSource<T>(config: DataSourceConfig<T>): UseDataSource<T> {\n const controller = createDataSource({ ...config, immediate: false })\n const immediate = config.immediate !== false\n\n if (immediate) {\n onMounted(() => void controller.load())\n }\n // Abort any in-flight fetch + detach the controller's internal subscriptions\n // on unmount (a late response must not write back to a torn-down instance).\n onScopeDispose(() => controller.destroy())\n\n const state = useStore(controller.store)\n return { ...controller, state }\n}\n","import { computed, type ComputedRef } from 'vue'\nimport {\n createGroupedView,\n type GroupedViewConfig,\n type GroupedViewState,\n type GroupedViewStore,\n} from '@iris-ui-kit/core'\nimport type { DataViewColumn } from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\n\nexport interface UseGroupedView<Row, K extends string | number = string> {\n store: ReturnType<typeof createGroupedView<Row, K>>['store']\n /** The composed expansion model (multiple-open) — bridge it like a Vue Table: `useStore(expansion.store)`. */\n expansion: ReturnType<typeof createGroupedView<Row, K>>['expansion']\n setRows: (rows: readonly Row[], columns?: readonly DataViewColumn<Row>[]) => void\n toggleGroup: (key: K) => void\n expandGroup: (key: K) => void\n collapseGroup: (key: K) => void\n expandAll: () => void\n collapseAll: () => void\n /** Reactive live grouped-view state. */\n state: ComputedRef<GroupedViewState<Row, K>>\n setConfig: (partial: Partial<GroupedViewConfig<Row, K>>) => void\n}\n\n/**\n * Vue bridge over the framework-agnostic {@link createGroupedView}.\n * Creates the controller once, subscribes its store to a reactive ref,\n * and returns the controller plus a computed `state`.\n */\nexport function useGroupedView<Row, K extends string | number = string>(\n config: GroupedViewConfig<Row, K>,\n): UseGroupedView<Row, K> {\n const controller = createGroupedView<Row, K>(config)\n const storeRef = useStore(controller.store)\n const state = computed(() => {\n const s = storeRef.value as GroupedViewStore<Row, K>\n return s.state\n })\n\n return {\n store: controller.store,\n expansion: controller.expansion,\n setRows: (rows, columns) => controller.setRows(rows, columns),\n toggleGroup: (key) => controller.toggleGroup(key),\n expandGroup: (key) => controller.expandGroup(key),\n collapseGroup: (key) => controller.collapseGroup(key),\n expandAll: () => controller.expandAll(),\n collapseAll: () => controller.collapseAll(),\n state,\n setConfig: (partial) => controller.setConfig(partial),\n }\n}\n"]}
|
package/dist/data.d.cts
CHANGED
|
@@ -28,8 +28,10 @@ interface UseDataSource<T> extends DataSourceController<T> {
|
|
|
28
28
|
*/
|
|
29
29
|
declare function useDataSource<T>(config: DataSourceConfig<T>): UseDataSource<T>;
|
|
30
30
|
|
|
31
|
-
interface UseGroupedView<Row, K = string> {
|
|
31
|
+
interface UseGroupedView<Row, K extends string | number = string> {
|
|
32
32
|
store: ReturnType<typeof createGroupedView<Row, K>>['store'];
|
|
33
|
+
/** The composed expansion model (multiple-open) — bridge it like a Vue Table: `useStore(expansion.store)`. */
|
|
34
|
+
expansion: ReturnType<typeof createGroupedView<Row, K>>['expansion'];
|
|
33
35
|
setRows: (rows: readonly Row[], columns?: readonly DataViewColumn<Row>[]) => void;
|
|
34
36
|
toggleGroup: (key: K) => void;
|
|
35
37
|
expandGroup: (key: K) => void;
|
|
@@ -45,6 +47,6 @@ interface UseGroupedView<Row, K = string> {
|
|
|
45
47
|
* Creates the controller once, subscribes its store to a reactive ref,
|
|
46
48
|
* and returns the controller plus a computed `state`.
|
|
47
49
|
*/
|
|
48
|
-
declare function useGroupedView<Row, K = string>(config: GroupedViewConfig<Row, K>): UseGroupedView<Row, K>;
|
|
50
|
+
declare function useGroupedView<Row, K extends string | number = string>(config: GroupedViewConfig<Row, K>): UseGroupedView<Row, K>;
|
|
49
51
|
|
|
50
52
|
export { type UseDataSource, type UseGroupedView, useDataSource, useGroupedView };
|
package/dist/data.d.ts
CHANGED
|
@@ -28,8 +28,10 @@ interface UseDataSource<T> extends DataSourceController<T> {
|
|
|
28
28
|
*/
|
|
29
29
|
declare function useDataSource<T>(config: DataSourceConfig<T>): UseDataSource<T>;
|
|
30
30
|
|
|
31
|
-
interface UseGroupedView<Row, K = string> {
|
|
31
|
+
interface UseGroupedView<Row, K extends string | number = string> {
|
|
32
32
|
store: ReturnType<typeof createGroupedView<Row, K>>['store'];
|
|
33
|
+
/** The composed expansion model (multiple-open) — bridge it like a Vue Table: `useStore(expansion.store)`. */
|
|
34
|
+
expansion: ReturnType<typeof createGroupedView<Row, K>>['expansion'];
|
|
33
35
|
setRows: (rows: readonly Row[], columns?: readonly DataViewColumn<Row>[]) => void;
|
|
34
36
|
toggleGroup: (key: K) => void;
|
|
35
37
|
expandGroup: (key: K) => void;
|
|
@@ -45,6 +47,6 @@ interface UseGroupedView<Row, K = string> {
|
|
|
45
47
|
* Creates the controller once, subscribes its store to a reactive ref,
|
|
46
48
|
* and returns the controller plus a computed `state`.
|
|
47
49
|
*/
|
|
48
|
-
declare function useGroupedView<Row, K = string>(config: GroupedViewConfig<Row, K>): UseGroupedView<Row, K>;
|
|
50
|
+
declare function useGroupedView<Row, K extends string | number = string>(config: GroupedViewConfig<Row, K>): UseGroupedView<Row, K>;
|
|
49
51
|
|
|
50
52
|
export { type UseDataSource, type UseGroupedView, useDataSource, useGroupedView };
|
package/dist/data.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { createClientDataSource, createDataSource, createGroupedView, useDataSource, useGroupedView } from './chunk-
|
|
1
|
+
export { createClientDataSource, createDataSource, createGroupedView, useDataSource, useGroupedView } from './chunk-QBFYIDY7.js';
|
|
2
2
|
import './chunk-75GSYEJS.js';
|
|
3
3
|
//# sourceMappingURL=data.js.map
|
|
4
4
|
//# sourceMappingURL=data.js.map
|
package/dist/floating.cjs
CHANGED
|
@@ -7,6 +7,7 @@ var dom = require('@floating-ui/dom');
|
|
|
7
7
|
function useFloating(options) {
|
|
8
8
|
const x = vue.ref(0);
|
|
9
9
|
const y = vue.ref(0);
|
|
10
|
+
const positioned = vue.ref(false);
|
|
10
11
|
const strategy = vue.ref(options.strategy ?? "absolute");
|
|
11
12
|
const finalPlacement = vue.ref(options.placement ?? "bottom");
|
|
12
13
|
const arrowX = vue.ref();
|
|
@@ -52,6 +53,7 @@ function useFloating(options) {
|
|
|
52
53
|
if (token !== epoch) return;
|
|
53
54
|
x.value = result.x;
|
|
54
55
|
y.value = result.y;
|
|
56
|
+
positioned.value = true;
|
|
55
57
|
finalPlacement.value = result.placement;
|
|
56
58
|
const arrowData = result.middlewareData.arrow;
|
|
57
59
|
arrowX.value = arrowData?.x;
|
|
@@ -64,6 +66,7 @@ function useFloating(options) {
|
|
|
64
66
|
cleanupAutoUpdate = null;
|
|
65
67
|
epoch++;
|
|
66
68
|
if (isOpen && anchorEl && floatingEl) {
|
|
69
|
+
positioned.value = false;
|
|
67
70
|
cleanupAutoUpdate = dom.autoUpdate(anchorEl, floatingEl, () => {
|
|
68
71
|
void update();
|
|
69
72
|
});
|
|
@@ -90,7 +93,11 @@ function useFloating(options) {
|
|
|
90
93
|
top: "0",
|
|
91
94
|
left: "0",
|
|
92
95
|
transform: `translate3d(${Math.round(x.value)}px, ${Math.round(y.value)}px, 0)`,
|
|
93
|
-
width: "max-content"
|
|
96
|
+
width: "max-content",
|
|
97
|
+
// Hidden until the first positioning cycle lands — prevents a flash at
|
|
98
|
+
// the viewport origin. visibility (not display:none) keeps the panel
|
|
99
|
+
// measurable so Floating UI can compute its real coordinates.
|
|
100
|
+
visibility: positioned.value ? "visible" : "hidden"
|
|
94
101
|
}));
|
|
95
102
|
return { x, y, strategy, finalPlacement, floatingStyles, update, arrowX, arrowY, arrowSide };
|
|
96
103
|
}
|
|
@@ -109,6 +116,7 @@ function useDismiss(options) {
|
|
|
109
116
|
const onPointerDown = (event) => {
|
|
110
117
|
if (!options.enabled.value) return;
|
|
111
118
|
if (isExcluded(event.target)) return;
|
|
119
|
+
if (options.excludePredicate?.(event.target)) return;
|
|
112
120
|
options.onDismiss();
|
|
113
121
|
};
|
|
114
122
|
const onKeyDown = (event) => {
|
package/dist/floating.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/primitives/floating/useFloating.ts","../src/primitives/floating/useDismiss.ts"],"names":["ref","shallowRef","offsetMiddleware","flipMiddleware","shiftMiddleware","sizeMiddleware","arrowMiddleware","computePosition","watch","autoUpdate","onScopeDispose","computed"],"mappings":";;;;;;AA6FO,SAAS,YAAY,OAAA,EAAgD;AAC1E,EAAA,MAAM,CAAA,GAAIA,QAAI,CAAC,CAAA;AACf,EAAA,MAAM,CAAA,GAAIA,QAAI,CAAC,CAAA;AACf,EAAA,MAAM,QAAA,GAAWA,OAAA,CAAc,OAAA,CAAQ,QAAA,IAAY,UAAU,CAAA;AAC7D,EAAA,MAAM,cAAA,GAAiBA,OAAA,CAAe,OAAA,CAAQ,SAAA,IAAa,QAAQ,CAAA;AACnE,EAAA,MAAM,SAASA,OAAA,EAAwB;AACvC,EAAA,MAAM,SAASA,OAAA,EAAwB;AAEvC,EAAA,MAAM,UAAA,GAAaC,cAAA,CAAyB,EAAE,CAAA;AAC9C,EAAA,iBAAA,EAAkB;AAElB,EAAA,SAAS,iBAAA,GAAoB;AAC3B,IAAA,MAAM,KAAmB,EAAC;AAC1B,IAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW,EAAA,CAAG,KAAKC,UAAA,CAAiB,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC1E,IAAA,IAAI,QAAQ,IAAA,KAAS,KAAA,EAAO,EAAA,CAAG,IAAA,CAAKC,UAAgB,CAAA;AACpD,IAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,KAAA,EAAO,EAAA,CAAG,IAAA,CAAKC,UAAgB,EAAE,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AACpE,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,UAAU,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,GAAW,QAAQ,IAAA,GAAO,CAAA;AAClE,MAAA,EAAA,CAAG,IAAA;AAAA,QACDC,QAAA,CAAe;AAAA,UACb,OAAA;AAAA,UACA,KAAA,CAAM,EAAE,cAAA,EAAgB,eAAA,EAAiB,UAAS,EAAG;AACnD,YAAA,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,KAAA,EAAO;AAAA,cACrC,QAAA,EAAU,GAAG,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,cAAc,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,cACpD,SAAA,EAAW,GAAG,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,eAAe,CAAC,CAAC,CAAA,EAAA;AAAA,aACvD,CAAA;AAAA,UACH;AAAA,SACD;AAAA,OACH;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,KAAA,EAAO,EAAA,CAAG,IAAA,CAAKC,SAAA,CAAgB,EAAE,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,CAAC,CAAA;AACnF,IAAA,IAAI,QAAQ,UAAA,EAAY,EAAA,CAAG,IAAA,CAAK,GAAG,QAAQ,UAAU,CAAA;AACrD,IAAA,UAAA,CAAW,KAAA,GAAQ,EAAA;AAAA,EACrB;AAEA,EAAA,IAAI,iBAAA,GAAyC,IAAA;AAI7C,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,eAAe,MAAA,GAAS;AACtB,IAAA,MAAM,CAAA,GAAI,QAAQ,MAAA,CAAO,KAAA;AACzB,IAAA,MAAM,CAAA,GAAI,QAAQ,QAAA,CAAS,KAAA;AAC3B,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG;AACd,IAAA,iBAAA,EAAkB;AAClB,IAAA,MAAM,QAAQ,EAAE,KAAA;AAChB,IAAA,MAAM,MAAA,GAAS,MAAMC,mBAAA,CAAgB,CAAA,EAAG,CAAA,EAAG;AAAA,MACzC,SAAA,EAAW,QAAQ,SAAA,IAAa,QAAA;AAAA,MAChC,UAAU,QAAA,CAAS,KAAA;AAAA,MACnB,YAAY,UAAA,CAAW;AAAA,KACxB,CAAA;AACD,IAAA,IAAI,UAAU,KAAA,EAAO;AACrB,IAAA,CAAA,CAAE,QAAQ,MAAA,CAAO,CAAA;AACjB,IAAA,CAAA,CAAE,QAAQ,MAAA,CAAO,CAAA;AACjB,IAAA,cAAA,CAAe,QAAQ,MAAA,CAAO,SAAA;AAC9B,IAAA,MAAM,SAAA,GAAY,OAAO,cAAA,CAAe,KAAA;AACxC,IAAA,MAAA,CAAO,QAAQ,SAAA,EAAW,CAAA;AAC1B,IAAA,MAAA,CAAO,QAAQ,SAAA,EAAW,CAAA;AAAA,EAC5B;AAEA,EAAAC,SAAA;AAAA,IACE,CAAC,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AAAA,IAC/C,CAAC,CAAC,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAA,KAAM;AAClC,MAAA,iBAAA,IAAoB;AACpB,MAAA,iBAAA,GAAoB,IAAA;AACpB,MAAA,KAAA,EAAA;AACA,MAAA,IAAI,MAAA,IAAU,YAAY,UAAA,EAAY;AACpC,QAAA,iBAAA,GAAoBC,cAAA,CAAW,QAAA,EAAU,UAAA,EAAY,MAAM;AACzD,UAAA,KAAK,MAAA,EAAO;AAAA,QACd,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,IAAA;AAAK,GACnC;AAEA,EAAAC,kBAAA,CAAe,MAAM;AACnB,IAAA,iBAAA,IAAoB;AACpB,IAAA,iBAAA,GAAoB,IAAA;AACpB,IAAA,KAAA,EAAA;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,QAAA,GAAgE;AAAA,IACpE,GAAA,EAAK,QAAA;AAAA,IACL,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AACA,EAAA,MAAM,SAAA,GAAYC,YAAA;AAAA,IAChB,MACE,SAAS,cAAA,CAAe,KAAA,CAAM,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC;AAAA,GAM/C;AAEA,EAAA,MAAM,cAAA,GAAiBA,aAAiC,OAAO;AAAA,IAC7D,UAAU,QAAA,CAAS,KAAA;AAAA,IACnB,GAAA,EAAK,GAAA;AAAA,IACL,IAAA,EAAM,GAAA;AAAA,IACN,SAAA,EAAW,CAAA,YAAA,EAAe,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA,MAAA,CAAA;AAAA,IACvE,KAAA,EAAO;AAAA,GACT,CAAE,CAAA;AAEF,EAAA,OAAO,EAAE,GAAG,CAAA,EAAG,QAAA,EAAU,gBAAgB,cAAA,EAAgB,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAU;AAC7F;ACjLO,SAAS,WAAW,OAAA,EAAkC;AAC3D,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,KAAW,KAAA;AAClC,EAAA,MAAM,kBAAA,GAAqB,QAAQ,kBAAA,KAAuB,KAAA;AAE1D,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,KAAwC;AAC1D,IAAA,IAAI,CAAC,MAAA,IAAU,EAAE,MAAA,YAAkB,OAAO,OAAO,KAAA;AACjD,IAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,OAAA,EAAS;AAC/B,MAAA,MAAM,KAAK,CAAA,CAAE,KAAA;AACb,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,IAAI,OAAO,MAAA,IAAU,EAAA,CAAG,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AAAA,IACnD;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC7C,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO;AAC5B,IAAA,IAAI,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,SAAA,EAAU;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AAC1C,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO;AAC5B,IAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,OAAA,CAAQ,SAAA,EAAU;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,aAAA,EAAe,IAAI,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAAA,IAChD;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,aAAA,EAAe,IAAI,CAAA;AAC/D,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,EACnD,CAAA;AAEA,EAAAH,SAAAA;AAAA,IACE,OAAA,CAAQ,OAAA;AAAA,IACR,CAAC,OAAA,KAAY;AACX,MAAA,MAAA,EAAO;AACP,MAAA,IAAI,SAAS,MAAA,EAAO;AAAA,IACtB,CAAA;AAAA,IACA,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAA;AAAO,GACnC;AAEA,EAAAE,mBAAe,MAAM,CAAA;AACvB","file":"floating.cjs","sourcesContent":["import { computed, onScopeDispose, ref, shallowRef, watch, type ComputedRef, type Ref } from 'vue'\nimport {\n autoUpdate,\n computePosition,\n arrow as arrowMiddleware,\n flip as flipMiddleware,\n offset as offsetMiddleware,\n shift as shiftMiddleware,\n size as sizeMiddleware,\n type Middleware,\n type Placement,\n type Strategy,\n} from '@floating-ui/dom'\n\nexport interface UseFloatingOptions {\n /** Element the floating panel is positioned relative to. */\n anchor: Ref<HTMLElement | null | undefined>\n /** The floating element itself. */\n floating: Ref<HTMLElement | null | undefined>\n /** Whether the floating element is visible. Controls `autoUpdate` lifecycle. */\n open: Ref<boolean>\n /** Default placement. Floating UI may flip it if `flip` is true. */\n placement?: Placement\n /** CSS position strategy. */\n strategy?: Strategy\n /** Pixel offset between anchor and floating element. */\n offset?: number\n /** Flip to the opposite side when the requested side overflows. Default `true`. */\n flip?: boolean\n /** Shift along the cross-axis to stay in view. Default `true`. */\n shift?: boolean\n /**\n * Constrain the floating element to the available viewport space — sets\n * `maxWidth`/`maxHeight` (minus 8px padding) on it so a long dropdown/popover\n * never overflows the screen (pair with `overflow:auto` for scroll). Off by\n * default. Pass a number to override the viewport padding.\n */\n size?: boolean | number\n /** Extra Floating UI middleware to append. */\n middleware?: Middleware[]\n /**\n * Optional ref to an arrow element inside the floating panel. When provided,\n * `arrowX`, `arrowY`, and `arrowSide` in the return value are populated.\n */\n arrow?: Ref<HTMLElement | null | undefined>\n}\n\nexport interface UseFloatingReturn {\n /** Computed x coordinate (px). */\n x: Ref<number>\n /** Computed y coordinate (px). */\n y: Ref<number>\n /** Final strategy (echo of input). */\n strategy: Ref<Strategy>\n /** Final placement, possibly flipped from the input placement. */\n finalPlacement: Ref<Placement>\n /** Ready-to-bind inline style object for the floating element. */\n floatingStyles: ComputedRef<Record<string, string>>\n /** Trigger a manual recompute. Usually not needed — `autoUpdate` handles scrolling/resizing. */\n update: () => Promise<void>\n /** Arrow x offset (px). Present when `arrow` option is set. */\n arrowX: Ref<number | undefined>\n /** Arrow y offset (px). Present when `arrow` option is set. */\n arrowY: Ref<number | undefined>\n /**\n * Side of the floating element the arrow is on.\n * E.g. `'bottom'` placement → `'top'` (arrow at top pointing up).\n */\n arrowSide: ComputedRef<'top' | 'right' | 'bottom' | 'left' | undefined>\n}\n\n/**\n * Reactive Floating UI integration. Subscribes `autoUpdate` whenever\n * `open === true` and both refs are populated; tears it down on close,\n * unmount, or ref clearing. Returns `floatingStyles` ready to be spread onto\n * the floating element.\n *\n * Pure positioning — does NOT render anything, does NOT manage focus,\n * does NOT handle dismiss behavior. Those concerns live in the consuming\n * primitive (Popover, Tooltip, Dialog, Menu, ...).\n *\n * @example\n * const triggerEl = ref<HTMLElement | null>(null)\n * const contentEl = ref<HTMLElement | null>(null)\n * const open = ref(false)\n * const { floatingStyles } = useFloating({\n * anchor: triggerEl,\n * floating: contentEl,\n * open,\n * placement: 'bottom-start',\n * offset: 8,\n * })\n */\nexport function useFloating(options: UseFloatingOptions): UseFloatingReturn {\n const x = ref(0)\n const y = ref(0)\n const strategy = ref<Strategy>(options.strategy ?? 'absolute')\n const finalPlacement = ref<Placement>(options.placement ?? 'bottom')\n const arrowX = ref<number | undefined>()\n const arrowY = ref<number | undefined>()\n\n const middleware = shallowRef<Middleware[]>([])\n rebuildMiddleware()\n\n function rebuildMiddleware() {\n const mw: Middleware[] = []\n if (options.offset !== undefined) mw.push(offsetMiddleware(options.offset))\n if (options.flip !== false) mw.push(flipMiddleware())\n if (options.shift !== false) mw.push(shiftMiddleware({ padding: 8 }))\n if (options.size) {\n const padding = typeof options.size === 'number' ? options.size : 8\n mw.push(\n sizeMiddleware({\n padding,\n apply({ availableWidth, availableHeight, elements }) {\n Object.assign(elements.floating.style, {\n maxWidth: `${Math.max(0, Math.floor(availableWidth))}px`,\n maxHeight: `${Math.max(0, Math.floor(availableHeight))}px`,\n })\n },\n }),\n )\n }\n if (options.arrow?.value) mw.push(arrowMiddleware({ element: options.arrow.value }))\n if (options.middleware) mw.push(...options.middleware)\n middleware.value = mw\n }\n\n let cleanupAutoUpdate: (() => void) | null = null\n // Monotonic token bumped on every new positioning cycle and on teardown, so a\n // computePosition() that resolves after the panel closed/re-opened (or after a\n // newer update started) drops its result instead of applying stale coords.\n let epoch = 0\n\n async function update() {\n const a = options.anchor.value\n const f = options.floating.value\n if (!a || !f) return\n rebuildMiddleware()\n const token = ++epoch\n const result = await computePosition(a, f, {\n placement: options.placement ?? 'bottom',\n strategy: strategy.value,\n middleware: middleware.value,\n })\n if (token !== epoch) return\n x.value = result.x\n y.value = result.y\n finalPlacement.value = result.placement\n const arrowData = result.middlewareData.arrow as { x?: number; y?: number } | undefined\n arrowX.value = arrowData?.x\n arrowY.value = arrowData?.y\n }\n\n watch(\n [options.open, options.anchor, options.floating],\n ([isOpen, anchorEl, floatingEl]) => {\n cleanupAutoUpdate?.()\n cleanupAutoUpdate = null\n epoch++\n if (isOpen && anchorEl && floatingEl) {\n cleanupAutoUpdate = autoUpdate(anchorEl, floatingEl, () => {\n void update()\n })\n }\n },\n { flush: 'post', immediate: true },\n )\n\n onScopeDispose(() => {\n cleanupAutoUpdate?.()\n cleanupAutoUpdate = null\n epoch++\n })\n\n const OPPOSITE: Record<string, 'top' | 'right' | 'bottom' | 'left'> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n }\n const arrowSide = computed(\n () =>\n OPPOSITE[finalPlacement.value.split('-')[0]] as\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | undefined,\n )\n\n const floatingStyles = computed<Record<string, string>>(() => ({\n position: strategy.value,\n top: '0',\n left: '0',\n transform: `translate3d(${Math.round(x.value)}px, ${Math.round(y.value)}px, 0)`,\n width: 'max-content',\n }))\n\n return { x, y, strategy, finalPlacement, floatingStyles, update, arrowX, arrowY, arrowSide }\n}\n","import { onScopeDispose, watch, type Ref } from 'vue'\n\nexport interface UseDismissOptions {\n /** While true, the dismiss listeners are active. */\n enabled: Ref<boolean>\n /** Elements that, if clicked, should NOT trigger dismiss (typically trigger + content). */\n exclude: Array<Ref<HTMLElement | null | undefined>>\n /** Called when the user attempts to dismiss the surface. */\n onDismiss: () => void\n /** Close on Escape key. Default `true`. */\n escape?: boolean\n /** Close on pointerdown outside the excluded elements. Default `true`. */\n outsidePointerDown?: boolean\n}\n\n/**\n * Listen for the universal \"dismiss\" gestures: Escape key and outside\n * pointer-down. Used by Popover / Dialog / Menu / Combobox. Tooltip does\n * NOT use this — it dismisses on mouseleave/blur instead.\n *\n * Listeners are attached to `document` only while `enabled` is true, and\n * removed on disable / unmount. SSR-safe (no-op without `document`).\n */\nexport function useDismiss(options: UseDismissOptions): void {\n const escape = options.escape !== false\n const outsidePointerDown = options.outsidePointerDown !== false\n\n const isExcluded = (target: EventTarget | null): boolean => {\n if (!target || !(target instanceof Node)) return false\n for (const r of options.exclude) {\n const el = r.value\n if (!el) continue\n if (el === target || el.contains(target)) return true\n }\n return false\n }\n\n const onPointerDown = (event: PointerEvent) => {\n if (!options.enabled.value) return\n if (isExcluded(event.target)) return\n options.onDismiss()\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!options.enabled.value) return\n if (event.key === 'Escape') {\n event.stopPropagation()\n options.onDismiss()\n }\n }\n\n const attach = () => {\n if (typeof document === 'undefined') return\n if (outsidePointerDown) {\n document.addEventListener('pointerdown', onPointerDown, true)\n }\n if (escape) {\n document.addEventListener('keydown', onKeyDown)\n }\n }\n\n const detach = () => {\n if (typeof document === 'undefined') return\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKeyDown)\n }\n\n watch(\n options.enabled,\n (enabled) => {\n detach()\n if (enabled) attach()\n },\n { immediate: true, flush: 'post' },\n )\n\n onScopeDispose(detach)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/primitives/floating/useFloating.ts","../src/primitives/floating/useDismiss.ts"],"names":["ref","shallowRef","offsetMiddleware","flipMiddleware","shiftMiddleware","sizeMiddleware","arrowMiddleware","computePosition","watch","autoUpdate","onScopeDispose","computed"],"mappings":"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","file":"floating.cjs","sourcesContent":["import { computed, onScopeDispose, ref, shallowRef, watch, type ComputedRef, type Ref } from 'vue'\nimport {\n autoUpdate,\n computePosition,\n arrow as arrowMiddleware,\n flip as flipMiddleware,\n offset as offsetMiddleware,\n shift as shiftMiddleware,\n size as sizeMiddleware,\n type Middleware,\n type Placement,\n type Strategy,\n} from '@floating-ui/dom'\n\nexport interface UseFloatingOptions {\n /** Element the floating panel is positioned relative to. */\n anchor: Ref<HTMLElement | null | undefined>\n /** The floating element itself. */\n floating: Ref<HTMLElement | null | undefined>\n /** Whether the floating element is visible. Controls `autoUpdate` lifecycle. */\n open: Ref<boolean>\n /** Default placement. Floating UI may flip it if `flip` is true. */\n placement?: Placement\n /** CSS position strategy. */\n strategy?: Strategy\n /** Pixel offset between anchor and floating element. */\n offset?: number\n /** Flip to the opposite side when the requested side overflows. Default `true`. */\n flip?: boolean\n /** Shift along the cross-axis to stay in view. Default `true`. */\n shift?: boolean\n /**\n * Constrain the floating element to the available viewport space — sets\n * `maxWidth`/`maxHeight` (minus 8px padding) on it so a long dropdown/popover\n * never overflows the screen (pair with `overflow:auto` for scroll). Off by\n * default. Pass a number to override the viewport padding.\n */\n size?: boolean | number\n /** Extra Floating UI middleware to append. */\n middleware?: Middleware[]\n /**\n * Optional ref to an arrow element inside the floating panel. When provided,\n * `arrowX`, `arrowY`, and `arrowSide` in the return value are populated.\n */\n arrow?: Ref<HTMLElement | null | undefined>\n}\n\nexport interface UseFloatingReturn {\n /** Computed x coordinate (px). */\n x: Ref<number>\n /** Computed y coordinate (px). */\n y: Ref<number>\n /** Final strategy (echo of input). */\n strategy: Ref<Strategy>\n /** Final placement, possibly flipped from the input placement. */\n finalPlacement: Ref<Placement>\n /** Ready-to-bind inline style object for the floating element. */\n floatingStyles: ComputedRef<Record<string, string>>\n /** Trigger a manual recompute. Usually not needed — `autoUpdate` handles scrolling/resizing. */\n update: () => Promise<void>\n /** Arrow x offset (px). Present when `arrow` option is set. */\n arrowX: Ref<number | undefined>\n /** Arrow y offset (px). Present when `arrow` option is set. */\n arrowY: Ref<number | undefined>\n /**\n * Side of the floating element the arrow is on.\n * E.g. `'bottom'` placement → `'top'` (arrow at top pointing up).\n */\n arrowSide: ComputedRef<'top' | 'right' | 'bottom' | 'left' | undefined>\n}\n\n/**\n * Reactive Floating UI integration. Subscribes `autoUpdate` whenever\n * `open === true` and both refs are populated; tears it down on close,\n * unmount, or ref clearing. Returns `floatingStyles` ready to be spread onto\n * the floating element.\n *\n * Pure positioning — does NOT render anything, does NOT manage focus,\n * does NOT handle dismiss behavior. Those concerns live in the consuming\n * primitive (Popover, Tooltip, Dialog, Menu, ...).\n *\n * @example\n * const triggerEl = ref<HTMLElement | null>(null)\n * const contentEl = ref<HTMLElement | null>(null)\n * const open = ref(false)\n * const { floatingStyles } = useFloating({\n * anchor: triggerEl,\n * floating: contentEl,\n * open,\n * placement: 'bottom-start',\n * offset: 8,\n * })\n */\nexport function useFloating(options: UseFloatingOptions): UseFloatingReturn {\n const x = ref(0)\n const y = ref(0)\n // True once the first positioning cycle lands. Until then the panel stays\n // `visibility: hidden` so it never flashes at the viewport origin (0,0).\n const positioned = ref(false)\n const strategy = ref<Strategy>(options.strategy ?? 'absolute')\n const finalPlacement = ref<Placement>(options.placement ?? 'bottom')\n const arrowX = ref<number | undefined>()\n const arrowY = ref<number | undefined>()\n\n const middleware = shallowRef<Middleware[]>([])\n rebuildMiddleware()\n\n function rebuildMiddleware() {\n const mw: Middleware[] = []\n if (options.offset !== undefined) mw.push(offsetMiddleware(options.offset))\n if (options.flip !== false) mw.push(flipMiddleware())\n if (options.shift !== false) mw.push(shiftMiddleware({ padding: 8 }))\n if (options.size) {\n const padding = typeof options.size === 'number' ? options.size : 8\n mw.push(\n sizeMiddleware({\n padding,\n apply({ availableWidth, availableHeight, elements }) {\n Object.assign(elements.floating.style, {\n maxWidth: `${Math.max(0, Math.floor(availableWidth))}px`,\n maxHeight: `${Math.max(0, Math.floor(availableHeight))}px`,\n })\n },\n }),\n )\n }\n if (options.arrow?.value) mw.push(arrowMiddleware({ element: options.arrow.value }))\n if (options.middleware) mw.push(...options.middleware)\n middleware.value = mw\n }\n\n let cleanupAutoUpdate: (() => void) | null = null\n // Monotonic token bumped on every new positioning cycle and on teardown, so a\n // computePosition() that resolves after the panel closed/re-opened (or after a\n // newer update started) drops its result instead of applying stale coords.\n let epoch = 0\n\n async function update() {\n const a = options.anchor.value\n const f = options.floating.value\n if (!a || !f) return\n rebuildMiddleware()\n const token = ++epoch\n const result = await computePosition(a, f, {\n placement: options.placement ?? 'bottom',\n strategy: strategy.value,\n middleware: middleware.value,\n })\n if (token !== epoch) return\n x.value = result.x\n y.value = result.y\n positioned.value = true\n finalPlacement.value = result.placement\n const arrowData = result.middlewareData.arrow as { x?: number; y?: number } | undefined\n arrowX.value = arrowData?.x\n arrowY.value = arrowData?.y\n }\n\n watch(\n [options.open, options.anchor, options.floating],\n ([isOpen, anchorEl, floatingEl]) => {\n cleanupAutoUpdate?.()\n cleanupAutoUpdate = null\n epoch++\n if (isOpen && anchorEl && floatingEl) {\n positioned.value = false\n cleanupAutoUpdate = autoUpdate(anchorEl, floatingEl, () => {\n void update()\n })\n }\n },\n { flush: 'post', immediate: true },\n )\n\n onScopeDispose(() => {\n cleanupAutoUpdate?.()\n cleanupAutoUpdate = null\n epoch++\n })\n\n const OPPOSITE: Record<string, 'top' | 'right' | 'bottom' | 'left'> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n }\n const arrowSide = computed(\n () =>\n OPPOSITE[finalPlacement.value.split('-')[0]] as\n 'top' | 'right' | 'bottom' | 'left' | undefined,\n )\n\n const floatingStyles = computed<Record<string, string>>(() => ({\n position: strategy.value,\n top: '0',\n left: '0',\n transform: `translate3d(${Math.round(x.value)}px, ${Math.round(y.value)}px, 0)`,\n width: 'max-content',\n // Hidden until the first positioning cycle lands — prevents a flash at\n // the viewport origin. visibility (not display:none) keeps the panel\n // measurable so Floating UI can compute its real coordinates.\n visibility: positioned.value ? 'visible' : 'hidden',\n }))\n\n return { x, y, strategy, finalPlacement, floatingStyles, update, arrowX, arrowY, arrowSide }\n}\n","import { onScopeDispose, watch, type Ref } from 'vue'\n\nexport interface UseDismissOptions {\n /** While true, the dismiss listeners are active. */\n enabled: Ref<boolean>\n /** Elements that, if clicked, should NOT trigger dismiss (typically trigger + content). */\n exclude: Array<Ref<HTMLElement | null | undefined>>\n /** Called when the user attempts to dismiss the surface. */\n onDismiss: () => void\n /** Close on Escape key. Default `true`. */\n escape?: boolean\n /** Close on pointerdown outside the excluded elements. Default `true`. */\n outsidePointerDown?: boolean\n /**\n * Extra \"inside\" test for pointerdown targets — e.g. teleported sibling\n * surfaces that belong to the same widget but live outside the excluded\n * refs' DOM trees.\n */\n excludePredicate?: (target: EventTarget | null) => boolean\n}\n\n/**\n * Listen for the universal \"dismiss\" gestures: Escape key and outside\n * pointer-down. Used by Popover / Dialog / Menu / Combobox. Tooltip does\n * NOT use this — it dismisses on mouseleave/blur instead.\n *\n * Listeners are attached to `document` only while `enabled` is true, and\n * removed on disable / unmount. SSR-safe (no-op without `document`).\n */\nexport function useDismiss(options: UseDismissOptions): void {\n const escape = options.escape !== false\n const outsidePointerDown = options.outsidePointerDown !== false\n\n const isExcluded = (target: EventTarget | null): boolean => {\n if (!target || !(target instanceof Node)) return false\n for (const r of options.exclude) {\n const el = r.value\n if (!el) continue\n if (el === target || el.contains(target)) return true\n }\n return false\n }\n\n const onPointerDown = (event: PointerEvent) => {\n if (!options.enabled.value) return\n if (isExcluded(event.target)) return\n if (options.excludePredicate?.(event.target)) return\n options.onDismiss()\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!options.enabled.value) return\n if (event.key === 'Escape') {\n event.stopPropagation()\n options.onDismiss()\n }\n }\n\n const attach = () => {\n if (typeof document === 'undefined') return\n if (outsidePointerDown) {\n document.addEventListener('pointerdown', onPointerDown, true)\n }\n if (escape) {\n document.addEventListener('keydown', onKeyDown)\n }\n }\n\n const detach = () => {\n if (typeof document === 'undefined') return\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKeyDown)\n }\n\n watch(\n options.enabled,\n (enabled) => {\n detach()\n if (enabled) attach()\n },\n { immediate: true, flush: 'post' },\n )\n\n onScopeDispose(detach)\n}\n"]}
|