@deepseek-ai/dsh-client-ui-primitives 0.1.7-rc.2 → 0.2.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -18,18 +18,19 @@ import { createPortal } from "react-dom";
18
18
  import css$12 from "./ShortcutKeys.module.css";
19
19
  import css$13 from "./MenuSurface.module.css";
20
20
  import css$14 from "./Menu.module.css";
21
- import css$15 from "./Tooltip.module.css";
22
- import css$16 from "./HoverCard.module.css";
23
- import css$17 from "./Modal.module.css";
24
- import css$18 from "./RiskConfirmation.module.css";
25
- import css$19 from "./ConnectionIndicator.module.css";
26
- import css$20 from "./FileTypeIcon.module.css";
21
+ import css$15 from "./MenuGroup.module.css";
22
+ import css$16 from "./Tooltip.module.css";
23
+ import css$17 from "./HoverCard.module.css";
24
+ import css$18 from "./Modal.module.css";
25
+ import css$19 from "./RiskConfirmation.module.css";
26
+ import css$20 from "./ConnectionIndicator.module.css";
27
+ import css$21 from "./FileTypeIcon.module.css";
27
28
  import { siAliexpress, siApple, siBaidu, siBilibili, siCsdn, siDuckduckgo, siEbay, siFacebook, siGithub, siGitlab, siGoogle, siInstagram, siJuejin, siMdnwebdocs, siNetflix, siNpm, siPypi, siQq, siQuora, siReddit, siSinaweibo, siSpotify, siStackoverflow, siTaobao, siTelegram, siTiktok, siV2ex, siWechat, siWhatsapp, siWikipedia, siX, siYcombinator, siYoutube, siZhihu } from "simple-icons";
28
- import css$21 from "./user-text.module.css";
29
+ import css$22 from "./user-text.module.css";
29
30
  import markdownCss from "./markdown/MarkdownText.module.css";
30
- import css$22 from "./Toast.module.css";
31
- import css$23 from "./settings-form/SettingsForm.module.css";
32
- import css$24 from "./settings-form/fields.module.css";
31
+ import css$23 from "./Toast.module.css";
32
+ import css$24 from "./settings-form/SettingsForm.module.css";
33
+ import css$25 from "./settings-form/fields.module.css";
33
34
  import { createSnapshotStore } from "@deepseek-ai/dsh-client-store";
34
35
  import { createCssVariablesTheme, createHighlighterCoreSync } from "shiki/core";
35
36
  import { createJavaScriptRegexEngine, defaultJavaScriptRegexConstructor } from "shiki/engine/javascript";
@@ -37,14 +38,14 @@ import langTs from "@shikijs/langs/typescript";
37
38
  import langBash from "@shikijs/langs/shellscript";
38
39
  import langJson from "@shikijs/langs/json";
39
40
  import { CODE_HIGHLIGHT_EXTENSIONS, languageForPath } from "@deepseek-ai/dsh-util-code-language";
40
- import css$25 from "./JsonTree.module.css";
41
+ import css$26 from "./JsonTree.module.css";
41
42
  import Anser from "anser";
42
- import css$26 from "./TerminalBlock.module.css";
43
+ import css$27 from "./TerminalBlock.module.css";
43
44
  import cardCss from "./CodeCard.module.css";
44
- import css$27 from "./ReadBlock.module.css";
45
+ import css$28 from "./ReadBlock.module.css";
45
46
  import { structuredPatch } from "diff";
46
- import css$28 from "./DiffBlock.module.css";
47
- import css$29 from "./SearchBlock.module.css";
47
+ import css$29 from "./DiffBlock.module.css";
48
+ import css$30 from "./SearchBlock.module.css";
48
49
  import { fromMarkdown } from "mdast-util-from-markdown";
49
50
  import { gfmFromMarkdown } from "mdast-util-gfm";
50
51
  import { mathFromMarkdown } from "mdast-util-math";
@@ -56,13 +57,13 @@ import { classifyCharacter } from "micromark-util-classify-character";
56
57
  import { codes, constants, types } from "micromark-util-symbol";
57
58
  import { factorySpace } from "micromark-factory-space";
58
59
  import { normalizeUri } from "micromark-util-sanitize-uri";
59
- import css$30 from "./markdown/CodeBlock.module.css";
60
+ import css$31 from "./markdown/CodeBlock.module.css";
60
61
  import katex from "katex";
61
- import css$31 from "./ImageLightbox.module.css";
62
- import css$32 from "./ImagePreview.module.css";
62
+ import css$32 from "./ImageLightbox.module.css";
63
+ import css$33 from "./ImagePreview.module.css";
63
64
  import "katex/dist/katex.min.css";
64
- import css$33 from "./WebBlock.module.css";
65
- import css$34 from "./markdown/JsonBlock.module.css";
65
+ import css$34 from "./WebBlock.module.css";
66
+ import css$35 from "./markdown/JsonBlock.module.css";
66
67
  //#region lib/types/icons/shared-artwork.js
67
68
  /**
68
69
  * Render new-conversation geometry — the bubble around a plus — for product icons.
@@ -938,15 +939,15 @@ const IconThinkOutlineArtwork = ({ size = 16, className, strokeWidth }) => jsxs(
938
939
  strokeWidth,
939
940
  children: [
940
941
  jsx("path", {
941
- d: "M10.7554 5.24466C13.9891 8.4783 15.3769 12.3333 13.8552 13.8551C12.3335 15.3768 8.4785 13.989 5.24478 10.7553C2.01111 7.52165 0.623307 3.66664 2.14504 2.14491C3.66676 0.623189 7.52178 2.01099 10.7554 5.24466Z",
942
+ d: "M10.2854 5.71481C12.9673 8.39663 14.1182 11.5938 12.8562 12.8559C11.5942 14.1179 8.39706 12.9669 5.71518 10.2851C3.03333 7.60323 1.88236 4.40608 3.14441 3.14403C4.40644 1.882 7.6036 3.03297 10.2854 5.71481Z",
942
943
  stroke: "currentColor"
943
944
  }),
944
945
  jsx("path", {
945
- d: "M10.7554 10.7553C7.52178 13.989 3.66676 15.3768 2.14504 13.8551C0.623307 12.3333 2.01111 8.4783 5.24478 5.24466C8.4785 2.01099 12.3335 0.623189 13.8552 2.14491C15.3769 3.66664 13.9891 7.52165 10.7554 10.7553Z",
946
+ d: "M10.2854 10.2851C7.6036 12.9669 4.40644 14.1179 3.14441 12.8559C1.88236 11.5938 3.03333 8.39663 5.71518 5.71481C8.39706 3.03297 11.5942 1.882 12.8562 3.14403C14.1182 4.40608 12.9673 7.60323 10.2854 10.2851Z",
946
947
  stroke: "currentColor"
947
948
  }),
948
949
  jsx("path", {
949
- d: "M8.9587 8.00025C8.9587 8.52835 8.5306 8.95655 8.0024 8.95655C7.47429 8.95655 7.04614 8.52835 7.04614 8.00025C7.04614 7.47209 7.47429 7.04395 8.0024 7.04395C8.5306 7.04395 8.9587 7.47209 8.9587 8.00025Z",
950
+ d: "M8.86291 8.0002C8.86291 8.47549 8.47762 8.86087 8.00224 8.86087C7.52694 8.86087 7.1416 8.47549 7.1416 8.0002C7.1416 7.52485 7.52694 7.13953 8.00224 7.13953C8.47762 7.13953 8.86291 7.52485 8.86291 8.0002Z",
950
951
  fill: "currentColor"
951
952
  })
952
953
  ]
@@ -3094,20 +3095,55 @@ function StateDot({ state, size, className, appearance = "dot" }) {
3094
3095
  }
3095
3096
  //#endregion
3096
3097
  //#region lib/types/TextShimmer.js
3097
- /** Text-only activity animation with a stable span across lifecycle changes. */
3098
+ /** Text activity animation shared by a row and its nested text fragments. */
3099
+ const DecorativeCopy = createContext(void 0);
3100
+ function TextContent({ children, className }) {
3101
+ const generated = useContext(DecorativeCopy) === true && typeof children === "string";
3102
+ return jsx("span", {
3103
+ className: clsx(css$1.text, className),
3104
+ "data-shimmer-text": generated ? children : void 0,
3105
+ children: generated ? null : children
3106
+ });
3107
+ }
3098
3108
  /**
3099
- * Render text with an optional moving highlight; inactive text keeps the same node.
3109
+ * Render text with one shared highlight while retaining selectable, accessible content.
3110
+ * Nested instances inherit the outer animation. Keep icons outside; mark decorative
3111
+ * separators with data-shimmer-decoration so their background follows the highlight.
3112
+ * Active children also render in an inert, clipped decoration; supply only presentation.
3100
3113
  * @param props - localized text, running state, and owner styling.
3101
- * @returns the retained text span.
3114
+ * @returns retained text and its optional decorative highlight.
3102
3115
  */
3103
- const TextShimmer = memo(function TextShimmer({ children, active, className }) {
3104
- const style = useMemo(() => ({ "--dsh-text-shimmer-spread": `${children.length * 8}px` }), [children.length]);
3105
- return jsx("span", {
3106
- className: clsx(css$1.root, className),
3107
- style,
3108
- "data-text-shimmer": active || void 0,
3116
+ const TextShimmer = memo(function TextShimmer({ children, active = false, className, contentClassName }) {
3117
+ if (useContext(DecorativeCopy) !== void 0) return jsx(TextContent, {
3118
+ className,
3109
3119
  children
3110
3120
  });
3121
+ const content = typeof children === "string" ? jsx(TextContent, { children }) : children;
3122
+ return jsxs("span", {
3123
+ className: clsx(css$1.root, className),
3124
+ "data-shimmer": active || void 0,
3125
+ children: [jsx(DecorativeCopy.Provider, {
3126
+ value: false,
3127
+ children: jsx("span", {
3128
+ className: clsx(css$1.content, contentClassName),
3129
+ children: content
3130
+ })
3131
+ }), active && jsx("span", {
3132
+ className: css$1.decoration,
3133
+ "aria-hidden": "true",
3134
+ inert: "",
3135
+ children: jsx("span", {
3136
+ className: css$1.sweep,
3137
+ children: jsx(DecorativeCopy.Provider, {
3138
+ value: true,
3139
+ children: jsx("span", {
3140
+ className: clsx(css$1.content, css$1.highlight, contentClassName),
3141
+ children: content
3142
+ })
3143
+ })
3144
+ })
3145
+ })]
3146
+ });
3111
3147
  });
3112
3148
  //#endregion
3113
3149
  //#region lib/types/DisclosureRow.js
@@ -3117,7 +3153,7 @@ const TextShimmer = memo(function TextShimmer({ children, active, className }) {
3117
3153
  * @param props - Visual content, controlled state, and interaction policy.
3118
3154
  * @returns the disclosure row.
3119
3155
  */
3120
- const DisclosureRow = memo(function DisclosureRow({ icon, title, open, expandable, onToggle, running = false, expandOnRowClick = false, previewChevron = expandable, keepContentWhenOpen = false, collapsedContent, children, className, rowClassName, leadingClassName, chevronClassName, titleClassName }) {
3156
+ const DisclosureRow = memo(function DisclosureRow({ icon, title, open, expandable, onToggle, running = false, expandOnRowClick = false, previewChevron = expandable, keepContentWhenOpen = false, collapsedContent, children, className, rowClassName, contentClassName, contentLayoutClassName, leadingClassName, chevronClassName, titleClassName }) {
3121
3157
  const rowExpands = expandable && expandOnRowClick;
3122
3158
  const toggleFromLeading = (event) => {
3123
3159
  event.stopPropagation();
@@ -3145,24 +3181,25 @@ const DisclosureRow = memo(function DisclosureRow({ icon, title, open, expandabl
3145
3181
  "aria-expanded": rowExpands ? open : void 0,
3146
3182
  onClick: rowExpands ? onToggle : void 0,
3147
3183
  onKeyDown: rowExpands ? toggleFromKeyboard : void 0,
3148
- children: [
3149
- expandable && !rowExpands ? jsx("button", {
3150
- type: "button",
3151
- className: clsx(css$2.leading, leadingClassName),
3152
- "aria-expanded": open,
3153
- onClick: toggleFromLeading,
3154
- children: leading
3155
- }) : jsx("span", {
3156
- className: clsx(css$2.leading, leadingClassName),
3157
- children: leading
3158
- }),
3159
- jsx(TextShimmer, {
3184
+ children: [expandable && !rowExpands ? jsx("button", {
3185
+ type: "button",
3186
+ className: clsx(css$2.leading, leadingClassName),
3187
+ "aria-label": title,
3188
+ "aria-expanded": open,
3189
+ onClick: toggleFromLeading,
3190
+ children: leading
3191
+ }) : jsx("span", {
3192
+ className: clsx(css$2.leading, leadingClassName),
3193
+ children: leading
3194
+ }), jsxs(TextShimmer, {
3195
+ active: running,
3196
+ className: contentClassName,
3197
+ contentClassName: contentLayoutClassName,
3198
+ children: [jsx(TextShimmer, {
3160
3199
  className: clsx(css$2.title, titleClassName),
3161
- active: running,
3162
3200
  children: title
3163
- }),
3164
- (keepContentWhenOpen || !open) && collapsedContent
3165
- ]
3201
+ }), (keepContentWhenOpen || !open) && collapsedContent]
3202
+ })]
3166
3203
  }), open && children]
3167
3204
  });
3168
3205
  });
@@ -3486,37 +3523,35 @@ function Checkbox({ checked, onChange, label, disabled = false, title, className
3486
3523
  /**
3487
3524
  * Render a text input with an optional leading icon.
3488
3525
  * @param props.icon - optional 16px leading icon node.
3526
+ * @param ref - the native input, cleared when it unmounts.
3489
3527
  * @returns wrapper span containing the native input; input attributes pass through.
3490
3528
  */
3491
- function Input({ icon, className, ...rest }) {
3529
+ const Input = forwardRef(function Input({ icon, className, ...rest }, ref) {
3492
3530
  return jsxs("span", {
3493
3531
  className: clsx(css$11.wrap, className),
3494
3532
  children: [icon != null && jsx("span", {
3495
3533
  className: css$11.icon,
3496
3534
  children: icon
3497
3535
  }), jsx("input", {
3536
+ ref,
3498
3537
  className: css$11.input,
3499
3538
  ...rest
3500
3539
  })]
3501
3540
  });
3502
- }
3541
+ });
3503
3542
  //#endregion
3504
3543
  //#region lib/types/overlay-top-margin.js
3505
- /**
3506
- * Overlay clearance from the window's top strip. On macOS desktop the frame
3507
- * publishes `--dsh-frame-top-clearance` on the root element — the constant
3508
- * step below the traffic-light strip, where clicks drag the window instead of
3509
- * the overlay. JS-clamped overlays keep at least that much air above them.
3510
- * Elsewhere the property is absent and the caller's own margin applies.
3511
- */
3544
+ /** Shared viewport inset for overlays, derived from the desktop frame's reserved top strip. */
3512
3545
  /**
3513
3546
  * Resolve the top margin an overlay keeps from the viewport edge.
3514
3547
  * @param min - the overlay's own viewport margin in px, used as the floor.
3515
- * @returns the larger of `min` and the frame's published top clearance.
3548
+ * @returns the larger of `min` and the frame clearance plus 20px; fullscreen keeps only the 20px gap.
3516
3549
  */
3517
3550
  function overlayTopMargin(min) {
3518
- const clearance = Number.parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--dsh-frame-top-clearance"));
3519
- return Number.isNaN(clearance) ? min : Math.max(min, clearance);
3551
+ const root = document.documentElement;
3552
+ const clearance = Number.parseFloat(getComputedStyle(root).getPropertyValue("--dsh-frame-top-clearance"));
3553
+ if (Number.isNaN(clearance)) return min;
3554
+ return Math.max(min, (root.hasAttribute("data-fullscreen") ? 0 : clearance) + 20);
3520
3555
  }
3521
3556
  /**
3522
3557
  * Delay a pointer-dismissed popup's close so the pointer can cross the gap
@@ -4238,6 +4273,125 @@ function Menu({ open, anchor, items = [], children, selectedId, selectedIds, onS
4238
4273
  });
4239
4274
  }
4240
4275
  //#endregion
4276
+ //#region lib/types/MenuGroup.js
4277
+ /** Accessible menu groups with shared sticky-heading presentation and viewport observation. */
4278
+ /**
4279
+ * Render a named group with an instance-owned heading id and an inaccessible position sentinel.
4280
+ * @param props - Caller-localized label and optional menu rows.
4281
+ * @returns A section named by its direct heading, followed by the supplied children.
4282
+ */
4283
+ function MenuGroup({ label, children }) {
4284
+ const headingId = useId();
4285
+ return jsxs("section", {
4286
+ role: "group",
4287
+ "aria-labelledby": headingId,
4288
+ "data-menu-group": "",
4289
+ className: css$15.group,
4290
+ children: [
4291
+ jsx("span", {
4292
+ "aria-hidden": "true",
4293
+ "data-menu-group-start": "",
4294
+ className: css$15.start
4295
+ }),
4296
+ jsx("div", {
4297
+ id: headingId,
4298
+ "data-menu-group-heading": "",
4299
+ className: css$15.heading,
4300
+ children: label
4301
+ }),
4302
+ children
4303
+ ]
4304
+ });
4305
+ }
4306
+ /**
4307
+ * Update heading backgrounds asynchronously from native intersection and viewport-size observations.
4308
+ * Headings remain transparent until observations identify a section crossing the viewport top.
4309
+ * Without IntersectionObserver or ResizeObserver, CSS sticky headings remain transparent.
4310
+ * Group membership is captured at setup; dispose before observing changed groups or the same viewport again.
4311
+ * @param viewport - Unpadded, borderless scroll container with direct MenuGroup children.
4312
+ * @returns Cleanup owning both intersection observers and the viewport resize observer; disconnects
4313
+ * them, ignores queued callbacks, and clears managed data-stuck attributes. No valid groups acquires nothing.
4314
+ */
4315
+ function observeStickyMenuGroups(viewport) {
4316
+ const groups = [...viewport.querySelectorAll(":scope > [data-menu-group]")].flatMap((section) => {
4317
+ const heading = section.querySelector(":scope > [data-menu-group-heading]");
4318
+ const start = section.querySelector(":scope > [data-menu-group-start]");
4319
+ return heading === null || start === null ? [] : [{
4320
+ section,
4321
+ heading,
4322
+ start,
4323
+ atTop: false,
4324
+ above: false,
4325
+ topTime: -Infinity,
4326
+ aboveTime: -Infinity
4327
+ }];
4328
+ });
4329
+ if (groups.length === 0 || typeof IntersectionObserver === "undefined" || typeof ResizeObserver === "undefined") return () => {};
4330
+ const sections = new Map(groups.map((group) => [group.section, group]));
4331
+ const starts = new Map(groups.map((group) => [group.start, group]));
4332
+ let disposed = false;
4333
+ let stripObserver;
4334
+ let viewportHeight;
4335
+ const render = (group) => {
4336
+ const stuck = group.atTop && group.above;
4337
+ if (group.heading.hasAttribute("data-stuck") !== stuck) group.heading.toggleAttribute("data-stuck", stuck);
4338
+ };
4339
+ const startObserver = new IntersectionObserver((entries) => {
4340
+ if (disposed) return;
4341
+ for (const entry of entries) {
4342
+ const group = starts.get(entry.target);
4343
+ if (!group || entry.rootBounds === null || entry.time < group.aboveTime) continue;
4344
+ group.above = entry.boundingClientRect.top < entry.rootBounds.top;
4345
+ group.aboveTime = entry.time;
4346
+ render(group);
4347
+ }
4348
+ }, {
4349
+ root: viewport,
4350
+ threshold: [0, 1]
4351
+ });
4352
+ for (const { start } of groups) startObserver.observe(start);
4353
+ const sizeObserver = new ResizeObserver((entries) => {
4354
+ if (disposed) return;
4355
+ for (const entry of entries) {
4356
+ if (entry.target !== viewport || entry.contentRect.height === viewportHeight) continue;
4357
+ viewportHeight = entry.contentRect.height;
4358
+ stripObserver?.disconnect();
4359
+ const observer = new IntersectionObserver((intersections) => {
4360
+ if (disposed || stripObserver !== observer) return;
4361
+ for (const intersection of intersections) {
4362
+ const group = sections.get(intersection.target);
4363
+ if (!group || intersection.rootBounds === null) continue;
4364
+ const top = intersection.rootBounds.top;
4365
+ if (intersection.time >= group.topTime) {
4366
+ group.atTop = intersection.isIntersecting && intersection.boundingClientRect.bottom > top;
4367
+ group.topTime = intersection.time;
4368
+ }
4369
+ if (intersection.time >= group.aboveTime) {
4370
+ group.above = intersection.boundingClientRect.top < top;
4371
+ group.aboveTime = intersection.time;
4372
+ }
4373
+ render(group);
4374
+ }
4375
+ }, {
4376
+ root: viewport,
4377
+ rootMargin: `0px 0px ${Math.min(1, viewportHeight) - viewportHeight}px 0px`,
4378
+ threshold: 0
4379
+ });
4380
+ stripObserver = observer;
4381
+ for (const { section } of groups) observer.observe(section);
4382
+ }
4383
+ });
4384
+ sizeObserver.observe(viewport);
4385
+ return () => {
4386
+ if (disposed) return;
4387
+ disposed = true;
4388
+ startObserver.disconnect();
4389
+ stripObserver?.disconnect();
4390
+ sizeObserver.disconnect();
4391
+ for (const { heading } of groups) if (heading.hasAttribute("data-stuck")) heading.removeAttribute("data-stuck");
4392
+ };
4393
+ }
4394
+ //#endregion
4241
4395
  //#region lib/types/useAnchoredMaxHeight.js
4242
4396
  /**
4243
4397
  * Viewport-fit hook for bottom-anchored overlays (slash menu, popupSelect):
@@ -4247,7 +4401,7 @@ function Menu({ open, anchor, items = [], children, selectedId, selectedIds, onS
4247
4401
  */
4248
4402
  /**
4249
4403
  * Safe distance kept between the overlay and the viewport top edge (mirrors
4250
- * the Menu portal margin); the frame's published top clearance widens it.
4404
+ * the Menu portal margin); the frame's overlay inset widens it.
4251
4405
  */
4252
4406
  const MARGIN = 12;
4253
4407
  /**
@@ -4256,8 +4410,8 @@ const MARGIN = 12;
4256
4410
  * @param cap - design max-height in px (the clamp never exceeds it).
4257
4411
  * @param signal - re-measure trigger: pass the overlay's render state so anchor
4258
4412
  * moves (composer growth) re-fit; resize/scroll re-fit while mounted.
4259
- * @param margin - viewport top margin floor in px; the frame's published top
4260
- * clearance widens it. Callers under fixed chrome (the conversation header)
4413
+ * @param margin - viewport top margin floor in px; the frame's overlay
4414
+ * inset widens it. Callers under fixed chrome (the conversation header)
4261
4415
  * raise it past their chrome's height.
4262
4416
  * @returns the max-height to apply inline, in px.
4263
4417
  */
@@ -4322,7 +4476,7 @@ function useAnchoredPosition(options) {
4322
4476
  let left = align === "end" ? rect.right - width : rect.left;
4323
4477
  let top = side === "top" ? rect.top - gap - height : rect.bottom + gap;
4324
4478
  if (width > 0) left = Math.min(Math.max(left, margin), window.innerWidth - width - margin);
4325
- if (height > 0) top = Math.min(Math.max(top, margin), window.innerHeight - height - margin);
4479
+ if (height > 0) top = Math.min(Math.max(top, overlayTopMargin(margin)), window.innerHeight - height - margin);
4326
4480
  /* v8 ignore stop */
4327
4481
  setPosition({
4328
4482
  left,
@@ -4500,20 +4654,26 @@ const TooltipSuppression = createContext(null);
4500
4654
  * bubble would overlap); default 'center'. Ignored for side 'right'.
4501
4655
  * @param props.portal - render the bubble under document.body, so an ancestor's clipping or its
4502
4656
  * stacking context (which confines the bubble's z-index to that context) cannot hide it.
4503
- * @param props.delayMs - hover delay in milliseconds; keyboard focus remains immediate.
4657
+ * @param props.delayMs - hover delay in milliseconds (default 0).
4658
+ * @param props.focusDelayMs - keyboard focus delay in milliseconds (default 0); blur, click,
4659
+ * mouse leave, disabling, and unmount cancel a pending show.
4504
4660
  * @param props.gap - anchor-to-bubble distance in pixels for 'bottom'/'top' bubbles (default 8);
4505
4661
  * ignored for side 'right'.
4506
4662
  * @param props.disabled - suppress the bubble while true; the anchor renders identically so
4507
4663
  * toggling never remounts it (which would cut its CSS transitions).
4508
4664
  * @param props.maxWidth - bubble width cap in pixels, for labels long enough that the default
4509
4665
  * half-viewport cap would render a slab wider than the surface the anchor sits on.
4666
+ * @param props.openOnClick - clicking also pins the bubble for reading; another click, Escape,
4667
+ * Tab, or an outside pointerdown dismisses it. Defaults to false for ordinary action tooltips.
4510
4668
  * @param props.children - a single anchor element; its own ref (callback or object) is forwarded alongside the tooltip's.
4511
4669
  * @returns the cloned anchor plus a fixed-position bubble, optionally portaled to the body.
4512
4670
  * The bubble stays hidden until ResizeObserver supplies its size for viewport fitting; clicking the
4513
- * anchor dismisses the bubble until the next trigger, and focus arriving after a pointer
4671
+ * anchor dismisses the bubble unless openOnClick is enabled, and focus arriving after a pointer
4514
4672
  * interaction (a closing menu refocusing its trigger) never raises it.
4515
4673
  */
4516
- function Tooltip({ label, shortcutKeys, side = "right", align = "center", delayMs = 0, gap = 8, disabled = false, portal = false, maxWidth, children }) {
4674
+ function Tooltip({ label, shortcutKeys, side = "right", align = "center", delayMs = 0, focusDelayMs = 0, gap = 8, disabled = false, portal = false, maxWidth, openOnClick = false, children }) {
4675
+ const id = useId();
4676
+ const [pinned, setPinned] = useState(false);
4517
4677
  const anchor = useRef(null);
4518
4678
  const childRef = children.ref;
4519
4679
  const mergedRef = useCallback((el) => {
@@ -4586,6 +4746,7 @@ function Tooltip({ label, shortcutKeys, side = "right", align = "center", delayM
4586
4746
  showTimer.current = null;
4587
4747
  }, []);
4588
4748
  useEffect(() => {
4749
+ if (pinned && (disabled || !openOnClick)) setPinned(false);
4589
4750
  if (disabled) {
4590
4751
  cancelShow();
4591
4752
  triggers.current = {
@@ -4595,7 +4756,12 @@ function Tooltip({ label, shortcutKeys, side = "right", align = "center", delayM
4595
4756
  setPos(null);
4596
4757
  }
4597
4758
  return cancelShow;
4598
- }, [cancelShow, disabled]);
4759
+ }, [
4760
+ cancelShow,
4761
+ disabled,
4762
+ openOnClick,
4763
+ pinned
4764
+ ]);
4599
4765
  const show = () => {
4600
4766
  if (disabled) return;
4601
4767
  const el = anchor.current;
@@ -4609,30 +4775,61 @@ function Tooltip({ label, shortcutKeys, side = "right", align = "center", delayM
4609
4775
  });
4610
4776
  announce(true);
4611
4777
  };
4612
- const showAfterHoverDelay = () => {
4778
+ const showAfterDelay = (delay) => {
4613
4779
  cancelShow();
4614
- if (delayMs <= 0) {
4780
+ if (delay <= 0) {
4615
4781
  show();
4616
4782
  return;
4617
4783
  }
4618
4784
  showTimer.current = setTimeout(() => {
4619
4785
  showTimer.current = null;
4620
4786
  show();
4621
- }, delayMs);
4787
+ }, delay);
4622
4788
  };
4623
- const withdraw = () => {
4789
+ const withdraw = useCallback(() => {
4790
+ setPinned(false);
4624
4791
  setPos(null);
4625
4792
  announce(false);
4626
- };
4793
+ }, [announce]);
4627
4794
  const hide = () => {
4628
4795
  cancelShow();
4629
- if (!triggers.current.hover && !triggers.current.focus) withdraw();
4796
+ if (!triggers.current.hover && !triggers.current.focus && !pinned) withdraw();
4630
4797
  };
4798
+ const dismiss = useCallback(() => {
4799
+ cancelShow();
4800
+ triggers.current = {
4801
+ hover: false,
4802
+ focus: false
4803
+ };
4804
+ withdraw();
4805
+ }, [cancelShow, withdraw]);
4806
+ useDismissOnOutsidePointer(anchor, openOnClick && visible, dismiss, bubble);
4807
+ useEffect(() => {
4808
+ if (!openOnClick || !visible) return;
4809
+ const onKeyDown = (event) => {
4810
+ if (event.key !== "Escape" && event.key !== "Tab") return;
4811
+ if (event.key === "Escape") {
4812
+ event.preventDefault();
4813
+ event.stopPropagation();
4814
+ }
4815
+ dismiss();
4816
+ };
4817
+ document.addEventListener("keydown", onKeyDown, true);
4818
+ return () => {
4819
+ document.removeEventListener("keydown", onKeyDown, true);
4820
+ };
4821
+ }, [
4822
+ dismiss,
4823
+ openOnClick,
4824
+ visible
4825
+ ]);
4631
4826
  const content = visible && !suppressed && jsxs("span", {
4632
4827
  ref: bubble,
4633
- className: css$15.bubble,
4828
+ id: openOnClick ? id : void 0,
4829
+ className: css$16.bubble,
4634
4830
  "data-side": side,
4635
4831
  "data-portal": portal || void 0,
4832
+ "data-pinned": pinned || void 0,
4636
4833
  "data-align": align,
4637
4834
  "data-has-shortcut": shortcutKeys?.length ? true : void 0,
4638
4835
  style: {
@@ -4644,7 +4841,7 @@ function Tooltip({ label, shortcutKeys, side = "right", align = "center", delayM
4644
4841
  role: "tooltip",
4645
4842
  "aria-label": shortcutKeys?.length ? [resolvedLabel, shortcutKeys.join(" ")].filter(Boolean).join(" ") : void 0,
4646
4843
  children: [resolvedLabel && jsx("span", {
4647
- className: css$15.label,
4844
+ className: css$16.label,
4648
4845
  children: resolvedLabel
4649
4846
  }), shortcutKeys !== void 0 && shortcutKeys.length > 0 && jsx(ShortcutKeys, {
4650
4847
  keys: shortcutKeys,
@@ -4655,29 +4852,32 @@ function Tooltip({ label, shortcutKeys, side = "right", align = "center", delayM
4655
4852
  value: setSuppressed,
4656
4853
  children: [cloneElement(children, {
4657
4854
  ref: mergedRef,
4855
+ "aria-describedby": openOnClick && visible ? [children.props["aria-describedby"], id].filter(Boolean).join(" ") : children.props["aria-describedby"],
4658
4856
  onMouseEnter: (e) => {
4659
4857
  children.props.onMouseEnter?.(e);
4660
4858
  triggers.current.hover = true;
4661
- showAfterHoverDelay();
4859
+ showAfterDelay(delayMs);
4662
4860
  },
4663
4861
  onMouseLeave: (e) => {
4664
4862
  children.props.onMouseLeave?.(e);
4665
4863
  triggers.current.hover = false;
4666
4864
  cancelShow();
4667
- withdraw();
4865
+ if (!pinned) withdraw();
4668
4866
  },
4669
4867
  onClick: (e) => {
4670
4868
  children.props.onClick?.(e);
4671
4869
  triggers.current.focus = false;
4672
4870
  cancelShow();
4673
- withdraw();
4871
+ if (openOnClick && !disabled && !pinned) {
4872
+ setPinned(true);
4873
+ show();
4874
+ } else withdraw();
4674
4875
  },
4675
4876
  onFocus: (e) => {
4676
4877
  children.props.onFocus?.(e);
4677
4878
  if (pointerModality()) return;
4678
4879
  triggers.current.focus = true;
4679
- cancelShow();
4680
- show();
4880
+ showAfterDelay(focusDelayMs);
4681
4881
  },
4682
4882
  onBlur: (e) => {
4683
4883
  children.props.onBlur?.(e);
@@ -4909,7 +5109,7 @@ function HoverCard({ anchor, content, openDelayMs = 500, disabled = false, copyT
4909
5109
  };
4910
5110
  const card = open && pos !== null && !suppressed && jsx("div", {
4911
5111
  ref: cardRef,
4912
- className: clsx(css$16.card, variant === "preview" && css$16.preview, inline && css$16.media, copyable && css$16.copyable, copied && css$16.feedback),
5112
+ className: clsx(css$17.card, variant === "preview" && css$17.preview, inline && css$17.media, copyable && css$17.copyable, copied && css$17.feedback),
4913
5113
  "data-closing": closing || void 0,
4914
5114
  style: {
4915
5115
  ...pos,
@@ -4932,14 +5132,14 @@ function HoverCard({ anchor, content, openDelayMs = 500, disabled = false, copyT
4932
5132
  copy(copyText);
4933
5133
  } : void 0,
4934
5134
  children: copied ? jsx("span", {
4935
- className: css$16.copied,
5135
+ className: css$17.copied,
4936
5136
  "aria-hidden": "true",
4937
5137
  children: copiedLabel
4938
5138
  }) : content
4939
5139
  });
4940
5140
  return jsxs("span", {
4941
5141
  ref: rootRef,
4942
- className: clsx(css$16.root, inline && css$16.inline),
5142
+ className: clsx(css$17.root, inline && css$17.inline),
4943
5143
  onFocus: inline ? (event) => {
4944
5144
  if (!disabled && event.target.matches(":focus-visible")) {
4945
5145
  cancelClose();
@@ -4977,7 +5177,7 @@ function HoverCard({ anchor, content, openDelayMs = 500, disabled = false, copyT
4977
5177
  children: anchor
4978
5178
  }),
4979
5179
  open && !suppressed && copyable && jsx("span", {
4980
- className: css$16.status,
5180
+ className: css$17.status,
4981
5181
  role: "status",
4982
5182
  children: copied ? copiedLabel : ""
4983
5183
  }),
@@ -5012,11 +5212,11 @@ function Modal({ open, onClose, title, closeLabel, description, children, footer
5012
5212
  useModalLayer(dialog, open, onClose);
5013
5213
  if (!open) return null;
5014
5214
  return createPortal(jsxs("div", {
5015
- className: css$17.root,
5215
+ className: css$18.root,
5016
5216
  role: "presentation",
5017
5217
  onKeyDownCapture,
5018
5218
  children: [jsx("div", {
5019
- className: css$17.mask,
5219
+ className: css$18.mask,
5020
5220
  style: backdropBlur ? void 0 : { backdropFilter: "none" },
5021
5221
  "aria-hidden": "true",
5022
5222
  onClick: onClose
@@ -5024,37 +5224,37 @@ function Modal({ open, onClose, title, closeLabel, description, children, footer
5024
5224
  ref: dialog,
5025
5225
  tabIndex: -1,
5026
5226
  "data-shortcut-modal": shortcutModal,
5027
- className: clsx(css$17.dialog, className),
5227
+ className: clsx(css$18.dialog, className),
5028
5228
  role: "dialog",
5029
5229
  "aria-modal": "true",
5030
5230
  "aria-label": title,
5031
5231
  children: headless ? children : jsxs(Fragment, { children: [jsxs("div", {
5032
- className: clsx(css$17.content, contentClassName),
5232
+ className: clsx(css$18.content, contentClassName),
5033
5233
  children: [
5034
5234
  jsxs("div", {
5035
- className: css$17.header,
5235
+ className: css$18.header,
5036
5236
  children: [jsx("h2", {
5037
- className: css$17.title,
5237
+ className: css$18.title,
5038
5238
  children: title
5039
5239
  }), jsx("button", {
5040
5240
  type: "button",
5041
- className: css$17.close,
5241
+ className: css$18.close,
5042
5242
  "aria-label": closeLabel,
5043
5243
  onClick: onClose,
5044
5244
  children: jsx(IconCloseOutlineRegular, { size: 14 })
5045
5245
  })]
5046
5246
  }),
5047
5247
  description !== void 0 && description !== "" && jsx("p", {
5048
- className: css$17.description,
5248
+ className: css$18.description,
5049
5249
  children: description
5050
5250
  }),
5051
5251
  children !== void 0 && jsx("div", {
5052
- className: css$17.body,
5252
+ className: css$18.body,
5053
5253
  children
5054
5254
  })
5055
5255
  ]
5056
5256
  }), footer !== void 0 && jsx("div", {
5057
- className: css$17.footer,
5257
+ className: css$18.footer,
5058
5258
  children: footer
5059
5259
  })] })
5060
5260
  })]
@@ -5076,28 +5276,28 @@ function RiskConfirmation({ open, title, description, acknowledgeLabel, cancelLa
5076
5276
  onClose: onCancel,
5077
5277
  title,
5078
5278
  closeLabel,
5079
- className: css$18.confirmation ?? "",
5080
- contentClassName: css$18.confirmationContent ?? "",
5279
+ className: css$19.confirmation ?? "",
5280
+ contentClassName: css$19.confirmationContent ?? "",
5081
5281
  footer: jsxs(Fragment, { children: [jsx(Button, {
5082
5282
  variant: "outline",
5083
- className: css$18.modalAction,
5283
+ className: css$19.modalAction,
5084
5284
  onClick: onCancel,
5085
5285
  children: cancelLabel
5086
5286
  }), jsx(Button, {
5087
5287
  variant: "primary",
5088
- className: css$18.confirmAction,
5288
+ className: css$19.confirmAction,
5089
5289
  disabled: disabled || !acknowledged,
5090
5290
  onClick: onConfirm,
5091
5291
  children: confirmLabel
5092
5292
  })] }),
5093
5293
  children: [jsxs("div", {
5094
- className: css$18.warning,
5294
+ className: css$19.warning,
5095
5295
  children: [jsx(IconWarningOutlineRegular, {
5096
5296
  size: 18,
5097
- className: css$18.warningIcon
5297
+ className: css$19.warningIcon
5098
5298
  }), jsx("p", { children: description })]
5099
5299
  }), jsxs("label", {
5100
- className: css$18.acknowledgement,
5300
+ className: css$19.acknowledgement,
5101
5301
  children: [jsx("input", {
5102
5302
  type: "checkbox",
5103
5303
  checked: acknowledged,
@@ -5145,44 +5345,44 @@ function ConnectionIndicator({ state, disconnectedLabel, connectingLabel, recove
5145
5345
  };
5146
5346
  }, [state, rendered]);
5147
5347
  if (rendered === void 0) return null;
5148
- const leavingClass = leaving ? ` ${css$19.leaving}` : "";
5348
+ const leavingClass = leaving ? ` ${css$20.leaving}` : "";
5149
5349
  if (rendered === "recovered") return jsxs("div", {
5150
- className: `${css$19.indicator} ${css$19.success}${leavingClass}`,
5350
+ className: `${css$20.indicator} ${css$20.success}${leavingClass}`,
5151
5351
  role: "status",
5152
5352
  "aria-label": recoveredLabel,
5153
5353
  children: [jsx("span", {
5154
- className: css$19.icon,
5354
+ className: css$20.icon,
5155
5355
  "aria-hidden": "true",
5156
5356
  children: jsx(IconCheckOutlineRegular, { size: 14 })
5157
5357
  }), jsx("span", {
5158
- className: css$19.label,
5358
+ className: css$20.label,
5159
5359
  children: recoveredLabel
5160
5360
  })]
5161
5361
  });
5162
5362
  const connecting = rendered === "connecting";
5163
5363
  return jsxs("button", {
5164
5364
  type: "button",
5165
- className: `${css$19.indicator} ${css$19.warning}${leavingClass}`,
5365
+ className: `${css$20.indicator} ${css$20.warning}${leavingClass}`,
5166
5366
  "data-phase": rendered,
5167
5367
  "aria-label": connecting ? restartActionLabel : reconnectActionLabel,
5168
5368
  onClick: onReconnect,
5169
5369
  children: [jsx("span", {
5170
- className: css$19.icon,
5370
+ className: css$20.icon,
5171
5371
  "aria-hidden": "true",
5172
5372
  children: connecting ? jsx(StateDot, { state: "ongoing" }) : jsx(IconRefreshOutlineRegular, { size: 14 })
5173
5373
  }), jsx("span", {
5174
- className: css$19.label,
5374
+ className: css$20.label,
5175
5375
  children: connecting ? jsxs(Fragment, { children: [connectingLabel, jsxs("span", {
5176
- className: css$19.dots,
5376
+ className: css$20.dots,
5177
5377
  "aria-hidden": "true",
5178
5378
  children: [
5179
5379
  jsx("span", { children: "." }),
5180
5380
  jsx("span", {
5181
- className: css$19.secondDot,
5381
+ className: css$20.secondDot,
5182
5382
  children: "."
5183
5383
  }),
5184
5384
  jsx("span", {
5185
- className: css$19.thirdDot,
5385
+ className: css$20.thirdDot,
5186
5386
  children: "."
5187
5387
  })
5188
5388
  ]
@@ -6213,7 +6413,7 @@ function FileTypeIcon(props) {
6213
6413
  type: resolvedType,
6214
6414
  size,
6215
6415
  className
6216
- }) : glyph(resolvedType, size, clsx(css$20.icon, css$20[resolvedType], className));
6416
+ }) : glyph(resolvedType, size, clsx(css$21.icon, css$21[resolvedType], className));
6217
6417
  }
6218
6418
  //#endregion
6219
6419
  //#region lib/types/SiteGlyph.js
@@ -6542,7 +6742,7 @@ function projectUserText(text, sessionLabels, slashNames = [], slashKind = "skil
6542
6742
  let cursor = 0;
6543
6743
  const pushPlain = (from, to) => {
6544
6744
  parts.push(jsx("span", {
6545
- className: css$21.plainRun,
6745
+ className: css$22.plainRun,
6546
6746
  children: text.slice(from, to)
6547
6747
  }, `t${from}`));
6548
6748
  };
@@ -6555,14 +6755,14 @@ function projectUserText(text, sessionLabels, slashNames = [], slashKind = "skil
6555
6755
  const contents = jsxs(Fragment, { children: [referenceKind !== void 0 && jsx(ReferenceIconRegular, {
6556
6756
  kind: referenceKind,
6557
6757
  size: 16,
6558
- className: css$21.refIcon
6758
+ className: css$22.refIcon
6559
6759
  }), displayLabel] });
6560
6760
  const open = references === void 0 ? void 0 : referenceKind === "file" ? () => {
6561
6761
  references.openFile(label.slice(1).replace(/^"|"$/gu, ""));
6562
6762
  } : referenceKind === void 0 && slashKind === "skill" ? () => {
6563
6763
  references.openSkill(label.slice(1));
6564
6764
  } : void 0;
6565
- const className = clsx(css$21.refChip, referenceKind === void 0 && css$21.slashChip);
6765
+ const className = clsx(css$22.refChip, referenceKind === void 0 && css$22.slashChip);
6566
6766
  parts.push(open === void 0 ? jsx("span", {
6567
6767
  className,
6568
6768
  "data-ref-chip": referenceKind ?? slashKind,
@@ -6582,7 +6782,7 @@ function projectUserText(text, sessionLabels, slashNames = [], slashKind = "skil
6582
6782
  cursor = end;
6583
6783
  }
6584
6784
  if (parts.length === 0) return jsx("span", {
6585
- className: css$21.plainRun,
6785
+ className: css$22.plainRun,
6586
6786
  children: text
6587
6787
  });
6588
6788
  if (cursor < text.length) pushPlain(cursor, text.length);
@@ -6655,25 +6855,25 @@ function Toast({ text, icon, tone, anchor, holdMs = HOLD_MS, actions, onDone })
6655
6855
  };
6656
6856
  }, [anchor]);
6657
6857
  return createPortal(jsxs("div", {
6658
- className: css$22.toast,
6858
+ className: css$23.toast,
6659
6859
  role: "alert",
6660
6860
  style: {
6661
6861
  ...left === null ? {} : { left },
6662
6862
  "--dsh-toast-hold": `${String(holdMs)}ms`
6663
6863
  },
6664
6864
  children: [tone === "success" ? jsx("span", {
6665
- className: `${css$22.icon} ${css$22.success}`,
6865
+ className: `${css$23.icon} ${css$23.success}`,
6666
6866
  "aria-hidden": true,
6667
6867
  children: jsx(IconCheckCircleOutlineRegular, {})
6668
6868
  }) : icon !== void 0 && jsx("span", {
6669
- className: css$22.icon,
6869
+ className: css$23.icon,
6670
6870
  "aria-hidden": true,
6671
6871
  children: icon
6672
6872
  }), jsxs("span", {
6673
- className: css$22.text,
6873
+ className: css$23.text,
6674
6874
  children: [text, actions?.map((action) => jsxs(Fragment$1, { children: [action.prefix, jsx("button", {
6675
6875
  type: "button",
6676
- className: css$22.action,
6876
+ className: css$23.action,
6677
6877
  onClick: action.onClick,
6678
6878
  children: action.label
6679
6879
  })] }, action.label))]
@@ -6723,29 +6923,29 @@ function SettingsForm(props) {
6723
6923
  discard.current();
6724
6924
  }, []);
6725
6925
  if (!state.available) return jsx("p", {
6726
- className: css$23.unavailable,
6926
+ className: css$24.unavailable,
6727
6927
  role: "status",
6728
6928
  children: labels.unavailable
6729
6929
  });
6730
6930
  const blocked = !state.dirty || state.invalid || state.saving;
6731
6931
  return jsxs("div", {
6732
- className: css$23.form,
6932
+ className: css$24.form,
6733
6933
  children: [
6734
6934
  !state.writable ? jsx("p", {
6735
- className: css$23.readOnly,
6935
+ className: css$24.readOnly,
6736
6936
  role: "status",
6737
6937
  children: labels.readOnly
6738
6938
  }) : null,
6739
6939
  props.children,
6740
6940
  jsxs("div", {
6741
- className: css$23.footer,
6941
+ className: css$24.footer,
6742
6942
  children: [state.failed ? jsx("p", {
6743
- className: css$23.failed,
6943
+ className: css$24.failed,
6744
6944
  role: "status",
6745
6945
  children: labels.saveFailed
6746
6946
  }) : null, jsx("button", {
6747
6947
  type: "button",
6748
- className: css$23.save,
6948
+ className: css$24.save,
6749
6949
  disabled: blocked,
6750
6950
  onClick: props.onSave,
6751
6951
  children: state.saving ? labels.saving : labels.save
@@ -6777,19 +6977,19 @@ function SettingsValueField(props) {
6777
6977
  const hasMessage = props.invalid || Boolean(props.hint);
6778
6978
  const description = [hasMessage ? messageId : "", helpOpen ? helpId : ""].filter(Boolean).join(" ");
6779
6979
  return jsxs("div", {
6780
- className: css$24.field,
6980
+ className: css$25.field,
6781
6981
  children: [
6782
6982
  jsxs("div", {
6783
- className: css$24.head,
6983
+ className: css$25.head,
6784
6984
  children: [jsxs("div", {
6785
- className: css$24.labelGroup,
6985
+ className: css$25.labelGroup,
6786
6986
  children: [jsx("label", {
6787
- className: css$24.label,
6987
+ className: css$25.label,
6788
6988
  htmlFor: props.id,
6789
6989
  children: props.label
6790
6990
  }), props.help !== void 0 ? jsx("button", {
6791
6991
  type: "button",
6792
- className: css$24.helpButton,
6992
+ className: css$25.helpButton,
6793
6993
  "aria-label": props.help.label,
6794
6994
  "aria-expanded": helpOpen,
6795
6995
  "aria-controls": helpId,
@@ -6799,13 +6999,13 @@ function SettingsValueField(props) {
6799
6999
  children: jsx(IconInfoOutlineRegular, { size: 12 })
6800
7000
  }) : null]
6801
7001
  }), props.overridden ? jsxs("span", {
6802
- className: css$24.badges,
7002
+ className: css$25.badges,
6803
7003
  children: [jsx(Tag, {
6804
7004
  tone: "neutral",
6805
7005
  children: props.overriddenLabel
6806
7006
  }), jsx("button", {
6807
7007
  type: "button",
6808
- className: css$24.reset,
7008
+ className: css$25.reset,
6809
7009
  disabled: props.disabled,
6810
7010
  onClick: props.onReset,
6811
7011
  children: props.resetLabel
@@ -6814,7 +7014,7 @@ function SettingsValueField(props) {
6814
7014
  }),
6815
7015
  jsx("input", {
6816
7016
  id: props.id,
6817
- className: css$24.input,
7017
+ className: css$25.input,
6818
7018
  type: "text",
6819
7019
  ...props.numeric === true ? { inputMode: "numeric" } : {},
6820
7020
  ...props.invalid ? { "aria-invalid": true } : {},
@@ -6828,12 +7028,12 @@ function SettingsValueField(props) {
6828
7028
  }),
6829
7029
  hasMessage ? jsx("p", {
6830
7030
  id: messageId,
6831
- className: props.invalid ? css$24.invalid : css$24.hint,
7031
+ className: props.invalid ? css$25.invalid : css$25.hint,
6832
7032
  children: props.invalid ? props.invalidLabel : props.hint
6833
7033
  }) : null,
6834
7034
  props.help !== void 0 && helpOpen ? jsx("div", {
6835
7035
  id: helpId,
6836
- className: css$24.help,
7036
+ className: css$25.help,
6837
7037
  role: "region",
6838
7038
  "aria-label": props.help.label,
6839
7039
  children: props.help.content
@@ -6851,16 +7051,16 @@ function SettingsValueField(props) {
6851
7051
  */
6852
7052
  function SettingsSecretField(props) {
6853
7053
  return jsxs("div", {
6854
- className: css$24.field,
7054
+ className: css$25.field,
6855
7055
  children: [
6856
7056
  jsxs("div", {
6857
- className: css$24.head,
7057
+ className: css$25.head,
6858
7058
  children: [jsx("label", {
6859
- className: css$24.label,
7059
+ className: css$25.label,
6860
7060
  htmlFor: props.id,
6861
7061
  children: props.label
6862
7062
  }), jsx("span", {
6863
- className: css$24.badges,
7063
+ className: css$25.badges,
6864
7064
  children: jsx(Tag, {
6865
7065
  tone: props.configured ? "neutral" : "quiet",
6866
7066
  children: props.stateLabel
@@ -6869,7 +7069,7 @@ function SettingsSecretField(props) {
6869
7069
  }),
6870
7070
  jsx("input", {
6871
7071
  id: props.id,
6872
- className: css$24.input,
7072
+ className: css$25.input,
6873
7073
  type: "password",
6874
7074
  autoComplete: "new-password",
6875
7075
  value: props.text,
@@ -6879,7 +7079,7 @@ function SettingsSecretField(props) {
6879
7079
  }
6880
7080
  }),
6881
7081
  jsx("p", {
6882
- className: css$24.hint,
7082
+ className: css$25.hint,
6883
7083
  children: props.hint
6884
7084
  })
6885
7085
  ]
@@ -7945,7 +8145,7 @@ function JsonCopyAction({ store, target, persistent, labels, onCopy, onClose })
7945
8145
  const object = typeof target.value === "object" && target.value !== null;
7946
8146
  const copyTitle = state === "copied" ? labels.copied : state === "failed" ? labels.copyFailed : object ? labels.copyPrettyJson : labels.copyValue;
7947
8147
  return jsx("span", {
7948
- className: css$25.copySlot,
8148
+ className: css$26.copySlot,
7949
8149
  children: (persistent || snapshot !== void 0) && jsx(Menu, {
7950
8150
  open: snapshot?.menuOpen === true,
7951
8151
  compact: true,
@@ -7954,7 +8154,7 @@ function JsonCopyAction({ store, target, persistent, labels, onCopy, onClose })
7954
8154
  anchor: jsx("button", {
7955
8155
  ref: buttonRef,
7956
8156
  type: "button",
7957
- className: css$25.actionButton,
8157
+ className: css$26.actionButton,
7958
8158
  "data-json-copy-button": true,
7959
8159
  "data-state": state,
7960
8160
  "aria-label": copyTitle,
@@ -7993,35 +8193,35 @@ function bracketOf(value) {
7993
8193
  }
7994
8194
  function previewPrimitive(value) {
7995
8195
  if (value === null) return jsx("span", {
7996
- className: css$25.keywordValue,
8196
+ className: css$26.keywordValue,
7997
8197
  children: "null"
7998
8198
  });
7999
8199
  if (typeof value === "string") return jsx("span", {
8000
- className: css$25.stringValue,
8200
+ className: css$26.stringValue,
8001
8201
  children: JSON.stringify(value)
8002
8202
  });
8003
8203
  if (typeof value === "number") return jsx("span", {
8004
- className: css$25.numberValue,
8204
+ className: css$26.numberValue,
8005
8205
  children: String(value)
8006
8206
  });
8007
8207
  if (typeof value === "boolean") return jsx("span", {
8008
- className: css$25.keywordValue,
8208
+ className: css$26.keywordValue,
8009
8209
  children: String(value)
8010
8210
  });
8011
8211
  if (typeof value === "bigint") return jsx("span", {
8012
- className: css$25.otherValue,
8212
+ className: css$26.otherValue,
8013
8213
  children: value.toString()
8014
8214
  });
8015
8215
  if (typeof value === "undefined") return jsx("span", {
8016
- className: css$25.otherValue,
8216
+ className: css$26.otherValue,
8017
8217
  children: "undefined"
8018
8218
  });
8019
8219
  if (typeof value === "symbol") return jsx("span", {
8020
- className: css$25.otherValue,
8220
+ className: css$26.otherValue,
8021
8221
  children: value.description ?? "Symbol"
8022
8222
  });
8023
8223
  if (typeof value === "function") return jsx("span", {
8024
- className: css$25.otherValue,
8224
+ className: css$26.otherValue,
8025
8225
  children: value.name || "Function"
8026
8226
  });
8027
8227
  return null;
@@ -8035,71 +8235,71 @@ function previewValue(value, depth) {
8035
8235
  const [open, close] = bracketOf(value);
8036
8236
  return jsxs(Fragment, { children: [
8037
8237
  jsx("span", {
8038
- className: css$25.punctuation,
8238
+ className: css$26.punctuation,
8039
8239
  children: open
8040
8240
  }),
8041
8241
  depth >= PREVIEW_DEPTH_LIMIT ? jsx("span", {
8042
- className: css$25.previewEllipsis,
8242
+ className: css$26.previewEllipsis,
8043
8243
  children: "…"
8044
8244
  }) : visible.map(([key, item], index) => jsxs("span", { children: [
8045
8245
  index > 0 && jsx("span", {
8046
- className: css$25.punctuation,
8246
+ className: css$26.punctuation,
8047
8247
  children: ", "
8048
8248
  }),
8049
8249
  !array && jsxs(Fragment, { children: [jsx("span", {
8050
- className: css$25.previewProperty,
8250
+ className: css$26.previewProperty,
8051
8251
  children: key
8052
8252
  }), jsx("span", {
8053
- className: css$25.punctuation,
8253
+ className: css$26.punctuation,
8054
8254
  children: ": "
8055
8255
  })] }),
8056
8256
  previewValue(item, depth + 1)
8057
8257
  ] }, key)),
8058
8258
  depth < PREVIEW_DEPTH_LIMIT && entries.length > limit && jsx("span", {
8059
- className: css$25.previewEllipsis,
8259
+ className: css$26.previewEllipsis,
8060
8260
  children: ", …"
8061
8261
  }),
8062
8262
  jsx("span", {
8063
- className: css$25.punctuation,
8263
+ className: css$26.punctuation,
8064
8264
  children: close
8065
8265
  })
8066
8266
  ] });
8067
8267
  }
8068
8268
  function primitiveValue(value) {
8069
8269
  if (value === null) return jsx("span", {
8070
- className: css$25.keywordValue,
8270
+ className: css$26.keywordValue,
8071
8271
  children: "null"
8072
8272
  });
8073
8273
  if (typeof value === "string") return jsx("span", {
8074
- className: css$25.stringValue,
8274
+ className: css$26.stringValue,
8075
8275
  children: JSON.stringify(value)
8076
8276
  });
8077
8277
  if (typeof value === "boolean") return jsx("span", {
8078
- className: css$25.keywordValue,
8278
+ className: css$26.keywordValue,
8079
8279
  children: String(value)
8080
8280
  });
8081
8281
  if (typeof value === "number") return jsx("span", {
8082
- className: css$25.numberValue,
8282
+ className: css$26.numberValue,
8083
8283
  children: String(value)
8084
8284
  });
8085
8285
  if (typeof value === "bigint") return jsx("span", {
8086
- className: css$25.numberValue,
8286
+ className: css$26.numberValue,
8087
8287
  children: `${value.toString()}n`
8088
8288
  });
8089
8289
  if (value instanceof Date) return jsx("span", {
8090
- className: css$25.otherValue,
8290
+ className: css$26.otherValue,
8091
8291
  children: value.toISOString()
8092
8292
  });
8093
8293
  if (typeof value === "function") return jsxs("span", {
8094
- className: css$25.otherValue,
8294
+ className: css$26.otherValue,
8095
8295
  children: ["function() ", "{ }"]
8096
8296
  });
8097
8297
  if (typeof value === "undefined") return jsx("span", {
8098
- className: css$25.otherValue,
8298
+ className: css$26.otherValue,
8099
8299
  children: "undefined"
8100
8300
  });
8101
8301
  return jsx("span", {
8102
- className: css$25.otherValue,
8302
+ className: css$26.otherValue,
8103
8303
  children: value.toString()
8104
8304
  });
8105
8305
  }
@@ -8127,7 +8327,7 @@ function moveFocus(button, direction) {
8127
8327
  function NodeField({ field, expandable, onToggle }) {
8128
8328
  if (field === void 0) return null;
8129
8329
  return jsxs("span", {
8130
- className: clsx(css$25.label, expandable && css$25.clickableLabel),
8330
+ className: clsx(css$26.label, expandable && css$26.clickableLabel),
8131
8331
  onClick: expandable ? onToggle : void 0,
8132
8332
  children: [fieldText(field), ":"]
8133
8333
  });
@@ -8164,7 +8364,7 @@ function JsonString({ collapsedStringLines, stringWrapping, field, labels, lastE
8164
8364
  if (!expanded) return;
8165
8365
  const raw = rawRef.current;
8166
8366
  const clips = [];
8167
- const tree = raw.closest(`.${css$25.root}`);
8367
+ const tree = raw.closest(`.${css$26.root}`);
8168
8368
  for (let parent = tree.parentElement; parent !== null; parent = parent.parentElement) if (/auto|scroll|hidden|clip/.test(getComputedStyle(parent).overflowY)) clips.push(parent);
8169
8369
  const measure = () => {
8170
8370
  let top = 0;
@@ -8193,33 +8393,33 @@ function JsonString({ collapsedStringLines, stringWrapping, field, labels, lastE
8193
8393
  if (expanded) {
8194
8394
  const fieldId = `${contentsId}-field`;
8195
8395
  return jsxs("div", {
8196
- className: css$25.stringField,
8396
+ className: css$26.stringField,
8197
8397
  "data-expanded": true,
8198
8398
  children: [
8199
8399
  field !== void 0 && jsxs("span", {
8200
8400
  id: fieldId,
8201
- className: css$25.label,
8401
+ className: css$26.label,
8202
8402
  children: [fieldText(field), ":"]
8203
8403
  }),
8204
8404
  jsx("pre", {
8205
8405
  ref: rawRef,
8206
8406
  id: contentsId,
8207
- className: css$25.stringRaw,
8407
+ className: css$26.stringRaw,
8208
8408
  "data-wrap": wrapped,
8209
8409
  tabIndex: 0,
8210
8410
  "aria-labelledby": field === void 0 ? void 0 : fieldId,
8211
8411
  children: value
8212
8412
  }),
8213
8413
  !lastElement && jsx("span", {
8214
- className: css$25.punctuation,
8414
+ className: css$26.punctuation,
8215
8415
  children: ","
8216
8416
  }),
8217
8417
  jsxs("div", {
8218
- className: css$25.stringActions,
8418
+ className: css$26.stringActions,
8219
8419
  children: [
8220
8420
  stringWrapping !== void 0 && jsx("button", {
8221
8421
  type: "button",
8222
- className: css$25.actionButton,
8422
+ className: css$26.actionButton,
8223
8423
  "aria-label": stringWrapping.label,
8224
8424
  title: stringWrapping.label,
8225
8425
  "aria-pressed": wrapped,
@@ -8233,7 +8433,7 @@ function JsonString({ collapsedStringLines, stringWrapping, field, labels, lastE
8233
8433
  }),
8234
8434
  jsx("button", {
8235
8435
  type: "button",
8236
- className: css$25.actionButton,
8436
+ className: css$26.actionButton,
8237
8437
  "aria-label": labels.collapseNode,
8238
8438
  title: labels.collapseNode,
8239
8439
  "aria-expanded": true,
@@ -8258,18 +8458,18 @@ function JsonString({ collapsedStringLines, stringWrapping, field, labels, lastE
8258
8458
  });
8259
8459
  }
8260
8460
  return jsxs(Fragment, { children: [renderCopy?.(), jsx("span", {
8261
- className: css$25.stringField,
8461
+ className: css$26.stringField,
8262
8462
  "data-expanded": expanded,
8263
8463
  children: jsxs("span", {
8264
8464
  ref: contentRef,
8265
8465
  id: contentsId,
8266
- className: css$25.stringText,
8466
+ className: css$26.stringText,
8267
8467
  children: [
8268
8468
  truncated && jsx("span", {
8269
- className: css$25.stringToggleSlot,
8469
+ className: css$26.stringToggleSlot,
8270
8470
  children: jsxs("button", {
8271
8471
  type: "button",
8272
- className: css$25.stringToggle,
8472
+ className: css$26.stringToggle,
8273
8473
  "aria-label": labels.expandNode,
8274
8474
  "aria-expanded": false,
8275
8475
  "aria-controls": contentsId,
@@ -8284,12 +8484,12 @@ function JsonString({ collapsedStringLines, stringWrapping, field, labels, lastE
8284
8484
  })
8285
8485
  }),
8286
8486
  field !== void 0 && jsxs("span", {
8287
- className: css$25.label,
8487
+ className: css$26.label,
8288
8488
  children: [fieldText(field), ":"]
8289
8489
  }),
8290
8490
  primitiveValue(value),
8291
8491
  !lastElement && jsx("span", {
8292
- className: css$25.punctuation,
8492
+ className: css$26.punctuation,
8293
8493
  children: ","
8294
8494
  })
8295
8495
  ]
@@ -8320,7 +8520,7 @@ function JsonTreeNode({ collapsedStringLines, stringWrapping, field, initialExpa
8320
8520
  }
8321
8521
  };
8322
8522
  const row = (children, ariaExpanded) => jsxs("div", {
8323
- className: css$25.row,
8523
+ className: css$26.row,
8324
8524
  role: "treeitem",
8325
8525
  "aria-expanded": ariaExpanded,
8326
8526
  onMouseOver: (event) => {
@@ -8355,7 +8555,7 @@ function JsonTreeNode({ collapsedStringLines, stringWrapping, field, initialExpa
8355
8555
  }),
8356
8556
  primitiveValue(value),
8357
8557
  !lastElement && jsx("span", {
8358
- className: css$25.punctuation,
8558
+ className: css$26.punctuation,
8359
8559
  children: ","
8360
8560
  })
8361
8561
  ] }));
@@ -8367,22 +8567,22 @@ function JsonTreeNode({ collapsedStringLines, stringWrapping, field, initialExpa
8367
8567
  onToggle: toggle
8368
8568
  }),
8369
8569
  jsx("span", {
8370
- className: css$25.punctuation,
8570
+ className: css$26.punctuation,
8371
8571
  children: open
8372
8572
  }),
8373
8573
  jsx("span", {
8374
- className: css$25.punctuation,
8574
+ className: css$26.punctuation,
8375
8575
  children: close
8376
8576
  }),
8377
8577
  !lastElement && jsx("span", {
8378
- className: css$25.punctuation,
8578
+ className: css$26.punctuation,
8379
8579
  children: ","
8380
8580
  })
8381
8581
  ] }));
8382
8582
  return row(jsxs(Fragment, { children: [
8383
8583
  jsx("span", {
8384
8584
  ref: expanderRef,
8385
- className: clsx(css$25.expander, expanded ? css$25.collapseIcon : css$25.expandIcon),
8585
+ className: clsx(css$26.expander, expanded ? css$26.collapseIcon : css$26.expandIcon),
8386
8586
  "data-json-expander": true,
8387
8587
  role: "button",
8388
8588
  "aria-label": expanded ? labels.collapseNode : labels.expandNode,
@@ -8396,7 +8596,7 @@ function JsonTreeNode({ collapsedStringLines, stringWrapping, field, initialExpa
8396
8596
  onKeyDown: onExpanderKeyDown
8397
8597
  }),
8398
8598
  jsxs("span", {
8399
- className: css$25.summary,
8599
+ className: css$26.summary,
8400
8600
  children: [
8401
8601
  jsx(NodeField, {
8402
8602
  field,
@@ -8404,11 +8604,11 @@ function JsonTreeNode({ collapsedStringLines, stringWrapping, field, initialExpa
8404
8604
  onToggle: toggle
8405
8605
  }),
8406
8606
  jsx("span", {
8407
- className: css$25.preview,
8607
+ className: css$26.preview,
8408
8608
  children: previewValue(value, 0)
8409
8609
  }),
8410
8610
  !lastElement && jsx("span", {
8411
- className: css$25.punctuation,
8611
+ className: css$26.punctuation,
8412
8612
  children: ","
8413
8613
  })
8414
8614
  ]
@@ -8416,7 +8616,7 @@ function JsonTreeNode({ collapsedStringLines, stringWrapping, field, initialExpa
8416
8616
  expanded && jsx("ul", {
8417
8617
  id: contentsId,
8418
8618
  role: "group",
8419
- className: css$25.children,
8619
+ className: css$26.children,
8420
8620
  children: entries.map(([key, item], index) => jsx(JsonTreeNode, {
8421
8621
  collapsedStringLines,
8422
8622
  stringWrapping,
@@ -8548,17 +8748,17 @@ function JsonTree({ data, label, className, collapsedStringLines = 3, stringWrap
8548
8748
  onClose: clearCopyTarget
8549
8749
  }) : void 0;
8550
8750
  return jsx("div", {
8551
- className: clsx(css$25.root, className),
8751
+ className: clsx(css$26.root, className),
8552
8752
  style: { "--json-tree-collapsed-lines": collapsedStringLines },
8553
8753
  onMouseOver: handleRootMouseOver,
8554
8754
  onMouseLeave: () => {
8555
8755
  if (!copyStore.get()?.menuOpen) clearCopyTarget();
8556
8756
  },
8557
8757
  children: expandTopLevel ? jsxs("div", {
8558
- className: css$25.expandedTopLevel,
8758
+ className: css$26.expandedTopLevel,
8559
8759
  children: [
8560
8760
  jsxs("div", {
8561
- className: clsx(css$25.row, css$25.topLevelBracket),
8761
+ className: clsx(css$26.row, css$26.topLevelBracket),
8562
8762
  "data-json-root-row": true,
8563
8763
  onMouseOver: (event) => {
8564
8764
  event.stopPropagation();
@@ -8571,13 +8771,13 @@ function JsonTree({ data, label, className, collapsedStringLines = 3, stringWrap
8571
8771
  path: [],
8572
8772
  value: data
8573
8773
  }), jsx("span", {
8574
- className: css$25.punctuation,
8774
+ className: css$26.punctuation,
8575
8775
  children: rootOpen
8576
8776
  })]
8577
8777
  }),
8578
8778
  jsx("div", {
8579
8779
  "aria-label": label,
8580
- className: clsx(css$25.container, css$25.expandedTopLevelContainer),
8780
+ className: clsx(css$26.container, css$26.expandedTopLevelContainer),
8581
8781
  role: "tree",
8582
8782
  children: rootEntries.map(([key, value], index) => jsx(JsonTreeNode, {
8583
8783
  collapsedStringLines,
@@ -8595,16 +8795,16 @@ function JsonTree({ data, label, className, collapsedStringLines = 3, stringWrap
8595
8795
  }, key))
8596
8796
  }),
8597
8797
  jsx("div", {
8598
- className: clsx(css$25.row, css$25.topLevelBracket),
8798
+ className: clsx(css$26.row, css$26.topLevelBracket),
8599
8799
  children: jsx("span", {
8600
- className: css$25.punctuation,
8800
+ className: css$26.punctuation,
8601
8801
  children: rootClose
8602
8802
  })
8603
8803
  })
8604
8804
  ]
8605
8805
  }) : jsx("div", {
8606
8806
  "aria-label": label,
8607
- className: css$25.container,
8807
+ className: css$26.container,
8608
8808
  role: "tree",
8609
8809
  children: jsx(JsonTreeNode, {
8610
8810
  collapsedStringLines,
@@ -9167,67 +9367,67 @@ function TerminalBlock({ command, cwd, home, output, exitCode, signal, running =
9167
9367
  const { hidden, capped, headLines, tailLines } = headTailCap(lines.length, maxLines, expanded);
9168
9368
  const body = !running || !empty;
9169
9369
  return jsxs("div", {
9170
- className: clsx(css$26.block, className),
9370
+ className: clsx(css$27.block, className),
9171
9371
  "data-terminal": "",
9172
9372
  "data-running": running ? "" : void 0,
9173
9373
  "data-body": body ? "" : void 0,
9174
9374
  children: [jsxs("div", {
9175
- className: css$26.header,
9375
+ className: css$27.header,
9176
9376
  children: [
9177
9377
  jsxs("div", {
9178
- className: css$26.prompt,
9378
+ className: css$27.prompt,
9179
9379
  children: [runStateDot && jsx("span", {
9180
- className: css$26.runStateLabel,
9380
+ className: css$27.runStateLabel,
9181
9381
  children: state.label
9182
9382
  }), commandLines.map((line, index) => jsxs("div", {
9183
- className: css$26.promptLine,
9383
+ className: css$27.promptLine,
9184
9384
  children: [
9185
9385
  index === 0 && runStateDot && jsx(StateDot, {
9186
9386
  state: state.state,
9187
- className: css$26.runState
9387
+ className: css$27.runState
9188
9388
  }),
9189
9389
  jsx("span", {
9190
- className: css$26.cwd,
9390
+ className: css$27.cwd,
9191
9391
  children: index > 0 || cwd === void 0 ? "$" : promptLabel(cwd, home)
9192
9392
  }),
9193
9393
  jsx("span", {
9194
- className: css$26.command,
9394
+ className: css$27.command,
9195
9395
  children: line
9196
9396
  })
9197
9397
  ]
9198
9398
  }, index))]
9199
9399
  }),
9200
9400
  status !== void 0 && jsx(Pill, {
9201
- className: css$26.status,
9401
+ className: css$27.status,
9202
9402
  children: status
9203
9403
  }),
9204
9404
  (copyText !== void 0 || !running && !empty) && jsx("button", {
9205
9405
  type: "button",
9206
- className: css$26.copyButton,
9406
+ className: css$27.copyButton,
9207
9407
  onClick: onCopy,
9208
9408
  children: copied ? copy.copied : copy.copy
9209
9409
  })
9210
9410
  ]
9211
9411
  }), body && (empty ? jsx("div", {
9212
- className: css$26.empty,
9412
+ className: css$27.empty,
9213
9413
  children: copy.noOutput
9214
9414
  }) : jsxs("div", {
9215
- className: css$26.output,
9415
+ className: css$27.output,
9216
9416
  children: [
9217
9417
  (capped ? lines.slice(0, headLines) : lines).map((line, index) => jsx("div", {
9218
- className: css$26.line,
9418
+ className: css$27.line,
9219
9419
  children: renderLine$1(line)
9220
9420
  }, index)),
9221
9421
  hidden > 0 && jsx("button", {
9222
9422
  type: "button",
9223
- className: css$26.expand,
9423
+ className: css$27.expand,
9224
9424
  "aria-expanded": expanded,
9225
9425
  "aria-label": expanded ? copy.collapseAria : copy.expandAria(hidden),
9226
9426
  onClick: onToggle,
9227
9427
  children: expanded ? copy.collapse : copy.expand(hidden)
9228
9428
  }),
9229
9429
  capped && lines.slice(lines.length - tailLines).map((line, index) => jsx("div", {
9230
- className: css$26.line,
9430
+ className: css$27.line,
9231
9431
  children: renderLine$1(line)
9232
9432
  }, index))
9233
9433
  ]
@@ -9430,13 +9630,13 @@ function ReadBlock({ label, labels, lines, totalLines, lang, maxLines = 16, clas
9430
9630
  const tailLines = maxLines - headLines;
9431
9631
  const windowed = lines.length < totalLines;
9432
9632
  const rows = (slice) => slice.map(([line, spans]) => jsxs("div", {
9433
- className: css$27.line,
9633
+ className: css$28.line,
9434
9634
  children: [jsx("span", {
9435
- className: css$27.gutter,
9635
+ className: css$28.gutter,
9436
9636
  "aria-hidden": true,
9437
9637
  children: line.number
9438
9638
  }), jsx("span", {
9439
- className: css$27.content,
9639
+ className: css$28.content,
9440
9640
  children: spans === void 0 ? line.text : renderSpans(spans)
9441
9641
  })]
9442
9642
  }, line.number));
@@ -9444,7 +9644,7 @@ function ReadBlock({ label, labels, lines, totalLines, lang, maxLines = 16, clas
9444
9644
  const paired = lines.map((line, index) => [line, highlighted?.[index]]);
9445
9645
  return jsxs("div", {
9446
9646
  ref: rootRef,
9447
- className: clsx(cardCss.card, css$27.block, className),
9647
+ className: clsx(cardCss.card, css$28.block, className),
9448
9648
  "data-read": "",
9449
9649
  "data-code-wrap": wrapped,
9450
9650
  style: gutterStyle,
@@ -9466,7 +9666,7 @@ function ReadBlock({ label, labels, lines, totalLines, lang, maxLines = 16, clas
9466
9666
  children: [
9467
9667
  rows(capped ? paired.slice(0, headLines) : paired),
9468
9668
  hidden > 0 && jsx(FoldToggle, {
9469
- className: css$27.expand,
9669
+ className: css$28.expand,
9470
9670
  expanded,
9471
9671
  hidden,
9472
9672
  labels,
@@ -9488,11 +9688,11 @@ function assertNever(value) {
9488
9688
  }
9489
9689
  /** The dim class per row kind (path/gap chrome vs the diff's own +/- colors). */
9490
9690
  const ROW_CLASS = {
9491
- path: css$28.path,
9492
- del: css$28.del,
9493
- add: css$28.add,
9494
- context: css$28.context,
9495
- gap: css$28.gap
9691
+ path: css$29.path,
9692
+ del: css$29.del,
9693
+ add: css$29.add,
9694
+ context: css$29.context,
9695
+ gap: css$29.gap
9496
9696
  };
9497
9697
  /** Bound synchronous edit-graph search; one replacement consumes two edits. */
9498
9698
  const MAX_DIFF_EDIT_LENGTH = 256;
@@ -9626,7 +9826,7 @@ function DiffBlock({ diffs, labels, maxLines = 16, className }) {
9626
9826
  const head = capped ? rows.slice(0, headLines) : rows;
9627
9827
  const tail = capped ? rows.slice(rows.length - tailLines) : [];
9628
9828
  return jsxs("div", {
9629
- className: clsx(cardCss.card, css$28.block, className),
9829
+ className: clsx(cardCss.card, css$29.block, className),
9630
9830
  "data-diff": "",
9631
9831
  "data-code-wrap": wrapped,
9632
9832
  children: [jsx(CodeToolbar, {
@@ -9641,21 +9841,21 @@ function DiffBlock({ diffs, labels, maxLines = 16, className }) {
9641
9841
  setWrapped((value) => !value);
9642
9842
  }
9643
9843
  }), jsxs("div", {
9644
- className: css$28.body,
9844
+ className: css$29.body,
9645
9845
  children: [
9646
9846
  head.map((row, index) => jsx("div", {
9647
- className: clsx(css$28.line, ROW_CLASS[row.kind]),
9847
+ className: clsx(css$29.line, ROW_CLASS[row.kind]),
9648
9848
  children: row.text
9649
9849
  }, index)),
9650
9850
  hidden > 0 && jsx(FoldToggle, {
9651
- className: css$28.expand,
9851
+ className: css$29.expand,
9652
9852
  expanded,
9653
9853
  hidden,
9654
9854
  labels,
9655
9855
  onToggle
9656
9856
  }),
9657
9857
  tail.map((row, index) => jsx("div", {
9658
- className: clsx(css$28.line, ROW_CLASS[row.kind]),
9858
+ className: clsx(css$29.line, ROW_CLASS[row.kind]),
9659
9859
  children: row.text
9660
9860
  }, index))
9661
9861
  ]
@@ -9785,56 +9985,56 @@ function SearchBlock(props) {
9785
9985
  const tail = tailHeader === void 0 ? naturalTail : naturalTail.slice(1);
9786
9986
  const renderRow = (row) => {
9787
9987
  if (row.type === "path") return jsx("div", {
9788
- className: css$29.line,
9988
+ className: css$30.line,
9789
9989
  children: row.path
9790
9990
  });
9791
9991
  if (row.type === "match") return jsxs("div", {
9792
- className: css$29.line,
9992
+ className: css$30.line,
9793
9993
  children: [jsxs("span", {
9794
- className: css$29.lineNumber,
9994
+ className: css$30.lineNumber,
9795
9995
  children: [row.lineNumber, ": "]
9796
9996
  }), row.line]
9797
9997
  });
9798
9998
  return jsxs("button", {
9799
9999
  type: "button",
9800
- className: css$29.fileHeader,
10000
+ className: css$30.fileHeader,
9801
10001
  "aria-expanded": !row.collapsed,
9802
10002
  onClick: () => {
9803
10003
  toggleFile(row.index);
9804
10004
  },
9805
10005
  children: [jsx("span", {
9806
- className: css$29.filePath,
10006
+ className: css$30.filePath,
9807
10007
  children: row.path
9808
10008
  }), jsx("span", {
9809
- className: css$29.fileCount,
10009
+ className: css$30.fileCount,
9810
10010
  children: row.count
9811
10011
  })]
9812
10012
  });
9813
10013
  };
9814
10014
  return jsxs("div", {
9815
- className: clsx(css$29.block, className),
10015
+ className: clsx(css$30.block, className),
9816
10016
  "data-search": props.kind,
9817
10017
  children: [jsxs("div", {
9818
- className: css$29.header,
10018
+ className: css$30.header,
9819
10019
  children: [jsx("span", {
9820
- className: css$29.summary,
10020
+ className: css$30.summary,
9821
10021
  children: summaryText(props, shown, truncated, total)
9822
10022
  }), !empty && jsx("button", {
9823
10023
  type: "button",
9824
- className: css$29.copyButton,
10024
+ className: css$30.copyButton,
9825
10025
  onClick: onCopy,
9826
10026
  children: copied ? props.labels.copied : props.labels.copy
9827
10027
  })]
9828
10028
  }), empty ? jsx("div", {
9829
- className: css$29.empty,
10029
+ className: css$30.empty,
9830
10030
  children: props.labels.noResults
9831
10031
  }) : jsxs("div", {
9832
- className: css$29.body,
10032
+ className: css$30.body,
9833
10033
  children: [
9834
10034
  head.map((row) => jsx("div", { children: renderRow(row) }, rowKey(row))),
9835
10035
  hidden > 0 && jsx("button", {
9836
10036
  type: "button",
9837
- className: css$29.expand,
10037
+ className: css$30.expand,
9838
10038
  "aria-expanded": expanded,
9839
10039
  "aria-label": expanded ? props.labels.collapseAria : props.labels.expandAria(hidden),
9840
10040
  onClick: onToggle,
@@ -10664,7 +10864,7 @@ function CodeBlock({ code, lang, streaming, className, contentRef, lineNumbers =
10664
10864
  });
10665
10865
  }, [copied, trimmed]);
10666
10866
  const body = streamedBody !== void 0 ? streamedBody : html === void 0 ? jsx("pre", {
10667
- className: css$30.plain,
10867
+ className: css$31.plain,
10668
10868
  children: jsx("code", { children: sourceLines === void 0 ? trimmed : sourceLines.map((line, index) => jsxs(Fragment$1, { children: [index > 0 && "\n", jsx("span", {
10669
10869
  className: "line",
10670
10870
  children: line
@@ -10672,12 +10872,12 @@ function CodeBlock({ code, lang, streaming, className, contentRef, lineNumbers =
10672
10872
  }) : jsx("div", { dangerouslySetInnerHTML: { __html: html } });
10673
10873
  return jsxs("div", {
10674
10874
  ref: rootRef,
10675
- className: clsx(css$30.block, "md-code-block", lineNumbers && css$30.numbered, toolbarLabels !== void 0 && css$30.card, className),
10875
+ className: clsx(css$31.block, "md-code-block", lineNumbers && css$31.numbered, toolbarLabels !== void 0 && css$31.card, className),
10676
10876
  "data-line-numbers": lineNumbers || void 0,
10677
10877
  "data-code-wrap": toolbarLabels === void 0 ? void 0 : wrapped,
10678
10878
  style: sourceLines === void 0 ? void 0 : { "--dsl-code-block-line-number-width": `${Math.max(2, String(sourceLines.length).length)}ch` },
10679
10879
  children: [showHeader && jsx("div", {
10680
- className: css$30.bannerWrap,
10880
+ className: css$31.bannerWrap,
10681
10881
  children: toolbarLabels !== void 0 ? jsx(CodeToolbar, {
10682
10882
  lang,
10683
10883
  labels: toolbarLabels,
@@ -10690,16 +10890,16 @@ function CodeBlock({ code, lang, streaming, className, contentRef, lineNumbers =
10690
10890
  setWrapped((value) => !value);
10691
10891
  } : void 0
10692
10892
  }) : jsxs("div", {
10693
- className: css$30.banner,
10893
+ className: css$31.banner,
10694
10894
  "data-code-block-banner": true,
10695
10895
  children: [jsx("div", {
10696
- className: css$30.infostring,
10896
+ className: css$31.infostring,
10697
10897
  children: lang ?? ""
10698
10898
  }), jsx("div", {
10699
- className: css$30.action,
10899
+ className: css$31.action,
10700
10900
  children: jsx("button", {
10701
10901
  type: "button",
10702
- className: css$30.copyButton,
10902
+ className: css$31.copyButton,
10703
10903
  onClick: onCopy,
10704
10904
  children: copied ? copiedLabel : copyLabel
10705
10905
  })
@@ -10707,7 +10907,7 @@ function CodeBlock({ code, lang, streaming, className, contentRef, lineNumbers =
10707
10907
  })
10708
10908
  }), jsx("div", {
10709
10909
  ref: contentRef,
10710
- className: css$30.content,
10910
+ className: css$31.content,
10711
10911
  "data-code-block-content": true,
10712
10912
  children: body
10713
10913
  })]
@@ -10897,25 +11097,25 @@ function ImageLightbox({ src, alt, labels, onClose }) {
10897
11097
  };
10898
11098
  }, [onClose]);
10899
11099
  return createPortal(jsxs("div", {
10900
- className: css$31.backdrop,
11100
+ className: css$32.backdrop,
10901
11101
  role: "dialog",
10902
11102
  "aria-modal": "true",
10903
11103
  "aria-label": labels.dialog,
10904
11104
  children: [
10905
11105
  jsx("div", {
10906
- className: css$31.mask,
11106
+ className: css$32.mask,
10907
11107
  "aria-hidden": "true",
10908
11108
  onMouseDown: onClose
10909
11109
  }),
10910
11110
  jsx("img", {
10911
- className: css$31.image,
11111
+ className: css$32.image,
10912
11112
  src,
10913
11113
  alt
10914
11114
  }),
10915
11115
  jsx("button", {
10916
11116
  ref: closeRef,
10917
11117
  type: "button",
10918
- className: css$31.close,
11118
+ className: css$32.close,
10919
11119
  "aria-label": labels.close,
10920
11120
  onClick: onClose,
10921
11121
  children: jsx(IconCloseOutlineRegular, { size: 16 })
@@ -10942,14 +11142,14 @@ function ImagePreview({ src, alt, loadingLabel, failedLabel }) {
10942
11142
  function Preview({ src, alt, loadingLabel, failedLabel }) {
10943
11143
  const [state, setState] = useState("loading");
10944
11144
  return jsxs("span", {
10945
- className: css$32.frame,
11145
+ className: css$33.frame,
10946
11146
  children: [state !== "failed" && jsx("img", {
10947
11147
  src,
10948
11148
  alt,
10949
11149
  loading: "lazy",
10950
11150
  decoding: "async",
10951
11151
  referrerPolicy: "no-referrer",
10952
- className: css$32.image,
11152
+ className: css$33.image,
10953
11153
  "data-ready": state === "ready" || void 0,
10954
11154
  onLoad: () => {
10955
11155
  setState("ready");
@@ -10958,7 +11158,7 @@ function Preview({ src, alt, loadingLabel, failedLabel }) {
10958
11158
  setState("failed");
10959
11159
  }
10960
11160
  }), state !== "ready" && jsxs("span", {
10961
- className: css$32.status,
11161
+ className: css$33.status,
10962
11162
  role: "status",
10963
11163
  children: [state === "loading" && jsx(IconLoadingOutlineRegular, { size: 16 }), jsx("span", { children: state === "loading" ? loadingLabel : failedLabel })]
10964
11164
  })]
@@ -11697,7 +11897,7 @@ function SafeLink({ url, label, className }) {
11697
11897
  children: [jsx(LinkIconMedium, {
11698
11898
  kind: "url",
11699
11899
  href,
11700
- className: css$33.linkIcon
11900
+ className: css$34.linkIcon
11701
11901
  }), label]
11702
11902
  });
11703
11903
  }
@@ -11712,20 +11912,20 @@ function SafeLink({ url, label, className }) {
11712
11912
  */
11713
11913
  function SourceItem({ source, ordinal }) {
11714
11914
  return jsxs("li", {
11715
- className: css$33.source,
11915
+ className: css$34.source,
11716
11916
  value: ordinal,
11717
11917
  children: [
11718
11918
  jsx(SafeLink, {
11719
11919
  url: source.url,
11720
11920
  label: linkLabel(source.url, source.title),
11721
- className: css$33.sourceLink
11921
+ className: css$34.sourceLink
11722
11922
  }),
11723
11923
  source.snippet !== void 0 && source.snippet !== "" && jsx("div", {
11724
- className: css$33.snippet,
11924
+ className: css$34.snippet,
11725
11925
  children: source.snippet
11726
11926
  }),
11727
11927
  source.publishedAt !== void 0 && source.publishedAt !== "" && jsx("div", {
11728
- className: css$33.published,
11928
+ className: css$34.published,
11729
11929
  children: source.publishedAt
11730
11930
  })
11731
11931
  ]
@@ -11740,28 +11940,28 @@ function SourceItem({ source, ordinal }) {
11740
11940
  function WebSearchBlock({ answer, sources, truncated, labels, className }) {
11741
11941
  const empty = (answer === void 0 || answer === "") && sources.length === 0;
11742
11942
  return jsxs("div", {
11743
- className: clsx(css$33.block, className),
11943
+ className: clsx(css$34.block, className),
11744
11944
  "data-web": "search",
11745
11945
  children: [
11746
11946
  answer !== void 0 && answer !== "" && jsx("div", {
11747
- className: css$33.answer,
11947
+ className: css$34.answer,
11748
11948
  children: jsx(MarkdownText, {
11749
11949
  text: answer,
11750
11950
  labels: labels.markdown
11751
11951
  })
11752
11952
  }),
11753
11953
  empty ? jsx("div", {
11754
- className: css$33.empty,
11954
+ className: css$34.empty,
11755
11955
  children: labels.noResults
11756
11956
  }) : jsx("ol", {
11757
- className: css$33.sources,
11957
+ className: css$34.sources,
11758
11958
  children: sources.map((source, index) => jsx(SourceItem, {
11759
11959
  source,
11760
11960
  ordinal: index + 1
11761
11961
  }, index))
11762
11962
  }),
11763
11963
  truncated && jsx("div", {
11764
- className: css$33.truncated,
11964
+ className: css$34.truncated,
11765
11965
  children: labels.sourcesTruncated
11766
11966
  })
11767
11967
  ]
@@ -11774,23 +11974,23 @@ function WebSearchBlock({ answer, sources, truncated, labels, className }) {
11774
11974
  */
11775
11975
  function WebFetchBlock({ url, statusCode, truncated, labels, className }) {
11776
11976
  return jsxs("div", {
11777
- className: clsx(css$33.block, css$33.fetch, className),
11977
+ className: clsx(css$34.block, css$34.fetch, className),
11778
11978
  "data-web": "fetch",
11779
11979
  children: [jsx(SafeLink, {
11780
11980
  url,
11781
11981
  label: url,
11782
- className: css$33.fetchUrl
11982
+ className: css$34.fetchUrl
11783
11983
  }), jsxs("div", {
11784
- className: css$33.fetchMeta,
11984
+ className: css$34.fetchMeta,
11785
11985
  children: [jsxs("span", {
11786
- className: css$33.status,
11986
+ className: css$34.status,
11787
11987
  children: [
11788
11988
  labels.http,
11789
11989
  " ",
11790
11990
  statusCode
11791
11991
  ]
11792
11992
  }), truncated && jsx("span", {
11793
- className: css$33.truncated,
11993
+ className: css$34.truncated,
11794
11994
  children: labels.contentTruncated
11795
11995
  })]
11796
11996
  })]
@@ -11824,10 +12024,10 @@ function JsonBlock({ label, payload, defaultOpen = false, truncatedLabel }) {
11824
12024
  truncatedLabel
11825
12025
  ]);
11826
12026
  return jsxs("div", {
11827
- className: css$34.root,
12027
+ className: css$35.root,
11828
12028
  children: [jsxs("button", {
11829
12029
  type: "button",
11830
- className: css$34.toggle,
12030
+ className: css$35.toggle,
11831
12031
  onClick: () => {
11832
12032
  setOpen((v) => !v);
11833
12033
  },
@@ -11837,7 +12037,7 @@ function JsonBlock({ label, payload, defaultOpen = false, truncatedLabel }) {
11837
12037
  label
11838
12038
  ]
11839
12039
  }), open && jsx("pre", {
11840
- className: css$34.body,
12040
+ className: css$35.body,
11841
12041
  children: body
11842
12042
  })]
11843
12043
  });
@@ -12058,7 +12258,7 @@ const PluginArtworkSearch = ({ size = 36, className }) => {
12058
12258
  children: [
12059
12259
  jsx("path", {
12060
12260
  d: "M26.5362 26.9865L22.3813 22.8317",
12061
- stroke: "#2F2295",
12261
+ stroke: "#658EFF",
12062
12262
  strokeWidth: "3"
12063
12263
  }),
12064
12264
  jsx("g", {
@@ -12071,7 +12271,7 @@ const PluginArtworkSearch = ({ size = 36, className }) => {
12071
12271
  width: "1917.88",
12072
12272
  height: "1917.88",
12073
12273
  children: jsx("div", { style: {
12074
- background: "conic-gradient(from 90deg, rgb(65, 225, 172) 0deg, rgb(85, 71, 210) 62.0619deg, rgb(65, 225, 172) 360deg)",
12274
+ background: "conic-gradient(from 90deg, rgb(65, 225, 172) 0deg, rgb(101, 142, 255) 62.0619deg, rgb(65, 225, 172) 360deg)",
12075
12275
  height: "100%",
12076
12276
  width: "100%"
12077
12277
  } })
@@ -12178,6 +12378,6 @@ function GuideArtworkFiles({ size = 36, className }) {
12178
12378
  });
12179
12379
  }
12180
12380
  //#endregion
12181
- export { BrandWordmark, Button, CODE_HIGHLIGHT_EXTENSIONS, Checkbox, CodeBlock, ConnectionIndicator, DEFAULT_DIFF_MAX_LINES, DEFAULT_READ_MAX_LINES, DEFAULT_SEARCH_MAX_LINES, DEFAULT_TERMINAL_MAX_LINES, DiffBlock, DisclosureRow, FISH_LOGO_PATH, FISH_LOGO_VIEWBOX, FileTypeIcon, FishLogo, GuideArtworkBrowser, GuideArtworkFiles, HoverCard, ICON_MEDIUM_STROKE, ICON_REGULAR_STROKE, IconAgentPresetOutlineMedium, IconAgentPresetOutlineRegular, IconAlarmClockOutlineMedium, IconAlarmClockOutlineRegular, IconApiOutlineMedium, IconApiOutlineRegular, IconArchiveCheckOutlineMedium, IconArchiveCheckOutlineRegular, IconArchiveOffOutlineMedium, IconArchiveOffOutlineRegular, IconArchiveOutlineMedium, IconArchiveOutlineRegular, IconBranchOutlineMedium, IconBranchOutlineRegular, IconBrowseOutlineMedium, IconBrowseOutlineRegular, IconCheckCircleFillMedium, IconCheckCircleFillRegular, IconCheckCircleOutlineMedium, IconCheckCircleOutlineRegular, IconCheckOutlineMedium, IconCheckOutlineRegular, IconChecklistOutlineMedium, IconChecklistOutlineRegular, IconChevronDownOutlineMedium, IconChevronDownOutlineRegular, IconChevronLeftOutlineMedium, IconChevronLeftOutlineRegular, IconChevronRightOutlineMedium, IconChevronRightOutlineRegular, IconChevronUpOutlineMedium, IconChevronUpOutlineRegular, IconChevronsUpDownOutlineMedium, IconChevronsUpDownOutlineRegular, IconClockOutlineMedium, IconClockOutlineRegular, IconCloseCircleFillMedium, IconCloseCircleFillRegular, IconCloseFillMedium, IconCloseFillRegular, IconCloseOutlineMedium, IconCloseOutlineRegular, IconCodeOutlineMedium, IconCodeOutlineRegular, IconCompactOutlineMedium, IconCompactOutlineRegular, IconCompareSplitOutlineMedium, IconCompareSplitOutlineRegular, IconContextInjectionOutlineMedium, IconContextInjectionOutlineRegular, IconCopyOutlineMedium, IconCopyOutlineRegular, IconCordisPluginOutlineMedium, IconCordisPluginOutlineRegular, IconDarkOutlineMedium, IconDarkOutlineRegular, IconDataOutlineMedium, IconDataOutlineRegular, IconDatabaseOutlineMedium, IconDatabaseOutlineRegular, IconDeliverDocMedium, IconDeliverDocRegular, IconDislikeFillMedium, IconDislikeFillRegular, IconDislikeOutlineMedium, IconDislikeOutlineRegular, IconDownloadOutlineMedium, IconDownloadOutlineRegular, IconEditOutlineMedium, IconEditOutlineRegular, IconEllipsisOutlineMedium, IconEllipsisOutlineRegular, IconEnhanceOutlineMedium, IconEnhanceOutlineRegular, IconFlatListOutlineMedium, IconFlatListOutlineRegular, IconFolderCloseMedium, IconFolderCloseRegular, IconFolderOpenMedium, IconFolderOpenOutlineMedium, IconFolderOpenOutlineRegular, IconFolderOpenRegular, IconFollowsystemOutlineMedium, IconFollowsystemOutlineRegular, IconFullscreenOutlineMedium, IconFullscreenOutlineRegular, IconGaugeOutlineMedium, IconGaugeOutlineRegular, IconGlobeOutlineMedium, IconGlobeOutlineRegular, IconGoalOutlineMedium, IconGoalOutlineRegular, IconInfoOutlineMedium, IconInfoOutlineRegular, IconInspectOutlineMedium, IconInspectOutlineRegular, IconLightOutlineMedium, IconLightOutlineRegular, IconLikeFillMedium, IconLikeFillRegular, IconLikeOutlineMedium, IconLikeOutlineRegular, IconLinkOutlineMedium, IconLinkOutlineRegular, IconListPenOutlineMedium, IconListPenOutlineRegular, IconLoadingOutlineMedium, IconLoadingOutlineRegular, IconMicrophoneOutlineMedium, IconMicrophoneOutlineRegular, IconNewChatOutlineMedium, IconNewChatOutlineRegular, IconNowrapFillMedium, IconNowrapFillRegular, IconPanelLeftOutlineMedium, IconPanelLeftOutlineRegular, IconPaperPlaneOutlineMedium, IconPaperPlaneOutlineRegular, IconPaperclipOutlineMedium, IconPaperclipOutlineRegular, IconPauseOutlineMedium, IconPauseOutlineRegular, IconPersonalizationOutlineMedium, IconPersonalizationOutlineRegular, IconPinFillMedium, IconPinFillRegular, IconPinOutlineMedium, IconPinOutlineRegular, IconPlanOutlineMedium, IconPlanOutlineRegular, IconPlayOutlineMedium, IconPlayOutlineRegular, IconPluginPinwheelOutlineMedium, IconPluginPinwheelOutlineRegular, IconPlusOutlineMedium, IconPlusOutlineRegular, IconProjectAddOutlineMedium, IconProjectAddOutlineRegular, IconQuestionOutlineMedium, IconQuestionOutlineRegular, IconQueueOutlineMedium, IconQueueOutlineRegular, IconRefreshOutlineMedium, IconRefreshOutlineRegular, IconRightUpOutlineMedium, IconRightUpOutlineRegular, IconSearchOutlineMedium, IconSearchOutlineRegular, IconSendOutlineMedium, IconSendOutlineRegular, IconSettingsOutlineMedium, IconSettingsOutlineRegular, IconShareOutlineMedium, IconShareOutlineRegular, IconShieldOutlineMedium, IconShieldOutlineRegular, IconSkillOutlineMedium, IconSkillOutlineRegular, IconSlidersTwoOutlineMedium, IconSlidersTwoOutlineRegular, IconSparkleMedium, IconSparkleRegular, IconStopFillMedium, IconStopFillRegular, IconThinkOutlineMedium, IconThinkOutlineRegular, IconTrashOutlineMedium, IconTrashOutlineRegular, IconTreeCornerMedium, IconTreeCornerRegular, IconTriangleRightFillMedium, IconTriangleRightFillRegular, IconUnarchiveOutlineMedium, IconUnarchiveOutlineRegular, IconUserOutlineMedium, IconUserOutlineRegular, IconUsersOutlineMedium, IconUsersOutlineRegular, IconWarningOutlineMedium, IconWarningOutlineRegular, IconWarningTriangleOutlineMedium, IconWarningTriangleOutlineRegular, IconWorkspaceTreeOutlineMedium, IconWorkspaceTreeOutlineRegular, IconWrapFillMedium, IconWrapFillRegular, IconWrapLinesOutlineMedium, IconWrapLinesOutlineRegular, ImageLightbox, Input, JsonBlock, JsonTree, LinkIconMedium, LinkIconRegular, MarkdownDelegateProvider, MarkdownText, Menu, MenuItemButton, MenuSurface, Modal, PathLabel, PermissionIconFullAccessMedium, PermissionIconFullAccessRegular, PermissionIconReadOnlyMedium, PermissionIconReadOnlyRegular, PermissionIconWorkspaceWriteMedium, PermissionIconWorkspaceWriteRegular, Pill, PluginArtworkDefault, PluginArtworkLoop, PluginArtworkSearch, PluginArtworkSubagent, PluginArtworkTerminal, ReadBlock, ReferenceIconMedium, ReferenceIconRegular, RiskConfirmation, SHIELD_OUTLINE_PATH, SearchBlock, SegmentedControl, SegmentedTabs, SettingsForm, SettingsFormModel, SettingsSecretField, SettingsValueField, ShortcutKeys, StateDot, Switch, Tag, TerminalBlock, TextShimmer, Toast, Tooltip, WebBlock, classifyFileType, classifyLinkPath, closeTopModal, diffTotals, extractMarkdownPlainText, fileExtension, fileSizeText, focusWithoutRing, isBehindModal, isDarwinDesktop, languageForPath, modalSelector, observeComposition, projectUserText, rankByName, relativeTime, settingsNumberField, settingsTextField, useAnchoredMaxHeight, useAnchoredPosition, useCodeHighlighter, useDismissOnOutsidePointer, useModalLayer, writeClipboard };
12381
+ export { BrandWordmark, Button, CODE_HIGHLIGHT_EXTENSIONS, Checkbox, CodeBlock, ConnectionIndicator, DEFAULT_DIFF_MAX_LINES, DEFAULT_READ_MAX_LINES, DEFAULT_SEARCH_MAX_LINES, DEFAULT_TERMINAL_MAX_LINES, DiffBlock, DisclosureRow, FISH_LOGO_PATH, FISH_LOGO_VIEWBOX, FileTypeIcon, FishLogo, GuideArtworkBrowser, GuideArtworkFiles, HoverCard, ICON_MEDIUM_STROKE, ICON_REGULAR_STROKE, IconAgentPresetOutlineMedium, IconAgentPresetOutlineRegular, IconAlarmClockOutlineMedium, IconAlarmClockOutlineRegular, IconApiOutlineMedium, IconApiOutlineRegular, IconArchiveCheckOutlineMedium, IconArchiveCheckOutlineRegular, IconArchiveOffOutlineMedium, IconArchiveOffOutlineRegular, IconArchiveOutlineMedium, IconArchiveOutlineRegular, IconBranchOutlineMedium, IconBranchOutlineRegular, IconBrowseOutlineMedium, IconBrowseOutlineRegular, IconCheckCircleFillMedium, IconCheckCircleFillRegular, IconCheckCircleOutlineMedium, IconCheckCircleOutlineRegular, IconCheckOutlineMedium, IconCheckOutlineRegular, IconChecklistOutlineMedium, IconChecklistOutlineRegular, IconChevronDownOutlineMedium, IconChevronDownOutlineRegular, IconChevronLeftOutlineMedium, IconChevronLeftOutlineRegular, IconChevronRightOutlineMedium, IconChevronRightOutlineRegular, IconChevronUpOutlineMedium, IconChevronUpOutlineRegular, IconChevronsUpDownOutlineMedium, IconChevronsUpDownOutlineRegular, IconClockOutlineMedium, IconClockOutlineRegular, IconCloseCircleFillMedium, IconCloseCircleFillRegular, IconCloseFillMedium, IconCloseFillRegular, IconCloseOutlineMedium, IconCloseOutlineRegular, IconCodeOutlineMedium, IconCodeOutlineRegular, IconCompactOutlineMedium, IconCompactOutlineRegular, IconCompareSplitOutlineMedium, IconCompareSplitOutlineRegular, IconContextInjectionOutlineMedium, IconContextInjectionOutlineRegular, IconCopyOutlineMedium, IconCopyOutlineRegular, IconCordisPluginOutlineMedium, IconCordisPluginOutlineRegular, IconDarkOutlineMedium, IconDarkOutlineRegular, IconDataOutlineMedium, IconDataOutlineRegular, IconDatabaseOutlineMedium, IconDatabaseOutlineRegular, IconDeliverDocMedium, IconDeliverDocRegular, IconDislikeFillMedium, IconDislikeFillRegular, IconDislikeOutlineMedium, IconDislikeOutlineRegular, IconDownloadOutlineMedium, IconDownloadOutlineRegular, IconEditOutlineMedium, IconEditOutlineRegular, IconEllipsisOutlineMedium, IconEllipsisOutlineRegular, IconEnhanceOutlineMedium, IconEnhanceOutlineRegular, IconFlatListOutlineMedium, IconFlatListOutlineRegular, IconFolderCloseMedium, IconFolderCloseRegular, IconFolderOpenMedium, IconFolderOpenOutlineMedium, IconFolderOpenOutlineRegular, IconFolderOpenRegular, IconFollowsystemOutlineMedium, IconFollowsystemOutlineRegular, IconFullscreenOutlineMedium, IconFullscreenOutlineRegular, IconGaugeOutlineMedium, IconGaugeOutlineRegular, IconGlobeOutlineMedium, IconGlobeOutlineRegular, IconGoalOutlineMedium, IconGoalOutlineRegular, IconInfoOutlineMedium, IconInfoOutlineRegular, IconInspectOutlineMedium, IconInspectOutlineRegular, IconLightOutlineMedium, IconLightOutlineRegular, IconLikeFillMedium, IconLikeFillRegular, IconLikeOutlineMedium, IconLikeOutlineRegular, IconLinkOutlineMedium, IconLinkOutlineRegular, IconListPenOutlineMedium, IconListPenOutlineRegular, IconLoadingOutlineMedium, IconLoadingOutlineRegular, IconMicrophoneOutlineMedium, IconMicrophoneOutlineRegular, IconNewChatOutlineMedium, IconNewChatOutlineRegular, IconNowrapFillMedium, IconNowrapFillRegular, IconPanelLeftOutlineMedium, IconPanelLeftOutlineRegular, IconPaperPlaneOutlineMedium, IconPaperPlaneOutlineRegular, IconPaperclipOutlineMedium, IconPaperclipOutlineRegular, IconPauseOutlineMedium, IconPauseOutlineRegular, IconPersonalizationOutlineMedium, IconPersonalizationOutlineRegular, IconPinFillMedium, IconPinFillRegular, IconPinOutlineMedium, IconPinOutlineRegular, IconPlanOutlineMedium, IconPlanOutlineRegular, IconPlayOutlineMedium, IconPlayOutlineRegular, IconPluginPinwheelOutlineMedium, IconPluginPinwheelOutlineRegular, IconPlusOutlineMedium, IconPlusOutlineRegular, IconProjectAddOutlineMedium, IconProjectAddOutlineRegular, IconQuestionOutlineMedium, IconQuestionOutlineRegular, IconQueueOutlineMedium, IconQueueOutlineRegular, IconRefreshOutlineMedium, IconRefreshOutlineRegular, IconRightUpOutlineMedium, IconRightUpOutlineRegular, IconSearchOutlineMedium, IconSearchOutlineRegular, IconSendOutlineMedium, IconSendOutlineRegular, IconSettingsOutlineMedium, IconSettingsOutlineRegular, IconShareOutlineMedium, IconShareOutlineRegular, IconShieldOutlineMedium, IconShieldOutlineRegular, IconSkillOutlineMedium, IconSkillOutlineRegular, IconSlidersTwoOutlineMedium, IconSlidersTwoOutlineRegular, IconSparkleMedium, IconSparkleRegular, IconStopFillMedium, IconStopFillRegular, IconThinkOutlineMedium, IconThinkOutlineRegular, IconTrashOutlineMedium, IconTrashOutlineRegular, IconTreeCornerMedium, IconTreeCornerRegular, IconTriangleRightFillMedium, IconTriangleRightFillRegular, IconUnarchiveOutlineMedium, IconUnarchiveOutlineRegular, IconUserOutlineMedium, IconUserOutlineRegular, IconUsersOutlineMedium, IconUsersOutlineRegular, IconWarningOutlineMedium, IconWarningOutlineRegular, IconWarningTriangleOutlineMedium, IconWarningTriangleOutlineRegular, IconWorkspaceTreeOutlineMedium, IconWorkspaceTreeOutlineRegular, IconWrapFillMedium, IconWrapFillRegular, IconWrapLinesOutlineMedium, IconWrapLinesOutlineRegular, ImageLightbox, Input, JsonBlock, JsonTree, LinkIconMedium, LinkIconRegular, MarkdownDelegateProvider, MarkdownText, Menu, MenuGroup, MenuItemButton, MenuSurface, Modal, PathLabel, PermissionIconFullAccessMedium, PermissionIconFullAccessRegular, PermissionIconReadOnlyMedium, PermissionIconReadOnlyRegular, PermissionIconWorkspaceWriteMedium, PermissionIconWorkspaceWriteRegular, Pill, PluginArtworkDefault, PluginArtworkLoop, PluginArtworkSearch, PluginArtworkSubagent, PluginArtworkTerminal, ReadBlock, ReferenceIconMedium, ReferenceIconRegular, RiskConfirmation, SHIELD_OUTLINE_PATH, SearchBlock, SegmentedControl, SegmentedTabs, SettingsForm, SettingsFormModel, SettingsSecretField, SettingsValueField, ShortcutKeys, StateDot, Switch, Tag, TerminalBlock, TextShimmer, Toast, Tooltip, WebBlock, classifyFileType, classifyLinkPath, closeTopModal, diffTotals, extractMarkdownPlainText, fileExtension, fileSizeText, focusWithoutRing, isBehindModal, isDarwinDesktop, languageForPath, modalSelector, observeComposition, observeStickyMenuGroups, pointerModality, projectUserText, rankByName, relativeTime, settingsNumberField, settingsTextField, useAnchoredMaxHeight, useAnchoredPosition, useCodeHighlighter, useDismissOnOutsidePointer, useModalLayer, writeClipboard };
12182
12382
 
12183
12383
  //# sourceMappingURL=index.js.map