torch-glare 2.3.0 → 2.4.1

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 (264) hide show
  1. package/README.md +8 -0
  2. package/apps/lib/components/ActionButton.tsx +7 -12
  3. package/apps/lib/components/ActionsGroup.tsx +4 -15
  4. package/apps/lib/components/AlertDialog.tsx +173 -191
  5. package/apps/lib/components/Avatar.tsx +13 -16
  6. package/apps/lib/components/Badge.tsx +7 -3
  7. package/apps/lib/components/BadgeField.tsx +76 -71
  8. package/apps/lib/components/Breadcrumb.tsx +49 -85
  9. package/apps/lib/components/Button.tsx +20 -19
  10. package/apps/lib/components/ButtonGroup.tsx +31 -41
  11. package/apps/lib/components/Calendar.tsx +51 -29
  12. package/apps/lib/components/Card.tsx +2 -13
  13. package/apps/lib/components/ChartBlockTool.ts +17 -52
  14. package/apps/lib/components/Checkbox.tsx +9 -16
  15. package/apps/lib/components/ContextMenu.tsx +110 -106
  16. package/apps/lib/components/CountBadge.tsx +4 -6
  17. package/apps/lib/components/DataTable.tsx +196 -216
  18. package/apps/lib/components/DataViews/DataViewRadio.tsx +10 -8
  19. package/apps/lib/components/DataViews/DataViewsConfigPanel.tsx +21 -55
  20. package/apps/lib/components/DataViews/DataViewsHeader.tsx +1 -3
  21. package/apps/lib/components/DataViews/DataViewsLayout.tsx +5 -12
  22. package/apps/lib/components/DataViews/FilterPanel.tsx +173 -150
  23. package/apps/lib/components/DataViews/HeaderSearch.tsx +1 -5
  24. package/apps/lib/components/DataViews/InboxView.tsx +22 -68
  25. package/apps/lib/components/DataViews/InboxViewCard.tsx +68 -77
  26. package/apps/lib/components/DataViews/KanbanView.tsx +8 -25
  27. package/apps/lib/components/DataViews/PanelControls.tsx +3 -13
  28. package/apps/lib/components/DataViews/SettingsPanel.tsx +83 -89
  29. package/apps/lib/components/DataViews/TableView.tsx +8 -28
  30. package/apps/lib/components/DataViews/TreeView.tsx +12 -40
  31. package/apps/lib/components/DataViews/badgeAdapter.ts +32 -28
  32. package/apps/lib/components/DataViews/fieldRenderers.tsx +106 -141
  33. package/apps/lib/components/DataViews/filters/DatePickerRangeFilter.tsx +87 -0
  34. package/apps/lib/components/DataViews/filters/DateRangePopover.tsx +39 -32
  35. package/apps/lib/components/DataViews/filters/PresetChips.tsx +15 -15
  36. package/apps/lib/components/DataViews/filters/RangeSliderWithInputs.tsx +69 -58
  37. package/apps/lib/components/DataViews/index.ts +26 -26
  38. package/apps/lib/components/DataViews/tree/TreeDrawer.tsx +12 -16
  39. package/apps/lib/components/DataViews/tree/TreeSidebar.tsx +28 -31
  40. package/apps/lib/components/DataViews/types.ts +111 -114
  41. package/apps/lib/components/DatePicker.tsx +198 -191
  42. package/apps/lib/components/Dialog.tsx +92 -105
  43. package/apps/lib/components/Divider.tsx +21 -24
  44. package/apps/lib/components/Drawer.tsx +79 -139
  45. package/apps/lib/components/DropdownMenu.tsx +144 -181
  46. package/apps/lib/components/FieldHint.tsx +4 -11
  47. package/apps/lib/components/Form.tsx +146 -155
  48. package/apps/lib/components/FormStepper.tsx +9 -39
  49. package/apps/lib/components/HeaderBar.tsx +119 -0
  50. package/apps/lib/components/ImageAttachment.tsx +111 -73
  51. package/apps/lib/components/InnerLabelField.tsx +20 -16
  52. package/apps/lib/components/Input.tsx +171 -172
  53. package/apps/lib/components/InputField.tsx +44 -45
  54. package/apps/lib/components/InputOTP.tsx +68 -69
  55. package/apps/lib/components/Label.tsx +31 -35
  56. package/apps/lib/components/LabelField.tsx +4 -5
  57. package/apps/lib/components/LabeledCheckBox.tsx +8 -12
  58. package/apps/lib/components/LabeledRadio.tsx +7 -5
  59. package/apps/lib/components/LinkButton.tsx +2 -9
  60. package/apps/lib/components/LoginButton.tsx +4 -9
  61. package/apps/lib/components/PasswordLevel.tsx +5 -5
  62. package/apps/lib/components/Popover.tsx +15 -33
  63. package/apps/lib/components/ProfileMenu.tsx +67 -72
  64. package/apps/lib/components/Radio.tsx +1 -5
  65. package/apps/lib/components/RadioCard.tsx +9 -28
  66. package/apps/lib/components/ScrollArea.tsx +45 -43
  67. package/apps/lib/components/SearchField.tsx +49 -39
  68. package/apps/lib/components/SearchableSelect.tsx +46 -52
  69. package/apps/lib/components/SearchableTable.tsx +199 -219
  70. package/apps/lib/components/SearchableTree.tsx +469 -0
  71. package/apps/lib/components/SearchableTreeDialog.tsx +493 -0
  72. package/apps/lib/components/SectionBlock.tsx +4 -16
  73. package/apps/lib/components/Select.tsx +53 -80
  74. package/apps/lib/components/SimpleSelect.tsx +196 -187
  75. package/apps/lib/components/Skeleton.tsx +9 -12
  76. package/apps/lib/components/SlideDatePicker.tsx +215 -166
  77. package/apps/lib/components/SpinLoading.tsx +33 -49
  78. package/apps/lib/components/Stepper.tsx +13 -56
  79. package/apps/lib/components/Switch.tsx +8 -10
  80. package/apps/lib/components/TabFormItem.tsx +3 -12
  81. package/apps/lib/components/TabSwitch.tsx +7 -34
  82. package/apps/lib/components/Table.tsx +60 -75
  83. package/apps/lib/components/TableDnDWrapper.ts +15 -48
  84. package/apps/lib/components/TextEditor.tsx +93 -104
  85. package/apps/lib/components/Textarea.tsx +8 -12
  86. package/apps/lib/components/Timeline.tsx +21 -41
  87. package/apps/lib/components/Toast.tsx +83 -83
  88. package/apps/lib/components/Toggle.tsx +112 -114
  89. package/apps/lib/components/ToggleButton.tsx +1 -1
  90. package/apps/lib/components/Tooltip.tsx +24 -19
  91. package/apps/lib/components/TransparentLabel.tsx +61 -62
  92. package/apps/lib/components/TreeDropDown.tsx +86 -52
  93. package/apps/lib/components/TreeFolder/TreeFolder.tsx +15 -48
  94. package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +16 -21
  95. package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +9 -20
  96. package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +3 -3
  97. package/apps/lib/components/TreeFolder/icons.tsx +14 -17
  98. package/apps/lib/components/TreeFolder/index.ts +15 -8
  99. package/apps/lib/components/TreeFolder/treeFolderUtils.ts +47 -52
  100. package/apps/lib/components/TreeFolder/types.ts +32 -32
  101. package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +117 -123
  102. package/apps/lib/hooks/useActiveTreeItem.ts +52 -55
  103. package/apps/lib/hooks/useClickOutside.ts +21 -20
  104. package/apps/lib/hooks/useDataViewsState.ts +86 -80
  105. package/apps/lib/hooks/useIsMobile.ts +12 -12
  106. package/apps/lib/hooks/useResize.ts +54 -65
  107. package/apps/lib/hooks/useTagSelection.ts +201 -201
  108. package/apps/lib/layouts/CNLayout.tsx +181 -140
  109. package/apps/lib/layouts/DataViewCard.tsx +4 -18
  110. package/apps/lib/layouts/FieldSection.tsx +2 -6
  111. package/apps/lib/layouts/TreeSubLayout.tsx +24 -38
  112. package/apps/lib/providers/ThemeProvider.tsx +8 -23
  113. package/apps/lib/registry.json +1004 -0
  114. package/apps/lib/tsconfig.json +9 -0
  115. package/apps/lib/utils/cn.ts +1 -1
  116. package/apps/lib/utils/dataViews/columnUtils.ts +46 -44
  117. package/apps/lib/utils/dataViews/fieldUtils.ts +70 -71
  118. package/apps/lib/utils/dataViews/nestedDataUtils.tsx +129 -122
  119. package/apps/lib/utils/dataViews/pathUtils.ts +74 -67
  120. package/apps/lib/utils/dataViews/rangeUtils.ts +121 -112
  121. package/apps/lib/utils/dataViews/treeUtils.ts +204 -211
  122. package/apps/lib/utils/dateFormat.ts +64 -54
  123. package/apps/lib/utils/markdownParser.ts +2 -7
  124. package/apps/lib/utils/resize.ts +21 -25
  125. package/apps/lib/utils/types.ts +13 -13
  126. package/dist/bin/index.js +8 -2
  127. package/dist/bin/index.js.map +1 -1
  128. package/dist/src/shared/getAvailableFiles.d.ts.map +1 -1
  129. package/dist/src/shared/getAvailableFiles.js +6 -1
  130. package/dist/src/shared/getAvailableFiles.js.map +1 -1
  131. package/dist/src/shared/loadRegistry.d.ts +7 -0
  132. package/dist/src/shared/loadRegistry.d.ts.map +1 -0
  133. package/dist/src/shared/loadRegistry.js +31 -0
  134. package/dist/src/shared/loadRegistry.js.map +1 -0
  135. package/dist/src/shared/resolveInstallPlan.d.ts +12 -0
  136. package/dist/src/shared/resolveInstallPlan.d.ts.map +1 -0
  137. package/dist/src/shared/resolveInstallPlan.js +39 -0
  138. package/dist/src/shared/resolveInstallPlan.js.map +1 -0
  139. package/dist/src/types/main.d.ts +24 -0
  140. package/dist/src/types/main.d.ts.map +1 -1
  141. package/docs/README.md +10 -2
  142. package/docs/components/action-button.md +30 -24
  143. package/docs/components/actions-group.md +26 -20
  144. package/docs/components/alert-dialog.md +45 -45
  145. package/docs/components/avatar.md +6 -2
  146. package/docs/components/badge-field.md +6 -2
  147. package/docs/components/badge.md +7 -1
  148. package/docs/components/breadcrumb.md +15 -40
  149. package/docs/components/button-group.md +13 -10
  150. package/docs/components/button.md +58 -33
  151. package/docs/components/calendar.md +26 -19
  152. package/docs/components/card.md +19 -16
  153. package/docs/components/chart-block-tool.md +128 -0
  154. package/docs/components/checkbox.md +16 -8
  155. package/docs/components/cn-layout.md +7 -1
  156. package/docs/components/context-menu.md +47 -24
  157. package/docs/components/count-badge.md +7 -1
  158. package/docs/components/data-table.md +45 -33
  159. package/docs/components/data-views-config-panel.md +18 -14
  160. package/docs/components/data-views-layout.md +20 -17
  161. package/docs/components/date-picker.md +30 -23
  162. package/docs/components/dialog.md +43 -42
  163. package/docs/components/divider.md +10 -4
  164. package/docs/components/drawer.md +8 -33
  165. package/docs/components/dropdown-menu.md +51 -32
  166. package/docs/components/field-hint.md +37 -25
  167. package/docs/components/field-section.md +9 -3
  168. package/docs/components/form-stepper.md +6 -0
  169. package/docs/components/form.md +17 -20
  170. package/docs/components/header-bar.md +187 -0
  171. package/docs/components/image-attachment.md +33 -41
  172. package/docs/components/inbox-view.md +16 -5
  173. package/docs/components/inner-label-field.md +34 -24
  174. package/docs/components/input-field.md +18 -10
  175. package/docs/components/input-otp.md +14 -11
  176. package/docs/components/input.md +22 -16
  177. package/docs/components/kanban-view.md +15 -5
  178. package/docs/components/label-field.md +32 -22
  179. package/docs/components/label.md +43 -32
  180. package/docs/components/labeled-check-box.md +16 -8
  181. package/docs/components/labeled-radio.md +18 -11
  182. package/docs/components/link-button.md +7 -1
  183. package/docs/components/login-button.md +8 -2
  184. package/docs/components/password-level.md +37 -24
  185. package/docs/components/popover.md +26 -23
  186. package/docs/components/profile-menu.md +38 -27
  187. package/docs/components/radio-card.md +16 -9
  188. package/docs/components/radio.md +16 -8
  189. package/docs/components/scroll-area.md +6 -2
  190. package/docs/components/search-field.md +14 -6
  191. package/docs/components/searchable-select.md +19 -14
  192. package/docs/components/searchable-table.md +60 -41
  193. package/docs/components/searchable-tree-dialog.md +190 -0
  194. package/docs/components/searchable-tree.md +200 -0
  195. package/docs/components/section-block.md +130 -4
  196. package/docs/components/select.md +23 -18
  197. package/docs/components/simple-select.md +14 -10
  198. package/docs/components/skeleton.md +43 -33
  199. package/docs/components/slide-date-picker.md +37 -29
  200. package/docs/components/spin-loading.md +32 -23
  201. package/docs/components/stepper.md +6 -0
  202. package/docs/components/switch.md +14 -6
  203. package/docs/components/tab-form-item.md +7 -1
  204. package/docs/components/tab-switch.md +13 -6
  205. package/docs/components/table-dnd-wrapper.md +105 -0
  206. package/docs/components/table-view.md +15 -5
  207. package/docs/components/table.md +28 -28
  208. package/docs/components/text-editor.md +19 -13
  209. package/docs/components/textarea.md +15 -7
  210. package/docs/components/timeline.md +6 -0
  211. package/docs/components/toast.md +35 -26
  212. package/docs/components/toggle-button.md +24 -21
  213. package/docs/components/toggle.md +23 -15
  214. package/docs/components/tooltip.md +42 -30
  215. package/docs/components/transparent-label.md +29 -20
  216. package/docs/components/tree-drop-down.md +31 -23
  217. package/docs/components/tree-sub-layout.md +6 -2
  218. package/docs/components/tree-view.md +16 -5
  219. package/docs/explanation/architecture.md +54 -0
  220. package/docs/explanation/design-system.md +52 -0
  221. package/docs/how-to/data-views-from-backend-response.md +7 -4
  222. package/docs/how-to/guides.md +24 -18
  223. package/docs/migration/changelog.md +38 -0
  224. package/docs/reference/cli.md +87 -0
  225. package/docs/reference/components.md +11 -12
  226. package/docs/reference/hooks.md +8 -8
  227. package/docs/reference/providers.md +22 -22
  228. package/docs/reference/tailwind-plugins.md +2 -2
  229. package/docs/reference/theme.md +85 -0
  230. package/docs/reference/types.md +4 -4
  231. package/docs/reference/utilities.md +19 -26
  232. package/docs/tutorials/building-first-form.md +20 -13
  233. package/docs/tutorials/component-composition.md +34 -50
  234. package/docs/tutorials/getting-started.md +2 -2
  235. package/docs/tutorials/theming-basics.md +13 -10
  236. package/package.json +31 -3
  237. package/dist/src/commands/block.d.ts +0 -5
  238. package/dist/src/commands/block.d.ts.map +0 -1
  239. package/dist/src/commands/block.js +0 -255
  240. package/dist/src/commands/block.js.map +0 -1
  241. package/dist/src/shared/configureFonts.d.ts +0 -6
  242. package/dist/src/shared/configureFonts.d.ts.map +0 -1
  243. package/dist/src/shared/configureFonts.js +0 -106
  244. package/dist/src/shared/configureFonts.js.map +0 -1
  245. package/dist/src/shared/configureGlobalCss.d.ts +0 -6
  246. package/dist/src/shared/configureGlobalCss.d.ts.map +0 -1
  247. package/dist/src/shared/configureGlobalCss.js +0 -154
  248. package/dist/src/shared/configureGlobalCss.js.map +0 -1
  249. package/dist/src/shared/configureTailwind.d.ts +0 -7
  250. package/dist/src/shared/configureTailwind.d.ts.map +0 -1
  251. package/dist/src/shared/configureTailwind.js +0 -163
  252. package/dist/src/shared/configureTailwind.js.map +0 -1
  253. package/dist/src/shared/detectFramework.d.ts +0 -23
  254. package/dist/src/shared/detectFramework.d.ts.map +0 -1
  255. package/dist/src/shared/detectFramework.js +0 -119
  256. package/dist/src/shared/detectFramework.js.map +0 -1
  257. package/dist/src/shared/installBaseUtils.d.ts +0 -5
  258. package/dist/src/shared/installBaseUtils.d.ts.map +0 -1
  259. package/dist/src/shared/installBaseUtils.js +0 -79
  260. package/dist/src/shared/installBaseUtils.js.map +0 -1
  261. package/dist/src/shared/resolveAliases.d.ts +0 -24
  262. package/dist/src/shared/resolveAliases.d.ts.map +0 -1
  263. package/dist/src/shared/resolveAliases.js +0 -98
  264. package/dist/src/shared/resolveAliases.js.map +0 -1
@@ -0,0 +1,128 @@
1
+ ---
2
+ title: ChartBlockTool
3
+ description: An Editor.js block tool that renders an editable chart.js chart (bar, line, pie, doughnut, radar, polar area) inside the TORCH Glare TextEditor
4
+ group: Advanced
5
+ keywords: [chart-block-tool, editorjs, chart, chartjs, text-editor, block-tool, advanced]
6
+ ---
7
+
8
+ # ChartBlockTool
9
+
10
+ > An advanced, non-visual module: a custom [Editor.js](https://editorjs.io) **block tool**
11
+ > that renders and edits a [chart.js](https://www.chartjs.org) chart inside the TORCH Glare
12
+ > [TextEditor](./text-editor.md). It is not a React component — it is a block-tool class you
13
+ > register in an Editor.js `tools` config. TextEditor wires it up for you; add it directly only
14
+ > when you build a custom Editor.js instance.
15
+
16
+ ## Installation
17
+
18
+ TORCH Glare is a copy-in library: the CLI copies this module's source into your project
19
+ (you do **not** install it from the npm package). Run `init` once, then `add`:
20
+
21
+ ```bash
22
+ npx torch-glare@latest init
23
+ npx torch-glare@latest add ChartBlockTool
24
+ ```
25
+
26
+ It depends on the `chart.js` npm package (installed automatically by the CLI).
27
+
28
+ ## Import
29
+
30
+ ```typescript
31
+ import ChartBlockTool, { ChartBlockData } from "@/components/ChartBlockTool";
32
+ ```
33
+
34
+ ## Quick Examples
35
+
36
+ ### Register it in an Editor.js instance
37
+
38
+ ```typescript
39
+ import EditorJS from "@editorjs/editorjs";
40
+ import ChartBlockTool from "@/components/ChartBlockTool";
41
+
42
+ const editor = new EditorJS({
43
+ holder: "editor",
44
+ tools: {
45
+ chart: {
46
+ class: ChartBlockTool,
47
+ },
48
+ },
49
+ });
50
+ ```
51
+
52
+ Once registered, the tool appears in the Editor.js toolbox (title "Chart"). Selecting it
53
+ inserts an editable chart block: a title field, a chart-type selector, and label/dataset
54
+ editors. The block persists as `ChartBlockData` in the editor's saved output.
55
+
56
+ ### The saved data shape
57
+
58
+ ```typescript
59
+ import { ChartBlockData } from "@/components/ChartBlockTool";
60
+
61
+ const block: ChartBlockData = {
62
+ chartType: "bar",
63
+ title: "Quarterly revenue",
64
+ labels: ["Q1", "Q2", "Q3", "Q4"],
65
+ datasets: [
66
+ {
67
+ label: "2024",
68
+ data: [12, 19, 8, 15],
69
+ backgroundColor: "#3b82f6",
70
+ borderColor: "#1d4ed8",
71
+ },
72
+ ],
73
+ };
74
+ ```
75
+
76
+ ## API Reference
77
+
78
+ `ChartBlockTool` implements the Editor.js `BlockTool` interface. You register the **class**;
79
+ Editor.js constructs and calls it. Its public surface:
80
+
81
+ ### Props
82
+
83
+ | Member | Type | Description |
84
+ |--------|------|-------------|
85
+ | `default export` | `class ChartBlockTool` | The block-tool class to pass as `tools.chart.class`. |
86
+ | `static toolbox` | `{ title: string; icon: string }` | Toolbox entry (title "Chart" + icon) shown in the Editor.js block menu. |
87
+ | `static isReadOnlySupported` | `boolean` | `true` — the block renders in read-only editors. |
88
+ | `constructor` | `({ data, api, readOnly }) => ChartBlockTool` | Called by Editor.js with the saved `data` (`Partial<ChartBlockData>`), the editor `api`, and the `readOnly` flag. |
89
+ | `render()` | `() => HTMLElement` | Returns the block's DOM (editor UI or read-only chart). |
90
+ | `save()` | `() => ChartBlockData` | Returns the block's current data for persistence. |
91
+
92
+ ### TypeScript
93
+
94
+ ```typescript
95
+ export interface ChartBlockData {
96
+ chartType: "bar" | "line" | "pie" | "doughnut" | "radar" | "polarArea";
97
+ title: string;
98
+ labels: string[];
99
+ datasets: Array<{
100
+ label: string;
101
+ data: number[];
102
+ backgroundColor: string;
103
+ borderColor: string;
104
+ }>;
105
+ }
106
+
107
+ export default class ChartBlockTool {
108
+ static get isReadOnlySupported(): boolean;
109
+ static get toolbox(): { title: string; icon: string };
110
+ constructor(options: { data: Partial<ChartBlockData>; api: any; readOnly: boolean });
111
+ render(): HTMLElement;
112
+ save(): ChartBlockData;
113
+ }
114
+ ```
115
+
116
+ ## Common Patterns
117
+
118
+ - **Use via TextEditor:** most apps should use [TextEditor](./text-editor.md), which registers
119
+ this tool for you — you rarely construct it directly.
120
+ - **Custom Editor.js:** when building your own Editor.js instance, register the class under a
121
+ `tools` key; Editor.js handles construction and lifecycle.
122
+ - **Supported chart types:** `bar`, `line`, `pie`, `doughnut`, `radar`, `polarArea` (from
123
+ `ChartBlockData["chartType"]`).
124
+
125
+ ## Related Components
126
+
127
+ - [TextEditor](./text-editor.md) — the rich-text editor that hosts this block tool.
128
+ - [TableDnDWrapper](./table-dnd-wrapper.md) — another internal Editor.js tool module.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: Checkbox
3
- version: 1.1.15
3
+ version: 2.4.0
4
4
  status: stable
5
5
  category: components/forms
6
6
  tags: [form, checkbox, selection, radix-ui, accessible, controlled]
@@ -17,14 +17,22 @@ dependencies:
17
17
 
18
18
  ## Installation
19
19
 
20
+ TORCH Glare is a copy-in library: the CLI copies this component's source into your project
21
+ (you do **not** install it from the npm package). Run `init` once, then `add`:
22
+
20
23
  ```bash
21
- npm install torch-glare
24
+ npx torch-glare@latest init
25
+ npx torch-glare@latest add Checkbox
22
26
  ```
23
27
 
28
+ `add` also copies any components, hooks, and utilities that `Checkbox` depends on.
29
+
24
30
  ## Import
25
31
 
26
- ```typescript
27
- import { Checkbox } from 'torch-glare/lib/components/Checkbox'
32
+ Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
33
+
34
+ ```tsx
35
+ import { Checkbox } from "@/components/Checkbox";
28
36
  ```
29
37
 
30
38
  ## Quick Examples
@@ -32,7 +40,7 @@ import { Checkbox } from 'torch-glare/lib/components/Checkbox'
32
40
  ### Basic Usage
33
41
 
34
42
  ```typescript
35
- import { Checkbox } from 'torch-glare/lib/components/Checkbox'
43
+ import { Checkbox } from '@/components/Checkbox'
36
44
 
37
45
  function Example() {
38
46
  const [checked, setChecked] = useState(false)
@@ -402,7 +410,7 @@ function FilterPanel() {
402
410
 
403
411
  ```typescript
404
412
  import { render, screen, fireEvent } from '@testing-library/react'
405
- import { Checkbox } from 'torch-glare/lib/components/Checkbox'
413
+ import { Checkbox } from '@/components/Checkbox'
406
414
 
407
415
  describe('Checkbox', () => {
408
416
  it('handles checked state changes', () => {
@@ -609,10 +617,10 @@ Radix UI automatically handles ARIA attributes:
609
617
  ```diff
610
618
  // Import path changed
611
619
  - import Checkbox from 'torch-glare/Checkbox'
612
- + import { Checkbox } from 'torch-glare/lib/components/Checkbox'
620
+ + import { Checkbox } from '@/components/Checkbox'
613
621
 
614
622
  // Size prop values changed
615
- - <Checkbox size="small" />
623
+ - <Checkbox size="M" />
616
624
  + <Checkbox size="S" />
617
625
  ```
618
626
 
@@ -12,10 +12,16 @@ A complete layout system for building dashboard and admin panel interfaces. Feat
12
12
 
13
13
  ## Installation
14
14
 
15
+ TORCH Glare is a copy-in library: the CLI copies this component's source into your project
16
+ (you do **not** install it from the npm package). Run `init` once, then `add`:
17
+
15
18
  ```bash
16
- npx torch-cli add cn-layout
19
+ npx torch-glare@latest init
20
+ npx torch-glare@latest add CnLayout
17
21
  ```
18
22
 
23
+ `add` also copies any components, hooks, and utilities that `CnLayout` depends on.
24
+
19
25
  ## Imports
20
26
 
21
27
  ```typescript
@@ -11,29 +11,22 @@ keywords: [context-menu, right-click, menu, radix-ui, submenu, checkbox, context
11
11
 
12
12
  ## Installation
13
13
 
14
+ TORCH Glare is a copy-in library: the CLI copies this component's source into your project
15
+ (you do **not** install it from the npm package). Run `init` once, then `add`:
16
+
14
17
  ```bash
15
- npm install @radix-ui/react-context-menu
18
+ npx torch-glare@latest init
19
+ npx torch-glare@latest add ContextMenu
16
20
  ```
17
21
 
22
+ `add` also copies any components, hooks, and utilities that `ContextMenu` depends on.
23
+
18
24
  ## Import
19
25
 
20
- ```typescript
21
- import {
22
- ContextMenu,
23
- ContextMenuTrigger,
24
- ContextMenuContent,
25
- ContextMenuItem,
26
- ContextMenuGroup,
27
- ContextMenuRadioGroup,
28
- ContextMenuCheckboxItem,
29
- ContextMenuRadioItem,
30
- ContextMenuLabel,
31
- ContextMenuShortcut,
32
- ContextMenuSub,
33
- ContextMenuSubTrigger,
34
- ContextMenuSubContent,
35
- ContextMenuPortal,
36
- } from '@torch-ui/components'
26
+ Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
27
+
28
+ ```tsx
29
+ import { ContextMenu } from "@/components/ContextMenu";
37
30
  ```
38
31
 
39
32
  ## Quick Examples
@@ -43,7 +36,7 @@ import {
43
36
  Wrap the right-click zone in `ContextMenuTrigger`. The menu opens at the pointer.
44
37
 
45
38
  ```typescript
46
- import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem } from '@torch-ui/components'
39
+ import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem } from "@/components/ContextMenu";
47
40
 
48
41
  function Example() {
49
42
  return (
@@ -66,7 +59,7 @@ function Example() {
66
59
  ### With Icons, Shortcuts, and a Negative Item
67
60
 
68
61
  ```typescript
69
- import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuShortcut } from '@torch-ui/components'
62
+ import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuShortcut } from "@/components/ContextMenu";
70
63
 
71
64
  function ActionsMenu() {
72
65
  return (
@@ -103,7 +96,7 @@ function ActionsMenu() {
103
96
  > Clicking a checkbox item keeps the menu open — `onSelect` calls `preventDefault()` internally so Radix does not auto-close. Toggle several options without the menu dismissing.
104
97
 
105
98
  ```typescript
106
- import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuCheckboxItem } from '@torch-ui/components'
99
+ import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuCheckboxItem } from "@/components/ContextMenu";
107
100
  import { useState } from 'react'
108
101
 
109
102
  function CheckboxMenu() {
@@ -148,7 +141,7 @@ function CheckboxMenu() {
148
141
  > Like checkboxes, selecting a radio item keeps the menu open (`onSelect` `preventDefault` is built in).
149
142
 
150
143
  ```typescript
151
- import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuRadioGroup, ContextMenuRadioItem } from '@torch-ui/components'
144
+ import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuRadioGroup, ContextMenuRadioItem } from "@/components/ContextMenu";
152
145
  import { useState } from 'react'
153
146
 
154
147
  function RadioMenu() {
@@ -176,7 +169,7 @@ function RadioMenu() {
176
169
  ### With Submenu
177
170
 
178
171
  ```typescript
179
- import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSub, ContextMenuSubTrigger, ContextMenuSubContent } from '@torch-ui/components'
172
+ import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSub, ContextMenuSubTrigger, ContextMenuSubContent } from "@/components/ContextMenu";
180
173
 
181
174
  function SubmenuExample() {
182
175
  return (
@@ -211,7 +204,7 @@ function SubmenuExample() {
211
204
  Set `dir="rtl"` on the Root and the menu, items, and submenu arrows mirror automatically.
212
205
 
213
206
  ```typescript
214
- import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuShortcut } from '@torch-ui/components'
207
+ import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuShortcut } from "@/components/ContextMenu";
215
208
 
216
209
  function RtlMenu() {
217
210
  return (
@@ -233,6 +226,33 @@ function RtlMenu() {
233
226
  }
234
227
  ```
235
228
 
229
+ ### Long Menu (max height + scroll)
230
+
231
+ Tall menus scroll instead of overflowing off-screen. The surface caps at `maxHeight` (default `320`px) and never exceeds the space available after collision handling. Pass `maxHeight` to change the cap.
232
+
233
+ ```typescript
234
+ import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuLabel } from "@/components/ContextMenu";
235
+
236
+ function LongMenu() {
237
+ return (
238
+ <ContextMenu>
239
+ <ContextMenuTrigger asChild>
240
+ <div className="flex h-40 w-72 items-center justify-center rounded-md border border-dashed">
241
+ Right-click here
242
+ </div>
243
+ </ContextMenuTrigger>
244
+ {/* Cap the surface at 220px — the rest scrolls. */}
245
+ <ContextMenuContent maxHeight={220}>
246
+ <ContextMenuLabel>Jump to section</ContextMenuLabel>
247
+ {Array.from({ length: 20 }, (_, i) => (
248
+ <ContextMenuItem key={i}>Section {i + 1}</ContextMenuItem>
249
+ ))}
250
+ </ContextMenuContent>
251
+ </ContextMenu>
252
+ )
253
+ }
254
+ ```
255
+
236
256
  ## API Reference
237
257
 
238
258
  ### ContextMenu (Root)
@@ -264,6 +284,7 @@ The right-click zone. Wrap it around the element the menu should open from.
264
284
  | `theme` | `'dark' \| 'light' \| 'default'` | - | Theme variant (applied as `data-theme`) |
265
285
  | `className` | `string` | - | Additional CSS classes |
266
286
  | `collisionPadding` | `number` | `8` | Min distance kept from the viewport edge |
287
+ | `maxHeight` | `number` | `320` | Max height (px) of the surface before it scrolls. Capped at `min(maxHeight, available-height)` so the menu never overflows off-screen |
267
288
  | `autoGroup` | `boolean` | `true` | Auto-wrap loose items in a Boxed group (see Behavior notes) |
268
289
 
269
290
  ### ContextMenuItem
@@ -353,6 +374,7 @@ interface ContextMenuContentProps {
353
374
  theme?: 'dark' | 'light' | 'default'
354
375
  className?: string
355
376
  collisionPadding?: number // default 8
377
+ maxHeight?: number // default 320 — surface scrolls past this
356
378
  autoGroup?: boolean // default true
357
379
  }
358
380
 
@@ -403,6 +425,7 @@ export const ContextMenuRadioItem: React.ForwardRefExoticComponent<ContextMenuRa
403
425
  - **Opens at the pointer**: the menu opens on right-click (`contextmenu`) at the exact cursor position, not anchored to a fixed trigger button.
404
426
  - **Second right-click closes it**: the Root is made controlled and tracks `open` in context. The Trigger listens in the capture phase, and when the menu is already open it `preventDefault()` / `stopPropagation()` and closes — so a second right-click dismisses instead of re-anchoring (which Radix handles unreliably).
405
427
  - **Auto-grouping**: by default (`autoGroup` on `ContextMenuContent`, default `true`) consecutive loose items (`ContextMenuItem`, `ContextMenuCheckboxItem`, `ContextMenuRadioItem`, and `ContextMenuSub`) are automatically wrapped in a `Boxed` `ContextMenuGroup`, so they render inside a boxed container like DropdownMenu even when you do not write a group. Labels and explicit groups act as boundaries and pass through unchanged. Set `autoGroup={false}` to render children verbatim.
428
+ - **Max height & scrolling**: the surface caps its height at `min(maxHeight, available-height)` (where `maxHeight` defaults to `320`px and `available-height` is the space Radix has after collision handling). A taller menu scrolls vertically instead of overflowing off-screen — items and groups keep their full height rather than squishing. Pass `maxHeight={N}` to change the cap.
406
429
  - **Checkbox / radio keep the menu open**: `ContextMenuCheckboxItem` and `ContextMenuRadioItem` call `event.preventDefault()` inside `onSelect`, stopping Radix's default auto-close so users can toggle multiple options in one pass.
407
430
  - **Open-only animation**: only the open (enter) state animates (`fade-in`). There is intentionally no exit animation — holding the old DOM node during close breaks close/reposition on a second right-click, so it is omitted to keep repositioning reliable.
408
431
  - **Submenus and RTL**: nested `ContextMenuSub` / `ContextMenuSubTrigger` / `ContextMenuSubContent` are supported, and `dir="rtl"` on the Root mirrors the layout (including the submenu chevron).
@@ -12,10 +12,16 @@ A compact circular badge component designed specifically for displaying numeric
12
12
 
13
13
  ## Installation
14
14
 
15
+ TORCH Glare is a copy-in library: the CLI copies this component's source into your project
16
+ (you do **not** install it from the npm package). Run `init` once, then `add`:
17
+
15
18
  ```bash
16
- npx torch-cli add count-badge
19
+ npx torch-glare@latest init
20
+ npx torch-glare@latest add CountBadge
17
21
  ```
18
22
 
23
+ `add` also copies any components, hooks, and utilities that `CountBadge` depends on.
24
+
19
25
  ## Imports
20
26
 
21
27
  ```typescript
@@ -11,15 +11,22 @@ keywords: [table, datatable, grid, sorting, selection, drag-drop, reorder, pagin
11
11
 
12
12
  ## Installation
13
13
 
14
+ TORCH Glare is a copy-in library: the CLI copies this component's source into your project
15
+ (you do **not** install it from the npm package). Run `init` once, then `add`:
16
+
14
17
  ```bash
15
- npm install @tanstack/react-table @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities
18
+ npx torch-glare@latest init
19
+ npx torch-glare@latest add DataTable
16
20
  ```
17
21
 
22
+ `add` also copies any components, hooks, and utilities that `DataTable` depends on.
23
+
18
24
  ## Import
19
25
 
20
- ```typescript
21
- import { DataTable } from '@torch-ui/components'
22
- import { ColumnDef } from '@tanstack/react-table'
26
+ Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
27
+
28
+ ```tsx
29
+ import { DataTable } from "@/components/DataTable";
23
30
  ```
24
31
 
25
32
  ## Quick Examples
@@ -27,7 +34,7 @@ import { ColumnDef } from '@tanstack/react-table'
27
34
  ### Basic Usage
28
35
 
29
36
  ```typescript
30
- import { DataTable } from '@torch-ui/components'
37
+ import { DataTable } from "@/components/DataTable";
31
38
  import { ColumnDef } from '@tanstack/react-table'
32
39
 
33
40
  interface User {
@@ -66,7 +73,7 @@ function Example() {
66
73
  ### With Row Reordering
67
74
 
68
75
  ```typescript
69
- import { DataTable } from '@torch-ui/components'
76
+ import { DataTable } from "@/components/DataTable";
70
77
  import { useState } from 'react'
71
78
 
72
79
  function ReorderableTable() {
@@ -97,8 +104,8 @@ function ReorderableTable() {
97
104
  ### With Custom Cell Rendering
98
105
 
99
106
  ```typescript
100
- import { DataTable } from '@torch-ui/components'
101
- import { Badge } from '@torch-ui/components'
107
+ import { DataTable } from "@/components/DataTable";
108
+ import { Badge } from "@/components/Badge";
102
109
  import { ColumnDef } from '@tanstack/react-table'
103
110
 
104
111
  interface Task {
@@ -124,7 +131,7 @@ const columns: ColumnDef<Task>[] = [
124
131
  completed: 'green',
125
132
  }[status]
126
133
 
127
- return <Badge variant={variant} label={status} />
134
+ return <Badge color={variant} label={status} />
128
135
  },
129
136
  },
130
137
  {
@@ -147,7 +154,7 @@ function TaskTable() {
147
154
  ### With Sortable Columns
148
155
 
149
156
  ```typescript
150
- import { DataTable } from '@torch-ui/components'
157
+ import { DataTable } from "@/components/DataTable";
151
158
  import { ColumnDef } from '@tanstack/react-table'
152
159
 
153
160
  interface Product {
@@ -190,8 +197,8 @@ function ProductTable() {
190
197
  ### With Actions Column
191
198
 
192
199
  ```typescript
193
- import { DataTable } from '@torch-ui/components'
194
- import { ActionButton } from '@torch-ui/components'
200
+ import { DataTable } from "@/components/DataTable";
201
+ import { ActionButton } from "@/components/ActionButton";
195
202
  import { ColumnDef } from '@tanstack/react-table'
196
203
 
197
204
  interface User {
@@ -246,7 +253,7 @@ function UserTable() {
246
253
  ### With Selection Handling
247
254
 
248
255
  ```typescript
249
- import { DataTable } from '@torch-ui/components'
256
+ import { DataTable } from "@/components/DataTable";
250
257
  import { useState } from 'react'
251
258
 
252
259
  function SelectableTable() {
@@ -280,7 +287,7 @@ function SelectableTable() {
280
287
  ### Dark Theme
281
288
 
282
289
  ```typescript
283
- import { DataTable } from '@torch-ui/components'
290
+ import { DataTable } from "@/components/DataTable";
284
291
 
285
292
  function DarkTable() {
286
293
  const columns = [
@@ -300,7 +307,7 @@ function DarkTable() {
300
307
  ### Complex Data with Nested Objects
301
308
 
302
309
  ```typescript
303
- import { DataTable } from '@torch-ui/components'
310
+ import { DataTable } from "@/components/DataTable";
304
311
  import { ColumnDef } from '@tanstack/react-table'
305
312
 
306
313
  interface Order {
@@ -363,7 +370,7 @@ function OrderTable() {
363
370
  ### Empty State
364
371
 
365
372
  ```typescript
366
- import { DataTable } from '@torch-ui/components'
373
+ import { DataTable } from "@/components/DataTable";
367
374
 
368
375
  function EmptyTable() {
369
376
  const columns = [
@@ -468,7 +475,7 @@ DataTable<TData extends { id: string | number }, TValue>
468
475
  ### Controlled Row Selection
469
476
 
470
477
  ```typescript
471
- import { DataTable } from '@torch-ui/components'
478
+ import { DataTable } from "@/components/DataTable";
472
479
  import { useState } from 'react'
473
480
 
474
481
  function ControlledSelectionTable() {
@@ -495,8 +502,8 @@ function ControlledSelectionTable() {
495
502
  ### With Search/Filter
496
503
 
497
504
  ```typescript
498
- import { DataTable } from '@torch-ui/components'
499
- import { Input } from '@torch-ui/components'
505
+ import { DataTable } from "@/components/DataTable";
506
+ import { Input } from "@/components/Input";
500
507
  import { useState, useMemo } from 'react'
501
508
 
502
509
  function SearchableTable() {
@@ -536,7 +543,7 @@ function SearchableTable() {
536
543
  ### Persisting Row Order
537
544
 
538
545
  ```typescript
539
- import { DataTable } from '@torch-ui/components'
546
+ import { DataTable } from "@/components/DataTable";
540
547
  import { useState, useEffect } from 'react'
541
548
 
542
549
  function PersistentOrderTable() {
@@ -569,16 +576,21 @@ function PersistentOrderTable() {
569
576
 
570
577
  ## Features
571
578
 
572
- ### Built-in Capabilities
579
+ The component's props are `columns`, `data`, `theme`, and `onRowReorder` — see the API
580
+ Reference. Its built-in, rendered capabilities are:
581
+
582
+ - **Row Selection**: Multi-row selection checkboxes (select all / select individual) are
583
+ rendered and tracked internally. Selection state persists through reordering. Note: the
584
+ component does not expose a selection-change prop — selection is internal visual state.
585
+ - **Drag & Drop**: Reorder rows by dragging; `onRowReorder` returns the new data array
586
+ (keyboard drag supported via dnd-kit).
587
+ - **Column Sorting**: Click headers to sort ascending/descending.
588
+ - **Custom Cells**: Full control over cell rendering via each column's `cell`.
589
+ - **Type Safety**: Full TypeScript support with generics.
573
590
 
574
- - **Row Selection**: Multi-row selection with checkboxes (select all, select individual)
575
- - **Drag & Drop**: Reorder rows by dragging (maintains selection state)
576
- - **Column Sorting**: Click headers to sort ascending/descending
577
- - **Pagination**: Built-in pagination support (via TanStack Table)
578
- - **Filtering**: Client-side filtering capabilities
579
- - **Custom Cells**: Full control over cell rendering
580
- - **Keyboard Navigation**: Drag-and-drop with keyboard support
581
- - **Type Safety**: Full TypeScript support with generics
591
+ > The TanStack pagination and filtering **row models** are enabled internally, but the
592
+ > component renders **no** pagination or filter controls and exposes no page/filter props.
593
+ > To paginate or filter, wrap the data yourself or compose your own controls around it.
582
594
 
583
595
  ### Drag-and-Drop Behavior
584
596
 
@@ -601,7 +613,7 @@ function PersistentOrderTable() {
601
613
 
602
614
  ```typescript
603
615
  import { render, screen, fireEvent } from '@testing-library/react'
604
- import { DataTable } from '@torch-ui/components'
616
+ import { DataTable } from "@/components/DataTable";
605
617
  import { ColumnDef } from '@tanstack/react-table'
606
618
 
607
619
  const mockData = [
@@ -651,7 +663,7 @@ describe('DataTable', () => {
651
663
 
652
664
  ```typescript
653
665
  import { render, screen, fireEvent } from '@testing-library/react'
654
- import { DataTable } from '@torch-ui/components'
666
+ import { DataTable } from "@/components/DataTable";
655
667
 
656
668
  test('row selection works correctly', () => {
657
669
  const columns = [{ accessorKey: 'name', header: 'Name' }]
@@ -767,7 +779,7 @@ const columns: ColumnDef<User>[] = [
767
779
 
768
780
  ```diff
769
781
  - import { DataGrid } from '@mui/x-data-grid'
770
- + import { DataTable } from '@torch-ui/components'
782
+ + import { DataTable } from "@/components/DataTable";
771
783
  + import { ColumnDef } from '@tanstack/react-table'
772
784
 
773
785
  - <DataGrid rows={data} columns={columns} />
@@ -778,7 +790,7 @@ const columns: ColumnDef<User>[] = [
778
790
 
779
791
  ```diff
780
792
  - import { useTable } from 'react-table'
781
- + import { DataTable } from '@torch-ui/components'
793
+ + import { DataTable } from "@/components/DataTable";
782
794
  + import { ColumnDef } from '@tanstack/react-table'
783
795
 
784
796
  - const { getTableProps, rows } = useTable({ columns, data })
@@ -13,16 +13,22 @@ keywords: [data-views, config panel, config-panel, settings panel, saved view, s
13
13
 
14
14
  ## Installation
15
15
 
16
- Part of `torch-glare`. Ships with the `DataViews` folder when you run
17
- `npx torch-glare add DataViews` no separate install. It depends on the
18
- shared `Radio`, `Switch`, `Label`, `FilterPanel`, and a colocated internal
19
- `PanelControls` file (see "Internal: PanelControls" below).
16
+ TORCH Glare is a copy-in library: the CLI copies this component's source into your project
17
+ (you do **not** install it from the npm package). Run `init` once, then `add`:
18
+
19
+ ```bash
20
+ npx torch-glare@latest init
21
+ npx torch-glare@latest add DataViewsConfigPanel
22
+ ```
23
+
24
+ `add` also copies any components, hooks, and utilities that `DataViewsConfigPanel` depends on.
20
25
 
21
26
  ## Import
22
27
 
28
+ Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
29
+
23
30
  ```tsx
24
- import { DataViewsConfigPanel } from "torch-glare"
25
- import type { DataViewsConfigPanelProps } from "torch-glare"
31
+ import { DataViewsConfigPanel } from "@/components/DataViewsConfigPanel";
26
32
  ```
27
33
 
28
34
  ## When to use it directly
@@ -36,11 +42,9 @@ import type { DataViewsConfigPanelProps } from "torch-glare"
36
42
  ## Standalone Example (composable mode)
37
43
 
38
44
  ```tsx
39
- import {
40
- DataViewsConfigPanel,
41
- TableView,
42
- useDataViewsState,
43
- } from "torch-glare"
45
+ import { DataViewsConfigPanel } from "@/components/DataViewsConfigPanel";
46
+ import { TableView } from "@/components/TableView";
47
+ import { useDataViewsState } from "@/hooks/useDataViewsState";
44
48
  import { useState } from "react"
45
49
 
46
50
  function CustomScreen({ data, fields }) {
@@ -148,7 +152,7 @@ render `DataViewsConfigPanel` yourself (example above) or extend the layout
148
152
  | Saved View | `savedViews` / `activeSavedView` | Radio list + "Save a New View" button. |
149
153
  | Table Columns | `config.tableColumns` | Green `Switch` per column toggles `visible`; rows are drag-reorderable (HTML5 DnD) and patch `order`. |
150
154
  | Default Sort | `config.sortBy` | Single-choice radio; selecting sets `sortBy`. Direction stays on `config.sortOrder`. |
151
- | Filters tab | `filterState` + `fields` | Renders `FilterPanel` restyled full-width/transparent. |
155
+ | Filters tab | `filterState` + `fields` | Renders `FilterPanel` restyled full-width/transparent. Categorical fields render as checkbox/radio lists, or a `SearchableSelect` dropdown when a field sets `filterVariant: "searchable-select"`. |
152
156
 
153
157
  ## Internal: PanelControls
154
158
 
@@ -173,8 +177,8 @@ Common changes and where to make them:
173
177
  |---|---|
174
178
  | Make Saved View work through `DataViewsLayout` | Add `savedViews` / `activeSavedView` / `onSavedViewChange` / `onSaveNewView` to `DataViewsLayoutProps`, hold them in layout state (or accept from the host), and forward them to `<DataViewsConfigPanel>` at its render site in `DataViewsLayout.tsx`. |
175
179
  | Add a new Config section | Add a new block inside the Config. tab in `DataViewsConfigPanel.tsx`, backed by a `config.*` field so `onConfigChange` persists it. |
176
- | Restyle a radio/toggle | Edit `PanelControls.tsx`. Keep values matching the Figma spec; do not swap in the shared `Radio`/`Label` (they impose theming/layout that fights the dark panel — this was deliberate). |
177
- | Change the dark chrome | The root forces `data-theme="dark"` and uses hardcoded hex (`#1C1D1F`, `#252729`, `#005ECC`, `#626467`, `#0AC713`). These are intentional Figma values, not tokens. |
180
+ | Restyle a radio/toggle | Edit the radio ring in `DataViewRadio.tsx` (the `RadioRow` in `PanelControls.tsx` just wraps it) or the switch in `PanelControls.tsx`. Keep the hardcoded hex matching the Figma spec; do not swap in the shared `Radio`/`Label` (they impose theming/layout that fights the dark panel — this was deliberate). |
181
+ | Change the dark chrome | The root forces `data-theme="dark"` and uses hardcoded hex (`#1C1D1F`, `#252729`, `#005ECC`, `#0075FF`, `#626467`, `#0AC713`). These are intentional Figma values, not tokens — the radio/checkbox rings hardcode them (`#626467` border, `rgba(255,255,255,0.05)` fill, `#0075FF` selected) so the panel always renders dark regardless of host `data-theme`. |
178
182
 
179
183
  After any change to the panel docs or component, update this file and rebuild
180
184
  the MCP server (`cd mcp && pnpm build`) so the docs the server serves stay in