@ai-matrx/design-system 0.86.353 → 0.86.355

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/carousel.js +2 -2
  3. package/dist/chunk-LJKF267O.js +168 -0
  4. package/dist/chunk-LJKF267O.js.map +1 -0
  5. package/dist/{chunk-CFCWQDGC.js → chunk-RLM4RSED.js} +5 -23
  6. package/dist/chunk-RLM4RSED.js.map +1 -0
  7. package/dist/{chunk-UGQRAQTE.js → chunk-XXZA2JUP.js} +2 -2
  8. package/dist/{chunk-FLWSEDUW.js → chunk-ZMUPFGQO.js} +2 -2
  9. package/dist/controls.cjs +85 -1
  10. package/dist/controls.cjs.map +1 -1
  11. package/dist/controls.js +2 -2
  12. package/dist/data-table/drill-chart.cjs +85 -1
  13. package/dist/data-table/drill-chart.cjs.map +1 -1
  14. package/dist/data-table/drill-chart.js +1 -1
  15. package/dist/data-table/index.cjs +85 -1
  16. package/dist/data-table/index.cjs.map +1 -1
  17. package/dist/data-table/index.js +1 -1
  18. package/dist/desktop.cjs +159 -81
  19. package/dist/desktop.cjs.map +1 -1
  20. package/dist/desktop.css +8 -5
  21. package/dist/desktop.d.cts +0 -5
  22. package/dist/desktop.d.ts +0 -5
  23. package/dist/desktop.js +70 -70
  24. package/dist/desktop.js.map +1 -1
  25. package/dist/email-input-dialog.cjs +85 -1
  26. package/dist/email-input-dialog.cjs.map +1 -1
  27. package/dist/email-input-dialog.js +1 -1
  28. package/dist/index.cjs +118 -24
  29. package/dist/index.cjs.map +1 -1
  30. package/dist/index.d.cts +17 -1
  31. package/dist/index.d.ts +17 -1
  32. package/dist/index.js +20 -12
  33. package/dist/index.js.map +1 -1
  34. package/dist/lite-table.cjs +86 -19
  35. package/dist/lite-table.cjs.map +1 -1
  36. package/dist/lite-table.js +2 -2
  37. package/dist/notice-material.css +28 -0
  38. package/dist/record-list.cjs +86 -19
  39. package/dist/record-list.cjs.map +1 -1
  40. package/dist/record-list.js +2 -2
  41. package/dist/styles.css +1 -0
  42. package/dist/swipe-deck.cjs +85 -1
  43. package/dist/swipe-deck.cjs.map +1 -1
  44. package/dist/swipe-deck.js +1 -1
  45. package/dist/text-input-dialog.cjs +85 -1
  46. package/dist/text-input-dialog.cjs.map +1 -1
  47. package/dist/text-input-dialog.js +1 -1
  48. package/package.json +2 -2
  49. package/dist/chunk-CFCWQDGC.js.map +0 -1
  50. package/dist/chunk-HKLIRHT2.js +0 -71
  51. package/dist/chunk-HKLIRHT2.js.map +0 -1
  52. /package/dist/{chunk-UGQRAQTE.js.map → chunk-XXZA2JUP.js.map} +0 -0
  53. /package/dist/{chunk-FLWSEDUW.js.map → chunk-ZMUPFGQO.js.map} +0 -0
package/dist/desktop.cjs CHANGED
@@ -5431,7 +5431,6 @@ function PlaceStrip({ className, ...props }) {
5431
5431
 
5432
5432
  // src/desktop/state.tsx
5433
5433
  var React34 = __toESM(require("react"), 1);
5434
- var import_clipboard = require("@ai-matrx/kit/clipboard");
5435
5434
 
5436
5435
  // src/desktop/errors.ts
5437
5436
  var RULES = [
@@ -5469,7 +5468,52 @@ function describeError(error, fallback = "Something went wrong. Try again.") {
5469
5468
  return { cause: fallback, detail };
5470
5469
  }
5471
5470
 
5471
+ // src/error-sentence.ts
5472
+ function errorSentenceOf(error) {
5473
+ if (error == null || error === true || error === false) return "";
5474
+ if (typeof error === "string") return error;
5475
+ if (typeof error !== "object") return String(error);
5476
+ const message = error.message;
5477
+ return typeof message === "string" ? message : "";
5478
+ }
5479
+ var TIMED_OUT_SENTENCE = "That took too long. Nothing was lost; try again.";
5480
+ var FALLBACK_ERROR_SENTENCE = "Something went wrong. Try again.";
5481
+ function isTimedOutError(error, message, code) {
5482
+ if (code === "57014" || code === "timed_out") return true;
5483
+ if (error && typeof error === "object") {
5484
+ const o = error;
5485
+ if (o.code === "57014" || o.code === "timed_out" || o.sqlstate === "57014") return true;
5486
+ }
5487
+ const text = `${message ?? ""} ${errorSentenceOf(error)}`;
5488
+ return /canceling statement due to statement timeout/i.test(text);
5489
+ }
5490
+ function offlineText(text) {
5491
+ const t = text.trim();
5492
+ return t !== "" && (describeError(t).code === "OFFLINE" || /networkerror|network request failed|load failed/i.test(t));
5493
+ }
5494
+ var ANY_HOST_CODES = /* @__PURE__ */ new Set(["OFFLINE", "TIMEOUT", "UNAUTHORIZED", "FORBIDDEN", "NOT_FOUND", "RATE_LIMIT", "SERVER"]);
5495
+ var MACHINE_PREFIX = /^\s*(?:\[[\w./-]+\]\s*|[a-z][\w]*(?:[._][\w]+)+:\s+)/;
5496
+ var RAW_TEXT = /\b(?:Type|Reference|Syntax|Range|Internal|Eval|URI)Error\b|\bat\s+[\w$.<>]+\s*\(|\.(?:[cm]?[jt]sx?|py):\d+|(?:^|[\s(])(?:\/[\w.@-]+){2,}|\bundefined is not\b|\bcannot read propert(?:y|ies)\b|\bis not a function\b|\bunexpected token\b/i;
5497
+ function isRawErrorText(text) {
5498
+ return MACHINE_PREFIX.test(text) || RAW_TEXT.test(text);
5499
+ }
5500
+ function peopleErrorSentence(error, message, options = {}) {
5501
+ if (isTimedOutError(error, message, options.code)) return TIMED_OUT_SENTENCE;
5502
+ const fallback = options.fallback ?? FALLBACK_ERROR_SENTENCE;
5503
+ const raw = message?.trim() || errorSentenceOf(error).trim();
5504
+ if (!raw) return fallback;
5505
+ let text = raw;
5506
+ for (let i = 0; i < 3 && MACHINE_PREFIX.test(text); i++) text = text.replace(MACHINE_PREFIX, "").trim();
5507
+ if (!text) return fallback;
5508
+ if (offlineText(text) || RAW_TEXT.test(text) || text !== raw) {
5509
+ const said = describeError(text, fallback);
5510
+ return said.code && ANY_HOST_CODES.has(said.code) ? said.cause : fallback;
5511
+ }
5512
+ return text;
5513
+ }
5514
+
5472
5515
  // src/desktop/state.tsx
5516
+ var import_clipboard = require("@ai-matrx/kit/clipboard");
5473
5517
  var import_jsx_runtime42 = require("react/jsx-runtime");
5474
5518
  var EMPTY_ICON = /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.75, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [
5475
5519
  /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("path", { d: "M22 12h-6l-2 3h-4l-2-3H2" }),
@@ -5547,6 +5591,8 @@ var BANNER_ICON = {
5547
5591
  };
5548
5592
  function Banner({ tone, icon, title, message, actions, detail, onDismiss, count, className, ...props }) {
5549
5593
  const [copied, setCopied] = React34.useState(false);
5594
+ if (typeof title === "string" && isRawErrorText(title)) title = peopleErrorSentence(null, title);
5595
+ if (typeof message === "string" && isRawErrorText(message)) message = peopleErrorSentence(null, message);
5550
5596
  const registry3 = React34.useContext(NoticeStackContext);
5551
5597
  const floating = registry3 !== null;
5552
5598
  const id = React34.useId();
@@ -6873,15 +6919,47 @@ function EndOfList({ onEndReached }) {
6873
6919
  }
6874
6920
 
6875
6921
  // src/desktop/split-view.tsx
6922
+ var React39 = __toESM(require("react"), 1);
6876
6923
  var import_jsx_runtime47 = require("react/jsx-runtime");
6877
6924
  var LIST_WIDTH = { md: "w-70", lg: "w-85" };
6925
+ function useNoticeBounds(frame) {
6926
+ React39.useLayoutEffect(() => {
6927
+ const el = frame.current;
6928
+ if (!el) return;
6929
+ const measure = () => {
6930
+ const box = el.getBoundingClientRect();
6931
+ const columns2 = el.querySelector(':scope > [data-slot="split-columns"]');
6932
+ const viewer = columns2?.querySelector(':scope > [data-slot="split-view-detail"]');
6933
+ const top = columns2 ? columns2.getBoundingClientRect().top - box.top : 0;
6934
+ let left = 0;
6935
+ let below = 0;
6936
+ if (viewer && viewer.offsetWidth > 0) {
6937
+ left = viewer.getBoundingClientRect().left - box.left;
6938
+ } else {
6939
+ const listHeader = columns2?.querySelector('[data-slot="split-view-list-header"]');
6940
+ if (listHeader && listHeader.offsetHeight > 0) below = listHeader.getBoundingClientRect().bottom - box.top - top;
6941
+ }
6942
+ el.style.setProperty("--split-notices-left", `${Math.max(0, Math.round(left))}px`);
6943
+ el.style.setProperty("--split-notices-top", `${Math.max(0, Math.round(top + below))}px`);
6944
+ };
6945
+ measure();
6946
+ if (typeof ResizeObserver === "undefined") return;
6947
+ const observer = new ResizeObserver(measure);
6948
+ observer.observe(el);
6949
+ const columns = el.querySelector(':scope > [data-slot="split-columns"]');
6950
+ if (columns) for (const child of Array.from(columns.children)) observer.observe(child);
6951
+ return () => observer.disconnect();
6952
+ });
6953
+ }
6878
6954
  function SplitView({ header, notices, source, list, listHeader, listFooter, detail, listWidth = "lg", detailScrolls = true, narrow, className, ...props }) {
6879
- return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { "data-slot": "split-view", className: cn("relative flex h-full min-h-0 flex-col bg-content", className), ...props, children: [
6955
+ const frame = React39.useRef(null);
6956
+ useNoticeBounds(frame);
6957
+ return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { ref: frame, "data-slot": "split-view", className: cn("relative flex h-full min-h-0 flex-col bg-content", className), ...props, children: [
6880
6958
  header ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "shrink-0 px-5 empty:hidden", children: header }) : null,
6881
6959
  /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { "data-slot": "split-columns", "data-narrow": detail !== void 0 ? narrow : void 0, "data-has-source": source ? "" : void 0, className: "flex min-h-0 flex-1", children: [
6882
6960
  source ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { "data-slot": "split-view-source", className: "flex w-52 min-w-40 shrink flex-col overflow-y-auto border-r border-separator py-2", children: source }) : null,
6883
6961
  /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { "data-slot": "split-view-list", className: cn("flex flex-col", detail === void 0 ? "min-w-0 flex-1" : cn("min-w-56 shrink border-r border-separator", LIST_WIDTH[listWidth])), children: [
6884
- listHeader ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "flex shrink-0 flex-col gap-2 px-3 pb-2 pt-1", children: listHeader }) : null,
6962
+ listHeader ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { "data-slot": "split-view-list-header", className: "flex shrink-0 flex-col gap-2 px-3 pb-2 pt-1", children: listHeader }) : null,
6885
6963
  /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "min-h-0 flex-1 overflow-y-auto", children: list }),
6886
6964
  listFooter ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "flex shrink-0 items-center justify-center border-t border-separator px-3 py-3", children: listFooter }) : null
6887
6965
  ] }),
@@ -6892,7 +6970,7 @@ function SplitView({ header, notices, source, list, listHeader, listFooter, deta
6892
6970
  }
6893
6971
 
6894
6972
  // src/desktop/resizable-pane.tsx
6895
- var React39 = __toESM(require("react"), 1);
6973
+ var React40 = __toESM(require("react"), 1);
6896
6974
  var import_jsx_runtime48 = require("react/jsx-runtime");
6897
6975
  var STEP = 16;
6898
6976
  var key = (name) => `mx-split:${name}`;
@@ -6946,16 +7024,16 @@ function ResizablePane({
6946
7024
  children,
6947
7025
  ...props
6948
7026
  }) {
6949
- const ref = React39.useRef(null);
6950
- const [size, setSize] = React39.useState(() => saved(autosaveName) ?? defaultSize);
6951
- const [ownState, setOwnState] = React39.useState(() => savedState(autosaveName) ?? (defaultCollapsed ? "collapsed" : "open"));
6952
- const [room, setRoom] = React39.useState(null);
7027
+ const ref = React40.useRef(null);
7028
+ const [size, setSize] = React40.useState(() => saved(autosaveName) ?? defaultSize);
7029
+ const [ownState, setOwnState] = React40.useState(() => savedState(autosaveName) ?? (defaultCollapsed ? "collapsed" : "open"));
7030
+ const [room, setRoom] = React40.useState(null);
6953
7031
  const collapsed = collapsedProp ?? ownState === "collapsed";
6954
7032
  const maximized = !collapsed && (maximizedProp ?? ownState === "maximized");
6955
7033
  const state = collapsed ? "collapsed" : maximized ? "maximized" : "open";
6956
- const live = React39.useRef({ state, onCollapsedChange, onMaximizedChange });
7034
+ const live = React40.useRef({ state, onCollapsedChange, onMaximizedChange });
6957
7035
  live.current = { state, onCollapsedChange, onMaximizedChange };
6958
- const setState = React39.useCallback((next) => {
7036
+ const setState = React40.useCallback((next) => {
6959
7037
  const { state: was, onCollapsedChange: oc, onMaximizedChange: om } = live.current;
6960
7038
  if (next === was) return;
6961
7039
  live.current = { ...live.current, state: next };
@@ -6963,8 +7041,8 @@ function ResizablePane({
6963
7041
  if (was === "collapsed" !== (next === "collapsed")) oc?.(next === "collapsed");
6964
7042
  if (was === "maximized" !== (next === "maximized")) om?.(next === "maximized");
6965
7043
  }, []);
6966
- React39.useEffect(() => saveState(autosaveName, state), [autosaveName, state]);
6967
- React39.useLayoutEffect(() => {
7044
+ React40.useEffect(() => saveState(autosaveName, state), [autosaveName, state]);
7045
+ React40.useLayoutEffect(() => {
6968
7046
  const el = ref.current;
6969
7047
  const frame = el?.closest('[data-slot="page-frame"], [data-slot="split-view"]') ?? el?.parentElement ?? null;
6970
7048
  if (!frame) return;
@@ -7230,7 +7308,7 @@ function CallButton({ icon, label, tone = "default", className, type = "button",
7230
7308
  }
7231
7309
 
7232
7310
  // src/desktop/media.tsx
7233
- var React40 = __toESM(require("react"), 1);
7311
+ var React41 = __toESM(require("react"), 1);
7234
7312
  var import_jsx_runtime51 = require("react/jsx-runtime");
7235
7313
  function Waveform({ peaks, progress = 0, onSeek, className, "aria-label": label, ...props }) {
7236
7314
  const bars = peaks.length;
@@ -7286,7 +7364,7 @@ function peaksOf(samples, bars) {
7286
7364
  const loudest = Math.max(...out);
7287
7365
  return loudest > 0 ? out.map((p) => p / loudest) : out;
7288
7366
  }
7289
- var RecordButton = React40.forwardRef(function RecordButton2({ recording = false, label, className, type = "button", ...props }, ref) {
7367
+ var RecordButton = React41.forwardRef(function RecordButton2({ recording = false, label, className, type = "button", ...props }, ref) {
7290
7368
  return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
7291
7369
  "button",
7292
7370
  {
@@ -7399,7 +7477,7 @@ function SymbolTile({ children, color, size = "sm", className, ...props }) {
7399
7477
  }
7400
7478
 
7401
7479
  // src/desktop/library.tsx
7402
- var React41 = __toESM(require("react"), 1);
7480
+ var React42 = __toESM(require("react"), 1);
7403
7481
  var import_jsx_runtime55 = require("react/jsx-runtime");
7404
7482
  var TILE_COLOR = {
7405
7483
  red: "bg-system-red",
@@ -7449,7 +7527,7 @@ function MoreGlyph() {
7449
7527
  ] });
7450
7528
  }
7451
7529
  function ShortcutTile({ color, glyph, title, selected, onSelect, onOpen, run, menu, className, onKeyDown, ...props }) {
7452
- const [asking, setAsking] = React41.useState(null);
7530
+ const [asking, setAsking] = React42.useState(null);
7453
7531
  const confirm = /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
7454
7532
  ConfirmDialog,
7455
7533
  {
@@ -7570,7 +7648,7 @@ function FavoriteTile({ title, icon, className, ...props }) {
7570
7648
  }
7571
7649
 
7572
7650
  // src/desktop/store.tsx
7573
- var React42 = __toESM(require("react"), 1);
7651
+ var React43 = __toESM(require("react"), 1);
7574
7652
  var import_jsx_runtime57 = require("react/jsx-runtime");
7575
7653
  function ProgressRing({ value, label, className, ...props }) {
7576
7654
  const r = 10;
@@ -7662,7 +7740,7 @@ function GetButton({ state, name, onPress, onStop, className, disabled, ...props
7662
7740
  ] });
7663
7741
  }
7664
7742
  function StoreShelf({ title, subtitle, action, className, children, ...props }) {
7665
- const id = React42.useId();
7743
+ const id = React43.useId();
7666
7744
  return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("section", { "aria-labelledby": id, "data-slot": "store-shelf", className: cn("flex flex-col gap-2", className), ...props, children: [
7667
7745
  /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("header", { className: "flex items-end gap-3 border-t border-separator pt-3", children: [
7668
7746
  /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("span", { className: "flex min-w-0 flex-1 flex-col", children: [
@@ -7730,18 +7808,18 @@ function InfoStrip({ items, className, ...props }) {
7730
7808
  }
7731
7809
 
7732
7810
  // src/desktop/credentials.tsx
7733
- var React46 = __toESM(require("react"), 1);
7811
+ var React47 = __toESM(require("react"), 1);
7734
7812
  var import_format = require("@ai-matrx/kit/format");
7735
7813
 
7736
7814
  // src/controls/controls.tsx
7737
7815
  var SwitchPrimitives = __toESM(require("@radix-ui/react-switch"), 1);
7738
7816
  var import_react_slot4 = require("@radix-ui/react-slot");
7739
- var React45 = __toESM(require("react"), 1);
7817
+ var React46 = __toESM(require("react"), 1);
7740
7818
 
7741
7819
  // src/button.tsx
7742
7820
  var import_react_slot3 = require("@radix-ui/react-slot");
7743
7821
  var import_class_variance_authority3 = require("class-variance-authority");
7744
- var React43 = __toESM(require("react"), 1);
7822
+ var React44 = __toESM(require("react"), 1);
7745
7823
  var import_jsx_runtime58 = require("react/jsx-runtime");
7746
7824
  var buttonVariants2 = (0, import_class_variance_authority3.cva)(
7747
7825
  "matrx-glyph-trim inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-0 disabled:opacity-50 active:scale-[0.98] [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
@@ -7809,7 +7887,7 @@ function swallowClick(event) {
7809
7887
  event.preventDefault();
7810
7888
  event.stopPropagation();
7811
7889
  }
7812
- var Button3 = React43.forwardRef(
7890
+ var Button3 = React44.forwardRef(
7813
7891
  ({ className, variant, size, asChild = false, onClick, ...props }, ref) => {
7814
7892
  const Component = asChild ? import_react_slot3.Slot : "button";
7815
7893
  const resolvedSize = size ?? "default";
@@ -7835,7 +7913,7 @@ var Button3 = React43.forwardRef(
7835
7913
  Button3.displayName = "Button";
7836
7914
 
7837
7915
  // src/textarea.tsx
7838
- var React44 = __toESM(require("react"), 1);
7916
+ var React45 = __toESM(require("react"), 1);
7839
7917
  var import_jsx_runtime59 = require("react/jsx-runtime");
7840
7918
  var FILL_HEIGHT_REGEX = /(?:^|\s)(h-full|h-dvh|flex-1|grow)(?:\s|$)/;
7841
7919
  var FILL_WIDTH_REGEX = /(?:^|\s)(w-full|w-screen)(?:\s|$)/;
@@ -7849,7 +7927,7 @@ function getStretchClasses(className) {
7849
7927
  var TEXTAREA_ELEVATED_CLASS = `flex h-auto w-full rounded-md ${FIELD_SURFACE_CLASS} px-3 py-2 text-sm text-foreground shadow-textarea transition duration-400 placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/15 disabled:cursor-not-allowed disabled:opacity-50`;
7850
7928
  var TEXTAREA_CONTROL_CLASS = `flex w-full rounded-md ${FIELD_SURFACE_CLASS} px-3 py-2 text-sm text-foreground shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/15 disabled:cursor-not-allowed disabled:opacity-50`;
7851
7929
  function useAutoGrow(ref, value, autoGrow = false, minHeight, maxHeight) {
7852
- React44.useEffect(() => {
7930
+ React45.useEffect(() => {
7853
7931
  if (!autoGrow || !ref.current) return;
7854
7932
  const textarea = ref.current;
7855
7933
  textarea.style.height = "auto";
@@ -7865,8 +7943,8 @@ function useAutoGrow(ref, value, autoGrow = false, minHeight, maxHeight) {
7865
7943
  }, [value, autoGrow, minHeight, maxHeight, ref]);
7866
7944
  }
7867
7945
  function useMergedTextareaRef(forwarded) {
7868
- const internal = React44.useRef(null);
7869
- const callback = React44.useCallback(
7946
+ const internal = React45.useRef(null);
7947
+ const callback = React45.useCallback(
7870
7948
  (node) => {
7871
7949
  internal.current = node;
7872
7950
  if (typeof forwarded === "function") forwarded(node);
@@ -7883,7 +7961,7 @@ function boxStyle(minHeight, maxHeight) {
7883
7961
  maxHeight: maxHeight ? `${maxHeight}px` : void 0
7884
7962
  };
7885
7963
  }
7886
- var Textarea = React44.forwardRef(
7964
+ var Textarea = React45.forwardRef(
7887
7965
  ({ className, autoGrow, minHeight, maxHeight, wrapperClassName, ...props }, forwarded) => {
7888
7966
  const { ref, callback } = useMergedTextareaRef(forwarded);
7889
7967
  const stretchClasses = getStretchClasses(className);
@@ -7909,7 +7987,7 @@ var Textarea = React44.forwardRef(
7909
7987
  }
7910
7988
  );
7911
7989
  Textarea.displayName = "Textarea";
7912
- var BasicTextarea = React44.forwardRef(
7990
+ var BasicTextarea = React45.forwardRef(
7913
7991
  ({ className, autoGrow, minHeight, maxHeight, ...props }, forwarded) => {
7914
7992
  const { ref, callback } = useMergedTextareaRef(forwarded);
7915
7993
  useAutoGrow(ref, props.value, autoGrow, minHeight, maxHeight);
@@ -7931,7 +8009,7 @@ var BasicTextarea = React44.forwardRef(
7931
8009
  }
7932
8010
  );
7933
8011
  BasicTextarea.displayName = "BasicTextarea";
7934
- var TextareaWithPrefix = React44.forwardRef(
8012
+ var TextareaWithPrefix = React45.forwardRef(
7935
8013
  ({
7936
8014
  prefix,
7937
8015
  className,
@@ -7974,7 +8052,7 @@ TextareaWithPrefix.displayName = "TextareaWithPrefix";
7974
8052
 
7975
8053
  // src/controls/controls.tsx
7976
8054
  var import_jsx_runtime60 = require("react/jsx-runtime");
7977
- var ControlRow = React45.forwardRef(
8055
+ var ControlRow = React46.forwardRef(
7978
8056
  ({ className, nowrap, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
7979
8057
  "div",
7980
8058
  {
@@ -7987,7 +8065,7 @@ var ControlRow = React45.forwardRef(
7987
8065
  )
7988
8066
  );
7989
8067
  ControlRow.displayName = "ControlRow";
7990
- var ControlScope = React45.forwardRef(
8068
+ var ControlScope = React46.forwardRef(
7991
8069
  (props, ref) => /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { ref, "data-matrx-controls": "", ...props })
7992
8070
  );
7993
8071
  ControlScope.displayName = "ControlScope";
@@ -7998,14 +8076,14 @@ function glyphSlot(icon, iconEnd, label) {
7998
8076
  if (iconEnd) return "end";
7999
8077
  return void 0;
8000
8078
  }
8001
- var Button4 = React45.forwardRef(
8079
+ var Button4 = React46.forwardRef(
8002
8080
  ({ className, variant = "outline", tone, icon, iconEnd, asChild = false, collapse, pressed, badge, glyphTone, removes, meta, width, hero, children, onClick, type, ...props }, ref) => {
8003
8081
  const Component = asChild ? import_react_slot4.Slot : "button";
8004
8082
  const badgeText = typeof badge === "number" ? badge > 0 ? badge > 99 ? "99+" : String(badge) : null : badge ? "" : null;
8005
8083
  const ariaDisabled = props["aria-disabled"];
8006
8084
  const disabledChild = asChild && Boolean(props.disabled);
8007
8085
  const inert = disabledChild || ariaDisabled === true || ariaDisabled === "true";
8008
- const label = asChild && React45.isValidElement(children) ? children.props.children : children;
8086
+ const label = asChild && React46.isValidElement(children) ? children.props.children : children;
8009
8087
  const collapses = collapse === "container" && Boolean(icon) && Boolean(label);
8010
8088
  return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
8011
8089
  Component,
@@ -8043,11 +8121,11 @@ var Button4 = React45.forwardRef(
8043
8121
  }
8044
8122
  );
8045
8123
  Button4.displayName = "Button";
8046
- var SplitButton = React45.forwardRef(
8124
+ var SplitButton = React46.forwardRef(
8047
8125
  ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { ref, role: "group", "data-matrx-control": "split", className: cn2("matrx-control-split", className), ...props })
8048
8126
  );
8049
8127
  SplitButton.displayName = "SplitButton";
8050
- var Field = React45.forwardRef(
8128
+ var Field = React46.forwardRef(
8051
8129
  ({ className, style, icon, end, width, hero, filled, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
8052
8130
  "label",
8053
8131
  {
@@ -8067,7 +8145,7 @@ var Field = React45.forwardRef(
8067
8145
  )
8068
8146
  );
8069
8147
  Field.displayName = "Field";
8070
- var SearchField3 = React45.forwardRef(
8148
+ var SearchField3 = React46.forwardRef(
8071
8149
  ({ placeholder = "Search", ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
8072
8150
  Field,
8073
8151
  {
@@ -8081,7 +8159,7 @@ var SearchField3 = React45.forwardRef(
8081
8159
  )
8082
8160
  );
8083
8161
  SearchField3.displayName = "SearchField";
8084
- var Chip = React45.forwardRef(
8162
+ var Chip = React46.forwardRef(
8085
8163
  ({ label, variant = "item", tone, icon, asChild = false, pressed, children, className, title, ...props }, ref) => {
8086
8164
  const Component = asChild ? import_react_slot4.Slot : "span";
8087
8165
  const glyph = variant === "add" ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(PlusIcon, { className: "lucide lucide-plus" }) : icon;
@@ -8111,7 +8189,7 @@ var Chip = React45.forwardRef(
8111
8189
  }
8112
8190
  );
8113
8191
  Chip.displayName = "Chip";
8114
- var ChipSet = React45.forwardRef(
8192
+ var ChipSet = React46.forwardRef(
8115
8193
  ({ layout = "flow", className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
8116
8194
  "div",
8117
8195
  {
@@ -8124,7 +8202,7 @@ var ChipSet = React45.forwardRef(
8124
8202
  )
8125
8203
  );
8126
8204
  ChipSet.displayName = "ChipSet";
8127
- var Switch3 = React45.forwardRef(
8205
+ var Switch3 = React46.forwardRef(
8128
8206
  ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
8129
8207
  SwitchPrimitives.Root,
8130
8208
  {
@@ -8137,7 +8215,7 @@ var Switch3 = React45.forwardRef(
8137
8215
  )
8138
8216
  );
8139
8217
  Switch3.displayName = "Switch";
8140
- var Textarea2 = React45.forwardRef(
8218
+ var Textarea2 = React46.forwardRef(
8141
8219
  ({ className, style, variant = "field", mono, hero, joinedBottom, autoGrow, minHeight, maxHeight, reservedInlineEnd, reservedBlockEnd, ...props }, forwarded) => {
8142
8220
  const { ref, callback } = useMergedTextareaRef(forwarded);
8143
8221
  useAutoGrow(ref, props.value, autoGrow, minHeight, maxHeight);
@@ -8243,15 +8321,15 @@ function CodeTimer({ fraction, label, className }) {
8243
8321
  ] });
8244
8322
  }
8245
8323
  function TimedCode({ code, validUntilMs, periodSeconds, now = Date.now, onExpire, className, ...props }) {
8246
- const [at, setAt] = React46.useState(() => now());
8247
- const expired = React46.useRef(false);
8248
- React46.useEffect(() => {
8324
+ const [at, setAt] = React47.useState(() => now());
8325
+ const expired = React47.useRef(false);
8326
+ React47.useEffect(() => {
8249
8327
  expired.current = false;
8250
8328
  const id = setInterval(() => setAt(now()), 1e3);
8251
8329
  return () => clearInterval(id);
8252
8330
  }, [validUntilMs, now]);
8253
8331
  const left = Math.max(0, validUntilMs - at);
8254
- React46.useEffect(() => {
8332
+ React47.useEffect(() => {
8255
8333
  if (left === 0 && !expired.current) {
8256
8334
  expired.current = true;
8257
8335
  onExpire?.();
@@ -8478,12 +8556,12 @@ var import_format4 = require("@ai-matrx/kit/format");
8478
8556
  // src/confirm-host.tsx
8479
8557
  var import_confirm_opener = require("@ai-matrx/kit/confirm-opener");
8480
8558
  var import_opener_react = require("@ai-matrx/kit/opener-react");
8481
- var React48 = __toESM(require("react"), 1);
8559
+ var React49 = __toESM(require("react"), 1);
8482
8560
 
8483
8561
  // src/alert-dialog.tsx
8484
8562
  var AlertDialogPrimitive = __toESM(require("@radix-ui/react-alert-dialog"), 1);
8485
8563
  var import_react_tree2 = require("@ai-matrx/kit/react-tree");
8486
- var React47 = __toESM(require("react"), 1);
8564
+ var React48 = __toESM(require("react"), 1);
8487
8565
  var import_jsx_runtime63 = require("react/jsx-runtime");
8488
8566
  var AlertDialog = AlertDialogPrimitive.Root;
8489
8567
  var AlertDialogPortal = ({
@@ -8494,7 +8572,7 @@ var AlertDialogPortal = ({
8494
8572
  return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(AlertDialogPrimitive.Portal, { container: resolved ?? null, ...props });
8495
8573
  };
8496
8574
  AlertDialogPortal.displayName = "AlertDialogPortal";
8497
- var AlertDialogOverlay = React47.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
8575
+ var AlertDialogOverlay = React48.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
8498
8576
  AlertDialogPrimitive.Overlay,
8499
8577
  {
8500
8578
  ref,
@@ -8508,12 +8586,12 @@ var AlertDialogOverlay = React47.forwardRef(({ className, ...props }, ref) => /*
8508
8586
  }
8509
8587
  ));
8510
8588
  AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
8511
- var AlertDialogContentPrimitive = React47.forwardRef(({ onCloseAutoFocus, ...props }, ref) => {
8589
+ var AlertDialogContentPrimitive = React48.forwardRef(({ onCloseAutoFocus, ...props }, ref) => {
8512
8590
  useModalLayer(true);
8513
8591
  return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(AlertDialogPrimitive.Content, { ...props, ref, "aria-modal": "true", onCloseAutoFocus: keepMovedFocus(onCloseAutoFocus) });
8514
8592
  });
8515
8593
  AlertDialogContentPrimitive.displayName = "AlertDialogContentPrimitive";
8516
- var AlertDialogDescription = React47.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
8594
+ var AlertDialogDescription = React48.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
8517
8595
  AlertDialogPrimitive.Description,
8518
8596
  {
8519
8597
  ref,
@@ -8523,7 +8601,7 @@ var AlertDialogDescription = React47.forwardRef(({ className, ...props }, ref) =
8523
8601
  }
8524
8602
  ));
8525
8603
  AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
8526
- var AlertDialogContent = React47.forwardRef(({ className, children, container, animated = true, ...props }, ref) => {
8604
+ var AlertDialogContent = React48.forwardRef(({ className, children, container, animated = true, ...props }, ref) => {
8527
8605
  const hasDescription = (0, import_react_tree2.treeContainsComponent)(children, AlertDialogDescription) || (0, import_react_tree2.treeContainsComponent)(children, AlertDialogPrimitive.Description);
8528
8606
  return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(AlertDialogPortal, { container, children: [
8529
8607
  /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(AlertDialogOverlay, {}),
@@ -8602,7 +8680,7 @@ var AlertDialogFooter = ({
8602
8680
  }
8603
8681
  );
8604
8682
  AlertDialogFooter.displayName = "AlertDialogFooter";
8605
- var AlertDialogTitle = React47.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
8683
+ var AlertDialogTitle = React48.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
8606
8684
  AlertDialogPrimitive.Title,
8607
8685
  {
8608
8686
  ref,
@@ -8612,7 +8690,7 @@ var AlertDialogTitle = React47.forwardRef(({ className, ...props }, ref) => /* @
8612
8690
  }
8613
8691
  ));
8614
8692
  AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
8615
- var AlertDialogAction = React47.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
8693
+ var AlertDialogAction = React48.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
8616
8694
  AlertDialogPrimitive.Action,
8617
8695
  {
8618
8696
  ref,
@@ -8622,7 +8700,7 @@ var AlertDialogAction = React47.forwardRef(({ className, ...props }, ref) => /*
8622
8700
  }
8623
8701
  ));
8624
8702
  AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
8625
- var AlertDialogCancel = React47.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
8703
+ var AlertDialogCancel = React48.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
8626
8704
  AlertDialogPrimitive.Cancel,
8627
8705
  {
8628
8706
  ref,
@@ -8699,9 +8777,9 @@ function ConfirmDialog2({
8699
8777
  var import_jsx_runtime65 = require("react/jsx-runtime");
8700
8778
  function ConfirmDialogHost() {
8701
8779
  const { shown, open, settle } = (0, import_opener_react.useOpenerHost)(import_confirm_opener.confirmOpener);
8702
- const [readyFor, setReadyFor] = React48.useState(null);
8780
+ const [readyFor, setReadyFor] = React49.useState(null);
8703
8781
  const ready = shown?.ready;
8704
- React48.useEffect(() => {
8782
+ React49.useEffect(() => {
8705
8783
  if (!shown || !ready) return void 0;
8706
8784
  let live = true;
8707
8785
  const release = () => {
@@ -8713,8 +8791,8 @@ function ConfirmDialogHost() {
8713
8791
  };
8714
8792
  }, [shown, ready]);
8715
8793
  const held = !!ready && readyFor !== shown;
8716
- const handleConfirm = React48.useCallback(() => settle(true), [settle]);
8717
- const handleOpenChange = React48.useCallback(
8794
+ const handleConfirm = React49.useCallback(() => settle(true), [settle]);
8795
+ const handleOpenChange = React49.useCallback(
8718
8796
  (next) => {
8719
8797
  if (!next) settle(false);
8720
8798
  },
@@ -8738,10 +8816,10 @@ function ConfirmDialogHost() {
8738
8816
 
8739
8817
  // src/desktop/popover.tsx
8740
8818
  var PopoverPrimitive2 = __toESM(require("@radix-ui/react-popover"), 1);
8741
- var React49 = __toESM(require("react"), 1);
8819
+ var React50 = __toESM(require("react"), 1);
8742
8820
  var import_jsx_runtime66 = require("react/jsx-runtime");
8743
8821
  var POPOVER_ARROW = { width: 18, height: 9 };
8744
- var PopoverContent2 = React49.forwardRef(
8822
+ var PopoverContent2 = React50.forwardRef(
8745
8823
  ({ arrow = true, sideOffset, className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
8746
8824
  PopoverContent,
8747
8825
  {
@@ -8762,7 +8840,7 @@ PopoverContent2.displayName = "DesktopPopoverContent";
8762
8840
 
8763
8841
  // src/controls/surfaces.tsx
8764
8842
  var import_react_slot5 = require("@radix-ui/react-slot");
8765
- var React50 = __toESM(require("react"), 1);
8843
+ var React51 = __toESM(require("react"), 1);
8766
8844
 
8767
8845
  // src/skeleton.tsx
8768
8846
  var import_jsx_runtime67 = require("react/jsx-runtime");
@@ -8824,7 +8902,7 @@ function Skeleton({ className, animated = true, motion = "pulse", shape, height,
8824
8902
 
8825
8903
  // src/controls/surfaces.tsx
8826
8904
  var import_jsx_runtime68 = require("react/jsx-runtime");
8827
- var Tile = React50.forwardRef(
8905
+ var Tile = React51.forwardRef(
8828
8906
  ({ layout = "row", variant = "outline", icon, title, wrapTitle, line, end, selected, selectedStyle, tooltip, level, fit, endInset, oneLine, dashed, hoverStyle, danger, dimmed, glyphTone, hero, tone, iconTone, dense, asChild = false, className, children, onClick, type, ...props }, ref) => {
8829
8907
  const Component = asChild ? import_react_slot5.Slot : "button";
8830
8908
  const ariaDisabled = props["aria-disabled"];
@@ -8865,13 +8943,13 @@ var Tile = React50.forwardRef(
8865
8943
  className: cn2("matrx-tile", className),
8866
8944
  ...props,
8867
8945
  onClick: inert ? swallowClick : onClick,
8868
- children: asChild && React50.isValidElement(children) ? React50.cloneElement(children, void 0, body) : body
8946
+ children: asChild && React51.isValidElement(children) ? React51.cloneElement(children, void 0, body) : body
8869
8947
  }
8870
8948
  );
8871
8949
  }
8872
8950
  );
8873
8951
  Tile.displayName = "Tile";
8874
- var DisclosureHeader = React50.forwardRef(
8952
+ var DisclosureHeader = React51.forwardRef(
8875
8953
  ({ open, variant = "row", icon, glyphTone, title, meta, end, line, chevron = "start", className, type, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
8876
8954
  "button",
8877
8955
  {
@@ -8899,7 +8977,7 @@ var DisclosureHeader = React50.forwardRef(
8899
8977
  )
8900
8978
  );
8901
8979
  DisclosureHeader.displayName = "DisclosureHeader";
8902
- var DeleteButton = React50.forwardRef((props, ref) => /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(Button4, { ref, variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(Trash2Icon, {}), "data-delete": "", title: props["aria-label"], ...props }));
8980
+ var DeleteButton = React51.forwardRef((props, ref) => /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(Button4, { ref, variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(Trash2Icon, {}), "data-delete": "", title: props["aria-label"], ...props }));
8903
8981
  DeleteButton.displayName = "DeleteButton";
8904
8982
 
8905
8983
  // src/desktop/list-row.tsx
@@ -8924,7 +9002,7 @@ function ListRow({ icon, title, secondary, accessory, onSelect, selected = false
8924
9002
  }
8925
9003
 
8926
9004
  // src/desktop/info-hint.tsx
8927
- var React51 = __toESM(require("react"), 1);
9005
+ var React52 = __toESM(require("react"), 1);
8928
9006
  var import_jsx_runtime70 = require("react/jsx-runtime");
8929
9007
  var INFO_HINT_MAX = 140;
8930
9008
  function infoHintText(label, text) {
@@ -8940,7 +9018,7 @@ function InfoGlyph2() {
8940
9018
  ] });
8941
9019
  }
8942
9020
  function InfoHint({ label, text, side = "top", className }) {
8943
- const shown = React51.useMemo(() => infoHintText(label, text), [label, text]);
9021
+ const shown = React52.useMemo(() => infoHintText(label, text), [label, text]);
8944
9022
  return /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(Popover, { children: [
8945
9023
  /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
8946
9024
  Button4,
@@ -8959,11 +9037,11 @@ function InfoHint({ label, text, side = "top", className }) {
8959
9037
 
8960
9038
  // src/collapsible.tsx
8961
9039
  var CollapsiblePrimitive = __toESM(require("@radix-ui/react-collapsible"), 1);
8962
- var React52 = __toESM(require("react"), 1);
9040
+ var React53 = __toESM(require("react"), 1);
8963
9041
  var import_jsx_runtime71 = require("react/jsx-runtime");
8964
9042
  var Collapsible = CollapsiblePrimitive.Root;
8965
9043
  var CollapsibleTrigger2 = CollapsiblePrimitive.CollapsibleTrigger;
8966
- var CollapsibleContent2 = React52.forwardRef(({ className, animated = true, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
9044
+ var CollapsibleContent2 = React53.forwardRef(({ className, animated = true, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
8967
9045
  CollapsiblePrimitive.CollapsibleContent,
8968
9046
  {
8969
9047
  ref,
@@ -8978,7 +9056,7 @@ var CollapsibleContent2 = React52.forwardRef(({ className, animated = true, ...p
8978
9056
  CollapsibleContent2.displayName = "CollapsibleContent";
8979
9057
 
8980
9058
  // src/app-shell/app-rail.tsx
8981
- var React53 = __toESM(require("react"), 1);
9059
+ var React54 = __toESM(require("react"), 1);
8982
9060
 
8983
9061
  // src/app-shell/status-dot.tsx
8984
9062
  var import_jsx_runtime72 = require("react/jsx-runtime");
@@ -9047,7 +9125,7 @@ function AppRailGroup({ className, ...props }) {
9047
9125
  function AppRailSpacer() {
9048
9126
  return /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("div", { "data-slot": "app-rail-spacer", className: "flex-1" });
9049
9127
  }
9050
- var AppRailItem = React53.forwardRef(function AppRailItem2({ icon, label, shortcut, active = false, attention, attentionLabel, className, ...props }, ref) {
9128
+ var AppRailItem = React54.forwardRef(function AppRailItem2({ icon, label, shortcut, active = false, attention, attentionLabel, className, ...props }, ref) {
9051
9129
  return /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)(Tooltip, { children: [
9052
9130
  /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)(
9053
9131
  "button",
@@ -9087,7 +9165,7 @@ var AppRailItem = React53.forwardRef(function AppRailItem2({ icon, label, shortc
9087
9165
  ] }) })
9088
9166
  ] });
9089
9167
  });
9090
- var AppRailAvatar = React53.forwardRef(function AppRailAvatar2({ initials: initials2 = "", label, className, children, ...props }, ref) {
9168
+ var AppRailAvatar = React54.forwardRef(function AppRailAvatar2({ initials: initials2 = "", label, className, children, ...props }, ref) {
9091
9169
  return /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)(Tooltip, { children: [
9092
9170
  /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
9093
9171
  "button",
@@ -9110,7 +9188,7 @@ var AppRailAvatar = React53.forwardRef(function AppRailAvatar2({ initials: initi
9110
9188
  });
9111
9189
 
9112
9190
  // src/app-shell/canvas.tsx
9113
- var React54 = __toESM(require("react"), 1);
9191
+ var React55 = __toESM(require("react"), 1);
9114
9192
 
9115
9193
  // src/resizable.tsx
9116
9194
  var import_react_resizable_panels = require("react-resizable-panels");
@@ -9177,7 +9255,7 @@ function CanvasLayout({ columns, expandedId = null, className }) {
9177
9255
  if (expanded) {
9178
9256
  return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("div", { "data-slot": "canvas-layout", "data-expanded": expanded.id, className: cn2("flex h-full w-full", className), children: expanded.node });
9179
9257
  }
9180
- return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(ResizablePanelGroup, { "data-slot": "canvas-layout", orientation: "horizontal", className: cn2("gap-0", className), children: visible.map((column, ci) => /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(React54.Fragment, { children: [
9258
+ return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(ResizablePanelGroup, { "data-slot": "canvas-layout", orientation: "horizontal", className: cn2("gap-0", className), children: visible.map((column, ci) => /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(React55.Fragment, { children: [
9181
9259
  ci > 0 ? /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(ResizableHandle, { "data-canvas-gap": "column", size: "md", className: GAP }) : null,
9182
9260
  /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
9183
9261
  ResizablePanel,
@@ -9185,7 +9263,7 @@ function CanvasLayout({ columns, expandedId = null, className }) {
9185
9263
  id: column.id,
9186
9264
  minSize: column.minSize ?? 220,
9187
9265
  ...column.defaultSize !== void 0 ? { defaultSize: column.defaultSize } : {},
9188
- children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(ResizablePanelGroup, { "data-canvas-column": column.id, orientation: "vertical", children: column.panels.map((panel, pi) => /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(React54.Fragment, { children: [
9266
+ children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(ResizablePanelGroup, { "data-canvas-column": column.id, orientation: "vertical", children: column.panels.map((panel, pi) => /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(React55.Fragment, { children: [
9189
9267
  pi > 0 ? /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(ResizableHandle, { "data-canvas-gap": "row", size: "md", className: GAP }) : null,
9190
9268
  /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
9191
9269
  ResizablePanel,
@@ -9203,10 +9281,10 @@ function CanvasLayout({ columns, expandedId = null, className }) {
9203
9281
  }
9204
9282
 
9205
9283
  // src/app-shell/mode-switch.tsx
9206
- var React55 = __toESM(require("react"), 1);
9284
+ var React56 = __toESM(require("react"), 1);
9207
9285
  var import_jsx_runtime76 = require("react/jsx-runtime");
9208
9286
  function ModeSwitch({ value, onValueChange, options, label = "Mode", className }) {
9209
- const refs = React55.useRef([]);
9287
+ const refs = React56.useRef([]);
9210
9288
  const move = (from, delta) => {
9211
9289
  const next = (from + delta + options.length) % options.length;
9212
9290
  const option = options[next];
@@ -9268,7 +9346,7 @@ function ModeSwitch({ value, onValueChange, options, label = "Mode", className }
9268
9346
  }
9269
9347
 
9270
9348
  // src/organization-picker.tsx
9271
- var React56 = __toESM(require("react"), 1);
9349
+ var React57 = __toESM(require("react"), 1);
9272
9350
  var import_jsx_runtime77 = require("react/jsx-runtime");
9273
9351
  function matchesOrganizationQuery(org, query) {
9274
9352
  const q = query.trim().toLowerCase();
@@ -9330,7 +9408,7 @@ function orderOrganizationsForPicker(organizations, favoriteOrganizationIds, act
9330
9408
  }
9331
9409
 
9332
9410
  // src/desktop/organization-picker.tsx
9333
- var React57 = __toESM(require("react"), 1);
9411
+ var React58 = __toESM(require("react"), 1);
9334
9412
  var import_jsx_runtime78 = require("react/jsx-runtime");
9335
9413
  var ROLE = { owner: "Owner", admin: "Admin", member: "Member" };
9336
9414
  function roleLabel(role) {
@@ -9345,9 +9423,9 @@ function OrganizationPickerSheet({
9345
9423
  onSwitch,
9346
9424
  onToggleFavorite
9347
9425
  }) {
9348
- const [query, setQuery] = React57.useState("");
9349
- const [chosen, setChosen] = React57.useState(activeOrganizationId);
9350
- React57.useEffect(() => {
9426
+ const [query, setQuery] = React58.useState("");
9427
+ const [chosen, setChosen] = React58.useState(activeOrganizationId);
9428
+ React58.useEffect(() => {
9351
9429
  if (open) {
9352
9430
  setQuery("");
9353
9431
  setChosen(activeOrganizationId);