@seekbuddy/dsh-ui 0.2.0-beta.0 → 0.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +1 -1
  3. package/README.zh.md +1 -1
  4. package/THIRD_PARTY_NOTICES.md +1 -1
  5. package/UPSTREAM.md +7 -4
  6. package/dist/blocks.js +170 -135
  7. package/dist/chunks/{chunk-VIH56PDF.js → chunk-6SGSJ5KW.js} +2 -2
  8. package/dist/chunks/{chunk-QJKAQ6PO.js → chunk-7NH2UOZO.js} +2 -2
  9. package/dist/chunks/{chunk-KETGFAOH.js → chunk-7SKW4S35.js} +2 -2
  10. package/dist/chunks/chunk-ENKPNYOB.js +26 -0
  11. package/dist/chunks/{chunk-WUL523OW.js → chunk-EWAZFWLW.js} +1 -1
  12. package/dist/chunks/{chunk-5JXG4BHW.js → chunk-FFJ6TCCF.js} +1 -1
  13. package/dist/chunks/{chunk-R6AUJQ3G.js → chunk-FZXK4LTI.js} +1 -1
  14. package/dist/chunks/chunk-JA3XDLIA.js +1115 -0
  15. package/dist/chunks/{chunk-TUK6UGXM.js → chunk-L7XALG4J.js} +1 -1
  16. package/dist/chunks/{chunk-AY44MQMD.js → chunk-OCAQFVT3.js} +180 -60
  17. package/dist/chunks/{chunk-CI73NXA5.js → chunk-RAXDA2PT.js} +4 -4
  18. package/dist/chunks/{chunk-5XDVPALS.js → chunk-SN6RSUWC.js} +1 -1
  19. package/dist/chunks/{chunk-CTQPGUZP.js → chunk-SNVSQWCU.js} +1 -1
  20. package/dist/chunks/{chunk-ZZNL5PWF.js → chunk-SO3DCAWG.js} +2 -2
  21. package/dist/chunks/{chunk-IOBKTEKP.js → chunk-UAEFKTV3.js} +1 -1
  22. package/dist/chunks/{chunk-NE62SYOZ.js → chunk-UGEORMLD.js} +2 -2
  23. package/dist/chunks/{chunk-TQU54HSM.js → chunk-W6FLI3AK.js} +1 -1
  24. package/dist/chunks/{chunk-TZ7HRE6D.js → chunk-WX46TSKP.js} +1 -1
  25. package/dist/chunks/{chunk-XX6MSZLS.js → chunk-XL33IPCV.js} +1 -1
  26. package/dist/chunks/chunk-XW4L4ZGL.js +967 -0
  27. package/dist/chunks/chunk-YOBY6PSL.js +850 -0
  28. package/dist/icons.js +58 -2
  29. package/dist/index.js +810 -317
  30. package/dist/markdown.js +84 -7
  31. package/dist/meta.json +1038 -339
  32. package/dist/root-inputs.json +20 -1
  33. package/dist/seekbuddy-card.js +1 -1
  34. package/dist/seekbuddy-empty.js +2 -2
  35. package/dist/seekbuddy-internal/Message.js +2 -2
  36. package/dist/seekbuddy-internal/Pagination.js +1 -1
  37. package/dist/seekbuddy-internal/StatusBadge.js +1 -1
  38. package/dist/seekbuddy-internal/Switch.js +1 -1
  39. package/dist/seekbuddy-internal/Upload.js +1 -1
  40. package/dist/seekbuddy-internal/date/Calendar.js +1 -1
  41. package/dist/seekbuddy-internal/date/DatePicker.js +2 -2
  42. package/dist/seekbuddy-internal/date/DateRangePicker.js +2 -2
  43. package/dist/seekbuddy-internal/date/TimePicker.js +1 -1
  44. package/dist/seekbuddy-internal/date/fields.js +5 -5
  45. package/dist/seekbuddy-spinner.js +1 -1
  46. package/dist/seekbuddy-tabs.js +1 -1
  47. package/dist/seekbuddy-timeline.js +2 -2
  48. package/dist/seekbuddy.js +15 -15
  49. package/dist/tokens.css +60 -20
  50. package/dist/types/AnimatedRows.d.ts +45 -0
  51. package/dist/types/Button.d.ts +1 -1
  52. package/dist/types/CommandText.d.ts +15 -0
  53. package/dist/types/DetailDocument.d.ts +77 -0
  54. package/dist/types/DisclosureRow.d.ts +4 -2
  55. package/dist/types/DraggableImage.d.ts +18 -0
  56. package/dist/types/HoverCard.d.ts +11 -3
  57. package/dist/types/HoverCardGroup.d.ts +24 -0
  58. package/dist/types/ImageLightbox.d.ts +4 -1
  59. package/dist/types/InlineEditor.d.ts +22 -0
  60. package/dist/types/Menu.d.ts +30 -9
  61. package/dist/types/MenuSurface.d.ts +9 -0
  62. package/dist/types/PermissionIcon.d.ts +12 -0
  63. package/dist/types/QuotePreview.d.ts +23 -0
  64. package/dist/types/SegmentedTabs.d.ts +3 -1
  65. package/dist/types/TerminalBlock.d.ts +10 -2
  66. package/dist/types/Tooltip.d.ts +21 -15
  67. package/dist/types/UserMessageBubble.d.ts +10 -0
  68. package/dist/types/ZoomControls.d.ts +26 -0
  69. package/dist/types/blocks.d.ts +2 -0
  70. package/dist/types/document-zoom.d.ts +16 -0
  71. package/dist/types/file-drag-actions.d.ts +36 -0
  72. package/dist/types/focus.d.ts +7 -0
  73. package/dist/types/icons/artwork.d.ts +421 -0
  74. package/dist/types/icons/index.d.ts +205 -192
  75. package/dist/types/icons/shared-artwork.d.ts +6 -12
  76. package/dist/types/icons.d.ts +1 -1
  77. package/dist/types/image-drag.d.ts +16 -0
  78. package/dist/types/index.d.ts +21 -3
  79. package/dist/types/markdown/MarkdownDelegate.d.ts +26 -3
  80. package/dist/types/markdown/MarkdownText.d.ts +12 -5
  81. package/dist/types/markdown/file-link.d.ts +13 -3
  82. package/dist/types/markdown/highlight.d.ts +22 -0
  83. package/dist/types/markdown/quote-text.d.ts +7 -0
  84. package/dist/types/markdown/render.d.ts +9 -4
  85. package/dist/types/markdown/windows-path-destinations.d.ts +10 -0
  86. package/dist/types/markdown.d.ts +5 -2
  87. package/dist/types/overlay-top-margin.d.ts +9 -2
  88. package/dist/types/tooltip-placement.d.ts +34 -0
  89. package/dist/types/use-clipboard-copy.d.ts +13 -0
  90. package/dist/types/useAnchoredPosition.d.ts +22 -22
  91. package/dist/types/useRowDragPreview.d.ts +19 -0
  92. package/dist/types/user-text.d.ts +26 -31
  93. package/package.json +2 -2
  94. package/dist/chunks/chunk-3HCOU44R.js +0 -697
  95. package/dist/chunks/chunk-LA3QDZYN.js +0 -2777
  96. package/dist/chunks/chunk-OQPH36OI.js +0 -754
  97. package/dist/types/use-copy-feedback.d.ts +0 -13
@@ -0,0 +1,1115 @@
1
+ import {
2
+ IconCheckOutlineRegular,
3
+ IconCloseOutlineRegular
4
+ } from "./chunk-XW4L4ZGL.js";
5
+
6
+ // src/StateDot.tsx
7
+ import clsx from "clsx";
8
+
9
+ // .build/css/StateDot.module.mjs
10
+ var id = "@seekbuddy/dsh-ui/StateDot.module.css";
11
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id + '"]')) {
12
+ const element = document.createElement("style");
13
+ element.setAttribute("data-dsh-ui-primitives", id);
14
+ element.textContent = '.vSoTLq_dot{flex:none;display:inline-block;position:relative}.vSoTLq_dot:after{content:"";corner-shape:round;background:currentColor;border-radius:50%;position:absolute;inset:20%}.vSoTLq_dot[data-state=done]{color:var(--dsw-alias-state-success-primary)}.vSoTLq_dot[data-state=warning]{color:var(--dsw-alias-state-warn-primary)}.vSoTLq_dot[data-state=error]{color:var(--dsw-alias-state-error-primary)}.vSoTLq_dot[data-state=idle]{color:var(--dsw-alias-state-idle-primary)}.vSoTLq_spinner{color:var(--dsw-alias-label-tertiary);flex:none}.vSoTLq_spinnerMotion{transform-origin:50%;animation:1.5s linear infinite vSoTLq_dsh-state-dot-spin}.vSoTLq_spinnerTrack,.vSoTLq_spinnerArc{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round}.vSoTLq_spinnerTrack{opacity:.25}.vSoTLq_spinnerArc{stroke-dasharray:12 150;animation:1.5s ease-in-out infinite vSoTLq_dsh-state-dot-dash}@keyframes vSoTLq_dsh-state-dot-spin{to{transform:rotate(360deg)}}@keyframes vSoTLq_dsh-state-dot-dash{0%{stroke-dasharray:12 150;stroke-dashoffset:0}50%{stroke-dasharray:24 150;stroke-dashoffset:-6px}to{stroke-dasharray:12 150;stroke-dashoffset:0}}@media (prefers-reduced-motion:reduce){.vSoTLq_spinnerMotion,.vSoTLq_spinnerArc{animation:none}.vSoTLq_spinnerArc{stroke-dasharray:18 150;stroke-dashoffset:-3px}}.vSoTLq_step{box-sizing:border-box;corner-shape:round;border:1.5px solid var(--dsw-alias-label-tertiary);color:var(--dsw-alias-label-primary-foreground);border-radius:50%;flex:none;justify-content:center;align-items:center;display:inline-flex}.vSoTLq_step[data-state=done]{border-color:var(--dsw-alias-state-success-primary);background:var(--dsw-alias-state-success-primary)}.vSoTLq_step[data-state=error]{border-color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-state-error-primary)}.vSoTLq_step[data-state=warning]{border-color:var(--dsw-alias-state-warn-primary)}';
15
+ document.head.appendChild(element);
16
+ }
17
+ var StateDot_module_default = { "spinnerMotion": "vSoTLq_spinnerMotion", "dsh-state-dot-spin": "vSoTLq_dsh-state-dot-spin", "dsh-state-dot-dash": "vSoTLq_dsh-state-dot-dash", "spinnerTrack": "vSoTLq_spinnerTrack", "dot": "vSoTLq_dot", "spinner": "vSoTLq_spinner", "spinnerArc": "vSoTLq_spinnerArc", "step": "vSoTLq_step" };
18
+
19
+ // src/StateDot.tsx
20
+ import { jsx, jsxs } from "react/jsx-runtime";
21
+ function syncSpinner(element) {
22
+ if (element === null) return;
23
+ pinSpinner(element);
24
+ element.addEventListener("animationstart", () => {
25
+ pinSpinner(element);
26
+ });
27
+ }
28
+ function pinSpinner(element) {
29
+ const spinner = element;
30
+ for (const animation of spinner.getAnimations?.({ subtree: true }) ?? []) animation.startTime = 0;
31
+ }
32
+ function StateDot({
33
+ state,
34
+ size,
35
+ className,
36
+ appearance = "dot"
37
+ }) {
38
+ const edge = size ?? (state === "ongoing" ? 14 : 10);
39
+ if (state === "ongoing") {
40
+ return /* @__PURE__ */ jsx(
41
+ "svg",
42
+ {
43
+ ref: syncSpinner,
44
+ className: clsx(StateDot_module_default.spinner, className),
45
+ "data-state": "ongoing",
46
+ width: edge,
47
+ height: edge,
48
+ viewBox: "0 0 24 24",
49
+ "aria-hidden": "true",
50
+ children: /* @__PURE__ */ jsxs("g", { className: StateDot_module_default.spinnerMotion, children: [
51
+ /* @__PURE__ */ jsx("circle", { className: StateDot_module_default.spinnerTrack, cx: "12", cy: "12", r: "9.5" }),
52
+ /* @__PURE__ */ jsx("circle", { className: StateDot_module_default.spinnerArc, cx: "12", cy: "12", r: "9.5" })
53
+ ] })
54
+ }
55
+ );
56
+ }
57
+ return /* @__PURE__ */ jsx(
58
+ "span",
59
+ {
60
+ className: clsx(appearance === "step" ? StateDot_module_default.step : StateDot_module_default.dot, className),
61
+ "data-state": state,
62
+ style: { width: edge, height: edge },
63
+ "aria-hidden": "true",
64
+ children: appearance === "step" && state === "done" && /* @__PURE__ */ jsx(IconCheckOutlineRegular, { size: edge - 2 })
65
+ }
66
+ );
67
+ }
68
+
69
+ // .build/css/ShortcutKeys.module.mjs
70
+ var id2 = "@seekbuddy/dsh-ui/ShortcutKeys.module.css";
71
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id2 + '"]')) {
72
+ const element = document.createElement("style");
73
+ element.setAttribute("data-dsh-ui-primitives", id2);
74
+ element.textContent = ".dF9bOG_keys{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;align-items:center;gap:3px;font-size:12px;line-height:16px;display:inline-flex}.dF9bOG_key{box-sizing:border-box;font:inherit;justify-content:center;align-items:center;display:inline-flex}.dF9bOG_tooltip{color:inherit;gap:2px;font-size:11px;line-height:14px}.dF9bOG_tooltip .dF9bOG_key{background:var(--dsw-alias-tooltip-key-bg);border:0;border-radius:4px;min-width:16px;height:16px;padding:0 2px}.dF9bOG_separator{font:inherit}.dF9bOG_joined{box-sizing:border-box;background:var(--dsw-alias-tooltip-key-bg);border-radius:4px;height:16px;padding:0 4px}.dF9bOG_joined .dF9bOG_key{background:0 0;border:0;min-width:0;height:auto;padding:0}";
75
+ document.head.appendChild(element);
76
+ }
77
+ var ShortcutKeys_module_default = { "joined": "dF9bOG_joined", "keys": "dF9bOG_keys", "key": "dF9bOG_key", "separator": "dF9bOG_separator", "tooltip": "dF9bOG_tooltip" };
78
+
79
+ // src/ShortcutKeys.tsx
80
+ import clsx2 from "clsx";
81
+ import { jsx as jsx2 } from "react/jsx-runtime";
82
+ function ShortcutKeys({
83
+ keys,
84
+ variant = "plain",
85
+ className
86
+ }) {
87
+ return /* @__PURE__ */ jsx2(
88
+ "span",
89
+ {
90
+ className: clsx2(
91
+ ShortcutKeys_module_default.keys,
92
+ variant === "tooltip" && ShortcutKeys_module_default.tooltip,
93
+ variant === "tooltip" && keys.includes("+") && ShortcutKeys_module_default.joined,
94
+ className
95
+ ),
96
+ children: keys.map((key, index) => /* @__PURE__ */ jsx2("kbd", { className: key === "+" ? ShortcutKeys_module_default.separator : ShortcutKeys_module_default.key, children: key }, index))
97
+ }
98
+ );
99
+ }
100
+
101
+ // src/useDismissOnOutsidePointer.ts
102
+ import { useEffect } from "react";
103
+ function useDismissOnOutsidePointer(root, open, setOpen, portal) {
104
+ useEffect(() => {
105
+ if (!open) return;
106
+ const closeOutside = (event) => {
107
+ if (event.target instanceof Node && root.current?.contains(event.target) !== true && portal?.current?.contains(event.target) !== true) {
108
+ setOpen(false);
109
+ }
110
+ };
111
+ document.addEventListener("pointerdown", closeOutside);
112
+ return () => {
113
+ document.removeEventListener("pointerdown", closeOutside);
114
+ };
115
+ }, [root, open, setOpen, portal]);
116
+ }
117
+
118
+ // src/input-modality.ts
119
+ var INPUT_MODALITY = { pointer: "pointer", keyboard: "keyboard" };
120
+ var INPUT_MODALITY_ATTRIBUTE = "data-input-modality";
121
+ var FOCUS_NAVIGATION = /* @__PURE__ */ new Set(["Tab", "Home", "End", "PageUp", "PageDown"]);
122
+ var pointer = false;
123
+ var pointerOwnsFocus = false;
124
+ var keyFocusOrigin;
125
+ function publish() {
126
+ document.documentElement.setAttribute(
127
+ INPUT_MODALITY_ATTRIBUTE,
128
+ pointerOwnsFocus ? INPUT_MODALITY.pointer : INPUT_MODALITY.keyboard
129
+ );
130
+ }
131
+ function pointerModality() {
132
+ return pointer;
133
+ }
134
+ if (typeof window !== "undefined") {
135
+ window.addEventListener(
136
+ "pointerdown",
137
+ () => {
138
+ pointer = true;
139
+ pointerOwnsFocus = true;
140
+ keyFocusOrigin = void 0;
141
+ publish();
142
+ },
143
+ true
144
+ );
145
+ window.addEventListener(
146
+ "keydown",
147
+ (event) => {
148
+ pointer = false;
149
+ if (event.isComposing) {
150
+ keyFocusOrigin = void 0;
151
+ return;
152
+ }
153
+ keyFocusOrigin = event.composedPath()[0];
154
+ if (!FOCUS_NAVIGATION.has(event.key) && !event.key.startsWith("Arrow")) return;
155
+ pointerOwnsFocus = false;
156
+ publish();
157
+ },
158
+ true
159
+ );
160
+ window.addEventListener(
161
+ "focusin",
162
+ (event) => {
163
+ if (keyFocusOrigin === void 0 || event.composedPath()[0] === keyFocusOrigin) return;
164
+ keyFocusOrigin = void 0;
165
+ if (!pointerOwnsFocus) return;
166
+ pointerOwnsFocus = false;
167
+ publish();
168
+ },
169
+ true
170
+ );
171
+ window.addEventListener("blur", () => {
172
+ keyFocusOrigin = void 0;
173
+ });
174
+ }
175
+
176
+ // src/Tooltip.tsx
177
+ import * as React from "react";
178
+ import { cloneElement, useCallback, useContext, useEffect as useEffect2, useId, useRef, useState } from "react";
179
+ import { createPortal } from "react-dom";
180
+
181
+ // src/tooltip-placement.ts
182
+ var opposite = { right: "left", left: "right", top: "bottom", bottom: "top" };
183
+ function placeTooltip(input) {
184
+ const { anchor, viewportWidth, viewportHeight, side, align, gap } = input;
185
+ let { width, height } = input;
186
+ const margin = 12;
187
+ const maxWidth = Math.max(0, viewportWidth - margin * 2);
188
+ const maxHeight = Math.max(0, viewportHeight - margin * 2);
189
+ width = Math.min(width, maxWidth);
190
+ height = Math.min(height, maxHeight);
191
+ const clampX = (x) => Math.max(margin, Math.min(x, viewportWidth - margin - width));
192
+ const clampY = (y) => Math.max(margin, Math.min(y, viewportHeight - margin - height));
193
+ const horizontal = side === "right" || side === "left";
194
+ const candidates = [
195
+ side,
196
+ opposite[side],
197
+ ...horizontal ? ["bottom", "top"] : ["right", "left"]
198
+ ];
199
+ const positions = {
200
+ right: { left: anchor.right + 10, top: clampY((anchor.top + anchor.bottom - height) / 2) },
201
+ left: { left: anchor.left - 10 - width, top: clampY((anchor.top + anchor.bottom - height) / 2) },
202
+ bottom: {
203
+ left: clampX(align === "end" ? anchor.right - width : (anchor.left + anchor.right - width) / 2),
204
+ top: anchor.bottom + gap
205
+ },
206
+ top: {
207
+ left: clampX(align === "end" ? anchor.right - width : (anchor.left + anchor.right - width) / 2),
208
+ top: anchor.top - gap - height
209
+ }
210
+ };
211
+ for (const candidate of candidates) {
212
+ const position2 = positions[candidate];
213
+ if (position2.left >= margin && position2.top >= margin && position2.left + width <= viewportWidth - margin && position2.top + height <= viewportHeight - margin) {
214
+ return { ...position2, side: candidate, width, height, overflow: false };
215
+ }
216
+ }
217
+ const position = positions[side];
218
+ return { left: clampX(position.left), top: clampY(position.top), side, width, height, overflow: true };
219
+ }
220
+
221
+ // .build/css/Tooltip.module.mjs
222
+ var id3 = "@seekbuddy/dsh-ui/Tooltip.module.css";
223
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id3 + '"]')) {
224
+ const element = document.createElement("style");
225
+ element.setAttribute("data-dsh-ui-primitives", id3);
226
+ element.textContent = ".pspLTa_bubble{z-index:100;box-sizing:border-box;border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-tooltip-bg);width:max-content;max-width:min(50vw,100vw - 24px);max-height:calc(100vh - 24px);color:var(--dsw-static-neutral-bluish-00);white-space:pre-line;overflow-wrap:break-word;pointer-events:none;animation:pspLTa_tooltip-in .15s var(--ds-ease-in-out);align-items:safe center;gap:8px;padding:3px 7px;font-size:13px;line-height:20px;display:inline-flex;position:fixed;overflow:auto}.pspLTa_bubble[data-portal]{z-index:1100}.pspLTa_bubble[data-pinned]{pointer-events:auto}.pspLTa_label{min-width:0}.pspLTa_bubble[data-has-shortcut]{padding-inline-end:5px}.pspLTa_bubble[data-has-shortcut]:not(:has(.pspLTa_label)){padding:3px}.pspLTa_bubble[data-side=right],.pspLTa_bubble[data-side=left]{transform:translateY(-50%)}.pspLTa_bubble[data-side=bottom]{transform:translate(-50%)}.pspLTa_bubble[data-side=top]{transform:translate(-50%,-100%)}.pspLTa_bubble[data-side=bottom][data-align=end]{transform:translate(-100%)}.pspLTa_bubble[data-side=top][data-align=end]{transform:translate(-100%,-100%)}@keyframes pspLTa_tooltip-in{0%{opacity:0}}@media (prefers-reduced-motion:reduce){.pspLTa_bubble{animation:none}}";
227
+ document.head.appendChild(element);
228
+ }
229
+ var Tooltip_module_default = { "bubble": "pspLTa_bubble", "tooltip-in": "pspLTa_tooltip-in", "label": "pspLTa_label" };
230
+
231
+ // src/Tooltip.tsx
232
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
233
+ var TooltipSuppression = typeof React.createContext === "function" ? React.createContext(null) : null;
234
+ function clipped(anchor) {
235
+ return [anchor, ...anchor.querySelectorAll("*")].some(
236
+ (el) => el instanceof HTMLElement && el.scrollWidth > el.clientWidth
237
+ );
238
+ }
239
+ function Tooltip({
240
+ label,
241
+ shortcutKeys,
242
+ side = "right",
243
+ align = "center",
244
+ delayMs = 0,
245
+ focusDelayMs = 0,
246
+ gap = 8,
247
+ disabled = false,
248
+ portal = false,
249
+ maxWidth,
250
+ openOnClick = false,
251
+ onlyWhenClipped = false,
252
+ children
253
+ }) {
254
+ const id7 = useId();
255
+ const [pinned, setPinned] = useState(false);
256
+ const anchor = useRef(null);
257
+ const childRef = children.ref;
258
+ const mergedRef = useCallback(
259
+ (el) => {
260
+ anchor.current = el;
261
+ if (typeof childRef === "function") childRef(el);
262
+ else if (childRef != null) childRef.current = el;
263
+ },
264
+ [childRef]
265
+ );
266
+ const [pos, setPos] = useState(null);
267
+ const bubble = useRef(null);
268
+ const resolvedLabel = pos === null ? null : typeof label === "function" ? label() : label;
269
+ const showTimer = useRef(null);
270
+ const triggers = useRef({ hover: false, focus: false });
271
+ const suppressAncestors = useContext(TooltipSuppression);
272
+ const [suppressed, setSuppressed] = useState(false);
273
+ const announce = useCallback(
274
+ (active) => {
275
+ suppressAncestors?.(active);
276
+ },
277
+ [suppressAncestors]
278
+ );
279
+ const visible = pos !== null && !disabled;
280
+ useEffect2(() => {
281
+ const el = bubble.current;
282
+ if (pos === null || !visible || suppressed || el === null) return;
283
+ let size;
284
+ let anchorRect = pos;
285
+ const fit = () => {
286
+ if (size === void 0) return;
287
+ const placement = placeTooltip({
288
+ anchor: anchorRect,
289
+ width: size.inlineSize,
290
+ height: size.blockSize,
291
+ viewportWidth: window.innerWidth,
292
+ viewportHeight: window.innerHeight,
293
+ side,
294
+ align,
295
+ gap
296
+ });
297
+ const horizontal = placement.side === "right" || placement.side === "left";
298
+ const offsetX = horizontal ? 0 : align === "end" ? placement.width : placement.width / 2;
299
+ const offsetY = horizontal ? placement.height / 2 : placement.side === "top" ? placement.height : 0;
300
+ el.style.left = `${placement.left + offsetX}px`;
301
+ el.style.top = `${placement.top + offsetY}px`;
302
+ el.dataset.side = placement.side;
303
+ el.style.visibility = "visible";
304
+ };
305
+ const onResize = () => {
306
+ if (anchor.current !== null) anchorRect = anchor.current.getBoundingClientRect();
307
+ fit();
308
+ };
309
+ const observer = new ResizeObserver((entries) => {
310
+ size = entries[0]?.borderBoxSize[0];
311
+ fit();
312
+ });
313
+ observer.observe(el, { box: "border-box" });
314
+ window.addEventListener("resize", onResize);
315
+ return () => {
316
+ observer.disconnect();
317
+ window.removeEventListener("resize", onResize);
318
+ };
319
+ }, [align, gap, pos, side, suppressed, visible]);
320
+ useEffect2(() => {
321
+ announce(visible);
322
+ return () => {
323
+ announce(false);
324
+ };
325
+ }, [announce, visible]);
326
+ const cancelShow = useCallback(() => {
327
+ if (showTimer.current === null) return;
328
+ clearTimeout(showTimer.current);
329
+ showTimer.current = null;
330
+ }, []);
331
+ useEffect2(() => {
332
+ if (pinned && (disabled || !openOnClick)) setPinned(false);
333
+ if (disabled) {
334
+ cancelShow();
335
+ triggers.current = { hover: false, focus: false };
336
+ setPos(null);
337
+ }
338
+ return cancelShow;
339
+ }, [cancelShow, disabled, openOnClick, pinned]);
340
+ const show = () => {
341
+ if (disabled) return;
342
+ const el = anchor.current;
343
+ if (el === null) return;
344
+ if (onlyWhenClipped && !clipped(el)) return;
345
+ setPos(el.getBoundingClientRect());
346
+ announce(true);
347
+ };
348
+ const showAfterDelay = (delay) => {
349
+ cancelShow();
350
+ if (delay <= 0) {
351
+ show();
352
+ return;
353
+ }
354
+ showTimer.current = setTimeout(() => {
355
+ showTimer.current = null;
356
+ show();
357
+ }, delay);
358
+ };
359
+ const withdraw = useCallback(() => {
360
+ setPinned(false);
361
+ setPos(null);
362
+ announce(false);
363
+ }, [announce]);
364
+ const hide = () => {
365
+ cancelShow();
366
+ if (!triggers.current.hover && !triggers.current.focus && !pinned) withdraw();
367
+ };
368
+ const dismiss = useCallback(() => {
369
+ cancelShow();
370
+ triggers.current = { hover: false, focus: false };
371
+ withdraw();
372
+ }, [cancelShow, withdraw]);
373
+ useDismissOnOutsidePointer(anchor, openOnClick && visible, dismiss, bubble);
374
+ useEffect2(() => {
375
+ if (!openOnClick || !visible) return;
376
+ const onKeyDown = (event) => {
377
+ if (event.key !== "Escape" && event.key !== "Tab") return;
378
+ if (event.key === "Escape") {
379
+ event.preventDefault();
380
+ event.stopPropagation();
381
+ }
382
+ dismiss();
383
+ };
384
+ document.addEventListener("keydown", onKeyDown, true);
385
+ return () => {
386
+ document.removeEventListener("keydown", onKeyDown, true);
387
+ };
388
+ }, [dismiss, openOnClick, visible]);
389
+ const content = visible && !suppressed && /* @__PURE__ */ jsxs2(
390
+ "span",
391
+ {
392
+ ref: bubble,
393
+ id: openOnClick ? id7 : void 0,
394
+ className: Tooltip_module_default.bubble,
395
+ "data-side": side,
396
+ "data-portal": portal || void 0,
397
+ "data-pinned": pinned || void 0,
398
+ "data-align": align,
399
+ "data-has-shortcut": shortcutKeys?.length ? true : void 0,
400
+ style: {
401
+ left: pos.left,
402
+ top: pos.top,
403
+ visibility: "hidden",
404
+ ...maxWidth === void 0 ? {} : { maxWidth: `min(${maxWidth}px, calc(100vw - 24px))` }
405
+ },
406
+ role: "tooltip",
407
+ "aria-label": shortcutKeys?.length ? [resolvedLabel, shortcutKeys.join(" ")].filter(Boolean).join(" ") : void 0,
408
+ children: [
409
+ resolvedLabel && /* @__PURE__ */ jsx3("span", { className: Tooltip_module_default.label, children: resolvedLabel }),
410
+ shortcutKeys !== void 0 && shortcutKeys.length > 0 && /* @__PURE__ */ jsx3(ShortcutKeys, { keys: shortcutKeys, variant: "tooltip" })
411
+ ]
412
+ }
413
+ );
414
+ return /* @__PURE__ */ jsxs2(TooltipSuppression.Provider, { value: setSuppressed, children: [
415
+ cloneElement(children, {
416
+ ref: mergedRef,
417
+ "aria-describedby": openOnClick && visible ? [children.props["aria-describedby"], id7].filter(Boolean).join(" ") : children.props["aria-describedby"],
418
+ onPointerEnter: (e) => {
419
+ children.props.onPointerEnter?.(e);
420
+ if (e.pointerType === "touch") return;
421
+ if (e.pointerType === "mouse" && !window.matchMedia("(any-hover: hover)").matches) return;
422
+ triggers.current.hover = true;
423
+ showAfterDelay(delayMs);
424
+ },
425
+ onPointerLeave: (e) => {
426
+ children.props.onPointerLeave?.(e);
427
+ triggers.current.hover = false;
428
+ cancelShow();
429
+ if (!pinned) withdraw();
430
+ },
431
+ onPointerDown: (e) => {
432
+ children.props.onPointerDown?.(e);
433
+ if (e.pointerType === "touch" && !pinned) dismiss();
434
+ },
435
+ // Activating an ordinary action dismisses the bubble: it often changes
436
+ // what the anchor now does (pin → unpin), and the click leaves the
437
+ // anchor focused, which would otherwise pin the relabelled bubble up.
438
+ onClick: (e) => {
439
+ children.props.onClick?.(e);
440
+ triggers.current.focus = false;
441
+ cancelShow();
442
+ if (openOnClick && !disabled && !pinned) {
443
+ setPinned(true);
444
+ show();
445
+ } else withdraw();
446
+ },
447
+ onFocus: (e) => {
448
+ children.props.onFocus?.(e);
449
+ if (pointerModality()) return;
450
+ triggers.current.focus = true;
451
+ showAfterDelay(focusDelayMs);
452
+ },
453
+ onBlur: (e) => {
454
+ children.props.onBlur?.(e);
455
+ triggers.current.focus = false;
456
+ hide();
457
+ }
458
+ }),
459
+ portal ? content !== false && createPortal(content, document.body) : content
460
+ ] });
461
+ }
462
+
463
+ // src/clipboard.ts
464
+ async function writeClipboard(text) {
465
+ if (navigator.clipboard?.writeText) {
466
+ try {
467
+ await navigator.clipboard.writeText(text);
468
+ return true;
469
+ } catch {
470
+ return false;
471
+ }
472
+ }
473
+ const exec = typeof document.execCommand === "function" ? document.execCommand.bind(document) : void 0;
474
+ if (exec === void 0) return false;
475
+ const el = document.createElement("textarea");
476
+ el.value = text;
477
+ el.setAttribute("readonly", "");
478
+ el.style.position = "fixed";
479
+ el.style.left = "-9999px";
480
+ document.body.appendChild(el);
481
+ el.select();
482
+ try {
483
+ return exec("copy");
484
+ } catch {
485
+ return false;
486
+ } finally {
487
+ el.remove();
488
+ }
489
+ }
490
+
491
+ // src/HoverCardGroup.tsx
492
+ import { createContext as createContext2, useState as useState2 } from "react";
493
+ import { jsx as jsx4 } from "react/jsx-runtime";
494
+ var HoverCardGroupContext = createContext2(null);
495
+ function HoverCardGroup({
496
+ children,
497
+ className,
498
+ as: Container = "div"
499
+ }) {
500
+ const [group] = useState2(() => {
501
+ let pointer2 = "outside";
502
+ let warm = false;
503
+ let active = null;
504
+ return {
505
+ isWarm: () => warm,
506
+ enter: (overCard) => {
507
+ pointer2 = overCard ? "card" : "list";
508
+ if (overCard) warm = true;
509
+ },
510
+ leave: () => {
511
+ pointer2 = "outside";
512
+ if (active === null) warm = false;
513
+ },
514
+ containsCard: (target) => target instanceof Node && active !== null && active.element.contains(target),
515
+ shown: (owner, dismiss, element) => {
516
+ if (pointer2 === "card") {
517
+ pointer2 = "outside";
518
+ warm = false;
519
+ }
520
+ if (pointer2 === "list") warm = true;
521
+ const previous = active;
522
+ active = { owner, dismiss, element };
523
+ if (previous !== null && previous.owner !== owner) previous.dismiss();
524
+ },
525
+ release: (owner) => {
526
+ if (active?.owner !== owner) return;
527
+ active = null;
528
+ if (pointer2 !== "list") {
529
+ pointer2 = "outside";
530
+ warm = false;
531
+ }
532
+ }
533
+ };
534
+ });
535
+ return /* @__PURE__ */ jsx4(HoverCardGroupContext.Provider, { value: group, children: /* @__PURE__ */ jsx4(
536
+ Container,
537
+ {
538
+ className,
539
+ onPointerOverCapture: (event) => {
540
+ const overCard = group.containsCard(event.target);
541
+ if (event.currentTarget.contains(event.target) || overCard) group.enter(overCard);
542
+ },
543
+ onPointerOutCapture: (event) => {
544
+ const fromGroup = event.currentTarget.contains(event.target) || group.containsCard(event.target);
545
+ const intoGroup = event.relatedTarget instanceof Node && event.currentTarget.contains(event.relatedTarget) || group.containsCard(event.relatedTarget);
546
+ if (fromGroup && !intoGroup) group.leave();
547
+ },
548
+ children
549
+ }
550
+ ) });
551
+ }
552
+
553
+ // src/HoverCard.tsx
554
+ import { useCallback as useCallback3, useContext as useContext2, useEffect as useEffect4, useLayoutEffect, useRef as useRef3, useState as useState3 } from "react";
555
+ import clsx3 from "clsx";
556
+ import { createPortal as createPortal2 } from "react-dom";
557
+
558
+ // src/pointer-grace.ts
559
+ import { useCallback as useCallback2, useEffect as useEffect3, useRef as useRef2 } from "react";
560
+ var POINTER_GRACE_MS = 200;
561
+ function usePointerGrace(close) {
562
+ const timerRef = useRef2(null);
563
+ const closeRef = useRef2(close);
564
+ closeRef.current = close;
565
+ const cancel = useCallback2(() => {
566
+ if (timerRef.current === null) return;
567
+ clearTimeout(timerRef.current);
568
+ timerRef.current = null;
569
+ }, []);
570
+ const arm = useCallback2(() => {
571
+ cancel();
572
+ timerRef.current = setTimeout(() => {
573
+ timerRef.current = null;
574
+ closeRef.current();
575
+ }, POINTER_GRACE_MS);
576
+ }, [cancel]);
577
+ useEffect3(() => cancel, [cancel]);
578
+ return { arm, cancel };
579
+ }
580
+
581
+ // src/overlay-top-margin.ts
582
+ function overlayTopMargin(min, anchor, gap = 0) {
583
+ const root = document.documentElement;
584
+ const clearance = Number.parseFloat(getComputedStyle(root).getPropertyValue("--dsh-frame-top-clearance"));
585
+ if (Number.isNaN(clearance)) return min;
586
+ const cap = anchor !== void 0 && anchor.top >= 0 ? anchor.bottom + gap : Number.POSITIVE_INFINITY;
587
+ return Math.max(min, Math.min((root.hasAttribute("data-fullscreen") ? 0 : clearance) + 20, cap));
588
+ }
589
+
590
+ // .build/css/HoverCard.module.mjs
591
+ var id4 = "@seekbuddy/dsh-ui/HoverCard.module.css";
592
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id4 + '"]')) {
593
+ const element = document.createElement("style");
594
+ element.setAttribute("data-dsh-ui-primitives", id4);
595
+ element.textContent = ".LXrvdG_root{display:block;position:relative}.LXrvdG_card{--dsw-hovercard-bg:#2c2c2e;z-index:100;box-sizing:border-box;border-radius:var(--dsw-radius-lg);background:var(--dsw-hovercard-bg);color:#fff;width:244px;box-shadow:var(--dsw-shadow-lv3);padding:12px 16px;position:fixed}.LXrvdG_copyable{cursor:pointer}.LXrvdG_copyable:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:2px}.LXrvdG_feedback{justify-content:center;align-items:center;display:flex}.LXrvdG_copied{color:#fff;text-align:center;font-size:14px;line-height:20px}.LXrvdG_status{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.LXrvdG_preview{border-radius:var(--dsw-radius-lg);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);box-shadow:var(--dsw-elevation-panel);opacity:1;transition:opacity var(--dsh-hover-preview-fade) linear;border:0;flex-direction:column;padding:0;display:flex;overflow:hidden}@starting-style{.LXrvdG_preview{opacity:0}}.LXrvdG_preview[data-closing]{opacity:0;pointer-events:none}@media (prefers-reduced-motion:reduce){.LXrvdG_preview{transition:none}}.LXrvdG_inline{display:inline}.LXrvdG_media{--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter);box-shadow:var(--dsw-elevation-panel);border:0;padding:8px;overflow:auto}.LXrvdG_fitContent{width:max-content}.LXrvdG_portal{display:contents}.LXrvdG_bridge{z-index:100;position:fixed}";
596
+ document.head.appendChild(element);
597
+ }
598
+ var HoverCard_module_default = { "copied": "LXrvdG_copied", "root": "LXrvdG_root", "copyable": "LXrvdG_copyable", "portal": "LXrvdG_portal", "inline": "LXrvdG_inline", "card": "LXrvdG_card", "bridge": "LXrvdG_bridge", "fitContent": "LXrvdG_fitContent", "status": "LXrvdG_status", "media": "LXrvdG_media", "preview": "LXrvdG_preview", "feedback": "LXrvdG_feedback" };
599
+
600
+ // src/HoverCard.tsx
601
+ import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
602
+ var PREVIEW_FADE_MS = 100;
603
+ var PREVIEW_MAX_HEIGHT = 420;
604
+ var PREVIEW_INSET = 24;
605
+ var INLINE_PREVIEW_WIDTH = 300;
606
+ var ANCHOR_GAP = 8;
607
+ var VIEWPORT_MARGIN = 8;
608
+ function HoverCard({
609
+ anchor,
610
+ content,
611
+ openDelayMs = 500,
612
+ disabled = false,
613
+ grouped = false,
614
+ copyText,
615
+ copyLabel,
616
+ copiedLabel,
617
+ variant = "compact",
618
+ widthAnchorRef,
619
+ inline = false,
620
+ fitContent = false
621
+ }) {
622
+ const rootRef = useRef3(null);
623
+ const cardRef = useRef3(null);
624
+ const portalRef = useRef3(null);
625
+ const timerRef = useRef3(null);
626
+ const copyTimerRef = useRef3(null);
627
+ const copyHeightRef = useRef3(null);
628
+ const copyEpochRef = useRef3(0);
629
+ const copyingRef = useRef3(false);
630
+ const mountedRef = useRef3(true);
631
+ const [phase, setPhase] = useState3("closed");
632
+ const open = phase !== "closed";
633
+ const closing = phase === "closing";
634
+ const [pos, setPos] = useState3(null);
635
+ const positioned = pos !== null;
636
+ const [copied, setCopied] = useState3(false);
637
+ const parentGroup = useContext2(HoverCardGroupContext);
638
+ const group = grouped ? parentGroup : null;
639
+ const [groupOwner] = useState3(() => Symbol("hover-card"));
640
+ const clearCopied = useCallback3(() => {
641
+ if (copyTimerRef.current !== null) {
642
+ clearTimeout(copyTimerRef.current);
643
+ copyTimerRef.current = null;
644
+ }
645
+ copyHeightRef.current = null;
646
+ setCopied(false);
647
+ }, []);
648
+ const close = useCallback3(() => {
649
+ copyEpochRef.current += 1;
650
+ clearCopied();
651
+ setPhase((current) => variant === "preview" && current !== "closed" ? "closing" : "closed");
652
+ }, [clearCopied, variant]);
653
+ const { arm: armClose, cancel: cancelClose } = usePointerGrace(close);
654
+ const clearTimer = useCallback3(() => {
655
+ if (timerRef.current !== null) {
656
+ clearTimeout(timerRef.current);
657
+ timerRef.current = null;
658
+ }
659
+ }, []);
660
+ const dismissImmediately = useCallback3(() => {
661
+ clearTimer();
662
+ cancelClose();
663
+ copyEpochRef.current += 1;
664
+ clearCopied();
665
+ setPhase("closed");
666
+ }, [clearTimer, cancelClose, clearCopied]);
667
+ const groupVisible = open && positioned;
668
+ useLayoutEffect(() => {
669
+ if (!groupVisible || group === null) return;
670
+ group.shown(groupOwner, dismissImmediately, portalRef.current);
671
+ return () => {
672
+ group.release(groupOwner);
673
+ };
674
+ }, [group, groupOwner, groupVisible, dismissImmediately]);
675
+ useEffect4(() => {
676
+ if (!closing) return;
677
+ const timer = setTimeout(() => {
678
+ setPhase("closed");
679
+ }, PREVIEW_FADE_MS);
680
+ return () => {
681
+ clearTimeout(timer);
682
+ };
683
+ }, [closing]);
684
+ useEffect4(() => {
685
+ if (!disabled) return;
686
+ clearTimer();
687
+ cancelClose();
688
+ close();
689
+ }, [disabled, cancelClose, close]);
690
+ useEffect4(() => {
691
+ mountedRef.current = true;
692
+ return () => {
693
+ mountedRef.current = false;
694
+ copyEpochRef.current += 1;
695
+ clearTimer();
696
+ if (copyTimerRef.current !== null) {
697
+ clearTimeout(copyTimerRef.current);
698
+ copyTimerRef.current = null;
699
+ }
700
+ };
701
+ }, []);
702
+ useEffect4(() => {
703
+ if (!open || variant !== "preview" && !inline) return;
704
+ const dismiss = (event) => {
705
+ if (event.key !== "Escape") return;
706
+ if (inline) event.stopPropagation();
707
+ clearTimer();
708
+ cancelClose();
709
+ close();
710
+ };
711
+ window.addEventListener("keydown", dismiss, inline);
712
+ return () => {
713
+ window.removeEventListener("keydown", dismiss, inline);
714
+ };
715
+ }, [open, variant, inline, cancelClose, close]);
716
+ useLayoutEffect(() => {
717
+ if (!open) {
718
+ setPos(null);
719
+ return;
720
+ }
721
+ const place = () => {
722
+ const wrapper = rootRef.current;
723
+ if (wrapper === null) return;
724
+ if (wrapper.closest("[inert], [hidden]") !== null) {
725
+ dismissImmediately();
726
+ return;
727
+ }
728
+ const r = wrapper.getBoundingClientRect();
729
+ const h = cardRef.current?.offsetHeight ?? 0;
730
+ if (variant === "preview") {
731
+ const bounds = widthAnchorRef?.current?.getBoundingClientRect() ?? r;
732
+ const width = Math.max(0, Math.min(bounds.width - PREVIEW_INSET * 2, window.innerWidth - VIEWPORT_MARGIN * 2));
733
+ const topMargin = overlayTopMargin(VIEWPORT_MARGIN, r, ANCHOR_GAP);
734
+ const belowTop = Math.max(topMargin, r.bottom + ANCHOR_GAP);
735
+ const above = Math.max(0, r.top - ANCHOR_GAP - topMargin);
736
+ const below = Math.max(0, window.innerHeight - belowTop - VIEWPORT_MARGIN);
737
+ const onTop = above >= Math.min(PREVIEW_MAX_HEIGHT, below);
738
+ const maxHeight = Math.min(PREVIEW_MAX_HEIGHT, onTop ? above : below);
739
+ setPos({
740
+ left: Math.max(
741
+ VIEWPORT_MARGIN,
742
+ Math.min(bounds.left + PREVIEW_INSET, window.innerWidth - width - VIEWPORT_MARGIN)
743
+ ),
744
+ top: onTop ? Math.max(topMargin, r.top - Math.min(h, maxHeight) - ANCHOR_GAP) : belowTop,
745
+ width,
746
+ maxHeight
747
+ });
748
+ return;
749
+ }
750
+ if (inline) {
751
+ const height = Math.max(h, cardRef.current?.scrollHeight ?? 0);
752
+ const maxWidth = Math.max(0, Math.min(INLINE_PREVIEW_WIDTH, window.innerWidth - VIEWPORT_MARGIN * 2));
753
+ const width = fitContent ? Math.min(cardRef.current?.offsetWidth ?? maxWidth, maxWidth) : maxWidth;
754
+ const topMargin = overlayTopMargin(VIEWPORT_MARGIN, r, ANCHOR_GAP);
755
+ const belowTop = Math.max(topMargin, r.bottom + ANCHOR_GAP);
756
+ const above = Math.max(0, r.top - ANCHOR_GAP - topMargin);
757
+ const below = Math.max(0, window.innerHeight - belowTop - VIEWPORT_MARGIN);
758
+ const onTop = height > below && above > below;
759
+ const maxHeight = onTop ? above : below;
760
+ const left = Math.max(VIEWPORT_MARGIN, Math.min(r.left, window.innerWidth - width - VIEWPORT_MARGIN));
761
+ const top2 = onTop ? r.top - ANCHOR_GAP - Math.min(height, maxHeight) : belowTop;
762
+ const bridgeTop = onTop ? top2 + Math.min(height, maxHeight) : r.bottom;
763
+ const bridgeLeft = Math.min(r.left, left);
764
+ setPos({
765
+ left,
766
+ top: top2,
767
+ ...fitContent ? {} : { width },
768
+ maxWidth,
769
+ maxHeight,
770
+ bridge: {
771
+ left: bridgeLeft,
772
+ top: bridgeTop,
773
+ width: Math.max(r.right, left + width) - bridgeLeft,
774
+ height: Math.max(0, (onTop ? r.top : top2) - bridgeTop)
775
+ }
776
+ });
777
+ return;
778
+ }
779
+ const top = r.top + h > window.innerHeight - VIEWPORT_MARGIN ? window.innerHeight - h - VIEWPORT_MARGIN : r.top;
780
+ setPos({ left: r.right + ANCHOR_GAP, top });
781
+ };
782
+ place();
783
+ const visibility = new MutationObserver(place);
784
+ for (let ancestor = rootRef.current?.parentElement; ancestor != null; ancestor = ancestor.parentElement) {
785
+ visibility.observe(ancestor, { attributes: true, attributeFilter: ["inert", "hidden"] });
786
+ }
787
+ const observer = (variant === "preview" || inline) && typeof ResizeObserver !== "undefined" ? new ResizeObserver(place) : null;
788
+ for (const element of [cardRef.current, rootRef.current, widthAnchorRef?.current]) {
789
+ if (element !== null && element !== void 0) observer?.observe(element);
790
+ }
791
+ window.addEventListener("scroll", place, true);
792
+ window.addEventListener("resize", place);
793
+ return () => {
794
+ observer?.disconnect();
795
+ visibility.disconnect();
796
+ window.removeEventListener("scroll", place, true);
797
+ window.removeEventListener("resize", place);
798
+ };
799
+ }, [open, variant, widthAnchorRef, positioned, inline, fitContent, dismissImmediately]);
800
+ useLayoutEffect(() => {
801
+ if (!open || pos === null || variant === "preview" || inline) return;
802
+ const h = cardRef.current?.offsetHeight ?? 0;
803
+ if (pos.top + h > window.innerHeight - VIEWPORT_MARGIN) {
804
+ setPos({ left: pos.left, top: window.innerHeight - h - VIEWPORT_MARGIN });
805
+ }
806
+ }, [open, pos, variant, inline]);
807
+ const copy = async (text) => {
808
+ if (copied || copyingRef.current) return;
809
+ copyingRef.current = true;
810
+ const copyEpoch = copyEpochRef.current;
811
+ const accepted = await writeClipboard(text);
812
+ copyingRef.current = false;
813
+ const card2 = cardRef.current;
814
+ if (!accepted || !mountedRef.current || copyEpoch !== copyEpochRef.current || card2 === null) return;
815
+ const height = card2.offsetHeight;
816
+ copyHeightRef.current = height > 0 ? height : null;
817
+ setCopied(true);
818
+ copyTimerRef.current = setTimeout(clearCopied, 1e3);
819
+ };
820
+ const copyable = copyText !== void 0;
821
+ const dismissFromAnchor = (event) => {
822
+ if (portalRef.current?.contains(event.target)) return;
823
+ clearTimer();
824
+ cancelClose();
825
+ close();
826
+ };
827
+ const card = open && pos !== null && /* @__PURE__ */ jsx5(
828
+ "div",
829
+ {
830
+ ref: cardRef,
831
+ className: clsx3(
832
+ HoverCard_module_default.card,
833
+ variant === "preview" && HoverCard_module_default.preview,
834
+ inline && HoverCard_module_default.media,
835
+ inline && fitContent && HoverCard_module_default.fitContent,
836
+ copyable && HoverCard_module_default.copyable,
837
+ copied && HoverCard_module_default.feedback
838
+ ),
839
+ "data-closing": closing || void 0,
840
+ style: {
841
+ left: pos.left,
842
+ top: pos.top,
843
+ width: pos.width,
844
+ maxWidth: pos.maxWidth,
845
+ maxHeight: pos.maxHeight,
846
+ minHeight: copied && copyHeightRef.current !== null ? copyHeightRef.current : void 0,
847
+ "--dsh-hover-preview-fade": `${PREVIEW_FADE_MS}ms`
848
+ },
849
+ role: copyable ? "button" : void 0,
850
+ tabIndex: copyable ? 0 : void 0,
851
+ "aria-label": copyable ? `${copyLabel}: ${copyText}` : void 0,
852
+ onClick: copyable ? (e) => {
853
+ const selection = window.getSelection();
854
+ if (selection !== null && !selection.isCollapsed) {
855
+ for (let i = 0; i < selection.rangeCount; i += 1) {
856
+ if (selection.getRangeAt(i).intersectsNode(e.currentTarget)) return;
857
+ }
858
+ }
859
+ void copy(copyText);
860
+ } : void 0,
861
+ onKeyDown: copyable ? (e) => {
862
+ if (e.key !== "Enter" && e.key !== " ") return;
863
+ e.preventDefault();
864
+ void copy(copyText);
865
+ } : void 0,
866
+ children: copied ? /* @__PURE__ */ jsx5("span", { className: HoverCard_module_default.copied, "aria-hidden": "true", children: copiedLabel }) : content
867
+ }
868
+ );
869
+ return /* @__PURE__ */ jsxs3(
870
+ "span",
871
+ {
872
+ ref: rootRef,
873
+ className: clsx3(HoverCard_module_default.root, inline && HoverCard_module_default.inline),
874
+ onFocus: inline ? (event) => {
875
+ if (!disabled && event.target.matches(":focus-visible")) {
876
+ cancelClose();
877
+ setPhase("open");
878
+ }
879
+ } : void 0,
880
+ onBlur: inline ? (event) => {
881
+ if (!event.currentTarget.contains(event.relatedTarget)) {
882
+ clearTimer();
883
+ cancelClose();
884
+ close();
885
+ }
886
+ } : void 0,
887
+ onPointerEnter: (event) => {
888
+ if (disabled || event.pointerType === "touch") return;
889
+ if (event.pointerType === "mouse" && !window.matchMedia("(any-hover: hover)").matches) return;
890
+ cancelClose();
891
+ if (open) {
892
+ setPhase("open");
893
+ return;
894
+ }
895
+ clearTimer();
896
+ if (group?.isWarm()) setPhase("open");
897
+ else
898
+ timerRef.current = setTimeout(() => {
899
+ setPhase("open");
900
+ }, openDelayMs);
901
+ },
902
+ onPointerLeave: () => {
903
+ clearTimer();
904
+ if (open) armClose();
905
+ },
906
+ onPointerDownCapture: dismissFromAnchor,
907
+ onClickCapture: dismissFromAnchor,
908
+ children: [
909
+ anchor,
910
+ open && copyable && /* @__PURE__ */ jsx5("span", { className: HoverCard_module_default.status, role: "status", children: copied ? copiedLabel : "" }),
911
+ card !== false && createPortal2(
912
+ /* @__PURE__ */ jsxs3("span", { ref: portalRef, className: HoverCard_module_default.portal, children: [
913
+ pos.bridge !== void 0 && /* @__PURE__ */ jsx5("span", { className: HoverCard_module_default.bridge, style: pos.bridge, "data-hovercard-bridge": "", "aria-hidden": true }),
914
+ card
915
+ ] }),
916
+ document.body
917
+ )
918
+ ]
919
+ }
920
+ );
921
+ }
922
+
923
+ // src/DraggableImage.tsx
924
+ import { forwardRef } from "react";
925
+
926
+ // src/image-drag.ts
927
+ import {
928
+ useCallback as useCallback4,
929
+ useEffect as useEffect5,
930
+ useMemo,
931
+ useRef as useRef4
932
+ } from "react";
933
+ function useImageDrag(actions, src, name, original, resourceAddress) {
934
+ const source = useMemo(
935
+ () => original === void 0 ? { kind: "url", url: src, name, mediaType: "", resourceAddress } : { kind: "blob", blob: original, name, mediaType: original.type, resourceAddress },
936
+ [src, name, original, resourceAddress]
937
+ );
938
+ const state = useRef4();
939
+ const dragged = useRef4(false);
940
+ const release = useCallback4(() => {
941
+ const previous = state.current;
942
+ state.current = void 0;
943
+ previous?.abort.abort();
944
+ previous?.prepared?.release();
945
+ }, []);
946
+ useEffect5(() => release, [release, source, actions]);
947
+ const prepare = useCallback4(
948
+ (image) => {
949
+ if (src === "" || state.current !== void 0) return;
950
+ const current = { abort: new AbortController(), failed: false };
951
+ state.current = current;
952
+ window.addEventListener(
953
+ "pointerup",
954
+ (event) => {
955
+ if (event.target !== image) release();
956
+ },
957
+ { signal: current.abort.signal }
958
+ );
959
+ window.addEventListener("blur", release, { once: true, signal: current.abort.signal });
960
+ void actions.prepare(source, current.abort.signal).then(
961
+ (prepared) => {
962
+ if (current.abort.signal.aborted) prepared.release();
963
+ else current.prepared = prepared;
964
+ },
965
+ (_error) => {
966
+ current.failed = true;
967
+ }
968
+ );
969
+ },
970
+ [src, actions, source, release]
971
+ );
972
+ const intent = useCallback4(
973
+ (event) => {
974
+ if (!event.defaultPrevented && event.currentTarget.draggable && (resourceAddress === void 0 || event.type === "pointerdown"))
975
+ prepare(event.currentTarget);
976
+ },
977
+ [prepare, resourceAddress]
978
+ );
979
+ const onDragStart = useCallback4(
980
+ (event) => {
981
+ if (event.defaultPrevented || src === "") return;
982
+ dragged.current = true;
983
+ const current = state.current;
984
+ if (current?.prepared !== void 0) {
985
+ if (!current.prepared.start(event.dataTransfer, event.currentTarget)) {
986
+ event.preventDefault();
987
+ release();
988
+ }
989
+ return;
990
+ }
991
+ const url = new URL(src, location.href);
992
+ if (original === void 0 && (url.protocol === "https:" || url.protocol === "http:") && url.origin !== location.origin)
993
+ return;
994
+ event.preventDefault();
995
+ if (current?.failed === true) {
996
+ actions.reportFailure();
997
+ release();
998
+ }
999
+ prepare(event.currentTarget);
1000
+ },
1001
+ [src, original, actions, prepare, release]
1002
+ );
1003
+ const onPointerDown = useCallback4(
1004
+ (event) => {
1005
+ dragged.current = false;
1006
+ if (event.button === 0) intent(event);
1007
+ },
1008
+ [intent]
1009
+ );
1010
+ const onPointerLeave = useCallback4(
1011
+ (event) => {
1012
+ if (event.buttons !== 1) release();
1013
+ },
1014
+ [release]
1015
+ );
1016
+ const onClickCapture = useCallback4((event) => {
1017
+ if (event.detail === 0) {
1018
+ dragged.current = false;
1019
+ return;
1020
+ }
1021
+ if (!dragged.current) return;
1022
+ event.preventDefault();
1023
+ event.stopPropagation();
1024
+ dragged.current = false;
1025
+ }, []);
1026
+ return { onPointerEnter: intent, onPointerDown, onPointerLeave, onDragStart, onDragEnd: release, onClickCapture };
1027
+ }
1028
+
1029
+ // src/DraggableImage.tsx
1030
+ import { jsx as jsx6 } from "react/jsx-runtime";
1031
+ var DraggableImage = forwardRef(function DraggableImage2({ fileDrag, src, name, original, resourceAddress, ...props }, ref) {
1032
+ const drag = useImageDrag(fileDrag, src, name, original, resourceAddress);
1033
+ return /* @__PURE__ */ jsx6("img", { ...props, ...drag, src, ref, draggable: true });
1034
+ });
1035
+
1036
+ // src/ImageLightbox.tsx
1037
+ import { useEffect as useEffect6, useRef as useRef5 } from "react";
1038
+ import { createPortal as createPortal3 } from "react-dom";
1039
+
1040
+ // .build/css/ImageLightbox.module.mjs
1041
+ var id5 = "@seekbuddy/dsh-ui/ImageLightbox.module.css";
1042
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id5 + '"]')) {
1043
+ const element = document.createElement("style");
1044
+ element.setAttribute("data-dsh-ui-primitives", id5);
1045
+ element.textContent = ".burpAG_backdrop{z-index:1000;position:fixed;inset:0}.burpAG_stage{inset:var(--dsh-frame-chrome-top,0px) 0 0;justify-content:center;align-items:center;padding:40px;display:flex;position:absolute}.burpAG_mask{background:var(--dsw-alias-bg-mask-1);backdrop-filter:var(--dsw-mask-blur);position:absolute;inset:0}.burpAG_image{object-fit:contain;border-radius:var(--dsw-radius-lg);background:var(--dsw-specific-input-major);max-width:min(100%,1600px);max-height:100%;box-shadow:var(--dsw-elevation-prominent);border:0;position:relative}.burpAG_close{z-index:1;border:.5px solid var(--dsw-alias-border-l2-darkmode-thin);corner-shape:round;background:var(--dsw-specific-input-major);width:36px;height:36px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:999px;place-items:center;display:grid;position:absolute;top:20px;right:20px}.burpAG_close:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:3px}";
1046
+ document.head.appendChild(element);
1047
+ }
1048
+ var ImageLightbox_module_default = { "image": "burpAG_image", "mask": "burpAG_mask", "close": "burpAG_close", "backdrop": "burpAG_backdrop", "stage": "burpAG_stage" };
1049
+
1050
+ // src/ImageLightbox.tsx
1051
+ import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
1052
+ function ImageLightbox({
1053
+ src,
1054
+ alt,
1055
+ labels,
1056
+ onClose,
1057
+ contextMenuProps
1058
+ }) {
1059
+ const closeRef = useRef5(null);
1060
+ const restoreRef = useRef5(null);
1061
+ useEffect6(() => {
1062
+ restoreRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
1063
+ closeRef.current?.focus();
1064
+ const onKeyDown = (event) => {
1065
+ if (event.defaultPrevented || document.activeElement?.closest('[role="menu"]')) return;
1066
+ if (event.key === "Escape") {
1067
+ event.stopPropagation();
1068
+ onClose();
1069
+ }
1070
+ if (event.key === "Tab") {
1071
+ event.preventDefault();
1072
+ closeRef.current?.focus();
1073
+ }
1074
+ };
1075
+ window.addEventListener("keydown", onKeyDown, true);
1076
+ return () => {
1077
+ window.removeEventListener("keydown", onKeyDown, true);
1078
+ restoreRef.current?.focus();
1079
+ };
1080
+ }, [onClose]);
1081
+ return createPortal3(
1082
+ /* @__PURE__ */ jsx7("div", { className: ImageLightbox_module_default.backdrop, role: "dialog", "aria-modal": "true", "aria-label": labels.dialog, children: /* @__PURE__ */ jsxs4("div", { className: ImageLightbox_module_default.stage, children: [
1083
+ /* @__PURE__ */ jsx7("div", { className: ImageLightbox_module_default.mask, "aria-hidden": "true", onMouseDown: onClose }),
1084
+ /* @__PURE__ */ jsx7("img", { className: ImageLightbox_module_default.image, src, alt, ...contextMenuProps }),
1085
+ /* @__PURE__ */ jsx7("button", { ref: closeRef, type: "button", className: ImageLightbox_module_default.close, "aria-label": labels.close, onClick: onClose, children: /* @__PURE__ */ jsx7(IconCloseOutlineRegular, { size: 16 }) })
1086
+ ] }) }),
1087
+ document.body
1088
+ );
1089
+ }
1090
+
1091
+ // .build/css/markdown/MarkdownText.module.mjs
1092
+ var id6 = "@seekbuddy/dsh-ui/markdown/MarkdownText.module.css";
1093
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id6 + '"]')) {
1094
+ const element = document.createElement("style");
1095
+ element.setAttribute("data-dsh-ui-primitives", id6);
1096
+ element.textContent = "._8yfcBG_markdown{overflow-wrap:anywhere;min-width:0;font:var(--dsw-font-markdown-base);color:var(--dsw-alias-label-primary)}._8yfcBG_markdown strong{font-weight:600}._8yfcBG_markdown h1{font:var(--dsw-font-markdown-h1);margin:32px 0 16px}._8yfcBG_markdown h2{font:var(--dsw-font-markdown-h2);margin:32px 0 16px}._8yfcBG_markdown h3{font:var(--dsw-font-markdown-h3);margin:32px 0 16px}._8yfcBG_markdown h4{font:var(--dsw-font-markdown-h4);margin:16px 0}._8yfcBG_markdown :where(h5,h6){font:var(--dsw-font-markdown-base-strong);margin:16px 0}._8yfcBG_markdown :where(h1,h2,h3,h4,h5,h6) strong{font-weight:inherit}._8yfcBG_markdown p{margin:16px 0}._8yfcBG_markdown :where(h4,h5,h6)+:where(ul,ol){margin-top:8px}._8yfcBG_markdown :where(h4,h5,h6):has(+:where(ul,ol)){margin-bottom:8px}._8yfcBG_markdown a,._8yfcBG_markdown ._8yfcBG_fileLink{color:var(--dsw-alias-link);transition:box-shadow var(--ds-transition-duration) var(--ds-ease-in-out);border:2px solid #fff0;border-width:2px 3px;margin-left:-3px;margin-right:-3px;font-weight:500;text-decoration:none;position:relative}._8yfcBG_markdown a:focus{text-decoration:underline dotted var(--dsw-alias-link);text-underline-offset:3px;outline:none}@media (hover:hover){._8yfcBG_markdown a:hover{text-decoration:underline dotted var(--dsw-alias-link);text-underline-offset:3px;outline:none}}._8yfcBG_markdown a:focus-visible,._8yfcBG_fileMention:focus-visible{box-shadow:0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary))}._8yfcBG_linkIcon{vertical-align:-.25em;flex:none;width:1.1em;height:1.1em;margin-right:5px}._8yfcBG_markdown :where(ul,ol){margin:16px 0;padding-left:18px}._8yfcBG_markdown li:not(:first-child){margin-top:6px}._8yfcBG_markdown li>:where(ul,ol){margin-top:4px}._8yfcBG_markdown li::marker{color:var(--dsw-alias-label-secondary);line-height:24px}._8yfcBG_markdown :where(ul,ol) ol{padding-left:0;list-style-position:inside}._8yfcBG_markdown :where(ul,ol) ol li p{display:inline}._8yfcBG_markdown li>p{margin:8px 0}._8yfcBG_markdown li>:first-child{margin-top:0}._8yfcBG_markdown li>:last-child:not(.md-code-block){margin-bottom:0}._8yfcBG_markdown hr{background:var(--dsw-alias-border-l2);border:none;height:.5px;margin:32px 0;display:block}._8yfcBG_markdown blockquote{border-left:2px solid var(--dsw-alias-label-caption);margin:16px 0 0;padding-left:14px}._8yfcBG_markdown pre{font-family:var(--ds-font-family-code);margin:16px 0;overflow:auto}._8yfcBG_markdown :not(pre)>code{box-sizing:border-box;font:var(--dsw-font-markdown-code);font-family:var(--ds-font-family-code);background-color:var(--dsw-alias-markdown-inline-code);border:.5px solid var(--dsw-alias-border-l1);border-radius:var(--dsw-radius-sm);align-items:center;padding:0 5px;display:inline-flex;font-size:.875em!important}._8yfcBG_markdown :where(h1,h2,h3,h4,h5,h6) code{font:inherit;font-family:var(--ds-font-family-code)}._8yfcBG_markdown .katex-display{max-width:100%;overflow:auto hidden}._8yfcBG_markdown input[type=checkbox]{accent-color:var(--dsw-alias-label-secondary);margin:0 8px 0 0}._8yfcBG_tableScroll{overscroll-behavior-x:contain;max-width:100%;overflow-x:auto}._8yfcBG_tableScroll.md-table-wide:focus-visible{padding-bottom:0;overflow-x:scroll}@media (hover:hover){._8yfcBG_tableScroll.md-table-wide{padding-bottom:var(--dsh-scrollbar-width,5px);overflow-x:hidden}._8yfcBG_tableScroll.md-table-wide:hover{padding-bottom:0;overflow-x:scroll}}._8yfcBG_tableScroll:focus-visible{box-shadow:0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline:none}._8yfcBG_tableScroll table{border-collapse:collapse;width:max-content;max-width:max-content}._8yfcBG_tableFill table{width:100%;max-width:none}._8yfcBG_tableScroll th{text-align:start;border-bottom:.5px solid var(--dsw-alias-border-l3);font:var(--dsw-font-markdown-table-head);border-top:none;min-width:100px;max-width:min(30vw,320px);padding:10px 16px}._8yfcBG_tableScroll td{border-bottom:.5px solid var(--dsw-alias-border-l2);font:var(--dsw-font-markdown-table);min-width:100px;max-width:min(30vw,320px);padding:10px 16px}._8yfcBG_tableScroll th:first-child,._8yfcBG_tableScroll td:first-child{padding-left:0}._8yfcBG_tableScroll td:last-child{padding-right:0}._8yfcBG_tableScroll table code{font-size:11px}._8yfcBG_markdown>:first-child,._8yfcBG_markdown p:first-child{margin-top:0!important}._8yfcBG_markdown>:last-child,._8yfcBG_markdown p:last-child{margin-bottom:0!important}._8yfcBG_imageAlt{color:var(--dsw-alias-label-tertiary);font-style:italic}._8yfcBG_image{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-base);object-fit:contain;width:auto;max-width:100%;height:auto;margin:0;display:block}._8yfcBG_fileMention{font:inherit;color:var(--dsw-alias-link);cursor:pointer;background:0 0;border:none;margin:0;padding:0;font-weight:500;text-decoration:none}._8yfcBG_fileLink{max-width:100%;text-align:inherit}._8yfcBG_fileMention:focus{text-decoration:underline dotted var(--dsw-alias-link);text-underline-offset:3px;outline:none}@media (hover:hover){._8yfcBG_fileMention:hover{text-decoration:underline dotted var(--dsw-alias-link);text-underline-offset:3px;outline:none}}._8yfcBG_compact{max-width:100%;font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));color:var(--dsw-alias-label-tertiary)}._8yfcBG_compact :is(h1,h2,h3,h4,h5,h6){font:inherit;color:inherit;margin:8px 0 4px;font-weight:600}._8yfcBG_compact :is(p,ul,ol,blockquote){margin:4px 0}._8yfcBG_compact li:not(:first-child){margin-top:2px}._8yfcBG_compact li>p{margin:4px 0}._8yfcBG_compact li::marker{line-height:inherit;color:inherit}._8yfcBG_compact blockquote{padding-left:8px}._8yfcBG_compact hr{margin:8px 0}._8yfcBG_compact a,._8yfcBG_compact ._8yfcBG_fileMention{font-weight:inherit;color:inherit;text-decoration:underline dotted}._8yfcBG_compact a:focus,._8yfcBG_compact ._8yfcBG_fileMention:focus{text-decoration-color:currentColor}@media (hover:hover){._8yfcBG_compact a:hover,._8yfcBG_compact ._8yfcBG_fileMention:hover{text-decoration-color:currentColor}}._8yfcBG_compact :not(pre)>code{font:inherit;font-family:var(--ds-font-family-code);border-radius:var(--dsw-radius-xs);box-decoration-break:clone;padding:0 3px;display:inline;font-size:1em!important}._8yfcBG_markdown._8yfcBG_compact .md-code-block{color:inherit;margin:4px 0}._8yfcBG_compact .md-code-block>:has(>[data-code-block-banner]){z-index:auto;position:static}._8yfcBG_compact pre,._8yfcBG_compact pre :is(code,span){color:inherit!important}._8yfcBG_markdown._8yfcBG_compact ._8yfcBG_tableScroll{width:100%;max-width:100%;margin:4px 0;padding-left:0}._8yfcBG_markdown._8yfcBG_compact ._8yfcBG_tableScroll>table{z-index:auto}._8yfcBG_compact :is(th,td){font:inherit;padding:4px 8px}._8yfcBG_compact th{font-weight:600}._8yfcBG_compact .katex{font-size:1em}._8yfcBG_compact :is(p,h1,h2,h3,h4,h5,h6,ul,ol):has(.katex){padding-bottom:1px;overflow:auto hidden}._8yfcBG_compact .katex-display{margin:4px 0}._8yfcBG_imageButton{border-radius:var(--dsw-radius-sm);vertical-align:middle;cursor:zoom-in;background:0 0;border:0;max-width:100%;padding:0;display:inline-block}._8yfcBG_imageButton ._8yfcBG_image{max-width:min(100%,640px);max-height:360px}._8yfcBG_imageButton:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:3px}._8yfcBG_previewName{text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-secondary);margin-top:8px;font-size:12px;line-height:18px;display:block;overflow:hidden}";
1097
+ document.head.appendChild(element);
1098
+ }
1099
+ var MarkdownText_module_default = { "fileMention": "_8yfcBG_fileMention", "tableScroll": "_8yfcBG_tableScroll", "fileLink": "_8yfcBG_fileLink", "linkIcon": "_8yfcBG_linkIcon", "imageAlt": "_8yfcBG_imageAlt", "imageButton": "_8yfcBG_imageButton", "tableFill": "_8yfcBG_tableFill", "markdown": "_8yfcBG_markdown", "image": "_8yfcBG_image", "compact": "_8yfcBG_compact", "previewName": "_8yfcBG_previewName" };
1100
+
1101
+ export {
1102
+ StateDot,
1103
+ overlayTopMargin,
1104
+ usePointerGrace,
1105
+ ShortcutKeys,
1106
+ useDismissOnOutsidePointer,
1107
+ pointerModality,
1108
+ Tooltip,
1109
+ writeClipboard,
1110
+ HoverCardGroup,
1111
+ HoverCard,
1112
+ MarkdownText_module_default,
1113
+ DraggableImage,
1114
+ ImageLightbox
1115
+ };