grab 0.1.35 → 0.1.36

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 (86) hide show
  1. package/dist/copy-content-3pnWacho.d.cts +218 -0
  2. package/dist/copy-content-DH6fBB50.d.ts +218 -0
  3. package/dist/core/index.cjs +1 -1
  4. package/dist/core/index.d.cts +2 -2
  5. package/dist/core/index.d.ts +2 -2
  6. package/dist/core/index.js +1 -1
  7. package/dist/core-B9aCRu_r.cjs +4374 -0
  8. package/dist/core-BNG77P9u.js +20 -0
  9. package/dist/core-BaM4pWDg.cjs +20 -0
  10. package/dist/core-BgAHCKe7.js +4492 -0
  11. package/dist/core-BnZu88Zq.js +20 -0
  12. package/dist/core-BoXxu65H.js +20 -0
  13. package/dist/core-Bw1MUegr.cjs +4374 -0
  14. package/dist/core-C-uBKPnx.js +20 -0
  15. package/dist/core-CMd2PuB-.cjs +20 -0
  16. package/dist/core-CN7fVz1T.cjs +4377 -0
  17. package/dist/core-C_moHA9D.js +20 -0
  18. package/dist/core-CoEZwalZ.js +4489 -0
  19. package/dist/core-Cyu0n7SO.js +20 -0
  20. package/dist/core-DMVlP9g5.js +20 -0
  21. package/dist/core-XXPjZNnn.cjs +20 -0
  22. package/dist/core-_t0msYhT.cjs +20 -0
  23. package/dist/core-eVrmPJ2u.cjs +20 -0
  24. package/dist/core-epcog0yL.cjs +20 -0
  25. package/dist/core-foLKkb5_.cjs +20 -0
  26. package/dist/core-kGODXK-N.js +4489 -0
  27. package/dist/create-element-selector-B5J9_3Fw.cjs +9 -0
  28. package/dist/create-element-selector-BEaSanPh.cjs +9 -0
  29. package/dist/create-element-selector-BR_zDrcL.js +296 -0
  30. package/dist/create-element-selector-C3VxTCEX.js +9 -0
  31. package/dist/create-element-selector-CIj_4oMe.js +9 -0
  32. package/dist/create-element-selector-C_6sG1Bd.js +296 -0
  33. package/dist/create-element-selector-ChuWL5x4.cjs +9 -0
  34. package/dist/create-element-selector-CufggNcJ.js +9 -0
  35. package/dist/create-element-selector-D1FizysC.js +9 -0
  36. package/dist/create-element-selector-D4_cMOfX.cjs +307 -0
  37. package/dist/create-element-selector-Dw4Hh5vX.cjs +307 -0
  38. package/dist/create-element-selector-pHsYuaOR.cjs +9 -0
  39. package/dist/freeze-updates-1bWq0iRj.cjs +3340 -0
  40. package/dist/freeze-updates-7yZ9p4Jb.cjs +52 -0
  41. package/dist/freeze-updates-B2R6sKrS.js +52 -0
  42. package/dist/freeze-updates-BUIl_I9a.js +52 -0
  43. package/dist/freeze-updates-D7wc1FFo.js +52 -0
  44. package/dist/freeze-updates-DC22uWxG.cjs +3347 -0
  45. package/dist/freeze-updates-DFjQ3htO.js +52 -0
  46. package/dist/freeze-updates-DIifOZze.js +2921 -0
  47. package/dist/freeze-updates-D_ae-e4T.js +2920 -0
  48. package/dist/freeze-updates-DdIqMW8Y.cjs +52 -0
  49. package/dist/freeze-updates-DvAOKSWG.cjs +52 -0
  50. package/dist/freeze-updates-F-dFqbvY.cjs +52 -0
  51. package/dist/index-CkMIwkYj.d.ts +413 -0
  52. package/dist/index-DR5AjI5S.d.cts +413 -0
  53. package/dist/index.cjs +1 -1
  54. package/dist/index.d.cts +2 -2
  55. package/dist/index.d.ts +2 -2
  56. package/dist/index.global.js +13 -13
  57. package/dist/index.js +1 -1
  58. package/dist/primitives.cjs +1 -1
  59. package/dist/primitives.d.cts +1 -1
  60. package/dist/primitives.d.ts +1 -1
  61. package/dist/primitives.js +1 -1
  62. package/dist/renderer-B65BudlT.cjs +9 -0
  63. package/dist/renderer-BRENw6lS.cjs +3205 -0
  64. package/dist/renderer-Bxc3RS-J.cjs +3205 -0
  65. package/dist/renderer-CD-Ju8A3.js +3205 -0
  66. package/dist/renderer-D0a4h1bK.cjs +9 -0
  67. package/dist/renderer-D3dvNcvm.cjs +9 -0
  68. package/dist/renderer-DQoIdFmy.js +9 -0
  69. package/dist/renderer-Dc20mGte.js +9 -0
  70. package/dist/renderer-DmNPMFh8.js +3205 -0
  71. package/dist/renderer-Dnyqr-yC.cjs +9 -0
  72. package/dist/renderer-gEdmDcCb.js +9 -0
  73. package/dist/renderer-kDb-jNJX.js +9 -0
  74. package/dist/state-BAZpSiUU.js +9 -0
  75. package/dist/state-BPvTpQtD.js +9 -0
  76. package/dist/state-Bn3fhsQ8.cjs +9 -0
  77. package/dist/state-BwCmdtcN.cjs +1306 -0
  78. package/dist/state-CFntkBxv.js +1696 -0
  79. package/dist/state-CR6-uxRM.cjs +9 -0
  80. package/dist/state-DQNAhhCY.cjs +1306 -0
  81. package/dist/state-Dgr3LbNH.cjs +9 -0
  82. package/dist/state-Ds-1VLFt.js +9 -0
  83. package/dist/state-Dt16Hkud.js +9 -0
  84. package/dist/state-LuyoMylH.js +1696 -0
  85. package/dist/state-x2vKMZfm.cjs +9 -0
  86. package/package.json +2 -2
@@ -0,0 +1,3205 @@
1
+ /**
2
+ * @license MIT
3
+ *
4
+ * Copyright (c) 2025 Aiden Bai
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE file in the root directory of this source tree.
8
+ */
9
+ import { A as createMemo, B as onMount, E as Show, L as mergeProps, O as createComponent, P as createSignal, R as on, T as Index, _ as setAttribute, a as clampToRange, b as template, c as isKeyboardEventTriggeredByInput, d as classList, f as className, h as memo, i as isMac, j as createRenderEffect, k as createEffect, l as isElementConnected, m as insert, n as saveToolbarState, p as delegateEvents, r as isEventFromOverlay, t as loadToolbarState, u as addEventListener, v as setStyleProperty, w as For, x as use, y as spread, z as onCleanup } from "./state-CFntkBxv.js";
10
+ import { G as DROPDOWN_OFFSCREEN_POSITION, H as DRAG_LERP_FACTOR, J as LERP_CONVERGENCE_THRESHOLD_PX, K as FEEDBACK_DURATION_MS, M as nativeRequestAnimationFrame, R as ARROW_MAX_LABEL_WIDTH_RATIO, V as DEFAULT_ACTION_ID, W as DROPDOWN_EDGE_TRANSFORM_ORIGIN, at as OVERLAY_FILL_COLOR_DRAG, c as unfreezeGlobalAnimations, dt as TOOLBAR_DEFAULT_POSITION_RATIO, gt as supportsDisplayP3, ht as Z_INDEX_OVERLAY_CANVAS, i as unfreezePseudoStates, it as OVERLAY_FILL_COLOR_DEFAULT, j as nativeCancelAnimationFrame, l as openFile, lt as SELECTION_LABEL_OFFSCREEN_PX, mt as Z_INDEX_OVERLAY, nt as OVERLAY_BORDER_COLOR_DEFAULT, ot as PANEL_BACKGROUND, q as FROZEN_GLOW_COLOR, r as freezePseudoStates, rt as OVERLAY_BORDER_COLOR_DRAG, s as freezeGlobalAnimations, st as PANEL_SHADOW, t as freezeUpdates, tt as OPACITY_CONVERGENCE_THRESHOLD, ut as SELECTION_LERP_FACTOR, z as BASELINE_FRAME_DURATION_MS } from "./freeze-updates-D_ae-e4T.js";
11
+
12
+ //#region src/utils/lerp.ts
13
+ const lerp = (start, end, factor) => {
14
+ return start + (end - start) * factor;
15
+ };
16
+
17
+ //#endregion
18
+ //#region src/utils/adjust-lerp-for-frame-duration.ts
19
+ const adjustLerpForFrameDuration = (baselineLerpFactor, frameDurationMs) => {
20
+ const clampedFrameDurationMs = Math.max(frameDurationMs, 1);
21
+ return 1 - (1 - baselineLerpFactor) ** (clampedFrameDurationMs / BASELINE_FRAME_DURATION_MS);
22
+ };
23
+
24
+ //#endregion
25
+ //#region src/components/overlay-canvas.tsx
26
+ var _tmpl$$23 = /* @__PURE__ */ template(`<canvas data-react-grab-overlay-canvas style=position:fixed;top:0;left:0;pointer-events:none>`);
27
+ const DEFAULT_LAYER_STYLE = {
28
+ borderColor: OVERLAY_BORDER_COLOR_DEFAULT,
29
+ fillColor: OVERLAY_FILL_COLOR_DEFAULT,
30
+ lerpFactor: SELECTION_LERP_FACTOR
31
+ };
32
+ const LAYER_STYLES = {
33
+ drag: {
34
+ borderColor: OVERLAY_BORDER_COLOR_DRAG,
35
+ fillColor: OVERLAY_FILL_COLOR_DRAG,
36
+ lerpFactor: DRAG_LERP_FACTOR
37
+ },
38
+ selection: DEFAULT_LAYER_STYLE,
39
+ grabbed: DEFAULT_LAYER_STYLE
40
+ };
41
+ const OverlayCanvas = (props) => {
42
+ let canvasRef;
43
+ let mainContext = null;
44
+ let canvasWidth = 0;
45
+ let canvasHeight = 0;
46
+ let devicePixelRatio = 1;
47
+ let animationFrameId = null;
48
+ let previousFrameTimestamp = null;
49
+ const layers = {
50
+ drag: {
51
+ canvas: null,
52
+ context: null
53
+ },
54
+ selection: {
55
+ canvas: null,
56
+ context: null
57
+ },
58
+ grabbed: {
59
+ canvas: null,
60
+ context: null
61
+ }
62
+ };
63
+ let selectionAnimations = [];
64
+ let dragAnimation = null;
65
+ let grabbedAnimations = [];
66
+ const canvasColorSpace = supportsDisplayP3() ? "display-p3" : "srgb";
67
+ const createOffscreenLayer = (layerWidth, layerHeight, scaleFactor) => {
68
+ const canvas = new OffscreenCanvas(layerWidth * scaleFactor, layerHeight * scaleFactor);
69
+ const context = canvas.getContext("2d", { colorSpace: canvasColorSpace });
70
+ if (context) context.scale(scaleFactor, scaleFactor);
71
+ return {
72
+ canvas,
73
+ context
74
+ };
75
+ };
76
+ const initializeCanvas = () => {
77
+ if (!canvasRef) return;
78
+ devicePixelRatio = Math.max(window.devicePixelRatio || 1, 2);
79
+ canvasWidth = window.innerWidth;
80
+ canvasHeight = window.innerHeight;
81
+ canvasRef.width = canvasWidth * devicePixelRatio;
82
+ canvasRef.height = canvasHeight * devicePixelRatio;
83
+ canvasRef.style.width = `${canvasWidth}px`;
84
+ canvasRef.style.height = `${canvasHeight}px`;
85
+ mainContext = canvasRef.getContext("2d", { colorSpace: canvasColorSpace });
86
+ if (mainContext) mainContext.scale(devicePixelRatio, devicePixelRatio);
87
+ for (const layerName of Object.keys(layers)) layers[layerName] = createOffscreenLayer(canvasWidth, canvasHeight, devicePixelRatio);
88
+ };
89
+ const parseBorderRadiusValue = (borderRadius) => {
90
+ if (!borderRadius) return 0;
91
+ const match = borderRadius.match(/^(\d+(?:\.\d+)?)/);
92
+ return match ? parseFloat(match[1]) : 0;
93
+ };
94
+ const createAnimatedBounds = (id, bounds, options) => ({
95
+ id,
96
+ current: {
97
+ x: bounds.x,
98
+ y: bounds.y,
99
+ width: bounds.width,
100
+ height: bounds.height
101
+ },
102
+ target: {
103
+ x: bounds.x,
104
+ y: bounds.y,
105
+ width: bounds.width,
106
+ height: bounds.height
107
+ },
108
+ borderRadius: parseBorderRadiusValue(bounds.borderRadius),
109
+ opacity: options?.opacity ?? 1,
110
+ targetOpacity: options?.targetOpacity ?? options?.opacity ?? 1,
111
+ createdAt: options?.createdAt,
112
+ fadeStartTimestamp: null,
113
+ isInitialized: true
114
+ });
115
+ const updateAnimationTarget = (animation, bounds, targetOpacity) => {
116
+ animation.target = {
117
+ x: bounds.x,
118
+ y: bounds.y,
119
+ width: bounds.width,
120
+ height: bounds.height
121
+ };
122
+ animation.borderRadius = parseBorderRadiusValue(bounds.borderRadius);
123
+ if (targetOpacity !== void 0) animation.targetOpacity = targetOpacity;
124
+ };
125
+ const resolveBoundsArray = (instance) => instance.boundsMultiple ?? [instance.bounds];
126
+ const drawRoundedRectangle = (context, rectX, rectY, rectWidth, rectHeight, cornerRadius, fillColor, strokeColor, opacity = 1) => {
127
+ if (rectWidth <= 0 || rectHeight <= 0) return;
128
+ const maxCornerRadius = Math.min(rectWidth / 2, rectHeight / 2);
129
+ const clampedCornerRadius = Math.min(cornerRadius, maxCornerRadius);
130
+ context.globalAlpha = opacity;
131
+ context.beginPath();
132
+ if (clampedCornerRadius > 0) context.roundRect(rectX, rectY, rectWidth, rectHeight, clampedCornerRadius);
133
+ else context.rect(rectX, rectY, rectWidth, rectHeight);
134
+ context.fillStyle = fillColor;
135
+ context.fill();
136
+ context.strokeStyle = strokeColor;
137
+ context.lineWidth = 1;
138
+ context.stroke();
139
+ context.globalAlpha = 1;
140
+ };
141
+ const renderDragLayer = () => {
142
+ const layer = layers.drag;
143
+ if (!layer.context) return;
144
+ const context = layer.context;
145
+ context.clearRect(0, 0, canvasWidth, canvasHeight);
146
+ if (!props.dragVisible || !dragAnimation) return;
147
+ const style = LAYER_STYLES.drag;
148
+ drawRoundedRectangle(context, dragAnimation.current.x, dragAnimation.current.y, dragAnimation.current.width, dragAnimation.current.height, dragAnimation.borderRadius, style.fillColor, style.borderColor);
149
+ };
150
+ const renderSelectionLayer = () => {
151
+ const layer = layers.selection;
152
+ if (!layer.context) return;
153
+ const context = layer.context;
154
+ context.clearRect(0, 0, canvasWidth, canvasHeight);
155
+ if (!props.selectionVisible) return;
156
+ const style = LAYER_STYLES.selection;
157
+ for (const animation of selectionAnimations) drawRoundedRectangle(context, animation.current.x, animation.current.y, animation.current.width, animation.current.height, animation.borderRadius, style.fillColor, style.borderColor, animation.opacity);
158
+ };
159
+ const renderBoundsLayer = (layerName, animations) => {
160
+ const layer = layers[layerName];
161
+ if (!layer.context) return;
162
+ const context = layer.context;
163
+ context.clearRect(0, 0, canvasWidth, canvasHeight);
164
+ const style = LAYER_STYLES[layerName];
165
+ for (const animation of animations) drawRoundedRectangle(context, animation.current.x, animation.current.y, animation.current.width, animation.current.height, animation.borderRadius, style.fillColor, style.borderColor, animation.opacity);
166
+ };
167
+ const compositeAllLayers = () => {
168
+ if (!mainContext || !canvasRef) return;
169
+ mainContext.setTransform(1, 0, 0, 1, 0, 0);
170
+ mainContext.clearRect(0, 0, canvasRef.width, canvasRef.height);
171
+ mainContext.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0);
172
+ renderDragLayer();
173
+ renderSelectionLayer();
174
+ renderBoundsLayer("grabbed", grabbedAnimations);
175
+ for (const layerName of [
176
+ "drag",
177
+ "selection",
178
+ "grabbed"
179
+ ]) {
180
+ const layer = layers[layerName];
181
+ if (layer.canvas) mainContext.drawImage(layer.canvas, 0, 0, canvasWidth, canvasHeight);
182
+ }
183
+ };
184
+ const interpolateBounds = (animation, lerpFactor, options) => {
185
+ const lerpedX = lerp(animation.current.x, animation.target.x, lerpFactor);
186
+ const lerpedY = lerp(animation.current.y, animation.target.y, lerpFactor);
187
+ const lerpedWidth = lerp(animation.current.width, animation.target.width, lerpFactor);
188
+ const lerpedHeight = lerp(animation.current.height, animation.target.height, lerpFactor);
189
+ const hasBoundsConverged = Math.abs(lerpedX - animation.target.x) < .5 && Math.abs(lerpedY - animation.target.y) < .5 && Math.abs(lerpedWidth - animation.target.width) < .5 && Math.abs(lerpedHeight - animation.target.height) < .5;
190
+ animation.current.x = hasBoundsConverged ? animation.target.x : lerpedX;
191
+ animation.current.y = hasBoundsConverged ? animation.target.y : lerpedY;
192
+ animation.current.width = hasBoundsConverged ? animation.target.width : lerpedWidth;
193
+ animation.current.height = hasBoundsConverged ? animation.target.height : lerpedHeight;
194
+ let hasOpacityConverged = true;
195
+ if (options?.interpolateOpacity) {
196
+ const lerpedOpacity = lerp(animation.opacity, animation.targetOpacity, lerpFactor);
197
+ hasOpacityConverged = Math.abs(lerpedOpacity - animation.targetOpacity) < OPACITY_CONVERGENCE_THRESHOLD;
198
+ animation.opacity = hasOpacityConverged ? animation.targetOpacity : lerpedOpacity;
199
+ }
200
+ return !hasBoundsConverged || !hasOpacityConverged;
201
+ };
202
+ const runAnimationFrame = () => {
203
+ const currentFrameTimestamp = performance.now();
204
+ const frameDurationMs = previousFrameTimestamp !== null ? currentFrameTimestamp - previousFrameTimestamp : BASELINE_FRAME_DURATION_MS;
205
+ previousFrameTimestamp = currentFrameTimestamp;
206
+ const dragLerpForFrame = adjustLerpForFrameDuration(LAYER_STYLES.drag.lerpFactor, frameDurationMs);
207
+ const selectionLerpForFrame = adjustLerpForFrameDuration(LAYER_STYLES.selection.lerpFactor, frameDurationMs);
208
+ const grabbedLerpForFrame = adjustLerpForFrameDuration(LAYER_STYLES.grabbed.lerpFactor, frameDurationMs);
209
+ let shouldContinueAnimating = false;
210
+ if (dragAnimation?.isInitialized) {
211
+ if (interpolateBounds(dragAnimation, dragLerpForFrame)) shouldContinueAnimating = true;
212
+ }
213
+ for (const animation of selectionAnimations) if (animation.isInitialized) {
214
+ if (interpolateBounds(animation, selectionLerpForFrame)) shouldContinueAnimating = true;
215
+ }
216
+ const currentTimestamp = Date.now();
217
+ grabbedAnimations = grabbedAnimations.filter((animation) => {
218
+ const isLabelAnimation = animation.id.startsWith("label-");
219
+ if (animation.isInitialized) {
220
+ if (interpolateBounds(animation, grabbedLerpForFrame)) shouldContinueAnimating = true;
221
+ }
222
+ if (isLabelAnimation && animation.targetOpacity === 0) {
223
+ if (animation.fadeStartTimestamp === null) animation.fadeStartTimestamp = currentFrameTimestamp;
224
+ const labelElapsed = currentFrameTimestamp - animation.fadeStartTimestamp;
225
+ const labelProgress = Math.min(1, labelElapsed / 150);
226
+ const labelEaseOut = 1 - (1 - labelProgress) * (1 - labelProgress);
227
+ animation.opacity = Math.max(0, 1 - labelEaseOut);
228
+ if (labelProgress >= 1) return false;
229
+ shouldContinueAnimating = true;
230
+ return true;
231
+ } else if (isLabelAnimation) animation.fadeStartTimestamp = null;
232
+ if (animation.createdAt) {
233
+ const elapsed = currentTimestamp - animation.createdAt;
234
+ if (elapsed >= 1500 + 150) return false;
235
+ if (elapsed > 1500) {
236
+ const fadeProgress = Math.min(1, (elapsed - FEEDBACK_DURATION_MS) / 150);
237
+ animation.opacity = 1 - (1 - (1 - fadeProgress) * (1 - fadeProgress));
238
+ shouldContinueAnimating = true;
239
+ }
240
+ return true;
241
+ }
242
+ if (isLabelAnimation) return true;
243
+ return animation.opacity > 0;
244
+ });
245
+ compositeAllLayers();
246
+ if (shouldContinueAnimating) animationFrameId = nativeRequestAnimationFrame(runAnimationFrame);
247
+ else {
248
+ animationFrameId = null;
249
+ previousFrameTimestamp = null;
250
+ }
251
+ };
252
+ const scheduleAnimationFrame = () => {
253
+ if (animationFrameId !== null) return;
254
+ animationFrameId = nativeRequestAnimationFrame(runAnimationFrame);
255
+ };
256
+ const handleWindowResize = () => {
257
+ initializeCanvas();
258
+ scheduleAnimationFrame();
259
+ };
260
+ createEffect(on(() => [
261
+ props.selectionVisible,
262
+ props.selectionBounds,
263
+ props.selectionBoundsMultiple,
264
+ props.selectionShouldSnap
265
+ ], ([isVisible, singleBounds, multipleBounds, shouldSnap]) => {
266
+ if (!isVisible || !singleBounds && (!multipleBounds || multipleBounds.length === 0)) {
267
+ selectionAnimations = [];
268
+ scheduleAnimationFrame();
269
+ return;
270
+ }
271
+ let boundsToRender;
272
+ if (multipleBounds && multipleBounds.length > 0) boundsToRender = multipleBounds;
273
+ else if (singleBounds) boundsToRender = [singleBounds];
274
+ else boundsToRender = [];
275
+ selectionAnimations = boundsToRender.map((bounds, index) => {
276
+ const animationId = `selection-${index}`;
277
+ const existingAnimation = selectionAnimations.find((animation) => animation.id === animationId);
278
+ if (existingAnimation) {
279
+ updateAnimationTarget(existingAnimation, bounds);
280
+ if (shouldSnap) existingAnimation.current = { ...existingAnimation.target };
281
+ return existingAnimation;
282
+ }
283
+ return createAnimatedBounds(animationId, bounds);
284
+ });
285
+ scheduleAnimationFrame();
286
+ }));
287
+ createEffect(on(() => [props.dragVisible, props.dragBounds], ([isVisible, bounds]) => {
288
+ if (!isVisible || !bounds) {
289
+ dragAnimation = null;
290
+ scheduleAnimationFrame();
291
+ return;
292
+ }
293
+ if (dragAnimation) updateAnimationTarget(dragAnimation, bounds);
294
+ else dragAnimation = createAnimatedBounds("drag", bounds);
295
+ scheduleAnimationFrame();
296
+ }));
297
+ createEffect(on(() => [props.grabbedBoxes, props.labelInstances], ([grabbedBoxes, labelInstances]) => {
298
+ const boxesToProcess = grabbedBoxes ?? [];
299
+ const activeBoxIds = new Set(boxesToProcess.map((box) => box.id));
300
+ const existingAnimationIds = new Set(grabbedAnimations.map((animation) => animation.id));
301
+ for (const box of boxesToProcess) if (!existingAnimationIds.has(box.id)) grabbedAnimations.push(createAnimatedBounds(box.id, box.bounds, { createdAt: box.createdAt }));
302
+ for (const animation of grabbedAnimations) {
303
+ const matchingBox = boxesToProcess.find((box) => box.id === animation.id);
304
+ if (matchingBox) updateAnimationTarget(animation, matchingBox.bounds);
305
+ }
306
+ const instancesToProcess = labelInstances ?? [];
307
+ for (const instance of instancesToProcess) {
308
+ const boundsToRender = resolveBoundsArray(instance);
309
+ const targetOpacity = instance.status === "fading" ? 0 : 1;
310
+ for (let index = 0; index < boundsToRender.length; index++) {
311
+ const bounds = boundsToRender[index];
312
+ const animationId = `label-${instance.id}-${index}`;
313
+ const existingAnimation = grabbedAnimations.find((animation) => animation.id === animationId);
314
+ if (existingAnimation) updateAnimationTarget(existingAnimation, bounds, targetOpacity);
315
+ else grabbedAnimations.push(createAnimatedBounds(animationId, bounds, {
316
+ opacity: 1,
317
+ targetOpacity
318
+ }));
319
+ }
320
+ }
321
+ const activeLabelIds = /* @__PURE__ */ new Set();
322
+ for (const instance of instancesToProcess) {
323
+ const boundsToRender = resolveBoundsArray(instance);
324
+ for (let index = 0; index < boundsToRender.length; index++) activeLabelIds.add(`label-${instance.id}-${index}`);
325
+ }
326
+ grabbedAnimations = grabbedAnimations.filter((animation) => {
327
+ if (animation.id.startsWith("label-")) return activeLabelIds.has(animation.id);
328
+ if (activeBoxIds.has(animation.id)) return true;
329
+ if (animation.createdAt && animation.opacity > 0) return true;
330
+ return false;
331
+ });
332
+ scheduleAnimationFrame();
333
+ }));
334
+ onMount(() => {
335
+ initializeCanvas();
336
+ scheduleAnimationFrame();
337
+ window.addEventListener("resize", handleWindowResize);
338
+ let currentDprMediaQuery = null;
339
+ const handleDevicePixelRatioChange = () => {
340
+ if (Math.max(window.devicePixelRatio || 1, 2) !== devicePixelRatio) {
341
+ handleWindowResize();
342
+ setupDprMediaQuery();
343
+ }
344
+ };
345
+ const setupDprMediaQuery = () => {
346
+ if (currentDprMediaQuery) currentDprMediaQuery.removeEventListener("change", handleDevicePixelRatioChange);
347
+ currentDprMediaQuery = window.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);
348
+ currentDprMediaQuery.addEventListener("change", handleDevicePixelRatioChange);
349
+ };
350
+ setupDprMediaQuery();
351
+ onCleanup(() => {
352
+ window.removeEventListener("resize", handleWindowResize);
353
+ if (currentDprMediaQuery) currentDprMediaQuery.removeEventListener("change", handleDevicePixelRatioChange);
354
+ if (animationFrameId !== null) nativeCancelAnimationFrame(animationFrameId);
355
+ });
356
+ });
357
+ return (() => {
358
+ var _el$ = _tmpl$$23();
359
+ var _ref$ = canvasRef;
360
+ typeof _ref$ === "function" ? use(_ref$, _el$) : canvasRef = _el$;
361
+ createRenderEffect((_$p) => setStyleProperty(_el$, "z-index", String(Z_INDEX_OVERLAY_CANVAS)));
362
+ return _el$;
363
+ })();
364
+ };
365
+
366
+ //#endregion
367
+ //#region src/utils/auto-resize-textarea.ts
368
+ const autoResizeTextarea = (textarea, maxHeight) => {
369
+ textarea.style.height = "auto";
370
+ textarea.style.height = `${Math.min(textarea.scrollHeight, maxHeight)}px`;
371
+ };
372
+
373
+ //#endregion
374
+ //#region src/utils/get-arrow-size.ts
375
+ const getArrowSize = (labelWidth) => {
376
+ if (labelWidth <= 0) return 8;
377
+ const scaledSize = labelWidth * ARROW_MAX_LABEL_WIDTH_RATIO;
378
+ return Math.max(4, Math.min(8, scaledSize));
379
+ };
380
+
381
+ //#endregion
382
+ //#region src/utils/cn.ts
383
+ const resolveValue = (input) => {
384
+ if (typeof input === "string" || typeof input === "number") return String(input);
385
+ if (!input || typeof input !== "object") return "";
386
+ if (Array.isArray(input)) {
387
+ let result = "";
388
+ for (const item of input) {
389
+ if (!item) continue;
390
+ const resolved = resolveValue(item);
391
+ if (resolved) result = result ? `${result} ${resolved}` : resolved;
392
+ }
393
+ return result;
394
+ }
395
+ let result = "";
396
+ for (const key in input) if (input[key]) result = result ? `${result} ${key}` : key;
397
+ return result;
398
+ };
399
+ const cn = (...inputs) => {
400
+ let result = "";
401
+ for (const input of inputs) {
402
+ if (!input) continue;
403
+ const resolved = resolveValue(input);
404
+ if (resolved) result = result ? `${result} ${resolved}` : resolved;
405
+ }
406
+ return result;
407
+ };
408
+
409
+ //#endregion
410
+ //#region src/utils/get-tag-display.ts
411
+ const getTagDisplay = (input) => {
412
+ if (input.elementsCount && input.elementsCount > 1) return {
413
+ tagName: `${input.elementsCount} elements`,
414
+ componentName: void 0
415
+ };
416
+ return {
417
+ tagName: input.tagName || input.componentName || "element",
418
+ componentName: input.tagName ? input.componentName : void 0
419
+ };
420
+ };
421
+
422
+ //#endregion
423
+ //#region src/components/icons/icon-submit.tsx
424
+ var _tmpl$$22 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=currentColor><path fill-rule=evenodd clip-rule=evenodd d="M19.2929 12.7071C19.6834 13.0976 20.3166 13.0976 20.7071 12.7071C21.0976 12.3166 21.0976 11.6834 20.7071 11.2929L12.7071 3.29289C12.5196 3.10536 12.2652 3 12 3C11.7348 3 11.4804 3.10536 11.2929 3.29289L3.29289 11.2929C2.90237 11.6834 2.90237 12.3166 3.29289 12.7071C3.68342 13.0976 4.31658 13.0976 4.70711 12.7071L11 6.41421L11 20C11 20.5523 11.4477 21 12 21C12.5523 21 13 20.5523 13 20L13 6.41422L19.2929 12.7071Z">`);
425
+ const IconSubmit = (props) => {
426
+ const size = () => props.size ?? 10;
427
+ return (() => {
428
+ var _el$ = _tmpl$$22();
429
+ createRenderEffect((_p$) => {
430
+ var _v$ = size(), _v$2 = size(), _v$3 = props.class;
431
+ _v$ !== _p$.e && setAttribute(_el$, "width", _p$.e = _v$);
432
+ _v$2 !== _p$.t && setAttribute(_el$, "height", _p$.t = _v$2);
433
+ _v$3 !== _p$.a && setAttribute(_el$, "class", _p$.a = _v$3);
434
+ return _p$;
435
+ }, {
436
+ e: void 0,
437
+ t: void 0,
438
+ a: void 0
439
+ });
440
+ return _el$;
441
+ })();
442
+ };
443
+
444
+ //#endregion
445
+ //#region src/components/icons/icon-loader.tsx
446
+ var _tmpl$$21 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path class=icon-loader-bar d="M12 2v4"style=animation-delay:0ms></path><path class=icon-loader-bar d="M15 6.8l2-3.5"style=animation-delay:-42ms></path><path class=icon-loader-bar d="M17.2 9l3.5-2"style=animation-delay:-83ms></path><path class=icon-loader-bar d="M18 12h4"style=animation-delay:-125ms></path><path class=icon-loader-bar d="M17.2 15l3.5 2"style=animation-delay:-167ms></path><path class=icon-loader-bar d="M15 17.2l2 3.5"style=animation-delay:-208ms></path><path class=icon-loader-bar d="M12 18v4"style=animation-delay:-250ms></path><path class=icon-loader-bar d="M9 17.2l-2 3.5"style=animation-delay:-292ms></path><path class=icon-loader-bar d="M6.8 15l-3.5 2"style=animation-delay:-333ms></path><path class=icon-loader-bar d="M2 12h4"style=animation-delay:-375ms></path><path class=icon-loader-bar d="M6.8 9l-3.5-2"style=animation-delay:-417ms></path><path class=icon-loader-bar d="M9 6.8l-2-3.5"style=animation-delay:-458ms>`);
447
+ const IconLoader = (props) => {
448
+ const size = () => props.size ?? 16;
449
+ return (() => {
450
+ var _el$ = _tmpl$$21();
451
+ _el$.firstChild.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling;
452
+ createRenderEffect((_p$) => {
453
+ var _v$ = size(), _v$2 = size(), _v$3 = props.class;
454
+ _v$ !== _p$.e && setAttribute(_el$, "width", _p$.e = _v$);
455
+ _v$2 !== _p$.t && setAttribute(_el$, "height", _p$.t = _v$2);
456
+ _v$3 !== _p$.a && setAttribute(_el$, "class", _p$.a = _v$3);
457
+ return _p$;
458
+ }, {
459
+ e: void 0,
460
+ t: void 0,
461
+ a: void 0
462
+ });
463
+ return _el$;
464
+ })();
465
+ };
466
+
467
+ //#endregion
468
+ //#region src/components/selection-label/arrow.tsx
469
+ var _tmpl$$20 = /* @__PURE__ */ template(`<div data-react-grab-arrow class="absolute w-0 h-0 z-10">`);
470
+ const Arrow = (props) => {
471
+ const arrowColor = () => props.color ?? "var(--rg-panel-bg)";
472
+ const isBottom = () => props.position === "bottom";
473
+ const arrowSize = () => getArrowSize(props.labelWidth ?? 0);
474
+ return (() => {
475
+ var _el$ = _tmpl$$20();
476
+ createRenderEffect((_p$) => {
477
+ var _v$ = `calc(${props.leftPercent}% + ${props.leftOffsetPx}px)`, _v$2 = isBottom() ? "0" : void 0, _v$3 = isBottom() ? void 0 : "0", _v$4 = isBottom() ? "translateX(-50%) translateY(-100%)" : "translateX(-50%) translateY(100%)", _v$5 = `${arrowSize()}px solid transparent`, _v$6 = `${arrowSize()}px solid transparent`, _v$7 = isBottom() ? `${arrowSize()}px solid ${arrowColor()}` : void 0, _v$8 = isBottom() ? void 0 : `${arrowSize()}px solid ${arrowColor()}`;
478
+ _v$ !== _p$.e && setStyleProperty(_el$, "left", _p$.e = _v$);
479
+ _v$2 !== _p$.t && setStyleProperty(_el$, "top", _p$.t = _v$2);
480
+ _v$3 !== _p$.a && setStyleProperty(_el$, "bottom", _p$.a = _v$3);
481
+ _v$4 !== _p$.o && setStyleProperty(_el$, "transform", _p$.o = _v$4);
482
+ _v$5 !== _p$.i && setStyleProperty(_el$, "border-left", _p$.i = _v$5);
483
+ _v$6 !== _p$.n && setStyleProperty(_el$, "border-right", _p$.n = _v$6);
484
+ _v$7 !== _p$.s && setStyleProperty(_el$, "border-bottom", _p$.s = _v$7);
485
+ _v$8 !== _p$.h && setStyleProperty(_el$, "border-top", _p$.h = _v$8);
486
+ return _p$;
487
+ }, {
488
+ e: void 0,
489
+ t: void 0,
490
+ a: void 0,
491
+ o: void 0,
492
+ i: void 0,
493
+ n: void 0,
494
+ s: void 0,
495
+ h: void 0
496
+ });
497
+ return _el$;
498
+ })();
499
+ };
500
+
501
+ //#endregion
502
+ //#region src/components/selection-label/tag-badge.tsx
503
+ var _tmpl$$19 = /* @__PURE__ */ template(`<span class=text-[var(--rg-text-primary)]>`), _tmpl$2$10 = /* @__PURE__ */ template(`<span class=text-[var(--rg-text-secondary)]>.`), _tmpl$3$5 = /* @__PURE__ */ template(`<div><span class="text-[13px] leading-4 h-fit font-medium overflow-hidden text-ellipsis whitespace-nowrap min-w-0">`);
504
+ const TagBadge = (props) => {
505
+ const handleMouseEnter = () => {
506
+ props.onHoverChange?.(true);
507
+ };
508
+ const handleMouseLeave = () => {
509
+ props.onHoverChange?.(false);
510
+ };
511
+ return (() => {
512
+ var _el$ = _tmpl$3$5(), _el$2 = _el$.firstChild;
513
+ addEventListener(_el$, "click", props.onClick, true);
514
+ _el$.addEventListener("mouseleave", handleMouseLeave);
515
+ _el$.addEventListener("mouseenter", handleMouseEnter);
516
+ insert(_el$2, createComponent(Show, {
517
+ get when() {
518
+ return props.componentName;
519
+ },
520
+ get children() {
521
+ return [(() => {
522
+ var _el$3 = _tmpl$$19();
523
+ insert(_el$3, () => props.componentName);
524
+ return _el$3;
525
+ })(), (() => {
526
+ var _el$4 = _tmpl$2$10();
527
+ _el$4.firstChild;
528
+ insert(_el$4, () => props.tagName, null);
529
+ return _el$4;
530
+ })()];
531
+ }
532
+ }), null);
533
+ insert(_el$2, createComponent(Show, {
534
+ get when() {
535
+ return !props.componentName;
536
+ },
537
+ get children() {
538
+ var _el$6 = _tmpl$$19();
539
+ insert(_el$6, () => props.tagName);
540
+ return _el$6;
541
+ }
542
+ }), null);
543
+ createRenderEffect(() => className(_el$, cn("contain-layout flex items-center gap-1 max-w-[280px] overflow-hidden", props.shrink && "shrink-0", props.isClickable && "cursor-pointer")));
544
+ return _el$;
545
+ })();
546
+ };
547
+ delegateEvents(["click"]);
548
+
549
+ //#endregion
550
+ //#region src/components/selection-label/bottom-section.tsx
551
+ var _tmpl$$18 = /* @__PURE__ */ template(`<div class="[font-synthesis:none] contain-layout shrink-0 flex flex-col items-start px-2 py-1.5 w-auto h-fit self-stretch [border-top-width:0.5px] border-t-solid border-t-[var(--rg-border-subtle)] antialiased rounded-t-none rounded-b-[6px]">`);
552
+ const BottomSection = (props) => (() => {
553
+ var _el$ = _tmpl$$18();
554
+ insert(_el$, () => props.children);
555
+ return _el$;
556
+ })();
557
+
558
+ //#endregion
559
+ //#region src/utils/confirmation-focus-manager.ts
560
+ let activeConfirmationId = null;
561
+ const confirmationFocusManager = {
562
+ claim: (id) => {
563
+ activeConfirmationId = id;
564
+ },
565
+ release: (id) => {
566
+ if (activeConfirmationId === id) activeConfirmationId = null;
567
+ },
568
+ isActive: (id) => activeConfirmationId === id
569
+ };
570
+
571
+ //#endregion
572
+ //#region src/components/icons/icon-return.tsx
573
+ var _tmpl$$17 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=currentColor><path fill-rule=evenodd clip-rule=evenodd d="M10.7071 21.2071C10.3166 21.5976 9.68342 21.5976 9.29289 21.2071L3.29289 15.2071C2.90237 14.8166 2.90237 14.1834 3.29289 13.7929L9.29289 7.79289C9.68342 7.40237 10.3166 7.40237 10.7071 7.79289C11.0976 8.18342 11.0976 8.81658 10.7071 9.20711L6.41421 13.5H16C16.5523 13.5 17 13.0523 17 12.5V3.5C17 2.94772 17.4477 2.5 18 2.5C18.5523 2.5 19 2.94772 19 3.5V12.5C19 14.1569 17.6569 15.5 16 15.5H6.41421L10.7071 19.7929C11.0976 20.1834 11.0976 20.8166 10.7071 21.2071Z">`);
574
+ const IconReturn = (props) => {
575
+ const size = () => props.size ?? 10;
576
+ return (() => {
577
+ var _el$ = _tmpl$$17();
578
+ createRenderEffect((_p$) => {
579
+ var _v$ = size(), _v$2 = size(), _v$3 = props.class;
580
+ _v$ !== _p$.e && setAttribute(_el$, "width", _p$.e = _v$);
581
+ _v$2 !== _p$.t && setAttribute(_el$, "height", _p$.t = _v$2);
582
+ _v$3 !== _p$.a && setAttribute(_el$, "class", _p$.a = _v$3);
583
+ return _p$;
584
+ }, {
585
+ e: void 0,
586
+ t: void 0,
587
+ a: void 0
588
+ });
589
+ return _el$;
590
+ })();
591
+ };
592
+
593
+ //#endregion
594
+ //#region src/components/selection-label/discard-prompt.tsx
595
+ var _tmpl$$16 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center justify-end gap-[5px] w-full h-fit"><button data-react-grab-discard-no class="contain-layout shrink-0 flex items-center justify-center px-[3px] py-px rounded-sm bg-[var(--rg-surface-hover)] [border-width:0.5px] border-solid border-[var(--rg-border-button)] cursor-pointer transition-all hover:bg-[var(--rg-surface-active)] press-scale h-[17px]"><span class="text-[var(--rg-text-primary)] text-[13px] leading-3.5 font-sans font-medium">No</span></button><button data-react-grab-discard-yes class="contain-layout shrink-0 flex items-center justify-center gap-0.5 px-[3px] py-px rounded-sm bg-[var(--rg-error-bg)] cursor-pointer transition-all hover:bg-[var(--rg-error-bg-hover)] press-scale h-[17px]"><span class="text-[var(--rg-error-text)] text-[13px] leading-3.5 font-sans font-medium">Yes`), _tmpl$2$9 = /* @__PURE__ */ template(`<div data-react-grab-discard-prompt class="contain-layout shrink-0 flex flex-col justify-center items-end w-fit h-fit"><div class="contain-layout shrink-0 flex items-center gap-1 pt-1.5 pb-1 px-2 w-full h-fit"><span class="text-[var(--rg-text-primary)] text-[13px] leading-4 shrink-0 font-sans font-medium w-fit h-fit">`);
596
+ const DiscardPrompt = (props) => {
597
+ const instanceId = Symbol();
598
+ const handleKeyDown = (event) => {
599
+ if (!confirmationFocusManager.isActive(instanceId)) return;
600
+ if (isKeyboardEventTriggeredByInput(event)) return;
601
+ const isEnter = event.code === "Enter";
602
+ const isEscape = event.code === "Escape";
603
+ if (isEnter || isEscape) {
604
+ event.preventDefault();
605
+ event.stopPropagation();
606
+ if (isEscape && props.cancelOnEscape) props.onCancel?.();
607
+ else props.onConfirm?.();
608
+ }
609
+ };
610
+ const handleFocus = () => {
611
+ confirmationFocusManager.claim(instanceId);
612
+ };
613
+ onMount(() => {
614
+ confirmationFocusManager.claim(instanceId);
615
+ window.addEventListener("keydown", handleKeyDown, { capture: true });
616
+ });
617
+ onCleanup(() => {
618
+ confirmationFocusManager.release(instanceId);
619
+ window.removeEventListener("keydown", handleKeyDown, { capture: true });
620
+ });
621
+ return (() => {
622
+ var _el$ = _tmpl$2$9(), _el$3 = _el$.firstChild.firstChild;
623
+ _el$.$$click = handleFocus;
624
+ _el$.$$pointerdown = handleFocus;
625
+ insert(_el$3, () => props.label ?? "Discard?");
626
+ insert(_el$, createComponent(BottomSection, { get children() {
627
+ var _el$4 = _tmpl$$16(), _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling;
628
+ _el$6.firstChild;
629
+ addEventListener(_el$5, "click", props.onCancel, true);
630
+ addEventListener(_el$6, "click", props.onConfirm, true);
631
+ insert(_el$6, createComponent(IconReturn, {
632
+ size: 10,
633
+ "class": "text-[var(--rg-error-text)] opacity-50"
634
+ }), null);
635
+ return _el$4;
636
+ } }), null);
637
+ return _el$;
638
+ })();
639
+ };
640
+ delegateEvents(["pointerdown", "click"]);
641
+
642
+ //#endregion
643
+ //#region src/components/icons/icon-retry.tsx
644
+ var _tmpl$$15 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=currentColor><path fill-rule=evenodd clip-rule=evenodd d="M7 2C4.23858 2 2 4.23858 2 7V15C2 17.7614 4.23858 20 7 20H8C8.55228 20 9 19.5523 9 19C9 18.4477 8.55228 18 8 18H7C5.34315 18 4 16.6569 4 15V7C4 5.34315 5.34315 4 7 4H17C18.6569 4 20 5.34315 20 7V15C20 16.6569 18.6569 18 17 18H14.4142L16.2071 16.2071C16.5976 15.8166 16.5976 15.1834 16.2071 14.7929C15.8166 14.4024 15.1834 14.4024 14.7929 14.7929L11.2929 18.2929C11.197 18.3888 11.1247 18.4993 11.0759 18.6172C11.027 18.7351 11 18.8644 11 19C11 19.2728 11.1093 19.5201 11.2864 19.7005C11.2889 19.7031 11.2914 19.7056 11.2939 19.7081L14.7929 23.2071C15.1834 23.5976 15.8166 23.5976 16.2071 23.2071C16.5976 22.8166 16.5976 22.1834 16.2071 21.7929L14.4142 20H17C19.7614 20 22 17.7614 22 15V7C22 4.23858 19.7614 2 17 2H7Z">`);
645
+ const IconRetry = (props) => {
646
+ const size = () => props.size ?? 12;
647
+ return (() => {
648
+ var _el$ = _tmpl$$15();
649
+ createRenderEffect((_p$) => {
650
+ var _v$ = size(), _v$2 = size(), _v$3 = props.class;
651
+ _v$ !== _p$.e && setAttribute(_el$, "width", _p$.e = _v$);
652
+ _v$2 !== _p$.t && setAttribute(_el$, "height", _p$.t = _v$2);
653
+ _v$3 !== _p$.a && setAttribute(_el$, "class", _p$.a = _v$3);
654
+ return _p$;
655
+ }, {
656
+ e: void 0,
657
+ t: void 0,
658
+ a: void 0
659
+ });
660
+ return _el$;
661
+ })();
662
+ };
663
+
664
+ //#endregion
665
+ //#region src/components/selection-label/error-view.tsx
666
+ var _tmpl$$14 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center justify-end gap-[5px] w-full h-fit"><button data-react-grab-retry class="contain-layout shrink-0 flex items-center justify-center gap-1 px-[3px] py-px rounded-sm bg-[var(--rg-surface-hover)] [border-width:0.5px] border-solid border-[var(--rg-border-button)] cursor-pointer transition-all hover:bg-[var(--rg-surface-active)] press-scale h-[17px]"><span class="text-[var(--rg-text-primary)] text-[13px] leading-3.5 font-sans font-medium">Retry</span></button><button data-react-grab-error-ok class="contain-layout shrink-0 flex items-center justify-center gap-1 px-[3px] py-px rounded-sm bg-[var(--rg-surface-hover)] [border-width:0.5px] border-solid border-[var(--rg-border-button)] cursor-pointer transition-all hover:bg-[var(--rg-surface-active)] press-scale h-[17px]"><span class="text-[var(--rg-text-primary)] text-[13px] leading-3.5 font-sans font-medium">Ok`), _tmpl$2$8 = /* @__PURE__ */ template(`<div data-react-grab-error class="contain-layout shrink-0 flex flex-col justify-center items-end w-fit h-fit max-w-[280px]"><div class="contain-layout shrink-0 flex items-start gap-1 px-2 w-full h-fit"><span class="text-[var(--rg-error-text)] text-[13px] leading-4 font-sans font-medium overflow-hidden line-clamp-5">`);
667
+ const ErrorView = (props) => {
668
+ const instanceId = Symbol();
669
+ const handleKeyDown = (event) => {
670
+ if (!confirmationFocusManager.isActive(instanceId)) return;
671
+ if (isKeyboardEventTriggeredByInput(event)) return;
672
+ const isEnter = event.code === "Enter";
673
+ const isEscape = event.code === "Escape";
674
+ if (isEnter) {
675
+ event.preventDefault();
676
+ event.stopPropagation();
677
+ props.onRetry?.();
678
+ } else if (isEscape) {
679
+ event.preventDefault();
680
+ event.stopPropagation();
681
+ props.onAcknowledge?.();
682
+ }
683
+ };
684
+ const handleFocus = () => {
685
+ confirmationFocusManager.claim(instanceId);
686
+ };
687
+ onMount(() => {
688
+ confirmationFocusManager.claim(instanceId);
689
+ window.addEventListener("keydown", handleKeyDown, { capture: true });
690
+ });
691
+ onCleanup(() => {
692
+ confirmationFocusManager.release(instanceId);
693
+ window.removeEventListener("keydown", handleKeyDown, { capture: true });
694
+ });
695
+ const hasActions = () => Boolean(props.onRetry || props.onAcknowledge);
696
+ return (() => {
697
+ var _el$ = _tmpl$2$8(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild;
698
+ _el$.$$click = handleFocus;
699
+ _el$.$$pointerdown = handleFocus;
700
+ insert(_el$3, () => props.error);
701
+ insert(_el$, createComponent(Show, {
702
+ get when() {
703
+ return hasActions();
704
+ },
705
+ get children() {
706
+ return createComponent(BottomSection, { get children() {
707
+ var _el$4 = _tmpl$$14(), _el$5 = _el$4.firstChild;
708
+ _el$5.firstChild;
709
+ var _el$7 = _el$5.nextSibling;
710
+ addEventListener(_el$5, "click", props.onRetry, true);
711
+ insert(_el$5, createComponent(IconRetry, {
712
+ size: 10,
713
+ "class": "text-[var(--rg-text-secondary)]"
714
+ }), null);
715
+ addEventListener(_el$7, "click", props.onAcknowledge, true);
716
+ return _el$4;
717
+ } });
718
+ }
719
+ }), null);
720
+ createRenderEffect((_p$) => {
721
+ var _v$ = {
722
+ "pt-1.5 pb-1": hasActions(),
723
+ "py-1.5": !hasActions()
724
+ }, _v$2 = props.error;
725
+ _p$.e = classList(_el$2, _v$, _p$.e);
726
+ _v$2 !== _p$.t && setAttribute(_el$3, "title", _p$.t = _v$2);
727
+ return _p$;
728
+ }, {
729
+ e: void 0,
730
+ t: void 0
731
+ });
732
+ return _el$;
733
+ })();
734
+ };
735
+ delegateEvents(["pointerdown", "click"]);
736
+
737
+ //#endregion
738
+ //#region src/components/icons/icon-ellipsis.tsx
739
+ var _tmpl$$13 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=currentColor><path fill-rule=evenodd clip-rule=evenodd d="M7.5 12C7.5 13.3807 6.38071 14.5 5 14.5C3.61929 14.5 2.5 13.3807 2.5 12C2.5 10.6193 3.61929 9.5 5 9.5C6.38071 9.5 7.5 10.6193 7.5 12ZM14.5 12C14.5 13.3807 13.3807 14.5 12 14.5C10.6193 14.5 9.5 13.3807 9.5 12C9.5 10.6193 10.6193 9.5 12 9.5C13.3807 9.5 14.5 10.6193 14.5 12ZM19 14.5C20.3807 14.5 21.5 13.3807 21.5 12C21.5 10.6193 20.3807 9.5 19 9.5C17.6193 9.5 16.5 10.6193 16.5 12C16.5 13.3807 17.6193 14.5 19 14.5Z">`);
740
+ const IconEllipsis = (props) => {
741
+ const size = () => props.size ?? 14;
742
+ return (() => {
743
+ var _el$ = _tmpl$$13();
744
+ createRenderEffect((_p$) => {
745
+ var _v$ = size(), _v$2 = size(), _v$3 = props.class;
746
+ _v$ !== _p$.e && setAttribute(_el$, "width", _p$.e = _v$);
747
+ _v$2 !== _p$.t && setAttribute(_el$, "height", _p$.t = _v$2);
748
+ _v$3 !== _p$.a && setAttribute(_el$, "class", _p$.a = _v$3);
749
+ return _p$;
750
+ }, {
751
+ e: void 0,
752
+ t: void 0,
753
+ a: void 0
754
+ });
755
+ return _el$;
756
+ })();
757
+ };
758
+
759
+ //#endregion
760
+ //#region src/components/icons/icon-check.tsx
761
+ var _tmpl$$12 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=currentColor><path fill-rule=evenodd clip-rule=evenodd d="M2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12ZM17.7071 10.7071C18.0976 10.3166 18.0976 9.68342 17.7071 9.29289C17.3166 8.90237 16.6834 8.90237 16.2929 9.29289L11 14.5858L8.70711 12.2929C8.31658 11.9024 7.68342 11.9024 7.29289 12.2929C6.90237 12.6834 6.90237 13.3166 7.29289 13.7071L10.2929 16.7071C10.6834 17.0976 11.3166 17.0976 11.7071 16.7071L17.7071 10.7071Z">`);
762
+ const IconCheck = (props) => {
763
+ const size = () => props.size ?? 14;
764
+ return (() => {
765
+ var _el$ = _tmpl$$12();
766
+ createRenderEffect((_p$) => {
767
+ var _v$ = size(), _v$2 = size(), _v$3 = props.class;
768
+ _v$ !== _p$.e && setAttribute(_el$, "width", _p$.e = _v$);
769
+ _v$2 !== _p$.t && setAttribute(_el$, "height", _p$.t = _v$2);
770
+ _v$3 !== _p$.a && setAttribute(_el$, "class", _p$.a = _v$3);
771
+ return _p$;
772
+ }, {
773
+ e: void 0,
774
+ t: void 0,
775
+ a: void 0
776
+ });
777
+ return _el$;
778
+ })();
779
+ };
780
+
781
+ //#endregion
782
+ //#region src/components/selection-label/completion-view.tsx
783
+ var _tmpl$$11 = /* @__PURE__ */ template(`<button data-react-grab-ignore-events data-react-grab-more-options class="flex items-center justify-center size-4 rounded-sm cursor-pointer bg-transparent hover:bg-[var(--rg-surface-hover)] text-[var(--rg-text-secondary)] hover:text-[var(--rg-text-primary)] border-none outline-none p-0 shrink-0 press-scale">`), _tmpl$2$7 = /* @__PURE__ */ template(`<button data-react-grab-dismiss class="contain-layout shrink-0 flex items-center justify-center gap-1 px-[3px] py-px rounded-sm bg-[var(--rg-surface-hover)] [border-width:0.5px] border-solid border-[var(--rg-border-button)] cursor-pointer transition-all hover:bg-[var(--rg-surface-active)] press-scale h-[17px]"><span class="text-[var(--rg-text-primary)] text-[13px] leading-3.5 font-sans font-medium">Keep`), _tmpl$3$4 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center justify-between gap-2 pt-1.5 pb-1 px-2 w-full h-fit"><span class="text-[var(--rg-text-primary)] text-[13px] leading-4 font-sans font-medium h-fit tabular-nums overflow-hidden text-ellipsis whitespace-nowrap min-w-0"></span><div class="contain-layout shrink-0 flex items-center gap-2 h-fit">`), _tmpl$4$1 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center gap-0.5 py-1.5 px-2 w-full h-fit"><span class="text-[var(--rg-text-primary)] text-[13px] leading-4 font-sans font-medium h-fit tabular-nums overflow-hidden text-ellipsis whitespace-nowrap min-w-0">`), _tmpl$5$1 = /* @__PURE__ */ template(`<div data-react-grab-completion>`);
784
+ const MoreOptionsButton = (props) => {
785
+ return (() => {
786
+ var _el$ = _tmpl$$11();
787
+ addEventListener(_el$, "click", (event) => {
788
+ event.stopImmediatePropagation();
789
+ props.onClick();
790
+ });
791
+ addEventListener(_el$, "pointerdown", (event) => {
792
+ event.stopImmediatePropagation();
793
+ });
794
+ insert(_el$, createComponent(IconEllipsis, { size: 14 }));
795
+ return _el$;
796
+ })();
797
+ };
798
+ const CompletionView = (props) => {
799
+ const instanceId = Symbol();
800
+ let fadeTimeoutId;
801
+ let dismissTimeoutId;
802
+ const [didCopy, setDidCopy] = createSignal(false);
803
+ const [isFading, setIsFading] = createSignal(false);
804
+ const displayStatusText = () => didCopy() ? "Copied" : props.statusText;
805
+ const handleShowContextMenu = () => {
806
+ if (fadeTimeoutId !== void 0) window.clearTimeout(fadeTimeoutId);
807
+ if (dismissTimeoutId !== void 0) window.clearTimeout(dismissTimeoutId);
808
+ setIsFading(true);
809
+ props.onFadingChange?.(true);
810
+ props.onShowContextMenu?.();
811
+ };
812
+ const handleAccept = () => {
813
+ if (didCopy()) return;
814
+ setDidCopy(true);
815
+ fadeTimeoutId = window.setTimeout(() => {
816
+ setIsFading(true);
817
+ props.onFadingChange?.(true);
818
+ dismissTimeoutId = window.setTimeout(() => {
819
+ props.onDismiss?.();
820
+ }, 150);
821
+ }, FEEDBACK_DURATION_MS - 150);
822
+ };
823
+ const handleKeyDown = (event) => {
824
+ if (!confirmationFocusManager.isActive(instanceId)) return;
825
+ const isEnter = event.code === "Enter";
826
+ const isEscape = event.code === "Escape";
827
+ if (isKeyboardEventTriggeredByInput(event)) return;
828
+ if (isEnter) {
829
+ event.preventDefault();
830
+ event.stopPropagation();
831
+ handleAccept();
832
+ } else if (isEscape) {
833
+ event.preventDefault();
834
+ event.stopPropagation();
835
+ props.onDismiss?.();
836
+ }
837
+ };
838
+ const handleFocus = () => {
839
+ confirmationFocusManager.claim(instanceId);
840
+ };
841
+ onMount(() => {
842
+ confirmationFocusManager.claim(instanceId);
843
+ window.addEventListener("keydown", handleKeyDown, { capture: true });
844
+ });
845
+ onCleanup(() => {
846
+ confirmationFocusManager.release(instanceId);
847
+ window.removeEventListener("keydown", handleKeyDown, { capture: true });
848
+ if (fadeTimeoutId !== void 0) window.clearTimeout(fadeTimeoutId);
849
+ if (dismissTimeoutId !== void 0) window.clearTimeout(dismissTimeoutId);
850
+ });
851
+ return (() => {
852
+ var _el$2 = _tmpl$5$1();
853
+ _el$2.$$click = handleFocus;
854
+ _el$2.$$pointerdown = handleFocus;
855
+ insert(_el$2, createComponent(Show, {
856
+ get when() {
857
+ return memo(() => !!!didCopy())() && props.onDismiss;
858
+ },
859
+ get children() {
860
+ var _el$3 = _tmpl$3$4(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling;
861
+ insert(_el$4, displayStatusText);
862
+ insert(_el$5, createComponent(Show, {
863
+ get when() {
864
+ return props.onShowContextMenu;
865
+ },
866
+ get children() {
867
+ return createComponent(MoreOptionsButton, { onClick: handleShowContextMenu });
868
+ }
869
+ }), null);
870
+ insert(_el$5, createComponent(Show, {
871
+ get when() {
872
+ return props.onDismiss;
873
+ },
874
+ get children() {
875
+ var _el$6 = _tmpl$2$7();
876
+ _el$6.firstChild;
877
+ _el$6.$$click = handleAccept;
878
+ insert(_el$6, createComponent(Show, {
879
+ get when() {
880
+ return !didCopy();
881
+ },
882
+ get children() {
883
+ return createComponent(IconReturn, {
884
+ size: 10,
885
+ "class": "text-[var(--rg-text-secondary)]"
886
+ });
887
+ }
888
+ }), null);
889
+ createRenderEffect(() => _el$6.disabled = didCopy());
890
+ return _el$6;
891
+ }
892
+ }), null);
893
+ return _el$3;
894
+ }
895
+ }), null);
896
+ insert(_el$2, createComponent(Show, {
897
+ get when() {
898
+ return didCopy() || !props.onDismiss;
899
+ },
900
+ get children() {
901
+ var _el$8 = _tmpl$4$1(), _el$9 = _el$8.firstChild;
902
+ insert(_el$8, createComponent(IconCheck, {
903
+ size: 14,
904
+ "class": "text-[var(--rg-text-primary-85)] shrink-0 animate-success-pop"
905
+ }), _el$9);
906
+ insert(_el$9, displayStatusText);
907
+ insert(_el$8, createComponent(Show, {
908
+ get when() {
909
+ return props.onShowContextMenu;
910
+ },
911
+ get children() {
912
+ return createComponent(MoreOptionsButton, { onClick: handleShowContextMenu });
913
+ }
914
+ }), null);
915
+ return _el$8;
916
+ }
917
+ }), null);
918
+ createRenderEffect((_p$) => {
919
+ var _v$ = cn("contain-layout shrink-0 flex flex-col justify-center items-end rounded-[10px] antialiased w-fit h-fit max-w-[280px] transition-opacity duration-100 ease-out [font-synthesis:none] [corner-shape:superellipse(1.25)]", "bg-[var(--rg-panel-bg)]"), _v$2 = isFading() ? 0 : 1;
920
+ _v$ !== _p$.e && className(_el$2, _p$.e = _v$);
921
+ _v$2 !== _p$.t && setStyleProperty(_el$2, "opacity", _p$.t = _v$2);
922
+ return _p$;
923
+ }, {
924
+ e: void 0,
925
+ t: void 0
926
+ });
927
+ return _el$2;
928
+ })();
929
+ };
930
+ delegateEvents(["pointerdown", "click"]);
931
+
932
+ //#endregion
933
+ //#region src/utils/create-menu-highlight.ts
934
+ const DEFAULT_HIDDEN_OPACITY = "0";
935
+ const DEFAULT_VISIBLE_OPACITY = "1";
936
+ const createAnimatedBoundsFollower = ({ hiddenOpacity = DEFAULT_HIDDEN_OPACITY, visibleOpacity = DEFAULT_VISIBLE_OPACITY } = {}) => {
937
+ let containerElement;
938
+ let followerElement;
939
+ const hideFollower = () => {
940
+ if (!followerElement) return;
941
+ followerElement.style.opacity = hiddenOpacity;
942
+ };
943
+ const followElement = (targetElement) => {
944
+ if (!followerElement || !containerElement) return;
945
+ if (!targetElement) {
946
+ hideFollower();
947
+ return;
948
+ }
949
+ const containerRect = containerElement.getBoundingClientRect();
950
+ const targetRect = targetElement.getBoundingClientRect();
951
+ const targetTopWithinContainer = targetRect.top - containerRect.top + containerElement.scrollTop;
952
+ const targetLeftWithinContainer = targetRect.left - containerRect.left + containerElement.scrollLeft;
953
+ followerElement.style.opacity = visibleOpacity;
954
+ followerElement.style.top = `${targetTopWithinContainer}px`;
955
+ followerElement.style.left = `${targetLeftWithinContainer}px`;
956
+ followerElement.style.width = `${targetRect.width}px`;
957
+ followerElement.style.height = `${targetRect.height}px`;
958
+ };
959
+ const setContainerRef = (containerNode) => {
960
+ containerElement = containerNode;
961
+ };
962
+ const setFollowerRef = (followerNode) => {
963
+ followerElement = followerNode;
964
+ };
965
+ return {
966
+ containerRef: setContainerRef,
967
+ followerRef: setFollowerRef,
968
+ followElement,
969
+ hideFollower
970
+ };
971
+ };
972
+ const createMenuHighlight = () => {
973
+ const { containerRef, followerRef: highlightRef, followElement: updateHighlight, hideFollower: clearHighlight } = createAnimatedBoundsFollower();
974
+ return {
975
+ containerRef,
976
+ highlightRef,
977
+ updateHighlight,
978
+ clearHighlight
979
+ };
980
+ };
981
+
982
+ //#endregion
983
+ //#region src/components/selection-label/arrow-navigation-menu.tsx
984
+ var _tmpl$$10 = /* @__PURE__ */ template(`<div class="relative flex flex-col w-[calc(100%+16px)] -mx-2 -my-1.5"><div class="pointer-events-none absolute opacity-0 transition-[top,left,width,height,opacity] duration-75 ease-out bg-[var(--rg-surface-hover)]">`), _tmpl$2$6 = /* @__PURE__ */ template(`<span class=text-[var(--rg-text-secondary)]>.`), _tmpl$3$3 = /* @__PURE__ */ template(`<button data-react-grab-ignore-events class="relative z-1 contain-layout flex items-center w-full px-2 py-1 cursor-pointer text-left border-none bg-transparent"><span class="text-[13px] leading-4 h-fit font-medium overflow-hidden text-ellipsis whitespace-nowrap min-w-0 transition-colors">`);
985
+ const ArrowNavigationMenu = (props) => {
986
+ const { containerRef: highlightContainerRef, highlightRef, updateHighlight, clearHighlight } = createMenuHighlight();
987
+ let menuItemsRef;
988
+ let didPointerMove = false;
989
+ const getMenuItemByIndex = (itemIndex) => {
990
+ if (!menuItemsRef) return void 0;
991
+ return menuItemsRef.querySelector(`[data-react-grab-arrow-nav-index="${itemIndex}"]`) ?? void 0;
992
+ };
993
+ createEffect(() => {
994
+ props.items;
995
+ didPointerMove = false;
996
+ });
997
+ createEffect(() => {
998
+ const activeMenuItem = getMenuItemByIndex(props.activeIndex);
999
+ if (activeMenuItem) updateHighlight(activeMenuItem);
1000
+ });
1001
+ return createComponent(BottomSection, { get children() {
1002
+ var _el$ = _tmpl$$10(), _el$2 = _el$.firstChild;
1003
+ _el$.$$pointermove = () => {
1004
+ didPointerMove = true;
1005
+ };
1006
+ use((element) => {
1007
+ menuItemsRef = element;
1008
+ highlightContainerRef(element);
1009
+ }, _el$);
1010
+ use(highlightRef, _el$2);
1011
+ insert(_el$, createComponent(For, {
1012
+ get each() {
1013
+ return props.items;
1014
+ },
1015
+ children: (item, itemIndex) => (() => {
1016
+ var _el$3 = _tmpl$3$3(), _el$4 = _el$3.firstChild;
1017
+ _el$3.$$click = (event) => {
1018
+ event.stopPropagation();
1019
+ props.onSelect(itemIndex());
1020
+ };
1021
+ _el$3.addEventListener("pointerleave", () => {
1022
+ const activeMenuItem = getMenuItemByIndex(props.activeIndex);
1023
+ if (activeMenuItem) updateHighlight(activeMenuItem);
1024
+ else clearHighlight();
1025
+ });
1026
+ _el$3.addEventListener("pointerenter", (event) => {
1027
+ updateHighlight(event.currentTarget);
1028
+ if (didPointerMove) props.onSelect(itemIndex());
1029
+ });
1030
+ _el$3.$$pointerdown = (event) => event.stopPropagation();
1031
+ insert(_el$4, createComponent(Show, {
1032
+ get when() {
1033
+ return item.componentName;
1034
+ },
1035
+ get children() {
1036
+ return [memo(() => item.componentName), _tmpl$2$6()];
1037
+ }
1038
+ }), null);
1039
+ insert(_el$4, () => item.tagName, null);
1040
+ createRenderEffect((_p$) => {
1041
+ var _v$ = item.tagName, _v$2 = itemIndex(), _v$3 = !!(itemIndex() === props.activeIndex), _v$4 = !!(itemIndex() !== props.activeIndex);
1042
+ _v$ !== _p$.e && setAttribute(_el$3, "data-react-grab-arrow-nav-item", _p$.e = _v$);
1043
+ _v$2 !== _p$.t && setAttribute(_el$3, "data-react-grab-arrow-nav-index", _p$.t = _v$2);
1044
+ _v$3 !== _p$.a && _el$4.classList.toggle("text-[var(--rg-text-primary)]", _p$.a = _v$3);
1045
+ _v$4 !== _p$.o && _el$4.classList.toggle("text-[var(--rg-text-secondary)]", _p$.o = _v$4);
1046
+ return _p$;
1047
+ }, {
1048
+ e: void 0,
1049
+ t: void 0,
1050
+ a: void 0,
1051
+ o: void 0
1052
+ });
1053
+ return _el$3;
1054
+ })()
1055
+ }), null);
1056
+ return _el$;
1057
+ } });
1058
+ };
1059
+ delegateEvents([
1060
+ "pointermove",
1061
+ "pointerdown",
1062
+ "click"
1063
+ ]);
1064
+
1065
+ //#endregion
1066
+ //#region src/components/selection-label/index.tsx
1067
+ var _tmpl$$9 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex flex-col justify-center items-start w-fit h-fit max-w-[280px]"><div class="contain-layout shrink-0 flex items-center gap-1 py-1.5 px-2 w-full h-fit"><span class="shimmer-text text-[13px] leading-4 font-sans font-medium h-fit tabular-nums overflow-hidden text-ellipsis whitespace-nowrap">`), _tmpl$2$5 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex flex-col items-start w-fit h-fit"><div class="contain-layout shrink-0 flex items-center gap-1 w-fit h-fit px-2">`), _tmpl$3$2 = /* @__PURE__ */ template(`<button data-react-grab-submit class="contain-layout shrink-0 flex items-center justify-center size-4 rounded-full bg-[var(--rg-submit-bg)] cursor-pointer ml-1 interactive-scale">`), _tmpl$4 = /* @__PURE__ */ template(`<div class="shrink-0 flex justify-between items-end w-full min-h-4"><textarea data-react-grab-ignore-events data-react-grab-input class="text-[var(--rg-text-primary)] text-[13px] leading-4 font-medium bg-transparent border-none outline-none resize-none flex-1 p-0 m-0 wrap-break-word overflow-y-auto"placeholder="Add context"rows=1 style=field-sizing:content;min-height:16px;scrollbar-width:none>`), _tmpl$5 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex flex-col justify-center items-start w-fit h-fit min-w-[150px] max-w-[280px]"><div class="contain-layout shrink-0 flex items-center gap-1 pt-1.5 pb-1 w-fit h-fit px-2 max-w-full">`), _tmpl$6 = /* @__PURE__ */ template(`<div data-react-grab-ignore-events data-react-grab-selection-label><div>`);
1068
+ const DEFAULT_OFFSCREEN_POSITION = {
1069
+ left: SELECTION_LABEL_OFFSCREEN_PX,
1070
+ top: SELECTION_LABEL_OFFSCREEN_PX,
1071
+ arrowLeftPercent: 50,
1072
+ arrowLeftOffset: 0,
1073
+ edgeOffsetX: 0
1074
+ };
1075
+ const SelectionLabel = (props) => {
1076
+ let containerRef;
1077
+ let panelRef;
1078
+ let inputRef;
1079
+ let isTagCurrentlyHovered = false;
1080
+ const [measuredWidth, setMeasuredWidth] = createSignal(0);
1081
+ const [measuredHeight, setMeasuredHeight] = createSignal(0);
1082
+ const [panelWidth, setPanelWidth] = createSignal(0);
1083
+ const [viewportVersion, setViewportVersion] = createSignal(0);
1084
+ const [isInternalFading, setIsInternalFading] = createSignal(false);
1085
+ const [isShaking, setIsShaking] = createSignal(false);
1086
+ const canInteract = () => props.status !== "copying" && props.status !== "copied" && props.status !== "fading" && props.status !== "error";
1087
+ const isCompletedStatus = () => props.status === "copied" || props.status === "fading";
1088
+ const canToggleExpand = () => Boolean(props.shouldToggleExpandOnClick) && Boolean(props.onToggleExpand) && canInteract() && !props.isPromptMode;
1089
+ const shouldEnablePointerEvents = () => {
1090
+ if (props.isPromptMode) return true;
1091
+ if (canToggleExpand()) return true;
1092
+ if (isCompletedStatus() && (props.onDismiss || props.onShowContextMenu)) return true;
1093
+ if (props.status === "error" && (props.onAcknowledgeError || props.onRetry)) return true;
1094
+ if (props.arrowNavigationState?.isVisible) return true;
1095
+ return false;
1096
+ };
1097
+ let resizeObserver;
1098
+ const handleTagHoverChange = (hovered) => {
1099
+ isTagCurrentlyHovered = hovered;
1100
+ };
1101
+ const handleViewportChange = () => {
1102
+ setViewportVersion((version) => version + 1);
1103
+ };
1104
+ const handleGlobalKeyDown = (event) => {
1105
+ if (isKeyboardEventTriggeredByInput(event)) return;
1106
+ if (event.code === "Enter" && !props.isPromptMode && canInteract()) {
1107
+ event.preventDefault();
1108
+ event.stopImmediatePropagation();
1109
+ props.onToggleExpand?.();
1110
+ }
1111
+ };
1112
+ onMount(() => {
1113
+ resizeObserver = new ResizeObserver((entries) => {
1114
+ for (const entry of entries) {
1115
+ const rect = entry.target.getBoundingClientRect();
1116
+ if (entry.target === containerRef && !isTagCurrentlyHovered) {
1117
+ setMeasuredWidth(rect.width);
1118
+ setMeasuredHeight(rect.height);
1119
+ } else if (entry.target === panelRef) setPanelWidth(rect.width);
1120
+ }
1121
+ });
1122
+ if (containerRef) {
1123
+ const rect = containerRef.getBoundingClientRect();
1124
+ setMeasuredWidth(rect.width);
1125
+ setMeasuredHeight(rect.height);
1126
+ resizeObserver.observe(containerRef);
1127
+ }
1128
+ if (panelRef) {
1129
+ setPanelWidth(panelRef.getBoundingClientRect().width);
1130
+ resizeObserver.observe(panelRef);
1131
+ }
1132
+ window.addEventListener("scroll", handleViewportChange, true);
1133
+ window.addEventListener("resize", handleViewportChange);
1134
+ window.visualViewport?.addEventListener("resize", handleViewportChange);
1135
+ window.visualViewport?.addEventListener("scroll", handleViewportChange);
1136
+ if (props.onToggleExpand) window.addEventListener("keydown", handleGlobalKeyDown, { capture: true });
1137
+ });
1138
+ onCleanup(() => {
1139
+ resizeObserver?.disconnect();
1140
+ window.removeEventListener("scroll", handleViewportChange, true);
1141
+ window.removeEventListener("resize", handleViewportChange);
1142
+ window.visualViewport?.removeEventListener("resize", handleViewportChange);
1143
+ window.visualViewport?.removeEventListener("scroll", handleViewportChange);
1144
+ window.removeEventListener("keydown", handleGlobalKeyDown, { capture: true });
1145
+ });
1146
+ const elementIdentity = () => `${props.tagName ?? ""}:${props.componentName ?? ""}`;
1147
+ const positionComputation = createMemo((previousResult) => {
1148
+ viewportVersion();
1149
+ const currentElementIdentity = elementIdentity();
1150
+ const cached = currentElementIdentity !== previousResult.elementIdentity ? {
1151
+ position: DEFAULT_OFFSCREEN_POSITION,
1152
+ computedArrowPosition: null,
1153
+ hadValidBounds: false,
1154
+ elementIdentity: currentElementIdentity
1155
+ } : previousResult;
1156
+ const bounds = props.selectionBounds;
1157
+ const labelWidth = measuredWidth();
1158
+ const labelHeight = measuredHeight();
1159
+ const hasMeasurements = labelWidth > 0 && labelHeight > 0;
1160
+ const hasValidBounds = bounds && bounds.width > 0 && bounds.height > 0;
1161
+ if (!hasMeasurements || !hasValidBounds) return {
1162
+ position: cached.hadValidBounds ? cached.position : DEFAULT_OFFSCREEN_POSITION,
1163
+ computedArrowPosition: cached.computedArrowPosition,
1164
+ hadValidBounds: cached.hadValidBounds,
1165
+ elementIdentity: currentElementIdentity
1166
+ };
1167
+ const visualViewport = window.visualViewport;
1168
+ const viewportLeft = visualViewport?.offsetLeft ?? 0;
1169
+ const viewportTop = visualViewport?.offsetTop ?? 0;
1170
+ const viewportRight = viewportLeft + (visualViewport?.width ?? window.innerWidth);
1171
+ const viewportBottom = viewportTop + (visualViewport?.height ?? window.innerHeight);
1172
+ if (!(bounds.x + bounds.width > viewportLeft && bounds.x < viewportRight && bounds.y + bounds.height > viewportTop && bounds.y < viewportBottom)) return {
1173
+ position: DEFAULT_OFFSCREEN_POSITION,
1174
+ computedArrowPosition: cached.computedArrowPosition,
1175
+ hadValidBounds: cached.hadValidBounds,
1176
+ elementIdentity: currentElementIdentity
1177
+ };
1178
+ const selectionCenterX = bounds.x + bounds.width / 2;
1179
+ const cursorX = props.mouseX ?? selectionCenterX;
1180
+ const selectionBottom = bounds.y + bounds.height;
1181
+ const selectionTop = bounds.y;
1182
+ const actualArrowHeight = props.hideArrow ? 0 : getArrowSize(panelWidth());
1183
+ const anchorX = cursorX;
1184
+ let edgeOffsetX = 0;
1185
+ let positionTop = selectionBottom + actualArrowHeight + 4;
1186
+ if (labelWidth > 0) {
1187
+ const labelLeft = anchorX - labelWidth / 2;
1188
+ const labelRight = anchorX + labelWidth / 2;
1189
+ if (labelRight > viewportRight - 8) edgeOffsetX = viewportRight - 8 - labelRight;
1190
+ if (labelLeft + edgeOffsetX < viewportLeft + 8) edgeOffsetX = viewportLeft + 8 - labelLeft;
1191
+ }
1192
+ const totalHeightNeeded = labelHeight + actualArrowHeight + 4;
1193
+ const fitsBelow = positionTop + labelHeight <= viewportBottom - 8;
1194
+ if (!fitsBelow) positionTop = selectionTop - totalHeightNeeded;
1195
+ if (positionTop < viewportTop + 8) positionTop = viewportTop + 8;
1196
+ const labelHalfWidth = labelWidth / 2;
1197
+ const arrowCenterPx = labelHalfWidth - edgeOffsetX;
1198
+ const arrowMinPx = Math.min(16, labelHalfWidth);
1199
+ const arrowMaxPx = Math.max(labelWidth - 16, labelHalfWidth);
1200
+ const arrowLeftOffset = Math.max(arrowMinPx, Math.min(arrowMaxPx, arrowCenterPx)) - labelHalfWidth;
1201
+ return {
1202
+ position: {
1203
+ left: anchorX,
1204
+ top: positionTop,
1205
+ arrowLeftPercent: 50,
1206
+ arrowLeftOffset,
1207
+ edgeOffsetX
1208
+ },
1209
+ computedArrowPosition: fitsBelow ? "bottom" : "top",
1210
+ hadValidBounds: true,
1211
+ elementIdentity: currentElementIdentity
1212
+ };
1213
+ }, {
1214
+ position: DEFAULT_OFFSCREEN_POSITION,
1215
+ computedArrowPosition: null,
1216
+ hadValidBounds: false,
1217
+ elementIdentity: ""
1218
+ });
1219
+ const arrowPosition = () => positionComputation().computedArrowPosition ?? "bottom";
1220
+ const hadValidBounds = () => positionComputation().hadValidBounds;
1221
+ createEffect(on(() => props.selectionLabelShakeCount, () => setIsShaking(true), { defer: true }));
1222
+ const handleKeyDown = (event) => {
1223
+ if (event.isComposing || event.keyCode === 229) return;
1224
+ event.stopImmediatePropagation();
1225
+ const isEnterWithoutShift = event.code === "Enter" && !event.shiftKey;
1226
+ const isEscape = event.code === "Escape";
1227
+ if (isEnterWithoutShift) {
1228
+ event.preventDefault();
1229
+ props.onSubmit?.();
1230
+ } else if (isEscape) {
1231
+ event.preventDefault();
1232
+ props.onConfirmDismiss?.();
1233
+ }
1234
+ };
1235
+ const handleInput = (event) => {
1236
+ const inputTarget = event.target;
1237
+ if (!(inputTarget instanceof HTMLTextAreaElement)) return;
1238
+ autoResizeTextarea(inputTarget, 95);
1239
+ props.onInputChange?.(inputTarget.value);
1240
+ };
1241
+ const tagDisplayResult = () => getTagDisplay({
1242
+ tagName: props.tagName,
1243
+ componentName: props.componentName,
1244
+ elementsCount: props.elementsCount
1245
+ });
1246
+ const isArrowNavigationVisible = () => Boolean(props.arrowNavigationState?.isVisible);
1247
+ const handleTagClick = (event) => {
1248
+ event.stopImmediatePropagation();
1249
+ if (props.filePath && props.onOpen) {
1250
+ props.onOpen();
1251
+ return;
1252
+ }
1253
+ if (canToggleExpand()) props.onToggleExpand?.();
1254
+ };
1255
+ const handleContainerPointerDown = (event) => {
1256
+ event.stopImmediatePropagation();
1257
+ if (canInteract() && props.isPromptMode && !props.isPendingDismiss && props.onSubmit && inputRef) inputRef.focus({ preventScroll: true });
1258
+ };
1259
+ const shouldPersistDuringFade = () => hadValidBounds() && (isCompletedStatus() || props.status === "error");
1260
+ return createComponent(Show, {
1261
+ get when() {
1262
+ return memo(() => props.visible !== false)() && (props.selectionBounds || shouldPersistDuringFade());
1263
+ },
1264
+ get children() {
1265
+ var _el$ = _tmpl$6(), _el$2 = _el$.firstChild;
1266
+ _el$.addEventListener("mouseleave", () => props.onHoverChange?.(false));
1267
+ _el$.addEventListener("mouseenter", () => props.onHoverChange?.(true));
1268
+ _el$.$$click = (event) => {
1269
+ event.stopImmediatePropagation();
1270
+ };
1271
+ _el$.$$pointerdown = handleContainerPointerDown;
1272
+ var _ref$ = containerRef;
1273
+ typeof _ref$ === "function" ? use(_ref$, _el$) : containerRef = _el$;
1274
+ setStyleProperty(_el$, "z-index", `${Z_INDEX_OVERLAY}`);
1275
+ setStyleProperty(_el$, "transition", `opacity ${150}ms ease-out, filter ${150}ms ease-out`);
1276
+ insert(_el$, createComponent(Show, {
1277
+ get when() {
1278
+ return !props.hideArrow;
1279
+ },
1280
+ get children() {
1281
+ return createComponent(Arrow, {
1282
+ get position() {
1283
+ return arrowPosition();
1284
+ },
1285
+ get leftPercent() {
1286
+ return positionComputation().position.arrowLeftPercent;
1287
+ },
1288
+ get leftOffsetPx() {
1289
+ return positionComputation().position.arrowLeftOffset;
1290
+ },
1291
+ get labelWidth() {
1292
+ return panelWidth();
1293
+ }
1294
+ });
1295
+ }
1296
+ }), _el$2);
1297
+ insert(_el$, createComponent(Show, {
1298
+ get when() {
1299
+ return memo(() => !!isCompletedStatus())() && !props.error;
1300
+ },
1301
+ get children() {
1302
+ return createComponent(CompletionView, {
1303
+ get statusText() {
1304
+ return props.statusText ?? "Copied";
1305
+ },
1306
+ get onDismiss() {
1307
+ return props.onDismiss;
1308
+ },
1309
+ onFadingChange: setIsInternalFading,
1310
+ get onShowContextMenu() {
1311
+ return props.onShowContextMenu;
1312
+ }
1313
+ });
1314
+ }
1315
+ }), _el$2);
1316
+ _el$2.addEventListener("animationend", () => setIsShaking(false));
1317
+ var _ref$2 = panelRef;
1318
+ typeof _ref$2 === "function" ? use(_ref$2, _el$2) : panelRef = _el$2;
1319
+ insert(_el$2, createComponent(Show, {
1320
+ get when() {
1321
+ return props.status === "copying";
1322
+ },
1323
+ get children() {
1324
+ var _el$3 = _tmpl$$9(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
1325
+ insert(_el$4, createComponent(IconLoader, {
1326
+ size: 13,
1327
+ "class": "text-[var(--rg-text-secondary)] shrink-0"
1328
+ }), _el$5);
1329
+ insert(_el$5, () => props.statusText ?? "Grabbing…");
1330
+ return _el$3;
1331
+ }
1332
+ }), null);
1333
+ insert(_el$2, createComponent(Show, {
1334
+ get when() {
1335
+ return memo(() => !!canInteract())() && !props.isPromptMode;
1336
+ },
1337
+ get children() {
1338
+ var _el$6 = _tmpl$2$5(), _el$7 = _el$6.firstChild;
1339
+ insert(_el$7, createComponent(TagBadge, {
1340
+ get tagName() {
1341
+ return tagDisplayResult().tagName;
1342
+ },
1343
+ get componentName() {
1344
+ return tagDisplayResult().componentName;
1345
+ },
1346
+ get isClickable() {
1347
+ return Boolean(props.filePath && props.onOpen);
1348
+ },
1349
+ onClick: handleTagClick,
1350
+ onHoverChange: handleTagHoverChange,
1351
+ shrink: true,
1352
+ get forceShowIcon() {
1353
+ return memo(() => !!isArrowNavigationVisible())() ? Boolean(props.filePath && props.onOpen) : Boolean(props.isContextMenuOpen);
1354
+ }
1355
+ }));
1356
+ insert(_el$6, createComponent(Show, {
1357
+ get when() {
1358
+ return props.arrowNavigationState?.isVisible;
1359
+ },
1360
+ get children() {
1361
+ return createComponent(ArrowNavigationMenu, {
1362
+ get items() {
1363
+ return props.arrowNavigationState.items;
1364
+ },
1365
+ get activeIndex() {
1366
+ return props.arrowNavigationState.activeIndex;
1367
+ },
1368
+ onSelect: (index) => props.onArrowNavigationSelect?.(index)
1369
+ });
1370
+ }
1371
+ }), null);
1372
+ createRenderEffect((_p$) => {
1373
+ var _v$ = !!isArrowNavigationVisible(), _v$2 = {
1374
+ "py-1.5": !isArrowNavigationVisible(),
1375
+ "pt-1.5 pb-1": isArrowNavigationVisible()
1376
+ };
1377
+ _v$ !== _p$.e && _el$6.classList.toggle("min-w-[100px]", _p$.e = _v$);
1378
+ _p$.t = classList(_el$7, _v$2, _p$.t);
1379
+ return _p$;
1380
+ }, {
1381
+ e: void 0,
1382
+ t: void 0
1383
+ });
1384
+ return _el$6;
1385
+ }
1386
+ }), null);
1387
+ insert(_el$2, createComponent(Show, {
1388
+ get when() {
1389
+ return memo(() => !!(canInteract() && props.isPromptMode))() && !props.isPendingDismiss;
1390
+ },
1391
+ get children() {
1392
+ var _el$8 = _tmpl$5(), _el$9 = _el$8.firstChild;
1393
+ insert(_el$9, createComponent(TagBadge, {
1394
+ get tagName() {
1395
+ return tagDisplayResult().tagName;
1396
+ },
1397
+ get componentName() {
1398
+ return tagDisplayResult().componentName;
1399
+ },
1400
+ get isClickable() {
1401
+ return Boolean(props.filePath && props.onOpen);
1402
+ },
1403
+ onClick: handleTagClick,
1404
+ onHoverChange: handleTagHoverChange,
1405
+ forceShowIcon: true
1406
+ }));
1407
+ insert(_el$8, createComponent(BottomSection, { get children() {
1408
+ var _el$0 = _tmpl$4(), _el$1 = _el$0.firstChild;
1409
+ _el$1.$$keydown = handleKeyDown;
1410
+ _el$1.$$input = handleInput;
1411
+ use((element) => {
1412
+ inputRef = element;
1413
+ if (props.onSubmit) queueMicrotask(() => {
1414
+ element.focus({ preventScroll: true });
1415
+ autoResizeTextarea(element, 95);
1416
+ });
1417
+ }, _el$1);
1418
+ setStyleProperty(_el$1, "max-height", `${95}px`);
1419
+ insert(_el$0, createComponent(Show, {
1420
+ get when() {
1421
+ return props.onSubmit;
1422
+ },
1423
+ get children() {
1424
+ var _el$10 = _tmpl$3$2();
1425
+ _el$10.$$click = () => props.onSubmit?.();
1426
+ insert(_el$10, createComponent(IconSubmit, {
1427
+ size: 10,
1428
+ "class": "text-[var(--rg-submit-fg)]"
1429
+ }));
1430
+ return _el$10;
1431
+ }
1432
+ }), null);
1433
+ createRenderEffect(() => _el$1.readOnly = !props.onSubmit);
1434
+ createRenderEffect(() => _el$1.value = props.inputValue ?? "");
1435
+ return _el$0;
1436
+ } }), null);
1437
+ return _el$8;
1438
+ }
1439
+ }), null);
1440
+ insert(_el$2, createComponent(Show, {
1441
+ get when() {
1442
+ return props.isPendingDismiss;
1443
+ },
1444
+ get children() {
1445
+ return createComponent(DiscardPrompt, {
1446
+ get onConfirm() {
1447
+ return props.onConfirmDismiss;
1448
+ },
1449
+ onCancel: () => {
1450
+ props.onCancelDismiss?.();
1451
+ inputRef?.focus({ preventScroll: true });
1452
+ }
1453
+ });
1454
+ }
1455
+ }), null);
1456
+ insert(_el$2, createComponent(Show, {
1457
+ get when() {
1458
+ return props.error;
1459
+ },
1460
+ get children() {
1461
+ return createComponent(ErrorView, {
1462
+ get error() {
1463
+ return props.error;
1464
+ },
1465
+ get onAcknowledge() {
1466
+ return props.onAcknowledgeError;
1467
+ },
1468
+ get onRetry() {
1469
+ return props.onRetry;
1470
+ }
1471
+ });
1472
+ }
1473
+ }), null);
1474
+ createRenderEffect((_p$) => {
1475
+ var _v$3 = cn("fixed font-sans text-[13px] antialiased select-none ease-out"), _v$4 = `${positionComputation().position.top}px`, _v$5 = `${positionComputation().position.left}px`, _v$6 = `translateX(calc(-50% + ${positionComputation().position.edgeOffsetX}px))`, _v$7 = shouldEnablePointerEvents() ? "auto" : "none", _v$8 = props.status === "fading" || isInternalFading() ? 0 : 1, _v$9 = `drop-shadow(${PANEL_SHADOW}) blur(${props.status === "fading" || isInternalFading() ? "3px" : "0"})`, _v$0 = cn("contain-layout flex items-center gap-[5px] rounded-[10px] antialiased w-fit h-fit p-0 [font-synthesis:none] [corner-shape:superellipse(1.25)]", "bg-[var(--rg-panel-bg)]", isShaking() && "animate-shake"), _v$1 = isCompletedStatus() && !props.error ? "none" : void 0;
1476
+ _v$3 !== _p$.e && className(_el$, _p$.e = _v$3);
1477
+ _v$4 !== _p$.t && setStyleProperty(_el$, "top", _p$.t = _v$4);
1478
+ _v$5 !== _p$.a && setStyleProperty(_el$, "left", _p$.a = _v$5);
1479
+ _v$6 !== _p$.o && setStyleProperty(_el$, "transform", _p$.o = _v$6);
1480
+ _v$7 !== _p$.i && setStyleProperty(_el$, "pointer-events", _p$.i = _v$7);
1481
+ _v$8 !== _p$.n && setStyleProperty(_el$, "opacity", _p$.n = _v$8);
1482
+ _v$9 !== _p$.s && setStyleProperty(_el$, "filter", _p$.s = _v$9);
1483
+ _v$0 !== _p$.h && className(_el$2, _p$.h = _v$0);
1484
+ _v$1 !== _p$.r && setStyleProperty(_el$2, "display", _p$.r = _v$1);
1485
+ return _p$;
1486
+ }, {
1487
+ e: void 0,
1488
+ t: void 0,
1489
+ a: void 0,
1490
+ o: void 0,
1491
+ i: void 0,
1492
+ n: void 0,
1493
+ s: void 0,
1494
+ h: void 0,
1495
+ r: void 0
1496
+ });
1497
+ return _el$;
1498
+ }
1499
+ });
1500
+ };
1501
+ delegateEvents([
1502
+ "pointerdown",
1503
+ "click",
1504
+ "input",
1505
+ "keydown"
1506
+ ]);
1507
+
1508
+ //#endregion
1509
+ //#region src/components/icons/icon-select.tsx
1510
+ var _tmpl$$8 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=currentColor><path fill-rule=evenodd clip-rule=evenodd d="M20.8977 4.02356L21.8277 4.39121C22.3784 2.99813 21.0382 1.60206 19.6238 2.09546L3.47334 7.72936C1.38661 8.45728 1.49021 11.443 3.6224 12.0245L10.1289 13.799L11.2331 19.8724C11.638 22.0991 14.7072 22.4019 15.5393 20.2972L21.8277 4.39121L20.8977 4.02356Z">`);
1511
+ const IconSelect = (props) => {
1512
+ const size = () => props.size ?? 14;
1513
+ return (() => {
1514
+ var _el$ = _tmpl$$8();
1515
+ createRenderEffect((_p$) => {
1516
+ var _v$ = size(), _v$2 = size(), _v$3 = props.class;
1517
+ _v$ !== _p$.e && setAttribute(_el$, "width", _p$.e = _v$);
1518
+ _v$2 !== _p$.t && setAttribute(_el$, "height", _p$.t = _v$2);
1519
+ _v$3 !== _p$.a && setAttribute(_el$, "class", _p$.a = _v$3);
1520
+ return _p$;
1521
+ }, {
1522
+ e: void 0,
1523
+ t: void 0,
1524
+ a: void 0
1525
+ });
1526
+ return _el$;
1527
+ })();
1528
+ };
1529
+
1530
+ //#endregion
1531
+ //#region src/utils/toolbar-layout.ts
1532
+ const getButtonSpacingClass = (isVertical) => isVertical ? "mb-1.5" : "mr-1.5";
1533
+ const getMinDimensionClass = (isVertical) => isVertical ? "min-h-0" : "min-w-0";
1534
+
1535
+ //#endregion
1536
+ //#region src/components/icons/icon-chevron.tsx
1537
+ var _tmpl$$7 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=currentColor><path fill-rule=evenodd clip-rule=evenodd d="M9.29289 16.7071C8.90237 16.3166 8.90237 15.6834 9.29289 15.2929L12.5858 12L9.29289 8.70711C8.90237 8.31658 8.90237 7.68342 9.29289 7.29289C9.68342 6.90237 10.3166 6.90237 10.7071 7.29289L14.7071 11.2929C14.8946 11.4804 15 11.7348 15 12C15 12.2652 14.8946 12.5196 14.7071 12.7071L10.7071 16.7071C10.3166 17.0976 9.68342 17.0976 9.29289 16.7071Z">`);
1538
+ const IconChevron = (props) => {
1539
+ const size = () => props.size ?? 14;
1540
+ return (() => {
1541
+ var _el$ = _tmpl$$7();
1542
+ createRenderEffect((_p$) => {
1543
+ var _v$ = size(), _v$2 = size(), _v$3 = props.class;
1544
+ _v$ !== _p$.e && setAttribute(_el$, "width", _p$.e = _v$);
1545
+ _v$2 !== _p$.t && setAttribute(_el$, "height", _p$.t = _v$2);
1546
+ _v$3 !== _p$.a && setAttribute(_el$, "class", _p$.a = _v$3);
1547
+ return _p$;
1548
+ }, {
1549
+ e: void 0,
1550
+ t: void 0,
1551
+ a: void 0
1552
+ });
1553
+ return _el$;
1554
+ })();
1555
+ };
1556
+
1557
+ //#endregion
1558
+ //#region src/components/toolbar/toolbar-content.tsx
1559
+ var _tmpl$$6 = /* @__PURE__ */ template(`<button data-react-grab-ignore-events data-react-grab-toolbar-collapse class="contain-layout shrink-0 flex items-center justify-center cursor-pointer interactive-scale">`), _tmpl$2$4 = /* @__PURE__ */ template(`<div data-react-grab-toolbar-panel><div><div><div>`);
1560
+ const ToolbarContent = (props) => {
1561
+ const edge = () => props.snapEdge ?? "bottom";
1562
+ const isVertical = () => edge() === "left" || edge() === "right";
1563
+ const sizeDurationClass = () => props.isCollapsed ? "duration-140" : "duration-220";
1564
+ const opacityEnterClass = "transition-opacity duration-180 ease-drawer delay-[80ms]";
1565
+ const opacityExitClass = "transition-opacity duration-100 ease-drawer";
1566
+ const gridSizeTransitionClass = () => isVertical() ? `transition-[grid-template-rows] ${sizeDurationClass()} ease-drawer` : `transition-[grid-template-columns] ${sizeDurationClass()} ease-drawer`;
1567
+ const minDimensionClass = () => getMinDimensionClass(isVertical());
1568
+ const collapsedEdgeClasses = () => {
1569
+ if (!props.isCollapsed) return "";
1570
+ return `${{
1571
+ top: "rounded-t-none rounded-b-[10px]",
1572
+ bottom: "rounded-b-none rounded-t-[10px]",
1573
+ left: "rounded-l-none rounded-r-[10px]",
1574
+ right: "rounded-r-none rounded-l-[10px]"
1575
+ }[edge()]} ${isVertical() ? "px-0.25 py-2" : "px-2 py-0.25"}`;
1576
+ };
1577
+ const chevronRotation = () => {
1578
+ const collapsed = props.isCollapsed;
1579
+ switch (edge()) {
1580
+ case "top": return collapsed ? "rotate-90" : "-rotate-90";
1581
+ case "bottom": return collapsed ? "-rotate-90" : "rotate-90";
1582
+ case "left": return collapsed ? "rotate-0" : "rotate-180";
1583
+ case "right": return collapsed ? "rotate-180" : "rotate-0";
1584
+ default: return "-rotate-90";
1585
+ }
1586
+ };
1587
+ const pressSquishTransform = () => {
1588
+ if (!props.isChevronPressed) return void 0;
1589
+ return isVertical() ? "scale(0.97, 1)" : "scale(1, 0.97)";
1590
+ };
1591
+ const defaultCollapseButton = () => (() => {
1592
+ var _el$ = _tmpl$$6();
1593
+ addEventListener(_el$, "pointercancel", props.onCollapsePointerLeave);
1594
+ addEventListener(_el$, "pointerleave", props.onCollapsePointerLeave);
1595
+ addEventListener(_el$, "pointerup", props.onCollapsePointerUp, true);
1596
+ addEventListener(_el$, "pointerdown", props.onCollapsePointerDown);
1597
+ addEventListener(_el$, "click", props.onCollapseClick, true);
1598
+ insert(_el$, createComponent(IconChevron, {
1599
+ size: 18,
1600
+ get ["class"]() {
1601
+ return cn("text-[var(--rg-text-secondary)] transition-transform duration-150 ease-drawer -m-0.5", chevronRotation());
1602
+ }
1603
+ }));
1604
+ createRenderEffect(() => setAttribute(_el$, "aria-label", props.isCollapsed ? "Expand toolbar" : "Collapse toolbar"));
1605
+ return _el$;
1606
+ })();
1607
+ const outerTransitionClass = () => props.isChevronPressed ? `transition-[padding,border-radius,transform] duration-60 ease-[cubic-bezier(0,0,0.2,1)]` : `transition-[padding,border-radius,transform] ${sizeDurationClass()} ease-drawer`;
1608
+ return (() => {
1609
+ var _el$2 = _tmpl$2$4(), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
1610
+ addEventListener(_el$2, "click", props.onPanelClick, true);
1611
+ addEventListener(_el$2, "animationend", props.onAnimationEnd);
1612
+ insert(_el$5, () => props.selectButton);
1613
+ insert(_el$2, () => props.collapseButton ?? defaultCollapseButton(), null);
1614
+ createRenderEffect((_p$) => {
1615
+ var _v$ = cn("flex items-center justify-center rounded-full antialiased relative overflow-visible [font-synthesis:none]", outerTransitionClass(), isVertical() && "flex-col", "bg-[var(--rg-panel-bg)] [box-shadow:var(--rg-shadow)]", !props.isCollapsed && (isVertical() ? "px-1.5 gap-0 py-2" : "py-1.5 gap-0 px-2"), collapsedEdgeClasses(), props.isShaking && "animate-shake"), _v$2 = props.transformOrigin, _v$3 = pressSquishTransform(), _v$4 = cn("grid relative overflow-visible", gridSizeTransitionClass(), props.isCollapsed ? isVertical() ? "grid-rows-[0fr] pointer-events-none" : "grid-cols-[0fr] pointer-events-none" : isVertical() ? "grid-rows-[1fr]" : "grid-cols-[1fr]"), _v$5 = cn("flex", isVertical() ? "flex-col items-center min-h-0" : "items-center min-w-0", props.isCollapsed ? "opacity-0" : "opacity-100", props.isCollapsed ? opacityExitClass : opacityEnterClass), _v$6 = cn("relative overflow-visible", minDimensionClass());
1616
+ _v$ !== _p$.e && className(_el$2, _p$.e = _v$);
1617
+ _v$2 !== _p$.t && setStyleProperty(_el$2, "transform-origin", _p$.t = _v$2);
1618
+ _v$3 !== _p$.a && setStyleProperty(_el$2, "transform", _p$.a = _v$3);
1619
+ _v$4 !== _p$.o && className(_el$3, _p$.o = _v$4);
1620
+ _v$5 !== _p$.i && className(_el$4, _p$.i = _v$5);
1621
+ _v$6 !== _p$.n && className(_el$5, _p$.n = _v$6);
1622
+ return _p$;
1623
+ }, {
1624
+ e: void 0,
1625
+ t: void 0,
1626
+ a: void 0,
1627
+ o: void 0,
1628
+ i: void 0,
1629
+ n: void 0
1630
+ });
1631
+ return _el$2;
1632
+ })();
1633
+ };
1634
+ delegateEvents(["click", "pointerup"]);
1635
+
1636
+ //#endregion
1637
+ //#region src/utils/get-visual-viewport.ts
1638
+ const getVisualViewport = () => {
1639
+ const visualViewport = window.visualViewport;
1640
+ if (visualViewport) return {
1641
+ width: visualViewport.width,
1642
+ height: visualViewport.height,
1643
+ offsetLeft: visualViewport.offsetLeft,
1644
+ offsetTop: visualViewport.offsetTop
1645
+ };
1646
+ return {
1647
+ width: window.innerWidth,
1648
+ height: window.innerHeight,
1649
+ offsetLeft: 0,
1650
+ offsetTop: 0
1651
+ };
1652
+ };
1653
+
1654
+ //#endregion
1655
+ //#region src/utils/toolbar-position.ts
1656
+ const isHorizontalEdge = (edge) => edge === "top" || edge === "bottom";
1657
+ const getCollapsedDimsForEdge = (edge) => {
1658
+ const horizontal = isHorizontalEdge(edge);
1659
+ return {
1660
+ width: horizontal ? 30 : 16,
1661
+ height: horizontal ? 16 : 30
1662
+ };
1663
+ };
1664
+ const getPositionFromEdgeAndRatio = (edge, ratio, elementWidth, elementHeight) => {
1665
+ const viewport = getVisualViewport();
1666
+ const viewportWidth = viewport.width;
1667
+ const viewportHeight = viewport.height;
1668
+ const minX = viewport.offsetLeft + 16;
1669
+ const maxX = Math.max(minX, viewport.offsetLeft + viewportWidth - elementWidth - 16);
1670
+ const minY = viewport.offsetTop + 16;
1671
+ const maxY = Math.max(minY, viewport.offsetTop + viewportHeight - elementHeight - 16);
1672
+ if (edge === "top" || edge === "bottom") {
1673
+ const availableWidth = Math.max(0, viewportWidth - elementWidth - 16 * 2);
1674
+ return {
1675
+ x: Math.min(maxX, Math.max(minX, viewport.offsetLeft + 16 + availableWidth * ratio)),
1676
+ y: edge === "top" ? minY : maxY
1677
+ };
1678
+ }
1679
+ const availableHeight = Math.max(0, viewportHeight - elementHeight - 16 * 2);
1680
+ const positionY = Math.min(maxY, Math.max(minY, viewport.offsetTop + 16 + availableHeight * ratio));
1681
+ return {
1682
+ x: edge === "left" ? minX : maxX,
1683
+ y: positionY
1684
+ };
1685
+ };
1686
+ const getRatioFromPosition = (edge, positionX, positionY, elementWidth, elementHeight) => {
1687
+ const viewport = getVisualViewport();
1688
+ const viewportWidth = viewport.width;
1689
+ const viewportHeight = viewport.height;
1690
+ if (edge === "top" || edge === "bottom") {
1691
+ const availableWidth = viewportWidth - elementWidth - 16 * 2;
1692
+ if (availableWidth <= 0) return TOOLBAR_DEFAULT_POSITION_RATIO;
1693
+ return Math.max(0, Math.min(1, (positionX - viewport.offsetLeft - 16) / availableWidth));
1694
+ }
1695
+ const availableHeight = viewportHeight - elementHeight - 16 * 2;
1696
+ if (availableHeight <= 0) return TOOLBAR_DEFAULT_POSITION_RATIO;
1697
+ return Math.max(0, Math.min(1, (positionY - viewport.offsetTop - 16) / availableHeight));
1698
+ };
1699
+ const calculateExpandedPositionFromCollapsed = (collapsedPosition, edge, expandedDimensions, actualCollapsedWidth, actualCollapsedHeight) => {
1700
+ const viewport = getVisualViewport();
1701
+ const viewportWidth = viewport.width;
1702
+ const viewportHeight = viewport.height;
1703
+ const { width: expandedWidth, height: expandedHeight } = expandedDimensions;
1704
+ let newPosition;
1705
+ if (edge === "top" || edge === "bottom") {
1706
+ const xOffset = (expandedWidth - actualCollapsedWidth) / 2;
1707
+ newPosition = {
1708
+ x: clampToRange(collapsedPosition.x - xOffset, viewport.offsetLeft + 16, viewport.offsetLeft + viewportWidth - expandedWidth - 16),
1709
+ y: edge === "top" ? viewport.offsetTop + 16 : viewport.offsetTop + viewportHeight - expandedHeight - 16
1710
+ };
1711
+ } else {
1712
+ const yOffset = (expandedHeight - actualCollapsedHeight) / 2;
1713
+ const clampedY = clampToRange(collapsedPosition.y - yOffset, viewport.offsetTop + 16, viewport.offsetTop + viewportHeight - expandedHeight - 16);
1714
+ newPosition = {
1715
+ x: edge === "left" ? viewport.offsetLeft + 16 : viewport.offsetLeft + viewportWidth - expandedWidth - 16,
1716
+ y: clampedY
1717
+ };
1718
+ }
1719
+ const ratio = getRatioFromPosition(edge, newPosition.x, newPosition.y, expandedWidth, expandedHeight);
1720
+ return {
1721
+ position: newPosition,
1722
+ ratio
1723
+ };
1724
+ };
1725
+ const getCollapsedPosition = (edge, expandedPosition, expandedDimensions, collapsedDimensions) => {
1726
+ const viewport = getVisualViewport();
1727
+ const { width: expandedWidth, height: expandedHeight } = expandedDimensions;
1728
+ const { width: collapsedWidth, height: collapsedHeight } = collapsedDimensions;
1729
+ switch (edge) {
1730
+ case "top":
1731
+ case "bottom": {
1732
+ const xOffset = (expandedWidth - collapsedWidth) / 2;
1733
+ return {
1734
+ x: clampToRange(expandedPosition.x + xOffset, viewport.offsetLeft, viewport.offsetLeft + viewport.width - collapsedWidth),
1735
+ y: edge === "top" ? viewport.offsetTop : viewport.offsetTop + viewport.height - collapsedHeight
1736
+ };
1737
+ }
1738
+ case "left":
1739
+ case "right": {
1740
+ const yOffset = (expandedHeight - collapsedHeight) / 2;
1741
+ const clampedY = clampToRange(expandedPosition.y + yOffset, viewport.offsetTop, viewport.offsetTop + viewport.height - collapsedHeight);
1742
+ return {
1743
+ x: edge === "left" ? viewport.offsetLeft : viewport.offsetLeft + viewport.width - collapsedWidth,
1744
+ y: clampedY
1745
+ };
1746
+ }
1747
+ }
1748
+ };
1749
+ const getSnapPosition = (currentX, currentY, elementWidth, elementHeight, velocityX, velocityY) => {
1750
+ const viewport = getVisualViewport();
1751
+ const viewportWidth = viewport.width;
1752
+ const viewportHeight = viewport.height;
1753
+ const projectedX = currentX + velocityX * 150;
1754
+ const projectedY = currentY + velocityY * 150;
1755
+ const distanceToTop = projectedY - viewport.offsetTop + elementHeight / 2;
1756
+ const distanceToBottom = viewport.offsetTop + viewportHeight - projectedY - elementHeight / 2;
1757
+ const distanceToLeft = projectedX - viewport.offsetLeft + elementWidth / 2;
1758
+ const distanceToRight = viewport.offsetLeft + viewportWidth - projectedX - elementWidth / 2;
1759
+ const minDistance = Math.min(distanceToTop, distanceToBottom, distanceToLeft, distanceToRight);
1760
+ const clampX = (rawX) => clampToRange(rawX, viewport.offsetLeft + 16, viewport.offsetLeft + viewportWidth - elementWidth - 16);
1761
+ const clampY = (rawY) => clampToRange(rawY, viewport.offsetTop + 16, viewport.offsetTop + viewportHeight - elementHeight - 16);
1762
+ if (minDistance === distanceToTop) return {
1763
+ edge: "top",
1764
+ x: clampX(projectedX),
1765
+ y: viewport.offsetTop + 16
1766
+ };
1767
+ if (minDistance === distanceToLeft) return {
1768
+ edge: "left",
1769
+ x: viewport.offsetLeft + 16,
1770
+ y: clampY(projectedY)
1771
+ };
1772
+ if (minDistance === distanceToRight) return {
1773
+ edge: "right",
1774
+ x: viewport.offsetLeft + viewportWidth - elementWidth - 16,
1775
+ y: clampY(projectedY)
1776
+ };
1777
+ return {
1778
+ edge: "bottom",
1779
+ x: clampX(projectedX),
1780
+ y: viewport.offsetTop + viewportHeight - elementHeight - 16
1781
+ };
1782
+ };
1783
+
1784
+ //#endregion
1785
+ //#region src/utils/create-toolbar-drag.ts
1786
+ const createToolbarDrag = (config) => {
1787
+ const [isDragging, setIsDragging] = createSignal(false);
1788
+ const [isSnapping, setIsSnapping] = createSignal(false);
1789
+ const [hasDragMoved, setHasDragMoved] = createSignal(false);
1790
+ const [velocity, setVelocity] = createSignal({
1791
+ x: 0,
1792
+ y: 0
1793
+ });
1794
+ let dragOffset = {
1795
+ x: 0,
1796
+ y: 0
1797
+ };
1798
+ let lastPointerPosition = {
1799
+ x: 0,
1800
+ y: 0,
1801
+ time: 0
1802
+ };
1803
+ let pointerStartPosition = {
1804
+ x: 0,
1805
+ y: 0
1806
+ };
1807
+ let didDragOccur = false;
1808
+ let snapAnimationTimeout;
1809
+ let dragAbortController = null;
1810
+ const teardownDragListeners = () => {
1811
+ dragAbortController?.abort();
1812
+ dragAbortController = null;
1813
+ };
1814
+ const handleWindowPointerMove = (event) => {
1815
+ if (!hasDragMoved()) {
1816
+ if (Math.hypot(event.clientX - pointerStartPosition.x, event.clientY - pointerStartPosition.y) <= 5) return;
1817
+ setHasDragMoved(true);
1818
+ config.onDragStart();
1819
+ }
1820
+ const now = performance.now();
1821
+ const deltaTime = now - lastPointerPosition.time;
1822
+ if (deltaTime > 0) setVelocity({
1823
+ x: (event.clientX - lastPointerPosition.x) / deltaTime,
1824
+ y: (event.clientY - lastPointerPosition.y) / deltaTime
1825
+ });
1826
+ lastPointerPosition = {
1827
+ x: event.clientX,
1828
+ y: event.clientY,
1829
+ time: now
1830
+ };
1831
+ const newX = event.clientX - dragOffset.x;
1832
+ const newY = event.clientY - dragOffset.y;
1833
+ config.onPositionUpdate({
1834
+ x: newX,
1835
+ y: newY
1836
+ });
1837
+ };
1838
+ const handleWindowPointerUp = () => {
1839
+ teardownDragListeners();
1840
+ const didMove = hasDragMoved();
1841
+ setIsDragging(false);
1842
+ if (!didMove) return;
1843
+ didDragOccur = true;
1844
+ const containerRef = config.getContainerRef();
1845
+ const rect = containerRef?.getBoundingClientRect();
1846
+ if (!rect) return;
1847
+ const currentVelocity = velocity();
1848
+ const snap = getSnapPosition(rect.left, rect.top, rect.width, rect.height, currentVelocity.x, currentVelocity.y);
1849
+ const ratio = getRatioFromPosition(snap.edge, snap.x, snap.y, rect.width, rect.height);
1850
+ config.onSnapEdgeChange(snap.edge, ratio);
1851
+ setIsSnapping(true);
1852
+ nativeRequestAnimationFrame(() => {
1853
+ const postRenderRect = containerRef?.getBoundingClientRect();
1854
+ const updatedDimensions = postRenderRect ? {
1855
+ width: postRenderRect.width,
1856
+ height: postRenderRect.height
1857
+ } : config.getExpandedDimensions();
1858
+ nativeRequestAnimationFrame(() => {
1859
+ const snappedPosition = getPositionFromEdgeAndRatio(snap.edge, ratio, updatedDimensions.width, updatedDimensions.height);
1860
+ config.onSnapComplete({
1861
+ edge: snap.edge,
1862
+ ratio,
1863
+ position: snappedPosition,
1864
+ expandedDimensions: updatedDimensions
1865
+ });
1866
+ snapAnimationTimeout = setTimeout(() => {
1867
+ setIsSnapping(false);
1868
+ config.onSnapAnimationEnd?.();
1869
+ }, 300);
1870
+ });
1871
+ });
1872
+ };
1873
+ const handlePointerDown = (event) => {
1874
+ if (event.button !== 0) return;
1875
+ if (config.isCollapsed()) return;
1876
+ const rect = config.getContainerRef()?.getBoundingClientRect();
1877
+ if (!rect) return;
1878
+ pointerStartPosition = {
1879
+ x: event.clientX,
1880
+ y: event.clientY
1881
+ };
1882
+ dragOffset = {
1883
+ x: event.clientX - rect.left,
1884
+ y: event.clientY - rect.top
1885
+ };
1886
+ setIsDragging(true);
1887
+ setHasDragMoved(false);
1888
+ setVelocity({
1889
+ x: 0,
1890
+ y: 0
1891
+ });
1892
+ lastPointerPosition = {
1893
+ x: event.clientX,
1894
+ y: event.clientY,
1895
+ time: performance.now()
1896
+ };
1897
+ teardownDragListeners();
1898
+ dragAbortController = new AbortController();
1899
+ const { signal } = dragAbortController;
1900
+ window.addEventListener("pointermove", handleWindowPointerMove, { signal });
1901
+ window.addEventListener("pointerup", handleWindowPointerUp, { signal });
1902
+ window.addEventListener("pointercancel", handleWindowPointerUp, { signal });
1903
+ };
1904
+ const createDragAwareHandler = (callback) => (event) => {
1905
+ event.stopImmediatePropagation();
1906
+ if (didDragOccur) {
1907
+ didDragOccur = false;
1908
+ return;
1909
+ }
1910
+ callback();
1911
+ };
1912
+ onCleanup(() => {
1913
+ teardownDragListeners();
1914
+ clearTimeout(snapAnimationTimeout);
1915
+ });
1916
+ return {
1917
+ isDragging,
1918
+ isSnapping,
1919
+ handlePointerDown,
1920
+ createDragAwareHandler
1921
+ };
1922
+ };
1923
+
1924
+ //#endregion
1925
+ //#region src/components/toolbar/index.tsx
1926
+ var _tmpl$$5 = /* @__PURE__ */ template(`<div data-react-grab-ignore-events data-react-grab-toolbar>`), _tmpl$2$3 = /* @__PURE__ */ template(`<button data-react-grab-ignore-events data-react-grab-toolbar-toggle>`);
1927
+ const Toolbar = (props) => {
1928
+ let containerRef;
1929
+ let unfreezeUpdatesCallback = null;
1930
+ const savedState = loadToolbarState();
1931
+ const [isVisible, setIsVisible] = createSignal(false);
1932
+ const [isCollapsed, setIsCollapsed] = createSignal(false);
1933
+ const [isResizing, setIsResizing] = createSignal(false);
1934
+ const [snapEdge, setSnapEdge] = createSignal(savedState?.edge ?? "bottom");
1935
+ const [positionRatio, setPositionRatio] = createSignal(savedState?.ratio ?? .5);
1936
+ const [position, setPosition] = createSignal({
1937
+ x: 0,
1938
+ y: 0
1939
+ });
1940
+ const [isShaking, setIsShaking] = createSignal(false);
1941
+ const [isCollapseAnimating, setIsCollapseAnimating] = createSignal(false);
1942
+ const [isChevronPressed, setIsChevronPressed] = createSignal(false);
1943
+ const [isToolbarHovered, setIsToolbarHovered] = createSignal(false);
1944
+ const drag = createToolbarDrag({
1945
+ getContainerRef: () => containerRef,
1946
+ isCollapsed,
1947
+ getExpandedDimensions: () => expandedDimensions,
1948
+ onDragStart: () => {
1949
+ if (unfreezeUpdatesCallback) {
1950
+ unfreezeUpdatesCallback();
1951
+ unfreezeUpdatesCallback = null;
1952
+ unfreezeGlobalAnimations();
1953
+ unfreezePseudoStates();
1954
+ }
1955
+ },
1956
+ onPositionUpdate: (newPosition) => setPosition(newPosition),
1957
+ onSnapEdgeChange: (edge, ratio) => {
1958
+ syncCollapsedDimensionsToEdge(snapEdge(), edge);
1959
+ setSnapEdge(edge);
1960
+ setPositionRatio(ratio);
1961
+ },
1962
+ onSnapComplete: (result) => {
1963
+ expandedDimensions = result.expandedDimensions;
1964
+ setPosition(result.position);
1965
+ saveAndNotify({
1966
+ edge: result.edge,
1967
+ ratio: result.ratio,
1968
+ collapsed: isCollapsed(),
1969
+ enabled: !isCollapsed()
1970
+ });
1971
+ }
1972
+ });
1973
+ const isVertical = () => snapEdge() === "left" || snapEdge() === "right";
1974
+ const buttonSpacingClass = () => getButtonSpacingClass(isVertical());
1975
+ const stopEventPropagation = (event) => {
1976
+ event.stopImmediatePropagation();
1977
+ };
1978
+ const createFreezeHandlers = (options) => ({
1979
+ onMouseEnter: (event) => {
1980
+ if (drag.isDragging()) return;
1981
+ if (options?.shouldFreezeInteractions !== false && !unfreezeUpdatesCallback) {
1982
+ unfreezeUpdatesCallback = freezeUpdates();
1983
+ freezeGlobalAnimations();
1984
+ freezePseudoStates(event.clientX, event.clientY);
1985
+ }
1986
+ options?.onHoverChange?.(true);
1987
+ },
1988
+ onMouseLeave: () => {
1989
+ if (options?.shouldFreezeInteractions !== false && !props.isActive && !props.isContextMenuOpen) {
1990
+ unfreezeUpdatesCallback?.();
1991
+ unfreezeUpdatesCallback = null;
1992
+ unfreezeGlobalAnimations();
1993
+ unfreezePseudoStates();
1994
+ }
1995
+ options?.onHoverChange?.(false);
1996
+ }
1997
+ });
1998
+ createEffect(on(() => props.shakeCount, (count) => {
1999
+ if (count && !props.enabled) setIsShaking(true);
2000
+ }));
2001
+ createEffect(on(() => [props.isActive, props.isContextMenuOpen], ([isActive, isContextMenuOpen]) => {
2002
+ if (!isActive && !isContextMenuOpen && unfreezeUpdatesCallback) {
2003
+ unfreezeUpdatesCallback();
2004
+ unfreezeUpdatesCallback = null;
2005
+ }
2006
+ }));
2007
+ let expandedDimensions = {
2008
+ width: 78,
2009
+ height: 28
2010
+ };
2011
+ const [collapsedDimensions, setCollapsedDimensions] = createSignal(getCollapsedDimsForEdge(snapEdge()));
2012
+ const syncCollapsedDimensionsToEdge = (oldEdge, newEdge) => {
2013
+ if (isHorizontalEdge(oldEdge) === isHorizontalEdge(newEdge)) return;
2014
+ setCollapsedDimensions(getCollapsedDimsForEdge(newEdge));
2015
+ };
2016
+ const getExpandedFromCollapsed = (collapsedPosition, edge) => {
2017
+ const actualRect = containerRef?.getBoundingClientRect();
2018
+ const fallback = getCollapsedDimsForEdge(edge);
2019
+ return calculateExpandedPositionFromCollapsed(collapsedPosition, edge, expandedDimensions, actualRect?.width ?? fallback.width, actualRect?.height ?? fallback.height);
2020
+ };
2021
+ const recalculatePosition = () => {
2022
+ setPosition(getPositionFromEdgeAndRatio(snapEdge(), positionRatio(), expandedDimensions.width, expandedDimensions.height));
2023
+ };
2024
+ const handleToggle = drag.createDragAwareHandler(() => props.onToggle?.());
2025
+ const handleToggleCollapse = drag.createDragAwareHandler(() => {
2026
+ const rect = containerRef?.getBoundingClientRect();
2027
+ const wasCollapsed = isCollapsed();
2028
+ let newRatio = positionRatio();
2029
+ if (wasCollapsed) {
2030
+ const { position: newPos, ratio } = getExpandedFromCollapsed(currentPosition(), snapEdge());
2031
+ newRatio = ratio;
2032
+ setPosition(newPos);
2033
+ setPositionRatio(newRatio);
2034
+ } else if (rect) expandedDimensions = {
2035
+ width: rect.width,
2036
+ height: rect.height
2037
+ };
2038
+ setIsCollapseAnimating(true);
2039
+ setIsCollapsed((prev) => !prev);
2040
+ saveAndNotify({
2041
+ edge: snapEdge(),
2042
+ ratio: newRatio,
2043
+ collapsed: !wasCollapsed,
2044
+ enabled: wasCollapsed
2045
+ });
2046
+ if (collapseAnimationTimeout) clearTimeout(collapseAnimationTimeout);
2047
+ collapseAnimationTimeout = setTimeout(() => {
2048
+ setIsCollapseAnimating(false);
2049
+ captureDimensionsAfterAnimation();
2050
+ }, 260);
2051
+ });
2052
+ const computeCollapsedPosition = () => getCollapsedPosition(snapEdge(), position(), expandedDimensions, collapsedDimensions());
2053
+ let resizeTimeout;
2054
+ let collapseAnimationTimeout;
2055
+ let lastObservedExpandedSize = null;
2056
+ const captureDimensionsAfterAnimation = () => {
2057
+ const finalRect = containerRef?.getBoundingClientRect();
2058
+ if (!finalRect || finalRect.width === 0 || finalRect.height === 0) return;
2059
+ if (isCollapsed()) setCollapsedDimensions({
2060
+ width: finalRect.width,
2061
+ height: finalRect.height
2062
+ });
2063
+ else {
2064
+ expandedDimensions = {
2065
+ width: finalRect.width,
2066
+ height: finalRect.height
2067
+ };
2068
+ lastObservedExpandedSize = {
2069
+ width: finalRect.width,
2070
+ height: finalRect.height
2071
+ };
2072
+ }
2073
+ };
2074
+ const handleObservedSizeChange = (newWidth, newHeight) => {
2075
+ if (newWidth === 0 || newHeight === 0) return;
2076
+ if (drag.isDragging() || drag.isSnapping()) return;
2077
+ if (isCollapseAnimating()) return;
2078
+ if (isCollapsed()) {
2079
+ const currentCollapsed = collapsedDimensions();
2080
+ if (currentCollapsed.width === newWidth && currentCollapsed.height === newHeight) return;
2081
+ setCollapsedDimensions({
2082
+ width: newWidth,
2083
+ height: newHeight
2084
+ });
2085
+ return;
2086
+ }
2087
+ if (lastObservedExpandedSize && lastObservedExpandedSize.width === newWidth && lastObservedExpandedSize.height === newHeight) return;
2088
+ lastObservedExpandedSize = {
2089
+ width: newWidth,
2090
+ height: newHeight
2091
+ };
2092
+ expandedDimensions = {
2093
+ width: newWidth,
2094
+ height: newHeight
2095
+ };
2096
+ setPosition(getPositionFromEdgeAndRatio(snapEdge(), positionRatio(), newWidth, newHeight));
2097
+ };
2098
+ const handleResize = () => {
2099
+ if (drag.isDragging()) return;
2100
+ setIsResizing(true);
2101
+ recalculatePosition();
2102
+ if (resizeTimeout) clearTimeout(resizeTimeout);
2103
+ resizeTimeout = setTimeout(() => {
2104
+ setIsResizing(false);
2105
+ const newRatio = getRatioFromPosition(snapEdge(), position().x, position().y, expandedDimensions.width, expandedDimensions.height);
2106
+ setPositionRatio(newRatio);
2107
+ saveAndNotify({
2108
+ edge: snapEdge(),
2109
+ ratio: newRatio,
2110
+ collapsed: isCollapsed(),
2111
+ enabled: !isCollapsed()
2112
+ });
2113
+ }, 500);
2114
+ };
2115
+ const saveAndNotify = (state) => {
2116
+ saveToolbarState(state);
2117
+ props.onStateChange?.(state);
2118
+ };
2119
+ onMount(() => {
2120
+ if (containerRef) props.onContainerRef?.(containerRef);
2121
+ const rect = containerRef?.getBoundingClientRect();
2122
+ const viewport = getVisualViewport();
2123
+ const hasMeasurableRect = Boolean(rect && rect.width > 0 && rect.height > 0);
2124
+ if (savedState) {
2125
+ if (hasMeasurableRect && rect) expandedDimensions = {
2126
+ width: rect.width,
2127
+ height: rect.height
2128
+ };
2129
+ setIsCollapsed(savedState.collapsed);
2130
+ setPosition(getPositionFromEdgeAndRatio(savedState.edge, savedState.ratio, expandedDimensions.width, expandedDimensions.height));
2131
+ } else if (hasMeasurableRect && rect) {
2132
+ expandedDimensions = {
2133
+ width: rect.width,
2134
+ height: rect.height
2135
+ };
2136
+ setPosition({
2137
+ x: viewport.offsetLeft + (viewport.width - rect.width) / 2,
2138
+ y: viewport.offsetTop + viewport.height - rect.height - 16
2139
+ });
2140
+ setPositionRatio(TOOLBAR_DEFAULT_POSITION_RATIO);
2141
+ } else {
2142
+ setPosition(getPositionFromEdgeAndRatio("bottom", TOOLBAR_DEFAULT_POSITION_RATIO, expandedDimensions.width, expandedDimensions.height));
2143
+ setPositionRatio(TOOLBAR_DEFAULT_POSITION_RATIO);
2144
+ }
2145
+ if (props.onSubscribeToStateChanges) onCleanup(props.onSubscribeToStateChanges((state) => {
2146
+ if (isCollapseAnimating()) return;
2147
+ if (!containerRef?.getBoundingClientRect()) return;
2148
+ const didCollapsedChange = isCollapsed() !== state.collapsed;
2149
+ syncCollapsedDimensionsToEdge(snapEdge(), state.edge);
2150
+ setSnapEdge(state.edge);
2151
+ if (didCollapsedChange && !state.collapsed) {
2152
+ const collapsedPos = currentPosition();
2153
+ setIsCollapseAnimating(true);
2154
+ setIsCollapsed(state.collapsed);
2155
+ const { position: newPos, ratio: newRatio } = getExpandedFromCollapsed(collapsedPos, state.edge);
2156
+ setPosition(newPos);
2157
+ setPositionRatio(newRatio);
2158
+ clearTimeout(collapseAnimationTimeout);
2159
+ collapseAnimationTimeout = setTimeout(() => {
2160
+ setIsCollapseAnimating(false);
2161
+ captureDimensionsAfterAnimation();
2162
+ }, 260);
2163
+ } else {
2164
+ if (didCollapsedChange) {
2165
+ setIsCollapseAnimating(true);
2166
+ clearTimeout(collapseAnimationTimeout);
2167
+ collapseAnimationTimeout = setTimeout(() => {
2168
+ setIsCollapseAnimating(false);
2169
+ captureDimensionsAfterAnimation();
2170
+ }, 260);
2171
+ }
2172
+ setIsCollapsed(state.collapsed);
2173
+ setPosition(getPositionFromEdgeAndRatio(state.edge, state.ratio, expandedDimensions.width, expandedDimensions.height));
2174
+ setPositionRatio(state.ratio);
2175
+ }
2176
+ }));
2177
+ window.addEventListener("resize", handleResize);
2178
+ window.visualViewport?.addEventListener("resize", handleResize);
2179
+ window.visualViewport?.addEventListener("scroll", handleResize);
2180
+ if (typeof ResizeObserver !== "undefined" && containerRef) {
2181
+ const observer = new ResizeObserver((entries) => {
2182
+ const entry = entries[0];
2183
+ if (!entry) return;
2184
+ const borderBox = entry.borderBoxSize?.[0];
2185
+ let width;
2186
+ let height;
2187
+ if (borderBox) {
2188
+ width = borderBox.inlineSize;
2189
+ height = borderBox.blockSize;
2190
+ } else {
2191
+ const rect = containerRef?.getBoundingClientRect();
2192
+ if (!rect) return;
2193
+ width = rect.width;
2194
+ height = rect.height;
2195
+ }
2196
+ handleObservedSizeChange(width, height);
2197
+ });
2198
+ observer.observe(containerRef);
2199
+ onCleanup(() => observer.disconnect());
2200
+ }
2201
+ const fadeInTimeout = setTimeout(() => {
2202
+ setIsVisible(true);
2203
+ }, 500);
2204
+ onCleanup(() => {
2205
+ clearTimeout(fadeInTimeout);
2206
+ });
2207
+ });
2208
+ onCleanup(() => {
2209
+ window.removeEventListener("resize", handleResize);
2210
+ window.visualViewport?.removeEventListener("resize", handleResize);
2211
+ window.visualViewport?.removeEventListener("scroll", handleResize);
2212
+ clearTimeout(resizeTimeout);
2213
+ clearTimeout(collapseAnimationTimeout);
2214
+ unfreezeUpdatesCallback?.();
2215
+ });
2216
+ const currentPosition = () => {
2217
+ return isCollapsed() ? computeCollapsedPosition() : position();
2218
+ };
2219
+ const getCursorClass = () => {
2220
+ if (isCollapsed()) return "cursor-pointer";
2221
+ if (drag.isDragging()) return "cursor-grabbing";
2222
+ return "cursor-grab";
2223
+ };
2224
+ const isInteracting = () => isToolbarHovered() || Boolean(props.isContextMenuOpen) || drag.isDragging() || drag.isSnapping() || isCollapseAnimating() || isChevronPressed();
2225
+ const shouldDim = () => Boolean(props.isActive) && !isInteracting();
2226
+ const getTransitionClass = () => {
2227
+ if (isResizing() || drag.isDragging()) return "";
2228
+ if (drag.isSnapping()) return "transition-[transform,opacity] duration-300 ease-out";
2229
+ if (isCollapseAnimating()) return `transition-[transform,opacity] ${isCollapsed() ? "duration-140" : "duration-220"} ease-drawer`;
2230
+ return "transition-[transform,opacity] duration-400 ease-drawer";
2231
+ };
2232
+ const getTransformOrigin = () => {
2233
+ switch (snapEdge()) {
2234
+ case "top": return "center top";
2235
+ case "bottom": return "center bottom";
2236
+ case "left": return "left center";
2237
+ case "right": return "right center";
2238
+ default: return "center center";
2239
+ }
2240
+ };
2241
+ return (() => {
2242
+ var _el$ = _tmpl$$5();
2243
+ _el$.addEventListener("mouseleave", () => {
2244
+ setIsToolbarHovered(false);
2245
+ props.onSelectHoverChange?.(false);
2246
+ });
2247
+ _el$.addEventListener("mouseenter", () => {
2248
+ setIsToolbarHovered(true);
2249
+ if (!isCollapsed()) props.onSelectHoverChange?.(true);
2250
+ });
2251
+ addEventListener(_el$, "mousedown", stopEventPropagation);
2252
+ addEventListener(_el$, "pointerdown", (event) => {
2253
+ stopEventPropagation(event);
2254
+ drag.handlePointerDown(event);
2255
+ });
2256
+ var _ref$ = containerRef;
2257
+ typeof _ref$ === "function" ? use(_ref$, _el$) : containerRef = _el$;
2258
+ insert(_el$, createComponent(ToolbarContent, {
2259
+ get isCollapsed() {
2260
+ return isCollapsed();
2261
+ },
2262
+ get snapEdge() {
2263
+ return snapEdge();
2264
+ },
2265
+ get isShaking() {
2266
+ return isShaking();
2267
+ },
2268
+ get isChevronPressed() {
2269
+ return isChevronPressed();
2270
+ },
2271
+ get transformOrigin() {
2272
+ return getTransformOrigin();
2273
+ },
2274
+ onAnimationEnd: () => setIsShaking(false),
2275
+ onCollapseClick: handleToggleCollapse,
2276
+ onCollapsePointerDown: () => setIsChevronPressed(true),
2277
+ onCollapsePointerUp: () => setIsChevronPressed(false),
2278
+ onCollapsePointerLeave: () => setIsChevronPressed(false),
2279
+ onPanelClick: (event) => {
2280
+ if (isCollapsed()) {
2281
+ event.stopPropagation();
2282
+ const { position: newPos, ratio: newRatio } = getExpandedFromCollapsed(currentPosition(), snapEdge());
2283
+ setPosition(newPos);
2284
+ setPositionRatio(newRatio);
2285
+ setIsCollapseAnimating(true);
2286
+ setIsCollapsed(false);
2287
+ saveAndNotify({
2288
+ edge: snapEdge(),
2289
+ ratio: newRatio,
2290
+ collapsed: false,
2291
+ enabled: true
2292
+ });
2293
+ if (collapseAnimationTimeout) clearTimeout(collapseAnimationTimeout);
2294
+ collapseAnimationTimeout = setTimeout(() => {
2295
+ setIsCollapseAnimating(false);
2296
+ captureDimensionsAfterAnimation();
2297
+ }, 260);
2298
+ }
2299
+ },
2300
+ get selectButton() {
2301
+ return (() => {
2302
+ var _el$2 = _tmpl$2$3();
2303
+ addEventListener(_el$2, "contextmenu", (event) => {
2304
+ event.preventDefault();
2305
+ event.stopPropagation();
2306
+ props.onToggleToolbarMenu?.();
2307
+ });
2308
+ addEventListener(_el$2, "click", handleToggle, true);
2309
+ spread(_el$2, mergeProps({
2310
+ get ["aria-label"]() {
2311
+ return props.isActive ? "Stop selecting element" : "Select element";
2312
+ },
2313
+ get ["aria-pressed"]() {
2314
+ return Boolean(props.isActive);
2315
+ },
2316
+ get ["class"]() {
2317
+ return cn("contain-layout flex items-center justify-center cursor-pointer interactive-scale touch-hitbox", buttonSpacingClass());
2318
+ }
2319
+ }, createFreezeHandlers), false, true);
2320
+ insert(_el$2, createComponent(IconSelect, {
2321
+ size: 14,
2322
+ get ["class"]() {
2323
+ return cn("transition-colors", props.isActive ? "text-[var(--rg-text-primary)]" : "text-[var(--rg-text-secondary)]");
2324
+ }
2325
+ }));
2326
+ return _el$2;
2327
+ })();
2328
+ }
2329
+ }));
2330
+ createRenderEffect((_p$) => {
2331
+ var _v$ = cn("fixed left-0 top-0 font-sans text-[13px] antialiased select-none", getCursorClass(), getTransitionClass(), isVisible() ? "pointer-events-auto" : "pointer-events-none"), _v$2 = String(Z_INDEX_OVERLAY), _v$3 = `translate(${currentPosition().x}px, ${currentPosition().y}px) scale(${shouldDim() ? .97 : 1})`, _v$4 = getTransformOrigin(), _v$5 = !isVisible() ? 0 : shouldDim() ? .55 : 1;
2332
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
2333
+ _v$2 !== _p$.t && setStyleProperty(_el$, "z-index", _p$.t = _v$2);
2334
+ _v$3 !== _p$.a && setStyleProperty(_el$, "transform", _p$.a = _v$3);
2335
+ _v$4 !== _p$.o && setStyleProperty(_el$, "transform-origin", _p$.o = _v$4);
2336
+ _v$5 !== _p$.i && setStyleProperty(_el$, "opacity", _p$.i = _v$5);
2337
+ return _p$;
2338
+ }, {
2339
+ e: void 0,
2340
+ t: void 0,
2341
+ a: void 0,
2342
+ o: void 0,
2343
+ i: void 0
2344
+ });
2345
+ return _el$;
2346
+ })();
2347
+ };
2348
+ delegateEvents(["click"]);
2349
+
2350
+ //#endregion
2351
+ //#region src/components/icons/icon-command.tsx
2352
+ var _tmpl$$4 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=currentColor><path fill-rule=evenodd clip-rule=evenodd d="M6.5 5C5.67157 5 5 5.67157 5 6.5C5 7.32843 5.67157 8 6.5 8H8V6.5C8 5.67157 7.32843 5 6.5 5ZM10 8V6.5C10 4.567 8.433 3 6.5 3C4.567 3 3 4.567 3 6.5C3 8.433 4.567 10 6.5 10H8V14H6.5C4.567 14 3 15.567 3 17.5C3 19.433 4.567 21 6.5 21C8.433 21 10 19.433 10 17.5V16H14V17.5C14 19.433 15.567 21 17.5 21C19.433 21 21 19.433 21 17.5C21 15.567 19.433 14 17.5 14H16V10H17.5C19.433 10 21 8.433 21 6.5C21 4.567 19.433 3 17.5 3C15.567 3 14 4.567 14 6.5V8H10ZM10 10V14H14V10H10ZM16 8H17.5C18.3284 8 19 7.32843 19 6.5C19 5.67157 18.3284 5 17.5 5C16.6716 5 16 5.67157 16 6.5V8ZM16 16V17.5C16 18.3284 16.6716 19 17.5 19C18.3284 19 19 18.3284 19 17.5C19 16.6716 18.3284 16 17.5 16H16ZM8 16H6.5C5.67157 16 5 16.6716 5 17.5C5 18.3284 5.67157 19 6.5 19C7.32843 19 8 18.3284 8 17.5V16Z">`);
2353
+ const IconCommand = (props) => {
2354
+ const size = () => props.size ?? 11;
2355
+ return (() => {
2356
+ var _el$ = _tmpl$$4();
2357
+ createRenderEffect((_p$) => {
2358
+ var _v$ = size(), _v$2 = size(), _v$3 = props.class;
2359
+ _v$ !== _p$.e && setAttribute(_el$, "width", _p$.e = _v$);
2360
+ _v$2 !== _p$.t && setAttribute(_el$, "height", _p$.t = _v$2);
2361
+ _v$3 !== _p$.a && setAttribute(_el$, "class", _p$.a = _v$3);
2362
+ return _p$;
2363
+ }, {
2364
+ e: void 0,
2365
+ t: void 0,
2366
+ a: void 0
2367
+ });
2368
+ return _el$;
2369
+ })();
2370
+ };
2371
+
2372
+ //#endregion
2373
+ //#region src/components/shortcut-hint.tsx
2374
+ var _tmpl$$3 = /* @__PURE__ */ template(`<span>`), _tmpl$2$2 = /* @__PURE__ */ template(`<span style=display:inline-flex;align-items:center;gap:2px>`), _tmpl$3$1 = /* @__PURE__ */ template(`<span>Ctrl+`);
2375
+ const ShortcutHint = (props) => {
2376
+ const isEnter = () => props.shortcut === "Enter";
2377
+ const isMacPlatform = isMac();
2378
+ return (() => {
2379
+ var _el$ = _tmpl$2$2();
2380
+ insert(_el$, createComponent(Show, {
2381
+ get when() {
2382
+ return isEnter();
2383
+ },
2384
+ get children() {
2385
+ return createComponent(IconReturn, { size: 8 });
2386
+ }
2387
+ }), null);
2388
+ insert(_el$, createComponent(Show, {
2389
+ get when() {
2390
+ return !isEnter();
2391
+ },
2392
+ get children() {
2393
+ return createComponent(Show, {
2394
+ when: isMacPlatform,
2395
+ get fallback() {
2396
+ return (() => {
2397
+ var _el$3 = _tmpl$3$1();
2398
+ _el$3.firstChild;
2399
+ insert(_el$3, () => props.shortcut, null);
2400
+ return _el$3;
2401
+ })();
2402
+ },
2403
+ get children() {
2404
+ return [createComponent(IconCommand, { size: 9 }), (() => {
2405
+ var _el$2 = _tmpl$$3();
2406
+ insert(_el$2, () => props.shortcut);
2407
+ return _el$2;
2408
+ })()];
2409
+ }
2410
+ });
2411
+ }
2412
+ }), null);
2413
+ createRenderEffect(() => className(_el$, props.class));
2414
+ return _el$;
2415
+ })();
2416
+ };
2417
+
2418
+ //#endregion
2419
+ //#region src/utils/resolve-action-enabled.ts
2420
+ const resolveBooleanEnabled = (enabled) => enabled ?? true;
2421
+ const resolveActionEnabled = (action, context) => {
2422
+ if (typeof action.enabled === "function") {
2423
+ if (!context) return false;
2424
+ return action.enabled(context);
2425
+ }
2426
+ return resolveBooleanEnabled(action.enabled);
2427
+ };
2428
+
2429
+ //#endregion
2430
+ //#region src/utils/suppress-menu-event.ts
2431
+ const suppressMenuEvent = (event) => {
2432
+ if (event.type === "contextmenu") event.preventDefault();
2433
+ event.stopImmediatePropagation();
2434
+ };
2435
+
2436
+ //#endregion
2437
+ //#region src/utils/register-overlay-dismiss.ts
2438
+ const registerOverlayDismiss = (options) => {
2439
+ const handleKeyDown = (event) => {
2440
+ if (!options.isOpen()) return;
2441
+ if (options.shouldIgnoreInputEvents && isKeyboardEventTriggeredByInput(event)) return;
2442
+ if (event.code === "Escape") {
2443
+ event.preventDefault();
2444
+ event.stopImmediatePropagation();
2445
+ options.onDismiss();
2446
+ return;
2447
+ }
2448
+ if (event.code === "Enter" && options.onConfirm) {
2449
+ event.preventDefault();
2450
+ event.stopImmediatePropagation();
2451
+ options.onConfirm();
2452
+ }
2453
+ };
2454
+ const handleClickOutside = (event) => {
2455
+ if (!options.isOpen()) return;
2456
+ if (isEventFromOverlay(event, "data-react-grab-ignore-events")) return;
2457
+ if (options.shouldIgnoreRightClick && event instanceof MouseEvent && event.button === 2) return;
2458
+ options.onDismiss();
2459
+ };
2460
+ const frameId = nativeRequestAnimationFrame(() => {
2461
+ window.addEventListener("mousedown", handleClickOutside, { capture: true });
2462
+ window.addEventListener("touchstart", handleClickOutside, { capture: true });
2463
+ });
2464
+ window.addEventListener("keydown", handleKeyDown, { capture: true });
2465
+ return () => {
2466
+ nativeCancelAnimationFrame(frameId);
2467
+ window.removeEventListener("keydown", handleKeyDown, { capture: true });
2468
+ window.removeEventListener("mousedown", handleClickOutside, { capture: true });
2469
+ window.removeEventListener("touchstart", handleClickOutside, { capture: true });
2470
+ };
2471
+ };
2472
+
2473
+ //#endregion
2474
+ //#region src/components/context-menu.tsx
2475
+ var _tmpl$$2 = /* @__PURE__ */ template(`<div class="relative flex flex-col w-[calc(100%+16px)] -mx-2 -my-1.5"><div class="pointer-events-none absolute opacity-0 transition-[top,left,width,height,opacity] duration-75 ease-out bg-[var(--rg-surface-hover)]">`), _tmpl$2$1 = /* @__PURE__ */ template(`<div data-react-grab-ignore-events data-react-grab-context-menu class="fixed font-sans text-[13px] antialiased [filter:var(--rg-drop-shadow)] select-none"style=pointer-events:auto><div><div class="contain-layout shrink-0 flex items-center gap-1 pt-1.5 pb-1 w-fit h-fit px-2">`), _tmpl$3 = /* @__PURE__ */ template(`<button data-react-grab-ignore-events class="relative z-1 contain-layout flex items-center justify-between w-full px-2 py-1 cursor-pointer text-left border-none bg-transparent disabled:opacity-40 disabled:cursor-default"><span class="text-[13px] leading-4 font-sans font-medium text-[var(--rg-text-primary)]">`);
2476
+ const ContextMenu = (props) => {
2477
+ let containerRef;
2478
+ const { containerRef: highlightContainerRef, highlightRef, updateHighlight, clearHighlight } = createMenuHighlight();
2479
+ const [measuredWidth, setMeasuredWidth] = createSignal(0);
2480
+ const [measuredHeight, setMeasuredHeight] = createSignal(0);
2481
+ const isVisible = () => props.position !== null;
2482
+ const tagDisplayResult = createMemo(() => getTagDisplay({
2483
+ tagName: props.tagName,
2484
+ componentName: props.componentName
2485
+ }));
2486
+ const measureContainer = () => {
2487
+ if (containerRef) {
2488
+ const rect = containerRef.getBoundingClientRect();
2489
+ setMeasuredWidth(rect.width);
2490
+ setMeasuredHeight(rect.height);
2491
+ }
2492
+ };
2493
+ createEffect(() => {
2494
+ if (isVisible()) nativeRequestAnimationFrame(measureContainer);
2495
+ });
2496
+ const computedPosition = createMemo(() => {
2497
+ const bounds = props.selectionBounds;
2498
+ const clickPosition = props.position;
2499
+ const labelWidth = measuredWidth();
2500
+ const labelHeight = measuredHeight();
2501
+ if (labelWidth === 0 || labelHeight === 0 || !bounds || !clickPosition) return {
2502
+ left: DROPDOWN_OFFSCREEN_POSITION.left,
2503
+ top: DROPDOWN_OFFSCREEN_POSITION.top,
2504
+ arrowLeft: 0,
2505
+ arrowPosition: "bottom"
2506
+ };
2507
+ const cursorX = clickPosition.x ?? bounds.x + bounds.width / 2;
2508
+ const positionLeft = Math.max(4, Math.min(cursorX - labelWidth / 2, window.innerWidth - labelWidth - 4));
2509
+ const arrowLeft = Math.max(8, Math.min(cursorX - positionLeft, labelWidth - 8));
2510
+ const positionBelow = bounds.y + bounds.height + 8 + 4;
2511
+ const positionAbove = bounds.y - labelHeight - 8 - 4;
2512
+ const wouldOverflowBottom = positionBelow + labelHeight > window.innerHeight;
2513
+ const hasSpaceAbove = positionAbove >= 0;
2514
+ const shouldFlipAbove = wouldOverflowBottom && hasSpaceAbove;
2515
+ let positionTop = shouldFlipAbove ? positionAbove : positionBelow;
2516
+ let arrowPosition = shouldFlipAbove ? "top" : "bottom";
2517
+ if (wouldOverflowBottom && !hasSpaceAbove) {
2518
+ const cursorY = clickPosition.y ?? bounds.y + bounds.height / 2;
2519
+ positionTop = Math.max(4, Math.min(cursorY + 4, window.innerHeight - labelHeight - 4));
2520
+ arrowPosition = "top";
2521
+ }
2522
+ return {
2523
+ left: positionLeft,
2524
+ top: positionTop,
2525
+ arrowLeft,
2526
+ arrowPosition
2527
+ };
2528
+ });
2529
+ const menuItems = createMemo(() => {
2530
+ const pluginActions = props.actions ?? [];
2531
+ const context = props.actionContext;
2532
+ return pluginActions.map((action) => ({
2533
+ label: action.label,
2534
+ action: () => {
2535
+ if (context) action.onAction(context);
2536
+ },
2537
+ enabled: resolveActionEnabled(action, context),
2538
+ shortcut: action.shortcut
2539
+ }));
2540
+ });
2541
+ const handleAction = (item, event) => {
2542
+ event.stopPropagation();
2543
+ if (item.enabled) {
2544
+ item.action();
2545
+ props.onHide();
2546
+ }
2547
+ };
2548
+ onMount(() => {
2549
+ measureContainer();
2550
+ const handleKeyDown = (event) => {
2551
+ if (!isVisible()) return;
2552
+ const isEnter = event.key === "Enter";
2553
+ const hasModifierKey = event.metaKey || event.ctrlKey;
2554
+ const keyLower = event.key.toLowerCase();
2555
+ const pluginActions = props.actions ?? [];
2556
+ const context = props.actionContext;
2557
+ const runActionIfAllowed = (action) => {
2558
+ if (!context) return;
2559
+ if (!resolveActionEnabled(action, context)) return;
2560
+ event.preventDefault();
2561
+ event.stopPropagation();
2562
+ action.onAction(context);
2563
+ props.onHide();
2564
+ };
2565
+ if (isEnter) {
2566
+ const enterAction = pluginActions.find((action) => action.shortcut === "Enter");
2567
+ if (enterAction) runActionIfAllowed(enterAction);
2568
+ return;
2569
+ }
2570
+ if (!hasModifierKey) return;
2571
+ if (event.repeat) return;
2572
+ const modifierAction = pluginActions.find((action) => action.shortcut && action.shortcut !== "Enter" && keyLower === action.shortcut.toLowerCase());
2573
+ if (modifierAction) runActionIfAllowed(modifierAction);
2574
+ };
2575
+ const unregisterOverlayDismiss = registerOverlayDismiss({
2576
+ isOpen: isVisible,
2577
+ onDismiss: props.onDismiss,
2578
+ shouldIgnoreRightClick: true
2579
+ });
2580
+ window.addEventListener("keydown", handleKeyDown, { capture: true });
2581
+ onCleanup(() => {
2582
+ unregisterOverlayDismiss();
2583
+ window.removeEventListener("keydown", handleKeyDown, { capture: true });
2584
+ });
2585
+ });
2586
+ return createComponent(Show, {
2587
+ get when() {
2588
+ return isVisible();
2589
+ },
2590
+ get children() {
2591
+ var _el$ = _tmpl$2$1(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild;
2592
+ addEventListener(_el$, "contextmenu", suppressMenuEvent, true);
2593
+ addEventListener(_el$, "click", suppressMenuEvent, true);
2594
+ addEventListener(_el$, "mousedown", suppressMenuEvent, true);
2595
+ addEventListener(_el$, "pointerdown", suppressMenuEvent, true);
2596
+ var _ref$ = containerRef;
2597
+ typeof _ref$ === "function" ? use(_ref$, _el$) : containerRef = _el$;
2598
+ setStyleProperty(_el$, "z-index", `${Z_INDEX_OVERLAY}`);
2599
+ insert(_el$, createComponent(Arrow, {
2600
+ get position() {
2601
+ return computedPosition().arrowPosition;
2602
+ },
2603
+ leftPercent: 0,
2604
+ get leftOffsetPx() {
2605
+ return computedPosition().arrowLeft;
2606
+ }
2607
+ }), _el$2);
2608
+ insert(_el$3, createComponent(TagBadge, {
2609
+ get tagName() {
2610
+ return tagDisplayResult().tagName;
2611
+ },
2612
+ get componentName() {
2613
+ return tagDisplayResult().componentName;
2614
+ },
2615
+ get isClickable() {
2616
+ return props.hasFilePath;
2617
+ },
2618
+ onClick: (event) => {
2619
+ event.stopPropagation();
2620
+ if (props.hasFilePath && props.actionContext) (props.actions?.find((action) => action.id === "open"))?.onAction(props.actionContext);
2621
+ },
2622
+ shrink: true,
2623
+ get forceShowIcon() {
2624
+ return props.hasFilePath;
2625
+ }
2626
+ }));
2627
+ insert(_el$2, createComponent(BottomSection, { get children() {
2628
+ var _el$4 = _tmpl$$2(), _el$5 = _el$4.firstChild;
2629
+ use(highlightContainerRef, _el$4);
2630
+ use(highlightRef, _el$5);
2631
+ insert(_el$4, createComponent(For, {
2632
+ get each() {
2633
+ return menuItems();
2634
+ },
2635
+ children: (item) => (() => {
2636
+ var _el$6 = _tmpl$3(), _el$7 = _el$6.firstChild;
2637
+ _el$6.$$click = (event) => handleAction(item, event);
2638
+ addEventListener(_el$6, "pointerleave", clearHighlight);
2639
+ _el$6.addEventListener("pointerenter", (event) => {
2640
+ if (item.enabled) updateHighlight(event.currentTarget);
2641
+ });
2642
+ _el$6.$$pointerdown = (event) => event.stopPropagation();
2643
+ insert(_el$7, () => item.label);
2644
+ insert(_el$6, createComponent(Show, {
2645
+ get when() {
2646
+ return item.shortcut;
2647
+ },
2648
+ children: (shortcut) => createComponent(ShortcutHint, {
2649
+ get shortcut() {
2650
+ return shortcut();
2651
+ },
2652
+ "class": "text-[11px] font-sans text-[var(--rg-text-secondary)] ml-4"
2653
+ })
2654
+ }), null);
2655
+ createRenderEffect((_p$) => {
2656
+ var _v$4 = item.label.toLowerCase(), _v$5 = !item.enabled;
2657
+ _v$4 !== _p$.e && setAttribute(_el$6, "data-react-grab-menu-item", _p$.e = _v$4);
2658
+ _v$5 !== _p$.t && (_el$6.disabled = _p$.t = _v$5);
2659
+ return _p$;
2660
+ }, {
2661
+ e: void 0,
2662
+ t: void 0
2663
+ });
2664
+ return _el$6;
2665
+ })()
2666
+ }), null);
2667
+ return _el$4;
2668
+ } }), null);
2669
+ createRenderEffect((_p$) => {
2670
+ var _v$ = `${computedPosition().top}px`, _v$2 = `${computedPosition().left}px`, _v$3 = cn("contain-layout flex flex-col justify-center items-start rounded-[10px] antialiased w-fit h-fit min-w-[100px] [font-synthesis:none] [corner-shape:superellipse(1.25)]", "bg-[var(--rg-panel-bg)]");
2671
+ _v$ !== _p$.e && setStyleProperty(_el$, "top", _p$.e = _v$);
2672
+ _v$2 !== _p$.t && setStyleProperty(_el$, "left", _p$.t = _v$2);
2673
+ _v$3 !== _p$.a && className(_el$2, _p$.a = _v$3);
2674
+ return _p$;
2675
+ }, {
2676
+ e: void 0,
2677
+ t: void 0,
2678
+ a: void 0
2679
+ });
2680
+ return _el$;
2681
+ }
2682
+ });
2683
+ };
2684
+ delegateEvents([
2685
+ "pointerdown",
2686
+ "mousedown",
2687
+ "click",
2688
+ "contextmenu"
2689
+ ]);
2690
+
2691
+ //#endregion
2692
+ //#region src/utils/clamp-to-viewport.ts
2693
+ const clampToViewport = (value, elementSize, viewportSize, padding) => Math.max(padding, Math.min(value, viewportSize - elementSize - padding));
2694
+
2695
+ //#endregion
2696
+ //#region src/utils/get-anchored-dropdown-position.ts
2697
+ const getAnchoredDropdownPosition = ({ anchor, measuredWidth, measuredHeight, viewportWidth, viewportHeight, anchorGapPx, viewportPaddingPx, offscreenPosition }) => {
2698
+ if (!anchor || measuredWidth === 0 || measuredHeight === 0) return offscreenPosition;
2699
+ let rawLeft;
2700
+ let rawTop;
2701
+ if (anchor.edge === "left" || anchor.edge === "right") {
2702
+ rawLeft = anchor.edge === "left" ? anchor.x + anchorGapPx : anchor.x - measuredWidth - anchorGapPx;
2703
+ rawTop = anchor.y - measuredHeight / 2;
2704
+ } else {
2705
+ rawLeft = anchor.x - measuredWidth / 2;
2706
+ rawTop = anchor.edge === "top" ? anchor.y + anchorGapPx : anchor.y - measuredHeight - anchorGapPx;
2707
+ }
2708
+ return {
2709
+ left: clampToViewport(rawLeft, measuredWidth, viewportWidth, viewportPaddingPx),
2710
+ top: clampToViewport(rawTop, measuredHeight, viewportHeight, viewportPaddingPx)
2711
+ };
2712
+ };
2713
+
2714
+ //#endregion
2715
+ //#region src/utils/create-anchored-dropdown.ts
2716
+ const createAnchoredDropdown = (containerRef, anchorAccessor) => {
2717
+ const [measuredWidth, setMeasuredWidth] = createSignal(0);
2718
+ const [measuredHeight, setMeasuredHeight] = createSignal(0);
2719
+ const [shouldMount, setShouldMount] = createSignal(false);
2720
+ const [isAnimatedIn, setIsAnimatedIn] = createSignal(false);
2721
+ const [viewportVersion, setViewportVersion] = createSignal(0);
2722
+ const [lastAnchorEdge, setLastAnchorEdge] = createSignal("bottom");
2723
+ let exitAnimationTimeout;
2724
+ let enterAnimationFrameId;
2725
+ const clearAnimationHandles = () => {
2726
+ clearTimeout(exitAnimationTimeout);
2727
+ if (enterAnimationFrameId !== void 0) {
2728
+ nativeCancelAnimationFrame(enterAnimationFrameId);
2729
+ enterAnimationFrameId = void 0;
2730
+ }
2731
+ };
2732
+ const measure = () => {
2733
+ const container = containerRef();
2734
+ if (container) {
2735
+ setMeasuredWidth(container.offsetWidth);
2736
+ setMeasuredHeight(container.offsetHeight);
2737
+ }
2738
+ };
2739
+ const handleViewportChange = () => {
2740
+ setViewportVersion((previousViewportVersion) => previousViewportVersion + 1);
2741
+ measure();
2742
+ };
2743
+ createEffect(() => {
2744
+ const anchor = anchorAccessor();
2745
+ if (anchor) {
2746
+ setLastAnchorEdge(anchor.edge);
2747
+ clearTimeout(exitAnimationTimeout);
2748
+ setShouldMount(true);
2749
+ if (enterAnimationFrameId !== void 0) nativeCancelAnimationFrame(enterAnimationFrameId);
2750
+ enterAnimationFrameId = nativeRequestAnimationFrame(() => {
2751
+ measure();
2752
+ containerRef()?.offsetHeight;
2753
+ setIsAnimatedIn(true);
2754
+ });
2755
+ } else {
2756
+ if (enterAnimationFrameId !== void 0) nativeCancelAnimationFrame(enterAnimationFrameId);
2757
+ setIsAnimatedIn(false);
2758
+ exitAnimationTimeout = setTimeout(() => {
2759
+ setShouldMount(false);
2760
+ }, 120);
2761
+ }
2762
+ onCleanup(clearAnimationHandles);
2763
+ });
2764
+ createEffect(() => {
2765
+ if (!anchorAccessor()) return;
2766
+ window.addEventListener("resize", handleViewportChange);
2767
+ window.visualViewport?.addEventListener("resize", handleViewportChange);
2768
+ window.visualViewport?.addEventListener("scroll", handleViewportChange);
2769
+ onCleanup(() => {
2770
+ window.removeEventListener("resize", handleViewportChange);
2771
+ window.visualViewport?.removeEventListener("resize", handleViewportChange);
2772
+ window.visualViewport?.removeEventListener("scroll", handleViewportChange);
2773
+ });
2774
+ });
2775
+ return {
2776
+ shouldMount,
2777
+ isAnimatedIn,
2778
+ lastAnchorEdge,
2779
+ displayPosition: createMemo((previousPosition) => {
2780
+ viewportVersion();
2781
+ const position = getAnchoredDropdownPosition({
2782
+ anchor: anchorAccessor(),
2783
+ measuredWidth: measuredWidth(),
2784
+ measuredHeight: measuredHeight(),
2785
+ viewportWidth: window.innerWidth,
2786
+ viewportHeight: window.innerHeight,
2787
+ anchorGapPx: 8,
2788
+ viewportPaddingPx: 8,
2789
+ offscreenPosition: DROPDOWN_OFFSCREEN_POSITION
2790
+ });
2791
+ if (position.left !== DROPDOWN_OFFSCREEN_POSITION.left) return position;
2792
+ return previousPosition;
2793
+ }, DROPDOWN_OFFSCREEN_POSITION),
2794
+ measure,
2795
+ clearAnimationHandles
2796
+ };
2797
+ };
2798
+
2799
+ //#endregion
2800
+ //#region src/components/toolbar/toolbar-menu.tsx
2801
+ var _tmpl$$1 = /* @__PURE__ */ template(`<div data-react-grab-ignore-events data-react-grab-toolbar-menu><div><div class="relative flex flex-col py-1"><div class="pointer-events-none absolute opacity-0 transition-[top,left,width,height,opacity] duration-75 ease-out bg-[var(--rg-surface-hover)]">`), _tmpl$2 = /* @__PURE__ */ template(`<button data-react-grab-ignore-events class="relative z-1 contain-layout flex items-center justify-between w-full px-2 py-1 cursor-pointer text-left border-none bg-transparent"><span>`);
2802
+ const ToolbarMenu = (props) => {
2803
+ let containerRef;
2804
+ const { containerRef: highlightContainerRef, highlightRef, updateHighlight, clearHighlight } = createMenuHighlight();
2805
+ const dropdown = createAnchoredDropdown(() => containerRef, () => props.position);
2806
+ const handleActionClick = (action, event) => {
2807
+ event.stopPropagation();
2808
+ props.onSetDefaultAction(action.id);
2809
+ props.onDismiss();
2810
+ };
2811
+ onMount(() => {
2812
+ dropdown.measure();
2813
+ const unregisterOverlayDismiss = registerOverlayDismiss({
2814
+ isOpen: () => Boolean(props.position),
2815
+ onDismiss: props.onDismiss
2816
+ });
2817
+ onCleanup(() => {
2818
+ dropdown.clearAnimationHandles();
2819
+ unregisterOverlayDismiss();
2820
+ });
2821
+ });
2822
+ return createComponent(Show, {
2823
+ get when() {
2824
+ return dropdown.shouldMount();
2825
+ },
2826
+ get children() {
2827
+ var _el$ = _tmpl$$1(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild;
2828
+ addEventListener(_el$, "contextmenu", suppressMenuEvent, true);
2829
+ addEventListener(_el$, "click", suppressMenuEvent, true);
2830
+ addEventListener(_el$, "mousedown", suppressMenuEvent, true);
2831
+ addEventListener(_el$, "pointerdown", suppressMenuEvent, true);
2832
+ var _ref$ = containerRef;
2833
+ typeof _ref$ === "function" ? use(_ref$, _el$) : containerRef = _el$;
2834
+ setStyleProperty(_el$, "z-index", `${Z_INDEX_OVERLAY}`);
2835
+ setStyleProperty(_el$2, "min-width", `${100}px`);
2836
+ use(highlightContainerRef, _el$3);
2837
+ use(highlightRef, _el$4);
2838
+ insert(_el$3, createComponent(For, {
2839
+ get each() {
2840
+ return props.actions;
2841
+ },
2842
+ children: (action) => {
2843
+ const isDefault = () => action.id === props.defaultActionId;
2844
+ return (() => {
2845
+ var _el$5 = _tmpl$2(), _el$6 = _el$5.firstChild;
2846
+ _el$5.$$click = (event) => handleActionClick(action, event);
2847
+ addEventListener(_el$5, "pointerleave", clearHighlight);
2848
+ _el$5.addEventListener("pointerenter", (event) => updateHighlight(event.currentTarget));
2849
+ _el$5.$$pointerdown = (event) => event.stopPropagation();
2850
+ insert(_el$6, () => action.label);
2851
+ insert(_el$5, createComponent(Show, {
2852
+ get when() {
2853
+ return action.shortcut;
2854
+ },
2855
+ children: (shortcutKey) => createComponent(ShortcutHint, {
2856
+ get shortcut() {
2857
+ return shortcutKey();
2858
+ },
2859
+ "class": "text-[11px] font-sans text-[var(--rg-text-secondary)] ml-4"
2860
+ })
2861
+ }), null);
2862
+ createRenderEffect((_p$) => {
2863
+ var _v$9 = action.id, _v$0 = cn("text-[13px] leading-4 font-sans font-medium", isDefault() ? "text-[var(--rg-text-primary)]" : "text-[var(--rg-text-secondary)]");
2864
+ _v$9 !== _p$.e && setAttribute(_el$5, "data-react-grab-menu-item", _p$.e = _v$9);
2865
+ _v$0 !== _p$.t && className(_el$6, _p$.t = _v$0);
2866
+ return _p$;
2867
+ }, {
2868
+ e: void 0,
2869
+ t: void 0
2870
+ });
2871
+ return _el$5;
2872
+ })();
2873
+ }
2874
+ }), null);
2875
+ createRenderEffect((_p$) => {
2876
+ var _v$ = cn("fixed font-sans text-[13px] antialiased [filter:var(--rg-drop-shadow)] select-none will-change-[opacity,transform]", dropdown.isAnimatedIn() ? "transition-[opacity,transform] duration-220 ease-spring" : "transition-[opacity,transform] duration-120 ease-drawer"), _v$2 = `${dropdown.displayPosition().top}px`, _v$3 = `${dropdown.displayPosition().left}px`, _v$4 = dropdown.isAnimatedIn() ? "auto" : "none", _v$5 = DROPDOWN_EDGE_TRANSFORM_ORIGIN[dropdown.lastAnchorEdge()], _v$6 = dropdown.isAnimatedIn() ? "1" : "0", _v$7 = dropdown.isAnimatedIn() ? "scale(1)" : "scale(0.92)", _v$8 = cn("contain-layout flex flex-col rounded-[10px] antialiased w-fit h-fit overflow-hidden [font-synthesis:none] [corner-shape:superellipse(1.25)]", "bg-[var(--rg-panel-bg)]");
2877
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
2878
+ _v$2 !== _p$.t && setStyleProperty(_el$, "top", _p$.t = _v$2);
2879
+ _v$3 !== _p$.a && setStyleProperty(_el$, "left", _p$.a = _v$3);
2880
+ _v$4 !== _p$.o && setStyleProperty(_el$, "pointer-events", _p$.o = _v$4);
2881
+ _v$5 !== _p$.i && setStyleProperty(_el$, "transform-origin", _p$.i = _v$5);
2882
+ _v$6 !== _p$.n && setStyleProperty(_el$, "opacity", _p$.n = _v$6);
2883
+ _v$7 !== _p$.s && setStyleProperty(_el$, "transform", _p$.s = _v$7);
2884
+ _v$8 !== _p$.h && className(_el$2, _p$.h = _v$8);
2885
+ return _p$;
2886
+ }, {
2887
+ e: void 0,
2888
+ t: void 0,
2889
+ a: void 0,
2890
+ o: void 0,
2891
+ i: void 0,
2892
+ n: void 0,
2893
+ s: void 0,
2894
+ h: void 0
2895
+ });
2896
+ return _el$;
2897
+ }
2898
+ });
2899
+ };
2900
+ delegateEvents([
2901
+ "pointerdown",
2902
+ "mousedown",
2903
+ "click",
2904
+ "contextmenu"
2905
+ ]);
2906
+
2907
+ //#endregion
2908
+ //#region src/components/renderer.tsx
2909
+ var _tmpl$ = /* @__PURE__ */ template(`<div style=position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;will-change:opacity;contain:strict;transform:translateZ(0)>`);
2910
+ const ReactGrabRenderer = (props) => {
2911
+ return [
2912
+ createComponent(OverlayCanvas, {
2913
+ get selectionVisible() {
2914
+ return props.selectionVisible;
2915
+ },
2916
+ get selectionBounds() {
2917
+ return props.selectionBounds;
2918
+ },
2919
+ get selectionBoundsMultiple() {
2920
+ return props.selectionBoundsMultiple;
2921
+ },
2922
+ get selectionShouldSnap() {
2923
+ return props.selectionShouldSnap;
2924
+ },
2925
+ get dragVisible() {
2926
+ return props.dragVisible;
2927
+ },
2928
+ get dragBounds() {
2929
+ return props.dragBounds;
2930
+ },
2931
+ get grabbedBoxes() {
2932
+ return props.grabbedBoxes;
2933
+ },
2934
+ get labelInstances() {
2935
+ return props.labelInstances;
2936
+ }
2937
+ }),
2938
+ (() => {
2939
+ var _el$ = _tmpl$();
2940
+ setStyleProperty(_el$, "z-index", Z_INDEX_OVERLAY_CANVAS);
2941
+ setStyleProperty(_el$, "transition", `opacity ${150}ms ease-out`);
2942
+ setStyleProperty(_el$, "box-shadow", `inset 0 0 ${50}px ${FROZEN_GLOW_COLOR}`);
2943
+ createRenderEffect((_$p) => setStyleProperty(_el$, "opacity", props.isFrozen ? 1 : 0));
2944
+ return _el$;
2945
+ })(),
2946
+ createComponent(Show, {
2947
+ get when() {
2948
+ return memo(() => !!props.selectionLabelVisible)() && (props.frozenLabelEntries?.length ?? 0) > 0;
2949
+ },
2950
+ get children() {
2951
+ return createComponent(Index, {
2952
+ get each() {
2953
+ return props.frozenLabelEntries ?? [];
2954
+ },
2955
+ children: (entry, entryIndex) => createComponent(SelectionLabel, {
2956
+ get tagName() {
2957
+ return entry().tagName;
2958
+ },
2959
+ get componentName() {
2960
+ return entry().componentName;
2961
+ },
2962
+ get selectionBounds() {
2963
+ return entry().bounds;
2964
+ },
2965
+ get mouseX() {
2966
+ return entry().mouseX;
2967
+ },
2968
+ visible: true,
2969
+ shouldToggleExpandOnClick: entryIndex === 0,
2970
+ get onToggleExpand() {
2971
+ return entryIndex === 0 ? props.onToggleExpand : void 0;
2972
+ }
2973
+ })
2974
+ });
2975
+ }
2976
+ }),
2977
+ createComponent(Show, {
2978
+ get when() {
2979
+ return memo(() => !!props.selectionLabelVisible)() && props.pendingShiftPreviewEntry;
2980
+ },
2981
+ children: (pendingEntry) => createComponent(SelectionLabel, {
2982
+ get tagName() {
2983
+ return pendingEntry().tagName;
2984
+ },
2985
+ get componentName() {
2986
+ return pendingEntry().componentName;
2987
+ },
2988
+ get selectionBounds() {
2989
+ return pendingEntry().bounds;
2990
+ },
2991
+ get mouseX() {
2992
+ return pendingEntry().mouseX;
2993
+ },
2994
+ visible: true
2995
+ })
2996
+ }),
2997
+ createComponent(Show, {
2998
+ get when() {
2999
+ return memo(() => !!(props.selectionLabelVisible && props.selectionBounds))() && (props.frozenLabelEntries?.length ?? 0) === 0;
3000
+ },
3001
+ get children() {
3002
+ return createComponent(SelectionLabel, {
3003
+ get tagName() {
3004
+ return props.selectionTagName;
3005
+ },
3006
+ get componentName() {
3007
+ return props.selectionComponentName;
3008
+ },
3009
+ get elementsCount() {
3010
+ return props.selectionElementsCount;
3011
+ },
3012
+ get selectionBounds() {
3013
+ return props.selectionBounds;
3014
+ },
3015
+ get mouseX() {
3016
+ return props.mouseX;
3017
+ },
3018
+ get visible() {
3019
+ return props.selectionLabelVisible;
3020
+ },
3021
+ get isPromptMode() {
3022
+ return props.isPromptMode;
3023
+ },
3024
+ get inputValue() {
3025
+ return props.inputValue;
3026
+ },
3027
+ get status() {
3028
+ return props.selectionLabelStatus;
3029
+ },
3030
+ get arrowNavigationState() {
3031
+ return props.selectionArrowNavigationState;
3032
+ },
3033
+ get onArrowNavigationSelect() {
3034
+ return props.onArrowNavigationSelect;
3035
+ },
3036
+ get filePath() {
3037
+ return props.selectionFilePath;
3038
+ },
3039
+ get onInputChange() {
3040
+ return props.onInputChange;
3041
+ },
3042
+ get onSubmit() {
3043
+ return props.onInputSubmit;
3044
+ },
3045
+ get onToggleExpand() {
3046
+ return props.onToggleExpand;
3047
+ },
3048
+ get isPendingDismiss() {
3049
+ return props.isPendingDismiss;
3050
+ },
3051
+ get selectionLabelShakeCount() {
3052
+ return props.selectionLabelShakeCount;
3053
+ },
3054
+ get onConfirmDismiss() {
3055
+ return props.onConfirmDismiss;
3056
+ },
3057
+ get onCancelDismiss() {
3058
+ return props.onCancelDismiss;
3059
+ },
3060
+ onOpen: () => {
3061
+ if (props.selectionFilePath) openFile(props.selectionFilePath, props.selectionLineNumber);
3062
+ },
3063
+ get isContextMenuOpen() {
3064
+ return props.contextMenuPosition !== null;
3065
+ }
3066
+ });
3067
+ }
3068
+ }),
3069
+ createComponent(Index, {
3070
+ get each() {
3071
+ return props.labelInstances ?? [];
3072
+ },
3073
+ children: (instance) => createComponent(SelectionLabel, {
3074
+ get tagName() {
3075
+ return instance().tagName;
3076
+ },
3077
+ get componentName() {
3078
+ return instance().componentName;
3079
+ },
3080
+ get elementsCount() {
3081
+ return instance().elementsCount;
3082
+ },
3083
+ get selectionBounds() {
3084
+ return instance().bounds;
3085
+ },
3086
+ get mouseX() {
3087
+ return instance().mouseX;
3088
+ },
3089
+ visible: true,
3090
+ get status() {
3091
+ return instance().status;
3092
+ },
3093
+ get statusText() {
3094
+ return instance().statusText;
3095
+ },
3096
+ get isPromptMode() {
3097
+ return instance().isPromptMode;
3098
+ },
3099
+ get inputValue() {
3100
+ return instance().inputValue;
3101
+ },
3102
+ get error() {
3103
+ return instance().errorMessage;
3104
+ },
3105
+ get hideArrow() {
3106
+ return instance().hideArrow;
3107
+ },
3108
+ get onShowContextMenu() {
3109
+ const currentInstance = instance();
3110
+ if (!(currentInstance.status === "copied" || currentInstance.status === "fading") || !isElementConnected(currentInstance.element)) return;
3111
+ return () => props.onShowContextMenuInstance?.(currentInstance.id);
3112
+ },
3113
+ onHoverChange: (isHovered) => props.onLabelInstanceHoverChange?.(instance().id, isHovered)
3114
+ })
3115
+ }),
3116
+ createComponent(Show, {
3117
+ get when() {
3118
+ return props.toolbarVisible !== false;
3119
+ },
3120
+ get children() {
3121
+ return createComponent(Toolbar, {
3122
+ get isActive() {
3123
+ return props.isActive;
3124
+ },
3125
+ get isContextMenuOpen() {
3126
+ return props.contextMenuPosition !== null;
3127
+ },
3128
+ get onToggle() {
3129
+ return props.onToggleActive;
3130
+ },
3131
+ get enabled() {
3132
+ return props.enabled;
3133
+ },
3134
+ get shakeCount() {
3135
+ return props.shakeCount;
3136
+ },
3137
+ get onStateChange() {
3138
+ return props.onToolbarStateChange;
3139
+ },
3140
+ get onSubscribeToStateChanges() {
3141
+ return props.onSubscribeToToolbarStateChanges;
3142
+ },
3143
+ get onSelectHoverChange() {
3144
+ return props.onToolbarSelectHoverChange;
3145
+ },
3146
+ get onContainerRef() {
3147
+ return props.onToolbarRef;
3148
+ },
3149
+ get onToggleToolbarMenu() {
3150
+ return props.onToggleToolbarMenu;
3151
+ }
3152
+ });
3153
+ }
3154
+ }),
3155
+ createComponent(ContextMenu, {
3156
+ get position() {
3157
+ return props.contextMenuPosition ?? null;
3158
+ },
3159
+ get selectionBounds() {
3160
+ return props.contextMenuBounds ?? null;
3161
+ },
3162
+ get tagName() {
3163
+ return props.contextMenuTagName;
3164
+ },
3165
+ get componentName() {
3166
+ return props.contextMenuComponentName;
3167
+ },
3168
+ get hasFilePath() {
3169
+ return props.contextMenuHasFilePath ?? false;
3170
+ },
3171
+ get actions() {
3172
+ return props.actions;
3173
+ },
3174
+ get actionContext() {
3175
+ return props.actionContext;
3176
+ },
3177
+ get onDismiss() {
3178
+ return props.onContextMenuDismiss ?? (() => {});
3179
+ },
3180
+ get onHide() {
3181
+ return props.onContextMenuHide ?? (() => {});
3182
+ }
3183
+ }),
3184
+ createComponent(ToolbarMenu, {
3185
+ get position() {
3186
+ return props.toolbarMenuPosition ?? null;
3187
+ },
3188
+ get actions() {
3189
+ return props.toolbarMenuActions ?? [];
3190
+ },
3191
+ get defaultActionId() {
3192
+ return props.defaultActionId ?? "comment";
3193
+ },
3194
+ get onSetDefaultAction() {
3195
+ return props.onSetDefaultAction ?? (() => {});
3196
+ },
3197
+ get onDismiss() {
3198
+ return props.onToolbarMenuDismiss ?? (() => {});
3199
+ }
3200
+ })
3201
+ ];
3202
+ };
3203
+
3204
+ //#endregion
3205
+ export { ReactGrabRenderer };