@greatapps/common 1.1.215 → 1.1.217
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.
- package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
- package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
- package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
- package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
- package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
- package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
- package/dist/components/layouts/AppNavBar.mjs.map +1 -1
- package/dist/components/layouts/NavBar.mjs.map +1 -1
- package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
- package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
- package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
- package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
- package/dist/components/pages/notifications/Notifications.mjs +3 -3
- package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
- package/dist/components/ui/buttons/Button.mjs.map +1 -1
- package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
- package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
- package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
- package/dist/components/ui/data-display/Badge.mjs.map +1 -1
- package/dist/components/ui/data-display/Card.mjs.map +1 -1
- package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
- package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
- package/dist/components/ui/data-display/Separator.mjs.map +1 -1
- package/dist/components/ui/data-display/Table.mjs.map +1 -1
- package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
- package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
- package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
- package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
- package/dist/components/ui/feedback/Progress.mjs.map +1 -1
- package/dist/components/ui/feedback/Toast.mjs.map +1 -1
- package/dist/components/ui/form/Calendar.mjs.map +1 -1
- package/dist/components/ui/form/Checkbox.mjs.map +1 -1
- package/dist/components/ui/form/DatePicker.mjs.map +1 -1
- package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
- package/dist/components/ui/form/Input.mjs.map +1 -1
- package/dist/components/ui/form/InputOtp.mjs.map +1 -1
- package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
- package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
- package/dist/components/ui/form/Select.mjs +1 -1
- package/dist/components/ui/form/Select.mjs.map +1 -1
- package/dist/components/ui/form/Switch.mjs.map +1 -1
- package/dist/components/ui/form/Textarea.mjs.map +1 -1
- package/dist/components/ui/overlay/Command.mjs.map +1 -1
- package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
- package/dist/components/ui/overlay/Popover.mjs.map +1 -1
- package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
- package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
- package/dist/components/widgets/notifications/NotificationCard.mjs +1 -1
- package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
- package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/middleware.mjs.map +1 -1
- package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
- package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
- package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
- package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
- package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
- package/dist/modules/accounts/services/account.service.mjs.map +1 -1
- package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
- package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
- package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
- package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
- package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
- package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
- package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
- package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
- package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
- package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
- package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
- package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
- package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
- package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
- package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
- package/dist/modules/whitelabel/actions/find-whitelabel-styles.action.mjs.map +1 -1
- package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
- package/dist/modules/whitelabel/services/whitelabel-styles.service.mjs.map +1 -1
- package/dist/providers/whitelabel.provider.mjs.map +1 -1
- package/dist/utils/countries.mjs.map +1 -1
- package/dist/utils/safeServerAction.mjs.map +1 -1
- package/dist/utils/withAction.mjs.map +1 -1
- package/package.json +90 -90
- package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
- package/src/components/account/DeleteAccountModal.tsx +130 -130
- package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
- package/src/components/account/hooks/useChangePhoneForm.tsx +81 -81
- package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
- package/src/components/account/sections/ChangePhoneModal.tsx +231 -231
- package/src/components/embeds/CrispEmbed.tsx +101 -101
- package/src/components/embeds/FrillEmbed.tsx +119 -119
- package/src/components/layouts/AppMobileNavBar.tsx +111 -111
- package/src/components/layouts/AppNavBar.tsx +57 -57
- package/src/components/layouts/NavBar.tsx +120 -120
- package/src/components/layouts/UsersSelectorPopover.tsx +238 -238
- package/src/components/navigation/CancelledSubscriptionBanner.tsx +69 -69
- package/src/components/navigation/NavItemsContext.ts +20 -20
- package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
- package/src/components/pages/notifications/Notifications.tsx +160 -160
- package/src/components/ui/buttons/Button.tsx +57 -57
- package/src/components/ui/buttons/CancelButton.tsx +14 -14
- package/src/components/ui/buttons/CopyButton.tsx +54 -54
- package/src/components/ui/data-display/Accordion.tsx +81 -81
- package/src/components/ui/data-display/Badge.tsx +47 -47
- package/src/components/ui/data-display/Card.tsx +93 -93
- package/src/components/ui/data-display/Pagination.tsx +126 -126
- package/src/components/ui/data-display/ScrollArea.tsx +59 -59
- package/src/components/ui/data-display/Separator.tsx +29 -29
- package/src/components/ui/data-display/Table.tsx +117 -117
- package/src/components/ui/data-display/Tabs.tsx +67 -67
- package/src/components/ui/feedback/CircularProgress.tsx +75 -75
- package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
- package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
- package/src/components/ui/feedback/Progress.tsx +40 -40
- package/src/components/ui/feedback/Toast.tsx +101 -101
- package/src/components/ui/form/Calendar.tsx +228 -228
- package/src/components/ui/form/Checkbox.tsx +31 -31
- package/src/components/ui/form/DatePicker.tsx +97 -97
- package/src/components/ui/form/DateRangePicker.tsx +108 -108
- package/src/components/ui/form/Input.tsx +20 -20
- package/src/components/ui/form/InputOtp.tsx +80 -80
- package/src/components/ui/form/PhoneInput.tsx +205 -205
- package/src/components/ui/form/RadioGroup.tsx +45 -45
- package/src/components/ui/form/Select.tsx +200 -200
- package/src/components/ui/form/Switch.tsx +32 -32
- package/src/components/ui/form/Textarea.tsx +19 -19
- package/src/components/ui/overlay/Command.tsx +185 -185
- package/src/components/ui/overlay/Dialog.tsx +151 -151
- package/src/components/ui/overlay/Popover.tsx +49 -49
- package/src/components/ui/overlay/Sheet.tsx +166 -166
- package/src/components/ui/overlay/Tooltip.tsx +62 -62
- package/src/components/widgets/notifications/NotificationCard.tsx +1 -1
- package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
- package/src/index.ts +355 -355
- package/src/middleware.ts +4 -4
- package/src/modules/accounts/actions/account-management.action.ts +90 -90
- package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
- package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
- package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
- package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
- package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
- package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
- package/src/modules/accounts/hooks/useTimezones.ts +15 -15
- package/src/modules/accounts/services/account.service.ts +236 -236
- package/src/modules/accounts/types.ts +214 -214
- package/src/modules/auth/hooks/login.hook.tsx +13 -13
- package/src/modules/auth/hooks/logout.hook.tsx +11 -11
- package/src/modules/auth/hooks/register.hook.tsx +11 -11
- package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
- package/src/modules/projects/actions/add-project-user.action.ts +9 -9
- package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
- package/src/modules/projects/actions/list-available-users.action.ts +9 -9
- package/src/modules/projects/actions/list-project-users.action.ts +9 -9
- package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
- package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
- package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
- package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
- package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
- package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
- package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
- package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
- package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +17 -17
- package/src/modules/users/action/find-user-by-id.action.ts +8 -8
- package/src/modules/users/action/list-messages.action.ts +12 -12
- package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
- package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
- package/src/modules/users/hooks/messages.hook.ts +60 -60
- package/src/modules/whitelabel/actions/find-whitelabel-styles.action.ts +14 -14
- package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
- package/src/modules/whitelabel/services/whitelabel-styles.service.ts +98 -98
- package/src/modules/whitelabel/styles-schema.ts +37 -37
- package/src/providers/whitelabel.provider.tsx +46 -46
- package/src/utils/countries.ts +224 -224
- package/src/utils/safeServerAction.ts +21 -21
- package/src/utils/withAction.ts +13 -13
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
"use client"
|
|
4
|
-
|
|
5
|
-
import * as React from "react"
|
|
6
|
-
import * as TabsPrimitive from "@radix-ui/react-tabs"
|
|
7
|
-
import { cn } from "../../../infra/utils/clsx"
|
|
8
|
-
|
|
9
|
-
function Tabs({
|
|
10
|
-
className,
|
|
11
|
-
...props
|
|
12
|
-
}: React.ComponentProps<typeof TabsPrimitive.Root>) {
|
|
13
|
-
return (
|
|
14
|
-
<TabsPrimitive.Root
|
|
15
|
-
data-slot="tabs"
|
|
16
|
-
className={cn("flex flex-col gap-2", className)}
|
|
17
|
-
{...props}
|
|
18
|
-
/>
|
|
19
|
-
)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function TabsList({
|
|
23
|
-
className,
|
|
24
|
-
...props
|
|
25
|
-
}: React.ComponentProps<typeof TabsPrimitive.List>) {
|
|
26
|
-
return (
|
|
27
|
-
<TabsPrimitive.List
|
|
28
|
-
data-slot="tabs-list"
|
|
29
|
-
className={cn(
|
|
30
|
-
"inline-flex w-full items-center justify-start border-b border-gray-200",
|
|
31
|
-
className
|
|
32
|
-
)}
|
|
33
|
-
{...props}
|
|
34
|
-
/>
|
|
35
|
-
)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function TabsTrigger({
|
|
39
|
-
className,
|
|
40
|
-
...props
|
|
41
|
-
}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {
|
|
42
|
-
return (
|
|
43
|
-
<TabsPrimitive.Trigger
|
|
44
|
-
data-slot="tabs-trigger"
|
|
45
|
-
className={cn(
|
|
46
|
-
"inline-flex items-center justify-center whitespace-nowrap px-4 py-3 text-sm font-medium text-gray-500 transition-all border-b-2 border-transparent hover:text-gray-900 cursor-pointer data-[state=active]:text-gray-950 data-[state=active]:border-gray-950 disabled:pointer-events-none disabled:opacity-50",
|
|
47
|
-
className
|
|
48
|
-
)}
|
|
49
|
-
{...props}
|
|
50
|
-
/>
|
|
51
|
-
)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function TabsContent({
|
|
55
|
-
className,
|
|
56
|
-
...props
|
|
57
|
-
}: React.ComponentProps<typeof TabsPrimitive.Content>) {
|
|
58
|
-
return (
|
|
59
|
-
<TabsPrimitive.Content
|
|
60
|
-
data-slot="tabs-content"
|
|
61
|
-
className={cn("flex-1 outline-none", className)}
|
|
62
|
-
{...props}
|
|
63
|
-
/>
|
|
64
|
-
)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export { Tabs, TabsList, TabsTrigger, TabsContent }
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
"use client"
|
|
4
|
+
|
|
5
|
+
import * as React from "react"
|
|
6
|
+
import * as TabsPrimitive from "@radix-ui/react-tabs"
|
|
7
|
+
import { cn } from "../../../infra/utils/clsx"
|
|
8
|
+
|
|
9
|
+
function Tabs({
|
|
10
|
+
className,
|
|
11
|
+
...props
|
|
12
|
+
}: React.ComponentProps<typeof TabsPrimitive.Root>) {
|
|
13
|
+
return (
|
|
14
|
+
<TabsPrimitive.Root
|
|
15
|
+
data-slot="tabs"
|
|
16
|
+
className={cn("flex flex-col gap-2", className)}
|
|
17
|
+
{...props}
|
|
18
|
+
/>
|
|
19
|
+
)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function TabsList({
|
|
23
|
+
className,
|
|
24
|
+
...props
|
|
25
|
+
}: React.ComponentProps<typeof TabsPrimitive.List>) {
|
|
26
|
+
return (
|
|
27
|
+
<TabsPrimitive.List
|
|
28
|
+
data-slot="tabs-list"
|
|
29
|
+
className={cn(
|
|
30
|
+
"inline-flex w-full items-center justify-start border-b border-gray-200",
|
|
31
|
+
className
|
|
32
|
+
)}
|
|
33
|
+
{...props}
|
|
34
|
+
/>
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function TabsTrigger({
|
|
39
|
+
className,
|
|
40
|
+
...props
|
|
41
|
+
}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {
|
|
42
|
+
return (
|
|
43
|
+
<TabsPrimitive.Trigger
|
|
44
|
+
data-slot="tabs-trigger"
|
|
45
|
+
className={cn(
|
|
46
|
+
"inline-flex items-center justify-center whitespace-nowrap px-4 py-3 text-sm font-medium text-gray-500 transition-all border-b-2 border-transparent hover:text-gray-900 cursor-pointer data-[state=active]:text-gray-950 data-[state=active]:border-gray-950 disabled:pointer-events-none disabled:opacity-50",
|
|
47
|
+
className
|
|
48
|
+
)}
|
|
49
|
+
{...props}
|
|
50
|
+
/>
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function TabsContent({
|
|
55
|
+
className,
|
|
56
|
+
...props
|
|
57
|
+
}: React.ComponentProps<typeof TabsPrimitive.Content>) {
|
|
58
|
+
return (
|
|
59
|
+
<TabsPrimitive.Content
|
|
60
|
+
data-slot="tabs-content"
|
|
61
|
+
className={cn("flex-1 outline-none", className)}
|
|
62
|
+
{...props}
|
|
63
|
+
/>
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export { Tabs, TabsList, TabsTrigger, TabsContent }
|
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
import { ReactNode } from "react";
|
|
2
|
-
import {
|
|
3
|
-
calculateRadius,
|
|
4
|
-
calculateCircumference,
|
|
5
|
-
calculatePercentage,
|
|
6
|
-
calculateCircularProgressOffset,
|
|
7
|
-
} from "../../../infra/utils/percentage";
|
|
8
|
-
|
|
9
|
-
interface CircularProgressProps {
|
|
10
|
-
current: number;
|
|
11
|
-
total: number;
|
|
12
|
-
size?: number;
|
|
13
|
-
strokeWidth?: number;
|
|
14
|
-
children?: ReactNode;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export default function CircularProgress({
|
|
18
|
-
current,
|
|
19
|
-
total,
|
|
20
|
-
size = 62,
|
|
21
|
-
strokeWidth = 3,
|
|
22
|
-
children,
|
|
23
|
-
}: CircularProgressProps) {
|
|
24
|
-
const radius = calculateRadius(size, strokeWidth);
|
|
25
|
-
const circumference = calculateCircumference(radius);
|
|
26
|
-
const percentage = calculatePercentage(current, total);
|
|
27
|
-
const offset = calculateCircularProgressOffset(percentage, circumference);
|
|
28
|
-
|
|
29
|
-
return (
|
|
30
|
-
<div
|
|
31
|
-
className="relative flex items-center justify-center"
|
|
32
|
-
style={{ width: size, height: size }}
|
|
33
|
-
role="progressbar"
|
|
34
|
-
aria-valuenow={current}
|
|
35
|
-
aria-valuemin={0}
|
|
36
|
-
aria-valuemax={total}
|
|
37
|
-
aria-label="Progresso"
|
|
38
|
-
>
|
|
39
|
-
<svg width={size} height={size} className="absolute">
|
|
40
|
-
<circle
|
|
41
|
-
cx={size / 2}
|
|
42
|
-
cy={size / 2}
|
|
43
|
-
r={radius}
|
|
44
|
-
stroke="var(--color-gray-50)"
|
|
45
|
-
strokeWidth={strokeWidth}
|
|
46
|
-
fill="white"
|
|
47
|
-
/>
|
|
48
|
-
|
|
49
|
-
<circle
|
|
50
|
-
cx={size / 2}
|
|
51
|
-
cy={size / 2}
|
|
52
|
-
r={radius}
|
|
53
|
-
stroke="var(--color-gray-950)"
|
|
54
|
-
strokeWidth={strokeWidth}
|
|
55
|
-
fill="none"
|
|
56
|
-
strokeDasharray={circumference}
|
|
57
|
-
strokeDashoffset={offset}
|
|
58
|
-
strokeLinecap="round"
|
|
59
|
-
transform={`rotate(-90 ${size / 2} ${size / 2})`}
|
|
60
|
-
className="transition-all duration-300 ease-in-out"
|
|
61
|
-
/>
|
|
62
|
-
</svg>
|
|
63
|
-
|
|
64
|
-
<div className="relative z-10 flex items-center justify-center w-[50px] h-[50px] rounded-full bg-gray-50 paragraph-small-semibold">
|
|
65
|
-
{children ?? (
|
|
66
|
-
<>
|
|
67
|
-
<span className="text-gray-600">{current}</span>
|
|
68
|
-
<span className="text-gray-500">/</span>
|
|
69
|
-
<span className="text-gray-600">{total}</span>
|
|
70
|
-
</>
|
|
71
|
-
)}
|
|
72
|
-
</div>
|
|
73
|
-
</div>
|
|
74
|
-
);
|
|
75
|
-
}
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import {
|
|
3
|
+
calculateRadius,
|
|
4
|
+
calculateCircumference,
|
|
5
|
+
calculatePercentage,
|
|
6
|
+
calculateCircularProgressOffset,
|
|
7
|
+
} from "../../../infra/utils/percentage";
|
|
8
|
+
|
|
9
|
+
interface CircularProgressProps {
|
|
10
|
+
current: number;
|
|
11
|
+
total: number;
|
|
12
|
+
size?: number;
|
|
13
|
+
strokeWidth?: number;
|
|
14
|
+
children?: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default function CircularProgress({
|
|
18
|
+
current,
|
|
19
|
+
total,
|
|
20
|
+
size = 62,
|
|
21
|
+
strokeWidth = 3,
|
|
22
|
+
children,
|
|
23
|
+
}: CircularProgressProps) {
|
|
24
|
+
const radius = calculateRadius(size, strokeWidth);
|
|
25
|
+
const circumference = calculateCircumference(radius);
|
|
26
|
+
const percentage = calculatePercentage(current, total);
|
|
27
|
+
const offset = calculateCircularProgressOffset(percentage, circumference);
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<div
|
|
31
|
+
className="relative flex items-center justify-center"
|
|
32
|
+
style={{ width: size, height: size }}
|
|
33
|
+
role="progressbar"
|
|
34
|
+
aria-valuenow={current}
|
|
35
|
+
aria-valuemin={0}
|
|
36
|
+
aria-valuemax={total}
|
|
37
|
+
aria-label="Progresso"
|
|
38
|
+
>
|
|
39
|
+
<svg width={size} height={size} className="absolute">
|
|
40
|
+
<circle
|
|
41
|
+
cx={size / 2}
|
|
42
|
+
cy={size / 2}
|
|
43
|
+
r={radius}
|
|
44
|
+
stroke="var(--color-gray-50)"
|
|
45
|
+
strokeWidth={strokeWidth}
|
|
46
|
+
fill="white"
|
|
47
|
+
/>
|
|
48
|
+
|
|
49
|
+
<circle
|
|
50
|
+
cx={size / 2}
|
|
51
|
+
cy={size / 2}
|
|
52
|
+
r={radius}
|
|
53
|
+
stroke="var(--color-gray-950)"
|
|
54
|
+
strokeWidth={strokeWidth}
|
|
55
|
+
fill="none"
|
|
56
|
+
strokeDasharray={circumference}
|
|
57
|
+
strokeDashoffset={offset}
|
|
58
|
+
strokeLinecap="round"
|
|
59
|
+
transform={`rotate(-90 ${size / 2} ${size / 2})`}
|
|
60
|
+
className="transition-all duration-300 ease-in-out"
|
|
61
|
+
/>
|
|
62
|
+
</svg>
|
|
63
|
+
|
|
64
|
+
<div className="relative z-10 flex items-center justify-center w-[50px] h-[50px] rounded-full bg-gray-50 paragraph-small-semibold">
|
|
65
|
+
{children ?? (
|
|
66
|
+
<>
|
|
67
|
+
<span className="text-gray-600">{current}</span>
|
|
68
|
+
<span className="text-gray-500">/</span>
|
|
69
|
+
<span className="text-gray-600">{total}</span>
|
|
70
|
+
</>
|
|
71
|
+
)}
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
import {
|
|
2
|
-
calculateRadius,
|
|
3
|
-
calculateCircumference,
|
|
4
|
-
calculatePercentage,
|
|
5
|
-
calculateCircularProgressOffset,
|
|
6
|
-
} from "../../../infra/utils/percentage";
|
|
7
|
-
|
|
8
|
-
interface CircularProgressProps {
|
|
9
|
-
current: number;
|
|
10
|
-
total: number;
|
|
11
|
-
size?: number;
|
|
12
|
-
strokeWidth?: number;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export default function DefaultCircularProgress({
|
|
16
|
-
current,
|
|
17
|
-
total,
|
|
18
|
-
size = 62,
|
|
19
|
-
strokeWidth = 3,
|
|
20
|
-
}: CircularProgressProps) {
|
|
21
|
-
const radius = calculateRadius(size, strokeWidth);
|
|
22
|
-
const circumference = calculateCircumference(radius);
|
|
23
|
-
const percentage = calculatePercentage(current, total);
|
|
24
|
-
const offset = calculateCircularProgressOffset(percentage, circumference);
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<div
|
|
28
|
-
className="relative flex items-center justify-center"
|
|
29
|
-
style={{ width: size, height: size }}
|
|
30
|
-
role="progressbar"
|
|
31
|
-
aria-valuenow={current}
|
|
32
|
-
aria-valuemin={0}
|
|
33
|
-
aria-valuemax={total}
|
|
34
|
-
aria-label="Progresso de exportação"
|
|
35
|
-
>
|
|
36
|
-
<svg width={size} height={size} className="absolute">
|
|
37
|
-
<circle
|
|
38
|
-
cx={size / 2}
|
|
39
|
-
cy={size / 2}
|
|
40
|
-
r={radius}
|
|
41
|
-
stroke="var(--color-zinc-200)"
|
|
42
|
-
strokeWidth={strokeWidth}
|
|
43
|
-
fill="none"
|
|
44
|
-
/>
|
|
45
|
-
<circle
|
|
46
|
-
cx={size / 2}
|
|
47
|
-
cy={size / 2}
|
|
48
|
-
r={radius}
|
|
49
|
-
stroke="var(--color-cyan-300)"
|
|
50
|
-
strokeWidth={strokeWidth}
|
|
51
|
-
fill="none"
|
|
52
|
-
strokeDasharray={circumference}
|
|
53
|
-
strokeDashoffset={offset}
|
|
54
|
-
strokeLinecap="round"
|
|
55
|
-
transform={`rotate(-90 ${size / 2} ${size / 2})`}
|
|
56
|
-
className="transition-all duration-300 ease-in-out"
|
|
57
|
-
/>
|
|
58
|
-
</svg>
|
|
59
|
-
</div>
|
|
60
|
-
);
|
|
61
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
calculateRadius,
|
|
3
|
+
calculateCircumference,
|
|
4
|
+
calculatePercentage,
|
|
5
|
+
calculateCircularProgressOffset,
|
|
6
|
+
} from "../../../infra/utils/percentage";
|
|
7
|
+
|
|
8
|
+
interface CircularProgressProps {
|
|
9
|
+
current: number;
|
|
10
|
+
total: number;
|
|
11
|
+
size?: number;
|
|
12
|
+
strokeWidth?: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export default function DefaultCircularProgress({
|
|
16
|
+
current,
|
|
17
|
+
total,
|
|
18
|
+
size = 62,
|
|
19
|
+
strokeWidth = 3,
|
|
20
|
+
}: CircularProgressProps) {
|
|
21
|
+
const radius = calculateRadius(size, strokeWidth);
|
|
22
|
+
const circumference = calculateCircumference(radius);
|
|
23
|
+
const percentage = calculatePercentage(current, total);
|
|
24
|
+
const offset = calculateCircularProgressOffset(percentage, circumference);
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<div
|
|
28
|
+
className="relative flex items-center justify-center"
|
|
29
|
+
style={{ width: size, height: size }}
|
|
30
|
+
role="progressbar"
|
|
31
|
+
aria-valuenow={current}
|
|
32
|
+
aria-valuemin={0}
|
|
33
|
+
aria-valuemax={total}
|
|
34
|
+
aria-label="Progresso de exportação"
|
|
35
|
+
>
|
|
36
|
+
<svg width={size} height={size} className="absolute">
|
|
37
|
+
<circle
|
|
38
|
+
cx={size / 2}
|
|
39
|
+
cy={size / 2}
|
|
40
|
+
r={radius}
|
|
41
|
+
stroke="var(--color-zinc-200)"
|
|
42
|
+
strokeWidth={strokeWidth}
|
|
43
|
+
fill="none"
|
|
44
|
+
/>
|
|
45
|
+
<circle
|
|
46
|
+
cx={size / 2}
|
|
47
|
+
cy={size / 2}
|
|
48
|
+
r={radius}
|
|
49
|
+
stroke="var(--color-cyan-300)"
|
|
50
|
+
strokeWidth={strokeWidth}
|
|
51
|
+
fill="none"
|
|
52
|
+
strokeDasharray={circumference}
|
|
53
|
+
strokeDashoffset={offset}
|
|
54
|
+
strokeLinecap="round"
|
|
55
|
+
transform={`rotate(-90 ${size / 2} ${size / 2})`}
|
|
56
|
+
className="transition-all duration-300 ease-in-out"
|
|
57
|
+
/>
|
|
58
|
+
</svg>
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import Image from 'next/image';
|
|
4
|
-
import { ReactNode } from 'react';
|
|
5
|
-
|
|
6
|
-
interface LoadingOverlayProps {
|
|
7
|
-
isLoading: boolean;
|
|
8
|
-
message?: string;
|
|
9
|
-
icon?: ReactNode;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function LoadingOverlay({ isLoading, message, icon }: LoadingOverlayProps) {
|
|
13
|
-
if (!isLoading) return null;
|
|
14
|
-
|
|
15
|
-
const defaultIcon = <Image src="/icons/great-icon.svg" alt="Great Icon" width={20} height={20} />;
|
|
16
|
-
|
|
17
|
-
return (
|
|
18
|
-
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-[2px]">
|
|
19
|
-
<div className="bg-white rounded-2xl shadow-xl px-16 py-12 flex flex-col items-center gap-6 min-w-[380px]">
|
|
20
|
-
<div className="relative flex items-center justify-center w-20 h-20">
|
|
21
|
-
<div className="absolute inset-0 border-[5px] border-gray-100 rounded-full" />
|
|
22
|
-
<div className="absolute inset-0 border-[5px] border-transparent border-t-black rounded-full animate-spin" />
|
|
23
|
-
<div className="relative z-20 flex items-center justify-center w-14 h-14 bg-gray-100 rounded-full">
|
|
24
|
-
{icon ?? defaultIcon}
|
|
25
|
-
</div>
|
|
26
|
-
</div>
|
|
27
|
-
<span className="font-bold text-gray-900 text-lg">{message}</span>
|
|
28
|
-
</div>
|
|
29
|
-
</div>
|
|
30
|
-
);
|
|
31
|
-
}
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import Image from 'next/image';
|
|
4
|
+
import { ReactNode } from 'react';
|
|
5
|
+
|
|
6
|
+
interface LoadingOverlayProps {
|
|
7
|
+
isLoading: boolean;
|
|
8
|
+
message?: string;
|
|
9
|
+
icon?: ReactNode;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function LoadingOverlay({ isLoading, message, icon }: LoadingOverlayProps) {
|
|
13
|
+
if (!isLoading) return null;
|
|
14
|
+
|
|
15
|
+
const defaultIcon = <Image src="/icons/great-icon.svg" alt="Great Icon" width={20} height={20} />;
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-[2px]">
|
|
19
|
+
<div className="bg-white rounded-2xl shadow-xl px-16 py-12 flex flex-col items-center gap-6 min-w-[380px]">
|
|
20
|
+
<div className="relative flex items-center justify-center w-20 h-20">
|
|
21
|
+
<div className="absolute inset-0 border-[5px] border-gray-100 rounded-full" />
|
|
22
|
+
<div className="absolute inset-0 border-[5px] border-transparent border-t-black rounded-full animate-spin" />
|
|
23
|
+
<div className="relative z-20 flex items-center justify-center w-14 h-14 bg-gray-100 rounded-full">
|
|
24
|
+
{icon ?? defaultIcon}
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
<span className="font-bold text-gray-900 text-lg">{message}</span>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
"use client"
|
|
4
|
-
|
|
5
|
-
import * as React from "react"
|
|
6
|
-
import * as ProgressPrimitive from "@radix-ui/react-progress"
|
|
7
|
-
import { cn } from "../../../infra/utils/clsx"
|
|
8
|
-
|
|
9
|
-
interface ProgressProps extends React.ComponentProps<typeof ProgressPrimitive.Root> {
|
|
10
|
-
indicatorColor?: string
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function Progress({
|
|
14
|
-
className,
|
|
15
|
-
value,
|
|
16
|
-
indicatorColor,
|
|
17
|
-
...props
|
|
18
|
-
}: ProgressProps) {
|
|
19
|
-
return (
|
|
20
|
-
<ProgressPrimitive.Root
|
|
21
|
-
data-slot="progress"
|
|
22
|
-
className={cn(
|
|
23
|
-
"bg-primary/20 relative h-2 w-full overflow-hidden rounded-full",
|
|
24
|
-
className
|
|
25
|
-
)}
|
|
26
|
-
{...props}
|
|
27
|
-
>
|
|
28
|
-
<ProgressPrimitive.Indicator
|
|
29
|
-
data-slot="progress-indicator"
|
|
30
|
-
className={cn(
|
|
31
|
-
"bg-primary h-full w-full flex-1 transition-all rounded-full",
|
|
32
|
-
indicatorColor
|
|
33
|
-
)}
|
|
34
|
-
style={{ transform: `translateX(-${100 - (value || 0)}%)` }}
|
|
35
|
-
/>
|
|
36
|
-
</ProgressPrimitive.Root>
|
|
37
|
-
)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export { Progress }
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
"use client"
|
|
4
|
+
|
|
5
|
+
import * as React from "react"
|
|
6
|
+
import * as ProgressPrimitive from "@radix-ui/react-progress"
|
|
7
|
+
import { cn } from "../../../infra/utils/clsx"
|
|
8
|
+
|
|
9
|
+
interface ProgressProps extends React.ComponentProps<typeof ProgressPrimitive.Root> {
|
|
10
|
+
indicatorColor?: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function Progress({
|
|
14
|
+
className,
|
|
15
|
+
value,
|
|
16
|
+
indicatorColor,
|
|
17
|
+
...props
|
|
18
|
+
}: ProgressProps) {
|
|
19
|
+
return (
|
|
20
|
+
<ProgressPrimitive.Root
|
|
21
|
+
data-slot="progress"
|
|
22
|
+
className={cn(
|
|
23
|
+
"bg-primary/20 relative h-2 w-full overflow-hidden rounded-full",
|
|
24
|
+
className
|
|
25
|
+
)}
|
|
26
|
+
{...props}
|
|
27
|
+
>
|
|
28
|
+
<ProgressPrimitive.Indicator
|
|
29
|
+
data-slot="progress-indicator"
|
|
30
|
+
className={cn(
|
|
31
|
+
"bg-primary h-full w-full flex-1 transition-all rounded-full",
|
|
32
|
+
indicatorColor
|
|
33
|
+
)}
|
|
34
|
+
style={{ transform: `translateX(-${100 - (value || 0)}%)` }}
|
|
35
|
+
/>
|
|
36
|
+
</ProgressPrimitive.Root>
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { Progress }
|