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
@@ -1,233 +1,213 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import * as React from "react"
4
- import { CSS } from '@dnd-kit/utilities'
3
+ import * as React from "react";
4
+ import { CSS } from "@dnd-kit/utilities";
5
5
  import {
6
- ColumnDef,
7
- flexRender,
8
- getCoreRowModel,
9
- getSortedRowModel,
10
- Row,
11
- SortingState,
12
- useReactTable,
13
- getPaginationRowModel,
14
- getFilteredRowModel,
15
- } from "@tanstack/react-table"
6
+ ColumnDef,
7
+ flexRender,
8
+ getCoreRowModel,
9
+ getSortedRowModel,
10
+ Row,
11
+ SortingState,
12
+ useReactTable,
13
+ getPaginationRowModel,
14
+ getFilteredRowModel,
15
+ } from "@tanstack/react-table";
16
16
  import {
17
- DndContext,
18
- closestCenter,
19
- KeyboardSensor,
20
- PointerSensor,
21
- useSensor,
22
- useSensors,
23
- DragEndEvent,
24
- } from '@dnd-kit/core'
17
+ DndContext,
18
+ closestCenter,
19
+ KeyboardSensor,
20
+ PointerSensor,
21
+ useSensor,
22
+ useSensors,
23
+ DragEndEvent,
24
+ } from "@dnd-kit/core";
25
25
  import {
26
- arrayMove,
27
- SortableContext,
28
- sortableKeyboardCoordinates,
29
- useSortable,
30
- verticalListSortingStrategy,
31
- } from '@dnd-kit/sortable'
26
+ arrayMove,
27
+ SortableContext,
28
+ sortableKeyboardCoordinates,
29
+ useSortable,
30
+ verticalListSortingStrategy,
31
+ } from "@dnd-kit/sortable";
32
32
 
33
- import {
34
- Table,
35
- TableBody,
36
- TableCell,
37
- TableHead,
38
- TableHeader,
39
- TableRow,
40
- } from "./Table"
41
- import { Checkbox } from "./Checkbox"
33
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "./Table";
34
+ import { Checkbox } from "./Checkbox";
42
35
 
43
36
  interface DataTableProps<TData extends { id: string | number }, TValue> {
44
- columns: ColumnDef<TData, TValue>[]
45
- data: TData[]
46
- theme?: "dark" | "light" | "default"
47
- onRowReorder?: (newData: TData[]) => void
37
+ columns: ColumnDef<TData, TValue>[];
38
+ data: TData[];
39
+ theme?: "dark" | "light" | "default";
40
+ onRowReorder?: (newData: TData[]) => void;
48
41
  }
49
42
 
50
43
  export function DataTable<TData extends { id: string | number }, TValue>({
51
- columns,
52
- data,
53
- theme = "default",
54
- onRowReorder,
44
+ columns,
45
+ data,
46
+ theme = "default",
47
+ onRowReorder,
55
48
  }: DataTableProps<TData, TValue>) {
56
- const [sorting, setSorting] = React.useState<SortingState>([])
57
- const [items, setItems] = React.useState<TData[]>(data)
58
- const [rowSelection, setRowSelection] = React.useState({})
59
-
60
- const sensors = useSensors(
61
- useSensor(PointerSensor),
62
- useSensor(KeyboardSensor, {
63
- coordinateGetter: sortableKeyboardCoordinates,
64
- })
65
- )
66
-
67
- const table = useReactTable({
68
- data: items,
69
- columns,
70
- getCoreRowModel: getCoreRowModel(),
71
- getSortedRowModel: getSortedRowModel(),
72
- getPaginationRowModel: getPaginationRowModel(),
73
- getFilteredRowModel: getFilteredRowModel(),
74
- onSortingChange: setSorting,
75
- onRowSelectionChange: setRowSelection,
76
- enableRowSelection: true,
77
- enableMultiRowSelection: true,
78
- state: {
79
- sorting,
80
- rowSelection,
81
- },
82
- })
83
-
84
- const handleDragEnd = (event: DragEndEvent) => {
85
- const { active, over } = event
86
-
87
- if (over && active.id !== over.id) {
88
- const oldIndex = items.findIndex((item: any) => item.id === active.id)
89
- const newIndex = items.findIndex((item: any) => item.id === over.id)
90
-
91
- const newItems = arrayMove(items, oldIndex, newIndex)
92
- setItems(newItems)
93
-
94
- // Update row selection to maintain correct mapping after reorder
95
- const newRowSelection: Record<string, boolean> = {}
96
- Object.keys(rowSelection).forEach((rowIndex) => {
97
- const oldRowIndex = parseInt(rowIndex)
98
- const row = table.getRowModel().rows[oldRowIndex]
99
- if (row) {
100
- const newRowIndex = newItems.findIndex((item: any) => item.id === (row.original as any).id)
101
- if (newRowIndex !== -1) {
102
- newRowSelection[newRowIndex.toString()] = true
103
- }
104
- }
105
- })
106
- setRowSelection(newRowSelection)
107
-
108
- onRowReorder?.(newItems)
49
+ const [sorting, setSorting] = React.useState<SortingState>([]);
50
+ const [items, setItems] = React.useState<TData[]>(data);
51
+ const [rowSelection, setRowSelection] = React.useState({});
52
+
53
+ const sensors = useSensors(
54
+ useSensor(PointerSensor),
55
+ useSensor(KeyboardSensor, {
56
+ coordinateGetter: sortableKeyboardCoordinates,
57
+ }),
58
+ );
59
+
60
+ const table = useReactTable({
61
+ data: items,
62
+ columns,
63
+ getCoreRowModel: getCoreRowModel(),
64
+ getSortedRowModel: getSortedRowModel(),
65
+ getPaginationRowModel: getPaginationRowModel(),
66
+ getFilteredRowModel: getFilteredRowModel(),
67
+ onSortingChange: setSorting,
68
+ onRowSelectionChange: setRowSelection,
69
+ enableRowSelection: true,
70
+ enableMultiRowSelection: true,
71
+ state: {
72
+ sorting,
73
+ rowSelection,
74
+ },
75
+ });
76
+
77
+ const handleDragEnd = (event: DragEndEvent) => {
78
+ const { active, over } = event;
79
+
80
+ if (over && active.id !== over.id) {
81
+ const oldIndex = items.findIndex((item: TData) => item.id === active.id);
82
+ const newIndex = items.findIndex((item: TData) => item.id === over.id);
83
+
84
+ const newItems = arrayMove(items, oldIndex, newIndex);
85
+ setItems(newItems);
86
+
87
+ // Update row selection to maintain correct mapping after reorder
88
+ const newRowSelection: Record<string, boolean> = {};
89
+ Object.keys(rowSelection).forEach((rowIndex) => {
90
+ const oldRowIndex = parseInt(rowIndex);
91
+ const row = table.getRowModel().rows[oldRowIndex];
92
+ if (row) {
93
+ const newRowIndex = newItems.findIndex((item: TData) => item.id === row.original.id);
94
+ if (newRowIndex !== -1) {
95
+ newRowSelection[newRowIndex.toString()] = true;
96
+ }
109
97
  }
110
- }
98
+ });
99
+ setRowSelection(newRowSelection);
111
100
 
112
- return (
113
- <DndContext
114
- sensors={sensors}
115
- collisionDetection={closestCenter}
116
- onDragEnd={handleDragEnd}
117
- >
118
- <Table theme={theme}>
119
- <TableHeader>
120
- {table.getHeaderGroups().map((headerGroup) => (
121
- <TableRow key={headerGroup.id}>
122
- <TableHead isDummy ></TableHead>
123
- <TableHead isDummy >
124
- <Checkbox
125
- checked={table.getIsAllRowsSelected()}
126
- onCheckedChange={(checked) => {
127
- table.toggleAllRowsSelected(!!checked)
128
- }}
129
- />
130
- </TableHead>
131
- {headerGroup.headers.map((header) => {
132
- const sortHandler = header.column.getToggleSortingHandler()
133
- return (
134
- <TableHead
135
- key={header.id}
136
- onSort={sortHandler ? () => sortHandler({}) : undefined}
137
- sortType={header.column.getIsSorted() as "asc" | "desc" | undefined}
138
- >
139
- {header.isPlaceholder
140
- ? null
141
- : flexRender(
142
- header.column.columnDef.header,
143
- header.getContext()
144
- )}
145
- </TableHead>
146
- )
147
- })}
148
- </TableRow>
149
- ))}
150
- </TableHeader>
151
- <TableBody>
152
- {table.getRowModel().rows?.length ? (
153
- <SortableContext
154
- items={table.getRowModel().rows.map(row => row.original)}
155
- strategy={verticalListSortingStrategy}
156
- >
157
- {table.getRowModel().rows.map((row, i) => (
158
- <SortableRow key={i + "row"} row={row} state={row.getIsSelected() ? "selected" : undefined}>
159
- <TableCell isDummy >
160
- <Checkbox
161
- checked={row.getIsSelected()}
162
- onCheckedChange={(checked) => {
163
- row.toggleSelected(!!checked)
164
- }}
165
- />
166
- </TableCell>
167
- {row.getVisibleCells().map((cell) => (
168
- <TableCell key={cell.id}>
169
- {flexRender(cell.column.columnDef.cell, cell.getContext())}
170
- </TableCell>
171
- ))}
172
- <TableCell isDummy className="w-full" ></TableCell>
173
- </SortableRow>
174
- ))}
175
- </SortableContext>
176
- ) : (
177
- <TableRow>
178
- <TableCell colSpan={columns.length} className="h-24 text-center">
179
- No results.
180
- </TableCell>
181
- </TableRow>
182
- )}
183
- </TableBody>
184
- </Table>
185
- </DndContext>
186
- )
101
+ onRowReorder?.(newItems);
102
+ }
103
+ };
104
+
105
+ return (
106
+ <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>
107
+ <Table theme={theme}>
108
+ <TableHeader>
109
+ {table.getHeaderGroups().map((headerGroup) => (
110
+ <TableRow key={headerGroup.id}>
111
+ <TableHead isDummy></TableHead>
112
+ <TableHead isDummy>
113
+ <Checkbox
114
+ checked={table.getIsAllRowsSelected()}
115
+ onCheckedChange={(checked) => {
116
+ table.toggleAllRowsSelected(!!checked);
117
+ }}
118
+ />
119
+ </TableHead>
120
+ {headerGroup.headers.map((header) => {
121
+ const sortHandler = header.column.getToggleSortingHandler();
122
+ return (
123
+ <TableHead
124
+ key={header.id}
125
+ onSort={sortHandler ? () => sortHandler({}) : undefined}
126
+ sortType={header.column.getIsSorted() as "asc" | "desc" | undefined}
127
+ >
128
+ {header.isPlaceholder
129
+ ? null
130
+ : flexRender(header.column.columnDef.header, header.getContext())}
131
+ </TableHead>
132
+ );
133
+ })}
134
+ </TableRow>
135
+ ))}
136
+ </TableHeader>
137
+ <TableBody>
138
+ {table.getRowModel().rows?.length ? (
139
+ <SortableContext
140
+ items={table.getRowModel().rows.map((row) => row.original)}
141
+ strategy={verticalListSortingStrategy}
142
+ >
143
+ {table.getRowModel().rows.map((row, i) => (
144
+ <SortableRow
145
+ key={i + "row"}
146
+ row={row}
147
+ state={row.getIsSelected() ? "selected" : undefined}
148
+ >
149
+ <TableCell isDummy>
150
+ <Checkbox
151
+ checked={row.getIsSelected()}
152
+ onCheckedChange={(checked) => {
153
+ row.toggleSelected(!!checked);
154
+ }}
155
+ />
156
+ </TableCell>
157
+ {row.getVisibleCells().map((cell) => (
158
+ <TableCell key={cell.id}>
159
+ {flexRender(cell.column.columnDef.cell, cell.getContext())}
160
+ </TableCell>
161
+ ))}
162
+ <TableCell isDummy className="w-full"></TableCell>
163
+ </SortableRow>
164
+ ))}
165
+ </SortableContext>
166
+ ) : (
167
+ <TableRow>
168
+ <TableCell colSpan={columns.length} className="h-24 text-center">
169
+ No results.
170
+ </TableCell>
171
+ </TableRow>
172
+ )}
173
+ </TableBody>
174
+ </Table>
175
+ </DndContext>
176
+ );
187
177
  }
188
178
 
189
-
190
-
191
-
192
- interface SortableRowProps<TData> {
193
- row: Row<TData>
194
- children: React.ReactNode
195
- state?: "delete" | "update" | "add" | "selected" | "open"
179
+ interface SortableRowProps<TData extends { id: string | number }> {
180
+ row: Row<TData>;
181
+ children: React.ReactNode;
182
+ state?: "delete" | "update" | "add" | "selected" | "open";
196
183
  }
197
184
 
198
- function SortableRow<TData>({ row, children, state }: SortableRowProps<TData>) {
199
- const {
200
- attributes,
201
- listeners,
202
- setNodeRef,
203
- transform,
204
- transition,
205
- isDragging,
206
- } = useSortable({
207
- id: (row.original as any).id,
208
- })
209
-
210
- const style = {
211
- transform: CSS.Transform.toString(transform),
212
- transition,
213
- opacity: isDragging ? 0.5 : 1,
214
- }
215
-
216
- return (
217
- <TableRow
218
- ref={setNodeRef}
219
- style={style}
220
- state={state}
221
- >
222
- <TableCell
223
- {...attributes}
224
- {...listeners}
225
- className="cursor-grab active:cursor-grabbing"
226
- isDummy
227
- >
228
- <i className="ri-draggable text-[18px]" />
229
- </TableCell>
230
- {children}
231
- </TableRow>
232
- )
233
- }
185
+ function SortableRow<TData extends { id: string | number }>({
186
+ row,
187
+ children,
188
+ state,
189
+ }: SortableRowProps<TData>) {
190
+ const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
191
+ id: row.original.id,
192
+ });
193
+
194
+ const style = {
195
+ transform: CSS.Transform.toString(transform),
196
+ transition,
197
+ opacity: isDragging ? 0.5 : 1,
198
+ };
199
+
200
+ return (
201
+ <TableRow ref={setNodeRef} style={style} state={state}>
202
+ <TableCell
203
+ {...attributes}
204
+ {...listeners}
205
+ className="cursor-grab active:cursor-grabbing"
206
+ isDummy
207
+ >
208
+ <i className="ri-draggable text-[18px]" />
209
+ </TableCell>
210
+ {children}
211
+ </TableRow>
212
+ );
213
+ }
@@ -11,12 +11,7 @@ export interface DataViewRadioProps {
11
11
  className?: string;
12
12
  }
13
13
 
14
- export function DataViewRadio({
15
- value,
16
- label,
17
- children,
18
- className,
19
- }: DataViewRadioProps) {
14
+ export function DataViewRadio({ value, label, children, className }: DataViewRadioProps) {
20
15
  return (
21
16
  <RadioGroupPrimitive.Item
22
17
  value={value}
@@ -30,9 +25,16 @@ export function DataViewRadio({
30
25
  <span
31
26
  className={cn(
32
27
  "flex h-[14px] w-[14px] shrink-0 items-center justify-center rounded-full",
33
- "border border-border-presentation-action-primary bg-background-presentation-form-field-primary transition-colors",
28
+ // Hardcoded literals so the indicator always renders dark inside the
29
+ // DataView regardless of the host app's data-theme (matches the
30
+ // always-dark panel chrome convention). Unselected ring = the spec
31
+ // CheckBox-Primary border (#626467) + BorderStyle fill
32
+ // (rgba(255,255,255,0.05)); same tokens the shared Checkbox uses.
33
+ "border border-[#626467] bg-white/5 transition-colors",
34
34
  "group-data-[state=checked]:border-transparent",
35
- "group-data-[state=checked]:bg-border-presentation-state-focus",
35
+ // #0075FF = the previous selected-fill value (border-presentation-state-focus),
36
+ // now literal so the blue is theme-independent and visually unchanged.
37
+ "group-data-[state=checked]:bg-[#0075FF]",
36
38
  )}
37
39
  >
38
40
  <RadioGroupPrimitive.Indicator className="flex items-center justify-center">
@@ -1,12 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { useMemo, useState } from "react";
4
- import {
5
- X,
6
- Settings as SettingsIcon,
7
- Filter as FilterIcon,
8
- Plus,
9
- } from "lucide-react";
4
+ import { X, Settings as SettingsIcon, Filter as FilterIcon, Plus } from "lucide-react";
10
5
  import type {
11
6
  ViewConfig,
12
7
  ViewType,
@@ -18,6 +13,7 @@ import type {
18
13
  } from "./types";
19
14
 
20
15
  import { RadioGroup } from "../Radio";
16
+ import { Button } from "../Button";
21
17
  import { FilterPanel } from "./FilterPanel";
22
18
  import { RadioRow, DataViewsSwitch } from "./PanelControls";
23
19
  import { cn } from "../../utils/cn";
@@ -50,17 +46,9 @@ export type DataViewsConfigPanelProps = {
50
46
  state?: "open" | "closed";
51
47
  };
52
48
 
53
- const DEFAULT_SAVED_VIEWS: SavedView[] = [
54
- { id: "default", label: "Default View" },
55
- ];
49
+ const DEFAULT_SAVED_VIEWS: SavedView[] = [{ id: "default", label: "Default View" }];
56
50
 
57
- function SectionHeader({
58
- title,
59
- action,
60
- }: {
61
- title: string;
62
- action?: React.ReactNode;
63
- }) {
51
+ function SectionHeader({ title, action }: { title: string; action?: React.ReactNode }) {
64
52
  return (
65
53
  <div className="flex items-center justify-between">
66
54
  <h3 className="text-[18px] font-[510] leading-[1.32] tracking-[-0.01em] text-white">
@@ -86,9 +74,7 @@ function GripDots() {
86
74
  fill="currentColor"
87
75
  >
88
76
  {[5.33, 9.33].flatMap((cx) =>
89
- [3.33, 8, 12.67].map((cy) => (
90
- <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r="1" />
91
- )),
77
+ [3.33, 8, 12.67].map((cy) => <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r="1" />),
92
78
  )}
93
79
  </svg>
94
80
  );
@@ -126,23 +112,15 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
126
112
  // `onSavedViewChange` are supplied; otherwise fall back to local state so the
127
113
  // radios are still interactive (DataViewsLayout doesn't thread these props
128
114
  // yet — without this the selection would snap back every click).
129
- const [internalSavedView, setInternalSavedView] = useState(
130
- () => savedViews[0]?.id,
131
- );
115
+ const [internalSavedView, setInternalSavedView] = useState(() => savedViews[0]?.id);
132
116
  const selectedSavedView = activeSavedView ?? internalSavedView;
133
117
  const handleSavedViewChange = (id: string) => {
134
118
  if (onSavedViewChange) onSavedViewChange(id);
135
119
  else setInternalSavedView(id);
136
120
  };
137
121
 
138
- const visibleFields = useMemo(
139
- () => fields.filter((f) => f.type !== "hidden"),
140
- [fields],
141
- );
142
- const visiblePaths = useMemo(
143
- () => new Set(visibleFields.map((f) => f.path)),
144
- [visibleFields],
145
- );
122
+ const visibleFields = useMemo(() => fields.filter((f) => f.type !== "hidden"), [fields]);
123
+ const visiblePaths = useMemo(() => new Set(visibleFields.map((f) => f.path)), [visibleFields]);
146
124
  const fieldByPath = useMemo(
147
125
  () => new Map(visibleFields.map((f) => [f.path, f])),
148
126
  [visibleFields],
@@ -234,7 +212,7 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
234
212
  type="button"
235
213
  onClick={onClose}
236
214
  aria-label="Close panel"
237
- className="flex h-7 w-7 items-center justify-center rounded-[8px] bg-white/[0.15] text-white transition-colors hover:bg-white/25"
215
+ className="flex h-7 w-7 items-center justify-center rounded-[8px] bg-white/[0.15] text-white transition-colors hover:bg-background-presentation-state-negative-primary hover:text-white"
238
216
  >
239
217
  <X className="h-[18px] w-[18px]" />
240
218
  </button>
@@ -262,14 +240,16 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
262
240
  </div>
263
241
  ))}
264
242
  </RadioGroup>
265
- <button
243
+ <Button
266
244
  type="button"
245
+ variant="BorderStyle"
246
+ size="M"
267
247
  onClick={onSaveNewView}
268
- className="flex w-full items-center justify-center gap-1.5 rounded-[4px] bg-white/[0.15] px-1.5 py-0.5 text-[12px] font-[510] text-white transition-colors hover:bg-white/25"
248
+ className="w-full"
269
249
  >
270
- <Plus className="h-3 w-3" />
250
+ <Plus className="h-4 w-4" />
271
251
  Save a New View
272
- </button>
252
+ </Button>
273
253
  </div>
274
254
 
275
255
  <div className="h-px w-full bg-[#2C2D2E]" />
@@ -277,9 +257,6 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
277
257
  {/* Table Columns */}
278
258
  <div className="space-y-3">
279
259
  <SectionHeader title="Table Columns" />
280
- <p className="text-[12px] leading-[1.475] text-content-presentation-global-tertiary">
281
- Show or hide columns in table view
282
- </p>
283
260
  {orderedColumns.length === 0 ? (
284
261
  <p className="text-xs text-content-presentation-global-tertiary">
285
262
  No fields detected.
@@ -307,10 +284,8 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
307
284
  onDragOver={(e) => {
308
285
  e.preventDefault();
309
286
  e.dataTransfer.dropEffect = "move";
310
- const rect =
311
- e.currentTarget.getBoundingClientRect();
312
- const before =
313
- e.clientY < rect.top + rect.height / 2;
287
+ const rect = e.currentTarget.getBoundingClientRect();
288
+ const before = e.clientY < rect.top + rect.height / 2;
314
289
  const slot = before ? index : index + 1;
315
290
  if (dropSlot !== slot) setDropSlot(slot);
316
291
  }}
@@ -342,9 +317,7 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
342
317
  <span className="flex shrink-0 items-center">
343
318
  <DataViewsSwitch
344
319
  checked={col.visible}
345
- onCheckedChange={() =>
346
- toggleColumnVisibility(col.id)
347
- }
320
+ onCheckedChange={() => toggleColumnVisibility(col.id)}
348
321
  />
349
322
  </span>
350
323
  </div>
@@ -353,9 +326,7 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
353
326
  })}
354
327
  {/* Drop-at-end indicator: only ever rendered when the slot
355
328
  points past the last row, so still exactly one line. */}
356
- {dropSlot === orderedColumns.length && dragPath && (
357
- <DropLine />
358
- )}
329
+ {dropSlot === orderedColumns.length && dragPath && <DropLine />}
359
330
  </div>
360
331
  )}
361
332
  </div>
@@ -394,13 +365,8 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
394
365
  <div key={col.id}>
395
366
  {/* Edge-to-edge divider (Figma: no horizontal
396
367
  inset). */}
397
- {i > 0 && (
398
- <div className="dv-divider h-px bg-[#2C2D2E]" />
399
- )}
400
- <RadioRow
401
- value={col.id}
402
- label={col.label || field?.label || col.id}
403
- />
368
+ {i > 0 && <div className="dv-divider h-px bg-[#2C2D2E]" />}
369
+ <RadioRow value={col.id} label={col.label || field?.label || col.id} />
404
370
  </div>
405
371
  );
406
372
  })}
@@ -57,9 +57,7 @@ export function DataViewsHeader({
57
57
  >
58
58
  {/* Title pill */}
59
59
  <div className="flex h-9 shrink-0 items-center gap-2 rounded-[12px] border border-[#434446] bg-[#252729] px-[10px]">
60
- <span className="text-[28px] font-[510] uppercase leading-[1.19] text-white">
61
- {title}
62
- </span>
60
+ <span className="text-[28px] font-[510] uppercase leading-[1.19] text-white">{title}</span>
63
61
  </div>
64
62
 
65
63
  {/* Divider */}