torch-glare 2.3.0 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/README.md +8 -0
  2. package/apps/lib/components/ActionButton.tsx +7 -12
  3. package/apps/lib/components/ActionsGroup.tsx +4 -15
  4. package/apps/lib/components/AlertDialog.tsx +173 -191
  5. package/apps/lib/components/Avatar.tsx +13 -16
  6. package/apps/lib/components/Badge.tsx +7 -3
  7. package/apps/lib/components/BadgeField.tsx +76 -71
  8. package/apps/lib/components/Breadcrumb.tsx +49 -85
  9. package/apps/lib/components/Button.tsx +20 -19
  10. package/apps/lib/components/ButtonGroup.tsx +31 -41
  11. package/apps/lib/components/Calendar.tsx +51 -29
  12. package/apps/lib/components/Card.tsx +2 -13
  13. package/apps/lib/components/ChartBlockTool.ts +17 -52
  14. package/apps/lib/components/Checkbox.tsx +9 -16
  15. package/apps/lib/components/ContextMenu.tsx +110 -106
  16. package/apps/lib/components/CountBadge.tsx +4 -6
  17. package/apps/lib/components/DataTable.tsx +196 -216
  18. package/apps/lib/components/DataViews/DataViewRadio.tsx +10 -8
  19. package/apps/lib/components/DataViews/DataViewsConfigPanel.tsx +21 -55
  20. package/apps/lib/components/DataViews/DataViewsHeader.tsx +1 -3
  21. package/apps/lib/components/DataViews/DataViewsLayout.tsx +5 -12
  22. package/apps/lib/components/DataViews/FilterPanel.tsx +173 -150
  23. package/apps/lib/components/DataViews/HeaderSearch.tsx +1 -5
  24. package/apps/lib/components/DataViews/InboxView.tsx +22 -68
  25. package/apps/lib/components/DataViews/InboxViewCard.tsx +68 -77
  26. package/apps/lib/components/DataViews/KanbanView.tsx +8 -25
  27. package/apps/lib/components/DataViews/PanelControls.tsx +3 -13
  28. package/apps/lib/components/DataViews/SettingsPanel.tsx +83 -89
  29. package/apps/lib/components/DataViews/TableView.tsx +8 -28
  30. package/apps/lib/components/DataViews/TreeView.tsx +12 -40
  31. package/apps/lib/components/DataViews/badgeAdapter.ts +32 -28
  32. package/apps/lib/components/DataViews/fieldRenderers.tsx +106 -141
  33. package/apps/lib/components/DataViews/filters/DatePickerRangeFilter.tsx +87 -0
  34. package/apps/lib/components/DataViews/filters/DateRangePopover.tsx +39 -32
  35. package/apps/lib/components/DataViews/filters/PresetChips.tsx +15 -15
  36. package/apps/lib/components/DataViews/filters/RangeSliderWithInputs.tsx +69 -58
  37. package/apps/lib/components/DataViews/index.ts +26 -26
  38. package/apps/lib/components/DataViews/tree/TreeDrawer.tsx +12 -16
  39. package/apps/lib/components/DataViews/tree/TreeSidebar.tsx +28 -31
  40. package/apps/lib/components/DataViews/types.ts +111 -114
  41. package/apps/lib/components/DatePicker.tsx +198 -191
  42. package/apps/lib/components/Dialog.tsx +92 -105
  43. package/apps/lib/components/Divider.tsx +21 -24
  44. package/apps/lib/components/Drawer.tsx +79 -139
  45. package/apps/lib/components/DropdownMenu.tsx +144 -181
  46. package/apps/lib/components/FieldHint.tsx +4 -11
  47. package/apps/lib/components/Form.tsx +146 -155
  48. package/apps/lib/components/FormStepper.tsx +9 -39
  49. package/apps/lib/components/HeaderBar.tsx +119 -0
  50. package/apps/lib/components/ImageAttachment.tsx +111 -73
  51. package/apps/lib/components/InnerLabelField.tsx +20 -16
  52. package/apps/lib/components/Input.tsx +171 -172
  53. package/apps/lib/components/InputField.tsx +44 -45
  54. package/apps/lib/components/InputOTP.tsx +68 -69
  55. package/apps/lib/components/Label.tsx +31 -35
  56. package/apps/lib/components/LabelField.tsx +4 -5
  57. package/apps/lib/components/LabeledCheckBox.tsx +8 -12
  58. package/apps/lib/components/LabeledRadio.tsx +7 -5
  59. package/apps/lib/components/LinkButton.tsx +2 -9
  60. package/apps/lib/components/LoginButton.tsx +4 -9
  61. package/apps/lib/components/PasswordLevel.tsx +5 -5
  62. package/apps/lib/components/Popover.tsx +15 -33
  63. package/apps/lib/components/ProfileMenu.tsx +67 -72
  64. package/apps/lib/components/Radio.tsx +1 -5
  65. package/apps/lib/components/RadioCard.tsx +9 -28
  66. package/apps/lib/components/ScrollArea.tsx +45 -43
  67. package/apps/lib/components/SearchField.tsx +49 -39
  68. package/apps/lib/components/SearchableSelect.tsx +46 -52
  69. package/apps/lib/components/SearchableTable.tsx +199 -219
  70. package/apps/lib/components/SearchableTree.tsx +469 -0
  71. package/apps/lib/components/SearchableTreeDialog.tsx +493 -0
  72. package/apps/lib/components/SectionBlock.tsx +4 -16
  73. package/apps/lib/components/Select.tsx +53 -80
  74. package/apps/lib/components/SimpleSelect.tsx +196 -187
  75. package/apps/lib/components/Skeleton.tsx +9 -12
  76. package/apps/lib/components/SlideDatePicker.tsx +215 -166
  77. package/apps/lib/components/SpinLoading.tsx +33 -49
  78. package/apps/lib/components/Stepper.tsx +13 -56
  79. package/apps/lib/components/Switch.tsx +8 -10
  80. package/apps/lib/components/TabFormItem.tsx +3 -12
  81. package/apps/lib/components/TabSwitch.tsx +7 -34
  82. package/apps/lib/components/Table.tsx +60 -75
  83. package/apps/lib/components/TableDnDWrapper.ts +15 -48
  84. package/apps/lib/components/TextEditor.tsx +93 -104
  85. package/apps/lib/components/Textarea.tsx +8 -12
  86. package/apps/lib/components/Timeline.tsx +21 -41
  87. package/apps/lib/components/Toast.tsx +83 -83
  88. package/apps/lib/components/Toggle.tsx +112 -114
  89. package/apps/lib/components/ToggleButton.tsx +1 -1
  90. package/apps/lib/components/Tooltip.tsx +24 -19
  91. package/apps/lib/components/TransparentLabel.tsx +61 -62
  92. package/apps/lib/components/TreeDropDown.tsx +86 -52
  93. package/apps/lib/components/TreeFolder/TreeFolder.tsx +15 -48
  94. package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +16 -21
  95. package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +9 -20
  96. package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +3 -3
  97. package/apps/lib/components/TreeFolder/icons.tsx +14 -17
  98. package/apps/lib/components/TreeFolder/index.ts +15 -8
  99. package/apps/lib/components/TreeFolder/treeFolderUtils.ts +47 -52
  100. package/apps/lib/components/TreeFolder/types.ts +32 -32
  101. package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +117 -123
  102. package/apps/lib/hooks/useActiveTreeItem.ts +52 -55
  103. package/apps/lib/hooks/useClickOutside.ts +21 -20
  104. package/apps/lib/hooks/useDataViewsState.ts +86 -80
  105. package/apps/lib/hooks/useIsMobile.ts +12 -12
  106. package/apps/lib/hooks/useResize.ts +54 -65
  107. package/apps/lib/hooks/useTagSelection.ts +201 -201
  108. package/apps/lib/layouts/CNLayout.tsx +181 -140
  109. package/apps/lib/layouts/DataViewCard.tsx +4 -18
  110. package/apps/lib/layouts/FieldSection.tsx +2 -6
  111. package/apps/lib/layouts/TreeSubLayout.tsx +24 -38
  112. package/apps/lib/providers/ThemeProvider.tsx +8 -23
  113. package/apps/lib/registry.json +1004 -0
  114. package/apps/lib/tsconfig.json +9 -0
  115. package/apps/lib/utils/cn.ts +1 -1
  116. package/apps/lib/utils/dataViews/columnUtils.ts +46 -44
  117. package/apps/lib/utils/dataViews/fieldUtils.ts +70 -71
  118. package/apps/lib/utils/dataViews/nestedDataUtils.tsx +129 -122
  119. package/apps/lib/utils/dataViews/pathUtils.ts +74 -67
  120. package/apps/lib/utils/dataViews/rangeUtils.ts +121 -112
  121. package/apps/lib/utils/dataViews/treeUtils.ts +204 -211
  122. package/apps/lib/utils/dateFormat.ts +64 -54
  123. package/apps/lib/utils/markdownParser.ts +2 -7
  124. package/apps/lib/utils/resize.ts +21 -25
  125. package/apps/lib/utils/types.ts +13 -13
  126. package/dist/bin/index.js +8 -2
  127. package/dist/bin/index.js.map +1 -1
  128. package/dist/src/shared/getAvailableFiles.d.ts.map +1 -1
  129. package/dist/src/shared/getAvailableFiles.js +6 -1
  130. package/dist/src/shared/getAvailableFiles.js.map +1 -1
  131. package/dist/src/shared/loadRegistry.d.ts +7 -0
  132. package/dist/src/shared/loadRegistry.d.ts.map +1 -0
  133. package/dist/src/shared/loadRegistry.js +31 -0
  134. package/dist/src/shared/loadRegistry.js.map +1 -0
  135. package/dist/src/shared/resolveInstallPlan.d.ts +12 -0
  136. package/dist/src/shared/resolveInstallPlan.d.ts.map +1 -0
  137. package/dist/src/shared/resolveInstallPlan.js +39 -0
  138. package/dist/src/shared/resolveInstallPlan.js.map +1 -0
  139. package/dist/src/types/main.d.ts +24 -0
  140. package/dist/src/types/main.d.ts.map +1 -1
  141. package/docs/README.md +10 -2
  142. package/docs/components/action-button.md +30 -24
  143. package/docs/components/actions-group.md +26 -20
  144. package/docs/components/alert-dialog.md +45 -45
  145. package/docs/components/avatar.md +6 -2
  146. package/docs/components/badge-field.md +6 -2
  147. package/docs/components/badge.md +7 -1
  148. package/docs/components/breadcrumb.md +15 -40
  149. package/docs/components/button-group.md +13 -10
  150. package/docs/components/button.md +58 -33
  151. package/docs/components/calendar.md +26 -19
  152. package/docs/components/card.md +19 -16
  153. package/docs/components/chart-block-tool.md +128 -0
  154. package/docs/components/checkbox.md +16 -8
  155. package/docs/components/cn-layout.md +7 -1
  156. package/docs/components/context-menu.md +47 -24
  157. package/docs/components/count-badge.md +7 -1
  158. package/docs/components/data-table.md +45 -33
  159. package/docs/components/data-views-config-panel.md +18 -14
  160. package/docs/components/data-views-layout.md +20 -17
  161. package/docs/components/date-picker.md +30 -23
  162. package/docs/components/dialog.md +43 -42
  163. package/docs/components/divider.md +10 -4
  164. package/docs/components/drawer.md +8 -33
  165. package/docs/components/dropdown-menu.md +51 -32
  166. package/docs/components/field-hint.md +37 -25
  167. package/docs/components/field-section.md +9 -3
  168. package/docs/components/form-stepper.md +6 -0
  169. package/docs/components/form.md +17 -20
  170. package/docs/components/header-bar.md +187 -0
  171. package/docs/components/image-attachment.md +33 -41
  172. package/docs/components/inbox-view.md +16 -5
  173. package/docs/components/inner-label-field.md +34 -24
  174. package/docs/components/input-field.md +18 -10
  175. package/docs/components/input-otp.md +14 -11
  176. package/docs/components/input.md +22 -16
  177. package/docs/components/kanban-view.md +15 -5
  178. package/docs/components/label-field.md +32 -22
  179. package/docs/components/label.md +43 -32
  180. package/docs/components/labeled-check-box.md +16 -8
  181. package/docs/components/labeled-radio.md +18 -11
  182. package/docs/components/link-button.md +7 -1
  183. package/docs/components/login-button.md +8 -2
  184. package/docs/components/password-level.md +37 -24
  185. package/docs/components/popover.md +26 -23
  186. package/docs/components/profile-menu.md +38 -27
  187. package/docs/components/radio-card.md +16 -9
  188. package/docs/components/radio.md +16 -8
  189. package/docs/components/scroll-area.md +6 -2
  190. package/docs/components/search-field.md +14 -6
  191. package/docs/components/searchable-select.md +19 -14
  192. package/docs/components/searchable-table.md +60 -41
  193. package/docs/components/searchable-tree-dialog.md +190 -0
  194. package/docs/components/searchable-tree.md +200 -0
  195. package/docs/components/section-block.md +130 -4
  196. package/docs/components/select.md +23 -18
  197. package/docs/components/simple-select.md +14 -10
  198. package/docs/components/skeleton.md +43 -33
  199. package/docs/components/slide-date-picker.md +37 -29
  200. package/docs/components/spin-loading.md +32 -23
  201. package/docs/components/stepper.md +6 -0
  202. package/docs/components/switch.md +14 -6
  203. package/docs/components/tab-form-item.md +7 -1
  204. package/docs/components/tab-switch.md +13 -6
  205. package/docs/components/table-dnd-wrapper.md +105 -0
  206. package/docs/components/table-view.md +15 -5
  207. package/docs/components/table.md +28 -28
  208. package/docs/components/text-editor.md +19 -13
  209. package/docs/components/textarea.md +15 -7
  210. package/docs/components/timeline.md +6 -0
  211. package/docs/components/toast.md +35 -26
  212. package/docs/components/toggle-button.md +24 -21
  213. package/docs/components/toggle.md +23 -15
  214. package/docs/components/tooltip.md +42 -30
  215. package/docs/components/transparent-label.md +29 -20
  216. package/docs/components/tree-drop-down.md +31 -23
  217. package/docs/components/tree-sub-layout.md +6 -2
  218. package/docs/components/tree-view.md +16 -5
  219. package/docs/explanation/architecture.md +54 -0
  220. package/docs/explanation/design-system.md +52 -0
  221. package/docs/how-to/data-views-from-backend-response.md +7 -4
  222. package/docs/how-to/guides.md +24 -18
  223. package/docs/migration/changelog.md +38 -0
  224. package/docs/reference/cli.md +87 -0
  225. package/docs/reference/components.md +11 -12
  226. package/docs/reference/hooks.md +8 -8
  227. package/docs/reference/providers.md +22 -22
  228. package/docs/reference/tailwind-plugins.md +2 -2
  229. package/docs/reference/theme.md +85 -0
  230. package/docs/reference/types.md +4 -4
  231. package/docs/reference/utilities.md +19 -26
  232. package/docs/tutorials/building-first-form.md +20 -13
  233. package/docs/tutorials/component-composition.md +34 -50
  234. package/docs/tutorials/getting-started.md +2 -2
  235. package/docs/tutorials/theming-basics.md +13 -10
  236. package/package.json +31 -3
  237. package/dist/src/commands/block.d.ts +0 -5
  238. package/dist/src/commands/block.d.ts.map +0 -1
  239. package/dist/src/commands/block.js +0 -255
  240. package/dist/src/commands/block.js.map +0 -1
  241. package/dist/src/shared/configureFonts.d.ts +0 -6
  242. package/dist/src/shared/configureFonts.d.ts.map +0 -1
  243. package/dist/src/shared/configureFonts.js +0 -106
  244. package/dist/src/shared/configureFonts.js.map +0 -1
  245. package/dist/src/shared/configureGlobalCss.d.ts +0 -6
  246. package/dist/src/shared/configureGlobalCss.d.ts.map +0 -1
  247. package/dist/src/shared/configureGlobalCss.js +0 -154
  248. package/dist/src/shared/configureGlobalCss.js.map +0 -1
  249. package/dist/src/shared/configureTailwind.d.ts +0 -7
  250. package/dist/src/shared/configureTailwind.d.ts.map +0 -1
  251. package/dist/src/shared/configureTailwind.js +0 -163
  252. package/dist/src/shared/configureTailwind.js.map +0 -1
  253. package/dist/src/shared/detectFramework.d.ts +0 -23
  254. package/dist/src/shared/detectFramework.d.ts.map +0 -1
  255. package/dist/src/shared/detectFramework.js +0 -119
  256. package/dist/src/shared/detectFramework.js.map +0 -1
  257. package/dist/src/shared/installBaseUtils.d.ts +0 -5
  258. package/dist/src/shared/installBaseUtils.d.ts.map +0 -1
  259. package/dist/src/shared/installBaseUtils.js +0 -79
  260. package/dist/src/shared/installBaseUtils.js.map +0 -1
  261. package/dist/src/shared/resolveAliases.d.ts +0 -24
  262. package/dist/src/shared/resolveAliases.d.ts.map +0 -1
  263. package/dist/src/shared/resolveAliases.js +0 -98
  264. package/dist/src/shared/resolveAliases.js.map +0 -1
@@ -1,32 +1,32 @@
1
- "use client"
1
+ "use client";
2
2
 
3
- import { cn } from "../../../utils/cn"
4
- import type { FieldPreset, FilterValue } from "../types"
5
- import { isPresetActive, presetToFilterValue } from "../../../utils/dataViews/rangeUtils"
3
+ import { cn } from "../../../utils/cn";
4
+ import type { FieldPreset, FilterValue } from "../types";
5
+ import { isPresetActive, presetToFilterValue } from "../../../utils/dataViews/rangeUtils";
6
6
 
7
7
  type PresetChipsProps = {
8
- presets: FieldPreset[]
9
- current: FilterValue | undefined
10
- onSelect: (value: FilterValue) => void
11
- }
8
+ presets: FieldPreset[];
9
+ current: FilterValue | undefined;
10
+ onSelect: (value: FilterValue) => void;
11
+ };
12
12
 
13
13
  export function PresetChips({ presets, current, onSelect }: PresetChipsProps) {
14
- if (!presets || presets.length === 0) return null
14
+ if (!presets || presets.length === 0) return null;
15
15
 
16
16
  return (
17
17
  <div className="flex flex-wrap gap-1.5">
18
18
  {presets.map((p) => {
19
- const active = isPresetActive(p, current)
19
+ const active = isPresetActive(p, current);
20
20
  return (
21
21
  <button
22
22
  key={p.label}
23
23
  type="button"
24
24
  onClick={() => {
25
25
  if (active) {
26
- const v = presetToFilterValue(p)
27
- onSelect(v.kind === "number" ? { kind: "number" } : { kind: "date" })
26
+ const v = presetToFilterValue(p);
27
+ onSelect(v.kind === "number" ? { kind: "number" } : { kind: "date" });
28
28
  } else {
29
- onSelect(presetToFilterValue(p))
29
+ onSelect(presetToFilterValue(p));
30
30
  }
31
31
  }}
32
32
  className={cn(
@@ -38,8 +38,8 @@ export function PresetChips({ presets, current, onSelect }: PresetChipsProps) {
38
38
  >
39
39
  {p.label}
40
40
  </button>
41
- )
41
+ );
42
42
  })}
43
43
  </div>
44
- )
44
+ );
45
45
  }
@@ -1,58 +1,62 @@
1
- "use client"
1
+ "use client";
2
2
 
3
- import { useEffect, useMemo, useState } from "react"
4
- import * as Slider from "@radix-ui/react-slider"
5
- import { cn } from "../../../utils/cn"
6
- import type { FieldConfig, NumericRangeFilter } from "../types"
7
- import type { NumericExtremes } from "../../../utils/dataViews/rangeUtils"
3
+ import { useEffect, useMemo, useState } from "react";
4
+ import * as Slider from "@radix-ui/react-slider";
5
+ import { cn } from "../../../utils/cn";
6
+ import type { FieldConfig, NumericRangeFilter } from "../types";
7
+ import type { NumericExtremes } from "../../../utils/dataViews/rangeUtils";
8
8
 
9
9
  type Props = {
10
- field: FieldConfig
11
- extremes: NumericExtremes
12
- step: number
13
- value: NumericRangeFilter | undefined
14
- onChange: (next: NumericRangeFilter) => void
15
- }
10
+ field: FieldConfig;
11
+ extremes: NumericExtremes;
12
+ step: number;
13
+ value: NumericRangeFilter | undefined;
14
+ onChange: (next: NumericRangeFilter) => void;
15
+ };
16
16
 
17
17
  export function RangeSliderWithInputs({ field, extremes, step, value, onChange }: Props) {
18
- const min = field.rangeMin ?? extremes.min
19
- const max = field.rangeMax ?? extremes.max
18
+ const min = field.rangeMin ?? extremes.min;
19
+ const max = field.rangeMax ?? extremes.max;
20
20
 
21
- const lo = value?.min ?? min
22
- const hi = value?.max ?? max
21
+ const lo = value?.min ?? min;
22
+ const hi = value?.max ?? max;
23
23
 
24
- const [loInput, setLoInput] = useState(formatForInput(lo, field))
25
- const [hiInput, setHiInput] = useState(formatForInput(hi, field))
24
+ const [loInput, setLoInput] = useState(formatForInput(lo, field));
25
+ const [hiInput, setHiInput] = useState(formatForInput(hi, field));
26
26
 
27
- useEffect(() => { setLoInput(formatForInput(lo, field)) }, [lo, field])
28
- useEffect(() => { setHiInput(formatForInput(hi, field)) }, [hi, field])
27
+ useEffect(() => {
28
+ setLoInput(formatForInput(lo, field));
29
+ }, [lo, field]);
30
+ useEffect(() => {
31
+ setHiInput(formatForInput(hi, field));
32
+ }, [hi, field]);
29
33
 
30
34
  const commit = (rawLo: number, rawHi: number) => {
31
- let nlo = clamp(rawLo, min, max)
32
- let nhi = clamp(rawHi, min, max)
33
- if (nlo > nhi) [nlo, nhi] = [nhi, nlo]
34
- const atFloor = nlo === min
35
- const atCeil = nhi === max
35
+ let nlo = clamp(rawLo, min, max);
36
+ let nhi = clamp(rawHi, min, max);
37
+ if (nlo > nhi) [nlo, nhi] = [nhi, nlo];
38
+ const atFloor = nlo === min;
39
+ const atCeil = nhi === max;
36
40
  onChange({
37
41
  kind: "number",
38
42
  min: atFloor ? undefined : nlo,
39
- max: atCeil ? undefined : nhi,
40
- })
41
- }
43
+ max: atCeil ? undefined : nhi,
44
+ });
45
+ };
42
46
 
43
47
  const handleSliderChange = (vals: number[]) => {
44
- if (vals.length !== 2) return
45
- commit(vals[0], vals[1])
46
- }
48
+ if (vals.length !== 2) return;
49
+ commit(vals[0], vals[1]);
50
+ };
47
51
 
48
52
  const commitFromInputs = () => {
49
- const nlo = parseFloat(loInput)
50
- const nhi = parseFloat(hiInput)
51
- commit(Number.isFinite(nlo) ? nlo : lo, Number.isFinite(nhi) ? nhi : hi)
52
- }
53
+ const nlo = parseFloat(loInput);
54
+ const nhi = parseFloat(hiInput);
55
+ commit(Number.isFinite(nlo) ? nlo : lo, Number.isFinite(nhi) ? nhi : hi);
56
+ };
53
57
 
54
- const prefix = useMemo(() => prefixFor(field), [field])
55
- const suffix = useMemo(() => suffixFor(field), [field])
58
+ const prefix = useMemo(() => prefixFor(field), [field]);
59
+ const suffix = useMemo(() => suffixFor(field), [field]);
56
60
 
57
61
  return (
58
62
  <div className="space-y-3">
@@ -98,18 +102,23 @@ export function RangeSliderWithInputs({ field, extremes, step, value, onChange }
98
102
  />
99
103
  </div>
100
104
  </div>
101
- )
105
+ );
102
106
  }
103
107
 
104
108
  function NumberCell({
105
- label, value, onChange, onCommit, prefix, suffix,
109
+ label,
110
+ value,
111
+ onChange,
112
+ onCommit,
113
+ prefix,
114
+ suffix,
106
115
  }: {
107
- label: string
108
- value: string
109
- onChange: (v: string) => void
110
- onCommit: () => void
111
- prefix?: string
112
- suffix?: string
116
+ label: string;
117
+ value: string;
118
+ onChange: (v: string) => void;
119
+ onCommit: () => void;
120
+ prefix?: string;
121
+ suffix?: string;
113
122
  }) {
114
123
  return (
115
124
  <label className="flex-1 flex items-center gap-1 text-xs bg-background-presentation-body-primary border border-border-presentation-global-primary rounded-md px-2 py-1.5 focus-within:border-content-presentation-action-primary">
@@ -120,35 +129,37 @@ function NumberCell({
120
129
  value={value}
121
130
  onChange={(e) => onChange(e.target.value)}
122
131
  onBlur={onCommit}
123
- onKeyDown={(e) => { if (e.key === "Enter") (e.currentTarget as HTMLInputElement).blur() }}
132
+ onKeyDown={(e) => {
133
+ if (e.key === "Enter") (e.currentTarget as HTMLInputElement).blur();
134
+ }}
124
135
  className={cn(
125
136
  "w-full bg-transparent outline-none tabular-nums text-content-presentation-global-primary",
126
137
  )}
127
138
  />
128
139
  {suffix && <span className="text-content-presentation-global-tertiary">{suffix}</span>}
129
140
  </label>
130
- )
141
+ );
131
142
  }
132
143
 
133
144
  function clamp(n: number, min: number, max: number): number {
134
- return Math.min(max, Math.max(min, n))
145
+ return Math.min(max, Math.max(min, n));
135
146
  }
136
147
 
137
148
  function formatForInput(n: number, field: FieldConfig): string {
138
- if (!Number.isFinite(n)) return ""
139
- if (field.type === "star-rating") return n.toFixed(1)
140
- if (Number.isInteger(n)) return String(n)
141
- return String(n)
149
+ if (!Number.isFinite(n)) return "";
150
+ if (field.type === "star-rating") return n.toFixed(1);
151
+ if (Number.isInteger(n)) return String(n);
152
+ return String(n);
142
153
  }
143
154
 
144
155
  function prefixFor(field: FieldConfig): string | undefined {
145
- if (field.type !== "currency") return undefined
146
- if (typeof field.currency === "string") return "$"
147
- return field.currency?.symbol ?? "$"
156
+ if (field.type !== "currency") return undefined;
157
+ if (typeof field.currency === "string") return "$";
158
+ return field.currency?.symbol ?? "$";
148
159
  }
149
160
 
150
161
  function suffixFor(field: FieldConfig): string | undefined {
151
- if (field.type === "progress-bar") return "%"
152
- if (field.type === "star-rating") return "★"
153
- return undefined
162
+ if (field.type === "progress-bar") return "%";
163
+ if (field.type === "star-rating") return "★";
164
+ return undefined;
154
165
  }
@@ -1,36 +1,36 @@
1
- export { DataViewsLayout } from "./DataViewsLayout"
2
- export type { DataViewsLayoutProps } from "./DataViewsLayout"
1
+ export { DataViewsLayout } from "./DataViewsLayout";
2
+ export type { DataViewsLayoutProps } from "./DataViewsLayout";
3
3
 
4
- export { TableView } from "./TableView"
5
- export type { TableViewProps } from "./TableView"
4
+ export { TableView } from "./TableView";
5
+ export type { TableViewProps } from "./TableView";
6
6
 
7
- export { KanbanView } from "./KanbanView"
8
- export type { KanbanViewProps } from "./KanbanView"
7
+ export { KanbanView } from "./KanbanView";
8
+ export type { KanbanViewProps } from "./KanbanView";
9
9
 
10
- export { InboxView } from "./InboxView"
11
- export type { InboxViewProps } from "./InboxView"
10
+ export { InboxView } from "./InboxView";
11
+ export type { InboxViewProps } from "./InboxView";
12
12
 
13
- export { InboxViewCard } from "./InboxViewCard"
14
- export type { InboxViewCardProps } from "./InboxViewCard"
13
+ export { InboxViewCard } from "./InboxViewCard";
14
+ export type { InboxViewCardProps } from "./InboxViewCard";
15
15
 
16
- export { TreeView } from "./TreeView"
17
- export type { TreeViewProps } from "./TreeView"
16
+ export { TreeView } from "./TreeView";
17
+ export type { TreeViewProps } from "./TreeView";
18
18
 
19
- export { DataViewRadio } from "./DataViewRadio"
20
- export type { DataViewRadioProps } from "./DataViewRadio"
19
+ export { DataViewRadio } from "./DataViewRadio";
20
+ export type { DataViewRadioProps } from "./DataViewRadio";
21
21
 
22
- export { FilterPanel } from "./FilterPanel"
23
- export { SettingsPanel } from "./SettingsPanel"
24
- export { DataViewsHeader } from "./DataViewsHeader"
25
- export type { DataViewsHeaderView } from "./DataViewsHeader"
26
- export { DataViewsConfigPanel } from "./DataViewsConfigPanel"
27
- export type { DataViewsConfigPanelProps } from "./DataViewsConfigPanel"
22
+ export { FilterPanel } from "./FilterPanel";
23
+ export { SettingsPanel } from "./SettingsPanel";
24
+ export { DataViewsHeader } from "./DataViewsHeader";
25
+ export type { DataViewsHeaderView } from "./DataViewsHeader";
26
+ export { DataViewsConfigPanel } from "./DataViewsConfigPanel";
27
+ export type { DataViewsConfigPanelProps } from "./DataViewsConfigPanel";
28
28
 
29
- export { renderField } from "./fieldRenderers"
30
- export { resolveBadgeVariant } from "./badgeAdapter"
31
- export type { ResolvedBadgeProps } from "./badgeAdapter"
29
+ export { renderField } from "./fieldRenderers";
30
+ export { resolveBadgeVariant } from "./badgeAdapter";
31
+ export type { ResolvedBadgeProps } from "./badgeAdapter";
32
32
 
33
- export * from "./types"
33
+ export * from "./types";
34
34
 
35
- export { useDataViewsState } from "../../hooks/useDataViewsState"
36
- export type { UseDataViewsStateOptions } from "../../hooks/useDataViewsState"
35
+ export { useDataViewsState } from "../../hooks/useDataViewsState";
36
+ export type { UseDataViewsStateOptions } from "../../hooks/useDataViewsState";
@@ -1,23 +1,21 @@
1
- "use client"
1
+ "use client";
2
2
 
3
- import { Drawer } from "vaul"
4
- import { Menu, X } from "lucide-react"
5
- import type { ReactNode } from "react"
3
+ import { Drawer } from "vaul";
4
+ import { Menu, X } from "lucide-react";
5
+ import type { ReactNode } from "react";
6
6
 
7
7
  type Props = {
8
- open: boolean
9
- onOpenChange: (open: boolean) => void
10
- children: ReactNode
11
- }
8
+ open: boolean;
9
+ onOpenChange: (open: boolean) => void;
10
+ children: ReactNode;
11
+ };
12
12
 
13
13
  export function TreeDrawer({ open, onOpenChange, children }: Props) {
14
14
  return (
15
15
  <Drawer.Root open={open} onOpenChange={onOpenChange} direction="left">
16
16
  <Drawer.Portal>
17
17
  <Drawer.Overlay className="fixed inset-0 bg-black/40 z-40" />
18
- <Drawer.Content
19
- className="fixed inset-y-0 left-0 z-50 w-72 bg-background-presentation-body-overlay-primary border-r border-border-presentation-global-primary outline-none flex flex-col"
20
- >
18
+ <Drawer.Content className="fixed inset-y-0 left-0 z-50 w-72 bg-background-presentation-body-overlay-primary border-r border-border-presentation-global-primary outline-none flex flex-col">
21
19
  <div className="flex items-center justify-between p-3 border-b border-border-presentation-global-primary">
22
20
  <Drawer.Title className="text-sm font-semibold text-content-presentation-global-primary">
23
21
  Tree
@@ -31,13 +29,11 @@ export function TreeDrawer({ open, onOpenChange, children }: Props) {
31
29
  <X className="w-4 h-4" />
32
30
  </button>
33
31
  </div>
34
- <div className="flex-1 overflow-y-auto p-2">
35
- {children}
36
- </div>
32
+ <div className="flex-1 overflow-y-auto p-2">{children}</div>
37
33
  </Drawer.Content>
38
34
  </Drawer.Portal>
39
35
  </Drawer.Root>
40
- )
36
+ );
41
37
  }
42
38
 
43
39
  export function TreeDrawerTrigger({ onClick }: { onClick: () => void }) {
@@ -50,5 +46,5 @@ export function TreeDrawerTrigger({ onClick }: { onClick: () => void }) {
50
46
  >
51
47
  <Menu className="w-4 h-4" />
52
48
  </button>
53
- )
49
+ );
54
50
  }
@@ -1,39 +1,36 @@
1
- "use client"
1
+ "use client";
2
2
 
3
- import { useMemo } from "react"
4
- import type { FieldConfig } from "../types"
5
- import type { TreeNode } from "../../../utils/dataViews/treeUtils"
6
- import { getByPath } from "../../../utils/dataViews/pathUtils"
7
- import { TreeFolder } from "../../TreeFolder"
8
- import type {
9
- TreeFolderMoveArgs,
10
- TreeFolderNode,
11
- } from "../../TreeFolder"
3
+ import { useMemo } from "react";
4
+ import type { FieldConfig } from "../types";
5
+ import type { TreeNode } from "../../../utils/dataViews/treeUtils";
6
+ import { getByPath } from "../../../utils/dataViews/pathUtils";
7
+ import { TreeFolder } from "../../TreeFolder";
8
+ import type { TreeFolderMoveArgs, TreeFolderNode } from "../../TreeFolder";
12
9
 
13
10
  type Props = {
14
- roots: TreeNode[]
15
- expanded: Set<string>
16
- selectedId: string | null
17
- labelField: FieldConfig
18
- dndEnabled: boolean
19
- onToggle: (id: string) => void
20
- onSelect: (id: string) => void
21
- onMove?: (args: TreeFolderMoveArgs) => void
22
- }
11
+ roots: TreeNode[];
12
+ expanded: Set<string>;
13
+ selectedId: string | null;
14
+ labelField: FieldConfig;
15
+ dndEnabled: boolean;
16
+ onToggle: (id: string) => void;
17
+ onSelect: (id: string) => void;
18
+ onMove?: (args: TreeFolderMoveArgs) => void;
19
+ };
23
20
 
24
21
  function toFolderNode(node: TreeNode, labelField: FieldConfig): TreeFolderNode {
25
- const labelValue = getByPath(node.record, labelField.path)
26
- const name = labelValue == null ? node.id : String(labelValue)
22
+ const labelValue = getByPath(node.record, labelField.path);
23
+ const name = labelValue == null ? node.id : String(labelValue);
27
24
  const children = node.children.length
28
25
  ? node.children.map((c) => toFolderNode(c, labelField))
29
- : undefined
26
+ : undefined;
30
27
  return {
31
28
  id: node.id,
32
29
  name,
33
30
  type: children ? "folder" : "file",
34
31
  data: node.record,
35
32
  children,
36
- }
33
+ };
37
34
  }
38
35
 
39
36
  export function TreeSidebar({
@@ -49,23 +46,23 @@ export function TreeSidebar({
49
46
  const folderData = useMemo(
50
47
  () => roots.map((r) => toFolderNode(r, labelField)),
51
48
  [roots, labelField],
52
- )
49
+ );
53
50
 
54
- const expandedIds = useMemo(() => Array.from(expanded), [expanded])
51
+ const expandedIds = useMemo(() => Array.from(expanded), [expanded]);
55
52
 
56
53
  return (
57
54
  <TreeFolder
58
55
  data={folderData}
59
56
  selectedId={selectedId}
60
57
  onSelectionChange={(id) => {
61
- if (id) onSelect(id)
58
+ if (id) onSelect(id);
62
59
  }}
63
60
  expandedIds={expandedIds}
64
61
  onExpandedChange={(next) => {
65
- const before = new Set(expandedIds)
66
- const after = new Set(next)
67
- for (const id of after) if (!before.has(id)) onToggle(id)
68
- for (const id of before) if (!after.has(id)) onToggle(id)
62
+ const before = new Set(expandedIds);
63
+ const after = new Set(next);
64
+ for (const id of after) if (!before.has(id)) onToggle(id);
65
+ for (const id of before) if (!after.has(id)) onToggle(id);
69
66
  }}
70
67
  dndEnabled={dndEnabled}
71
68
  onMove={onMove}
@@ -73,5 +70,5 @@ export function TreeSidebar({
73
70
  showBreadcrumb={true}
74
71
  highlightAncestors={true}
75
72
  />
76
- )
73
+ );
77
74
  }