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,13 +1,12 @@
1
1
  import React, {
2
- useState,
3
- forwardRef,
4
- ForwardedRef,
5
- HTMLAttributes,
6
- useEffect,
7
- cloneElement,
8
- isValidElement,
9
- useRef,
10
- Ref,
2
+ useState,
3
+ forwardRef,
4
+ ForwardedRef,
5
+ HTMLAttributes,
6
+ useEffect,
7
+ cloneElement,
8
+ isValidElement,
9
+ useRef,
11
10
  } from "react";
12
11
  import { Popover, PopoverContent, PopoverTrigger } from "./Popover";
13
12
  import { Calendar } from "./Calendar";
@@ -16,213 +15,218 @@ import { DateRange } from "react-day-picker";
16
15
  import Picker from "torch-react-mobile-picker";
17
16
 
18
17
  import {
19
- applyTimeToDateValue,
20
- formatDateValueToString,
21
- TimePickerValue,
18
+ applyTimeToDateValue,
19
+ formatDateValueToString,
20
+ TimePickerValue,
22
21
  } from "../utils/dateFormat";
23
22
  import { InputField } from "./InputField";
24
23
 
25
24
  export type CalendarProps = React.ComponentProps<typeof Calendar>;
26
25
 
27
26
  interface DatePickerProps extends HTMLAttributes<HTMLInputElement> {
28
- mode?: "single" | "multiple" | "range";
29
- selected?: Date | Date[] | DateRange | undefined;
30
- min?: number;
31
- max?: number;
32
- size?: "M" | "S";
33
- showWeekNumber?: boolean;
34
- captionLayout?: "dropdown" | "label" | "dropdown-months" | "dropdown-years";
35
- dateFormat?: string;
36
- calendarProps?: CalendarProps;
37
- timePicker?: boolean;
38
- value?: any;
27
+ mode?: "single" | "multiple" | "range";
28
+ selected?: Date | Date[] | DateRange | undefined;
29
+ min?: number;
30
+ max?: number;
31
+ size?: "M" | "S";
32
+ showWeekNumber?: boolean;
33
+ captionLayout?: "dropdown" | "label" | "dropdown-months" | "dropdown-years";
34
+ dateFormat?: string;
35
+ calendarProps?: CalendarProps;
36
+ timePicker?: boolean;
37
+ value?: Date | Date[] | DateRange;
38
+ /** Transparent border/background so the picker blends into a table cell. */
39
+ onTable?: boolean;
39
40
  }
40
41
 
41
42
  export const DatePicker = forwardRef(
42
- (
43
- {
44
- size = "M",
45
- min,
46
- max,
47
- mode = "single",
48
- onChange,
49
- showWeekNumber = false,
50
- captionLayout = "dropdown",
51
- dateFormat = "yyyy/MM/dd",
52
- calendarProps,
53
- timePicker = false,
54
- children,
55
- value = new Date(),
56
- ...props
57
- }: DatePickerProps,
58
- ref: ForwardedRef<HTMLInputElement>
59
- ) => {
60
- const initialDate =
61
- mode == "multiple"
62
- ? Array.isArray(value)
63
- ? value
64
- : [value]
65
- : mode == "range"
66
- // Accept a DateRange ({ from, to }) directly, or wrap a single
67
- // Date into a one-day range.
68
- ? value && typeof value === "object" && !(value instanceof Date) &&
69
- ("from" in value || "to" in value)
70
- ? (value as DateRange)
71
- : { from: value, to: value }
72
- : value;
73
- const [date, setDate] = useState<Date[] | Date | DateRange | undefined>(initialDate);
74
- const [pickerValue, setPickerValue] = useState<TimePickerValue>({
75
- hour: (date instanceof Date ? date.getHours() : 12).toString(),
76
- minute: (date instanceof Date ? date.getMinutes() : 0)
77
- .toString()
78
- .padStart(2, "0"),
79
- time: date instanceof Date && date.getHours() < 12 ? "AM" : "PM",
80
- });
81
- const [isOpen, setIsOpen] = useState(false);
82
- const triggerRef = useRef<HTMLButtonElement>(null);
43
+ (
44
+ {
45
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- destructured to exclude from {...props} spread
46
+ size = "M",
47
+ min,
48
+ max,
49
+ mode = "single",
50
+ onChange,
51
+ showWeekNumber = false,
52
+ captionLayout = "dropdown",
53
+ dateFormat = "yyyy/MM/dd",
54
+ calendarProps,
55
+ timePicker = false,
56
+ children,
57
+ value = new Date(),
58
+ ...props
59
+ }: DatePickerProps,
60
+ ref: ForwardedRef<HTMLInputElement>,
61
+ ) => {
62
+ const initialDate =
63
+ mode == "multiple"
64
+ ? Array.isArray(value)
65
+ ? value
66
+ : [value]
67
+ : mode == "range"
68
+ ? // Accept a DateRange ({ from, to }) directly, or wrap a single
69
+ // Date into a one-day range.
70
+ value &&
71
+ typeof value === "object" &&
72
+ !(value instanceof Date) &&
73
+ ("from" in value || "to" in value)
74
+ ? (value as DateRange)
75
+ : { from: value, to: value }
76
+ : value;
77
+ const [date, setDate] = useState<Date[] | Date | DateRange | undefined>(
78
+ initialDate as Date[] | Date | DateRange | undefined,
79
+ );
80
+ const [pickerValue, setPickerValue] = useState<TimePickerValue>({
81
+ hour: (date instanceof Date ? date.getHours() : 12).toString(),
82
+ minute: (date instanceof Date ? date.getMinutes() : 0).toString().padStart(2, "0"),
83
+ time: date instanceof Date && date.getHours() < 12 ? "AM" : "PM",
84
+ });
85
+ const [isOpen, setIsOpen] = useState(false);
86
+ const triggerRef = useRef<HTMLButtonElement>(null);
83
87
 
84
- // Call the onChange function when the date or picker value changes
85
- useEffect(() => {
86
- onChange?.({
87
- target: {
88
- value: date,
89
- },
90
- } as any);
91
- }, [date, pickerValue]);
88
+ // Call the onChange function when the date or picker value changes
89
+ useEffect(() => {
90
+ onChange?.({
91
+ target: {
92
+ value: date,
93
+ },
94
+ } as unknown as React.ChangeEvent<HTMLInputElement>);
95
+ }, [date, pickerValue]);
92
96
 
93
- // Disable body scroll when popover is open
94
- useEffect(() => {
95
- if (isOpen) {
96
- // Save the current overflow style
97
- const originalOverflow = document.body.style.overflow;
98
- document.body.style.overflow = "hidden";
97
+ // Disable body scroll when popover is open
98
+ useEffect(() => {
99
+ if (isOpen) {
100
+ // Save the current overflow style
101
+ const originalOverflow = document.body.style.overflow;
102
+ document.body.style.overflow = "hidden";
99
103
 
100
- // Cleanup function to restore original overflow style
101
- return () => {
102
- document.body.style.overflow = originalOverflow;
103
- };
104
- }
105
- }, [isOpen]);
106
- const formattedValue = formatDateValueToString(
107
- date,
108
- pickerValue,
109
- dateFormat
110
- );
104
+ // Cleanup function to restore original overflow style
105
+ return () => {
106
+ document.body.style.overflow = originalOverflow;
107
+ };
108
+ }
109
+ }, [isOpen]);
110
+ const formattedValue = formatDateValueToString(date, pickerValue, dateFormat);
111
111
 
112
- return (
113
- <Popover onOpenChange={setIsOpen}>
114
- <PopoverTrigger ref={triggerRef} asChild>
115
- {/* Clone the children element and pass the formatted value to the input element */}
116
- {isValidElement(children) ? (
117
- cloneElement(children as React.ReactElement<HTMLInputElement>, {
118
- value:
119
- (children as React.ReactElement<HTMLInputElement>).props
120
- .value ?? formattedValue,
121
- type: "input",
122
- readOnly: true,
123
- })
124
- ) : (
125
- /* If the children is not a valid element, Show the default input */
126
- <InputField
127
- readOnly
128
- type="input"
129
- childrenSide={
130
- <ActionButton type="button" size={"M"} onClick={() => {
131
- triggerRef.current?.click();
132
- }}>
133
- <i className="ri-calendar-event-fill"></i>
134
- </ActionButton>
135
- }
136
- {...props}
137
- value={formattedValue}
138
- ref={ref}
139
- />
140
- )}
141
- </PopoverTrigger>
142
- <PopoverContent
143
- data-theme="dark"
144
- className="!h-fit max-h-[fit-content] p-0 border-none rounded-[12px] flex flex-col sm:flex-row "
112
+ return (
113
+ <Popover onOpenChange={setIsOpen}>
114
+ <PopoverTrigger ref={triggerRef} asChild>
115
+ {/* Clone the children element and pass the formatted value to the input element */}
116
+ {isValidElement(children) ? (
117
+ cloneElement(children as React.ReactElement<HTMLInputElement>, {
118
+ value:
119
+ (children as React.ReactElement<HTMLInputElement>).props.value ?? formattedValue,
120
+ type: "input",
121
+ readOnly: true,
122
+ })
123
+ ) : (
124
+ /* If the children is not a valid element, Show the default input */
125
+ <InputField
126
+ readOnly
127
+ type="input"
128
+ childrenSide={
129
+ <ActionButton
130
+ type="button"
131
+ size={"M"}
132
+ onClick={() => {
133
+ triggerRef.current?.click();
134
+ }}
145
135
  >
146
- <Calendar
147
- {...calendarProps}
148
- captionLayout={captionLayout}
149
- showWeekNumber={showWeekNumber}
150
- mode={mode as any}
151
- selected={date as any}
152
- onSelect={(e: any) => {
153
- setDate(applyTimeToDateValue(e, pickerValue));
154
- }}
155
- min={mode != "single" ? min : undefined}
156
- max={mode != "single" ? max : undefined}
157
- />
158
- {timePicker && (
159
- <TimePicker
160
- value={pickerValue}
161
- onChange={(value: TimePickerValue) => {
162
- setPickerValue(value);
163
- setDate(applyTimeToDateValue(date, value));
164
- }}
165
- />
166
- )}
167
- </PopoverContent>
168
- </Popover>
169
- );
170
- }
136
+ <i className="ri-calendar-event-fill"></i>
137
+ </ActionButton>
138
+ }
139
+ {...props}
140
+ value={formattedValue}
141
+ ref={ref}
142
+ />
143
+ )}
144
+ </PopoverTrigger>
145
+ <PopoverContent
146
+ data-theme="dark"
147
+ className="!h-fit max-h-[fit-content] p-0 border-none rounded-[12px] flex flex-col sm:flex-row "
148
+ >
149
+ <Calendar
150
+ {...calendarProps}
151
+ captionLayout={captionLayout}
152
+ showWeekNumber={showWeekNumber}
153
+ // The mode/selected/onSelect discriminated union cannot be
154
+ // resolved statically since `mode` is a runtime value; cast to
155
+ // one variant so the props typecheck (runtime is unchanged).
156
+ mode={mode as "range"}
157
+ selected={date as unknown as DateRange | undefined}
158
+ onSelect={(e: Date | Date[] | DateRange | undefined) => {
159
+ setDate(applyTimeToDateValue(e, pickerValue));
160
+ }}
161
+ min={mode != "single" ? min : undefined}
162
+ max={mode != "single" ? max : undefined}
163
+ />
164
+ {timePicker && (
165
+ <TimePicker
166
+ value={pickerValue}
167
+ onChange={(value: TimePickerValue) => {
168
+ setPickerValue(value);
169
+ setDate(applyTimeToDateValue(date, value));
170
+ }}
171
+ />
172
+ )}
173
+ </PopoverContent>
174
+ </Popover>
175
+ );
176
+ },
171
177
  );
172
178
 
173
179
  DatePicker.displayName = "DatePicker";
174
180
 
175
181
  interface TimePickerProps {
176
- value: TimePickerValue;
177
- onChange: (value: TimePickerValue) => void;
182
+ value: TimePickerValue;
183
+ onChange: (value: TimePickerValue) => void;
178
184
  }
179
185
 
180
186
  const TimePicker = ({ value, onChange }: TimePickerProps) => {
181
- return (
182
- <div className="relative w-full sm:w-[189px]" data-theme="dark">
183
- <Picker
184
- className="flex-1"
185
- selectContainerClassName="bg-background-system-body-tertiary z-[-1] rounded-[8px]"
186
- value={value}
187
- onChange={(e: TimePickerValue) => {
188
- onChange(e);
189
- }}
190
- wheelMode="normal"
191
- >
192
- <span className="absolute left-0 top-1/2 -translate-y-1/2 w-full h-[20px] flex justify-center items-center text-white text-[30px] pr-[55px] pb-[5px]">
193
- :
194
- </span>
195
- <Picker.Column name="hour">
196
- {Array.from({ length: 12 }, (_, i) => i + 1).map((hour) => (
197
- <Picker.Item key={hour + "hour"} value={hour}>
198
- <div className="typography-display-small-semibold flex gap-1 whitespace-nowrap text-content-presentation-global-primary pl-[25px]">
199
- {" "}
200
- <p className="text-content-presentation-global-primary">
201
- {hour}
202
- </p>
203
- </div>
204
- </Picker.Item>
205
- ))}
206
- </Picker.Column>
207
- <Picker.Column name="minute">
208
- {Array.from({ length: 60 }, (_, i) => i).map((minute) => (
209
- <Picker.Item key={minute + "minute"} value={minute}>
210
- <div className="typography-display-small-semibold text-content-presentation-global-primary">
211
- {minute.toString().padStart(2, "0")}
212
- </div>
213
- </Picker.Item>
214
- ))}
215
- </Picker.Column>
216
- <Picker.Column name="time">
217
- {["AM", "PM"].map((time) => (
218
- <Picker.Item key={time + "time"} value={time}>
219
- <div className="typography-display-small-semibold text-content-presentation-global-primary pr-[30px]">
220
- {time}
221
- </div>
222
- </Picker.Item>
223
- ))}
224
- </Picker.Column>
225
- </Picker>
226
- </div>
227
- );
187
+ return (
188
+ <div className="relative w-full sm:w-[189px]" data-theme="dark">
189
+ <Picker
190
+ className="flex-1"
191
+ selectContainerClassName="bg-background-system-body-tertiary z-[-1] rounded-[8px]"
192
+ value={value}
193
+ onChange={(e: TimePickerValue) => {
194
+ onChange(e);
195
+ }}
196
+ wheelMode="normal"
197
+ >
198
+ <span className="absolute left-0 top-1/2 -translate-y-1/2 w-full h-[20px] flex justify-center items-center text-white text-[30px] pr-[55px] pb-[5px]">
199
+ :
200
+ </span>
201
+ <Picker.Column name="hour">
202
+ {Array.from({ length: 12 }, (_, i) => i + 1).map((hour) => (
203
+ <Picker.Item key={hour + "hour"} value={hour}>
204
+ <div className="typography-display-small-semibold flex gap-1 whitespace-nowrap text-content-presentation-global-primary pl-[25px]">
205
+ {" "}
206
+ <p className="text-content-presentation-global-primary">{hour}</p>
207
+ </div>
208
+ </Picker.Item>
209
+ ))}
210
+ </Picker.Column>
211
+ <Picker.Column name="minute">
212
+ {Array.from({ length: 60 }, (_, i) => i).map((minute) => (
213
+ <Picker.Item key={minute + "minute"} value={minute}>
214
+ <div className="typography-display-small-semibold text-content-presentation-global-primary">
215
+ {minute.toString().padStart(2, "0")}
216
+ </div>
217
+ </Picker.Item>
218
+ ))}
219
+ </Picker.Column>
220
+ <Picker.Column name="time">
221
+ {["AM", "PM"].map((time) => (
222
+ <Picker.Item key={time + "time"} value={time}>
223
+ <div className="typography-display-small-semibold text-content-presentation-global-primary pr-[30px]">
224
+ {time}
225
+ </div>
226
+ </Picker.Item>
227
+ ))}
228
+ </Picker.Column>
229
+ </Picker>
230
+ </div>
231
+ );
228
232
  };
@@ -1,129 +1,116 @@
1
- "use client"
1
+ "use client";
2
2
 
3
- import * as React from "react"
4
- import * as DialogPrimitive from "@radix-ui/react-dialog"
3
+ import * as React from "react";
4
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
5
5
 
6
- import { cn } from "../utils/cn"
6
+ import { cn } from "../utils/cn";
7
7
 
8
- const Dialog = DialogPrimitive.Root
8
+ const Dialog = DialogPrimitive.Root;
9
9
 
10
- const DialogTrigger = DialogPrimitive.Trigger
10
+ const DialogTrigger = DialogPrimitive.Trigger;
11
11
 
12
- const DialogPortal = DialogPrimitive.Portal
12
+ const DialogPortal = DialogPrimitive.Portal;
13
13
 
14
- const DialogClose = DialogPrimitive.Close
14
+ const DialogClose = DialogPrimitive.Close;
15
15
 
16
16
  const DialogOverlay = React.forwardRef<
17
- React.ElementRef<typeof DialogPrimitive.Overlay>,
18
- React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
17
+ React.ElementRef<typeof DialogPrimitive.Overlay>,
18
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
19
19
  >(({ className, ...props }, ref) => (
20
- <DialogPrimitive.Overlay
21
- ref={ref}
22
- className={cn(
23
- "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
24
- className
25
- )}
26
- {...props}
27
- />
28
- ))
29
- DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
20
+ <DialogPrimitive.Overlay
21
+ ref={ref}
22
+ className={cn(
23
+ "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
24
+ className,
25
+ )}
26
+ {...props}
27
+ />
28
+ ));
29
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
30
30
 
31
31
  const DialogContent = React.forwardRef<
32
- React.ElementRef<typeof DialogPrimitive.Content>,
33
- React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>
32
+ React.ElementRef<typeof DialogPrimitive.Content>,
33
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>
34
34
  >(({ className, children, ...props }, ref) => (
35
- <DialogPortal>
36
- <DialogOverlay />
37
- <DialogPrimitive.Content
38
- ref={ref}
39
- className={cn(
40
- "fixed left-[50%] top-[50%] z-50 flex flex-col items-start w-fit translate-x-[-50%] translate-y-[-50%] shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
41
- "flex justify-center items-center",
42
- className
43
- )}
44
- {...props}
45
- >
46
- {children}
47
-
48
- </DialogPrimitive.Content>
49
- </DialogPortal>
50
- ))
51
- DialogContent.displayName = DialogPrimitive.Content.displayName
52
-
35
+ <DialogPortal>
36
+ <DialogOverlay />
37
+ <DialogPrimitive.Content
38
+ ref={ref}
39
+ className={cn(
40
+ "fixed left-[50%] top-[50%] z-50 flex flex-col items-start w-fit translate-x-[-50%] translate-y-[-50%] shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
41
+ "flex justify-center items-center",
42
+ className,
43
+ )}
44
+ {...props}
45
+ >
46
+ {children}
47
+ </DialogPrimitive.Content>
48
+ </DialogPortal>
49
+ ));
50
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
53
51
 
54
52
  const DialogCloseButton = React.forwardRef<
55
- React.ElementRef<typeof DialogPrimitive.Close>,
56
- React.ComponentPropsWithoutRef<typeof DialogPrimitive.Close>
53
+ React.ElementRef<typeof DialogPrimitive.Close>,
54
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Close>
57
55
  >(({ className, children, ...props }, ref) => (
58
- <DialogPrimitive.Close ref={ref} {...props} className={cn("m-0 p-0 h-fit", className)}>
59
- {children}
60
- </DialogPrimitive.Close>
61
- ))
62
- const DialogHeader = ({
63
- className,
64
- ...props
65
- }: React.HTMLAttributes<HTMLDivElement>) => (
66
- <div
67
- className={cn(
68
- "flex flex-col space-y-1.5 text-center sm:text-left",
69
- className
70
- )}
71
- {...props}
72
- />
73
- )
74
- DialogHeader.displayName = "DialogHeader"
56
+ <DialogPrimitive.Close ref={ref} {...props} className={cn("m-0 p-0 h-fit", className)}>
57
+ {children}
58
+ </DialogPrimitive.Close>
59
+ ));
60
+ DialogCloseButton.displayName = DialogPrimitive.Close.displayName;
61
+ const DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
62
+ <div className={cn("flex flex-col space-y-1.5 text-center sm:text-left", className)} {...props} />
63
+ );
64
+ DialogHeader.displayName = "DialogHeader";
75
65
 
76
- const DialogFooter = ({
77
- className,
78
- ...props
79
- }: React.HTMLAttributes<HTMLDivElement>) => (
80
- <div
81
- className={cn(
82
- "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
83
- className
84
- )}
85
- {...props}
86
- />
87
- )
88
- DialogFooter.displayName = "DialogFooter"
66
+ const DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
67
+ <div
68
+ className={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)}
69
+ {...props}
70
+ />
71
+ );
72
+ DialogFooter.displayName = "DialogFooter";
89
73
 
90
74
  const DialogTitle = React.forwardRef<
91
- React.ElementRef<typeof DialogPrimitive.Title>,
92
- React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
75
+ React.ElementRef<typeof DialogPrimitive.Title>,
76
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
93
77
  >(({ className, ...props }, ref) => (
94
- <DialogPrimitive.Title
95
- ref={ref}
96
- className={cn(
97
- "text-lg font-semibold leading-none tracking-tight text-content-presentation-global-primary",
98
- className
99
- )}
100
- {...props}
101
- />
102
- ))
103
- DialogTitle.displayName = DialogPrimitive.Title.displayName
78
+ <DialogPrimitive.Title
79
+ ref={ref}
80
+ className={cn(
81
+ "text-lg font-semibold leading-none tracking-tight text-content-presentation-global-primary",
82
+ className,
83
+ )}
84
+ {...props}
85
+ />
86
+ ));
87
+ DialogTitle.displayName = DialogPrimitive.Title.displayName;
104
88
 
105
89
  const DialogDescription = React.forwardRef<
106
- React.ElementRef<typeof DialogPrimitive.Description>,
107
- React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
90
+ React.ElementRef<typeof DialogPrimitive.Description>,
91
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
108
92
  >(({ className, ...props }, ref) => (
109
- <DialogPrimitive.Description
110
- ref={ref}
111
- className={cn("text-sm text-muted-foreground text-content-presentation-global-primary", className)}
112
- {...props}
113
- />
114
- ))
115
- DialogDescription.displayName = DialogPrimitive.Description.displayName
93
+ <DialogPrimitive.Description
94
+ ref={ref}
95
+ className={cn(
96
+ "text-sm text-muted-foreground text-content-presentation-global-primary",
97
+ className,
98
+ )}
99
+ {...props}
100
+ />
101
+ ));
102
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
116
103
 
117
104
  export {
118
- Dialog,
119
- DialogPortal,
120
- DialogOverlay,
121
- DialogTrigger,
122
- DialogClose,
123
- DialogContent,
124
- DialogHeader,
125
- DialogFooter,
126
- DialogTitle,
127
- DialogDescription,
128
- DialogCloseButton
129
- }
105
+ Dialog,
106
+ DialogPortal,
107
+ DialogOverlay,
108
+ DialogTrigger,
109
+ DialogClose,
110
+ DialogContent,
111
+ DialogHeader,
112
+ DialogFooter,
113
+ DialogTitle,
114
+ DialogDescription,
115
+ DialogCloseButton,
116
+ };