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
@@ -6,8 +6,8 @@ import type {
6
6
  NumericRangeFilter,
7
7
  DateRangeFilter,
8
8
  RangeFilter,
9
- } from "../../components/DataViews/types"
10
- import { getByPath } from "./pathUtils"
9
+ } from "../../components/DataViews/types";
10
+ import { getByPath } from "./pathUtils";
11
11
 
12
12
  export function isRangeFilter(v: unknown): v is RangeFilter {
13
13
  return (
@@ -15,144 +15,151 @@ export function isRangeFilter(v: unknown): v is RangeFilter {
15
15
  typeof v === "object" &&
16
16
  !Array.isArray(v) &&
17
17
  ((v as RangeFilter).kind === "number" || (v as RangeFilter).kind === "date")
18
- )
18
+ );
19
19
  }
20
20
 
21
21
  export function isNumericRange(v: FilterValue | undefined | null): v is NumericRangeFilter {
22
- return !!v && !Array.isArray(v) && (v as RangeFilter).kind === "number"
22
+ return !!v && !Array.isArray(v) && (v as RangeFilter).kind === "number";
23
23
  }
24
24
 
25
25
  export function isDateRange(v: FilterValue | undefined | null): v is DateRangeFilter {
26
- return !!v && !Array.isArray(v) && (v as RangeFilter).kind === "date"
26
+ return !!v && !Array.isArray(v) && (v as RangeFilter).kind === "date";
27
27
  }
28
28
 
29
29
  export function isFilterActive(v: FilterValue | undefined): boolean {
30
- if (v == null) return false
31
- if (Array.isArray(v)) return v.length > 0
32
- if (isNumericRange(v)) return v.min != null || v.max != null
33
- if (isDateRange(v)) return v.from != null || v.to != null
34
- return false
30
+ if (v == null) return false;
31
+ if (Array.isArray(v)) return v.length > 0;
32
+ if (isNumericRange(v)) return v.min != null || v.max != null;
33
+ if (isDateRange(v)) return v.from != null || v.to != null;
34
+ return false;
35
35
  }
36
36
 
37
37
  export function countActiveFilters(state: Record<string, FilterValue>): number {
38
- let n = 0
38
+ let n = 0;
39
39
  for (const v of Object.values(state)) {
40
- if (isFilterActive(v)) n++
40
+ if (isFilterActive(v)) n++;
41
41
  }
42
- return n
42
+ return n;
43
43
  }
44
44
 
45
45
  export function describeFilterValue(v: FilterValue): string {
46
- if (Array.isArray(v)) return v.join(", ")
46
+ if (Array.isArray(v)) return v.join(", ");
47
47
  if (isNumericRange(v)) {
48
- if (v.min != null && v.max != null) return `${v.min} – ${v.max}`
49
- if (v.min != null) return `≥ ${v.min}`
50
- if (v.max != null) return `≤ ${v.max}`
51
- return "any"
48
+ if (v.min != null && v.max != null) return `${v.min} – ${v.max}`;
49
+ if (v.min != null) return `≥ ${v.min}`;
50
+ if (v.max != null) return `≤ ${v.max}`;
51
+ return "any";
52
52
  }
53
53
  if (isDateRange(v)) {
54
- if (v.from && v.to) return `${v.from} → ${v.to}`
55
- if (v.from) return `from ${v.from}`
56
- if (v.to) return `until ${v.to}`
57
- return "any"
54
+ if (v.from && v.to) return `${v.from} → ${v.to}`;
55
+ if (v.from) return `from ${v.from}`;
56
+ if (v.to) return `until ${v.to}`;
57
+ return "any";
58
58
  }
59
- return ""
59
+ return "";
60
60
  }
61
61
 
62
- export type NumericExtremes = { min: number; max: number }
62
+ export type NumericExtremes = { min: number; max: number };
63
63
 
64
64
  export function computeNumericExtremes(
65
65
  data: DynamicRecord[],
66
66
  path: string,
67
67
  ): NumericExtremes | null {
68
- let min = Number.POSITIVE_INFINITY
69
- let max = Number.NEGATIVE_INFINITY
70
- let found = false
68
+ let min = Number.POSITIVE_INFINITY;
69
+ let max = Number.NEGATIVE_INFINITY;
70
+ let found = false;
71
71
  for (const item of data) {
72
- const v = getByPath(item, path)
73
- const n = typeof v === "number" ? v : Number(v)
74
- if (!Number.isFinite(n)) continue
75
- if (n < min) min = n
76
- if (n > max) max = n
77
- found = true
72
+ const v = getByPath(item, path);
73
+ const n = typeof v === "number" ? v : Number(v);
74
+ if (!Number.isFinite(n)) continue;
75
+ if (n < min) min = n;
76
+ if (n > max) max = n;
77
+ found = true;
78
78
  }
79
- return found ? { min, max } : null
79
+ return found ? { min, max } : null;
80
80
  }
81
81
 
82
82
  export function inferStep(field: FieldConfig, extremes: NumericExtremes): number {
83
- if (field.rangeStep != null) return field.rangeStep
83
+ if (field.rangeStep != null) return field.rangeStep;
84
84
  switch (field.type) {
85
- case "star-rating": return 0.1
86
- case "progress-bar": return 1
85
+ case "star-rating":
86
+ return 0.1;
87
+ case "progress-bar":
88
+ return 1;
87
89
  case "currency": {
88
- const span = extremes.max - extremes.min
89
- if (span >= 10000) return 100
90
- if (span >= 1000) return 10
91
- return 1
90
+ const span = extremes.max - extremes.min;
91
+ if (span >= 10000) return 100;
92
+ if (span >= 1000) return 10;
93
+ return 1;
92
94
  }
93
95
  default: {
94
- const span = extremes.max - extremes.min
95
- if (span >= 10000) return 10
96
- if (span >= 100) return 1
97
- return 0.1
96
+ const span = extremes.max - extremes.min;
97
+ if (span >= 10000) return 10;
98
+ if (span >= 100) return 1;
99
+ return 0.1;
98
100
  }
99
101
  }
100
102
  }
101
103
 
102
- export type DateExtremes = { from: string; to: string }
104
+ export type DateExtremes = { from: string; to: string };
103
105
 
104
- export function computeDateExtremes(
105
- data: DynamicRecord[],
106
- path: string,
107
- ): DateExtremes | null {
108
- let minMs = Number.POSITIVE_INFINITY
109
- let maxMs = Number.NEGATIVE_INFINITY
110
- let found = false
106
+ export function computeDateExtremes(data: DynamicRecord[], path: string): DateExtremes | null {
107
+ let minMs = Number.POSITIVE_INFINITY;
108
+ let maxMs = Number.NEGATIVE_INFINITY;
109
+ let found = false;
111
110
  for (const item of data) {
112
- const v = getByPath(item, path)
113
- if (v == null) continue
114
- const ms = v instanceof Date ? v.getTime() : Date.parse(String(v))
115
- if (!Number.isFinite(ms)) continue
116
- if (ms < minMs) minMs = ms
117
- if (ms > maxMs) maxMs = ms
118
- found = true
111
+ const v = getByPath(item, path);
112
+ if (v == null) continue;
113
+ const ms = v instanceof Date ? v.getTime() : Date.parse(String(v));
114
+ if (!Number.isFinite(ms)) continue;
115
+ if (ms < minMs) minMs = ms;
116
+ if (ms > maxMs) maxMs = ms;
117
+ found = true;
119
118
  }
120
- if (!found) return null
121
- return { from: toIsoDate(new Date(minMs)), to: toIsoDate(new Date(maxMs)) }
119
+ if (!found) return null;
120
+ return { from: toIsoDate(new Date(minMs)), to: toIsoDate(new Date(maxMs)) };
122
121
  }
123
122
 
124
- const RELATIVE = /^(-?\d+)([dwmy])$/
123
+ const RELATIVE = /^(-?\d+)([dwmy])$/;
125
124
 
126
125
  export function resolveRelativeDate(token: string | undefined): string | undefined {
127
- if (!token) return undefined
128
- if (token === "today" || token === "now") return toIsoDate(new Date())
126
+ if (!token) return undefined;
127
+ if (token === "today" || token === "now") return toIsoDate(new Date());
129
128
  if (token === "start-of-year") {
130
- const now = new Date()
131
- return toIsoDate(new Date(now.getFullYear(), 0, 1))
129
+ const now = new Date();
130
+ return toIsoDate(new Date(now.getFullYear(), 0, 1));
132
131
  }
133
- const m = RELATIVE.exec(token)
132
+ const m = RELATIVE.exec(token);
134
133
  if (m) {
135
- const n = parseInt(m[1], 10)
136
- const unit = m[2]
137
- const d = new Date()
134
+ const n = parseInt(m[1], 10);
135
+ const unit = m[2];
136
+ const d = new Date();
138
137
  switch (unit) {
139
- case "d": d.setDate(d.getDate() + n); break
140
- case "w": d.setDate(d.getDate() + n * 7); break
141
- case "m": d.setMonth(d.getMonth() + n); break
142
- case "y": d.setFullYear(d.getFullYear() + n); break
138
+ case "d":
139
+ d.setDate(d.getDate() + n);
140
+ break;
141
+ case "w":
142
+ d.setDate(d.getDate() + n * 7);
143
+ break;
144
+ case "m":
145
+ d.setMonth(d.getMonth() + n);
146
+ break;
147
+ case "y":
148
+ d.setFullYear(d.getFullYear() + n);
149
+ break;
143
150
  }
144
- return toIsoDate(d)
151
+ return toIsoDate(d);
145
152
  }
146
- const ms = Date.parse(token)
147
- if (Number.isFinite(ms)) return toIsoDate(new Date(ms))
148
- return token
153
+ const ms = Date.parse(token);
154
+ if (Number.isFinite(ms)) return toIsoDate(new Date(ms));
155
+ return token;
149
156
  }
150
157
 
151
158
  export function toIsoDate(d: Date): string {
152
- const yyyy = d.getFullYear()
153
- const mm = String(d.getMonth() + 1).padStart(2, "0")
154
- const dd = String(d.getDate()).padStart(2, "0")
155
- return `${yyyy}-${mm}-${dd}`
159
+ const yyyy = d.getFullYear();
160
+ const mm = String(d.getMonth() + 1).padStart(2, "0");
161
+ const dd = String(d.getDate()).padStart(2, "0");
162
+ return `${yyyy}-${mm}-${dd}`;
156
163
  }
157
164
 
158
165
  export function presetToFilterValue(preset: FieldPreset): RangeFilter {
@@ -161,44 +168,46 @@ export function presetToFilterValue(preset: FieldPreset): RangeFilter {
161
168
  kind: "date",
162
169
  from: resolveRelativeDate(preset.from),
163
170
  to: resolveRelativeDate(preset.to),
164
- }
171
+ };
165
172
  }
166
173
  return {
167
174
  kind: "number",
168
175
  min: (preset as { min?: number }).min,
169
176
  max: (preset as { max?: number }).max,
170
- }
177
+ };
171
178
  }
172
179
 
173
180
  export function isPresetActive(preset: FieldPreset, current: FilterValue | undefined): boolean {
174
- if (!current) return false
175
- if (Array.isArray(current)) return false
181
+ if (!current) return false;
182
+ if (Array.isArray(current)) return false;
176
183
  if (current.kind === "number" && !("from" in preset) && !("to" in preset)) {
177
184
  return (
178
185
  ((preset as { min?: number }).min ?? null) === (current.min ?? null) &&
179
186
  ((preset as { max?: number }).max ?? null) === (current.max ?? null)
180
- )
187
+ );
181
188
  }
182
- if (current.kind === "date" && (("from" in preset) || ("to" in preset))) {
183
- const want = presetToFilterValue(preset) as DateRangeFilter
184
- return (want.from ?? null) === (current.from ?? null) && (want.to ?? null) === (current.to ?? null)
189
+ if (current.kind === "date" && ("from" in preset || "to" in preset)) {
190
+ const want = presetToFilterValue(preset) as DateRangeFilter;
191
+ return (
192
+ (want.from ?? null) === (current.from ?? null) && (want.to ?? null) === (current.to ?? null)
193
+ );
185
194
  }
186
- return false
195
+ return false;
187
196
  }
188
197
 
189
198
  const DEFAULT_PRESETS: Record<string, FieldPreset[]> = {
190
199
  currency: [
191
- { label: "<$100", max: 100 },
192
- { label: "$100–$500", min: 100, max: 500 },
193
- { label: "$500–$2k", min: 500, max: 2000 },
194
- { label: "$2k+", min: 2000 },
200
+ { label: "<$100", max: 100 },
201
+ { label: "$100–$500", min: 100, max: 500 },
202
+ { label: "$500–$2k", min: 500, max: 2000 },
203
+ { label: "$2k+", min: 2000 },
195
204
  ],
196
205
  "progress-bar": [
197
- { label: "0%", min: 0, max: 0 },
198
- { label: "1–40%", min: 1, max: 40 },
199
- { label: "40–70%", min: 40, max: 70 },
200
- { label: "70–99%", min: 70, max: 99 },
201
- { label: "100%", min: 100, max: 100 },
206
+ { label: "0%", min: 0, max: 0 },
207
+ { label: "1–40%", min: 1, max: 40 },
208
+ { label: "40–70%", min: 40, max: 70 },
209
+ { label: "70–99%", min: 70, max: 99 },
210
+ { label: "100%", min: 100, max: 100 },
202
211
  ],
203
212
  "star-rating": [
204
213
  { label: "≥4★", min: 4 },
@@ -206,20 +215,20 @@ const DEFAULT_PRESETS: Record<string, FieldPreset[]> = {
206
215
  { label: "<3★", max: 3 },
207
216
  ],
208
217
  date: [
209
- { label: "Today", from: "today" },
210
- { label: "Last 7 days", from: "-7d" },
211
- { label: "Last 30 days", from: "-30d" },
212
- { label: "This year", from: "start-of-year" },
218
+ { label: "Today", from: "today" },
219
+ { label: "Last 7 days", from: "-7d" },
220
+ { label: "Last 30 days", from: "-30d" },
221
+ { label: "This year", from: "start-of-year" },
213
222
  ],
214
223
  "date-format": [
215
- { label: "Today", from: "today" },
216
- { label: "Last 7 days", from: "-7d" },
217
- { label: "Last 30 days", from: "-30d" },
218
- { label: "This year", from: "start-of-year" },
224
+ { label: "Today", from: "today" },
225
+ { label: "Last 7 days", from: "-7d" },
226
+ { label: "Last 30 days", from: "-30d" },
227
+ { label: "This year", from: "start-of-year" },
219
228
  ],
220
- }
229
+ };
221
230
 
222
231
  export function resolvePresets(field: FieldConfig): FieldPreset[] {
223
- if (field.presets) return field.presets
224
- return DEFAULT_PRESETS[field.type ?? ""] ?? []
232
+ if (field.presets) return field.presets;
233
+ return DEFAULT_PRESETS[field.type ?? ""] ?? [];
225
234
  }