@greatapps/common 1.1.217 → 1.1.219

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 (254) hide show
  1. package/dist/components/account/ConfigurationsMyAccountModal.mjs +5 -5
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  3. package/dist/components/account/ConfirmDeleteAccountModal.mjs +2 -2
  4. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  5. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs +2 -2
  6. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  7. package/dist/components/account/DeleteAccountModal.mjs +3 -3
  8. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  9. package/dist/components/account/DisableTwoFactorAuthModal.mjs +2 -2
  10. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  11. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs +2 -2
  12. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  13. package/dist/components/account/TwoFactorAuthModal.mjs +6 -6
  14. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  15. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  16. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  17. package/dist/components/account/sections/ChangeEmailModal.mjs +6 -6
  18. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  19. package/dist/components/account/sections/ChangePasswordSection.mjs +4 -4
  20. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  21. package/dist/components/account/sections/ChangePhoneModal.mjs +5 -5
  22. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  23. package/dist/components/account/sections/MyProfileSection.mjs +3 -3
  24. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  25. package/dist/components/account/sections/PreferencesSection.mjs +6 -6
  26. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  27. package/dist/components/account/sections/SecuritySection.mjs +3 -3
  28. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  29. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  30. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  31. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  32. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  33. package/dist/components/layouts/MdSideBarNavigation.mjs +2 -2
  34. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  35. package/dist/components/layouts/NavBar.mjs +2 -2
  36. package/dist/components/layouts/NavBar.mjs.map +1 -1
  37. package/dist/components/layouts/NotificationsPopover.mjs +4 -4
  38. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  39. package/dist/components/layouts/ProfilePopover.mjs +2 -2
  40. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  41. package/dist/components/layouts/UsersSelectorPopover.mjs +5 -5
  42. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  43. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  44. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  45. package/dist/components/navigation/ProjectSelectorPopover.mjs +6 -6
  46. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  47. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  48. package/dist/components/navigation/subcomponents/ProjectSelector.mjs +5 -5
  49. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  50. package/dist/components/pages/notifications/Notifications.mjs +5 -5
  51. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  52. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  53. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  54. package/dist/components/ui/buttons/CopyButton.mjs +2 -2
  55. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  56. package/dist/components/ui/data-display/Accordion.mjs +2 -2
  57. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  58. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  59. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  60. package/dist/components/ui/data-display/Pagination.mjs +7 -7
  61. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  62. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  63. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  64. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  65. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  66. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  67. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  68. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  69. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  70. package/dist/components/ui/feedback/Toast.mjs +7 -7
  71. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  72. package/dist/components/ui/form/Calendar.mjs +7 -7
  73. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  74. package/dist/components/ui/form/Checkbox.mjs +2 -2
  75. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  76. package/dist/components/ui/form/ComboboxField.mjs +4 -4
  77. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  78. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  79. package/dist/components/ui/form/DateRangePicker.mjs +2 -2
  80. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  81. package/dist/components/ui/form/FormField.mjs +3 -3
  82. package/dist/components/ui/form/FormField.mjs.map +1 -1
  83. package/dist/components/ui/form/Input.mjs.map +1 -1
  84. package/dist/components/ui/form/InputOtp.mjs +2 -2
  85. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  86. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  87. package/dist/components/ui/form/RadioGroup.mjs +2 -2
  88. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  89. package/dist/components/ui/form/Select.mjs +6 -6
  90. package/dist/components/ui/form/Select.mjs.map +1 -1
  91. package/dist/components/ui/form/Switch.mjs.map +1 -1
  92. package/dist/components/ui/form/SwitchOptionFieldWithIcon.mjs.map +1 -1
  93. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  94. package/dist/components/ui/overlay/Command.mjs +2 -2
  95. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  96. package/dist/components/ui/overlay/Dialog.mjs +2 -2
  97. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  98. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  99. package/dist/components/ui/overlay/Sheet.mjs +2 -2
  100. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  101. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  102. package/dist/components/widgets/notifications/NotificationCard.mjs +2 -2
  103. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  104. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  105. package/dist/index.mjs.map +1 -1
  106. package/dist/middleware.mjs.map +1 -1
  107. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  108. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  109. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  110. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  111. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  112. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  113. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  114. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  115. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  116. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  117. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  118. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  119. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  120. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  121. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  122. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  123. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  124. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  125. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  126. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  127. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  128. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  129. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  130. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  131. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  132. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  133. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  134. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  135. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  136. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  137. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  138. package/dist/modules/whitelabel/actions/find-whitelabel-styles.action.mjs.map +1 -1
  139. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  140. package/dist/modules/whitelabel/services/whitelabel-styles.service.mjs.map +1 -1
  141. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  142. package/dist/utils/countries.mjs.map +1 -1
  143. package/dist/utils/safeServerAction.mjs.map +1 -1
  144. package/dist/utils/withAction.mjs.map +1 -1
  145. package/package.json +89 -90
  146. package/src/components/account/ConfigurationsMyAccountModal.tsx +5 -5
  147. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  148. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +2 -2
  149. package/src/components/account/DeleteAccountModal.tsx +130 -130
  150. package/src/components/account/DisableTwoFactorAuthModal.tsx +2 -2
  151. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  152. package/src/components/account/TwoFactorAuthModal.tsx +6 -6
  153. package/src/components/account/hooks/useChangePhoneForm.tsx +81 -81
  154. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  155. package/src/components/account/sections/ChangeEmailModal.tsx +6 -6
  156. package/src/components/account/sections/ChangePasswordSection.tsx +4 -4
  157. package/src/components/account/sections/ChangePhoneModal.tsx +231 -231
  158. package/src/components/account/sections/MyProfileSection.tsx +3 -3
  159. package/src/components/account/sections/PreferencesSection.tsx +6 -6
  160. package/src/components/account/sections/SecuritySection.tsx +3 -3
  161. package/src/components/embeds/CrispEmbed.tsx +101 -101
  162. package/src/components/embeds/FrillEmbed.tsx +119 -119
  163. package/src/components/layouts/AppMobileNavBar.tsx +111 -111
  164. package/src/components/layouts/AppNavBar.tsx +57 -57
  165. package/src/components/layouts/MdSideBarNavigation.tsx +4 -4
  166. package/src/components/layouts/NavBar.tsx +120 -120
  167. package/src/components/layouts/NotificationsPopover.tsx +4 -4
  168. package/src/components/layouts/ProfilePopover.tsx +2 -2
  169. package/src/components/layouts/UsersSelectorPopover.tsx +238 -238
  170. package/src/components/navigation/CancelledSubscriptionBanner.tsx +69 -69
  171. package/src/components/navigation/NavItemsContext.ts +20 -20
  172. package/src/components/navigation/ProjectSelectorPopover.tsx +6 -6
  173. package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
  174. package/src/components/navigation/subcomponents/ProjectSelector.tsx +5 -5
  175. package/src/components/pages/notifications/Notifications.tsx +160 -160
  176. package/src/components/ui/buttons/Button.tsx +57 -57
  177. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  178. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  179. package/src/components/ui/data-display/Accordion.tsx +81 -81
  180. package/src/components/ui/data-display/Badge.tsx +47 -47
  181. package/src/components/ui/data-display/Card.tsx +93 -93
  182. package/src/components/ui/data-display/Pagination.tsx +126 -126
  183. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  184. package/src/components/ui/data-display/Separator.tsx +29 -29
  185. package/src/components/ui/data-display/Table.tsx +117 -117
  186. package/src/components/ui/data-display/Tabs.tsx +67 -67
  187. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  188. package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
  189. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  190. package/src/components/ui/feedback/Progress.tsx +40 -40
  191. package/src/components/ui/feedback/Toast.tsx +101 -101
  192. package/src/components/ui/form/Calendar.tsx +228 -228
  193. package/src/components/ui/form/Checkbox.tsx +31 -31
  194. package/src/components/ui/form/ComboboxField.tsx +4 -4
  195. package/src/components/ui/form/DatePicker.tsx +97 -97
  196. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  197. package/src/components/ui/form/FormField.tsx +6 -5
  198. package/src/components/ui/form/Input.tsx +20 -20
  199. package/src/components/ui/form/InputOtp.tsx +80 -80
  200. package/src/components/ui/form/PhoneInput.tsx +205 -205
  201. package/src/components/ui/form/RadioGroup.tsx +45 -45
  202. package/src/components/ui/form/Select.tsx +200 -200
  203. package/src/components/ui/form/Switch.tsx +32 -32
  204. package/src/components/ui/form/SwitchOptionFieldWithIcon.tsx +2 -2
  205. package/src/components/ui/form/Textarea.tsx +19 -19
  206. package/src/components/ui/overlay/Command.tsx +185 -185
  207. package/src/components/ui/overlay/Dialog.tsx +151 -151
  208. package/src/components/ui/overlay/Popover.tsx +49 -49
  209. package/src/components/ui/overlay/Sheet.tsx +166 -166
  210. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  211. package/src/components/widgets/notifications/NotificationCard.tsx +68 -68
  212. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  213. package/src/index.ts +355 -355
  214. package/src/middleware.ts +4 -4
  215. package/src/modules/accounts/actions/account-management.action.ts +90 -90
  216. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  217. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  218. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  219. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  220. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  221. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  222. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  223. package/src/modules/accounts/services/account.service.ts +236 -236
  224. package/src/modules/accounts/types.ts +214 -214
  225. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  226. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  227. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  228. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  229. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  230. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  231. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  232. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  233. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  234. package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
  235. package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
  236. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  237. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  238. package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
  239. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  240. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
  241. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +17 -17
  242. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  243. package/src/modules/users/action/list-messages.action.ts +12 -12
  244. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  245. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  246. package/src/modules/users/hooks/messages.hook.ts +60 -60
  247. package/src/modules/whitelabel/actions/find-whitelabel-styles.action.ts +14 -14
  248. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  249. package/src/modules/whitelabel/services/whitelabel-styles.service.ts +98 -98
  250. package/src/modules/whitelabel/styles-schema.ts +37 -37
  251. package/src/providers/whitelabel.provider.tsx +46 -46
  252. package/src/utils/countries.ts +224 -224
  253. package/src/utils/safeServerAction.ts +21 -21
  254. package/src/utils/withAction.ts +13 -13
@@ -1,97 +1,97 @@
1
- "use client";
2
-
3
- import { useState, forwardRef, useEffect } from "react";
4
- import { format } from "date-fns";
5
- import { Calendar } from "./Calendar";
6
- import { Popover, PopoverContent, PopoverTrigger } from "../overlay/Popover";
7
- import { cn } from "../../../infra/utils/clsx";
8
-
9
- // Converte string ISO (yyyy-MM-dd) para Date no fuso horário local
10
- // Evita bug de timezone onde new Date("2025-08-02") interpreta como UTC
11
- const isoParaDataLocal = (iso: string): Date => {
12
- const [ano, mes, dia] = iso.split("-").map(Number);
13
- return new Date(ano, mes - 1, dia);
14
- };
15
-
16
- interface DatePickerProps {
17
- value?: string;
18
- onChange?: (date: string | undefined) => void;
19
- placeholder?: string;
20
- className?: string;
21
- disabled?: boolean;
22
- }
23
-
24
- export const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(
25
- (
26
- { value, onChange, placeholder = "Selecione a data", className, disabled },
27
- ref,
28
- ) => {
29
- const [open, setOpen] = useState(false);
30
- const [date, setDate] = useState<Date | undefined>(() => {
31
- return value ? isoParaDataLocal(value) : undefined;
32
- });
33
-
34
- // Sincroniza estado interno quando value mudar externamente
35
- useEffect(() => {
36
- if (value) {
37
- setDate(isoParaDataLocal(value));
38
- } else {
39
- setDate(undefined);
40
- }
41
- }, [value]);
42
-
43
- const handleDateSelect = (selectedDate: Date | undefined) => {
44
- setDate(selectedDate);
45
-
46
- if (selectedDate) {
47
- onChange?.(format(selectedDate, "yyyy-MM-dd"));
48
- setOpen(false); // Fecha o popover após seleção
49
- } else {
50
- onChange?.(undefined);
51
- }
52
- };
53
-
54
- const displayText = date ? format(date, "dd/MM/yyyy") : placeholder;
55
-
56
- return (
57
- <Popover open={open} onOpenChange={setOpen}>
58
- <PopoverTrigger asChild>
59
- <button
60
- ref={ref}
61
- disabled={disabled}
62
- className={cn(
63
- "flex items-center gap-2 px-4 h-10 border rounded-lg transition-colors w-full justify-start",
64
- "border-gray-200 hover:border-gray-400 focus-within:border-gray-950",
65
- "disabled:opacity-50 disabled:cursor-not-allowed",
66
- className,
67
- )}
68
- >
69
- <span
70
- className={cn(
71
- "paragraph-small-medium",
72
- date ? "text-gray-950" : "text-gray-500",
73
- )}
74
- >
75
- {displayText}
76
- </span>
77
- </button>
78
- </PopoverTrigger>
79
- <PopoverContent
80
- className="w-auto p-0 bg-white rounded-2xl shadow-md border border-gray-200"
81
- align="start"
82
- sideOffset={8}
83
- >
84
- <div className="p-3">
85
- <Calendar
86
- mode="single"
87
- selected={date}
88
- onSelect={handleDateSelect}
89
- />
90
- </div>
91
- </PopoverContent>
92
- </Popover>
93
- );
94
- },
95
- );
96
-
97
- DatePicker.displayName = "DatePicker";
1
+ "use client";
2
+
3
+ import { useState, forwardRef, useEffect } from "react";
4
+ import { format } from "date-fns";
5
+ import { Calendar } from "./Calendar";
6
+ import { Popover, PopoverContent, PopoverTrigger } from "../overlay/Popover";
7
+ import { cn } from "../../../infra/utils/clsx";
8
+
9
+ // Converte string ISO (yyyy-MM-dd) para Date no fuso horário local
10
+ // Evita bug de timezone onde new Date("2025-08-02") interpreta como UTC
11
+ const isoParaDataLocal = (iso: string): Date => {
12
+ const [ano, mes, dia] = iso.split("-").map(Number);
13
+ return new Date(ano, mes - 1, dia);
14
+ };
15
+
16
+ interface DatePickerProps {
17
+ value?: string;
18
+ onChange?: (date: string | undefined) => void;
19
+ placeholder?: string;
20
+ className?: string;
21
+ disabled?: boolean;
22
+ }
23
+
24
+ export const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(
25
+ (
26
+ { value, onChange, placeholder = "Selecione a data", className, disabled },
27
+ ref,
28
+ ) => {
29
+ const [open, setOpen] = useState(false);
30
+ const [date, setDate] = useState<Date | undefined>(() => {
31
+ return value ? isoParaDataLocal(value) : undefined;
32
+ });
33
+
34
+ // Sincroniza estado interno quando value mudar externamente
35
+ useEffect(() => {
36
+ if (value) {
37
+ setDate(isoParaDataLocal(value));
38
+ } else {
39
+ setDate(undefined);
40
+ }
41
+ }, [value]);
42
+
43
+ const handleDateSelect = (selectedDate: Date | undefined) => {
44
+ setDate(selectedDate);
45
+
46
+ if (selectedDate) {
47
+ onChange?.(format(selectedDate, "yyyy-MM-dd"));
48
+ setOpen(false); // Fecha o popover após seleção
49
+ } else {
50
+ onChange?.(undefined);
51
+ }
52
+ };
53
+
54
+ const displayText = date ? format(date, "dd/MM/yyyy") : placeholder;
55
+
56
+ return (
57
+ <Popover open={open} onOpenChange={setOpen}>
58
+ <PopoverTrigger asChild>
59
+ <button
60
+ ref={ref}
61
+ disabled={disabled}
62
+ className={cn(
63
+ "flex items-center gap-2 px-4 h-10 border rounded-lg transition-colors w-full justify-start",
64
+ "border-gray-200 hover:border-gray-400 focus-within:border-gray-950",
65
+ "disabled:opacity-50 disabled:cursor-not-allowed",
66
+ className,
67
+ )}
68
+ >
69
+ <span
70
+ className={cn(
71
+ "paragraph-small-medium",
72
+ date ? "text-gray-950" : "text-gray-500",
73
+ )}
74
+ >
75
+ {displayText}
76
+ </span>
77
+ </button>
78
+ </PopoverTrigger>
79
+ <PopoverContent
80
+ className="w-auto p-0 bg-white rounded-2xl shadow-md border border-gray-200"
81
+ align="start"
82
+ sideOffset={8}
83
+ >
84
+ <div className="p-3">
85
+ <Calendar
86
+ mode="single"
87
+ selected={date}
88
+ onSelect={handleDateSelect}
89
+ />
90
+ </div>
91
+ </PopoverContent>
92
+ </Popover>
93
+ );
94
+ },
95
+ );
96
+
97
+ DatePicker.displayName = "DatePicker";
@@ -1,108 +1,108 @@
1
- "use client";
2
-
3
- import { useState, forwardRef, useEffect } from "react";
4
- import { format } from "date-fns";
5
- import { Calendar as CalendarIcon } from "lucide-react";
6
- import { DateRange } from "react-day-picker";
7
- import { Calendar } from "./Calendar";
8
- import { Popover, PopoverContent, PopoverTrigger } from "../overlay/Popover";
9
- import { cn } from "../../../infra/utils/clsx";
10
-
11
- // Converte string ISO (yyyy-MM-dd) para Date no fuso horário local
12
- // Evita bug de timezone onde new Date("2025-08-02") interpreta como UTC
13
- const isoParaDataLocal = (iso: string): Date => {
14
- const [ano, mes, dia] = iso.split("-").map(Number);
15
- return new Date(ano, mes - 1, dia);
16
- };
17
-
18
- interface DateRangePickerProps {
19
- value?: { from: string; to: string };
20
- onChange?: (range: { from: string; to: string } | undefined) => void;
21
- placeholder?: string;
22
- className?: string;
23
- disabled?: boolean;
24
- }
25
-
26
- export const DateRangePicker = forwardRef<HTMLButtonElement, DateRangePickerProps>(
27
- ({ value, onChange, placeholder = "Selecione o período", className, disabled }, ref) => {
28
- const [open, setOpen] = useState(false);
29
- const [range, setRange] = useState<DateRange | undefined>(() => {
30
- if (value?.from && value?.to) {
31
- return {
32
- from: isoParaDataLocal(value.from),
33
- to: isoParaDataLocal(value.to)
34
- };
35
- }
36
- return undefined;
37
- });
38
-
39
- useEffect(() => {
40
- if (value?.from && value?.to) {
41
- setRange({
42
- from: isoParaDataLocal(value.from),
43
- to: isoParaDataLocal(value.to)
44
- });
45
- } else {
46
- setRange(undefined);
47
- }
48
- }, [value]);
49
-
50
- const handleRangeSelect = (newRange: DateRange | undefined) => {
51
- setRange(newRange);
52
-
53
- if (newRange?.from && newRange?.to) {
54
- onChange?.({
55
- from: format(newRange.from, "yyyy-MM-dd"),
56
- to: format(newRange.to, "yyyy-MM-dd")
57
- });
58
- } else {
59
- onChange?.(undefined);
60
- }
61
- };
62
-
63
- const displayText = range?.from && range?.to
64
- ? `${format(range.from, "dd/MM/yyyy")} - ${format(range.to, "dd/MM/yyyy")}`
65
- : placeholder;
66
-
67
- return (
68
- <Popover open={open} onOpenChange={setOpen}>
69
- <PopoverTrigger asChild>
70
- <button
71
- ref={ref}
72
- disabled={disabled}
73
- className={cn(
74
- "flex items-center gap-2 px-4 h-10 border rounded-lg transition-colors w-full justify-start",
75
- "border-gray-200 hover:border-gray-400 focus-within:border-gray-950",
76
- "disabled:opacity-50 disabled:cursor-not-allowed",
77
- className
78
- )}
79
- >
80
- <CalendarIcon size={20} className="text-gray-400" />
81
- <span className={cn(
82
- "paragraph-small-medium",
83
- range?.from && range?.to ? "text-gray-950" : "text-gray-500"
84
- )}>
85
- {displayText}
86
- </span>
87
- </button>
88
- </PopoverTrigger>
89
- <PopoverContent
90
- className="w-auto p-0 bg-white rounded-2xl shadow-md border border-gray-200"
91
- align="start"
92
- sideOffset={8}
93
- >
94
- <div className="p-3">
95
- <Calendar
96
- mode="range"
97
- selected={range}
98
- onSelect={handleRangeSelect}
99
- numberOfMonths={1}
100
- />
101
- </div>
102
- </PopoverContent>
103
- </Popover>
104
- );
105
- }
106
- );
107
-
108
- DateRangePicker.displayName = "DateRangePicker";
1
+ "use client";
2
+
3
+ import { useState, forwardRef, useEffect } from "react";
4
+ import { format } from "date-fns";
5
+ import { IconCalendar } from '@tabler/icons-react';
6
+ import { DateRange } from "react-day-picker";
7
+ import { Calendar } from "./Calendar";
8
+ import { Popover, PopoverContent, PopoverTrigger } from "../overlay/Popover";
9
+ import { cn } from "../../../infra/utils/clsx";
10
+
11
+ // Converte string ISO (yyyy-MM-dd) para Date no fuso horário local
12
+ // Evita bug de timezone onde new Date("2025-08-02") interpreta como UTC
13
+ const isoParaDataLocal = (iso: string): Date => {
14
+ const [ano, mes, dia] = iso.split("-").map(Number);
15
+ return new Date(ano, mes - 1, dia);
16
+ };
17
+
18
+ interface DateRangePickerProps {
19
+ value?: { from: string; to: string };
20
+ onChange?: (range: { from: string; to: string } | undefined) => void;
21
+ placeholder?: string;
22
+ className?: string;
23
+ disabled?: boolean;
24
+ }
25
+
26
+ export const DateRangePicker = forwardRef<HTMLButtonElement, DateRangePickerProps>(
27
+ ({ value, onChange, placeholder = "Selecione o período", className, disabled }, ref) => {
28
+ const [open, setOpen] = useState(false);
29
+ const [range, setRange] = useState<DateRange | undefined>(() => {
30
+ if (value?.from && value?.to) {
31
+ return {
32
+ from: isoParaDataLocal(value.from),
33
+ to: isoParaDataLocal(value.to)
34
+ };
35
+ }
36
+ return undefined;
37
+ });
38
+
39
+ useEffect(() => {
40
+ if (value?.from && value?.to) {
41
+ setRange({
42
+ from: isoParaDataLocal(value.from),
43
+ to: isoParaDataLocal(value.to)
44
+ });
45
+ } else {
46
+ setRange(undefined);
47
+ }
48
+ }, [value]);
49
+
50
+ const handleRangeSelect = (newRange: DateRange | undefined) => {
51
+ setRange(newRange);
52
+
53
+ if (newRange?.from && newRange?.to) {
54
+ onChange?.({
55
+ from: format(newRange.from, "yyyy-MM-dd"),
56
+ to: format(newRange.to, "yyyy-MM-dd")
57
+ });
58
+ } else {
59
+ onChange?.(undefined);
60
+ }
61
+ };
62
+
63
+ const displayText = range?.from && range?.to
64
+ ? `${format(range.from, "dd/MM/yyyy")} - ${format(range.to, "dd/MM/yyyy")}`
65
+ : placeholder;
66
+
67
+ return (
68
+ <Popover open={open} onOpenChange={setOpen}>
69
+ <PopoverTrigger asChild>
70
+ <button
71
+ ref={ref}
72
+ disabled={disabled}
73
+ className={cn(
74
+ "flex items-center gap-2 px-4 h-10 border rounded-lg transition-colors w-full justify-start",
75
+ "border-gray-200 hover:border-gray-400 focus-within:border-gray-950",
76
+ "disabled:opacity-50 disabled:cursor-not-allowed",
77
+ className
78
+ )}
79
+ >
80
+ <IconCalendar size={20} className="text-gray-400" />
81
+ <span className={cn(
82
+ "paragraph-small-medium",
83
+ range?.from && range?.to ? "text-gray-950" : "text-gray-500"
84
+ )}>
85
+ {displayText}
86
+ </span>
87
+ </button>
88
+ </PopoverTrigger>
89
+ <PopoverContent
90
+ className="w-auto p-0 bg-white rounded-2xl shadow-md border border-gray-200"
91
+ align="start"
92
+ sideOffset={8}
93
+ >
94
+ <div className="p-3">
95
+ <Calendar
96
+ mode="range"
97
+ selected={range}
98
+ onSelect={handleRangeSelect}
99
+ numberOfMonths={1}
100
+ />
101
+ </div>
102
+ </PopoverContent>
103
+ </Popover>
104
+ );
105
+ }
106
+ );
107
+
108
+ DateRangePicker.displayName = "DateRangePicker";
@@ -1,7 +1,8 @@
1
1
  'use client';
2
2
 
3
3
  import { forwardRef, type ComponentPropsWithoutRef } from 'react';
4
- import { Lock, Eye, EyeOff, type LucideIcon } from 'lucide-react';
4
+ import { IconLock, IconEye, IconEyeOff } from '@tabler/icons-react';
5
+ import type { TablerIcon } from '@tabler/icons-react';
5
6
  import { Input } from './Input';
6
7
  import { cn } from '../../../infra/utils/clsx';
7
8
 
@@ -11,8 +12,8 @@ interface FormFieldProps extends Omit<ComponentPropsWithoutRef<'input'>, 'size'>
11
12
  label?: string;
12
13
  optional?: boolean;
13
14
  required?: boolean;
14
- leftIcon?: LucideIcon;
15
- rightIcon?: LucideIcon;
15
+ leftIcon?: TablerIcon;
16
+ rightIcon?: TablerIcon;
16
17
  rightIconColor?: string;
17
18
  hintMessage?: string;
18
19
  classnameContainer?: string;
@@ -51,8 +52,8 @@ export const FormField = forwardRef<HTMLInputElement, FormFieldProps>(
51
52
  const inputType = isPasswordField && showPassword ? 'text' : type;
52
53
  const containerHeight = size === 'large' ? 'h-12' : 'h-10';
53
54
 
54
- const FinalLeftIcon = isPasswordField ? Lock : LeftIcon;
55
- const FinalRightIcon = isPasswordField ? (!showPassword ? EyeOff : Eye) : RightIcon;
55
+ const FinalLeftIcon = isPasswordField ? IconLock : LeftIcon;
56
+ const FinalRightIcon = isPasswordField ? (!showPassword ? IconEyeOff : IconEye) : RightIcon;
56
57
 
57
58
  const finalMessage = error && errorMessage ? errorMessage : hintMessage;
58
59
  const messageColor = error ? 'text-red-600' : 'text-gray-600';
@@ -1,20 +1,20 @@
1
- 'use client';
2
-
3
- import * as React from "react"
4
- import { cn } from "../../../infra/utils/clsx"
5
-
6
- function Input({ className, type, ...props }: React.ComponentProps<"input">) {
7
- return (
8
- <input
9
- type={type}
10
- data-slot="input"
11
- className={cn(
12
- "outline-none disabled:opacity-50 disabled:placeholder:opacity-50",
13
- className
14
- )}
15
- {...props}
16
- />
17
- )
18
- }
19
-
20
- export { Input }
1
+ 'use client';
2
+
3
+ import * as React from "react"
4
+ import { cn } from "../../../infra/utils/clsx"
5
+
6
+ function Input({ className, type, ...props }: React.ComponentProps<"input">) {
7
+ return (
8
+ <input
9
+ type={type}
10
+ data-slot="input"
11
+ className={cn(
12
+ "outline-none disabled:opacity-50 disabled:placeholder:opacity-50",
13
+ className
14
+ )}
15
+ {...props}
16
+ />
17
+ )
18
+ }
19
+
20
+ export { Input }
@@ -1,80 +1,80 @@
1
- 'use client';
2
-
3
- "use client"
4
-
5
- import * as React from "react"
6
- import { OTPInput, OTPInputContext } from "input-otp"
7
- import { MinusIcon } from "lucide-react"
8
- import { cn } from "../../../infra/utils/clsx"
9
-
10
- function InputOTP({
11
- className,
12
- containerClassName,
13
- ...props
14
- }: React.ComponentProps<typeof OTPInput> & {
15
- containerClassName?: string
16
- }) {
17
- return (
18
- <OTPInput
19
- data-slot="input-otp"
20
- containerClassName={cn(
21
- "flex items-center gap-2 has-disabled:opacity-50",
22
- containerClassName
23
- )}
24
- className={cn("disabled:cursor-not-allowed", className)}
25
- {...props}
26
- />
27
- )
28
- }
29
-
30
- function InputOTPGroup({ className, ...props }: React.ComponentProps<"div">) {
31
- return (
32
- <div
33
- data-slot="input-otp-group"
34
- className={cn("flex items-center", className)}
35
- {...props}
36
- />
37
- )
38
- }
39
-
40
- function InputOTPSlot({
41
- index,
42
- className,
43
- ...props
44
- }: React.ComponentProps<"div"> & {
45
- index: number
46
- }) {
47
- const inputOTPContext = React.useContext(OTPInputContext)
48
- const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}
49
-
50
- return (
51
- <div
52
- data-slot="input-otp-slot"
53
- data-active={isActive}
54
- className={cn(
55
- "relative flex h-9 w-9 items-center justify-center border text-sm transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md",
56
- "border-gray-200 hover:border-gray-400 data-[active=true]:border-gray-950",
57
- "data-[active=true]:z-10",
58
- className
59
- )}
60
- {...props}
61
- >
62
- {char}
63
- {hasFakeCaret && (
64
- <div className="pointer-events-none absolute inset-0 flex items-center justify-center">
65
- <div className="animate-caret-blink bg-foreground h-4 w-px duration-1000" />
66
- </div>
67
- )}
68
- </div>
69
- )
70
- }
71
-
72
- function InputOTPSeparator({ ...props }: React.ComponentProps<"div">) {
73
- return (
74
- <div data-slot="input-otp-separator" role="separator" {...props}>
75
- <MinusIcon />
76
- </div>
77
- )
78
- }
79
-
80
- export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }
1
+ 'use client';
2
+
3
+ "use client"
4
+
5
+ import * as React from "react"
6
+ import { OTPInput, OTPInputContext } from "input-otp"
7
+ import { IconMinus } from '@tabler/icons-react'
8
+ import { cn } from "../../../infra/utils/clsx"
9
+
10
+ function InputOTP({
11
+ className,
12
+ containerClassName,
13
+ ...props
14
+ }: React.ComponentProps<typeof OTPInput> & {
15
+ containerClassName?: string
16
+ }) {
17
+ return (
18
+ <OTPInput
19
+ data-slot="input-otp"
20
+ containerClassName={cn(
21
+ "flex items-center gap-2 has-disabled:opacity-50",
22
+ containerClassName
23
+ )}
24
+ className={cn("disabled:cursor-not-allowed", className)}
25
+ {...props}
26
+ />
27
+ )
28
+ }
29
+
30
+ function InputOTPGroup({ className, ...props }: React.ComponentProps<"div">) {
31
+ return (
32
+ <div
33
+ data-slot="input-otp-group"
34
+ className={cn("flex items-center", className)}
35
+ {...props}
36
+ />
37
+ )
38
+ }
39
+
40
+ function InputOTPSlot({
41
+ index,
42
+ className,
43
+ ...props
44
+ }: React.ComponentProps<"div"> & {
45
+ index: number
46
+ }) {
47
+ const inputOTPContext = React.useContext(OTPInputContext)
48
+ const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}
49
+
50
+ return (
51
+ <div
52
+ data-slot="input-otp-slot"
53
+ data-active={isActive}
54
+ className={cn(
55
+ "relative flex h-9 w-9 items-center justify-center border text-sm transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md",
56
+ "border-gray-200 hover:border-gray-400 data-[active=true]:border-gray-950",
57
+ "data-[active=true]:z-10",
58
+ className
59
+ )}
60
+ {...props}
61
+ >
62
+ {char}
63
+ {hasFakeCaret && (
64
+ <div className="pointer-events-none absolute inset-0 flex items-center justify-center">
65
+ <div className="animate-caret-blink bg-foreground h-4 w-px duration-1000" />
66
+ </div>
67
+ )}
68
+ </div>
69
+ )
70
+ }
71
+
72
+ function InputOTPSeparator({ ...props }: React.ComponentProps<"div">) {
73
+ return (
74
+ <div data-slot="input-otp-separator" role="separator" {...props}>
75
+ <IconMinus />
76
+ </div>
77
+ )
78
+ }
79
+
80
+ export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }