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,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,208 +15,216 @@ 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;
39
38
  }
40
39
 
41
40
  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
- ? { from: value, to: value }
67
- : value;
68
- const [date, setDate] = useState<Date[] | Date | DateRange | undefined>(initialDate);
69
- const [pickerValue, setPickerValue] = useState<TimePickerValue>({
70
- hour: (date instanceof Date ? date.getHours() : 12).toString(),
71
- minute: (date instanceof Date ? date.getMinutes() : 0)
72
- .toString()
73
- .padStart(2, "0"),
74
- time: date instanceof Date && date.getHours() < 12 ? "AM" : "PM",
75
- });
76
- const [isOpen, setIsOpen] = useState(false);
77
- const triggerRef = useRef<HTMLButtonElement>(null);
41
+ (
42
+ {
43
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- destructured to exclude from {...props} spread
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 &&
69
+ typeof value === "object" &&
70
+ !(value instanceof Date) &&
71
+ ("from" in value || "to" in value)
72
+ ? (value as DateRange)
73
+ : { from: value, to: value }
74
+ : value;
75
+ const [date, setDate] = useState<Date[] | Date | DateRange | undefined>(
76
+ initialDate as Date[] | Date | DateRange | undefined,
77
+ );
78
+ const [pickerValue, setPickerValue] = useState<TimePickerValue>({
79
+ hour: (date instanceof Date ? date.getHours() : 12).toString(),
80
+ minute: (date instanceof Date ? date.getMinutes() : 0).toString().padStart(2, "0"),
81
+ time: date instanceof Date && date.getHours() < 12 ? "AM" : "PM",
82
+ });
83
+ const [isOpen, setIsOpen] = useState(false);
84
+ const triggerRef = useRef<HTMLButtonElement>(null);
78
85
 
79
- // Call the onChange function when the date or picker value changes
80
- useEffect(() => {
81
- onChange?.({
82
- target: {
83
- value: date,
84
- },
85
- } as any);
86
- }, [date, pickerValue]);
86
+ // Call the onChange function when the date or picker value changes
87
+ useEffect(() => {
88
+ onChange?.({
89
+ target: {
90
+ value: date,
91
+ },
92
+ } as unknown as React.ChangeEvent<HTMLInputElement>);
93
+ }, [date, pickerValue]);
87
94
 
88
- // Disable body scroll when popover is open
89
- useEffect(() => {
90
- if (isOpen) {
91
- // Save the current overflow style
92
- const originalOverflow = document.body.style.overflow;
93
- document.body.style.overflow = "hidden";
95
+ // Disable body scroll when popover is open
96
+ useEffect(() => {
97
+ if (isOpen) {
98
+ // Save the current overflow style
99
+ const originalOverflow = document.body.style.overflow;
100
+ document.body.style.overflow = "hidden";
94
101
 
95
- // Cleanup function to restore original overflow style
96
- return () => {
97
- document.body.style.overflow = originalOverflow;
98
- };
99
- }
100
- }, [isOpen]);
101
- const formattedValue = formatDateValueToString(
102
- date,
103
- pickerValue,
104
- dateFormat
105
- );
102
+ // Cleanup function to restore original overflow style
103
+ return () => {
104
+ document.body.style.overflow = originalOverflow;
105
+ };
106
+ }
107
+ }, [isOpen]);
108
+ const formattedValue = formatDateValueToString(date, pickerValue, dateFormat);
106
109
 
107
- return (
108
- <Popover onOpenChange={setIsOpen}>
109
- <PopoverTrigger ref={triggerRef} asChild>
110
- {/* Clone the children element and pass the formatted value to the input element */}
111
- {isValidElement(children) ? (
112
- cloneElement(children as React.ReactElement<HTMLInputElement>, {
113
- value:
114
- (children as React.ReactElement<HTMLInputElement>).props
115
- .value ?? formattedValue,
116
- type: "input",
117
- readOnly: true,
118
- })
119
- ) : (
120
- /* If the children is not a valid element, Show the default input */
121
- <InputField
122
- readOnly
123
- type="input"
124
- childrenSide={
125
- <ActionButton type="button" size={"M"} onClick={() => {
126
- triggerRef.current?.click();
127
- }}>
128
- <i className="ri-calendar-event-fill"></i>
129
- </ActionButton>
130
- }
131
- {...props}
132
- value={formattedValue}
133
- ref={ref}
134
- />
135
- )}
136
- </PopoverTrigger>
137
- <PopoverContent
138
- data-theme="dark"
139
- className="!h-fit max-h-[fit-content] p-0 border-none rounded-[12px] flex flex-col sm:flex-row "
110
+ return (
111
+ <Popover onOpenChange={setIsOpen}>
112
+ <PopoverTrigger ref={triggerRef} asChild>
113
+ {/* Clone the children element and pass the formatted value to the input element */}
114
+ {isValidElement(children) ? (
115
+ cloneElement(children as React.ReactElement<HTMLInputElement>, {
116
+ value:
117
+ (children as React.ReactElement<HTMLInputElement>).props.value ?? formattedValue,
118
+ type: "input",
119
+ readOnly: true,
120
+ })
121
+ ) : (
122
+ /* If the children is not a valid element, Show the default input */
123
+ <InputField
124
+ readOnly
125
+ type="input"
126
+ childrenSide={
127
+ <ActionButton
128
+ type="button"
129
+ size={"M"}
130
+ onClick={() => {
131
+ triggerRef.current?.click();
132
+ }}
140
133
  >
141
- <Calendar
142
- {...calendarProps}
143
- captionLayout={captionLayout}
144
- showWeekNumber={showWeekNumber}
145
- mode={mode as any}
146
- selected={date as any}
147
- onSelect={(e: any) => {
148
- setDate(applyTimeToDateValue(e, pickerValue));
149
- }}
150
- min={mode != "single" ? min : undefined}
151
- max={mode != "single" ? max : undefined}
152
- />
153
- {timePicker && (
154
- <TimePicker
155
- value={pickerValue}
156
- onChange={(value: TimePickerValue) => {
157
- setPickerValue(value);
158
- setDate(applyTimeToDateValue(date, value));
159
- }}
160
- />
161
- )}
162
- </PopoverContent>
163
- </Popover>
164
- );
165
- }
134
+ <i className="ri-calendar-event-fill"></i>
135
+ </ActionButton>
136
+ }
137
+ {...props}
138
+ value={formattedValue}
139
+ ref={ref}
140
+ />
141
+ )}
142
+ </PopoverTrigger>
143
+ <PopoverContent
144
+ data-theme="dark"
145
+ className="!h-fit max-h-[fit-content] p-0 border-none rounded-[12px] flex flex-col sm:flex-row "
146
+ >
147
+ <Calendar
148
+ {...calendarProps}
149
+ captionLayout={captionLayout}
150
+ showWeekNumber={showWeekNumber}
151
+ // The mode/selected/onSelect discriminated union cannot be
152
+ // resolved statically since `mode` is a runtime value; cast to
153
+ // one variant so the props typecheck (runtime is unchanged).
154
+ mode={mode as "range"}
155
+ selected={date as unknown as DateRange | undefined}
156
+ onSelect={(e: Date | Date[] | DateRange | undefined) => {
157
+ setDate(applyTimeToDateValue(e, pickerValue));
158
+ }}
159
+ min={mode != "single" ? min : undefined}
160
+ max={mode != "single" ? max : undefined}
161
+ />
162
+ {timePicker && (
163
+ <TimePicker
164
+ value={pickerValue}
165
+ onChange={(value: TimePickerValue) => {
166
+ setPickerValue(value);
167
+ setDate(applyTimeToDateValue(date, value));
168
+ }}
169
+ />
170
+ )}
171
+ </PopoverContent>
172
+ </Popover>
173
+ );
174
+ },
166
175
  );
167
176
 
168
177
  DatePicker.displayName = "DatePicker";
169
178
 
170
179
  interface TimePickerProps {
171
- value: TimePickerValue;
172
- onChange: (value: TimePickerValue) => void;
180
+ value: TimePickerValue;
181
+ onChange: (value: TimePickerValue) => void;
173
182
  }
174
183
 
175
184
  const TimePicker = ({ value, onChange }: TimePickerProps) => {
176
- return (
177
- <div className="relative w-full sm:w-[189px]" data-theme="dark">
178
- <Picker
179
- className="flex-1"
180
- selectContainerClassName="bg-background-system-body-tertiary z-[-1] rounded-[8px]"
181
- value={value}
182
- onChange={(e: TimePickerValue) => {
183
- onChange(e);
184
- }}
185
- wheelMode="normal"
186
- >
187
- <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]">
188
- :
189
- </span>
190
- <Picker.Column name="hour">
191
- {Array.from({ length: 12 }, (_, i) => i + 1).map((hour) => (
192
- <Picker.Item key={hour + "hour"} value={hour}>
193
- <div className="typography-display-small-semibold flex gap-1 whitespace-nowrap text-content-presentation-global-primary pl-[25px]">
194
- {" "}
195
- <p className="text-content-presentation-global-primary">
196
- {hour}
197
- </p>
198
- </div>
199
- </Picker.Item>
200
- ))}
201
- </Picker.Column>
202
- <Picker.Column name="minute">
203
- {Array.from({ length: 60 }, (_, i) => i).map((minute) => (
204
- <Picker.Item key={minute + "minute"} value={minute}>
205
- <div className="typography-display-small-semibold text-content-presentation-global-primary">
206
- {minute.toString().padStart(2, "0")}
207
- </div>
208
- </Picker.Item>
209
- ))}
210
- </Picker.Column>
211
- <Picker.Column name="time">
212
- {["AM", "PM"].map((time) => (
213
- <Picker.Item key={time + "time"} value={time}>
214
- <div className="typography-display-small-semibold text-content-presentation-global-primary pr-[30px]">
215
- {time}
216
- </div>
217
- </Picker.Item>
218
- ))}
219
- </Picker.Column>
220
- </Picker>
221
- </div>
222
- );
185
+ return (
186
+ <div className="relative w-full sm:w-[189px]" data-theme="dark">
187
+ <Picker
188
+ className="flex-1"
189
+ selectContainerClassName="bg-background-system-body-tertiary z-[-1] rounded-[8px]"
190
+ value={value}
191
+ onChange={(e: TimePickerValue) => {
192
+ onChange(e);
193
+ }}
194
+ wheelMode="normal"
195
+ >
196
+ <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]">
197
+ :
198
+ </span>
199
+ <Picker.Column name="hour">
200
+ {Array.from({ length: 12 }, (_, i) => i + 1).map((hour) => (
201
+ <Picker.Item key={hour + "hour"} value={hour}>
202
+ <div className="typography-display-small-semibold flex gap-1 whitespace-nowrap text-content-presentation-global-primary pl-[25px]">
203
+ {" "}
204
+ <p className="text-content-presentation-global-primary">{hour}</p>
205
+ </div>
206
+ </Picker.Item>
207
+ ))}
208
+ </Picker.Column>
209
+ <Picker.Column name="minute">
210
+ {Array.from({ length: 60 }, (_, i) => i).map((minute) => (
211
+ <Picker.Item key={minute + "minute"} value={minute}>
212
+ <div className="typography-display-small-semibold text-content-presentation-global-primary">
213
+ {minute.toString().padStart(2, "0")}
214
+ </div>
215
+ </Picker.Item>
216
+ ))}
217
+ </Picker.Column>
218
+ <Picker.Column name="time">
219
+ {["AM", "PM"].map((time) => (
220
+ <Picker.Item key={time + "time"} value={time}>
221
+ <div className="typography-display-small-semibold text-content-presentation-global-primary pr-[30px]">
222
+ {time}
223
+ </div>
224
+ </Picker.Item>
225
+ ))}
226
+ </Picker.Column>
227
+ </Picker>
228
+ </div>
229
+ );
223
230
  };
@@ -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
+ };