@flytedan/flytebot-design-system 0.12.12 → 0.12.14

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/dist/index.js CHANGED
@@ -197,14 +197,48 @@ var portal = (node) => {
197
197
  };
198
198
  var ROOT_LAYER = 0;
199
199
  var LAYER_STEP = 10;
200
+ var ROOT_STEP = 100;
201
+ var OVERLAY_CEILING = 1e4;
200
202
  var LayerContext = React2.createContext(ROOT_LAYER);
203
+ var openRootIds = [];
204
+ var rootListeners = /* @__PURE__ */ new Set();
205
+ var notifyRootListeners = () => {
206
+ rootListeners.forEach((listener) => listener());
207
+ };
208
+ var subscribeRootOverlays = (listener) => {
209
+ rootListeners.add(listener);
210
+ return () => {
211
+ rootListeners.delete(listener);
212
+ };
213
+ };
214
+ var getRootOverlaysSnapshot = () => openRootIds;
215
+ var registerRootOverlay = (id) => {
216
+ if (openRootIds.includes(id)) return;
217
+ openRootIds = [...openRootIds, id];
218
+ notifyRootListeners();
219
+ };
220
+ var unregisterRootOverlay = (id) => {
221
+ if (!openRootIds.includes(id)) return;
222
+ openRootIds = openRootIds.filter((existing) => existing !== id);
223
+ notifyRootListeners();
224
+ };
201
225
  var useLayer = () => React2.useContext(LayerContext);
202
- var useOverlayLayer = (base) => {
226
+ var useOverlayLayer = (isOpen) => {
203
227
  const parent = useLayer();
204
- return parent === ROOT_LAYER ? base : parent + LAYER_STEP;
228
+ const isRoot = parent === ROOT_LAYER;
229
+ const id = React2.useId();
230
+ const openIds = React2.useSyncExternalStore(subscribeRootOverlays, getRootOverlaysSnapshot, getRootOverlaysSnapshot);
231
+ React2.useLayoutEffect(() => {
232
+ if (!isRoot || !isOpen) return;
233
+ registerRootOverlay(id);
234
+ return () => unregisterRootOverlay(id);
235
+ }, [isRoot, isOpen, id]);
236
+ if (!isRoot) return parent + LAYER_STEP;
237
+ if (!isOpen) return ROOT_LAYER;
238
+ const index = openIds.indexOf(id);
239
+ return index === -1 ? ROOT_LAYER : (index + 1) * ROOT_STEP;
205
240
  };
206
241
  var LayerProvider = ({ zIndex, children }) => /* @__PURE__ */ jsx3(LayerContext.Provider, { value: zIndex, children });
207
- var POPOVER_BASE = 140;
208
242
  function Popover({
209
243
  open,
210
244
  anchorRef,
@@ -241,7 +275,7 @@ function Popover({
241
275
  layerRef: ref
242
276
  });
243
277
  const restore = React2.useRef(null);
244
- const zIndex = useOverlayLayer(POPOVER_BASE);
278
+ const zIndex = useOverlayLayer(!!open);
245
279
  React2.useEffect(() => {
246
280
  if (!open) return;
247
281
  restore.current = typeof document !== "undefined" ? document.activeElement : null;
@@ -568,6 +602,13 @@ function SegmentedControl({ options = [], value, onChange, className = "", ...re
568
602
  }) });
569
603
  }
570
604
 
605
+ // src/components/textExposure.ts
606
+ function truncationTitle(content) {
607
+ if (typeof content !== "string" && typeof content !== "number") return void 0;
608
+ const text = String(content);
609
+ return text === "" ? void 0 : text;
610
+ }
611
+
571
612
  // src/components/surfaces/Card.tsx
572
613
  import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
573
614
  function Card({
@@ -589,7 +630,7 @@ function Card({
589
630
  ].filter(Boolean).join(" ");
590
631
  return /* @__PURE__ */ jsxs4("div", { className: cls, ...rest, children: [
591
632
  title ? /* @__PURE__ */ jsxs4("div", { className: "fd-card-head", children: [
592
- /* @__PURE__ */ jsx5("span", { className: "fd-card-head-title", children: title }),
633
+ /* @__PURE__ */ jsx5("span", { className: "fd-card-head-title", title: truncationTitle(title), children: title }),
593
634
  action
594
635
  ] }) : null,
595
636
  padded ? /* @__PURE__ */ jsx5("div", { className: "fd-card-body", children }) : children,
@@ -642,9 +683,8 @@ function Collapsible({
642
683
  import * as React4 from "react";
643
684
  import { createPortal as createPortal2 } from "react-dom";
644
685
  import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
645
- var DRAWER_BASE = 90;
646
686
  function Drawer({ open = true, title, onClose, footer, children, className = "", ...rest }) {
647
- const zIndex = useOverlayLayer(DRAWER_BASE);
687
+ const zIndex = useOverlayLayer(open);
648
688
  const [closing, setClosing] = React4.useState(false);
649
689
  const close = React4.useCallback(() => {
650
690
  if (!onClose) return;
@@ -665,7 +705,7 @@ function Drawer({ open = true, title, onClose, footer, children, className = "",
665
705
  /* @__PURE__ */ jsx7("div", { className: "fd-scrim" + (closing ? " is-closing" : ""), style: { display: "block", zIndex: zIndex - LAYER_STEP }, onClick: close }),
666
706
  /* @__PURE__ */ jsxs6("aside", { className: ["fd-drawer", closing ? "is-closing" : "", className].filter(Boolean).join(" "), role: "dialog", "aria-modal": "true", ...rest, style: { zIndex }, children: [
667
707
  /* @__PURE__ */ jsxs6("div", { className: "fd-card-head", style: { flex: "none" }, children: [
668
- /* @__PURE__ */ jsx7("span", { className: "fd-card-head-title", children: title }),
708
+ /* @__PURE__ */ jsx7("span", { className: "fd-card-head-title", title: truncationTitle(title), children: title }),
669
709
  onClose ? /* @__PURE__ */ jsx7("button", { type: "button", className: "fd-btn-icon", "aria-label": "Close", onClick: close, children: /* @__PURE__ */ jsx7("i", { className: "ph ph-x" }) }) : null
670
710
  ] }),
671
711
  /* @__PURE__ */ jsx7("div", { style: { flex: "1 1 auto", minHeight: 0, overflow: "auto", padding: 20 }, children }),
@@ -682,6 +722,7 @@ import { createPortal as createPortal3 } from "react-dom";
682
722
  import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
683
723
  function Modal({ open = true, title, description, onClose, footer, wide = false, children, className = "", ...rest }) {
684
724
  const [closing, setClosing] = React5.useState(false);
725
+ const zIndex = useOverlayLayer(!!open);
685
726
  const close = React5.useCallback(() => {
686
727
  if (!onClose) return;
687
728
  setClosing(true);
@@ -697,10 +738,11 @@ function Modal({ open = true, title, description, onClose, footer, wide = false,
697
738
  }, [open, onClose, close]);
698
739
  if (!open) return null;
699
740
  return createPortal3(
700
- /* @__PURE__ */ jsx8(
741
+ /* @__PURE__ */ jsx8(LayerProvider, { zIndex, children: /* @__PURE__ */ jsx8(
701
742
  "div",
702
743
  {
703
744
  className: "fd-scrim" + (closing ? " is-closing" : ""),
745
+ style: { zIndex: zIndex - LAYER_STEP },
704
746
  onClick: onClose ? (e) => {
705
747
  if (e.target === e.currentTarget) close();
706
748
  } : void 0,
@@ -726,7 +768,7 @@ function Modal({ open = true, title, description, onClose, footer, wide = false,
726
768
  }
727
769
  )
728
770
  }
729
- ),
771
+ ) }),
730
772
  document.body
731
773
  );
732
774
  }
@@ -861,7 +903,7 @@ function SidebarNav({ brand, groups = [], current: current2, onNavigate, footer,
861
903
  onClick: onNavigate ? () => onNavigate(it.value) : void 0,
862
904
  children: [
863
905
  /* @__PURE__ */ jsx13("span", { className: "fd-side-item-icon", children: /* @__PURE__ */ jsx13("i", { className: "ph ph-" + it.icon, "aria-hidden": "true" }) }),
864
- /* @__PURE__ */ jsx13("span", { style: { flex: 1, minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: it.label }),
906
+ /* @__PURE__ */ jsx13("span", { style: { flex: 1, minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, title: truncationTitle(it.label), children: it.label }),
865
907
  it.preview ? /* @__PURE__ */ jsx13(Tip, { label: "Designed, backend not wired yet", children: /* @__PURE__ */ jsx13("i", { className: "ph ph-traffic-cone", style: { fontSize: 13, color: "var(--warn-solid)", flex: "none" } }) }) : null,
866
908
  it.locked ? /* @__PURE__ */ jsx13(Tip, { label: "You do not have permission for this", children: /* @__PURE__ */ jsx13("i", { className: "ph ph-lock-simple", style: { fontSize: 13, color: "var(--text-muted)", flex: "none" } }) }) : null,
867
909
  it.count !== void 0 ? /* @__PURE__ */ jsx13("span", { className: "fd-side-item-count", children: it.count }) : null,
@@ -947,7 +989,12 @@ function Topbar({
947
989
  onMenu ? /* @__PURE__ */ jsx16("button", { type: "button", className: "fd-btn-icon", "aria-label": "Menu", onClick: onMenu, children: /* @__PURE__ */ jsx16("i", { className: "ph ph-list" }) }) : null,
948
990
  /* @__PURE__ */ jsx16("nav", { className: "fd-crumb", "aria-label": "Breadcrumb", children: crumbs.map((c, i) => /* @__PURE__ */ jsxs13(React6.Fragment, { children: [
949
991
  i > 0 ? /* @__PURE__ */ jsx16("i", { className: "ph ph-caret-right", style: { fontSize: 11, opacity: 0.6 }, "aria-hidden": "true" }) : null,
950
- i === crumbs.length - 1 ? /* @__PURE__ */ jsx16("span", { className: "fd-crumb-current", children: c.label }) : /* @__PURE__ */ jsx16(
992
+ i === crumbs.length - 1 ? (
993
+ // MP-141: the current crumb mixes a static route label with (usually) a
994
+ // user-entered campaign name and is single-line by design — exposure,
995
+ // not wrapping, is the fix here, same rule as every other identifier.
996
+ /* @__PURE__ */ jsx16("span", { className: "fd-crumb-current", title: truncationTitle(c.label), children: c.label })
997
+ ) : /* @__PURE__ */ jsx16(
951
998
  "a",
952
999
  {
953
1000
  href: c.href || "#",
@@ -1152,7 +1199,6 @@ function Toast({ title, children, tone = "success", onUndo, onDismiss, className
1152
1199
  // src/components/feedback/Tooltip.tsx
1153
1200
  import * as React7 from "react";
1154
1201
  import { jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
1155
- var TOOLTIP_BASE = 150;
1156
1202
  var CLOSE_DELAY_MS = 120;
1157
1203
  function Tooltip({ label, placement = "top", children, className = "" }) {
1158
1204
  const anchorRef = React7.useRef(null);
@@ -1196,7 +1242,7 @@ function Tooltip({ label, placement = "top", children, className = "" }) {
1196
1242
  layerRef: bubbleRef,
1197
1243
  onDetach: hide
1198
1244
  });
1199
- const zIndex = useOverlayLayer(TOOLTIP_BASE);
1245
+ const zIndex = useOverlayLayer(open);
1200
1246
  React7.useEffect(() => {
1201
1247
  if (!open) return;
1202
1248
  const key = (e) => {
@@ -1439,11 +1485,10 @@ function DataTable({
1439
1485
  // src/components/data/FilterBar.tsx
1440
1486
  import * as React9 from "react";
1441
1487
  import { jsx as jsx28, jsxs as jsxs24 } from "react/jsx-runtime";
1442
- var FILTER_BAR_BASE = 120;
1443
1488
  var isSet = (v) => !(v == null || v === "" || v === false);
1444
1489
  function FilterBar({ fields = [], filters, onFilterChange, onFilterRemove, align = "left", className = "", ...rest }) {
1445
1490
  const [panel, setPanel] = React9.useState(null);
1446
- const zIndex = useOverlayLayer(FILTER_BAR_BASE);
1491
+ const zIndex = useOverlayLayer(!!panel);
1447
1492
  const rootRef = React9.useRef(null);
1448
1493
  const textInputRef = React9.useRef(null);
1449
1494
  const optionsRef = React9.useRef(null);
@@ -2542,12 +2587,12 @@ function SegmentedMeter({
2542
2587
  legend ? /* @__PURE__ */ jsxs31("ul", { className: "fd-segmeter-legend", children: [
2543
2588
  items.map((s, i) => /* @__PURE__ */ jsxs31("li", { children: [
2544
2589
  /* @__PURE__ */ jsx34("span", { className: "fd-segmeter-dot", style: { background: fill(s, i) }, "aria-hidden": "true" }),
2545
- /* @__PURE__ */ jsx34("span", { className: "fd-segmeter-key", children: s.label }),
2590
+ /* @__PURE__ */ jsx34("span", { className: "fd-segmeter-key", title: truncationTitle(s.label), children: s.label }),
2546
2591
  /* @__PURE__ */ jsx34("span", { className: "fd-segmeter-val fd-tabular", children: format(s.value) })
2547
2592
  ] }, s.id || s.label || i)),
2548
2593
  safeTotal && used < safeTotal ? /* @__PURE__ */ jsxs31("li", { className: "is-remainder", children: [
2549
2594
  /* @__PURE__ */ jsx34("span", { className: "fd-segmeter-dot is-empty", "aria-hidden": "true" }),
2550
- /* @__PURE__ */ jsx34("span", { className: "fd-segmeter-key", children: remainderLabel }),
2595
+ /* @__PURE__ */ jsx34("span", { className: "fd-segmeter-key", title: truncationTitle(remainderLabel), children: remainderLabel }),
2551
2596
  /* @__PURE__ */ jsx34("span", { className: "fd-segmeter-val fd-tabular", children: format(safeTotal - used) })
2552
2597
  ] }) : null
2553
2598
  ] }) : null
@@ -2639,10 +2684,9 @@ function ScoreMeter({
2639
2684
  // src/components/data/SortMenu.tsx
2640
2685
  import * as React15 from "react";
2641
2686
  import { jsx as jsx36, jsxs as jsxs33 } from "react/jsx-runtime";
2642
- var SORT_MENU_BASE = 120;
2643
2687
  function SortMenu({ fields = [], sort, onSort, align = "right", size = "md", className = "", ...rest }) {
2644
2688
  const [open, setOpen] = React15.useState(false);
2645
- const zIndex = useOverlayLayer(SORT_MENU_BASE);
2689
+ const zIndex = useOverlayLayer(open);
2646
2690
  const ref = React15.useRef(null);
2647
2691
  React15.useEffect(() => {
2648
2692
  if (!open) return;
@@ -2736,7 +2780,7 @@ function StepList({
2736
2780
  return /* @__PURE__ */ jsxs34("div", { className: ["fd-steps", dense ? "is-dense" : "", open ? "is-open" : "", className].filter(Boolean).join(" "), children: [
2737
2781
  /* @__PURE__ */ jsxs34("button", { type: "button", className: "fd-steps-head", onClick: toggle, "aria-expanded": open, children: [
2738
2782
  running ? /* @__PURE__ */ jsx37("span", { className: "fd-steps-spin", "aria-hidden": "true" }) : /* @__PURE__ */ jsx37("i", { className: "ph ph-" + (failed ? "warning-circle" : "check-circle"), "aria-hidden": "true" }),
2739
- /* @__PURE__ */ jsx37("span", { className: "fd-steps-title", children: summary }),
2783
+ /* @__PURE__ */ jsx37("span", { className: "fd-steps-title", title: truncationTitle(summary), children: summary }),
2740
2784
  /* @__PURE__ */ jsxs34("span", { className: "fd-steps-count fd-tabular", children: [
2741
2785
  steps.length,
2742
2786
  " step",
@@ -2764,11 +2808,11 @@ function StepList({
2764
2808
  "aria-expanded": isOpen,
2765
2809
  onClick: () => setExpanded((m) => Object.assign({}, m, { [id]: !isOpen })),
2766
2810
  children: [
2767
- /* @__PURE__ */ jsx37("span", { children: s.label }),
2811
+ /* @__PURE__ */ jsx37("span", { title: truncationTitle(s.label), children: s.label }),
2768
2812
  /* @__PURE__ */ jsx37("i", { className: "ph ph-caret-" + (isOpen ? "up" : "down"), "aria-hidden": "true" })
2769
2813
  ]
2770
2814
  }
2771
- ) : /* @__PURE__ */ jsx37("span", { className: "fd-step-label is-static", children: s.label }),
2815
+ ) : /* @__PURE__ */ jsx37("span", { className: "fd-step-label is-static", title: truncationTitle(s.label), children: s.label }),
2772
2816
  s.status === "error" ? /* @__PURE__ */ jsx37("span", { className: "fd-step-badge is-error", children: "failed" }) : null,
2773
2817
  showDurations && s.durationMs ? /* @__PURE__ */ jsx37("span", { className: "fd-step-dur fd-tabular", children: formatDuration(s.durationMs) }) : null
2774
2818
  ] }),
@@ -2989,8 +3033,12 @@ function EntityRow({
2989
3033
  /* @__PURE__ */ jsx39("span", { className: "fd-erow-title fd-body-sm", children: title })
2990
3034
  ]
2991
3035
  }
2992
- ) }) : /* @__PURE__ */ jsx39("span", { className: "fd-erow-title fd-body-sm", children: title }),
2993
- meta ? /* @__PURE__ */ jsx39("span", { className: "fd-erow-meta", children: meta }) : null
3036
+ ) }) : (
3037
+ // MP-141: dense-row identifier, no Tooltip wrapper in this branch — a native
3038
+ // `title` is the exposure mechanism, same rule as every other identifier.
3039
+ /* @__PURE__ */ jsx39("span", { className: "fd-erow-title fd-body-sm", title: truncationTitle(title), children: title })
3040
+ ),
3041
+ meta ? /* @__PURE__ */ jsx39("span", { className: "fd-erow-meta", title: truncationTitle(meta), children: meta }) : null
2994
3042
  ] }),
2995
3043
  hasStrip ? /* @__PURE__ */ jsxs36("span", { className: "fd-erow-strip", children: [
2996
3044
  metrics && metrics.length ? /* @__PURE__ */ jsx39(EntityRowMetrics, { metrics }) : null,
@@ -3326,7 +3374,7 @@ function TransferList({
3326
3374
  height: drag.height,
3327
3375
  transform: `translate(${drag.x - drag.offsetX}px, ${drag.y - drag.offsetY}px) rotate(-3deg)`,
3328
3376
  pointerEvents: "none",
3329
- zIndex: 1e3
3377
+ zIndex: OVERLAY_CEILING
3330
3378
  },
3331
3379
  children: /* @__PURE__ */ jsx43(EntityRow, { ...renderRow(drag.item), draggable: true, className: "fd-erow-dragging" })
3332
3380
  }
@@ -3671,7 +3719,7 @@ function Select({
3671
3719
  style: { all: "unset", flex: 1, minWidth: 0, display: "flex", alignItems: "center", gap: 8, cursor: "inherit", overflow: "hidden" },
3672
3720
  children: [
3673
3721
  selected && selected.icon ? /* @__PURE__ */ jsx49("i", { className: "ph ph-" + selected.icon, style: { flex: "none", color: "var(--text-2)" } }) : null,
3674
- /* @__PURE__ */ jsx49("span", { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", color: (multiple ? chosen.length : selected) ? "var(--text)" : "var(--text-muted)" }, children: boxText }),
3722
+ /* @__PURE__ */ jsx49("span", { title: truncationTitle(boxText), style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", color: (multiple ? chosen.length : selected) ? "var(--text)" : "var(--text-muted)" }, children: boxText }),
3675
3723
  multiple && chosen.length > 1 ? /* @__PURE__ */ jsx49("span", { className: "fd-mono", style: { flex: "none", fontSize: 11, fontWeight: 700, padding: "1px 6px", borderRadius: 99, background: "var(--brand)", color: "#fff" }, children: chosen.length }) : null
3676
3724
  ]
3677
3725
  }
@@ -3943,6 +3991,7 @@ function DatePicker({ label, help, error, required = false, disabled = false, ra
3943
3991
  type: "button",
3944
3992
  id: fieldId,
3945
3993
  "aria-labelledby": ariaLabelledBy,
3994
+ title: truncationTitle(display),
3946
3995
  disabled,
3947
3996
  onKeyDown: (e) => {
3948
3997
  if (e.key === "Enter" || e.key === " ") {
@@ -6767,7 +6816,7 @@ function AccountMenu({
6767
6816
  /* @__PURE__ */ jsx57(Avatar, { name: user.name }),
6768
6817
  /* @__PURE__ */ jsxs53("span", { className: "fd-stack", style: { gap: 1, minWidth: 0, flex: 1 }, children: [
6769
6818
  /* @__PURE__ */ jsx57("span", { className: "fd-body-sm", style: { fontWeight: 700 }, children: user.name }),
6770
- /* @__PURE__ */ jsx57("span", { className: "fd-body-sm fd-muted fd-table-trunc", children: user.email })
6819
+ /* @__PURE__ */ jsx57("span", { className: "fd-body-sm fd-muted fd-table-trunc", title: truncationTitle(user.email), children: user.email })
6771
6820
  ] })
6772
6821
  ] }),
6773
6822
  showRoles && session.roles.length ? /* @__PURE__ */ jsx57("div", { className: "fd-row", style: { gap: 6, padding: "10px 14px", flexWrap: "wrap", borderBottom: "1px solid var(--border)" }, children: session.roles.map((r) => /* @__PURE__ */ jsx57(Badge, { tone: r.id === "owner" ? "success" : "neutral", children: r.name }, r.id)) }) : null,
@@ -7582,7 +7631,6 @@ function RoadmapTimeline({ onOpenFlag, title = "Roadmap", lede }) {
7582
7631
  import * as React36 from "react";
7583
7632
  import { createPortal as createPortal5 } from "react-dom";
7584
7633
  import { Fragment as Fragment16, jsx as jsx61, jsxs as jsxs57 } from "react/jsx-runtime";
7585
- var SOON_HOVERCARD_BASE = 220;
7586
7634
  var BYPASS_STORE = "fd.soon.bypass.v1";
7587
7635
  function readBypassed() {
7588
7636
  try {
@@ -7777,7 +7825,7 @@ function ComingSoon({
7777
7825
  function InlineSoon({ label, detail, backend, eta, effort, onRoadmap, allowed, onBypass, blur, tip, className, rest, children }) {
7778
7826
  const [open, setOpen] = React36.useState(false);
7779
7827
  const [anchor, pos] = useHoverCard(open);
7780
- const zIndex = useOverlayLayer(SOON_HOVERCARD_BASE);
7828
+ const zIndex = useOverlayLayer(open);
7781
7829
  const close = React36.useRef(null);
7782
7830
  const show = () => {
7783
7831
  if (close.current) {
@@ -7966,11 +8014,10 @@ function PermissionHint({ perm, children }) {
7966
8014
  // src/components/platform/ModeSwitch.tsx
7967
8015
  import * as React37 from "react";
7968
8016
  import { Fragment as Fragment17, jsx as jsx63, jsxs as jsxs59 } from "react/jsx-runtime";
7969
- var MODE_SWITCH_BASE = 140;
7970
8017
  function ModeSwitch({ canToggle = false, requestCount = 0, onClearLog, renderLog, onOpenSpec, summary }) {
7971
8018
  const mode2 = useRuntimeMode();
7972
8019
  const [open, setOpen] = React37.useState(false);
7973
- const zIndex = useOverlayLayer(MODE_SWITCH_BASE);
8020
+ const zIndex = useOverlayLayer(open);
7974
8021
  const ref = React37.useRef(null);
7975
8022
  React37.useEffect(() => {
7976
8023
  if (!open) return;
@@ -9077,7 +9124,7 @@ function PacketCard({ packet, schema, render, onApply, applied }) {
9077
9124
  return /* @__PURE__ */ jsxs68("section", { className: "fdc-packet" + (invalid ? " is-invalid" : ""), "aria-label": title, children: [
9078
9125
  /* @__PURE__ */ jsxs68("header", { className: "fdc-packet-head", children: [
9079
9126
  /* @__PURE__ */ jsx72("i", { className: "ph ph-" + (s.icon || "package"), "aria-hidden": "true" }),
9080
- /* @__PURE__ */ jsx72("span", { className: "fdc-packet-title", children: title }),
9127
+ /* @__PURE__ */ jsx72("span", { className: "fdc-packet-title", title: truncationTitle(title), children: title }),
9081
9128
  packet.repaired ? /* @__PURE__ */ jsx72("span", { className: "fdc-packet-badge", children: "Repaired" }) : null,
9082
9129
  invalid ? /* @__PURE__ */ jsx72("span", { className: "fdc-packet-badge is-danger", children: "Invalid" }) : null
9083
9130
  ] }),
@@ -9582,7 +9629,7 @@ function ChatComposer({
9582
9629
  return /* @__PURE__ */ jsxs70("div", { className: "fdc-composer" + (disabled ? " is-disabled" : "") + (narrow ? " is-narrow" : ""), children: [
9583
9630
  queue.length ? /* @__PURE__ */ jsx74("div", { className: "fdc-queue", "aria-label": "Queued messages", children: queue.map((q) => /* @__PURE__ */ jsxs70("div", { className: "fdc-queue-row", children: [
9584
9631
  /* @__PURE__ */ jsx74("i", { className: "ph ph-clock-countdown", "aria-hidden": "true" }),
9585
- /* @__PURE__ */ jsx74("span", { className: "fdc-queue-text", children: q.text || (q.attachments ? q.attachments.length + " file(s)" : "") }),
9632
+ /* @__PURE__ */ jsx74("span", { className: "fdc-queue-text", title: truncationTitle(q.text || (q.attachments ? q.attachments.length + " file(s)" : "")), children: q.text || (q.attachments ? q.attachments.length + " file(s)" : "") }),
9586
9633
  onRemoveQueued ? /* @__PURE__ */ jsx74("button", { type: "button", className: "fdc-queue-x", onClick: () => onRemoveQueued(q.id), "aria-label": "Remove queued message", children: /* @__PURE__ */ jsx74("i", { className: "ph ph-x", "aria-hidden": "true" }) }) : null
9587
9634
  ] }, q.id)) }) : null,
9588
9635
  sessionBar,
@@ -9710,7 +9757,7 @@ function ChatSessionBar({ sessionStats, contextUsage, usageLimits, onClear, extr
9710
9757
  "aria-label": expandable ? "Usage details" : void 0,
9711
9758
  children: [
9712
9759
  cu ? /* @__PURE__ */ jsx75("span", { className: "fdc-bar-mini", "aria-hidden": "true", children: /* @__PURE__ */ jsx75(SegmentedMeter, { total, segments: cu.segments, height: 4, showTotal: false }) }) : null,
9713
- /* @__PURE__ */ jsx75("span", { className: "fdc-bar-text", children: bits.join(" \xB7 ") }),
9760
+ /* @__PURE__ */ jsx75("span", { className: "fdc-bar-text", title: truncationTitle(bits.join(" \xB7 ")), children: bits.join(" \xB7 ") }),
9714
9761
  expandable ? /* @__PURE__ */ jsx75("i", { className: "ph ph-caret-right fdc-bar-caret", "aria-hidden": "true" }) : null
9715
9762
  ]
9716
9763
  }
@@ -10104,8 +10151,8 @@ function AgentChatPanel({
10104
10151
  showHeader ? /* @__PURE__ */ jsxs72("header", { className: "fdc-head", children: [
10105
10152
  /* @__PURE__ */ jsx76("span", { className: "fdc-head-mark", "aria-hidden": "true", children: /* @__PURE__ */ jsx76("i", { className: "ph ph-" + assistantIcon }) }),
10106
10153
  /* @__PURE__ */ jsxs72("span", { className: "fdc-head-titles", children: [
10107
- /* @__PURE__ */ jsx76("span", { className: "fdc-head-title", children: title }),
10108
- subtitle ? /* @__PURE__ */ jsx76("span", { className: "fdc-head-sub", children: subtitle }) : null
10154
+ /* @__PURE__ */ jsx76("span", { className: "fdc-head-title", title: truncationTitle(title), children: title }),
10155
+ subtitle ? /* @__PURE__ */ jsx76("span", { className: "fdc-head-sub", title: truncationTitle(subtitle), children: subtitle }) : null
10109
10156
  ] }),
10110
10157
  /* @__PURE__ */ jsxs72("span", { className: "fdc-head-acts", children: [
10111
10158
  headerActions,