@iris-ui-kit/react 0.1.0 → 0.2.0
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 +305 -14
- package/dist/admin.cjs.map +1 -1
- package/dist/admin.d.cts +33 -7
- package/dist/admin.d.ts +33 -7
- package/dist/admin.js +2 -1
- package/dist/behaviors.cjs +2 -1
- package/dist/behaviors.cjs.map +1 -1
- package/dist/behaviors.d.cts +2 -1
- package/dist/behaviors.d.ts +2 -1
- package/dist/behaviors.js +2 -1
- package/dist/{chunk-UWUUEZCD.js → chunk-B4RS5WKC.js} +2 -2
- package/dist/{chunk-UWUUEZCD.js.map → chunk-B4RS5WKC.js.map} +1 -1
- package/dist/{chunk-2TQSTINK.js → chunk-BCL32KSE.js} +4 -100
- package/dist/chunk-BCL32KSE.js.map +1 -0
- package/dist/chunk-K2F7SC2T.js +107 -0
- package/dist/chunk-K2F7SC2T.js.map +1 -0
- package/dist/{chunk-VWCJJRSC.js → chunk-XVXURJZQ.js} +205 -19
- package/dist/chunk-XVXURJZQ.js.map +1 -0
- package/dist/index.cjs +1281 -943
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +169 -98
- package/dist/index.d.ts +169 -98
- package/dist/index.js +800 -658
- package/dist/index.js.map +1 -1
- package/dist/skeletons.cjs.map +1 -1
- package/dist/skeletons.js +1 -1
- package/package.json +91 -11
- package/dist/chunk-2TQSTINK.js.map +0 -1
- package/dist/chunk-VWCJJRSC.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/primitives/icon/Icon.tsx","../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/primitives/dropdown/DropdownMenu.tsx","../src/primitives/dropdown/DropdownItem.tsx","../src/admin/AdminTabs.tsx","../src/admin/useAdminShell.ts","../src/admin/AdminLayout.tsx","../src/admin/useAdminPreferences.ts"],"names":["React","React2","jsx","jsxs","React3","IrisBreadcrumb","React4","IrisBreadcrumbItem","React5","React7","IrisSlot","React8","IrisDropdownTrigger","composeEventHandlers","React9","IrisDropdownMenu","React10","IrisDropdownItem","IrisDropdownSeparator","React11","Fragment","React12","findNavPath","React13","React14"],"mappings":"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","file":"chunk-XVXURJZQ.js","sourcesContent":["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 {\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: 10,\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 ? 'var(--iris-primary)'\n : opts.hovered && !opts.disabled\n ? '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: 14,\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 : '8px 10px',\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: 11,\n lineHeight: 1,\n padding: '2px 6px',\n borderRadius: 999,\n background: 'var(--iris-danger, #e5484d)',\n color: '#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: 6,\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: 2,\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: 6,\n margin: 0,\n padding: 0,\n listStyle: 'none',\n fontSize: 14,\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 { 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)',\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: '0 8px 24px -8px rgba(0, 0, 0, 0.16), 0 4px 8px -2px rgba(0, 0, 0, 0.08)',\n minWidth: 160,\n outline: 'none',\n zIndex: 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: '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: 14,\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","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: 6,\n border: 'none',\n background: 'transparent',\n color: 'inherit',\n font: 'inherit',\n fontSize: 13,\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: '5px 8px 5px 10px',\n borderRadius: 'var(--iris-radius-md, 6px)',\n border: `1px solid ${active ? 'var(--iris-primary)' : 'var(--iris-border)'}`,\n background: active ? 'var(--iris-primary)' : 'var(--iris-surface)',\n color: active ? 'var(--iris-primary-foreground, #fff)' : 'var(--iris-foreground)',\n flex: '0 0 auto',\n }}\n >\n {label}\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: 6,\n padding: '6px 10px',\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: 6, 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: 10,\n height: 52,\n padding: '0 16px',\n color: 'var(--iris-foreground)',\n fontWeight: 700,\n fontSize: 16,\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"]}
|