@deepseek-ai/dsh-client-ui-primitives 0.2.1-alpha.1 → 0.2.1-alpha.3

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
@@ -20,15 +20,15 @@ import css$13 from "./ShortcutKeys.module.css";
20
20
  import css$14 from "./MenuSurface.module.css";
21
21
  import css$15 from "./Menu.module.css";
22
22
  import css$16 from "./MenuGroup.module.css";
23
- import css$17 from "./Tooltip.module.css";
24
- import css$18 from "./HoverCard.module.css";
25
- import css$19 from "./Modal.module.css";
26
- import css$20 from "./RiskConfirmation.module.css";
27
- import css$21 from "./ConnectionIndicator.module.css";
28
- import css$22 from "./FileTypeIcon.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";
29
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";
30
- import css$23 from "./user-text.module.css";
29
+ import css$22 from "./user-text.module.css";
31
30
  import markdownCss from "./markdown/MarkdownText.module.css";
31
+ import css$23 from "./Tooltip.module.css";
32
32
  import css$24 from "./Toast.module.css";
33
33
  import css$25 from "./settings-form/SettingsForm.module.css";
34
34
  import css$26 from "./settings-form/fields.module.css";
@@ -42,11 +42,12 @@ import { CODE_HIGHLIGHT_EXTENSIONS, languageForPath } from "@deepseek-ai/dsh-uti
42
42
  import css$27 from "./JsonTree.module.css";
43
43
  import Anser from "anser";
44
44
  import css$28 from "./TerminalBlock.module.css";
45
+ import css$29 from "./CommandText.module.css";
45
46
  import cardCss from "./CodeCard.module.css";
46
- import css$29 from "./ReadBlock.module.css";
47
+ import css$30 from "./ReadBlock.module.css";
47
48
  import { structuredPatch } from "diff";
48
- import css$30 from "./DiffBlock.module.css";
49
- import css$31 from "./SearchBlock.module.css";
49
+ import css$31 from "./DiffBlock.module.css";
50
+ import css$32 from "./SearchBlock.module.css";
50
51
  import { fromMarkdown } from "mdast-util-from-markdown";
51
52
  import { gfmFromMarkdown } from "mdast-util-gfm";
52
53
  import { mathFromMarkdown } from "mdast-util-math";
@@ -58,13 +59,13 @@ import { classifyCharacter } from "micromark-util-classify-character";
58
59
  import { codes, constants, types } from "micromark-util-symbol";
59
60
  import { factorySpace } from "micromark-factory-space";
60
61
  import { normalizeUri } from "micromark-util-sanitize-uri";
61
- import css$32 from "./markdown/CodeBlock.module.css";
62
+ import css$33 from "./markdown/CodeBlock.module.css";
62
63
  import katex from "katex";
63
- import css$33 from "./ImageLightbox.module.css";
64
- import css$34 from "./ImagePreview.module.css";
64
+ import css$34 from "./ImageLightbox.module.css";
65
+ import css$35 from "./ImagePreview.module.css";
65
66
  import "katex/dist/katex.min.css";
66
- import css$35 from "./WebBlock.module.css";
67
- import css$36 from "./markdown/JsonBlock.module.css";
67
+ import css$36 from "./WebBlock.module.css";
68
+ import css$37 from "./markdown/JsonBlock.module.css";
68
69
  //#region lib/types/icons/shared-artwork.js
69
70
  /**
70
71
  * Render new-conversation geometry — the bubble around a plus — for product icons.
@@ -3166,7 +3167,7 @@ const TextShimmer = memo(function TextShimmer({ children, active = false, classN
3166
3167
  * @param props - Visual content, controlled state, and interaction policy.
3167
3168
  * @returns the disclosure row.
3168
3169
  */
3169
- 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 }) {
3170
+ const DisclosureRow = memo(function DisclosureRow({ icon, title, open, expandable, onToggle, running = false, expandOnRowClick = false, previewChevron = expandable, keepContentWhenOpen = false, collapsedContent, headerAccessory, children, className, rowClassName, contentClassName, contentLayoutClassName, leadingClassName, chevronClassName, titleClassName }) {
3170
3171
  const rowExpands = expandable && expandOnRowClick;
3171
3172
  const toggleFromLeading = (event) => {
3172
3173
  event.stopPropagation();
@@ -3186,33 +3187,38 @@ const DisclosureRow = memo(function DisclosureRow({ icon, title, open, expandabl
3186
3187
  className: clsx(css$2.root, className),
3187
3188
  "data-open": open || void 0,
3188
3189
  children: [jsxs("div", {
3189
- className: clsx(css$2.row, rowClassName),
3190
- "data-disclosure-row": true,
3191
- "data-expandable": rowExpands || void 0,
3192
- role: rowExpands ? "button" : void 0,
3193
- tabIndex: rowExpands ? 0 : void 0,
3194
- "aria-expanded": rowExpands ? open : void 0,
3195
- onClick: rowExpands ? onToggle : void 0,
3196
- onKeyDown: rowExpands ? toggleFromKeyboard : void 0,
3197
- children: [expandable && !rowExpands ? jsx("button", {
3198
- type: "button",
3199
- className: clsx(css$2.leading, leadingClassName),
3200
- "aria-label": title,
3201
- "aria-expanded": open,
3202
- onClick: toggleFromLeading,
3203
- children: leading
3204
- }) : jsx("span", {
3205
- className: clsx(css$2.leading, leadingClassName),
3206
- children: leading
3207
- }), jsxs(TextShimmer, {
3208
- active: running,
3209
- className: contentClassName,
3210
- contentClassName: contentLayoutClassName,
3211
- children: [jsx(TextShimmer, {
3212
- className: clsx(css$2.title, titleClassName),
3213
- children: title
3214
- }), (keepContentWhenOpen || !open) && collapsedContent]
3215
- })]
3190
+ className: css$2.header,
3191
+ "data-disclosure-header": true,
3192
+ "data-has-accessory": !!headerAccessory || void 0,
3193
+ children: [jsxs("div", {
3194
+ className: clsx(css$2.row, rowClassName),
3195
+ "data-disclosure-row": true,
3196
+ "data-expandable": rowExpands || void 0,
3197
+ role: rowExpands ? "button" : void 0,
3198
+ tabIndex: rowExpands ? 0 : void 0,
3199
+ "aria-expanded": rowExpands ? open : void 0,
3200
+ onClick: rowExpands ? onToggle : void 0,
3201
+ onKeyDown: rowExpands ? toggleFromKeyboard : void 0,
3202
+ children: [expandable && !rowExpands ? jsx("button", {
3203
+ type: "button",
3204
+ className: clsx(css$2.leading, leadingClassName),
3205
+ "aria-label": title,
3206
+ "aria-expanded": open,
3207
+ onClick: toggleFromLeading,
3208
+ children: leading
3209
+ }) : jsx("span", {
3210
+ className: clsx(css$2.leading, leadingClassName),
3211
+ children: leading
3212
+ }), jsxs(TextShimmer, {
3213
+ active: running,
3214
+ className: contentClassName,
3215
+ contentClassName: contentLayoutClassName,
3216
+ children: [jsx(TextShimmer, {
3217
+ className: clsx(css$2.title, titleClassName),
3218
+ children: title
3219
+ }), (keepContentWhenOpen || !open) && collapsedContent]
3220
+ })]
3221
+ }), headerAccessory]
3216
3222
  }), open && children]
3217
3223
  });
3218
3224
  });
@@ -4640,318 +4646,70 @@ async function writeClipboard(text) {
4640
4646
  }
4641
4647
  }
4642
4648
  //#endregion
4643
- //#region lib/types/input-modality.js
4644
- /**
4645
- * Document-wide input tracking shared by tooltips and focus-ring styles.
4646
- * Tooltips follow the last input; rings follow navigation or a key followed by
4647
- * focus on a different control. Modifiers and refocusing alone keep rings silent.
4648
- * Module-level listeners live for the document lifetime; Node imports are inert.
4649
- */
4650
- /** Modality values published on the document element. */
4651
- const INPUT_MODALITY = {
4652
- pointer: "pointer",
4653
- keyboard: "keyboard"
4654
- };
4655
- /** Attribute carrying whether focus navigation last owned focus. */
4656
- const INPUT_MODALITY_ATTRIBUTE = "data-input-modality";
4657
- const FOCUS_NAVIGATION = new Set([
4658
- "Tab",
4659
- "Home",
4660
- "End",
4661
- "PageUp",
4662
- "PageDown"
4663
- ]);
4664
- let pointer = false;
4665
- let pointerOwnsFocus = false;
4666
- let keyFocusOrigin;
4667
- function publish() {
4668
- document.documentElement.setAttribute(INPUT_MODALITY_ATTRIBUTE, pointerOwnsFocus ? INPUT_MODALITY.pointer : INPUT_MODALITY.keyboard);
4669
- }
4670
- /**
4671
- * Whether the last input came from a pointer, independently of ring visibility.
4672
- * @returns True after pointer input; false after any key.
4673
- */
4674
- function pointerModality() {
4675
- return pointer;
4676
- }
4677
- if (typeof window !== "undefined") {
4678
- window.addEventListener("pointerdown", () => {
4679
- pointer = true;
4680
- pointerOwnsFocus = true;
4681
- keyFocusOrigin = void 0;
4682
- publish();
4683
- }, true);
4684
- window.addEventListener("keydown", (event) => {
4685
- pointer = false;
4686
- if (event.isComposing) {
4687
- keyFocusOrigin = void 0;
4688
- return;
4689
- }
4690
- keyFocusOrigin = event.composedPath()[0];
4691
- if (!FOCUS_NAVIGATION.has(event.key) && !event.key.startsWith("Arrow")) return;
4692
- pointerOwnsFocus = false;
4693
- publish();
4694
- }, true);
4695
- window.addEventListener("focusin", (event) => {
4696
- if (keyFocusOrigin === void 0 || event.composedPath()[0] === keyFocusOrigin) return;
4697
- keyFocusOrigin = void 0;
4698
- if (!pointerOwnsFocus) return;
4699
- pointerOwnsFocus = false;
4700
- publish();
4701
- }, true);
4702
- window.addEventListener("blur", () => {
4703
- keyFocusOrigin = void 0;
4704
- });
4705
- }
4706
- //#endregion
4707
- //#region lib/types/Tooltip.js
4708
- /** Anchor-preserving tooltips; an optional body portal escapes clipping containers and stacking contexts that cap the bubble's z-index. */
4709
- /**
4710
- * Suppression channel for enclosing tooltip and hover-card anchors: a visible
4711
- * tooltip within an anchor withdraws the enclosing preview while its bubble is shown.
4712
- */
4713
- const TooltipSuppression = createContext(null);
4714
- /**
4715
- * Attach a hover/focus tooltip to an anchor element.
4716
- * @param props.label - bubble text, or a resolver evaluated only while visible; an empty string shows only shortcut keys.
4717
- * @param props.shortcutKeys - effective key labels rendered as platform-formatted keycaps after optional text.
4718
- * @param props.side - placement relative to the anchor (default 'right').
4719
- * @param props.align - horizontal anchor-edge alignment for 'bottom'/'top' bubbles: 'end' pins
4720
- * the bubble's right edge to the anchor's (for anchors beside other hover surfaces the centered
4721
- * bubble would overlap); default 'center'. Ignored for side 'right'.
4722
- * @param props.portal - render the bubble under document.body, so an ancestor's clipping or its
4723
- * stacking context (which confines the bubble's z-index to that context) cannot hide it.
4724
- * @param props.delayMs - hover delay in milliseconds (default 0).
4725
- * @param props.focusDelayMs - keyboard focus delay in milliseconds (default 0); blur, click,
4726
- * mouse leave, disabling, and unmount cancel a pending show.
4727
- * @param props.gap - anchor-to-bubble distance in pixels for 'bottom'/'top' bubbles (default 8);
4728
- * ignored for side 'right'.
4729
- * @param props.disabled - suppress the bubble while true; the anchor renders identically so
4730
- * toggling never remounts it (which would cut its CSS transitions).
4731
- * @param props.maxWidth - bubble width cap in pixels, for labels long enough that the default
4732
- * half-viewport cap would render a slab wider than the surface the anchor sits on.
4733
- * @param props.openOnClick - clicking also pins the bubble for reading; another click, Escape,
4734
- * Tab, or an outside pointerdown dismisses it. Defaults to false for ordinary action tooltips.
4735
- * @param props.children - a single anchor element; its own ref (callback or object) is forwarded alongside the tooltip's.
4736
- * @returns the cloned anchor plus a fixed-position bubble, optionally portaled to the body.
4737
- * The bubble stays hidden until ResizeObserver supplies its size for viewport fitting; clicking the
4738
- * anchor dismisses the bubble unless openOnClick is enabled, and focus arriving after a pointer
4739
- * interaction (a closing menu refocusing its trigger) never raises it.
4740
- */
4741
- function Tooltip({ label, shortcutKeys, side = "right", align = "center", delayMs = 0, focusDelayMs = 0, gap = 8, disabled = false, portal = false, maxWidth, openOnClick = false, children }) {
4742
- const id = useId();
4743
- const [pinned, setPinned] = useState(false);
4744
- const anchor = useRef(null);
4745
- const childRef = children.ref;
4746
- const mergedRef = useCallback((el) => {
4747
- anchor.current = el;
4748
- if (typeof childRef === "function") childRef(el);
4749
- else if (childRef != null) childRef.current = el;
4750
- }, [childRef]);
4751
- const [pos, setPos] = useState(null);
4752
- const bubble = useRef(null);
4753
- const resolvedLabel = pos === null ? null : typeof label === "function" ? label() : label;
4754
- const y = pos === null ? 0 : side === "right" ? pos.top + (pos.bottom - pos.top) / 2 : side === "top" ? pos.top - gap : pos.bottom + gap;
4755
- const showTimer = useRef(null);
4756
- const triggers = useRef({
4757
- hover: false,
4758
- focus: false
4759
- });
4760
- const suppressAncestors = useContext(TooltipSuppression);
4761
- const [suppressed, setSuppressed] = useState(false);
4762
- const announce = useCallback((active) => {
4763
- suppressAncestors?.(active);
4764
- }, [suppressAncestors]);
4765
- const visible = pos !== null && !disabled;
4766
- useEffect(() => {
4767
- const el = bubble.current;
4768
- if (pos === null || !visible || suppressed || el === null) return;
4769
- const edgeMargin = 12;
4770
- let size;
4771
- let placement = side;
4772
- const fit = () => {
4773
- if (size === void 0) return;
4774
- const { inlineSize: width, blockSize: height } = size;
4775
- const offset = side === "right" ? 0 : align === "end" ? width : width / 2;
4776
- const left = Math.max(edgeMargin, Math.min(pos.x - offset, window.innerWidth - edgeMargin - width));
4777
- const fitsBelow = pos.bottom + gap + height <= window.innerHeight - edgeMargin;
4778
- const fitsAbove = pos.top - gap - height >= edgeMargin;
4779
- if (placement === "bottom" && !fitsBelow && fitsAbove) placement = "top";
4780
- else if (placement === "top" && !fitsAbove && fitsBelow) placement = "bottom";
4781
- el.style.left = `${left + offset}px`;
4782
- el.style.top = `${placement === "right" ? (pos.top + pos.bottom) / 2 : placement === "top" ? pos.top - gap : pos.bottom + gap}px`;
4783
- el.dataset.side = placement;
4784
- el.style.visibility = "visible";
4785
- };
4786
- const observer = new ResizeObserver((entries) => {
4787
- size = entries[0]?.borderBoxSize[0];
4788
- fit();
4789
- });
4790
- observer.observe(el, { box: "border-box" });
4791
- window.addEventListener("resize", fit);
4792
- return () => {
4793
- observer.disconnect();
4794
- window.removeEventListener("resize", fit);
4795
- };
4796
- }, [
4797
- align,
4798
- gap,
4799
- pos,
4800
- side,
4801
- suppressed,
4802
- visible
4803
- ]);
4804
- useEffect(() => {
4805
- announce(visible);
4806
- return () => {
4807
- announce(false);
4808
- };
4809
- }, [announce, visible]);
4810
- const cancelShow = useCallback(() => {
4811
- if (showTimer.current === null) return;
4812
- clearTimeout(showTimer.current);
4813
- showTimer.current = null;
4814
- }, []);
4815
- useEffect(() => {
4816
- if (pinned && (disabled || !openOnClick)) setPinned(false);
4817
- if (disabled) {
4818
- cancelShow();
4819
- triggers.current = {
4820
- hover: false,
4821
- focus: false
4822
- };
4823
- setPos(null);
4824
- }
4825
- return cancelShow;
4826
- }, [
4827
- cancelShow,
4828
- disabled,
4829
- openOnClick,
4830
- pinned
4831
- ]);
4832
- const show = () => {
4833
- if (disabled) return;
4834
- const el = anchor.current;
4835
- /* v8 ignore next -- the ref is attached by event time: events fire on the cloned anchor. */
4836
- if (el === null) return;
4837
- const r = el.getBoundingClientRect();
4838
- setPos({
4839
- x: side === "right" ? r.right + 10 : align === "end" ? r.right : r.left + r.width / 2,
4840
- top: r.top,
4841
- bottom: r.bottom
4842
- });
4843
- announce(true);
4844
- };
4845
- const showAfterDelay = (delay) => {
4846
- cancelShow();
4847
- if (delay <= 0) {
4848
- show();
4849
- return;
4850
- }
4851
- showTimer.current = setTimeout(() => {
4852
- showTimer.current = null;
4853
- show();
4854
- }, delay);
4855
- };
4856
- const withdraw = useCallback(() => {
4857
- setPinned(false);
4858
- setPos(null);
4859
- announce(false);
4860
- }, [announce]);
4861
- const hide = () => {
4862
- cancelShow();
4863
- if (!triggers.current.hover && !triggers.current.focus && !pinned) withdraw();
4864
- };
4865
- const dismiss = useCallback(() => {
4866
- cancelShow();
4867
- triggers.current = {
4868
- hover: false,
4869
- focus: false
4870
- };
4871
- withdraw();
4872
- }, [cancelShow, withdraw]);
4873
- useDismissOnOutsidePointer(anchor, openOnClick && visible, dismiss, bubble);
4874
- useEffect(() => {
4875
- if (!openOnClick || !visible) return;
4876
- const onKeyDown = (event) => {
4877
- if (event.key !== "Escape" && event.key !== "Tab") return;
4878
- if (event.key === "Escape") {
4879
- event.preventDefault();
4880
- event.stopPropagation();
4649
+ //#region lib/types/HoverCardGroup.js
4650
+ /** Private coordination shared only by opted-in HoverCards inside one mounted group. */
4651
+ const HoverCardGroupContext = createContext(null);
4652
+ /**
4653
+ * Share first-display dwell across a list and its active portal, including the card's existing pointer grace.
4654
+ * @param props.children - list contents, including opted-in HoverCards.
4655
+ * @param props.className - classes for the physical list container.
4656
+ * @returns the list container and its private hover coordinator.
4657
+ */
4658
+ function HoverCardGroup({ children, className }) {
4659
+ const [group] = useState(() => {
4660
+ let pointer = "outside";
4661
+ let warm = false;
4662
+ let active = null;
4663
+ return {
4664
+ isWarm: () => warm,
4665
+ enter: (overCard) => {
4666
+ pointer = overCard ? "card" : "list";
4667
+ if (overCard) warm = true;
4668
+ },
4669
+ leave: () => {
4670
+ pointer = "outside";
4671
+ if (active === null) warm = false;
4672
+ },
4673
+ containsCard: (target) => target instanceof Node && active !== null && active.element.contains(target),
4674
+ shown: (owner, dismiss, element) => {
4675
+ if (pointer === "card") {
4676
+ pointer = "outside";
4677
+ warm = false;
4678
+ }
4679
+ if (pointer === "list") warm = true;
4680
+ const previous = active;
4681
+ active = {
4682
+ owner,
4683
+ dismiss,
4684
+ element
4685
+ };
4686
+ if (previous !== null && previous.owner !== owner) previous.dismiss();
4687
+ },
4688
+ release: (owner) => {
4689
+ if (active?.owner !== owner) return;
4690
+ active = null;
4691
+ if (pointer !== "list") {
4692
+ pointer = "outside";
4693
+ warm = false;
4694
+ }
4881
4695
  }
4882
- dismiss();
4883
- };
4884
- document.addEventListener("keydown", onKeyDown, true);
4885
- return () => {
4886
- document.removeEventListener("keydown", onKeyDown, true);
4887
4696
  };
4888
- }, [
4889
- dismiss,
4890
- openOnClick,
4891
- visible
4892
- ]);
4893
- const content = visible && !suppressed && jsxs("span", {
4894
- ref: bubble,
4895
- id: openOnClick ? id : void 0,
4896
- className: css$17.bubble,
4897
- "data-side": side,
4898
- "data-portal": portal || void 0,
4899
- "data-pinned": pinned || void 0,
4900
- "data-align": align,
4901
- "data-has-shortcut": shortcutKeys?.length ? true : void 0,
4902
- style: {
4903
- left: pos.x,
4904
- top: y,
4905
- visibility: "hidden",
4906
- ...maxWidth === void 0 ? {} : { maxWidth }
4907
- },
4908
- role: "tooltip",
4909
- "aria-label": shortcutKeys?.length ? [resolvedLabel, shortcutKeys.join(" ")].filter(Boolean).join(" ") : void 0,
4910
- children: [resolvedLabel && jsx("span", {
4911
- className: css$17.label,
4912
- children: resolvedLabel
4913
- }), shortcutKeys !== void 0 && shortcutKeys.length > 0 && jsx(ShortcutKeys, {
4914
- keys: shortcutKeys,
4915
- variant: "tooltip"
4916
- })]
4917
4697
  });
4918
- return jsxs(TooltipSuppression.Provider, {
4919
- value: setSuppressed,
4920
- children: [cloneElement(children, {
4921
- ref: mergedRef,
4922
- "aria-describedby": openOnClick && visible ? [children.props["aria-describedby"], id].filter(Boolean).join(" ") : children.props["aria-describedby"],
4923
- onMouseEnter: (e) => {
4924
- children.props.onMouseEnter?.(e);
4925
- triggers.current.hover = true;
4926
- showAfterDelay(delayMs);
4927
- },
4928
- onMouseLeave: (e) => {
4929
- children.props.onMouseLeave?.(e);
4930
- triggers.current.hover = false;
4931
- cancelShow();
4932
- if (!pinned) withdraw();
4698
+ return jsx(HoverCardGroupContext.Provider, {
4699
+ value: group,
4700
+ children: jsx("div", {
4701
+ className,
4702
+ onPointerOverCapture: (event) => {
4703
+ const overCard = group.containsCard(event.target);
4704
+ if (event.currentTarget.contains(event.target) || overCard) group.enter(overCard);
4933
4705
  },
4934
- onClick: (e) => {
4935
- children.props.onClick?.(e);
4936
- triggers.current.focus = false;
4937
- cancelShow();
4938
- if (openOnClick && !disabled && !pinned) {
4939
- setPinned(true);
4940
- show();
4941
- } else withdraw();
4706
+ onPointerOutCapture: (event) => {
4707
+ const fromGroup = event.currentTarget.contains(event.target) || group.containsCard(event.target);
4708
+ const intoGroup = event.relatedTarget instanceof Node && event.currentTarget.contains(event.relatedTarget) || group.containsCard(event.relatedTarget);
4709
+ if (fromGroup && !intoGroup) group.leave();
4942
4710
  },
4943
- onFocus: (e) => {
4944
- children.props.onFocus?.(e);
4945
- if (pointerModality()) return;
4946
- triggers.current.focus = true;
4947
- showAfterDelay(focusDelayMs);
4948
- },
4949
- onBlur: (e) => {
4950
- children.props.onBlur?.(e);
4951
- triggers.current.focus = false;
4952
- hide();
4953
- }
4954
- }), portal ? content !== false && createPortal(content, document.body) : content]
4711
+ children
4712
+ })
4955
4713
  });
4956
4714
  }
4957
4715
  //#endregion
@@ -4964,7 +4722,7 @@ const INLINE_PREVIEW_WIDTH = 300;
4964
4722
  const ANCHOR_GAP = 8;
4965
4723
  const VIEWPORT_MARGIN = 8;
4966
4724
  /**
4967
- * Render an anchor with a hover-triggered preview card, hidden while a tooltip within the anchor is visible.
4725
+ * Render an anchor with a hover-triggered preview card independently of nested tooltips.
4968
4726
  * @param props.anchor - the hover target (rendered in place inside a wrapper span).
4969
4727
  * @param props.content - card content; the pointer may rest on it, so it is
4970
4728
  * readable and selectable, but it carries no dismissal affordance of its own.
@@ -4974,13 +4732,15 @@ const VIEWPORT_MARGIN = 8;
4974
4732
  * @param props.widthAnchorRef - optional element whose width and horizontal position size the preview.
4975
4733
  * @param props.inline - keep the anchor in prose; show a contained preview on hover or keyboard focus.
4976
4734
  * @param props.disabled - suppress opening; turning true dismisses an open card.
4735
+ * @param props.grouped - share first-display dwell across the surrounding list and active portal.
4736
+ * Group replacement removes the previous card immediately, including a fading preview.
4977
4737
  * @param props.copyText - optional primary value copied by activation and
4978
4738
  * included in the card's accessible name.
4979
4739
  * @param props.copyLabel - localized accessible activation-label prefix.
4980
4740
  * @param props.copiedLabel - localized visible success label.
4981
4741
  * @returns anchor wrapper with the conditional portaled card.
4982
4742
  */
4983
- function HoverCard({ anchor, content, openDelayMs = 500, disabled = false, copyText, copyLabel, copiedLabel, variant = "compact", widthAnchorRef, inline = false }) {
4743
+ function HoverCard({ anchor, content, openDelayMs = 500, disabled = false, grouped = false, copyText, copyLabel, copiedLabel, variant = "compact", widthAnchorRef, inline = false }) {
4984
4744
  const rootRef = useRef(null);
4985
4745
  const cardRef = useRef(null);
4986
4746
  const timerRef = useRef(null);
@@ -4995,7 +4755,9 @@ function HoverCard({ anchor, content, openDelayMs = 500, disabled = false, copyT
4995
4755
  const [pos, setPos] = useState(null);
4996
4756
  const positioned = pos !== null;
4997
4757
  const [copied, setCopied] = useState(false);
4998
- const [suppressed, setSuppressed] = useState(false);
4758
+ const parentGroup = useContext(HoverCardGroupContext);
4759
+ const group = grouped ? parentGroup : null;
4760
+ const [groupOwner] = useState(() => Symbol("hover-card"));
4999
4761
  const clearCopied = useCallback(() => {
5000
4762
  if (copyTimerRef.current !== null) {
5001
4763
  clearTimeout(copyTimerRef.current);
@@ -5010,12 +4772,36 @@ function HoverCard({ anchor, content, openDelayMs = 500, disabled = false, copyT
5010
4772
  setPhase((current) => variant === "preview" && current !== "closed" ? "closing" : "closed");
5011
4773
  }, [clearCopied, variant]);
5012
4774
  const { arm: armClose, cancel: cancelClose } = usePointerGrace(close);
5013
- const clearTimer = () => {
4775
+ const clearTimer = useCallback(() => {
5014
4776
  if (timerRef.current !== null) {
5015
4777
  clearTimeout(timerRef.current);
5016
4778
  timerRef.current = null;
5017
4779
  }
5018
- };
4780
+ }, []);
4781
+ const dismissImmediately = useCallback(() => {
4782
+ clearTimer();
4783
+ cancelClose();
4784
+ copyEpochRef.current += 1;
4785
+ clearCopied();
4786
+ setPhase("closed");
4787
+ }, [
4788
+ clearTimer,
4789
+ cancelClose,
4790
+ clearCopied
4791
+ ]);
4792
+ const groupVisible = open && positioned;
4793
+ useLayoutEffect(() => {
4794
+ if (!groupVisible || group === null) return;
4795
+ group.shown(groupOwner, dismissImmediately, cardRef.current);
4796
+ return () => {
4797
+ group.release(groupOwner);
4798
+ };
4799
+ }, [
4800
+ group,
4801
+ groupOwner,
4802
+ groupVisible,
4803
+ dismissImmediately
4804
+ ]);
5019
4805
  useEffect(() => {
5020
4806
  if (!closing) return;
5021
4807
  const timer = setTimeout(() => {
@@ -5140,7 +4926,7 @@ function HoverCard({ anchor, content, openDelayMs = 500, disabled = false, copyT
5140
4926
  inline
5141
4927
  ]);
5142
4928
  useLayoutEffect(() => {
5143
- if (!open || pos === null || variant === "preview" || inline || suppressed) return;
4929
+ if (!open || pos === null || variant === "preview" || inline) return;
5144
4930
  /* v8 ignore next -- the card is mounted whenever pos is set, so the ref is attached here. */
5145
4931
  const h = cardRef.current?.offsetHeight ?? 0;
5146
4932
  if (pos.top + h > window.innerHeight - VIEWPORT_MARGIN) setPos({
@@ -5151,8 +4937,7 @@ function HoverCard({ anchor, content, openDelayMs = 500, disabled = false, copyT
5151
4937
  open,
5152
4938
  pos,
5153
4939
  variant,
5154
- inline,
5155
- suppressed
4940
+ inline
5156
4941
  ]);
5157
4942
  const copy = async (text) => {
5158
4943
  if (copied || copyingRef.current) return;
@@ -5174,9 +4959,9 @@ function HoverCard({ anchor, content, openDelayMs = 500, disabled = false, copyT
5174
4959
  cancelClose();
5175
4960
  close();
5176
4961
  };
5177
- const card = open && pos !== null && !suppressed && jsx("div", {
4962
+ const card = open && pos !== null && jsx("div", {
5178
4963
  ref: cardRef,
5179
- className: clsx(css$18.card, variant === "preview" && css$18.preview, inline && css$18.media, copyable && css$18.copyable, copied && css$18.feedback),
4964
+ className: clsx(css$17.card, variant === "preview" && css$17.preview, inline && css$17.media, copyable && css$17.copyable, copied && css$17.feedback),
5180
4965
  "data-closing": closing || void 0,
5181
4966
  style: {
5182
4967
  ...pos,
@@ -5199,14 +4984,14 @@ function HoverCard({ anchor, content, openDelayMs = 500, disabled = false, copyT
5199
4984
  copy(copyText);
5200
4985
  } : void 0,
5201
4986
  children: copied ? jsx("span", {
5202
- className: css$18.copied,
4987
+ className: css$17.copied,
5203
4988
  "aria-hidden": "true",
5204
4989
  children: copiedLabel
5205
4990
  }) : content
5206
4991
  });
5207
4992
  return jsxs("span", {
5208
4993
  ref: rootRef,
5209
- className: clsx(css$18.root, inline && css$18.inline),
4994
+ className: clsx(css$17.root, inline && css$17.inline),
5210
4995
  onFocus: inline ? (event) => {
5211
4996
  if (!disabled && event.target.matches(":focus-visible")) {
5212
4997
  cancelClose();
@@ -5228,7 +5013,8 @@ function HoverCard({ anchor, content, openDelayMs = 500, disabled = false, copyT
5228
5013
  return;
5229
5014
  }
5230
5015
  clearTimer();
5231
- timerRef.current = setTimeout(() => {
5016
+ if (group?.isWarm()) setPhase("open");
5017
+ else timerRef.current = setTimeout(() => {
5232
5018
  setPhase("open");
5233
5019
  }, openDelayMs);
5234
5020
  },
@@ -5239,12 +5025,9 @@ function HoverCard({ anchor, content, openDelayMs = 500, disabled = false, copyT
5239
5025
  onPointerDownCapture: dismissFromAnchor,
5240
5026
  onClickCapture: dismissFromAnchor,
5241
5027
  children: [
5242
- jsx(TooltipSuppression.Provider, {
5243
- value: setSuppressed,
5244
- children: anchor
5245
- }),
5246
- open && !suppressed && copyable && jsx("span", {
5247
- className: css$18.status,
5028
+ anchor,
5029
+ open && copyable && jsx("span", {
5030
+ className: css$17.status,
5248
5031
  role: "status",
5249
5032
  children: copied ? copiedLabel : ""
5250
5033
  }),
@@ -5279,11 +5062,11 @@ function Modal({ open, onClose, title, closeLabel, description, children, footer
5279
5062
  useModalLayer(dialog, open, onClose);
5280
5063
  if (!open) return null;
5281
5064
  return createPortal(jsxs("div", {
5282
- className: css$19.root,
5065
+ className: css$18.root,
5283
5066
  role: "presentation",
5284
5067
  onKeyDownCapture,
5285
5068
  children: [jsx("div", {
5286
- className: css$19.mask,
5069
+ className: css$18.mask,
5287
5070
  style: backdropBlur ? void 0 : { backdropFilter: "none" },
5288
5071
  "aria-hidden": "true",
5289
5072
  onClick: onClose
@@ -5291,37 +5074,37 @@ function Modal({ open, onClose, title, closeLabel, description, children, footer
5291
5074
  ref: dialog,
5292
5075
  tabIndex: -1,
5293
5076
  "data-shortcut-modal": shortcutModal,
5294
- className: clsx(css$19.dialog, className),
5077
+ className: clsx(css$18.dialog, className),
5295
5078
  role: "dialog",
5296
5079
  "aria-modal": "true",
5297
5080
  "aria-label": title,
5298
5081
  children: headless ? children : jsxs(Fragment, { children: [jsxs("div", {
5299
- className: clsx(css$19.content, contentClassName),
5082
+ className: clsx(css$18.content, contentClassName),
5300
5083
  children: [
5301
5084
  jsxs("div", {
5302
- className: css$19.header,
5085
+ className: css$18.header,
5303
5086
  children: [jsx("h2", {
5304
- className: css$19.title,
5087
+ className: css$18.title,
5305
5088
  children: title
5306
5089
  }), jsx("button", {
5307
5090
  type: "button",
5308
- className: css$19.close,
5091
+ className: css$18.close,
5309
5092
  "aria-label": closeLabel,
5310
5093
  onClick: onClose,
5311
5094
  children: jsx(IconCloseOutlineRegular, { size: 14 })
5312
5095
  })]
5313
5096
  }),
5314
5097
  description !== void 0 && description !== "" && jsx("p", {
5315
- className: css$19.description,
5098
+ className: css$18.description,
5316
5099
  children: description
5317
5100
  }),
5318
5101
  children !== void 0 && jsx("div", {
5319
- className: css$19.body,
5102
+ className: css$18.body,
5320
5103
  children
5321
5104
  })
5322
5105
  ]
5323
5106
  }), footer !== void 0 && jsx("div", {
5324
- className: css$19.footer,
5107
+ className: css$18.footer,
5325
5108
  children: footer
5326
5109
  })] })
5327
5110
  })]
@@ -5343,28 +5126,28 @@ function RiskConfirmation({ open, title, description, acknowledgeLabel, cancelLa
5343
5126
  onClose: onCancel,
5344
5127
  title,
5345
5128
  closeLabel,
5346
- className: css$20.confirmation ?? "",
5347
- contentClassName: css$20.confirmationContent ?? "",
5129
+ className: css$19.confirmation ?? "",
5130
+ contentClassName: css$19.confirmationContent ?? "",
5348
5131
  footer: jsxs(Fragment, { children: [jsx(Button, {
5349
5132
  variant: "outline",
5350
- className: css$20.modalAction,
5133
+ className: css$19.modalAction,
5351
5134
  onClick: onCancel,
5352
5135
  children: cancelLabel
5353
5136
  }), jsx(Button, {
5354
5137
  variant: "primary",
5355
- className: css$20.confirmAction,
5138
+ className: css$19.confirmAction,
5356
5139
  disabled: disabled || !acknowledged,
5357
5140
  onClick: onConfirm,
5358
5141
  children: confirmLabel
5359
5142
  })] }),
5360
5143
  children: [jsxs("div", {
5361
- className: css$20.warning,
5144
+ className: css$19.warning,
5362
5145
  children: [jsx(IconWarningOutlineRegular, {
5363
5146
  size: 18,
5364
- className: css$20.warningIcon
5147
+ className: css$19.warningIcon
5365
5148
  }), jsx("p", { children: description })]
5366
5149
  }), jsxs("label", {
5367
- className: css$20.acknowledgement,
5150
+ className: css$19.acknowledgement,
5368
5151
  children: [jsx("input", {
5369
5152
  type: "checkbox",
5370
5153
  checked: acknowledged,
@@ -5412,44 +5195,44 @@ function ConnectionIndicator({ state, disconnectedLabel, connectingLabel, recove
5412
5195
  };
5413
5196
  }, [state, rendered]);
5414
5197
  if (rendered === void 0) return null;
5415
- const leavingClass = leaving ? ` ${css$21.leaving}` : "";
5198
+ const leavingClass = leaving ? ` ${css$20.leaving}` : "";
5416
5199
  if (rendered === "recovered") return jsxs("div", {
5417
- className: `${css$21.indicator} ${css$21.success}${leavingClass}`,
5200
+ className: `${css$20.indicator} ${css$20.success}${leavingClass}`,
5418
5201
  role: "status",
5419
5202
  "aria-label": recoveredLabel,
5420
5203
  children: [jsx("span", {
5421
- className: css$21.icon,
5204
+ className: css$20.icon,
5422
5205
  "aria-hidden": "true",
5423
5206
  children: jsx(IconCheckOutlineRegular, { size: 14 })
5424
5207
  }), jsx("span", {
5425
- className: css$21.label,
5208
+ className: css$20.label,
5426
5209
  children: recoveredLabel
5427
5210
  })]
5428
5211
  });
5429
5212
  const connecting = rendered === "connecting";
5430
5213
  return jsxs("button", {
5431
5214
  type: "button",
5432
- className: `${css$21.indicator} ${css$21.warning}${leavingClass}`,
5215
+ className: `${css$20.indicator} ${css$20.warning}${leavingClass}`,
5433
5216
  "data-phase": rendered,
5434
5217
  "aria-label": connecting ? restartActionLabel : reconnectActionLabel,
5435
5218
  onClick: onReconnect,
5436
5219
  children: [jsx("span", {
5437
- className: css$21.icon,
5220
+ className: css$20.icon,
5438
5221
  "aria-hidden": "true",
5439
5222
  children: connecting ? jsx(StateDot, { state: "ongoing" }) : jsx(IconRefreshOutlineRegular, { size: 14 })
5440
5223
  }), jsx("span", {
5441
- className: css$21.label,
5224
+ className: css$20.label,
5442
5225
  children: connecting ? jsxs(Fragment, { children: [connectingLabel, jsxs("span", {
5443
- className: css$21.dots,
5226
+ className: css$20.dots,
5444
5227
  "aria-hidden": "true",
5445
5228
  children: [
5446
5229
  jsx("span", { children: "." }),
5447
5230
  jsx("span", {
5448
- className: css$21.secondDot,
5231
+ className: css$20.secondDot,
5449
5232
  children: "."
5450
5233
  }),
5451
5234
  jsx("span", {
5452
- className: css$21.thirdDot,
5235
+ className: css$20.thirdDot,
5453
5236
  children: "."
5454
5237
  })
5455
5238
  ]
@@ -5691,6 +5474,28 @@ function FullAccessArtwork({ size = 16, className, strokeWidth }) {
5691
5474
  ]
5692
5475
  });
5693
5476
  }
5477
+ function AutoReviewArtwork({ size = 16, className, strokeWidth }) {
5478
+ return jsxs("svg", {
5479
+ width: size,
5480
+ height: size,
5481
+ className,
5482
+ viewBox: "0 0 16 16",
5483
+ fill: "none",
5484
+ xmlns: "http://www.w3.org/2000/svg",
5485
+ "aria-hidden": "true",
5486
+ strokeWidth,
5487
+ children: [jsx("path", {
5488
+ d: "M6.59624 2.14853C7.50155 1.80917 8.49914 1.80919 9.40444 2.14859L13.9245 3.84317V7.11961C13.9245 11.6089 10.5565 13.5975 8.00035 14.5779C5.44423 13.5975 2.07544 11.6089 2.07544 7.11961V3.84317L6.59624 2.14853Z",
5489
+ stroke: "currentColor",
5490
+ strokeLinejoin: "round"
5491
+ }), jsx("path", {
5492
+ d: "M5.75 10.15L8 4.95L10.25 10.15M6.43 8.59H9.57",
5493
+ stroke: "currentColor",
5494
+ strokeLinecap: "round",
5495
+ strokeLinejoin: "round"
5496
+ })]
5497
+ });
5498
+ }
5694
5499
  /**
5695
5500
  * Render the read-only permission icon with a one-pixel stroke.
5696
5501
  * @param props - Size and optional class.
@@ -5757,6 +5562,28 @@ function PermissionIconFullAccessMedium(props) {
5757
5562
  strokeWidth: ICON_MEDIUM_STROKE
5758
5563
  });
5759
5564
  }
5565
+ /**
5566
+ * Render the auto-review permission icon with a one-pixel stroke.
5567
+ * @param props - Size and optional class.
5568
+ * @returns The regular decorative permission glyph.
5569
+ */
5570
+ function PermissionIconAutoReviewRegular(props) {
5571
+ return jsx(AutoReviewArtwork, {
5572
+ ...props,
5573
+ strokeWidth: 1
5574
+ });
5575
+ }
5576
+ /**
5577
+ * Render the auto-review permission icon with a 1.3px stroke.
5578
+ * @param props - Size and optional class.
5579
+ * @returns The medium decorative permission glyph.
5580
+ */
5581
+ function PermissionIconAutoReviewMedium(props) {
5582
+ return jsx(AutoReviewArtwork, {
5583
+ ...props,
5584
+ strokeWidth: ICON_MEDIUM_STROKE
5585
+ });
5586
+ }
5760
5587
  //#endregion
5761
5588
  //#region lib/types/ReferenceIcon.js
5762
5589
  /**
@@ -6480,7 +6307,7 @@ function FileTypeIcon(props) {
6480
6307
  type: resolvedType,
6481
6308
  size,
6482
6309
  className
6483
- }) : glyph(resolvedType, size, clsx(css$22.icon, css$22[resolvedType], className));
6310
+ }) : glyph(resolvedType, size, clsx(css$21.icon, css$21[resolvedType], className));
6484
6311
  }
6485
6312
  //#endregion
6486
6313
  //#region lib/types/SiteGlyph.js
@@ -6749,111 +6576,362 @@ function LinkIconMedium(props) {
6749
6576
  }
6750
6577
  //#endregion
6751
6578
  //#region lib/types/user-text.js
6752
- /** The wire form a session chip serializes to; label is the display text. */
6753
- const SESSION_WIRE_RE = /@\[([^\]\n]+)\]\(dsh-session:[^)\s]+\)/gu;
6754
- /** Sentence punctuation a bare `@name` token may carry without being part of the reference. */
6755
- const TRAILING_PUNCTUATION_RE = /[.,;:!?,。;:!?]+$/u;
6756
- /**
6757
- * Split one sent text into inline plain runs and reference chips.
6758
- * @param text - the logged model text of the message or queue row.
6759
- * @param sessionLabels - exact session mention labels associated by an adjacent recall.
6760
- * @param slashNames - names a `/name` token may decorate as: the skills the
6761
- * host loaded for this message, or the command a command bubble echoes
6762
- * (unsent queue rows pass none).
6763
- * @param slashKind - the chip kind those tokens render as.
6764
- * @param references - optional file and skill preview actions; session and command tokens stay labels.
6765
- * @returns inline nodes covering the whole text.
6766
- */
6767
- function projectUserText(text, sessionLabels, slashNames = [], slashKind = "skill", references) {
6768
- const ranges = [];
6769
- SESSION_WIRE_RE.lastIndex = 0;
6770
- let wire;
6771
- while ((wire = SESSION_WIRE_RE.exec(text)) !== null) ranges.push({
6772
- start: wire.index,
6773
- end: wire.index + wire[0].length,
6774
- label: wire[0],
6775
- kind: "session",
6776
- display: wire[1]
6579
+ /**
6580
+ * Render an uninterpreted inline text run.
6581
+ * @param props - text retained verbatim from the caller's document.
6582
+ * @returns one inline run without Markdown or reference recognition.
6583
+ */
6584
+ function UserTextRun({ text }) {
6585
+ return jsx("span", {
6586
+ className: css$22.plainRun,
6587
+ children: text
6588
+ });
6589
+ }
6590
+ /**
6591
+ * Render a reference label or its explicitly supplied activation action.
6592
+ * Text selection and repeated pointer clicks do not activate the reference.
6593
+ * @param props - resolved visual fields and optional action from the owning renderer.
6594
+ * @returns an inline label, or a keyboard-accessible button when activation is supplied.
6595
+ */
6596
+ function ReferenceChip({ appearance, label, title, onActivate }) {
6597
+ const slash = appearance === "skill" || appearance === "command";
6598
+ const contents = jsxs(Fragment, { children: [!slash && jsx(ReferenceIconRegular, {
6599
+ kind: appearance,
6600
+ size: 16,
6601
+ className: css$22.refIcon
6602
+ }), label] });
6603
+ const className = clsx(css$22.refChip, slash && css$22.slashChip);
6604
+ return onActivate === void 0 ? jsx("span", {
6605
+ className,
6606
+ "data-ref-chip": appearance,
6607
+ title,
6608
+ children: contents
6609
+ }) : jsx("button", {
6610
+ type: "button",
6611
+ className: clsx(className, markdownCss.fileMention),
6612
+ "data-ref-chip": appearance,
6613
+ title,
6614
+ onClick: (event) => {
6615
+ if (event.detail > 1 || event.detail !== 0 && event.currentTarget.ownerDocument.getSelection()?.isCollapsed === false) return;
6616
+ onActivate();
6617
+ },
6618
+ children: contents
6619
+ });
6620
+ }
6621
+ //#endregion
6622
+ //#region lib/types/input-modality.js
6623
+ /**
6624
+ * Document-wide input tracking shared by tooltips and focus-ring styles.
6625
+ * Tooltips follow the last input; rings follow navigation or a key followed by
6626
+ * focus on a different control. Modifiers and refocusing alone keep rings silent.
6627
+ * Module-level listeners live for the document lifetime; Node imports are inert.
6628
+ */
6629
+ /** Modality values published on the document element. */
6630
+ const INPUT_MODALITY = {
6631
+ pointer: "pointer",
6632
+ keyboard: "keyboard"
6633
+ };
6634
+ /** Attribute carrying whether focus navigation last owned focus. */
6635
+ const INPUT_MODALITY_ATTRIBUTE = "data-input-modality";
6636
+ const FOCUS_NAVIGATION = new Set([
6637
+ "Tab",
6638
+ "Home",
6639
+ "End",
6640
+ "PageUp",
6641
+ "PageDown"
6642
+ ]);
6643
+ let pointer = false;
6644
+ let pointerOwnsFocus = false;
6645
+ let keyFocusOrigin;
6646
+ function publish() {
6647
+ document.documentElement.setAttribute(INPUT_MODALITY_ATTRIBUTE, pointerOwnsFocus ? INPUT_MODALITY.pointer : INPUT_MODALITY.keyboard);
6648
+ }
6649
+ /**
6650
+ * Whether the last input came from a pointer, independently of ring visibility.
6651
+ * @returns True after pointer input; false after any key.
6652
+ */
6653
+ function pointerModality() {
6654
+ return pointer;
6655
+ }
6656
+ if (typeof window !== "undefined") {
6657
+ window.addEventListener("pointerdown", () => {
6658
+ pointer = true;
6659
+ pointerOwnsFocus = true;
6660
+ keyFocusOrigin = void 0;
6661
+ publish();
6662
+ }, true);
6663
+ window.addEventListener("keydown", (event) => {
6664
+ pointer = false;
6665
+ if (event.isComposing) {
6666
+ keyFocusOrigin = void 0;
6667
+ return;
6668
+ }
6669
+ keyFocusOrigin = event.composedPath()[0];
6670
+ if (!FOCUS_NAVIGATION.has(event.key) && !event.key.startsWith("Arrow")) return;
6671
+ pointerOwnsFocus = false;
6672
+ publish();
6673
+ }, true);
6674
+ window.addEventListener("focusin", (event) => {
6675
+ if (keyFocusOrigin === void 0 || event.composedPath()[0] === keyFocusOrigin) return;
6676
+ keyFocusOrigin = void 0;
6677
+ if (!pointerOwnsFocus) return;
6678
+ pointerOwnsFocus = false;
6679
+ publish();
6680
+ }, true);
6681
+ window.addEventListener("blur", () => {
6682
+ keyFocusOrigin = void 0;
6683
+ });
6684
+ }
6685
+ //#endregion
6686
+ //#region lib/types/Tooltip.js
6687
+ /** Anchor-preserving tooltips; an optional body portal escapes clipping containers and stacking contexts that cap the bubble's z-index. */
6688
+ /**
6689
+ * Suppression channel for nested tooltips: a visible descendant tooltip
6690
+ * withdraws the enclosing tooltip while its bubble is shown.
6691
+ */
6692
+ const TooltipSuppression = createContext(null);
6693
+ /**
6694
+ * Attach a hover/focus tooltip to an anchor element.
6695
+ * @param props.label - bubble text, or a resolver evaluated only while visible; an empty string shows only shortcut keys.
6696
+ * @param props.shortcutKeys - effective key labels rendered as platform-formatted keycaps after optional text.
6697
+ * @param props.side - placement relative to the anchor (default 'right').
6698
+ * @param props.align - horizontal anchor-edge alignment for 'bottom'/'top' bubbles: 'end' pins
6699
+ * the bubble's right edge to the anchor's (for anchors beside other hover surfaces the centered
6700
+ * bubble would overlap); default 'center'. Ignored for side 'right'.
6701
+ * @param props.portal - render the bubble under document.body, so an ancestor's clipping or its
6702
+ * stacking context (which confines the bubble's z-index to that context) cannot hide it.
6703
+ * @param props.delayMs - hover delay in milliseconds (default 0).
6704
+ * @param props.focusDelayMs - keyboard focus delay in milliseconds (default 0); blur, click,
6705
+ * mouse leave, disabling, and unmount cancel a pending show.
6706
+ * @param props.gap - anchor-to-bubble distance in pixels for 'bottom'/'top' bubbles (default 8);
6707
+ * ignored for side 'right'.
6708
+ * @param props.disabled - suppress the bubble while true; the anchor renders identically so
6709
+ * toggling never remounts it (which would cut its CSS transitions).
6710
+ * @param props.maxWidth - bubble width cap in pixels, for labels long enough that the default
6711
+ * half-viewport cap would render a slab wider than the surface the anchor sits on.
6712
+ * @param props.openOnClick - clicking also pins the bubble for reading; another click, Escape,
6713
+ * Tab, or an outside pointerdown dismisses it. Defaults to false for ordinary action tooltips.
6714
+ * @param props.children - a single anchor element; its own ref (callback or object) is forwarded alongside the tooltip's.
6715
+ * @returns the cloned anchor plus a fixed-position bubble, optionally portaled to the body.
6716
+ * The bubble stays hidden until ResizeObserver supplies its size for viewport fitting; clicking the
6717
+ * anchor dismisses the bubble unless openOnClick is enabled, and focus arriving after a pointer
6718
+ * interaction (a closing menu refocusing its trigger) never raises it.
6719
+ */
6720
+ function Tooltip({ label, shortcutKeys, side = "right", align = "center", delayMs = 0, focusDelayMs = 0, gap = 8, disabled = false, portal = false, maxWidth, openOnClick = false, children }) {
6721
+ const id = useId();
6722
+ const [pinned, setPinned] = useState(false);
6723
+ const anchor = useRef(null);
6724
+ const childRef = children.ref;
6725
+ const mergedRef = useCallback((el) => {
6726
+ anchor.current = el;
6727
+ if (typeof childRef === "function") childRef(el);
6728
+ else if (childRef != null) childRef.current = el;
6729
+ }, [childRef]);
6730
+ const [pos, setPos] = useState(null);
6731
+ const bubble = useRef(null);
6732
+ const resolvedLabel = pos === null ? null : typeof label === "function" ? label() : label;
6733
+ const y = pos === null ? 0 : side === "right" ? pos.top + (pos.bottom - pos.top) / 2 : side === "top" ? pos.top - gap : pos.bottom + gap;
6734
+ const showTimer = useRef(null);
6735
+ const triggers = useRef({
6736
+ hover: false,
6737
+ focus: false
6777
6738
  });
6778
- for (const rawLabel of [...new Set(sessionLabels)].sort((a, b) => b.length - a.length)) {
6779
- const label = `@${rawLabel}`;
6780
- let start = text.indexOf(label);
6781
- while (start >= 0) {
6782
- ranges.push({
6783
- start,
6784
- end: start + label.length,
6785
- label,
6786
- kind: "session"
6787
- });
6788
- start = text.indexOf(label, start + label.length);
6739
+ const suppressAncestors = useContext(TooltipSuppression);
6740
+ const [suppressed, setSuppressed] = useState(false);
6741
+ const announce = useCallback((active) => {
6742
+ suppressAncestors?.(active);
6743
+ }, [suppressAncestors]);
6744
+ const visible = pos !== null && !disabled;
6745
+ useEffect(() => {
6746
+ const el = bubble.current;
6747
+ if (pos === null || !visible || suppressed || el === null) return;
6748
+ const edgeMargin = 12;
6749
+ let size;
6750
+ let placement = side;
6751
+ const fit = () => {
6752
+ if (size === void 0) return;
6753
+ const { inlineSize: width, blockSize: height } = size;
6754
+ const offset = side === "right" ? 0 : align === "end" ? width : width / 2;
6755
+ const left = Math.max(edgeMargin, Math.min(pos.x - offset, window.innerWidth - edgeMargin - width));
6756
+ const fitsBelow = pos.bottom + gap + height <= window.innerHeight - edgeMargin;
6757
+ const fitsAbove = pos.top - gap - height >= edgeMargin;
6758
+ if (placement === "bottom" && !fitsBelow && fitsAbove) placement = "top";
6759
+ else if (placement === "top" && !fitsAbove && fitsBelow) placement = "bottom";
6760
+ el.style.left = `${left + offset}px`;
6761
+ el.style.top = `${placement === "right" ? (pos.top + pos.bottom) / 2 : placement === "top" ? pos.top - gap : pos.bottom + gap}px`;
6762
+ el.dataset.side = placement;
6763
+ el.style.visibility = "visible";
6764
+ };
6765
+ const observer = new ResizeObserver((entries) => {
6766
+ size = entries[0]?.borderBoxSize[0];
6767
+ fit();
6768
+ });
6769
+ observer.observe(el, { box: "border-box" });
6770
+ window.addEventListener("resize", fit);
6771
+ return () => {
6772
+ observer.disconnect();
6773
+ window.removeEventListener("resize", fit);
6774
+ };
6775
+ }, [
6776
+ align,
6777
+ gap,
6778
+ pos,
6779
+ side,
6780
+ suppressed,
6781
+ visible
6782
+ ]);
6783
+ useEffect(() => {
6784
+ announce(visible);
6785
+ return () => {
6786
+ announce(false);
6787
+ };
6788
+ }, [announce, visible]);
6789
+ const cancelShow = useCallback(() => {
6790
+ if (showTimer.current === null) return;
6791
+ clearTimeout(showTimer.current);
6792
+ showTimer.current = null;
6793
+ }, []);
6794
+ useEffect(() => {
6795
+ if (pinned && (disabled || !openOnClick)) setPinned(false);
6796
+ if (disabled) {
6797
+ cancelShow();
6798
+ triggers.current = {
6799
+ hover: false,
6800
+ focus: false
6801
+ };
6802
+ setPos(null);
6789
6803
  }
6790
- }
6791
- const re = /(^|\s)(\/[\w-]+(?=\s|$)|@"[^"\n]+"|@[^\s]+)/gu;
6792
- let m;
6793
- while ((m = re.exec(text)) !== null) {
6794
- const tokenStart = m.index + m[1].length;
6795
- const rawLabel = m[2];
6796
- const label = rawLabel.startsWith("@\"") ? rawLabel : rawLabel.replace(TRAILING_PUNCTUATION_RE, "");
6797
- if (label.length <= 1) continue;
6798
- if (label.startsWith("/") && !slashNames.includes(label.slice(1))) continue;
6799
- ranges.push({
6800
- start: tokenStart,
6801
- end: tokenStart + label.length,
6802
- label,
6803
- kind: "plain"
6804
+ return cancelShow;
6805
+ }, [
6806
+ cancelShow,
6807
+ disabled,
6808
+ openOnClick,
6809
+ pinned
6810
+ ]);
6811
+ const show = () => {
6812
+ if (disabled) return;
6813
+ const el = anchor.current;
6814
+ /* v8 ignore next -- the ref is attached by event time: events fire on the cloned anchor. */
6815
+ if (el === null) return;
6816
+ const r = el.getBoundingClientRect();
6817
+ setPos({
6818
+ x: side === "right" ? r.right + 10 : align === "end" ? r.right : r.left + r.width / 2,
6819
+ top: r.top,
6820
+ bottom: r.bottom
6804
6821
  });
6805
- }
6806
- const rankOf = (range) => range.kind === "session" ? 0 : 1;
6807
- ranges.sort((a, b) => a.start - b.start || rankOf(a) - rankOf(b) || b.end - a.end);
6808
- const parts = [];
6809
- let cursor = 0;
6810
- const pushPlain = (from, to) => {
6811
- parts.push(jsx("span", {
6812
- className: css$23.plainRun,
6813
- children: text.slice(from, to)
6814
- }, `t${from}`));
6822
+ announce(true);
6815
6823
  };
6816
- for (const range of ranges) {
6817
- if (range.start < cursor) continue;
6818
- const { start: tokenStart, end, label, kind } = range;
6819
- if (tokenStart > cursor) pushPlain(cursor, tokenStart);
6820
- const referenceKind = kind === "session" ? "session" : label.startsWith("@") ? label.replace(/^@"|"$/gu, "").endsWith("/") ? "folder" : "file" : void 0;
6821
- const displayLabel = range.display ?? (referenceKind === void 0 ? label : referenceKind === "session" ? label.slice(1) : label.slice(1).replace(/^"|"$/gu, "").split(/[\\/]/u).filter(Boolean).at(-1) ?? label.slice(1));
6822
- const contents = jsxs(Fragment, { children: [referenceKind !== void 0 && jsx(ReferenceIconRegular, {
6823
- kind: referenceKind,
6824
- size: 16,
6825
- className: css$23.refIcon
6826
- }), displayLabel] });
6827
- const open = references === void 0 ? void 0 : referenceKind === "file" ? () => {
6828
- references.openFile(label.slice(1).replace(/^"|"$/gu, ""));
6829
- } : referenceKind === void 0 && slashKind === "skill" ? () => {
6830
- references.openSkill(label.slice(1));
6831
- } : void 0;
6832
- const className = clsx(css$23.refChip, referenceKind === void 0 && css$23.slashChip);
6833
- parts.push(open === void 0 ? jsx("span", {
6834
- className,
6835
- "data-ref-chip": referenceKind ?? slashKind,
6836
- title: label,
6837
- children: contents
6838
- }, tokenStart) : jsx("button", {
6839
- type: "button",
6840
- className: clsx(className, markdownCss.fileMention),
6841
- "data-ref-chip": referenceKind ?? slashKind,
6842
- title: label,
6843
- onClick: (event) => {
6844
- if (event.detail > 1 || event.detail !== 0 && event.currentTarget.ownerDocument.getSelection()?.isCollapsed === false) return;
6845
- open();
6824
+ const showAfterDelay = (delay) => {
6825
+ cancelShow();
6826
+ if (delay <= 0) {
6827
+ show();
6828
+ return;
6829
+ }
6830
+ showTimer.current = setTimeout(() => {
6831
+ showTimer.current = null;
6832
+ show();
6833
+ }, delay);
6834
+ };
6835
+ const withdraw = useCallback(() => {
6836
+ setPinned(false);
6837
+ setPos(null);
6838
+ announce(false);
6839
+ }, [announce]);
6840
+ const hide = () => {
6841
+ cancelShow();
6842
+ if (!triggers.current.hover && !triggers.current.focus && !pinned) withdraw();
6843
+ };
6844
+ const dismiss = useCallback(() => {
6845
+ cancelShow();
6846
+ triggers.current = {
6847
+ hover: false,
6848
+ focus: false
6849
+ };
6850
+ withdraw();
6851
+ }, [cancelShow, withdraw]);
6852
+ useDismissOnOutsidePointer(anchor, openOnClick && visible, dismiss, bubble);
6853
+ useEffect(() => {
6854
+ if (!openOnClick || !visible) return;
6855
+ const onKeyDown = (event) => {
6856
+ if (event.key !== "Escape" && event.key !== "Tab") return;
6857
+ if (event.key === "Escape") {
6858
+ event.preventDefault();
6859
+ event.stopPropagation();
6860
+ }
6861
+ dismiss();
6862
+ };
6863
+ document.addEventListener("keydown", onKeyDown, true);
6864
+ return () => {
6865
+ document.removeEventListener("keydown", onKeyDown, true);
6866
+ };
6867
+ }, [
6868
+ dismiss,
6869
+ openOnClick,
6870
+ visible
6871
+ ]);
6872
+ const content = visible && !suppressed && jsxs("span", {
6873
+ ref: bubble,
6874
+ id: openOnClick ? id : void 0,
6875
+ className: css$23.bubble,
6876
+ "data-side": side,
6877
+ "data-portal": portal || void 0,
6878
+ "data-pinned": pinned || void 0,
6879
+ "data-align": align,
6880
+ "data-has-shortcut": shortcutKeys?.length ? true : void 0,
6881
+ style: {
6882
+ left: pos.x,
6883
+ top: y,
6884
+ visibility: "hidden",
6885
+ ...maxWidth === void 0 ? {} : { maxWidth }
6886
+ },
6887
+ role: "tooltip",
6888
+ "aria-label": shortcutKeys?.length ? [resolvedLabel, shortcutKeys.join(" ")].filter(Boolean).join(" ") : void 0,
6889
+ children: [resolvedLabel && jsx("span", {
6890
+ className: css$23.label,
6891
+ children: resolvedLabel
6892
+ }), shortcutKeys !== void 0 && shortcutKeys.length > 0 && jsx(ShortcutKeys, {
6893
+ keys: shortcutKeys,
6894
+ variant: "tooltip"
6895
+ })]
6896
+ });
6897
+ return jsxs(TooltipSuppression.Provider, {
6898
+ value: setSuppressed,
6899
+ children: [cloneElement(children, {
6900
+ ref: mergedRef,
6901
+ "aria-describedby": openOnClick && visible ? [children.props["aria-describedby"], id].filter(Boolean).join(" ") : children.props["aria-describedby"],
6902
+ onMouseEnter: (e) => {
6903
+ children.props.onMouseEnter?.(e);
6904
+ triggers.current.hover = true;
6905
+ showAfterDelay(delayMs);
6846
6906
  },
6847
- children: contents
6848
- }, tokenStart));
6849
- cursor = end;
6850
- }
6851
- if (parts.length === 0) return jsx("span", {
6852
- className: css$23.plainRun,
6853
- children: text
6907
+ onMouseLeave: (e) => {
6908
+ children.props.onMouseLeave?.(e);
6909
+ triggers.current.hover = false;
6910
+ cancelShow();
6911
+ if (!pinned) withdraw();
6912
+ },
6913
+ onClick: (e) => {
6914
+ children.props.onClick?.(e);
6915
+ triggers.current.focus = false;
6916
+ cancelShow();
6917
+ if (openOnClick && !disabled && !pinned) {
6918
+ setPinned(true);
6919
+ show();
6920
+ } else withdraw();
6921
+ },
6922
+ onFocus: (e) => {
6923
+ children.props.onFocus?.(e);
6924
+ if (pointerModality()) return;
6925
+ triggers.current.focus = true;
6926
+ showAfterDelay(focusDelayMs);
6927
+ },
6928
+ onBlur: (e) => {
6929
+ children.props.onBlur?.(e);
6930
+ triggers.current.focus = false;
6931
+ hide();
6932
+ }
6933
+ }), portal ? content !== false && createPortal(content, document.body) : content]
6854
6934
  });
6855
- if (cursor < text.length) pushPlain(cursor, text.length);
6856
- return jsx(Fragment, { children: parts });
6857
6935
  }
6858
6936
  //#endregion
6859
6937
  //#region lib/types/Toast.js
@@ -7700,6 +7778,15 @@ const regexEngine = createJavaScriptRegexEngine({
7700
7778
  forgiving: true,
7701
7779
  regexConstructor: (pattern) => defaultJavaScriptRegexConstructor(pattern, { lazyCompileLength: Number.POSITIVE_INFINITY })
7702
7780
  });
7781
+ /**
7782
+ * Lines at least this many UTF-16 units long render as one uncolored token.
7783
+ * With the JavaScript regex engine, scanning one JavaScript string-literal
7784
+ * line costs about 70 ms at 1,000 units, 300 ms at 2,000, 600 ms at 5,000 and
7785
+ * 2.5 s at 10,000, so this cap keeps one line within a few frames. A skipped
7786
+ * line leaves the grammar state unchanged: a multi-line construct that opens
7787
+ * or closes on it colors the following lines as if the line were absent.
7788
+ */
7789
+ const TOKENIZE_MAX_LINE_LENGTH = 1e3;
7703
7790
  let singleton;
7704
7791
  /** Representative paths through every boot grammar, compiled before user content is timed. */
7705
7792
  const BOOT_GRAMMAR_WARMUPS = [
@@ -7807,7 +7894,8 @@ function highlightToHtml(code, lang) {
7807
7894
  if (!ensureGrammar(resolved)) return void 0;
7808
7895
  return highlighter().codeToHtml(code, {
7809
7896
  lang: resolved,
7810
- theme: "css-variables"
7897
+ theme: "css-variables",
7898
+ tokenizeMaxLineLength: TOKENIZE_MAX_LINE_LENGTH
7811
7899
  });
7812
7900
  }
7813
7901
  /** vscode-textmate FontStyle bits shiki folds into `text-decoration` values. */
@@ -7900,6 +7988,7 @@ var StreamingHighlightSession = class {
7900
7988
  return highlighter().codeToTokensBase(text, {
7901
7989
  lang: resolved,
7902
7990
  theme: "css-variables",
7991
+ tokenizeMaxLineLength: TOKENIZE_MAX_LINE_LENGTH,
7903
7992
  ...this.state === void 0 ? {} : { grammarState: this.state }
7904
7993
  });
7905
7994
  }
@@ -7979,7 +8068,8 @@ function highlightLines(code, lang) {
7979
8068
  if (!ensureGrammar(resolved)) return void 0;
7980
8069
  const { tokens } = highlighter().codeToTokens(code, {
7981
8070
  lang: resolved,
7982
- theme: "css-variables"
8071
+ theme: "css-variables",
8072
+ tokenizeMaxLineLength: TOKENIZE_MAX_LINE_LENGTH
7983
8073
  });
7984
8074
  const last = tokens[tokens.length - 1];
7985
8075
  return (tokens.length > 1 && last !== void 0 && last.length === 0 ? tokens.slice(0, -1) : tokens).map((line) => line.map((token) => ({
@@ -9333,6 +9423,44 @@ function useCopyFeedback(text) {
9333
9423
  };
9334
9424
  }
9335
9425
  //#endregion
9426
+ //#region lib/types/CommandText.js
9427
+ /** Selectable command text with keyboard access while horizontally overflowing. */
9428
+ /**
9429
+ * Render command text without adding Tab stops for content that fits.
9430
+ * @param props - Text, localized scrollport name, and owner styling.
9431
+ * @returns A horizontal text scrollport, named and keyboard-focusable only when overflowing.
9432
+ */
9433
+ function CommandText({ text, label, className }) {
9434
+ const ref = useRef(null);
9435
+ const [overflow, setOverflow] = useState(false);
9436
+ useLayoutEffect(() => {
9437
+ const element = ref.current;
9438
+ /* v8 ignore next -- the span is rendered unconditionally. */
9439
+ if (element === null) return void 0;
9440
+ const measure = () => {
9441
+ setOverflow(element.scrollWidth > element.clientWidth);
9442
+ };
9443
+ measure();
9444
+ const observer = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(measure);
9445
+ observer?.observe(element);
9446
+ const fonts = "fonts" in element.ownerDocument ? element.ownerDocument.fonts : void 0;
9447
+ fonts?.addEventListener("loadingdone", measure);
9448
+ return () => {
9449
+ observer?.disconnect();
9450
+ fonts?.removeEventListener("loadingdone", measure);
9451
+ };
9452
+ }, [text]);
9453
+ return jsx("span", {
9454
+ ref,
9455
+ className: clsx(css$29.text, className),
9456
+ "data-command-text": true,
9457
+ tabIndex: overflow ? 0 : void 0,
9458
+ role: overflow ? "group" : void 0,
9459
+ "aria-label": overflow ? label : void 0,
9460
+ children: text
9461
+ });
9462
+ }
9463
+ //#endregion
9336
9464
  //#region lib/types/TerminalBlock.js
9337
9465
  /** Output lines shown before the height cap collapses the middle. */
9338
9466
  const DEFAULT_TERMINAL_MAX_LINES = 16;
@@ -9412,7 +9540,7 @@ function renderLine$1(line) {
9412
9540
  * @param props - see {@link TerminalBlockProps}.
9413
9541
  * @returns the terminal block element.
9414
9542
  */
9415
- function TerminalBlock({ command, cwd, home, output, exitCode, signal, running = false, maxLines = 16, copyText, runStateDot = true, className, labels }) {
9543
+ function TerminalBlock({ command, cwd, home, output, exitCode, signal, running = false, background = false, maxLines = 16, copyText, runStateDot = true, className, labels }) {
9416
9544
  const copy = labels;
9417
9545
  const text = output ?? "";
9418
9546
  const lines = useMemo(() => {
@@ -9425,14 +9553,15 @@ function TerminalBlock({ command, cwd, home, output, exitCode, signal, running =
9425
9553
  const onToggle = useCallback(() => {
9426
9554
  setExpanded((value) => !value);
9427
9555
  }, []);
9428
- const status = statusText(exitCode, signal, copy);
9556
+ const status = background ? void 0 : statusText(exitCode, signal, copy);
9429
9557
  const state = runState(running, exitCode, signal, copy);
9558
+ const showState = runStateDot && (!background || running);
9430
9559
  const commandLines = useMemo(() => {
9431
9560
  return (command.endsWith("\n") ? command.slice(0, -1) : command).split("\n");
9432
9561
  }, [command]);
9433
9562
  const empty = lines.every((line) => line.every((span) => span.text.trim() === ""));
9434
9563
  const { hidden, capped, headLines, tailLines } = headTailCap(lines.length, maxLines, expanded);
9435
- const body = !running || !empty;
9564
+ const body = !background && (!running || !empty);
9436
9565
  return jsxs("div", {
9437
9566
  className: clsx(css$28.block, className),
9438
9567
  "data-terminal": "",
@@ -9443,13 +9572,13 @@ function TerminalBlock({ command, cwd, home, output, exitCode, signal, running =
9443
9572
  children: [
9444
9573
  jsxs("div", {
9445
9574
  className: css$28.prompt,
9446
- children: [runStateDot && jsx("span", {
9575
+ children: [showState && jsx("span", {
9447
9576
  className: css$28.runStateLabel,
9448
9577
  children: state.label
9449
9578
  }), commandLines.map((line, index) => jsxs("div", {
9450
9579
  className: css$28.promptLine,
9451
9580
  children: [
9452
- index === 0 && runStateDot && jsx(StateDot, {
9581
+ index === 0 && showState && jsx(StateDot, {
9453
9582
  state: state.state,
9454
9583
  className: css$28.runState
9455
9584
  }),
@@ -9457,9 +9586,10 @@ function TerminalBlock({ command, cwd, home, output, exitCode, signal, running =
9457
9586
  className: css$28.cwd,
9458
9587
  children: index > 0 || cwd === void 0 ? "$" : promptLabel(cwd, home)
9459
9588
  }),
9460
- jsx("span", {
9589
+ jsx(CommandText, {
9461
9590
  className: css$28.command,
9462
- children: line
9591
+ text: line,
9592
+ label: copy.commandLine(index + 1)
9463
9593
  })
9464
9594
  ]
9465
9595
  }, index))]
@@ -9468,7 +9598,7 @@ function TerminalBlock({ command, cwd, home, output, exitCode, signal, running =
9468
9598
  className: css$28.status,
9469
9599
  children: status
9470
9600
  }),
9471
- (copyText !== void 0 || !running && !empty) && jsx("button", {
9601
+ (copyText !== void 0 || !background && !running && !empty) && jsx("button", {
9472
9602
  type: "button",
9473
9603
  className: css$28.copyButton,
9474
9604
  onClick: onCopy,
@@ -9697,13 +9827,13 @@ function ReadBlock({ label, labels, lines, totalLines, lang, maxLines = 16, clas
9697
9827
  const tailLines = maxLines - headLines;
9698
9828
  const windowed = lines.length < totalLines;
9699
9829
  const rows = (slice) => slice.map(([line, spans]) => jsxs("div", {
9700
- className: css$29.line,
9830
+ className: css$30.line,
9701
9831
  children: [jsx("span", {
9702
- className: css$29.gutter,
9832
+ className: css$30.gutter,
9703
9833
  "aria-hidden": true,
9704
9834
  children: line.number
9705
9835
  }), jsx("span", {
9706
- className: css$29.content,
9836
+ className: css$30.content,
9707
9837
  children: spans === void 0 ? line.text : renderSpans(spans)
9708
9838
  })]
9709
9839
  }, line.number));
@@ -9711,7 +9841,7 @@ function ReadBlock({ label, labels, lines, totalLines, lang, maxLines = 16, clas
9711
9841
  const paired = lines.map((line, index) => [line, highlighted?.[index]]);
9712
9842
  return jsxs("div", {
9713
9843
  ref: rootRef,
9714
- className: clsx(cardCss.card, css$29.block, className),
9844
+ className: clsx(cardCss.card, css$30.block, className),
9715
9845
  "data-read": "",
9716
9846
  "data-code-wrap": wrapped,
9717
9847
  style: gutterStyle,
@@ -9733,7 +9863,7 @@ function ReadBlock({ label, labels, lines, totalLines, lang, maxLines = 16, clas
9733
9863
  children: [
9734
9864
  rows(capped ? paired.slice(0, headLines) : paired),
9735
9865
  hidden > 0 && jsx(FoldToggle, {
9736
- className: css$29.expand,
9866
+ className: css$30.expand,
9737
9867
  expanded,
9738
9868
  hidden,
9739
9869
  labels,
@@ -9755,11 +9885,11 @@ function assertNever(value) {
9755
9885
  }
9756
9886
  /** The dim class per row kind (path/gap chrome vs the diff's own +/- colors). */
9757
9887
  const ROW_CLASS = {
9758
- path: css$30.path,
9759
- del: css$30.del,
9760
- add: css$30.add,
9761
- context: css$30.context,
9762
- gap: css$30.gap
9888
+ path: css$31.path,
9889
+ del: css$31.del,
9890
+ add: css$31.add,
9891
+ context: css$31.context,
9892
+ gap: css$31.gap
9763
9893
  };
9764
9894
  /** Bound synchronous edit-graph search; one replacement consumes two edits. */
9765
9895
  const MAX_DIFF_EDIT_LENGTH = 256;
@@ -9893,7 +10023,7 @@ function DiffBlock({ diffs, labels, maxLines = 16, className }) {
9893
10023
  const head = capped ? rows.slice(0, headLines) : rows;
9894
10024
  const tail = capped ? rows.slice(rows.length - tailLines) : [];
9895
10025
  return jsxs("div", {
9896
- className: clsx(cardCss.card, css$30.block, className),
10026
+ className: clsx(cardCss.card, css$31.block, className),
9897
10027
  "data-diff": "",
9898
10028
  "data-code-wrap": wrapped,
9899
10029
  children: [jsx(CodeToolbar, {
@@ -9908,21 +10038,21 @@ function DiffBlock({ diffs, labels, maxLines = 16, className }) {
9908
10038
  setWrapped((value) => !value);
9909
10039
  }
9910
10040
  }), jsxs("div", {
9911
- className: css$30.body,
10041
+ className: css$31.body,
9912
10042
  children: [
9913
10043
  head.map((row, index) => jsx("div", {
9914
- className: clsx(css$30.line, ROW_CLASS[row.kind]),
10044
+ className: clsx(css$31.line, ROW_CLASS[row.kind]),
9915
10045
  children: row.text
9916
10046
  }, index)),
9917
10047
  hidden > 0 && jsx(FoldToggle, {
9918
- className: css$30.expand,
10048
+ className: css$31.expand,
9919
10049
  expanded,
9920
10050
  hidden,
9921
10051
  labels,
9922
10052
  onToggle
9923
10053
  }),
9924
10054
  tail.map((row, index) => jsx("div", {
9925
- className: clsx(css$30.line, ROW_CLASS[row.kind]),
10055
+ className: clsx(css$31.line, ROW_CLASS[row.kind]),
9926
10056
  children: row.text
9927
10057
  }, index))
9928
10058
  ]
@@ -10052,56 +10182,56 @@ function SearchBlock(props) {
10052
10182
  const tail = tailHeader === void 0 ? naturalTail : naturalTail.slice(1);
10053
10183
  const renderRow = (row) => {
10054
10184
  if (row.type === "path") return jsx("div", {
10055
- className: css$31.line,
10185
+ className: css$32.line,
10056
10186
  children: row.path
10057
10187
  });
10058
10188
  if (row.type === "match") return jsxs("div", {
10059
- className: css$31.line,
10189
+ className: css$32.line,
10060
10190
  children: [jsxs("span", {
10061
- className: css$31.lineNumber,
10191
+ className: css$32.lineNumber,
10062
10192
  children: [row.lineNumber, ": "]
10063
10193
  }), row.line]
10064
10194
  });
10065
10195
  return jsxs("button", {
10066
10196
  type: "button",
10067
- className: css$31.fileHeader,
10197
+ className: css$32.fileHeader,
10068
10198
  "aria-expanded": !row.collapsed,
10069
10199
  onClick: () => {
10070
10200
  toggleFile(row.index);
10071
10201
  },
10072
10202
  children: [jsx("span", {
10073
- className: css$31.filePath,
10203
+ className: css$32.filePath,
10074
10204
  children: row.path
10075
10205
  }), jsx("span", {
10076
- className: css$31.fileCount,
10206
+ className: css$32.fileCount,
10077
10207
  children: row.count
10078
10208
  })]
10079
10209
  });
10080
10210
  };
10081
10211
  return jsxs("div", {
10082
- className: clsx(css$31.block, className),
10212
+ className: clsx(css$32.block, className),
10083
10213
  "data-search": props.kind,
10084
10214
  children: [jsxs("div", {
10085
- className: css$31.header,
10215
+ className: css$32.header,
10086
10216
  children: [jsx("span", {
10087
- className: css$31.summary,
10217
+ className: css$32.summary,
10088
10218
  children: summaryText(props, shown, truncated, total)
10089
10219
  }), !empty && jsx("button", {
10090
10220
  type: "button",
10091
- className: css$31.copyButton,
10221
+ className: css$32.copyButton,
10092
10222
  onClick: onCopy,
10093
10223
  children: copied ? props.labels.copied : props.labels.copy
10094
10224
  })]
10095
10225
  }), empty ? jsx("div", {
10096
- className: css$31.empty,
10226
+ className: css$32.empty,
10097
10227
  children: props.labels.noResults
10098
10228
  }) : jsxs("div", {
10099
- className: css$31.body,
10229
+ className: css$32.body,
10100
10230
  children: [
10101
10231
  head.map((row) => jsx("div", { children: renderRow(row) }, rowKey(row))),
10102
10232
  hidden > 0 && jsx("button", {
10103
10233
  type: "button",
10104
- className: css$31.expand,
10234
+ className: css$32.expand,
10105
10235
  "aria-expanded": expanded,
10106
10236
  "aria-label": expanded ? props.labels.collapseAria : props.labels.expandAria(hidden),
10107
10237
  onClick: onToggle,
@@ -10931,7 +11061,7 @@ function CodeBlock({ code, lang, streaming, className, contentRef, lineNumbers =
10931
11061
  });
10932
11062
  }, [copied, trimmed]);
10933
11063
  const body = streamedBody !== void 0 ? streamedBody : html === void 0 ? jsx("pre", {
10934
- className: css$32.plain,
11064
+ className: css$33.plain,
10935
11065
  children: jsx("code", { children: sourceLines === void 0 ? trimmed : sourceLines.map((line, index) => jsxs(Fragment$1, { children: [index > 0 && "\n", jsx("span", {
10936
11066
  className: "line",
10937
11067
  children: line
@@ -10939,12 +11069,12 @@ function CodeBlock({ code, lang, streaming, className, contentRef, lineNumbers =
10939
11069
  }) : jsx("div", { dangerouslySetInnerHTML: { __html: html } });
10940
11070
  return jsxs("div", {
10941
11071
  ref: rootRef,
10942
- className: clsx(css$32.block, "md-code-block", lineNumbers && css$32.numbered, toolbarLabels !== void 0 && css$32.card, className),
11072
+ className: clsx(css$33.block, "md-code-block", lineNumbers && css$33.numbered, toolbarLabels !== void 0 && css$33.card, className),
10943
11073
  "data-line-numbers": lineNumbers || void 0,
10944
11074
  "data-code-wrap": toolbarLabels === void 0 ? void 0 : wrapped,
10945
11075
  style: sourceLines === void 0 ? void 0 : { "--dsl-code-block-line-number-width": `${Math.max(2, String(sourceLines.length).length)}ch` },
10946
11076
  children: [showHeader && jsx("div", {
10947
- className: css$32.bannerWrap,
11077
+ className: css$33.bannerWrap,
10948
11078
  children: toolbarLabels !== void 0 ? jsx(CodeToolbar, {
10949
11079
  lang,
10950
11080
  labels: toolbarLabels,
@@ -10957,16 +11087,16 @@ function CodeBlock({ code, lang, streaming, className, contentRef, lineNumbers =
10957
11087
  setWrapped((value) => !value);
10958
11088
  } : void 0
10959
11089
  }) : jsxs("div", {
10960
- className: css$32.banner,
11090
+ className: css$33.banner,
10961
11091
  "data-code-block-banner": true,
10962
11092
  children: [jsx("div", {
10963
- className: css$32.infostring,
11093
+ className: css$33.infostring,
10964
11094
  children: lang ?? ""
10965
11095
  }), jsx("div", {
10966
- className: css$32.action,
11096
+ className: css$33.action,
10967
11097
  children: jsx("button", {
10968
11098
  type: "button",
10969
- className: css$32.copyButton,
11099
+ className: css$33.copyButton,
10970
11100
  onClick: onCopy,
10971
11101
  children: copied ? copiedLabel : copyLabel
10972
11102
  })
@@ -10974,7 +11104,7 @@ function CodeBlock({ code, lang, streaming, className, contentRef, lineNumbers =
10974
11104
  })
10975
11105
  }), jsx("div", {
10976
11106
  ref: contentRef,
10977
- className: css$32.content,
11107
+ className: css$33.content,
10978
11108
  "data-code-block-content": true,
10979
11109
  children: body
10980
11110
  })]
@@ -11163,31 +11293,34 @@ function ImageLightbox({ src, alt, labels, onClose }) {
11163
11293
  restoreRef.current?.focus();
11164
11294
  };
11165
11295
  }, [onClose]);
11166
- return createPortal(jsxs("div", {
11167
- className: css$33.backdrop,
11296
+ return createPortal(jsx("div", {
11297
+ className: css$34.backdrop,
11168
11298
  role: "dialog",
11169
11299
  "aria-modal": "true",
11170
11300
  "aria-label": labels.dialog,
11171
- children: [
11172
- jsx("div", {
11173
- className: css$33.mask,
11174
- "aria-hidden": "true",
11175
- onMouseDown: onClose
11176
- }),
11177
- jsx("img", {
11178
- className: css$33.image,
11179
- src,
11180
- alt
11181
- }),
11182
- jsx("button", {
11183
- ref: closeRef,
11184
- type: "button",
11185
- className: css$33.close,
11186
- "aria-label": labels.close,
11187
- onClick: onClose,
11188
- children: jsx(IconCloseOutlineRegular, { size: 16 })
11189
- })
11190
- ]
11301
+ children: jsxs("div", {
11302
+ className: css$34.stage,
11303
+ children: [
11304
+ jsx("div", {
11305
+ className: css$34.mask,
11306
+ "aria-hidden": "true",
11307
+ onMouseDown: onClose
11308
+ }),
11309
+ jsx("img", {
11310
+ className: css$34.image,
11311
+ src,
11312
+ alt
11313
+ }),
11314
+ jsx("button", {
11315
+ ref: closeRef,
11316
+ type: "button",
11317
+ className: css$34.close,
11318
+ "aria-label": labels.close,
11319
+ onClick: onClose,
11320
+ children: jsx(IconCloseOutlineRegular, { size: 16 })
11321
+ })
11322
+ ]
11323
+ })
11191
11324
  }), document.body);
11192
11325
  }
11193
11326
  //#endregion
@@ -11209,14 +11342,14 @@ function ImagePreview({ src, alt, loadingLabel, failedLabel }) {
11209
11342
  function Preview({ src, alt, loadingLabel, failedLabel }) {
11210
11343
  const [state, setState] = useState("loading");
11211
11344
  return jsxs("span", {
11212
- className: css$34.frame,
11345
+ className: css$35.frame,
11213
11346
  children: [state !== "failed" && jsx("img", {
11214
11347
  src,
11215
11348
  alt,
11216
11349
  loading: "lazy",
11217
11350
  decoding: "async",
11218
11351
  referrerPolicy: "no-referrer",
11219
- className: css$34.image,
11352
+ className: css$35.image,
11220
11353
  "data-ready": state === "ready" || void 0,
11221
11354
  onLoad: () => {
11222
11355
  setState("ready");
@@ -11225,7 +11358,7 @@ function Preview({ src, alt, loadingLabel, failedLabel }) {
11225
11358
  setState("failed");
11226
11359
  }
11227
11360
  }), state !== "ready" && jsxs("span", {
11228
- className: css$34.status,
11361
+ className: css$35.status,
11229
11362
  role: "status",
11230
11363
  children: [state === "loading" && jsx(IconLoadingOutlineRegular, { size: 16 }), jsx("span", { children: state === "loading" ? loadingLabel : failedLabel })]
11231
11364
  })]
@@ -11964,7 +12097,7 @@ function SafeLink({ url, label, className }) {
11964
12097
  children: [jsx(LinkIconMedium, {
11965
12098
  kind: "url",
11966
12099
  href,
11967
- className: css$35.linkIcon
12100
+ className: css$36.linkIcon
11968
12101
  }), label]
11969
12102
  });
11970
12103
  }
@@ -11979,20 +12112,20 @@ function SafeLink({ url, label, className }) {
11979
12112
  */
11980
12113
  function SourceItem({ source, ordinal }) {
11981
12114
  return jsxs("li", {
11982
- className: css$35.source,
12115
+ className: css$36.source,
11983
12116
  value: ordinal,
11984
12117
  children: [
11985
12118
  jsx(SafeLink, {
11986
12119
  url: source.url,
11987
12120
  label: linkLabel(source.url, source.title),
11988
- className: css$35.sourceLink
12121
+ className: css$36.sourceLink
11989
12122
  }),
11990
12123
  source.snippet !== void 0 && source.snippet !== "" && jsx("div", {
11991
- className: css$35.snippet,
12124
+ className: css$36.snippet,
11992
12125
  children: source.snippet
11993
12126
  }),
11994
12127
  source.publishedAt !== void 0 && source.publishedAt !== "" && jsx("div", {
11995
- className: css$35.published,
12128
+ className: css$36.published,
11996
12129
  children: source.publishedAt
11997
12130
  })
11998
12131
  ]
@@ -12007,28 +12140,28 @@ function SourceItem({ source, ordinal }) {
12007
12140
  function WebSearchBlock({ answer, sources, truncated, labels, className }) {
12008
12141
  const empty = (answer === void 0 || answer === "") && sources.length === 0;
12009
12142
  return jsxs("div", {
12010
- className: clsx(css$35.block, className),
12143
+ className: clsx(css$36.block, className),
12011
12144
  "data-web": "search",
12012
12145
  children: [
12013
12146
  answer !== void 0 && answer !== "" && jsx("div", {
12014
- className: css$35.answer,
12147
+ className: css$36.answer,
12015
12148
  children: jsx(MarkdownText, {
12016
12149
  text: answer,
12017
12150
  labels: labels.markdown
12018
12151
  })
12019
12152
  }),
12020
12153
  empty ? jsx("div", {
12021
- className: css$35.empty,
12154
+ className: css$36.empty,
12022
12155
  children: labels.noResults
12023
12156
  }) : jsx("ol", {
12024
- className: css$35.sources,
12157
+ className: css$36.sources,
12025
12158
  children: sources.map((source, index) => jsx(SourceItem, {
12026
12159
  source,
12027
12160
  ordinal: index + 1
12028
12161
  }, index))
12029
12162
  }),
12030
12163
  truncated && jsx("div", {
12031
- className: css$35.truncated,
12164
+ className: css$36.truncated,
12032
12165
  children: labels.sourcesTruncated
12033
12166
  })
12034
12167
  ]
@@ -12041,23 +12174,23 @@ function WebSearchBlock({ answer, sources, truncated, labels, className }) {
12041
12174
  */
12042
12175
  function WebFetchBlock({ url, statusCode, truncated, labels, className }) {
12043
12176
  return jsxs("div", {
12044
- className: clsx(css$35.block, css$35.fetch, className),
12177
+ className: clsx(css$36.block, css$36.fetch, className),
12045
12178
  "data-web": "fetch",
12046
12179
  children: [jsx(SafeLink, {
12047
12180
  url,
12048
12181
  label: url,
12049
- className: css$35.fetchUrl
12182
+ className: css$36.fetchUrl
12050
12183
  }), jsxs("div", {
12051
- className: css$35.fetchMeta,
12184
+ className: css$36.fetchMeta,
12052
12185
  children: [jsxs("span", {
12053
- className: css$35.status,
12186
+ className: css$36.status,
12054
12187
  children: [
12055
12188
  labels.http,
12056
12189
  " ",
12057
12190
  statusCode
12058
12191
  ]
12059
12192
  }), truncated && jsx("span", {
12060
- className: css$35.truncated,
12193
+ className: css$36.truncated,
12061
12194
  children: labels.contentTruncated
12062
12195
  })]
12063
12196
  })]
@@ -12091,10 +12224,10 @@ function JsonBlock({ label, payload, defaultOpen = false, truncatedLabel }) {
12091
12224
  truncatedLabel
12092
12225
  ]);
12093
12226
  return jsxs("div", {
12094
- className: css$36.root,
12227
+ className: css$37.root,
12095
12228
  children: [jsxs("button", {
12096
12229
  type: "button",
12097
- className: css$36.toggle,
12230
+ className: css$37.toggle,
12098
12231
  onClick: () => {
12099
12232
  setOpen((v) => !v);
12100
12233
  },
@@ -12104,7 +12237,7 @@ function JsonBlock({ label, payload, defaultOpen = false, truncatedLabel }) {
12104
12237
  label
12105
12238
  ]
12106
12239
  }), open && jsx("pre", {
12107
- className: css$36.body,
12240
+ className: css$37.body,
12108
12241
  children: body
12109
12242
  })]
12110
12243
  });
@@ -12445,6 +12578,6 @@ function GuideArtworkFiles({ size = 36, className }) {
12445
12578
  });
12446
12579
  }
12447
12580
  //#endregion
12448
- 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, InlineEditor, 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 };
12581
+ export { BrandWordmark, Button, CODE_HIGHLIGHT_EXTENSIONS, Checkbox, CodeBlock, CommandText, 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, HoverCardGroup, 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, InlineEditor, Input, JsonBlock, JsonTree, LinkIconMedium, LinkIconRegular, MarkdownDelegateProvider, MarkdownText, Menu, MenuGroup, MenuItemButton, MenuSurface, Modal, PathLabel, PermissionIconAutoReviewMedium, PermissionIconAutoReviewRegular, PermissionIconFullAccessMedium, PermissionIconFullAccessRegular, PermissionIconReadOnlyMedium, PermissionIconReadOnlyRegular, PermissionIconWorkspaceWriteMedium, PermissionIconWorkspaceWriteRegular, Pill, PluginArtworkDefault, PluginArtworkLoop, PluginArtworkSearch, PluginArtworkSubagent, PluginArtworkTerminal, ReadBlock, ReferenceChip, ReferenceIconMedium, ReferenceIconRegular, RiskConfirmation, SHIELD_OUTLINE_PATH, SearchBlock, SegmentedControl, SegmentedTabs, SettingsForm, SettingsFormModel, SettingsSecretField, SettingsValueField, ShortcutKeys, StateDot, Switch, Tag, TerminalBlock, TextShimmer, Toast, Tooltip, UserTextRun, WebBlock, classifyFileType, classifyLinkPath, closeTopModal, diffTotals, extractMarkdownPlainText, fileExtension, fileSizeText, focusWithoutRing, isBehindModal, isDarwinDesktop, languageForPath, modalSelector, observeComposition, observeStickyMenuGroups, pointerModality, rankByName, relativeTime, settingsNumberField, settingsTextField, useAnchoredMaxHeight, useAnchoredPosition, useCodeHighlighter, useDismissOnOutsidePointer, useModalLayer, writeClipboard };
12449
12582
 
12450
12583
  //# sourceMappingURL=index.js.map