@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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/primitives/icon/Icon.tsx","../src/admin/NavMenu.tsx","../src/primitives/breadcrumb/Breadcrumb.tsx","../src/primitives/breadcrumb/BreadcrumbItem.tsx","../src/admin/AdminBreadcrumb.tsx","../src/admin/useTabsNav.ts","../src/useMachine.ts","../src/primitives/dropdown/context.ts","../src/primitives/dropdown/Dropdown.tsx","../src/primitives/slot/Slot.tsx","../src/primitives/dropdown/DropdownTrigger.tsx","../src/primitives/dropdown/DropdownMenu.tsx","../src/primitives/dropdown/DropdownItem.tsx","../src/admin/AdminTabs.tsx","../src/admin/useAdminShell.ts","../src/admin/AdminLayout.tsx","../src/admin/useAdminPreferences.ts"],"names":["React","React2","jsx","jsxs","React3","IrisBreadcrumb","React4","IrisBreadcrumbItem","React5","React7","IrisSlot","React8","IrisDropdownTrigger","composeEventHandlers","React9","IrisDropdownMenu","React10","IrisDropdownItem","IrisDropdownSeparator","React11","Fragment","React12","findNavPath","React13","React14"],"mappings":"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","file":"chunk-KRFZ5KL4.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 ? opts.hovered && !opts.disabled\n ? 'var(--iris-nav-item-active-hover, color-mix(in srgb, var(--iris-primary) 88%, black))'\n : 'var(--iris-primary)'\n : opts.hovered && !opts.disabled\n ? 'var(--iris-surface-hover, var(--iris-surface))'\n : 'transparent',\n color: opts.active\n ? 'var(--iris-primary-foreground, #fff)'\n : opts.trail\n ? 'var(--iris-primary)'\n : 'var(--iris-foreground)',\n font: 'inherit',\n fontSize: 'var(--iris-font-size-md, 14px)',\n fontWeight: opts.active || opts.trail ? 600 : 400,\n textAlign: 'start',\n cursor: opts.disabled ? 'not-allowed' : 'pointer',\n opacity: opts.disabled ? 0.5 : 1,\n padding: collapsed ? 10 : 'var(--iris-space-xs, 8px) var(--iris-space-sm, 12px)',\n paddingInlineStart: collapsed ? 10 : 12 + opts.depth * 16,\n justifyContent: collapsed ? 'center' : 'flex-start',\n })\n\n const iconNode = (node: NavNode, size = 18): React.ReactElement | null =>\n node.icon ? <IrisIcon name={node.icon} size={size} /> : null\n\n const badgeNode = (node: NavNode): React.ReactElement | null =>\n node.badge !== undefined && node.badge !== '' && !collapsed ? (\n <span\n data-iris-nav-badge=\"\"\n style={{\n marginInlineStart: 'auto',\n fontSize: 'var(--iris-font-size-xs, 12px)',\n lineHeight: 1,\n padding: 'var(--iris-space-xxs, 4px) var(--iris-padding-sm, 6px)',\n borderRadius: 999,\n background: 'var(--iris-danger, #ef4444)',\n color: 'var(--iris-primary-foreground, #fff)',\n }}\n >\n {String(node.badge)}\n </span>\n ) : null\n\n const hoverProps = (key: string) => ({\n onMouseEnter: () => setHovered(key),\n onMouseLeave: () => setHovered((h) => (h === key ? null : h)),\n })\n\n // Collapsed rail: top-level items only, icon + native tooltip; branch → first leaf.\n const renderCollapsed = (node: NavNode): React.ReactElement => {\n const branch = isBranch(node)\n const active = branch ? activePath.includes(node.key) : node.key === activeKey\n return (\n <button\n key={node.key}\n type=\"button\"\n data-iris-nav-item=\"\"\n data-key={node.key}\n data-active={active ? 'true' : undefined}\n data-branch={branch ? 'true' : undefined}\n disabled={node.disabled}\n title={node.title}\n aria-label={branch ? `${node.title} (section)` : node.title}\n aria-current={active && !branch ? 'page' : undefined}\n style={itemStyle({\n depth: 0,\n active,\n trail: false,\n disabled: !!node.disabled,\n hovered: hovered === node.key,\n })}\n {...hoverProps(node.key)}\n onClick={() => select(branch ? firstLeaf(node) : node)}\n >\n {iconNode(node, 20) ?? <span style={{ fontWeight: 700 }}>{node.title.charAt(0)}</span>}\n </button>\n )\n }\n\n const renderItem = (node: NavNode, depth: number): React.ReactElement => {\n const branch = isBranch(node)\n const open = expanded.includes(node.key)\n const active = node.key === activeKey\n const trail = branch && activePath.includes(node.key)\n\n const row = (\n <button\n type=\"button\"\n data-iris-nav-item=\"\"\n data-key={node.key}\n data-branch={branch ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n data-open={branch && open ? 'true' : undefined}\n data-depth={String(depth)}\n disabled={node.disabled}\n aria-expanded={branch ? (open ? 'true' : 'false') : undefined}\n aria-current={active ? 'page' : undefined}\n style={itemStyle({\n depth,\n active,\n trail,\n disabled: !!node.disabled,\n hovered: hovered === node.key,\n })}\n {...hoverProps(node.key)}\n onClick={() => (branch ? toggle(node.key) : select(node))}\n >\n {iconNode(node)}\n <span\n style={{\n flex: branch ? 1 : '0 1 auto',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {node.title}\n </span>\n {badgeNode(node)}\n {branch ? (\n <IrisIcon\n name={open ? 'chevron-down' : 'chevron-right'}\n size={16}\n style={{ marginInlineStart: node.badge ? 6 : 'auto', opacity: 0.6 }}\n />\n ) : null}\n </button>\n )\n\n if (!branch || !open) {\n return (\n <div\n key={node.key}\n data-iris-nav-group={branch ? '' : undefined}\n style={{ position: horizontal && depth === 0 ? 'relative' : undefined }}\n >\n {row}\n </div>\n )\n }\n return (\n <div\n key={node.key}\n data-iris-nav-group=\"\"\n data-open=\"true\"\n style={{ position: horizontal && depth === 0 ? 'relative' : undefined }}\n >\n {row}\n <div\n data-iris-nav-children=\"\"\n role=\"group\"\n style={\n horizontal && depth === 0\n ? {\n position: 'absolute',\n insetBlockStart: 'calc(100% + 4px)',\n insetInlineStart: 0,\n zIndex: 60,\n minWidth: 220,\n padding: 'var(--iris-space-xs, 8px)',\n border: '1px solid var(--iris-border)',\n borderRadius: 'var(--iris-radius-md, 6px)',\n background: 'var(--iris-surface)',\n boxShadow: 'var(--iris-shadow-md)',\n }\n : undefined\n }\n >\n {(node.children ?? []).map((child) => renderItem(child, depth + 1))}\n </div>\n </div>\n )\n }\n\n // Arrow-key navigation over the visible items (Tab still works as a fallback).\n const onKeyDown = (e: React.KeyboardEvent<HTMLElement>): void => {\n const root = e.currentTarget\n const buttons = Array.from(root.querySelectorAll<HTMLElement>('[data-iris-nav-item]'))\n if (buttons.length === 0) return\n const idx = buttons.indexOf(document.activeElement as HTMLElement)\n const focusAt = (i: number): void => buttons[(i + buttons.length) % buttons.length]?.focus()\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n return focusAt(idx < 0 ? 0 : idx + 1)\n case 'ArrowUp':\n e.preventDefault()\n return focusAt(idx < 0 ? buttons.length - 1 : idx - 1)\n case 'Home':\n e.preventDefault()\n return void buttons[0]?.focus()\n case 'End':\n e.preventDefault()\n return void buttons[buttons.length - 1]?.focus()\n }\n\n if (collapsed || idx < 0) return\n const key = buttons[idx]?.getAttribute('data-key')\n if (!key) return\n const node = findNavNode(items, key)\n\n if (e.key === 'ArrowRight' && node && isBranch(node)) {\n e.preventDefault()\n if (!expanded.includes(key)) toggle(key)\n else focusAt(idx + 1)\n } else if (e.key === 'ArrowLeft') {\n if (node && isBranch(node) && expanded.includes(key)) {\n e.preventDefault()\n toggle(key)\n } else {\n const parentKey = findNavPath(items, key).at(-2)?.key\n if (parentKey) {\n e.preventDefault()\n buttons.find((b) => b.getAttribute('data-key') === parentKey)?.focus()\n }\n }\n }\n }\n\n return (\n <nav\n data-iris-nav-menu=\"\"\n data-collapsed={collapsed ? 'true' : undefined}\n data-orientation={orientation}\n aria-label={ariaLabel ?? t('admin.nav')}\n onKeyDown={onKeyDown}\n style={{\n display: 'flex',\n flexDirection: horizontal ? 'row' : 'column',\n alignItems: horizontal ? 'center' : undefined,\n gap: 'var(--iris-space-xxs, 4px)',\n }}\n >\n {collapsed\n ? tree.map((node) => renderCollapsed(node))\n : tree.map((node) => renderItem(node, 0))}\n </nav>\n )\n}\n","import * as React from 'react'\nimport { useI18n } from '../../i18n'\n\nexport interface IrisBreadcrumbProps extends React.HTMLAttributes<HTMLElement> {\n /** String separator between crumbs. Default `/`. */\n separator?: React.ReactNode\n children?: React.ReactNode\n}\n\n/**\n * Container for breadcrumb navigation. Renders a `<nav>` with an `<ol>` per\n * WAI-ARIA. Inserts `separator` between items and tags the last child with\n * `isCurrent` so it renders as plain text + `aria-current=\"page\"`.\n */\nexport const IrisBreadcrumb = React.forwardRef<HTMLElement, IrisBreadcrumbProps>(\n function IrisBreadcrumb({ separator = '/', children, ...rest }, ref) {\n const { t } = useI18n()\n const flat = React.Children.toArray(children).filter((c) =>\n React.isValidElement(c),\n ) as React.ReactElement[]\n const total = flat.length\n\n return (\n <nav\n {...rest}\n ref={ref as React.Ref<HTMLElement>}\n aria-label={t('breadcrumb.label')}\n data-iris-breadcrumb=\"\"\n >\n <ol\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--iris-space-xs, 8px)',\n margin: 0,\n padding: 0,\n listStyle: 'none',\n fontSize: 'var(--iris-font-size-md, 14px)',\n }}\n >\n {flat.map((child, i) => {\n const isLast = i === total - 1\n const itemNode = (\n <li\n key={`item-${i}`}\n data-iris-breadcrumb-item=\"\"\n data-iris-breadcrumb-last={isLast ? 'true' : undefined}\n style={{ display: 'inline-flex', alignItems: 'center' }}\n >\n {React.cloneElement(child, {\n isCurrent: isLast,\n } as Partial<unknown> as React.Attributes)}\n </li>\n )\n const sepNode = !isLast ? (\n <li\n key={`sep-${i}`}\n data-iris-breadcrumb-separator=\"\"\n aria-hidden=\"true\"\n style={{ color: 'var(--iris-muted)', display: 'inline-flex', alignItems: 'center' }}\n >\n {separator}\n </li>\n ) : null\n return (\n <React.Fragment key={`pair-${i}`}>\n {itemNode}\n {sepNode}\n </React.Fragment>\n )\n })}\n </ol>\n </nav>\n )\n },\n)\n","import * as React from 'react'\n\nexport interface IrisBreadcrumbItemProps extends React.HTMLAttributes<HTMLElement> {\n href?: string\n /** Internal: set by parent `IrisBreadcrumb` when this is the last item. */\n isCurrent?: boolean\n children?: React.ReactNode\n}\n\n/**\n * A single breadcrumb crumb. Renders an `<a>` when `href` is given and the\n * crumb is not the last one; otherwise a `<span>`. The `isCurrent` flag is\n * set automatically by the parent `IrisBreadcrumb` based on position.\n */\nexport const IrisBreadcrumbItem = React.forwardRef<HTMLElement, IrisBreadcrumbItemProps>(\n function IrisBreadcrumbItem({ href, isCurrent = false, style, children, ...rest }, ref) {\n const baseStyle: React.CSSProperties = {\n color: isCurrent ? 'var(--iris-muted)' : 'var(--iris-primary)',\n textDecoration: 'none',\n cursor: isCurrent ? 'default' : href ? 'pointer' : 'default',\n }\n\n const common = {\n ...rest,\n 'aria-current': isCurrent ? ('page' as const) : undefined,\n 'data-iris-breadcrumb-crumb': '',\n style: { ...baseStyle, ...style },\n }\n\n if (href && !isCurrent) {\n return (\n <a {...common} ref={ref as React.Ref<HTMLAnchorElement>} href={href}>\n {children}\n </a>\n )\n }\n return (\n <span {...common} ref={ref as React.Ref<HTMLSpanElement>}>\n {children}\n </span>\n )\n },\n)\n","import * as React from 'react'\nimport type { NavNode } from '@iris-ui-kit/core'\nimport { IrisBreadcrumb } from '../primitives/breadcrumb/Breadcrumb'\nimport { IrisBreadcrumbItem } from '../primitives/breadcrumb/BreadcrumbItem'\nimport { IrisIcon } from '../primitives/icon/Icon'\n\nexport interface IrisAdminBreadcrumbProps {\n /** Root→current ancestor chain (typically `findNavPath(menus, activeKey)`). */\n trail: NavNode[]\n /** Show each node's icon before its title. */\n showIcon?: boolean\n /** Hide the breadcrumb when the trail has a single crumb. */\n hideSingle?: boolean\n separator?: string\n onSelect?: (key: string, node: NavNode) => void\n}\n\n/**\n * Breadcrumb trail for the admin header, driven by a `NavNode[]` ancestor chain.\n * The last crumb is the current page (auto-marked `aria-current` by\n * IrisBreadcrumb); earlier crumbs are clickable and call `onSelect(key, node)`.\n * React port of the Vue `IrisAdminBreadcrumb`.\n */\nexport function IrisAdminBreadcrumb({\n trail,\n showIcon = true,\n hideSingle = false,\n separator = '/',\n onSelect,\n}: IrisAdminBreadcrumbProps): React.ReactElement | null {\n if (trail.length === 0 || (hideSingle && trail.length === 1)) return null\n\n return (\n <IrisBreadcrumb separator={separator}>\n {trail.map((node, i) => {\n const last = i === trail.length - 1\n return (\n <IrisBreadcrumbItem\n key={node.key}\n data-iris-admin-crumb=\"\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n cursor: last ? 'default' : 'pointer',\n }}\n onClick={last ? undefined : () => onSelect?.(node.key, node)}\n >\n {showIcon && node.icon ? (\n <IrisIcon name={node.icon} size={14} style={{ marginInlineEnd: 4 }} />\n ) : null}\n <span>{node.title}</span>\n </IrisBreadcrumbItem>\n )\n })}\n </IrisBreadcrumb>\n )\n}\n","import { useStore } from '../useStore'\nimport type { TabsNav, TabItem } from '@iris-ui-kit/core'\n\nexport interface UseTabsNavReturn {\n tabs: TabItem[]\n activeKey: string | undefined\n /** Keep-alive include-set (composite cache keys of all open tabs). */\n cacheKeys: string[]\n open: TabsNav['open']\n activate: TabsNav['activate']\n close: TabsNav['close']\n closeOthers: TabsNav['closeOthers']\n closeAll: TabsNav['closeAll']\n closeLeft: TabsNav['closeLeft']\n closeRight: TabsNav['closeRight']\n refresh: TabsNav['refresh']\n setPinned: TabsNav['setPinned']\n move: TabsNav['move']\n cacheKey: TabsNav['cacheKey']\n}\n\n/**\n * React binding for a framework-agnostic {@link TabsNav} store. Pass a shared\n * `createTabsNav()` instance (the host owns it so the tab bar and the keep-alive\n * content read the same state) and get the reactive `tabs` / `activeKey` /\n * `cacheKeys` plus the store's mutators — bridged via `useStore`\n * (`useSyncExternalStore`), mirroring the Vue adapter.\n *\n * ```tsx\n * const nav = createTabsNav({ tabs: [{ key: 'home', title: 'Home', pinned: true }] })\n * const { tabs, activeKey, open, close } = useTabsNav(nav)\n * ```\n */\nexport function useTabsNav(nav: TabsNav): UseTabsNavReturn {\n const state = useStore(nav.store)\n return {\n tabs: state.tabs,\n activeKey: state.activeKey,\n cacheKeys: state.tabs.map((t) => nav.cacheKey(t.key)),\n open: nav.open,\n activate: nav.activate,\n close: nav.close,\n closeOthers: nav.closeOthers,\n closeAll: nav.closeAll,\n closeLeft: nav.closeLeft,\n closeRight: nav.closeRight,\n refresh: nav.refresh,\n setPinned: nav.setPinned,\n move: nav.move,\n cacheKey: nav.cacheKey,\n }\n}\n","import { useMemo } from 'react'\nimport type { Machine, MachineEvent, MachineState } from '@iris-ui-kit/core'\nimport { useStore } from './useStore'\n\n/**\n * Bridge a framework-agnostic `Machine` into React. Returns `[state, send]`\n * — `state` is reactive (re-renders on transition) and `send` is stable\n * across renders.\n *\n * Pass a **factory** (`() => createMachine(...)`) so each component instance\n * gets its own machine. Internally memoised so re-renders don't re-create.\n */\nexport function useMachine<TState extends string, TContext, TEvent extends MachineEvent>(\n factory: () => Machine<TState, TContext, TEvent>,\n): [MachineState<TState, TContext>, (event: TEvent) => void] {\n const machine = useMemo(factory, [])\n const state = useStore(machine.store)\n return [state, machine.send]\n}\n","import * as React from 'react'\nimport type { Placement } from '@iris-ui-kit/core'\n\nexport interface DropdownContextValue {\n open: boolean\n setOpen: (next: boolean) => void\n triggerRef: React.MutableRefObject<HTMLElement | null>\n contentRef: React.MutableRefObject<HTMLElement | null>\n contentId: string\n placement: Placement\n offset: number\n}\n\nexport const DropdownContext = React.createContext<DropdownContextValue | null>(null)\n\nexport function useDropdownContext(componentName: string): DropdownContextValue {\n const ctx = React.useContext(DropdownContext)\n if (!ctx) {\n throw new Error(`[iris-ui] ${componentName} must be a descendant of <IrisDropdown>`)\n }\n return ctx\n}\n","import * as React from 'react'\nimport { createFloatingMachine, type Placement } from '@iris-ui-kit/core'\nimport { useMachine } from '../../useMachine'\nimport { DropdownContext } from './context'\n\nexport interface IrisDropdownProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: Placement\n offset?: number\n children?: React.ReactNode\n}\n\n/**\n * Dropdown menu root. Composes `createFloatingMachine` (state) with\n * `useFloating` (positioning) used in `IrisDropdownMenu`. The dropdown\n * panel's semantics differ from a popover: it uses `role=\"menu\"`, supports\n * arrow-key navigation, and items auto-close the menu on select.\n *\n * @example\n * <IrisDropdown placement=\"bottom-end\">\n * <IrisDropdownTrigger>Actions</IrisDropdownTrigger>\n * <IrisDropdownMenu>\n * <IrisDropdownItem onSelect={onCopy}>Copy</IrisDropdownItem>\n * <IrisDropdownItem onSelect={onDelete}>Delete</IrisDropdownItem>\n * </IrisDropdownMenu>\n * </IrisDropdown>\n */\nexport function IrisDropdown({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n placement = 'bottom-start',\n offset = 6,\n children,\n}: IrisDropdownProps): React.ReactElement {\n const isControlled = openProp !== undefined\n\n const [state, send] = useMachine(() => createFloatingMachine(defaultOpen ? 'open' : 'closed'))\n const internalOpen = state.value === 'open'\n\n React.useEffect(() => {\n if (!isControlled) return\n const target = openProp ? 'open' : 'closed'\n if (state.value !== target) {\n send({ type: openProp ? 'OPEN' : 'CLOSE' })\n }\n }, [isControlled, openProp, state.value, send])\n\n const open = isControlled ? Boolean(openProp) : internalOpen\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (!isControlled) send({ type: next ? 'OPEN' : 'CLOSE' })\n onOpenChange?.(next)\n },\n [isControlled, send, onOpenChange],\n )\n\n const triggerRef = React.useRef<HTMLElement | null>(null)\n const contentRef = React.useRef<HTMLElement | null>(null)\n const contentId = React.useId()\n\n const value = React.useMemo(\n () => ({\n open,\n setOpen,\n triggerRef,\n contentRef,\n contentId,\n placement,\n offset,\n }),\n [open, setOpen, contentId, placement, offset],\n )\n\n return <DropdownContext.Provider value={value}>{children}</DropdownContext.Provider>\n}\n","import * as React from 'react'\nimport { composeEventHandlers } from '@iris-ui-kit/core'\n\ntype AnyProps = Record<string, unknown>\n\nexport interface IrisSlotProps {\n children?: React.ReactNode\n [key: string]: unknown\n}\n\nfunction mergeRefs<T>(...refs: Array<React.Ref<T> | undefined | null>): React.RefCallback<T> {\n return (value: T | null) => {\n for (const ref of refs) {\n if (!ref) continue\n if (typeof ref === 'function') ref(value)\n else (ref as React.MutableRefObject<T | null>).current = value\n }\n }\n}\n\nfunction isEventHandlerName(key: string): boolean {\n return /^on[A-Z]/.test(key)\n}\n\nfunction mergeSlotProps(slot: AnyProps, child: AnyProps): AnyProps {\n const merged: AnyProps = { ...slot }\n for (const key of Object.keys(child)) {\n const slotValue = slot[key]\n const childValue = child[key]\n if (key === 'style') {\n merged.style = {\n ...((slotValue as React.CSSProperties | undefined) ?? {}),\n ...((childValue as React.CSSProperties | undefined) ?? {}),\n }\n } else if (key === 'className') {\n merged.className = [slotValue, childValue].filter(Boolean).join(' ').trim() || undefined\n } else if (\n isEventHandlerName(key) &&\n typeof slotValue === 'function' &&\n typeof childValue === 'function'\n ) {\n merged[key] = composeEventHandlers(\n slotValue as (e: React.SyntheticEvent) => void,\n childValue as (e: React.SyntheticEvent) => void,\n )\n } else if (childValue !== undefined) {\n merged[key] = childValue\n }\n }\n return merged\n}\n\n/**\n * asChild composition primitive: clones the single React element child and\n * merges the Slot's own props into it. `style` shallow-merges, `className`\n * concatenates, event handlers compose (Slot's first, then child's), and any\n * other prop on the child wins over Slot's. Used as a building block for\n * trigger primitives that want to render-as the consumer's chosen element.\n */\nexport const IrisSlot = React.forwardRef<unknown, IrisSlotProps>(function IrisSlot(\n { children, ...slotProps },\n forwardedRef,\n) {\n if (!React.isValidElement(children)) return null\n const child = children as React.ReactElement<AnyProps>\n const childProps = (child.props ?? {}) as AnyProps\n const merged = mergeSlotProps(slotProps as AnyProps, childProps)\n\n const childRef = (child as unknown as { ref?: React.Ref<unknown> }).ref ?? null\n if (forwardedRef || childRef) {\n ;(merged as { ref?: React.Ref<unknown> }).ref = mergeRefs(\n forwardedRef as React.Ref<unknown>,\n childRef,\n )\n }\n\n return React.cloneElement(child, merged as Partial<AnyProps> & React.Attributes)\n})\n","import * as React from 'react'\nimport { composeEventHandlers } from '@iris-ui-kit/core'\nimport { IrisSlot } from '../slot/Slot'\nimport { useDropdownContext } from './context'\n\nexport interface IrisDropdownTriggerProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'children'\n> {\n asChild?: boolean\n children?: React.ReactNode\n}\n\n/**\n * The trigger element that toggles the dropdown open/closed on click or\n * ArrowDown/Enter/Space. Renders as a `<button>` (or custom element via\n * `asChild`) with `aria-haspopup=\"menu\"` and `aria-expanded`.\n */\nexport const IrisDropdownTrigger = React.forwardRef<HTMLElement, IrisDropdownTriggerProps>(\n function IrisDropdownTrigger(\n { asChild = false, onClick, onKeyDown, children, ...rest },\n forwardedRef,\n ) {\n const ctx = useDropdownContext('IrisDropdownTrigger')\n\n const captureRef = React.useCallback(\n (el: HTMLElement | null) => {\n ctx.triggerRef.current = el\n if (typeof forwardedRef === 'function') forwardedRef(el)\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLElement | null>).current = el\n },\n [ctx, forwardedRef],\n )\n\n const handleClick = composeEventHandlers(\n onClick as ((e: React.MouseEvent<HTMLElement>) => void) | undefined,\n () => ctx.setOpen(!ctx.open),\n )\n\n // ArrowDown/Enter/Space open the menu (which then focuses its first item),\n // matching the Vue dropdown trigger + the WAI-ARIA menu-button pattern.\n const handleKeyDown = composeEventHandlers(\n onKeyDown as ((e: React.KeyboardEvent<HTMLElement>) => void) | undefined,\n (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n ctx.setOpen(true)\n }\n },\n )\n\n const triggerProps = {\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': ctx.open,\n 'aria-controls': ctx.contentId,\n 'data-state': ctx.open ? 'open' : 'closed',\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n }\n\n if (asChild) {\n if (!React.isValidElement(children)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[iris-ui] IrisDropdownTrigger asChild requires a single React element')\n }\n return null\n }\n return (\n <IrisSlot ref={captureRef as React.Ref<unknown>} {...rest} {...triggerProps}>\n {children}\n </IrisSlot>\n )\n }\n\n return (\n <button\n type=\"button\"\n {...(rest as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n {...triggerProps}\n ref={captureRef as React.Ref<HTMLButtonElement>}\n >\n {children}\n </button>\n )\n },\n)\n","import * as React from 'react'\nimport { 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"]}
@@ -40,6 +40,7 @@ function useGroupedView(config) {
40
40
  return React2.useMemo(
41
41
  () => ({
42
42
  store: controller.store,
43
+ expansion: controller.expansion,
43
44
  setRows,
44
45
  toggleGroup,
45
46
  expandGroup,
@@ -64,5 +65,5 @@ function useGroupedView(config) {
64
65
  }
65
66
 
66
67
  export { useDataSource, useGroupedView };
67
- //# sourceMappingURL=chunk-53KFLVIZ.js.map
68
- //# sourceMappingURL=chunk-53KFLVIZ.js.map
68
+ //# sourceMappingURL=chunk-QZJXMCRR.js.map
69
+ //# sourceMappingURL=chunk-QZJXMCRR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data/useDataSource.ts","../src/data/useGroupedView.ts"],"names":["React"],"mappings":"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","file":"chunk-QZJXMCRR.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 extends string | number = string> {\n /** Subscribable store with the full grouped state. */\n store: ReturnType<typeof createGroupedView<Row, K>>['store']\n /** The composed expansion model (multiple-open) — bridge it like IrisTable does: `useStore(expansion.store)`. */\n expansion: ReturnType<typeof createGroupedView<Row, K>>['expansion']\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 extends string | number = 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 expansion: controller.expansion,\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,9 +1,9 @@
1
1
  'use client'
2
+ import { IrisSortable } from './chunk-K2F7SC2T.js';
2
3
  import * as React3 from 'react';
3
4
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
- import { createLongPress } from '@iris-ui-kit/core';
5
+ import { createLongPress, composeFeatures, hasComposableFeatures } from '@iris-ui-kit/core';
5
6
 
6
- // src/behaviors/Resizable.tsx
7
7
  function useDrag(options) {
8
8
  const { handle, buttons = [0], onStart, onDrag, onEnd, disabled = false } = options;
9
9
  const latest = React3.useRef({ onStart, onDrag, onEnd, disabled, buttons });
@@ -439,7 +439,51 @@ function IrisLongPress({
439
439
  }
440
440
  );
441
441
  }
442
+ function IrisCompose({
443
+ resizable,
444
+ movable,
445
+ sortable,
446
+ clickOutside,
447
+ hotkey,
448
+ children,
449
+ className,
450
+ style
451
+ }) {
452
+ const features = {
453
+ resizable,
454
+ movable,
455
+ sortable,
456
+ clickOutside,
457
+ hotkey
458
+ };
459
+ const active = composeFeatures(features);
460
+ let node = /* @__PURE__ */ jsx(Fragment, { children });
461
+ if (!hasComposableFeatures(features)) {
462
+ return /* @__PURE__ */ jsx(Fragment, { children });
463
+ }
464
+ for (const feature of active) {
465
+ switch (feature) {
466
+ case "hotkey":
467
+ if (hotkey) node = /* @__PURE__ */ jsx(IrisHotkey, { ...hotkey, children: node });
468
+ break;
469
+ case "clickOutside":
470
+ if (clickOutside) node = /* @__PURE__ */ jsx(IrisClickOutside, { ...clickOutside, children: node });
471
+ break;
472
+ case "sortable":
473
+ if (sortable) node = /* @__PURE__ */ jsx(IrisSortable, { ...sortable, children: node });
474
+ break;
475
+ case "movable":
476
+ if (movable) node = /* @__PURE__ */ jsx(IrisMovable, { ...movable, children: node });
477
+ break;
478
+ case "resizable":
479
+ if (resizable)
480
+ node = /* @__PURE__ */ jsx(IrisResizable, { ...resizable, className, style, children: node });
481
+ break;
482
+ }
483
+ }
484
+ return node;
485
+ }
442
486
 
443
- export { IrisClickOutside, IrisHotkey, IrisLongPress, IrisMovable, IrisResizable, useDrag };
444
- //# sourceMappingURL=chunk-APA5KNCK.js.map
445
- //# sourceMappingURL=chunk-APA5KNCK.js.map
487
+ export { IrisClickOutside, IrisCompose, IrisHotkey, IrisLongPress, IrisMovable, IrisResizable, useDrag };
488
+ //# sourceMappingURL=chunk-ZE4GH2GV.js.map
489
+ //# sourceMappingURL=chunk-ZE4GH2GV.js.map
@@ -0,0 +1 @@
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","../src/behaviors/Compose.tsx"],"names":["React","React2","jsx","React4","React5","React6","Fragment"],"mappings":"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","file":"chunk-ZE4GH2GV.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","import * as React from 'react'\nimport { composeFeatures, hasComposableFeatures, type ComposableFeature } from '@iris-ui-kit/core'\nimport { IrisResizable, type IrisResizableProps } from './Resizable'\nimport { IrisMovable, type IrisMovableProps } from './Movable'\nimport { IrisSortable, type IrisSortableProps } from './Sortable'\nimport { IrisClickOutside, type IrisClickOutsideProps } from './ClickOutside'\nimport { IrisHotkey, type IrisHotkeyProps } from './Hotkey'\n\n/**\n * Capability composition interface — one declarative surface for composing\n * orthogonal capabilities onto any primitive without creating new components.\n *\n * ```tsx\n * <IrisCompose\n * resizable={{ defaultSize: { width: 320, height: 240 }, minWidth: 200 }}\n * sortable={{ items, onReorder }}\n * clickOutside={{ onOutside }}\n * hotkey={{ shortcut: 'Mod+k', onTrigger }}\n * >\n * <IrisList items={items} />\n * </IrisCompose>\n * ```\n *\n * Capabilities are optional; each is applied in the fixed core wrap order\n * (hotkey → clickOutside → sortable → movable → resizable). Internal\n * capabilities (virtual scrolling, multiple selection, roving) are component\n * props on the primitives themselves (e.g. `<IrisSelect virtual multiple>`).\n */\nexport interface IrisComposeProps {\n /** Resizable wrapper config (enables 8-direction resize). */\n resizable?: IrisResizableProps\n /** Movable wrapper config (drag positioning). */\n movable?: IrisMovableProps\n /** Sortable wrapper config (drag reorder of children). */\n sortable?: IrisSortableProps\n /** Click-outside detection. */\n clickOutside?: IrisClickOutsideProps\n /** Global keyboard shortcut binding. */\n hotkey?: IrisHotkeyProps\n children?: React.ReactNode\n className?: string\n style?: React.CSSProperties\n}\n\nexport function IrisCompose({\n resizable,\n movable,\n sortable,\n clickOutside,\n hotkey,\n children,\n className,\n style,\n}: IrisComposeProps): React.ReactElement {\n const features: Partial<Record<ComposableFeature, unknown>> = {\n resizable,\n movable,\n sortable,\n clickOutside,\n hotkey,\n }\n const active = composeFeatures(features)\n\n let node = <>{children}</>\n if (!hasComposableFeatures(features)) {\n return <>{children}</>\n }\n for (const feature of active) {\n switch (feature) {\n case 'hotkey':\n if (hotkey) node = <IrisHotkey {...hotkey}>{node}</IrisHotkey>\n break\n case 'clickOutside':\n if (clickOutside) node = <IrisClickOutside {...clickOutside}>{node}</IrisClickOutside>\n break\n case 'sortable':\n if (sortable) node = <IrisSortable {...sortable}>{node}</IrisSortable>\n break\n case 'movable':\n if (movable) node = <IrisMovable {...movable}>{node}</IrisMovable>\n break\n case 'resizable':\n if (resizable)\n node = (\n <IrisResizable {...resizable} className={className} style={style}>\n {node}\n </IrisResizable>\n )\n break\n }\n }\n return node as React.ReactElement\n}\n"]}
package/dist/data.cjs CHANGED
@@ -71,6 +71,7 @@ function useGroupedView(config) {
71
71
  return React3__namespace.useMemo(
72
72
  () => ({
73
73
  store: controller.store,
74
+ expansion: controller.expansion,
74
75
  setRows,
75
76
  toggleGroup,
76
77
  expandGroup,
package/dist/data.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useStore.ts","../src/data/useDataSource.ts","../src/data/useGroupedView.ts"],"names":["useSyncExternalStore","React2","createDataSource","React3","createGroupedView"],"mappings":"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","file":"data.cjs","sourcesContent":["import * as React from 'react'\nimport { useSyncExternalStore } from 'react'\nimport type { ReadonlyStore, Store } from '@iris-ui-kit/core'\n\n/**\n * Bridge a framework-agnostic `@iris-ui-kit/core` store into React reactivity.\n * Uses React 18's `useSyncExternalStore` — the contract is identical to the\n * one Vue uses via `ref + onMounted` and Solid uses via `createSignal`. The\n * **same** store can power Button, Popover, Dialog, etc. on any framework.\n */\nexport function useStore<T>(store: ReadonlyStore<T>): T {\n return useSyncExternalStore(\n store.subscribe,\n store.getState,\n store.getState, // SSR fallback — same as client snapshot in our case.\n )\n}\n\n/**\n * Subscribe to a DERIVED slice of a core store — the component re-renders only\n * when `selector(state)` changes per `isEqual` (default `Object.is`), not on\n * every store emission. Built on {@link Store.subscribeWith}. Inline closures\n * for `selector`/`isEqual` are fine (captured via refs; the subscription is not\n * re-created between renders).\n */\nexport function useStoreSelector<T, U>(\n store: Store<T>,\n selector: (state: T) => U,\n isEqual?: (a: U, b: U) => boolean,\n): U {\n const [slice, setSlice] = React.useState(() => selector(store.getState()))\n const selRef = React.useRef(selector)\n selRef.current = selector\n const eqRef = React.useRef(isEqual)\n eqRef.current = isEqual\n React.useEffect(() => {\n const read = (s: T): U => selRef.current(s)\n const eq = (a: U, b: U): boolean => (eqRef.current ?? Object.is)(a, b)\n // Re-sync in case the store moved between render and this effect.\n setSlice((prev) => {\n const next = read(store.getState())\n return eq(prev, next) ? prev : next\n })\n return store.subscribeWith(read, setSlice, eq)\n }, [store])\n return slice\n}\n","import * 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
+ {"version":3,"sources":["../src/useStore.ts","../src/data/useDataSource.ts","../src/data/useGroupedView.ts"],"names":["useSyncExternalStore","React2","createDataSource","React3","createGroupedView"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAUO,SAAS,SAAY,KAAA,EAA4B;AACtD,EAAA,OAAOA,2BAAA;AAAA,IACL,KAAA,CAAM,SAAA;AAAA,IACN,KAAA,CAAM,QAAA;AAAA,IACN,KAAA,CAAM;AAAA;AAAA,GACR;AACF;;;ACaO,SAAS,cAAiB,MAAA,EAA+C;AAC9E,EAAA,MAAM,GAAA,GAAYC,yBAAuC,IAAI,CAAA;AAC7D,EAAA,IAAI,GAAA,CAAI,OAAA,KAAY,IAAA,EAAM,GAAA,CAAI,OAAA,GAAUC,qBAAA,CAAiB,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,CAAA;AACxF,EAAA,MAAM,aAAa,GAAA,CAAI,OAAA;AACvB,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,KAAc,KAAA;AAEvC,EAAMD,4BAAU,MAAM;AACpB,IAAA,IAAI,SAAA,EAAW,KAAK,UAAA,CAAW,IAAA,EAAK;AACpC,IAAA,OAAO,MAAM,WAAW,OAAA,EAAQ;AAAA,EAClC,CAAA,EAAG,CAAC,UAAA,EAAY,SAAS,CAAC,CAAA;AAE1B,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AACvC,EAAA,OAAaA,iBAAA,CAAA,OAAA,CAAQ,OAAO,EAAE,GAAG,UAAA,EAAY,OAAM,CAAA,EAAI,CAAC,UAAA,EAAY,KAAK,CAAC,CAAA;AAC5E;ACPO,SAAS,eACd,MAAA,EACwB;AACxB,EAAA,MAAM,GAAA,GAAYE,yBAA4D,IAAI,CAAA;AAClF,EAAA,IAAI,IAAI,OAAA,KAAY,IAAA,EAAM,GAAA,CAAI,OAAA,GAAUC,uBAA0B,MAAM,CAAA;AACxE,EAAA,MAAM,aAAa,GAAA,CAAI,OAAA;AAEvB,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAC5C,EAAA,MAAM,QAAkC,UAAA,CAAW,KAAA;AAEnD,EAAA,MAAM,OAAA,GAAgBD,iBAAA,CAAA,WAAA;AAAA,IACpB,CACE,MACA,OAAA,KACG;AACH,MAAA,UAAA,CAAW,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,WAAA,GAAoBA,iBAAA,CAAA,WAAA,CAAY,CAAC,GAAA,KAAW,UAAA,CAAW,YAAY,GAAG,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAC3F,EAAA,MAAM,WAAA,GAAoBA,iBAAA,CAAA,WAAA,CAAY,CAAC,GAAA,KAAW,UAAA,CAAW,YAAY,GAAG,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAC3F,EAAA,MAAM,aAAA,GAAsBA,iBAAA,CAAA,WAAA,CAAY,CAAC,GAAA,KAAW,UAAA,CAAW,cAAc,GAAG,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAC/F,EAAA,MAAM,SAAA,GAAkBA,8BAAY,MAAM,UAAA,CAAW,WAAU,EAAG,CAAC,UAAU,CAAC,CAAA;AAC9E,EAAA,MAAM,WAAA,GAAoBA,8BAAY,MAAM,UAAA,CAAW,aAAY,EAAG,CAAC,UAAU,CAAC,CAAA;AAClF,EAAA,MAAM,SAAA,GAAkBA,iBAAA,CAAA,WAAA;AAAA,IACtB,CAAC,OAAA,KAAgD,UAAA,CAAW,SAAA,CAAU,OAAO,CAAA;AAAA,IAC7E,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,OAAaA,iBAAA,CAAA,OAAA;AAAA,IACX,OAAO;AAAA,MACL,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,WAAW,UAAA,CAAW,SAAA;AAAA,MACtB,OAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,UAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA;AACF,GACF;AACF","file":"data.cjs","sourcesContent":["import * as React from 'react'\nimport { useSyncExternalStore } from 'react'\nimport type { ReadonlyStore, Store } from '@iris-ui-kit/core'\n\n/**\n * Bridge a framework-agnostic `@iris-ui-kit/core` store into React reactivity.\n * Uses React 18's `useSyncExternalStore` — the contract is identical to the\n * one Vue uses via `ref + onMounted` and Solid uses via `createSignal`. The\n * **same** store can power Button, Popover, Dialog, etc. on any framework.\n */\nexport function useStore<T>(store: ReadonlyStore<T>): T {\n return useSyncExternalStore(\n store.subscribe,\n store.getState,\n store.getState, // SSR fallback — same as client snapshot in our case.\n )\n}\n\n/**\n * Subscribe to a DERIVED slice of a core store — the component re-renders only\n * when `selector(state)` changes per `isEqual` (default `Object.is`), not on\n * every store emission. Built on {@link Store.subscribeWith}. Inline closures\n * for `selector`/`isEqual` are fine (captured via refs; the subscription is not\n * re-created between renders).\n */\nexport function useStoreSelector<T, U>(\n store: Store<T>,\n selector: (state: T) => U,\n isEqual?: (a: U, b: U) => boolean,\n): U {\n const [slice, setSlice] = React.useState(() => selector(store.getState()))\n const selRef = React.useRef(selector)\n selRef.current = selector\n const eqRef = React.useRef(isEqual)\n eqRef.current = isEqual\n React.useEffect(() => {\n const read = (s: T): U => selRef.current(s)\n const eq = (a: U, b: U): boolean => (eqRef.current ?? Object.is)(a, b)\n // Re-sync in case the store moved between render and this effect.\n setSlice((prev) => {\n const next = read(store.getState())\n return eq(prev, next) ? prev : next\n })\n return store.subscribeWith(read, setSlice, eq)\n }, [store])\n return slice\n}\n","import * 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 extends string | number = string> {\n /** Subscribable store with the full grouped state. */\n store: ReturnType<typeof createGroupedView<Row, K>>['store']\n /** The composed expansion model (multiple-open) — bridge it like IrisTable does: `useStore(expansion.store)`. */\n expansion: ReturnType<typeof createGroupedView<Row, K>>['expansion']\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 extends string | number = 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 expansion: controller.expansion,\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"]}
package/dist/data.d.cts CHANGED
@@ -23,9 +23,11 @@ interface UseDataSource<T> extends DataSourceController<T> {
23
23
  */
24
24
  declare function useDataSource<T>(config: DataSourceConfig<T>): UseDataSource<T>;
25
25
 
26
- interface UseGroupedView<Row, K = string> {
26
+ interface UseGroupedView<Row, K extends string | number = string> {
27
27
  /** Subscribable store with the full grouped state. */
28
28
  store: ReturnType<typeof createGroupedView<Row, K>>['store'];
29
+ /** The composed expansion model (multiple-open) — bridge it like IrisTable does: `useStore(expansion.store)`. */
30
+ expansion: ReturnType<typeof createGroupedView<Row, K>>['expansion'];
29
31
  /** Set the source rows (re-computes groups and aggregates). */
30
32
  setRows: (rows: readonly Row[], columns?: readonly _iris_ui_kit_core.DataViewColumn<Row>[]) => void;
31
33
  /** Toggle a group's expanded state. */
@@ -48,6 +50,6 @@ interface UseGroupedView<Row, K = string> {
48
50
  * Creates the controller once (ref), subscribes to its store, and returns
49
51
  * the controller plus its live `state`.
50
52
  */
51
- declare function useGroupedView<Row, K = string>(config: GroupedViewConfig<Row, K>): UseGroupedView<Row, K>;
53
+ declare function useGroupedView<Row, K extends string | number = string>(config: GroupedViewConfig<Row, K>): UseGroupedView<Row, K>;
52
54
 
53
55
  export { type UseDataSource, type UseGroupedView, useDataSource, useGroupedView };
package/dist/data.d.ts CHANGED
@@ -23,9 +23,11 @@ interface UseDataSource<T> extends DataSourceController<T> {
23
23
  */
24
24
  declare function useDataSource<T>(config: DataSourceConfig<T>): UseDataSource<T>;
25
25
 
26
- interface UseGroupedView<Row, K = string> {
26
+ interface UseGroupedView<Row, K extends string | number = string> {
27
27
  /** Subscribable store with the full grouped state. */
28
28
  store: ReturnType<typeof createGroupedView<Row, K>>['store'];
29
+ /** The composed expansion model (multiple-open) — bridge it like IrisTable does: `useStore(expansion.store)`. */
30
+ expansion: ReturnType<typeof createGroupedView<Row, K>>['expansion'];
29
31
  /** Set the source rows (re-computes groups and aggregates). */
30
32
  setRows: (rows: readonly Row[], columns?: readonly _iris_ui_kit_core.DataViewColumn<Row>[]) => void;
31
33
  /** Toggle a group's expanded state. */
@@ -48,6 +50,6 @@ interface UseGroupedView<Row, K = string> {
48
50
  * Creates the controller once (ref), subscribes to its store, and returns
49
51
  * the controller plus its live `state`.
50
52
  */
51
- declare function useGroupedView<Row, K = string>(config: GroupedViewConfig<Row, K>): UseGroupedView<Row, K>;
53
+ declare function useGroupedView<Row, K extends string | number = string>(config: GroupedViewConfig<Row, K>): UseGroupedView<Row, K>;
52
54
 
53
55
  export { type UseDataSource, type UseGroupedView, useDataSource, useGroupedView };
package/dist/data.js CHANGED
@@ -1,5 +1,5 @@
1
1
  'use client'
2
- export { createClientDataSource, createDataSource, createGroupedView, useDataSource, useGroupedView } from './chunk-53KFLVIZ.js';
2
+ export { createClientDataSource, createDataSource, createGroupedView, useDataSource, useGroupedView } from './chunk-QZJXMCRR.js';
3
3
  import './chunk-RZNYIFV2.js';
4
4
  //# sourceMappingURL=data.js.map
5
5
  //# sourceMappingURL=data.js.map