@harborclient/sdk 1.3.3 → 1.3.4
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/CHANGELOG.md +10 -0
- package/dist/components/AnchorMenuPanel/index.d.ts +35 -0
- package/dist/components/AnchorMenuPanel/index.d.ts.map +1 -0
- package/dist/components/AnchorMenuPanel/index.js +364 -0
- package/dist/components/FormGroup/index.d.ts +7 -1
- package/dist/components/FormGroup/index.d.ts.map +1 -1
- package/dist/components/FormGroup/index.js +8 -11
- package/dist/components/PageSidebar/index.d.ts +1 -0
- package/dist/components/PageSidebar/index.d.ts.map +1 -1
- package/dist/components/PageSidebar/index.js +4 -13
- package/dist/components/Resizable/useResizable.d.ts +6 -0
- package/dist/components/Resizable/useResizable.d.ts.map +1 -1
- package/dist/components/Resizable/useResizable.js +113 -11
- package/dist/components/SettingFieldActions/index.d.ts +42 -0
- package/dist/components/SettingFieldActions/index.d.ts.map +1 -0
- package/dist/components/SettingFieldActions/index.js +66 -0
- package/dist/components/SidebarItem/SidebarHistoryItem.d.ts +5 -1
- package/dist/components/SidebarItem/SidebarHistoryItem.d.ts.map +1 -1
- package/dist/components/SidebarItem/SidebarHistoryItem.js +2 -2
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +2 -0
- package/dist/runtime/createBridgedPluginContext.js +166 -2
- package/dist/snippets.d.ts +22 -0
- package/dist/types.d.ts +858 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 1.3.4 - 2026-07-28
|
|
8
|
+
|
|
9
|
+
- Implement hc.ask API for one-shot AI completions. (`aed2809f`)
|
|
10
|
+
- Enhance plugin library and sidebar selection handling. (`5a919ac6`)
|
|
11
|
+
- Enhance settings management and UI components. (`31e7f975`)
|
|
12
|
+
- Refactor settings draft management and enhance default handling. (`5650b3e6`)
|
|
13
|
+
- Refactor BodyEditor and enhance selection handling. (`d28dd6b7`)
|
|
14
|
+
- Refactor shortcuts handling and update UI components. (`a85cf446`)
|
|
15
|
+
- Enhance response handling and UI features. (`b076b194`)
|
|
16
|
+
|
|
7
17
|
## 1.3.3 - 2026-07-27
|
|
8
18
|
|
|
9
19
|
- Update @harborclient/team-hub-api dependency to version 0.4.1 and enhance documentation for import handlers. (`516c9dae`)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { JSX } from 'react';
|
|
2
|
+
import type { MenuItem } from '../RowActionsMenu/index.js';
|
|
3
|
+
import { type MenuPosition } from '../menuPosition.js';
|
|
4
|
+
interface Props {
|
|
5
|
+
/**
|
|
6
|
+
* Grouped menu entries. Each inner array is one visual group separated by a divider.
|
|
7
|
+
*/
|
|
8
|
+
groups: MenuItem[][];
|
|
9
|
+
/**
|
|
10
|
+
* Host viewport coordinates for the panel top-left corner (before clamping).
|
|
11
|
+
*/
|
|
12
|
+
anchor: MenuPosition;
|
|
13
|
+
/**
|
|
14
|
+
* Called when the menu dismisses (outside click, Escape, Tab, or item select).
|
|
15
|
+
*/
|
|
16
|
+
onDismiss: () => void;
|
|
17
|
+
/**
|
|
18
|
+
* Unique id for this menu instance (used for a11y ids). Defaults to `anchor-menu`.
|
|
19
|
+
*/
|
|
20
|
+
menuId?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Optional class names merged onto the portaled panel.
|
|
23
|
+
*/
|
|
24
|
+
className?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Portaled context menu panel anchored to viewport coordinates (no hamburger trigger).
|
|
28
|
+
*
|
|
29
|
+
* Used by the host for plugin-requested entity menus (`showEntityContextMenu`) and any
|
|
30
|
+
* other cursor-anchored menu that should match {@link RowActionsMenu} keyboard and
|
|
31
|
+
* submenu behavior without owning a row trigger button.
|
|
32
|
+
*/
|
|
33
|
+
export declare function AnchorMenuPanel({ groups, anchor, onDismiss, menuId, className }: Props): JSX.Element | null;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AnchorMenuPanel/index.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,GAAG,EAAiB,MAAM,OAAO,CAAC;AAGhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAqB,KAAK,YAAY,EAAqB,MAAM,oBAAoB,CAAC;AAU7F,UAAU,KAAK;IACb;;OAEG;IACH,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;IAErB;;OAEG;IACH,MAAM,EAAE,YAAY,CAAC;IAErB;;OAEG;IACH,SAAS,EAAE,MAAM,IAAI,CAAC;IAEtB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,MAAM,EACN,SAAS,EACT,MAAsB,EACtB,SAAS,EACV,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CA+c5B"}
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "@harborclient/sdk/jsx-runtime";
|
|
2
|
+
import { faCaretRight, faCheck } from '@fortawesome/free-solid-svg-icons';
|
|
3
|
+
import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from '@harborclient/sdk/react';
|
|
4
|
+
import { FaIcon } from '../FaIcon/index.js';
|
|
5
|
+
import { Submenu } from '../RowActionsMenu/Submenu.js';
|
|
6
|
+
import { MENU_MIN_WIDTH_PX, clampMenuPosition } from '../menuPosition.js';
|
|
7
|
+
import { portalToBody } from '../portalToBody.js';
|
|
8
|
+
import { findAdjacentEnabledIndex, findEdgeEnabledIndex, isMenuItemEnabled, menuItemClass } from '../rowActionsMenuHelpers.js';
|
|
9
|
+
import { cn, resolveMenuTypeahead } from '../utils.js';
|
|
10
|
+
const TYPEAHEAD_TIMEOUT_MS = 500;
|
|
11
|
+
/** Delay before a hovered row's submenu opens. */
|
|
12
|
+
const SUBMENU_OPEN_DELAY_MS = 120;
|
|
13
|
+
/** Delay before a submenu closes after the pointer leaves its row and panel. */
|
|
14
|
+
const SUBMENU_CLOSE_DELAY_MS = 200;
|
|
15
|
+
/**
|
|
16
|
+
* Portaled context menu panel anchored to viewport coordinates (no hamburger trigger).
|
|
17
|
+
*
|
|
18
|
+
* Used by the host for plugin-requested entity menus (`showEntityContextMenu`) and any
|
|
19
|
+
* other cursor-anchored menu that should match {@link RowActionsMenu} keyboard and
|
|
20
|
+
* submenu behavior without owning a row trigger button.
|
|
21
|
+
*/
|
|
22
|
+
export function AnchorMenuPanel({ groups, anchor, onDismiss, menuId = 'anchor-menu', className }) {
|
|
23
|
+
const menuElementId = `${menuId}-menu`;
|
|
24
|
+
const submenuElementId = `${menuId}-submenu`;
|
|
25
|
+
const panelRef = useRef(null);
|
|
26
|
+
const itemRefs = useRef([]);
|
|
27
|
+
const typeaheadBuffer = useRef('');
|
|
28
|
+
const typeaheadTimer = useRef(null);
|
|
29
|
+
const submenuOpenTimer = useRef(null);
|
|
30
|
+
const submenuCloseTimer = useRef(null);
|
|
31
|
+
const [focusedIndex, setFocusedIndex] = useState(0);
|
|
32
|
+
const [menuPosition, setMenuPosition] = useState(anchor);
|
|
33
|
+
const [openSubmenuIndex, setOpenSubmenuIndex] = useState(null);
|
|
34
|
+
/**
|
|
35
|
+
* Flattens grouped items once for keyboard navigation and typeahead.
|
|
36
|
+
*/
|
|
37
|
+
const flatItems = useMemo(() => groups.flat(), [groups]);
|
|
38
|
+
/**
|
|
39
|
+
* Labels used by typeahead matching.
|
|
40
|
+
*/
|
|
41
|
+
const itemLabels = useMemo(() => flatItems.map((item) => item.label), [flatItems]);
|
|
42
|
+
/**
|
|
43
|
+
* Whether any item can receive focus / activation.
|
|
44
|
+
*/
|
|
45
|
+
const hasEnabledItems = useMemo(() => flatItems.some((item) => isMenuItemEnabled(item)), [flatItems]);
|
|
46
|
+
/**
|
|
47
|
+
* Clears the accumulated typeahead buffer.
|
|
48
|
+
*/
|
|
49
|
+
const clearTypeahead = useCallback(() => {
|
|
50
|
+
typeaheadBuffer.current = '';
|
|
51
|
+
if (typeaheadTimer.current != null) {
|
|
52
|
+
window.clearTimeout(typeaheadTimer.current);
|
|
53
|
+
typeaheadTimer.current = null;
|
|
54
|
+
}
|
|
55
|
+
}, []);
|
|
56
|
+
/**
|
|
57
|
+
* Cancels any pending submenu open/close timers.
|
|
58
|
+
*/
|
|
59
|
+
const clearSubmenuTimers = useCallback(() => {
|
|
60
|
+
if (submenuOpenTimer.current != null) {
|
|
61
|
+
window.clearTimeout(submenuOpenTimer.current);
|
|
62
|
+
submenuOpenTimer.current = null;
|
|
63
|
+
}
|
|
64
|
+
if (submenuCloseTimer.current != null) {
|
|
65
|
+
window.clearTimeout(submenuCloseTimer.current);
|
|
66
|
+
submenuCloseTimer.current = null;
|
|
67
|
+
}
|
|
68
|
+
}, []);
|
|
69
|
+
/**
|
|
70
|
+
* Dismisses the menu and clears transient keyboard/submenu state.
|
|
71
|
+
*/
|
|
72
|
+
const dismiss = useCallback(() => {
|
|
73
|
+
clearTypeahead();
|
|
74
|
+
clearSubmenuTimers();
|
|
75
|
+
onDismiss();
|
|
76
|
+
}, [clearSubmenuTimers, clearTypeahead, onDismiss]);
|
|
77
|
+
/**
|
|
78
|
+
* Opens the submenu belonging to the item at `index` immediately.
|
|
79
|
+
*
|
|
80
|
+
* @param index - Flat item index that owns a submenu.
|
|
81
|
+
*/
|
|
82
|
+
const openSubmenuAt = useCallback((index) => {
|
|
83
|
+
clearSubmenuTimers();
|
|
84
|
+
setOpenSubmenuIndex(index);
|
|
85
|
+
}, [clearSubmenuTimers]);
|
|
86
|
+
/**
|
|
87
|
+
* Closes the currently open submenu and returns focus to its parent row.
|
|
88
|
+
*/
|
|
89
|
+
const closeSubmenuAndRefocus = useCallback(() => {
|
|
90
|
+
clearSubmenuTimers();
|
|
91
|
+
setOpenSubmenuIndex((current) => {
|
|
92
|
+
if (current != null) {
|
|
93
|
+
requestAnimationFrame(() => {
|
|
94
|
+
itemRefs.current[current]?.focus();
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
});
|
|
99
|
+
}, [clearSubmenuTimers]);
|
|
100
|
+
/**
|
|
101
|
+
* Schedules opening the submenu at `index` after a short hover-intent delay.
|
|
102
|
+
*
|
|
103
|
+
* @param index - Flat item index that owns a submenu.
|
|
104
|
+
*/
|
|
105
|
+
const scheduleOpenSubmenu = useCallback((index) => {
|
|
106
|
+
clearSubmenuTimers();
|
|
107
|
+
submenuOpenTimer.current = window.setTimeout(() => {
|
|
108
|
+
submenuOpenTimer.current = null;
|
|
109
|
+
setOpenSubmenuIndex(index);
|
|
110
|
+
}, SUBMENU_OPEN_DELAY_MS);
|
|
111
|
+
}, [clearSubmenuTimers]);
|
|
112
|
+
/**
|
|
113
|
+
* Schedules closing the open submenu after a short delay.
|
|
114
|
+
*/
|
|
115
|
+
const scheduleCloseSubmenu = useCallback(() => {
|
|
116
|
+
if (submenuOpenTimer.current != null) {
|
|
117
|
+
window.clearTimeout(submenuOpenTimer.current);
|
|
118
|
+
submenuOpenTimer.current = null;
|
|
119
|
+
}
|
|
120
|
+
submenuCloseTimer.current = window.setTimeout(() => {
|
|
121
|
+
submenuCloseTimer.current = null;
|
|
122
|
+
setOpenSubmenuIndex(null);
|
|
123
|
+
}, SUBMENU_CLOSE_DELAY_MS);
|
|
124
|
+
}, []);
|
|
125
|
+
/**
|
|
126
|
+
* Handles pointer hover over a row: opens that row's submenu or schedules close.
|
|
127
|
+
*
|
|
128
|
+
* @param item - Menu item under the pointer.
|
|
129
|
+
* @param itemIndex - Flat index of that item.
|
|
130
|
+
*/
|
|
131
|
+
const handleItemMouseEnter = useCallback((item, itemIndex) => {
|
|
132
|
+
if (item.submenu) {
|
|
133
|
+
if (openSubmenuIndex === itemIndex) {
|
|
134
|
+
clearSubmenuTimers();
|
|
135
|
+
}
|
|
136
|
+
else if (openSubmenuIndex != null) {
|
|
137
|
+
openSubmenuAt(itemIndex);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
scheduleOpenSubmenu(itemIndex);
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (openSubmenuIndex != null) {
|
|
145
|
+
scheduleCloseSubmenu();
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
clearSubmenuTimers();
|
|
149
|
+
}
|
|
150
|
+
}, [clearSubmenuTimers, openSubmenuAt, openSubmenuIndex, scheduleCloseSubmenu, scheduleOpenSubmenu]);
|
|
151
|
+
/**
|
|
152
|
+
* Focuses a menu item by index and updates roving tabindex state.
|
|
153
|
+
*
|
|
154
|
+
* @param index - Flat item index to focus.
|
|
155
|
+
*/
|
|
156
|
+
const focusItem = useCallback((index) => {
|
|
157
|
+
setFocusedIndex(index);
|
|
158
|
+
requestAnimationFrame(() => {
|
|
159
|
+
itemRefs.current[index]?.focus();
|
|
160
|
+
});
|
|
161
|
+
}, []);
|
|
162
|
+
/**
|
|
163
|
+
* Clamps the panel so it stays fully inside the viewport using measured size.
|
|
164
|
+
*/
|
|
165
|
+
const updateMenuPosition = useCallback(() => {
|
|
166
|
+
const panelRect = panelRef.current?.getBoundingClientRect();
|
|
167
|
+
const menuSize = {
|
|
168
|
+
width: panelRect?.width ?? MENU_MIN_WIDTH_PX,
|
|
169
|
+
height: panelRect?.height ?? 0
|
|
170
|
+
};
|
|
171
|
+
if (menuSize.height > 0) {
|
|
172
|
+
setMenuPosition(clampMenuPosition(anchor, menuSize));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
setMenuPosition(anchor);
|
|
176
|
+
}, [anchor]);
|
|
177
|
+
/**
|
|
178
|
+
* Focuses the first enabled item after mount.
|
|
179
|
+
*/
|
|
180
|
+
useEffect(() => {
|
|
181
|
+
if (!hasEnabledItems) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const edgeIndex = findEdgeEnabledIndex(flatItems, false);
|
|
185
|
+
if (edgeIndex == null) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
setFocusedIndex(edgeIndex);
|
|
189
|
+
requestAnimationFrame(() => {
|
|
190
|
+
itemRefs.current[edgeIndex]?.focus();
|
|
191
|
+
});
|
|
192
|
+
}, [flatItems, hasEnabledItems]);
|
|
193
|
+
/**
|
|
194
|
+
* Re-clamps the portaled menu after mount once panel dimensions are known.
|
|
195
|
+
*/
|
|
196
|
+
useLayoutEffect(() => {
|
|
197
|
+
updateMenuPosition();
|
|
198
|
+
}, [groups, updateMenuPosition]);
|
|
199
|
+
/**
|
|
200
|
+
* Re-clamps on scroll/resize while the panel is open.
|
|
201
|
+
*/
|
|
202
|
+
useEffect(() => {
|
|
203
|
+
updateMenuPosition();
|
|
204
|
+
window.addEventListener('scroll', updateMenuPosition, true);
|
|
205
|
+
window.addEventListener('resize', updateMenuPosition);
|
|
206
|
+
return () => {
|
|
207
|
+
window.removeEventListener('scroll', updateMenuPosition, true);
|
|
208
|
+
window.removeEventListener('resize', updateMenuPosition);
|
|
209
|
+
};
|
|
210
|
+
}, [updateMenuPosition]);
|
|
211
|
+
/**
|
|
212
|
+
* Dismisses on outside click; Escape closes submenu first, then the panel.
|
|
213
|
+
*/
|
|
214
|
+
useEffect(() => {
|
|
215
|
+
const handleMouseDown = (e) => {
|
|
216
|
+
const target = e.target;
|
|
217
|
+
if (panelRef.current?.contains(target) ||
|
|
218
|
+
document.getElementById(submenuElementId)?.contains(target)) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
dismiss();
|
|
222
|
+
};
|
|
223
|
+
const handleKeyDown = (e) => {
|
|
224
|
+
if (e.key === 'Escape') {
|
|
225
|
+
e.preventDefault();
|
|
226
|
+
if (openSubmenuIndex != null) {
|
|
227
|
+
closeSubmenuAndRefocus();
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
dismiss();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
document.addEventListener('mousedown', handleMouseDown);
|
|
235
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
236
|
+
return () => {
|
|
237
|
+
document.removeEventListener('mousedown', handleMouseDown);
|
|
238
|
+
document.removeEventListener('keydown', handleKeyDown);
|
|
239
|
+
};
|
|
240
|
+
}, [closeSubmenuAndRefocus, dismiss, openSubmenuIndex, submenuElementId]);
|
|
241
|
+
/**
|
|
242
|
+
* Clears timers on unmount.
|
|
243
|
+
*/
|
|
244
|
+
useEffect(() => {
|
|
245
|
+
return () => {
|
|
246
|
+
clearTypeahead();
|
|
247
|
+
clearSubmenuTimers();
|
|
248
|
+
};
|
|
249
|
+
}, [clearSubmenuTimers, clearTypeahead]);
|
|
250
|
+
/**
|
|
251
|
+
* Handles keyboard navigation within the open menu.
|
|
252
|
+
*
|
|
253
|
+
* @param event - Keyboard event from the menu panel.
|
|
254
|
+
*/
|
|
255
|
+
const handleMenuKeyDown = (event) => {
|
|
256
|
+
if (!hasEnabledItems)
|
|
257
|
+
return;
|
|
258
|
+
if (event.key === 'Tab') {
|
|
259
|
+
dismiss();
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
if (event.key === 'ArrowRight') {
|
|
263
|
+
const candidate = flatItems[focusedIndex];
|
|
264
|
+
if (candidate?.submenu) {
|
|
265
|
+
event.preventDefault();
|
|
266
|
+
openSubmenuAt(focusedIndex);
|
|
267
|
+
}
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
|
|
271
|
+
const direction = event.key === 'ArrowDown' ? 1 : -1;
|
|
272
|
+
const nextIndex = findAdjacentEnabledIndex(flatItems, focusedIndex, direction);
|
|
273
|
+
if (nextIndex != null) {
|
|
274
|
+
event.preventDefault();
|
|
275
|
+
clearTypeahead();
|
|
276
|
+
focusItem(nextIndex);
|
|
277
|
+
}
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
if (event.key === 'Home') {
|
|
281
|
+
const firstIndex = findEdgeEnabledIndex(flatItems, false);
|
|
282
|
+
if (firstIndex != null) {
|
|
283
|
+
event.preventDefault();
|
|
284
|
+
clearTypeahead();
|
|
285
|
+
focusItem(firstIndex);
|
|
286
|
+
}
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
if (event.key === 'End') {
|
|
290
|
+
const lastIndex = findEdgeEnabledIndex(flatItems, true);
|
|
291
|
+
if (lastIndex != null) {
|
|
292
|
+
event.preventDefault();
|
|
293
|
+
clearTypeahead();
|
|
294
|
+
focusItem(lastIndex);
|
|
295
|
+
}
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
const typeahead = resolveMenuTypeahead(itemLabels, focusedIndex, event.key, typeaheadBuffer.current);
|
|
299
|
+
if (typeahead) {
|
|
300
|
+
const candidate = flatItems[typeahead.index];
|
|
301
|
+
if (!candidate || !isMenuItemEnabled(candidate)) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
event.preventDefault();
|
|
305
|
+
typeaheadBuffer.current = typeahead.buffer;
|
|
306
|
+
if (typeaheadTimer.current != null) {
|
|
307
|
+
window.clearTimeout(typeaheadTimer.current);
|
|
308
|
+
}
|
|
309
|
+
typeaheadTimer.current = window.setTimeout(() => {
|
|
310
|
+
typeaheadBuffer.current = '';
|
|
311
|
+
typeaheadTimer.current = null;
|
|
312
|
+
}, TYPEAHEAD_TIMEOUT_MS);
|
|
313
|
+
focusItem(typeahead.index);
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
if (!hasEnabledItems) {
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
const openSubmenuItem = openSubmenuIndex != null ? flatItems[openSubmenuIndex] : undefined;
|
|
320
|
+
const openSubmenuAnchorRect = openSubmenuIndex != null ? itemRefs.current[openSubmenuIndex]?.getBoundingClientRect() : null;
|
|
321
|
+
const menuPanel = (_jsx("div", { ref: panelRef, id: menuElementId, role: "menu", className: cn('hc-anchor-menu-panel hc-row-actions-menu-panel app-no-drag fixed z-50 min-w-[200px] rounded-md border border-separator bg-surface py-1 shadow-md', className), style: { left: menuPosition.x, top: menuPosition.y }, onKeyDown: handleMenuKeyDown, onMouseLeave: () => {
|
|
322
|
+
if (openSubmenuIndex != null) {
|
|
323
|
+
scheduleCloseSubmenu();
|
|
324
|
+
}
|
|
325
|
+
}, children: groups.map((group, groupIndex) => {
|
|
326
|
+
let flatIndex = groups.slice(0, groupIndex).reduce((count, g) => count + g.length, 0);
|
|
327
|
+
return (_jsx("div", { className: groupIndex > 0
|
|
328
|
+
? 'hc-row-actions-menu-group border-t border-separator'
|
|
329
|
+
: 'hc-row-actions-menu-group', children: group.map((item) => {
|
|
330
|
+
const itemIndex = flatIndex++;
|
|
331
|
+
const isCheckboxItem = item.checked !== undefined;
|
|
332
|
+
const isDisabled = item.disabled === true;
|
|
333
|
+
const hasSubmenu = item.submenu !== undefined;
|
|
334
|
+
return (_jsxs("button", { ref: (el) => {
|
|
335
|
+
itemRefs.current[itemIndex] = isDisabled ? null : el;
|
|
336
|
+
}, type: "button", role: isCheckboxItem ? 'menuitemcheckbox' : 'menuitem', "aria-checked": isCheckboxItem ? item.checked : undefined, "aria-disabled": isDisabled || undefined, "aria-haspopup": hasSubmenu ? 'menu' : undefined, "aria-expanded": hasSubmenu ? openSubmenuIndex === itemIndex : undefined, "aria-controls": hasSubmenu && openSubmenuIndex === itemIndex ? submenuElementId : undefined, disabled: isDisabled, tabIndex: isDisabled ? -1 : itemIndex === focusedIndex ? 0 : -1, className: cn('hc-row-actions-menu-item', menuItemClass(item.variant, isDisabled)), onMouseEnter: () => {
|
|
337
|
+
if (!isDisabled) {
|
|
338
|
+
handleItemMouseEnter(item, itemIndex);
|
|
339
|
+
}
|
|
340
|
+
}, onClick: (e) => {
|
|
341
|
+
e.stopPropagation();
|
|
342
|
+
if (isDisabled) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
if (item.submenu) {
|
|
346
|
+
if (openSubmenuIndex === itemIndex) {
|
|
347
|
+
closeSubmenuAndRefocus();
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
openSubmenuAt(itemIndex);
|
|
351
|
+
}
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
dismiss();
|
|
355
|
+
item.onSelect();
|
|
356
|
+
}, children: [isCheckboxItem ? (_jsx("span", { className: "hc-row-actions-menu-item-check inline-flex w-4 shrink-0 justify-center", "aria-hidden": true, children: item.checked ? _jsx(FaIcon, { icon: faCheck, className: "h-3 w-3" }) : null })) : null, _jsx("span", { className: "hc-row-actions-menu-item-label min-w-0", children: item.label }), hasSubmenu ? (_jsx(FaIcon, { icon: faCaretRight, className: "ml-auto h-3 w-3 shrink-0", "aria-hidden": true })) : null] }, item.label));
|
|
357
|
+
}) }, groupIndex));
|
|
358
|
+
}) }));
|
|
359
|
+
const submenuPanel = openSubmenuItem?.submenu && openSubmenuAnchorRect ? (_jsx(Submenu, { groups: openSubmenuItem.submenu, anchorRect: openSubmenuAnchorRect, menuElementId: submenuElementId, onSelectItem: (item) => {
|
|
360
|
+
dismiss();
|
|
361
|
+
item.onSelect?.();
|
|
362
|
+
}, onRequestClose: closeSubmenuAndRefocus, onCloseAll: dismiss, onMouseEnter: clearSubmenuTimers, onMouseLeave: scheduleCloseSubmenu })) : null;
|
|
363
|
+
return (_jsxs(_Fragment, { children: [portalToBody(menuPanel), submenuPanel] }));
|
|
364
|
+
}
|
|
@@ -62,12 +62,18 @@ interface Props extends Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'clas
|
|
|
62
62
|
* inline layouts for fields nested inside an already-bordered section.
|
|
63
63
|
*/
|
|
64
64
|
bordered?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* When true and `bordered`, draws a left border using the unsaved-tab color
|
|
67
|
+
* (`--color-tab-unsaved`) to indicate the field value differs from its factory
|
|
68
|
+
* default — the same token used for dirty request tab titles.
|
|
69
|
+
*/
|
|
70
|
+
modified?: boolean;
|
|
65
71
|
}
|
|
66
72
|
/**
|
|
67
73
|
* Reusable form field wrapper that pairs a label with one or more controls.
|
|
68
74
|
* Supports stacked fields, checkboxes, inline rows, radio options, and
|
|
69
75
|
* adjacent checkbox rows used in list pickers.
|
|
70
76
|
*/
|
|
71
|
-
export declare function FormGroup({ label, children, htmlFor, description, error, errorId, descriptionId, layout, labelTone, srOnly, className, labelClassName, bordered, ...props }: Props): JSX.Element;
|
|
77
|
+
export declare function FormGroup({ label, children, htmlFor, description, error, errorId, descriptionId, layout, labelTone, srOnly, className, labelClassName, bordered, modified, ...props }: Props): JSX.Element;
|
|
72
78
|
export {};
|
|
73
79
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FormGroup/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAItE;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,UAAU,GACV,QAAQ,GACR,OAAO,GACP,kBAAkB,GAClB,YAAY,CAAC;AAEjB;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD,UAAU,KAAM,SAAQ,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IACrF;;OAEG;IACH,KAAK,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB;;OAEG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAE/B;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FormGroup/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAItE;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,UAAU,GACV,QAAQ,GACR,OAAO,GACP,kBAAkB,GAClB,YAAY,CAAC;AAEjB;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD,UAAU,KAAM,SAAQ,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IACrF;;OAEG;IACH,KAAK,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB;;OAEG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAE/B;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAsCD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAW,EACX,KAAK,EACL,OAAO,EACP,aAAa,EACb,MAAkB,EAClB,SAAqB,EACrB,MAAc,EACd,SAAS,EACT,cAAc,EACd,QAAe,EACf,QAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CA+IrB"}
|
|
@@ -2,21 +2,18 @@ import { jsx as _jsx, jsxs as _jsxs } from "@harborclient/sdk/jsx-runtime";
|
|
|
2
2
|
import { useId } from '@harborclient/sdk/react';
|
|
3
3
|
import { FieldError } from '../FieldError/index.js';
|
|
4
4
|
import { enhanceControl } from '../enhanceControl.js';
|
|
5
|
-
/**
|
|
6
|
-
* Returns Tailwind classes for the label text based on tone and visibility.
|
|
7
|
-
*
|
|
8
|
-
* @returns Class string for the label element.
|
|
9
|
-
*/
|
|
10
5
|
/**
|
|
11
6
|
* Returns wrapper classes for bordered stacked, checkbox, and inline layouts.
|
|
12
7
|
*
|
|
13
8
|
* @param bordered - Whether the default border and padding should be applied.
|
|
14
9
|
* @param layoutClasses - Layout-specific flex and sizing classes.
|
|
15
10
|
* @param extra - Caller-supplied className override.
|
|
11
|
+
* @param modified - When true with `bordered`, adds a left unsaved-tab color border.
|
|
16
12
|
*/
|
|
17
|
-
function borderedWrapperClasses(bordered, layoutClasses, extra) {
|
|
13
|
+
function borderedWrapperClasses(bordered, layoutClasses, extra, modified = false) {
|
|
18
14
|
const frame = bordered ? 'p-4 border border-separator rounded-md' : '';
|
|
19
|
-
const
|
|
15
|
+
const accent = bordered && modified ? 'border-l-2 border-l-[var(--color-tab-unsaved)]' : '';
|
|
16
|
+
const base = `hc-form-group ${layoutClasses} ${frame} ${accent}`.trim();
|
|
20
17
|
return extra ? `${base} ${extra}` : base;
|
|
21
18
|
}
|
|
22
19
|
/**
|
|
@@ -39,7 +36,7 @@ function labelClasses(tone, srOnly, inline) {
|
|
|
39
36
|
* Supports stacked fields, checkboxes, inline rows, radio options, and
|
|
40
37
|
* adjacent checkbox rows used in list pickers.
|
|
41
38
|
*/
|
|
42
|
-
export function FormGroup({ label, children, htmlFor, description, error, errorId, descriptionId, layout = 'stacked', labelTone = 'default', srOnly = false, className, labelClassName, bordered = true, ...props }) {
|
|
39
|
+
export function FormGroup({ label, children, htmlFor, description, error, errorId, descriptionId, layout = 'stacked', labelTone = 'default', srOnly = false, className, labelClassName, bordered = true, modified = false, ...props }) {
|
|
43
40
|
const generatedId = useId();
|
|
44
41
|
const controlId = htmlFor ?? generatedId;
|
|
45
42
|
const extra = className ?? '';
|
|
@@ -78,11 +75,11 @@ export function FormGroup({ label, children, htmlFor, description, error, errorI
|
|
|
78
75
|
id: controlId,
|
|
79
76
|
invalid: resolvedErrorId != null
|
|
80
77
|
});
|
|
81
|
-
const wrapperClasses = borderedWrapperClasses(bordered, 'flex flex-col gap-1', extra);
|
|
78
|
+
const wrapperClasses = borderedWrapperClasses(bordered, 'flex flex-col gap-1', extra, modified);
|
|
82
79
|
return (_jsxs("div", { ...props, className: wrapperClasses, children: [_jsxs("label", { htmlFor: controlId, className: "hc-form-group-label flex flex-col gap-1", children: [_jsxs("span", { className: "hc-form-group-label-row flex items-center gap-2", children: [linkedChildren, _jsx("span", { className: labelClasses(labelTone, srOnly, false), children: label })] }), resolvedDescriptionId ? (_jsx("p", { id: resolvedDescriptionId, className: "hc-form-group-description m-0 pl-[26px] text-[14px] text-muted", children: description })) : null] }), resolvedErrorId ? (_jsx(FieldError, { id: resolvedErrorId, spacing: "field", children: error })) : null] }));
|
|
83
80
|
}
|
|
84
81
|
if (layout === 'inline') {
|
|
85
|
-
const wrapperClasses = borderedWrapperClasses(bordered, 'flex min-w-0 flex-1 items-center gap-2', extra);
|
|
82
|
+
const wrapperClasses = borderedWrapperClasses(bordered, 'flex min-w-0 flex-1 items-center gap-2', extra, modified);
|
|
86
83
|
const linkedChildren = enhanceControl(children, { id: controlId });
|
|
87
84
|
return (_jsxs("label", { htmlFor: controlId, className: wrapperClasses, children: [_jsx("span", { className: labelClasses(labelTone, srOnly, true), children: label }), linkedChildren] }));
|
|
88
85
|
}
|
|
@@ -97,6 +94,6 @@ export function FormGroup({ label, children, htmlFor, description, error, errorI
|
|
|
97
94
|
invalid: resolvedErrorId != null,
|
|
98
95
|
id: htmlFor
|
|
99
96
|
});
|
|
100
|
-
const wrapperClasses = borderedWrapperClasses(bordered, 'flex flex-col gap-1', extra);
|
|
97
|
+
const wrapperClasses = borderedWrapperClasses(bordered, 'flex flex-col gap-1', extra, modified);
|
|
101
98
|
return (_jsxs("div", { ...props, className: wrapperClasses, children: [_jsxs("label", { htmlFor: htmlFor, className: "hc-form-group-label flex flex-col gap-1", children: [_jsx("span", { className: labelClasses(labelTone, srOnly, false), children: label }), resolvedDescriptionId ? (_jsx("p", { id: resolvedDescriptionId, className: "hc-form-group-description m-0 text-[14px] text-muted", children: description })) : null, control] }), resolvedErrorId ? (_jsx(FieldError, { id: resolvedErrorId, spacing: "field", children: error })) : null] }));
|
|
102
99
|
}
|
|
@@ -37,6 +37,7 @@ interface Props<T extends string> extends Omit<ComponentPropsWithoutRef<'nav'>,
|
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
39
|
* Narrow sidebar navigation for multi-section pages such as settings overlays.
|
|
40
|
+
* Row chrome matches collections sidebar items via {@link sourceRow}.
|
|
40
41
|
*/
|
|
41
42
|
export declare function PageSidebar<T extends string>({ items, selected, onSelect, ariaLabel, className, ...props }: Props<T>): JSX.Element;
|
|
42
43
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/PageSidebar/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/PageSidebar/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAK3D;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACxD;;OAEG;IACH,KAAK,EAAE,CAAC,CAAC;IAET;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB;AAED,UAAU,KAAK,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,IAAI,CAC5C,wBAAwB,CAAC,KAAK,CAAC,EAC/B,YAAY,GAAG,UAAU,CAC1B;IACC;;OAEG;IACH,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5B;;OAEG;IACH,QAAQ,EAAE,CAAC,CAAC;IAEZ;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAE7B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,EAC5C,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAuCxB"}
|
|
@@ -1,23 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "@harborclient/sdk/jsx-runtime";
|
|
2
2
|
import { FaIcon } from '../FaIcon/index.js';
|
|
3
|
+
import { sourceRow } from '../SidebarItem/sidebarItemClasses.js';
|
|
3
4
|
import { cn } from '../utils.js';
|
|
4
|
-
/**
|
|
5
|
-
* Tailwind classes for a sidebar navigation row.
|
|
6
|
-
*/
|
|
7
|
-
function sidebarRow(active) {
|
|
8
|
-
return active
|
|
9
|
-
? 'group flex cursor-pointer items-center gap-1 rounded-md bg-selection px-1.5 py-2 app-no-drag'
|
|
10
|
-
: 'group flex cursor-pointer items-center gap-1 rounded-md px-1.5 py-2 hover:bg-selection/60 app-no-drag';
|
|
11
|
-
}
|
|
12
5
|
/**
|
|
13
6
|
* Narrow sidebar navigation for multi-section pages such as settings overlays.
|
|
7
|
+
* Row chrome matches collections sidebar items via {@link sourceRow}.
|
|
14
8
|
*/
|
|
15
9
|
export function PageSidebar({ items, selected, onSelect, ariaLabel, className, ...props }) {
|
|
16
|
-
return (_jsx("nav", { ...props, className: cn('hc-page-sidebar flex w-[220px] shrink-0 flex-col gap-
|
|
10
|
+
return (_jsx("nav", { ...props, className: cn('hc-page-sidebar flex w-[220px] shrink-0 flex-col gap-0 border-r border-separator bg-sidebar px-2 py-3', className), "aria-label": ariaLabel, children: items.map((item) => {
|
|
17
11
|
const active = selected === item.value;
|
|
18
|
-
|
|
19
|
-
? `hc-page-sidebar-item ${sidebarRow(active)} w-full gap-2 border-none text-left text-[15px] app-no-drag`
|
|
20
|
-
: `hc-page-sidebar-item ${sidebarRow(active)} w-full border-none text-left text-[15px] app-no-drag`;
|
|
21
|
-
return (_jsxs("button", { type: "button", className: rowClass, "aria-current": active ? 'page' : undefined, onClick: () => onSelect(item.value), children: [item.icon ? (_jsx(FaIcon, { icon: item.icon, className: cn('hc-page-sidebar-item-icon h-[18px] w-[18px] shrink-0', active ? 'text-text' : 'text-muted'), "aria-hidden": true })) : null, _jsx("span", { className: "hc-page-sidebar-item-label min-w-0 truncate", children: item.label })] }, item.value));
|
|
12
|
+
return (_jsxs("button", { type: "button", className: cn('hc-sidebar-item hc-page-sidebar-item', sourceRow(active, true), 'min-h-[30px] w-full cursor-pointer border-none text-left text-inherit', item.icon && 'gap-2'), "aria-current": active ? 'page' : undefined, onClick: () => onSelect(item.value), children: [item.icon ? (_jsx(FaIcon, { icon: item.icon, className: "hc-page-sidebar-item-icon h-3.5 w-3.5 shrink-0 text-muted", "aria-hidden": true })) : null, _jsx("span", { className: "hc-page-sidebar-item-label min-w-0 truncate", children: item.label })] }, item.value));
|
|
22
13
|
}) }));
|
|
23
14
|
}
|
|
@@ -39,5 +39,11 @@ export interface UseResizableResult {
|
|
|
39
39
|
onResizeStart: (event: ReactMouseEvent) => void;
|
|
40
40
|
onKeyboardResize: (event: ReactKeyboardEvent) => void;
|
|
41
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Tracks resizable panel size with pointer drag and optional persistence.
|
|
44
|
+
*
|
|
45
|
+
* During drag, pointer movement sets a target size; the displayed size eases
|
|
46
|
+
* toward that target each frame unless the user prefers reduced motion.
|
|
47
|
+
*/
|
|
42
48
|
export declare function useResizable({ axis, direction, defaultSize, minSize, getMaxSize, storageKey, onPersist }: UseResizableOptions): UseResizableResult;
|
|
43
49
|
//# sourceMappingURL=useResizable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useResizable.d.ts","sourceRoot":"","sources":["../../../src/components/Resizable/useResizable.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,IAAI,kBAAkB,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,OAAO,CAAC;AAGhG,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErF,KAAK,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"useResizable.d.ts","sourceRoot":"","sources":["../../../src/components/Resizable/useResizable.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,IAAI,kBAAkB,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,OAAO,CAAC;AAGhG,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErF,KAAK,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAyEtB,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,IAAI,EAAE,IAAI,CAAC;IAEX;;OAEG;IACH,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAElB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IAE1B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,aAAa,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAChD,gBAAgB,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACvD;AAiED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,SAAS,EACT,WAAW,EACX,OAAO,EACP,UAAU,EACV,UAAU,EACV,SAAS,EACV,EAAE,mBAAmB,GAAG,kBAAkB,CA8P1C"}
|