@iris-ui-kit/vue 0.2.18 → 0.2.20
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 +1 -4
- package/dist/admin.cjs.map +1 -1
- package/dist/admin.js +1 -1
- package/dist/chunk-FG5USQSY.js +55 -0
- package/dist/chunk-FG5USQSY.js.map +1 -0
- package/dist/{chunk-2ETVCAVL.js → chunk-MMQKSFME.js} +3 -6
- package/dist/chunk-MMQKSFME.js.map +1 -0
- package/dist/index.cjs +59 -33
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +18 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +23 -3
- package/dist/index.js.map +1 -1
- package/dist/undo.cjs +37 -28
- package/dist/undo.cjs.map +1 -1
- package/dist/undo.d.cts +8 -2
- package/dist/undo.d.ts +8 -2
- package/dist/undo.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-2ETVCAVL.js.map +0 -1
- package/dist/chunk-VM2CXEUA.js +0 -46
- package/dist/chunk-VM2CXEUA.js.map +0 -1
package/dist/admin.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { IrisAdminBreadcrumb, IrisAdminLayout, IrisAdminTabs, IrisNavMenu, createAdminPreferences, createTabsNav, filterNavByAccess, findNavNode, findNavPath, firstLeaf, flattenNav, isBranch, isClosable, localStorageAdminPreferencesStorage, nodeAllowsRoles, useAdminPreferences, useAdminShell, useTabsNav, visibleNav } from './chunk-
|
|
1
|
+
export { IrisAdminBreadcrumb, IrisAdminLayout, IrisAdminTabs, IrisNavMenu, createAdminPreferences, createTabsNav, filterNavByAccess, findNavNode, findNavPath, firstLeaf, flattenNav, isBranch, isClosable, localStorageAdminPreferencesStorage, nodeAllowsRoles, useAdminPreferences, useAdminShell, useTabsNav, visibleNav } from './chunk-MMQKSFME.js';
|
|
2
2
|
import './chunk-3FJUCHCC.js';
|
|
3
3
|
import './chunk-TQB5LVOH.js';
|
|
4
4
|
import './chunk-F77KIPOH.js';
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { shallowRef } from 'vue';
|
|
2
|
+
import { createUndoStack } from '@iris-ui-kit/core/undo';
|
|
3
|
+
export { createUndoStack } from '@iris-ui-kit/core/undo';
|
|
4
|
+
|
|
5
|
+
// src/undo/useUndoStack.ts
|
|
6
|
+
function trackUndoStack(stack, onMutate) {
|
|
7
|
+
const mutators = /* @__PURE__ */ new Set(["push", "undo", "redo", "clear"]);
|
|
8
|
+
const wrappers = /* @__PURE__ */ new Map();
|
|
9
|
+
return new Proxy(stack, {
|
|
10
|
+
get(target, prop, receiver) {
|
|
11
|
+
const key = prop;
|
|
12
|
+
if (mutators.has(key)) {
|
|
13
|
+
let fn = wrappers.get(key);
|
|
14
|
+
if (!fn) {
|
|
15
|
+
const original = target[key];
|
|
16
|
+
fn = (...args) => {
|
|
17
|
+
const result = Reflect.apply(original, target, args);
|
|
18
|
+
onMutate();
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
wrappers.set(key, fn);
|
|
22
|
+
}
|
|
23
|
+
return fn;
|
|
24
|
+
}
|
|
25
|
+
return Reflect.get(target, prop, receiver);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function useUndoStack(options) {
|
|
30
|
+
const raw = createUndoStack(options);
|
|
31
|
+
const state = shallowRef({
|
|
32
|
+
canUndo: raw.canUndo(),
|
|
33
|
+
canRedo: raw.canRedo(),
|
|
34
|
+
depth: raw.depth,
|
|
35
|
+
index: raw.index
|
|
36
|
+
});
|
|
37
|
+
const sync = () => {
|
|
38
|
+
state.value = {
|
|
39
|
+
canUndo: raw.canUndo(),
|
|
40
|
+
canRedo: raw.canRedo(),
|
|
41
|
+
depth: raw.depth,
|
|
42
|
+
index: raw.index
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
const stack = trackUndoStack(raw, sync);
|
|
46
|
+
const push = (snapshot) => stack.push(snapshot);
|
|
47
|
+
const undo = () => stack.undo();
|
|
48
|
+
const redo = () => stack.redo();
|
|
49
|
+
const clear = () => stack.clear();
|
|
50
|
+
return { push, undo, redo, clear, stack, state };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export { useUndoStack };
|
|
54
|
+
//# sourceMappingURL=chunk-FG5USQSY.js.map
|
|
55
|
+
//# sourceMappingURL=chunk-FG5USQSY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/undo/useUndoStack.ts"],"names":[],"mappings":";;;;;AAqBA,SAAS,cAAA,CAAkB,OAAqB,QAAA,EAAoC;AAClF,EAAA,MAAM,QAAA,uBAAe,GAAA,CAAwB,CAAC,QAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAC,CAAA;AAC9E,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyD;AAE9E,EAAA,OAAO,IAAI,MAAM,KAAA,EAAO;AAAA,IACtB,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAuB,QAAA,EAAmB;AACpD,MAAA,MAAM,GAAA,GAAM,IAAA;AACZ,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,QAAA,IAAI,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACzB,QAAA,IAAI,CAAC,EAAA,EAAI;AACP,UAAA,MAAM,QAAA,GAAW,OAAO,GAAG,CAAA;AAC3B,UAAA,EAAA,GAAK,IAAI,IAAA,KAAoB;AAC3B,YAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,QAAQ,IAAI,CAAA;AACnD,YAAA,QAAA,EAAS;AACT,YAAA,OAAO,MAAA;AAAA,UACT,CAAA;AACA,UAAA,QAAA,CAAS,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,QACtB;AACA,QAAA,OAAO,EAAA;AAAA,MACT;AACA,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,IAC3C;AAAA,GACD,CAAA;AACH;AAiCO,SAAS,aAAgB,OAAA,EAiB9B;AACA,EAAA,MAAM,GAAA,GAAM,gBAAmB,OAAO,CAAA;AAEtC,EAAA,MAAM,QAAQ,UAAA,CAAmC;AAAA,IAC/C,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,IACrB,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,IACrB,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,OAAO,GAAA,CAAI;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,MACZ,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,MACrB,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,MACrB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,OAAO,GAAA,CAAI;AAAA,KACb;AAAA,EACF,CAAA;AAMA,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,IAAI,CAAA;AAMtC,EAAA,MAAM,IAAA,GAAO,CAAC,QAAA,KAAmB,KAAA,CAAM,KAAK,QAAQ,CAAA;AACpD,EAAA,MAAM,IAAA,GAAO,MAAqB,KAAA,CAAM,IAAA,EAAK;AAC7C,EAAA,MAAM,IAAA,GAAO,MAAqB,KAAA,CAAM,IAAA,EAAK;AAC7C,EAAA,MAAM,KAAA,GAAQ,MAAY,KAAA,CAAM,KAAA,EAAM;AAEtC,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,OAAO,KAAA,EAAM;AACjD","file":"chunk-FG5USQSY.js","sourcesContent":["import { shallowRef, type ShallowRef } from 'vue'\nimport { createUndoStack, type UndoStack, type UndoStackOptions } from '@iris-ui-kit/core/undo'\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Wrap a raw {@link UndoStack} in a Proxy so that every mutating call\n * (`push`/`undo`/`redo`/`clear`) — including calls made directly on the\n * returned `stack` reference — triggers `onMutate()` afterwards.\n *\n * Core's `UndoStack` is a plain mutable object with **no change notification**\n * (JSDoc promises it is a stable, modifiable reference). Without this wrapper,\n * `api.stack.push(x)` mutated core silently and left the reactive `state`\n * permanently stale, with zero errors.\n *\n * Only the `get` trap is installed: mutating methods return pre-created,\n * cached wrapper closures (so `stack.push === stack.push` — stable function\n * identity), while read-only members (`canUndo`/`canRedo`/`depth`/`index`)\n * pass through untouched. `ownKeys`/`getOwnPropertyDescriptor` are forwarded\n * by the default traps, so enumeration behavior is unchanged.\n */\nfunction trackUndoStack<T>(stack: UndoStack<T>, onMutate: () => void): UndoStack<T> {\n const mutators = new Set<keyof UndoStack<T>>(['push', 'undo', 'redo', 'clear'])\n const wrappers = new Map<keyof UndoStack<T>, (...args: unknown[]) => unknown>()\n\n return new Proxy(stack, {\n get(target, prop: string | symbol, receiver): unknown {\n const key = prop as keyof UndoStack<T>\n if (mutators.has(key)) {\n let fn = wrappers.get(key)\n if (!fn) {\n const original = target[key] as (...args: unknown[]) => unknown\n fn = (...args: unknown[]) => {\n const result = Reflect.apply(original, target, args)\n onMutate()\n return result\n }\n wrappers.set(key, fn)\n }\n return fn\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n}\n\n/**\n * Reactive snapshot metadata for the UndoStack: convenience booleans that\n * update on every push/undo/redo/clear for use in UI bindings (enable/disable\n * undo/redo buttons).\n */\nexport interface UndoStackReactiveState {\n canUndo: boolean\n canRedo: boolean\n depth: number\n index: number\n}\n\n/**\n * Vue bridge over the framework-agnostic {@link createUndoStack}.\n * Creates the stack once in `setup()` and returns a stable controller\n * plus a reactive `state` that tracks `canUndo`/`canRedo`/`depth`/`index` for\n * easy UI binding.\n *\n * The returned `push`/`undo`/`redo`/`clear` automatically update the reactive\n * state — no manual `.value = ...` needed. The same holds for mutating the\n * returned `stack` directly (`api.stack.push(x)`, `api.stack.undo()`, …): the\n * raw stack is wrapped so every mutation is observed and synced.\n *\n * @example\n * const { push, undo, redo, state } = useUndoStack({ initial: formValues })\n * // After mutation:\n * push(currentValues)\n * // In template:\n * <button :disabled=\"!state.canUndo\" @click=\"undo\">Undo</button>\n * <button :disabled=\"!state.canRedo\" @click=\"redo\">Redo</button>\n */\nexport function useUndoStack<T>(options?: UndoStackOptions<T>): {\n /** Push a new snapshot onto the stack. Returns the stored value. */\n push: (snapshot: T) => T\n /** Undo: returns the previous snapshot, or undefined if nothing to undo. */\n undo: () => T | undefined\n /** Redo: returns the next snapshot, or undefined if nothing to redo. */\n redo: () => T | undefined\n /** Clear all history. */\n clear: () => void\n /**\n * The raw undo stack (stable reference, same across renders). Its mutating\n * methods (`push`/`undo`/`redo`/`clear`) are observed — direct calls keep\n * `state` in sync.\n */\n stack: UndoStack<T>\n /** Reactive metadata: canUndo, canRedo, depth, index. */\n state: ShallowRef<UndoStackReactiveState>\n} {\n const raw = createUndoStack<T>(options)\n\n const state = shallowRef<UndoStackReactiveState>({\n canUndo: raw.canUndo(),\n canRedo: raw.canRedo(),\n depth: raw.depth,\n index: raw.index,\n })\n\n const sync = () => {\n state.value = {\n canUndo: raw.canUndo(),\n canRedo: raw.canRedo(),\n depth: raw.depth,\n index: raw.index,\n }\n }\n\n // Wrap the raw stack so direct `api.stack.push/undo/redo/clear` calls also\n // refresh `state` — previously they mutated core silently and left the\n // reactive state permanently stale (defect group 1). The proxy is the single\n // sync point below.\n const stack = trackUndoStack(raw, sync)\n\n // Delegate through the wrapped stack: `onMutate` fires on every mutating\n // call — even true no-ops and calls returning `undefined` (a legal snapshot\n // value for a generic T, so the return value cannot distinguish \"no-op\"\n // from \"pointer moved\" — defect group 2, aligned with vue 0.2.19).\n const push = (snapshot: T): T => stack.push(snapshot)\n const undo = (): T | undefined => stack.undo()\n const redo = (): T | undefined => stack.redo()\n const clear = (): void => stack.clear()\n\n return { push, undo, redo, clear, stack, state }\n}\n"]}
|
|
@@ -556,10 +556,7 @@ var IrisNavMenu = defineComponent({
|
|
|
556
556
|
"data-iris-nav-group": "",
|
|
557
557
|
"data-open": shown ? "true" : void 0,
|
|
558
558
|
"data-depth": String(depth),
|
|
559
|
-
class: [
|
|
560
|
-
"iris-nav-menu-group",
|
|
561
|
-
`iris-nav-menu-group--depth-${Math.min(9, depth)}`
|
|
562
|
-
],
|
|
559
|
+
class: ["iris-nav-menu-group", `iris-nav-menu-group--depth-${Math.min(9, depth)}`],
|
|
563
560
|
...horizontal ? {
|
|
564
561
|
onMouseenter: (event) => {
|
|
565
562
|
if (!keepsPointerInside(event.currentTarget, event)) {
|
|
@@ -1820,5 +1817,5 @@ function useAdminPreferences(preferences, hydrate = true) {
|
|
|
1820
1817
|
}
|
|
1821
1818
|
|
|
1822
1819
|
export { DropdownContextKey, IrisAdminBreadcrumb, IrisAdminLayout, IrisAdminTabs, IrisBreadcrumb, IrisBreadcrumbItem, IrisDropdown, IrisDropdownItem, IrisDropdownMenu, IrisDropdownSeparator, IrisDropdownTrigger, IrisIcon, IrisNavMenu, useAdminPreferences, useAdminShell, useTabsNav };
|
|
1823
|
-
//# sourceMappingURL=chunk-
|
|
1824
|
-
//# sourceMappingURL=chunk-
|
|
1820
|
+
//# sourceMappingURL=chunk-MMQKSFME.js.map
|
|
1821
|
+
//# sourceMappingURL=chunk-MMQKSFME.js.map
|
|
@@ -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-MMQKSFME.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: 10px;\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: 2px;\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, var(--iris-color-text, var(--iris-foreground)));\n font: inherit;\n font-size: 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: 10px;\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: 10px;\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:where(.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: 6px;\n font-size: 11px;\n line-height: 1;\n padding: 2px 6px;\n border-radius: 999px;\n background: var(--iris-danger, #e5484d);\n color: #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:where(.iris-nav-menu-group--depth-0 > .iris-nav-menu-children) {\n display: none;\n}\n\n:where(.iris-nav-menu-group--depth-1 > .iris-nav-menu-children),\n:where(.iris-nav-menu-group--depth-2 > .iris-nav-menu-children),\n:where(.iris-nav-menu-group--depth-3 > .iris-nav-menu-children),\n:where(.iris-nav-menu-group--depth-4 > .iris-nav-menu-children),\n:where(.iris-nav-menu-group--depth-5 > .iris-nav-menu-children),\n:where(.iris-nav-menu-group--depth-6 > .iris-nav-menu-children),\n:where(.iris-nav-menu-group--depth-7 > .iris-nav-menu-children),\n:where(.iris-nav-menu-group--depth-8 > .iris-nav-menu-children),\n:where(.iris-nav-menu-group--depth-9 > .iris-nav-menu-children),\n:where(.iris-nav-menu-group > .iris-nav-menu-children) {\n display: none;\n}\n\n:where(.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 > .iris-nav-menu-children) {\n position: absolute;\n min-width: 220px;\n padding: 6px;\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-depth='0'] > .iris-nav-menu-children) {\n inset-block-start: 100%;\n inset-inline-start: 0;\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 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@media (prefers-reduced-motion: reduce) {\n :where(.iris-nav-menu-arrow) {\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 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/**\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); a branch\n * click then 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 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 (uncontrolled).\n watch(\n () => props.activeKey,\n (key) => {\n if (!isControlled.value) model.merge(key ? branchTrail(props.items, key) : [])\n },\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\n const closeHorizontalMenus = (): void => {\n if (props.orientation !== 'horizontal') return\n hovered.value = null\n hoveredBranches.value = []\n focusedBranches.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 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 return interactionKeyAtDepth(focusedBranches.value, depth) === key\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 // Collapsed rail: top-level items only, icon + native tooltip; branch → first leaf.\n const renderCollapsed = (): VNode[] =>\n tree.value.map((node) => {\n const branch = isBranch(node)\n const active = branch ? activePath.value.includes(node.key) : node.key === props.activeKey\n return h(\n 'button',\n {\n key: node.key,\n type: 'button',\n class: [\n ...itemClass({\n depth: 0,\n active,\n trail: false,\n hovered: hovered.value === node.key,\n open: false,\n disabled: !!node.disabled,\n branch,\n }),\n 'is-collapsed',\n ],\n 'data-iris-nav-item': '',\n 'data-key': node.key,\n 'data-active': active ? 'true' : undefined,\n 'data-branch': branch ? 'true' : undefined,\n 'data-hovered': hovered.value === node.key ? 'true' : undefined,\n disabled: node.disabled,\n title: node.title,\n 'aria-label': branch ? `${node.title} (section)` : node.title,\n 'aria-current': active && !branch ? '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: () => select(branch ? firstLeaf(node) : node),\n },\n [\n iconNode(node, 20) ??\n h('span', { class: 'iris-nav-menu-fallback-icon' }, node.title.charAt(0)),\n ],\n )\n })\n\n const renderItem = (node: NavNode, depth: number): VNode => {\n const branch = isBranch(node)\n const open = expanded.value.includes(node.key)\n const horizontal = props.orientation === 'horizontal'\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 const arrowReversed =\n branch && !node.disabled && (active || trail || shown || hovered.value === node.key)\n\n const row = h(\n 'button',\n {\n type: 'button',\n class: itemClass({\n depth,\n active,\n trail,\n hovered: hovered.value === node.key,\n open: branch ? shown : false,\n disabled: !!node.disabled,\n branch,\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': hovered.value === node.key ? 'true' : undefined,\n 'data-depth': String(depth),\n 'data-orientation': props.orientation,\n disabled: node.disabled,\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: () => (branch ? toggle(node.key) : select(node)),\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\n ? h(IrisIcon, {\n name: horizontal && depth === 0 ? '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 if (!branch || (!horizontal && !open))\n return h(\n 'div',\n {\n key: node.key,\n 'data-iris-nav-group': branch ? '' : undefined,\n class: ['iris-nav-menu-group', `iris-nav-menu-group--depth-${Math.min(9, depth)}`],\n },\n [row],\n )\n\n return h(\n 'div',\n {\n key: node.key,\n 'data-iris-nav-group': '',\n 'data-open': 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\n ? {\n onMouseenter: (event: MouseEvent) => {\n if (!keepsPointerInside(event.currentTarget, event)) {\n setBranchInteraction(hoveredBranches, node.key, true)\n }\n },\n onMouseover: (event: MouseEvent) => {\n if (!keepsPointerInside(event.currentTarget, event)) {\n setBranchInteraction(hoveredBranches, node.key, true)\n }\n },\n onMouseout: (event: MouseEvent) => {\n if (!keepsPointerInside(event.currentTarget, event)) {\n setBranchInteraction(hoveredBranches, node.key, false)\n }\n },\n onMouseleave: (event: MouseEvent) => {\n if (!keepsPointerInside(event.currentTarget, event)) {\n setBranchInteraction(hoveredBranches, node.key, false)\n }\n },\n onFocusin: () => setBranchInteraction(focusedBranches, node.key, true),\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 h(\n 'div',\n {\n class: 'iris-nav-menu-children',\n 'data-iris-nav-children': '',\n role: 'group',\n 'aria-hidden': horizontal && !shown ? 'true' : undefined,\n },\n (node.children ?? []).map((child) => renderItem(child, depth + 1)),\n ),\n ],\n )\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.\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\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n focusAt(idx < 0 ? 0 : idx + 1)\n return\n case 'ArrowUp':\n e.preventDefault()\n focusAt(idx < 0 ? buttons.length - 1 : idx - 1)\n return\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 }\n\n if (props.collapsed || idx < 0) return\n const key = buttons[idx]?.getAttribute('data-key')\n if (!key) return\n const node = findNavNode(props.items, key)\n\n if (e.key === 'ArrowRight' && node && isBranch(node)) {\n e.preventDefault()\n if (!expanded.value.includes(key)) toggle(key)\n else focusAt(idx + 1)\n } else if (e.key === 'ArrowLeft') {\n if (node && isBranch(node) && expanded.value.includes(key)) {\n e.preventDefault()\n toggle(key)\n } else {\n const parentKey = findNavPath(props.items, key).at(-2)?.key\n if (parentKey) {\n e.preventDefault()\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 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 props.collapsed ? renderCollapsed() : 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: '6px',\n margin: '0',\n padding: '0',\n listStyle: 'none',\n fontSize: '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)',\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: '0 8px 24px -8px rgba(0, 0, 0, 0.16), 0 4px 8px -2px rgba(0, 0, 0, 0.08)',\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: '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: '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: '6px',\n border: 'none',\n background: 'transparent',\n color: 'inherit',\n font: 'inherit',\n fontSize: '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 },\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: '5px 8px 5px 10px',\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 { 'aria-label': tr('admin.tabActions') },\n {\n default: () =>\n h(\n 'span',\n {\n 'data-iris-tab-actions': '',\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 [h(IrisIcon, { name: 'more-horizontal', size: 16 })],\n ),\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: '6px',\n padding: '6px 10px',\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: '6px',\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: '10px',\n height: '52px',\n padding: '0 16px',\n color: 'var(--iris-foreground)',\n fontWeight: '700',\n fontSize: '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/index.cjs
CHANGED
|
@@ -1320,10 +1320,7 @@ var IrisNavMenu = vue.defineComponent({
|
|
|
1320
1320
|
"data-iris-nav-group": "",
|
|
1321
1321
|
"data-open": shown ? "true" : void 0,
|
|
1322
1322
|
"data-depth": String(depth),
|
|
1323
|
-
class: [
|
|
1324
|
-
"iris-nav-menu-group",
|
|
1325
|
-
`iris-nav-menu-group--depth-${Math.min(9, depth)}`
|
|
1326
|
-
],
|
|
1323
|
+
class: ["iris-nav-menu-group", `iris-nav-menu-group--depth-${Math.min(9, depth)}`],
|
|
1327
1324
|
...horizontal ? {
|
|
1328
1325
|
onMouseenter: (event) => {
|
|
1329
1326
|
if (!keepsPointerInside(event.currentTarget, event)) {
|
|
@@ -2981,41 +2978,50 @@ function useAdminPreferences(preferences, hydrate = true) {
|
|
|
2981
2978
|
flush: preferences.flush
|
|
2982
2979
|
};
|
|
2983
2980
|
}
|
|
2981
|
+
function trackUndoStack(stack, onMutate) {
|
|
2982
|
+
const mutators = /* @__PURE__ */ new Set(["push", "undo", "redo", "clear"]);
|
|
2983
|
+
const wrappers = /* @__PURE__ */ new Map();
|
|
2984
|
+
return new Proxy(stack, {
|
|
2985
|
+
get(target, prop, receiver) {
|
|
2986
|
+
const key = prop;
|
|
2987
|
+
if (mutators.has(key)) {
|
|
2988
|
+
let fn = wrappers.get(key);
|
|
2989
|
+
if (!fn) {
|
|
2990
|
+
const original = target[key];
|
|
2991
|
+
fn = (...args) => {
|
|
2992
|
+
const result = Reflect.apply(original, target, args);
|
|
2993
|
+
onMutate();
|
|
2994
|
+
return result;
|
|
2995
|
+
};
|
|
2996
|
+
wrappers.set(key, fn);
|
|
2997
|
+
}
|
|
2998
|
+
return fn;
|
|
2999
|
+
}
|
|
3000
|
+
return Reflect.get(target, prop, receiver);
|
|
3001
|
+
}
|
|
3002
|
+
});
|
|
3003
|
+
}
|
|
2984
3004
|
function useUndoStack(options) {
|
|
2985
|
-
const
|
|
3005
|
+
const raw = undo.createUndoStack(options);
|
|
2986
3006
|
const state = vue.shallowRef({
|
|
2987
|
-
canUndo:
|
|
2988
|
-
canRedo:
|
|
2989
|
-
depth:
|
|
2990
|
-
index:
|
|
3007
|
+
canUndo: raw.canUndo(),
|
|
3008
|
+
canRedo: raw.canRedo(),
|
|
3009
|
+
depth: raw.depth,
|
|
3010
|
+
index: raw.index
|
|
2991
3011
|
});
|
|
2992
3012
|
const sync = () => {
|
|
2993
3013
|
state.value = {
|
|
2994
|
-
canUndo:
|
|
2995
|
-
canRedo:
|
|
2996
|
-
depth:
|
|
2997
|
-
index:
|
|
3014
|
+
canUndo: raw.canUndo(),
|
|
3015
|
+
canRedo: raw.canRedo(),
|
|
3016
|
+
depth: raw.depth,
|
|
3017
|
+
index: raw.index
|
|
2998
3018
|
};
|
|
2999
3019
|
};
|
|
3000
|
-
const
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
3005
|
-
const undo$1 = () => {
|
|
3006
|
-
const result = stack.undo();
|
|
3007
|
-
if (result !== void 0) sync();
|
|
3008
|
-
return result;
|
|
3009
|
-
};
|
|
3010
|
-
const redo = () => {
|
|
3011
|
-
const result = stack.redo();
|
|
3012
|
-
if (result !== void 0) sync();
|
|
3013
|
-
return result;
|
|
3014
|
-
};
|
|
3015
|
-
const clear = () => {
|
|
3016
|
-
stack.clear();
|
|
3017
|
-
sync();
|
|
3018
|
-
};
|
|
3020
|
+
const stack = trackUndoStack(raw, sync);
|
|
3021
|
+
const push = (snapshot) => stack.push(snapshot);
|
|
3022
|
+
const undo$1 = () => stack.undo();
|
|
3023
|
+
const redo = () => stack.redo();
|
|
3024
|
+
const clear = () => stack.clear();
|
|
3019
3025
|
return { push, undo: undo$1, redo, clear, stack, state };
|
|
3020
3026
|
}
|
|
3021
3027
|
|
|
@@ -5388,13 +5394,19 @@ var IrisCombobox = vue.defineComponent({
|
|
|
5388
5394
|
size: { type: String, default: "md" },
|
|
5389
5395
|
/** Text shown when no option matches the query. Defaults to the i18n value. */
|
|
5390
5396
|
emptyText: { type: String, default: void 0 },
|
|
5397
|
+
/** Allow committing free text that matches no option: Enter/blur emits
|
|
5398
|
+
* `commit` with the trimmed query (antd AutoComplete parity). Default
|
|
5399
|
+
* false keeps the option-only contract. */
|
|
5400
|
+
allowCommit: { type: Boolean, default: false },
|
|
5391
5401
|
/** id forwarded to the input. Set by IrisFormField. */
|
|
5392
5402
|
id: { type: String, default: void 0 },
|
|
5393
5403
|
/** Forwarded as `aria-describedby` on the input. Set by IrisFormField. */
|
|
5394
5404
|
ariaDescribedby: { type: String, default: void 0 }
|
|
5395
5405
|
},
|
|
5396
5406
|
emits: {
|
|
5397
|
-
"update:modelValue": (_value) => true
|
|
5407
|
+
"update:modelValue": (_value) => true,
|
|
5408
|
+
/** Free-text commit when `allowCommit` is on and no option is selected. */
|
|
5409
|
+
commit: (_text) => true
|
|
5398
5410
|
},
|
|
5399
5411
|
setup(props, { attrs, emit }) {
|
|
5400
5412
|
const { t } = useI18n();
|
|
@@ -5423,6 +5435,13 @@ var IrisCombobox = vue.defineComponent({
|
|
|
5423
5435
|
query.value = "";
|
|
5424
5436
|
close();
|
|
5425
5437
|
};
|
|
5438
|
+
const commitQuery = () => {
|
|
5439
|
+
const text = query.value.trim();
|
|
5440
|
+
if (!text) return;
|
|
5441
|
+
emit("commit", text);
|
|
5442
|
+
query.value = "";
|
|
5443
|
+
close();
|
|
5444
|
+
};
|
|
5426
5445
|
const onInput = (event) => {
|
|
5427
5446
|
query.value = event.target.value;
|
|
5428
5447
|
filtering.value = true;
|
|
@@ -5448,6 +5467,9 @@ var IrisCombobox = vue.defineComponent({
|
|
|
5448
5467
|
if (open.value && activeIndex.value >= 0 && list[activeIndex.value]) {
|
|
5449
5468
|
event.preventDefault();
|
|
5450
5469
|
selectOption(list[activeIndex.value]);
|
|
5470
|
+
} else if (props.allowCommit) {
|
|
5471
|
+
event.preventDefault();
|
|
5472
|
+
commitQuery();
|
|
5451
5473
|
}
|
|
5452
5474
|
} else if (event.key === "Escape") {
|
|
5453
5475
|
if (open.value) {
|
|
@@ -5519,6 +5541,10 @@ var IrisCombobox = vue.defineComponent({
|
|
|
5519
5541
|
},
|
|
5520
5542
|
onBlur: () => {
|
|
5521
5543
|
focused.value = false;
|
|
5544
|
+
if (props.allowCommit && query.value.trim()) {
|
|
5545
|
+
commitQuery();
|
|
5546
|
+
return;
|
|
5547
|
+
}
|
|
5522
5548
|
close();
|
|
5523
5549
|
},
|
|
5524
5550
|
style: {
|