@iris-ui-kit/react 0.2.2 → 0.2.3
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 +10 -3
- package/dist/admin.cjs.map +1 -1
- package/dist/admin.js +2 -2
- package/dist/behaviors.cjs +45 -0
- package/dist/behaviors.cjs.map +1 -1
- package/dist/behaviors.d.cts +38 -1
- package/dist/behaviors.d.ts +38 -1
- package/dist/behaviors.js +1 -1
- package/dist/{chunk-AE2TTLTK.js → chunk-6S6MZC5G.js} +11 -4
- package/dist/chunk-6S6MZC5G.js.map +1 -0
- package/dist/{chunk-OD2O3BPM.js → chunk-KRFZ5KL4.js} +4 -4
- package/dist/chunk-KRFZ5KL4.js.map +1 -0
- package/dist/{chunk-53KFLVIZ.js → chunk-QZJXMCRR.js} +3 -2
- package/dist/chunk-QZJXMCRR.js.map +1 -0
- package/dist/{chunk-APA5KNCK.js → chunk-ZE4GH2GV.js} +49 -5
- package/dist/chunk-ZE4GH2GV.js.map +1 -0
- package/dist/data.cjs +1 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.cts +4 -2
- package/dist/data.d.ts +4 -2
- package/dist/data.js +1 -1
- package/dist/floating.cjs +9 -2
- package/dist/floating.cjs.map +1 -1
- package/dist/floating.js +1 -1
- package/dist/index.cjs +3537 -1802
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +494 -22
- package/dist/index.d.ts +494 -22
- package/dist/index.js +3279 -1597
- package/dist/index.js.map +1 -1
- package/package.json +15 -15
- package/dist/chunk-53KFLVIZ.js.map +0 -1
- package/dist/chunk-AE2TTLTK.js.map +0 -1
- package/dist/chunk-APA5KNCK.js.map +0 -1
- package/dist/chunk-OD2O3BPM.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iris-ui-kit/react",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "React 18/19 adapter for Iris UI — full component set",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -104,13 +104,21 @@
|
|
|
104
104
|
"dist"
|
|
105
105
|
],
|
|
106
106
|
"sideEffects": false,
|
|
107
|
+
"scripts": {
|
|
108
|
+
"build": "tsup",
|
|
109
|
+
"dev": "tsup --watch",
|
|
110
|
+
"test": "vitest run",
|
|
111
|
+
"typecheck": "tsc --noEmit",
|
|
112
|
+
"lint": "eslint src",
|
|
113
|
+
"clean": "rm -rf dist .turbo"
|
|
114
|
+
},
|
|
107
115
|
"dependencies": {
|
|
108
116
|
"@floating-ui/dom": "^1.7.6",
|
|
109
|
-
"@iris-ui-kit/core": "
|
|
110
|
-
"@iris-ui-kit/icons": "
|
|
111
|
-
"@iris-ui-kit/skins": "
|
|
112
|
-
"@iris-ui-kit/
|
|
113
|
-
"@iris-ui-kit/
|
|
117
|
+
"@iris-ui-kit/core": "workspace:*",
|
|
118
|
+
"@iris-ui-kit/icons": "workspace:*",
|
|
119
|
+
"@iris-ui-kit/skins": "workspace:*",
|
|
120
|
+
"@iris-ui-kit/theme": "workspace:*",
|
|
121
|
+
"@iris-ui-kit/tokens": "workspace:*"
|
|
114
122
|
},
|
|
115
123
|
"peerDependencies": {
|
|
116
124
|
"react": "^18.0.0 || ^19.0.0",
|
|
@@ -129,13 +137,5 @@
|
|
|
129
137
|
},
|
|
130
138
|
"publishConfig": {
|
|
131
139
|
"access": "public"
|
|
132
|
-
},
|
|
133
|
-
"scripts": {
|
|
134
|
-
"build": "tsup",
|
|
135
|
-
"dev": "tsup --watch",
|
|
136
|
-
"test": "vitest run",
|
|
137
|
-
"typecheck": "tsc --noEmit",
|
|
138
|
-
"lint": "eslint src",
|
|
139
|
-
"clean": "rm -rf dist .turbo"
|
|
140
140
|
}
|
|
141
|
-
}
|
|
141
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/useDataSource.ts","../src/data/useGroupedView.ts"],"names":["React"],"mappings":"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","file":"chunk-53KFLVIZ.js","sourcesContent":["import * as React from 'react'\nimport {\n createDataSource,\n type DataSourceController,\n type DataSourceConfig,\n type DataSourceState,\n} from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\n\nexport interface UseDataSource<T> extends DataSourceController<T> {\n /**\n * The live data-source state: rows, total, page/pageSize, sort/multiSort,\n * filters/filterRules, loading/loadingMore, hasMore, selectedKeys, and the\n * per-row pendingRows/rowErrors.\n */\n state: DataSourceState<T>\n}\n\n/**\n * React bridge over the framework-agnostic {@link createDataSource} — the unified\n * data engine (paged/infinite + multi-sort + typed filters + selection +\n * per-row + optimistic mutate). Creates the controller once, subscribes to its\n * store, and returns the controller plus its live `state`. A thin bridge — all\n * logic lives in `@iris-ui-kit/core`.\n *\n * Constructed with `immediate: false` so no fetch fires during render; the\n * initial load is kicked from an effect and the controller is torn down on\n * unmount (aborting any in-flight request) so a late response never writes back.\n */\nexport function useDataSource<T>(config: DataSourceConfig<T>): UseDataSource<T> {\n const ref = React.useRef<DataSourceController<T> | null>(null)\n if (ref.current === null) ref.current = createDataSource({ ...config, immediate: false })\n const controller = ref.current\n const immediate = config.immediate !== false\n\n React.useEffect(() => {\n if (immediate) void controller.load()\n return () => controller.destroy()\n }, [controller, immediate])\n\n const state = useStore(controller.store)\n return React.useMemo(() => ({ ...controller, state }), [controller, state])\n}\n","import * as React from 'react'\nimport { createGroupedView, type GroupedViewConfig, type GroupedViewState } from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\n\nexport interface UseGroupedView<Row, K = string> {\n /** Subscribable store with the full grouped state. */\n store: ReturnType<typeof createGroupedView<Row, K>>['store']\n /** Set the source rows (re-computes groups and aggregates). */\n setRows: (\n rows: readonly Row[],\n columns?: readonly import('@iris-ui-kit/core').DataViewColumn<Row>[],\n ) => void\n /** Toggle a group's expanded state. */\n toggleGroup: (key: K) => void\n /** Expand a specific group. */\n expandGroup: (key: K) => void\n /** Collapse a specific group. */\n collapseGroup: (key: K) => void\n /** Expand all groups. */\n expandAll: () => void\n /** Collapse all groups. */\n collapseAll: () => void\n /** The live grouped-view state snapshot. */\n state: GroupedViewState<Row, K>\n /** Update config. */\n setConfig: (partial: Partial<GroupedViewConfig<Row, K>>) => void\n}\n\n/**\n * React bridge over the framework-agnostic {@link createGroupedView}.\n * Creates the controller once (ref), subscribes to its store, and returns\n * the controller plus its live `state`.\n */\nexport function useGroupedView<Row, K = string>(\n config: GroupedViewConfig<Row, K>,\n): UseGroupedView<Row, K> {\n const ref = React.useRef<ReturnType<typeof createGroupedView<Row, K>> | null>(null)\n if (ref.current === null) ref.current = createGroupedView<Row, K>(config)\n const controller = ref.current\n\n const storeState = useStore(controller.store)\n const state: GroupedViewState<Row, K> = storeState.state\n\n const setRows = React.useCallback(\n (\n rows: readonly Row[],\n columns?: readonly import('@iris-ui-kit/core').DataViewColumn<Row>[],\n ) => {\n controller.setRows(rows, columns)\n },\n [controller],\n )\n\n const toggleGroup = React.useCallback((key: K) => controller.toggleGroup(key), [controller])\n const expandGroup = React.useCallback((key: K) => controller.expandGroup(key), [controller])\n const collapseGroup = React.useCallback((key: K) => controller.collapseGroup(key), [controller])\n const expandAll = React.useCallback(() => controller.expandAll(), [controller])\n const collapseAll = React.useCallback(() => controller.collapseAll(), [controller])\n const setConfig = React.useCallback(\n (partial: Partial<GroupedViewConfig<Row, K>>) => controller.setConfig(partial),\n [controller],\n )\n\n return React.useMemo(\n () => ({\n store: controller.store,\n setRows,\n toggleGroup,\n expandGroup,\n collapseGroup,\n expandAll,\n collapseAll,\n state,\n setConfig,\n }),\n [\n controller,\n setRows,\n toggleGroup,\n expandGroup,\n collapseGroup,\n expandAll,\n collapseAll,\n state,\n setConfig,\n ],\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/floating/useFloating.ts","../src/floating/useDismiss.ts"],"names":["offset","flip","shift","size","arrow","offsetMiddleware","flipMiddleware","shiftMiddleware","sizeMiddleware","arrowMiddleware","React2"],"mappings":"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","file":"chunk-AE2TTLTK.js","sourcesContent":["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 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 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 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 }),\n [strategy, x, y],\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/primitives/drag/useDrag.ts","../src/behaviors/Resizable.tsx","../src/behaviors/Movable.tsx","../src/behaviors/Hotkey.tsx","../src/behaviors/ClickOutside.tsx","../src/behaviors/LongPress.tsx"],"names":["React","React2","jsx","React4","React5","React6"],"mappings":"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","file":"chunk-APA5KNCK.js","sourcesContent":["import * as React from 'react'\n\nexport interface DragState {\n /** Pointer x in client coordinates. */\n x: number\n /** Pointer y in client coordinates. */\n y: number\n /** Cumulative delta from pointerdown. */\n dx: number\n /** Cumulative delta from pointerdown. */\n dy: number\n /** The active pointer event. */\n event: PointerEvent\n}\n\nexport interface UseDragOptions {\n /** The element the drag handle is bound to. */\n handle: React.RefObject<HTMLElement | null>\n /** Drag is only initiated for these pointer buttons. Default `[0]`. */\n buttons?: number[]\n onStart?: (state: DragState) => boolean | void\n onDrag?: (state: DragState) => void\n onEnd?: (state: DragState) => void\n disabled?: boolean\n}\n\n/**\n * Bind pointer-driven drag handlers to an element. Uses `setPointerCapture`\n * so the drag continues even after the pointer leaves the element. Cancels\n * on `pointercancel`.\n *\n * Pure pointer events — works for mouse, touch, and pen.\n */\nexport function useDrag(options: UseDragOptions): void {\n const { handle, buttons = [0], onStart, onDrag, onEnd, disabled = false } = options\n\n // Pin all callbacks/options into a ref so the effect can stay mounted across\n // re-renders without re-wiring listeners on every prop change.\n const latest = React.useRef({ onStart, onDrag, onEnd, disabled, buttons })\n latest.current = { onStart, onDrag, onEnd, disabled, buttons }\n\n React.useEffect(() => {\n const el = handle.current\n if (!el) return\n\n let active: PointerEvent | null = null\n let startX = 0\n let startY = 0\n\n const onPointerDown = (event: PointerEvent) => {\n if (latest.current.disabled) return\n if (!latest.current.buttons.includes(event.button)) return\n startX = event.clientX\n startY = event.clientY\n const state: DragState = {\n x: event.clientX,\n y: event.clientY,\n dx: 0,\n dy: 0,\n event,\n }\n const result = latest.current.onStart?.(state)\n if (result === false) return\n active = event\n el.setPointerCapture?.(event.pointerId)\n el.style.touchAction = 'none'\n event.preventDefault()\n }\n\n const onPointerMove = (event: PointerEvent) => {\n if (!active || active.pointerId !== event.pointerId) return\n latest.current.onDrag?.({\n x: event.clientX,\n y: event.clientY,\n dx: event.clientX - startX,\n dy: event.clientY - startY,\n event,\n })\n }\n\n const onPointerEnd = (event: PointerEvent) => {\n if (!active || active.pointerId !== event.pointerId) return\n el.releasePointerCapture?.(event.pointerId)\n el.style.touchAction = ''\n latest.current.onEnd?.({\n x: event.clientX,\n y: event.clientY,\n dx: event.clientX - startX,\n dy: event.clientY - startY,\n event,\n })\n active = null\n }\n\n el.addEventListener('pointerdown', onPointerDown)\n el.addEventListener('pointermove', onPointerMove)\n el.addEventListener('pointerup', onPointerEnd)\n el.addEventListener('pointercancel', onPointerEnd)\n return () => {\n el.removeEventListener('pointerdown', onPointerDown)\n el.removeEventListener('pointermove', onPointerMove)\n el.removeEventListener('pointerup', onPointerEnd)\n el.removeEventListener('pointercancel', onPointerEnd)\n }\n }, [handle])\n}\n","import * as React from 'react'\nimport { useDrag } from '../primitives/drag/useDrag'\n\nexport type IrisResizableHandle =\n 'top' | 'right' | 'bottom' | 'left' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n\nexport interface IrisResizableSize {\n width: number\n height: number\n}\n\nconst ALL_HANDLES: IrisResizableHandle[] = [\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'top-left',\n 'top-right',\n 'bottom-left',\n 'bottom-right',\n]\n\nconst HANDLE_CURSORS: Record<IrisResizableHandle, string> = {\n top: 'ns-resize',\n right: 'ew-resize',\n bottom: 'ns-resize',\n left: 'ew-resize',\n 'top-left': 'nwse-resize',\n 'top-right': 'nesw-resize',\n 'bottom-left': 'nesw-resize',\n 'bottom-right': 'nwse-resize',\n}\n\nfunction handlePosition(handle: IrisResizableHandle): React.CSSProperties {\n const s: React.CSSProperties = { position: 'absolute' }\n const t = handle.includes('top')\n const b = handle.includes('bottom')\n const l = handle.includes('left')\n const r = handle.includes('right')\n if (t) s.top = -4\n if (b) s.bottom = -4\n if (l) s.left = -4\n if (r) s.right = -4\n const isCorner = (t || b) && (l || r)\n if (isCorner) {\n s.width = 12\n s.height = 12\n } else if (t || b) {\n s.left = 0\n s.right = 0\n s.height = 8\n } else {\n s.top = 0\n s.bottom = 0\n s.width = 8\n }\n s.cursor = HANDLE_CURSORS[handle]\n return s\n}\n\ninterface HandleProps {\n handle: IrisResizableHandle\n disabled: boolean\n keepAspect: boolean\n sizeRef: React.MutableRefObject<IrisResizableSize>\n minWidth: number\n minHeight: number\n maxWidth: number\n maxHeight: number\n onUpdate: (next: IrisResizableSize) => void\n onResizeStart?: (start: IrisResizableSize) => void\n onResizeEnd?: (end: IrisResizableSize) => void\n}\n\nfunction Handle(props: HandleProps): React.ReactElement {\n const handleRef = React.useRef<HTMLDivElement | null>(null)\n const startRef = React.useRef<IrisResizableSize>({ width: 0, height: 0 })\n const aspectRef = React.useRef(1)\n\n useDrag({\n handle: handleRef,\n disabled: props.disabled,\n onStart: () => {\n startRef.current = { ...props.sizeRef.current }\n aspectRef.current = startRef.current.width / Math.max(1, startRef.current.height)\n props.onResizeStart?.(startRef.current)\n },\n onDrag: ({ dx, dy }) => {\n const { handle } = props\n const t = handle.includes('top')\n const b = handle.includes('bottom')\n const l = handle.includes('left')\n const r = handle.includes('right')\n let nextW = startRef.current.width\n let nextH = startRef.current.height\n if (r) nextW = startRef.current.width + dx\n if (l) nextW = startRef.current.width - dx\n if (b) nextH = startRef.current.height + dy\n if (t) nextH = startRef.current.height - dy\n if (props.keepAspect && (t || b) && (l || r)) {\n nextH = nextW / aspectRef.current\n }\n nextW = Math.max(props.minWidth, Math.min(props.maxWidth, nextW))\n nextH = Math.max(props.minHeight, Math.min(props.maxHeight, nextH))\n props.onUpdate({ width: nextW, height: nextH })\n },\n onEnd: () => {\n props.onResizeEnd?.(props.sizeRef.current)\n },\n })\n\n return (\n <div\n ref={handleRef}\n data-iris-resizable-handle={props.handle}\n style={{\n ...handlePosition(props.handle),\n touchAction: 'none',\n background: 'transparent',\n zIndex: 1,\n }}\n />\n )\n}\n\nexport interface IrisResizableProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /** Controlled size. */\n size?: IrisResizableSize\n defaultSize?: IrisResizableSize\n onSizeChange?: (next: IrisResizableSize) => void\n onResizeStart?: (start: IrisResizableSize) => void\n onResizeEnd?: (end: IrisResizableSize) => void\n handles?: IrisResizableHandle[]\n minWidth?: number\n minHeight?: number\n maxWidth?: number\n maxHeight?: number\n keepAspect?: boolean\n disabled?: boolean\n children?: React.ReactNode\n}\n\n/**\n * Behavior wrapper: makes its child resizable via 8-direction handles. The\n * wrapper itself is `display: inline-block; position: relative` so the child\n * can be ANY element (no need for the child to know it's wrapped). Handles\n * are absolutely positioned over the wrapper's edges.\n *\n * Composable: stack with `IrisMovable` / `IrisHotkey` / `IrisClickOutside`\n * for richer interactions on the same wrapped UI.\n *\n * @example\n * <IrisResizable defaultSize={{ width: 400, height: 300 }}>\n * <IrisList items={items} />\n * </IrisResizable>\n */\nexport function IrisResizable({\n size: sizeProp,\n defaultSize = { width: 200, height: 200 },\n onSizeChange,\n onResizeStart,\n onResizeEnd,\n handles = ALL_HANDLES,\n minWidth = 40,\n minHeight = 40,\n maxWidth = Infinity,\n maxHeight = Infinity,\n keepAspect = false,\n disabled = false,\n style,\n children,\n ...rest\n}: IrisResizableProps): React.ReactElement {\n const isControlled = sizeProp !== undefined\n const [internal, setInternal] = React.useState(defaultSize)\n const size = isControlled ? (sizeProp as IrisResizableSize) : internal\n const sizeRef = React.useRef(size)\n sizeRef.current = size\n\n const setSize = React.useCallback(\n (next: IrisResizableSize) => {\n if (!isControlled) setInternal(next)\n onSizeChange?.(next)\n },\n [isControlled, onSizeChange],\n )\n\n return (\n <div\n {...rest}\n data-iris-resizable=\"\"\n data-state={disabled ? 'disabled' : 'idle'}\n style={{\n position: 'relative',\n display: 'inline-block',\n width: size.width,\n height: size.height,\n ...style,\n }}\n >\n {children}\n {handles.map((h) => (\n <Handle\n key={h}\n handle={h}\n disabled={disabled}\n keepAspect={keepAspect}\n sizeRef={sizeRef}\n minWidth={minWidth}\n minHeight={minHeight}\n maxWidth={maxWidth}\n maxHeight={maxHeight}\n onUpdate={setSize}\n onResizeStart={onResizeStart}\n onResizeEnd={onResizeEnd}\n />\n ))}\n </div>\n )\n}\n","import * as React from 'react'\nimport { useDrag } from '../primitives/drag/useDrag'\n\nexport interface IrisMovablePosition {\n x: number\n y: number\n}\n\nexport interface IrisMovableBounds {\n minX?: number\n maxX?: number\n minY?: number\n maxY?: number\n}\n\nexport interface IrisMovableProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue' | 'onDragStart' | 'onDragEnd'\n> {\n position?: IrisMovablePosition\n defaultPosition?: IrisMovablePosition\n onPositionChange?: (next: IrisMovablePosition) => void\n onDragStart?: (start: IrisMovablePosition) => void\n onDragEnd?: (end: IrisMovablePosition) => void\n bounds?: IrisMovableBounds\n /** Restrict drag origination to a child element marked `data-iris-movable-handle`. */\n byHandle?: boolean\n disabled?: boolean\n children?: React.ReactNode\n}\n\n/**\n * Behavior wrapper: makes its child draggable. Position is `transform`-based\n * (no layout thrash). The whole wrapper drags by default; pass `byHandle`\n * and put `data-iris-movable-handle=\"\"` on a descendant (e.g. a title bar)\n * to restrict the drag origin.\n *\n * The wrapper renders `position: absolute` at its parent's top-left — wrap\n * inside a `position: relative` container for predictable layout.\n *\n * @example\n * <div style={{ position: 'relative', height: 500 }}>\n * <IrisMovable defaultPosition={{ x: 20, y: 20 }} byHandle>\n * <div>\n * <div data-iris-movable-handle>Drag me by this title bar</div>\n * <IrisList items={items} />\n * </div>\n * </IrisMovable>\n * </div>\n */\nexport function IrisMovable({\n position: positionProp,\n defaultPosition = { x: 0, y: 0 },\n onPositionChange,\n onDragStart,\n onDragEnd,\n bounds = {},\n byHandle = false,\n disabled = false,\n style,\n children,\n ...rest\n}: IrisMovableProps): React.ReactElement {\n const isControlled = positionProp !== undefined\n const [internal, setInternal] = React.useState<IrisMovablePosition>(defaultPosition)\n const position = isControlled ? (positionProp as IrisMovablePosition) : internal\n const positionRef = React.useRef(position)\n positionRef.current = position\n\n const rootRef = React.useRef<HTMLDivElement | null>(null)\n const handleRef = React.useRef<HTMLElement | null>(null)\n const [dragging, setDragging] = React.useState(false)\n const startRef = React.useRef<IrisMovablePosition>({ x: 0, y: 0 })\n\n // If byHandle, locate `[data-iris-movable-handle]` inside the wrapper.\n React.useEffect(() => {\n if (!byHandle) return\n handleRef.current =\n rootRef.current?.querySelector<HTMLElement>('[data-iris-movable-handle]') ?? null\n })\n\n const dragTargetRef = byHandle\n ? (handleRef as React.MutableRefObject<HTMLElement | null>)\n : (rootRef as React.MutableRefObject<HTMLElement | null>)\n\n const clamp = (p: IrisMovablePosition): IrisMovablePosition => ({\n x: Math.max(bounds.minX ?? -Infinity, Math.min(bounds.maxX ?? Infinity, p.x)),\n y: Math.max(bounds.minY ?? -Infinity, Math.min(bounds.maxY ?? Infinity, p.y)),\n })\n\n const setPosition = (next: IrisMovablePosition) => {\n if (!isControlled) setInternal(next)\n onPositionChange?.(next)\n }\n\n useDrag({\n handle: dragTargetRef,\n disabled,\n onStart: () => {\n startRef.current = positionRef.current\n setDragging(true)\n onDragStart?.(positionRef.current)\n },\n onDrag: ({ dx, dy }) => {\n setPosition(clamp({ x: startRef.current.x + dx, y: startRef.current.y + dy }))\n },\n onEnd: () => {\n setDragging(false)\n onDragEnd?.(positionRef.current)\n },\n })\n\n return (\n <div\n {...rest}\n ref={rootRef}\n data-iris-movable=\"\"\n data-state={dragging ? 'dragging' : 'idle'}\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n transform: `translate3d(${position.x}px, ${position.y}px, 0)`,\n cursor: byHandle ? 'default' : disabled ? 'not-allowed' : 'grab',\n touchAction: 'none',\n ...style,\n }}\n >\n {children}\n </div>\n )\n}\n","import * as React from 'react'\n\nexport interface IrisHotkeyProps {\n /**\n * Shortcut or list of shortcuts. Format: `'Escape'`, `'Enter'`, `'Mod+s'`,\n * `'Shift+/'`. `Mod` matches Ctrl on Win/Linux and Cmd on macOS.\n */\n shortcut: string | string[]\n onTrigger: (event: KeyboardEvent) => void\n /** Disable the binding (no-op if true). */\n disabled?: boolean\n /**\n * Allow the hotkey to fire even when focus is inside an input / textarea /\n * contentEditable element. Default false (most apps want hotkeys to skip\n * while typing).\n */\n allowInInputs?: boolean\n /** Scope: 'document' (default) or 'window'. */\n scope?: 'document' | 'window'\n children?: React.ReactNode\n}\n\nfunction parseShortcut(spec: string): {\n key: string\n shift: boolean\n alt: boolean\n ctrlOrMeta: boolean\n ctrl: boolean\n meta: boolean\n} {\n const parts = spec.split('+').map((p) => p.trim())\n const key = parts[parts.length - 1]!.toLowerCase()\n const mods = new Set(parts.slice(0, -1).map((p) => p.toLowerCase()))\n return {\n key,\n shift: mods.has('shift'),\n alt: mods.has('alt') || mods.has('option'),\n ctrl: mods.has('ctrl') || mods.has('control'),\n meta: mods.has('meta') || mods.has('cmd') || mods.has('command'),\n ctrlOrMeta: mods.has('mod'),\n }\n}\n\nfunction isInputTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el) return false\n const tag = el.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true\n if (el.isContentEditable) return true\n return false\n}\n\nfunction matches(event: KeyboardEvent, parsed: ReturnType<typeof parseShortcut>): boolean {\n if (event.key.toLowerCase() !== parsed.key) return false\n if (parsed.shift !== event.shiftKey) return false\n if (parsed.alt !== event.altKey) return false\n if (parsed.ctrlOrMeta) {\n // Mod modifier matches ctrl OR meta — at least one must be down.\n if (!event.ctrlKey && !event.metaKey) return false\n } else {\n if (parsed.ctrl !== event.ctrlKey) return false\n if (parsed.meta !== event.metaKey) return false\n }\n return true\n}\n\n/**\n * Behavior wrapper: binds a global keyboard shortcut while children are\n * mounted. Renderless — returns children verbatim (no extra DOM).\n *\n * @example\n * <IrisHotkey shortcut=\"Escape\" onTrigger={close}>\n * <IrisDialog>…</IrisDialog>\n * </IrisHotkey>\n *\n * <IrisHotkey shortcut={['Mod+s', 'Mod+Shift+s']} onTrigger={save}>\n * <IrisForm>…</IrisForm>\n * </IrisHotkey>\n */\nexport function IrisHotkey({\n shortcut,\n onTrigger,\n disabled = false,\n allowInInputs = false,\n scope = 'document',\n children,\n}: IrisHotkeyProps): React.ReactElement {\n // Pin handler in a ref so re-renders don't re-bind the listener.\n const handlerRef = React.useRef(onTrigger)\n handlerRef.current = onTrigger\n const allowRef = React.useRef(allowInInputs)\n allowRef.current = allowInInputs\n\n React.useEffect(() => {\n if (disabled) return\n const specs = Array.isArray(shortcut) ? shortcut : [shortcut]\n const parsed = specs.map(parseShortcut)\n const target: EventTarget = scope === 'window' ? window : document\n\n const onKey = (event: Event) => {\n const e = event as KeyboardEvent\n if (!allowRef.current && isInputTarget(e.target)) return\n for (const p of parsed) {\n if (matches(e, p)) {\n handlerRef.current(e)\n return\n }\n }\n }\n target.addEventListener('keydown', onKey)\n return () => {\n target.removeEventListener('keydown', onKey)\n }\n }, [disabled, scope, ...(Array.isArray(shortcut) ? shortcut : [shortcut])])\n\n return <>{children}</>\n}\n","import * as React from 'react'\n\nexport interface IrisClickOutsideProps {\n onOutside: (event: PointerEvent) => void\n /** Disable detection (no-op if true). */\n disabled?: boolean\n /**\n * Additional refs whose elements are also treated as \"inside\" (clicks\n * against them won't fire `onOutside`). Useful for trigger buttons that\n * live outside the wrapper but should still keep it open.\n */\n ignore?: Array<React.RefObject<HTMLElement | null>>\n children?: React.ReactNode\n}\n\n/**\n * Behavior wrapper: fires `onOutside` when a pointerdown happens outside\n * the wrapped child tree. Renders a thin `<span style=\"display:contents\">`\n * to capture the child's bounding box without disrupting layout.\n *\n * @example\n * <IrisClickOutside onOutside={() => setOpen(false)}>\n * <IrisPopoverContent>…</IrisPopoverContent>\n * </IrisClickOutside>\n */\nexport function IrisClickOutside({\n onOutside,\n disabled = false,\n ignore = [],\n children,\n}: IrisClickOutsideProps): React.ReactElement {\n const wrapperRef = React.useRef<HTMLSpanElement | null>(null)\n // Pin callback in ref so re-renders don't churn the listener.\n const onOutsideRef = React.useRef(onOutside)\n onOutsideRef.current = onOutside\n\n React.useEffect(() => {\n if (disabled) return\n const handler = (event: PointerEvent) => {\n const target = event.target as Node | null\n if (!target) return\n const wrapper = wrapperRef.current\n // wrapper is display:contents, so itself doesn't contain anything;\n // walk via Element.contains on the first interactive ancestor.\n // Easiest: check against the bounding tree by re-querying children.\n if (wrapper) {\n let node: Node | null = target\n while (node) {\n if (node === wrapper) return\n // Check if `node` is one of the wrapper's *rendered* children. We\n // approximate by checking parent chain against wrapper.\n if ((node as HTMLElement).parentNode === wrapper) return\n node = node.parentNode\n }\n }\n // Also \"ignore\" listed refs.\n for (const ref of ignore) {\n const el = ref.current\n if (el && el.contains(target)) return\n }\n onOutsideRef.current(event)\n }\n document.addEventListener('pointerdown', handler)\n return () => {\n document.removeEventListener('pointerdown', handler)\n }\n }, [disabled, ignore])\n\n return (\n <span ref={wrapperRef} data-iris-click-outside=\"\" style={{ display: 'contents' }}>\n {children}\n </span>\n )\n}\n","/**\n * Behavior wrapper: detects a press-and-hold gesture on the wrapped element.\n * Fires `onLongPress` when the pointer is held down for `holdDelay` ms.\n * Wraps children in a `display: contents` span so event bubbling works.\n *\n * Composable: stack with `IrisMovable` / `IrisResizable` / `IrisSortable` /\n * `IrisHotkey` for richer interactions.\n *\n * @example\n * <IrisLongPress holdDelay={500} onLongPress={() => setOpen(true)}>\n * <img src=\"thumbnail.jpg\" alt=\"Hold to preview\" />\n * </IrisLongPress>\n */\nimport * as React from 'react'\nimport { createLongPress } from '@iris-ui-kit/core'\n\nexport interface IrisLongPressProps {\n /** Time in ms the pointer must be held before `onLongPress` fires. */\n holdDelay?: number\n /** Called once when the hold reaches `holdDelay`. */\n onLongPress: () => void\n disabled?: boolean\n children?: React.ReactNode\n}\n\nexport function IrisLongPress({\n holdDelay = 500,\n onLongPress,\n disabled = false,\n children,\n}: IrisLongPressProps): React.ReactElement {\n const handlerRef = React.useRef(onLongPress)\n handlerRef.current = onLongPress\n\n const ctrl = React.useMemo(\n () =>\n createLongPress({\n holdDelay,\n onLongPress: () => handlerRef.current(),\n }),\n [holdDelay],\n )\n\n const onPointerDown_ = (_e: React.PointerEvent) => {\n if (disabled) return\n ctrl.press()\n }\n\n const onPointerUp_ = () => {\n ctrl.release()\n }\n\n const onPointerLeave_ = () => {\n ctrl.cancel()\n }\n\n return (\n <span\n data-iris-long-press=\"\"\n onPointerDown={onPointerDown_}\n onPointerUp={onPointerUp_}\n onPointerLeave={onPointerLeave_}\n style={{ display: 'contents' }}\n >\n {children}\n </span>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
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-OD2O3BPM.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: '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 ? '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 { 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","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"]}
|