@flytedan/flytebot-design-system 0.56.0 → 0.58.0

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
@@ -1128,9 +1128,11 @@ import * as React10 from "react";
1128
1128
  // src/kits/cornerStack.tsx
1129
1129
  import * as React9 from "react";
1130
1130
  import { createPortal as createPortal4 } from "react-dom";
1131
+ var CORNER_STACK_INSET_PROPERTY = "--fd-corner-stack-inset";
1131
1132
  var SLOTS = ["jobs", "toasts"];
1132
1133
  var references = /* @__PURE__ */ new Map();
1133
1134
  var host = null;
1135
+ var hostObserver = null;
1134
1136
  var slotElements = /* @__PURE__ */ new Map();
1135
1137
  function createHost() {
1136
1138
  const stack = document.createElement("div");
@@ -1144,8 +1146,18 @@ function createHost() {
1144
1146
  slotElements.set(slot, element);
1145
1147
  }
1146
1148
  document.body.appendChild(stack);
1149
+ publishInset(stack);
1150
+ if (typeof ResizeObserver === "function") {
1151
+ hostObserver = new ResizeObserver(() => publishInset(stack));
1152
+ hostObserver.observe(stack);
1153
+ }
1147
1154
  return stack;
1148
1155
  }
1156
+ function publishInset(stack) {
1157
+ const height = stack.offsetHeight;
1158
+ const inset = height > 0 ? height + parseFloat(getComputedStyle(stack).bottom) : 0;
1159
+ document.documentElement.style.setProperty(CORNER_STACK_INSET_PROPERTY, `${inset}px`);
1160
+ }
1149
1161
  function acquire(slot) {
1150
1162
  host ??= createHost();
1151
1163
  references.set(slot, (references.get(slot) ?? 0) + 1);
@@ -1156,6 +1168,9 @@ function release(slot) {
1156
1168
  if (remaining > 0) references.set(slot, remaining);
1157
1169
  else references.delete(slot);
1158
1170
  if (references.size === 0 && host) {
1171
+ hostObserver?.disconnect();
1172
+ hostObserver = null;
1173
+ document.documentElement.style.removeProperty(CORNER_STACK_INSET_PROPERTY);
1159
1174
  host.remove();
1160
1175
  host = null;
1161
1176
  slotElements.clear();
@@ -1594,7 +1609,7 @@ function AppShell({
1594
1609
  /* @__PURE__ */ jsx21(
1595
1610
  "div",
1596
1611
  {
1597
- className: contentClassName,
1612
+ className: ["fd-app-shell-content", contentClassName].filter(Boolean).join(" "),
1598
1613
  style: {
1599
1614
  flex: 1,
1600
1615
  minWidth: 0,
@@ -1602,7 +1617,6 @@ function AppShell({
1602
1617
  // table) is contained and clipped by this scroller, never stretching the document.
1603
1618
  position: "relative",
1604
1619
  overflowY: "auto",
1605
- padding: 24,
1606
1620
  maxWidth: contentMaxWidth,
1607
1621
  margin: "0 auto",
1608
1622
  width: "100%",
@@ -5427,53 +5441,156 @@ function InlinePanelSurface({ panel, align = "right", ...popover }) {
5427
5441
  }
5428
5442
 
5429
5443
  // src/components/data/SortMenu.tsx
5430
- import { jsx as jsx57, jsxs as jsxs49 } from "react/jsx-runtime";
5431
- function SortMenu({ fields = [], sort, onSort, align = "right", size = "md", className = "", ...rest }) {
5444
+ import { Fragment as Fragment11, jsx as jsx57, jsxs as jsxs49 } from "react/jsx-runtime";
5445
+ var directionWord = (field, dir) => dir === "asc" ? field.numeric ? "lowest first" : "A to Z" : field.numeric ? "highest first" : "Z to A";
5446
+ function moved(sort, from, to) {
5447
+ const next = [...sort];
5448
+ const [entry] = next.splice(from, 1);
5449
+ next.splice(to, 0, entry);
5450
+ return next;
5451
+ }
5452
+ function SortMenu({
5453
+ fields = [],
5454
+ sort = [],
5455
+ onSortChange,
5456
+ multiple = false,
5457
+ align = "right",
5458
+ size = "md",
5459
+ className = "",
5460
+ ...rest
5461
+ }) {
5432
5462
  const panel = useInlinePanel();
5433
5463
  const { open: open2, setOpen, ref } = panel;
5434
- const cur = fields.find((f) => f.key === (sort && sort.key));
5435
- const dir = sort && sort.dir;
5436
- const arrow = (f, d) => {
5437
- const on = cur && cur.key === f.key && dir === d;
5438
- const label = d === "asc" ? f.numeric ? "lowest first" : "A to Z" : f.numeric ? "highest first" : "Z to A";
5439
- return /* @__PURE__ */ jsx57(
5440
- "button",
5464
+ const change = (next) => onSortChange && onSortChange(next);
5465
+ const fieldOf = (key) => fields.find((f) => f.key === key);
5466
+ const active = sort.filter((entry) => fieldOf(entry.key));
5467
+ const first = active[0];
5468
+ const firstField = first && fieldOf(first.key);
5469
+ const triggerLabel = firstField ? firstField.label + (active.length > 1 ? " +" + (active.length - 1) : "") : "Unsorted";
5470
+ const triggerTitle = active.map((entry) => {
5471
+ const field = fieldOf(entry.key);
5472
+ return field.label + " " + directionWord(field, entry.dir);
5473
+ }).join(", then ");
5474
+ const arrow = (field, dir, on, onClick) => /* @__PURE__ */ jsx57(
5475
+ "button",
5476
+ {
5477
+ type: "button",
5478
+ "aria-label": field.label + ", " + directionWord(field, dir),
5479
+ "aria-pressed": on,
5480
+ onClick,
5481
+ style: {
5482
+ display: "grid",
5483
+ placeItems: "center",
5484
+ width: 26,
5485
+ height: 26,
5486
+ borderRadius: 6,
5487
+ cursor: "pointer",
5488
+ flex: "none",
5489
+ border: "1px solid " + (on ? "var(--brand)" : "var(--border)"),
5490
+ background: on ? "var(--brand)" : "var(--surface)",
5491
+ color: on ? "#fff" : "var(--text-muted)"
5492
+ },
5493
+ children: /* @__PURE__ */ jsx57("i", { className: "ph ph-arrow-" + (dir === "asc" ? "up" : "down"), style: { fontSize: 13 } })
5494
+ }
5495
+ );
5496
+ const rowStyle = (highlight) => ({
5497
+ gap: 8,
5498
+ padding: "4px 8px",
5499
+ borderRadius: 7,
5500
+ background: highlight ? "var(--surface-brand)" : "transparent"
5501
+ });
5502
+ const labelStyle = (highlight) => ({
5503
+ flex: 1,
5504
+ minWidth: 0,
5505
+ fontWeight: highlight ? 700 : 500,
5506
+ color: highlight ? "var(--text-on-surface-brand)" : "var(--text)"
5507
+ });
5508
+ const singleBody = fields.map((f) => {
5509
+ const on = !!first && first.key === f.key;
5510
+ return /* @__PURE__ */ jsxs49("span", { className: "fd-row", style: rowStyle(on), children: [
5511
+ /* @__PURE__ */ jsx57("span", { className: "fd-body-sm", style: labelStyle(on), children: f.label }),
5512
+ arrow(f, "asc", on && first.dir === "asc", () => change([{ key: f.key, dir: "asc" }])),
5513
+ arrow(f, "desc", on && first.dir === "desc", () => change([{ key: f.key, dir: "desc" }]))
5514
+ ] }, f.key);
5515
+ });
5516
+ const unused = fields.filter((f) => !active.some((entry) => entry.key === f.key));
5517
+ const multipleBody = /* @__PURE__ */ jsxs49(Fragment11, { children: [
5518
+ /* @__PURE__ */ jsx57("span", { className: "fd-overline fd-muted", style: { padding: "4px 8px 6px" }, children: "Sorted by" }),
5519
+ active.length === 0 ? /* @__PURE__ */ jsx57("span", { className: "fd-body-sm fd-muted", style: { padding: "4px 8px" }, children: "Unsorted" }) : /* @__PURE__ */ jsx57("ol", { className: "fd-stack", style: { gap: 2, margin: 0, padding: 0, listStyle: "none" }, "aria-label": "Sort order", children: active.map((entry, index) => {
5520
+ const f = fieldOf(entry.key);
5521
+ const flipped = entry.dir === "asc" ? "desc" : "asc";
5522
+ return /* @__PURE__ */ jsxs49("li", { className: "fd-row", style: rowStyle(false), children: [
5523
+ /* @__PURE__ */ jsx57("span", { className: "fd-body-sm fd-muted", "aria-hidden": "true", style: { width: 14, flex: "none" }, children: index + 1 }),
5524
+ /* @__PURE__ */ jsx57("span", { className: "fd-body-sm", style: labelStyle(false), children: f.label }),
5525
+ /* @__PURE__ */ jsx57(
5526
+ IconButton,
5527
+ {
5528
+ size: "sm",
5529
+ variant: "outline",
5530
+ icon: entry.dir === "asc" ? "arrow-up" : "arrow-down",
5531
+ label: f.label + ", " + directionWord(f, entry.dir) + ". Switch to " + directionWord(f, flipped),
5532
+ onClick: () => change(active.map((e) => e.key === entry.key ? { key: e.key, dir: flipped } : e))
5533
+ }
5534
+ ),
5535
+ /* @__PURE__ */ jsx57(
5536
+ IconButton,
5537
+ {
5538
+ size: "sm",
5539
+ icon: "caret-up",
5540
+ label: "Sort " + f.label + " earlier",
5541
+ disabled: index === 0,
5542
+ onClick: () => change(moved(active, index, index - 1))
5543
+ }
5544
+ ),
5545
+ /* @__PURE__ */ jsx57(
5546
+ IconButton,
5547
+ {
5548
+ size: "sm",
5549
+ icon: "caret-down",
5550
+ label: "Sort " + f.label + " later",
5551
+ disabled: index === active.length - 1,
5552
+ onClick: () => change(moved(active, index, index + 1))
5553
+ }
5554
+ ),
5555
+ /* @__PURE__ */ jsx57(
5556
+ IconButton,
5557
+ {
5558
+ size: "sm",
5559
+ icon: "x",
5560
+ label: "Remove " + f.label + " from the sort",
5561
+ onClick: () => change(active.filter((e) => e.key !== entry.key))
5562
+ }
5563
+ )
5564
+ ] }, entry.key);
5565
+ }) }),
5566
+ unused.length > 0 ? /* @__PURE__ */ jsxs49(Fragment11, { children: [
5567
+ /* @__PURE__ */ jsx57("span", { className: "fd-overline fd-muted", style: { padding: "10px 8px 6px" }, children: "Add a sort" }),
5568
+ unused.map((f) => /* @__PURE__ */ jsxs49("span", { className: "fd-row", style: rowStyle(false), children: [
5569
+ /* @__PURE__ */ jsx57("span", { className: "fd-body-sm", style: labelStyle(false), children: f.label }),
5570
+ arrow(f, "asc", false, () => change([...active, { key: f.key, dir: "asc" }])),
5571
+ arrow(f, "desc", false, () => change([...active, { key: f.key, dir: "desc" }]))
5572
+ ] }, f.key))
5573
+ ] }) : null
5574
+ ] });
5575
+ return /* @__PURE__ */ jsxs49("span", { className, style: { display: "inline-flex", minWidth: 0 }, ref, ...rest, children: [
5576
+ /* @__PURE__ */ jsxs49(
5577
+ Button,
5441
5578
  {
5442
- type: "button",
5443
- "aria-label": f.label + ", " + label,
5444
- "aria-pressed": on,
5445
- onClick: () => onSort && onSort(f.key, d),
5446
- style: {
5447
- display: "grid",
5448
- placeItems: "center",
5449
- width: 26,
5450
- height: 26,
5451
- borderRadius: 6,
5452
- cursor: "pointer",
5453
- border: "1px solid " + (on ? "var(--brand)" : "var(--border)"),
5454
- background: on ? "var(--brand)" : "var(--surface)",
5455
- color: on ? "#fff" : "var(--text-muted)"
5456
- },
5457
- children: /* @__PURE__ */ jsx57("i", { className: "ph ph-arrow-" + (d === "asc" ? "up" : "down"), style: { fontSize: 13 } })
5579
+ size,
5580
+ variant: "secondary",
5581
+ icon: first && first.dir === "asc" ? "sort-ascending" : "sort-descending",
5582
+ title: triggerTitle || void 0,
5583
+ onClick: () => setOpen(!open2),
5584
+ children: [
5585
+ triggerLabel,
5586
+ /* @__PURE__ */ jsx57("i", { className: "ph ph-" + (first && first.dir === "asc" ? "arrow-up" : "arrow-down"), style: { fontSize: 12, marginLeft: 6, opacity: 0.75 } })
5587
+ ]
5458
5588
  }
5459
- );
5460
- };
5461
- return /* @__PURE__ */ jsxs49("span", { className, style: { display: "inline-flex" }, ref, ...rest, children: [
5462
- /* @__PURE__ */ jsxs49(Button, { size, variant: "secondary", icon: dir === "asc" ? "sort-ascending" : "sort-descending", onClick: () => setOpen(!open2), children: [
5463
- cur ? cur.label : "Unsorted",
5464
- /* @__PURE__ */ jsx57("i", { className: "ph ph-" + (dir === "asc" ? "arrow-up" : "arrow-down"), style: { fontSize: 12, marginLeft: 6, opacity: 0.75 } })
5465
- ] }),
5466
- /* @__PURE__ */ jsx57(InlinePanelSurface, { panel, align, offset: 6, width: 280, label: "Sort by", children: /* @__PURE__ */ jsxs49("span", { className: "fd-stack", style: { gap: 2, padding: 8 }, children: [
5589
+ ),
5590
+ /* @__PURE__ */ jsx57(InlinePanelSurface, { panel, align, offset: 6, width: multiple ? 340 : 280, label: "Sort by", children: /* @__PURE__ */ jsx57("span", { className: "fd-stack", style: { gap: 2, padding: 8 }, children: multiple ? multipleBody : /* @__PURE__ */ jsxs49(Fragment11, { children: [
5467
5591
  /* @__PURE__ */ jsx57("span", { className: "fd-overline fd-muted", style: { padding: "4px 8px 6px" }, children: "Sort by" }),
5468
- fields.map((f) => {
5469
- const active = cur && cur.key === f.key;
5470
- return /* @__PURE__ */ jsxs49("span", { className: "fd-row", style: { gap: 8, padding: "4px 8px", borderRadius: 7, background: active ? "var(--surface-brand)" : "transparent" }, children: [
5471
- /* @__PURE__ */ jsx57("span", { className: "fd-body-sm", style: { flex: 1, fontWeight: active ? 700 : 500, color: active ? "var(--text-on-surface-brand)" : "var(--text)" }, children: f.label }),
5472
- arrow(f, "asc"),
5473
- arrow(f, "desc")
5474
- ] }, f.key);
5475
- })
5476
- ] }) })
5592
+ singleBody
5593
+ ] }) }) })
5477
5594
  ] });
5478
5595
  }
5479
5596
 
@@ -6011,7 +6128,7 @@ function TransferList({
6011
6128
  cfg.header ? /* @__PURE__ */ jsx63("div", { className: "fd-tlist-header", children: cfg.header }) : null,
6012
6129
  /* @__PURE__ */ jsxs54("span", { className: "fd-row", style: { gap: 8 }, children: [
6013
6130
  /* @__PURE__ */ jsx63(SearchField, { value: cfg.search, onChange: cfg.onSearchChange, placeholder: "Search", "aria-label": (cfg.label || side) + " search", style: { flex: 1 } }),
6014
- /* @__PURE__ */ jsx63(SortMenu, { fields: cfg.sortFields, sort: cfg.sort, onSort: cfg.onSort, align: side === "left" ? "left" : "right" })
6131
+ /* @__PURE__ */ jsx63(SortMenu, { fields: cfg.sortFields, sort: cfg.sort ? [cfg.sort] : [], onSortChange: (next) => next[0] && cfg.onSort(next[0].key, next[0].dir), align: side === "left" ? "left" : "right" })
6015
6132
  ] }),
6016
6133
  /* @__PURE__ */ jsx63(
6017
6134
  VirtualList,
@@ -7734,7 +7851,7 @@ function useSessionContext() {
7734
7851
  }
7735
7852
 
7736
7853
  // src/components/platform/AccountMenu.tsx
7737
- import { Fragment as Fragment16, jsx as jsx75, jsxs as jsxs66 } from "react/jsx-runtime";
7854
+ import { Fragment as Fragment17, jsx as jsx75, jsxs as jsxs66 } from "react/jsx-runtime";
7738
7855
  var DEFAULT_LINKS = [];
7739
7856
  var DEFAULT_GROUPS = [];
7740
7857
  function Item({ item, onPick }) {
@@ -7796,7 +7913,7 @@ function AccountMenu({
7796
7913
  }
7797
7914
  };
7798
7915
  const showSwitcher = allowUserSwitch && !!demo;
7799
- return /* @__PURE__ */ jsxs66(Fragment16, { children: [
7916
+ return /* @__PURE__ */ jsxs66(Fragment17, { children: [
7800
7917
  /* @__PURE__ */ jsxs66(
7801
7918
  "button",
7802
7919
  {
@@ -8554,7 +8671,7 @@ function ProfilePage({
8554
8671
 
8555
8672
  // src/components/platform/SessionScreen.tsx
8556
8673
  import * as React55 from "react";
8557
- import { Fragment as Fragment19, jsx as jsx80, jsxs as jsxs71 } from "react/jsx-runtime";
8674
+ import { Fragment as Fragment20, jsx as jsx80, jsxs as jsxs71 } from "react/jsx-runtime";
8558
8675
  var COPY = {
8559
8676
  "signing-in": { busy: "Signing you in\u2026" },
8560
8677
  "session-expired": { busy: "Your session expired \u2014 signing you back in\u2026" },
@@ -8582,7 +8699,7 @@ function SessionScreen({ kind, error, onRetry, productName }) {
8582
8699
  /* @__PURE__ */ jsx80("div", { className: "fd-session-screen-stripe" }),
8583
8700
  /* @__PURE__ */ jsx80(Card, { children: /* @__PURE__ */ jsxs71("div", { className: "fd-session-screen-body", children: [
8584
8701
  /* @__PURE__ */ jsx80("h1", { ref: titleRef, tabIndex: -1, className: "fd-h3 fd-session-screen-title", children: productName }),
8585
- /* @__PURE__ */ jsx80("div", { role: "status", "aria-live": "polite", className: "fd-session-screen-status", children: busyMessage !== null ? /* @__PURE__ */ jsxs71(Fragment19, { children: [
8702
+ /* @__PURE__ */ jsx80("div", { role: "status", "aria-live": "polite", className: "fd-session-screen-status", children: busyMessage !== null ? /* @__PURE__ */ jsxs71(Fragment20, { children: [
8586
8703
  /* @__PURE__ */ jsx80("span", { className: "fd-spinner fd-spinner-lg fd-session-screen-spinner", "aria-hidden": "true" }),
8587
8704
  /* @__PURE__ */ jsx80("p", { className: "fd-body fd-session-screen-message", children: announced })
8588
8705
  ] }) : null }),
@@ -10609,7 +10726,7 @@ function RoadmapTimeline({ onOpenFlag, title = "Roadmap", lede }) {
10609
10726
  // src/components/platform/ComingSoon.tsx
10610
10727
  import * as React59 from "react";
10611
10728
  import { createPortal as createPortal6 } from "react-dom";
10612
- import { Fragment as Fragment21, jsx as jsx82, jsxs as jsxs73 } from "react/jsx-runtime";
10729
+ import { Fragment as Fragment22, jsx as jsx82, jsxs as jsxs73 } from "react/jsx-runtime";
10613
10730
  var BYPASS_STORE = "fd.soon.bypass.v1";
10614
10731
  function readBypassed() {
10615
10732
  try {
@@ -10639,7 +10756,7 @@ function useBypass(key) {
10639
10756
  return [on, set];
10640
10757
  }
10641
10758
  function SoonCard({ label, detail, backend, eta, effort, onRoadmap, allowed, onBypass }) {
10642
- return /* @__PURE__ */ jsxs73(Fragment21, { children: [
10759
+ return /* @__PURE__ */ jsxs73(Fragment22, { children: [
10643
10760
  /* @__PURE__ */ jsxs73("span", { className: "fd-soon-badge", children: [
10644
10761
  /* @__PURE__ */ jsx82("i", { className: "ph ph-traffic-cone", "aria-hidden": "true" }),
10645
10762
  label
@@ -11029,7 +11146,7 @@ function PermissionHint({ perm, children }) {
11029
11146
  }
11030
11147
 
11031
11148
  // src/components/platform/ModeSwitch.tsx
11032
- import { Fragment as Fragment22, jsx as jsx84, jsxs as jsxs75 } from "react/jsx-runtime";
11149
+ import { Fragment as Fragment23, jsx as jsx84, jsxs as jsxs75 } from "react/jsx-runtime";
11033
11150
  function ModeSwitch({ canToggle = false, requestCount = 0, onClearLog, renderLog, onOpenSpec, summary }) {
11034
11151
  const mode2 = useRuntimeMode();
11035
11152
  const panel = useInlinePanel();
@@ -11084,7 +11201,7 @@ function ModeSwitch({ canToggle = false, requestCount = 0, onClearLog, renderLog
11084
11201
  s.total,
11085
11202
  " features complete"
11086
11203
  ] }),
11087
- onOpenSpec ? /* @__PURE__ */ jsxs75(Fragment22, { children: [
11204
+ onOpenSpec ? /* @__PURE__ */ jsxs75(Fragment23, { children: [
11088
11205
  /* @__PURE__ */ jsx84("span", { style: { flex: 1 } }),
11089
11206
  /* @__PURE__ */ jsxs75("button", { type: "button", className: "fd-soon-link", onClick: () => {
11090
11207
  setOpen(false);
@@ -11276,7 +11393,7 @@ function SaturationDistribution({ campuses = [], floorBand, floorScore, onSelect
11276
11393
 
11277
11394
  // src/components/planner/MixGap.tsx
11278
11395
  import * as React60 from "react";
11279
- import { Fragment as Fragment23, jsx as jsx87, jsxs as jsxs78 } from "react/jsx-runtime";
11396
+ import { Fragment as Fragment24, jsx as jsx87, jsxs as jsxs78 } from "react/jsx-runtime";
11280
11397
  var MIX_GAP_LAYOUT = {
11281
11398
  trackHeight: 30,
11282
11399
  barHeight: 20,
@@ -11320,7 +11437,7 @@ function MixGap({ rows = [], loading = false, className = "" }) {
11320
11437
  onMouseLeave: () => setHover(null),
11321
11438
  children: [
11322
11439
  /* @__PURE__ */ jsx87("span", { style: { width: 128, flex: "none" }, children: /* @__PURE__ */ jsx87(ChannelTag, { channel: r.channel, size: "sm" }) }),
11323
- /* @__PURE__ */ jsx87("span", { style: { position: "relative", flex: 1, height: trackHeight, minWidth: 120 }, children: loading ? /* @__PURE__ */ jsx87("span", { className: "fd-skel", style: { position: "absolute", left: 0, right: 0, top: barTop, height: barHeight, borderRadius: 3 } }) : /* @__PURE__ */ jsxs78(Fragment23, { children: [
11440
+ /* @__PURE__ */ jsx87("span", { style: { position: "relative", flex: 1, height: trackHeight, minWidth: 120 }, children: loading ? /* @__PURE__ */ jsx87("span", { className: "fd-skel", style: { position: "absolute", left: 0, right: 0, top: barTop, height: barHeight, borderRadius: 3 } }) : /* @__PURE__ */ jsxs78(Fragment24, { children: [
11324
11441
  /* @__PURE__ */ jsx87("span", { "data-mixgap-bar": "", style: { position: "absolute", left: 0, top: barTop, height: barHeight, width: mixGapOffset(r.realized, max), background: TONE[tone], borderRadius: "2px 3px 3px 2px", transition: "width var(--dur-slow) var(--ease), background var(--dur-base) var(--ease)" } }),
11325
11442
  /* @__PURE__ */ jsx87("span", { "data-mixgap-target": "", style: { position: "absolute", left: `calc(${mixGapOffset(r.target, max)} - ${targetWidth / 2}px)`, top: 0, width: targetWidth, height: trackHeight, background: MIX_GAP_TARGET_STRIPE, borderRadius: 1 } }),
11326
11443
  /* @__PURE__ */ jsxs78("span", { "data-mixgap-label": "", className: "fd-num", style: { position: "absolute", left: labelLeft, top: "50%", transform: "translateY(-50%)", fontSize: 12, color: "var(--text-muted)", whiteSpace: "nowrap" }, children: [
@@ -11434,7 +11551,7 @@ function ChannelContribution({
11434
11551
 
11435
11552
  // src/components/planner/BudgetReallocator.tsx
11436
11553
  import * as React61 from "react";
11437
- import { Fragment as Fragment24, jsx as jsx89, jsxs as jsxs80 } from "react/jsx-runtime";
11554
+ import { Fragment as Fragment25, jsx as jsx89, jsxs as jsxs80 } from "react/jsx-runtime";
11438
11555
  var bandFor = (crp) => crp >= 200 ? "dominant" : crp >= 100 ? "strong" : crp >= 50 ? "adequate" : "weak";
11439
11556
  function BudgetReallocator({
11440
11557
  campus,
@@ -11498,7 +11615,7 @@ function BudgetReallocator({
11498
11615
  /* @__PURE__ */ jsxs80("div", { className: "fd-row", style: { gap: 12, flexWrap: "wrap" }, children: [
11499
11616
  /* @__PURE__ */ jsx89("span", { className: "fd-h4", style: { flex: 1, minWidth: 140 }, children: campus }),
11500
11617
  /* @__PURE__ */ jsx89(CsiBadge, { band: nowBand, crp, size: "medium" }),
11501
- dirty ? /* @__PURE__ */ jsxs80(Fragment24, { children: [
11618
+ dirty ? /* @__PURE__ */ jsxs80(Fragment25, { children: [
11502
11619
  /* @__PURE__ */ jsx89("i", { className: "ph ph-arrow-right fd-muted", "aria-hidden": "true" }),
11503
11620
  /* @__PURE__ */ jsx89(CsiBadge, { band: nextBand, crp: nextCrp, size: "medium", preview: true })
11504
11621
  ] }) : null
@@ -13437,7 +13554,7 @@ function FileViewer({ file, resolveUrl, sidePanel, sidePanelLabel = "Details", o
13437
13554
 
13438
13555
  // src/components/files/FileBrowser.tsx
13439
13556
  import * as React70 from "react";
13440
- import { Fragment as Fragment28, jsx as jsx99, jsxs as jsxs90 } from "react/jsx-runtime";
13557
+ import { Fragment as Fragment29, jsx as jsx99, jsxs as jsxs90 } from "react/jsx-runtime";
13441
13558
  function childrenOf(folders, parentId) {
13442
13559
  return folders.filter((f) => f.parentId === parentId).sort((a, b) => a.name.localeCompare(b.name));
13443
13560
  }
@@ -13736,7 +13853,7 @@ function FileBrowser({
13736
13853
  ] }),
13737
13854
  /* @__PURE__ */ jsxs90("span", { className: "fd-fb-actions", children: [
13738
13855
  canCreateFolder ? /* @__PURE__ */ jsx99(Button, { variant: "secondary", size: "sm", icon: "folder-simple-plus", onClick: openCreate, children: "New folder" }) : null,
13739
- canUpload ? /* @__PURE__ */ jsxs90(Fragment28, { children: [
13856
+ canUpload ? /* @__PURE__ */ jsxs90(Fragment29, { children: [
13740
13857
  /* @__PURE__ */ jsx99(Button, { variant: "secondary", size: "sm", icon: "upload-simple", onClick: () => uploadInputRef.current && uploadInputRef.current.click(), children: "Upload" }),
13741
13858
  /* @__PURE__ */ jsx99(
13742
13859
  "input",
@@ -13803,7 +13920,7 @@ function FileBrowser({
13803
13920
  draggableId: canMove ? { kind: "folder", id: f.id } : void 0,
13804
13921
  isDropTarget: canMove,
13805
13922
  onDropPayload: (p) => moveIntoFolder(p, f.id),
13806
- actions: /* @__PURE__ */ jsxs90(Fragment28, { children: [
13923
+ actions: /* @__PURE__ */ jsxs90(Fragment29, { children: [
13807
13924
  canRenameFolder ? /* @__PURE__ */ jsx99(IconButton, { icon: "pencil-simple", label: "Rename " + f.name, size: "sm", variant: "ghost", onClick: () => openRename(f) }) : null,
13808
13925
  canMove ? /* @__PURE__ */ jsx99(
13809
13926
  FolderPickerMenu,
@@ -13826,7 +13943,7 @@ function FileBrowser({
13826
13943
  meta: file.size ? formatBytes(file.size) : void 0,
13827
13944
  onOpen: onOpenFile ? () => onOpenFile(file) : void 0,
13828
13945
  draggableId: canMove ? { kind: "file", id: file.id } : void 0,
13829
- actions: /* @__PURE__ */ jsxs90(Fragment28, { children: [
13946
+ actions: /* @__PURE__ */ jsxs90(Fragment29, { children: [
13830
13947
  canMove ? /* @__PURE__ */ jsx99(
13831
13948
  FolderPickerMenu,
13832
13949
  {
@@ -13844,7 +13961,7 @@ function FileBrowser({
13844
13961
  }
13845
13962
  ) })
13846
13963
  ] }),
13847
- /* @__PURE__ */ jsx99(Modal, { open: createOpen, title: "New folder", onClose: () => setCreateOpen(false), footer: /* @__PURE__ */ jsxs90(Fragment28, { children: [
13964
+ /* @__PURE__ */ jsx99(Modal, { open: createOpen, title: "New folder", onClose: () => setCreateOpen(false), footer: /* @__PURE__ */ jsxs90(Fragment29, { children: [
13848
13965
  /* @__PURE__ */ jsx99(Button, { variant: "secondary", onClick: () => setCreateOpen(false), children: "Cancel" }),
13849
13966
  /* @__PURE__ */ jsx99(Button, { onClick: submitCreate, disabled: !createName.trim(), children: "Create" })
13850
13967
  ] }), children: /* @__PURE__ */ jsx99(
@@ -13861,7 +13978,7 @@ function FileBrowser({
13861
13978
  autoFocus: true
13862
13979
  }
13863
13980
  ) }),
13864
- /* @__PURE__ */ jsx99(Modal, { open: renameTarget != null, title: "Rename folder", onClose: () => setRenameTarget(null), footer: /* @__PURE__ */ jsxs90(Fragment28, { children: [
13981
+ /* @__PURE__ */ jsx99(Modal, { open: renameTarget != null, title: "Rename folder", onClose: () => setRenameTarget(null), footer: /* @__PURE__ */ jsxs90(Fragment29, { children: [
13865
13982
  /* @__PURE__ */ jsx99(Button, { variant: "secondary", onClick: () => setRenameTarget(null), children: "Cancel" }),
13866
13983
  /* @__PURE__ */ jsx99(Button, { onClick: submitRename, disabled: !renameValue.trim(), children: "Save" })
13867
13984
  ] }), children: /* @__PURE__ */ jsx99(
@@ -13885,7 +14002,7 @@ function FileBrowser({
13885
14002
  title: deleteTarget ? "Delete \u201C" + deleteTarget.name + "\u201D?" : "Delete folder?",
13886
14003
  description: "This can't be undone. The folder must be empty.",
13887
14004
  onClose: () => setDeleteTarget(null),
13888
- footer: /* @__PURE__ */ jsxs90(Fragment28, { children: [
14005
+ footer: /* @__PURE__ */ jsxs90(Fragment29, { children: [
13889
14006
  /* @__PURE__ */ jsx99(Button, { variant: "secondary", onClick: () => setDeleteTarget(null), children: "Cancel" }),
13890
14007
  /* @__PURE__ */ jsx99(Button, { variant: "danger", onClick: confirmDelete, children: "Delete" })
13891
14008
  ] })
@@ -14351,6 +14468,7 @@ export {
14351
14468
  CHANNEL_WEIGHTS,
14352
14469
  CHAT_UNAVAILABLE,
14353
14470
  COPIED_FEEDBACK_MS,
14471
+ CORNER_STACK_INSET_PROPERTY,
14354
14472
  Calendar,
14355
14473
  Card,
14356
14474
  CardGrid,