@ctrl-ui/react 0.9.6 → 0.9.9

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 (133) hide show
  1. package/README.md +38 -2
  2. package/dist/activity.d.ts +3 -1
  3. package/dist/activity.js +2 -1
  4. package/dist/blocks/agent-run-sidebar.js +11 -10
  5. package/dist/blocks/agent-run.d.ts +3 -1
  6. package/dist/blocks/agent-run.js +21 -13
  7. package/dist/blocks/coding-agent.js +50 -69
  8. package/dist/blocks/design-canvas-inspector.js +1 -1
  9. package/dist/blocks/design-canvas.js +41 -34
  10. package/dist/blocks/discussion.js +1 -1
  11. package/dist/blocks/file-explorer.js +66 -47
  12. package/dist/blocks/settings.js +37 -41
  13. package/dist/blocks/team-chat.js +2 -1
  14. package/dist/blocks/theme-toggle.d.ts +2 -1
  15. package/dist/blocks/theme-toggle.js +13 -4
  16. package/dist/hooks/use-mobile.d.ts +1 -1
  17. package/dist/hooks/use-mobile.js +1 -1
  18. package/dist/knob-contracts/badge-knobs.d.ts +1 -1
  19. package/dist/knob-contracts/badge-knobs.js +3 -1
  20. package/dist/knob-contracts/button-knobs.d.ts +1 -1
  21. package/dist/knob-contracts/button-knobs.js +1 -0
  22. package/dist/knob-contracts/calendar-knobs.d.ts +1 -1
  23. package/dist/knob-contracts/calendar-knobs.js +9 -1
  24. package/dist/knob-contracts/card-knobs.d.ts +1 -1
  25. package/dist/knob-contracts/card-knobs.js +5 -1
  26. package/dist/knob-contracts/choice-knobs.d.ts +1 -1
  27. package/dist/knob-contracts/choice-knobs.js +1 -0
  28. package/dist/knob-contracts/collapsible-knobs.d.ts +1 -1
  29. package/dist/knob-contracts/collapsible-knobs.js +5 -1
  30. package/dist/knob-contracts/emoji-picker-knobs.d.ts +1 -1
  31. package/dist/knob-contracts/emoji-picker-knobs.js +3 -1
  32. package/dist/knob-contracts/field-knobs.d.ts +1 -1
  33. package/dist/knob-contracts/field-knobs.js +17 -1
  34. package/dist/knob-contracts/item-knobs.d.ts +1 -1
  35. package/dist/knob-contracts/item-knobs.js +6 -1
  36. package/dist/knob-contracts/kbd-knobs.d.ts +1 -1
  37. package/dist/knob-contracts/kbd-knobs.js +4 -1
  38. package/dist/knob-contracts/page-layout-knobs.d.ts +1 -1
  39. package/dist/knob-contracts/page-layout-knobs.js +1 -0
  40. package/dist/knob-contracts/pagination-knobs.d.ts +1 -1
  41. package/dist/knob-contracts/pagination-knobs.js +2 -1
  42. package/dist/knob-contracts/popup-knobs.d.ts +1 -1
  43. package/dist/knob-contracts/popup-knobs.js +9 -0
  44. package/dist/knob-contracts/range-knobs.d.ts +1 -1
  45. package/dist/knob-contracts/range-knobs.js +2 -0
  46. package/dist/knob-contracts/sidebar-knobs.d.ts +1 -1
  47. package/dist/knob-contracts/sidebar-knobs.js +2 -0
  48. package/dist/knob-contracts/tabs-knobs.d.ts +1 -1
  49. package/dist/knob-contracts/tabs-knobs.js +3 -0
  50. package/dist/knob-contracts/timeline-knobs.d.ts +1 -1
  51. package/dist/knob-contracts/timeline-knobs.js +4 -1
  52. package/dist/knob-contracts/tree-knobs.d.ts +1 -1
  53. package/dist/knob-contracts/tree-knobs.js +3 -1
  54. package/dist/skin.d.ts +2 -0
  55. package/dist/styles/index.css +2 -3
  56. package/dist/styles/recipes/activity.css +4 -0
  57. package/dist/styles/recipes/avatar.css +1 -1
  58. package/dist/styles/recipes/badge.css +17 -0
  59. package/dist/styles/recipes/button.css +8 -1
  60. package/dist/styles/recipes/calendar.css +82 -6
  61. package/dist/styles/recipes/card.css +40 -5
  62. package/dist/styles/recipes/choice.css +9 -2
  63. package/dist/styles/recipes/collapsible.css +8 -1
  64. package/dist/styles/recipes/color-picker-values.css +4 -0
  65. package/dist/styles/recipes/emoji-picker.css +29 -8
  66. package/dist/styles/recipes/empty.css +5 -0
  67. package/dist/styles/recipes/field-parts.css +80 -5
  68. package/dist/styles/recipes/field.css +113 -40
  69. package/dist/styles/recipes/item.css +44 -5
  70. package/dist/styles/recipes/kbd.css +26 -6
  71. package/dist/styles/recipes/morphing-panel.css +1 -1
  72. package/dist/styles/recipes/page-layout.css +18 -2
  73. package/dist/styles/recipes/pagination.css +8 -0
  74. package/dist/styles/recipes/popup-controls.css +41 -0
  75. package/dist/styles/recipes/popup-drawer.css +1 -0
  76. package/dist/styles/recipes/popup-lists.css +55 -6
  77. package/dist/styles/recipes/popup-motion.css +7 -1
  78. package/dist/styles/recipes/popup.css +10 -0
  79. package/dist/styles/recipes/range.css +16 -2
  80. package/dist/styles/recipes/sidebar-mobile.css +1 -1
  81. package/dist/styles/recipes/sidebar-parts.css +17 -1
  82. package/dist/styles/recipes/sidebar.css +11 -0
  83. package/dist/styles/recipes/skeleton.css +8 -0
  84. package/dist/styles/recipes/tabs.css +41 -8
  85. package/dist/styles/recipes/timeline.css +25 -2
  86. package/dist/styles/recipes/tree.css +33 -0
  87. package/dist/styles/theme.css +11 -1
  88. package/dist/surface-variants.d.ts +2 -0
  89. package/dist/surface-variants.js +2 -1
  90. package/dist/ui/alert-dialog.js +1 -1
  91. package/dist/ui/badge.js +1 -1
  92. package/dist/ui/calendar.js +9 -4
  93. package/dist/ui/card.d.ts +3 -1
  94. package/dist/ui/card.js +2 -1
  95. package/dist/ui/context-menu.d.ts +3 -1
  96. package/dist/ui/context-menu.js +2 -1
  97. package/dist/ui/dialog.js +1 -1
  98. package/dist/ui/dropdown-menu.d.ts +6 -3
  99. package/dist/ui/dropdown-menu.js +25 -7
  100. package/dist/ui/dropzone.js +10 -11
  101. package/dist/ui/empty.d.ts +4 -1
  102. package/dist/ui/empty.js +4 -2
  103. package/dist/ui/field.d.ts +6 -2
  104. package/dist/ui/field.js +4 -2
  105. package/dist/ui/menubar.d.ts +3 -1
  106. package/dist/ui/menubar.js +2 -1
  107. package/dist/ui/morphing-panel.d.ts +5 -1
  108. package/dist/ui/morphing-panel.js +4 -2
  109. package/dist/ui/select.js +2 -2
  110. package/dist/ui/sheet.d.ts +9 -0
  111. package/dist/ui/sheet.js +23 -1
  112. package/dist/ui/sidebar-mobile.js +1 -1
  113. package/dist/ui/sidebar-provider.d.ts +3 -1
  114. package/dist/ui/sidebar-provider.js +3 -2
  115. package/dist/ui/sidebar-resize-rail.js +1 -1
  116. package/dist/ui/sidebar.d.ts +6 -5
  117. package/dist/ui/sidebar.js +10 -9
  118. package/dist/ui/skeleton.d.ts +4 -1
  119. package/dist/ui/skeleton.js +8 -2
  120. package/dist/ui/tabs.d.ts +1 -1
  121. package/dist/ui/tabs.js +2 -13
  122. package/dist/ui/timeline.js +1 -1
  123. package/dist/ui/typography.d.ts +11 -5
  124. package/dist/ui/typography.js +18 -6
  125. package/lint/biome-preset.json +3 -0
  126. package/lint/class-policy.mjs +17 -0
  127. package/lint/eslint-plugin.mjs +87 -0
  128. package/lint/grit-rules.mjs +40 -0
  129. package/lint/no-component-style-classes.grit +16 -0
  130. package/lint/no-raw-type-classes.grit +2 -3
  131. package/lint/write-grit-rules.mjs +19 -0
  132. package/package.json +11 -2
  133. package/dist/styles/type-scale.css +0 -72
@@ -70,7 +70,8 @@ function FileExplorerBlock({ locations, activeLocationId, defaultActiveLocationI
70
70
  layout,
71
71
  persistOpen,
72
72
  keyboardShortcut,
73
- className: cn("bg-background text-foreground", !contained && "h-svh overflow-hidden", className),
73
+ surface: "background",
74
+ className: cn(!contained && "h-svh overflow-hidden", className),
74
75
  style: providerStyle,
75
76
  ...props,
76
77
  children: [/* @__PURE__ */ jsx(FileExplorerSidebar, {
@@ -147,7 +148,7 @@ function FileExplorerSidebar({ locations, activeLocationId, sidebarTop, sidebarF
147
148
  collapsible: "offcanvas",
148
149
  children: [
149
150
  sidebarTop ? /* @__PURE__ */ jsx(SidebarHeader, {
150
- className: "min-h-11 justify-center px-3",
151
+ className: "min-h-11 justify-center",
151
152
  children: sidebarTop
152
153
  }) : null,
153
154
  /* @__PURE__ */ jsx(SidebarContent, { children: groups.map((group) => /* @__PURE__ */ jsxs(SidebarGroup, { children: [group.label ? /* @__PURE__ */ jsx(SidebarGroupLabel, { children: group.label }) : null, /* @__PURE__ */ jsx(SidebarMenu, { children: group.items.map((location) => /* @__PURE__ */ jsx(SidebarMenuItem, { children: /* @__PURE__ */ jsxs(SidebarMenuButton, {
@@ -214,13 +215,10 @@ function FileExplorerHeader({ location, headingLevel, breadcrumbs, query, search
214
215
  size: "sm",
215
216
  className: "flex-[0_1_9rem] @xl/explorer:flex-[0_0_12rem]",
216
217
  children: [
217
- /* @__PURE__ */ jsx(InputGroupAddon, {
218
- className: "ps-2",
219
- children: /* @__PURE__ */ jsx(SearchIcon, {
220
- className: "size-3.5",
221
- "aria-hidden": "true"
222
- })
223
- }),
218
+ /* @__PURE__ */ jsx(InputGroupAddon, { children: /* @__PURE__ */ jsx(SearchIcon, {
219
+ className: "size-3.5",
220
+ "aria-hidden": "true"
221
+ }) }),
224
222
  /* @__PURE__ */ jsx(Input, {
225
223
  type: "search",
226
224
  "aria-label": searchLabel,
@@ -388,7 +386,7 @@ function FileExplorerColumns({ columns, selectedEntry, selectedPath, headingLeve
388
386
  }) : /* @__PURE__ */ jsx(Text, {
389
387
  size: "label",
390
388
  weight: "medium",
391
- className: "min-w-0 truncate px-1",
389
+ className: "mx-1 min-w-0 truncate",
392
390
  children: activeColumn?.label
393
391
  }), /* @__PURE__ */ jsxs(Drawer, { children: [/* @__PURE__ */ jsx(DrawerTrigger, {
394
392
  render: /* @__PURE__ */ jsx(Button, {
@@ -401,7 +399,11 @@ function FileExplorerColumns({ columns, selectedEntry, selectedPath, headingLeve
401
399
  }), /* @__PURE__ */ jsx(DrawerContent, { children: selectedEntry ? /* @__PURE__ */ jsx(DrawerBody, { children: /* @__PURE__ */ jsx(FileExplorerPreviewContent, {
402
400
  entry: selectedEntry,
403
401
  title: /* @__PURE__ */ jsx(DrawerTitle, {
404
- className: "mt-4 max-w-full truncate text-heading-4",
402
+ className: "mt-4 max-w-full truncate",
403
+ style: {
404
+ "--cui-popup-title-font-size": "var(--text-heading-4)",
405
+ "--cui-popup-title-line-height": "var(--text-heading-4--line-height)"
406
+ },
405
407
  children: selectedEntry.name
406
408
  })
407
409
  }) }) : null })] })]
@@ -457,7 +459,8 @@ function FileExplorerColumnView({ column, optionRef, onSelect, onOpen, onOptionK
457
459
  const groups = groupFileExplorerItems(column.entries);
458
460
  const tabStopId = column.selectedId ?? groups[0]?.items[0]?.id;
459
461
  if (column.entries.length === 0) return /* @__PURE__ */ jsx(Empty, {
460
- className: "h-full rounded-none",
462
+ className: "h-full",
463
+ style: { "--cui-empty-radius": "0px" },
461
464
  children: /* @__PURE__ */ jsxs(EmptyHeader, { children: [
462
465
  /* @__PURE__ */ jsx(EmptyMedia, { children: /* @__PURE__ */ jsx(FolderIcon, {}) }),
463
466
  /* @__PURE__ */ jsx(EmptyTitle, { children: "Empty folder" }),
@@ -483,7 +486,7 @@ function FileExplorerColumnView({ column, optionRef, onSelect, onOpen, onOptionK
483
486
  variant: "quiet",
484
487
  size: "sm",
485
488
  active: isSelected,
486
- className: "w-full justify-start gap-2 px-2 text-start",
489
+ className: "w-full justify-start gap-2 text-start",
487
490
  title: entry.name,
488
491
  onClick: () => onSelect(entry),
489
492
  onDoubleClick: () => onOpen(entry),
@@ -515,7 +518,7 @@ function FileExplorerColumnView({ column, optionRef, onSelect, onOpen, onOptionK
515
518
  size: "caption",
516
519
  weight: "semibold",
517
520
  tone: "muted",
518
- className: "mb-1 px-2",
521
+ className: "mx-2 mb-1",
519
522
  children: group.label
520
523
  }), options]
521
524
  }, group.label) : /* @__PURE__ */ jsx("div", {
@@ -529,7 +532,8 @@ function FileExplorerColumnView({ column, optionRef, onSelect, onOpen, onOptionK
529
532
  }
530
533
  function FileExplorerPreview({ entry, headingLevel }) {
531
534
  if (!entry) return /* @__PURE__ */ jsx(Empty, {
532
- className: "h-full rounded-none",
535
+ className: "h-full",
536
+ style: { "--cui-empty-radius": "0px" },
533
537
  children: /* @__PURE__ */ jsxs(EmptyHeader, { children: [
534
538
  /* @__PURE__ */ jsx(EmptyMedia, { children: /* @__PURE__ */ jsx(FileIcon, {}) }),
535
539
  /* @__PURE__ */ jsx(EmptyTitle, { children: "Select an item" }),
@@ -569,14 +573,19 @@ function FileExplorerPreviewContent({ entry, title, className }) {
569
573
  children: entry.description
570
574
  }) : null,
571
575
  entry.details && entry.details.length > 0 ? /* @__PURE__ */ jsx("dl", {
572
- className: "mt-6 grid w-full grid-cols-[auto_1fr] gap-x-4 gap-y-2 border-t border-border/70 pt-4 text-start text-caption",
576
+ className: "mt-6 grid w-full grid-cols-[auto_1fr] gap-x-4 gap-y-2 border-t border-border/70 pt-4 text-start",
573
577
  children: entry.details.map((detail) => /* @__PURE__ */ jsxs("div", {
574
578
  className: "contents",
575
- children: [/* @__PURE__ */ jsx("dt", {
576
- className: "text-muted-foreground",
579
+ children: [/* @__PURE__ */ jsx(Text, {
580
+ as: "dt",
581
+ size: "caption",
582
+ tone: "muted",
577
583
  children: detail.label
578
- }), /* @__PURE__ */ jsx("dd", {
579
- className: "min-w-0 truncate text-end text-foreground",
584
+ }), /* @__PURE__ */ jsx(Text, {
585
+ as: "dd",
586
+ size: "caption",
587
+ tone: "foreground",
588
+ className: "min-w-0 truncate text-end",
580
589
  children: detail.value
581
590
  })]
582
591
  }, detail.label))
@@ -593,7 +602,8 @@ function FileExplorerSearchResults({ label, status, clearSearchLabel, results, o
593
602
  const [activeIndex, setActiveIndex] = useState(0);
594
603
  const tabStop = Math.min(activeIndex, results.length - 1);
595
604
  if (results.length === 0) return /* @__PURE__ */ jsxs(Empty, {
596
- className: "h-full rounded-none",
605
+ className: "h-full",
606
+ style: { "--cui-empty-radius": "0px" },
597
607
  children: [/* @__PURE__ */ jsxs(EmptyHeader, { children: [
598
608
  /* @__PURE__ */ jsx(EmptyMedia, { children: /* @__PURE__ */ jsx(SearchIcon, {}) }),
599
609
  /* @__PURE__ */ jsx(EmptyTitle, { children: status }),
@@ -632,7 +642,8 @@ function FileExplorerSearchResults({ label, status, clearSearchLabel, results, o
632
642
  as: "div",
633
643
  size: "caption",
634
644
  tone: "muted",
635
- className: "mb-2 px-2 tabular-nums",
645
+ numeric: true,
646
+ className: "mx-2 mb-2",
636
647
  children: status
637
648
  }), /* @__PURE__ */ jsx("div", {
638
649
  role: "listbox",
@@ -647,7 +658,7 @@ function FileExplorerSearchResults({ label, status, clearSearchLabel, results, o
647
658
  tabIndex: index === tabStop ? 0 : -1,
648
659
  variant: "quiet",
649
660
  size: "lg",
650
- className: "h-auto w-full justify-start gap-3 px-3 py-2 text-start",
661
+ className: "h-auto min-h-12 w-full justify-start gap-3 text-start",
651
662
  onClick: () => onSelect(result),
652
663
  onDoubleClick: () => onOpen(result.entry, result.path),
653
664
  onFocus: () => setActiveIndex(index),
@@ -679,39 +690,47 @@ function FileExplorerStatusBar({ breadcrumbs, selectedEntry }) {
679
690
  const itemCount = selectedEntry?.children?.length ?? 0;
680
691
  const itemLabel = itemCount === 1 ? "1 item" : `${itemCount} items`;
681
692
  return /* @__PURE__ */ jsxs("footer", {
682
- className: "flex h-8 shrink-0 items-center gap-3 border-t border-border/70 px-3 text-micro text-muted-foreground",
683
- children: [/* @__PURE__ */ jsx("span", {
693
+ className: "flex h-8 shrink-0 items-center gap-3 border-t border-border/70 px-3",
694
+ children: [/* @__PURE__ */ jsx(Text, {
695
+ size: "micro",
696
+ tone: "muted",
684
697
  className: "min-w-0 flex-1 truncate",
685
698
  title: path,
686
699
  children: path
687
- }), /* @__PURE__ */ jsx("span", {
688
- className: "shrink-0 tabular-nums",
700
+ }), /* @__PURE__ */ jsx(Text, {
701
+ size: "micro",
702
+ tone: "muted",
703
+ numeric: true,
704
+ className: "shrink-0",
689
705
  children: selectedEntry?.kind === "folder" ? itemLabel : selectedEntry?.name ?? "No selection"
690
706
  })]
691
707
  });
692
708
  }
693
709
  function FileExplorerAddressBar({ breadcrumbs, onSelect }) {
694
- return /* @__PURE__ */ jsx(Breadcrumb, {
695
- "aria-label": "Current folder",
710
+ return /* @__PURE__ */ jsx("div", {
696
711
  className: "min-w-0 overflow-hidden px-1",
697
- children: /* @__PURE__ */ jsx(BreadcrumbList, {
698
- className: "min-w-0 flex-nowrap overflow-hidden",
699
- children: breadcrumbs.map((breadcrumb, index) => {
700
- const isCurrent = index === breadcrumbs.length - 1;
701
- return /* @__PURE__ */ jsxs(Fragment, { children: [index > 0 ? /* @__PURE__ */ jsx(BreadcrumbSeparator, {}) : null, /* @__PURE__ */ jsx(BreadcrumbItem, {
702
- className: "min-w-0",
703
- children: isCurrent ? /* @__PURE__ */ jsx(BreadcrumbPage, {
704
- className: "min-w-0 truncate",
705
- title: breadcrumb.label,
706
- children: breadcrumb.label
707
- }) : /* @__PURE__ */ jsx(BreadcrumbLink, {
708
- render: /* @__PURE__ */ jsx("button", { type: "button" }),
709
- className: "min-w-0 truncate",
710
- title: breadcrumb.label,
711
- onClick: () => onSelect(breadcrumb),
712
- children: breadcrumb.label
713
- })
714
- })] }, `${breadcrumb.id}:${breadcrumb.path.join("/")}`);
712
+ children: /* @__PURE__ */ jsx(Breadcrumb, {
713
+ "aria-label": "Current folder",
714
+ className: "min-w-0",
715
+ children: /* @__PURE__ */ jsx(BreadcrumbList, {
716
+ className: "min-w-0 flex-nowrap overflow-hidden",
717
+ children: breadcrumbs.map((breadcrumb, index) => {
718
+ const isCurrent = index === breadcrumbs.length - 1;
719
+ return /* @__PURE__ */ jsxs(Fragment, { children: [index > 0 ? /* @__PURE__ */ jsx(BreadcrumbSeparator, {}) : null, /* @__PURE__ */ jsx(BreadcrumbItem, {
720
+ className: "min-w-0",
721
+ children: isCurrent ? /* @__PURE__ */ jsx(BreadcrumbPage, {
722
+ className: "min-w-0 truncate",
723
+ title: breadcrumb.label,
724
+ children: breadcrumb.label
725
+ }) : /* @__PURE__ */ jsx(BreadcrumbLink, {
726
+ render: /* @__PURE__ */ jsx("button", { type: "button" }),
727
+ className: "min-w-0 truncate",
728
+ title: breadcrumb.label,
729
+ onClick: () => onSelect(breadcrumb),
730
+ children: breadcrumb.label
731
+ })
732
+ })] }, `${breadcrumb.id}:${breadcrumb.path.join("/")}`);
733
+ })
715
734
  })
716
735
  })
717
736
  });
@@ -12,7 +12,7 @@ import { InputGroup, InputGroupAddon } from "../ui/input-group.js";
12
12
  import { Input } from "../ui/input.js";
13
13
  import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from "../ui/empty.js";
14
14
  import { searchSettings } from "./settings-data.js";
15
- import { Field, FieldContent, FieldDescription, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet } from "../ui/field.js";
15
+ import { Field, FieldContent, FieldDescription, FieldGroup, FieldLabel, FieldLegend, FieldSet } from "../ui/field.js";
16
16
  import { useEffect, useId, useState } from "react";
17
17
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
18
18
  import { ArrowLeftIcon, SearchIcon, XIcon } from "lucide-react";
@@ -35,7 +35,8 @@ function SettingsBlock({ pages, activePageId, defaultActivePageId, onActivePageC
35
35
  };
36
36
  return /* @__PURE__ */ jsx(SidebarProvider, {
37
37
  layout,
38
- className: cn("bg-background text-foreground", layout === "viewport" && "h-svh overflow-hidden", className),
38
+ surface: "background",
39
+ className: cn(layout === "viewport" && "h-svh overflow-hidden", className),
39
40
  style: providerStyle,
40
41
  ...props,
41
42
  children: /* @__PURE__ */ jsx(SettingsShell, {
@@ -95,7 +96,8 @@ function SettingsShell({ pages, currentPage, query, results, backAction, searchP
95
96
  /* @__PURE__ */ jsxs(Sidebar, {
96
97
  collapsible: "offcanvas",
97
98
  children: [/* @__PURE__ */ jsxs(SidebarHeader, {
98
- className: "gap-3 border-b border-sidebar-border p-3",
99
+ divider: true,
100
+ className: "gap-3",
99
101
  children: [backAction ? /* @__PURE__ */ jsx("div", {
100
102
  className: "min-w-0",
101
103
  children: backAction
@@ -144,13 +146,10 @@ function SettingsSearch({ value, label, placeholder, onValueChange }) {
144
146
  return /* @__PURE__ */ jsxs(InputGroup, {
145
147
  size: "sm",
146
148
  children: [
147
- /* @__PURE__ */ jsx(InputGroupAddon, {
148
- className: "ps-2.5",
149
- children: /* @__PURE__ */ jsx(SearchIcon, {
150
- className: "size-3.5",
151
- "aria-hidden": "true"
152
- })
153
- }),
149
+ /* @__PURE__ */ jsx(InputGroupAddon, { children: /* @__PURE__ */ jsx(SearchIcon, {
150
+ className: "size-3.5",
151
+ "aria-hidden": "true"
152
+ }) }),
154
153
  /* @__PURE__ */ jsx(Input, {
155
154
  type: "search",
156
155
  "aria-label": label,
@@ -203,7 +202,6 @@ function SettingsSearchNavigation({ results, onSelect, onClear }) {
203
202
  }
204
203
  return /* @__PURE__ */ jsx(Fragment$1, { children: [...groups.values()].map((group) => /* @__PURE__ */ jsxs(SidebarGroup, { children: [/* @__PURE__ */ jsxs(SidebarGroupLabel, { children: [group.page.icon, /* @__PURE__ */ jsx("span", { children: group.page.title })] }), /* @__PURE__ */ jsx(SidebarMenu, { children: group.results.map((result) => /* @__PURE__ */ jsx(SidebarMenuItem, { children: /* @__PURE__ */ jsx(SidebarMenuButton, {
205
204
  size: "sm",
206
- className: "h-auto min-h-(--control-h-sm) py-1.5",
207
205
  onClick: () => onSelect(result),
208
206
  children: /* @__PURE__ */ jsx("span", {
209
207
  title: result.setting.title,
@@ -222,58 +220,56 @@ function SettingsPage({ page, instanceId }) {
222
220
  }), page.sections.map((section) => /* @__PURE__ */ jsxs(FieldSet, {
223
221
  className: "gap-3",
224
222
  children: [/* @__PURE__ */ jsx(FieldLegend, {
225
- className: "text-body font-semibold",
223
+ variant: "section",
226
224
  children: section.title
227
225
  }), /* @__PURE__ */ jsx(FieldGroup, {
228
- className: "gap-0 overflow-hidden rounded-[var(--radius-lg)] border bg-card",
229
- children: section.settings.map((setting, index) => /* @__PURE__ */ jsx(SettingsRow, {
226
+ variant: "card",
227
+ children: section.settings.map((setting) => /* @__PURE__ */ jsx(SettingsRow, {
230
228
  pageId: page.id,
231
229
  sectionId: section.id,
232
230
  setting,
233
- instanceId,
234
- separated: index > 0
231
+ instanceId
235
232
  }, setting.id))
236
233
  })]
237
234
  }, section.id))]
238
235
  });
239
236
  }
240
- function SettingsRow({ pageId, sectionId, setting, instanceId, separated }) {
237
+ function SettingsRow({ pageId, sectionId, setting, instanceId }) {
241
238
  const ids = settingDomIds(instanceId, pageId, sectionId, setting.id);
242
239
  const controlProps = {
243
240
  id: ids.control,
244
241
  "aria-labelledby": ids.label,
245
242
  "aria-describedby": setting.description ? ids.description : void 0
246
243
  };
247
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [separated ? /* @__PURE__ */ jsx(FieldSeparator, {}) : null, /* @__PURE__ */ jsxs(Field, {
244
+ return /* @__PURE__ */ jsx("div", {
248
245
  id: ids.row,
249
- orientation: "responsive",
250
246
  tabIndex: -1,
251
- className: "scroll-m-8 gap-3 p-4 outline-none transition-colors duration-[var(--duration-fast)] focus:bg-foreground/4 focus-within:bg-foreground/4",
252
- children: [/* @__PURE__ */ jsxs(FieldContent, { children: [/* @__PURE__ */ jsx(FieldLabel, {
253
- id: ids.label,
254
- htmlFor: ids.control,
255
- className: "leading-snug",
256
- children: setting.title
257
- }), setting.description ? /* @__PURE__ */ jsx(FieldDescription, {
258
- id: ids.description,
259
- children: setting.description
260
- }) : null] }), /* @__PURE__ */ jsx("div", {
261
- className: "flex shrink-0 items-center",
262
- children: setting.renderControl(controlProps)
263
- })]
264
- })] });
247
+ className: "scroll-m-8 outline-none transition-colors duration-[var(--duration-fast)] focus:bg-foreground/4 focus-within:bg-foreground/4",
248
+ children: /* @__PURE__ */ jsxs(Field, {
249
+ orientation: "responsive",
250
+ className: "gap-3",
251
+ children: [/* @__PURE__ */ jsxs(FieldContent, { children: [/* @__PURE__ */ jsx(FieldLabel, {
252
+ id: ids.label,
253
+ htmlFor: ids.control,
254
+ children: setting.title
255
+ }), setting.description ? /* @__PURE__ */ jsx(FieldDescription, {
256
+ id: ids.description,
257
+ children: setting.description
258
+ }) : null] }), /* @__PURE__ */ jsx("div", {
259
+ className: "flex shrink-0 items-center",
260
+ children: setting.renderControl(controlProps)
261
+ })]
262
+ })
263
+ });
265
264
  }
266
265
  function SettingsEmpty({ title, description, action }) {
267
266
  return /* @__PURE__ */ jsxs(Empty, {
268
- className: "min-h-40 gap-3 p-4",
267
+ className: "min-h-40",
269
268
  children: [/* @__PURE__ */ jsxs(EmptyHeader, { children: [
270
- /* @__PURE__ */ jsx(EmptyMedia, {
271
- className: "mb-0 size-8",
272
- children: /* @__PURE__ */ jsx(SearchIcon, {
273
- className: "size-4",
274
- "aria-hidden": "true"
275
- })
276
- }),
269
+ /* @__PURE__ */ jsx(EmptyMedia, { children: /* @__PURE__ */ jsx(SearchIcon, {
270
+ className: "size-4",
271
+ "aria-hidden": "true"
272
+ }) }),
277
273
  /* @__PURE__ */ jsx(EmptyTitle, { children: title }),
278
274
  /* @__PURE__ */ jsx(EmptyDescription, { children: description })
279
275
  ] }), action ? /* @__PURE__ */ jsx(EmptyContent, { children: action }) : null]
@@ -7,7 +7,8 @@ import { jsx, jsxs } from "react/jsx-runtime";
7
7
  function TeamChatBlock({ sidebar, children, thread, threadLabel = "Thread", className, ...props }) {
8
8
  const threadIsOpen = thread !== void 0 && thread !== null;
9
9
  return /* @__PURE__ */ jsxs(SidebarProvider, {
10
- className: cn("bg-background text-foreground", className),
10
+ surface: "background",
11
+ className,
11
12
  ...props,
12
13
  children: [sidebar, /* @__PURE__ */ jsxs(SidebarInset, {
13
14
  className: "@container/team-chat flex h-full min-h-0 min-w-0 flex-row",
@@ -31,12 +31,13 @@ export type ThemeSwitchProps = Omit<ComponentProps<typeof Switch>, "checked" | "
31
31
  export type ThemeSegmentedSwitchProps = Omit<ComponentProps<"div">, "onChange"> & ThemeControlProps & {
32
32
  name?: string;
33
33
  showLabels?: boolean;
34
+ disabled?: boolean;
34
35
  };
35
36
  export type ThemeDropdownProps = Omit<ComponentProps<typeof DropdownMenuTrigger>, "children" | "value" | "onChange"> & ThemeControlProps & {
36
37
  label?: string;
37
38
  };
38
39
  export declare function ThemeSwitch({ value, onValueChange, onValue, offValue, checkedIcon, uncheckedIcon, "aria-label": ariaLabel, ...props }: ThemeSwitchProps): import("react").JSX.Element;
39
- export declare function ThemeSegmentedSwitch({ value, onValueChange, options, showLabels, name, className, style, "aria-label": ariaLabel, ...props }: ThemeSegmentedSwitchProps): import("react").JSX.Element;
40
+ export declare function ThemeSegmentedSwitch({ value, onValueChange, options, showLabels, disabled, name, className, style, "aria-label": ariaLabel, ...props }: ThemeSegmentedSwitchProps): import("react").JSX.Element;
40
41
  export declare function ThemeToggle({ value, onValueChange, options, showLabel, showLabels, className, onClick, "aria-label": ariaLabel, ...props }: ThemeToggleProps): import("react").JSX.Element;
41
42
  export declare function ThemeDropdown({ value, onValueChange, options, label, className, "aria-label": ariaLabel, ...props }: ThemeDropdownProps): import("react").JSX.Element;
42
43
  //#endregion
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { Button } from "../ui/button.js";
3
+ import { Text } from "../ui/typography.js";
3
4
  import { DropdownMenu, DropdownMenuContent, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger } from "../ui/dropdown-menu.js";
4
5
  import { Switch } from "../ui/switch.js";
5
6
  import { useId } from "react";
@@ -57,9 +58,12 @@ function ThemeSwitch({ value, onValueChange, onValue = "dark", offValue = "light
57
58
  ...props
58
59
  });
59
60
  }
60
- function ThemeSegmentedSwitch({ value, onValueChange, options = defaultThemeOptions, showLabels = false, name, className, style, "aria-label": ariaLabel = "Theme", ...props }) {
61
+ function ThemeSegmentedSwitch({ value, onValueChange, options = defaultThemeOptions, showLabels = false, disabled = false, name, className, style, "aria-label": ariaLabel = "Theme", ...props }) {
61
62
  const generatedName = useId();
62
- const choices = controlOptions(options);
63
+ const choices = controlOptions(options).map((option) => disabled ? {
64
+ ...option,
65
+ disabled: true
66
+ } : option);
63
67
  const currentValue = effectiveThemeValue(value, choices);
64
68
  const indicatorStyle = {
65
69
  "--_theme-switch-index": Math.max(0, choices.findIndex((option) => option.value === currentValue)),
@@ -68,6 +72,7 @@ function ThemeSegmentedSwitch({ value, onValueChange, options = defaultThemeOpti
68
72
  return /* @__PURE__ */ jsxs("div", {
69
73
  role: "radiogroup",
70
74
  "aria-label": ariaLabel,
75
+ "aria-disabled": disabled || void 0,
71
76
  "data-control-ui": "theme-toggle",
72
77
  "data-control-family": "theme-toggle",
73
78
  "data-slot": "root",
@@ -91,7 +96,7 @@ function ThemeSegmentedSwitch({ value, onValueChange, options = defaultThemeOpti
91
96
  "data-control": "true",
92
97
  "data-selected": selected ? "true" : void 0,
93
98
  "data-disabled": option.disabled ? "true" : void 0,
94
- className: classes("relative z-[1] inline-flex h-(--control-h-xs) cursor-pointer items-center justify-center gap-1.5 rounded-(--_theme-switch-radius) px-1.5 text-label font-medium transition-colors duration-(--duration-fast) ease-(--ease-standard) not-data-[disabled=true]:hover:text-foreground data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-(--disabled-opacity) data-[selected=true]:text-foreground", showLabels ? "min-w-20" : "w-(--control-h-xs)"),
99
+ className: classes("relative z-[1] inline-flex h-(--control-h-xs) cursor-pointer items-center justify-center gap-1.5 rounded-(--_theme-switch-radius) px-1.5 transition-colors duration-(--duration-fast) ease-(--ease-standard) not-data-[disabled=true]:hover:text-foreground data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-(--disabled-opacity) data-[selected=true]:text-foreground", showLabels ? "min-w-20" : "w-(--control-h-xs)"),
95
100
  children: [
96
101
  /* @__PURE__ */ jsx("input", {
97
102
  type: "radio",
@@ -109,7 +114,11 @@ function ThemeSegmentedSwitch({ value, onValueChange, options = defaultThemeOpti
109
114
  className: "size-3.5",
110
115
  "aria-hidden": true
111
116
  }),
112
- showLabels ? /* @__PURE__ */ jsx("span", { children: option.label }) : null
117
+ showLabels ? /* @__PURE__ */ jsx(Text, {
118
+ size: "label",
119
+ weight: "medium",
120
+ children: option.label
121
+ }) : null
113
122
  ]
114
123
  }, option.value);
115
124
  })]
@@ -1,5 +1,5 @@
1
1
  //#region src/hooks/use-mobile.d.ts
2
2
  type Breakpoint = number | `--${string}`;
3
- /** True below `breakpoint`: px (Tailwind `md` by default) or a theme breakpoint token such as `--breakpoint-lg`, so JS and the matching Tailwind variant share one value. */
3
+ /** True below `breakpoint`: px (Tailwind `md` by default) or a theme breakpoint token such as `--breakpoint-sidebar`, so JS and the matching Tailwind variant share one value. */
4
4
  export declare function useIsMobile(breakpoint?: Breakpoint): boolean;
5
5
  //#endregion
@@ -24,7 +24,7 @@ function viewportStore(breakpoint) {
24
24
  function getServerViewportSnapshot() {
25
25
  return false;
26
26
  }
27
- /** True below `breakpoint`: px (Tailwind `md` by default) or a theme breakpoint token such as `--breakpoint-lg`, so JS and the matching Tailwind variant share one value. */
27
+ /** True below `breakpoint`: px (Tailwind `md` by default) or a theme breakpoint token such as `--breakpoint-sidebar`, so JS and the matching Tailwind variant share one value. */
28
28
  function useIsMobile(breakpoint = MOBILE_BREAKPOINT) {
29
29
  const store = viewportStore(breakpoint);
30
30
  return useSyncExternalStore(store.subscribe, store.getSnapshot, getServerViewportSnapshot);
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/badge-knobs.d.ts
2
- export declare const badgeKnobs: readonly ["--cui-badge-radius", "--cui-badge-background", "--cui-badge-foreground", "--cui-badge-border-color", "--cui-badge-font-size"];
2
+ export declare const badgeKnobs: readonly ["--cui-badge-radius", "--cui-badge-background", "--cui-badge-foreground", "--cui-badge-border-color", "--cui-badge-border-width", "--cui-badge-font-size", "--cui-badge-font-weight"];
3
3
  export type BadgeKnobStyle = Partial<Record<(typeof badgeKnobs)[number], string>>;
4
4
  //#endregion
@@ -4,7 +4,9 @@ const badgeKnobs = [
4
4
  "--cui-badge-background",
5
5
  "--cui-badge-foreground",
6
6
  "--cui-badge-border-color",
7
- "--cui-badge-font-size"
7
+ "--cui-badge-border-width",
8
+ "--cui-badge-font-size",
9
+ "--cui-badge-font-weight"
8
10
  ];
9
11
  //#endregion
10
12
  export { badgeKnobs };
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/button-knobs.d.ts
2
- export declare const buttonKnobs: readonly ["--cui-button-radius", "--cui-button-gap", "--cui-button-icon", "--cui-button-height", "--cui-button-padding-inline", "--cui-button-icon-padding-inline", "--cui-button-font-size", "--cui-button-background", "--cui-button-background-image", "--cui-button-hover-background-image", "--cui-button-foreground", "--cui-button-hover-background", "--cui-button-hover-foreground", "--cui-button-press-background", "--cui-button-press-scale", "--cui-button-active-background", "--cui-button-active-foreground", "--cui-button-active-hover-background", "--cui-button-shadow", "--cui-button-hover-shadow", "--cui-button-press-shadow", "--cui-button-active-shadow", "--cui-button-open-background", "--cui-button-open-foreground", "--cui-button-open-shadow"];
2
+ export declare const buttonKnobs: readonly ["--cui-button-radius", "--cui-button-gap", "--cui-button-icon", "--cui-button-height", "--cui-button-padding-inline", "--cui-button-icon-padding-inline", "--cui-button-font-size", "--cui-button-font-weight", "--cui-button-background", "--cui-button-background-image", "--cui-button-hover-background-image", "--cui-button-foreground", "--cui-button-hover-background", "--cui-button-hover-foreground", "--cui-button-press-background", "--cui-button-press-scale", "--cui-button-active-background", "--cui-button-active-foreground", "--cui-button-active-hover-background", "--cui-button-shadow", "--cui-button-hover-shadow", "--cui-button-press-shadow", "--cui-button-active-shadow", "--cui-button-open-background", "--cui-button-open-foreground", "--cui-button-open-shadow"];
3
3
  export type ButtonKnobStyle = Partial<Record<(typeof buttonKnobs)[number], string>>;
4
4
  //#endregion
@@ -7,6 +7,7 @@ const buttonKnobs = [
7
7
  "--cui-button-padding-inline",
8
8
  "--cui-button-icon-padding-inline",
9
9
  "--cui-button-font-size",
10
+ "--cui-button-font-weight",
10
11
  "--cui-button-background",
11
12
  "--cui-button-background-image",
12
13
  "--cui-button-hover-background-image",
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/calendar-knobs.d.ts
2
- export declare const calendarKnobs: readonly ["--cui-calendar-day-radius", "--cui-calendar-today-background", "--cui-calendar-selected-background", "--cui-calendar-selected-foreground", "--cui-calendar-range-background"];
2
+ export declare const calendarKnobs: readonly ["--cui-calendar-day-radius", "--cui-calendar-today-background", "--cui-calendar-selected-background", "--cui-calendar-selected-foreground", "--cui-calendar-range-background", "--cui-calendar-day-size", "--cui-calendar-cell-padding", "--cui-calendar-today-shadow", "--cui-calendar-weekend-foreground", "--cui-calendar-weekend-background", "--cui-calendar-caption-font-size", "--cui-calendar-caption-font-weight", "--cui-calendar-weekday-font-size"];
3
3
  export type CalendarKnobStyle = Partial<Record<(typeof calendarKnobs)[number], string>>;
4
4
  //#endregion
@@ -4,7 +4,15 @@ const calendarKnobs = [
4
4
  "--cui-calendar-today-background",
5
5
  "--cui-calendar-selected-background",
6
6
  "--cui-calendar-selected-foreground",
7
- "--cui-calendar-range-background"
7
+ "--cui-calendar-range-background",
8
+ "--cui-calendar-day-size",
9
+ "--cui-calendar-cell-padding",
10
+ "--cui-calendar-today-shadow",
11
+ "--cui-calendar-weekend-foreground",
12
+ "--cui-calendar-weekend-background",
13
+ "--cui-calendar-caption-font-size",
14
+ "--cui-calendar-caption-font-weight",
15
+ "--cui-calendar-weekday-font-size"
8
16
  ];
9
17
  //#endregion
10
18
  export { calendarKnobs };
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/card-knobs.d.ts
2
- export declare const cardKnobs: readonly ["--cui-card-radius", "--cui-card-background", "--cui-card-border-color", "--cui-card-border-width", "--cui-card-shadow", "--cui-card-backdrop-filter"];
2
+ export declare const cardKnobs: readonly ["--cui-card-radius", "--cui-card-background", "--cui-card-border-color", "--cui-card-border-width", "--cui-card-shadow", "--cui-card-backdrop-filter", "--cui-card-padding-block", "--cui-card-padding-inline", "--cui-card-gap", "--cui-card-title-font-size"];
3
3
  export type CardKnobStyle = Partial<Record<(typeof cardKnobs)[number], string>>;
4
4
  //#endregion
@@ -5,7 +5,11 @@ const cardKnobs = [
5
5
  "--cui-card-border-color",
6
6
  "--cui-card-border-width",
7
7
  "--cui-card-shadow",
8
- "--cui-card-backdrop-filter"
8
+ "--cui-card-backdrop-filter",
9
+ "--cui-card-padding-block",
10
+ "--cui-card-padding-inline",
11
+ "--cui-card-gap",
12
+ "--cui-card-title-font-size"
9
13
  ];
10
14
  //#endregion
11
15
  export { cardKnobs };
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/choice-knobs.d.ts
2
- export declare const choiceKnobs: readonly ["--cui-choice-radius", "--cui-choice-border-color", "--cui-choice-border-width", "--cui-choice-background", "--cui-choice-checked-background", "--cui-choice-checked-border-color", "--cui-choice-shadow"];
2
+ export declare const choiceKnobs: readonly ["--cui-choice-size", "--cui-choice-radius", "--cui-choice-border-color", "--cui-choice-border-width", "--cui-choice-background", "--cui-choice-checked-background", "--cui-choice-checked-border-color", "--cui-choice-shadow"];
3
3
  export type ChoiceKnobStyle = Partial<Record<(typeof choiceKnobs)[number], string>>;
4
4
  //#endregion
@@ -1,5 +1,6 @@
1
1
  //#region src/knob-contracts/choice-knobs.ts
2
2
  const choiceKnobs = [
3
+ "--cui-choice-size",
3
4
  "--cui-choice-radius",
4
5
  "--cui-choice-border-color",
5
6
  "--cui-choice-border-width",
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/collapsible-knobs.d.ts
2
- export declare const collapsibleKnobs: readonly ["--cui-collapsible-trigger-radius", "--cui-collapsible-trigger-hover-background"];
2
+ export declare const collapsibleKnobs: readonly ["--cui-collapsible-trigger-radius", "--cui-collapsible-trigger-hover-background", "--cui-collapsible-trigger-padding-inline"];
3
3
  export type CollapsibleKnobStyle = Partial<Record<(typeof collapsibleKnobs)[number], string>>;
4
4
  //#endregion
@@ -1,4 +1,8 @@
1
1
  //#region src/knob-contracts/collapsible-knobs.ts
2
- const collapsibleKnobs = ["--cui-collapsible-trigger-radius", "--cui-collapsible-trigger-hover-background"];
2
+ const collapsibleKnobs = [
3
+ "--cui-collapsible-trigger-radius",
4
+ "--cui-collapsible-trigger-hover-background",
5
+ "--cui-collapsible-trigger-padding-inline"
6
+ ];
3
7
  //#endregion
4
8
  export { collapsibleKnobs };
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/emoji-picker-knobs.d.ts
2
- export declare const emojiPickerKnobs: readonly ["--cui-emoji-picker-cell-size", "--cui-emoji-picker-height", "--cui-emoji-picker-cell-radius", "--cui-emoji-picker-glyph-size", "--cui-emoji-picker-active-background", "--cui-emoji-picker-header-background", "--cui-emoji-picker-header-foreground"];
2
+ export declare const emojiPickerKnobs: readonly ["--cui-emoji-picker-cell-size", "--cui-emoji-picker-height", "--cui-emoji-picker-cell-radius", "--cui-emoji-picker-glyph-size", "--cui-emoji-picker-active-background", "--cui-emoji-picker-header-background", "--cui-emoji-picker-header-foreground", "--cui-emoji-picker-header-font-size", "--cui-emoji-picker-search-font-size"];
3
3
  export type EmojiPickerKnobStyle = Partial<Record<(typeof emojiPickerKnobs)[number], string>>;
4
4
  //#endregion
@@ -6,7 +6,9 @@ const emojiPickerKnobs = [
6
6
  "--cui-emoji-picker-glyph-size",
7
7
  "--cui-emoji-picker-active-background",
8
8
  "--cui-emoji-picker-header-background",
9
- "--cui-emoji-picker-header-foreground"
9
+ "--cui-emoji-picker-header-foreground",
10
+ "--cui-emoji-picker-header-font-size",
11
+ "--cui-emoji-picker-search-font-size"
10
12
  ];
11
13
  //#endregion
12
14
  export { emojiPickerKnobs };
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/field-knobs.d.ts
2
- export declare const fieldKnobs: readonly ["--cui-field-radius", "--cui-field-background", "--cui-field-hover-background", "--cui-field-affordance-background", "--cui-field-affordance-shadow", "--cui-field-affordance-foreground", "--cui-field-affordance-hover-background", "--cui-field-foreground", "--cui-field-border-color", "--cui-field-border-width", "--cui-field-shadow", "--cui-field-backdrop-filter", "--cui-field-height", "--cui-field-padding-inline", "--cui-field-font-size"];
2
+ export declare const fieldKnobs: readonly ["--cui-field-legend-font-size", "--cui-field-legend-font-weight", "--cui-field-radius", "--cui-field-background", "--cui-field-hover-background", "--cui-field-affordance-background", "--cui-field-affordance-shadow", "--cui-field-affordance-foreground", "--cui-field-affordance-hover-background", "--cui-field-foreground", "--cui-field-border-color", "--cui-field-border-width", "--cui-field-shadow", "--cui-field-backdrop-filter", "--cui-field-height", "--cui-field-padding-inline", "--cui-field-font-size", "--cui-field-font-weight", "--cui-field-font-family", "--cui-field-group-radius", "--cui-field-group-background", "--cui-field-group-border-color", "--cui-field-group-border-width", "--cui-field-group-shadow", "--cui-field-group-padding-block", "--cui-field-group-padding-inline", "--cui-field-group-separator-color", "--cui-field-group-separator-inset", "--cui-field-label-font-size", "--cui-field-label-font-weight", "--cui-field-description-font-size"];
3
3
  export type FieldKnobStyle = Partial<Record<(typeof fieldKnobs)[number], string>>;
4
4
  //#endregion