@greatapps/common 1.0.0
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/handlers/SearchParamsHandler.mjs +23 -0
- package/dist/components/handlers/SearchParamsHandler.mjs.map +1 -0
- package/dist/components/layouts/MainLayout.mjs +60 -0
- package/dist/components/layouts/MainLayout.mjs.map +1 -0
- package/dist/components/layouts/MdSideBarNavigation.mjs +36 -0
- package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -0
- package/dist/components/layouts/NavBar.mjs +45 -0
- package/dist/components/layouts/NavBar.mjs.map +1 -0
- package/dist/components/layouts/NotificationItem.mjs +7 -0
- package/dist/components/layouts/NotificationItem.mjs.map +1 -0
- package/dist/components/layouts/SideBarNavigation.mjs +22 -0
- package/dist/components/layouts/SideBarNavigation.mjs.map +1 -0
- package/dist/components/ui/buttons/Button.mjs +51 -0
- package/dist/components/ui/buttons/Button.mjs.map +1 -0
- package/dist/components/ui/buttons/CancelButton.mjs +16 -0
- package/dist/components/ui/buttons/CancelButton.mjs.map +1 -0
- package/dist/components/ui/buttons/CopyButton.mjs +34 -0
- package/dist/components/ui/buttons/CopyButton.mjs.map +1 -0
- package/dist/components/ui/data-display/Accordion.mjs +73 -0
- package/dist/components/ui/data-display/Accordion.mjs.map +1 -0
- package/dist/components/ui/data-display/Badge.mjs +41 -0
- package/dist/components/ui/data-display/Badge.mjs.map +1 -0
- package/dist/components/ui/data-display/Card.mjs +91 -0
- package/dist/components/ui/data-display/Card.mjs.map +1 -0
- package/dist/components/ui/data-display/Pagination.mjs +115 -0
- package/dist/components/ui/data-display/Pagination.mjs.map +1 -0
- package/dist/components/ui/data-display/ScrollArea.mjs +60 -0
- package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -0
- package/dist/components/ui/data-display/Separator.mjs +28 -0
- package/dist/components/ui/data-display/Separator.mjs.map +1 -0
- package/dist/components/ui/data-display/Table.mjs +116 -0
- package/dist/components/ui/data-display/Table.mjs.map +1 -0
- package/dist/components/ui/data-display/Tabs.mjs +69 -0
- package/dist/components/ui/data-display/Tabs.mjs.map +1 -0
- package/dist/components/ui/feedback/CircularProgress.mjs +61 -0
- package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -0
- package/dist/components/ui/feedback/DefaultCircularProgress.mjs +49 -0
- package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -0
- package/dist/components/ui/feedback/Progress.mjs +37 -0
- package/dist/components/ui/feedback/Progress.mjs.map +1 -0
- package/dist/components/ui/feedback/Toast.mjs +73 -0
- package/dist/components/ui/feedback/Toast.mjs.map +1 -0
- package/dist/components/ui/form/Calendar.mjs +203 -0
- package/dist/components/ui/form/Calendar.mjs.map +1 -0
- package/dist/components/ui/form/Checkbox.mjs +33 -0
- package/dist/components/ui/form/Checkbox.mjs.map +1 -0
- package/dist/components/ui/form/DatePicker.mjs +78 -0
- package/dist/components/ui/form/DatePicker.mjs.map +1 -0
- package/dist/components/ui/form/DateRangePicker.mjs +86 -0
- package/dist/components/ui/form/DateRangePicker.mjs.map +1 -0
- package/dist/components/ui/form/Input.mjs +20 -0
- package/dist/components/ui/form/Input.mjs.map +1 -0
- package/dist/components/ui/form/InputOtp.mjs +67 -0
- package/dist/components/ui/form/InputOtp.mjs.map +1 -0
- package/dist/components/ui/form/RadioGroup.mjs +36 -0
- package/dist/components/ui/form/RadioGroup.mjs.map +1 -0
- package/dist/components/ui/form/Select.mjs +172 -0
- package/dist/components/ui/form/Select.mjs.map +1 -0
- package/dist/components/ui/form/Switch.mjs +33 -0
- package/dist/components/ui/form/Switch.mjs.map +1 -0
- package/dist/components/ui/form/Textarea.mjs +19 -0
- package/dist/components/ui/form/Textarea.mjs.map +1 -0
- package/dist/components/ui/overlay/Command.mjs +170 -0
- package/dist/components/ui/overlay/Command.mjs.map +1 -0
- package/dist/components/ui/overlay/Dialog.mjs +131 -0
- package/dist/components/ui/overlay/Dialog.mjs.map +1 -0
- package/dist/components/ui/overlay/Popover.mjs +46 -0
- package/dist/components/ui/overlay/Popover.mjs.map +1 -0
- package/dist/components/ui/overlay/Sheet.mjs +129 -0
- package/dist/components/ui/overlay/Sheet.mjs.map +1 -0
- package/dist/components/ui/overlay/Tooltip.mjs +55 -0
- package/dist/components/ui/overlay/Tooltip.mjs.map +1 -0
- package/dist/hooks/copy-to-clipboard.hook.mjs +39 -0
- package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -0
- package/dist/index.mjs +57 -0
- package/dist/index.mjs.map +1 -0
- package/dist/infra/api/client.mjs +115 -0
- package/dist/infra/api/client.mjs.map +1 -0
- package/dist/infra/api/types.mjs +31 -0
- package/dist/infra/api/types.mjs.map +1 -0
- package/dist/infra/utils/client-info.mjs +27 -0
- package/dist/infra/utils/client-info.mjs.map +1 -0
- package/dist/infra/utils/clsx.mjs +9 -0
- package/dist/infra/utils/clsx.mjs.map +1 -0
- package/dist/infra/utils/params.mjs +21 -0
- package/dist/infra/utils/params.mjs.map +1 -0
- package/dist/infra/utils/percentage.mjs +20 -0
- package/dist/infra/utils/percentage.mjs.map +1 -0
- package/dist/middlewares/chain.mjs +37 -0
- package/dist/middlewares/chain.mjs.map +1 -0
- package/dist/middlewares/create-auth-middleware.mjs +28 -0
- package/dist/middlewares/create-auth-middleware.mjs.map +1 -0
- package/dist/middlewares/types.mjs +11 -0
- package/dist/middlewares/types.mjs.map +1 -0
- package/dist/middlewares/validate-session.mjs +92 -0
- package/dist/middlewares/validate-session.mjs.map +1 -0
- package/dist/modules/auth/actions/login.action.mjs +11 -0
- package/dist/modules/auth/actions/login.action.mjs.map +1 -0
- package/dist/modules/auth/actions/logout.action.mjs +11 -0
- package/dist/modules/auth/actions/logout.action.mjs.map +1 -0
- package/dist/modules/auth/actions/register.action.mjs +9 -0
- package/dist/modules/auth/actions/register.action.mjs.map +1 -0
- package/dist/modules/auth/actions/validate-session.action.mjs +44 -0
- package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -0
- package/dist/modules/auth/hooks/login.hook.mjs +12 -0
- package/dist/modules/auth/hooks/login.hook.mjs.map +1 -0
- package/dist/modules/auth/hooks/logout.hook.mjs +12 -0
- package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -0
- package/dist/modules/auth/hooks/register.hook.mjs +12 -0
- package/dist/modules/auth/hooks/register.hook.mjs.map +1 -0
- package/dist/modules/auth/hooks/useUserQuery.mjs +48 -0
- package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -0
- package/dist/modules/auth/schema.mjs +1 -0
- package/dist/modules/auth/schema.mjs.map +1 -0
- package/dist/modules/auth/services/auth.service.mjs +163 -0
- package/dist/modules/auth/services/auth.service.mjs.map +1 -0
- package/dist/modules/users/action/find-user-by-id.action.mjs +21 -0
- package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -0
- package/dist/modules/users/schema.mjs +11 -0
- package/dist/modules/users/schema.mjs.map +1 -0
- package/dist/modules/users/services/user.service.mjs +50 -0
- package/dist/modules/users/services/user.service.mjs.map +1 -0
- package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs +19 -0
- package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -0
- package/dist/modules/whitelabel/schema.mjs +1 -0
- package/dist/modules/whitelabel/schema.mjs.map +1 -0
- package/dist/modules/whitelabel/services/whitelabel.service.mjs +62 -0
- package/dist/modules/whitelabel/services/whitelabel.service.mjs.map +1 -0
- package/dist/providers/auth.provider.mjs +84 -0
- package/dist/providers/auth.provider.mjs.map +1 -0
- package/dist/providers/query.provider.mjs +37 -0
- package/dist/providers/query.provider.mjs.map +1 -0
- package/dist/providers/whitelabel.provider.mjs +33 -0
- package/dist/providers/whitelabel.provider.mjs.map +1 -0
- package/dist/store/useMdSidebarStore.mjs +11 -0
- package/dist/store/useMdSidebarStore.mjs.map +1 -0
- package/package.json +68 -0
- package/src/components/handlers/SearchParamsHandler.tsx +61 -0
- package/src/components/layouts/MainLayout.tsx +59 -0
- package/src/components/layouts/MdSideBarNavigation.tsx +39 -0
- package/src/components/layouts/NavBar.tsx +79 -0
- package/src/components/layouts/NotificationItem.tsx +26 -0
- package/src/components/layouts/SideBarNavigation.tsx +22 -0
- package/src/components/ui/buttons/Button.tsx +55 -0
- package/src/components/ui/buttons/CancelButton.tsx +12 -0
- package/src/components/ui/buttons/CopyButton.tsx +47 -0
- package/src/components/ui/data-display/Accordion.tsx +79 -0
- package/src/components/ui/data-display/Badge.tsx +45 -0
- package/src/components/ui/data-display/Card.tsx +91 -0
- package/src/components/ui/data-display/Pagination.tsx +124 -0
- package/src/components/ui/data-display/ScrollArea.tsx +57 -0
- package/src/components/ui/data-display/Separator.tsx +27 -0
- package/src/components/ui/data-display/Table.tsx +115 -0
- package/src/components/ui/data-display/Tabs.tsx +65 -0
- package/src/components/ui/feedback/CircularProgress.tsx +75 -0
- package/src/components/ui/feedback/DefaultCircularProgress.tsx +53 -0
- package/src/components/ui/feedback/Progress.tsx +38 -0
- package/src/components/ui/feedback/Toast.tsx +99 -0
- package/src/components/ui/form/Calendar.tsx +226 -0
- package/src/components/ui/form/Checkbox.tsx +31 -0
- package/src/components/ui/form/DatePicker.tsx +97 -0
- package/src/components/ui/form/DateRangePicker.tsx +108 -0
- package/src/components/ui/form/Input.tsx +18 -0
- package/src/components/ui/form/InputOtp.tsx +78 -0
- package/src/components/ui/form/RadioGroup.tsx +43 -0
- package/src/components/ui/form/Select.tsx +195 -0
- package/src/components/ui/form/Switch.tsx +30 -0
- package/src/components/ui/form/Textarea.tsx +17 -0
- package/src/components/ui/overlay/Command.tsx +183 -0
- package/src/components/ui/overlay/Dialog.tsx +146 -0
- package/src/components/ui/overlay/Popover.tsx +47 -0
- package/src/components/ui/overlay/Sheet.tsx +145 -0
- package/src/components/ui/overlay/Tooltip.tsx +60 -0
- package/src/hooks/copy-to-clipboard.hook.tsx +52 -0
- package/src/index.ts +50 -0
- package/src/infra/api/client.ts +142 -0
- package/src/infra/api/types.ts +79 -0
- package/src/infra/utils/client-info.ts +35 -0
- package/src/infra/utils/clsx.ts +6 -0
- package/src/infra/utils/params.ts +27 -0
- package/src/infra/utils/percentage.ts +42 -0
- package/src/middlewares/chain.ts +45 -0
- package/src/middlewares/create-auth-middleware.ts +38 -0
- package/src/middlewares/types.ts +24 -0
- package/src/middlewares/validate-session.ts +116 -0
- package/src/modules/auth/actions/login.action.ts +11 -0
- package/src/modules/auth/actions/logout.action.ts +11 -0
- package/src/modules/auth/actions/register.action.ts +8 -0
- package/src/modules/auth/actions/validate-session.action.ts +51 -0
- package/src/modules/auth/hooks/login.hook.tsx +10 -0
- package/src/modules/auth/hooks/logout.hook.tsx +10 -0
- package/src/modules/auth/hooks/register.hook.tsx +10 -0
- package/src/modules/auth/hooks/useUserQuery.ts +49 -0
- package/src/modules/auth/schema.ts +220 -0
- package/src/modules/auth/services/auth.service.ts +225 -0
- package/src/modules/users/action/find-user-by-id.action.ts +25 -0
- package/src/modules/users/schema.ts +79 -0
- package/src/modules/users/services/user.service.ts +63 -0
- package/src/modules/whitelabel/actions/find-whitelabel.action.ts +20 -0
- package/src/modules/whitelabel/schema.ts +49 -0
- package/src/modules/whitelabel/services/whitelabel.service.ts +77 -0
- package/src/providers/auth.provider.tsx +113 -0
- package/src/providers/query.provider.tsx +52 -0
- package/src/providers/whitelabel.provider.tsx +44 -0
- package/src/store/useMdSidebarStore.ts +15 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { cva } from "class-variance-authority";
|
|
4
|
+
import { CheckCircle, XCircle, AlertCircle, Info, Circle, X } from "lucide-react";
|
|
5
|
+
import { toast } from "sonner";
|
|
6
|
+
import { cn } from "../../../infra/utils/clsx";
|
|
7
|
+
import { Button } from "../buttons/Button";
|
|
8
|
+
const toastVariants = cva(
|
|
9
|
+
"w-full bg-white rounded-lg p-4 shadow-lg backdrop-blur-sm transition-all",
|
|
10
|
+
{
|
|
11
|
+
variants: {
|
|
12
|
+
variant: {
|
|
13
|
+
success: "",
|
|
14
|
+
error: "",
|
|
15
|
+
warning: "",
|
|
16
|
+
info: "",
|
|
17
|
+
default: ""
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
defaultVariants: {
|
|
21
|
+
variant: "default"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
const toastIconContainerVariants = cva(
|
|
26
|
+
"size-10 rounded-lg flex items-center justify-center shrink-0",
|
|
27
|
+
{
|
|
28
|
+
variants: {
|
|
29
|
+
variant: {
|
|
30
|
+
success: "bg-green-50 text-green-500",
|
|
31
|
+
error: "bg-red-50 text-red-500",
|
|
32
|
+
warning: "bg-yellow-50 text-yellow-400",
|
|
33
|
+
info: "bg-pages-50 text-pages-500",
|
|
34
|
+
default: "bg-gray-50 text-gray-950"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
defaultVariants: {
|
|
38
|
+
variant: "default"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
const TOAST_ICONS = {
|
|
43
|
+
success: CheckCircle,
|
|
44
|
+
error: XCircle,
|
|
45
|
+
warning: AlertCircle,
|
|
46
|
+
info: Info,
|
|
47
|
+
default: Circle
|
|
48
|
+
};
|
|
49
|
+
function Toast({
|
|
50
|
+
variant = "default",
|
|
51
|
+
message,
|
|
52
|
+
icon,
|
|
53
|
+
children,
|
|
54
|
+
className,
|
|
55
|
+
toastId
|
|
56
|
+
}) {
|
|
57
|
+
const Icon = variant ? TOAST_ICONS[variant] : null;
|
|
58
|
+
return /* @__PURE__ */ React.createElement("div", { "data-slot": "toast", className: cn(toastVariants({ variant }), className, "md:min-w-[310px] lg:min-w-[310px]") }, children ? children : /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-3 flex-1 min-w-0" }, /* @__PURE__ */ React.createElement("div", { className: cn(toastIconContainerVariants({ variant })) }, icon || Icon && /* @__PURE__ */ React.createElement(Icon, { size: 16 })), /* @__PURE__ */ React.createElement("span", { className: "w-full text-gray-600 paragraph-small-medium" }, message), /* @__PURE__ */ React.createElement(
|
|
59
|
+
Button,
|
|
60
|
+
{
|
|
61
|
+
variant: "ghost",
|
|
62
|
+
className: "size-8 rounded-full",
|
|
63
|
+
onClick: () => toastId && toast.dismiss(toastId)
|
|
64
|
+
},
|
|
65
|
+
/* @__PURE__ */ React.createElement(X, { size: 18 })
|
|
66
|
+
)));
|
|
67
|
+
}
|
|
68
|
+
export {
|
|
69
|
+
Toast,
|
|
70
|
+
toastIconContainerVariants,
|
|
71
|
+
toastVariants
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=Toast.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/feedback/Toast.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { CheckCircle, XCircle, AlertCircle, Info, Circle, X } from \"lucide-react\"\nimport { toast } from \"sonner\"\nimport { cn } from \"../../../infra/utils/clsx\"\nimport { Button } from \"../buttons/Button\"\n\nconst toastVariants = cva(\n \"w-full bg-white rounded-lg p-4 shadow-lg backdrop-blur-sm transition-all\",\n {\n variants: {\n variant: {\n success: \"\",\n error: \"\",\n warning: \"\",\n info: \"\",\n default: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nconst toastIconContainerVariants = cva(\n \"size-10 rounded-lg flex items-center justify-center shrink-0\",\n {\n variants: {\n variant: {\n success: \"bg-green-50 text-green-500\",\n error: \"bg-red-50 text-red-500\",\n warning: \"bg-yellow-50 text-yellow-400\",\n info: \"bg-pages-50 text-pages-500\",\n default: \"bg-gray-50 text-gray-950\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nconst TOAST_ICONS = {\n success: CheckCircle,\n error: XCircle,\n warning: AlertCircle,\n info: Info,\n default: Circle,\n} as const\n\ninterface ToastProps extends VariantProps<typeof toastIconContainerVariants> {\n message?: React.ReactNode\n icon?: React.ReactNode\n children?: React.ReactNode\n className?: string\n toastId?: string | number\n}\n\nfunction Toast({\n variant = \"default\",\n message,\n icon,\n children,\n className,\n toastId,\n}: ToastProps) {\n const Icon = variant ? TOAST_ICONS[variant] : null\n\n return (\n <div data-slot=\"toast\" className={cn(toastVariants({ variant }), className, \"md:min-w-[310px] lg:min-w-[310px]\")}>\n {children ? (\n children\n ) : (\n <div className=\"flex items-center gap-3 flex-1 min-w-0\">\n <div className={cn(toastIconContainerVariants({ variant }))}>\n {icon || (Icon && <Icon size={16} />)}\n </div>\n\n <span className=\"w-full text-gray-600 paragraph-small-medium\">\n {message}\n </span>\n <Button\n variant={\"ghost\"}\n className=\"size-8 rounded-full\"\n onClick={() => toastId && toast.dismiss(toastId)}\n >\n <X size={18} />\n </Button>\n </div>\n )}\n </div>\n )\n}\n\nexport { Toast, toastVariants, toastIconContainerVariants }\nexport type { ToastProps }\n"],"mappings":";AAEA,YAAY,WAAW;AACvB,SAAS,WAA8B;AACvC,SAAS,aAAa,SAAS,aAAa,MAAM,QAAQ,SAAS;AACnE,SAAS,aAAa;AACtB,SAAS,UAAU;AACnB,SAAS,cAAc;AAEvB,MAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,MAAM,6BAA6B;AAAA,EACjC;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,MAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AACX;AAUA,SAAS,MAAM;AAAA,EACb,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAe;AACb,QAAM,OAAO,UAAU,YAAY,OAAO,IAAI;AAE9C,SACE,oCAAC,SAAI,aAAU,SAAQ,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,WAAW,mCAAmC,KAC5G,WACC,WAEA,oCAAC,SAAI,WAAU,4CACb,oCAAC,SAAI,WAAW,GAAG,2BAA2B,EAAE,QAAQ,CAAC,CAAC,KACvD,QAAS,QAAQ,oCAAC,QAAK,MAAM,IAAI,CACpC,GAEA,oCAAC,UAAK,WAAU,iDACb,OACH,GACA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,WAAU;AAAA,MACV,SAAS,MAAM,WAAW,MAAM,QAAQ,OAAO;AAAA;AAAA,IAE/C,oCAAC,KAAE,MAAM,IAAI;AAAA,EACf,CACF,CAEJ;AAEJ;","names":[]}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { ptBR } from "date-fns/locale";
|
|
4
|
+
import {
|
|
5
|
+
ChevronDownIcon,
|
|
6
|
+
ChevronLeftIcon,
|
|
7
|
+
ChevronRightIcon
|
|
8
|
+
} from "lucide-react";
|
|
9
|
+
import { DayPicker, getDefaultClassNames } from "react-day-picker";
|
|
10
|
+
import { Button, buttonVariants } from "../buttons/Button";
|
|
11
|
+
import { cn } from "../../../infra/utils/clsx";
|
|
12
|
+
function Calendar({
|
|
13
|
+
className,
|
|
14
|
+
classNames,
|
|
15
|
+
showOutsideDays = true,
|
|
16
|
+
captionLayout = "label",
|
|
17
|
+
buttonVariant = "ghost",
|
|
18
|
+
formatters,
|
|
19
|
+
components,
|
|
20
|
+
...props
|
|
21
|
+
}) {
|
|
22
|
+
const defaultClassNames = getDefaultClassNames();
|
|
23
|
+
return /* @__PURE__ */ React.createElement(
|
|
24
|
+
DayPicker,
|
|
25
|
+
{
|
|
26
|
+
locale: ptBR,
|
|
27
|
+
showOutsideDays,
|
|
28
|
+
className: cn(
|
|
29
|
+
"bg-background group/calendar p-3 [--cell-size:--spacing(8)] in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent",
|
|
30
|
+
String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,
|
|
31
|
+
String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,
|
|
32
|
+
className
|
|
33
|
+
),
|
|
34
|
+
captionLayout,
|
|
35
|
+
formatters: {
|
|
36
|
+
formatWeekdayName: (date) => {
|
|
37
|
+
const weekdays = ["D", "S", "T", "Q", "Q", "S", "S"];
|
|
38
|
+
return weekdays[date.getDay()];
|
|
39
|
+
},
|
|
40
|
+
formatCaption: (date) => {
|
|
41
|
+
const month = date.toLocaleDateString("pt-BR", { month: "long" });
|
|
42
|
+
const year = date.getFullYear();
|
|
43
|
+
return `${month.charAt(0).toUpperCase() + month.slice(1)} / ${year}`;
|
|
44
|
+
},
|
|
45
|
+
formatMonthDropdown: (date) => date.toLocaleString("default", { month: "short" }),
|
|
46
|
+
...formatters
|
|
47
|
+
},
|
|
48
|
+
classNames: {
|
|
49
|
+
root: cn("w-fit", defaultClassNames.root),
|
|
50
|
+
months: cn(
|
|
51
|
+
"flex gap-4 flex-col md:flex-row relative",
|
|
52
|
+
defaultClassNames.months
|
|
53
|
+
),
|
|
54
|
+
month: cn("flex flex-col w-full gap-4", defaultClassNames.month),
|
|
55
|
+
nav: cn(
|
|
56
|
+
"flex items-center gap-1 w-auto absolute top-0 right-0",
|
|
57
|
+
defaultClassNames.nav
|
|
58
|
+
),
|
|
59
|
+
button_previous: cn(
|
|
60
|
+
buttonVariants({ variant: buttonVariant }),
|
|
61
|
+
"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none",
|
|
62
|
+
defaultClassNames.button_previous
|
|
63
|
+
),
|
|
64
|
+
button_next: cn(
|
|
65
|
+
buttonVariants({ variant: buttonVariant }),
|
|
66
|
+
"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none",
|
|
67
|
+
defaultClassNames.button_next
|
|
68
|
+
),
|
|
69
|
+
month_caption: cn(
|
|
70
|
+
"flex items-center justify-start h-(--cell-size) w-full pr-(--cell-size)",
|
|
71
|
+
defaultClassNames.month_caption
|
|
72
|
+
),
|
|
73
|
+
dropdowns: cn(
|
|
74
|
+
"w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5",
|
|
75
|
+
defaultClassNames.dropdowns
|
|
76
|
+
),
|
|
77
|
+
dropdown_root: cn(
|
|
78
|
+
"relative has-focus:border-ring border border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md",
|
|
79
|
+
defaultClassNames.dropdown_root
|
|
80
|
+
),
|
|
81
|
+
dropdown: cn(
|
|
82
|
+
"absolute bg-popover inset-0 opacity-0",
|
|
83
|
+
defaultClassNames.dropdown
|
|
84
|
+
),
|
|
85
|
+
caption_label: cn(
|
|
86
|
+
"select-none font-medium",
|
|
87
|
+
captionLayout === "label" ? "text-sm" : "rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-muted-foreground [&>svg]:size-3.5",
|
|
88
|
+
defaultClassNames.caption_label
|
|
89
|
+
),
|
|
90
|
+
table: "w-full border-collapse",
|
|
91
|
+
weekdays: cn("flex", defaultClassNames.weekdays),
|
|
92
|
+
weekday: cn(
|
|
93
|
+
"text-gray-500 font-medium text-sm w-10 h-10 flex items-center justify-center uppercase",
|
|
94
|
+
defaultClassNames.weekday
|
|
95
|
+
),
|
|
96
|
+
week: cn("flex w-full mt-2", defaultClassNames.week),
|
|
97
|
+
week_number_header: cn(
|
|
98
|
+
"select-none w-(--cell-size)",
|
|
99
|
+
defaultClassNames.week_number_header
|
|
100
|
+
),
|
|
101
|
+
week_number: cn(
|
|
102
|
+
"text-[0.8rem] select-none text-muted-foreground",
|
|
103
|
+
defaultClassNames.week_number
|
|
104
|
+
),
|
|
105
|
+
day: cn(
|
|
106
|
+
"relative w-full h-full p-0 text-center [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none",
|
|
107
|
+
props.showWeekNumber ? "[&:nth-child(2)[data-selected=true]_button]:rounded-l-md" : "[&:first-child[data-selected=true]_button]:rounded-l-md",
|
|
108
|
+
defaultClassNames.day
|
|
109
|
+
),
|
|
110
|
+
range_start: cn(
|
|
111
|
+
"rounded-l-md bg-accent",
|
|
112
|
+
defaultClassNames.range_start
|
|
113
|
+
),
|
|
114
|
+
range_middle: cn("rounded-none", defaultClassNames.range_middle),
|
|
115
|
+
range_end: cn("rounded-r-md bg-accent", defaultClassNames.range_end),
|
|
116
|
+
today: cn(
|
|
117
|
+
"bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none",
|
|
118
|
+
defaultClassNames.today
|
|
119
|
+
),
|
|
120
|
+
outside: cn(
|
|
121
|
+
"text-muted-foreground aria-selected:text-muted-foreground",
|
|
122
|
+
defaultClassNames.outside
|
|
123
|
+
),
|
|
124
|
+
disabled: cn(
|
|
125
|
+
"text-muted-foreground opacity-50",
|
|
126
|
+
defaultClassNames.disabled
|
|
127
|
+
),
|
|
128
|
+
hidden: cn("invisible", defaultClassNames.hidden),
|
|
129
|
+
...classNames
|
|
130
|
+
},
|
|
131
|
+
components: {
|
|
132
|
+
Root: ({ className: className2, rootRef, ...props2 }) => {
|
|
133
|
+
return /* @__PURE__ */ React.createElement(
|
|
134
|
+
"div",
|
|
135
|
+
{
|
|
136
|
+
"data-slot": "calendar",
|
|
137
|
+
ref: rootRef,
|
|
138
|
+
className: cn(className2),
|
|
139
|
+
...props2
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
},
|
|
143
|
+
Chevron: ({ className: className2, orientation, ...props2 }) => {
|
|
144
|
+
if (orientation === "left") {
|
|
145
|
+
return /* @__PURE__ */ React.createElement(ChevronLeftIcon, { className: cn("size-4", className2), ...props2 });
|
|
146
|
+
}
|
|
147
|
+
if (orientation === "right") {
|
|
148
|
+
return /* @__PURE__ */ React.createElement(
|
|
149
|
+
ChevronRightIcon,
|
|
150
|
+
{
|
|
151
|
+
className: cn("size-4", className2),
|
|
152
|
+
...props2
|
|
153
|
+
}
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
return /* @__PURE__ */ React.createElement(ChevronDownIcon, { className: cn("size-4", className2), ...props2 });
|
|
157
|
+
},
|
|
158
|
+
DayButton: CalendarDayButton,
|
|
159
|
+
WeekNumber: ({ children, ...props2 }) => {
|
|
160
|
+
return /* @__PURE__ */ React.createElement("td", { ...props2 }, /* @__PURE__ */ React.createElement("div", { className: "flex size-(--cell-size) items-center justify-center text-center" }, children));
|
|
161
|
+
},
|
|
162
|
+
...components
|
|
163
|
+
},
|
|
164
|
+
...props
|
|
165
|
+
}
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
function CalendarDayButton({
|
|
169
|
+
className,
|
|
170
|
+
day,
|
|
171
|
+
modifiers,
|
|
172
|
+
...props
|
|
173
|
+
}) {
|
|
174
|
+
const defaultClassNames = getDefaultClassNames();
|
|
175
|
+
const ref = React.useRef(null);
|
|
176
|
+
React.useEffect(() => {
|
|
177
|
+
if (modifiers.focused) ref.current?.focus();
|
|
178
|
+
}, [modifiers.focused]);
|
|
179
|
+
return /* @__PURE__ */ React.createElement(
|
|
180
|
+
Button,
|
|
181
|
+
{
|
|
182
|
+
ref,
|
|
183
|
+
variant: "ghost",
|
|
184
|
+
size: "icon",
|
|
185
|
+
"data-day": day.date.toLocaleDateString(),
|
|
186
|
+
"data-selected-single": modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle,
|
|
187
|
+
"data-range-start": modifiers.range_start,
|
|
188
|
+
"data-range-end": modifiers.range_end,
|
|
189
|
+
"data-range-middle": modifiers.range_middle,
|
|
190
|
+
className: cn(
|
|
191
|
+
"data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 dark:hover:text-accent-foreground flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md [&>span]:text-xs [&>span]:opacity-70",
|
|
192
|
+
defaultClassNames.day,
|
|
193
|
+
className
|
|
194
|
+
),
|
|
195
|
+
...props
|
|
196
|
+
}
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
export {
|
|
200
|
+
Calendar,
|
|
201
|
+
CalendarDayButton
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=Calendar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/form/Calendar.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { ptBR } from \"date-fns/locale\"\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n} from \"lucide-react\"\nimport { DayButton, DayPicker, getDefaultClassNames } from \"react-day-picker\"\nimport { Button, buttonVariants } from \"../buttons/Button\"\nimport { cn } from \"../../../infra/utils/clsx\"\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n buttonVariant = \"ghost\",\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>[\"variant\"]\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n locale={ptBR}\n showOutsideDays={showOutsideDays}\n className={cn(\n \"bg-background group/calendar p-3 [--cell-size:--spacing(8)] in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent\",\n String.raw`rtl:**:[.rdp-button\\_next>svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className\n )}\n captionLayout={captionLayout}\n formatters={{\n formatWeekdayName: (date) => {\n const weekdays = ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'];\n return weekdays[date.getDay()];\n },\n formatCaption: (date) => {\n const month = date.toLocaleDateString('pt-BR', { month: 'long' });\n const year = date.getFullYear();\n return `${month.charAt(0).toUpperCase() + month.slice(1)} / ${year}`;\n },\n formatMonthDropdown: (date) =>\n date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"flex gap-4 flex-col md:flex-row relative\",\n defaultClassNames.months\n ),\n month: cn(\"flex flex-col w-full gap-4\", defaultClassNames.month),\n nav: cn(\n \"flex items-center gap-1 w-auto absolute top-0 right-0\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex items-center justify-start h-(--cell-size) w-full pr-(--cell-size)\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"relative has-focus:border-ring border border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"absolute bg-popover inset-0 opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"select-none font-medium\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-muted-foreground [&>svg]:size-3.5\",\n defaultClassNames.caption_label\n ),\n table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"text-gray-500 font-medium text-sm w-10 h-10 flex items-center justify-center uppercase\",\n defaultClassNames.weekday\n ),\n week: cn(\"flex w-full mt-2\", defaultClassNames.week),\n week_number_header: cn(\n \"select-none w-(--cell-size)\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-[0.8rem] select-none text-muted-foreground\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"relative w-full h-full p-0 text-center [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none\",\n props.showWeekNumber\n ? \"[&:nth-child(2)[data-selected=true]_button]:rounded-l-md\"\n : \"[&:first-child[data-selected=true]_button]:rounded-l-md\",\n defaultClassNames.day\n ),\n range_start: cn(\n \"rounded-l-md bg-accent\",\n defaultClassNames.range_start\n ),\n range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n range_end: cn(\"rounded-r-md bg-accent\", defaultClassNames.range_end),\n today: cn(\n \"bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none\",\n defaultClassNames.today\n ),\n outside: cn(\n \"text-muted-foreground aria-selected:text-muted-foreground\",\n defaultClassNames.outside\n ),\n disabled: cn(\n \"text-muted-foreground opacity-50\",\n defaultClassNames.disabled\n ),\n hidden: cn(\"invisible\", defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n <div\n data-slot=\"calendar\"\n ref={rootRef}\n className={cn(className)}\n {...props}\n />\n )\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n <ChevronLeftIcon className={cn(\"size-4\", className)} {...props} />\n )\n }\n\n if (orientation === \"right\") {\n return (\n <ChevronRightIcon\n className={cn(\"size-4\", className)}\n {...props}\n />\n )\n }\n\n return (\n <ChevronDownIcon className={cn(\"size-4\", className)} {...props} />\n )\n },\n DayButton: CalendarDayButton,\n WeekNumber: ({ children, ...props }) => {\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">\n {children}\n </div>\n </td>\n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({\n className,\n day,\n modifiers,\n ...props\n}: React.ComponentProps<typeof DayButton>) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\n }, [modifiers.focused])\n\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"icon\"\n data-day={day.date.toLocaleDateString()}\n data-selected-single={\n modifiers.selected &&\n !modifiers.range_start &&\n !modifiers.range_end &&\n !modifiers.range_middle\n }\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n \"data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 dark:hover:text-accent-foreground flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md [&>span]:text-xs [&>span]:opacity-70\",\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n"],"mappings":"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","names":["className","props"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
|
|
4
|
+
import { CheckIcon } from "lucide-react";
|
|
5
|
+
import { cn } from "../../../infra/utils/clsx";
|
|
6
|
+
function Checkbox({
|
|
7
|
+
className,
|
|
8
|
+
...props
|
|
9
|
+
}) {
|
|
10
|
+
return /* @__PURE__ */ React.createElement(
|
|
11
|
+
CheckboxPrimitive.Root,
|
|
12
|
+
{
|
|
13
|
+
"data-slot": "checkbox",
|
|
14
|
+
className: cn(
|
|
15
|
+
"peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4.5 shrink-0 rounded-[4px] border-[1.6px] shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 hover:border-gray-950 cursor-pointer",
|
|
16
|
+
className
|
|
17
|
+
),
|
|
18
|
+
...props
|
|
19
|
+
},
|
|
20
|
+
/* @__PURE__ */ React.createElement(
|
|
21
|
+
CheckboxPrimitive.Indicator,
|
|
22
|
+
{
|
|
23
|
+
"data-slot": "checkbox-indicator",
|
|
24
|
+
className: "grid place-content-center text-current transition-none"
|
|
25
|
+
},
|
|
26
|
+
/* @__PURE__ */ React.createElement(CheckIcon, { className: "size-3 text-current" })
|
|
27
|
+
)
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
Checkbox
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=Checkbox.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/form/Checkbox.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { CheckIcon } from \"lucide-react\";\nimport { cn } from \"../../../infra/utils/clsx\";\n\nfunction Checkbox({\n className,\n ...props\n}: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4.5 shrink-0 rounded-[4px] border-[1.6px] shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 hover:border-gray-950 cursor-pointer\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current transition-none\"\n >\n <CheckIcon className=\"size-3 text-current\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { Checkbox };\n"],"mappings":";AAEA,YAAY,WAAW;AACvB,YAAY,uBAAuB;AACnC,SAAS,iBAAiB;AAC1B,SAAS,UAAU;AAEnB,SAAS,SAAS;AAAA,EAChB;AAAA,EACA,GAAG;AACL,GAAwD;AACtD,SACE;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ;AAAA,MAAC,kBAAkB;AAAA,MAAlB;AAAA,QACC,aAAU;AAAA,QACV,WAAU;AAAA;AAAA,MAEV,oCAAC,aAAU,WAAU,uBAAsB;AAAA,IAC7C;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, forwardRef, useEffect } from "react";
|
|
3
|
+
import { format } from "date-fns";
|
|
4
|
+
import { Calendar } from "./Calendar";
|
|
5
|
+
import { Popover, PopoverContent, PopoverTrigger } from "../overlay/Popover";
|
|
6
|
+
import { cn } from "../../../infra/utils/clsx";
|
|
7
|
+
const isoParaDataLocal = (iso) => {
|
|
8
|
+
const [ano, mes, dia] = iso.split("-").map(Number);
|
|
9
|
+
return new Date(ano, mes - 1, dia);
|
|
10
|
+
};
|
|
11
|
+
const DatePicker = forwardRef(
|
|
12
|
+
({ value, onChange, placeholder = "Selecione a data", className, disabled }, ref) => {
|
|
13
|
+
const [open, setOpen] = useState(false);
|
|
14
|
+
const [date, setDate] = useState(() => {
|
|
15
|
+
return value ? isoParaDataLocal(value) : void 0;
|
|
16
|
+
});
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
if (value) {
|
|
19
|
+
setDate(isoParaDataLocal(value));
|
|
20
|
+
} else {
|
|
21
|
+
setDate(void 0);
|
|
22
|
+
}
|
|
23
|
+
}, [value]);
|
|
24
|
+
const handleDateSelect = (selectedDate) => {
|
|
25
|
+
setDate(selectedDate);
|
|
26
|
+
if (selectedDate) {
|
|
27
|
+
onChange?.(format(selectedDate, "yyyy-MM-dd"));
|
|
28
|
+
setOpen(false);
|
|
29
|
+
} else {
|
|
30
|
+
onChange?.(void 0);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const displayText = date ? format(date, "dd/MM/yyyy") : placeholder;
|
|
34
|
+
return /* @__PURE__ */ React.createElement(Popover, { open, onOpenChange: setOpen }, /* @__PURE__ */ React.createElement(PopoverTrigger, { asChild: true }, /* @__PURE__ */ React.createElement(
|
|
35
|
+
"button",
|
|
36
|
+
{
|
|
37
|
+
ref,
|
|
38
|
+
disabled,
|
|
39
|
+
className: cn(
|
|
40
|
+
"flex items-center gap-2 px-4 h-10 border rounded-lg transition-colors w-full justify-start",
|
|
41
|
+
"border-gray-200 hover:border-gray-400 focus-within:border-gray-950",
|
|
42
|
+
"disabled:opacity-50 disabled:cursor-not-allowed",
|
|
43
|
+
className
|
|
44
|
+
)
|
|
45
|
+
},
|
|
46
|
+
/* @__PURE__ */ React.createElement(
|
|
47
|
+
"span",
|
|
48
|
+
{
|
|
49
|
+
className: cn(
|
|
50
|
+
"paragraph-small-medium",
|
|
51
|
+
date ? "text-gray-950" : "text-gray-500"
|
|
52
|
+
)
|
|
53
|
+
},
|
|
54
|
+
displayText
|
|
55
|
+
)
|
|
56
|
+
)), /* @__PURE__ */ React.createElement(
|
|
57
|
+
PopoverContent,
|
|
58
|
+
{
|
|
59
|
+
className: "w-auto p-0 bg-white rounded-2xl shadow-md border border-gray-200",
|
|
60
|
+
align: "start",
|
|
61
|
+
sideOffset: 8
|
|
62
|
+
},
|
|
63
|
+
/* @__PURE__ */ React.createElement("div", { className: "p-3" }, /* @__PURE__ */ React.createElement(
|
|
64
|
+
Calendar,
|
|
65
|
+
{
|
|
66
|
+
mode: "single",
|
|
67
|
+
selected: date,
|
|
68
|
+
onSelect: handleDateSelect
|
|
69
|
+
}
|
|
70
|
+
))
|
|
71
|
+
));
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
DatePicker.displayName = "DatePicker";
|
|
75
|
+
export {
|
|
76
|
+
DatePicker
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=DatePicker.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/form/DatePicker.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, forwardRef, useEffect } from \"react\";\nimport { format } from \"date-fns\";\nimport { Calendar } from \"./Calendar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlay/Popover\";\nimport { cn } from \"../../../infra/utils/clsx\";\n\n// Converte string ISO (yyyy-MM-dd) para Date no fuso horário local\n// Evita bug de timezone onde new Date(\"2025-08-02\") interpreta como UTC\nconst isoParaDataLocal = (iso: string): Date => {\n const [ano, mes, dia] = iso.split(\"-\").map(Number);\n return new Date(ano, mes - 1, dia);\n};\n\ninterface DatePickerProps {\n value?: string;\n onChange?: (date: string | undefined) => void;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n}\n\nexport const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(\n (\n { value, onChange, placeholder = \"Selecione a data\", className, disabled },\n ref,\n ) => {\n const [open, setOpen] = useState(false);\n const [date, setDate] = useState<Date | undefined>(() => {\n return value ? isoParaDataLocal(value) : undefined;\n });\n\n // Sincroniza estado interno quando value mudar externamente\n useEffect(() => {\n if (value) {\n setDate(isoParaDataLocal(value));\n } else {\n setDate(undefined);\n }\n }, [value]);\n\n const handleDateSelect = (selectedDate: Date | undefined) => {\n setDate(selectedDate);\n\n if (selectedDate) {\n onChange?.(format(selectedDate, \"yyyy-MM-dd\"));\n setOpen(false); // Fecha o popover após seleção\n } else {\n onChange?.(undefined);\n }\n };\n\n const displayText = date ? format(date, \"dd/MM/yyyy\") : placeholder;\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n disabled={disabled}\n className={cn(\n \"flex items-center gap-2 px-4 h-10 border rounded-lg transition-colors w-full justify-start\",\n \"border-gray-200 hover:border-gray-400 focus-within:border-gray-950\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n className,\n )}\n >\n <span\n className={cn(\n \"paragraph-small-medium\",\n date ? \"text-gray-950\" : \"text-gray-500\",\n )}\n >\n {displayText}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-auto p-0 bg-white rounded-2xl shadow-md border border-gray-200\"\n align=\"start\"\n sideOffset={8}\n >\n <div className=\"p-3\">\n <Calendar\n mode=\"single\"\n selected={date}\n onSelect={handleDateSelect}\n />\n </div>\n </PopoverContent>\n </Popover>\n );\n },\n);\n\nDatePicker.displayName = \"DatePicker\";\n"],"mappings":";AAEA,SAAS,UAAU,YAAY,iBAAiB;AAChD,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,SAAS,gBAAgB,sBAAsB;AACxD,SAAS,UAAU;AAInB,MAAM,mBAAmB,CAAC,QAAsB;AAC9C,QAAM,CAAC,KAAK,KAAK,GAAG,IAAI,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM;AACjD,SAAO,IAAI,KAAK,KAAK,MAAM,GAAG,GAAG;AACnC;AAUO,MAAM,aAAa;AAAA,EACxB,CACE,EAAE,OAAO,UAAU,cAAc,oBAAoB,WAAW,SAAS,GACzE,QACG;AACH,UAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,UAAM,CAAC,MAAM,OAAO,IAAI,SAA2B,MAAM;AACvD,aAAO,QAAQ,iBAAiB,KAAK,IAAI;AAAA,IAC3C,CAAC;AAGD,cAAU,MAAM;AACd,UAAI,OAAO;AACT,gBAAQ,iBAAiB,KAAK,CAAC;AAAA,MACjC,OAAO;AACL,gBAAQ,MAAS;AAAA,MACnB;AAAA,IACF,GAAG,CAAC,KAAK,CAAC;AAEV,UAAM,mBAAmB,CAAC,iBAAmC;AAC3D,cAAQ,YAAY;AAEpB,UAAI,cAAc;AAChB,mBAAW,OAAO,cAAc,YAAY,CAAC;AAC7C,gBAAQ,KAAK;AAAA,MACf,OAAO;AACL,mBAAW,MAAS;AAAA,MACtB;AAAA,IACF;AAEA,UAAM,cAAc,OAAO,OAAO,MAAM,YAAY,IAAI;AAExD,WACE,oCAAC,WAAQ,MAAY,cAAc,WACjC,oCAAC,kBAAe,SAAO,QACrB;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,OAAO,kBAAkB;AAAA,UAC3B;AAAA;AAAA,QAEC;AAAA,MACH;AAAA,IACF,CACF,GACA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAM;AAAA,QACN,YAAY;AAAA;AAAA,MAEZ,oCAAC,SAAI,WAAU,SACb;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU;AAAA,UACV,UAAU;AAAA;AAAA,MACZ,CACF;AAAA,IACF,CACF;AAAA,EAEJ;AACF;AAEA,WAAW,cAAc;","names":[]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, forwardRef, useEffect } from "react";
|
|
3
|
+
import { format } from "date-fns";
|
|
4
|
+
import { Calendar as CalendarIcon } from "lucide-react";
|
|
5
|
+
import { Calendar } from "./Calendar";
|
|
6
|
+
import { Popover, PopoverContent, PopoverTrigger } from "../overlay/Popover";
|
|
7
|
+
import { cn } from "../../../infra/utils/clsx";
|
|
8
|
+
const isoParaDataLocal = (iso) => {
|
|
9
|
+
const [ano, mes, dia] = iso.split("-").map(Number);
|
|
10
|
+
return new Date(ano, mes - 1, dia);
|
|
11
|
+
};
|
|
12
|
+
const DateRangePicker = forwardRef(
|
|
13
|
+
({ value, onChange, placeholder = "Selecione o per\xEDodo", className, disabled }, ref) => {
|
|
14
|
+
const [open, setOpen] = useState(false);
|
|
15
|
+
const [range, setRange] = useState(() => {
|
|
16
|
+
if (value?.from && value?.to) {
|
|
17
|
+
return {
|
|
18
|
+
from: isoParaDataLocal(value.from),
|
|
19
|
+
to: isoParaDataLocal(value.to)
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return void 0;
|
|
23
|
+
});
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (value?.from && value?.to) {
|
|
26
|
+
setRange({
|
|
27
|
+
from: isoParaDataLocal(value.from),
|
|
28
|
+
to: isoParaDataLocal(value.to)
|
|
29
|
+
});
|
|
30
|
+
} else {
|
|
31
|
+
setRange(void 0);
|
|
32
|
+
}
|
|
33
|
+
}, [value]);
|
|
34
|
+
const handleRangeSelect = (newRange) => {
|
|
35
|
+
setRange(newRange);
|
|
36
|
+
if (newRange?.from && newRange?.to) {
|
|
37
|
+
onChange?.({
|
|
38
|
+
from: format(newRange.from, "yyyy-MM-dd"),
|
|
39
|
+
to: format(newRange.to, "yyyy-MM-dd")
|
|
40
|
+
});
|
|
41
|
+
} else {
|
|
42
|
+
onChange?.(void 0);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const displayText = range?.from && range?.to ? `${format(range.from, "dd/MM/yyyy")} - ${format(range.to, "dd/MM/yyyy")}` : placeholder;
|
|
46
|
+
return /* @__PURE__ */ React.createElement(Popover, { open, onOpenChange: setOpen }, /* @__PURE__ */ React.createElement(PopoverTrigger, { asChild: true }, /* @__PURE__ */ React.createElement(
|
|
47
|
+
"button",
|
|
48
|
+
{
|
|
49
|
+
ref,
|
|
50
|
+
disabled,
|
|
51
|
+
className: cn(
|
|
52
|
+
"flex items-center gap-2 px-4 h-10 border rounded-lg transition-colors w-full justify-start",
|
|
53
|
+
"border-gray-200 hover:border-gray-400 focus-within:border-gray-950",
|
|
54
|
+
"disabled:opacity-50 disabled:cursor-not-allowed",
|
|
55
|
+
className
|
|
56
|
+
)
|
|
57
|
+
},
|
|
58
|
+
/* @__PURE__ */ React.createElement(CalendarIcon, { size: 20, className: "text-gray-400" }),
|
|
59
|
+
/* @__PURE__ */ React.createElement("span", { className: cn(
|
|
60
|
+
"paragraph-small-medium",
|
|
61
|
+
range?.from && range?.to ? "text-gray-950" : "text-gray-500"
|
|
62
|
+
) }, displayText)
|
|
63
|
+
)), /* @__PURE__ */ React.createElement(
|
|
64
|
+
PopoverContent,
|
|
65
|
+
{
|
|
66
|
+
className: "w-auto p-0 bg-white rounded-2xl shadow-md border border-gray-200",
|
|
67
|
+
align: "start",
|
|
68
|
+
sideOffset: 8
|
|
69
|
+
},
|
|
70
|
+
/* @__PURE__ */ React.createElement("div", { className: "p-3" }, /* @__PURE__ */ React.createElement(
|
|
71
|
+
Calendar,
|
|
72
|
+
{
|
|
73
|
+
mode: "range",
|
|
74
|
+
selected: range,
|
|
75
|
+
onSelect: handleRangeSelect,
|
|
76
|
+
numberOfMonths: 1
|
|
77
|
+
}
|
|
78
|
+
))
|
|
79
|
+
));
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
DateRangePicker.displayName = "DateRangePicker";
|
|
83
|
+
export {
|
|
84
|
+
DateRangePicker
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=DateRangePicker.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/form/DateRangePicker.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, forwardRef, useEffect } from \"react\";\nimport { format } from \"date-fns\";\nimport { Calendar as CalendarIcon } from \"lucide-react\";\nimport { DateRange } from \"react-day-picker\";\nimport { Calendar } from \"./Calendar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlay/Popover\";\nimport { cn } from \"../../../infra/utils/clsx\";\n\n// Converte string ISO (yyyy-MM-dd) para Date no fuso horário local\n// Evita bug de timezone onde new Date(\"2025-08-02\") interpreta como UTC\nconst isoParaDataLocal = (iso: string): Date => {\n const [ano, mes, dia] = iso.split(\"-\").map(Number);\n return new Date(ano, mes - 1, dia);\n};\n\ninterface DateRangePickerProps {\n value?: { from: string; to: string };\n onChange?: (range: { from: string; to: string } | undefined) => void;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n}\n\nexport const DateRangePicker = forwardRef<HTMLButtonElement, DateRangePickerProps>(\n ({ value, onChange, placeholder = \"Selecione o período\", className, disabled }, ref) => {\n const [open, setOpen] = useState(false);\n const [range, setRange] = useState<DateRange | undefined>(() => {\n if (value?.from && value?.to) {\n return {\n from: isoParaDataLocal(value.from),\n to: isoParaDataLocal(value.to)\n };\n }\n return undefined;\n });\n\n useEffect(() => {\n if (value?.from && value?.to) {\n setRange({\n from: isoParaDataLocal(value.from),\n to: isoParaDataLocal(value.to)\n });\n } else {\n setRange(undefined);\n }\n }, [value]);\n\n const handleRangeSelect = (newRange: DateRange | undefined) => {\n setRange(newRange);\n\n if (newRange?.from && newRange?.to) {\n onChange?.({\n from: format(newRange.from, \"yyyy-MM-dd\"),\n to: format(newRange.to, \"yyyy-MM-dd\")\n });\n } else {\n onChange?.(undefined);\n }\n };\n\n const displayText = range?.from && range?.to\n ? `${format(range.from, \"dd/MM/yyyy\")} - ${format(range.to, \"dd/MM/yyyy\")}`\n : placeholder;\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n disabled={disabled}\n className={cn(\n \"flex items-center gap-2 px-4 h-10 border rounded-lg transition-colors w-full justify-start\",\n \"border-gray-200 hover:border-gray-400 focus-within:border-gray-950\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n className\n )}\n >\n <CalendarIcon size={20} className=\"text-gray-400\" />\n <span className={cn(\n \"paragraph-small-medium\",\n range?.from && range?.to ? \"text-gray-950\" : \"text-gray-500\"\n )}>\n {displayText}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-auto p-0 bg-white rounded-2xl shadow-md border border-gray-200\"\n align=\"start\"\n sideOffset={8}\n >\n <div className=\"p-3\">\n <Calendar\n mode=\"range\"\n selected={range}\n onSelect={handleRangeSelect}\n numberOfMonths={1}\n />\n </div>\n </PopoverContent>\n </Popover>\n );\n }\n);\n\nDateRangePicker.displayName = \"DateRangePicker\";\n"],"mappings":";AAEA,SAAS,UAAU,YAAY,iBAAiB;AAChD,SAAS,cAAc;AACvB,SAAS,YAAY,oBAAoB;AAEzC,SAAS,gBAAgB;AACzB,SAAS,SAAS,gBAAgB,sBAAsB;AACxD,SAAS,UAAU;AAInB,MAAM,mBAAmB,CAAC,QAAsB;AAC9C,QAAM,CAAC,KAAK,KAAK,GAAG,IAAI,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM;AACjD,SAAO,IAAI,KAAK,KAAK,MAAM,GAAG,GAAG;AACnC;AAUO,MAAM,kBAAkB;AAAA,EAC7B,CAAC,EAAE,OAAO,UAAU,cAAc,0BAAuB,WAAW,SAAS,GAAG,QAAQ;AACtF,UAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,UAAM,CAAC,OAAO,QAAQ,IAAI,SAAgC,MAAM;AAC9D,UAAI,OAAO,QAAQ,OAAO,IAAI;AAC5B,eAAO;AAAA,UACL,MAAM,iBAAiB,MAAM,IAAI;AAAA,UACjC,IAAI,iBAAiB,MAAM,EAAE;AAAA,QAC/B;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AAED,cAAU,MAAM;AACd,UAAI,OAAO,QAAQ,OAAO,IAAI;AAC5B,iBAAS;AAAA,UACP,MAAM,iBAAiB,MAAM,IAAI;AAAA,UACjC,IAAI,iBAAiB,MAAM,EAAE;AAAA,QAC/B,CAAC;AAAA,MACH,OAAO;AACL,iBAAS,MAAS;AAAA,MACpB;AAAA,IACF,GAAG,CAAC,KAAK,CAAC;AAEV,UAAM,oBAAoB,CAAC,aAAoC;AAC7D,eAAS,QAAQ;AAEjB,UAAI,UAAU,QAAQ,UAAU,IAAI;AAClC,mBAAW;AAAA,UACT,MAAM,OAAO,SAAS,MAAM,YAAY;AAAA,UACxC,IAAI,OAAO,SAAS,IAAI,YAAY;AAAA,QACtC,CAAC;AAAA,MACH,OAAO;AACL,mBAAW,MAAS;AAAA,MACtB;AAAA,IACF;AAEA,UAAM,cAAc,OAAO,QAAQ,OAAO,KACtC,GAAG,OAAO,MAAM,MAAM,YAAY,CAAC,MAAM,OAAO,MAAM,IAAI,YAAY,CAAC,KACvE;AAEJ,WACE,oCAAC,WAAQ,MAAY,cAAc,WACjC,oCAAC,kBAAe,SAAO,QACrB;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA;AAAA,MAEA,oCAAC,gBAAa,MAAM,IAAI,WAAU,iBAAgB;AAAA,MAClD,oCAAC,UAAK,WAAW;AAAA,QACf;AAAA,QACA,OAAO,QAAQ,OAAO,KAAK,kBAAkB;AAAA,MAC/C,KACG,WACH;AAAA,IACF,CACF,GACA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAM;AAAA,QACN,YAAY;AAAA;AAAA,MAEZ,oCAAC,SAAI,WAAU,SACb;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU;AAAA,UACV,UAAU;AAAA,UACV,gBAAgB;AAAA;AAAA,MAClB,CACF;AAAA,IACF,CACF;AAAA,EAEJ;AACF;AAEA,gBAAgB,cAAc;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { cn } from "../../../infra/utils/clsx";
|
|
3
|
+
function Input({ className, type, ...props }) {
|
|
4
|
+
return /* @__PURE__ */ React.createElement(
|
|
5
|
+
"input",
|
|
6
|
+
{
|
|
7
|
+
type,
|
|
8
|
+
"data-slot": "input",
|
|
9
|
+
className: cn(
|
|
10
|
+
"outline-none",
|
|
11
|
+
className
|
|
12
|
+
),
|
|
13
|
+
...props
|
|
14
|
+
}
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
Input
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=Input.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/form/Input.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { cn } from \"../../../infra/utils/clsx\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"outline-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n"],"mappings":"AAAA,YAAY,WAAW;AACvB,SAAS,UAAU;AAEnB,SAAS,MAAM,EAAE,WAAW,MAAM,GAAG,MAAM,GAAkC;AAC3E,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { OTPInput, OTPInputContext } from "input-otp";
|
|
4
|
+
import { MinusIcon } from "lucide-react";
|
|
5
|
+
import { cn } from "../../../infra/utils/clsx";
|
|
6
|
+
function InputOTP({
|
|
7
|
+
className,
|
|
8
|
+
containerClassName,
|
|
9
|
+
...props
|
|
10
|
+
}) {
|
|
11
|
+
return /* @__PURE__ */ React.createElement(
|
|
12
|
+
OTPInput,
|
|
13
|
+
{
|
|
14
|
+
"data-slot": "input-otp",
|
|
15
|
+
containerClassName: cn(
|
|
16
|
+
"flex items-center gap-2 has-disabled:opacity-50",
|
|
17
|
+
containerClassName
|
|
18
|
+
),
|
|
19
|
+
className: cn("disabled:cursor-not-allowed", className),
|
|
20
|
+
...props
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
function InputOTPGroup({ className, ...props }) {
|
|
25
|
+
return /* @__PURE__ */ React.createElement(
|
|
26
|
+
"div",
|
|
27
|
+
{
|
|
28
|
+
"data-slot": "input-otp-group",
|
|
29
|
+
className: cn("flex items-center", className),
|
|
30
|
+
...props
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
function InputOTPSlot({
|
|
35
|
+
index,
|
|
36
|
+
className,
|
|
37
|
+
...props
|
|
38
|
+
}) {
|
|
39
|
+
const inputOTPContext = React.useContext(OTPInputContext);
|
|
40
|
+
const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};
|
|
41
|
+
return /* @__PURE__ */ React.createElement(
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
"data-slot": "input-otp-slot",
|
|
45
|
+
"data-active": isActive,
|
|
46
|
+
className: cn(
|
|
47
|
+
"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",
|
|
48
|
+
"border-gray-200 hover:border-gray-400 data-[active=true]:border-gray-950",
|
|
49
|
+
"data-[active=true]:z-10",
|
|
50
|
+
className
|
|
51
|
+
),
|
|
52
|
+
...props
|
|
53
|
+
},
|
|
54
|
+
char,
|
|
55
|
+
hasFakeCaret && /* @__PURE__ */ React.createElement("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center" }, /* @__PURE__ */ React.createElement("div", { className: "animate-caret-blink bg-foreground h-4 w-px duration-1000" }))
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
function InputOTPSeparator({ ...props }) {
|
|
59
|
+
return /* @__PURE__ */ React.createElement("div", { "data-slot": "input-otp-separator", role: "separator", ...props }, /* @__PURE__ */ React.createElement(MinusIcon, null));
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
InputOTP,
|
|
63
|
+
InputOTPGroup,
|
|
64
|
+
InputOTPSeparator,
|
|
65
|
+
InputOTPSlot
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=InputOtp.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/form/InputOtp.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { OTPInput, OTPInputContext } from \"input-otp\"\nimport { MinusIcon } from \"lucide-react\"\nimport { cn } from \"../../../infra/utils/clsx\"\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"flex items-center gap-2 has-disabled:opacity-50\",\n containerClassName\n )}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"flex items-center\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number\n}) {\n const inputOTPContext = React.useContext(OTPInputContext)\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"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\",\n \"border-gray-200 hover:border-gray-400 data-[active=true]:border-gray-950\",\n \"data-[active=true]:z-10\",\n className\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"animate-caret-blink bg-foreground h-4 w-px duration-1000\" />\n </div>\n )}\n </div>\n )\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"input-otp-separator\" role=\"separator\" {...props}>\n <MinusIcon />\n </div>\n )\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }\n"],"mappings":";AAEA,YAAY,WAAW;AACvB,SAAS,UAAU,uBAAuB;AAC1C,SAAS,iBAAiB;AAC1B,SAAS,UAAU;AAEnB,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAEG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,oBAAoB;AAAA,QAClB;AAAA,QACA;AAAA,MACF;AAAA,MACA,WAAW,GAAG,+BAA+B,SAAS;AAAA,MACrD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC3E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,qBAAqB,SAAS;AAAA,MAC3C,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAEG;AACD,QAAM,kBAAkB,MAAM,WAAW,eAAe;AACxD,QAAM,EAAE,MAAM,cAAc,SAAS,IAAI,iBAAiB,MAAM,KAAK,KAAK,CAAC;AAE3E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,eAAa;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEH;AAAA,IACA,gBACC,oCAAC,SAAI,WAAU,2EACb,oCAAC,SAAI,WAAU,4DAA2D,CAC5E;AAAA,EAEJ;AAEJ;AAEA,SAAS,kBAAkB,EAAE,GAAG,MAAM,GAAgC;AACpE,SACE,oCAAC,SAAI,aAAU,uBAAsB,MAAK,aAAa,GAAG,SACxD,oCAAC,eAAU,CACb;AAEJ;","names":[]}
|