torch-glare 2.4.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 +1 -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 +97 -96
  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 +1 -6
  19. package/apps/lib/components/DataViews/DataViewsConfigPanel.tsx +13 -47
  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 +155 -149
  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 +30 -23
  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 +104 -115
  41. package/apps/lib/components/DatePicker.tsx +198 -196
  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 +131 -171
  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 +1 -9
  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 +8 -14
  69. package/apps/lib/components/SearchableTable.tsx +108 -118
  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 +18 -25
  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 +15 -11
  160. package/docs/components/data-views-layout.md +13 -16
  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 +25 -34
  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 +6 -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 +18 -13
  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 +12 -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 +6 -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}
@@ -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,
@@ -51,17 +46,9 @@ export type DataViewsConfigPanelProps = {
51
46
  state?: "open" | "closed";
52
47
  };
53
48
 
54
- const DEFAULT_SAVED_VIEWS: SavedView[] = [
55
- { id: "default", label: "Default View" },
56
- ];
49
+ const DEFAULT_SAVED_VIEWS: SavedView[] = [{ id: "default", label: "Default View" }];
57
50
 
58
- function SectionHeader({
59
- title,
60
- action,
61
- }: {
62
- title: string;
63
- action?: React.ReactNode;
64
- }) {
51
+ function SectionHeader({ title, action }: { title: string; action?: React.ReactNode }) {
65
52
  return (
66
53
  <div className="flex items-center justify-between">
67
54
  <h3 className="text-[18px] font-[510] leading-[1.32] tracking-[-0.01em] text-white">
@@ -87,9 +74,7 @@ function GripDots() {
87
74
  fill="currentColor"
88
75
  >
89
76
  {[5.33, 9.33].flatMap((cx) =>
90
- [3.33, 8, 12.67].map((cy) => (
91
- <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r="1" />
92
- )),
77
+ [3.33, 8, 12.67].map((cy) => <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r="1" />),
93
78
  )}
94
79
  </svg>
95
80
  );
@@ -127,23 +112,15 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
127
112
  // `onSavedViewChange` are supplied; otherwise fall back to local state so the
128
113
  // radios are still interactive (DataViewsLayout doesn't thread these props
129
114
  // yet — without this the selection would snap back every click).
130
- const [internalSavedView, setInternalSavedView] = useState(
131
- () => savedViews[0]?.id,
132
- );
115
+ const [internalSavedView, setInternalSavedView] = useState(() => savedViews[0]?.id);
133
116
  const selectedSavedView = activeSavedView ?? internalSavedView;
134
117
  const handleSavedViewChange = (id: string) => {
135
118
  if (onSavedViewChange) onSavedViewChange(id);
136
119
  else setInternalSavedView(id);
137
120
  };
138
121
 
139
- const visibleFields = useMemo(
140
- () => fields.filter((f) => f.type !== "hidden"),
141
- [fields],
142
- );
143
- const visiblePaths = useMemo(
144
- () => new Set(visibleFields.map((f) => f.path)),
145
- [visibleFields],
146
- );
122
+ const visibleFields = useMemo(() => fields.filter((f) => f.type !== "hidden"), [fields]);
123
+ const visiblePaths = useMemo(() => new Set(visibleFields.map((f) => f.path)), [visibleFields]);
147
124
  const fieldByPath = useMemo(
148
125
  () => new Map(visibleFields.map((f) => [f.path, f])),
149
126
  [visibleFields],
@@ -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 */}
@@ -61,14 +61,14 @@ export type DataViewsLayoutProps = {
61
61
  onAddNew?: () => void;
62
62
  addNewLabel?: string;
63
63
 
64
- inboxItemHref?: (item: DynamicRecord, id: any) => string;
64
+ inboxItemHref?: (item: DynamicRecord, id: unknown) => string;
65
65
  /**
66
66
  * Component used to render inbox item links when `inboxItemHref` is set.
67
67
  * Defaults to a plain `<a>` (full-page navigation). Pass your router's link
68
68
  * (e.g. Next.js `Link`, React Router `Link`) for client-side navigation.
69
69
  */
70
70
  inboxLinkComponent?: ElementType;
71
- inboxSelectedId?: any;
71
+ inboxSelectedId?: unknown;
72
72
  inboxRenderDetail?: (item: DynamicRecord | null) => ReactNode;
73
73
 
74
74
  searchValue?: string;
@@ -79,10 +79,7 @@ export type DataViewsLayoutProps = {
79
79
  theme?: Themes;
80
80
  };
81
81
 
82
- const VIEW_META: Record<
83
- ViewType,
84
- { label: string; icon: DataViewsHeaderView["icon"] }
85
- > = {
82
+ const VIEW_META: Record<ViewType, { label: string; icon: DataViewsHeaderView["icon"] }> = {
86
83
  table: { label: "List", icon: <List /> },
87
84
  kanban: { label: "Board", icon: <LayoutGrid /> },
88
85
  inbox: { label: "Inbox", icon: <InboxIcon /> },
@@ -163,9 +160,7 @@ export const DataViewsLayout = forwardRef<HTMLDivElement, DataViewsLayoutProps>(
163
160
  // Mount at width 0 first, then flip to open on the next frame so the
164
161
  // width transition animates from 0 → 260px instead of snapping.
165
162
  setPanelMounted(true);
166
- requestAnimationFrame(() =>
167
- requestAnimationFrame(() => setPanelOpen(true)),
168
- );
163
+ requestAnimationFrame(() => requestAnimationFrame(() => setPanelOpen(true)));
169
164
  }, []);
170
165
 
171
166
  const closePanel = useCallback(() => {
@@ -250,9 +245,7 @@ export const DataViewsLayout = forwardRef<HTMLDivElement, DataViewsLayoutProps>(
250
245
  fields={resolvedFields}
251
246
  config={effectiveConfig}
252
247
  onDataUpdate={onDataUpdate}
253
- onSortChange={(sortBy, sortOrder) =>
254
- setConfig({ sortBy, sortOrder })
255
- }
248
+ onSortChange={(sortBy, sortOrder) => setConfig({ sortBy, sortOrder })}
256
249
  filters={filters}
257
250
  filterState={filterState}
258
251
  onFilterChange={setFilterState}