@iris-ui-kit/react 0.1.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/admin.d.cts CHANGED
@@ -1,8 +1,11 @@
1
1
  import * as React from 'react';
2
- import { NavNode, TabsNav, TabItem } from '@iris-ui-kit/core';
3
- export { NavNode, TabItem, TabsNav, TabsNavConfig, TabsNavState, createTabsNav, filterNavByAccess, findNavNode, findNavPath, firstLeaf, flattenNav, isBranch, isClosable, nodeAllowsRoles, visibleNav } from '@iris-ui-kit/core';
2
+ import { NavNode, TabsNav, TabItem, AdminPreferencesState, AdminPreferences } from '@iris-ui-kit/core';
3
+ export { AdminPreferences, AdminPreferencesState, NavNode, TabItem, TabsNav, TabsNavConfig, TabsNavState, createAdminPreferences, createTabsNav, filterNavByAccess, findNavNode, findNavPath, firstLeaf, flattenNav, isBranch, isClosable, localStorageAdminPreferencesStorage, nodeAllowsRoles, visibleNav } from '@iris-ui-kit/core';
4
4
 
5
- type IrisAdminLayoutMode = 'sidebar' | 'full-content';
5
+ type IrisAdminLayoutMode = 'sidebar' | 'horizontal' | 'full-content';
6
+ type IrisAdminMenuAlign = 'start' | 'center' | 'end';
7
+ type IrisAdminContentWidth = 'fluid' | 'centered';
8
+ type IrisAdminContentHeight = 'auto' | 'viewport';
6
9
  type LogoRenderer = React.ReactNode | ((state: {
7
10
  collapsed: boolean;
8
11
  }) => React.ReactNode);
@@ -24,7 +27,13 @@ interface IrisAdminLayoutProps {
24
27
  appTitle?: string;
25
28
  /** Optional shared tabs store; when present the tab bar is rendered. */
26
29
  tabs?: TabsNav;
30
+ showTabs?: boolean;
27
31
  showBreadcrumb?: boolean;
32
+ stickyHeader?: boolean;
33
+ stickyTabs?: boolean;
34
+ menuAlign?: IrisAdminMenuAlign;
35
+ contentWidth?: IrisAdminContentWidth;
36
+ contentHeight?: IrisAdminContentHeight;
28
37
  sidebarWidth?: number | string;
29
38
  collapsedWidth?: number | string;
30
39
  /** Brand region; render-prop receives `{ collapsed }`. */
@@ -48,7 +57,7 @@ interface IrisAdminLayoutProps {
48
57
  * Modes: `sidebar` (default) and `full-content` (chrome hidden). React port of
49
58
  * the Vue `IrisAdminLayout`.
50
59
  */
51
- declare function IrisAdminLayout({ menus, activeKey, defaultActiveKey, onActiveKeyChange, collapsed, defaultCollapsed, onCollapsedChange, mode, appTitle, tabs, showBreadcrumb, sidebarWidth, collapsedWidth, logo, toolbar, footer, onSelect, children, }: IrisAdminLayoutProps): React.ReactElement;
60
+ declare function IrisAdminLayout({ menus, activeKey, defaultActiveKey, onActiveKeyChange, collapsed, defaultCollapsed, onCollapsedChange, mode, appTitle, tabs, showTabs, showBreadcrumb, stickyHeader, stickyTabs, menuAlign, contentWidth, contentHeight, sidebarWidth, collapsedWidth, logo, toolbar, footer, onSelect, children, }: IrisAdminLayoutProps): React.ReactElement;
52
61
 
53
62
  interface IrisNavMenuProps {
54
63
  /** Normalized nav tree. */
@@ -61,6 +70,8 @@ interface IrisNavMenuProps {
61
70
  defaultExpandedKeys?: string[];
62
71
  /** Icon-only rail (top-level items only). */
63
72
  collapsed?: boolean;
73
+ /** Top-level flow. Horizontal branches open an anchored dropdown panel. */
74
+ orientation?: 'vertical' | 'horizontal';
64
75
  ariaLabel?: string;
65
76
  onSelect?: (key: string, node: NavNode) => void;
66
77
  onExpandedKeysChange?: (keys: string[]) => void;
@@ -75,7 +86,7 @@ interface IrisNavMenuProps {
75
86
  * `collapsed` switches to an icon-only rail (top-level only); a branch click
76
87
  * then jumps to its first leaf. React port of the Vue `IrisNavMenu`.
77
88
  */
78
- declare function IrisNavMenu({ items, activeKey, expandedKeys, defaultExpandedKeys, collapsed, ariaLabel, onSelect, onExpandedKeysChange, }: IrisNavMenuProps): React.ReactElement;
89
+ declare function IrisNavMenu({ items, activeKey, expandedKeys, defaultExpandedKeys, collapsed, orientation, ariaLabel, onSelect, onExpandedKeysChange, }: IrisNavMenuProps): React.ReactElement;
79
90
 
80
91
  interface IrisAdminBreadcrumbProps {
81
92
  /** Root→current ancestor chain (typically `findNavPath(menus, activeKey)`). */
@@ -101,6 +112,9 @@ interface IrisAdminTabsProps {
101
112
  onChange?: (key: string) => void;
102
113
  onClose?: (key: string) => void;
103
114
  onRefresh?: (key: string) => void;
115
+ /** Enable pointer/touch reordering. */
116
+ reorderable?: boolean;
117
+ onReorder?: (tabs: TabItem[]) => void;
104
118
  }
105
119
  /**
106
120
  * Vben-style multi-tab bar over a shared {@link TabsNav} store. Each open page is
@@ -113,7 +127,7 @@ interface IrisAdminTabsProps {
113
127
  * End jump, Delete/Backspace closes the focused tab. Roving tabindex keeps a
114
128
  * single tab stop. React port of the Vue `IrisAdminTabs`.
115
129
  */
116
- declare function IrisAdminTabs({ nav, onChange, onClose, onRefresh, }: IrisAdminTabsProps): React.ReactElement;
130
+ declare function IrisAdminTabs({ nav, onChange, onClose, onRefresh, reorderable, onReorder, }: IrisAdminTabsProps): React.ReactElement;
117
131
 
118
132
  interface UseTabsNavReturn {
119
133
  tabs: TabItem[];
@@ -129,6 +143,7 @@ interface UseTabsNavReturn {
129
143
  closeRight: TabsNav['closeRight'];
130
144
  refresh: TabsNav['refresh'];
131
145
  setPinned: TabsNav['setPinned'];
146
+ move: TabsNav['move'];
132
147
  cacheKey: TabsNav['cacheKey'];
133
148
  }
134
149
  /**
@@ -145,6 +160,17 @@ interface UseTabsNavReturn {
145
160
  */
146
161
  declare function useTabsNav(nav: TabsNav): UseTabsNavReturn;
147
162
 
163
+ interface UseAdminPreferencesReturn {
164
+ state: AdminPreferencesState;
165
+ set: AdminPreferences['set'];
166
+ patch: AdminPreferences['patch'];
167
+ reset: AdminPreferences['reset'];
168
+ hydrate: AdminPreferences['hydrate'];
169
+ flush: AdminPreferences['flush'];
170
+ }
171
+ /** Thin React bridge for the framework-agnostic admin preferences controller. */
172
+ declare function useAdminPreferences(preferences: AdminPreferences, hydrate?: boolean): UseAdminPreferencesReturn;
173
+
148
174
  interface UseAdminShellConfig {
149
175
  /** Normalized nav tree driving menu + breadcrumb. */
150
176
  menus: NavNode[];
@@ -180,4 +206,4 @@ interface UseAdminShellReturn {
180
206
  */
181
207
  declare function useAdminShell(config: UseAdminShellConfig): UseAdminShellReturn;
182
208
 
183
- export { IrisAdminBreadcrumb, type IrisAdminBreadcrumbProps, IrisAdminLayout, type IrisAdminLayoutMode, type IrisAdminLayoutProps, IrisAdminTabs, type IrisAdminTabsProps, IrisNavMenu, type IrisNavMenuProps, type UseAdminShellConfig, type UseAdminShellReturn, type UseTabsNavReturn, useAdminShell, useTabsNav };
209
+ export { IrisAdminBreadcrumb, type IrisAdminBreadcrumbProps, type IrisAdminContentHeight, type IrisAdminContentWidth, IrisAdminLayout, type IrisAdminLayoutMode, type IrisAdminLayoutProps, type IrisAdminMenuAlign, IrisAdminTabs, type IrisAdminTabsProps, IrisNavMenu, type IrisNavMenuProps, type UseAdminPreferencesReturn, type UseAdminShellConfig, type UseAdminShellReturn, type UseTabsNavReturn, useAdminPreferences, useAdminShell, useTabsNav };
package/dist/admin.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  import * as React from 'react';
2
- import { NavNode, TabsNav, TabItem } from '@iris-ui-kit/core';
3
- export { NavNode, TabItem, TabsNav, TabsNavConfig, TabsNavState, createTabsNav, filterNavByAccess, findNavNode, findNavPath, firstLeaf, flattenNav, isBranch, isClosable, nodeAllowsRoles, visibleNav } from '@iris-ui-kit/core';
2
+ import { NavNode, TabsNav, TabItem, AdminPreferencesState, AdminPreferences } from '@iris-ui-kit/core';
3
+ export { AdminPreferences, AdminPreferencesState, NavNode, TabItem, TabsNav, TabsNavConfig, TabsNavState, createAdminPreferences, createTabsNav, filterNavByAccess, findNavNode, findNavPath, firstLeaf, flattenNav, isBranch, isClosable, localStorageAdminPreferencesStorage, nodeAllowsRoles, visibleNav } from '@iris-ui-kit/core';
4
4
 
5
- type IrisAdminLayoutMode = 'sidebar' | 'full-content';
5
+ type IrisAdminLayoutMode = 'sidebar' | 'horizontal' | 'full-content';
6
+ type IrisAdminMenuAlign = 'start' | 'center' | 'end';
7
+ type IrisAdminContentWidth = 'fluid' | 'centered';
8
+ type IrisAdminContentHeight = 'auto' | 'viewport';
6
9
  type LogoRenderer = React.ReactNode | ((state: {
7
10
  collapsed: boolean;
8
11
  }) => React.ReactNode);
@@ -24,7 +27,13 @@ interface IrisAdminLayoutProps {
24
27
  appTitle?: string;
25
28
  /** Optional shared tabs store; when present the tab bar is rendered. */
26
29
  tabs?: TabsNav;
30
+ showTabs?: boolean;
27
31
  showBreadcrumb?: boolean;
32
+ stickyHeader?: boolean;
33
+ stickyTabs?: boolean;
34
+ menuAlign?: IrisAdminMenuAlign;
35
+ contentWidth?: IrisAdminContentWidth;
36
+ contentHeight?: IrisAdminContentHeight;
28
37
  sidebarWidth?: number | string;
29
38
  collapsedWidth?: number | string;
30
39
  /** Brand region; render-prop receives `{ collapsed }`. */
@@ -48,7 +57,7 @@ interface IrisAdminLayoutProps {
48
57
  * Modes: `sidebar` (default) and `full-content` (chrome hidden). React port of
49
58
  * the Vue `IrisAdminLayout`.
50
59
  */
51
- declare function IrisAdminLayout({ menus, activeKey, defaultActiveKey, onActiveKeyChange, collapsed, defaultCollapsed, onCollapsedChange, mode, appTitle, tabs, showBreadcrumb, sidebarWidth, collapsedWidth, logo, toolbar, footer, onSelect, children, }: IrisAdminLayoutProps): React.ReactElement;
60
+ declare function IrisAdminLayout({ menus, activeKey, defaultActiveKey, onActiveKeyChange, collapsed, defaultCollapsed, onCollapsedChange, mode, appTitle, tabs, showTabs, showBreadcrumb, stickyHeader, stickyTabs, menuAlign, contentWidth, contentHeight, sidebarWidth, collapsedWidth, logo, toolbar, footer, onSelect, children, }: IrisAdminLayoutProps): React.ReactElement;
52
61
 
53
62
  interface IrisNavMenuProps {
54
63
  /** Normalized nav tree. */
@@ -61,6 +70,8 @@ interface IrisNavMenuProps {
61
70
  defaultExpandedKeys?: string[];
62
71
  /** Icon-only rail (top-level items only). */
63
72
  collapsed?: boolean;
73
+ /** Top-level flow. Horizontal branches open an anchored dropdown panel. */
74
+ orientation?: 'vertical' | 'horizontal';
64
75
  ariaLabel?: string;
65
76
  onSelect?: (key: string, node: NavNode) => void;
66
77
  onExpandedKeysChange?: (keys: string[]) => void;
@@ -75,7 +86,7 @@ interface IrisNavMenuProps {
75
86
  * `collapsed` switches to an icon-only rail (top-level only); a branch click
76
87
  * then jumps to its first leaf. React port of the Vue `IrisNavMenu`.
77
88
  */
78
- declare function IrisNavMenu({ items, activeKey, expandedKeys, defaultExpandedKeys, collapsed, ariaLabel, onSelect, onExpandedKeysChange, }: IrisNavMenuProps): React.ReactElement;
89
+ declare function IrisNavMenu({ items, activeKey, expandedKeys, defaultExpandedKeys, collapsed, orientation, ariaLabel, onSelect, onExpandedKeysChange, }: IrisNavMenuProps): React.ReactElement;
79
90
 
80
91
  interface IrisAdminBreadcrumbProps {
81
92
  /** Root→current ancestor chain (typically `findNavPath(menus, activeKey)`). */
@@ -101,6 +112,9 @@ interface IrisAdminTabsProps {
101
112
  onChange?: (key: string) => void;
102
113
  onClose?: (key: string) => void;
103
114
  onRefresh?: (key: string) => void;
115
+ /** Enable pointer/touch reordering. */
116
+ reorderable?: boolean;
117
+ onReorder?: (tabs: TabItem[]) => void;
104
118
  }
105
119
  /**
106
120
  * Vben-style multi-tab bar over a shared {@link TabsNav} store. Each open page is
@@ -113,7 +127,7 @@ interface IrisAdminTabsProps {
113
127
  * End jump, Delete/Backspace closes the focused tab. Roving tabindex keeps a
114
128
  * single tab stop. React port of the Vue `IrisAdminTabs`.
115
129
  */
116
- declare function IrisAdminTabs({ nav, onChange, onClose, onRefresh, }: IrisAdminTabsProps): React.ReactElement;
130
+ declare function IrisAdminTabs({ nav, onChange, onClose, onRefresh, reorderable, onReorder, }: IrisAdminTabsProps): React.ReactElement;
117
131
 
118
132
  interface UseTabsNavReturn {
119
133
  tabs: TabItem[];
@@ -129,6 +143,7 @@ interface UseTabsNavReturn {
129
143
  closeRight: TabsNav['closeRight'];
130
144
  refresh: TabsNav['refresh'];
131
145
  setPinned: TabsNav['setPinned'];
146
+ move: TabsNav['move'];
132
147
  cacheKey: TabsNav['cacheKey'];
133
148
  }
134
149
  /**
@@ -145,6 +160,17 @@ interface UseTabsNavReturn {
145
160
  */
146
161
  declare function useTabsNav(nav: TabsNav): UseTabsNavReturn;
147
162
 
163
+ interface UseAdminPreferencesReturn {
164
+ state: AdminPreferencesState;
165
+ set: AdminPreferences['set'];
166
+ patch: AdminPreferences['patch'];
167
+ reset: AdminPreferences['reset'];
168
+ hydrate: AdminPreferences['hydrate'];
169
+ flush: AdminPreferences['flush'];
170
+ }
171
+ /** Thin React bridge for the framework-agnostic admin preferences controller. */
172
+ declare function useAdminPreferences(preferences: AdminPreferences, hydrate?: boolean): UseAdminPreferencesReturn;
173
+
148
174
  interface UseAdminShellConfig {
149
175
  /** Normalized nav tree driving menu + breadcrumb. */
150
176
  menus: NavNode[];
@@ -180,4 +206,4 @@ interface UseAdminShellReturn {
180
206
  */
181
207
  declare function useAdminShell(config: UseAdminShellConfig): UseAdminShellReturn;
182
208
 
183
- export { IrisAdminBreadcrumb, type IrisAdminBreadcrumbProps, IrisAdminLayout, type IrisAdminLayoutMode, type IrisAdminLayoutProps, IrisAdminTabs, type IrisAdminTabsProps, IrisNavMenu, type IrisNavMenuProps, type UseAdminShellConfig, type UseAdminShellReturn, type UseTabsNavReturn, useAdminShell, useTabsNav };
209
+ export { IrisAdminBreadcrumb, type IrisAdminBreadcrumbProps, type IrisAdminContentHeight, type IrisAdminContentWidth, IrisAdminLayout, type IrisAdminLayoutMode, type IrisAdminLayoutProps, type IrisAdminMenuAlign, IrisAdminTabs, type IrisAdminTabsProps, IrisNavMenu, type IrisNavMenuProps, type UseAdminPreferencesReturn, type UseAdminShellConfig, type UseAdminShellReturn, type UseTabsNavReturn, useAdminPreferences, useAdminShell, useTabsNav };
package/dist/admin.js CHANGED
@@ -1,7 +1,8 @@
1
1
  'use client'
2
- export { IrisAdminBreadcrumb, IrisAdminLayout, IrisAdminTabs, IrisNavMenu, createTabsNav, filterNavByAccess, findNavNode, findNavPath, firstLeaf, flattenNav, isBranch, isClosable, nodeAllowsRoles, useAdminShell, useTabsNav, visibleNav } from './chunk-VWCJJRSC.js';
2
+ export { IrisAdminBreadcrumb, IrisAdminLayout, IrisAdminTabs, IrisNavMenu, createAdminPreferences, createTabsNav, filterNavByAccess, findNavNode, findNavPath, firstLeaf, flattenNav, isBranch, isClosable, localStorageAdminPreferencesStorage, nodeAllowsRoles, useAdminPreferences, useAdminShell, useTabsNav, visibleNav } from './chunk-LXMTXHAS.js';
3
3
  import './chunk-XCK4RIXB.js';
4
4
  import './chunk-J5FB2UB2.js';
5
+ import './chunk-K2F7SC2T.js';
5
6
  import './chunk-OMOTUHYI.js';
6
7
  import './chunk-6BMFMCMQ.js';
7
8
  import './chunk-RZNYIFV2.js';
@@ -430,6 +430,7 @@ function IrisSortable({
430
430
  onReorder,
431
431
  getKey = (_item, index) => String(index),
432
432
  disabled = false,
433
+ orientation = "vertical",
433
434
  style,
434
435
  className,
435
436
  children,
@@ -487,7 +488,7 @@ function IrisSortable({
487
488
  className,
488
489
  style: {
489
490
  display: "flex",
490
- flexDirection: "column",
491
+ flexDirection: orientation === "horizontal" ? "row" : "column",
491
492
  gap: "var(--iris-gap-sm, 4px)",
492
493
  opacity: disabled ? 0.6 : 1,
493
494
  userSelect: dragging ? "none" : void 0,
@@ -1 +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/Sortable.tsx","../src/behaviors/LongPress.tsx"],"names":["React","React2","jsx","jsxs","React3","React4","Fragment","React5","React6","createSortable","React7","createLongPress"],"mappings":"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","file":"behaviors.cjs","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'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | '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: makes a list of items sortable via drag-and-drop.\n * Uses `createSortable` from `@iris-ui-kit/core` for the drag-and-drop controller.\n *\n * @example\n * const [items, setItems] = React.useState(['A', 'B', 'C'])\n * <IrisSortable items={items} onReorder={setItems}>\n * {items.map((label) => <div key={label}>{label}</div>)}\n * </IrisSortable>\n */\nimport * as React from 'react'\nimport { createSortable, type SortableState } from '@iris-ui-kit/core'\n\nexport interface IrisSortableProps<T = string> {\n items: readonly T[]\n onReorder: (next: T[]) => void\n getKey?: (item: T, index: number) => string\n children?: React.ReactNode\n className?: string\n style?: React.CSSProperties\n disabled?: boolean\n}\n\nexport const SORTABLE_ITEM_ATTR = 'data-iris-sortable-item'\n\nexport function IrisSortable<T>({\n items,\n onReorder,\n getKey = (_item, index) => String(index),\n disabled = false,\n style,\n className,\n children,\n ...rest\n}: IrisSortableProps<T> &\n Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>): React.ReactElement {\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const ctrlRef = React.useRef<ReturnType<typeof createSortable> | null>(null)\n if (ctrlRef.current === null) ctrlRef.current = createSortable()\n const ctrl = ctrlRef.current\n\n const [state, setState] = React.useState<SortableState>({ activeId: null, overId: null })\n React.useEffect(() => ctrl.subscribe(setState), [ctrl])\n\n const dragging = state.activeId\n\n const indexByKey = (key: string): number =>\n Array.from(containerRef.current?.querySelectorAll(`[${SORTABLE_ITEM_ATTR}]`) ?? []).findIndex(\n (el) => el.getAttribute(SORTABLE_ITEM_ATTR) === key,\n )\n\n const onPointerDown = (e: React.PointerEvent<HTMLElement>): void => {\n if (disabled) return\n const target = (e.target as HTMLElement).closest(`[${SORTABLE_ITEM_ATTR}]`)\n if (!target) return\n const key = target.getAttribute(SORTABLE_ITEM_ATTR) ?? ''\n if (!key) return\n ctrl.press(key, e.clientX, e.clientY)\n }\n\n const onPointerMove = (e: React.PointerEvent<HTMLElement>): void => {\n if (!ctrl.getState().activeId) {\n // Pending press — promote if past threshold\n if (!ctrl.tryStart(e.clientX, e.clientY)) return\n }\n const els = containerRef.current?.querySelectorAll<HTMLElement>(`[${SORTABLE_ITEM_ATTR}]`)\n const rects = Array.from(els ?? []).map((el) => ({\n id: el.getAttribute(SORTABLE_ITEM_ATTR) ?? '',\n ...el.getBoundingClientRect(),\n }))\n ctrl.moveOver({ x: e.clientX, y: e.clientY }, rects)\n }\n\n const onPointerUp = (): void => {\n const result = ctrl.end()\n if (result.activeId && result.overId && result.activeId !== result.overId) {\n const from = indexByKey(result.activeId)\n const to = indexByKey(result.overId)\n if (from >= 0 && to >= 0 && from !== to) {\n const next = [...items]\n const [moved] = next.splice(from, 1)\n next.splice(to, 0, moved!)\n onReorder(next)\n }\n }\n }\n\n return (\n <div\n {...rest}\n ref={containerRef}\n data-iris-sortable=\"\"\n data-state={dragging ? 'dragging' : 'idle'}\n className={className}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--iris-gap-sm, 4px)',\n opacity: disabled ? 0.6 : 1,\n userSelect: dragging ? 'none' : undefined,\n ...style,\n }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerLeave={onPointerUp}\n >\n {React.Children.map(children, (child, index) => {\n if (!React.isValidElement(child)) return child\n const key = getKey(items[index]!, index)\n const isDragging = key === dragging\n return (\n <div\n key={key}\n data-iris-sortable-item={key}\n data-iris-sortable-dragging={isDragging ? '' : undefined}\n style={{\n transition: isDragging ? 'none' : 'transform 150ms ease',\n opacity: isDragging ? 0.4 : 1,\n position: 'relative',\n zIndex: isDragging ? 100 : undefined,\n }}\n >\n {child}\n </div>\n )\n })}\n </div>\n )\n}\n","/**\n * Behavior wrapper: detects a press-and-hold gesture on the wrapped element.\n * Fires `onLongPress` when the pointer is held down for `holdDelay` ms.\n * Wraps children in a `display: contents` span so event bubbling works.\n *\n * Composable: stack with `IrisMovable` / `IrisResizable` / `IrisSortable` /\n * `IrisHotkey` for richer interactions.\n *\n * @example\n * <IrisLongPress holdDelay={500} onLongPress={() => setOpen(true)}>\n * <img src=\"thumbnail.jpg\" alt=\"Hold to preview\" />\n * </IrisLongPress>\n */\nimport * as React from 'react'\nimport { createLongPress } from '@iris-ui-kit/core'\n\nexport interface IrisLongPressProps {\n /** Time in ms the pointer must be held before `onLongPress` fires. */\n holdDelay?: number\n /** Called once when the hold reaches `holdDelay`. */\n onLongPress: () => void\n disabled?: boolean\n children?: React.ReactNode\n}\n\nexport function IrisLongPress({\n holdDelay = 500,\n onLongPress,\n disabled = false,\n children,\n}: IrisLongPressProps): React.ReactElement {\n const handlerRef = React.useRef(onLongPress)\n handlerRef.current = onLongPress\n\n const ctrl = React.useMemo(\n () =>\n createLongPress({\n holdDelay,\n onLongPress: () => handlerRef.current(),\n }),\n [holdDelay],\n )\n\n const onPointerDown_ = (_e: React.PointerEvent) => {\n if (disabled) return\n ctrl.press()\n }\n\n const onPointerUp_ = () => {\n ctrl.release()\n }\n\n const onPointerLeave_ = () => {\n ctrl.cancel()\n }\n\n return (\n <span\n data-iris-long-press=\"\"\n onPointerDown={onPointerDown_}\n onPointerUp={onPointerUp_}\n onPointerLeave={onPointerLeave_}\n style={{ display: 'contents' }}\n >\n {children}\n </span>\n )\n}\n"]}
1
+ {"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/Sortable.tsx","../src/behaviors/LongPress.tsx"],"names":["React","React2","jsx","jsxs","React3","React4","Fragment","React5","React6","createSortable","React7","createLongPress"],"mappings":"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","file":"behaviors.cjs","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'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | '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: makes a list of items sortable via drag-and-drop.\n * Uses `createSortable` from `@iris-ui-kit/core` for the drag-and-drop controller.\n *\n * @example\n * const [items, setItems] = React.useState(['A', 'B', 'C'])\n * <IrisSortable items={items} onReorder={setItems}>\n * {items.map((label) => <div key={label}>{label}</div>)}\n * </IrisSortable>\n */\nimport * as React from 'react'\nimport { createSortable, type SortableState } from '@iris-ui-kit/core'\n\nexport interface IrisSortableProps<T = string> {\n items: readonly T[]\n onReorder: (next: T[]) => void\n getKey?: (item: T, index: number) => string\n children?: React.ReactNode\n className?: string\n style?: React.CSSProperties\n disabled?: boolean\n orientation?: 'vertical' | 'horizontal'\n}\n\nexport const SORTABLE_ITEM_ATTR = 'data-iris-sortable-item'\n\nexport function IrisSortable<T>({\n items,\n onReorder,\n getKey = (_item, index) => String(index),\n disabled = false,\n orientation = 'vertical',\n style,\n className,\n children,\n ...rest\n}: IrisSortableProps<T> &\n Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>): React.ReactElement {\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const ctrlRef = React.useRef<ReturnType<typeof createSortable> | null>(null)\n if (ctrlRef.current === null) ctrlRef.current = createSortable()\n const ctrl = ctrlRef.current\n\n const [state, setState] = React.useState<SortableState>({ activeId: null, overId: null })\n React.useEffect(() => ctrl.subscribe(setState), [ctrl])\n\n const dragging = state.activeId\n\n const indexByKey = (key: string): number =>\n Array.from(containerRef.current?.querySelectorAll(`[${SORTABLE_ITEM_ATTR}]`) ?? []).findIndex(\n (el) => el.getAttribute(SORTABLE_ITEM_ATTR) === key,\n )\n\n const onPointerDown = (e: React.PointerEvent<HTMLElement>): void => {\n if (disabled) return\n const target = (e.target as HTMLElement).closest(`[${SORTABLE_ITEM_ATTR}]`)\n if (!target) return\n const key = target.getAttribute(SORTABLE_ITEM_ATTR) ?? ''\n if (!key) return\n ctrl.press(key, e.clientX, e.clientY)\n }\n\n const onPointerMove = (e: React.PointerEvent<HTMLElement>): void => {\n if (!ctrl.getState().activeId) {\n // Pending press — promote if past threshold\n if (!ctrl.tryStart(e.clientX, e.clientY)) return\n }\n const els = containerRef.current?.querySelectorAll<HTMLElement>(`[${SORTABLE_ITEM_ATTR}]`)\n const rects = Array.from(els ?? []).map((el) => ({\n id: el.getAttribute(SORTABLE_ITEM_ATTR) ?? '',\n ...el.getBoundingClientRect(),\n }))\n ctrl.moveOver({ x: e.clientX, y: e.clientY }, rects)\n }\n\n const onPointerUp = (): void => {\n const result = ctrl.end()\n if (result.activeId && result.overId && result.activeId !== result.overId) {\n const from = indexByKey(result.activeId)\n const to = indexByKey(result.overId)\n if (from >= 0 && to >= 0 && from !== to) {\n const next = [...items]\n const [moved] = next.splice(from, 1)\n next.splice(to, 0, moved!)\n onReorder(next)\n }\n }\n }\n\n return (\n <div\n {...rest}\n ref={containerRef}\n data-iris-sortable=\"\"\n data-state={dragging ? 'dragging' : 'idle'}\n className={className}\n style={{\n display: 'flex',\n flexDirection: orientation === 'horizontal' ? 'row' : 'column',\n gap: 'var(--iris-gap-sm, 4px)',\n opacity: disabled ? 0.6 : 1,\n userSelect: dragging ? 'none' : undefined,\n ...style,\n }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerLeave={onPointerUp}\n >\n {React.Children.map(children, (child, index) => {\n if (!React.isValidElement(child)) return child\n const key = getKey(items[index]!, index)\n const isDragging = key === dragging\n return (\n <div\n key={key}\n data-iris-sortable-item={key}\n data-iris-sortable-dragging={isDragging ? '' : undefined}\n style={{\n transition: isDragging ? 'none' : 'transform 150ms ease',\n opacity: isDragging ? 0.4 : 1,\n position: 'relative',\n zIndex: isDragging ? 100 : undefined,\n }}\n >\n {child}\n </div>\n )\n })}\n </div>\n )\n}\n","/**\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"]}
@@ -157,9 +157,10 @@ interface IrisSortableProps<T = string> {
157
157
  className?: string;
158
158
  style?: React.CSSProperties;
159
159
  disabled?: boolean;
160
+ orientation?: 'vertical' | 'horizontal';
160
161
  }
161
162
  declare const SORTABLE_ITEM_ATTR = "data-iris-sortable-item";
162
- declare function IrisSortable<T>({ items, onReorder, getKey, disabled, style, className, children, ...rest }: IrisSortableProps<T> & Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>): React.ReactElement;
163
+ declare function IrisSortable<T>({ items, onReorder, getKey, disabled, orientation, style, className, children, ...rest }: IrisSortableProps<T> & Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>): React.ReactElement;
163
164
 
164
165
  /**
165
166
  * Behavior wrapper: detects a press-and-hold gesture on the wrapped element.
@@ -157,9 +157,10 @@ interface IrisSortableProps<T = string> {
157
157
  className?: string;
158
158
  style?: React.CSSProperties;
159
159
  disabled?: boolean;
160
+ orientation?: 'vertical' | 'horizontal';
160
161
  }
161
162
  declare const SORTABLE_ITEM_ATTR = "data-iris-sortable-item";
162
- declare function IrisSortable<T>({ items, onReorder, getKey, disabled, style, className, children, ...rest }: IrisSortableProps<T> & Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>): React.ReactElement;
163
+ declare function IrisSortable<T>({ items, onReorder, getKey, disabled, orientation, style, className, children, ...rest }: IrisSortableProps<T> & Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>): React.ReactElement;
163
164
 
164
165
  /**
165
166
  * Behavior wrapper: detects a press-and-hold gesture on the wrapped element.
package/dist/behaviors.js CHANGED
@@ -1,4 +1,5 @@
1
1
  'use client'
2
- export { IrisClickOutside, IrisHotkey, IrisLongPress, IrisMovable, IrisResizable, IrisSortable, SORTABLE_ITEM_ATTR } from './chunk-2TQSTINK.js';
2
+ export { IrisClickOutside, IrisHotkey, IrisLongPress, IrisMovable, IrisResizable } from './chunk-BCL32KSE.js';
3
+ export { IrisSortable, SORTABLE_ITEM_ATTR } from './chunk-K2F7SC2T.js';
3
4
  //# sourceMappingURL=behaviors.js.map
4
5
  //# sourceMappingURL=behaviors.js.map
@@ -946,5 +946,5 @@ function IrisDashboardTemplate({
946
946
  }
947
947
 
948
948
  export { IrisAlert, IrisButton, IrisCheckbox, IrisDashboardTemplate, IrisDivider, IrisFormField, IrisInput, IrisLoginTemplate, IrisPasswordInput };
949
- //# sourceMappingURL=chunk-UWUUEZCD.js.map
950
- //# sourceMappingURL=chunk-UWUUEZCD.js.map
949
+ //# sourceMappingURL=chunk-B4RS5WKC.js.map
950
+ //# sourceMappingURL=chunk-B4RS5WKC.js.map