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,61 +1,58 @@
1
- 'use client';
1
+ "use client";
2
2
  import { useState, useEffect } from "react";
3
3
 
4
4
  export function useActiveTreeItem(itemIds: string[]) {
5
- const [activeId, setActiveId] = useState<string | null>(null);
5
+ const [activeId, setActiveId] = useState<string | null>(null);
6
+
7
+ useEffect(() => {
8
+ if (!itemIds || itemIds.length === 0) {
9
+ console.warn("No itemIds provided to useActiveTreeItem.");
10
+ return;
11
+ }
12
+
13
+ const observer = new IntersectionObserver(
14
+ (entries) => {
15
+ let mostVisibleEntry: IntersectionObserverEntry | null = null;
16
+
17
+ for (const entry of entries) {
18
+ if (entry.isIntersecting) {
19
+ // Track the most visible entry (highest intersection ratio)
20
+ if (!mostVisibleEntry || entry.intersectionRatio > mostVisibleEntry.intersectionRatio) {
21
+ mostVisibleEntry = entry;
22
+ }
23
+ }
24
+ }
6
25
 
7
- useEffect(() => {
8
- if (!itemIds || itemIds.length === 0) {
9
- console.warn("No itemIds provided to useActiveTreeItem.");
10
- return;
26
+ if (mostVisibleEntry) {
27
+ setActiveId(mostVisibleEntry.target.id);
28
+ }
29
+ },
30
+ {
31
+ rootMargin: "-10% 0% -5% 0%", // Adjust based on your layout
32
+ threshold: [0, 0.25, 0.5, 0.75, 1], // Multiple thresholds for better accuracy
33
+ },
34
+ );
35
+
36
+ // Observe all elements
37
+ itemIds.forEach((id) => {
38
+ const element = document.getElementById(id);
39
+ if (element) {
40
+ observer.observe(element);
41
+ } else {
42
+ console.warn(`Element with id "${id}" not found.`);
43
+ }
44
+ });
45
+
46
+ // Cleanup observer
47
+ return () => {
48
+ itemIds.forEach((id) => {
49
+ const element = document.getElementById(id);
50
+ if (element) {
51
+ observer.unobserve(element);
11
52
  }
53
+ });
54
+ };
55
+ }, [itemIds]);
12
56
 
13
- const observer = new IntersectionObserver(
14
- (entries) => {
15
- let mostVisibleEntry: any = null;
16
-
17
- entries.forEach((entry) => {
18
- if (entry.isIntersecting) {
19
- // Track the most visible entry (highest intersection ratio)
20
- if (
21
- !mostVisibleEntry ||
22
- entry.intersectionRatio > mostVisibleEntry.intersectionRatio
23
- ) {
24
- mostVisibleEntry = entry;
25
- }
26
- }
27
- });
28
-
29
- if (mostVisibleEntry) {
30
- setActiveId(mostVisibleEntry.target.id);
31
- }
32
- },
33
- {
34
- rootMargin: '-10% 0% -5% 0%', // Adjust based on your layout
35
- threshold: [0, 0.25, 0.5, 0.75, 1], // Multiple thresholds for better accuracy
36
- }
37
- );
38
-
39
- // Observe all elements
40
- itemIds.forEach((id) => {
41
- const element = document.getElementById(id);
42
- if (element) {
43
- observer.observe(element);
44
- } else {
45
- console.warn(`Element with id "${id}" not found.`);
46
- }
47
- });
48
-
49
- // Cleanup observer
50
- return () => {
51
- itemIds.forEach((id) => {
52
- const element = document.getElementById(id);
53
- if (element) {
54
- observer.unobserve(element);
55
- }
56
- });
57
- };
58
- }, [itemIds]);
59
-
60
- return { activeId };
61
- }
57
+ return { activeId };
58
+ }
@@ -1,26 +1,27 @@
1
1
  import { useEffect, useRef } from "react";
2
2
 
3
- export function useClickOutside<T extends HTMLElement>(callback: (event?: MouseEvent | PointerEvent) => void, otherwise?: (event?: MouseEvent | PointerEvent) => void) {
4
- const ref = useRef<T>(null);
3
+ export function useClickOutside<T extends HTMLElement>(
4
+ callback: (event?: MouseEvent | PointerEvent) => void,
5
+ otherwise?: (event?: MouseEvent | PointerEvent) => void,
6
+ ) {
7
+ const ref = useRef<T>(null);
5
8
 
6
- useEffect(() => {
7
- function handleOutsideClick(event: MouseEvent | PointerEvent) {
8
- if (ref.current && !ref.current.contains(event.target as Node)) {
9
- callback(event);
10
- } else {
11
- otherwise?.(event);
12
- }
13
- }
9
+ useEffect(() => {
10
+ function handleOutsideClick(event: MouseEvent | PointerEvent) {
11
+ if (ref.current && !ref.current.contains(event.target as Node)) {
12
+ callback(event);
13
+ } else {
14
+ otherwise?.(event);
15
+ }
16
+ }
14
17
 
15
- document.addEventListener("mousedown", handleOutsideClick);
16
- document.addEventListener("pointerdown", handleOutsideClick);
17
- return () => {
18
- document.removeEventListener("mousedown", handleOutsideClick);
19
- document.removeEventListener("pointerdown", handleOutsideClick);
20
- };
21
- }, [callback]);
18
+ document.addEventListener("mousedown", handleOutsideClick);
19
+ document.addEventListener("pointerdown", handleOutsideClick);
20
+ return () => {
21
+ document.removeEventListener("mousedown", handleOutsideClick);
22
+ document.removeEventListener("pointerdown", handleOutsideClick);
23
+ };
24
+ }, [callback]);
22
25
 
23
- return ref;
26
+ return ref;
24
27
  }
25
-
26
-
@@ -1,6 +1,6 @@
1
- "use client"
1
+ "use client";
2
2
 
3
- import { useEffect, useMemo, useState } from "react"
3
+ import { useEffect, useMemo, useState } from "react";
4
4
  import type {
5
5
  DynamicRecord,
6
6
  DynamicColumnConfig,
@@ -10,22 +10,22 @@ import type {
10
10
  ViewConfig,
11
11
  ViewType,
12
12
  ViewVisibility,
13
- } from "../components/DataViews/types"
14
- import { defaultConfig } from "../components/DataViews/types"
15
- import { detectColumns, mergeColumns } from "../utils/dataViews/columnUtils"
16
- import { detectFields, mergeFields } from "../utils/dataViews/fieldUtils"
17
- import { autoDetectTreeShape, flattenAll } from "../utils/dataViews/treeUtils"
13
+ } from "../components/DataViews/types";
14
+ import { defaultConfig } from "../components/DataViews/types";
15
+ import { detectColumns, mergeColumns } from "../utils/dataViews/columnUtils";
16
+ import { detectFields, mergeFields } from "../utils/dataViews/fieldUtils";
17
+ import { autoDetectTreeShape, flattenAll } from "../utils/dataViews/treeUtils";
18
18
 
19
19
  export type UseDataViewsStateOptions = {
20
- data?: DynamicRecord[]
21
- fields?: FieldConfig[]
22
- columns?: Partial<DynamicColumnConfig>[]
23
- config?: Partial<ViewConfig>
24
- treeConfig?: TreeConfig
25
- views?: ViewVisibility
26
- filterState?: FilterState
27
- onFilterChange?: (filters: FilterState) => void
28
- }
20
+ data?: DynamicRecord[];
21
+ fields?: FieldConfig[];
22
+ columns?: Partial<DynamicColumnConfig>[];
23
+ config?: Partial<ViewConfig>;
24
+ treeConfig?: TreeConfig;
25
+ views?: ViewVisibility;
26
+ filterState?: FilterState;
27
+ onFilterChange?: (filters: FilterState) => void;
28
+ };
29
29
 
30
30
  export function useDataViewsState({
31
31
  data,
@@ -39,117 +39,123 @@ export function useDataViewsState({
39
39
  }: UseDataViewsStateOptions) {
40
40
  const [currentView, setCurrentView] = useState<ViewType>(
41
41
  initialConfig?.defaultView || defaultConfig.defaultView,
42
- )
43
- const [config, setConfig] = useState<ViewConfig>({ ...defaultConfig, ...initialConfig })
44
- const [items, setItems] = useState<DynamicRecord[]>(data || [])
45
- const [internalFilterState, setInternalFilterState] = useState<FilterState>({})
42
+ );
43
+ const [config, setConfig] = useState<ViewConfig>({ ...defaultConfig, ...initialConfig });
44
+ const [items, setItems] = useState<DynamicRecord[]>(data || []);
45
+ const [internalFilterState, setInternalFilterState] = useState<FilterState>({});
46
46
 
47
47
  useEffect(() => {
48
- setItems(data || [])
49
- }, [data])
48
+ setItems(data || []);
49
+ }, [data]);
50
50
 
51
- const activeFilterState = externalFilterState ?? internalFilterState
51
+ const activeFilterState = externalFilterState ?? internalFilterState;
52
52
 
53
53
  const treeShape = useMemo(
54
54
  () => autoDetectTreeShape(items, treeConfig ?? {}),
55
55
  [items, treeConfig],
56
- )
57
- const treeAutoAvailable =
58
- !!treeConfig || !!treeShape.childrenField || !!treeShape.parentField
56
+ );
57
+ const treeAutoAvailable = !!treeConfig || !!treeShape.childrenField || !!treeShape.parentField;
59
58
 
60
59
  const enabledViews = useMemo<Record<ViewType, boolean>>(() => {
61
- const v = views ?? {}
60
+ const v = views ?? {};
62
61
  return {
63
- table: v.table ?? true,
62
+ table: v.table ?? true,
64
63
  kanban: v.kanban ?? true,
65
- inbox: v.inbox ?? true,
66
- tree: v.tree ?? treeAutoAvailable,
67
- }
68
- }, [views, treeAutoAvailable])
64
+ inbox: v.inbox ?? true,
65
+ tree: v.tree ?? treeAutoAvailable,
66
+ };
67
+ }, [views, treeAutoAvailable]);
69
68
 
70
69
  useEffect(() => {
71
70
  if (!enabledViews[currentView]) {
72
- const fallback = (Object.entries(enabledViews) as Array<[ViewType, boolean]>)
73
- .find(([, on]) => on)?.[0]
74
- if (fallback) setCurrentView(fallback)
71
+ const fallback = (Object.entries(enabledViews) as Array<[ViewType, boolean]>).find(
72
+ ([, on]) => on,
73
+ )?.[0];
74
+ if (fallback) setCurrentView(fallback);
75
75
  }
76
- }, [enabledViews, currentView])
76
+ }, [enabledViews, currentView]);
77
77
 
78
78
  const flatItems = useMemo<DynamicRecord[]>(() => {
79
- const cf = treeConfig?.childrenField ?? treeShape.childrenField
80
- if (!cf) return items
81
- return flattenAll(items, cf)
82
- }, [items, treeConfig?.childrenField, treeShape.childrenField])
79
+ const cf = treeConfig?.childrenField ?? treeShape.childrenField;
80
+ if (!cf) return items;
81
+ return flattenAll(items, cf);
82
+ }, [items, treeConfig?.childrenField, treeShape.childrenField]);
83
83
 
84
84
  const detectedFields = useMemo<FieldConfig[]>(() => {
85
- if (!flatItems || flatItems.length === 0) return []
86
- const detected = detectFields(flatItems)
87
- return mergeFields(detected, fields)
88
- }, [flatItems, fields])
85
+ if (!flatItems || flatItems.length === 0) return [];
86
+ const detected = detectFields(flatItems);
87
+ return mergeFields(detected, fields);
88
+ }, [flatItems, fields]);
89
89
 
90
90
  const resolvedFields = useMemo<FieldConfig[]>(() => {
91
- if (detectedFields.length === 0) return detectedFields
92
- const overrides = new Map(config.tableColumns.map((c) => [c.id, c]))
91
+ if (detectedFields.length === 0) return detectedFields;
92
+ const overrides = new Map(config.tableColumns.map((c) => [c.id, c]));
93
93
  return detectedFields
94
94
  .map((f) => {
95
- const o = overrides.get(f.path)
96
- if (!o) return f
97
- return { ...f, visible: o.visible, order: o.order }
95
+ const o = overrides.get(f.path);
96
+ if (!o) return f;
97
+ return { ...f, visible: o.visible, order: o.order };
98
98
  })
99
- .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))
100
- }, [detectedFields, config.tableColumns])
99
+ .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
100
+ }, [detectedFields, config.tableColumns]);
101
101
 
102
102
  const detectedColumns = useMemo<DynamicColumnConfig[]>(() => {
103
- if (!flatItems || flatItems.length === 0) return []
104
- const detected = detectColumns(flatItems)
105
- return mergeColumns(detected, columns)
106
- }, [flatItems, columns])
103
+ if (!flatItems || flatItems.length === 0) return [];
104
+ const detected = detectColumns(flatItems);
105
+ return mergeColumns(detected, columns);
106
+ }, [flatItems, columns]);
107
107
 
108
108
  useEffect(() => {
109
- if (detectedFields.length === 0) return
109
+ if (detectedFields.length === 0) return;
110
110
  setConfig((prev) => {
111
- const prevByPath = new Map(prev.tableColumns.map((c) => [c.id, c]))
112
- const next: typeof prev.tableColumns = []
113
- let order = 0
111
+ const prevByPath = new Map(prev.tableColumns.map((c) => [c.id, c]));
112
+ const next: typeof prev.tableColumns = [];
113
+ let order = 0;
114
114
  for (const f of detectedFields) {
115
- if (f.type === "hidden") continue
116
- const existing = prevByPath.get(f.path)
115
+ if (f.type === "hidden") continue;
116
+ const existing = prevByPath.get(f.path);
117
117
  next.push({
118
118
  id: f.path,
119
119
  label: f.label ?? f.path,
120
120
  visible: existing?.visible ?? f.visible !== false,
121
121
  order: existing?.order ?? order,
122
- })
123
- order++
124
- prevByPath.delete(f.path)
122
+ });
123
+ order++;
124
+ prevByPath.delete(f.path);
125
125
  }
126
- const stale = Array.from(prevByPath.values())
127
- const carried = [...next, ...stale].slice(0, 100)
126
+ const stale = Array.from(prevByPath.values());
127
+ const carried = [...next, ...stale].slice(0, 100);
128
128
  if (
129
129
  carried.length === prev.tableColumns.length &&
130
130
  carried.every((c, i) => {
131
- const p = prev.tableColumns[i]
132
- return p && p.id === c.id && p.label === c.label && p.visible === c.visible && p.order === c.order
131
+ const p = prev.tableColumns[i];
132
+ return (
133
+ p &&
134
+ p.id === c.id &&
135
+ p.label === c.label &&
136
+ p.visible === c.visible &&
137
+ p.order === c.order
138
+ );
133
139
  })
134
140
  ) {
135
- return prev
141
+ return prev;
136
142
  }
137
- return { ...prev, tableColumns: carried }
138
- })
139
- }, [detectedFields])
143
+ return { ...prev, tableColumns: carried };
144
+ });
145
+ }, [detectedFields]);
140
146
 
141
147
  const handleConfigChange = (newConfig: Partial<ViewConfig>) => {
142
- setConfig((prev) => ({ ...prev, ...newConfig }))
143
- }
148
+ setConfig((prev) => ({ ...prev, ...newConfig }));
149
+ };
144
150
 
145
151
  const handleDataUpdate = (updatedData: DynamicRecord[]) => {
146
- setItems(updatedData)
147
- }
152
+ setItems(updatedData);
153
+ };
148
154
 
149
155
  const handleFilterChange = (newFilters: FilterState) => {
150
- if (onFilterChange) onFilterChange(newFilters)
151
- else setInternalFilterState(newFilters)
152
- }
156
+ if (onFilterChange) onFilterChange(newFilters);
157
+ else setInternalFilterState(newFilters);
158
+ };
153
159
 
154
160
  return {
155
161
  items,
@@ -165,5 +171,5 @@ export function useDataViewsState({
165
171
  onDataUpdate: handleDataUpdate,
166
172
  treeShape,
167
173
  enabledViews,
168
- }
174
+ };
169
175
  }
@@ -1,21 +1,21 @@
1
- "use client"
1
+ "use client";
2
2
 
3
- import * as React from "react"
3
+ import * as React from "react";
4
4
 
5
- const MOBILE_BREAKPOINT = 768
5
+ const MOBILE_BREAKPOINT = 768;
6
6
 
7
7
  export function useIsMobile() {
8
- const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)
8
+ const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined);
9
9
 
10
10
  React.useEffect(() => {
11
- const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
11
+ const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
12
12
  const onChange = () => {
13
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
14
- }
15
- mql.addEventListener("change", onChange)
16
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
17
- return () => mql.removeEventListener("change", onChange)
18
- }, [])
13
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
14
+ };
15
+ mql.addEventListener("change", onChange);
16
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
17
+ return () => mql.removeEventListener("change", onChange);
18
+ }, []);
19
19
 
20
- return !!isMobile
20
+ return !!isMobile;
21
21
  }
@@ -1,78 +1,67 @@
1
- import {
2
- MutableRefObject,
3
- RefObject,
4
- useEffect,
5
- useState,
6
- } from "react";
1
+ import { MutableRefObject, RefObject, useEffect, useState } from "react";
7
2
  import { calculateNewWidthFromMouse, calculateNewWidthFromTouch } from "../utils/resize";
8
3
 
9
-
10
4
  // Hook to handle resizing with RTL support
11
- export const useResize = (
12
- resizableRef: MutableRefObject<HTMLElement> | RefObject<HTMLElement>
13
- ) => {
14
- const [width, setWidth] = useState<number>();
15
- const [isResizing, setIsResizing] = useState<boolean>(false);
16
- const [isRTL, setIsRTL] = useState<boolean>(false);
17
-
18
-
19
-
20
- // Start the resize process
21
- const handleStartResize = () => {
22
- setIsResizing(true);
23
- };
5
+ export const useResize = (resizableRef: MutableRefObject<HTMLElement> | RefObject<HTMLElement>) => {
6
+ const [width, setWidth] = useState<number>();
7
+ const [isResizing, setIsResizing] = useState<boolean>(false);
8
+ const [isRTL, setIsRTL] = useState<boolean>(false);
24
9
 
25
- // Stop the resize process
26
- const handleStopResize = () => {
27
- setIsResizing(false);
28
- };
10
+ // Start the resize process
11
+ const handleStartResize = () => {
12
+ setIsResizing(true);
13
+ };
29
14
 
30
- // Handle mouse move events
31
- const handleMouseMove = (event: MouseEvent) => {
32
- if (!isResizing) return;
33
- const newWidth = calculateNewWidthFromMouse(event, resizableRef, isRTL);
34
- setWidth(newWidth);
35
- };
15
+ // Stop the resize process
16
+ const handleStopResize = () => {
17
+ setIsResizing(false);
18
+ };
36
19
 
37
- // Handle touch move events
38
- const handleTouchMove = (event: TouchEvent) => {
39
- if (!isResizing) return;
40
- event.preventDefault(); // Prevent scrolling or other touch-related behaviors
41
- const newWidth = calculateNewWidthFromTouch(event, resizableRef, isRTL);
42
- setWidth(newWidth);
43
- };
20
+ // Handle mouse move events
21
+ const handleMouseMove = (event: MouseEvent) => {
22
+ if (!isResizing) return;
23
+ const newWidth = calculateNewWidthFromMouse(event, resizableRef, isRTL);
24
+ setWidth(newWidth);
25
+ };
44
26
 
45
- useEffect(() => {
46
- let htmlDir = ''
47
- if (document) {
48
- htmlDir = document.documentElement.getAttribute("dir") || "ltr"
49
- }
50
- // Determine the direction of the document
51
- setIsRTL(htmlDir === "rtl");
52
- }, []);
27
+ // Handle touch move events
28
+ const handleTouchMove = (event: TouchEvent) => {
29
+ if (!isResizing) return;
30
+ event.preventDefault(); // Prevent scrolling or other touch-related behaviors
31
+ const newWidth = calculateNewWidthFromTouch(event, resizableRef, isRTL);
32
+ setWidth(newWidth);
33
+ };
53
34
 
54
- useEffect(() => {
55
- if (!resizableRef.current) return;
35
+ useEffect(() => {
36
+ let htmlDir = "";
37
+ if (document) {
38
+ htmlDir = document.documentElement.getAttribute("dir") || "ltr";
39
+ }
40
+ // Determine the direction of the document
41
+ setIsRTL(htmlDir === "rtl");
42
+ }, []);
56
43
 
57
- // Add event listeners for mouse and touch events
58
- document.addEventListener("mousemove", handleMouseMove);
59
- document.addEventListener("mouseup", handleStopResize);
60
- document.addEventListener("touchmove", handleTouchMove, { passive: false });
61
- document.addEventListener("touchend", handleStopResize);
44
+ useEffect(() => {
45
+ if (!resizableRef.current) return;
62
46
 
63
- // Cleanup event listeners on unmount
64
- return () => {
65
- document.removeEventListener("mousemove", handleMouseMove);
66
- document.removeEventListener("mouseup", handleStopResize);
67
- document.removeEventListener("touchmove", handleTouchMove);
68
- document.removeEventListener("touchend", handleStopResize);
69
- };
70
- }, [isResizing, isRTL]); // Depend on `isRtl` to handle direction changes dynamically
47
+ // Add event listeners for mouse and touch events
48
+ document.addEventListener("mousemove", handleMouseMove);
49
+ document.addEventListener("mouseup", handleStopResize);
50
+ document.addEventListener("touchmove", handleTouchMove, { passive: false });
51
+ document.addEventListener("touchend", handleStopResize);
71
52
 
72
- return {
73
- width,
74
- isResizing,
75
- handleStartResize,
53
+ // Cleanup event listeners on unmount
54
+ return () => {
55
+ document.removeEventListener("mousemove", handleMouseMove);
56
+ document.removeEventListener("mouseup", handleStopResize);
57
+ document.removeEventListener("touchmove", handleTouchMove);
58
+ document.removeEventListener("touchend", handleStopResize);
76
59
  };
77
- };
60
+ }, [isResizing, isRTL]); // Depend on `isRtl` to handle direction changes dynamically
78
61
 
62
+ return {
63
+ width,
64
+ isResizing,
65
+ handleStartResize,
66
+ };
67
+ };