@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.cjs +306 -15
- package/dist/admin.cjs.map +1 -1
- package/dist/admin.d.cts +33 -7
- package/dist/admin.d.ts +33 -7
- package/dist/admin.js +2 -1
- package/dist/behaviors.cjs +2 -1
- package/dist/behaviors.cjs.map +1 -1
- package/dist/behaviors.d.cts +2 -1
- package/dist/behaviors.d.ts +2 -1
- package/dist/behaviors.js +2 -1
- package/dist/{chunk-UWUUEZCD.js → chunk-B4RS5WKC.js} +2 -2
- package/dist/{chunk-UWUUEZCD.js.map → chunk-B4RS5WKC.js.map} +1 -1
- package/dist/{chunk-2TQSTINK.js → chunk-BCL32KSE.js} +4 -100
- package/dist/chunk-BCL32KSE.js.map +1 -0
- package/dist/{chunk-YAHXR2CJ.js → chunk-INEPOSCN.js} +32 -5
- package/dist/chunk-INEPOSCN.js.map +1 -0
- package/dist/chunk-K2F7SC2T.js +107 -0
- package/dist/chunk-K2F7SC2T.js.map +1 -0
- package/dist/{chunk-VWCJJRSC.js → chunk-LXMTXHAS.js} +206 -20
- package/dist/chunk-LXMTXHAS.js.map +1 -0
- package/dist/index.cjs +1312 -947
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +169 -98
- package/dist/index.d.ts +169 -98
- package/dist/index.js +801 -659
- package/dist/index.js.map +1 -1
- package/dist/skeletons.cjs.map +1 -1
- package/dist/skeletons.js +1 -1
- package/dist/undo.cjs +30 -3
- package/dist/undo.cjs.map +1 -1
- package/dist/undo.js +1 -1
- package/package.json +100 -20
- package/dist/chunk-2TQSTINK.js.map +0 -1
- package/dist/chunk-VWCJJRSC.js.map +0 -1
- package/dist/chunk-YAHXR2CJ.js.map +0 -1
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-
|
|
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';
|
package/dist/behaviors.cjs
CHANGED
|
@@ -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,
|
package/dist/behaviors.cjs.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCO,SAAS,QAAQ,OAAA,EAA+B;AACrD,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,GAAU,CAAC,CAAC,CAAA,EAAG,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,QAAA,GAAW,KAAA,EAAM,GAAI,OAAA;AAI5E,EAAA,MAAM,MAAA,GAAeA,yBAAO,EAAE,OAAA,EAAS,QAAQ,KAAA,EAAO,QAAA,EAAU,SAAS,CAAA;AACzE,EAAA,MAAA,CAAO,UAAU,EAAE,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,UAAU,OAAA,EAAQ;AAE7D,EAAMA,4BAAU,MAAM;AACpB,IAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAClB,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,IAAI,MAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC7C,MAAA,IAAI,MAAA,CAAO,QAAQ,QAAA,EAAU;AAC7B,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA,CAAQ,QAAQ,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,EAAG;AACpD,MAAA,MAAA,GAAS,KAAA,CAAM,OAAA;AACf,MAAA,MAAA,GAAS,KAAA,CAAM,OAAA;AACf,MAAA,MAAM,KAAA,GAAmB;AAAA,QACvB,GAAG,KAAA,CAAM,OAAA;AAAA,QACT,GAAG,KAAA,CAAM,OAAA;AAAA,QACT,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QACJ;AAAA,OACF;AACA,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,GAAU,KAAK,CAAA;AAC7C,MAAA,IAAI,WAAW,KAAA,EAAO;AACtB,MAAA,MAAA,GAAS,KAAA;AACT,MAAA,EAAA,CAAG,iBAAA,GAAoB,MAAM,SAAS,CAAA;AACtC,MAAA,EAAA,CAAG,MAAM,WAAA,GAAc,MAAA;AACvB,MAAA,KAAA,CAAM,cAAA,EAAe;AAAA,IACvB,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC7C,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,SAAA,KAAc,MAAM,SAAA,EAAW;AACrD,MAAA,MAAA,CAAO,QAAQ,MAAA,GAAS;AAAA,QACtB,GAAG,KAAA,CAAM,OAAA;AAAA,QACT,GAAG,KAAA,CAAM,OAAA;AAAA,QACT,EAAA,EAAI,MAAM,OAAA,GAAU,MAAA;AAAA,QACpB,EAAA,EAAI,MAAM,OAAA,GAAU,MAAA;AAAA,QACpB;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAwB;AAC5C,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,SAAA,KAAc,MAAM,SAAA,EAAW;AACrD,MAAA,EAAA,CAAG,qBAAA,GAAwB,MAAM,SAAS,CAAA;AAC1C,MAAA,EAAA,CAAG,MAAM,WAAA,GAAc,EAAA;AACvB,MAAA,MAAA,CAAO,QAAQ,KAAA,GAAQ;AAAA,QACrB,GAAG,KAAA,CAAM,OAAA;AAAA,QACT,GAAG,KAAA,CAAM,OAAA;AAAA,QACT,EAAA,EAAI,MAAM,OAAA,GAAU,MAAA;AAAA,QACpB,EAAA,EAAI,MAAM,OAAA,GAAU,MAAA;AAAA,QACpB;AAAA,OACD,CAAA;AACD,MAAA,MAAA,GAAS,IAAA;AAAA,IACX,CAAA;AAEA,IAAA,EAAA,CAAG,gBAAA,CAAiB,eAAe,aAAa,CAAA;AAChD,IAAA,EAAA,CAAG,gBAAA,CAAiB,eAAe,aAAa,CAAA;AAChD,IAAA,EAAA,CAAG,gBAAA,CAAiB,aAAa,YAAY,CAAA;AAC7C,IAAA,EAAA,CAAG,gBAAA,CAAiB,iBAAiB,YAAY,CAAA;AACjD,IAAA,OAAO,MAAM;AACX,MAAA,EAAA,CAAG,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACnD,MAAA,EAAA,CAAG,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACnD,MAAA,EAAA,CAAG,mBAAA,CAAoB,aAAa,YAAY,CAAA;AAChD,MAAA,EAAA,CAAG,mBAAA,CAAoB,iBAAiB,YAAY,CAAA;AAAA,IACtD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACb;ACvFA,IAAM,WAAA,GAAqC;AAAA,EACzC,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,cAAA,GAAsD;AAAA,EAC1D,GAAA,EAAK,WAAA;AAAA,EACL,KAAA,EAAO,WAAA;AAAA,EACP,MAAA,EAAQ,WAAA;AAAA,EACR,IAAA,EAAM,WAAA;AAAA,EACN,UAAA,EAAY,aAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,aAAA,EAAe,aAAA;AAAA,EACf,cAAA,EAAgB;AAClB,CAAA;AAEA,SAAS,eAAe,MAAA,EAAkD;AACxE,EAAA,MAAM,CAAA,GAAyB,EAAE,QAAA,EAAU,UAAA,EAAW;AACtD,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAC/B,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAClC,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AAChC,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AACjC,EAAA,IAAI,CAAA,IAAK,GAAA,GAAM,EAAA;AACf,EAAA,IAAI,CAAA,IAAK,MAAA,GAAS,EAAA;AAClB,EAAA,IAAI,CAAA,IAAK,IAAA,GAAO,EAAA;AAChB,EAAA,IAAI,CAAA,IAAK,KAAA,GAAQ,EAAA;AACjB,EAAA,MAAM,QAAA,GAAA,CAAY,CAAA,IAAK,CAAA,MAAO,CAAA,IAAK,CAAA,CAAA;AACnC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,CAAA,CAAE,KAAA,GAAQ,EAAA;AACV,IAAA,CAAA,CAAE,MAAA,GAAS,EAAA;AAAA,EACb,CAAA,MAAA,IAAW,KAAK,CAAA,EAAG;AACjB,IAAA,CAAA,CAAE,IAAA,GAAO,CAAA;AACT,IAAA,CAAA,CAAE,KAAA,GAAQ,CAAA;AACV,IAAA,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EACb,CAAA,MAAO;AACL,IAAA,CAAA,CAAE,GAAA,GAAM,CAAA;AACR,IAAA,CAAA,CAAE,MAAA,GAAS,CAAA;AACX,IAAA,CAAA,CAAE,KAAA,GAAQ,CAAA;AAAA,EACZ;AACA,EAAA,CAAA,CAAE,MAAA,GAAS,eAAe,MAAM,CAAA;AAChC,EAAA,OAAO,CAAA;AACT;AAgBA,SAAS,OAAO,KAAA,EAAwC;AACtD,EAAA,MAAM,SAAA,GAAkBC,yBAA8B,IAAI,CAAA;AAC1D,EAAA,MAAM,WAAiBA,iBAAA,CAAA,MAAA,CAA0B,EAAE,OAAO,CAAA,EAAG,MAAA,EAAQ,GAAG,CAAA;AACxE,EAAA,MAAM,SAAA,GAAkBA,yBAAO,CAAC,CAAA;AAEhC,EAAA,OAAA,CAAQ;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,SAAS,MAAM;AACb,MAAA,QAAA,CAAS,OAAA,GAAU,EAAE,GAAG,KAAA,CAAM,QAAQ,OAAA,EAAQ;AAC9C,MAAA,SAAA,CAAU,OAAA,GAAU,SAAS,OAAA,CAAQ,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,QAAA,CAAS,OAAA,CAAQ,MAAM,CAAA;AAChF,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAS,OAAO,CAAA;AAAA,IACxC,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,IAAG,KAAM;AACtB,MAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AACnB,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAC/B,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAClC,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AAChC,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AACjC,MAAA,IAAI,KAAA,GAAQ,SAAS,OAAA,CAAQ,KAAA;AAC7B,MAAA,IAAI,KAAA,GAAQ,SAAS,OAAA,CAAQ,MAAA;AAC7B,MAAA,IAAI,CAAA,EAAG,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,KAAA,GAAQ,EAAA;AACxC,MAAA,IAAI,CAAA,EAAG,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,KAAA,GAAQ,EAAA;AACxC,MAAA,IAAI,CAAA,EAAG,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,EAAA;AACzC,MAAA,IAAI,CAAA,EAAG,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,EAAA;AACzC,MAAA,IAAI,KAAA,CAAM,UAAA,KAAe,CAAA,IAAK,CAAA,CAAA,KAAO,KAAK,CAAA,CAAA,EAAI;AAC5C,QAAA,KAAA,GAAQ,QAAQ,SAAA,CAAU,OAAA;AAAA,MAC5B;AACA,MAAA,KAAA,GAAQ,IAAA,CAAK,IAAI,KAAA,CAAM,QAAA,EAAU,KAAK,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,KAAK,CAAC,CAAA;AAChE,MAAA,KAAA,GAAQ,IAAA,CAAK,IAAI,KAAA,CAAM,SAAA,EAAW,KAAK,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,KAAK,CAAC,CAAA;AAClE,MAAA,KAAA,CAAM,SAAS,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,IAChD,CAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC3C;AAAA,GACD,CAAA;AAED,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,SAAA;AAAA,MACL,8BAA4B,KAAA,CAAM,MAAA;AAAA,MAClC,KAAA,EAAO;AAAA,QACL,GAAG,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AAAA,QAC9B,WAAA,EAAa,MAAA;AAAA,QACb,UAAA,EAAY,aAAA;AAAA,QACZ,MAAA,EAAQ;AAAA;AACV;AAAA,GACF;AAEJ;AAoCO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,GAAc,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,EACxC,YAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA,GAAU,WAAA;AAAA,EACV,QAAA,GAAW,EAAA;AAAA,EACX,SAAA,GAAY,EAAA;AAAA,EACZ,QAAA,GAAW,QAAA;AAAA,EACX,SAAA,GAAY,QAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2C;AACzC,EAAA,MAAM,eAAe,QAAA,KAAa,MAAA;AAClC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUD,2BAAS,WAAW,CAAA;AAC1D,EAAA,MAAM,IAAA,GAAO,eAAgB,QAAA,GAAiC,QAAA;AAC9D,EAAA,MAAM,OAAA,GAAgBA,yBAAO,IAAI,CAAA;AACjC,EAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAElB,EAAA,MAAM,OAAA,GAAgBA,iBAAA,CAAA,WAAA;AAAA,IACpB,CAAC,IAAA,KAA4B;AAC3B,MAAA,IAAI,CAAC,YAAA,EAAc,WAAA,CAAY,IAAI,CAAA;AACnC,MAAA,YAAA,GAAe,IAAI,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,cAAc,YAAY;AAAA,GAC7B;AAEA,EAAA,uBACEE,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,qBAAA,EAAoB,EAAA;AAAA,MACpB,YAAA,EAAY,WAAW,UAAA,GAAa,MAAA;AAAA,MACpC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,OAAA,EAAS,cAAA;AAAA,QACT,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,GAAG;AAAA,OACL;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZD,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YAEC,MAAA,EAAQ,CAAA;AAAA,YACR,QAAA;AAAA,YACA,UAAA;AAAA,YACA,OAAA;AAAA,YACA,QAAA;AAAA,YACA,SAAA;AAAA,YACA,QAAA;AAAA,YACA,SAAA;AAAA,YACA,QAAA,EAAU,OAAA;AAAA,YACV,aAAA;AAAA,YACA;AAAA,WAAA;AAAA,UAXK;AAAA,SAaR;AAAA;AAAA;AAAA,GACH;AAEJ;ACnLO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA,EAAU,YAAA;AAAA,EACV,eAAA,GAAkB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EAC/B,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAS,EAAC;AAAA,EACV,QAAA,GAAW,KAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA,EACX,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyC;AACvC,EAAA,MAAM,eAAe,YAAA,KAAiB,MAAA;AACtC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUE,2BAA8B,eAAe,CAAA;AACnF,EAAA,MAAM,QAAA,GAAW,eAAgB,YAAA,GAAuC,QAAA;AACxE,EAAA,MAAM,WAAA,GAAoBA,yBAAO,QAAQ,CAAA;AACzC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAA,MAAM,OAAA,GAAgBA,yBAA8B,IAAI,CAAA;AACxD,EAAA,MAAM,SAAA,GAAkBA,yBAA2B,IAAI,CAAA;AACvD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUA,2BAAS,KAAK,CAAA;AACpD,EAAA,MAAM,WAAiBA,iBAAA,CAAA,MAAA,CAA4B,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAGjE,EAAMA,4BAAU,MAAM;AACpB,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,SAAA,CAAU,OAAA,GACR,OAAA,CAAQ,OAAA,EAAS,aAAA,CAA2B,4BAA4B,CAAA,IAAK,IAAA;AAAA,EACjF,CAAC,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,WACjB,SAAA,GACA,OAAA;AAEL,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,MAAiD;AAAA,IAC9D,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,IAAQ,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,IAAQ,QAAA,EAAU,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IAC5E,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,IAAQ,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,IAAQ,QAAA,EAAU,CAAA,CAAE,CAAC,CAAC;AAAA,GAC9E,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAA8B;AACjD,IAAA,IAAI,CAAC,YAAA,EAAc,WAAA,CAAY,IAAI,CAAA;AACnC,IAAA,gBAAA,GAAmB,IAAI,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,OAAA,CAAQ;AAAA,IACN,MAAA,EAAQ,aAAA;AAAA,IACR,QAAA;AAAA,IACA,SAAS,MAAM;AACb,MAAA,QAAA,CAAS,UAAU,WAAA,CAAY,OAAA;AAC/B,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,WAAA,GAAc,YAAY,OAAO,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,IAAG,KAAM;AACtB,MAAA,WAAA,CAAY,KAAA,CAAM,EAAE,CAAA,EAAG,QAAA,CAAS,OAAA,CAAQ,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,QAAA,CAAS,OAAA,CAAQ,CAAA,GAAI,EAAA,EAAI,CAAC,CAAA;AAAA,IAC/E,CAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,SAAA,GAAY,YAAY,OAAO,CAAA;AAAA,IACjC;AAAA,GACD,CAAA;AAED,EAAA,uBACEF,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,GAAA,EAAK,OAAA;AAAA,MACL,mBAAA,EAAkB,EAAA;AAAA,MAClB,YAAA,EAAY,WAAW,UAAA,GAAa,MAAA;AAAA,MACpC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,IAAA,EAAM,CAAA;AAAA,QACN,GAAA,EAAK,CAAA;AAAA,QACL,WAAW,CAAA,YAAA,EAAe,QAAA,CAAS,CAAC,CAAA,IAAA,EAAO,SAAS,CAAC,CAAA,MAAA,CAAA;AAAA,QACrD,MAAA,EAAQ,QAAA,GAAW,SAAA,GAAY,QAAA,GAAW,aAAA,GAAgB,MAAA;AAAA,QAC1D,WAAA,EAAa,MAAA;AAAA,QACb,GAAG;AAAA,OACL;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AC7GA,SAAS,cAAc,IAAA,EAOrB;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACjD,EAAA,MAAM,MAAM,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,EAAG,WAAA,EAAY;AACjD,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AACnE,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAAA,IACvB,KAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,IAAK,IAAA,CAAK,IAAI,QAAQ,CAAA;AAAA,IACzC,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA,CAAK,IAAI,SAAS,CAAA;AAAA,IAC5C,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,IAC/D,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,KAAK;AAAA,GAC5B;AACF;AAEA,SAAS,cAAc,MAAA,EAAqC;AAC1D,EAAA,MAAM,EAAA,GAAK,MAAA;AACX,EAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAChB,EAAA,MAAM,MAAM,EAAA,CAAG,OAAA;AACf,EAAA,IAAI,QAAQ,OAAA,IAAW,GAAA,KAAQ,UAAA,IAAc,GAAA,KAAQ,UAAU,OAAO,IAAA;AACtE,EAAA,IAAI,EAAA,CAAG,mBAAmB,OAAO,IAAA;AACjC,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,OAAA,CAAQ,OAAsB,MAAA,EAAmD;AACxF,EAAA,IAAI,MAAM,GAAA,CAAI,WAAA,EAAY,KAAM,MAAA,CAAO,KAAK,OAAO,KAAA;AACnD,EAAA,IAAI,MAAA,CAAO,KAAA,KAAU,KAAA,CAAM,QAAA,EAAU,OAAO,KAAA;AAC5C,EAAA,IAAI,MAAA,CAAO,GAAA,KAAQ,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AACxC,EAAA,IAAI,OAAO,UAAA,EAAY;AAErB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,IAAW,CAAC,KAAA,CAAM,SAAS,OAAO,KAAA;AAAA,EAC/C,CAAA,MAAO;AACL,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,KAAA,CAAM,OAAA,EAAS,OAAO,KAAA;AAC1C,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,KAAA,CAAM,OAAA,EAAS,OAAO,KAAA;AAAA,EAC5C;AACA,EAAA,OAAO,IAAA;AACT;AAeO,SAAS,UAAA,CAAW;AAAA,EACzB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,aAAA,GAAgB,KAAA;AAAA,EAChB,KAAA,GAAQ,UAAA;AAAA,EACR;AACF,CAAA,EAAwC;AAEtC,EAAA,MAAM,UAAA,GAAmBG,yBAAO,SAAS,CAAA;AACzC,EAAA,UAAA,CAAW,OAAA,GAAU,SAAA;AACrB,EAAA,MAAM,QAAA,GAAiBA,yBAAO,aAAa,CAAA;AAC3C,EAAA,QAAA,CAAS,OAAA,GAAU,aAAA;AAEnB,EAAMA,4BAAU,MAAM;AACpB,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,aAAa,CAAA;AACtC,IAAA,MAAM,MAAA,GAAsB,KAAA,KAAU,QAAA,GAAW,MAAA,GAAS,QAAA;AAE1D,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAiB;AAC9B,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA,EAAG;AAClD,MAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,QAAA,IAAI,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA,EAAG;AACjB,UAAA,UAAA,CAAW,QAAQ,CAAC,CAAA;AACpB,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC7C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,KAAA,EAAO,GAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAE,CAAC,CAAA;AAE1E,EAAA,uBAAOH,cAAAA,CAAAI,mBAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;AC3FO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAS,EAAC;AAAA,EACV;AACF,CAAA,EAA8C;AAC5C,EAAA,MAAM,UAAA,GAAmBC,yBAA+B,IAAI,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAqBA,yBAAO,SAAS,CAAA;AAC3C,EAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AAEvB,EAAMA,4BAAU,MAAM;AACpB,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAwB;AACvC,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAI3B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAI,IAAA,GAAoB,MAAA;AACxB,QAAA,OAAO,IAAA,EAAM;AACX,UAAA,IAAI,SAAS,OAAA,EAAS;AAGtB,UAAA,IAAK,IAAA,CAAqB,eAAe,OAAA,EAAS;AAClD,UAAA,IAAA,GAAO,IAAA,CAAK,UAAA;AAAA,QACd;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,QAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,QAAA,IAAI,EAAA,IAAM,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG;AAAA,MACjC;AACA,MAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAAA,IAC5B,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,eAAe,OAAO,CAAA;AAChD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,eAAe,OAAO,CAAA;AAAA,IACrD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAErB,EAAA,uBACEL,cAAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAK,UAAA,EAAY,yBAAA,EAAwB,EAAA,EAAG,KAAA,EAAO,EAAE,OAAA,EAAS,UAAA,EAAW,EAC5E,QAAA,EACH,CAAA;AAEJ;ACjDO,IAAM,kBAAA,GAAqB;AAE3B,SAAS,YAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA,GAAS,CAAC,KAAA,EAAO,KAAA,KAAU,OAAO,KAAK,CAAA;AAAA,EACvC,QAAA,GAAW,KAAA;AAAA,EACX,WAAA,GAAc,UAAA;AAAA,EACd,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAC8E;AAC5E,EAAA,MAAM,YAAA,GAAqBM,yBAA8B,IAAI,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAgBA,yBAAiD,IAAI,CAAA;AAC3E,EAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,IAAA,EAAM,OAAA,CAAQ,UAAUC,mBAAA,EAAe;AAC/D,EAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AAErB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUD,iBAAA,CAAA,QAAA,CAAwB,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,CAAA;AACxF,EAAMA,iBAAA,CAAA,SAAA,CAAU,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAEtD,EAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AAEvB,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAClB,KAAA,CAAM,KAAK,YAAA,CAAa,OAAA,EAAS,gBAAA,CAAiB,CAAA,CAAA,EAAI,kBAAkB,CAAA,CAAA,CAAG,CAAA,IAAK,EAAE,CAAA,CAAE,SAAA;AAAA,IAClF,CAAC,EAAA,KAAO,EAAA,CAAG,YAAA,CAAa,kBAAkB,CAAA,KAAM;AAAA,GAClD;AAEF,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA6C;AAClE,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,MAAM,SAAU,CAAA,CAAE,MAAA,CAAuB,OAAA,CAAQ,CAAA,CAAA,EAAI,kBAAkB,CAAA,CAAA,CAAG,CAAA;AAC1E,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,YAAA,CAAa,kBAAkB,CAAA,IAAK,EAAA;AACvD,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA6C;AAClE,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAS,CAAE,QAAA,EAAU;AAE7B,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,EAAE,OAAA,EAAS,CAAA,CAAE,OAAO,CAAA,EAAG;AAAA,IAC5C;AACA,IAAA,MAAM,MAAM,YAAA,CAAa,OAAA,EAAS,gBAAA,CAA8B,CAAA,CAAA,EAAI,kBAAkB,CAAA,CAAA,CAAG,CAAA;AACzF,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,GAAA,IAAO,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,MAC/C,EAAA,EAAI,EAAA,CAAG,YAAA,CAAa,kBAAkB,CAAA,IAAK,EAAA;AAAA,MAC3C,GAAG,GAAG,qBAAA;AAAsB,KAC9B,CAAE,CAAA;AACF,IAAA,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA,EAAG,CAAA,CAAE,OAAA,EAAQ,EAAG,KAAK,CAAA;AAAA,EACrD,CAAA;AAEA,EAAA,MAAM,cAAc,MAAY;AAC9B,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,EAAI;AACxB,IAAA,IAAI,OAAO,QAAA,IAAY,MAAA,CAAO,UAAU,MAAA,CAAO,QAAA,KAAa,OAAO,MAAA,EAAQ;AACzE,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AACvC,MAAA,MAAM,EAAA,GAAK,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AACnC,MAAA,IAAI,IAAA,IAAQ,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,SAAS,EAAA,EAAI;AACvC,QAAA,MAAM,IAAA,GAAO,CAAC,GAAG,KAAK,CAAA;AACtB,QAAA,MAAM,CAAC,KAAK,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AACnC,QAAA,IAAA,CAAK,MAAA,CAAO,EAAA,EAAI,CAAA,EAAG,KAAM,CAAA;AACzB,QAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,uBACEN,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,GAAA,EAAK,YAAA;AAAA,MACL,oBAAA,EAAmB,EAAA;AAAA,MACnB,YAAA,EAAY,WAAW,UAAA,GAAa,MAAA;AAAA,MACpC,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,WAAA,KAAgB,YAAA,GAAe,KAAA,GAAQ,QAAA;AAAA,QACtD,GAAA,EAAK,yBAAA;AAAA,QACL,OAAA,EAAS,WAAW,GAAA,GAAM,CAAA;AAAA,QAC1B,UAAA,EAAY,WAAW,MAAA,GAAS,MAAA;AAAA,QAChC,GAAG;AAAA,OACL;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA,EAAgB,WAAA;AAAA,MAEf,UAAMM,iBAAA,CAAA,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,CAAC,OAAO,KAAA,KAAU;AAC9C,QAAA,IAAI,CAAOA,iBAAA,CAAA,cAAA,CAAe,KAAK,CAAA,EAAG,OAAO,KAAA;AACzC,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,KAAK,GAAI,KAAK,CAAA;AACvC,QAAA,MAAM,aAAa,GAAA,KAAQ,QAAA;AAC3B,QAAA,uBACEN,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,yBAAA,EAAyB,GAAA;AAAA,YACzB,6BAAA,EAA6B,aAAa,EAAA,GAAK,MAAA;AAAA,YAC/C,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,aAAa,MAAA,GAAS,sBAAA;AAAA,cAClC,OAAA,EAAS,aAAa,GAAA,GAAM,CAAA;AAAA,cAC5B,QAAA,EAAU,UAAA;AAAA,cACV,MAAA,EAAQ,aAAa,GAAA,GAAM;AAAA,aAC7B;AAAA,YAEC,QAAA,EAAA;AAAA,WAAA;AAAA,UAVI;AAAA,SAWP;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ;AC1GO,SAAS,aAAA,CAAc;AAAA,EAC5B,SAAA,GAAY,GAAA;AAAA,EACZ,WAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAA2C;AACzC,EAAA,MAAM,UAAA,GAAmBQ,yBAAO,WAAW,CAAA;AAC3C,EAAA,UAAA,CAAW,OAAA,GAAU,WAAA;AAErB,EAAA,MAAM,IAAA,GAAaA,iBAAA,CAAA,OAAA;AAAA,IACjB,MACEC,oBAAA,CAAgB;AAAA,MACd,SAAA;AAAA,MACA,WAAA,EAAa,MAAM,UAAA,CAAW,OAAA;AAAQ,KACvC,CAAA;AAAA,IACH,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,EAAA,KAA2B;AACjD,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd,CAAA;AAEA,EAAA,uBACET,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,sBAAA,EAAqB,EAAA;AAAA,MACrB,aAAA,EAAe,cAAA;AAAA,MACf,WAAA,EAAa,YAAA;AAAA,MACb,cAAA,EAAgB,eAAA;AAAA,MAChB,KAAA,EAAO,EAAE,OAAA,EAAS,UAAA,EAAW;AAAA,MAE5B;AAAA;AAAA,GACH;AAEJ","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"]}
|
package/dist/behaviors.d.cts
CHANGED
|
@@ -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.d.ts
CHANGED
|
@@ -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
|
|
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-
|
|
950
|
-
//# sourceMappingURL=chunk-
|
|
949
|
+
//# sourceMappingURL=chunk-B4RS5WKC.js.map
|
|
950
|
+
//# sourceMappingURL=chunk-B4RS5WKC.js.map
|