torch-glare 2.4.0 → 2.4.2

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 (318) 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 +21 -20
  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 +40 -24
  13. package/apps/lib/components/Checkbox.tsx +9 -16
  14. package/apps/lib/components/ColorPicker.tsx +441 -0
  15. package/apps/lib/components/ConclusionHeader.tsx +148 -0
  16. package/apps/lib/components/ContextMenu.tsx +97 -96
  17. package/apps/lib/components/CountBadge.tsx +4 -6
  18. package/apps/lib/components/DataTable.tsx +196 -216
  19. package/apps/lib/components/DataViews/DataViewRadio.tsx +1 -6
  20. package/apps/lib/components/DataViews/DataViewsConfigPanel.tsx +13 -47
  21. package/apps/lib/components/DataViews/DataViewsHeader.tsx +1 -3
  22. package/apps/lib/components/DataViews/DataViewsLayout.tsx +5 -12
  23. package/apps/lib/components/DataViews/FilterPanel.tsx +155 -149
  24. package/apps/lib/components/DataViews/HeaderSearch.tsx +1 -5
  25. package/apps/lib/components/DataViews/InboxView.tsx +22 -68
  26. package/apps/lib/components/DataViews/InboxViewCard.tsx +68 -77
  27. package/apps/lib/components/DataViews/KanbanView.tsx +8 -25
  28. package/apps/lib/components/DataViews/PanelControls.tsx +3 -13
  29. package/apps/lib/components/DataViews/SettingsPanel.tsx +83 -89
  30. package/apps/lib/components/DataViews/TableView.tsx +8 -28
  31. package/apps/lib/components/DataViews/TreeView.tsx +12 -40
  32. package/apps/lib/components/DataViews/badgeAdapter.ts +32 -28
  33. package/apps/lib/components/DataViews/fieldRenderers.tsx +106 -141
  34. package/apps/lib/components/DataViews/filters/DatePickerRangeFilter.tsx +30 -23
  35. package/apps/lib/components/DataViews/filters/DateRangePopover.tsx +39 -32
  36. package/apps/lib/components/DataViews/filters/PresetChips.tsx +15 -15
  37. package/apps/lib/components/DataViews/filters/RangeSliderWithInputs.tsx +69 -58
  38. package/apps/lib/components/DataViews/index.ts +26 -26
  39. package/apps/lib/components/DataViews/tree/TreeDrawer.tsx +12 -16
  40. package/apps/lib/components/DataViews/tree/TreeSidebar.tsx +28 -31
  41. package/apps/lib/components/DataViews/types.ts +104 -115
  42. package/apps/lib/components/DatePicker.tsx +200 -196
  43. package/apps/lib/components/Dialog.tsx +92 -105
  44. package/apps/lib/components/Divider.tsx +21 -24
  45. package/apps/lib/components/Drawer.tsx +124 -142
  46. package/apps/lib/components/DropdownMenu.tsx +131 -171
  47. package/apps/lib/components/FieldHint.tsx +4 -11
  48. package/apps/lib/components/Form.tsx +146 -155
  49. package/apps/lib/components/FormBuilder/DisplayField.tsx +40 -0
  50. package/apps/lib/components/FormBuilder/context.ts +71 -0
  51. package/apps/lib/components/FormBuilder/fields/ChoiceFields.tsx +65 -0
  52. package/apps/lib/components/FormBuilder/fields/ColorField.tsx +76 -0
  53. package/apps/lib/components/FormBuilder/fields/CustomField.tsx +16 -0
  54. package/apps/lib/components/FormBuilder/fields/DateField.tsx +34 -0
  55. package/apps/lib/components/FormBuilder/fields/FieldArray.tsx +79 -0
  56. package/apps/lib/components/FormBuilder/fields/FieldShell.tsx +174 -0
  57. package/apps/lib/components/FormBuilder/fields/FileField.tsx +40 -0
  58. package/apps/lib/components/FormBuilder/fields/OptionListFields.tsx +139 -0
  59. package/apps/lib/components/FormBuilder/fields/OtpField.tsx +32 -0
  60. package/apps/lib/components/FormBuilder/fields/PhoneField.tsx +82 -0
  61. package/apps/lib/components/FormBuilder/fields/RichTextEditorField.tsx +37 -0
  62. package/apps/lib/components/FormBuilder/fields/SelectField.tsx +101 -0
  63. package/apps/lib/components/FormBuilder/fields/SignatureField.tsx +175 -0
  64. package/apps/lib/components/FormBuilder/fields/SliderField.tsx +72 -0
  65. package/apps/lib/components/FormBuilder/fields/SwitchBoxField.tsx +42 -0
  66. package/apps/lib/components/FormBuilder/fields/TableField.tsx +312 -0
  67. package/apps/lib/components/FormBuilder/fields/TextField.tsx +222 -0
  68. package/apps/lib/components/FormBuilder/fields/TreeSelectField.tsx +49 -0
  69. package/apps/lib/components/FormBuilder/fields/countries.ts +303 -0
  70. package/apps/lib/components/FormBuilder/fields/index.ts +25 -0
  71. package/apps/lib/components/FormBuilder/form-builder.tsx +292 -0
  72. package/apps/lib/components/FormBuilder/header.tsx +105 -0
  73. package/apps/lib/components/FormBuilder/index.ts +37 -0
  74. package/apps/lib/components/FormBuilder/numberFormat.ts +16 -0
  75. package/apps/lib/components/FormBuilder/stepper.tsx +217 -0
  76. package/apps/lib/components/FormBuilder/submit.tsx +41 -0
  77. package/apps/lib/components/FormBuilder/types.ts +264 -0
  78. package/apps/lib/components/FormBuilder/viewFormat.tsx +137 -0
  79. package/apps/lib/components/FormRenderer/FormDrawer.tsx +121 -0
  80. package/apps/lib/components/FormRenderer/form-renderer.tsx +113 -0
  81. package/apps/lib/components/FormRenderer/index.ts +9 -0
  82. package/apps/lib/components/FormRenderer/types.ts +79 -0
  83. package/apps/lib/components/FormStepper.tsx +9 -39
  84. package/apps/lib/components/FormSummary.tsx +282 -0
  85. package/apps/lib/components/HeaderBar.tsx +1 -9
  86. package/apps/lib/components/ImageAttachment.tsx +106 -93
  87. package/apps/lib/components/InnerLabelField.tsx +20 -16
  88. package/apps/lib/components/Input.tsx +171 -172
  89. package/apps/lib/components/InputField.tsx +44 -45
  90. package/apps/lib/components/InputOTP.tsx +68 -69
  91. package/apps/lib/components/Label.tsx +61 -58
  92. package/apps/lib/components/LabelField.tsx +4 -5
  93. package/apps/lib/components/LabeledCheckBox.tsx +8 -12
  94. package/apps/lib/components/LabeledRadio.tsx +7 -5
  95. package/apps/lib/components/LinkButton.tsx +2 -9
  96. package/apps/lib/components/LoginButton.tsx +4 -9
  97. package/apps/lib/components/PasswordLevel.tsx +5 -5
  98. package/apps/lib/components/Popover.tsx +15 -33
  99. package/apps/lib/components/ProfileMenu.tsx +67 -72
  100. package/apps/lib/components/Radio.tsx +1 -5
  101. package/apps/lib/components/RadioCard.tsx +11 -28
  102. package/apps/lib/components/ScrollArea.tsx +45 -43
  103. package/apps/lib/components/SearchField.tsx +49 -39
  104. package/apps/lib/components/SearchableSelect.tsx +16 -16
  105. package/apps/lib/components/SearchableTable.tsx +108 -118
  106. package/apps/lib/components/SearchableTree.tsx +469 -0
  107. package/apps/lib/components/SearchableTreeDialog.tsx +493 -0
  108. package/apps/lib/components/SectionBlock.tsx +19 -23
  109. package/apps/lib/components/Select.tsx +80 -186
  110. package/apps/lib/components/SimpleSelect.tsx +196 -187
  111. package/apps/lib/components/Skeleton.tsx +9 -12
  112. package/apps/lib/components/SlideDatePicker.tsx +215 -166
  113. package/apps/lib/components/SpinLoading.tsx +33 -49
  114. package/apps/lib/components/Stepper.tsx +13 -56
  115. package/apps/lib/components/Switch.tsx +8 -10
  116. package/apps/lib/components/TabFormItem.tsx +3 -12
  117. package/apps/lib/components/TabSwitch.tsx +7 -34
  118. package/apps/lib/components/Table.tsx +60 -75
  119. package/apps/lib/components/{ChartBlockTool.ts → TextEditor/ChartBlockTool.ts} +17 -52
  120. package/apps/lib/components/TextEditor/RichTextField.tsx +46 -0
  121. package/apps/lib/components/{TableDnDWrapper.ts → TextEditor/TableDnDWrapper.ts} +15 -48
  122. package/apps/lib/components/{TextEditor.tsx → TextEditor/TextEditor.tsx} +156 -113
  123. package/apps/lib/components/TextEditor/TextEditorToolbar.tsx +429 -0
  124. package/apps/lib/components/TextEditor/editor-tools/AlignmentTune.ts +70 -0
  125. package/apps/lib/components/TextEditor/editor-tools/ColorInlineTool.ts +50 -0
  126. package/apps/lib/components/TextEditor/editor-tools/StrikethroughInlineTool.ts +48 -0
  127. package/apps/lib/components/TextEditor/editor-tools/inlineFormat.ts +98 -0
  128. package/apps/lib/{types → components/TextEditor}/editorjs.d.ts +19 -0
  129. package/apps/lib/components/TextEditor/index.ts +7 -0
  130. package/apps/lib/{utils → components/TextEditor}/markdownParser.ts +2 -7
  131. package/apps/lib/components/Textarea.tsx +9 -13
  132. package/apps/lib/components/Timeline.tsx +21 -41
  133. package/apps/lib/components/Toast.tsx +83 -83
  134. package/apps/lib/components/Toggle.tsx +112 -114
  135. package/apps/lib/components/ToggleButton.tsx +1 -1
  136. package/apps/lib/components/Tooltip.tsx +24 -19
  137. package/apps/lib/components/TransparentLabel.tsx +61 -62
  138. package/apps/lib/components/TreeDropDown.tsx +86 -52
  139. package/apps/lib/components/TreeFolder/TreeFolder.tsx +15 -48
  140. package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +16 -21
  141. package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +9 -20
  142. package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +3 -3
  143. package/apps/lib/components/TreeFolder/icons.tsx +14 -17
  144. package/apps/lib/components/TreeFolder/index.ts +15 -8
  145. package/apps/lib/components/TreeFolder/treeFolderUtils.ts +47 -52
  146. package/apps/lib/components/TreeFolder/types.ts +32 -32
  147. package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +117 -123
  148. package/apps/lib/hooks/useActiveTreeItem.ts +52 -55
  149. package/apps/lib/hooks/useClickOutside.ts +21 -20
  150. package/apps/lib/hooks/useDataViewsState.ts +86 -80
  151. package/apps/lib/hooks/useIsMobile.ts +12 -12
  152. package/apps/lib/hooks/useResize.ts +54 -65
  153. package/apps/lib/hooks/useTagSelection.ts +201 -201
  154. package/apps/lib/layouts/CNLayout.tsx +181 -140
  155. package/apps/lib/layouts/DataViewCard.tsx +4 -18
  156. package/apps/lib/layouts/FieldSection.tsx +2 -6
  157. package/apps/lib/layouts/TreeSubLayout.tsx +24 -38
  158. package/apps/lib/providers/ThemeProvider.tsx +8 -23
  159. package/apps/lib/registry.json +997 -0
  160. package/apps/lib/tsconfig.json +9 -0
  161. package/apps/lib/tsconfig.tsbuildinfo +1 -0
  162. package/apps/lib/utils/cn.ts +1 -1
  163. package/apps/lib/utils/color.ts +175 -0
  164. package/apps/lib/utils/dataViews/columnUtils.ts +46 -44
  165. package/apps/lib/utils/dataViews/fieldUtils.ts +70 -71
  166. package/apps/lib/utils/dataViews/nestedDataUtils.tsx +129 -122
  167. package/apps/lib/utils/dataViews/pathUtils.ts +74 -67
  168. package/apps/lib/utils/dataViews/rangeUtils.ts +121 -112
  169. package/apps/lib/utils/dataViews/treeUtils.ts +204 -211
  170. package/apps/lib/utils/dateFormat.ts +64 -54
  171. package/apps/lib/utils/resize.ts +21 -25
  172. package/apps/lib/utils/types.ts +13 -13
  173. package/dist/bin/index.js +8 -2
  174. package/dist/bin/index.js.map +1 -1
  175. package/dist/src/shared/getAvailableFiles.d.ts.map +1 -1
  176. package/dist/src/shared/getAvailableFiles.js +6 -1
  177. package/dist/src/shared/getAvailableFiles.js.map +1 -1
  178. package/dist/src/shared/loadRegistry.d.ts +7 -0
  179. package/dist/src/shared/loadRegistry.d.ts.map +1 -0
  180. package/dist/src/shared/loadRegistry.js +31 -0
  181. package/dist/src/shared/loadRegistry.js.map +1 -0
  182. package/dist/src/shared/resolveInstallPlan.d.ts +12 -0
  183. package/dist/src/shared/resolveInstallPlan.d.ts.map +1 -0
  184. package/dist/src/shared/resolveInstallPlan.js +39 -0
  185. package/dist/src/shared/resolveInstallPlan.js.map +1 -0
  186. package/dist/src/types/main.d.ts +24 -0
  187. package/dist/src/types/main.d.ts.map +1 -1
  188. package/docs/README.md +10 -2
  189. package/docs/components/action-button.md +30 -24
  190. package/docs/components/actions-group.md +26 -20
  191. package/docs/components/alert-dialog.md +45 -45
  192. package/docs/components/avatar.md +6 -2
  193. package/docs/components/badge-field.md +6 -2
  194. package/docs/components/badge.md +7 -1
  195. package/docs/components/breadcrumb.md +15 -40
  196. package/docs/components/button-group.md +13 -10
  197. package/docs/components/button.md +58 -33
  198. package/docs/components/calendar.md +26 -19
  199. package/docs/components/card.md +23 -18
  200. package/docs/components/chart-block-tool.md +129 -0
  201. package/docs/components/checkbox.md +16 -8
  202. package/docs/components/cn-layout.md +7 -1
  203. package/docs/components/color-picker.md +101 -0
  204. package/docs/components/conclusion-header.md +80 -0
  205. package/docs/components/context-menu.md +18 -25
  206. package/docs/components/count-badge.md +7 -1
  207. package/docs/components/data-table.md +45 -33
  208. package/docs/components/data-views-config-panel.md +15 -11
  209. package/docs/components/data-views-layout.md +13 -16
  210. package/docs/components/date-picker.md +30 -23
  211. package/docs/components/dialog.md +43 -42
  212. package/docs/components/divider.md +10 -4
  213. package/docs/components/drawer.md +161 -135
  214. package/docs/components/dropdown-menu.md +25 -34
  215. package/docs/components/field-hint.md +37 -25
  216. package/docs/components/field-section.md +9 -3
  217. package/docs/components/form-builder.md +270 -0
  218. package/docs/components/form-renderer.md +228 -0
  219. package/docs/components/form-stepper.md +6 -0
  220. package/docs/components/form-summary.md +123 -0
  221. package/docs/components/form.md +17 -20
  222. package/docs/components/header-bar.md +6 -0
  223. package/docs/components/image-attachment.md +43 -45
  224. package/docs/components/inbox-view.md +16 -5
  225. package/docs/components/inner-label-field.md +34 -24
  226. package/docs/components/input-field.md +18 -10
  227. package/docs/components/input-otp.md +14 -11
  228. package/docs/components/input.md +22 -16
  229. package/docs/components/kanban-view.md +15 -5
  230. package/docs/components/label-field.md +32 -22
  231. package/docs/components/label.md +43 -32
  232. package/docs/components/labeled-check-box.md +16 -8
  233. package/docs/components/labeled-radio.md +18 -11
  234. package/docs/components/link-button.md +7 -1
  235. package/docs/components/login-button.md +8 -2
  236. package/docs/components/password-level.md +37 -24
  237. package/docs/components/popover.md +26 -23
  238. package/docs/components/profile-menu.md +38 -27
  239. package/docs/components/radio-card.md +16 -9
  240. package/docs/components/radio.md +16 -8
  241. package/docs/components/scroll-area.md +6 -2
  242. package/docs/components/search-field.md +14 -6
  243. package/docs/components/searchable-select.md +19 -14
  244. package/docs/components/searchable-table.md +18 -13
  245. package/docs/components/searchable-tree-dialog.md +190 -0
  246. package/docs/components/searchable-tree.md +200 -0
  247. package/docs/components/section-block.md +12 -4
  248. package/docs/components/select.md +23 -18
  249. package/docs/components/simple-select.md +14 -10
  250. package/docs/components/skeleton.md +43 -33
  251. package/docs/components/slide-date-picker.md +37 -29
  252. package/docs/components/spin-loading.md +32 -23
  253. package/docs/components/stepper.md +6 -0
  254. package/docs/components/switch.md +14 -6
  255. package/docs/components/tab-form-item.md +7 -1
  256. package/docs/components/tab-switch.md +13 -6
  257. package/docs/components/table-dnd-wrapper.md +107 -0
  258. package/docs/components/table-view.md +15 -5
  259. package/docs/components/table.md +28 -28
  260. package/docs/components/text-editor.md +37 -13
  261. package/docs/components/textarea.md +15 -7
  262. package/docs/components/timeline.md +6 -0
  263. package/docs/components/toast.md +35 -26
  264. package/docs/components/toggle-button.md +24 -21
  265. package/docs/components/toggle.md +23 -15
  266. package/docs/components/tooltip.md +42 -30
  267. package/docs/components/transparent-label.md +29 -20
  268. package/docs/components/tree-drop-down.md +31 -23
  269. package/docs/components/tree-sub-layout.md +6 -2
  270. package/docs/components/tree-view.md +16 -5
  271. package/docs/explanation/architecture.md +54 -0
  272. package/docs/explanation/design-system.md +52 -0
  273. package/docs/how-to/data-views-from-backend-response.md +6 -4
  274. package/docs/how-to/form-and-list-recipes.md +26 -19
  275. package/docs/how-to/forms-with-form-builder.md +408 -0
  276. package/docs/how-to/guides.md +177 -197
  277. package/docs/migration/changelog.md +38 -0
  278. package/docs/reference/cli.md +87 -0
  279. package/docs/reference/components.md +11 -12
  280. package/docs/reference/hooks.md +8 -8
  281. package/docs/reference/providers.md +22 -22
  282. package/docs/reference/tailwind-plugins.md +2 -2
  283. package/docs/reference/theme.md +85 -0
  284. package/docs/reference/types.md +4 -4
  285. package/docs/reference/utilities.md +19 -26
  286. package/docs/tutorials/building-first-form.md +170 -172
  287. package/docs/tutorials/component-composition.md +34 -50
  288. package/docs/tutorials/getting-started.md +2 -2
  289. package/docs/tutorials/theming-basics.md +13 -10
  290. package/package.json +31 -3
  291. package/dist/src/commands/block.d.ts +0 -5
  292. package/dist/src/commands/block.d.ts.map +0 -1
  293. package/dist/src/commands/block.js +0 -255
  294. package/dist/src/commands/block.js.map +0 -1
  295. package/dist/src/shared/configureFonts.d.ts +0 -6
  296. package/dist/src/shared/configureFonts.d.ts.map +0 -1
  297. package/dist/src/shared/configureFonts.js +0 -106
  298. package/dist/src/shared/configureFonts.js.map +0 -1
  299. package/dist/src/shared/configureGlobalCss.d.ts +0 -6
  300. package/dist/src/shared/configureGlobalCss.d.ts.map +0 -1
  301. package/dist/src/shared/configureGlobalCss.js +0 -154
  302. package/dist/src/shared/configureGlobalCss.js.map +0 -1
  303. package/dist/src/shared/configureTailwind.d.ts +0 -7
  304. package/dist/src/shared/configureTailwind.d.ts.map +0 -1
  305. package/dist/src/shared/configureTailwind.js +0 -163
  306. package/dist/src/shared/configureTailwind.js.map +0 -1
  307. package/dist/src/shared/detectFramework.d.ts +0 -23
  308. package/dist/src/shared/detectFramework.d.ts.map +0 -1
  309. package/dist/src/shared/detectFramework.js +0 -119
  310. package/dist/src/shared/detectFramework.js.map +0 -1
  311. package/dist/src/shared/installBaseUtils.d.ts +0 -5
  312. package/dist/src/shared/installBaseUtils.d.ts.map +0 -1
  313. package/dist/src/shared/installBaseUtils.js +0 -79
  314. package/dist/src/shared/installBaseUtils.js.map +0 -1
  315. package/dist/src/shared/resolveAliases.d.ts +0 -24
  316. package/dist/src/shared/resolveAliases.d.ts.map +0 -1
  317. package/dist/src/shared/resolveAliases.js +0 -98
  318. 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
+ };