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.
- package/README.md +8 -0
- package/apps/lib/components/ActionButton.tsx +7 -12
- package/apps/lib/components/ActionsGroup.tsx +4 -15
- package/apps/lib/components/AlertDialog.tsx +173 -191
- package/apps/lib/components/Avatar.tsx +13 -16
- package/apps/lib/components/Badge.tsx +7 -3
- package/apps/lib/components/BadgeField.tsx +76 -71
- package/apps/lib/components/Breadcrumb.tsx +49 -85
- package/apps/lib/components/Button.tsx +20 -19
- package/apps/lib/components/ButtonGroup.tsx +31 -41
- package/apps/lib/components/Calendar.tsx +51 -29
- package/apps/lib/components/Card.tsx +2 -13
- package/apps/lib/components/ChartBlockTool.ts +17 -52
- package/apps/lib/components/Checkbox.tsx +9 -16
- package/apps/lib/components/ContextMenu.tsx +110 -106
- package/apps/lib/components/CountBadge.tsx +4 -6
- package/apps/lib/components/DataTable.tsx +196 -216
- package/apps/lib/components/DataViews/DataViewRadio.tsx +10 -8
- package/apps/lib/components/DataViews/DataViewsConfigPanel.tsx +21 -55
- package/apps/lib/components/DataViews/DataViewsHeader.tsx +1 -3
- package/apps/lib/components/DataViews/DataViewsLayout.tsx +5 -12
- package/apps/lib/components/DataViews/FilterPanel.tsx +173 -150
- package/apps/lib/components/DataViews/HeaderSearch.tsx +1 -5
- package/apps/lib/components/DataViews/InboxView.tsx +22 -68
- package/apps/lib/components/DataViews/InboxViewCard.tsx +68 -77
- package/apps/lib/components/DataViews/KanbanView.tsx +8 -25
- package/apps/lib/components/DataViews/PanelControls.tsx +3 -13
- package/apps/lib/components/DataViews/SettingsPanel.tsx +83 -89
- package/apps/lib/components/DataViews/TableView.tsx +8 -28
- package/apps/lib/components/DataViews/TreeView.tsx +12 -40
- package/apps/lib/components/DataViews/badgeAdapter.ts +32 -28
- package/apps/lib/components/DataViews/fieldRenderers.tsx +106 -141
- package/apps/lib/components/DataViews/filters/DatePickerRangeFilter.tsx +87 -0
- package/apps/lib/components/DataViews/filters/DateRangePopover.tsx +39 -32
- package/apps/lib/components/DataViews/filters/PresetChips.tsx +15 -15
- package/apps/lib/components/DataViews/filters/RangeSliderWithInputs.tsx +69 -58
- package/apps/lib/components/DataViews/index.ts +26 -26
- package/apps/lib/components/DataViews/tree/TreeDrawer.tsx +12 -16
- package/apps/lib/components/DataViews/tree/TreeSidebar.tsx +28 -31
- package/apps/lib/components/DataViews/types.ts +111 -114
- package/apps/lib/components/DatePicker.tsx +198 -191
- package/apps/lib/components/Dialog.tsx +92 -105
- package/apps/lib/components/Divider.tsx +21 -24
- package/apps/lib/components/Drawer.tsx +79 -139
- package/apps/lib/components/DropdownMenu.tsx +144 -181
- package/apps/lib/components/FieldHint.tsx +4 -11
- package/apps/lib/components/Form.tsx +146 -155
- package/apps/lib/components/FormStepper.tsx +9 -39
- package/apps/lib/components/HeaderBar.tsx +119 -0
- package/apps/lib/components/ImageAttachment.tsx +111 -73
- package/apps/lib/components/InnerLabelField.tsx +20 -16
- package/apps/lib/components/Input.tsx +171 -172
- package/apps/lib/components/InputField.tsx +44 -45
- package/apps/lib/components/InputOTP.tsx +68 -69
- package/apps/lib/components/Label.tsx +31 -35
- package/apps/lib/components/LabelField.tsx +4 -5
- package/apps/lib/components/LabeledCheckBox.tsx +8 -12
- package/apps/lib/components/LabeledRadio.tsx +7 -5
- package/apps/lib/components/LinkButton.tsx +2 -9
- package/apps/lib/components/LoginButton.tsx +4 -9
- package/apps/lib/components/PasswordLevel.tsx +5 -5
- package/apps/lib/components/Popover.tsx +15 -33
- package/apps/lib/components/ProfileMenu.tsx +67 -72
- package/apps/lib/components/Radio.tsx +1 -5
- package/apps/lib/components/RadioCard.tsx +9 -28
- package/apps/lib/components/ScrollArea.tsx +45 -43
- package/apps/lib/components/SearchField.tsx +49 -39
- package/apps/lib/components/SearchableSelect.tsx +46 -52
- package/apps/lib/components/SearchableTable.tsx +199 -219
- package/apps/lib/components/SearchableTree.tsx +469 -0
- package/apps/lib/components/SearchableTreeDialog.tsx +493 -0
- package/apps/lib/components/SectionBlock.tsx +4 -16
- package/apps/lib/components/Select.tsx +53 -80
- package/apps/lib/components/SimpleSelect.tsx +196 -187
- package/apps/lib/components/Skeleton.tsx +9 -12
- package/apps/lib/components/SlideDatePicker.tsx +215 -166
- package/apps/lib/components/SpinLoading.tsx +33 -49
- package/apps/lib/components/Stepper.tsx +13 -56
- package/apps/lib/components/Switch.tsx +8 -10
- package/apps/lib/components/TabFormItem.tsx +3 -12
- package/apps/lib/components/TabSwitch.tsx +7 -34
- package/apps/lib/components/Table.tsx +60 -75
- package/apps/lib/components/TableDnDWrapper.ts +15 -48
- package/apps/lib/components/TextEditor.tsx +93 -104
- package/apps/lib/components/Textarea.tsx +8 -12
- package/apps/lib/components/Timeline.tsx +21 -41
- package/apps/lib/components/Toast.tsx +83 -83
- package/apps/lib/components/Toggle.tsx +112 -114
- package/apps/lib/components/ToggleButton.tsx +1 -1
- package/apps/lib/components/Tooltip.tsx +24 -19
- package/apps/lib/components/TransparentLabel.tsx +61 -62
- package/apps/lib/components/TreeDropDown.tsx +86 -52
- package/apps/lib/components/TreeFolder/TreeFolder.tsx +15 -48
- package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +16 -21
- package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +9 -20
- package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +3 -3
- package/apps/lib/components/TreeFolder/icons.tsx +14 -17
- package/apps/lib/components/TreeFolder/index.ts +15 -8
- package/apps/lib/components/TreeFolder/treeFolderUtils.ts +47 -52
- package/apps/lib/components/TreeFolder/types.ts +32 -32
- package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +117 -123
- package/apps/lib/hooks/useActiveTreeItem.ts +52 -55
- package/apps/lib/hooks/useClickOutside.ts +21 -20
- package/apps/lib/hooks/useDataViewsState.ts +86 -80
- package/apps/lib/hooks/useIsMobile.ts +12 -12
- package/apps/lib/hooks/useResize.ts +54 -65
- package/apps/lib/hooks/useTagSelection.ts +201 -201
- package/apps/lib/layouts/CNLayout.tsx +181 -140
- package/apps/lib/layouts/DataViewCard.tsx +4 -18
- package/apps/lib/layouts/FieldSection.tsx +2 -6
- package/apps/lib/layouts/TreeSubLayout.tsx +24 -38
- package/apps/lib/providers/ThemeProvider.tsx +8 -23
- package/apps/lib/registry.json +1004 -0
- package/apps/lib/tsconfig.json +9 -0
- package/apps/lib/utils/cn.ts +1 -1
- package/apps/lib/utils/dataViews/columnUtils.ts +46 -44
- package/apps/lib/utils/dataViews/fieldUtils.ts +70 -71
- package/apps/lib/utils/dataViews/nestedDataUtils.tsx +129 -122
- package/apps/lib/utils/dataViews/pathUtils.ts +74 -67
- package/apps/lib/utils/dataViews/rangeUtils.ts +121 -112
- package/apps/lib/utils/dataViews/treeUtils.ts +204 -211
- package/apps/lib/utils/dateFormat.ts +64 -54
- package/apps/lib/utils/markdownParser.ts +2 -7
- package/apps/lib/utils/resize.ts +21 -25
- package/apps/lib/utils/types.ts +13 -13
- package/dist/bin/index.js +8 -2
- package/dist/bin/index.js.map +1 -1
- package/dist/src/shared/getAvailableFiles.d.ts.map +1 -1
- package/dist/src/shared/getAvailableFiles.js +6 -1
- package/dist/src/shared/getAvailableFiles.js.map +1 -1
- package/dist/src/shared/loadRegistry.d.ts +7 -0
- package/dist/src/shared/loadRegistry.d.ts.map +1 -0
- package/dist/src/shared/loadRegistry.js +31 -0
- package/dist/src/shared/loadRegistry.js.map +1 -0
- package/dist/src/shared/resolveInstallPlan.d.ts +12 -0
- package/dist/src/shared/resolveInstallPlan.d.ts.map +1 -0
- package/dist/src/shared/resolveInstallPlan.js +39 -0
- package/dist/src/shared/resolveInstallPlan.js.map +1 -0
- package/dist/src/types/main.d.ts +24 -0
- package/dist/src/types/main.d.ts.map +1 -1
- package/docs/README.md +10 -2
- package/docs/components/action-button.md +30 -24
- package/docs/components/actions-group.md +26 -20
- package/docs/components/alert-dialog.md +45 -45
- package/docs/components/avatar.md +6 -2
- package/docs/components/badge-field.md +6 -2
- package/docs/components/badge.md +7 -1
- package/docs/components/breadcrumb.md +15 -40
- package/docs/components/button-group.md +13 -10
- package/docs/components/button.md +58 -33
- package/docs/components/calendar.md +26 -19
- package/docs/components/card.md +19 -16
- package/docs/components/chart-block-tool.md +128 -0
- package/docs/components/checkbox.md +16 -8
- package/docs/components/cn-layout.md +7 -1
- package/docs/components/context-menu.md +47 -24
- package/docs/components/count-badge.md +7 -1
- package/docs/components/data-table.md +45 -33
- package/docs/components/data-views-config-panel.md +18 -14
- package/docs/components/data-views-layout.md +20 -17
- package/docs/components/date-picker.md +30 -23
- package/docs/components/dialog.md +43 -42
- package/docs/components/divider.md +10 -4
- package/docs/components/drawer.md +8 -33
- package/docs/components/dropdown-menu.md +51 -32
- package/docs/components/field-hint.md +37 -25
- package/docs/components/field-section.md +9 -3
- package/docs/components/form-stepper.md +6 -0
- package/docs/components/form.md +17 -20
- package/docs/components/header-bar.md +187 -0
- package/docs/components/image-attachment.md +33 -41
- package/docs/components/inbox-view.md +16 -5
- package/docs/components/inner-label-field.md +34 -24
- package/docs/components/input-field.md +18 -10
- package/docs/components/input-otp.md +14 -11
- package/docs/components/input.md +22 -16
- package/docs/components/kanban-view.md +15 -5
- package/docs/components/label-field.md +32 -22
- package/docs/components/label.md +43 -32
- package/docs/components/labeled-check-box.md +16 -8
- package/docs/components/labeled-radio.md +18 -11
- package/docs/components/link-button.md +7 -1
- package/docs/components/login-button.md +8 -2
- package/docs/components/password-level.md +37 -24
- package/docs/components/popover.md +26 -23
- package/docs/components/profile-menu.md +38 -27
- package/docs/components/radio-card.md +16 -9
- package/docs/components/radio.md +16 -8
- package/docs/components/scroll-area.md +6 -2
- package/docs/components/search-field.md +14 -6
- package/docs/components/searchable-select.md +19 -14
- package/docs/components/searchable-table.md +60 -41
- package/docs/components/searchable-tree-dialog.md +190 -0
- package/docs/components/searchable-tree.md +200 -0
- package/docs/components/section-block.md +130 -4
- package/docs/components/select.md +23 -18
- package/docs/components/simple-select.md +14 -10
- package/docs/components/skeleton.md +43 -33
- package/docs/components/slide-date-picker.md +37 -29
- package/docs/components/spin-loading.md +32 -23
- package/docs/components/stepper.md +6 -0
- package/docs/components/switch.md +14 -6
- package/docs/components/tab-form-item.md +7 -1
- package/docs/components/tab-switch.md +13 -6
- package/docs/components/table-dnd-wrapper.md +105 -0
- package/docs/components/table-view.md +15 -5
- package/docs/components/table.md +28 -28
- package/docs/components/text-editor.md +19 -13
- package/docs/components/textarea.md +15 -7
- package/docs/components/timeline.md +6 -0
- package/docs/components/toast.md +35 -26
- package/docs/components/toggle-button.md +24 -21
- package/docs/components/toggle.md +23 -15
- package/docs/components/tooltip.md +42 -30
- package/docs/components/transparent-label.md +29 -20
- package/docs/components/tree-drop-down.md +31 -23
- package/docs/components/tree-sub-layout.md +6 -2
- package/docs/components/tree-view.md +16 -5
- package/docs/explanation/architecture.md +54 -0
- package/docs/explanation/design-system.md +52 -0
- package/docs/how-to/data-views-from-backend-response.md +7 -4
- package/docs/how-to/guides.md +24 -18
- package/docs/migration/changelog.md +38 -0
- package/docs/reference/cli.md +87 -0
- package/docs/reference/components.md +11 -12
- package/docs/reference/hooks.md +8 -8
- package/docs/reference/providers.md +22 -22
- package/docs/reference/tailwind-plugins.md +2 -2
- package/docs/reference/theme.md +85 -0
- package/docs/reference/types.md +4 -4
- package/docs/reference/utilities.md +19 -26
- package/docs/tutorials/building-first-form.md +20 -13
- package/docs/tutorials/component-composition.md +34 -50
- package/docs/tutorials/getting-started.md +2 -2
- package/docs/tutorials/theming-basics.md +13 -10
- package/package.json +31 -3
- package/dist/src/commands/block.d.ts +0 -5
- package/dist/src/commands/block.d.ts.map +0 -1
- package/dist/src/commands/block.js +0 -255
- package/dist/src/commands/block.js.map +0 -1
- package/dist/src/shared/configureFonts.d.ts +0 -6
- package/dist/src/shared/configureFonts.d.ts.map +0 -1
- package/dist/src/shared/configureFonts.js +0 -106
- package/dist/src/shared/configureFonts.js.map +0 -1
- package/dist/src/shared/configureGlobalCss.d.ts +0 -6
- package/dist/src/shared/configureGlobalCss.d.ts.map +0 -1
- package/dist/src/shared/configureGlobalCss.js +0 -154
- package/dist/src/shared/configureGlobalCss.js.map +0 -1
- package/dist/src/shared/configureTailwind.d.ts +0 -7
- package/dist/src/shared/configureTailwind.d.ts.map +0 -1
- package/dist/src/shared/configureTailwind.js +0 -163
- package/dist/src/shared/configureTailwind.js.map +0 -1
- package/dist/src/shared/detectFramework.d.ts +0 -23
- package/dist/src/shared/detectFramework.d.ts.map +0 -1
- package/dist/src/shared/detectFramework.js +0 -119
- package/dist/src/shared/detectFramework.js.map +0 -1
- package/dist/src/shared/installBaseUtils.d.ts +0 -5
- package/dist/src/shared/installBaseUtils.d.ts.map +0 -1
- package/dist/src/shared/installBaseUtils.js +0 -79
- package/dist/src/shared/installBaseUtils.js.map +0 -1
- package/dist/src/shared/resolveAliases.d.ts +0 -24
- package/dist/src/shared/resolveAliases.d.ts.map +0 -1
- package/dist/src/shared/resolveAliases.js +0 -98
- 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:
|
|
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
|
-
|
|
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
|
-
|
|
27
|
-
|
|
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 '
|
|
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 '
|
|
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 '
|
|
620
|
+
+ import { Checkbox } from '@/components/Checkbox'
|
|
613
621
|
|
|
614
622
|
// Size prop values changed
|
|
615
|
-
- <Checkbox size="
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
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
|
|
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
|
|
101
|
-
import { Badge } from
|
|
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
|
|
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
|
|
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
|
|
194
|
-
import { ActionButton } from
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
499
|
-
import { Input } from
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
575
|
-
|
|
576
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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 "
|
|
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
|
-
|
|
41
|
-
|
|
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
|
|
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
|