@iris-ui-kit/react 0.2.3 → 0.3.1
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 +6 -3
- package/dist/admin.cjs.map +1 -1
- package/dist/admin.js +1 -1
- package/dist/async.cjs +16 -7
- package/dist/async.cjs.map +1 -1
- package/dist/async.d.cts +7 -6
- package/dist/async.d.ts +7 -6
- package/dist/async.js +1 -1
- package/dist/chunk-3772LKJP.js +942 -0
- package/dist/chunk-3772LKJP.js.map +1 -0
- package/dist/{chunk-TO7YVSAI.js → chunk-3KYNBLRY.js} +18 -9
- package/dist/chunk-3KYNBLRY.js.map +1 -0
- package/dist/{chunk-AUA5GBT6.js → chunk-4VPCQ3U4.js} +28 -27
- package/dist/chunk-4VPCQ3U4.js.map +1 -0
- package/dist/{chunk-V3KHE2WB.js → chunk-QKDOW7FG.js} +15 -9
- package/dist/chunk-QKDOW7FG.js.map +1 -0
- package/dist/{chunk-KRFZ5KL4.js → chunk-TDVRIHE6.js} +8 -5
- package/dist/chunk-TDVRIHE6.js.map +1 -0
- package/dist/{chunk-QZJXMCRR.js → chunk-VLWZSOTH.js} +2 -2
- package/dist/chunk-VLWZSOTH.js.map +1 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.cts +2 -2
- package/dist/data.d.ts +2 -2
- package/dist/data.js +1 -1
- package/dist/grid.cjs +1007 -0
- package/dist/grid.cjs.map +1 -0
- package/dist/grid.d.cts +324 -0
- package/dist/grid.d.ts +324 -0
- package/dist/grid.js +5 -0
- package/dist/grid.js.map +1 -0
- package/dist/index.cjs +14296 -2652
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1993 -251
- package/dist/index.d.ts +1993 -251
- package/dist/index.js +13031 -2362
- package/dist/index.js.map +1 -1
- package/dist/modal-utils.cjs +26 -25
- package/dist/modal-utils.cjs.map +1 -1
- package/dist/modal-utils.js +1 -1
- package/dist/skeletons.cjs +13 -7
- package/dist/skeletons.cjs.map +1 -1
- package/dist/skeletons.js +1 -1
- package/package.json +20 -15
- package/dist/chunk-AUA5GBT6.js.map +0 -1
- package/dist/chunk-KRFZ5KL4.js.map +0 -1
- package/dist/chunk-QZJXMCRR.js.map +0 -1
- package/dist/chunk-TO7YVSAI.js.map +0 -1
- package/dist/chunk-V3KHE2WB.js.map +0 -1
package/dist/admin.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/layouts/SidebarLayout.tsx","../src/layouts/HeaderLayout.tsx","../src/useStore.ts","../src/theme/ThemeProvider.tsx","../src/primitives/icon/Icon.tsx","../src/i18n/context.ts","../src/i18n/useI18n.ts","../src/admin/NavMenu.tsx","../src/primitives/breadcrumb/Breadcrumb.tsx","../src/primitives/breadcrumb/BreadcrumbItem.tsx","../src/admin/AdminBreadcrumb.tsx","../src/admin/useTabsNav.ts","../src/useMachine.ts","../src/primitives/dropdown/context.ts","../src/primitives/dropdown/Dropdown.tsx","../src/primitives/slot/Slot.tsx","../src/primitives/dropdown/DropdownTrigger.tsx","../src/floating/useFloating.ts","../src/floating/useDismiss.ts","../src/primitives/dropdown/DropdownMenu.tsx","../src/primitives/dropdown/DropdownItem.tsx","../src/behaviors/Sortable.tsx","../src/admin/AdminTabs.tsx","../src/admin/useAdminShell.ts","../src/admin/AdminLayout.tsx","../src/admin/useAdminPreferences.ts"],"names":["React","jsxs","jsx","asLen","useSyncExternalStore","createContext","useContext","defaultIconRegistry","resolveThemedIcon","React3","React4","createI18n","React5","React6","branchTrail","createExpansion","visibleNav","findNavPath","isBranch","firstLeaf","findNavNode","React7","IrisBreadcrumb","React8","IrisBreadcrumbItem","useMemo","React9","createFloatingMachine","React10","composeEventHandlers","React11","IrisSlot","React12","IrisDropdownTrigger","React13","offsetMiddleware","flipMiddleware","shiftMiddleware","sizeMiddleware","arrowMiddleware","computePosition","autoUpdate","React14","React15","IrisDropdownMenu","matchTypeahead","createPortal","React16","IrisDropdownItem","IrisDropdownSeparator","React17","createSortable","React18","isClosable","Fragment","React19","createAdminShell","React20","React21"],"mappings":"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","file":"admin.cjs","sourcesContent":["import * as React from 'react'\n\nexport interface IrisSidebarLayoutSidebarState {\n collapsed: boolean\n setCollapsed: (next: boolean) => void\n}\n\nexport interface IrisSidebarLayoutProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n collapsed?: boolean\n defaultCollapsed?: boolean\n onCollapsedChange?: (next: boolean) => void\n /** Sidebar width when expanded (px or CSS length). */\n width?: number | string\n /** Sidebar width when collapsed. */\n collapsedWidth?: number | string\n side?: 'left' | 'right'\n /** Sidebar content. May be a render function that receives `{ collapsed, setCollapsed }`. */\n sidebar?: React.ReactNode | ((state: IrisSidebarLayoutSidebarState) => React.ReactNode)\n children?: React.ReactNode\n}\n\nfunction asLen(v: number | string): string {\n return typeof v === 'number' ? `${v}px` : v\n}\n\n/**\n * Two-column layout with a collapsible sidebar. The sidebar is kept mounted\n * across collapses (only its width animates) so component state survives.\n */\nexport function IrisSidebarLayout({\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n width = 240,\n collapsedWidth = 60,\n side = 'left',\n sidebar,\n style,\n children,\n ...rest\n}: IrisSidebarLayoutProps): React.ReactElement {\n const isControlled = collapsedProp !== undefined\n const [internal, setInternal] = React.useState(defaultCollapsed)\n const collapsed = isControlled ? Boolean(collapsedProp) : internal\n\n const setCollapsed = React.useCallback(\n (next: boolean) => {\n if (!isControlled) setInternal(next)\n onCollapsedChange?.(next)\n },\n [isControlled, onCollapsedChange],\n )\n\n const sidebarContent =\n typeof sidebar === 'function'\n ? (sidebar as (s: IrisSidebarLayoutSidebarState) => React.ReactNode)({\n collapsed,\n setCollapsed,\n })\n : sidebar\n\n const sidebarStyle: React.CSSProperties = {\n width: collapsed ? asLen(collapsedWidth) : asLen(width),\n flexShrink: 0,\n background: 'var(--iris-surface)',\n borderRight: side === 'left' ? '1px solid var(--iris-border)' : 'none',\n borderLeft: side === 'right' ? '1px solid var(--iris-border)' : 'none',\n transition: 'width 180ms ease',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n }\n\n return (\n <div\n {...rest}\n data-iris-sidebar-layout=\"\"\n data-collapsed={collapsed ? '' : undefined}\n data-side={side}\n style={{\n display: 'flex',\n flexDirection: side === 'right' ? 'row-reverse' : 'row',\n width: '100%',\n height: '100%',\n minHeight: 0,\n color: 'var(--iris-foreground)',\n ...style,\n }}\n >\n <aside\n role=\"complementary\"\n data-iris-sidebar=\"\"\n data-collapsed={collapsed ? '' : undefined}\n style={sidebarStyle}\n >\n {sidebarContent}\n </aside>\n <div\n data-iris-sidebar-main=\"\"\n style={{\n flex: 1,\n minWidth: 0,\n overflow: 'auto',\n background: 'var(--iris-background)',\n }}\n >\n {children}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\n\nexport interface IrisHeaderLayoutProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n /** Header height (px or CSS length). Default `'auto'`. */\n headerHeight?: number | string\n /** Footer height (px or CSS length). Default `'auto'`. */\n footerHeight?: number | string\n /** Header sticks via `position: sticky` instead of static. Default true. */\n sticky?: boolean\n header?: React.ReactNode\n footer?: React.ReactNode\n children?: React.ReactNode\n}\n\nfunction asLen(v: number | string): string {\n return typeof v === 'number' ? `${v}px` : v\n}\n\n/**\n * Two- (or three-) region vertical layout: a sticky header on top, a\n * scrollable main region, and an optional footer.\n */\nexport function IrisHeaderLayout({\n headerHeight = 'auto',\n footerHeight = 'auto',\n sticky = true,\n header,\n footer,\n style,\n children,\n ...rest\n}: IrisHeaderLayoutProps): React.ReactElement {\n return (\n <div\n {...rest}\n data-iris-header-layout=\"\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: '100%',\n minHeight: 0,\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n ...style,\n }}\n >\n {header ? (\n <header\n role=\"banner\"\n data-iris-header=\"\"\n style={{\n flexShrink: 0,\n height: asLen(headerHeight),\n borderBottom: '1px solid var(--iris-border)',\n background: 'var(--iris-surface)',\n position: sticky ? 'sticky' : 'static',\n top: 0,\n zIndex: 50,\n }}\n >\n {header}\n </header>\n ) : null}\n <main\n role=\"main\"\n data-iris-header-main=\"\"\n style={{ flex: 1, minHeight: 0, overflow: 'auto' }}\n >\n {children}\n </main>\n {footer ? (\n <footer\n role=\"contentinfo\"\n data-iris-footer=\"\"\n style={{\n flexShrink: 0,\n height: asLen(footerHeight),\n borderTop: '1px solid var(--iris-border)',\n background: 'var(--iris-surface)',\n }}\n >\n {footer}\n </footer>\n ) : null}\n </div>\n )\n}\n","import * as React from 'react'\nimport { useSyncExternalStore } from 'react'\nimport type { ReadonlyStore, Store } from '@iris-ui-kit/core'\n\n/**\n * Bridge a framework-agnostic `@iris-ui-kit/core` store into React reactivity.\n * Uses React 18's `useSyncExternalStore` — the contract is identical to the\n * one Vue uses via `ref + onMounted` and Solid uses via `createSignal`. The\n * **same** store can power Button, Popover, Dialog, etc. on any framework.\n */\nexport function useStore<T>(store: ReadonlyStore<T>): T {\n return useSyncExternalStore(\n store.subscribe,\n store.getState,\n store.getState, // SSR fallback — same as client snapshot in our case.\n )\n}\n\n/**\n * Subscribe to a DERIVED slice of a core store — the component re-renders only\n * when `selector(state)` changes per `isEqual` (default `Object.is`), not on\n * every store emission. Built on {@link Store.subscribeWith}. Inline closures\n * for `selector`/`isEqual` are fine (captured via refs; the subscription is not\n * re-created between renders).\n */\nexport function useStoreSelector<T, U>(\n store: Store<T>,\n selector: (state: T) => U,\n isEqual?: (a: U, b: U) => boolean,\n): U {\n const [slice, setSlice] = React.useState(() => selector(store.getState()))\n const selRef = React.useRef(selector)\n selRef.current = selector\n const eqRef = React.useRef(isEqual)\n eqRef.current = isEqual\n React.useEffect(() => {\n const read = (s: T): U => selRef.current(s)\n const eq = (a: U, b: U): boolean => (eqRef.current ?? Object.is)(a, b)\n // Re-sync in case the store moved between render and this effect.\n setSlice((prev) => {\n const next = read(store.getState())\n return eq(prev, next) ? prev : next\n })\n return store.subscribeWith(read, setSlice, eq)\n }, [store])\n return slice\n}\n","import { createContext, useContext, useEffect, useRef, type ReactNode } from 'react'\nimport {\n applyDirection,\n applyTheme,\n injectGlobalStyles,\n type ApplyThemeResult,\n type Direction,\n type ThemeStore,\n} from '@iris-ui-kit/theme'\nimport type { IrisTheme } from '@iris-ui-kit/tokens'\nimport { useStore } from '../useStore'\n\ninterface IrisThemeContextValue {\n store: ThemeStore\n current: IrisTheme\n dir: Direction\n}\n\nconst IrisThemeContext = createContext<IrisThemeContextValue | null>(null)\n\nexport interface ThemeProviderProps {\n store: ThemeStore\n target?: HTMLElement | null\n /** Writing direction; sets `dir` on the target for RTL. Default `'ltr'`. */\n dir?: Direction\n /** CSP nonce for the injected global stylesheet. Pass the `nonce` from your\n * server-rendered CSP header when you use `style-src: 'nonce-...'`. */\n cspNonce?: string\n children?: ReactNode\n}\n\n/**\n * Renderless provider that mirrors `<IrisThemeProvider>` from `@iris-ui-kit/vue`:\n * subscribes to the theme store, applies CSS variables to `target` (or\n * `document.documentElement`), reverts on unmount.\n *\n * **Zero business logic** — `applyTheme` / `createThemeStore` come straight\n * from `@iris-ui-kit/theme`. This component is just a 30-line React adapter.\n */\nexport function ThemeProvider({\n store,\n target = null,\n dir = 'ltr',\n cspNonce,\n children,\n}: ThemeProviderProps) {\n const current = useStore(store.store)\n const appliedRef = useRef<ApplyThemeResult | null>(null)\n\n useEffect(() => {\n injectGlobalStyles(cspNonce)\n const el = target ?? document.documentElement\n appliedRef.current?.revert()\n appliedRef.current = applyTheme(current, el)\n const dirApplied = applyDirection(dir, el)\n return () => {\n appliedRef.current?.revert()\n appliedRef.current = null\n dirApplied.revert()\n }\n }, [current, target, dir])\n\n return (\n <IrisThemeContext.Provider value={{ store, current, dir }}>\n {children}\n </IrisThemeContext.Provider>\n )\n}\n\nexport function useThemeContext(): IrisThemeContextValue {\n const ctx = useContext(IrisThemeContext)\n if (!ctx) {\n throw new Error('[iris-ui] useTheme(): no <ThemeProvider> ancestor found')\n }\n return ctx\n}\n\n/**\n * Read the current theme without throwing when there is no `<ThemeProvider>`\n * ancestor. Returns `undefined` outside a provider. Used by theme-aware\n * primitives (e.g. `IrisIcon`) that must still render standalone.\n */\nexport function useThemeOptional(): IrisTheme | undefined {\n return useContext(IrisThemeContext)?.current\n}\n\n/**\n * Current writing direction (`'ltr'` / `'rtl'`) from the nearest\n * `<ThemeProvider>`, or `'ltr'` when there is none. For components that need to\n * branch on direction beyond what CSS logical properties already handle.\n */\nexport function useDirection(): Direction {\n return useContext(IrisThemeContext)?.dir ?? 'ltr'\n}\n","import * as React from 'react'\nimport { defaultIconRegistry, resolveThemedIcon, type IrisIconRegistry } from '@iris-ui-kit/icons'\nimport { useThemeOptional } from '../../theme'\n\nexport interface IrisIconProps extends Omit<\n React.SVGAttributes<SVGSVGElement>,\n 'name' | 'children' | 'dangerouslySetInnerHTML' | 'fill'\n> {\n /** Semantic icon name resolved via the registry (e.g. 'check', 'chevron-down'). */\n name: string\n /** Width & height (number → px). Default 24. */\n size?: number | string\n /** Stroke width for line icons. Default 2. */\n strokeWidth?: number\n /** Render as a filled glyph instead of a stroked line icon. */\n fill?: boolean\n /** Accessible title; sets `role=\"img\"` + `aria-label`. Omit for decorative icons. */\n title?: string\n /** Registry to resolve `name` against. Defaults to the built-in set. */\n registry?: IrisIconRegistry\n}\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 function IrisIcon({\n name,\n size = 24,\n strokeWidth = 2,\n fill = false,\n title,\n registry = defaultIconRegistry,\n style,\n ...rest\n}: IrisIconProps): React.ReactElement | null {\n const theme = useThemeOptional()\n const icon = resolveThemedIcon(registry, name, theme)\n if (!icon) return null\n\n const paint: React.SVGAttributes<SVGSVGElement> = fill\n ? { fill: 'currentColor' }\n : {\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }\n\n return (\n <svg\n {...rest}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={icon.viewBox ?? '0 0 24 24'}\n width={size}\n height={size}\n {...paint}\n role={title ? 'img' : undefined}\n aria-label={title || undefined}\n aria-hidden={title ? undefined : true}\n data-iris-icon={name}\n style={{ display: 'inline-block', verticalAlign: 'middle', flexShrink: 0, ...style }}\n >\n {title ? <title>{title}</title> : null}\n {icon.nodes.map((node, i) => React.createElement(node.tag, { key: i, ...node.attrs }))}\n </svg>\n )\n}\n","import * as React from 'react'\nimport type { I18n } from '@iris-ui-kit/core'\n\n/** Carries the active {@link I18n} instance to descendants via `useI18n`. */\nexport const I18nContext = React.createContext<I18n | null>(null)\n","import * as React from 'react'\nimport { createI18n, type I18n } from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\nimport { I18nContext } from './context'\n\nexport interface UseI18nReturn {\n locale: string\n t: I18n['t']\n formatDate: I18n['formatDate']\n formatNumber: I18n['formatNumber']\n formatRelativeTime: I18n['formatRelativeTime']\n setLocale: I18n['setLocale']\n setMessages: I18n['setMessages']\n}\n\n// Shared fallback so components can call `useI18n()` without an enclosing\n// provider — they get English defaults rather than throwing.\nlet fallbackI18n: I18n | null = null\nfunction getFallback(): I18n {\n if (fallbackI18n === null) fallbackI18n = createI18n()\n return fallbackI18n\n}\n\n/**\n * Reactive access to the active locale + translation/formatting helpers.\n * Re-renders the host when the locale or messages change. Works with or\n * without an `<IrisI18nProvider>` (falls back to English defaults).\n */\nexport function useI18n(): UseI18nReturn {\n const ctx = React.useContext(I18nContext)\n const i18n = ctx ?? getFallback()\n const state = useStore(i18n.store)\n\n return {\n locale: state.locale,\n t: i18n.t,\n formatDate: i18n.formatDate,\n formatNumber: i18n.formatNumber,\n formatRelativeTime: i18n.formatRelativeTime,\n setLocale: i18n.setLocale,\n setMessages: i18n.setMessages,\n }\n}\n","import * as React from 'react'\nimport {\n branchTrail,\n createExpansion,\n findNavNode,\n findNavPath,\n firstLeaf,\n isBranch,\n visibleNav,\n type ExpansionModel,\n type NavNode,\n} from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\nimport { IrisIcon } from '../primitives/icon/Icon'\nimport { useI18n } from '../i18n'\n\nexport interface IrisNavMenuProps {\n /** Normalized nav tree. */\n items: NavNode[]\n /** Key of the active leaf. */\n activeKey?: string\n /** Controlled expanded branch keys. */\n expandedKeys?: string[]\n /** Initial expanded keys when uncontrolled (else the active trail expands). */\n defaultExpandedKeys?: string[]\n /** Icon-only rail (top-level items only). */\n collapsed?: boolean\n /** Top-level flow. Horizontal branches open an anchored dropdown panel. */\n orientation?: 'vertical' | 'horizontal'\n ariaLabel?: string\n onSelect?: (key: string, node: NavNode) => void\n onExpandedKeysChange?: (keys: string[]) => void\n}\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: takes\n * `activeKey`, calls `onSelect(key, node)`; the host owns navigation.\n *\n * `collapsed` switches to an icon-only rail (top-level only); a branch click\n * then jumps to its first leaf. React port of the Vue `IrisNavMenu`.\n */\nexport function IrisNavMenu({\n items,\n activeKey,\n expandedKeys,\n defaultExpandedKeys,\n collapsed = false,\n orientation = 'vertical',\n ariaLabel,\n onSelect,\n onExpandedKeysChange,\n}: IrisNavMenuProps): React.ReactElement {\n const { t } = useI18n()\n const horizontal = orientation === 'horizontal'\n // Expand/collapse state lives in the core expansion model — the open-set algebra\n // and the active-trail union (`merge`) are byte-identical across every adapter, so\n // they live in @iris-ui-kit/core. This component keeps only the controlled/uncontrolled\n // wiring: uncontrolled reads + writes the model store; controlled mirrors the\n // `expandedKeys` prop and just notifies. `branchTrail` is the shared selector.\n const trailOf = React.useCallback(\n (key: string | undefined): string[] => (key ? branchTrail(items, key) : []),\n [items],\n )\n\n const isControlled = expandedKeys !== undefined\n const modelRef = React.useRef<ExpansionModel | null>(null)\n if (modelRef.current === null) {\n modelRef.current = createExpansion({\n mode: 'multiple',\n defaultExpanded: defaultExpandedKeys ?? trailOf(activeKey),\n })\n }\n const model = modelRef.current\n const internalExpanded = useStore(model.store)\n const expanded = isControlled ? (expandedKeys as string[]) : internalExpanded\n\n // Auto-open the active branch trail as the active leaf changes (uncontrolled).\n // `merge` unions without removals and is a no-op when the trail is already open,\n // and the model has no `onChange` wired, so this never emits onExpandedKeysChange.\n React.useEffect(() => {\n if (isControlled) return\n model.merge(trailOf(activeKey))\n }, [activeKey, isControlled, model, trailOf])\n\n const setExpanded = (keys: string[]): void => {\n if (!isControlled) model.set(keys)\n onExpandedKeysChange?.(keys)\n }\n const toggle = (key: string): void =>\n setExpanded(expanded.includes(key) ? expanded.filter((k) => k !== key) : [...expanded, key])\n\n const select = (node: NavNode): void => {\n if (node.disabled) return\n onSelect?.(node.key, node)\n }\n\n const [hovered, setHovered] = React.useState<string | null>(null)\n const tree = visibleNav(items)\n const activePath = activeKey ? findNavPath(items, activeKey).map((n) => n.key) : []\n\n const itemStyle = (opts: {\n depth: number\n active: boolean\n trail: boolean\n disabled: boolean\n hovered: boolean\n }): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-space-sm, 12px)',\n width: horizontal && opts.depth === 0 ? 'auto' : '100%',\n boxSizing: 'border-box',\n border: 'none',\n borderRadius: 'var(--iris-radius-md, 6px)',\n background: opts.active\n ? opts.hovered && !opts.disabled\n ? 'var(--iris-nav-item-active-hover, color-mix(in srgb, var(--iris-primary) 88%, black))'\n : 'var(--iris-primary)'\n : opts.hovered && !opts.disabled\n ? 'var(--iris-surface-hover, var(--iris-surface))'\n : 'transparent',\n color: opts.active\n ? 'var(--iris-primary-foreground, #fff)'\n : opts.trail\n ? 'var(--iris-primary)'\n : 'var(--iris-foreground)',\n font: 'inherit',\n fontSize: 'var(--iris-font-size-md, 14px)',\n fontWeight: opts.active || opts.trail ? 600 : 400,\n textAlign: 'start',\n cursor: opts.disabled ? 'not-allowed' : 'pointer',\n opacity: opts.disabled ? 0.5 : 1,\n padding: collapsed ? 10 : 'var(--iris-space-xs, 8px) var(--iris-space-sm, 12px)',\n paddingInlineStart: collapsed ? 10 : 12 + opts.depth * 16,\n justifyContent: collapsed ? 'center' : 'flex-start',\n })\n\n const iconNode = (node: NavNode, size = 18): React.ReactElement | null =>\n node.icon ? <IrisIcon name={node.icon} size={size} /> : null\n\n const badgeNode = (node: NavNode): React.ReactElement | null =>\n node.badge !== undefined && node.badge !== '' && !collapsed ? (\n <span\n data-iris-nav-badge=\"\"\n style={{\n marginInlineStart: 'auto',\n fontSize: 'var(--iris-font-size-xs, 12px)',\n lineHeight: 1,\n padding: 'var(--iris-space-xxs, 4px) var(--iris-padding-sm, 6px)',\n borderRadius: 999,\n background: 'var(--iris-danger, #ef4444)',\n color: 'var(--iris-primary-foreground, #fff)',\n }}\n >\n {String(node.badge)}\n </span>\n ) : null\n\n const hoverProps = (key: string) => ({\n onMouseEnter: () => setHovered(key),\n onMouseLeave: () => setHovered((h) => (h === key ? null : h)),\n })\n\n // Collapsed rail: top-level items only, icon + native tooltip; branch → first leaf.\n const renderCollapsed = (node: NavNode): React.ReactElement => {\n const branch = isBranch(node)\n const active = branch ? activePath.includes(node.key) : node.key === activeKey\n return (\n <button\n key={node.key}\n type=\"button\"\n data-iris-nav-item=\"\"\n data-key={node.key}\n data-active={active ? 'true' : undefined}\n data-branch={branch ? '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 style={itemStyle({\n depth: 0,\n active,\n trail: false,\n disabled: !!node.disabled,\n hovered: hovered === node.key,\n })}\n {...hoverProps(node.key)}\n onClick={() => select(branch ? firstLeaf(node) : node)}\n >\n {iconNode(node, 20) ?? <span style={{ fontWeight: 700 }}>{node.title.charAt(0)}</span>}\n </button>\n )\n }\n\n const renderItem = (node: NavNode, depth: number): React.ReactElement => {\n const branch = isBranch(node)\n const open = expanded.includes(node.key)\n const active = node.key === activeKey\n const trail = branch && activePath.includes(node.key)\n\n const row = (\n <button\n type=\"button\"\n data-iris-nav-item=\"\"\n data-key={node.key}\n data-branch={branch ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n data-open={branch && open ? 'true' : undefined}\n data-depth={String(depth)}\n disabled={node.disabled}\n aria-expanded={branch ? (open ? 'true' : 'false') : undefined}\n aria-current={active ? 'page' : undefined}\n style={itemStyle({\n depth,\n active,\n trail,\n disabled: !!node.disabled,\n hovered: hovered === node.key,\n })}\n {...hoverProps(node.key)}\n onClick={() => (branch ? toggle(node.key) : select(node))}\n >\n {iconNode(node)}\n <span\n style={{\n flex: branch ? 1 : '0 1 auto',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {node.title}\n </span>\n {badgeNode(node)}\n {branch ? (\n <IrisIcon\n name={open ? 'chevron-down' : 'chevron-right'}\n size={16}\n style={{ marginInlineStart: node.badge ? 6 : 'auto', opacity: 0.6 }}\n />\n ) : null}\n </button>\n )\n\n if (!branch || !open) {\n return (\n <div\n key={node.key}\n data-iris-nav-group={branch ? '' : undefined}\n style={{ position: horizontal && depth === 0 ? 'relative' : undefined }}\n >\n {row}\n </div>\n )\n }\n return (\n <div\n key={node.key}\n data-iris-nav-group=\"\"\n data-open=\"true\"\n style={{ position: horizontal && depth === 0 ? 'relative' : undefined }}\n >\n {row}\n <div\n data-iris-nav-children=\"\"\n role=\"group\"\n style={\n horizontal && depth === 0\n ? {\n position: 'absolute',\n insetBlockStart: 'calc(100% + 4px)',\n insetInlineStart: 0,\n zIndex: 60,\n minWidth: 220,\n padding: 'var(--iris-space-xs, 8px)',\n border: '1px solid var(--iris-border)',\n borderRadius: 'var(--iris-radius-md, 6px)',\n background: 'var(--iris-surface)',\n boxShadow: 'var(--iris-shadow-md)',\n }\n : undefined\n }\n >\n {(node.children ?? []).map((child) => renderItem(child, depth + 1))}\n </div>\n </div>\n )\n }\n\n // Arrow-key navigation over the visible items (Tab still works as a fallback).\n const onKeyDown = (e: React.KeyboardEvent<HTMLElement>): void => {\n const root = e.currentTarget\n const buttons = Array.from(root.querySelectorAll<HTMLElement>('[data-iris-nav-item]'))\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 return focusAt(idx < 0 ? 0 : idx + 1)\n case 'ArrowUp':\n e.preventDefault()\n return focusAt(idx < 0 ? buttons.length - 1 : idx - 1)\n case 'Home':\n e.preventDefault()\n return void buttons[0]?.focus()\n case 'End':\n e.preventDefault()\n return void buttons[buttons.length - 1]?.focus()\n }\n\n if (collapsed || idx < 0) return\n const key = buttons[idx]?.getAttribute('data-key')\n if (!key) return\n const node = findNavNode(items, key)\n\n if (e.key === 'ArrowRight' && node && isBranch(node)) {\n e.preventDefault()\n if (!expanded.includes(key)) toggle(key)\n else focusAt(idx + 1)\n } else if (e.key === 'ArrowLeft') {\n if (node && isBranch(node) && expanded.includes(key)) {\n e.preventDefault()\n toggle(key)\n } else {\n const parentKey = findNavPath(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 return (\n <nav\n data-iris-nav-menu=\"\"\n data-collapsed={collapsed ? 'true' : undefined}\n data-orientation={orientation}\n aria-label={ariaLabel ?? t('admin.nav')}\n onKeyDown={onKeyDown}\n style={{\n display: 'flex',\n flexDirection: horizontal ? 'row' : 'column',\n alignItems: horizontal ? 'center' : undefined,\n gap: 'var(--iris-space-xxs, 4px)',\n }}\n >\n {collapsed\n ? tree.map((node) => renderCollapsed(node))\n : tree.map((node) => renderItem(node, 0))}\n </nav>\n )\n}\n","import * as React from 'react'\nimport { useI18n } from '../../i18n'\n\nexport interface IrisBreadcrumbProps extends React.HTMLAttributes<HTMLElement> {\n /** String separator between crumbs. Default `/`. */\n separator?: React.ReactNode\n children?: React.ReactNode\n}\n\n/**\n * Container for breadcrumb navigation. Renders a `<nav>` with an `<ol>` per\n * WAI-ARIA. Inserts `separator` between items and tags the last child with\n * `isCurrent` so it renders as plain text + `aria-current=\"page\"`.\n */\nexport const IrisBreadcrumb = React.forwardRef<HTMLElement, IrisBreadcrumbProps>(\n function IrisBreadcrumb({ separator = '/', children, ...rest }, ref) {\n const { t } = useI18n()\n const flat = React.Children.toArray(children).filter((c) =>\n React.isValidElement(c),\n ) as React.ReactElement[]\n const total = flat.length\n\n return (\n <nav\n {...rest}\n ref={ref as React.Ref<HTMLElement>}\n aria-label={t('breadcrumb.label')}\n data-iris-breadcrumb=\"\"\n >\n <ol\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 {flat.map((child, i) => {\n const isLast = i === total - 1\n const itemNode = (\n <li\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 {React.cloneElement(child, {\n isCurrent: isLast,\n } as Partial<unknown> as React.Attributes)}\n </li>\n )\n const sepNode = !isLast ? (\n <li\n key={`sep-${i}`}\n data-iris-breadcrumb-separator=\"\"\n aria-hidden=\"true\"\n style={{ color: 'var(--iris-muted)', display: 'inline-flex', alignItems: 'center' }}\n >\n {separator}\n </li>\n ) : null\n return (\n <React.Fragment key={`pair-${i}`}>\n {itemNode}\n {sepNode}\n </React.Fragment>\n )\n })}\n </ol>\n </nav>\n )\n },\n)\n","import * as React from 'react'\n\nexport interface IrisBreadcrumbItemProps extends React.HTMLAttributes<HTMLElement> {\n href?: string\n /** Internal: set by parent `IrisBreadcrumb` when this is the last item. */\n isCurrent?: boolean\n children?: React.ReactNode\n}\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>`. The `isCurrent` flag is\n * set automatically by the parent `IrisBreadcrumb` based on position.\n */\nexport const IrisBreadcrumbItem = React.forwardRef<HTMLElement, IrisBreadcrumbItemProps>(\n function IrisBreadcrumbItem({ href, isCurrent = false, style, children, ...rest }, ref) {\n const baseStyle: React.CSSProperties = {\n color: isCurrent ? 'var(--iris-muted)' : 'var(--iris-primary)',\n textDecoration: 'none',\n cursor: isCurrent ? 'default' : href ? 'pointer' : 'default',\n }\n\n const common = {\n ...rest,\n 'aria-current': isCurrent ? ('page' as const) : undefined,\n 'data-iris-breadcrumb-crumb': '',\n style: { ...baseStyle, ...style },\n }\n\n if (href && !isCurrent) {\n return (\n <a {...common} ref={ref as React.Ref<HTMLAnchorElement>} href={href}>\n {children}\n </a>\n )\n }\n return (\n <span {...common} ref={ref as React.Ref<HTMLSpanElement>}>\n {children}\n </span>\n )\n },\n)\n","import * as React from 'react'\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\nexport interface IrisAdminBreadcrumbProps {\n /** Root→current ancestor chain (typically `findNavPath(menus, activeKey)`). */\n trail: NavNode[]\n /** Show each node's icon before its title. */\n showIcon?: boolean\n /** Hide the breadcrumb when the trail has a single crumb. */\n hideSingle?: boolean\n separator?: string\n onSelect?: (key: string, node: NavNode) => void\n}\n\n/**\n * Breadcrumb trail for the admin header, driven by a `NavNode[]` ancestor chain.\n * The last crumb is the current page (auto-marked `aria-current` by\n * IrisBreadcrumb); earlier crumbs are clickable and call `onSelect(key, node)`.\n * React port of the Vue `IrisAdminBreadcrumb`.\n */\nexport function IrisAdminBreadcrumb({\n trail,\n showIcon = true,\n hideSingle = false,\n separator = '/',\n onSelect,\n}: IrisAdminBreadcrumbProps): React.ReactElement | null {\n if (trail.length === 0 || (hideSingle && trail.length === 1)) return null\n\n return (\n <IrisBreadcrumb separator={separator}>\n {trail.map((node, i) => {\n const last = i === trail.length - 1\n return (\n <IrisBreadcrumbItem\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 : () => onSelect?.(node.key, node)}\n >\n {showIcon && node.icon ? (\n <IrisIcon name={node.icon} size={14} style={{ marginInlineEnd: 4 }} />\n ) : null}\n <span>{node.title}</span>\n </IrisBreadcrumbItem>\n )\n })}\n </IrisBreadcrumb>\n )\n}\n","import { useStore } from '../useStore'\nimport type { TabsNav, TabItem } from '@iris-ui-kit/core'\n\nexport interface UseTabsNavReturn {\n tabs: TabItem[]\n activeKey: string | undefined\n /** Keep-alive include-set (composite cache keys of all open tabs). */\n cacheKeys: 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 * React 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 read the same state) and get the reactive `tabs` / `activeKey` /\n * `cacheKeys` plus the store's mutators — bridged via `useStore`\n * (`useSyncExternalStore`), mirroring the Vue adapter.\n *\n * ```tsx\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 = useStore(nav.store)\n return {\n tabs: state.tabs,\n activeKey: state.activeKey,\n cacheKeys: state.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 { useMemo } from 'react'\nimport type { Machine, MachineEvent, MachineState } from '@iris-ui-kit/core'\nimport { useStore } from './useStore'\n\n/**\n * Bridge a framework-agnostic `Machine` into React. Returns `[state, send]`\n * — `state` is reactive (re-renders on transition) and `send` is stable\n * across renders.\n *\n * Pass a **factory** (`() => createMachine(...)`) so each component instance\n * gets its own machine. Internally memoised so re-renders don't re-create.\n */\nexport function useMachine<TState extends string, TContext, TEvent extends MachineEvent>(\n factory: () => Machine<TState, TContext, TEvent>,\n): [MachineState<TState, TContext>, (event: TEvent) => void] {\n const machine = useMemo(factory, [])\n const state = useStore(machine.store)\n return [state, machine.send]\n}\n","import * as React from 'react'\nimport type { Placement } from '@iris-ui-kit/core'\n\nexport interface DropdownContextValue {\n open: boolean\n setOpen: (next: boolean) => void\n triggerRef: React.MutableRefObject<HTMLElement | null>\n contentRef: React.MutableRefObject<HTMLElement | null>\n contentId: string\n placement: Placement\n offset: number\n}\n\nexport const DropdownContext = React.createContext<DropdownContextValue | null>(null)\n\nexport function useDropdownContext(componentName: string): DropdownContextValue {\n const ctx = React.useContext(DropdownContext)\n if (!ctx) {\n throw new Error(`[iris-ui] ${componentName} must be a descendant of <IrisDropdown>`)\n }\n return ctx\n}\n","import * as React from 'react'\nimport { createFloatingMachine, type Placement } from '@iris-ui-kit/core'\nimport { useMachine } from '../../useMachine'\nimport { DropdownContext } from './context'\n\nexport interface IrisDropdownProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: Placement\n offset?: number\n children?: React.ReactNode\n}\n\n/**\n * Dropdown menu root. Composes `createFloatingMachine` (state) with\n * `useFloating` (positioning) used in `IrisDropdownMenu`. The dropdown\n * panel's semantics differ from a popover: it uses `role=\"menu\"`, supports\n * arrow-key navigation, and items auto-close the menu on select.\n *\n * @example\n * <IrisDropdown placement=\"bottom-end\">\n * <IrisDropdownTrigger>Actions</IrisDropdownTrigger>\n * <IrisDropdownMenu>\n * <IrisDropdownItem onSelect={onCopy}>Copy</IrisDropdownItem>\n * <IrisDropdownItem onSelect={onDelete}>Delete</IrisDropdownItem>\n * </IrisDropdownMenu>\n * </IrisDropdown>\n */\nexport function IrisDropdown({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n placement = 'bottom-start',\n offset = 6,\n children,\n}: IrisDropdownProps): React.ReactElement {\n const isControlled = openProp !== undefined\n\n const [state, send] = useMachine(() => createFloatingMachine(defaultOpen ? 'open' : 'closed'))\n const internalOpen = state.value === 'open'\n\n React.useEffect(() => {\n if (!isControlled) return\n const target = openProp ? 'open' : 'closed'\n if (state.value !== target) {\n send({ type: openProp ? 'OPEN' : 'CLOSE' })\n }\n }, [isControlled, openProp, state.value, send])\n\n const open = isControlled ? Boolean(openProp) : internalOpen\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (!isControlled) send({ type: next ? 'OPEN' : 'CLOSE' })\n onOpenChange?.(next)\n },\n [isControlled, send, onOpenChange],\n )\n\n const triggerRef = React.useRef<HTMLElement | null>(null)\n const contentRef = React.useRef<HTMLElement | null>(null)\n const contentId = React.useId()\n\n const value = React.useMemo(\n () => ({\n open,\n setOpen,\n triggerRef,\n contentRef,\n contentId,\n placement,\n offset,\n }),\n [open, setOpen, contentId, placement, offset],\n )\n\n return <DropdownContext.Provider value={value}>{children}</DropdownContext.Provider>\n}\n","import * as React from 'react'\nimport { composeEventHandlers } from '@iris-ui-kit/core'\n\ntype AnyProps = Record<string, unknown>\n\nexport interface IrisSlotProps {\n children?: React.ReactNode\n [key: string]: unknown\n}\n\nfunction mergeRefs<T>(...refs: Array<React.Ref<T> | undefined | null>): React.RefCallback<T> {\n return (value: T | null) => {\n for (const ref of refs) {\n if (!ref) continue\n if (typeof ref === 'function') ref(value)\n else (ref as React.MutableRefObject<T | null>).current = value\n }\n }\n}\n\nfunction isEventHandlerName(key: string): boolean {\n return /^on[A-Z]/.test(key)\n}\n\nfunction mergeSlotProps(slot: AnyProps, child: AnyProps): AnyProps {\n const merged: AnyProps = { ...slot }\n for (const key of Object.keys(child)) {\n const slotValue = slot[key]\n const childValue = child[key]\n if (key === 'style') {\n merged.style = {\n ...((slotValue as React.CSSProperties | undefined) ?? {}),\n ...((childValue as React.CSSProperties | undefined) ?? {}),\n }\n } else if (key === 'className') {\n merged.className = [slotValue, childValue].filter(Boolean).join(' ').trim() || undefined\n } else if (\n isEventHandlerName(key) &&\n typeof slotValue === 'function' &&\n typeof childValue === 'function'\n ) {\n merged[key] = composeEventHandlers(\n slotValue as (e: React.SyntheticEvent) => void,\n childValue as (e: React.SyntheticEvent) => void,\n )\n } else if (childValue !== undefined) {\n merged[key] = childValue\n }\n }\n return merged\n}\n\n/**\n * asChild composition primitive: clones the single React element child and\n * merges the Slot's own props into it. `style` shallow-merges, `className`\n * concatenates, event handlers compose (Slot's first, then child's), and any\n * other prop on the child wins over Slot's. Used as a building block for\n * trigger primitives that want to render-as the consumer's chosen element.\n */\nexport const IrisSlot = React.forwardRef<unknown, IrisSlotProps>(function IrisSlot(\n { children, ...slotProps },\n forwardedRef,\n) {\n if (!React.isValidElement(children)) return null\n const child = children as React.ReactElement<AnyProps>\n const childProps = (child.props ?? {}) as AnyProps\n const merged = mergeSlotProps(slotProps as AnyProps, childProps)\n\n const childRef = (child as unknown as { ref?: React.Ref<unknown> }).ref ?? null\n if (forwardedRef || childRef) {\n ;(merged as { ref?: React.Ref<unknown> }).ref = mergeRefs(\n forwardedRef as React.Ref<unknown>,\n childRef,\n )\n }\n\n return React.cloneElement(child, merged as Partial<AnyProps> & React.Attributes)\n})\n","import * as React from 'react'\nimport { composeEventHandlers } from '@iris-ui-kit/core'\nimport { IrisSlot } from '../slot/Slot'\nimport { useDropdownContext } from './context'\n\nexport interface IrisDropdownTriggerProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'children'\n> {\n asChild?: boolean\n children?: React.ReactNode\n}\n\n/**\n * The trigger element that toggles the dropdown open/closed on click or\n * ArrowDown/Enter/Space. Renders as a `<button>` (or custom element via\n * `asChild`) with `aria-haspopup=\"menu\"` and `aria-expanded`.\n */\nexport const IrisDropdownTrigger = React.forwardRef<HTMLElement, IrisDropdownTriggerProps>(\n function IrisDropdownTrigger(\n { asChild = false, onClick, onKeyDown, children, ...rest },\n forwardedRef,\n ) {\n const ctx = useDropdownContext('IrisDropdownTrigger')\n\n const captureRef = React.useCallback(\n (el: HTMLElement | null) => {\n ctx.triggerRef.current = el\n if (typeof forwardedRef === 'function') forwardedRef(el)\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLElement | null>).current = el\n },\n [ctx, forwardedRef],\n )\n\n const handleClick = composeEventHandlers(\n onClick as ((e: React.MouseEvent<HTMLElement>) => void) | undefined,\n () => ctx.setOpen(!ctx.open),\n )\n\n // ArrowDown/Enter/Space open the menu (which then focuses its first item),\n // matching the Vue dropdown trigger + the WAI-ARIA menu-button pattern.\n const handleKeyDown = composeEventHandlers(\n onKeyDown as ((e: React.KeyboardEvent<HTMLElement>) => void) | undefined,\n (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n ctx.setOpen(true)\n }\n },\n )\n\n const triggerProps = {\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': ctx.open,\n 'aria-controls': ctx.contentId,\n 'data-state': ctx.open ? 'open' : 'closed',\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n }\n\n if (asChild) {\n if (!React.isValidElement(children)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[iris-ui] IrisDropdownTrigger asChild requires a single React element')\n }\n return null\n }\n return (\n <IrisSlot ref={captureRef as React.Ref<unknown>} {...rest} {...triggerProps}>\n {children}\n </IrisSlot>\n )\n }\n\n return (\n <button\n type=\"button\"\n {...(rest as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n {...triggerProps}\n ref={captureRef as React.Ref<HTMLButtonElement>}\n >\n {children}\n </button>\n )\n },\n)\n","import * as React from 'react'\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: React.RefObject<HTMLElement | null>\n /** The floating element itself. */\n floating: React.RefObject<HTMLElement | null>\n /** Whether the floating element is visible. Controls `autoUpdate` lifecycle. */\n open: 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 by the\n * `@floating-ui/dom` arrow middleware so you can position the caret CSS.\n */\n arrow?: React.RefObject<HTMLElement | null>\n}\n\nexport interface UseFloatingReturn {\n x: number\n y: number\n strategy: Strategy\n finalPlacement: Placement\n /** Ready-to-bind inline style object for the floating element. */\n floatingStyles: React.CSSProperties\n /** Trigger a manual recompute. Usually not needed — `autoUpdate` handles scroll/resize. */\n update: () => Promise<void>\n /** Arrow x offset (px from floating start edge). Present when `arrow` option is set. */\n arrowX: number | undefined\n /** Arrow y offset (px from floating start edge). Present when `arrow` option is set. */\n arrowY: number | undefined\n /**\n * The side of the floating element the arrow is on — use as the CSS property\n * to apply `bottom: 0` / `top: 0` etc. to the arrow element.\n * E.g. `'bottom'` placement → arrow is on `'top'` of the floating element.\n */\n arrowSide: 'top' | 'right' | 'bottom' | 'left' | undefined\n}\n\n/**\n * Reactive Floating UI integration for React. Subscribes `autoUpdate`\n * whenever `open === true` and both refs are populated; tears it down on\n * close, unmount, or ref clearing.\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 */\nexport function useFloating(options: UseFloatingOptions): UseFloatingReturn {\n const {\n anchor,\n floating,\n open,\n placement = 'bottom',\n strategy = 'absolute',\n offset,\n flip = true,\n shift = true,\n size = false,\n middleware: extraMiddleware,\n arrow,\n } = options\n\n const [x, setX] = React.useState(0)\n const [y, setY] = React.useState(0)\n const [finalPlacement, setFinalPlacement] = React.useState<Placement>(placement)\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 // before its real coordinates arrive.\n const [positioned, setPositioned] = React.useState(false)\n const [arrowX, setArrowX] = React.useState<number | undefined>()\n const [arrowY, setArrowY] = React.useState<number | undefined>()\n\n const middleware = React.useMemo<Middleware[]>(() => {\n const mw: Middleware[] = []\n if (offset !== undefined) mw.push(offsetMiddleware(offset))\n if (flip) mw.push(flipMiddleware())\n if (shift) mw.push(shiftMiddleware({ padding: 8 }))\n if (size) {\n const padding = typeof size === 'number' ? 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 (arrow?.current) mw.push(arrowMiddleware({ element: arrow.current }))\n if (extraMiddleware) mw.push(...extraMiddleware)\n return mw\n }, [offset, flip, shift, size, extraMiddleware, arrow])\n\n // Hold the latest middleware in a ref so `update` always sees current value\n // without being re-created (which would churn the autoUpdate subscription).\n const middlewareRef = React.useRef(middleware)\n middlewareRef.current = middleware\n\n // Monotonic token bumped on every new positioning cycle and on teardown.\n // `computePosition` is async; without this guard a result that resolves\n // after the panel closed/unmounted (or after a newer update started) would\n // apply stale coordinates and call setState on an unmounted component.\n const epochRef = React.useRef(0)\n\n const update = React.useCallback(async () => {\n const a = anchor.current\n const f = floating.current\n if (!a || !f) return\n const token = ++epochRef.current\n const result = await computePosition(a, f, {\n placement,\n strategy,\n middleware: middlewareRef.current,\n })\n // A newer update() started, or the effect tore down, while awaiting — drop.\n if (token !== epochRef.current) return\n setX(result.x)\n setY(result.y)\n setPositioned(true)\n setFinalPlacement(result.placement)\n const arrowData = result.middlewareData.arrow as { x?: number; y?: number } | undefined\n setArrowX(arrowData?.x)\n setArrowY(arrowData?.y)\n }, [anchor, floating, placement, strategy])\n\n React.useEffect(() => {\n if (!open) return\n const a = anchor.current\n const f = floating.current\n if (!a || !f) return\n // Fresh open → hide until the first computePosition cycle completes.\n setPositioned(false)\n const cleanup = autoUpdate(a, f, () => {\n void update()\n })\n return () => {\n // Invalidate any in-flight update() so its late result never lands.\n epochRef.current++\n cleanup()\n }\n }, [open, anchor, floating, update])\n\n const floatingStyles = React.useMemo<React.CSSProperties>(\n () => ({\n position: strategy,\n top: 0,\n left: 0,\n transform: `translate3d(${Math.round(x)}px, ${Math.round(y)}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 ? undefined : 'hidden',\n }),\n [strategy, x, y, positioned],\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 = OPPOSITE[finalPlacement.split('-')[0]] as\n 'top' | 'right' | 'bottom' | 'left' | undefined\n\n return { x, y, strategy, finalPlacement, floatingStyles, update, arrowX, arrowY, arrowSide }\n}\n","import * as React from 'react'\n\nexport interface UseDismissOptions {\n /** While true, the dismiss listeners are active. */\n enabled: boolean\n /** Elements that, if clicked, should NOT trigger dismiss (typically trigger + content). */\n exclude: Array<React.RefObject<HTMLElement | null>>\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 / Menu / Dropdown. Tooltip does NOT use this —\n * it dismisses on mouseleave/blur instead.\n *\n * Listeners attach to `document` (pointerdown in the capture phase, mirroring\n * the Vue adapter) only while `enabled` is true, and detach on disable /\n * unmount. SSR-safe (no-op without `document`). The latest `onDismiss` /\n * `exclude` are read through refs so toggling them never re-subscribes.\n */\nexport function useDismiss(options: UseDismissOptions): void {\n const { enabled, escape = true, outsidePointerDown = true } = options\n\n const onDismissRef = React.useRef(options.onDismiss)\n const excludeRef = React.useRef(options.exclude)\n React.useEffect(() => {\n onDismissRef.current = options.onDismiss\n excludeRef.current = options.exclude\n })\n\n React.useEffect(() => {\n if (!enabled || typeof document === 'undefined') return\n\n const isExcluded = (target: EventTarget | null): boolean => {\n if (!target || !(target instanceof Node)) return false\n for (const r of excludeRef.current) {\n const el = r.current\n if (el && (el === target || el.contains(target))) return true\n }\n return false\n }\n\n const onPointerDown = (event: PointerEvent) => {\n if (isExcluded(event.target)) return\n onDismissRef.current()\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation()\n onDismissRef.current()\n }\n }\n\n if (outsidePointerDown) document.addEventListener('pointerdown', onPointerDown, true)\n if (escape) document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [enabled, escape, outsidePointerDown])\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { matchTypeahead } from '@iris-ui-kit/core'\nimport { useFloating } from '../../floating/useFloating'\nimport { useDismiss } from '../../floating/useDismiss'\nimport { useDropdownContext } from './context'\n\nexport interface IrisDropdownMenuProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n portalTarget?: HTMLElement | false\n children?: React.ReactNode\n}\n\n/**\n * The menu surface. Renders `role=\"menu\"` and handles ArrowUp/Down/Home/End\n * navigation across child `IrisDropdownItem`s. Closes on Escape, outside\n * pointerdown, and Tab.\n */\nexport const IrisDropdownMenu = React.forwardRef<HTMLDivElement, IrisDropdownMenuProps>(\n function IrisDropdownMenu({ portalTarget, style, onKeyDown, children, ...rest }, forwardedRef) {\n const ctx = useDropdownContext('IrisDropdownMenu')\n\n const innerRef = React.useRef<HTMLDivElement | null>(null)\n const captureRef = React.useCallback(\n (el: HTMLDivElement | null) => {\n innerRef.current = el\n ctx.contentRef.current = el\n if (typeof forwardedRef === 'function') forwardedRef(el)\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLDivElement | null>).current = el\n },\n [ctx, forwardedRef],\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 // Outside-pointerdown + Escape dismiss (shared floating hook).\n useDismiss({\n enabled: ctx.open,\n exclude: [ctx.triggerRef, ctx.contentRef],\n onDismiss: () => ctx.setOpen(false),\n })\n\n // Focus first item on open; restore focus to trigger on close.\n const wasOpenRef = React.useRef(false)\n React.useEffect(() => {\n if (ctx.open && !wasOpenRef.current) {\n queueMicrotask(() => {\n const items = innerRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]')\n items?.[0]?.focus()\n })\n } else if (!ctx.open && wasOpenRef.current) {\n ctx.triggerRef.current?.focus?.()\n }\n wasOpenRef.current = ctx.open\n }, [ctx.open, ctx.triggerRef])\n\n // Typeahead buffer: accumulated printable chars, reset after a ~500ms pause.\n const typeaheadRef = React.useRef<{\n buffer: string\n timer: ReturnType<typeof setTimeout> | null\n }>({ buffer: '', timer: null })\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e)\n if (!ctx.open) return\n const items = Array.from(\n innerRef.current?.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 (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n const next = index < 0 ? 0 : (index + 1) % items.length\n items[next]?.focus()\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n const next = index <= 0 ? items.length - 1 : index - 1\n items[next]?.focus()\n break\n }\n case 'Home':\n e.preventDefault()\n items[0]?.focus()\n break\n case 'End':\n e.preventDefault()\n items[items.length - 1]?.focus()\n break\n case 'Tab':\n // Tab closes the menu and lets focus continue out.\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 (e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {\n const ta = typeaheadRef.current\n ta.buffer += e.key\n if (ta.timer) clearTimeout(ta.timer)\n ta.timer = setTimeout(() => {\n ta.buffer = ''\n }, 500)\n const match = matchTypeahead(\n items.map((it) => it.textContent ?? ''),\n ta.buffer,\n index,\n )\n if (match >= 0) {\n e.preventDefault()\n items[match]?.focus()\n }\n }\n }\n }\n }\n\n if (!ctx.open) return null\n\n const node = (\n <div\n {...rest}\n ref={captureRef}\n id={ctx.contentId}\n role=\"menu\"\n tabIndex={-1}\n data-iris-dropdown-menu=\"\"\n data-state=\"open\"\n onKeyDown={handleKeyDown}\n style={{\n ...floatingStyles,\n background: 'var(--iris-surface-floating)',\n color: 'var(--iris-foreground)',\n border: '1px solid var(--iris-border)',\n borderRadius: 'var(--iris-radius-md, 6px)',\n padding: 'var(--iris-padding-sm, 4px)',\n boxShadow: 'var(--iris-shadow-lg)',\n minWidth: 160,\n outline: 'none',\n zIndex: 'var(--iris-z-popover, 1000)',\n ...style,\n }}\n >\n {children}\n </div>\n )\n\n if (portalTarget === false) return node\n if (typeof document === 'undefined') return null\n return createPortal(node, portalTarget ?? document.body)\n },\n)\n","import * as React from 'react'\nimport { composeEventHandlers } from '@iris-ui-kit/core'\nimport { useDropdownContext } from './context'\n\nexport interface IrisDropdownItemProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onSelect'\n> {\n disabled?: boolean\n /** When true, selecting does NOT close the dropdown. */\n keepOpen?: boolean\n /** Emitted on click or Enter/Space. */\n onSelect?: (event: React.SyntheticEvent) => void\n}\n\n/**\n * A single selectable menu item. Calls `onSelect` and auto-closes the\n * parent dropdown after selection (unless `keepOpen`). Disabled items are\n * skipped by arrow-key navigation in the parent menu.\n */\nexport const IrisDropdownItem = React.forwardRef<HTMLDivElement, IrisDropdownItemProps>(\n function IrisDropdownItem(\n { disabled = false, keepOpen = false, onSelect, onClick, onKeyDown, style, children, ...rest },\n ref,\n ) {\n const ctx = useDropdownContext('IrisDropdownItem')\n const [hovered, setHovered] = React.useState(false)\n\n const fire = (event: React.SyntheticEvent) => {\n if (disabled) return\n onSelect?.(event)\n if (!keepOpen) ctx.setOpen(false)\n }\n\n const handleClick = composeEventHandlers(\n onClick as ((e: React.MouseEvent<HTMLDivElement>) => void) | undefined,\n (e: React.MouseEvent<HTMLDivElement>) => fire(e),\n )\n const handleKeyDown = composeEventHandlers(\n onKeyDown as ((e: React.KeyboardEvent<HTMLDivElement>) => void) | undefined,\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n fire(e)\n }\n },\n )\n\n return (\n <div\n {...rest}\n ref={ref}\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled ? 'true' : undefined}\n data-iris-dropdown-item=\"\"\n data-disabled={disabled ? '' : undefined}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onPointerEnter={() => setHovered(true)}\n onPointerLeave={() => setHovered(false)}\n onFocus={() => setHovered(true)}\n onBlur={() => setHovered(false)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-gap-sm, 6px)',\n padding: 'var(--iris-padding-sm, 6px) var(--iris-padding-md, 12px)',\n borderRadius: 'var(--iris-radius-sm, 4px)',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n background: hovered && !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 ...style,\n }}\n >\n {children}\n </div>\n )\n },\n)\n\nexport type IrisDropdownSeparatorProps = React.HTMLAttributes<HTMLDivElement>\n\n/**\n * A visual separator (horizontal rule) within a dropdown menu. Renders a\n * `role=\"separator\"` `<div>` styled with the theme's border colour.\n */\nexport const IrisDropdownSeparator = React.forwardRef<HTMLDivElement, IrisDropdownSeparatorProps>(\n function IrisDropdownSeparator({ style, ...rest }, ref) {\n return (\n <div\n {...rest}\n ref={ref}\n role=\"separator\"\n data-iris-dropdown-separator=\"\"\n style={{\n height: 1,\n background: 'var(--iris-border)',\n margin: '4px 0',\n ...style,\n }}\n />\n )\n },\n)\n","/**\n * Behavior wrapper: makes a list of items sortable via drag-and-drop.\n * Uses `createSortable` from `@iris-ui-kit/core` for the drag-and-drop controller.\n *\n * @example\n * const [items, setItems] = React.useState(['A', 'B', 'C'])\n * <IrisSortable items={items} onReorder={setItems}>\n * {items.map((label) => <div key={label}>{label}</div>)}\n * </IrisSortable>\n */\nimport * as React from 'react'\nimport { createSortable, type SortableState } from '@iris-ui-kit/core'\n\nexport interface IrisSortableProps<T = string> {\n items: readonly T[]\n onReorder: (next: T[]) => void\n getKey?: (item: T, index: number) => string\n children?: React.ReactNode\n className?: string\n style?: React.CSSProperties\n disabled?: boolean\n orientation?: 'vertical' | 'horizontal'\n}\n\nexport const SORTABLE_ITEM_ATTR = 'data-iris-sortable-item'\n\nexport function IrisSortable<T>({\n items,\n onReorder,\n getKey = (_item, index) => String(index),\n disabled = false,\n orientation = 'vertical',\n style,\n className,\n children,\n ...rest\n}: IrisSortableProps<T> &\n Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>): React.ReactElement {\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const ctrlRef = React.useRef<ReturnType<typeof createSortable> | null>(null)\n if (ctrlRef.current === null) ctrlRef.current = createSortable()\n const ctrl = ctrlRef.current\n\n const [state, setState] = React.useState<SortableState>({ activeId: null, overId: null })\n React.useEffect(() => ctrl.subscribe(setState), [ctrl])\n\n const dragging = state.activeId\n\n const indexByKey = (key: string): number =>\n Array.from(containerRef.current?.querySelectorAll(`[${SORTABLE_ITEM_ATTR}]`) ?? []).findIndex(\n (el) => el.getAttribute(SORTABLE_ITEM_ATTR) === key,\n )\n\n const onPointerDown = (e: React.PointerEvent<HTMLElement>): void => {\n if (disabled) return\n const target = (e.target as HTMLElement).closest(`[${SORTABLE_ITEM_ATTR}]`)\n if (!target) return\n const key = target.getAttribute(SORTABLE_ITEM_ATTR) ?? ''\n if (!key) return\n ctrl.press(key, e.clientX, e.clientY)\n }\n\n const onPointerMove = (e: React.PointerEvent<HTMLElement>): void => {\n if (!ctrl.getState().activeId) {\n // Pending press — promote if past threshold\n if (!ctrl.tryStart(e.clientX, e.clientY)) return\n }\n const els = containerRef.current?.querySelectorAll<HTMLElement>(`[${SORTABLE_ITEM_ATTR}]`)\n const rects = Array.from(els ?? []).map((el) => ({\n id: el.getAttribute(SORTABLE_ITEM_ATTR) ?? '',\n ...el.getBoundingClientRect(),\n }))\n ctrl.moveOver({ x: e.clientX, y: e.clientY }, rects)\n }\n\n const onPointerUp = (): void => {\n const result = ctrl.end()\n if (result.activeId && result.overId && result.activeId !== result.overId) {\n const from = indexByKey(result.activeId)\n const to = indexByKey(result.overId)\n if (from >= 0 && to >= 0 && from !== to) {\n const next = [...items]\n const [moved] = next.splice(from, 1)\n next.splice(to, 0, moved!)\n onReorder(next)\n }\n }\n }\n\n return (\n <div\n {...rest}\n ref={containerRef}\n data-iris-sortable=\"\"\n data-state={dragging ? 'dragging' : 'idle'}\n className={className}\n style={{\n display: 'flex',\n flexDirection: orientation === 'horizontal' ? 'row' : 'column',\n gap: 'var(--iris-gap-sm, 4px)',\n opacity: disabled ? 0.6 : 1,\n userSelect: dragging ? 'none' : undefined,\n ...style,\n }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerLeave={onPointerUp}\n >\n {React.Children.map(children, (child, index) => {\n if (!React.isValidElement(child)) return child\n const key = getKey(items[index]!, index)\n const isDragging = key === dragging\n return (\n <div\n key={key}\n data-iris-sortable-item={key}\n data-iris-sortable-dragging={isDragging ? '' : undefined}\n style={{\n transition: isDragging ? 'none' : 'transform 150ms ease',\n opacity: isDragging ? 0.4 : 1,\n position: 'relative',\n zIndex: isDragging ? 100 : undefined,\n }}\n >\n {child}\n </div>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\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\nexport interface IrisAdminTabsProps {\n /** Shared tabs store (from `createTabsNav`). */\n nav: TabsNav\n onChange?: (key: string) => void\n onClose?: (key: string) => void\n onRefresh?: (key: string) => void\n /** Enable pointer/touch reordering. */\n reorderable?: boolean\n onReorder?: (tabs: TabItem[]) => void\n}\n\n/**\n * Vben-style multi-tab bar over a shared {@link TabsNav} store. Each open page is\n * a closable chip; clicking activates (`onChange`), the × closes, and a trailing\n * actions dropdown runs Refresh / Close / Close-others / Close-all on the active\n * tab. The store owns the tab list + active key; the host watches it to sync\n * routing + keep-alive.\n *\n * Keyboard (WAI-ARIA tablist, automatic activation): ←/→ move + activate, Home/\n * End jump, Delete/Backspace closes the focused tab. Roving tabindex keeps a\n * single tab stop. React port of the Vue `IrisAdminTabs`.\n */\nexport function IrisAdminTabs({\n nav,\n onChange,\n onClose,\n onRefresh,\n reorderable = true,\n onReorder,\n}: IrisAdminTabsProps): React.ReactElement {\n const t = useTabsNav(nav)\n const { t: translate } = useI18n()\n const tablistRef = React.useRef<HTMLDivElement>(null)\n const pendingFocus = React.useRef<string | null>(null)\n\n React.useEffect(() => {\n if (!pendingFocus.current) return\n const key = pendingFocus.current\n pendingFocus.current = null\n tablistRef.current?.querySelectorAll<HTMLElement>('[data-iris-tab-label]').forEach((el) => {\n if (el.getAttribute('data-key') === key) el.focus()\n })\n })\n\n const activate = (key: string): void => {\n nav.activate(key)\n onChange?.(key)\n }\n const close = (key: string): void => {\n nav.close(key)\n onClose?.(key)\n }\n const refresh = (key: string): void => {\n nav.refresh(key)\n onRefresh?.(key)\n }\n const reorder = (tabs: TabItem[]): void => {\n tabs.forEach((tab, index) => nav.move(tab.key, index))\n onReorder?.(tabs)\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>): void => {\n const tabs = t.tabs\n const idx = tabs.findIndex((x) => x.key === t.activeKey)\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 pendingFocus.current = nav.getState().activeKey ?? null\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 pendingFocus.current = key\n }\n\n const chip = (tab: TabItem): React.ReactElement => {\n const active = tab.key === t.activeKey\n const closable = isClosable(tab)\n\n const label = (\n <button\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 {tab.icon ? <IrisIcon name={tab.icon} size={14} /> : null}\n <span style={{ whiteSpace: 'nowrap' }}>{tab.title}</span>\n </button>\n )\n\n const closeBtn = closable ? (\n <button\n type=\"button\"\n tabIndex={-1}\n data-iris-tab-close=\"\"\n aria-label={translate('admin.closeTab', { title: tab.title })}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 16,\n height: 16,\n border: 'none',\n borderRadius: 4,\n background: 'transparent',\n color: 'inherit',\n cursor: 'pointer',\n padding: 0,\n opacity: 0.6,\n }}\n onClick={(e) => {\n e.stopPropagation()\n close(tab.key)\n }}\n >\n <IrisIcon name=\"x\" size={12} />\n </button>\n ) : tab.pinned ? (\n <IrisIcon name=\"check-circle\" size={12} style={{ opacity: 0.5 }} />\n ) : null\n\n return (\n <div\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: 4,\n padding:\n 'var(--iris-padding-sm, 6px) var(--iris-space-xs, 8px) var(--iris-padding-sm, 6px) var(--iris-padding-md, 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}\n {closeBtn}\n </div>\n )\n }\n\n const activeKey = t.activeKey\n return (\n <div\n data-iris-admin-tabs=\"\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-space-xs, 8px)',\n padding: 'var(--iris-padding-sm, 6px) var(--iris-padding-md, 12px)',\n borderBottom: '1px solid var(--iris-border)',\n background: 'var(--iris-background)',\n }}\n >\n <div\n ref={tablistRef}\n data-iris-tabs-scroll=\"\"\n role=\"tablist\"\n aria-label={translate('admin.openPages')}\n onKeyDown={onKeyDown}\n style={{ overflowX: 'auto', flex: 1 }}\n >\n <IrisSortable\n items={t.tabs}\n getKey={(tab) => tab.key}\n onReorder={reorder}\n disabled={!reorderable}\n orientation=\"horizontal\"\n style={{ alignItems: 'center', gap: 'var(--iris-space-xs, 8px)', width: 'max-content' }}\n >\n {t.tabs.map((tab) => chip(tab))}\n </IrisSortable>\n </div>\n\n <IrisDropdown>\n <IrisDropdownTrigger\n aria-label={translate('admin.tabActions')}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\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 <IrisIcon name=\"more-horizontal\" size={16} />\n </IrisDropdownTrigger>\n <IrisDropdownMenu>\n {activeKey ? (\n <>\n <IrisDropdownItem onSelect={() => refresh(activeKey)}>\n {translate('admin.refresh')}\n </IrisDropdownItem>\n <IrisDropdownItem onSelect={() => close(activeKey)}>\n {translate('admin.close')}\n </IrisDropdownItem>\n <IrisDropdownSeparator />\n <IrisDropdownItem onSelect={() => nav.closeLeft(activeKey)}>\n {translate('admin.closeLeft')}\n </IrisDropdownItem>\n <IrisDropdownItem onSelect={() => nav.closeRight(activeKey)}>\n {translate('admin.closeRight')}\n </IrisDropdownItem>\n <IrisDropdownItem onSelect={() => nav.closeOthers(activeKey)}>\n {translate('admin.closeOthers')}\n </IrisDropdownItem>\n <IrisDropdownItem onSelect={() => nav.closeAll()}>\n {translate('admin.closeAll')}\n </IrisDropdownItem>\n </>\n ) : (\n <IrisDropdownItem disabled>No active tab</IrisDropdownItem>\n )}\n </IrisDropdownMenu>\n </IrisDropdown>\n </div>\n )\n}\n","import * as React from 'react'\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: NavNode[]\n /** Active page key (controlled); undefined = uncontrolled. */\n activeKey?: string\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: 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: NavNode[]\n}\n\n/**\n * React 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 hook owns the controlled/uncontrolled `activeKey`\n * reconciliation (idiomatic to React) and delegates navigate / syncFromTab /\n * branch-resolution / breadcrumb to the shared core shell.\n *\n * Controlled mode renders from the prop directly (no flicker); an effect 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 { menus, activeKey, defaultActiveKey, onActiveKeyChange, onSelect, tabs } = config\n const activeControlled = activeKey !== undefined\n\n // Latest callbacks read without re-creating the (stable) shell instance.\n const latest = React.useRef({ onActiveKeyChange, onSelect })\n latest.current = { onActiveKeyChange, onSelect }\n\n const shellRef = React.useRef<AdminShell | null>(null)\n if (shellRef.current === null) {\n shellRef.current = createAdminShell({\n menus,\n defaultActiveKey: activeKey ?? defaultActiveKey,\n tabs,\n onActiveChange: (key, node) => {\n latest.current.onActiveKeyChange?.(key)\n if (node) latest.current.onSelect?.(key, node)\n },\n })\n }\n const shell = shellRef.current\n const state = useStore(shell.store)\n\n // Keep the shell reconciling against the live menu tree.\n React.useEffect(() => {\n shell.setMenus(menus)\n }, [shell, menus])\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 React.useEffect(() => {\n if (activeControlled && shell.getActiveKey() !== (activeKey ?? null)) {\n shell.store.setState({ activeKey: activeKey ?? null })\n }\n })\n\n const current = activeControlled ? (activeKey ?? '') : (state.activeKey ?? '')\n\n return {\n activeKey: current,\n navigate: shell.navigate,\n syncFromTab: shell.syncFromTab,\n breadcrumb: current ? findNavPath(menus, current) : [],\n }\n}\n","import * as React from 'react'\nimport type { NavNode, TabsNav } from '@iris-ui-kit/core'\nimport { IrisSidebarLayout } from '../layouts/SidebarLayout'\nimport { IrisHeaderLayout } from '../layouts/HeaderLayout'\nimport { useStore } from '../useStore'\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\ntype LogoRenderer = React.ReactNode | ((state: { collapsed: boolean }) => React.ReactNode)\ntype ContentRenderer = React.ReactNode | ((state: { activeKey: string }) => React.ReactNode)\n\nexport interface IrisAdminLayoutProps {\n /** Normalized nav tree driving menu + breadcrumb. */\n menus: NavNode[]\n /** Active page key (controlled). */\n activeKey?: string\n defaultActiveKey?: string\n onActiveKeyChange?: (key: string) => void\n /** Sidebar collapsed (controlled); undefined = uncontrolled. */\n collapsed?: boolean\n defaultCollapsed?: boolean\n onCollapsedChange?: (next: boolean) => void\n mode?: IrisAdminLayoutMode\n appTitle?: string\n /** Optional shared tabs store; when present the tab bar is rendered. */\n tabs?: TabsNav\n showTabs?: boolean\n showBreadcrumb?: boolean\n stickyHeader?: boolean\n stickyTabs?: boolean\n menuAlign?: IrisAdminMenuAlign\n contentWidth?: IrisAdminContentWidth\n contentHeight?: IrisAdminContentHeight\n sidebarWidth?: number | string\n collapsedWidth?: number | string\n /** Brand region; render-prop receives `{ collapsed }`. */\n logo?: LogoRenderer\n /** Header end region (theme switch, user menu, …). */\n toolbar?: React.ReactNode\n footer?: React.ReactNode\n onSelect?: (key: string, node: NavNode) => void\n /** Page content; render-prop receives `{ activeKey }`. */\n children?: ContentRenderer\n}\n\n/** Mirrors tab-store activation (incl. close→neighbor) into the layout's active key. */\nfunction TabsSync({\n nav,\n activeKey,\n onActivate,\n}: {\n nav: TabsNav\n activeKey: string\n onActivate: (key: string) => void\n}): null {\n const state = useStore(nav.store)\n React.useEffect(() => {\n if (state.activeKey && state.activeKey !== activeKey) onActivate(state.activeKey)\n }, [state.activeKey, activeKey, onActivate])\n return null\n}\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. The host owns routing: react to `onSelect` / `onActiveKeyChange` and\n * render the page via the children render-prop (wrap it in keep-alive keyed by\n * `tabs.cacheKey` for Vben-style tab caching).\n *\n * Modes: `sidebar` (default) and `full-content` (chrome hidden). React port of\n * the Vue `IrisAdminLayout`.\n */\nexport function IrisAdminLayout({\n menus,\n activeKey,\n defaultActiveKey,\n onActiveKeyChange,\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n mode = 'sidebar',\n appTitle = 'Iris Admin',\n tabs,\n showTabs = true,\n showBreadcrumb = true,\n stickyHeader = true,\n stickyTabs = true,\n menuAlign = 'start',\n contentWidth = 'fluid',\n contentHeight = 'viewport',\n sidebarWidth = 240,\n collapsedWidth = 64,\n logo,\n toolbar,\n footer,\n onSelect,\n children,\n}: IrisAdminLayoutProps): React.ReactElement {\n const { t } = useI18n()\n const {\n activeKey: currentActive,\n navigate,\n syncFromTab,\n breadcrumb: trail,\n } = useAdminShell({ menus, activeKey, defaultActiveKey, onActiveKeyChange, onSelect, tabs })\n\n const collapseControlled = collapsed !== undefined\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed)\n const currentCollapsed = collapseControlled ? (collapsed as boolean) : internalCollapsed\n const setCollapsed = React.useCallback(\n (next: boolean) => {\n if (!collapseControlled) setInternalCollapsed(next)\n onCollapsedChange?.(next)\n },\n [collapseControlled, onCollapsedChange],\n )\n\n const handleSelect = (_key: string, node: NavNode): void => navigate(node)\n\n const renderContent = (): React.ReactNode =>\n typeof children === 'function' ? children({ activeKey: currentActive }) : children\n\n if (mode === 'full-content') {\n return (\n <div data-iris-admin-layout=\"\" data-mode=\"full-content\" style={{ height: '100%' }}>\n {renderContent()}\n </div>\n )\n }\n\n const defaultLogo = (state: { collapsed: boolean }): React.ReactElement => (\n <div\n data-iris-admin-logo=\"\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-space-sm, 12px)',\n height: 52,\n padding: '0 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 <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\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 <IrisIcon name=\"menu\" size={18} />\n </span>\n {state.collapsed ? null : <span>{appTitle}</span>}\n </div>\n )\n const renderLogo = (state: { collapsed: boolean }): React.ReactNode =>\n typeof logo === 'function' ? logo(state) : (logo ?? defaultLogo(state))\n\n const tabsBar =\n tabs && showTabs ? (\n <div\n data-iris-admin-tabs-region=\"\"\n data-sticky={stickyTabs ? 'true' : undefined}\n style={{\n position: stickyTabs && !stickyHeader ? 'sticky' : 'relative',\n top: 0,\n zIndex: 49,\n }}\n >\n <IrisAdminTabs nav={tabs} />\n </div>\n ) : null\n\n const contentRegion = (\n <div\n data-iris-admin-content=\"\"\n data-width={contentWidth}\n style={{\n boxSizing: 'border-box',\n width: '100%',\n maxWidth: contentWidth === 'centered' ? '72rem' : undefined,\n marginInline: contentWidth === 'centered' ? 'auto' : undefined,\n padding: 16,\n }}\n >\n {mode === 'horizontal' && showBreadcrumb ? (\n <IrisAdminBreadcrumb trail={trail} onSelect={handleSelect} />\n ) : null}\n {renderContent()}\n </div>\n )\n\n const collapseToggle = (\n <button\n type=\"button\"\n data-iris-admin-collapse=\"\"\n aria-label={currentCollapsed ? t('admin.expandSidebar') : t('admin.collapseSidebar')}\n aria-pressed={currentCollapsed ? 'true' : 'false'}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 32,\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(!currentCollapsed)}\n >\n <IrisIcon name={currentCollapsed ? 'chevron-right' : 'menu'} size={18} />\n </button>\n )\n\n const headerBar = (\n <div\n data-iris-admin-headerbar=\"\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n height: 52,\n padding: '0 16px',\n borderBottom: '1px solid var(--iris-border)',\n background: 'var(--iris-background)',\n }}\n >\n {collapseToggle}\n {showBreadcrumb ? <IrisAdminBreadcrumb trail={trail} onSelect={handleSelect} /> : null}\n <div style={{ flex: 1 }} />\n {toolbar ? (\n <div data-iris-admin-toolbar=\"\" style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {toolbar}\n </div>\n ) : null}\n </div>\n )\n\n if (mode === 'horizontal') {\n const justifyContent =\n menuAlign === 'center' ? 'center' : menuAlign === 'end' ? 'flex-end' : 'flex-start'\n return (\n <div\n data-iris-admin-layout=\"\"\n data-mode=\"horizontal\"\n style={{\n height: contentHeight === 'viewport' ? '100vh' : 'auto',\n minHeight: '100vh',\n }}\n >\n {tabs ? <TabsSync nav={tabs} activeKey={currentActive} onActivate={syncFromTab} /> : null}\n <IrisHeaderLayout\n sticky={stickyHeader}\n footer={footer}\n header={\n <div data-iris-admin-header=\"\">\n <div\n data-iris-admin-headerbar=\"\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n minHeight: 52,\n padding: '0 16px',\n background: 'var(--iris-background)',\n }}\n >\n {renderLogo({ collapsed: false })}\n <div\n data-iris-admin-topnav=\"\"\n style={{ display: 'flex', flex: 1, minWidth: 0, justifyContent }}\n >\n <IrisNavMenu\n items={menus}\n activeKey={currentActive}\n orientation=\"horizontal\"\n onSelect={handleSelect}\n />\n </div>\n {toolbar ? (\n <div\n data-iris-admin-toolbar=\"\"\n style={{ display: 'flex', alignItems: 'center', gap: 8 }}\n >\n {toolbar}\n </div>\n ) : null}\n </div>\n {tabsBar}\n </div>\n }\n >\n {contentRegion}\n </IrisHeaderLayout>\n </div>\n )\n }\n\n return (\n <IrisSidebarLayout\n data-iris-admin-layout=\"\"\n data-mode=\"sidebar\"\n collapsed={currentCollapsed}\n onCollapsedChange={setCollapsed}\n width={sidebarWidth}\n collapsedWidth={collapsedWidth}\n style={{ height: '100vh' }}\n sidebar={(state) => (\n <div\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 {renderLogo(state)}\n <div style={{ flex: 1, overflowY: 'auto', overflowX: 'hidden', padding: 8 }}>\n <IrisNavMenu\n items={menus}\n activeKey={currentActive}\n collapsed={state.collapsed}\n onSelect={handleSelect}\n />\n </div>\n </div>\n )}\n >\n {tabs ? <TabsSync nav={tabs} activeKey={currentActive} onActivate={syncFromTab} /> : null}\n <IrisHeaderLayout\n sticky={stickyHeader}\n header={\n <div data-iris-admin-header=\"\">\n {headerBar}\n {tabsBar}\n </div>\n }\n footer={footer}\n >\n {contentRegion}\n </IrisHeaderLayout>\n </IrisSidebarLayout>\n )\n}\n","import * as React from 'react'\nimport type { AdminPreferences, AdminPreferencesState } from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\n\nexport interface UseAdminPreferencesReturn {\n state: 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 React bridge for the framework-agnostic admin preferences controller. */\nexport function useAdminPreferences(\n preferences: AdminPreferences,\n hydrate = true,\n): UseAdminPreferencesReturn {\n const state = useStore(preferences.store)\n React.useEffect(() => {\n if (hydrate) void preferences.hydrate()\n }, [hydrate, preferences])\n return {\n state,\n set: preferences.set,\n patch: preferences.patch,\n reset: preferences.reset,\n hydrate: preferences.hydrate,\n flush: preferences.flush,\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/layouts/SidebarLayout.tsx","../src/layouts/HeaderLayout.tsx","../src/useStore.ts","../src/theme/ThemeProvider.tsx","../src/primitives/icon/Icon.tsx","../src/i18n/context.ts","../src/i18n/useI18n.ts","../src/admin/NavMenu.tsx","../src/primitives/breadcrumb/Breadcrumb.tsx","../src/primitives/breadcrumb/BreadcrumbItem.tsx","../src/admin/AdminBreadcrumb.tsx","../src/admin/useTabsNav.ts","../src/useMachine.ts","../src/primitives/dropdown/context.ts","../src/primitives/dropdown/Dropdown.tsx","../src/primitives/slot/Slot.tsx","../src/primitives/dropdown/DropdownTrigger.tsx","../src/floating/useFloating.ts","../src/floating/useDismiss.ts","../src/primitives/dropdown/DropdownMenu.tsx","../src/primitives/dropdown/DropdownItem.tsx","../src/behaviors/Sortable.tsx","../src/admin/AdminTabs.tsx","../src/admin/useAdminShell.ts","../src/admin/AdminLayout.tsx","../src/admin/useAdminPreferences.ts"],"names":["React","jsxs","jsx","asLen","useSyncExternalStore","createContext","useContext","defaultIconRegistry","resolveThemedIcon","React3","React4","createI18n","React5","React6","branchTrail","createExpansion","visibleNav","findNavPath","isBranch","firstLeaf","findNavNode","React7","IrisBreadcrumb","React8","IrisBreadcrumbItem","useMemo","React9","createFloatingMachine","React10","composeEventHandlers","React11","IrisSlot","React12","IrisDropdownTrigger","React13","offsetMiddleware","flipMiddleware","shiftMiddleware","sizeMiddleware","arrowMiddleware","computePosition","autoUpdate","React14","React15","IrisDropdownMenu","matchTypeahead","createPortal","React16","IrisDropdownItem","IrisDropdownSeparator","React17","createSortable","React18","isClosable","Fragment","React19","createAdminShell","React20","React21"],"mappings":"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","file":"admin.cjs","sourcesContent":["import * as React from 'react'\n\nexport interface IrisSidebarLayoutSidebarState {\n collapsed: boolean\n setCollapsed: (next: boolean) => void\n}\n\nexport interface IrisSidebarLayoutProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n collapsed?: boolean\n defaultCollapsed?: boolean\n onCollapsedChange?: (next: boolean) => void\n /** Sidebar width when expanded (px or CSS length). */\n width?: number | string\n /** Sidebar width when collapsed. */\n collapsedWidth?: number | string\n side?: 'left' | 'right'\n /** Sidebar content. May be a render function that receives `{ collapsed, setCollapsed }`. */\n sidebar?: React.ReactNode | ((state: IrisSidebarLayoutSidebarState) => React.ReactNode)\n children?: React.ReactNode\n}\n\nfunction asLen(v: number | string): string {\n return typeof v === 'number' ? `${v}px` : v\n}\n\n/**\n * Two-column layout with a collapsible sidebar. The sidebar is kept mounted\n * across collapses (only its width animates) so component state survives.\n */\nexport function IrisSidebarLayout({\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n width = 240,\n collapsedWidth = 60,\n side = 'left',\n sidebar,\n style,\n children,\n ...rest\n}: IrisSidebarLayoutProps): React.ReactElement {\n const isControlled = collapsedProp !== undefined\n const [internal, setInternal] = React.useState(defaultCollapsed)\n const collapsed = isControlled ? Boolean(collapsedProp) : internal\n\n const setCollapsed = React.useCallback(\n (next: boolean) => {\n if (!isControlled) setInternal(next)\n onCollapsedChange?.(next)\n },\n [isControlled, onCollapsedChange],\n )\n\n const sidebarContent =\n typeof sidebar === 'function'\n ? (sidebar as (s: IrisSidebarLayoutSidebarState) => React.ReactNode)({\n collapsed,\n setCollapsed,\n })\n : sidebar\n\n const sidebarStyle: React.CSSProperties = {\n width: collapsed ? asLen(collapsedWidth) : asLen(width),\n flexShrink: 0,\n background: 'var(--iris-surface)',\n borderRight: side === 'left' ? '1px solid var(--iris-border)' : 'none',\n borderLeft: side === 'right' ? '1px solid var(--iris-border)' : 'none',\n transition: 'width 180ms ease',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n }\n\n return (\n <div\n {...rest}\n data-iris-sidebar-layout=\"\"\n data-collapsed={collapsed ? '' : undefined}\n data-side={side}\n style={{\n display: 'flex',\n flexDirection: side === 'right' ? 'row-reverse' : 'row',\n width: '100%',\n height: '100%',\n minHeight: 0,\n color: 'var(--iris-foreground)',\n ...style,\n }}\n >\n <aside\n role=\"complementary\"\n data-iris-sidebar=\"\"\n data-collapsed={collapsed ? '' : undefined}\n style={sidebarStyle}\n >\n {sidebarContent}\n </aside>\n <div\n data-iris-sidebar-main=\"\"\n style={{\n flex: 1,\n minWidth: 0,\n overflow: 'auto',\n background: 'var(--iris-background)',\n }}\n >\n {children}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\n\nexport interface IrisHeaderLayoutProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n /** Header height (px or CSS length). Default `'auto'`. */\n headerHeight?: number | string\n /** Footer height (px or CSS length). Default `'auto'`. */\n footerHeight?: number | string\n /** Header sticks via `position: sticky` instead of static. Default true. */\n sticky?: boolean\n header?: React.ReactNode\n footer?: React.ReactNode\n children?: React.ReactNode\n}\n\nfunction asLen(v: number | string): string {\n return typeof v === 'number' ? `${v}px` : v\n}\n\n/**\n * Two- (or three-) region vertical layout: a sticky header on top, a\n * scrollable main region, and an optional footer.\n */\nexport function IrisHeaderLayout({\n headerHeight = 'auto',\n footerHeight = 'auto',\n sticky = true,\n header,\n footer,\n style,\n children,\n ...rest\n}: IrisHeaderLayoutProps): React.ReactElement {\n return (\n <div\n {...rest}\n data-iris-header-layout=\"\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: '100%',\n minHeight: 0,\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n ...style,\n }}\n >\n {header ? (\n <header\n role=\"banner\"\n data-iris-header=\"\"\n style={{\n flexShrink: 0,\n height: asLen(headerHeight),\n borderBottom: '1px solid var(--iris-border)',\n background: 'var(--iris-surface)',\n position: sticky ? 'sticky' : 'static',\n top: 0,\n zIndex: 50,\n }}\n >\n {header}\n </header>\n ) : null}\n <main\n role=\"main\"\n data-iris-header-main=\"\"\n style={{ flex: 1, minHeight: 0, overflow: 'auto' }}\n >\n {children}\n </main>\n {footer ? (\n <footer\n role=\"contentinfo\"\n data-iris-footer=\"\"\n style={{\n flexShrink: 0,\n height: asLen(footerHeight),\n borderTop: '1px solid var(--iris-border)',\n background: 'var(--iris-surface)',\n }}\n >\n {footer}\n </footer>\n ) : null}\n </div>\n )\n}\n","import * as React from 'react'\nimport { useSyncExternalStore } from 'react'\nimport type { ReadonlyStore, Store } from '@iris-ui-kit/core'\n\n/**\n * Bridge a framework-agnostic `@iris-ui-kit/core` store into React reactivity.\n * Uses React 18's `useSyncExternalStore` — the contract is identical to the\n * one Vue uses via `ref + onMounted` and Solid uses via `createSignal`. The\n * **same** store can power Button, Popover, Dialog, etc. on any framework.\n */\nexport function useStore<T>(store: ReadonlyStore<T>): T {\n return useSyncExternalStore(\n store.subscribe,\n store.getState,\n store.getState, // SSR fallback — same as client snapshot in our case.\n )\n}\n\n/**\n * Subscribe to a DERIVED slice of a core store — the component re-renders only\n * when `selector(state)` changes per `isEqual` (default `Object.is`), not on\n * every store emission. Built on {@link Store.subscribeWith}. Inline closures\n * for `selector`/`isEqual` are fine (captured via refs; the subscription is not\n * re-created between renders).\n */\nexport function useStoreSelector<T, U>(\n store: Store<T>,\n selector: (state: T) => U,\n isEqual?: (a: U, b: U) => boolean,\n): U {\n const [slice, setSlice] = React.useState(() => selector(store.getState()))\n const selRef = React.useRef(selector)\n selRef.current = selector\n const eqRef = React.useRef(isEqual)\n eqRef.current = isEqual\n React.useEffect(() => {\n const read = (s: T): U => selRef.current(s)\n const eq = (a: U, b: U): boolean => (eqRef.current ?? Object.is)(a, b)\n // Re-sync in case the store moved between render and this effect.\n setSlice((prev) => {\n const next = read(store.getState())\n return eq(prev, next) ? prev : next\n })\n return store.subscribeWith(read, setSlice, eq)\n }, [store])\n return slice\n}\n","import { createContext, useContext, useEffect, useRef, type ReactNode } from 'react'\nimport {\n applyDirection,\n applyTheme,\n injectGlobalStyles,\n type ApplyThemeResult,\n type Direction,\n type ThemeStore,\n} from '@iris-ui-kit/theme'\nimport type { IrisTheme } from '@iris-ui-kit/tokens'\nimport { useStore } from '../useStore'\n\ninterface IrisThemeContextValue {\n store: ThemeStore\n current: IrisTheme\n dir: Direction\n}\n\nconst IrisThemeContext = createContext<IrisThemeContextValue | null>(null)\n\nexport interface ThemeProviderProps {\n store: ThemeStore\n target?: HTMLElement | null\n /** Writing direction; sets `dir` on the target for RTL. Default `'ltr'`. */\n dir?: Direction\n /** CSP nonce for the injected global stylesheet. Pass the `nonce` from your\n * server-rendered CSP header when you use `style-src: 'nonce-...'`. */\n cspNonce?: string\n children?: ReactNode\n}\n\n/**\n * Renderless provider that mirrors `<IrisThemeProvider>` from `@iris-ui-kit/vue`:\n * subscribes to the theme store, applies CSS variables to `target` (or\n * `document.documentElement`), reverts on unmount.\n *\n * **Zero business logic** — `applyTheme` / `createThemeStore` come straight\n * from `@iris-ui-kit/theme`. This component is just a 30-line React adapter.\n */\nexport function ThemeProvider({\n store,\n target = null,\n dir = 'ltr',\n cspNonce,\n children,\n}: ThemeProviderProps) {\n const current = useStore(store.store)\n const appliedRef = useRef<ApplyThemeResult | null>(null)\n\n useEffect(() => {\n injectGlobalStyles(cspNonce)\n const el = target ?? document.documentElement\n appliedRef.current?.revert()\n appliedRef.current = applyTheme(current, el)\n const dirApplied = applyDirection(dir, el)\n return () => {\n appliedRef.current?.revert()\n appliedRef.current = null\n dirApplied.revert()\n }\n }, [current, target, dir])\n\n return (\n <IrisThemeContext.Provider value={{ store, current, dir }}>\n {children}\n </IrisThemeContext.Provider>\n )\n}\n\nexport function useThemeContext(): IrisThemeContextValue {\n const ctx = useContext(IrisThemeContext)\n if (!ctx) {\n throw new Error('[iris-ui] useTheme(): no <ThemeProvider> ancestor found')\n }\n return ctx\n}\n\n/**\n * Read the current theme without throwing when there is no `<ThemeProvider>`\n * ancestor. Returns `undefined` outside a provider. Used by theme-aware\n * primitives (e.g. `IrisIcon`) that must still render standalone.\n */\nexport function useThemeOptional(): IrisTheme | undefined {\n return useContext(IrisThemeContext)?.current\n}\n\n/**\n * Current writing direction (`'ltr'` / `'rtl'`) from the nearest\n * `<ThemeProvider>`, or `'ltr'` when there is none. For components that need to\n * branch on direction beyond what CSS logical properties already handle.\n */\nexport function useDirection(): Direction {\n return useContext(IrisThemeContext)?.dir ?? 'ltr'\n}\n","import * as React from 'react'\nimport { defaultIconRegistry, resolveThemedIcon, type IrisIconRegistry } from '@iris-ui-kit/icons'\nimport { useThemeOptional } from '../../theme'\n\nexport interface IrisIconProps extends Omit<\n React.SVGAttributes<SVGSVGElement>,\n 'name' | 'children' | 'dangerouslySetInnerHTML' | 'fill'\n> {\n /** Semantic icon name resolved via the registry (e.g. 'check', 'chevron-down'). */\n name: string\n /** Width & height (number → px). Default 24. */\n size?: number | string\n /** Stroke width for line icons. Default 2. */\n strokeWidth?: number\n /** Render as a filled glyph instead of a stroked line icon. */\n fill?: boolean\n /** Accessible title; sets `role=\"img\"` + `aria-label`. Omit for decorative icons. */\n title?: string\n /** Registry to resolve `name` against. Defaults to the built-in set. */\n registry?: IrisIconRegistry\n}\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 function IrisIcon({\n name,\n size = 24,\n strokeWidth = 2,\n fill = false,\n title,\n registry = defaultIconRegistry,\n style,\n ...rest\n}: IrisIconProps): React.ReactElement | null {\n const theme = useThemeOptional()\n const icon = resolveThemedIcon(registry, name, theme)\n if (!icon) return null\n\n const paint: React.SVGAttributes<SVGSVGElement> = fill\n ? { fill: 'currentColor' }\n : {\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }\n\n return (\n <svg\n {...rest}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={icon.viewBox ?? '0 0 24 24'}\n width={size}\n height={size}\n {...paint}\n role={title ? 'img' : undefined}\n aria-label={title || undefined}\n aria-hidden={title ? undefined : true}\n data-iris-icon={name}\n style={{ display: 'inline-block', verticalAlign: 'middle', flexShrink: 0, ...style }}\n >\n {title ? <title>{title}</title> : null}\n {icon.nodes.map((node, i) => React.createElement(node.tag, { key: i, ...node.attrs }))}\n </svg>\n )\n}\n","import * as React from 'react'\nimport type { I18n } from '@iris-ui-kit/core'\n\n/** Carries the active {@link I18n} instance to descendants via `useI18n`. */\nexport const I18nContext = React.createContext<I18n | null>(null)\n","import * as React from 'react'\nimport { createI18n, type I18n } from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\nimport { I18nContext } from './context'\n\nexport interface UseI18nReturn {\n locale: string\n t: I18n['t']\n formatDate: I18n['formatDate']\n formatNumber: I18n['formatNumber']\n formatRelativeTime: I18n['formatRelativeTime']\n setLocale: I18n['setLocale']\n setMessages: I18n['setMessages']\n}\n\n// Shared fallback so components can call `useI18n()` without an enclosing\n// provider — they get English defaults rather than throwing.\nlet fallbackI18n: I18n | null = null\nfunction getFallback(): I18n {\n if (fallbackI18n === null) fallbackI18n = createI18n()\n return fallbackI18n\n}\n\n/**\n * Reactive access to the active locale + translation/formatting helpers.\n * Re-renders the host when the locale or messages change. Works with or\n * without an `<IrisI18nProvider>` (falls back to English defaults).\n */\nexport function useI18n(): UseI18nReturn {\n const ctx = React.useContext(I18nContext)\n const i18n = ctx ?? getFallback()\n const state = useStore(i18n.store)\n\n return {\n locale: state.locale,\n t: i18n.t,\n formatDate: i18n.formatDate,\n formatNumber: i18n.formatNumber,\n formatRelativeTime: i18n.formatRelativeTime,\n setLocale: i18n.setLocale,\n setMessages: i18n.setMessages,\n }\n}\n","import * as React from 'react'\nimport {\n branchTrail,\n createExpansion,\n findNavNode,\n findNavPath,\n firstLeaf,\n isBranch,\n visibleNav,\n type ExpansionModel,\n type NavNode,\n} from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\nimport { IrisIcon } from '../primitives/icon/Icon'\nimport { useI18n } from '../i18n'\n\nexport interface IrisNavMenuProps {\n /** Normalized nav tree. */\n items: NavNode[]\n /** Key of the active leaf. */\n activeKey?: string\n /** Controlled expanded branch keys. */\n expandedKeys?: string[]\n /** Initial expanded keys when uncontrolled (else the active trail expands). */\n defaultExpandedKeys?: string[]\n /** Icon-only rail (top-level items only). */\n collapsed?: boolean\n /** Top-level flow. Horizontal branches open an anchored dropdown panel. */\n orientation?: 'vertical' | 'horizontal'\n ariaLabel?: string\n onSelect?: (key: string, node: NavNode) => void\n onExpandedKeysChange?: (keys: string[]) => void\n}\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: takes\n * `activeKey`, calls `onSelect(key, node)`; the host owns navigation.\n *\n * `collapsed` switches to an icon-only rail (top-level only); a branch click\n * then jumps to its first leaf. React port of the Vue `IrisNavMenu`.\n */\nexport function IrisNavMenu({\n items,\n activeKey,\n expandedKeys,\n defaultExpandedKeys,\n collapsed = false,\n orientation = 'vertical',\n ariaLabel,\n onSelect,\n onExpandedKeysChange,\n}: IrisNavMenuProps): React.ReactElement {\n const { t } = useI18n()\n const horizontal = orientation === 'horizontal'\n // Expand/collapse state lives in the core expansion model — the open-set algebra\n // and the active-trail union (`merge`) are byte-identical across every adapter, so\n // they live in @iris-ui-kit/core. This component keeps only the controlled/uncontrolled\n // wiring: uncontrolled reads + writes the model store; controlled mirrors the\n // `expandedKeys` prop and just notifies. `branchTrail` is the shared selector.\n const trailOf = React.useCallback(\n (key: string | undefined): string[] => (key ? branchTrail(items, key) : []),\n [items],\n )\n\n const isControlled = expandedKeys !== undefined\n const modelRef = React.useRef<ExpansionModel | null>(null)\n if (modelRef.current === null) {\n modelRef.current = createExpansion({\n mode: 'multiple',\n defaultExpanded: defaultExpandedKeys ?? trailOf(activeKey),\n })\n }\n const model = modelRef.current\n const internalExpanded = useStore(model.store)\n const expanded = isControlled ? (expandedKeys as string[]) : internalExpanded\n\n // Auto-open the active branch trail as the active leaf changes (uncontrolled).\n // `merge` unions without removals and is a no-op when the trail is already open,\n // and the model has no `onChange` wired, so this never emits onExpandedKeysChange.\n React.useEffect(() => {\n if (isControlled) return\n model.merge(trailOf(activeKey))\n }, [activeKey, isControlled, model, trailOf])\n\n const setExpanded = (keys: string[]): void => {\n if (!isControlled) model.set(keys)\n onExpandedKeysChange?.(keys)\n }\n const toggle = (key: string): void =>\n setExpanded(expanded.includes(key) ? expanded.filter((k) => k !== key) : [...expanded, key])\n\n const select = (node: NavNode): void => {\n if (node.disabled) return\n onSelect?.(node.key, node)\n }\n\n const [hovered, setHovered] = React.useState<string | null>(null)\n const tree = visibleNav(items)\n const activePath = activeKey ? findNavPath(items, activeKey).map((n) => n.key) : []\n\n const itemStyle = (opts: {\n depth: number\n active: boolean\n trail: boolean\n disabled: boolean\n hovered: boolean\n }): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-space-sm, 12px)',\n width: horizontal && opts.depth === 0 ? 'auto' : '100%',\n boxSizing: 'border-box',\n border: 'none',\n borderRadius: 'var(--iris-radius-md, 6px)',\n background:\n opts.hovered && !opts.disabled\n ? horizontal && opts.depth === 0\n ? 'var(--iris-surface-hover, var(--iris-surface))'\n : opts.active\n ? 'var(--iris-nav-item-active-hover, color-mix(in srgb, var(--iris-primary) 88%, black))'\n : 'var(--iris-surface-hover, var(--iris-surface))'\n : opts.active && !(horizontal && opts.depth === 0)\n ? 'var(--iris-primary)'\n : 'transparent',\n // antd 风格:水平模式选中 = 底部下划线(boxShadow 模拟)+ 文字色,\n // 背景透明(hover 时浅背景,与 vertical 整块 primary 区分)\n boxShadow:\n horizontal && opts.depth === 0 && opts.active\n ? 'inset 0 -2px 0 0 var(--iris-primary)'\n : undefined,\n color: opts.active\n ? horizontal && opts.depth === 0\n ? 'var(--iris-primary)'\n : 'var(--iris-primary-foreground, #fff)'\n : opts.trail\n ? 'var(--iris-primary)'\n : 'var(--iris-foreground)',\n font: 'inherit',\n fontSize: 'var(--iris-font-size-md, 14px)',\n fontWeight: opts.active || opts.trail ? 600 : 400,\n textAlign: 'start',\n cursor: opts.disabled ? 'not-allowed' : 'pointer',\n opacity: opts.disabled ? 0.5 : 1,\n padding: collapsed ? 10 : 'var(--iris-space-xs, 8px) var(--iris-space-sm, 12px)',\n paddingInlineStart: collapsed ? 10 : 12 + opts.depth * 16,\n justifyContent: collapsed ? 'center' : 'flex-start',\n })\n\n const iconNode = (node: NavNode, size = 18): React.ReactElement | null =>\n node.icon ? <IrisIcon name={node.icon} size={size} /> : null\n\n const badgeNode = (node: NavNode): React.ReactElement | null =>\n node.badge !== undefined && node.badge !== '' && !collapsed ? (\n <span\n data-iris-nav-badge=\"\"\n style={{\n marginInlineStart: 'auto',\n fontSize: 'var(--iris-font-size-xs, 12px)',\n lineHeight: 1,\n padding: 'var(--iris-space-xxs, 4px) var(--iris-padding-sm, 6px)',\n borderRadius: 999,\n background: 'var(--iris-danger, #ef4444)',\n color: 'var(--iris-primary-foreground, #fff)',\n }}\n >\n {String(node.badge)}\n </span>\n ) : null\n\n const hoverProps = (key: string) => ({\n onMouseEnter: () => setHovered(key),\n onMouseLeave: () => setHovered((h) => (h === key ? null : h)),\n })\n\n // Collapsed rail: top-level items only, icon + native tooltip; branch → first leaf.\n const renderCollapsed = (node: NavNode): React.ReactElement => {\n const branch = isBranch(node)\n const active = branch ? activePath.includes(node.key) : node.key === activeKey\n return (\n <button\n key={node.key}\n type=\"button\"\n data-iris-nav-item=\"\"\n data-key={node.key}\n data-active={active ? 'true' : undefined}\n data-branch={branch ? '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 style={itemStyle({\n depth: 0,\n active,\n trail: false,\n disabled: !!node.disabled,\n hovered: hovered === node.key,\n })}\n {...hoverProps(node.key)}\n onClick={() => select(branch ? firstLeaf(node) : node)}\n >\n {iconNode(node, 20) ?? <span style={{ fontWeight: 700 }}>{node.title.charAt(0)}</span>}\n </button>\n )\n }\n\n const renderItem = (node: NavNode, depth: number): React.ReactElement => {\n const branch = isBranch(node)\n const open = expanded.includes(node.key)\n const active = node.key === activeKey\n const trail = branch && activePath.includes(node.key)\n\n const row = (\n <button\n type=\"button\"\n data-iris-nav-item=\"\"\n data-key={node.key}\n data-branch={branch ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n data-open={branch && open ? 'true' : undefined}\n data-depth={String(depth)}\n disabled={node.disabled}\n aria-expanded={branch ? (open ? 'true' : 'false') : undefined}\n aria-current={active ? 'page' : undefined}\n style={itemStyle({\n depth,\n active,\n trail,\n disabled: !!node.disabled,\n hovered: hovered === node.key,\n })}\n {...hoverProps(node.key)}\n onClick={() => (branch ? toggle(node.key) : select(node))}\n >\n {iconNode(node)}\n <span\n style={{\n flex: branch ? 1 : '0 1 auto',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {node.title}\n </span>\n {badgeNode(node)}\n {branch ? (\n <IrisIcon\n name={open ? 'chevron-down' : 'chevron-right'}\n size={16}\n style={{ marginInlineStart: node.badge ? 6 : 'auto', opacity: 0.6 }}\n />\n ) : null}\n </button>\n )\n\n if (!branch || !open) {\n return (\n <div\n key={node.key}\n data-iris-nav-group={branch ? '' : undefined}\n style={{ position: horizontal && depth === 0 ? 'relative' : undefined }}\n >\n {row}\n </div>\n )\n }\n return (\n <div\n key={node.key}\n data-iris-nav-group=\"\"\n data-open=\"true\"\n style={{ position: horizontal && depth === 0 ? 'relative' : undefined }}\n >\n {row}\n <div\n data-iris-nav-children=\"\"\n role=\"group\"\n style={\n horizontal && depth === 0\n ? {\n position: 'absolute',\n insetBlockStart: 'calc(100% + 4px)',\n insetInlineStart: 0,\n zIndex: 60,\n minWidth: 220,\n padding: 'var(--iris-space-xs, 8px)',\n border: '1px solid var(--iris-border)',\n borderRadius: 'var(--iris-radius-md, 6px)',\n background: 'var(--iris-surface)',\n boxShadow: 'var(--iris-shadow-md)',\n }\n : undefined\n }\n >\n {(node.children ?? []).map((child) => renderItem(child, depth + 1))}\n </div>\n </div>\n )\n }\n\n // Arrow-key navigation over the visible items (Tab still works as a fallback).\n const onKeyDown = (e: React.KeyboardEvent<HTMLElement>): void => {\n const root = e.currentTarget\n const buttons = Array.from(root.querySelectorAll<HTMLElement>('[data-iris-nav-item]'))\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 return focusAt(idx < 0 ? 0 : idx + 1)\n case 'ArrowUp':\n e.preventDefault()\n return focusAt(idx < 0 ? buttons.length - 1 : idx - 1)\n case 'Home':\n e.preventDefault()\n return void buttons[0]?.focus()\n case 'End':\n e.preventDefault()\n return void buttons[buttons.length - 1]?.focus()\n }\n\n if (collapsed || idx < 0) return\n const key = buttons[idx]?.getAttribute('data-key')\n if (!key) return\n const node = findNavNode(items, key)\n\n if (e.key === 'ArrowRight' && node && isBranch(node)) {\n e.preventDefault()\n if (!expanded.includes(key)) toggle(key)\n else focusAt(idx + 1)\n } else if (e.key === 'ArrowLeft') {\n if (node && isBranch(node) && expanded.includes(key)) {\n e.preventDefault()\n toggle(key)\n } else {\n const parentKey = findNavPath(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 return (\n <nav\n data-iris-nav-menu=\"\"\n data-collapsed={collapsed ? 'true' : undefined}\n data-orientation={orientation}\n aria-label={ariaLabel ?? t('admin.nav')}\n onKeyDown={onKeyDown}\n style={{\n display: 'flex',\n flexDirection: horizontal ? 'row' : 'column',\n alignItems: horizontal ? 'center' : undefined,\n gap: 'var(--iris-space-xxs, 4px)',\n }}\n >\n {collapsed\n ? tree.map((node) => renderCollapsed(node))\n : tree.map((node) => renderItem(node, 0))}\n </nav>\n )\n}\n","import * as React from 'react'\nimport { useI18n } from '../../i18n'\n\nexport interface IrisBreadcrumbProps extends React.HTMLAttributes<HTMLElement> {\n /** String separator between crumbs. Default `/`. */\n separator?: React.ReactNode\n children?: React.ReactNode\n}\n\n/**\n * Container for breadcrumb navigation. Renders a `<nav>` with an `<ol>` per\n * WAI-ARIA. Inserts `separator` between items and tags the last child with\n * `isCurrent` so it renders as plain text + `aria-current=\"page\"`.\n */\nexport const IrisBreadcrumb = React.forwardRef<HTMLElement, IrisBreadcrumbProps>(\n function IrisBreadcrumb({ separator = '/', children, ...rest }, ref) {\n const { t } = useI18n()\n const flat = React.Children.toArray(children).filter((c) =>\n React.isValidElement(c),\n ) as React.ReactElement[]\n const total = flat.length\n\n return (\n <nav\n {...rest}\n ref={ref as React.Ref<HTMLElement>}\n aria-label={t('breadcrumb.label')}\n data-iris-breadcrumb=\"\"\n >\n <ol\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 {flat.map((child, i) => {\n const isLast = i === total - 1\n const itemNode = (\n <li\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 {React.cloneElement(child, {\n isCurrent: isLast,\n } as Partial<unknown> as React.Attributes)}\n </li>\n )\n const sepNode = !isLast ? (\n <li\n key={`sep-${i}`}\n data-iris-breadcrumb-separator=\"\"\n aria-hidden=\"true\"\n style={{ color: 'var(--iris-muted)', display: 'inline-flex', alignItems: 'center' }}\n >\n {separator}\n </li>\n ) : null\n return (\n <React.Fragment key={`pair-${i}`}>\n {itemNode}\n {sepNode}\n </React.Fragment>\n )\n })}\n </ol>\n </nav>\n )\n },\n)\n","import * as React from 'react'\n\nexport interface IrisBreadcrumbItemProps extends React.HTMLAttributes<HTMLElement> {\n href?: string\n /** Internal: set by parent `IrisBreadcrumb` when this is the last item. */\n isCurrent?: boolean\n children?: React.ReactNode\n}\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>`. The `isCurrent` flag is\n * set automatically by the parent `IrisBreadcrumb` based on position.\n */\nexport const IrisBreadcrumbItem = React.forwardRef<HTMLElement, IrisBreadcrumbItemProps>(\n function IrisBreadcrumbItem({ href, isCurrent = false, style, children, ...rest }, ref) {\n const baseStyle: React.CSSProperties = {\n color: isCurrent ? 'var(--iris-muted)' : 'var(--iris-primary)',\n textDecoration: 'none',\n cursor: isCurrent ? 'default' : href ? 'pointer' : 'default',\n }\n\n const common = {\n ...rest,\n 'aria-current': isCurrent ? ('page' as const) : undefined,\n 'data-iris-breadcrumb-crumb': '',\n style: { ...baseStyle, ...style },\n }\n\n if (href && !isCurrent) {\n return (\n <a {...common} ref={ref as React.Ref<HTMLAnchorElement>} href={href}>\n {children}\n </a>\n )\n }\n return (\n <span {...common} ref={ref as React.Ref<HTMLSpanElement>}>\n {children}\n </span>\n )\n },\n)\n","import * as React from 'react'\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\nexport interface IrisAdminBreadcrumbProps {\n /** Root→current ancestor chain (typically `findNavPath(menus, activeKey)`). */\n trail: NavNode[]\n /** Show each node's icon before its title. */\n showIcon?: boolean\n /** Hide the breadcrumb when the trail has a single crumb. */\n hideSingle?: boolean\n separator?: string\n onSelect?: (key: string, node: NavNode) => void\n}\n\n/**\n * Breadcrumb trail for the admin header, driven by a `NavNode[]` ancestor chain.\n * The last crumb is the current page (auto-marked `aria-current` by\n * IrisBreadcrumb); earlier crumbs are clickable and call `onSelect(key, node)`.\n * React port of the Vue `IrisAdminBreadcrumb`.\n */\nexport function IrisAdminBreadcrumb({\n trail,\n showIcon = true,\n hideSingle = false,\n separator = '/',\n onSelect,\n}: IrisAdminBreadcrumbProps): React.ReactElement | null {\n if (trail.length === 0 || (hideSingle && trail.length === 1)) return null\n\n return (\n <IrisBreadcrumb separator={separator}>\n {trail.map((node, i) => {\n const last = i === trail.length - 1\n return (\n <IrisBreadcrumbItem\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 : () => onSelect?.(node.key, node)}\n >\n {showIcon && node.icon ? (\n <IrisIcon name={node.icon} size={14} style={{ marginInlineEnd: 4 }} />\n ) : null}\n <span>{node.title}</span>\n </IrisBreadcrumbItem>\n )\n })}\n </IrisBreadcrumb>\n )\n}\n","import { useStore } from '../useStore'\nimport type { TabsNav, TabItem } from '@iris-ui-kit/core'\n\nexport interface UseTabsNavReturn {\n tabs: TabItem[]\n activeKey: string | undefined\n /** Keep-alive include-set (composite cache keys of all open tabs). */\n cacheKeys: 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 * React 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 read the same state) and get the reactive `tabs` / `activeKey` /\n * `cacheKeys` plus the store's mutators — bridged via `useStore`\n * (`useSyncExternalStore`), mirroring the Vue adapter.\n *\n * ```tsx\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 = useStore(nav.store)\n return {\n tabs: state.tabs,\n activeKey: state.activeKey,\n cacheKeys: state.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 { useMemo } from 'react'\nimport type { Machine, MachineEvent, MachineState } from '@iris-ui-kit/core'\nimport { useStore } from './useStore'\n\n/**\n * Bridge a framework-agnostic `Machine` into React. Returns `[state, send]`\n * — `state` is reactive (re-renders on transition) and `send` is stable\n * across renders.\n *\n * Pass a **factory** (`() => createMachine(...)`) so each component instance\n * gets its own machine. Internally memoised so re-renders don't re-create.\n */\nexport function useMachine<TState extends string, TContext, TEvent extends MachineEvent>(\n factory: () => Machine<TState, TContext, TEvent>,\n): [MachineState<TState, TContext>, (event: TEvent) => void] {\n const machine = useMemo(factory, [])\n const state = useStore(machine.store)\n return [state, machine.send]\n}\n","import * as React from 'react'\nimport type { Placement } from '@iris-ui-kit/core'\n\nexport interface DropdownContextValue {\n open: boolean\n setOpen: (next: boolean) => void\n triggerRef: React.MutableRefObject<HTMLElement | null>\n contentRef: React.MutableRefObject<HTMLElement | null>\n contentId: string\n placement: Placement\n offset: number\n}\n\nexport const DropdownContext = React.createContext<DropdownContextValue | null>(null)\n\nexport function useDropdownContext(componentName: string): DropdownContextValue {\n const ctx = React.useContext(DropdownContext)\n if (!ctx) {\n throw new Error(`[iris-ui] ${componentName} must be a descendant of <IrisDropdown>`)\n }\n return ctx\n}\n","import * as React from 'react'\nimport { createFloatingMachine, type Placement } from '@iris-ui-kit/core'\nimport { useMachine } from '../../useMachine'\nimport { DropdownContext } from './context'\n\nexport interface IrisDropdownProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: Placement\n offset?: number\n children?: React.ReactNode\n}\n\n/**\n * Dropdown menu root. Composes `createFloatingMachine` (state) with\n * `useFloating` (positioning) used in `IrisDropdownMenu`. The dropdown\n * panel's semantics differ from a popover: it uses `role=\"menu\"`, supports\n * arrow-key navigation, and items auto-close the menu on select.\n *\n * @example\n * <IrisDropdown placement=\"bottom-end\">\n * <IrisDropdownTrigger>Actions</IrisDropdownTrigger>\n * <IrisDropdownMenu>\n * <IrisDropdownItem onSelect={onCopy}>Copy</IrisDropdownItem>\n * <IrisDropdownItem onSelect={onDelete}>Delete</IrisDropdownItem>\n * </IrisDropdownMenu>\n * </IrisDropdown>\n */\nexport function IrisDropdown({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n placement = 'bottom-start',\n offset = 6,\n children,\n}: IrisDropdownProps): React.ReactElement {\n const isControlled = openProp !== undefined\n\n const [state, send] = useMachine(() => createFloatingMachine(defaultOpen ? 'open' : 'closed'))\n const internalOpen = state.value === 'open'\n\n React.useEffect(() => {\n if (!isControlled) return\n const target = openProp ? 'open' : 'closed'\n if (state.value !== target) {\n send({ type: openProp ? 'OPEN' : 'CLOSE' })\n }\n }, [isControlled, openProp, state.value, send])\n\n const open = isControlled ? Boolean(openProp) : internalOpen\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (!isControlled) send({ type: next ? 'OPEN' : 'CLOSE' })\n onOpenChange?.(next)\n },\n [isControlled, send, onOpenChange],\n )\n\n const triggerRef = React.useRef<HTMLElement | null>(null)\n const contentRef = React.useRef<HTMLElement | null>(null)\n const contentId = React.useId()\n\n const value = React.useMemo(\n () => ({\n open,\n setOpen,\n triggerRef,\n contentRef,\n contentId,\n placement,\n offset,\n }),\n [open, setOpen, contentId, placement, offset],\n )\n\n return <DropdownContext.Provider value={value}>{children}</DropdownContext.Provider>\n}\n","import * as React from 'react'\nimport { composeEventHandlers } from '@iris-ui-kit/core'\n\ntype AnyProps = Record<string, unknown>\n\nexport interface IrisSlotProps {\n children?: React.ReactNode\n [key: string]: unknown\n}\n\nfunction mergeRefs<T>(...refs: Array<React.Ref<T> | undefined | null>): React.RefCallback<T> {\n return (value: T | null) => {\n for (const ref of refs) {\n if (!ref) continue\n if (typeof ref === 'function') ref(value)\n else (ref as React.MutableRefObject<T | null>).current = value\n }\n }\n}\n\nfunction isEventHandlerName(key: string): boolean {\n return /^on[A-Z]/.test(key)\n}\n\nfunction mergeSlotProps(slot: AnyProps, child: AnyProps): AnyProps {\n const merged: AnyProps = { ...slot }\n for (const key of Object.keys(child)) {\n const slotValue = slot[key]\n const childValue = child[key]\n if (key === 'style') {\n merged.style = {\n ...((slotValue as React.CSSProperties | undefined) ?? {}),\n ...((childValue as React.CSSProperties | undefined) ?? {}),\n }\n } else if (key === 'className') {\n merged.className = [slotValue, childValue].filter(Boolean).join(' ').trim() || undefined\n } else if (\n isEventHandlerName(key) &&\n typeof slotValue === 'function' &&\n typeof childValue === 'function'\n ) {\n merged[key] = composeEventHandlers(\n slotValue as (e: React.SyntheticEvent) => void,\n childValue as (e: React.SyntheticEvent) => void,\n )\n } else if (childValue !== undefined) {\n merged[key] = childValue\n }\n }\n return merged\n}\n\n/**\n * asChild composition primitive: clones the single React element child and\n * merges the Slot's own props into it. `style` shallow-merges, `className`\n * concatenates, event handlers compose (Slot's first, then child's), and any\n * other prop on the child wins over Slot's. Used as a building block for\n * trigger primitives that want to render-as the consumer's chosen element.\n */\nexport const IrisSlot = React.forwardRef<unknown, IrisSlotProps>(function IrisSlot(\n { children, ...slotProps },\n forwardedRef,\n) {\n if (!React.isValidElement(children)) return null\n const child = children as React.ReactElement<AnyProps>\n const childProps = (child.props ?? {}) as AnyProps\n const merged = mergeSlotProps(slotProps as AnyProps, childProps)\n\n const childRef = (child as unknown as { ref?: React.Ref<unknown> }).ref ?? null\n if (forwardedRef || childRef) {\n ;(merged as { ref?: React.Ref<unknown> }).ref = mergeRefs(\n forwardedRef as React.Ref<unknown>,\n childRef,\n )\n }\n\n return React.cloneElement(child, merged as Partial<AnyProps> & React.Attributes)\n})\n","import * as React from 'react'\nimport { composeEventHandlers } from '@iris-ui-kit/core'\nimport { IrisSlot } from '../slot/Slot'\nimport { useDropdownContext } from './context'\n\nexport interface IrisDropdownTriggerProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'children'\n> {\n asChild?: boolean\n children?: React.ReactNode\n}\n\n/**\n * The trigger element that toggles the dropdown open/closed on click or\n * ArrowDown/Enter/Space. Renders as a `<button>` (or custom element via\n * `asChild`) with `aria-haspopup=\"menu\"` and `aria-expanded`.\n */\nexport const IrisDropdownTrigger = React.forwardRef<HTMLElement, IrisDropdownTriggerProps>(\n function IrisDropdownTrigger(\n { asChild = false, onClick, onKeyDown, children, ...rest },\n forwardedRef,\n ) {\n const ctx = useDropdownContext('IrisDropdownTrigger')\n\n const captureRef = React.useCallback(\n (el: HTMLElement | null) => {\n ctx.triggerRef.current = el\n if (typeof forwardedRef === 'function') forwardedRef(el)\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLElement | null>).current = el\n },\n [ctx, forwardedRef],\n )\n\n const handleClick = composeEventHandlers(\n onClick as ((e: React.MouseEvent<HTMLElement>) => void) | undefined,\n () => ctx.setOpen(!ctx.open),\n )\n\n // ArrowDown/Enter/Space open the menu (which then focuses its first item),\n // matching the Vue dropdown trigger + the WAI-ARIA menu-button pattern.\n const handleKeyDown = composeEventHandlers(\n onKeyDown as ((e: React.KeyboardEvent<HTMLElement>) => void) | undefined,\n (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n ctx.setOpen(true)\n }\n },\n )\n\n const triggerProps = {\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': ctx.open,\n 'aria-controls': ctx.contentId,\n 'data-state': ctx.open ? 'open' : 'closed',\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n }\n\n if (asChild) {\n if (!React.isValidElement(children)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[iris-ui] IrisDropdownTrigger asChild requires a single React element')\n }\n return null\n }\n return (\n <IrisSlot ref={captureRef as React.Ref<unknown>} {...rest} {...triggerProps}>\n {children}\n </IrisSlot>\n )\n }\n\n return (\n <button\n type=\"button\"\n {...(rest as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n {...triggerProps}\n ref={captureRef as React.Ref<HTMLButtonElement>}\n >\n {children}\n </button>\n )\n },\n)\n","import * as React from 'react'\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: React.RefObject<HTMLElement | null>\n /** The floating element itself. */\n floating: React.RefObject<HTMLElement | null>\n /** Whether the floating element is visible. Controls `autoUpdate` lifecycle. */\n open: 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 by the\n * `@floating-ui/dom` arrow middleware so you can position the caret CSS.\n */\n arrow?: React.RefObject<HTMLElement | null>\n}\n\nexport interface UseFloatingReturn {\n x: number\n y: number\n strategy: Strategy\n finalPlacement: Placement\n /** Ready-to-bind inline style object for the floating element. */\n floatingStyles: React.CSSProperties\n /** Trigger a manual recompute. Usually not needed — `autoUpdate` handles scroll/resize. */\n update: () => Promise<void>\n /** Arrow x offset (px from floating start edge). Present when `arrow` option is set. */\n arrowX: number | undefined\n /** Arrow y offset (px from floating start edge). Present when `arrow` option is set. */\n arrowY: number | undefined\n /**\n * The side of the floating element the arrow is on — use as the CSS property\n * to apply `bottom: 0` / `top: 0` etc. to the arrow element.\n * E.g. `'bottom'` placement → arrow is on `'top'` of the floating element.\n */\n arrowSide: 'top' | 'right' | 'bottom' | 'left' | undefined\n}\n\n/**\n * Reactive Floating UI integration for React. Subscribes `autoUpdate`\n * whenever `open === true` and both refs are populated; tears it down on\n * close, unmount, or ref clearing.\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 */\nexport function useFloating(options: UseFloatingOptions): UseFloatingReturn {\n const {\n anchor,\n floating,\n open,\n placement = 'bottom',\n strategy = 'absolute',\n offset,\n flip = true,\n shift = true,\n size = false,\n middleware: extraMiddleware,\n arrow,\n } = options\n\n const [x, setX] = React.useState(0)\n const [y, setY] = React.useState(0)\n const [finalPlacement, setFinalPlacement] = React.useState<Placement>(placement)\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 // before its real coordinates arrive.\n const [positioned, setPositioned] = React.useState(false)\n const [arrowX, setArrowX] = React.useState<number | undefined>()\n const [arrowY, setArrowY] = React.useState<number | undefined>()\n\n const middleware = React.useMemo<Middleware[]>(() => {\n const mw: Middleware[] = []\n if (offset !== undefined) mw.push(offsetMiddleware(offset))\n if (flip) mw.push(flipMiddleware())\n if (shift) mw.push(shiftMiddleware({ padding: 8 }))\n if (size) {\n const padding = typeof size === 'number' ? 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 (arrow?.current) mw.push(arrowMiddleware({ element: arrow.current }))\n if (extraMiddleware) mw.push(...extraMiddleware)\n return mw\n }, [offset, flip, shift, size, extraMiddleware, arrow])\n\n // Hold the latest middleware in a ref so `update` always sees current value\n // without being re-created (which would churn the autoUpdate subscription).\n const middlewareRef = React.useRef(middleware)\n middlewareRef.current = middleware\n\n // Monotonic token bumped on every new positioning cycle and on teardown.\n // `computePosition` is async; without this guard a result that resolves\n // after the panel closed/unmounted (or after a newer update started) would\n // apply stale coordinates and call setState on an unmounted component.\n const epochRef = React.useRef(0)\n\n const update = React.useCallback(async () => {\n const a = anchor.current\n const f = floating.current\n if (!a || !f) return\n const token = ++epochRef.current\n const result = await computePosition(a, f, {\n placement,\n strategy,\n middleware: middlewareRef.current,\n })\n // A newer update() started, or the effect tore down, while awaiting — drop.\n if (token !== epochRef.current) return\n setX(result.x)\n setY(result.y)\n setPositioned(true)\n setFinalPlacement(result.placement)\n const arrowData = result.middlewareData.arrow as { x?: number; y?: number } | undefined\n setArrowX(arrowData?.x)\n setArrowY(arrowData?.y)\n }, [anchor, floating, placement, strategy])\n\n React.useEffect(() => {\n if (!open) return\n const a = anchor.current\n const f = floating.current\n if (!a || !f) return\n // Fresh open → hide until the first computePosition cycle completes.\n setPositioned(false)\n const cleanup = autoUpdate(a, f, () => {\n void update()\n })\n return () => {\n // Invalidate any in-flight update() so its late result never lands.\n epochRef.current++\n cleanup()\n }\n }, [open, anchor, floating, update])\n\n const floatingStyles = React.useMemo<React.CSSProperties>(\n () => ({\n position: strategy,\n top: 0,\n left: 0,\n transform: `translate3d(${Math.round(x)}px, ${Math.round(y)}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 ? undefined : 'hidden',\n }),\n [strategy, x, y, positioned],\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 = OPPOSITE[finalPlacement.split('-')[0]] as\n 'top' | 'right' | 'bottom' | 'left' | undefined\n\n return { x, y, strategy, finalPlacement, floatingStyles, update, arrowX, arrowY, arrowSide }\n}\n","import * as React from 'react'\n\nexport interface UseDismissOptions {\n /** While true, the dismiss listeners are active. */\n enabled: boolean\n /** Elements that, if clicked, should NOT trigger dismiss (typically trigger + content). */\n exclude: Array<React.RefObject<HTMLElement | null>>\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 / Menu / Dropdown. Tooltip does NOT use this —\n * it dismisses on mouseleave/blur instead.\n *\n * Listeners attach to `document` (pointerdown in the capture phase, mirroring\n * the Vue adapter) only while `enabled` is true, and detach on disable /\n * unmount. SSR-safe (no-op without `document`). The latest `onDismiss` /\n * `exclude` are read through refs so toggling them never re-subscribes.\n */\nexport function useDismiss(options: UseDismissOptions): void {\n const { enabled, escape = true, outsidePointerDown = true } = options\n\n const onDismissRef = React.useRef(options.onDismiss)\n const excludeRef = React.useRef(options.exclude)\n React.useEffect(() => {\n onDismissRef.current = options.onDismiss\n excludeRef.current = options.exclude\n })\n\n React.useEffect(() => {\n if (!enabled || typeof document === 'undefined') return\n\n const isExcluded = (target: EventTarget | null): boolean => {\n if (!target || !(target instanceof Node)) return false\n for (const r of excludeRef.current) {\n const el = r.current\n if (el && (el === target || el.contains(target))) return true\n }\n return false\n }\n\n const onPointerDown = (event: PointerEvent) => {\n if (isExcluded(event.target)) return\n onDismissRef.current()\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation()\n onDismissRef.current()\n }\n }\n\n if (outsidePointerDown) document.addEventListener('pointerdown', onPointerDown, true)\n if (escape) document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [enabled, escape, outsidePointerDown])\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { matchTypeahead } from '@iris-ui-kit/core'\nimport { useFloating } from '../../floating/useFloating'\nimport { useDismiss } from '../../floating/useDismiss'\nimport { useDropdownContext } from './context'\n\nexport interface IrisDropdownMenuProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n portalTarget?: HTMLElement | false\n children?: React.ReactNode\n}\n\n/**\n * The menu surface. Renders `role=\"menu\"` and handles ArrowUp/Down/Home/End\n * navigation across child `IrisDropdownItem`s. Closes on Escape, outside\n * pointerdown, and Tab.\n */\nexport const IrisDropdownMenu = React.forwardRef<HTMLDivElement, IrisDropdownMenuProps>(\n function IrisDropdownMenu({ portalTarget, style, onKeyDown, children, ...rest }, forwardedRef) {\n const ctx = useDropdownContext('IrisDropdownMenu')\n\n const innerRef = React.useRef<HTMLDivElement | null>(null)\n const captureRef = React.useCallback(\n (el: HTMLDivElement | null) => {\n innerRef.current = el\n ctx.contentRef.current = el\n if (typeof forwardedRef === 'function') forwardedRef(el)\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLDivElement | null>).current = el\n },\n [ctx, forwardedRef],\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 // Outside-pointerdown + Escape dismiss (shared floating hook).\n useDismiss({\n enabled: ctx.open,\n exclude: [ctx.triggerRef, ctx.contentRef],\n onDismiss: () => ctx.setOpen(false),\n })\n\n // Focus first item on open; restore focus to trigger on close.\n const wasOpenRef = React.useRef(false)\n React.useEffect(() => {\n if (ctx.open && !wasOpenRef.current) {\n queueMicrotask(() => {\n const items = innerRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]')\n items?.[0]?.focus()\n })\n } else if (!ctx.open && wasOpenRef.current) {\n ctx.triggerRef.current?.focus?.()\n }\n wasOpenRef.current = ctx.open\n }, [ctx.open, ctx.triggerRef])\n\n // Typeahead buffer: accumulated printable chars, reset after a ~500ms pause.\n const typeaheadRef = React.useRef<{\n buffer: string\n timer: ReturnType<typeof setTimeout> | null\n }>({ buffer: '', timer: null })\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e)\n if (!ctx.open) return\n const items = Array.from(\n innerRef.current?.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 (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n const next = index < 0 ? 0 : (index + 1) % items.length\n items[next]?.focus()\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n const next = index <= 0 ? items.length - 1 : index - 1\n items[next]?.focus()\n break\n }\n case 'Home':\n e.preventDefault()\n items[0]?.focus()\n break\n case 'End':\n e.preventDefault()\n items[items.length - 1]?.focus()\n break\n case 'Tab':\n // Tab closes the menu and lets focus continue out.\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 (e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {\n const ta = typeaheadRef.current\n ta.buffer += e.key\n if (ta.timer) clearTimeout(ta.timer)\n ta.timer = setTimeout(() => {\n ta.buffer = ''\n }, 500)\n const match = matchTypeahead(\n items.map((it) => it.textContent ?? ''),\n ta.buffer,\n index,\n )\n if (match >= 0) {\n e.preventDefault()\n items[match]?.focus()\n }\n }\n }\n }\n }\n\n if (!ctx.open) return null\n\n const node = (\n <div\n {...rest}\n ref={captureRef}\n id={ctx.contentId}\n role=\"menu\"\n tabIndex={-1}\n data-iris-dropdown-menu=\"\"\n data-state=\"open\"\n onKeyDown={handleKeyDown}\n style={{\n ...floatingStyles,\n background: 'var(--iris-surface-floating)',\n color: 'var(--iris-foreground)',\n border: '1px solid var(--iris-border)',\n borderRadius: 'var(--iris-radius-md, 6px)',\n padding: 'var(--iris-padding-sm, 4px)',\n boxShadow: 'var(--iris-shadow-lg)',\n minWidth: 160,\n outline: 'none',\n zIndex: 'var(--iris-z-popover, 1000)',\n ...style,\n }}\n >\n {children}\n </div>\n )\n\n if (portalTarget === false) return node\n if (typeof document === 'undefined') return null\n return createPortal(node, portalTarget ?? document.body)\n },\n)\n","import * as React from 'react'\nimport { composeEventHandlers } from '@iris-ui-kit/core'\nimport { useDropdownContext } from './context'\n\nexport interface IrisDropdownItemProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onSelect'\n> {\n disabled?: boolean\n /** When true, selecting does NOT close the dropdown. */\n keepOpen?: boolean\n /** Emitted on click or Enter/Space. */\n onSelect?: (event: React.SyntheticEvent) => void\n}\n\n/**\n * A single selectable menu item. Calls `onSelect` and auto-closes the\n * parent dropdown after selection (unless `keepOpen`). Disabled items are\n * skipped by arrow-key navigation in the parent menu.\n */\nexport const IrisDropdownItem = React.forwardRef<HTMLDivElement, IrisDropdownItemProps>(\n function IrisDropdownItem(\n { disabled = false, keepOpen = false, onSelect, onClick, onKeyDown, style, children, ...rest },\n ref,\n ) {\n const ctx = useDropdownContext('IrisDropdownItem')\n const [hovered, setHovered] = React.useState(false)\n\n const fire = (event: React.SyntheticEvent) => {\n if (disabled) return\n onSelect?.(event)\n if (!keepOpen) ctx.setOpen(false)\n }\n\n const handleClick = composeEventHandlers(\n onClick as ((e: React.MouseEvent<HTMLDivElement>) => void) | undefined,\n (e: React.MouseEvent<HTMLDivElement>) => fire(e),\n )\n const handleKeyDown = composeEventHandlers(\n onKeyDown as ((e: React.KeyboardEvent<HTMLDivElement>) => void) | undefined,\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n fire(e)\n }\n },\n )\n\n return (\n <div\n {...rest}\n ref={ref}\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled ? 'true' : undefined}\n data-iris-dropdown-item=\"\"\n data-disabled={disabled ? '' : undefined}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onPointerEnter={() => setHovered(true)}\n onPointerLeave={() => setHovered(false)}\n onFocus={() => setHovered(true)}\n onBlur={() => setHovered(false)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-gap-sm, 6px)',\n padding: 'var(--iris-padding-sm, 6px) var(--iris-padding-md, 12px)',\n borderRadius: 'var(--iris-radius-sm, 4px)',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n background: hovered && !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 ...style,\n }}\n >\n {children}\n </div>\n )\n },\n)\n\nexport type IrisDropdownSeparatorProps = React.HTMLAttributes<HTMLDivElement>\n\n/**\n * A visual separator (horizontal rule) within a dropdown menu. Renders a\n * `role=\"separator\"` `<div>` styled with the theme's border colour.\n */\nexport const IrisDropdownSeparator = React.forwardRef<HTMLDivElement, IrisDropdownSeparatorProps>(\n function IrisDropdownSeparator({ style, ...rest }, ref) {\n return (\n <div\n {...rest}\n ref={ref}\n role=\"separator\"\n data-iris-dropdown-separator=\"\"\n style={{\n height: 1,\n background: 'var(--iris-border)',\n margin: '4px 0',\n ...style,\n }}\n />\n )\n },\n)\n","/**\n * Behavior wrapper: makes a list of items sortable via drag-and-drop.\n * Uses `createSortable` from `@iris-ui-kit/core` for the drag-and-drop controller.\n *\n * @example\n * const [items, setItems] = React.useState(['A', 'B', 'C'])\n * <IrisSortable items={items} onReorder={setItems}>\n * {items.map((label) => <div key={label}>{label}</div>)}\n * </IrisSortable>\n */\nimport * as React from 'react'\nimport { createSortable, type SortableState } from '@iris-ui-kit/core'\n\nexport interface IrisSortableProps<T = string> {\n items: readonly T[]\n onReorder: (next: T[]) => void\n getKey?: (item: T, index: number) => string\n children?: React.ReactNode\n className?: string\n style?: React.CSSProperties\n disabled?: boolean\n orientation?: 'vertical' | 'horizontal'\n}\n\nexport const SORTABLE_ITEM_ATTR = 'data-iris-sortable-item'\n\nexport function IrisSortable<T>({\n items,\n onReorder,\n getKey = (_item, index) => String(index),\n disabled = false,\n orientation = 'vertical',\n style,\n className,\n children,\n ...rest\n}: IrisSortableProps<T> &\n Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>): React.ReactElement {\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const ctrlRef = React.useRef<ReturnType<typeof createSortable> | null>(null)\n if (ctrlRef.current === null) ctrlRef.current = createSortable()\n const ctrl = ctrlRef.current\n\n const [state, setState] = React.useState<SortableState>({ activeId: null, overId: null })\n React.useEffect(() => ctrl.subscribe(setState), [ctrl])\n\n const dragging = state.activeId\n\n const indexByKey = (key: string): number =>\n Array.from(containerRef.current?.querySelectorAll(`[${SORTABLE_ITEM_ATTR}]`) ?? []).findIndex(\n (el) => el.getAttribute(SORTABLE_ITEM_ATTR) === key,\n )\n\n const onPointerDown = (e: React.PointerEvent<HTMLElement>): void => {\n if (disabled) return\n const target = (e.target as HTMLElement).closest(`[${SORTABLE_ITEM_ATTR}]`)\n if (!target) return\n const key = target.getAttribute(SORTABLE_ITEM_ATTR) ?? ''\n if (!key) return\n ctrl.press(key, e.clientX, e.clientY)\n }\n\n const onPointerMove = (e: React.PointerEvent<HTMLElement>): void => {\n if (!ctrl.getState().activeId) {\n // Pending press — promote if past threshold\n if (!ctrl.tryStart(e.clientX, e.clientY)) return\n }\n const els = containerRef.current?.querySelectorAll<HTMLElement>(`[${SORTABLE_ITEM_ATTR}]`)\n const rects = Array.from(els ?? []).map((el) => ({\n id: el.getAttribute(SORTABLE_ITEM_ATTR) ?? '',\n ...el.getBoundingClientRect(),\n }))\n ctrl.moveOver({ x: e.clientX, y: e.clientY }, rects)\n }\n\n const onPointerUp = (): void => {\n const result = ctrl.end()\n if (result.activeId && result.overId && result.activeId !== result.overId) {\n const from = indexByKey(result.activeId)\n const to = indexByKey(result.overId)\n if (from >= 0 && to >= 0 && from !== to) {\n const next = [...items]\n const [moved] = next.splice(from, 1)\n next.splice(to, 0, moved!)\n onReorder(next)\n }\n }\n }\n\n return (\n <div\n {...rest}\n ref={containerRef}\n data-iris-sortable=\"\"\n data-state={dragging ? 'dragging' : 'idle'}\n className={className}\n style={{\n display: 'flex',\n flexDirection: orientation === 'horizontal' ? 'row' : 'column',\n gap: 'var(--iris-gap-sm, 4px)',\n opacity: disabled ? 0.6 : 1,\n userSelect: dragging ? 'none' : undefined,\n ...style,\n }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerLeave={onPointerUp}\n >\n {React.Children.map(children, (child, index) => {\n if (!React.isValidElement(child)) return child\n const key = getKey(items[index]!, index)\n const isDragging = key === dragging\n return (\n <div\n key={key}\n data-iris-sortable-item={key}\n data-iris-sortable-dragging={isDragging ? '' : undefined}\n style={{\n transition: isDragging ? 'none' : 'transform 150ms ease',\n opacity: isDragging ? 0.4 : 1,\n position: 'relative',\n zIndex: isDragging ? 100 : undefined,\n }}\n >\n {child}\n </div>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\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\nexport interface IrisAdminTabsProps {\n /** Shared tabs store (from `createTabsNav`). */\n nav: TabsNav\n onChange?: (key: string) => void\n onClose?: (key: string) => void\n onRefresh?: (key: string) => void\n /** Enable pointer/touch reordering. */\n reorderable?: boolean\n onReorder?: (tabs: TabItem[]) => void\n}\n\n/**\n * Vben-style multi-tab bar over a shared {@link TabsNav} store. Each open page is\n * a closable chip; clicking activates (`onChange`), the × closes, and a trailing\n * actions dropdown runs Refresh / Close / Close-others / Close-all on the active\n * tab. The store owns the tab list + active key; the host watches it to sync\n * routing + keep-alive.\n *\n * Keyboard (WAI-ARIA tablist, automatic activation): ←/→ move + activate, Home/\n * End jump, Delete/Backspace closes the focused tab. Roving tabindex keeps a\n * single tab stop. React port of the Vue `IrisAdminTabs`.\n */\nexport function IrisAdminTabs({\n nav,\n onChange,\n onClose,\n onRefresh,\n reorderable = true,\n onReorder,\n}: IrisAdminTabsProps): React.ReactElement {\n const t = useTabsNav(nav)\n const { t: translate } = useI18n()\n const tablistRef = React.useRef<HTMLDivElement>(null)\n const pendingFocus = React.useRef<string | null>(null)\n\n React.useEffect(() => {\n if (!pendingFocus.current) return\n const key = pendingFocus.current\n pendingFocus.current = null\n tablistRef.current?.querySelectorAll<HTMLElement>('[data-iris-tab-label]').forEach((el) => {\n if (el.getAttribute('data-key') === key) el.focus()\n })\n })\n\n const activate = (key: string): void => {\n nav.activate(key)\n onChange?.(key)\n }\n const close = (key: string): void => {\n nav.close(key)\n onClose?.(key)\n }\n const refresh = (key: string): void => {\n nav.refresh(key)\n onRefresh?.(key)\n }\n const reorder = (tabs: TabItem[]): void => {\n tabs.forEach((tab, index) => nav.move(tab.key, index))\n onReorder?.(tabs)\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>): void => {\n const tabs = t.tabs\n const idx = tabs.findIndex((x) => x.key === t.activeKey)\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 pendingFocus.current = nav.getState().activeKey ?? null\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 pendingFocus.current = key\n }\n\n const chip = (tab: TabItem): React.ReactElement => {\n const active = tab.key === t.activeKey\n const closable = isClosable(tab)\n\n const label = (\n <button\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 {tab.icon ? <IrisIcon name={tab.icon} size={14} /> : null}\n <span style={{ whiteSpace: 'nowrap' }}>{tab.title}</span>\n </button>\n )\n\n const closeBtn = closable ? (\n <button\n type=\"button\"\n tabIndex={-1}\n data-iris-tab-close=\"\"\n aria-label={translate('admin.closeTab', { title: tab.title })}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 16,\n height: 16,\n border: 'none',\n borderRadius: 'var(--iris-radius-sm, 4px)',\n background: 'transparent',\n color: 'inherit',\n cursor: 'pointer',\n padding: 0,\n opacity: 0.6,\n }}\n onClick={(e) => {\n e.stopPropagation()\n close(tab.key)\n }}\n >\n <IrisIcon name=\"x\" size={12} />\n </button>\n ) : tab.pinned ? (\n <IrisIcon name=\"check-circle\" size={12} style={{ opacity: 0.5 }} />\n ) : null\n\n return (\n <div\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: 4,\n padding:\n 'var(--iris-padding-sm, 6px) var(--iris-space-xs, 8px) var(--iris-padding-sm, 6px) var(--iris-padding-md, 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}\n {closeBtn}\n </div>\n )\n }\n\n const activeKey = t.activeKey\n return (\n <div\n data-iris-admin-tabs=\"\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-space-xs, 8px)',\n padding: 'var(--iris-padding-sm, 6px) var(--iris-padding-md, 12px)',\n borderBottom: '1px solid var(--iris-border)',\n background: 'var(--iris-background)',\n }}\n >\n <div\n ref={tablistRef}\n data-iris-tabs-scroll=\"\"\n role=\"tablist\"\n aria-label={translate('admin.openPages')}\n onKeyDown={onKeyDown}\n style={{ overflowX: 'auto', flex: 1 }}\n >\n <IrisSortable\n items={t.tabs}\n getKey={(tab) => tab.key}\n onReorder={reorder}\n disabled={!reorderable}\n orientation=\"horizontal\"\n style={{ alignItems: 'center', gap: 'var(--iris-space-xs, 8px)', width: 'max-content' }}\n >\n {t.tabs.map((tab) => chip(tab))}\n </IrisSortable>\n </div>\n\n <IrisDropdown>\n <IrisDropdownTrigger\n aria-label={translate('admin.tabActions')}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\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 <IrisIcon name=\"more-horizontal\" size={16} />\n </IrisDropdownTrigger>\n <IrisDropdownMenu>\n {activeKey ? (\n <>\n <IrisDropdownItem onSelect={() => refresh(activeKey)}>\n {translate('admin.refresh')}\n </IrisDropdownItem>\n <IrisDropdownItem onSelect={() => close(activeKey)}>\n {translate('admin.close')}\n </IrisDropdownItem>\n <IrisDropdownSeparator />\n <IrisDropdownItem onSelect={() => nav.closeLeft(activeKey)}>\n {translate('admin.closeLeft')}\n </IrisDropdownItem>\n <IrisDropdownItem onSelect={() => nav.closeRight(activeKey)}>\n {translate('admin.closeRight')}\n </IrisDropdownItem>\n <IrisDropdownItem onSelect={() => nav.closeOthers(activeKey)}>\n {translate('admin.closeOthers')}\n </IrisDropdownItem>\n <IrisDropdownItem onSelect={() => nav.closeAll()}>\n {translate('admin.closeAll')}\n </IrisDropdownItem>\n </>\n ) : (\n <IrisDropdownItem disabled>No active tab</IrisDropdownItem>\n )}\n </IrisDropdownMenu>\n </IrisDropdown>\n </div>\n )\n}\n","import * as React from 'react'\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: NavNode[]\n /** Active page key (controlled); undefined = uncontrolled. */\n activeKey?: string\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: 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: NavNode[]\n}\n\n/**\n * React 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 hook owns the controlled/uncontrolled `activeKey`\n * reconciliation (idiomatic to React) and delegates navigate / syncFromTab /\n * branch-resolution / breadcrumb to the shared core shell.\n *\n * Controlled mode renders from the prop directly (no flicker); an effect 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 { menus, activeKey, defaultActiveKey, onActiveKeyChange, onSelect, tabs } = config\n const activeControlled = activeKey !== undefined\n\n // Latest callbacks read without re-creating the (stable) shell instance.\n const latest = React.useRef({ onActiveKeyChange, onSelect })\n latest.current = { onActiveKeyChange, onSelect }\n\n const shellRef = React.useRef<AdminShell | null>(null)\n if (shellRef.current === null) {\n shellRef.current = createAdminShell({\n menus,\n defaultActiveKey: activeKey ?? defaultActiveKey,\n tabs,\n onActiveChange: (key, node) => {\n latest.current.onActiveKeyChange?.(key)\n if (node) latest.current.onSelect?.(key, node)\n },\n })\n }\n const shell = shellRef.current\n const state = useStore(shell.store)\n\n // Keep the shell reconciling against the live menu tree.\n React.useEffect(() => {\n shell.setMenus(menus)\n }, [shell, menus])\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 React.useEffect(() => {\n if (activeControlled && shell.getActiveKey() !== (activeKey ?? null)) {\n shell.store.setState({ activeKey: activeKey ?? null })\n }\n })\n\n const current = activeControlled ? (activeKey ?? '') : (state.activeKey ?? '')\n\n return {\n activeKey: current,\n navigate: shell.navigate,\n syncFromTab: shell.syncFromTab,\n breadcrumb: current ? findNavPath(menus, current) : [],\n }\n}\n","import * as React from 'react'\nimport type { NavNode, TabsNav } from '@iris-ui-kit/core'\nimport { IrisSidebarLayout } from '../layouts/SidebarLayout'\nimport { IrisHeaderLayout } from '../layouts/HeaderLayout'\nimport { useStore } from '../useStore'\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\ntype LogoRenderer = React.ReactNode | ((state: { collapsed: boolean }) => React.ReactNode)\ntype ContentRenderer = React.ReactNode | ((state: { activeKey: string }) => React.ReactNode)\n\nexport interface IrisAdminLayoutProps {\n /** Normalized nav tree driving menu + breadcrumb. */\n menus: NavNode[]\n /** Active page key (controlled). */\n activeKey?: string\n defaultActiveKey?: string\n onActiveKeyChange?: (key: string) => void\n /** Sidebar collapsed (controlled); undefined = uncontrolled. */\n collapsed?: boolean\n defaultCollapsed?: boolean\n onCollapsedChange?: (next: boolean) => void\n mode?: IrisAdminLayoutMode\n appTitle?: string\n /** Optional shared tabs store; when present the tab bar is rendered. */\n tabs?: TabsNav\n showTabs?: boolean\n showBreadcrumb?: boolean\n stickyHeader?: boolean\n stickyTabs?: boolean\n menuAlign?: IrisAdminMenuAlign\n contentWidth?: IrisAdminContentWidth\n contentHeight?: IrisAdminContentHeight\n sidebarWidth?: number | string\n collapsedWidth?: number | string\n /** Brand region; render-prop receives `{ collapsed }`. */\n logo?: LogoRenderer\n /** Header end region (theme switch, user menu, …). */\n toolbar?: React.ReactNode\n footer?: React.ReactNode\n onSelect?: (key: string, node: NavNode) => void\n /** Page content; render-prop receives `{ activeKey }`. */\n children?: ContentRenderer\n}\n\n/** Mirrors tab-store activation (incl. close→neighbor) into the layout's active key. */\nfunction TabsSync({\n nav,\n activeKey,\n onActivate,\n}: {\n nav: TabsNav\n activeKey: string\n onActivate: (key: string) => void\n}): null {\n const state = useStore(nav.store)\n React.useEffect(() => {\n if (state.activeKey && state.activeKey !== activeKey) onActivate(state.activeKey)\n }, [state.activeKey, activeKey, onActivate])\n return null\n}\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. The host owns routing: react to `onSelect` / `onActiveKeyChange` and\n * render the page via the children render-prop (wrap it in keep-alive keyed by\n * `tabs.cacheKey` for Vben-style tab caching).\n *\n * Modes: `sidebar` (default) and `full-content` (chrome hidden). React port of\n * the Vue `IrisAdminLayout`.\n */\nexport function IrisAdminLayout({\n menus,\n activeKey,\n defaultActiveKey,\n onActiveKeyChange,\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n mode = 'sidebar',\n appTitle = 'Iris Admin',\n tabs,\n showTabs = true,\n showBreadcrumb = true,\n stickyHeader = true,\n stickyTabs = true,\n menuAlign = 'start',\n contentWidth = 'fluid',\n contentHeight = 'viewport',\n sidebarWidth = 240,\n collapsedWidth = 64,\n logo,\n toolbar,\n footer,\n onSelect,\n children,\n}: IrisAdminLayoutProps): React.ReactElement {\n const { t } = useI18n()\n const {\n activeKey: currentActive,\n navigate,\n syncFromTab,\n breadcrumb: trail,\n } = useAdminShell({ menus, activeKey, defaultActiveKey, onActiveKeyChange, onSelect, tabs })\n\n const collapseControlled = collapsed !== undefined\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed)\n const currentCollapsed = collapseControlled ? (collapsed as boolean) : internalCollapsed\n const setCollapsed = React.useCallback(\n (next: boolean) => {\n if (!collapseControlled) setInternalCollapsed(next)\n onCollapsedChange?.(next)\n },\n [collapseControlled, onCollapsedChange],\n )\n\n const handleSelect = (_key: string, node: NavNode): void => navigate(node)\n\n const renderContent = (): React.ReactNode =>\n typeof children === 'function' ? children({ activeKey: currentActive }) : children\n\n if (mode === 'full-content') {\n return (\n <div data-iris-admin-layout=\"\" data-mode=\"full-content\" style={{ height: '100%' }}>\n {renderContent()}\n </div>\n )\n }\n\n const defaultLogo = (state: { collapsed: boolean }): React.ReactElement => (\n <div\n data-iris-admin-logo=\"\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-space-sm, 12px)',\n height: 52,\n padding: '0 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 <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\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 <IrisIcon name=\"menu\" size={18} />\n </span>\n {state.collapsed ? null : <span>{appTitle}</span>}\n </div>\n )\n const renderLogo = (state: { collapsed: boolean }): React.ReactNode =>\n typeof logo === 'function' ? logo(state) : (logo ?? defaultLogo(state))\n\n const tabsBar =\n tabs && showTabs ? (\n <div\n data-iris-admin-tabs-region=\"\"\n data-sticky={stickyTabs ? 'true' : undefined}\n style={{\n position: stickyTabs && !stickyHeader ? 'sticky' : 'relative',\n top: 0,\n zIndex: 49,\n }}\n >\n <IrisAdminTabs nav={tabs} />\n </div>\n ) : null\n\n const contentRegion = (\n <div\n data-iris-admin-content=\"\"\n data-width={contentWidth}\n style={{\n boxSizing: 'border-box',\n width: '100%',\n maxWidth: contentWidth === 'centered' ? '72rem' : undefined,\n marginInline: contentWidth === 'centered' ? 'auto' : undefined,\n padding: 16,\n }}\n >\n {mode === 'horizontal' && showBreadcrumb ? (\n <IrisAdminBreadcrumb trail={trail} onSelect={handleSelect} />\n ) : null}\n {renderContent()}\n </div>\n )\n\n const collapseToggle = (\n <button\n type=\"button\"\n data-iris-admin-collapse=\"\"\n aria-label={currentCollapsed ? t('admin.expandSidebar') : t('admin.collapseSidebar')}\n aria-pressed={currentCollapsed ? 'true' : 'false'}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 32,\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(!currentCollapsed)}\n >\n <IrisIcon name={currentCollapsed ? 'chevron-right' : 'menu'} size={18} />\n </button>\n )\n\n const headerBar = (\n <div\n data-iris-admin-headerbar=\"\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n height: 52,\n padding: '0 16px',\n borderBottom: '1px solid var(--iris-border)',\n background: 'var(--iris-background)',\n }}\n >\n {collapseToggle}\n {showBreadcrumb ? <IrisAdminBreadcrumb trail={trail} onSelect={handleSelect} /> : null}\n <div style={{ flex: 1 }} />\n {toolbar ? (\n <div data-iris-admin-toolbar=\"\" style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {toolbar}\n </div>\n ) : null}\n </div>\n )\n\n if (mode === 'horizontal') {\n const justifyContent =\n menuAlign === 'center' ? 'center' : menuAlign === 'end' ? 'flex-end' : 'flex-start'\n return (\n <div\n data-iris-admin-layout=\"\"\n data-mode=\"horizontal\"\n style={{\n height: contentHeight === 'viewport' ? '100vh' : 'auto',\n minHeight: '100vh',\n }}\n >\n {tabs ? <TabsSync nav={tabs} activeKey={currentActive} onActivate={syncFromTab} /> : null}\n <IrisHeaderLayout\n sticky={stickyHeader}\n footer={footer}\n header={\n <div data-iris-admin-header=\"\">\n <div\n data-iris-admin-headerbar=\"\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n minHeight: 52,\n padding: '0 16px',\n background: 'var(--iris-background)',\n }}\n >\n {renderLogo({ collapsed: false })}\n <div\n data-iris-admin-topnav=\"\"\n style={{ display: 'flex', flex: 1, minWidth: 0, justifyContent }}\n >\n <IrisNavMenu\n items={menus}\n activeKey={currentActive}\n orientation=\"horizontal\"\n onSelect={handleSelect}\n />\n </div>\n {toolbar ? (\n <div\n data-iris-admin-toolbar=\"\"\n style={{ display: 'flex', alignItems: 'center', gap: 8 }}\n >\n {toolbar}\n </div>\n ) : null}\n </div>\n {tabsBar}\n </div>\n }\n >\n {contentRegion}\n </IrisHeaderLayout>\n </div>\n )\n }\n\n return (\n <IrisSidebarLayout\n data-iris-admin-layout=\"\"\n data-mode=\"sidebar\"\n collapsed={currentCollapsed}\n onCollapsedChange={setCollapsed}\n width={sidebarWidth}\n collapsedWidth={collapsedWidth}\n style={{ height: '100vh' }}\n sidebar={(state) => (\n <div\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 {renderLogo(state)}\n <div style={{ flex: 1, overflowY: 'auto', overflowX: 'hidden', padding: 8 }}>\n <IrisNavMenu\n items={menus}\n activeKey={currentActive}\n collapsed={state.collapsed}\n onSelect={handleSelect}\n />\n </div>\n </div>\n )}\n >\n {tabs ? <TabsSync nav={tabs} activeKey={currentActive} onActivate={syncFromTab} /> : null}\n <IrisHeaderLayout\n sticky={stickyHeader}\n header={\n <div data-iris-admin-header=\"\">\n {headerBar}\n {tabsBar}\n </div>\n }\n footer={footer}\n >\n {contentRegion}\n </IrisHeaderLayout>\n </IrisSidebarLayout>\n )\n}\n","import * as React from 'react'\nimport type { AdminPreferences, AdminPreferencesState } from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\n\nexport interface UseAdminPreferencesReturn {\n state: 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 React bridge for the framework-agnostic admin preferences controller. */\nexport function useAdminPreferences(\n preferences: AdminPreferences,\n hydrate = true,\n): UseAdminPreferencesReturn {\n const state = useStore(preferences.store)\n React.useEffect(() => {\n if (hydrate) void preferences.hydrate()\n }, [hydrate, preferences])\n return {\n state,\n set: preferences.set,\n patch: preferences.patch,\n reset: preferences.reset,\n hydrate: preferences.hydrate,\n flush: preferences.flush,\n }\n}\n"]}
|