@iris-ui-kit/react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/LICENSE +21 -0
  2. package/dist/SidebarLayout-fWQRvK0a.d.cts +26 -0
  3. package/dist/SidebarLayout-fWQRvK0a.d.ts +26 -0
  4. package/dist/admin.cjs +1583 -0
  5. package/dist/admin.cjs.map +1 -0
  6. package/dist/admin.d.cts +183 -0
  7. package/dist/admin.d.ts +183 -0
  8. package/dist/admin.js +9 -0
  9. package/dist/admin.js.map +1 -0
  10. package/dist/async.cjs +97 -0
  11. package/dist/async.cjs.map +1 -0
  12. package/dist/async.d.cts +57 -0
  13. package/dist/async.d.ts +57 -0
  14. package/dist/async.js +5 -0
  15. package/dist/async.js.map +1 -0
  16. package/dist/behaviors.cjs +569 -0
  17. package/dist/behaviors.cjs.map +1 -0
  18. package/dist/behaviors.d.cts +188 -0
  19. package/dist/behaviors.d.ts +188 -0
  20. package/dist/behaviors.js +4 -0
  21. package/dist/behaviors.js.map +1 -0
  22. package/dist/chunk-2TQSTINK.js +541 -0
  23. package/dist/chunk-2TQSTINK.js.map +1 -0
  24. package/dist/chunk-53KFLVIZ.js +68 -0
  25. package/dist/chunk-53KFLVIZ.js.map +1 -0
  26. package/dist/chunk-6BMFMCMQ.js +140 -0
  27. package/dist/chunk-6BMFMCMQ.js.map +1 -0
  28. package/dist/chunk-AUA5GBT6.js +143 -0
  29. package/dist/chunk-AUA5GBT6.js.map +1 -0
  30. package/dist/chunk-DE6V6NOI.js +122 -0
  31. package/dist/chunk-DE6V6NOI.js.map +1 -0
  32. package/dist/chunk-HEJGN6UI.js +78 -0
  33. package/dist/chunk-HEJGN6UI.js.map +1 -0
  34. package/dist/chunk-IDD35UJ6.js +83 -0
  35. package/dist/chunk-IDD35UJ6.js.map +1 -0
  36. package/dist/chunk-J5FB2UB2.js +166 -0
  37. package/dist/chunk-J5FB2UB2.js.map +1 -0
  38. package/dist/chunk-OMOTUHYI.js +66 -0
  39. package/dist/chunk-OMOTUHYI.js.map +1 -0
  40. package/dist/chunk-RZNYIFV2.js +34 -0
  41. package/dist/chunk-RZNYIFV2.js.map +1 -0
  42. package/dist/chunk-SJO74IB3.js +54 -0
  43. package/dist/chunk-SJO74IB3.js.map +1 -0
  44. package/dist/chunk-SORLRLS4.js +53 -0
  45. package/dist/chunk-SORLRLS4.js.map +1 -0
  46. package/dist/chunk-TO7YVSAI.js +64 -0
  47. package/dist/chunk-TO7YVSAI.js.map +1 -0
  48. package/dist/chunk-TQ33XJIK.js +22 -0
  49. package/dist/chunk-TQ33XJIK.js.map +1 -0
  50. package/dist/chunk-UWUUEZCD.js +950 -0
  51. package/dist/chunk-UWUUEZCD.js.map +1 -0
  52. package/dist/chunk-VWCJJRSC.js +1200 -0
  53. package/dist/chunk-VWCJJRSC.js.map +1 -0
  54. package/dist/chunk-WIHBIDVJ.js +54 -0
  55. package/dist/chunk-WIHBIDVJ.js.map +1 -0
  56. package/dist/chunk-XCK4RIXB.js +66 -0
  57. package/dist/chunk-XCK4RIXB.js.map +1 -0
  58. package/dist/chunk-YAHXR2CJ.js +48 -0
  59. package/dist/chunk-YAHXR2CJ.js.map +1 -0
  60. package/dist/chunk-YXIO5THG.js +4 -0
  61. package/dist/chunk-YXIO5THG.js.map +1 -0
  62. package/dist/chunk-ZKBDUWUD.js +156 -0
  63. package/dist/chunk-ZKBDUWUD.js.map +1 -0
  64. package/dist/data.cjs +112 -0
  65. package/dist/data.cjs.map +1 -0
  66. package/dist/data.d.cts +53 -0
  67. package/dist/data.d.ts +53 -0
  68. package/dist/data.js +5 -0
  69. package/dist/data.js.map +1 -0
  70. package/dist/error-boundary.cjs +106 -0
  71. package/dist/error-boundary.cjs.map +1 -0
  72. package/dist/error-boundary.d.cts +41 -0
  73. package/dist/error-boundary.d.ts +41 -0
  74. package/dist/error-boundary.js +6 -0
  75. package/dist/error-boundary.js.map +1 -0
  76. package/dist/floating.cjs +163 -0
  77. package/dist/floating.cjs.map +1 -0
  78. package/dist/floating.d.cts +92 -0
  79. package/dist/floating.d.ts +92 -0
  80. package/dist/floating.js +5 -0
  81. package/dist/floating.js.map +1 -0
  82. package/dist/form.cjs +159 -0
  83. package/dist/form.cjs.map +1 -0
  84. package/dist/form.d.cts +120 -0
  85. package/dist/form.d.ts +120 -0
  86. package/dist/form.js +5 -0
  87. package/dist/form.js.map +1 -0
  88. package/dist/i18n.cjs +100 -0
  89. package/dist/i18n.cjs.map +1 -0
  90. package/dist/i18n.d.cts +50 -0
  91. package/dist/i18n.d.ts +50 -0
  92. package/dist/i18n.js +5 -0
  93. package/dist/i18n.js.map +1 -0
  94. package/dist/index.cjs +16635 -0
  95. package/dist/index.cjs.map +1 -0
  96. package/dist/index.d.cts +2964 -0
  97. package/dist/index.d.ts +2964 -0
  98. package/dist/index.js +12217 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/layouts.cjs +386 -0
  101. package/dist/layouts.cjs.map +1 -0
  102. package/dist/layouts.d.cts +92 -0
  103. package/dist/layouts.d.ts +92 -0
  104. package/dist/layouts.js +6 -0
  105. package/dist/layouts.js.map +1 -0
  106. package/dist/modal-utils.cjs +168 -0
  107. package/dist/modal-utils.cjs.map +1 -0
  108. package/dist/modal-utils.d.cts +43 -0
  109. package/dist/modal-utils.d.ts +43 -0
  110. package/dist/modal-utils.js +4 -0
  111. package/dist/modal-utils.js.map +1 -0
  112. package/dist/motion.cjs +104 -0
  113. package/dist/motion.cjs.map +1 -0
  114. package/dist/motion.d.cts +41 -0
  115. package/dist/motion.d.ts +41 -0
  116. package/dist/motion.js +4 -0
  117. package/dist/motion.js.map +1 -0
  118. package/dist/provider.cjs +191 -0
  119. package/dist/provider.cjs.map +1 -0
  120. package/dist/provider.d.cts +62 -0
  121. package/dist/provider.d.ts +62 -0
  122. package/dist/provider.js +8 -0
  123. package/dist/provider.js.map +1 -0
  124. package/dist/resource.cjs +61 -0
  125. package/dist/resource.cjs.map +1 -0
  126. package/dist/resource.d.cts +21 -0
  127. package/dist/resource.d.ts +21 -0
  128. package/dist/resource.js +5 -0
  129. package/dist/resource.js.map +1 -0
  130. package/dist/skeletons.cjs +1304 -0
  131. package/dist/skeletons.cjs.map +1 -0
  132. package/dist/skeletons.d.cts +70 -0
  133. package/dist/skeletons.d.ts +70 -0
  134. package/dist/skeletons.js +8 -0
  135. package/dist/skeletons.js.map +1 -0
  136. package/dist/skins.cjs +134 -0
  137. package/dist/skins.cjs.map +1 -0
  138. package/dist/skins.d.cts +45 -0
  139. package/dist/skins.d.ts +45 -0
  140. package/dist/skins.js +5 -0
  141. package/dist/skins.js.map +1 -0
  142. package/dist/theme.cjs +100 -0
  143. package/dist/theme.cjs.map +1 -0
  144. package/dist/theme.d.cts +71 -0
  145. package/dist/theme.d.ts +71 -0
  146. package/dist/theme.js +5 -0
  147. package/dist/theme.js.map +1 -0
  148. package/dist/undo.cjs +73 -0
  149. package/dist/undo.cjs.map +1 -0
  150. package/dist/undo.d.cts +47 -0
  151. package/dist/undo.d.ts +47 -0
  152. package/dist/undo.js +4 -0
  153. package/dist/undo.js.map +1 -0
  154. package/package.json +61 -0
@@ -0,0 +1,188 @@
1
+ import * as React from 'react';
2
+
3
+ type IrisResizableHandle = 'top' | 'right' | 'bottom' | 'left' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
4
+ interface IrisResizableSize {
5
+ width: number;
6
+ height: number;
7
+ }
8
+ interface IrisResizableProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {
9
+ /** Controlled size. */
10
+ size?: IrisResizableSize;
11
+ defaultSize?: IrisResizableSize;
12
+ onSizeChange?: (next: IrisResizableSize) => void;
13
+ onResizeStart?: (start: IrisResizableSize) => void;
14
+ onResizeEnd?: (end: IrisResizableSize) => void;
15
+ handles?: IrisResizableHandle[];
16
+ minWidth?: number;
17
+ minHeight?: number;
18
+ maxWidth?: number;
19
+ maxHeight?: number;
20
+ keepAspect?: boolean;
21
+ disabled?: boolean;
22
+ children?: React.ReactNode;
23
+ }
24
+ /**
25
+ * Behavior wrapper: makes its child resizable via 8-direction handles. The
26
+ * wrapper itself is `display: inline-block; position: relative` so the child
27
+ * can be ANY element (no need for the child to know it's wrapped). Handles
28
+ * are absolutely positioned over the wrapper's edges.
29
+ *
30
+ * Composable: stack with `IrisMovable` / `IrisHotkey` / `IrisClickOutside`
31
+ * for richer interactions on the same wrapped UI.
32
+ *
33
+ * @example
34
+ * <IrisResizable defaultSize={{ width: 400, height: 300 }}>
35
+ * <IrisList items={items} />
36
+ * </IrisResizable>
37
+ */
38
+ declare function IrisResizable({ size: sizeProp, defaultSize, onSizeChange, onResizeStart, onResizeEnd, handles, minWidth, minHeight, maxWidth, maxHeight, keepAspect, disabled, style, children, ...rest }: IrisResizableProps): React.ReactElement;
39
+
40
+ interface IrisMovablePosition {
41
+ x: number;
42
+ y: number;
43
+ }
44
+ interface IrisMovableBounds {
45
+ minX?: number;
46
+ maxX?: number;
47
+ minY?: number;
48
+ maxY?: number;
49
+ }
50
+ interface IrisMovableProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue' | 'onDragStart' | 'onDragEnd'> {
51
+ position?: IrisMovablePosition;
52
+ defaultPosition?: IrisMovablePosition;
53
+ onPositionChange?: (next: IrisMovablePosition) => void;
54
+ onDragStart?: (start: IrisMovablePosition) => void;
55
+ onDragEnd?: (end: IrisMovablePosition) => void;
56
+ bounds?: IrisMovableBounds;
57
+ /** Restrict drag origination to a child element marked `data-iris-movable-handle`. */
58
+ byHandle?: boolean;
59
+ disabled?: boolean;
60
+ children?: React.ReactNode;
61
+ }
62
+ /**
63
+ * Behavior wrapper: makes its child draggable. Position is `transform`-based
64
+ * (no layout thrash). The whole wrapper drags by default; pass `byHandle`
65
+ * and put `data-iris-movable-handle=""` on a descendant (e.g. a title bar)
66
+ * to restrict the drag origin.
67
+ *
68
+ * The wrapper renders `position: absolute` at its parent's top-left — wrap
69
+ * inside a `position: relative` container for predictable layout.
70
+ *
71
+ * @example
72
+ * <div style={{ position: 'relative', height: 500 }}>
73
+ * <IrisMovable defaultPosition={{ x: 20, y: 20 }} byHandle>
74
+ * <div>
75
+ * <div data-iris-movable-handle>Drag me by this title bar</div>
76
+ * <IrisList items={items} />
77
+ * </div>
78
+ * </IrisMovable>
79
+ * </div>
80
+ */
81
+ declare function IrisMovable({ position: positionProp, defaultPosition, onPositionChange, onDragStart, onDragEnd, bounds, byHandle, disabled, style, children, ...rest }: IrisMovableProps): React.ReactElement;
82
+
83
+ interface IrisHotkeyProps {
84
+ /**
85
+ * Shortcut or list of shortcuts. Format: `'Escape'`, `'Enter'`, `'Mod+s'`,
86
+ * `'Shift+/'`. `Mod` matches Ctrl on Win/Linux and Cmd on macOS.
87
+ */
88
+ shortcut: string | string[];
89
+ onTrigger: (event: KeyboardEvent) => void;
90
+ /** Disable the binding (no-op if true). */
91
+ disabled?: boolean;
92
+ /**
93
+ * Allow the hotkey to fire even when focus is inside an input / textarea /
94
+ * contentEditable element. Default false (most apps want hotkeys to skip
95
+ * while typing).
96
+ */
97
+ allowInInputs?: boolean;
98
+ /** Scope: 'document' (default) or 'window'. */
99
+ scope?: 'document' | 'window';
100
+ children?: React.ReactNode;
101
+ }
102
+ /**
103
+ * Behavior wrapper: binds a global keyboard shortcut while children are
104
+ * mounted. Renderless — returns children verbatim (no extra DOM).
105
+ *
106
+ * @example
107
+ * <IrisHotkey shortcut="Escape" onTrigger={close}>
108
+ * <IrisDialog>…</IrisDialog>
109
+ * </IrisHotkey>
110
+ *
111
+ * <IrisHotkey shortcut={['Mod+s', 'Mod+Shift+s']} onTrigger={save}>
112
+ * <IrisForm>…</IrisForm>
113
+ * </IrisHotkey>
114
+ */
115
+ declare function IrisHotkey({ shortcut, onTrigger, disabled, allowInInputs, scope, children, }: IrisHotkeyProps): React.ReactElement;
116
+
117
+ interface IrisClickOutsideProps {
118
+ onOutside: (event: PointerEvent) => void;
119
+ /** Disable detection (no-op if true). */
120
+ disabled?: boolean;
121
+ /**
122
+ * Additional refs whose elements are also treated as "inside" (clicks
123
+ * against them won't fire `onOutside`). Useful for trigger buttons that
124
+ * live outside the wrapper but should still keep it open.
125
+ */
126
+ ignore?: Array<React.RefObject<HTMLElement | null>>;
127
+ children?: React.ReactNode;
128
+ }
129
+ /**
130
+ * Behavior wrapper: fires `onOutside` when a pointerdown happens outside
131
+ * the wrapped child tree. Renders a thin `<span style="display:contents">`
132
+ * to capture the child's bounding box without disrupting layout.
133
+ *
134
+ * @example
135
+ * <IrisClickOutside onOutside={() => setOpen(false)}>
136
+ * <IrisPopoverContent>…</IrisPopoverContent>
137
+ * </IrisClickOutside>
138
+ */
139
+ declare function IrisClickOutside({ onOutside, disabled, ignore, children, }: IrisClickOutsideProps): React.ReactElement;
140
+
141
+ /**
142
+ * Behavior wrapper: makes a list of items sortable via drag-and-drop.
143
+ * Uses `createSortable` from `@iris-ui-kit/core` for the drag-and-drop controller.
144
+ *
145
+ * @example
146
+ * const [items, setItems] = React.useState(['A', 'B', 'C'])
147
+ * <IrisSortable items={items} onReorder={setItems}>
148
+ * {items.map((label) => <div key={label}>{label}</div>)}
149
+ * </IrisSortable>
150
+ */
151
+
152
+ interface IrisSortableProps<T = string> {
153
+ items: readonly T[];
154
+ onReorder: (next: T[]) => void;
155
+ getKey?: (item: T, index: number) => string;
156
+ children?: React.ReactNode;
157
+ className?: string;
158
+ style?: React.CSSProperties;
159
+ disabled?: boolean;
160
+ }
161
+ 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
+
164
+ /**
165
+ * Behavior wrapper: detects a press-and-hold gesture on the wrapped element.
166
+ * Fires `onLongPress` when the pointer is held down for `holdDelay` ms.
167
+ * Wraps children in a `display: contents` span so event bubbling works.
168
+ *
169
+ * Composable: stack with `IrisMovable` / `IrisResizable` / `IrisSortable` /
170
+ * `IrisHotkey` for richer interactions.
171
+ *
172
+ * @example
173
+ * <IrisLongPress holdDelay={500} onLongPress={() => setOpen(true)}>
174
+ * <img src="thumbnail.jpg" alt="Hold to preview" />
175
+ * </IrisLongPress>
176
+ */
177
+
178
+ interface IrisLongPressProps {
179
+ /** Time in ms the pointer must be held before `onLongPress` fires. */
180
+ holdDelay?: number;
181
+ /** Called once when the hold reaches `holdDelay`. */
182
+ onLongPress: () => void;
183
+ disabled?: boolean;
184
+ children?: React.ReactNode;
185
+ }
186
+ declare function IrisLongPress({ holdDelay, onLongPress, disabled, children, }: IrisLongPressProps): React.ReactElement;
187
+
188
+ export { IrisClickOutside, type IrisClickOutsideProps, IrisHotkey, type IrisHotkeyProps, IrisLongPress, type IrisLongPressProps, IrisMovable, type IrisMovableBounds, type IrisMovablePosition, type IrisMovableProps, IrisResizable, type IrisResizableHandle, type IrisResizableProps, type IrisResizableSize, IrisSortable, type IrisSortableProps, SORTABLE_ITEM_ATTR };
@@ -0,0 +1,188 @@
1
+ import * as React from 'react';
2
+
3
+ type IrisResizableHandle = 'top' | 'right' | 'bottom' | 'left' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
4
+ interface IrisResizableSize {
5
+ width: number;
6
+ height: number;
7
+ }
8
+ interface IrisResizableProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {
9
+ /** Controlled size. */
10
+ size?: IrisResizableSize;
11
+ defaultSize?: IrisResizableSize;
12
+ onSizeChange?: (next: IrisResizableSize) => void;
13
+ onResizeStart?: (start: IrisResizableSize) => void;
14
+ onResizeEnd?: (end: IrisResizableSize) => void;
15
+ handles?: IrisResizableHandle[];
16
+ minWidth?: number;
17
+ minHeight?: number;
18
+ maxWidth?: number;
19
+ maxHeight?: number;
20
+ keepAspect?: boolean;
21
+ disabled?: boolean;
22
+ children?: React.ReactNode;
23
+ }
24
+ /**
25
+ * Behavior wrapper: makes its child resizable via 8-direction handles. The
26
+ * wrapper itself is `display: inline-block; position: relative` so the child
27
+ * can be ANY element (no need for the child to know it's wrapped). Handles
28
+ * are absolutely positioned over the wrapper's edges.
29
+ *
30
+ * Composable: stack with `IrisMovable` / `IrisHotkey` / `IrisClickOutside`
31
+ * for richer interactions on the same wrapped UI.
32
+ *
33
+ * @example
34
+ * <IrisResizable defaultSize={{ width: 400, height: 300 }}>
35
+ * <IrisList items={items} />
36
+ * </IrisResizable>
37
+ */
38
+ declare function IrisResizable({ size: sizeProp, defaultSize, onSizeChange, onResizeStart, onResizeEnd, handles, minWidth, minHeight, maxWidth, maxHeight, keepAspect, disabled, style, children, ...rest }: IrisResizableProps): React.ReactElement;
39
+
40
+ interface IrisMovablePosition {
41
+ x: number;
42
+ y: number;
43
+ }
44
+ interface IrisMovableBounds {
45
+ minX?: number;
46
+ maxX?: number;
47
+ minY?: number;
48
+ maxY?: number;
49
+ }
50
+ interface IrisMovableProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue' | 'onDragStart' | 'onDragEnd'> {
51
+ position?: IrisMovablePosition;
52
+ defaultPosition?: IrisMovablePosition;
53
+ onPositionChange?: (next: IrisMovablePosition) => void;
54
+ onDragStart?: (start: IrisMovablePosition) => void;
55
+ onDragEnd?: (end: IrisMovablePosition) => void;
56
+ bounds?: IrisMovableBounds;
57
+ /** Restrict drag origination to a child element marked `data-iris-movable-handle`. */
58
+ byHandle?: boolean;
59
+ disabled?: boolean;
60
+ children?: React.ReactNode;
61
+ }
62
+ /**
63
+ * Behavior wrapper: makes its child draggable. Position is `transform`-based
64
+ * (no layout thrash). The whole wrapper drags by default; pass `byHandle`
65
+ * and put `data-iris-movable-handle=""` on a descendant (e.g. a title bar)
66
+ * to restrict the drag origin.
67
+ *
68
+ * The wrapper renders `position: absolute` at its parent's top-left — wrap
69
+ * inside a `position: relative` container for predictable layout.
70
+ *
71
+ * @example
72
+ * <div style={{ position: 'relative', height: 500 }}>
73
+ * <IrisMovable defaultPosition={{ x: 20, y: 20 }} byHandle>
74
+ * <div>
75
+ * <div data-iris-movable-handle>Drag me by this title bar</div>
76
+ * <IrisList items={items} />
77
+ * </div>
78
+ * </IrisMovable>
79
+ * </div>
80
+ */
81
+ declare function IrisMovable({ position: positionProp, defaultPosition, onPositionChange, onDragStart, onDragEnd, bounds, byHandle, disabled, style, children, ...rest }: IrisMovableProps): React.ReactElement;
82
+
83
+ interface IrisHotkeyProps {
84
+ /**
85
+ * Shortcut or list of shortcuts. Format: `'Escape'`, `'Enter'`, `'Mod+s'`,
86
+ * `'Shift+/'`. `Mod` matches Ctrl on Win/Linux and Cmd on macOS.
87
+ */
88
+ shortcut: string | string[];
89
+ onTrigger: (event: KeyboardEvent) => void;
90
+ /** Disable the binding (no-op if true). */
91
+ disabled?: boolean;
92
+ /**
93
+ * Allow the hotkey to fire even when focus is inside an input / textarea /
94
+ * contentEditable element. Default false (most apps want hotkeys to skip
95
+ * while typing).
96
+ */
97
+ allowInInputs?: boolean;
98
+ /** Scope: 'document' (default) or 'window'. */
99
+ scope?: 'document' | 'window';
100
+ children?: React.ReactNode;
101
+ }
102
+ /**
103
+ * Behavior wrapper: binds a global keyboard shortcut while children are
104
+ * mounted. Renderless — returns children verbatim (no extra DOM).
105
+ *
106
+ * @example
107
+ * <IrisHotkey shortcut="Escape" onTrigger={close}>
108
+ * <IrisDialog>…</IrisDialog>
109
+ * </IrisHotkey>
110
+ *
111
+ * <IrisHotkey shortcut={['Mod+s', 'Mod+Shift+s']} onTrigger={save}>
112
+ * <IrisForm>…</IrisForm>
113
+ * </IrisHotkey>
114
+ */
115
+ declare function IrisHotkey({ shortcut, onTrigger, disabled, allowInInputs, scope, children, }: IrisHotkeyProps): React.ReactElement;
116
+
117
+ interface IrisClickOutsideProps {
118
+ onOutside: (event: PointerEvent) => void;
119
+ /** Disable detection (no-op if true). */
120
+ disabled?: boolean;
121
+ /**
122
+ * Additional refs whose elements are also treated as "inside" (clicks
123
+ * against them won't fire `onOutside`). Useful for trigger buttons that
124
+ * live outside the wrapper but should still keep it open.
125
+ */
126
+ ignore?: Array<React.RefObject<HTMLElement | null>>;
127
+ children?: React.ReactNode;
128
+ }
129
+ /**
130
+ * Behavior wrapper: fires `onOutside` when a pointerdown happens outside
131
+ * the wrapped child tree. Renders a thin `<span style="display:contents">`
132
+ * to capture the child's bounding box without disrupting layout.
133
+ *
134
+ * @example
135
+ * <IrisClickOutside onOutside={() => setOpen(false)}>
136
+ * <IrisPopoverContent>…</IrisPopoverContent>
137
+ * </IrisClickOutside>
138
+ */
139
+ declare function IrisClickOutside({ onOutside, disabled, ignore, children, }: IrisClickOutsideProps): React.ReactElement;
140
+
141
+ /**
142
+ * Behavior wrapper: makes a list of items sortable via drag-and-drop.
143
+ * Uses `createSortable` from `@iris-ui-kit/core` for the drag-and-drop controller.
144
+ *
145
+ * @example
146
+ * const [items, setItems] = React.useState(['A', 'B', 'C'])
147
+ * <IrisSortable items={items} onReorder={setItems}>
148
+ * {items.map((label) => <div key={label}>{label}</div>)}
149
+ * </IrisSortable>
150
+ */
151
+
152
+ interface IrisSortableProps<T = string> {
153
+ items: readonly T[];
154
+ onReorder: (next: T[]) => void;
155
+ getKey?: (item: T, index: number) => string;
156
+ children?: React.ReactNode;
157
+ className?: string;
158
+ style?: React.CSSProperties;
159
+ disabled?: boolean;
160
+ }
161
+ 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
+
164
+ /**
165
+ * Behavior wrapper: detects a press-and-hold gesture on the wrapped element.
166
+ * Fires `onLongPress` when the pointer is held down for `holdDelay` ms.
167
+ * Wraps children in a `display: contents` span so event bubbling works.
168
+ *
169
+ * Composable: stack with `IrisMovable` / `IrisResizable` / `IrisSortable` /
170
+ * `IrisHotkey` for richer interactions.
171
+ *
172
+ * @example
173
+ * <IrisLongPress holdDelay={500} onLongPress={() => setOpen(true)}>
174
+ * <img src="thumbnail.jpg" alt="Hold to preview" />
175
+ * </IrisLongPress>
176
+ */
177
+
178
+ interface IrisLongPressProps {
179
+ /** Time in ms the pointer must be held before `onLongPress` fires. */
180
+ holdDelay?: number;
181
+ /** Called once when the hold reaches `holdDelay`. */
182
+ onLongPress: () => void;
183
+ disabled?: boolean;
184
+ children?: React.ReactNode;
185
+ }
186
+ declare function IrisLongPress({ holdDelay, onLongPress, disabled, children, }: IrisLongPressProps): React.ReactElement;
187
+
188
+ export { IrisClickOutside, type IrisClickOutsideProps, IrisHotkey, type IrisHotkeyProps, IrisLongPress, type IrisLongPressProps, IrisMovable, type IrisMovableBounds, type IrisMovablePosition, type IrisMovableProps, IrisResizable, type IrisResizableHandle, type IrisResizableProps, type IrisResizableSize, IrisSortable, type IrisSortableProps, SORTABLE_ITEM_ATTR };
@@ -0,0 +1,4 @@
1
+ 'use client'
2
+ export { IrisClickOutside, IrisHotkey, IrisLongPress, IrisMovable, IrisResizable, IrisSortable, SORTABLE_ITEM_ATTR } from './chunk-2TQSTINK.js';
3
+ //# sourceMappingURL=behaviors.js.map
4
+ //# sourceMappingURL=behaviors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":";","file":"behaviors.js"}