@greatapps/common 1.1.155 → 1.1.157

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 (162) hide show
  1. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  2. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  3. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  4. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  5. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  6. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  7. package/dist/components/layouts/NavBar.mjs.map +1 -1
  8. package/dist/components/navigation/AppNavigation.mjs +3 -1
  9. package/dist/components/navigation/AppNavigation.mjs.map +1 -1
  10. package/dist/components/navigation/CancelledSubscriptionBanner.mjs +59 -0
  11. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -0
  12. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  13. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  14. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  15. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  16. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  17. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  18. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  19. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  20. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  21. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  22. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  23. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  24. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  25. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  26. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  27. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  28. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  29. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  30. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  31. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  32. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  33. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  34. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  35. package/dist/components/ui/form/Input.mjs.map +1 -1
  36. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  37. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  38. package/dist/components/ui/form/Select.mjs +1 -1
  39. package/dist/components/ui/form/Select.mjs.map +1 -1
  40. package/dist/components/ui/form/Switch.mjs.map +1 -1
  41. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  42. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  43. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  44. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  45. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  46. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  47. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  48. package/dist/index.mjs +2 -0
  49. package/dist/index.mjs.map +1 -1
  50. package/dist/middleware.mjs.map +1 -1
  51. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  52. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  53. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  54. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  55. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  56. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  57. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  58. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  59. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  60. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  61. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  62. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  63. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  64. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  65. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  66. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  67. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  68. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  69. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  70. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  71. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  72. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  73. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  74. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  75. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  76. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  77. package/dist/modules/whitelabel/actions/find-whitelabel-styles.action.mjs.map +1 -1
  78. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  79. package/dist/modules/whitelabel/services/whitelabel-styles.service.mjs.map +1 -1
  80. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  81. package/dist/utils/safeServerAction.mjs.map +1 -1
  82. package/dist/utils/withAction.mjs.map +1 -1
  83. package/package.json +90 -89
  84. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  85. package/src/components/account/DeleteAccountModal.tsx +130 -130
  86. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  87. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  88. package/src/components/layouts/AppMobileNavBar.tsx +125 -125
  89. package/src/components/layouts/AppNavBar.tsx +57 -57
  90. package/src/components/layouts/NavBar.tsx +112 -112
  91. package/src/components/navigation/AppNavigation.tsx +4 -1
  92. package/src/components/navigation/CancelledSubscriptionBanner.tsx +69 -0
  93. package/src/components/navigation/NavItemsContext.ts +20 -20
  94. package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
  95. package/src/components/pages/notifications/Notifications.tsx +160 -160
  96. package/src/components/ui/buttons/Button.tsx +57 -57
  97. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  98. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  99. package/src/components/ui/data-display/Accordion.tsx +81 -81
  100. package/src/components/ui/data-display/Badge.tsx +47 -47
  101. package/src/components/ui/data-display/Card.tsx +93 -93
  102. package/src/components/ui/data-display/Pagination.tsx +126 -126
  103. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  104. package/src/components/ui/data-display/Separator.tsx +29 -29
  105. package/src/components/ui/data-display/Table.tsx +117 -117
  106. package/src/components/ui/data-display/Tabs.tsx +67 -67
  107. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  108. package/src/components/ui/feedback/DefaultCircularProgress.tsx +53 -53
  109. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  110. package/src/components/ui/feedback/Progress.tsx +40 -40
  111. package/src/components/ui/feedback/Toast.tsx +101 -101
  112. package/src/components/ui/form/Calendar.tsx +228 -228
  113. package/src/components/ui/form/Checkbox.tsx +31 -31
  114. package/src/components/ui/form/DatePicker.tsx +97 -97
  115. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  116. package/src/components/ui/form/Input.tsx +20 -20
  117. package/src/components/ui/form/InputOtp.tsx +80 -80
  118. package/src/components/ui/form/RadioGroup.tsx +45 -45
  119. package/src/components/ui/form/Select.tsx +200 -200
  120. package/src/components/ui/form/Switch.tsx +32 -32
  121. package/src/components/ui/form/Textarea.tsx +19 -19
  122. package/src/components/ui/overlay/Command.tsx +185 -185
  123. package/src/components/ui/overlay/Dialog.tsx +151 -151
  124. package/src/components/ui/overlay/Popover.tsx +49 -49
  125. package/src/components/ui/overlay/Sheet.tsx +159 -159
  126. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  127. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  128. package/src/index.ts +348 -347
  129. package/src/middleware.ts +4 -4
  130. package/src/modules/accounts/actions/account-management.action.ts +90 -90
  131. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  132. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  133. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  134. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  135. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  136. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  137. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  138. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  139. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  140. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  141. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  142. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  143. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  144. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  145. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  146. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  147. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  148. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  149. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
  150. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +17 -17
  151. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  152. package/src/modules/users/action/list-messages.action.ts +12 -12
  153. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  154. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  155. package/src/modules/users/hooks/messages.hook.ts +60 -60
  156. package/src/modules/whitelabel/actions/find-whitelabel-styles.action.ts +14 -14
  157. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  158. package/src/modules/whitelabel/services/whitelabel-styles.service.ts +98 -98
  159. package/src/modules/whitelabel/styles-schema.ts +37 -37
  160. package/src/providers/whitelabel.provider.tsx +46 -46
  161. package/src/utils/safeServerAction.ts +21 -21
  162. package/src/utils/withAction.ts +13 -13
@@ -1,159 +1,159 @@
1
- "use client";
2
-
3
- import * as React from "react";
4
- import * as SheetPrimitive from "@radix-ui/react-dialog";
5
- import { XIcon } from "lucide-react";
6
- import { cn } from "../../../infra/utils/clsx";
7
-
8
- function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {
9
- return <SheetPrimitive.Root data-slot="sheet" {...props} />;
10
- }
11
-
12
- function SheetTrigger({
13
- ...props
14
- }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {
15
- return <SheetPrimitive.Trigger data-slot="sheet-trigger" {...props} />;
16
- }
17
-
18
- function SheetClose({
19
- ...props
20
- }: React.ComponentProps<typeof SheetPrimitive.Close>) {
21
- return <SheetPrimitive.Close data-slot="sheet-close" {...props} />;
22
- }
23
-
24
- function SheetPortal({
25
- ...props
26
- }: React.ComponentProps<typeof SheetPrimitive.Portal>) {
27
- return <SheetPrimitive.Portal data-slot="sheet-portal" {...props} />;
28
- }
29
-
30
- function SheetOverlay({
31
- className,
32
- ...props
33
- }: React.ComponentProps<typeof SheetPrimitive.Overlay>) {
34
- return (
35
- <SheetPrimitive.Overlay
36
- data-slot="sheet-overlay"
37
- className={cn(
38
- "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-[1000] bg-black/50",
39
- className,
40
- )}
41
- {...props}
42
- />
43
- );
44
- }
45
-
46
- function SheetContent({
47
- className,
48
- children,
49
- side = "right",
50
- showCloseButton = true,
51
- noAnimation = false,
52
- ...props
53
- }: React.ComponentProps<typeof SheetPrimitive.Content> & {
54
- side?: "top" | "right" | "bottom" | "left";
55
- showCloseButton?: boolean;
56
- noAnimation?: boolean;
57
- }) {
58
- return (
59
- <SheetPortal>
60
- <SheetOverlay className={noAnimation ? "!animate-none" : undefined} />
61
- <SheetPrimitive.Content
62
- data-slot="sheet-content"
63
- className={cn(
64
- "bg-background fixed z-[1001] flex flex-col gap-4 shadow-lg",
65
- !noAnimation &&
66
- "data-[state=open]:animate-in data-[state=closed]:animate-out transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
67
- !noAnimation &&
68
- side === "right" &&
69
- "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right",
70
- !noAnimation &&
71
- side === "left" &&
72
- "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left",
73
- !noAnimation &&
74
- side === "top" &&
75
- "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
76
- !noAnimation &&
77
- side === "bottom" &&
78
- "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
79
- side === "right" &&
80
- "inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm",
81
- side === "left" &&
82
- "inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",
83
- side === "top" && "inset-x-0 top-0 h-auto border-b",
84
- side === "bottom" && "inset-x-0 bottom-0 h-auto border-t",
85
- className,
86
- )}
87
- {...props}
88
- >
89
- {children}
90
- {showCloseButton && (
91
- <SheetPrimitive.Close
92
- data-slot="sheet-close"
93
- className="absolute top-3 right-3 hover:cursor-pointer flex size-8 items-center justify-center rounded-lg p-2 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-950 focus:outline-none"
94
- >
95
- <XIcon className="size-[18px]" />
96
- <span className="sr-only">Close</span>
97
- </SheetPrimitive.Close>
98
- )}
99
- </SheetPrimitive.Content>
100
- </SheetPortal>
101
- );
102
- }
103
-
104
- function SheetHeader({ className, ...props }: React.ComponentProps<"div">) {
105
- return (
106
- <div
107
- data-slot="sheet-header"
108
- className={cn("flex flex-col gap-1.5 p-4", className)}
109
- {...props}
110
- />
111
- );
112
- }
113
-
114
- function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
115
- return (
116
- <div
117
- data-slot="sheet-footer"
118
- className={cn("mt-auto flex flex-col gap-2 p-4", className)}
119
- {...props}
120
- />
121
- );
122
- }
123
-
124
- function SheetTitle({
125
- className,
126
- ...props
127
- }: React.ComponentProps<typeof SheetPrimitive.Title>) {
128
- return (
129
- <SheetPrimitive.Title
130
- data-slot="sheet-title"
131
- className={cn("text-foreground font-semibold", className)}
132
- {...props}
133
- />
134
- );
135
- }
136
-
137
- function SheetDescription({
138
- className,
139
- ...props
140
- }: React.ComponentProps<typeof SheetPrimitive.Description>) {
141
- return (
142
- <SheetPrimitive.Description
143
- data-slot="sheet-description"
144
- className={cn("text-muted-foreground text-sm", className)}
145
- {...props}
146
- />
147
- );
148
- }
149
-
150
- export {
151
- Sheet,
152
- SheetTrigger,
153
- SheetClose,
154
- SheetContent,
155
- SheetHeader,
156
- SheetFooter,
157
- SheetTitle,
158
- SheetDescription,
159
- };
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import * as SheetPrimitive from "@radix-ui/react-dialog";
5
+ import { XIcon } from "lucide-react";
6
+ import { cn } from "../../../infra/utils/clsx";
7
+
8
+ function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {
9
+ return <SheetPrimitive.Root data-slot="sheet" {...props} />;
10
+ }
11
+
12
+ function SheetTrigger({
13
+ ...props
14
+ }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {
15
+ return <SheetPrimitive.Trigger data-slot="sheet-trigger" {...props} />;
16
+ }
17
+
18
+ function SheetClose({
19
+ ...props
20
+ }: React.ComponentProps<typeof SheetPrimitive.Close>) {
21
+ return <SheetPrimitive.Close data-slot="sheet-close" {...props} />;
22
+ }
23
+
24
+ function SheetPortal({
25
+ ...props
26
+ }: React.ComponentProps<typeof SheetPrimitive.Portal>) {
27
+ return <SheetPrimitive.Portal data-slot="sheet-portal" {...props} />;
28
+ }
29
+
30
+ function SheetOverlay({
31
+ className,
32
+ ...props
33
+ }: React.ComponentProps<typeof SheetPrimitive.Overlay>) {
34
+ return (
35
+ <SheetPrimitive.Overlay
36
+ data-slot="sheet-overlay"
37
+ className={cn(
38
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-[1000] bg-black/50",
39
+ className,
40
+ )}
41
+ {...props}
42
+ />
43
+ );
44
+ }
45
+
46
+ function SheetContent({
47
+ className,
48
+ children,
49
+ side = "right",
50
+ showCloseButton = true,
51
+ noAnimation = false,
52
+ ...props
53
+ }: React.ComponentProps<typeof SheetPrimitive.Content> & {
54
+ side?: "top" | "right" | "bottom" | "left";
55
+ showCloseButton?: boolean;
56
+ noAnimation?: boolean;
57
+ }) {
58
+ return (
59
+ <SheetPortal>
60
+ <SheetOverlay className={noAnimation ? "!animate-none" : undefined} />
61
+ <SheetPrimitive.Content
62
+ data-slot="sheet-content"
63
+ className={cn(
64
+ "bg-background fixed z-[1001] flex flex-col gap-4 shadow-lg",
65
+ !noAnimation &&
66
+ "data-[state=open]:animate-in data-[state=closed]:animate-out transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
67
+ !noAnimation &&
68
+ side === "right" &&
69
+ "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right",
70
+ !noAnimation &&
71
+ side === "left" &&
72
+ "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left",
73
+ !noAnimation &&
74
+ side === "top" &&
75
+ "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
76
+ !noAnimation &&
77
+ side === "bottom" &&
78
+ "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
79
+ side === "right" &&
80
+ "inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm",
81
+ side === "left" &&
82
+ "inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",
83
+ side === "top" && "inset-x-0 top-0 h-auto border-b",
84
+ side === "bottom" && "inset-x-0 bottom-0 h-auto border-t",
85
+ className,
86
+ )}
87
+ {...props}
88
+ >
89
+ {children}
90
+ {showCloseButton && (
91
+ <SheetPrimitive.Close
92
+ data-slot="sheet-close"
93
+ className="absolute top-3 right-3 hover:cursor-pointer flex size-8 items-center justify-center rounded-lg p-2 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-950 focus:outline-none"
94
+ >
95
+ <XIcon className="size-[18px]" />
96
+ <span className="sr-only">Close</span>
97
+ </SheetPrimitive.Close>
98
+ )}
99
+ </SheetPrimitive.Content>
100
+ </SheetPortal>
101
+ );
102
+ }
103
+
104
+ function SheetHeader({ className, ...props }: React.ComponentProps<"div">) {
105
+ return (
106
+ <div
107
+ data-slot="sheet-header"
108
+ className={cn("flex flex-col gap-1.5 p-4", className)}
109
+ {...props}
110
+ />
111
+ );
112
+ }
113
+
114
+ function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
115
+ return (
116
+ <div
117
+ data-slot="sheet-footer"
118
+ className={cn("mt-auto flex flex-col gap-2 p-4", className)}
119
+ {...props}
120
+ />
121
+ );
122
+ }
123
+
124
+ function SheetTitle({
125
+ className,
126
+ ...props
127
+ }: React.ComponentProps<typeof SheetPrimitive.Title>) {
128
+ return (
129
+ <SheetPrimitive.Title
130
+ data-slot="sheet-title"
131
+ className={cn("text-foreground font-semibold", className)}
132
+ {...props}
133
+ />
134
+ );
135
+ }
136
+
137
+ function SheetDescription({
138
+ className,
139
+ ...props
140
+ }: React.ComponentProps<typeof SheetPrimitive.Description>) {
141
+ return (
142
+ <SheetPrimitive.Description
143
+ data-slot="sheet-description"
144
+ className={cn("text-muted-foreground text-sm", className)}
145
+ {...props}
146
+ />
147
+ );
148
+ }
149
+
150
+ export {
151
+ Sheet,
152
+ SheetTrigger,
153
+ SheetClose,
154
+ SheetContent,
155
+ SheetHeader,
156
+ SheetFooter,
157
+ SheetTitle,
158
+ SheetDescription,
159
+ };
@@ -1,62 +1,62 @@
1
- 'use client';
2
-
3
- "use client"
4
-
5
- import * as React from "react"
6
- import * as TooltipPrimitive from "@radix-ui/react-tooltip"
7
- import { cn } from "../../../infra/utils/clsx"
8
-
9
- function TooltipProvider({
10
- delayDuration = 0,
11
- ...props
12
- }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
13
- return (
14
- <TooltipPrimitive.Provider
15
- data-slot="tooltip-provider"
16
- delayDuration={delayDuration}
17
- {...props}
18
- />
19
- )
20
- }
21
-
22
- function Tooltip({
23
- ...props
24
- }: React.ComponentProps<typeof TooltipPrimitive.Root>) {
25
- return (
26
- <TooltipProvider>
27
- <TooltipPrimitive.Root data-slot="tooltip" {...props} />
28
- </TooltipProvider>
29
- )
30
- }
31
-
32
- function TooltipTrigger({
33
- ...props
34
- }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
35
- return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
36
- }
37
-
38
- function TooltipContent({
39
- className,
40
- sideOffset = 0,
41
- children,
42
- ...props
43
- }: React.ComponentProps<typeof TooltipPrimitive.Content>) {
44
- return (
45
- <TooltipPrimitive.Portal>
46
- <TooltipPrimitive.Content
47
- data-slot="tooltip-content"
48
- sideOffset={sideOffset}
49
- className={cn(
50
- "bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
51
- className
52
- )}
53
- {...props}
54
- >
55
- {children}
56
- <TooltipPrimitive.Arrow className="bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]" />
57
- </TooltipPrimitive.Content>
58
- </TooltipPrimitive.Portal>
59
- )
60
- }
61
-
62
- export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
1
+ 'use client';
2
+
3
+ "use client"
4
+
5
+ import * as React from "react"
6
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip"
7
+ import { cn } from "../../../infra/utils/clsx"
8
+
9
+ function TooltipProvider({
10
+ delayDuration = 0,
11
+ ...props
12
+ }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
13
+ return (
14
+ <TooltipPrimitive.Provider
15
+ data-slot="tooltip-provider"
16
+ delayDuration={delayDuration}
17
+ {...props}
18
+ />
19
+ )
20
+ }
21
+
22
+ function Tooltip({
23
+ ...props
24
+ }: React.ComponentProps<typeof TooltipPrimitive.Root>) {
25
+ return (
26
+ <TooltipProvider>
27
+ <TooltipPrimitive.Root data-slot="tooltip" {...props} />
28
+ </TooltipProvider>
29
+ )
30
+ }
31
+
32
+ function TooltipTrigger({
33
+ ...props
34
+ }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
35
+ return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
36
+ }
37
+
38
+ function TooltipContent({
39
+ className,
40
+ sideOffset = 0,
41
+ children,
42
+ ...props
43
+ }: React.ComponentProps<typeof TooltipPrimitive.Content>) {
44
+ return (
45
+ <TooltipPrimitive.Portal>
46
+ <TooltipPrimitive.Content
47
+ data-slot="tooltip-content"
48
+ sideOffset={sideOffset}
49
+ className={cn(
50
+ "bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
51
+ className
52
+ )}
53
+ {...props}
54
+ >
55
+ {children}
56
+ <TooltipPrimitive.Arrow className="bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]" />
57
+ </TooltipPrimitive.Content>
58
+ </TooltipPrimitive.Portal>
59
+ )
60
+ }
61
+
62
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
@@ -1,67 +1,67 @@
1
- 'use client';
2
-
3
- import { useState, useCallback, useRef, useEffect } from "react";
4
-
5
- interface UseCopyToClipboardOptions {
6
- feedbackDuration?: number;
7
- onSuccess?: () => void;
8
- onError?: (error: Error) => void;
9
- }
10
-
11
- interface UseCopyToClipboardReturn {
12
- isCopied: boolean;
13
- copy: (text: string) => Promise<void>;
14
- }
15
-
16
- export default function useCopyToClipboard({
17
- feedbackDuration = 2000,
18
- onSuccess,
19
- onError,
20
- }: UseCopyToClipboardOptions = {}): UseCopyToClipboardReturn {
21
- const [isCopied, setIsCopied] = useState(false);
22
- const timeoutRef = useRef<NodeJS.Timeout | null>(null);
23
-
24
- useEffect(() => {
25
- return () => {
26
- if (timeoutRef.current) {
27
- clearTimeout(timeoutRef.current);
28
- }
29
- };
30
- }, []);
31
-
32
- const copy = useCallback(
33
- async (text: string) => {
34
- if (timeoutRef.current) {
35
- clearTimeout(timeoutRef.current);
36
- }
37
-
38
- try {
39
- if (navigator.clipboard?.writeText) {
40
- await navigator.clipboard.writeText(text);
41
- } else {
42
- const textarea = document.createElement("textarea");
43
- textarea.value = text;
44
- textarea.style.cssText = "position:fixed;top:-9999px;left:-9999px;opacity:0";
45
- document.body.appendChild(textarea);
46
- textarea.focus();
47
- textarea.select();
48
- const success = document.execCommand("copy");
49
- document.body.removeChild(textarea);
50
- if (!success) throw new Error("execCommand copy failed");
51
- }
52
-
53
- setIsCopied(true);
54
- onSuccess?.();
55
-
56
- timeoutRef.current = setTimeout(() => {
57
- setIsCopied(false);
58
- }, feedbackDuration);
59
- } catch (error) {
60
- onError?.(error instanceof Error ? error : new Error("Failed to copy"));
61
- }
62
- },
63
- [feedbackDuration, onSuccess, onError],
64
- );
65
-
66
- return { isCopied, copy };
67
- }
1
+ 'use client';
2
+
3
+ import { useState, useCallback, useRef, useEffect } from "react";
4
+
5
+ interface UseCopyToClipboardOptions {
6
+ feedbackDuration?: number;
7
+ onSuccess?: () => void;
8
+ onError?: (error: Error) => void;
9
+ }
10
+
11
+ interface UseCopyToClipboardReturn {
12
+ isCopied: boolean;
13
+ copy: (text: string) => Promise<void>;
14
+ }
15
+
16
+ export default function useCopyToClipboard({
17
+ feedbackDuration = 2000,
18
+ onSuccess,
19
+ onError,
20
+ }: UseCopyToClipboardOptions = {}): UseCopyToClipboardReturn {
21
+ const [isCopied, setIsCopied] = useState(false);
22
+ const timeoutRef = useRef<NodeJS.Timeout | null>(null);
23
+
24
+ useEffect(() => {
25
+ return () => {
26
+ if (timeoutRef.current) {
27
+ clearTimeout(timeoutRef.current);
28
+ }
29
+ };
30
+ }, []);
31
+
32
+ const copy = useCallback(
33
+ async (text: string) => {
34
+ if (timeoutRef.current) {
35
+ clearTimeout(timeoutRef.current);
36
+ }
37
+
38
+ try {
39
+ if (navigator.clipboard?.writeText) {
40
+ await navigator.clipboard.writeText(text);
41
+ } else {
42
+ const textarea = document.createElement("textarea");
43
+ textarea.value = text;
44
+ textarea.style.cssText = "position:fixed;top:-9999px;left:-9999px;opacity:0";
45
+ document.body.appendChild(textarea);
46
+ textarea.focus();
47
+ textarea.select();
48
+ const success = document.execCommand("copy");
49
+ document.body.removeChild(textarea);
50
+ if (!success) throw new Error("execCommand copy failed");
51
+ }
52
+
53
+ setIsCopied(true);
54
+ onSuccess?.();
55
+
56
+ timeoutRef.current = setTimeout(() => {
57
+ setIsCopied(false);
58
+ }, feedbackDuration);
59
+ } catch (error) {
60
+ onError?.(error instanceof Error ? error : new Error("Failed to copy"));
61
+ }
62
+ },
63
+ [feedbackDuration, onSuccess, onError],
64
+ );
65
+
66
+ return { isCopied, copy };
67
+ }