@lovett/ui 0.0.5 → 0.0.7

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 (56) hide show
  1. package/dist/index.d.ts +279 -115
  2. package/dist/index.js +479 -66
  3. package/dist/index.js.map +1 -1
  4. package/dist/styles.css +74 -0
  5. package/dist/tokens.css +181 -60
  6. package/package.json +16 -4
  7. package/src/__tests__/button.test.tsx +137 -0
  8. package/src/__tests__/card.test.tsx +103 -0
  9. package/src/__tests__/dead-render.test.tsx +117 -0
  10. package/src/__tests__/input.test.tsx +134 -0
  11. package/src/__tests__/modal.test.tsx +154 -0
  12. package/src/__tests__/page-shell.test.tsx +128 -0
  13. package/src/__tests__/setup.ts +43 -0
  14. package/src/__tests__/token-shape.test.ts +193 -0
  15. package/src/card.tsx +1 -1
  16. package/src/collapsible-card.tsx +85 -0
  17. package/src/data-grid/table-body.tsx +8 -1
  18. package/src/dropdown-menu.tsx +1 -1
  19. package/src/floating-status-bar.tsx +1 -1
  20. package/src/folder-tree-picker.tsx +5 -6
  21. package/src/frame-stack.tsx +27 -10
  22. package/src/hero-form-card.tsx +2 -2
  23. package/src/icons/brand.tsx +187 -0
  24. package/src/index.ts +32 -0
  25. package/src/lib/clipboard.ts +14 -0
  26. package/src/lib/color.ts +111 -0
  27. package/src/meta-cell.tsx +52 -0
  28. package/src/meta-previews/MetaFeedCarousel.tsx +1 -1
  29. package/src/meta-previews/MetaFeedPreview.tsx +1 -1
  30. package/src/modal.tsx +77 -6
  31. package/src/pill-button.tsx +23 -5
  32. package/src/profile-section.tsx +40 -9
  33. package/src/sortable-table.tsx +5 -1
  34. package/src/styles.css +74 -0
  35. package/src/tabs.tsx +4 -0
  36. package/src/tag-chip-input.tsx +1 -1
  37. package/src/theme-v2.css +466 -0
  38. package/src/tokens.css +181 -60
  39. package/src/v2/README.md +208 -0
  40. package/src/v2/__demo__/showcase.tsx +1045 -0
  41. package/src/v2/action.tsx +91 -0
  42. package/src/v2/callout.tsx +76 -0
  43. package/src/v2/document-section.tsx +82 -0
  44. package/src/v2/document-shell.tsx +0 -0
  45. package/src/v2/field-row.tsx +113 -0
  46. package/src/v2/icons.tsx +165 -0
  47. package/src/v2/index.ts +147 -0
  48. package/src/v2/layout.tsx +293 -0
  49. package/src/v2/progress-track.tsx +89 -0
  50. package/src/v2/stat-tile.tsx +129 -0
  51. package/src/v2/states.tsx +271 -0
  52. package/src/v2/status-pill.tsx +74 -0
  53. package/src/v2/theme.css +1861 -0
  54. package/src/v2/timeline.tsx +81 -0
  55. package/src/v2/tokens.ts +228 -0
  56. package/src/value-chip.tsx +76 -0
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
5
  import { Minus, Check, EyeOff, Eye, ChevronDown, Search, Play, VolumeX, Volume2, X, Pencil, GripVertical, Loader2, ChevronUp, ChevronsUpDown, ChevronLeft, ChevronRight, SlidersHorizontal, Copy, Plus, FolderClosed, FolderPlus, Folder, Paperclip, Upload, Image, Code, Table as Table$1, FileText, FileType, AlertCircle, RotateCcw, Link2, ArrowRight, MoreHorizontal, ThumbsUp as ThumbsUp$1, MessageCircle, Share2, Lock, Info, BarChart3, ExternalLink } from 'lucide-react';
6
6
  import { createPortal } from 'react-dom';
7
7
  import { Link } from 'react-router-dom';
8
- import { Toaster as Toaster$1, toast } from 'sonner';
8
+ import { toast, Toaster as Toaster$1 } from 'sonner';
9
9
  export { toast } from 'sonner';
10
10
  import { useSensors, useSensor, PointerSensor, KeyboardSensor, DndContext, closestCenter } from '@dnd-kit/core';
11
11
  import { sortableKeyboardCoordinates, SortableContext, horizontalListSortingStrategy, rectSortingStrategy, verticalListSortingStrategy, useSortable, arrayMove } from '@dnd-kit/sortable';
@@ -17,7 +17,7 @@ import css from 'react-syntax-highlighter/dist/esm/languages/prism/css';
17
17
  import diff from 'react-syntax-highlighter/dist/esm/languages/prism/diff';
18
18
  import javascript from 'react-syntax-highlighter/dist/esm/languages/prism/javascript';
19
19
  import json from 'react-syntax-highlighter/dist/esm/languages/prism/json';
20
- import jsx62 from 'react-syntax-highlighter/dist/esm/languages/prism/jsx';
20
+ import jsx66 from 'react-syntax-highlighter/dist/esm/languages/prism/jsx';
21
21
  import markdown from 'react-syntax-highlighter/dist/esm/languages/prism/markdown';
22
22
  import markup from 'react-syntax-highlighter/dist/esm/languages/prism/markup';
23
23
  import python from 'react-syntax-highlighter/dist/esm/languages/prism/python';
@@ -167,7 +167,7 @@ function MetaItem({
167
167
  style: { color: "rgb(var(--text-tertiary))" },
168
168
  children: [
169
169
  icon && /* @__PURE__ */ jsx("span", { style: { opacity: 0.7 }, className: "shrink-0 inline-flex", children: icon }),
170
- /* @__PURE__ */ jsx("span", { className: "truncate tnum", children })
170
+ /* @__PURE__ */ jsx("span", { className: "truncate tabular-nums", children })
171
171
  ]
172
172
  }
173
173
  );
@@ -291,6 +291,59 @@ Card2.ActionButton = ActionButton;
291
291
  Card2.IconTile = IconTile;
292
292
  Card2.TagRow = TagRow;
293
293
  var card_default = Card2;
294
+ function CollapsibleCard({
295
+ title,
296
+ icon,
297
+ meta,
298
+ actions,
299
+ defaultOpen = true,
300
+ contentClassName = "px-4 py-4",
301
+ children
302
+ }) {
303
+ const [open, setOpen] = useState(defaultOpen);
304
+ const bodyId = useId();
305
+ return /* @__PURE__ */ jsxs(card_default, { children: [
306
+ /* @__PURE__ */ jsxs(
307
+ "div",
308
+ {
309
+ className: "flex items-center justify-between gap-3 px-4 py-3",
310
+ style: {
311
+ borderBottom: `1px solid ${open ? "rgb(var(--border))" : "transparent"}`
312
+ },
313
+ children: [
314
+ /* @__PURE__ */ jsxs(
315
+ "button",
316
+ {
317
+ type: "button",
318
+ onClick: () => setOpen((o) => !o),
319
+ "aria-expanded": open,
320
+ "aria-controls": bodyId,
321
+ className: "flex min-w-0 flex-1 items-center gap-2 rounded-[var(--radius-sm)] py-0.5 text-left transition-colors focus-visible:outline-none focus-visible:[box-shadow:var(--ring-focus)]",
322
+ children: [
323
+ /* @__PURE__ */ jsx(
324
+ ChevronDown,
325
+ {
326
+ className: "h-4 w-4 shrink-0 transition-transform duration-200 ease-out motion-reduce:transition-none",
327
+ style: {
328
+ color: "rgb(var(--text-tertiary))",
329
+ transform: open ? "rotate(0deg)" : "rotate(-90deg)"
330
+ },
331
+ "aria-hidden": "true"
332
+ }
333
+ ),
334
+ icon,
335
+ /* @__PURE__ */ jsx("span", { className: "truncate text-[14px] font-semibold", style: { color: "rgb(var(--foreground))" }, children: title }),
336
+ meta
337
+ ]
338
+ }
339
+ ),
340
+ actions && /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-2", children: actions })
341
+ ]
342
+ }
343
+ ),
344
+ open && /* @__PURE__ */ jsx("div", { id: bodyId, className: contentClassName, children })
345
+ ] });
346
+ }
294
347
  var VARIANT_CLASS = {
295
348
  primary: "btn-primary",
296
349
  secondary: "btn-secondary",
@@ -457,24 +510,60 @@ function Modal({ isOpen, onClose, title, children, className }) {
457
510
  ),
458
511
  style: { borderRadius: "var(--radius-xl)" },
459
512
  children: [
460
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between shrink-0 px-6 pt-6 pb-4", children: [
461
- /* @__PURE__ */ jsx("h2", { className: "text-xl font-bold text-[rgb(var(--foreground))]", children: title }),
513
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3 shrink-0 px-4 py-3", children: [
514
+ /* @__PURE__ */ jsx("h2", { className: "text-[15px] font-bold tracking-[-0.01em] text-[rgb(var(--foreground))]", children: title }),
462
515
  /* @__PURE__ */ jsx(
463
516
  "button",
464
517
  {
465
518
  onClick: onClose,
466
- className: "rounded-lg p-1.5 text-[rgb(var(--muted-foreground))] hover:bg-[rgb(var(--muted))] hover:text-[rgb(var(--foreground))] transition-colors",
519
+ className: "inline-flex items-center justify-center w-6 h-6 shrink-0 rounded-[var(--radius-sm)] text-[rgb(var(--text-tertiary))] hover:bg-[rgb(var(--surface-hover))] hover:text-[rgb(var(--foreground))] transition-colors",
467
520
  "aria-label": "Close",
468
- children: /* @__PURE__ */ jsx(X, { className: "h-5 w-5" })
521
+ children: /* @__PURE__ */ jsx(X, { className: "h-[15px] w-[15px]" })
469
522
  }
470
523
  )
471
524
  ] }),
472
- children
525
+ renderBody(children)
473
526
  ]
474
527
  }
475
528
  )
476
529
  ] });
477
530
  }
531
+ function renderBody(children) {
532
+ const kids = Children.toArray(children);
533
+ const tray = kids.find(
534
+ (c) => isValidElement(c) && c.type === Tray2
535
+ );
536
+ const footer = kids.find(
537
+ (c) => isValidElement(c) && c.type === Footer
538
+ );
539
+ if (!tray || !footer) return children;
540
+ const rest = kids.filter((c) => c !== tray && c !== footer);
541
+ const trayProps = tray.props;
542
+ const footerProps = footer.props;
543
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
544
+ rest,
545
+ /* @__PURE__ */ jsxs("div", { className: "ds-card-tray flex flex-col flex-1 min-h-0", children: [
546
+ /* @__PURE__ */ jsx(
547
+ "div",
548
+ {
549
+ ...trayProps,
550
+ className: cn("flex-1 min-h-0 overflow-y-auto p-5", trayProps.className)
551
+ }
552
+ ),
553
+ /* @__PURE__ */ jsx(
554
+ "div",
555
+ {
556
+ ...footerProps,
557
+ className: cn(
558
+ "flex items-center justify-end gap-2 shrink-0 px-5 py-3.5 border-t",
559
+ footerProps.className
560
+ ),
561
+ style: { borderColor: "rgb(var(--border))", ...footerProps.style }
562
+ }
563
+ )
564
+ ] })
565
+ ] });
566
+ }
478
567
  function Tray2({ className, ...rest }) {
479
568
  return /* @__PURE__ */ jsx(
480
569
  "div",
@@ -863,10 +952,14 @@ function SectionHead({ icon, title, subtitle, actions }) {
863
952
  const sizedIcon = isValidElement(icon) ? cloneElement(
864
953
  icon,
865
954
  {
955
+ // Sizing rides on `size`, which Lucide honours. A previous
956
+ // `h-[${HEAD_ICON_SIZE}px]` here never did anything: Tailwind
957
+ // scans source statically, so an interpolated class is never
958
+ // generated. Keep the literal in sync with HEAD_ICON_SIZE.
866
959
  size: HEAD_ICON_SIZE,
867
960
  className: cn(
868
961
  icon.props.className,
869
- `h-[${HEAD_ICON_SIZE}px] w-[${HEAD_ICON_SIZE}px]`
962
+ "h-[17px] w-[17px]"
870
963
  )
871
964
  }
872
965
  ) : icon;
@@ -1045,12 +1138,13 @@ function ProfileSection(props) {
1045
1138
  }
1046
1139
  ) : props.actions ?? /* @__PURE__ */ jsx(ActionButton3, { label: "Edit", children: /* @__PURE__ */ jsx(Pencil, { className: "h-[14px] w-[14px]" }) });
1047
1140
  const children = editable ? props.children(isEditing) : props.children;
1141
+ const flat = props.flat ?? false;
1048
1142
  return /* @__PURE__ */ jsxs(
1049
1143
  "section",
1050
1144
  {
1051
1145
  id,
1052
1146
  "data-section-id": id,
1053
- "data-framed": "true",
1147
+ "data-framed": flat ? void 0 : "true",
1054
1148
  className: cn("ds-card-surface flex flex-col", className),
1055
1149
  style: { scrollMarginTop: "var(--section-scroll-offset)" },
1056
1150
  children: [
@@ -1063,7 +1157,24 @@ function ProfileSection(props) {
1063
1157
  actions: headActions
1064
1158
  }
1065
1159
  ),
1066
- /* @__PURE__ */ jsx("div", { className: "ds-card-tray p-5", style: { flex: "1 1 auto" }, children }),
1160
+ flat ? (
1161
+ /* One surface. The divider does the separating that the tray's
1162
+ fill does in the default shape. */
1163
+ /* @__PURE__ */ jsx(
1164
+ "div",
1165
+ {
1166
+ className: "px-4 pb-4 pt-4 border-t",
1167
+ style: { flex: "1 1 auto", borderColor: "rgb(var(--border))" },
1168
+ children
1169
+ }
1170
+ )
1171
+ ) : (
1172
+ /* flex:1 lets the tray fill remaining height when the section is
1173
+ stretched (e.g. side-by-side in an equal-height grid), so trays
1174
+ bottom-align instead of leaving a gap under a shorter-header card.
1175
+ No effect on un-stretched (vertically-stacked) sections. */
1176
+ /* @__PURE__ */ jsx("div", { className: "ds-card-tray p-5", style: { flex: "1 1 auto" }, children })
1177
+ ),
1067
1178
  foot && /* @__PURE__ */ jsx(Foot2, { ...foot })
1068
1179
  ]
1069
1180
  }
@@ -1374,6 +1485,147 @@ function MicrosoftLogo({ size = 18, className }) {
1374
1485
  }
1375
1486
  );
1376
1487
  }
1488
+ function BrandMeta({ size = 16, className }) {
1489
+ return /* @__PURE__ */ jsxs(
1490
+ "svg",
1491
+ {
1492
+ width: size,
1493
+ height: size,
1494
+ viewBox: "-5.12 -5.12 266.24 180.28",
1495
+ className,
1496
+ "aria-hidden": "true",
1497
+ focusable: "false",
1498
+ children: [
1499
+ /* @__PURE__ */ jsx("path", { d: "M27.651 112.136c0 9.775 2.146 17.28 4.95 21.82c3.677 5.947 9.16 8.466 14.751 8.466c7.211 0 13.808-1.79 26.52-19.372c10.185-14.092 22.186-33.874 30.26-46.275l13.675-21.01c9.499-14.591 20.493-30.811 33.1-41.806C161.196 4.985 172.298 0 183.47 0c18.758 0 36.625 10.87 50.3 31.257C248.735 53.584 256 81.707 256 110.729c0 17.253-3.4 29.93-9.187 39.946c-5.591 9.686-16.488 19.363-34.818 19.363v-27.616c15.695 0 19.612-14.422 19.612-30.927c0-23.52-5.484-49.623-17.564-68.273c-8.574-13.23-19.684-21.313-31.907-21.313c-13.22 0-23.859 9.97-35.815 27.75c-6.356 9.445-12.882 20.956-20.208 33.944l-8.066 14.289c-16.203 28.728-20.307 35.271-28.408 46.07c-14.2 18.91-26.324 26.076-42.287 26.076c-18.935 0-30.91-8.2-38.325-20.556C2.973 139.413 0 126.202 0 111.148z", fill: "currentColor" }),
1500
+ /* @__PURE__ */ jsx("path", { d: "M21.802 33.206C34.48 13.666 52.774 0 73.757 0C85.91 0 97.99 3.597 110.605 13.897c13.798 11.261 28.505 29.805 46.853 60.368l6.58 10.967c15.881 26.459 24.917 40.07 30.205 46.49c6.802 8.243 11.565 10.7 17.752 10.7c15.695 0 19.612-14.422 19.612-30.927l24.393-.766c0 17.253-3.4 29.93-9.187 39.946c-5.591 9.686-16.488 19.363-34.818 19.363c-11.395 0-21.49-2.475-32.654-13.007c-8.582-8.083-18.615-22.443-26.334-35.352l-22.96-38.352C118.528 64.08 107.96 49.73 101.845 43.23c-6.578-6.988-15.036-15.428-28.532-15.428c-10.923 0-20.2 7.666-27.963 19.39z", fill: "currentColor" }),
1501
+ /* @__PURE__ */ jsx("path", { d: "M73.312 27.802c-10.923 0-20.2 7.666-27.963 19.39c-10.976 16.568-17.698 41.245-17.698 64.944c0 9.775 2.146 17.28 4.95 21.82L9.027 149.482C2.973 139.413 0 126.202 0 111.148C0 83.772 7.514 55.24 21.802 33.206C34.48 13.666 52.774 0 73.757 0z", fill: "currentColor" })
1502
+ ]
1503
+ }
1504
+ );
1505
+ }
1506
+ function BrandFacebook({ size = 16, className }) {
1507
+ return /* @__PURE__ */ jsx(
1508
+ "svg",
1509
+ {
1510
+ width: size,
1511
+ height: size,
1512
+ viewBox: "-5.12 -5.12 266.24 264.69",
1513
+ className,
1514
+ "aria-hidden": "true",
1515
+ focusable: "false",
1516
+ children: /* @__PURE__ */ jsx("path", { d: "M256 128C256 57.308 198.692 0 128 0S0 57.308 0 128c0 63.888 46.808 116.843 108 126.445V165H75.5v-37H108V99.8c0-32.08 19.11-49.8 48.348-49.8C170.352 50 185 52.5 185 52.5V84h-16.14C152.959 84 148 93.867 148 103.99V128h35.5l-5.675 37H148v89.445c61.192-9.602 108-62.556 108-126.445", fill: "currentColor" })
1517
+ }
1518
+ );
1519
+ }
1520
+ function BrandInstagram({ size = 16, className }) {
1521
+ return /* @__PURE__ */ jsx(
1522
+ "svg",
1523
+ {
1524
+ width: size,
1525
+ height: size,
1526
+ viewBox: "-5.12 -5.12 266.24 266.24",
1527
+ className,
1528
+ "aria-hidden": "true",
1529
+ focusable: "false",
1530
+ children: /* @__PURE__ */ jsx("path", { d: "M128 23.064c34.177 0 38.225.13 51.722.745c12.48.57 19.258 2.655 23.769 4.408c5.974 2.322 10.238 5.096 14.717 9.575s7.253 8.743 9.575 14.717c1.753 4.511 3.838 11.289 4.408 23.768c.615 13.498.745 17.546.745 51.723s-.13 38.226-.745 51.723c-.57 12.48-2.655 19.257-4.408 23.768c-2.322 5.974-5.096 10.239-9.575 14.718s-8.743 7.253-14.717 9.574c-4.511 1.753-11.289 3.839-23.769 4.408c-13.495.616-17.543.746-51.722.746s-38.228-.13-51.723-.746c-12.48-.57-19.257-2.655-23.768-4.408c-5.974-2.321-10.239-5.095-14.718-9.574c-4.479-4.48-7.253-8.744-9.574-14.718c-1.753-4.51-3.839-11.288-4.408-23.768c-.616-13.497-.746-17.545-.746-51.723s.13-38.225.746-51.722c.57-12.48 2.655-19.258 4.408-23.769c2.321-5.974 5.095-10.238 9.574-14.717c4.48-4.48 8.744-7.253 14.718-9.575c4.51-1.753 11.288-3.838 23.768-4.408c13.497-.615 17.545-.745 51.723-.745M128 0C93.237 0 88.878.147 75.226.77c-13.625.622-22.93 2.786-31.071 5.95c-8.418 3.271-15.556 7.648-22.672 14.764S9.991 35.738 6.72 44.155C3.555 52.297 1.392 61.602.77 75.226C.147 88.878 0 93.237 0 128s.147 39.122.77 52.774c.622 13.625 2.785 22.93 5.95 31.071c3.27 8.417 7.647 15.556 14.763 22.672s14.254 11.492 22.672 14.763c8.142 3.165 17.446 5.328 31.07 5.95c13.653.623 18.012.77 52.775.77s39.122-.147 52.774-.77c13.624-.622 22.929-2.785 31.07-5.95c8.418-3.27 15.556-7.647 22.672-14.763s11.493-14.254 14.764-22.672c3.164-8.142 5.328-17.446 5.95-31.07c.623-13.653.77-18.012.77-52.775s-.147-39.122-.77-52.774c-.622-13.624-2.786-22.929-5.95-31.07c-3.271-8.418-7.648-15.556-14.764-22.672S220.262 9.99 211.845 6.72c-8.142-3.164-17.447-5.328-31.071-5.95C167.122.147 162.763 0 128 0m0 62.27c-36.302 0-65.73 29.43-65.73 65.73s29.428 65.73 65.73 65.73c36.301 0 65.73-29.428 65.73-65.73c0-36.301-29.429-65.73-65.73-65.73m0 108.397c-23.564 0-42.667-19.103-42.667-42.667S104.436 85.333 128 85.333s42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667m83.686-110.994c0 8.484-6.876 15.36-15.36 15.36s-15.36-6.876-15.36-15.36s6.877-15.36 15.36-15.36s15.36 6.877 15.36 15.36", fill: "currentColor" })
1531
+ }
1532
+ );
1533
+ }
1534
+ function BrandMessenger({ size = 16, className }) {
1535
+ return /* @__PURE__ */ jsx(
1536
+ "svg",
1537
+ {
1538
+ width: size,
1539
+ height: size,
1540
+ viewBox: "-5.12 -5.12 266.24 266.24",
1541
+ className,
1542
+ "aria-hidden": "true",
1543
+ focusable: "false",
1544
+ children: /* @__PURE__ */ jsx("path", { d: "M128,0c-72.106,0 -128,52.818 -128,124.16c0,37.317 15.293,69.562 40.2,91.835c2.09,1.871 3.352,4.493 3.438,7.298l0.697,22.77c0.223,7.262 7.724,11.988 14.37,9.054l25.406,-11.217c2.15335,-0.94916 4.56829,-1.12613 6.837,-0.501c11.675,3.21 24.1,4.92 37.052,4.92c72.106,0 128,-52.818 128,-124.16c0,-71.342 -55.894,-124.159 -128,-124.159 M51.137,160.47l37.6,-59.653c5.98,-9.49 18.788,-11.853 27.762,-5.123l29.905,22.43c2.744,2.05808 6.52006,2.04706 9.252,-0.027l40.388,-30.652c5.39,-4.091 12.428,2.36 8.82,8.085l-37.6,59.654c-5.981,9.489 -18.79,11.852 -27.763,5.122l-29.906,-22.43c-2.74359,-2.05707 -6.51846,-2.04605 -9.25,0.027l-40.39,30.652c-5.39,4.09 -12.427,-2.36 -8.818,-8.085", fill: "currentColor" })
1545
+ }
1546
+ );
1547
+ }
1548
+ function BrandLinkedIn({ size = 16, className }) {
1549
+ return /* @__PURE__ */ jsx(
1550
+ "svg",
1551
+ {
1552
+ width: size,
1553
+ height: size,
1554
+ viewBox: "1.44 -0.56 29.12 29.12",
1555
+ className,
1556
+ "aria-hidden": "true",
1557
+ focusable: "false",
1558
+ children: /* @__PURE__ */ jsx("path", { d: "M8.268 28H2.463V9.306h5.805zM5.362 6.756C3.506 6.756 2 5.218 2 3.362a3.362 3.362 0 0 1 6.724 0c0 1.856-1.506 3.394-3.362 3.394M29.994 28h-5.792v-9.1c0-2.169-.044-4.95-3.018-4.95c-3.018 0-3.481 2.356-3.481 4.794V28h-5.799V9.306h5.567v2.55h.081c.775-1.469 2.668-3.019 5.492-3.019c5.875 0 6.955 3.869 6.955 8.894V28z", fill: "currentColor" })
1559
+ }
1560
+ );
1561
+ }
1562
+ function BrandNextdoor({ size = 16, className }) {
1563
+ return /* @__PURE__ */ jsx(
1564
+ "svg",
1565
+ {
1566
+ width: size,
1567
+ height: size,
1568
+ viewBox: "-1.28 5.29 66.56 53.4",
1569
+ className,
1570
+ "aria-hidden": "true",
1571
+ focusable: "false",
1572
+ children: /* @__PURE__ */ jsx("path", { d: "M0 25.993c.285-.085.56-.2.82-.343l9.538-5.894c.166-.125.325-.26.477-.4V6.708h10.168v6.524L32 6.574l32 19.6-5.265 8.622-5.475-3.338h-.172a.21.21 0 0 0 0 .114v25.58c-1.068.267-38.343.362-41.967.134V56.8q0-12.533 0-25.104l-.114-.23-5.76 3.32L3.1 31.373c-.916-1.488-1.908-2.976-2.766-4.464A1.91 1.91 0 0 0 0 26.508z", fill: "currentColor" })
1573
+ }
1574
+ );
1575
+ }
1576
+ function BrandPinterest({ size = 16, className }) {
1577
+ return /* @__PURE__ */ jsx(
1578
+ "svg",
1579
+ {
1580
+ width: size,
1581
+ height: size,
1582
+ viewBox: "3.38 -0.22 25.25 32.44",
1583
+ className,
1584
+ "aria-hidden": "true",
1585
+ focusable: "false",
1586
+ children: /* @__PURE__ */ jsx("path", { d: "M16.75.406C10.337.406 4 4.681 4 11.6c0 4.4 2.475 6.9 3.975 6.9c.619 0 .975-1.725.975-2.212c0-.581-1.481-1.819-1.481-4.238c0-5.025 3.825-8.588 8.775-8.588c4.256 0 7.406 2.419 7.406 6.863c0 3.319-1.331 9.544-5.644 9.544c-1.556 0-2.888-1.125-2.888-2.737c0-2.363 1.65-4.65 1.65-7.088c0-4.137-5.869-3.387-5.869 1.613c0 1.05.131 2.212.6 3.169c-.863 3.713-2.625 9.244-2.625 13.069c0 1.181.169 2.344.281 3.525c.212.238.106.213.431.094c3.15-4.313 3.038-5.156 4.463-10.8c.769 1.463 2.756 2.25 4.331 2.25c6.637 0 9.619-6.469 9.619-12.3c0-6.206-5.363-10.256-11.25-10.256z", fill: "currentColor" })
1587
+ }
1588
+ );
1589
+ }
1590
+ function BrandSnapchat({ size = 16, className }) {
1591
+ return /* @__PURE__ */ jsx(
1592
+ "svg",
1593
+ {
1594
+ width: size,
1595
+ height: size,
1596
+ viewBox: "208.68 112.18 391.9 368.85",
1597
+ className,
1598
+ "aria-hidden": "true",
1599
+ focusable: "false",
1600
+ children: /* @__PURE__ */ jsx("path", { d: "M407.001,473.488c-1.068,0-2.087-0.039-2.862-0.076c-0.615,0.053-1.25,0.076-1.886,0.076 c-22.437,0-37.439-10.607-50.678-19.973c-9.489-6.703-18.438-13.031-28.922-14.775c-5.149-0.854-10.271-1.287-15.22-1.287 c-8.917,0-15.964,1.383-21.109,2.389c-3.166,0.617-5.896,1.148-8.006,1.148c-2.21,0-4.895-0.49-6.014-4.311 c-0.887-3.014-1.523-5.934-2.137-8.746c-1.536-7.027-2.65-11.316-5.281-11.723c-28.141-4.342-44.768-10.738-48.08-18.484 c-0.347-0.814-0.541-1.633-0.584-2.443c-0.129-2.309,1.501-4.334,3.777-4.711c22.348-3.68,42.219-15.492,59.064-35.119 c13.049-15.195,19.457-29.713,20.145-31.316c0.03-0.072,0.065-0.148,0.101-0.217c3.247-6.588,3.893-12.281,1.926-16.916 c-3.626-8.551-15.635-12.361-23.58-14.882c-1.976-0.625-3.845-1.217-5.334-1.808c-7.043-2.782-18.626-8.66-17.083-16.773 c1.124-5.916,8.949-10.036,15.273-10.036c1.756,0,3.312,0.308,4.622,0.923c7.146,3.348,13.575,5.045,19.104,5.045 c6.876,0,10.197-2.618,11-3.362c-0.198-3.668-0.44-7.546-0.674-11.214c0-0.004-0.005-0.048-0.005-0.048 c-1.614-25.675-3.627-57.627,4.546-75.95c24.462-54.847,76.339-59.112,91.651-59.112c0.408,0,6.674-0.062,6.674-0.062 c0.283-0.005,0.59-0.009,0.908-0.009c15.354,0,67.339,4.27,91.816,59.15c8.173,18.335,6.158,50.314,4.539,76.016l-0.076,1.23 c-0.222,3.49-0.427,6.793-0.6,9.995c0.756,0.696,3.795,3.096,9.978,3.339c5.271-0.202,11.328-1.891,17.998-5.014 c2.062-0.968,4.345-1.169,5.895-1.169c2.343,0,4.727,0.456,6.714,1.285l0.106,0.041c5.66,2.009,9.367,6.024,9.447,10.242 c0.071,3.932-2.851,9.809-17.223,15.485c-1.472,0.583-3.35,1.179-5.334,1.808c-7.952,2.524-19.951,6.332-23.577,14.878 c-1.97,4.635-1.322,10.326,1.926,16.912c0.036,0.072,0.067,0.145,0.102,0.221c1,2.344,25.205,57.535,79.209,66.432 c2.275,0.379,3.908,2.406,3.778,4.711c-0.048,0.828-0.248,1.656-0.598,2.465c-3.289,7.703-19.915,14.09-48.064,18.438 c-2.642,0.408-3.755,4.678-5.277,11.668c-0.63,2.887-1.271,5.717-2.146,8.691c-0.819,2.797-2.641,4.164-5.567,4.164h-0.441 c-1.905,0-4.604-0.346-8.008-1.012c-5.95-1.158-12.623-2.236-21.109-2.236c-4.948,0-10.069,0.434-15.224,1.287 c-10.473,1.744-19.421,8.062-28.893,14.758C444.443,462.88,429.436,473.488,407.001,473.488", fill: "currentColor" })
1601
+ }
1602
+ );
1603
+ }
1604
+ function BrandTikTok({ size = 16, className }) {
1605
+ return /* @__PURE__ */ jsx(
1606
+ "svg",
1607
+ {
1608
+ width: size,
1609
+ height: size,
1610
+ viewBox: "-5.79 -5.79 267.56 300.84",
1611
+ className,
1612
+ "aria-hidden": "true",
1613
+ focusable: "false",
1614
+ children: /* @__PURE__ */ jsx("path", { d: "M189.722,104.42243l0,96.99357c0,48.525 -39.357,87.857 -87.905,87.857c-24.62405,0 -46.88248,-10.1174 -62.84421,-26.42813c-0.00093,-0.00062 -0.00186,-0.00125 -0.00279,-0.00187c-0.00254,-0.00259 -0.00508,-0.00519 -0.00761,-0.00778c-23.49917,-15.76977 -38.96239,-42.57494 -38.96239,-72.99022c0,-48.518 39.355,-87.852 87.905,-87.852c4.03423,-0.001 8.06385,0.2723 12.061,0.818l0,10.76898c4.64967,-0.09894 9.30133,0.17007 13.911,0.80102v48.593c-3.94487,-1.25017 -8.05877,-1.88528 -12.197,-1.883c-22.209,0 -40.21,17.994 -40.21,40.186c-0.00942,6.11418 1.38223,12.11209 4.025,17.54894l-17.941,-29.11894c0,-6.79366 1.68644,-13.19354 4.66379,-18.8042c-2.97797,5.61107 -4.66479,12.01139 -4.66479,18.8052c0,15.692 8.998,29.28 22.118,35.898c0.00103,0.00136 0.00207,0.00271 0.0031,0.00407c5.60932,2.82644 11.80469,4.29426 18.0859,4.28493c22.162,0 40.132,-17.92 40.208,-40.05v-189.845h47.834v6.113c0.1689,1.82808 0.41177,3.64857 0.728,5.457l-34.643,0.001v189.844c-0.078,22.132 -18.05,40.05 -40.21,40.05c-5.67604,0 -11.07698,-1.17525 -15.97293,-3.29552c4.89621,2.12093 10.2975,3.29652 15.97393,3.29652c22.161,0 40.131,-17.92 40.21,-40.052v-189.843l47.832,0v6.113c1.356,14.892 7.624,28.362 17.17,38.785h-0.001c10.55395,6.58342 22.74707,10.06504 35.186,10.047v10.116c4.57579,0.96983 9.24056,1.45782 13.918,1.456v47.53c-24.71212,0 -47.59337,-7.85144 -66.271,-21.19557zM99.964,151.40168c0.00033,0.00011 0.00067,0.00021 0.001,0.00032l0,-37.82098c-0.00033,0.00001 -0.00067,0.00001 -0.001,0.00002zM242.075,114.045v-0.001c-24.712,0 -47.589,-7.851 -66.272,-21.195v0.001c18.682,13.344 41.561,21.195 66.272,21.195zM69.673,225.607c-1.62409,-2.12792 -3.02095,-4.40072 -4.178,-6.78106zM228.74787,72.27412c3.67381,1.65002 7.52454,2.97698 11.51604,3.94463c-3.9686,-0.96405 -7.82207,-2.2874 -11.51604,-3.94463z", fill: "currentColor" })
1615
+ }
1616
+ );
1617
+ }
1618
+ var BRAND_ICONS = {
1619
+ meta: BrandMeta,
1620
+ facebook: BrandFacebook,
1621
+ instagram: BrandInstagram,
1622
+ messenger: BrandMessenger,
1623
+ linkedin: BrandLinkedIn,
1624
+ nextdoor: BrandNextdoor,
1625
+ pinterest: BrandPinterest,
1626
+ snapchat: BrandSnapchat,
1627
+ tiktok: BrandTikTok
1628
+ };
1377
1629
  var RING_FILLS = ["rgb(var(--accent) / 0.45)", "rgb(var(--accent) / 0.28)", "rgb(var(--accent) / 0.14)"];
1378
1630
  var RING_STROKE = "rgb(var(--accent) / 0.5)";
1379
1631
  var GRID_STROKE = "rgb(var(--foreground) / 0.04)";
@@ -2475,6 +2727,150 @@ function TokenBadge({
2475
2727
  }
2476
2728
  );
2477
2729
  }
2730
+
2731
+ // src/lib/clipboard.ts
2732
+ async function copyText(value, label) {
2733
+ try {
2734
+ await navigator.clipboard.writeText(value);
2735
+ toast.success(label ? `Copied ${label}` : `Copied ${value}`);
2736
+ } catch {
2737
+ toast.error("Copy failed");
2738
+ }
2739
+ }
2740
+ var ValueChip = forwardRef(
2741
+ function ValueChip2({ children, copyValue, copyLabel, size = "md", fill, className, ...rest }, ref) {
2742
+ const shared = cn(
2743
+ "inline-flex items-center justify-center px-2 py-1 font-mono tabular-nums truncate",
2744
+ size === "sm" ? "text-[10px]" : "text-[11px]",
2745
+ fill && "flex-1 min-w-0",
2746
+ className
2747
+ );
2748
+ const surface = {
2749
+ background: "rgb(var(--surface-inset))",
2750
+ border: "1px solid rgb(var(--border))",
2751
+ borderRadius: "var(--radius-sm)",
2752
+ color: "rgb(var(--text-secondary))"
2753
+ };
2754
+ if (!copyValue) {
2755
+ return /* @__PURE__ */ jsx("span", { className: shared, style: surface, children });
2756
+ }
2757
+ return /* @__PURE__ */ jsx(
2758
+ "button",
2759
+ {
2760
+ ref,
2761
+ type: "button",
2762
+ onClick: () => void copyText(copyValue, copyLabel),
2763
+ className: cn(
2764
+ shared,
2765
+ "cursor-pointer transition-colors",
2766
+ "hover:border-[rgb(var(--border-strong))] hover:text-[rgb(var(--foreground))]",
2767
+ "focus-visible:outline-none focus-visible:[box-shadow:var(--ring-focus)]"
2768
+ ),
2769
+ style: surface,
2770
+ ...rest,
2771
+ children
2772
+ }
2773
+ );
2774
+ }
2775
+ );
2776
+ var MetaCell = forwardRef(
2777
+ function MetaCell2({ label, children, icon, className, style, ...rest }, ref) {
2778
+ return /* @__PURE__ */ jsxs(
2779
+ "div",
2780
+ {
2781
+ ref,
2782
+ className: cn("flex flex-col gap-0.5 px-2.5 py-2 min-w-0", className),
2783
+ style: {
2784
+ background: "rgb(var(--surface-inset))",
2785
+ border: "1px solid rgb(var(--border))",
2786
+ borderRadius: "var(--radius-sm)",
2787
+ ...style
2788
+ },
2789
+ ...rest,
2790
+ children: [
2791
+ /* @__PURE__ */ jsxs(
2792
+ "span",
2793
+ {
2794
+ className: "inline-flex items-center gap-1 text-[9px] font-semibold uppercase tracking-[0.06em]",
2795
+ style: { color: "rgb(var(--text-tertiary))" },
2796
+ children: [
2797
+ icon,
2798
+ label
2799
+ ]
2800
+ }
2801
+ ),
2802
+ /* @__PURE__ */ jsx(
2803
+ "span",
2804
+ {
2805
+ className: "text-[12px] font-semibold tabular-nums truncate",
2806
+ style: { color: "rgb(var(--foreground))" },
2807
+ children
2808
+ }
2809
+ )
2810
+ ]
2811
+ }
2812
+ );
2813
+ }
2814
+ );
2815
+
2816
+ // src/lib/color.ts
2817
+ function hexToRgbTuple(hex) {
2818
+ const h = hex.replace("#", "");
2819
+ const full = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
2820
+ const r = parseInt(full.slice(0, 2), 16) || 0;
2821
+ const g = parseInt(full.slice(2, 4), 16) || 0;
2822
+ const b = parseInt(full.slice(4, 6), 16) || 0;
2823
+ return [r, g, b];
2824
+ }
2825
+ function rgbString(hex) {
2826
+ const [r, g, b] = hexToRgbTuple(hex);
2827
+ return `${r}, ${g}, ${b}`;
2828
+ }
2829
+ function rgbCss(hex) {
2830
+ return `rgb(${rgbString(hex)})`;
2831
+ }
2832
+ function hslString(hex) {
2833
+ const [r, g, b] = hexToRgbTuple(hex).map((v) => v / 255);
2834
+ const max = Math.max(r, g, b);
2835
+ const min = Math.min(r, g, b);
2836
+ const l = (max + min) / 2;
2837
+ let h = 0;
2838
+ let s = 0;
2839
+ if (max !== min) {
2840
+ const d = max - min;
2841
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
2842
+ if (max === r) h = (g - b) / d + (g < b ? 6 : 0);
2843
+ else if (max === g) h = (b - r) / d + 2;
2844
+ else h = (r - g) / d + 4;
2845
+ h /= 6;
2846
+ }
2847
+ return `${Math.round(h * 360)}\xB0 ${Math.round(s * 100)}% ${Math.round(l * 100)}%`;
2848
+ }
2849
+ function relativeLuminance(hex) {
2850
+ const lin = hexToRgbTuple(hex).map((v) => {
2851
+ const c = v / 255;
2852
+ return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
2853
+ });
2854
+ return 0.2126 * lin[0] + 0.7152 * lin[1] + 0.0722 * lin[2];
2855
+ }
2856
+ function contrastRatio(a, b) {
2857
+ const [hi, lo] = a > b ? [a, b] : [b, a];
2858
+ return (hi + 0.05) / (lo + 0.05);
2859
+ }
2860
+ function bestTextOn(hex) {
2861
+ const l = relativeLuminance(hex);
2862
+ const vsWhite = contrastRatio(l, 1);
2863
+ const vsBlack = contrastRatio(l, 0);
2864
+ return { onLight: vsBlack >= vsWhite, ratio: Math.max(vsWhite, vsBlack) };
2865
+ }
2866
+ function wcagBadges(hex) {
2867
+ const best = bestTextOn(hex).ratio;
2868
+ return [
2869
+ { label: "AA Large", pass: best >= 3 },
2870
+ { label: "AA", pass: best >= 4.5 },
2871
+ { label: "AAA", pass: best >= 7 }
2872
+ ];
2873
+ }
2478
2874
  function AllocationSparkbar({
2479
2875
  values,
2480
2876
  baseColorVar,
@@ -2559,7 +2955,7 @@ function FloatingStatusBar({
2559
2955
  role: "status",
2560
2956
  className: cn(
2561
2957
  "fixed bottom-4 left-1/2 z-30 flex -translate-x-1/2 items-center gap-3.5 px-3.5 py-2.5",
2562
- "motion-safe:animate-in motion-safe:fade-in motion-safe:slide-in-from-bottom-2",
2958
+ "ds-enter-rise",
2563
2959
  className
2564
2960
  ),
2565
2961
  style: {
@@ -2725,7 +3121,13 @@ function SortableTable({
2725
3121
  onClick: onRowClick ? () => onRowClick(row) : void 0,
2726
3122
  className: onRowClick ? "cursor-pointer transition-colors" : void 0,
2727
3123
  style: {
2728
- background: zebra && idx % 2 === 1 ? "rgb(var(--surface-overlay-soft) / 0.5)" : "transparent"
3124
+ background: (
3125
+ /* --surface-overlay-soft already carries an alpha; nesting a
3126
+ second one produced `rgb(0 0 0 / 0.03 / 0.5)` — invalid, so
3127
+ the banding never painted. --muted is the opaque zebra fill
3128
+ the data-display recipe (CLAUDE.md §2) calls for. */
3129
+ zebra && idx % 2 === 1 ? "rgb(var(--muted))" : "transparent"
3130
+ )
2729
3131
  },
2730
3132
  children: columns.map((col) => /* @__PURE__ */ jsx(
2731
3133
  "td",
@@ -2875,6 +3277,7 @@ function Tabs({
2875
3277
  role: "tab",
2876
3278
  type: "button",
2877
3279
  "aria-selected": isActive,
3280
+ "aria-label": tab.ariaLabel,
2878
3281
  disabled: tab.disabled,
2879
3282
  onClick: () => onTabChange(tab.id),
2880
3283
  className: `${className2} ${tab.disabled ? "cursor-not-allowed opacity-40" : "cursor-pointer"}`,
@@ -2907,19 +3310,19 @@ function Tabs({
2907
3310
  var ACTIVE_STYLE = {
2908
3311
  neutral: {
2909
3312
  bg: "rgb(var(--accent))",
2910
- color: "rgb(var(--accent-foreground, 255 255 255))"
3313
+ color: "rgb(var(--surface-on-accent))"
2911
3314
  },
2912
3315
  accent: {
2913
3316
  bg: "rgb(var(--accent))",
2914
- color: "rgb(var(--accent-foreground, 255 255 255))"
3317
+ color: "rgb(var(--surface-on-accent))"
2915
3318
  },
2916
3319
  success: {
2917
3320
  bg: "rgb(var(--success))",
2918
- color: "rgb(var(--success-bg))"
3321
+ color: "rgb(var(--surface-on-accent))"
2919
3322
  },
2920
3323
  warning: {
2921
3324
  bg: "rgb(var(--warning))",
2922
- color: "rgb(var(--warning-bg))"
3325
+ color: "rgb(var(--surface-on-accent))"
2923
3326
  },
2924
3327
  destructive: {
2925
3328
  bg: "rgb(var(--destructive))",
@@ -2927,7 +3330,7 @@ var ACTIVE_STYLE = {
2927
3330
  },
2928
3331
  info: {
2929
3332
  bg: "rgb(var(--info))",
2930
- color: "rgb(var(--info-bg))"
3333
+ color: "rgb(var(--surface-on-accent))"
2931
3334
  }
2932
3335
  };
2933
3336
  function PillButton({
@@ -3174,7 +3577,7 @@ function DropdownMenuContent({
3174
3577
  "fixed z-[100] min-w-48 max-w-[min(28rem,calc(100vw-16px))]",
3175
3578
  "p-1.5 overflow-y-auto",
3176
3579
  "rounded-[var(--radius-lg)]",
3177
- isPositioned && "animate-in fade-in-0 zoom-in-95 duration-100",
3580
+ isPositioned && "ds-enter-pop",
3178
3581
  className
3179
3582
  ),
3180
3583
  style: {
@@ -3999,40 +4402,51 @@ function DataGridTableBody({
3999
4402
  );
4000
4403
  };
4001
4404
  return /* @__PURE__ */ jsxs(TableBody, { children: [
4002
- visibleRows.map((row, rowIndex) => /* @__PURE__ */ jsxs(TableRow, { children: [
4003
- /* @__PURE__ */ jsx(
4004
- TableCell,
4405
+ visibleRows.map((row, rowIndex) => (
4406
+ // TableRow styles `data-[state=selected]`; without this attribute a
4407
+ // checked row had no visual state at all — only the checkbox changed.
4408
+ /* @__PURE__ */ jsxs(
4409
+ TableRow,
4005
4410
  {
4006
- className: "h-10 px-0 text-center",
4007
- style: {
4008
- borderRight: "1px solid rgb(var(--border))",
4009
- ...controlStyle
4010
- },
4011
- children: /* @__PURE__ */ jsx(
4012
- Checkbox,
4013
- {
4014
- "aria-label": `Select ${getRowLabel(row)}`,
4015
- checked: selectedRowIds.includes(row.id),
4016
- onCheckedChange: (checked) => onToggleRowSelection(row.id, checked === true),
4017
- className: "mx-auto"
4018
- }
4019
- )
4020
- }
4021
- ),
4022
- leading.map(
4023
- (column, colIndex) => renderDataCell(row, rowIndex, column, colIndex)
4024
- ),
4025
- fillWidth ? /* @__PURE__ */ jsx("td", { "aria-hidden": true, style: { width: "auto", padding: 0 } }) : null,
4026
- rightPinned.map(
4027
- (column, i) => renderDataCell(
4028
- row,
4029
- rowIndex,
4030
- column,
4031
- leading.length + i,
4032
- i === rightPinned.length - 1
4033
- )
4411
+ ...selectedRowIds.includes(row.id) ? { "data-state": "selected" } : {},
4412
+ children: [
4413
+ /* @__PURE__ */ jsx(
4414
+ TableCell,
4415
+ {
4416
+ className: "h-10 px-0 text-center",
4417
+ style: {
4418
+ borderRight: "1px solid rgb(var(--border))",
4419
+ ...controlStyle
4420
+ },
4421
+ children: /* @__PURE__ */ jsx(
4422
+ Checkbox,
4423
+ {
4424
+ "aria-label": `Select ${getRowLabel(row)}`,
4425
+ checked: selectedRowIds.includes(row.id),
4426
+ onCheckedChange: (checked) => onToggleRowSelection(row.id, checked === true),
4427
+ className: "mx-auto"
4428
+ }
4429
+ )
4430
+ }
4431
+ ),
4432
+ leading.map(
4433
+ (column, colIndex) => renderDataCell(row, rowIndex, column, colIndex)
4434
+ ),
4435
+ fillWidth ? /* @__PURE__ */ jsx("td", { "aria-hidden": true, style: { width: "auto", padding: 0 } }) : null,
4436
+ rightPinned.map(
4437
+ (column, i) => renderDataCell(
4438
+ row,
4439
+ rowIndex,
4440
+ column,
4441
+ leading.length + i,
4442
+ i === rightPinned.length - 1
4443
+ )
4444
+ )
4445
+ ]
4446
+ },
4447
+ row.id
4034
4448
  )
4035
- ] }, row.id)),
4449
+ )),
4036
4450
  fillHeight ? (
4037
4451
  // Filler row absorbs the leftover height (table is height:100%) so
4038
4452
  // the summary footer stays pinned to the bottom even with few rows.
@@ -5589,7 +6003,7 @@ function TagChipInput({
5589
6003
  className: cn(
5590
6004
  "flex flex-wrap items-center gap-1.5 px-2 py-1.5 min-h-10 cursor-text",
5591
6005
  "border transition-colors",
5592
- error ? "border-[rgb(var(--ring-error))]" : "border-[rgb(var(--border))] focus-within:border-[rgb(var(--accent))]",
6006
+ error ? "border-[rgb(var(--destructive))] focus-within:border-[rgb(var(--destructive))]" : "border-[rgb(var(--border))] focus-within:border-[rgb(var(--accent))]",
5593
6007
  isDisabled && "opacity-60 cursor-not-allowed",
5594
6008
  className
5595
6009
  ),
@@ -5916,13 +6330,12 @@ function FolderTreePicker({
5916
6330
  "aria-controls": open ? popoverId : void 0,
5917
6331
  disabled,
5918
6332
  onClick: () => setOpen((o) => !o),
5919
- className: cn(
5920
- "btn btn-secondary justify-between w-full",
5921
- error && "is-error",
5922
- className
5923
- ),
6333
+ className: cn("btn btn-secondary justify-between w-full", className),
5924
6334
  style: {
5925
- borderColor: error ? "rgb(var(--ring-error))" : void 0
6335
+ /* --ring-error is a box-shadow LIST, not a colour; rgb(var(--ring-error))
6336
+ is invalid CSS and gets dropped, which left this error state inert.
6337
+ The colour token is --destructive (what .input-shell.is-error uses). */
6338
+ borderColor: error ? "rgb(var(--destructive))" : void 0
5926
6339
  },
5927
6340
  children: [
5928
6341
  /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-2 min-w-0", children: [
@@ -6637,8 +7050,8 @@ var BANNER_TONE = {
6637
7050
  icon: "rgb(var(--warning))"
6638
7051
  },
6639
7052
  destructive: {
6640
- bg: "rgb(var(--surface-overlay-soft))",
6641
- border: "rgb(var(--ring-error))",
7053
+ bg: "rgb(var(--destructive-bg))",
7054
+ border: "rgb(var(--destructive))",
6642
7055
  icon: "rgb(var(--destructive))"
6643
7056
  }
6644
7057
  };
@@ -7833,7 +8246,7 @@ var LANGUAGES = {
7833
8246
  javascript,
7834
8247
  js: javascript,
7835
8248
  json,
7836
- jsx: jsx62,
8249
+ jsx: jsx66,
7837
8250
  markdown,
7838
8251
  md: markdown,
7839
8252
  html: markup,
@@ -8329,7 +8742,7 @@ function Kbd({ children, size = "md" }) {
8329
8742
  return /* @__PURE__ */ jsx("kbd", { style, children });
8330
8743
  }
8331
8744
  var FrameStack = forwardRef(
8332
- function FrameStack2({ className, style, gap = "10px", children, ...rest }, ref) {
8745
+ function FrameStack2({ className, style, gap = "10px", padding = "var(--tray-inset)", children, ...rest }, ref) {
8333
8746
  return /* @__PURE__ */ jsx(
8334
8747
  "div",
8335
8748
  {
@@ -8340,7 +8753,7 @@ var FrameStack = forwardRef(
8340
8753
  background: "rgb(var(--card-frame-bg))",
8341
8754
  border: "1px solid rgb(var(--border-card))",
8342
8755
  borderRadius: "var(--radius-xl)",
8343
- padding: "10px",
8756
+ padding,
8344
8757
  gap,
8345
8758
  ...style
8346
8759
  },
@@ -9793,7 +10206,7 @@ var C = {
9793
10206
  name: "rgb(8, 8, 8)",
9794
10207
  sub: "rgb(101, 103, 107)",
9795
10208
  body: "rgb(0, 0, 0)",
9796
- seeMore: "#1877F2",
10209
+ seeMore: "var(--color-meta-blue)",
9797
10210
  imageBg: "#F0F2F5",
9798
10211
  imageEdge: "rgba(0, 0, 0, 0.06)",
9799
10212
  card: "#F7F8FA",
@@ -13603,7 +14016,7 @@ var C3 = {
13603
14016
  name: "rgb(8, 8, 8)",
13604
14017
  sub: "rgb(101, 103, 107)",
13605
14018
  body: "rgb(0, 0, 0)",
13606
- seeMore: "#1877F2",
14019
+ seeMore: "var(--color-meta-blue)",
13607
14020
  imageBg: "#F0F2F5",
13608
14021
  cardBorder: "rgba(0, 0, 0, 0.1)",
13609
14022
  headline: "rgb(28, 32, 40)",
@@ -14033,6 +14446,6 @@ var PLACEMENT_CONFIGS = [
14033
14446
  }
14034
14447
  ];
14035
14448
 
14036
- export { AccordionCompound as Accordion, AllocationSparkbar, AppScroll, Badge, BrandLogoTile, BulkActionBar, Button, ButtonGroup, CalculatorShell, CalculatorShellV2, card_default as Card, Checkbox, ChipNav, Choropleth, CodeBlock, CompletionRing, CopyField, DataGrid, DataGridColumnOptionsMenu, DataGridDragOverlay, DataGridDropIndicator, DataGridToolbar, DetailSection, DeviceFrame, DragHandle, DropdownButton, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, EmptyPlaceholder, EmptyState, FOLDER_COLOR_KEYS, FileDropZone, FilePreviewGrid, FilePreviewItem, FileThumbnail, FileUploadButton, FilterBar, FilterDropdown, FloatingDrawer, FloatingStatusBar, FolderCard, FolderTreePicker, FrameStack, HEADER_HEIGHT, HeroFormCardCompound as HeroFormCard, IconTile, IdentityLabel, IdentityValue, Input, Kbd, ListItem, MarkdownCode, MarkdownRenderer, MenuButton, meta_previews_exports as MetaPreviews, MetricCard, MicrosoftLogo, modal_default as Modal, OptionTile, OptionTileGroup, PLACEMENT_CONFIGS, PageHeaderHost, PageHeaderSlotProvider, PageHero, page_shell_default as PageShell, Pagination, PillButton, profile_section_default as ProfileSection, ProgressBar, Radio, RadioGroup, RangeSlider, ResizableHandle, ResizablePane, SECTION_SCROLL_OFFSET, SearchBar, SectionLabel, SegmentedPill, Shell2 as Shell, ShellStat, Slider, SortableItem, SortableList, SortableTable, StatRow, StatsGrid, StepLoader, Tabs, TagChipInput, TagRow, TextInput, Textarea, TextareaInput, Toaster, TokenBadge, cn, folderColorVar, formatCurrency, formatNumber, formatPercent, formatRatio, useFileUpload };
14449
+ export { AccordionCompound as Accordion, AllocationSparkbar, AppScroll, BRAND_ICONS, Badge, BrandFacebook, BrandInstagram, BrandLinkedIn, BrandLogoTile, BrandMessenger, BrandMeta, BrandNextdoor, BrandPinterest, BrandSnapchat, BrandTikTok, BulkActionBar, Button, ButtonGroup, CalculatorShell, CalculatorShellV2, card_default as Card, Checkbox, ChipNav, Choropleth, CodeBlock, CollapsibleCard, CompletionRing, CopyField, DataGrid, DataGridColumnOptionsMenu, DataGridDragOverlay, DataGridDropIndicator, DataGridToolbar, DetailSection, DeviceFrame, DragHandle, DropdownButton, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, EmptyPlaceholder, EmptyState, FOLDER_COLOR_KEYS, FileDropZone, FilePreviewGrid, FilePreviewItem, FileThumbnail, FileUploadButton, FilterBar, FilterDropdown, FloatingDrawer, FloatingStatusBar, FolderCard, FolderTreePicker, FrameStack, HEADER_HEIGHT, HeroFormCardCompound as HeroFormCard, IconTile, IdentityLabel, IdentityValue, Input, Kbd, ListItem, MarkdownCode, MarkdownRenderer, MenuButton, MetaCell, meta_previews_exports as MetaPreviews, MetricCard, MicrosoftLogo, modal_default as Modal, OptionTile, OptionTileGroup, PLACEMENT_CONFIGS, PageHeaderHost, PageHeaderSlotProvider, PageHero, page_shell_default as PageShell, Pagination, PillButton, profile_section_default as ProfileSection, ProgressBar, Radio, RadioGroup, RangeSlider, ResizableHandle, ResizablePane, SECTION_SCROLL_OFFSET, SearchBar, SectionLabel, SegmentedPill, Shell2 as Shell, ShellStat, Slider, SortableItem, SortableList, SortableTable, StatRow, StatsGrid, StepLoader, Tabs, TagChipInput, TagRow, TextInput, Textarea, TextareaInput, Toaster, TokenBadge, ValueChip, bestTextOn, cn, contrastRatio, copyText, folderColorVar, formatCurrency, formatNumber, formatPercent, formatRatio, hexToRgbTuple, hslString, relativeLuminance, rgbCss, rgbString, useFileUpload, wcagBadges };
14037
14450
  //# sourceMappingURL=index.js.map
14038
14451
  //# sourceMappingURL=index.js.map