@harborclient/sdk 1.3.3 → 1.3.5
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 +24 -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/Breadcrumb/SegmentShell.d.ts +12 -1
- package/dist/components/Breadcrumb/SegmentShell.d.ts.map +1 -1
- package/dist/components/Breadcrumb/SegmentShell.js +7 -5
- package/dist/components/CodeEditor/index.d.ts +7 -4
- package/dist/components/CodeEditor/index.d.ts.map +1 -1
- package/dist/components/CodeEditor/index.js +15 -176
- package/dist/components/CodeEditor/selectionActionToolbar.d.ts +162 -0
- package/dist/components/CodeEditor/selectionActionToolbar.d.ts.map +1 -0
- package/dist/components/CodeEditor/selectionActionToolbar.js +319 -0
- package/dist/components/CopyToChatButton/constants.d.ts +18 -0
- package/dist/components/CopyToChatButton/constants.d.ts.map +1 -0
- package/dist/components/CopyToChatButton/constants.js +19 -0
- package/dist/components/CopyToChatButton/index.d.ts +49 -0
- package/dist/components/CopyToChatButton/index.d.ts.map +1 -0
- package/dist/components/CopyToChatButton/index.js +43 -0
- package/dist/components/FloatingDialog/floatingDialogPosition.d.ts +52 -0
- package/dist/components/FloatingDialog/floatingDialogPosition.d.ts.map +1 -0
- package/dist/components/FloatingDialog/floatingDialogPosition.js +33 -0
- package/dist/components/FloatingDialog/index.d.ts +95 -0
- package/dist/components/FloatingDialog/index.d.ts.map +1 -0
- package/dist/components/FloatingDialog/index.js +275 -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/PageHeader/index.d.ts +2 -1
- package/dist/components/PageHeader/index.d.ts.map +1 -1
- package/dist/components/PageHeader/index.js +3 -2
- 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/SidebarEnvironmentItem.d.ts +42 -4
- package/dist/components/SidebarItem/SidebarEnvironmentItem.d.ts.map +1 -1
- package/dist/components/SidebarItem/SidebarEnvironmentItem.js +34 -5
- 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/SidebarItem/SidebarWorkspaceItem.d.ts +9 -1
- package/dist/components/SidebarItem/SidebarWorkspaceItem.d.ts.map +1 -1
- package/dist/components/SidebarItem/SidebarWorkspaceItem.js +15 -2
- package/dist/components/TabBar/TabContextMenu.d.ts +3 -0
- package/dist/components/TabBar/TabContextMenu.d.ts.map +1 -1
- package/dist/components/TabBar/TabContextMenu.js +25 -16
- package/dist/components/VariableTable/index.d.ts +1 -1
- package/dist/components/VariableTable/index.d.ts.map +1 -1
- package/dist/components/VariableTable/index.js +14 -3
- package/dist/components/index.d.ts +6 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +5 -1
- package/dist/runtime/createBridgedPluginContext.js +240 -2
- package/dist/snippets.d.ts +48 -2
- package/dist/styles.css +16 -0
- package/dist/types.d.ts +1159 -30
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/index.d.ts +1 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +1 -0
- package/package.json +1 -1
- package/dist/components/SelectionActionToolbar/index.d.ts +0 -41
- package/dist/components/SelectionActionToolbar/index.d.ts.map +0 -1
- package/dist/components/SelectionActionToolbar/index.js +0 -13
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,30 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 1.3.5 - 2026-07-28
|
|
8
|
+
|
|
9
|
+
- Enhance CLI and GUI workflow functionalities. (`a8b8f495`)
|
|
10
|
+
- Enhance workflow results management and response handling. (`6a092e2e`)
|
|
11
|
+
- Add delayMs property to workflow management for enhanced playback control. (`eff9c395`)
|
|
12
|
+
- Enhance workflow execution and metadata handling. (`1390072c`)
|
|
13
|
+
- Enhance workflow action management with UUID integration. (`9647b650`)
|
|
14
|
+
- Enhance workflow management and plugin integration. (`e55d2821`)
|
|
15
|
+
- Implement workflow update functionality and enhance playback controls. (`443b20ec`)
|
|
16
|
+
- Enhance environment variable management and UI readiness. (`abab021c`)
|
|
17
|
+
- Update variable schema and enhance environment management. (`34cc08f0`)
|
|
18
|
+
- Add workspace management features to routing and state management. (`2bb3eb22`)
|
|
19
|
+
- Implement workflow management features. (`a4525074`)
|
|
20
|
+
|
|
21
|
+
## 1.3.4 - 2026-07-28
|
|
22
|
+
|
|
23
|
+
- Implement hc.ask API for one-shot AI completions. (`aed2809f`)
|
|
24
|
+
- Enhance plugin library and sidebar selection handling. (`5a919ac6`)
|
|
25
|
+
- Enhance settings management and UI components. (`31e7f975`)
|
|
26
|
+
- Refactor settings draft management and enhance default handling. (`5650b3e6`)
|
|
27
|
+
- Refactor BodyEditor and enhance selection handling. (`d28dd6b7`)
|
|
28
|
+
- Refactor shortcuts handling and update UI components. (`a85cf446`)
|
|
29
|
+
- Enhance response handling and UI features. (`b076b194`)
|
|
30
|
+
|
|
7
31
|
## 1.3.3 - 2026-07-27
|
|
8
32
|
|
|
9
33
|
- 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
|
+
}
|
|
@@ -9,6 +9,13 @@ export type SegmentShape = 'first' | 'middle' | 'last' | 'only';
|
|
|
9
9
|
* request-name crumb.
|
|
10
10
|
*/
|
|
11
11
|
export type SegmentTone = 'path' | 'selection' | 'current';
|
|
12
|
+
/**
|
|
13
|
+
* Vertical and horizontal density for a segment shell.
|
|
14
|
+
*
|
|
15
|
+
* - `default` — full breadcrumb bar sizing (`min-h-[26px]`, generous padding).
|
|
16
|
+
* - `compact` — toolbar-height sizing for controls like Copy to chat.
|
|
17
|
+
*/
|
|
18
|
+
export type SegmentDensity = 'default' | 'compact';
|
|
12
19
|
/**
|
|
13
20
|
* Shared shell classes and clip-path styling for one breadcrumb segment.
|
|
14
21
|
*/
|
|
@@ -26,6 +33,10 @@ interface Props {
|
|
|
26
33
|
* When true, the segment grows to fill remaining horizontal space.
|
|
27
34
|
*/
|
|
28
35
|
grow?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Vertical and horizontal density. Defaults to full breadcrumb bar sizing.
|
|
38
|
+
*/
|
|
39
|
+
density?: SegmentDensity;
|
|
29
40
|
/**
|
|
30
41
|
* Additional classes merged onto the segment shell.
|
|
31
42
|
*/
|
|
@@ -42,6 +53,6 @@ interface Props {
|
|
|
42
53
|
* full) edge can be pill-capped like the URL bar; middle and last keep a single
|
|
43
54
|
* clip-path layer for chevron interlocking.
|
|
44
55
|
*/
|
|
45
|
-
export declare function SegmentShell({ shape, tone, grow, className, children }: Props): JSX.Element;
|
|
56
|
+
export declare function SegmentShell({ shape, tone, grow, density, className, children }: Props): JSX.Element;
|
|
46
57
|
export {};
|
|
47
58
|
//# sourceMappingURL=SegmentShell.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SegmentShell.d.ts","sourceRoot":"","sources":["../../../src/components/Breadcrumb/SegmentShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAM5C;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhE;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"SegmentShell.d.ts","sourceRoot":"","sources":["../../../src/components/Breadcrumb/SegmentShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAM5C;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhE;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,CAAC;AAsBnD;;GAEG;AACH,UAAU,KAAK;IACb;;OAEG;IACH,KAAK,EAAE,YAAY,CAAC;IAEpB;;;OAGG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;IAEnB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;IAEzB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,IAAa,EACb,IAAY,EACZ,OAAmB,EACnB,SAAS,EACT,QAAQ,EACT,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CAkErB"}
|
|
@@ -28,23 +28,25 @@ function clipPathForShape(shape) {
|
|
|
28
28
|
* full) edge can be pill-capped like the URL bar; middle and last keep a single
|
|
29
29
|
* clip-path layer for chevron interlocking.
|
|
30
30
|
*/
|
|
31
|
-
export function SegmentShell({ shape, tone = 'path', grow = false, className, children }) {
|
|
31
|
+
export function SegmentShell({ shape, tone = 'path', grow = false, density = 'default', className, children }) {
|
|
32
32
|
const hasChevron = shape !== 'only';
|
|
33
33
|
const clipPath = clipPathForShape(shape);
|
|
34
34
|
const needsLeadingInset = shape !== 'first' && shape !== 'only';
|
|
35
|
+
const isCompact = density === 'compact';
|
|
35
36
|
const toneClass = tone === 'current'
|
|
36
37
|
? 'bg-breadcrumb-current'
|
|
37
38
|
: tone === 'selection'
|
|
38
39
|
? 'bg-selection'
|
|
39
40
|
: 'bg-breadcrumb-segment';
|
|
40
41
|
const usesPillCap = shape === 'first' || shape === 'only';
|
|
41
|
-
const
|
|
42
|
-
const
|
|
42
|
+
const leadingInsetPx = CHEVRON_PX + (isCompact ? 10 : 16);
|
|
43
|
+
const layoutClass = cn('hc-breadcrumb-segment relative flex min-w-0 items-center', isCompact ? 'min-h-0 py-1' : 'min-h-[26px] py-2', grow ? 'min-w-[6rem] flex-1' : isCompact ? 'shrink-0' : 'max-w-[45%] shrink-0', hasChevron && shape !== 'last' && '-mr-[6px]', !needsLeadingInset && (isCompact ? 'pl-2.5' : 'pl-5'), isCompact ? 'pr-3' : 'pr-5', className);
|
|
44
|
+
const content = (_jsx("div", { className: cn('relative min-w-0', isCompact ? 'flex items-center gap-1.5' : 'w-full truncate'), children: children }));
|
|
43
45
|
if (usesPillCap) {
|
|
44
|
-
return (_jsxs("div", { className: cn(layoutClass, 'overflow-hidden', shape === 'only' ? 'rounded-full!' : 'rounded-lg!'), style: needsLeadingInset ? { paddingLeft: `${
|
|
46
|
+
return (_jsxs("div", { className: cn(layoutClass, 'overflow-hidden', shape === 'only' ? 'rounded-full!' : 'rounded-lg!'), style: needsLeadingInset ? { paddingLeft: `${leadingInsetPx}px` } : undefined, children: [_jsx("div", { "aria-hidden": true, className: cn('pointer-events-none absolute inset-0', toneClass), style: clipPath !== 'none' ? { clipPath } : undefined }), content] }));
|
|
45
47
|
}
|
|
46
48
|
return (_jsx("div", { className: cn(layoutClass, toneClass), style: {
|
|
47
49
|
...(clipPath !== 'none' ? { clipPath } : {}),
|
|
48
|
-
...(needsLeadingInset ? { paddingLeft: `${
|
|
50
|
+
...(needsLeadingInset ? { paddingLeft: `${leadingInsetPx}px` } : {})
|
|
49
51
|
}, children: content }));
|
|
50
52
|
}
|
|
@@ -118,12 +118,15 @@ export interface CodeEditorTextSelection {
|
|
|
118
118
|
export interface CodeEditorSelectionAction {
|
|
119
119
|
/**
|
|
120
120
|
* Stable action id for host routing.
|
|
121
|
+
*
|
|
122
|
+
* When `id` is `copy-to-chat`, the toolbar renders {@link CopyToChatButton} and
|
|
123
|
+
* ignores `label`, `icon`, and `shortcutHint`.
|
|
121
124
|
*/
|
|
122
125
|
id: string;
|
|
123
126
|
/**
|
|
124
|
-
* Visible button label.
|
|
127
|
+
* Visible button label for non–copy-to-chat actions.
|
|
125
128
|
*/
|
|
126
|
-
label
|
|
129
|
+
label?: string;
|
|
127
130
|
/**
|
|
128
131
|
* Accessible name for the action button.
|
|
129
132
|
*/
|
|
@@ -133,11 +136,11 @@ export interface CodeEditorSelectionAction {
|
|
|
133
136
|
*/
|
|
134
137
|
onSelect: (selection: CodeEditorTextSelection) => void;
|
|
135
138
|
/**
|
|
136
|
-
* Optional leading icon shown before the action label.
|
|
139
|
+
* Optional leading icon shown before the action label for non–copy-to-chat actions.
|
|
137
140
|
*/
|
|
138
141
|
icon?: IconDefinition;
|
|
139
142
|
/**
|
|
140
|
-
* Optional shortcut hint shown after the label
|
|
143
|
+
* Optional shortcut hint shown after the label for non–copy-to-chat actions.
|
|
141
144
|
*/
|
|
142
145
|
shortcutHint?: string;
|
|
143
146
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CodeEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAmC,MAAM,0BAA0B,CAAC;AAkBlG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAWxE,OAAO,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CodeEditor/index.tsx"],"names":[],"mappings":"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"}
|