maquinaweb-ui 2.57.2 → 2.58.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.
@@ -1,5 +1,5 @@
1
1
  import { ComponentProps, ElementType } from "react";
2
- import * as react_jsx_runtime3 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime7 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/container-animation/container-animation.d.ts
5
5
  type ContainerAnimationProps<T extends ElementType = 'div'> = ComponentProps<'div'> & ComponentProps<T> & {
@@ -23,7 +23,7 @@ declare const ContainerAnimation: <T extends ElementType = "div">({
23
23
  distance,
24
24
  hideNotInView,
25
25
  ...props
26
- }: ContainerAnimationProps<T>) => react_jsx_runtime3.JSX.Element;
26
+ }: ContainerAnimationProps<T>) => react_jsx_runtime7.JSX.Element;
27
27
  //#endregion
28
28
  export { ContainerAnimation, type ContainerAnimationProps };
29
29
  //# sourceMappingURL=container-animation.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { FieldPath, FieldValues, UseControllerProps } from "react-hook-form";
2
- import * as react_jsx_runtime4 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime1 from "react/jsx-runtime";
3
3
  import { Matcher } from "react-day-picker";
4
4
 
5
5
  //#region src/components/date-field/DateField.d.ts
@@ -29,7 +29,7 @@ declare function DateField<TFieldValues extends FieldValues = FieldValues, TFiel
29
29
  required,
30
30
  help,
31
31
  dateOnly
32
- }: DateFieldProps<TFieldValues, TFieldName>): react_jsx_runtime4.JSX.Element;
32
+ }: DateFieldProps<TFieldValues, TFieldName>): react_jsx_runtime1.JSX.Element;
33
33
  //#endregion
34
34
  export { DateField, type DateFieldProps };
35
35
  //# sourceMappingURL=date-field.d.ts.map
@@ -3,215 +3,16 @@
3
3
 
4
4
  import { t as cn } from "./utils-C8_amEgK.js";
5
5
  import "./label-Bkg7B2j8.js";
6
- import { n as withMask, t as Input } from "./input-Bs61WBGW.js";
6
+ import "./input-Bs61WBGW.js";
7
7
  import { a as FormLabel, i as FormItem, n as FormDescription, o as FormMessage, r as FormFieldContext, t as InputHelp } from "./input-help-D1JqF0YH.js";
8
- import { n as buttonVariants, t as Button } from "./button-B3nLhVyZ.js";
8
+ import "./button-B3nLhVyZ.js";
9
9
  import { n as PopoverContent, r as PopoverTrigger, t as Popover } from "./popover-D9IIn0lW.js";
10
+ import { n as Calendar, t as InputDateField } from "./input-date-field-DToF0FmE.js";
10
11
  import { useController, useFormContext } from "react-hook-form";
11
- import * as React from "react";
12
- import { useEffect, useState } from "react";
12
+ import { useState } from "react";
13
13
  import { jsx, jsxs } from "react/jsx-runtime";
14
- import { ChevronLeft, ChevronRight } from "lucide-react";
15
- import { differenceInCalendarDays, isValid, parse } from "date-fns";
16
- import { DayPicker, labelNext, labelPrevious, useDayPicker } from "react-day-picker";
17
14
  import { ptBR } from "date-fns/locale";
18
15
 
19
- //#region src/components/ui/calendar.tsx
20
- function Calendar({ className, classNames, showOutsideDays = true, yearRange = 12, numberOfMonths,...props }) {
21
- const [navView, setNavView] = React.useState("days");
22
- const [displayYears, setDisplayYears] = React.useState(React.useMemo(() => {
23
- const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
24
- return {
25
- from: currentYear - Math.floor(yearRange / 2 - 1),
26
- to: currentYear + Math.ceil(yearRange / 2)
27
- };
28
- }, [yearRange]));
29
- const { onNextClick, onPrevClick, startMonth, endMonth } = props;
30
- const columnsDisplayed = navView === "years" ? 1 : numberOfMonths;
31
- return /* @__PURE__ */ jsx(DayPicker, {
32
- className: cn("p-3", className),
33
- classNames: {
34
- months: "flex flex-col relative sm:flex-row gap-y-4 sm:gap-y-0",
35
- month_caption: "flex justify-center h-7 mx-10 relative items-center",
36
- weekdays: "flex flex-row",
37
- weekday: "text-muted-foreground w-8 font-normal text-[0.8rem]",
38
- month: "gap-y-4 overflow-x-hidden w-full",
39
- caption: "flex justify-center pt-1 relative items-center",
40
- caption_label: "text-sm font-medium truncate",
41
- button_next: cn(buttonVariants({
42
- variant: "outline",
43
- className: "absolute right-0 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100"
44
- })),
45
- button_previous: cn(buttonVariants({
46
- variant: "outline",
47
- className: "absolute left-0 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100"
48
- })),
49
- nav: "flex items-start",
50
- month_grid: "mt-4",
51
- week: "flex w-full mt-1",
52
- day: "p-0 transition-colors size-8 text-sm flex-1 flex items-center justify-center has-[button]:hover:bg-accent/90! rounded-md has-[button]:hover:aria-selected:bg-primary/50! has-[button]:hover:text-foreground has-[button]:hover:aria-selected:text-foreground",
53
- day_button: cn(buttonVariants({ variant: "ghost" }), "size-8 p-0 font-normal transition-none hover:bg-transparent hover:text-inherit aria-selected:opacity-100"),
54
- range_start: "day-range-start rounded-s-md",
55
- range_end: "day-range-end rounded-e-md",
56
- selected: "bg-primary text-primary-foreground hover:bg-primary! hover:text-primary-foreground focus:bg-primary! focus:text-primary-foreground",
57
- today: "bg-accent text-accent-foreground",
58
- outside: "day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30",
59
- disabled: "text-muted-foreground opacity-50",
60
- range_middle: "aria-selected:bg-accent hover:aria-selected:bg-accent! rounded-none aria-selected:text-accent-foreground hover:aria-selected:text-accent-foreground",
61
- hidden: "invisible",
62
- ...classNames
63
- },
64
- components: {
65
- Chevron: ({ orientation }) => {
66
- return /* @__PURE__ */ jsx(orientation === "left" ? ChevronLeft : ChevronRight, { className: "h-4 w-4" });
67
- },
68
- Nav: ({ className: className$1, children,...props$1 }) => {
69
- const { nextMonth, previousMonth, goToMonth } = useDayPicker();
70
- const isPreviousDisabled = (() => {
71
- if (navView === "years") return startMonth && differenceInCalendarDays(new Date(displayYears.from - 1, 0, 1), startMonth) < 0 || endMonth && differenceInCalendarDays(new Date(displayYears.from - 1, 0, 1), endMonth) > 0;
72
- return !previousMonth;
73
- })();
74
- const isNextDisabled = (() => {
75
- if (navView === "years") return startMonth && differenceInCalendarDays(new Date(displayYears.to + 1, 0, 1), startMonth) < 0 || endMonth && differenceInCalendarDays(new Date(displayYears.to + 1, 0, 1), endMonth) > 0;
76
- return !nextMonth;
77
- })();
78
- const handlePreviousClick = React.useCallback(() => {
79
- if (!previousMonth) return;
80
- if (navView === "years") {
81
- setDisplayYears((prev) => ({
82
- from: prev.from - (prev.to - prev.from + 1),
83
- to: prev.to - (prev.to - prev.from + 1)
84
- }));
85
- onPrevClick?.(new Date(displayYears.from - (displayYears.to - displayYears.from), 0, 1));
86
- return;
87
- }
88
- goToMonth(previousMonth);
89
- onPrevClick?.(previousMonth);
90
- }, [previousMonth, goToMonth]);
91
- const handleNextClick = React.useCallback(() => {
92
- if (navView === "years") {
93
- setDisplayYears((prev) => ({
94
- from: prev.from + (prev.to - prev.from + 1),
95
- to: prev.to + (prev.to - prev.from + 1)
96
- }));
97
- onNextClick?.(new Date(displayYears.from + (displayYears.to - displayYears.from), 0, 1));
98
- return;
99
- }
100
- if (!nextMonth) return;
101
- goToMonth(nextMonth);
102
- onNextClick?.(nextMonth);
103
- }, [goToMonth, nextMonth]);
104
- return /* @__PURE__ */ jsxs("nav", {
105
- className: cn("flex items-center", className$1),
106
- children: [/* @__PURE__ */ jsx(Button, {
107
- "aria-label": navView === "years" ? `Go to the previous ${displayYears.to - displayYears.from + 1} years` : labelPrevious(previousMonth),
108
- className: "absolute left-0 h-7 w-7 bg-transparent p-0 opacity-80 hover:opacity-100",
109
- disabled: isPreviousDisabled,
110
- onClick: handlePreviousClick,
111
- tabIndex: isPreviousDisabled ? void 0 : -1,
112
- type: "button",
113
- variant: "outline",
114
- children: /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" })
115
- }), /* @__PURE__ */ jsx(Button, {
116
- "aria-label": navView === "years" ? `Go to the next ${displayYears.to - displayYears.from + 1} years` : labelNext(nextMonth),
117
- className: "absolute right-0 h-7 w-7 bg-transparent p-0 opacity-80 hover:opacity-100",
118
- disabled: isNextDisabled,
119
- onClick: handleNextClick,
120
- tabIndex: isNextDisabled ? void 0 : -1,
121
- type: "button",
122
- variant: "outline",
123
- children: /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" })
124
- })]
125
- });
126
- },
127
- CaptionLabel: ({ children }) => /* @__PURE__ */ jsx(Button, {
128
- className: "h-7 w-full truncate text-sm font-medium capitalize",
129
- onClick: () => setNavView((prev) => prev === "days" ? "years" : "days"),
130
- size: "sm",
131
- variant: "ghost",
132
- children: navView === "days" ? children : displayYears.from + " - " + displayYears.to
133
- }),
134
- MonthGrid: ({ className: className$1, children,...props$1 }) => {
135
- const { goToMonth } = useDayPicker();
136
- if (navView === "years") return /* @__PURE__ */ jsx("div", {
137
- className: cn("grid grid-cols-4 gap-y-1", className$1),
138
- ...props$1,
139
- children: Array.from({ length: displayYears.to - displayYears.from + 1 }, (_, i) => {
140
- const isBefore = differenceInCalendarDays(new Date(displayYears.from + i, 12, 31), startMonth) < 0;
141
- const isAfter = differenceInCalendarDays(new Date(displayYears.from + i, 0, 0), endMonth) > 0;
142
- const isDisabled = isBefore || isAfter;
143
- return /* @__PURE__ */ jsx(Button, {
144
- className: cn("h-10 w-full text-sm font-normal text-foreground", displayYears.from + i === (/* @__PURE__ */ new Date()).getFullYear() && "bg-accent font-medium text-accent-foreground"),
145
- disabled: navView === "years" ? isDisabled : void 0,
146
- onClick: () => {
147
- setNavView("days");
148
- goToMonth(new Date(displayYears.from + i, (/* @__PURE__ */ new Date()).getMonth()));
149
- },
150
- variant: "ghost",
151
- children: displayYears.from + i
152
- }, i);
153
- })
154
- });
155
- return /* @__PURE__ */ jsx("table", {
156
- className: className$1,
157
- ...props$1,
158
- children
159
- });
160
- }
161
- },
162
- numberOfMonths: columnsDisplayed,
163
- showOutsideDays,
164
- style: { width: 248.8 * (columnsDisplayed ?? 1) + "px" },
165
- ...props
166
- });
167
- }
168
- Calendar.displayName = "Calendar";
169
-
170
- //#endregion
171
- //#region src/components/ui/input-date-field.tsx
172
- const InputDateField = ({ field, disabled, onFinish, id, dateOnly,...props }) => {
173
- const [inputValue, setInputValue] = useState("");
174
- const handleChange = (e) => {
175
- const parts = e.target.value.split("/");
176
- let day = parts[0];
177
- let month = parts[1];
178
- if (day && Number(day) > 31) parts[0] = day.slice(0, 1).padStart(2, "0");
179
- if (month && Number(month) > 12) parts[1] = month.slice(0, 1).padStart(2, "0");
180
- const newValue = parts.join("/");
181
- setInputValue(parts.join("/"));
182
- if (newValue.length === 10) {
183
- const parsedDate = parse(newValue, "dd/MM/yyyy", /* @__PURE__ */ new Date());
184
- if (isValid(parsedDate)) {
185
- if (dateOnly) {
186
- const year = parsedDate.getFullYear();
187
- const monthStr = String(parsedDate.getMonth() + 1).padStart(2, "0");
188
- const dayStr = String(parsedDate.getDate()).padStart(2, "0");
189
- field.onChange(`${year}-${monthStr}-${dayStr}`);
190
- } else field.onChange(parsedDate);
191
- onFinish?.();
192
- }
193
- }
194
- };
195
- useEffect(() => {
196
- if (field.value) {
197
- const value = typeof field.value === "string" ? parse(field.value, "yyyy-MM-dd", /* @__PURE__ */ new Date()) : field.value;
198
- if (isValid(value)) setInputValue(value.toLocaleDateString("pt-BR"));
199
- } else setInputValue("");
200
- }, [field.value]);
201
- return /* @__PURE__ */ jsx(Input, {
202
- autoComplete: "off",
203
- className: "w-full outline-hidden",
204
- id,
205
- onChange: handleChange,
206
- placeholder: "Selecione a data",
207
- readOnly: disabled,
208
- ref: withMask("99/99/9999", { undoOnEscape: false }),
209
- value: inputValue,
210
- ...props
211
- });
212
- };
213
-
214
- //#endregion
215
16
  //#region src/components/date-field/DateField.tsx
216
17
  function DateField({ name, label, description, inputDisabled, endMonth, className, disabled, initialValue, required, help, dateOnly }) {
217
18
  const form = useFormContext();
@@ -1 +1 @@
1
- {"version":3,"file":"date-field.js","names":["props","className","InputDateField: React.FC<\n {\n field: ControllerRenderProps<any, string>;\n disabled?: boolean;\n onFinish?: () => void;\n id?: string;\n dateOnly?: boolean;\n } & ComponentProps<typeof Input>\n>"],"sources":["../src/components/ui/calendar.tsx","../src/components/ui/input-date-field.tsx","../src/components/date-field/DateField.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nimport { Button, buttonVariants } from '@/components/ui/button';\n\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\nimport { differenceInCalendarDays } from 'date-fns';\nimport {\n DayPicker,\n labelNext,\n labelPrevious,\n useDayPicker,\n} from 'react-day-picker';\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker> & {\n /**\n * In the year view, the number of years to display at once.\n * @default 12\n */\n yearRange?: number;\n};\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n yearRange = 12,\n numberOfMonths,\n ...props\n}: CalendarProps) {\n const [navView, setNavView] = React.useState<'days' | 'years'>('days');\n const [displayYears, setDisplayYears] = React.useState<{\n from: number;\n to: number;\n }>(\n React.useMemo(() => {\n const currentYear = new Date().getFullYear();\n return {\n from: currentYear - Math.floor(yearRange / 2 - 1),\n to: currentYear + Math.ceil(yearRange / 2),\n };\n }, [yearRange])\n );\n\n const { onNextClick, onPrevClick, startMonth, endMonth } = props;\n\n const columnsDisplayed = navView === 'years' ? 1 : numberOfMonths;\n\n return (\n <DayPicker\n className={cn('p-3', className)}\n classNames={{\n months: 'flex flex-col relative sm:flex-row gap-y-4 sm:gap-y-0',\n month_caption: 'flex justify-center h-7 mx-10 relative items-center',\n weekdays: 'flex flex-row',\n weekday: 'text-muted-foreground w-8 font-normal text-[0.8rem]',\n month: 'gap-y-4 overflow-x-hidden w-full',\n caption: 'flex justify-center pt-1 relative items-center',\n caption_label: 'text-sm font-medium truncate',\n button_next: cn(\n buttonVariants({\n variant: 'outline',\n className:\n 'absolute right-0 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100',\n })\n ),\n button_previous: cn(\n buttonVariants({\n variant: 'outline',\n className:\n 'absolute left-0 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100',\n })\n ),\n nav: 'flex items-start',\n month_grid: 'mt-4',\n week: 'flex w-full mt-1',\n day: 'p-0 transition-colors size-8 text-sm flex-1 flex items-center justify-center has-[button]:hover:bg-accent/90! rounded-md has-[button]:hover:aria-selected:bg-primary/50! has-[button]:hover:text-foreground has-[button]:hover:aria-selected:text-foreground',\n day_button: cn(\n buttonVariants({ variant: 'ghost' }),\n 'size-8 p-0 font-normal transition-none hover:bg-transparent hover:text-inherit aria-selected:opacity-100'\n ),\n range_start: 'day-range-start rounded-s-md',\n range_end: 'day-range-end rounded-e-md',\n selected:\n 'bg-primary text-primary-foreground hover:bg-primary! hover:text-primary-foreground focus:bg-primary! focus:text-primary-foreground',\n today: 'bg-accent text-accent-foreground',\n outside:\n 'day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30',\n disabled: 'text-muted-foreground opacity-50',\n range_middle:\n 'aria-selected:bg-accent hover:aria-selected:bg-accent! rounded-none aria-selected:text-accent-foreground hover:aria-selected:text-accent-foreground',\n hidden: 'invisible',\n ...classNames,\n }}\n components={{\n Chevron: ({ orientation }) => {\n const Icon = orientation === 'left' ? ChevronLeft : ChevronRight;\n return <Icon className=\"h-4 w-4\" />;\n },\n Nav: ({ className, children, ...props }) => {\n const { nextMonth, previousMonth, goToMonth } = useDayPicker();\n\n const isPreviousDisabled = (() => {\n if (navView === 'years') {\n return (\n (startMonth &&\n differenceInCalendarDays(\n new Date(displayYears.from - 1, 0, 1),\n startMonth\n ) < 0) ||\n (endMonth &&\n differenceInCalendarDays(\n new Date(displayYears.from - 1, 0, 1),\n endMonth\n ) > 0)\n );\n }\n return !previousMonth;\n })();\n\n const isNextDisabled = (() => {\n if (navView === 'years') {\n return (\n (startMonth &&\n differenceInCalendarDays(\n new Date(displayYears.to + 1, 0, 1),\n startMonth\n ) < 0) ||\n (endMonth &&\n differenceInCalendarDays(\n new Date(displayYears.to + 1, 0, 1),\n endMonth\n ) > 0)\n );\n }\n return !nextMonth;\n })();\n\n const handlePreviousClick = React.useCallback(() => {\n if (!previousMonth) return;\n if (navView === 'years') {\n setDisplayYears((prev) => ({\n from: prev.from - (prev.to - prev.from + 1),\n to: prev.to - (prev.to - prev.from + 1),\n }));\n onPrevClick?.(\n new Date(\n displayYears.from - (displayYears.to - displayYears.from),\n 0,\n 1\n )\n );\n return;\n }\n goToMonth(previousMonth);\n onPrevClick?.(previousMonth);\n }, [previousMonth, goToMonth]);\n\n const handleNextClick = React.useCallback(() => {\n if (navView === 'years') {\n setDisplayYears((prev) => ({\n from: prev.from + (prev.to - prev.from + 1),\n to: prev.to + (prev.to - prev.from + 1),\n }));\n onNextClick?.(\n new Date(\n displayYears.from + (displayYears.to - displayYears.from),\n 0,\n 1\n )\n );\n return;\n }\n if (!nextMonth) return;\n goToMonth(nextMonth);\n onNextClick?.(nextMonth);\n }, [goToMonth, nextMonth]);\n\n return (\n <nav className={cn('flex items-center', className)}>\n <Button\n aria-label={\n navView === 'years'\n ? `Go to the previous ${\n displayYears.to - displayYears.from + 1\n } years`\n : labelPrevious(previousMonth)\n }\n className=\"absolute left-0 h-7 w-7 bg-transparent p-0 opacity-80 hover:opacity-100\"\n disabled={isPreviousDisabled}\n onClick={handlePreviousClick}\n tabIndex={isPreviousDisabled ? undefined : -1}\n type=\"button\"\n variant=\"outline\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n\n <Button\n aria-label={\n navView === 'years'\n ? `Go to the next ${\n displayYears.to - displayYears.from + 1\n } years`\n : labelNext(nextMonth)\n }\n className=\"absolute right-0 h-7 w-7 bg-transparent p-0 opacity-80 hover:opacity-100\"\n disabled={isNextDisabled}\n onClick={handleNextClick}\n tabIndex={isNextDisabled ? undefined : -1}\n type=\"button\"\n variant=\"outline\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </nav>\n );\n },\n CaptionLabel: ({ children }) => (\n <Button\n className=\"h-7 w-full truncate text-sm font-medium capitalize\"\n onClick={() =>\n setNavView((prev) => (prev === 'days' ? 'years' : 'days'))\n }\n size=\"sm\"\n variant=\"ghost\"\n >\n {navView === 'days'\n ? children\n : displayYears.from + ' - ' + displayYears.to}\n </Button>\n ),\n MonthGrid: ({ className, children, ...props }) => {\n const { goToMonth } = useDayPicker();\n if (navView === 'years') {\n return (\n <div\n className={cn('grid grid-cols-4 gap-y-1', className)}\n {...props}\n >\n {Array.from(\n { length: displayYears.to - displayYears.from + 1 },\n (_, i) => {\n const isBefore =\n differenceInCalendarDays(\n new Date(displayYears.from + i, 12, 31),\n startMonth!\n ) < 0;\n\n const isAfter =\n differenceInCalendarDays(\n new Date(displayYears.from + i, 0, 0),\n endMonth!\n ) > 0;\n\n const isDisabled = isBefore || isAfter;\n return (\n <Button\n className={cn(\n 'h-10 w-full text-sm font-normal text-foreground',\n displayYears.from + i === new Date().getFullYear() &&\n 'bg-accent font-medium text-accent-foreground'\n )}\n disabled={navView === 'years' ? isDisabled : undefined}\n key={i}\n onClick={() => {\n setNavView('days');\n goToMonth(\n new Date(\n displayYears.from + i,\n new Date().getMonth()\n )\n );\n }}\n variant=\"ghost\"\n >\n {displayYears.from + i}\n </Button>\n );\n }\n )}\n </div>\n );\n }\n return (\n <table className={className} {...props}>\n {children}\n </table>\n );\n },\n }}\n numberOfMonths={columnsDisplayed}\n showOutsideDays={showOutsideDays}\n style={{\n width: 248.8 * (columnsDisplayed ?? 1) + 'px',\n }}\n {...props}\n />\n );\n}\nCalendar.displayName = 'Calendar';\n\nexport { Calendar };\n","import { ComponentProps, useEffect, useState } from 'react';\n\nimport type { ControllerRenderProps } from 'react-hook-form';\nimport withMask from '@/hooks/with-mask';\n\nimport { isValid, parse } from 'date-fns';\nimport { Input } from './input';\n\nconst InputDateField: React.FC<\n {\n field: ControllerRenderProps<any, string>;\n disabled?: boolean;\n onFinish?: () => void;\n id?: string;\n dateOnly?: boolean;\n } & ComponentProps<typeof Input>\n> = ({ field, disabled, onFinish, id, dateOnly, ...props }) => {\n const [inputValue, setInputValue] = useState('');\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const parts = e.target.value.split('/');\n let day = parts[0];\n let month = parts[1];\n if (day && Number(day) > 31) {\n parts[0] = day.slice(0, 1).padStart(2, '0');\n }\n if (month && Number(month) > 12) {\n parts[1] = month.slice(0, 1).padStart(2, '0');\n }\n\n const newValue = parts.join('/');\n setInputValue(parts.join('/'));\n\n if (newValue.length === 10) {\n const parsedDate = parse(newValue, 'dd/MM/yyyy', new Date());\n if (isValid(parsedDate)) {\n if (dateOnly) {\n const year = parsedDate.getFullYear();\n const monthStr = String(parsedDate.getMonth() + 1).padStart(2, '0');\n const dayStr = String(parsedDate.getDate()).padStart(2, '0');\n field.onChange(`${year}-${monthStr}-${dayStr}`);\n } else {\n field.onChange(parsedDate);\n }\n onFinish?.();\n }\n }\n };\n\n useEffect(() => {\n if (field.value) {\n const value =\n typeof field.value === 'string'\n ? parse(field.value, 'yyyy-MM-dd', new Date())\n : field.value;\n\n if (isValid(value)) {\n setInputValue(value.toLocaleDateString('pt-BR'));\n }\n } else {\n setInputValue('');\n }\n }, [field.value]);\n\n return (\n <Input\n autoComplete=\"off\"\n className=\"w-full outline-hidden\"\n id={id}\n onChange={handleChange}\n placeholder=\"Selecione a data\"\n readOnly={disabled}\n ref={\n withMask('99/99/9999', {\n undoOnEscape: false,\n }) as any\n }\n value={inputValue}\n {...props}\n />\n );\n};\n\nexport { InputDateField };\n","'use client';\n\nimport { useState } from 'react';\n\nimport {\n type FieldPath,\n type FieldValues,\n type UseControllerProps,\n useController,\n useFormContext,\n} from 'react-hook-form';\n\nimport { Calendar } from '@/ui/calendar';\nimport {\n FormDescription,\n FormFieldContext,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@/ui/form';\nimport { InputDateField } from '@/ui/input-date-field';\nimport { InputHelp } from '@/ui/input-help';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ui/popover';\n\nimport { cn } from '@/lib/utils';\nimport { ptBR } from 'date-fns/locale';\nimport type { Matcher } from 'react-day-picker';\n\nexport interface DateFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> extends Omit<UseControllerProps<TFieldValues, TFieldName>, 'disabled'> {\n label: string;\n description?: string;\n placeholder?: string;\n className?: string;\n disabled?: Matcher | Matcher[] | undefined;\n inputDisabled?: boolean;\n initialValue?: Date;\n endMonth?: Date;\n required?: boolean;\n help?: string;\n /** Quando true, o valor será formatado como string YYYY-MM-DD ao invés de Date com horário */\n dateOnly?: boolean;\n}\n\nfunction DateField<\n TFieldValues extends FieldValues = FieldValues,\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n name,\n label,\n description,\n inputDisabled,\n endMonth,\n className,\n disabled,\n initialValue,\n required,\n help,\n dateOnly,\n}: DateFieldProps<TFieldValues, TFieldName>) {\n const form = useFormContext();\n const { field, fieldState } = useController({\n name,\n defaultValue: initialValue as any,\n rules: { required },\n control: form.control,\n });\n\n const [isOpen, setIsOpen] = useState(false);\n const handleSelect = (date: Date | undefined) => {\n if (dateOnly && date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n field.onChange(`${year}-${month}-${day}`);\n } else {\n field.onChange(date);\n }\n setIsOpen(false);\n };\n\n return (\n <FormFieldContext.Provider value={{ name }}>\n <FormItem className={className} id={`date-${name.replace('.', '-')}`}>\n <div className=\"flex items-end gap-1.5\">\n <FormLabel htmlFor={name}>\n {label}:\n {required && (\n <span className=\"text-red-500 text-lg leading-[1px]\">*</span>\n )}\n </FormLabel>\n\n <InputHelp help={help} name={name} />\n </div>\n\n <Popover onOpenChange={setIsOpen} open={!inputDisabled && isOpen}>\n <PopoverTrigger\n className=\"w-full mt-0! outline-hidden\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n tabIndex={-1}\n >\n <InputDateField\n className={cn(fieldState.error && 'border-destructive')}\n dateOnly={dateOnly}\n disabled={inputDisabled}\n field={field}\n id={name}\n onFinish={() => setIsOpen(false)}\n onFocus={() => setIsOpen(true)}\n />\n </PopoverTrigger>\n <PopoverContent\n className=\"flex justify-center w-fit p-0\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <Calendar\n defaultMonth={field.value || new Date()}\n disabled={disabled}\n endMonth={endMonth}\n key={`${name}-${field.value?.toString()}`}\n locale={ptBR}\n mode=\"single\"\n onSelect={handleSelect}\n selected={field.value}\n />\n </PopoverContent>\n </Popover>\n\n <FormDescription>{description}</FormDescription>\n {fieldState.error && <FormMessage />}\n </FormItem>\n </FormFieldContext.Provider>\n );\n}\n\nexport { DateField };\n"],"mappings":"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"}
1
+ {"version":3,"file":"date-field.js","names":[],"sources":["../src/components/date-field/DateField.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\n\nimport {\n type FieldPath,\n type FieldValues,\n type UseControllerProps,\n useController,\n useFormContext,\n} from 'react-hook-form';\n\nimport { Calendar } from '@/ui/calendar';\nimport {\n FormDescription,\n FormFieldContext,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@/ui/form';\nimport { InputDateField } from '@/ui/input-date-field';\nimport { InputHelp } from '@/ui/input-help';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ui/popover';\n\nimport { cn } from '@/lib/utils';\nimport { ptBR } from 'date-fns/locale';\nimport type { Matcher } from 'react-day-picker';\n\nexport interface DateFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> extends Omit<UseControllerProps<TFieldValues, TFieldName>, 'disabled'> {\n label: string;\n description?: string;\n placeholder?: string;\n className?: string;\n disabled?: Matcher | Matcher[] | undefined;\n inputDisabled?: boolean;\n initialValue?: Date;\n endMonth?: Date;\n required?: boolean;\n help?: string;\n /** Quando true, o valor será formatado como string YYYY-MM-DD ao invés de Date com horário */\n dateOnly?: boolean;\n}\n\nfunction DateField<\n TFieldValues extends FieldValues = FieldValues,\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n name,\n label,\n description,\n inputDisabled,\n endMonth,\n className,\n disabled,\n initialValue,\n required,\n help,\n dateOnly,\n}: DateFieldProps<TFieldValues, TFieldName>) {\n const form = useFormContext();\n const { field, fieldState } = useController({\n name,\n defaultValue: initialValue as any,\n rules: { required },\n control: form.control,\n });\n\n const [isOpen, setIsOpen] = useState(false);\n const handleSelect = (date: Date | undefined) => {\n if (dateOnly && date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n field.onChange(`${year}-${month}-${day}`);\n } else {\n field.onChange(date);\n }\n setIsOpen(false);\n };\n\n return (\n <FormFieldContext.Provider value={{ name }}>\n <FormItem className={className} id={`date-${name.replace('.', '-')}`}>\n <div className=\"flex items-end gap-1.5\">\n <FormLabel htmlFor={name}>\n {label}:\n {required && (\n <span className=\"text-red-500 text-lg leading-[1px]\">*</span>\n )}\n </FormLabel>\n\n <InputHelp help={help} name={name} />\n </div>\n\n <Popover onOpenChange={setIsOpen} open={!inputDisabled && isOpen}>\n <PopoverTrigger\n className=\"w-full mt-0! outline-hidden\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n tabIndex={-1}\n >\n <InputDateField\n className={cn(fieldState.error && 'border-destructive')}\n dateOnly={dateOnly}\n disabled={inputDisabled}\n field={field}\n id={name}\n onFinish={() => setIsOpen(false)}\n onFocus={() => setIsOpen(true)}\n />\n </PopoverTrigger>\n <PopoverContent\n className=\"flex justify-center w-fit p-0\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <Calendar\n defaultMonth={field.value || new Date()}\n disabled={disabled}\n endMonth={endMonth}\n key={`${name}-${field.value?.toString()}`}\n locale={ptBR}\n mode=\"single\"\n onSelect={handleSelect}\n selected={field.value}\n />\n </PopoverContent>\n </Popover>\n\n <FormDescription>{description}</FormDescription>\n {fieldState.error && <FormMessage />}\n </FormItem>\n </FormFieldContext.Provider>\n );\n}\n\nexport { DateField };\n"],"mappings":";;;;;;;;;;;;;;;;AA8CA,SAAS,UAGP,EACA,MACA,OACA,aACA,eACA,UACA,WACA,UACA,cACA,UACA,MACA,YAC2C;CAC3C,MAAM,OAAO,gBAAgB;CAC7B,MAAM,EAAE,OAAO,eAAe,cAAc;EAC1C;EACA,cAAc;EACd,OAAO,EAAE,UAAU;EACnB,SAAS,KAAK;EACf,CAAC;CAEF,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;CAC3C,MAAM,gBAAgB,SAA2B;AAC/C,MAAI,YAAY,MAAM;GACpB,MAAM,OAAO,KAAK,aAAa;GAC/B,MAAM,QAAQ,OAAO,KAAK,UAAU,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI;GAC1D,MAAM,MAAM,OAAO,KAAK,SAAS,CAAC,CAAC,SAAS,GAAG,IAAI;AACnD,SAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM;QAEzC,OAAM,SAAS,KAAK;AAEtB,YAAU,MAAM;;AAGlB,QACE,oBAAC,iBAAiB;EAAS,OAAO,EAAE,MAAM;YACxC,qBAAC;GAAoB;GAAW,IAAI,QAAQ,KAAK,QAAQ,KAAK,IAAI;;IAChE,qBAAC;KAAI,WAAU;gBACb,qBAAC;MAAU,SAAS;;OACjB;OAAM;OACN,YACC,oBAAC;QAAK,WAAU;kBAAqC;SAAQ;;OAErD,EAEZ,oBAAC;MAAgB;MAAY;OAAQ;MACjC;IAEN,qBAAC;KAAQ,cAAc;KAAW,MAAM,CAAC,iBAAiB;gBACxD,oBAAC;MACC,WAAU;MACV,UAAU,UAAU;AAClB,aAAM,gBAAgB;AACtB,aAAM,iBAAiB;;MAEzB,UAAU;gBAEV,oBAAC;OACC,WAAW,GAAG,WAAW,SAAS,qBAAqB;OAC7C;OACV,UAAU;OACH;OACP,IAAI;OACJ,gBAAgB,UAAU,MAAM;OAChC,eAAe,UAAU,KAAK;QAC9B;OACa,EACjB,oBAAC;MACC,WAAU;MACV,kBAAkB,MAAM,EAAE,gBAAgB;gBAE1C,oBAAC;OACC,cAAc,MAAM,yBAAS,IAAI,MAAM;OAC7B;OACA;OAEV,QAAQ;OACR,MAAK;OACL,UAAU;OACV,UAAU,MAAM;SAJX,GAAG,KAAK,GAAG,MAAM,OAAO,UAAU,GAKvC;OACa;MACT;IAEV,oBAAC,6BAAiB,cAA8B;IAC/C,WAAW,SAAS,oBAAC,gBAAc;;IAC3B;GACe"}
@@ -0,0 +1,33 @@
1
+ import { FieldPath, FieldValues, UseControllerProps } from "react-hook-form";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+ import { Matcher } from "react-day-picker";
4
+
5
+ //#region src/components/date-hour-field/DateHourField.d.ts
6
+ interface DateHourFieldProps<TFieldValues extends FieldValues = FieldValues, TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> extends Omit<UseControllerProps<TFieldValues, TFieldName>, 'disabled'> {
7
+ label: string;
8
+ description?: string;
9
+ className?: string;
10
+ disabled?: Matcher | Matcher[] | undefined;
11
+ inputDisabled?: boolean;
12
+ initialValue?: Date;
13
+ endMonth?: Date;
14
+ required?: boolean;
15
+ help?: string;
16
+ hourPlaceholder?: string;
17
+ }
18
+ declare function DateHourField<TFieldValues extends FieldValues = FieldValues, TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({
19
+ name,
20
+ label,
21
+ description,
22
+ inputDisabled,
23
+ endMonth,
24
+ className,
25
+ disabled,
26
+ initialValue,
27
+ required,
28
+ help,
29
+ hourPlaceholder
30
+ }: DateHourFieldProps<TFieldValues, TFieldName>): react_jsx_runtime0.JSX.Element;
31
+ //#endregion
32
+ export { DateHourField, type DateHourFieldProps };
33
+ //# sourceMappingURL=date-hour-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-hour-field.d.ts","names":[],"sources":["../src/components/date-hour-field/DateHourField.tsx"],"sourcesContent":[],"mappings":";;;;;UAoHiB,wCACM,cAAc,gCAChB,UAAU,gBAAgB,UAAU,uBAC/C,KAAK,mBAAmB,cAAc;;;EAH/B,SAAA,CAAA,EAAA,MAAA;EACM,QAAA,CAAA,EAMV,OANU,GAMA,OANA,EAAA,GAAA,SAAA;EAAc,aAAA,CAAA,EAAA,OAAA;EACN,YAAA,CAAA,EAOd,IAPc;EAAV,QAAA,CAAA,EAQR,IARQ;EAAoC,QAAA,CAAA,EAAA,OAAA;EAAV,IAAA,CAAA,EAAA,MAAA;EACb,eAAA,CAAA,EAAA,MAAA;;iBAazB,aAbM,CAAA,qBAcQ,WAdR,GAcsB,WAdtB,EAAA,mBAeM,SAfN,CAegB,YAfhB,CAAA,GAegC,SAfhC,CAe0C,YAf1C,CAAA,CAAA,CAAA;EAAA,IAAA;EAAA,KAAA;EAAA,WAAA;EAAA,aAAA;EAAA,QAAA;EAAA,SAAA;EAAA,QAAA;EAAA,YAAA;EAAA,QAAA;EAAA,IAAA;EAAA;AAAA,CAAA,EA4BZ,kBA5BY,CA4BO,YA5BP,EA4BqB,UA5BrB,CAAA,CAAA,EA4BgC,kBAAA,CAAA,GAAA,CAAA,OA5BhC"}
@@ -0,0 +1,242 @@
1
+ 'use client';
2
+
3
+
4
+ import { t as cn } from "./utils-C8_amEgK.js";
5
+ import "./label-Bkg7B2j8.js";
6
+ import { n as withMask, t as Input } from "./input-Bs61WBGW.js";
7
+ import { a as FormLabel, i as FormItem, n as FormDescription, o as FormMessage, r as FormFieldContext, t as InputHelp } from "./input-help-D1JqF0YH.js";
8
+ import "./button-B3nLhVyZ.js";
9
+ import { n as PopoverContent, r as PopoverTrigger, t as Popover } from "./popover-D9IIn0lW.js";
10
+ import { n as Calendar, t as InputDateField } from "./input-date-field-DToF0FmE.js";
11
+ import { useController, useFormContext } from "react-hook-form";
12
+ import { useEffect, useMemo, useState } from "react";
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
+ import useEmblaCarousel from "embla-carousel-react";
15
+ import { WheelGesturesPlugin } from "embla-carousel-wheel-gestures";
16
+ import { isValid, parse } from "date-fns";
17
+ import { ptBR } from "date-fns/locale";
18
+
19
+ //#region src/components/date-hour-field/DateHourField.tsx
20
+ const HOUR_OPTIONS = Array.from({ length: 24 }, (_, index) => `${String(index).padStart(2, "0")}:00`);
21
+ const parseTime = (value) => {
22
+ const match = value.match(/^(\d{2}):(\d{2})$/);
23
+ if (!match) return void 0;
24
+ const hours = Number(match[1]);
25
+ const minutes = Number(match[2]);
26
+ if (Number.isNaN(hours) || Number.isNaN(minutes) || hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return;
27
+ return {
28
+ hours,
29
+ minutes
30
+ };
31
+ };
32
+ const normalizeDateValue = (value) => {
33
+ if (!value) return void 0;
34
+ if (value instanceof Date) return isValid(value) ? value : void 0;
35
+ if (typeof value === "string") {
36
+ const parsedDateOnly = parse(value, "yyyy-MM-dd", /* @__PURE__ */ new Date());
37
+ if (isValid(parsedDateOnly)) return parsedDateOnly;
38
+ const parsedAsDate = new Date(value);
39
+ if (isValid(parsedAsDate)) return parsedAsDate;
40
+ }
41
+ };
42
+ const formatTime = (date) => {
43
+ return `${String(date.getHours()).padStart(2, "0")}:${String(date.getMinutes()).padStart(2, "0")}`;
44
+ };
45
+ const mergeDateAndTime = (selectedDate, timeValue, fallbackDate) => {
46
+ const mergedDate = new Date(selectedDate);
47
+ const parsedTime = parseTime(timeValue);
48
+ if (parsedTime) {
49
+ mergedDate.setHours(parsedTime.hours, parsedTime.minutes, 0, 0);
50
+ return mergedDate;
51
+ }
52
+ if (fallbackDate) {
53
+ mergedDate.setHours(fallbackDate.getHours(), fallbackDate.getMinutes(), 0, 0);
54
+ return mergedDate;
55
+ }
56
+ mergedDate.setHours(0, 0, 0, 0);
57
+ return mergedDate;
58
+ };
59
+ function DateHourField({ name, label, description, inputDisabled, endMonth, className, disabled, initialValue, required, help, hourPlaceholder = "Hora" }) {
60
+ const form = useFormContext();
61
+ const { field, fieldState } = useController({
62
+ name,
63
+ defaultValue: initialValue,
64
+ rules: { required },
65
+ control: form.control
66
+ });
67
+ const [isOpen, setIsOpen] = useState(false);
68
+ const [timeValue, setTimeValue] = useState("");
69
+ const [emblaRef, emblaApi] = useEmblaCarousel({
70
+ axis: "y",
71
+ align: "center",
72
+ containScroll: "trimSnaps",
73
+ dragFree: true
74
+ }, useMemo(() => [WheelGesturesPlugin()], []));
75
+ const valueAsDate = normalizeDateValue(field.value);
76
+ const selectedHour = parseTime(timeValue)?.hours;
77
+ useEffect(() => {
78
+ setTimeValue(valueAsDate ? formatTime(valueAsDate) : "");
79
+ }, [field.value, valueAsDate]);
80
+ useEffect(() => {
81
+ if (!emblaApi || !isOpen) return;
82
+ emblaApi.reInit();
83
+ if (selectedHour === void 0) {
84
+ emblaApi.scrollTo(0, true);
85
+ return;
86
+ }
87
+ emblaApi.scrollTo(selectedHour, true);
88
+ }, [
89
+ emblaApi,
90
+ isOpen,
91
+ selectedHour
92
+ ]);
93
+ const handleDateSelect = (date) => {
94
+ if (!date) {
95
+ field.onChange(void 0);
96
+ return;
97
+ }
98
+ const mergedDate = mergeDateAndTime(date, timeValue, valueAsDate);
99
+ field.onChange(mergedDate);
100
+ };
101
+ const handleTimeInputChange = (nextValue) => {
102
+ setTimeValue(nextValue);
103
+ if (nextValue.length !== 5) return;
104
+ const parsedTime = parseTime(nextValue);
105
+ if (!parsedTime) return;
106
+ const baseDate = valueAsDate || /* @__PURE__ */ new Date();
107
+ const nextDate = new Date(baseDate);
108
+ nextDate.setHours(parsedTime.hours, parsedTime.minutes, 0, 0);
109
+ field.onChange(nextDate);
110
+ };
111
+ const handleHourSelect = (hourLabel) => {
112
+ const selectedTime = parseTime(hourLabel);
113
+ if (!selectedTime) return;
114
+ const currentMinutes = parseTime(timeValue)?.minutes ?? 0;
115
+ setTimeValue(`${String(selectedTime.hours).padStart(2, "0")}:${String(currentMinutes).padStart(2, "0")}`);
116
+ const baseDate = valueAsDate || /* @__PURE__ */ new Date();
117
+ const nextDate = new Date(baseDate);
118
+ nextDate.setHours(selectedTime.hours, currentMinutes, 0, 0);
119
+ field.onChange(nextDate);
120
+ setIsOpen(false);
121
+ };
122
+ return /* @__PURE__ */ jsx(FormFieldContext.Provider, {
123
+ value: { name },
124
+ children: /* @__PURE__ */ jsxs(FormItem, {
125
+ className,
126
+ id: `date-hour-${name.replace(".", "-")}`,
127
+ children: [
128
+ /* @__PURE__ */ jsxs("div", {
129
+ className: "flex items-end gap-1.5",
130
+ children: [/* @__PURE__ */ jsxs(FormLabel, {
131
+ htmlFor: name,
132
+ children: [
133
+ label,
134
+ ":",
135
+ required && /* @__PURE__ */ jsx("span", {
136
+ className: "text-red-500 text-lg leading-px",
137
+ children: "*"
138
+ })
139
+ ]
140
+ }), /* @__PURE__ */ jsx(InputHelp, {
141
+ help,
142
+ name
143
+ })]
144
+ }),
145
+ /* @__PURE__ */ jsxs(Popover, {
146
+ onOpenChange: setIsOpen,
147
+ open: !inputDisabled && isOpen,
148
+ children: [/* @__PURE__ */ jsx(PopoverTrigger, {
149
+ asChild: true,
150
+ children: /* @__PURE__ */ jsxs("div", {
151
+ className: "flex w-full items-center gap-2",
152
+ onClick: (event) => {
153
+ event.preventDefault();
154
+ event.stopPropagation();
155
+ },
156
+ children: [/* @__PURE__ */ jsx("div", {
157
+ className: "w-full",
158
+ children: /* @__PURE__ */ jsx(InputDateField, {
159
+ className: cn(fieldState.error && "border-destructive"),
160
+ disabled: inputDisabled,
161
+ field: {
162
+ ...field,
163
+ onChange(nextValue) {
164
+ const normalizedDate = normalizeDateValue(nextValue);
165
+ if (!normalizedDate) {
166
+ field.onChange(void 0);
167
+ return;
168
+ }
169
+ const mergedDate = mergeDateAndTime(normalizedDate, timeValue, valueAsDate);
170
+ field.onChange(mergedDate);
171
+ },
172
+ value: valueAsDate
173
+ },
174
+ id: name,
175
+ onFocus: () => setIsOpen(true)
176
+ })
177
+ }), /* @__PURE__ */ jsx(Input, {
178
+ className: cn("w-28 min-w-28", fieldState.error && "border-destructive"),
179
+ disabled: inputDisabled,
180
+ id: `${name}-hour`,
181
+ onChange: (event) => handleTimeInputChange(event.target.value),
182
+ onFocus: () => setIsOpen(true),
183
+ placeholder: hourPlaceholder,
184
+ ref: withMask("99:99", {
185
+ clearMaskOnLostFocus: true,
186
+ showMaskOnFocus: false,
187
+ showMaskOnHover: false,
188
+ undoOnEscape: false
189
+ }),
190
+ value: timeValue
191
+ })]
192
+ })
193
+ }), /* @__PURE__ */ jsxs(PopoverContent, {
194
+ className: "flex w-fit gap-2 p-0",
195
+ onOpenAutoFocus: (event) => event.preventDefault(),
196
+ children: [/* @__PURE__ */ jsx(Calendar, {
197
+ defaultMonth: valueAsDate || /* @__PURE__ */ new Date(),
198
+ disabled,
199
+ endMonth,
200
+ locale: ptBR,
201
+ mode: "single",
202
+ onSelect: handleDateSelect,
203
+ selected: valueAsDate
204
+ }, `${name}-${valueAsDate?.toString()}-${timeValue}`), /* @__PURE__ */ jsxs("div", {
205
+ className: "relative w-33 shrink-0 border-l p-3 pr-4",
206
+ children: [
207
+ /* @__PURE__ */ jsx("p", {
208
+ className: "text-muted-foreground mb-2 text-[11px] font-semibold tracking-[0.16em] uppercase",
209
+ children: "Horas"
210
+ }),
211
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-3 top-8 z-20 h-8 bg-linear-to-b from-popover to-transparent" }),
212
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-3 bottom-3 z-20 h-10 bg-linear-to-t from-popover to-transparent" }),
213
+ /* @__PURE__ */ jsx("div", {
214
+ className: "h-56 overflow-hidden transform-[rotate(-8deg)]",
215
+ ref: emblaRef,
216
+ children: /* @__PURE__ */ jsx("div", {
217
+ className: "flex h-full flex-col gap-2 py-6",
218
+ children: HOUR_OPTIONS.map((hourLabel, index) => /* @__PURE__ */ jsx("div", {
219
+ className: "shrink-0 basis-10.5",
220
+ children: /* @__PURE__ */ jsx("button", {
221
+ className: cn("h-full w-full rounded-md border text-xs font-medium transition-all transform-[rotate(8deg)]", selectedHour === index ? "border-primary bg-primary text-primary-foreground shadow-sm" : "border-border bg-background/70 hover:bg-accent hover:text-accent-foreground"),
222
+ onClick: () => handleHourSelect(hourLabel),
223
+ type: "button",
224
+ children: hourLabel
225
+ })
226
+ }, hourLabel))
227
+ })
228
+ })
229
+ ]
230
+ })]
231
+ })]
232
+ }),
233
+ /* @__PURE__ */ jsx(FormDescription, { children: description }),
234
+ fieldState.error && /* @__PURE__ */ jsx(FormMessage, {})
235
+ ]
236
+ })
237
+ });
238
+ }
239
+
240
+ //#endregion
241
+ export { DateHourField };
242
+ //# sourceMappingURL=date-hour-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-hour-field.js","names":[],"sources":["../src/components/date-hour-field/DateHourField.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useMemo, useState } from 'react';\n\nimport {\n type FieldPath,\n type FieldValues,\n type UseControllerProps,\n useController,\n useFormContext,\n} from 'react-hook-form';\nimport withMask from '@/hooks/with-mask';\n\nimport useEmblaCarousel from 'embla-carousel-react';\nimport { WheelGesturesPlugin } from 'embla-carousel-wheel-gestures';\n\nimport { Calendar } from '@/ui/calendar';\nimport {\n FormDescription,\n FormFieldContext,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@/ui/form';\nimport { Input } from '@/ui/input';\nimport { InputDateField } from '@/ui/input-date-field';\nimport { InputHelp } from '@/ui/input-help';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ui/popover';\n\nimport { cn } from '@/lib/utils';\nimport { isValid, parse } from 'date-fns';\nimport { ptBR } from 'date-fns/locale';\nimport type { Matcher } from 'react-day-picker';\n\ntype ParsedTime = {\n hours: number;\n minutes: number;\n};\n\nconst HOUR_OPTIONS = Array.from(\n { length: 24 },\n (_, index) => `${String(index).padStart(2, '0')}:00`\n);\n\nconst parseTime = (value: string): ParsedTime | undefined => {\n const match = value.match(/^(\\d{2}):(\\d{2})$/);\n if (!match) return undefined;\n\n const hours = Number(match[1]);\n const minutes = Number(match[2]);\n\n if (\n Number.isNaN(hours) ||\n Number.isNaN(minutes) ||\n hours < 0 ||\n hours > 23 ||\n minutes < 0 ||\n minutes > 59\n ) {\n return undefined;\n }\n\n return { hours, minutes };\n};\n\nconst normalizeDateValue = (value: unknown): Date | undefined => {\n if (!value) return undefined;\n\n if (value instanceof Date) {\n return isValid(value) ? value : undefined;\n }\n\n if (typeof value === 'string') {\n const parsedDateOnly = parse(value, 'yyyy-MM-dd', new Date());\n if (isValid(parsedDateOnly)) return parsedDateOnly;\n\n const parsedAsDate = new Date(value);\n if (isValid(parsedAsDate)) return parsedAsDate;\n }\n\n return undefined;\n};\n\nconst formatTime = (date: Date) => {\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n return `${hours}:${minutes}`;\n};\n\nconst mergeDateAndTime = (\n selectedDate: Date,\n timeValue: string,\n fallbackDate?: Date\n) => {\n const mergedDate = new Date(selectedDate);\n const parsedTime = parseTime(timeValue);\n\n if (parsedTime) {\n mergedDate.setHours(parsedTime.hours, parsedTime.minutes, 0, 0);\n return mergedDate;\n }\n\n if (fallbackDate) {\n mergedDate.setHours(\n fallbackDate.getHours(),\n fallbackDate.getMinutes(),\n 0,\n 0\n );\n return mergedDate;\n }\n\n mergedDate.setHours(0, 0, 0, 0);\n return mergedDate;\n};\n\nexport interface DateHourFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> extends Omit<UseControllerProps<TFieldValues, TFieldName>, 'disabled'> {\n label: string;\n description?: string;\n className?: string;\n disabled?: Matcher | Matcher[] | undefined;\n inputDisabled?: boolean;\n initialValue?: Date;\n endMonth?: Date;\n required?: boolean;\n help?: string;\n hourPlaceholder?: string;\n}\n\nfunction DateHourField<\n TFieldValues extends FieldValues = FieldValues,\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n name,\n label,\n description,\n inputDisabled,\n endMonth,\n className,\n disabled,\n initialValue,\n required,\n help,\n hourPlaceholder = 'Hora',\n}: DateHourFieldProps<TFieldValues, TFieldName>) {\n const form = useFormContext();\n const { field, fieldState } = useController({\n name,\n defaultValue: initialValue as any,\n rules: { required },\n control: form.control,\n });\n\n const [isOpen, setIsOpen] = useState(false);\n const [timeValue, setTimeValue] = useState('');\n\n const emblaPlugins = useMemo(() => [WheelGesturesPlugin()], []);\n const [emblaRef, emblaApi] = useEmblaCarousel(\n {\n axis: 'y',\n align: 'center',\n containScroll: 'trimSnaps',\n dragFree: true,\n },\n emblaPlugins\n );\n\n const valueAsDate = normalizeDateValue(field.value);\n const selectedHour = parseTime(timeValue)?.hours;\n\n useEffect(() => {\n setTimeValue(valueAsDate ? formatTime(valueAsDate) : '');\n }, [field.value, valueAsDate]);\n\n useEffect(() => {\n if (!emblaApi || !isOpen) return;\n emblaApi.reInit();\n\n if (selectedHour === undefined) {\n emblaApi.scrollTo(0, true);\n return;\n }\n\n emblaApi.scrollTo(selectedHour, true);\n }, [emblaApi, isOpen, selectedHour]);\n\n const handleDateSelect = (date: Date | undefined) => {\n if (!date) {\n field.onChange(undefined);\n return;\n }\n\n const mergedDate = mergeDateAndTime(date, timeValue, valueAsDate);\n field.onChange(mergedDate);\n };\n\n const handleTimeInputChange = (nextValue: string) => {\n setTimeValue(nextValue);\n\n if (nextValue.length !== 5) return;\n\n const parsedTime = parseTime(nextValue);\n if (!parsedTime) return;\n\n const baseDate = valueAsDate || new Date();\n const nextDate = new Date(baseDate);\n\n nextDate.setHours(parsedTime.hours, parsedTime.minutes, 0, 0);\n\n field.onChange(nextDate);\n };\n\n const handleHourSelect = (hourLabel: string) => {\n const selectedTime = parseTime(hourLabel);\n if (!selectedTime) return;\n\n const currentMinutes = parseTime(timeValue)?.minutes ?? 0;\n const nextTime = `${String(selectedTime.hours).padStart(2, '0')}:${String(\n currentMinutes\n ).padStart(2, '0')}`;\n\n setTimeValue(nextTime);\n\n const baseDate = valueAsDate || new Date();\n const nextDate = new Date(baseDate);\n\n nextDate.setHours(selectedTime.hours, currentMinutes, 0, 0);\n field.onChange(nextDate);\n setIsOpen(false);\n };\n\n return (\n <FormFieldContext.Provider value={{ name }}>\n <FormItem\n className={className}\n id={`date-hour-${name.replace('.', '-')}`}\n >\n <div className=\"flex items-end gap-1.5\">\n <FormLabel htmlFor={name}>\n {label}:\n {required && (\n <span className=\"text-red-500 text-lg leading-px\">*</span>\n )}\n </FormLabel>\n\n <InputHelp help={help} name={name} />\n </div>\n\n <Popover onOpenChange={setIsOpen} open={!inputDisabled && isOpen}>\n <PopoverTrigger asChild>\n <div\n className=\"flex w-full items-center gap-2\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n >\n <div className=\"w-full\">\n <InputDateField\n className={cn(fieldState.error && 'border-destructive')}\n disabled={inputDisabled}\n field={{\n ...field,\n onChange(nextValue) {\n const normalizedDate = normalizeDateValue(nextValue);\n if (!normalizedDate) {\n field.onChange(undefined);\n return;\n }\n\n const mergedDate = mergeDateAndTime(\n normalizedDate,\n timeValue,\n valueAsDate\n );\n\n field.onChange(mergedDate);\n },\n value: valueAsDate,\n }}\n id={name}\n onFocus={() => setIsOpen(true)}\n />\n </div>\n\n <Input\n className={cn(\n 'w-28 min-w-28',\n fieldState.error && 'border-destructive'\n )}\n disabled={inputDisabled}\n id={`${name}-hour`}\n onChange={(event) => handleTimeInputChange(event.target.value)}\n onFocus={() => setIsOpen(true)}\n placeholder={hourPlaceholder}\n ref={\n withMask('99:99', {\n clearMaskOnLostFocus: true,\n showMaskOnFocus: false,\n showMaskOnHover: false,\n undoOnEscape: false,\n }) as any\n }\n value={timeValue}\n />\n </div>\n </PopoverTrigger>\n\n <PopoverContent\n className=\"flex w-fit gap-2 p-0\"\n onOpenAutoFocus={(event) => event.preventDefault()}\n >\n <Calendar\n defaultMonth={valueAsDate || new Date()}\n disabled={disabled}\n endMonth={endMonth}\n key={`${name}-${valueAsDate?.toString()}-${timeValue}`}\n locale={ptBR}\n mode=\"single\"\n onSelect={handleDateSelect}\n selected={valueAsDate}\n />\n\n <div className=\"relative w-33 shrink-0 border-l p-3 pr-4\">\n <p className=\"text-muted-foreground mb-2 text-[11px] font-semibold tracking-[0.16em] uppercase\">\n Horas\n </p>\n\n <div className=\"pointer-events-none absolute inset-x-3 top-8 z-20 h-8 bg-linear-to-b from-popover to-transparent\" />\n <div className=\"pointer-events-none absolute inset-x-3 bottom-3 z-20 h-10 bg-linear-to-t from-popover to-transparent\" />\n\n <div\n className=\"h-56 overflow-hidden transform-[rotate(-8deg)]\"\n ref={emblaRef}\n >\n <div className=\"flex h-full flex-col gap-2 py-6\">\n {HOUR_OPTIONS.map((hourLabel, index) => (\n <div className=\"shrink-0 basis-10.5\" key={hourLabel}>\n <button\n className={cn(\n 'h-full w-full rounded-md border text-xs font-medium transition-all transform-[rotate(8deg)]',\n selectedHour === index\n ? 'border-primary bg-primary text-primary-foreground shadow-sm'\n : 'border-border bg-background/70 hover:bg-accent hover:text-accent-foreground'\n )}\n onClick={() => handleHourSelect(hourLabel)}\n type=\"button\"\n >\n {hourLabel}\n </button>\n </div>\n ))}\n </div>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n\n <FormDescription>{description}</FormDescription>\n {fieldState.error && <FormMessage />}\n </FormItem>\n </FormFieldContext.Provider>\n );\n}\n\nexport { DateHourField };\n"],"mappings":"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"}
@@ -0,0 +1,208 @@
1
+ import { t as cn } from "./utils-C8_amEgK.js";
2
+ import { n as withMask, t as Input } from "./input-Bs61WBGW.js";
3
+ import { n as buttonVariants, t as Button } from "./button-B3nLhVyZ.js";
4
+ import * as React from "react";
5
+ import { useEffect, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { ChevronLeft, ChevronRight } from "lucide-react";
8
+ import { differenceInCalendarDays, isValid, parse } from "date-fns";
9
+ import { DayPicker, labelNext, labelPrevious, useDayPicker } from "react-day-picker";
10
+
11
+ //#region src/components/ui/calendar.tsx
12
+ function Calendar({ className, classNames, showOutsideDays = true, yearRange = 12, numberOfMonths,...props }) {
13
+ const [navView, setNavView] = React.useState("days");
14
+ const [displayYears, setDisplayYears] = React.useState(React.useMemo(() => {
15
+ const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
16
+ return {
17
+ from: currentYear - Math.floor(yearRange / 2 - 1),
18
+ to: currentYear + Math.ceil(yearRange / 2)
19
+ };
20
+ }, [yearRange]));
21
+ const { onNextClick, onPrevClick, startMonth, endMonth } = props;
22
+ const columnsDisplayed = navView === "years" ? 1 : numberOfMonths;
23
+ return /* @__PURE__ */ jsx(DayPicker, {
24
+ className: cn("p-3", className),
25
+ classNames: {
26
+ months: "flex flex-col relative sm:flex-row gap-y-4 sm:gap-y-0",
27
+ month_caption: "flex justify-center h-7 mx-10 relative items-center",
28
+ weekdays: "flex flex-row",
29
+ weekday: "text-muted-foreground w-8 font-normal text-[0.8rem]",
30
+ month: "gap-y-4 overflow-x-hidden w-full",
31
+ caption: "flex justify-center pt-1 relative items-center",
32
+ caption_label: "text-sm font-medium truncate",
33
+ button_next: cn(buttonVariants({
34
+ variant: "outline",
35
+ className: "absolute right-0 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100"
36
+ })),
37
+ button_previous: cn(buttonVariants({
38
+ variant: "outline",
39
+ className: "absolute left-0 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100"
40
+ })),
41
+ nav: "flex items-start",
42
+ month_grid: "mt-4",
43
+ week: "flex w-full mt-1",
44
+ day: "p-0 transition-colors size-8 text-sm flex-1 flex items-center justify-center has-[button]:hover:bg-accent/90! rounded-md has-[button]:hover:aria-selected:bg-primary/50! has-[button]:hover:text-foreground has-[button]:hover:aria-selected:text-foreground",
45
+ day_button: cn(buttonVariants({ variant: "ghost" }), "size-8 p-0 font-normal transition-none hover:bg-transparent hover:text-inherit aria-selected:opacity-100"),
46
+ range_start: "day-range-start rounded-s-md",
47
+ range_end: "day-range-end rounded-e-md",
48
+ selected: "bg-primary text-primary-foreground hover:bg-primary! hover:text-primary-foreground focus:bg-primary! focus:text-primary-foreground",
49
+ today: "bg-accent text-accent-foreground",
50
+ outside: "day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30",
51
+ disabled: "text-muted-foreground opacity-50",
52
+ range_middle: "aria-selected:bg-accent hover:aria-selected:bg-accent! rounded-none aria-selected:text-accent-foreground hover:aria-selected:text-accent-foreground",
53
+ hidden: "invisible",
54
+ ...classNames
55
+ },
56
+ components: {
57
+ Chevron: ({ orientation }) => {
58
+ return /* @__PURE__ */ jsx(orientation === "left" ? ChevronLeft : ChevronRight, { className: "h-4 w-4" });
59
+ },
60
+ Nav: ({ className: className$1, children,...props$1 }) => {
61
+ const { nextMonth, previousMonth, goToMonth } = useDayPicker();
62
+ const isPreviousDisabled = (() => {
63
+ if (navView === "years") return startMonth && differenceInCalendarDays(new Date(displayYears.from - 1, 0, 1), startMonth) < 0 || endMonth && differenceInCalendarDays(new Date(displayYears.from - 1, 0, 1), endMonth) > 0;
64
+ return !previousMonth;
65
+ })();
66
+ const isNextDisabled = (() => {
67
+ if (navView === "years") return startMonth && differenceInCalendarDays(new Date(displayYears.to + 1, 0, 1), startMonth) < 0 || endMonth && differenceInCalendarDays(new Date(displayYears.to + 1, 0, 1), endMonth) > 0;
68
+ return !nextMonth;
69
+ })();
70
+ const handlePreviousClick = React.useCallback(() => {
71
+ if (!previousMonth) return;
72
+ if (navView === "years") {
73
+ setDisplayYears((prev) => ({
74
+ from: prev.from - (prev.to - prev.from + 1),
75
+ to: prev.to - (prev.to - prev.from + 1)
76
+ }));
77
+ onPrevClick?.(new Date(displayYears.from - (displayYears.to - displayYears.from), 0, 1));
78
+ return;
79
+ }
80
+ goToMonth(previousMonth);
81
+ onPrevClick?.(previousMonth);
82
+ }, [previousMonth, goToMonth]);
83
+ const handleNextClick = React.useCallback(() => {
84
+ if (navView === "years") {
85
+ setDisplayYears((prev) => ({
86
+ from: prev.from + (prev.to - prev.from + 1),
87
+ to: prev.to + (prev.to - prev.from + 1)
88
+ }));
89
+ onNextClick?.(new Date(displayYears.from + (displayYears.to - displayYears.from), 0, 1));
90
+ return;
91
+ }
92
+ if (!nextMonth) return;
93
+ goToMonth(nextMonth);
94
+ onNextClick?.(nextMonth);
95
+ }, [goToMonth, nextMonth]);
96
+ return /* @__PURE__ */ jsxs("nav", {
97
+ className: cn("flex items-center", className$1),
98
+ children: [/* @__PURE__ */ jsx(Button, {
99
+ "aria-label": navView === "years" ? `Go to the previous ${displayYears.to - displayYears.from + 1} years` : labelPrevious(previousMonth),
100
+ className: "absolute left-0 h-7 w-7 bg-transparent p-0 opacity-80 hover:opacity-100",
101
+ disabled: isPreviousDisabled,
102
+ onClick: handlePreviousClick,
103
+ tabIndex: isPreviousDisabled ? void 0 : -1,
104
+ type: "button",
105
+ variant: "outline",
106
+ children: /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" })
107
+ }), /* @__PURE__ */ jsx(Button, {
108
+ "aria-label": navView === "years" ? `Go to the next ${displayYears.to - displayYears.from + 1} years` : labelNext(nextMonth),
109
+ className: "absolute right-0 h-7 w-7 bg-transparent p-0 opacity-80 hover:opacity-100",
110
+ disabled: isNextDisabled,
111
+ onClick: handleNextClick,
112
+ tabIndex: isNextDisabled ? void 0 : -1,
113
+ type: "button",
114
+ variant: "outline",
115
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" })
116
+ })]
117
+ });
118
+ },
119
+ CaptionLabel: ({ children }) => /* @__PURE__ */ jsx(Button, {
120
+ className: "h-7 w-full truncate text-sm font-medium capitalize",
121
+ onClick: () => setNavView((prev) => prev === "days" ? "years" : "days"),
122
+ size: "sm",
123
+ variant: "ghost",
124
+ children: navView === "days" ? children : displayYears.from + " - " + displayYears.to
125
+ }),
126
+ MonthGrid: ({ className: className$1, children,...props$1 }) => {
127
+ const { goToMonth } = useDayPicker();
128
+ if (navView === "years") return /* @__PURE__ */ jsx("div", {
129
+ className: cn("grid grid-cols-4 gap-y-1", className$1),
130
+ ...props$1,
131
+ children: Array.from({ length: displayYears.to - displayYears.from + 1 }, (_, i) => {
132
+ const isBefore = differenceInCalendarDays(new Date(displayYears.from + i, 12, 31), startMonth) < 0;
133
+ const isAfter = differenceInCalendarDays(new Date(displayYears.from + i, 0, 0), endMonth) > 0;
134
+ const isDisabled = isBefore || isAfter;
135
+ return /* @__PURE__ */ jsx(Button, {
136
+ className: cn("h-10 w-full text-sm font-normal text-foreground", displayYears.from + i === (/* @__PURE__ */ new Date()).getFullYear() && "bg-accent font-medium text-accent-foreground"),
137
+ disabled: navView === "years" ? isDisabled : void 0,
138
+ onClick: () => {
139
+ setNavView("days");
140
+ goToMonth(new Date(displayYears.from + i, (/* @__PURE__ */ new Date()).getMonth()));
141
+ },
142
+ variant: "ghost",
143
+ children: displayYears.from + i
144
+ }, i);
145
+ })
146
+ });
147
+ return /* @__PURE__ */ jsx("table", {
148
+ className: className$1,
149
+ ...props$1,
150
+ children
151
+ });
152
+ }
153
+ },
154
+ numberOfMonths: columnsDisplayed,
155
+ showOutsideDays,
156
+ style: { width: 248.8 * (columnsDisplayed ?? 1) + "px" },
157
+ ...props
158
+ });
159
+ }
160
+ Calendar.displayName = "Calendar";
161
+
162
+ //#endregion
163
+ //#region src/components/ui/input-date-field.tsx
164
+ const InputDateField = ({ field, disabled, onFinish, id, dateOnly,...props }) => {
165
+ const [inputValue, setInputValue] = useState("");
166
+ const handleChange = (e) => {
167
+ const parts = e.target.value.split("/");
168
+ let day = parts[0];
169
+ let month = parts[1];
170
+ if (day && Number(day) > 31) parts[0] = day.slice(0, 1).padStart(2, "0");
171
+ if (month && Number(month) > 12) parts[1] = month.slice(0, 1).padStart(2, "0");
172
+ const newValue = parts.join("/");
173
+ setInputValue(parts.join("/"));
174
+ if (newValue.length === 10) {
175
+ const parsedDate = parse(newValue, "dd/MM/yyyy", /* @__PURE__ */ new Date());
176
+ if (isValid(parsedDate)) {
177
+ if (dateOnly) {
178
+ const year = parsedDate.getFullYear();
179
+ const monthStr = String(parsedDate.getMonth() + 1).padStart(2, "0");
180
+ const dayStr = String(parsedDate.getDate()).padStart(2, "0");
181
+ field.onChange(`${year}-${monthStr}-${dayStr}`);
182
+ } else field.onChange(parsedDate);
183
+ onFinish?.();
184
+ }
185
+ }
186
+ };
187
+ useEffect(() => {
188
+ if (field.value) {
189
+ const value = typeof field.value === "string" ? parse(field.value, "yyyy-MM-dd", /* @__PURE__ */ new Date()) : field.value;
190
+ if (isValid(value)) setInputValue(value.toLocaleDateString("pt-BR"));
191
+ } else setInputValue("");
192
+ }, [field.value]);
193
+ return /* @__PURE__ */ jsx(Input, {
194
+ autoComplete: "off",
195
+ className: "w-full outline-hidden",
196
+ id,
197
+ onChange: handleChange,
198
+ placeholder: "Selecione a data",
199
+ readOnly: disabled,
200
+ ref: withMask("99/99/9999", { undoOnEscape: false }),
201
+ value: inputValue,
202
+ ...props
203
+ });
204
+ };
205
+
206
+ //#endregion
207
+ export { Calendar as n, InputDateField as t };
208
+ //# sourceMappingURL=input-date-field-DToF0FmE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-date-field-DToF0FmE.js","names":["props","className","InputDateField: React.FC<\n {\n field: ControllerRenderProps<any, string>;\n disabled?: boolean;\n onFinish?: () => void;\n id?: string;\n dateOnly?: boolean;\n } & ComponentProps<typeof Input>\n>"],"sources":["../src/components/ui/calendar.tsx","../src/components/ui/input-date-field.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nimport { Button, buttonVariants } from '@/components/ui/button';\n\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\nimport { differenceInCalendarDays } from 'date-fns';\nimport {\n DayPicker,\n labelNext,\n labelPrevious,\n useDayPicker,\n} from 'react-day-picker';\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker> & {\n /**\n * In the year view, the number of years to display at once.\n * @default 12\n */\n yearRange?: number;\n};\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n yearRange = 12,\n numberOfMonths,\n ...props\n}: CalendarProps) {\n const [navView, setNavView] = React.useState<'days' | 'years'>('days');\n const [displayYears, setDisplayYears] = React.useState<{\n from: number;\n to: number;\n }>(\n React.useMemo(() => {\n const currentYear = new Date().getFullYear();\n return {\n from: currentYear - Math.floor(yearRange / 2 - 1),\n to: currentYear + Math.ceil(yearRange / 2),\n };\n }, [yearRange])\n );\n\n const { onNextClick, onPrevClick, startMonth, endMonth } = props;\n\n const columnsDisplayed = navView === 'years' ? 1 : numberOfMonths;\n\n return (\n <DayPicker\n className={cn('p-3', className)}\n classNames={{\n months: 'flex flex-col relative sm:flex-row gap-y-4 sm:gap-y-0',\n month_caption: 'flex justify-center h-7 mx-10 relative items-center',\n weekdays: 'flex flex-row',\n weekday: 'text-muted-foreground w-8 font-normal text-[0.8rem]',\n month: 'gap-y-4 overflow-x-hidden w-full',\n caption: 'flex justify-center pt-1 relative items-center',\n caption_label: 'text-sm font-medium truncate',\n button_next: cn(\n buttonVariants({\n variant: 'outline',\n className:\n 'absolute right-0 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100',\n })\n ),\n button_previous: cn(\n buttonVariants({\n variant: 'outline',\n className:\n 'absolute left-0 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100',\n })\n ),\n nav: 'flex items-start',\n month_grid: 'mt-4',\n week: 'flex w-full mt-1',\n day: 'p-0 transition-colors size-8 text-sm flex-1 flex items-center justify-center has-[button]:hover:bg-accent/90! rounded-md has-[button]:hover:aria-selected:bg-primary/50! has-[button]:hover:text-foreground has-[button]:hover:aria-selected:text-foreground',\n day_button: cn(\n buttonVariants({ variant: 'ghost' }),\n 'size-8 p-0 font-normal transition-none hover:bg-transparent hover:text-inherit aria-selected:opacity-100'\n ),\n range_start: 'day-range-start rounded-s-md',\n range_end: 'day-range-end rounded-e-md',\n selected:\n 'bg-primary text-primary-foreground hover:bg-primary! hover:text-primary-foreground focus:bg-primary! focus:text-primary-foreground',\n today: 'bg-accent text-accent-foreground',\n outside:\n 'day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30',\n disabled: 'text-muted-foreground opacity-50',\n range_middle:\n 'aria-selected:bg-accent hover:aria-selected:bg-accent! rounded-none aria-selected:text-accent-foreground hover:aria-selected:text-accent-foreground',\n hidden: 'invisible',\n ...classNames,\n }}\n components={{\n Chevron: ({ orientation }) => {\n const Icon = orientation === 'left' ? ChevronLeft : ChevronRight;\n return <Icon className=\"h-4 w-4\" />;\n },\n Nav: ({ className, children, ...props }) => {\n const { nextMonth, previousMonth, goToMonth } = useDayPicker();\n\n const isPreviousDisabled = (() => {\n if (navView === 'years') {\n return (\n (startMonth &&\n differenceInCalendarDays(\n new Date(displayYears.from - 1, 0, 1),\n startMonth\n ) < 0) ||\n (endMonth &&\n differenceInCalendarDays(\n new Date(displayYears.from - 1, 0, 1),\n endMonth\n ) > 0)\n );\n }\n return !previousMonth;\n })();\n\n const isNextDisabled = (() => {\n if (navView === 'years') {\n return (\n (startMonth &&\n differenceInCalendarDays(\n new Date(displayYears.to + 1, 0, 1),\n startMonth\n ) < 0) ||\n (endMonth &&\n differenceInCalendarDays(\n new Date(displayYears.to + 1, 0, 1),\n endMonth\n ) > 0)\n );\n }\n return !nextMonth;\n })();\n\n const handlePreviousClick = React.useCallback(() => {\n if (!previousMonth) return;\n if (navView === 'years') {\n setDisplayYears((prev) => ({\n from: prev.from - (prev.to - prev.from + 1),\n to: prev.to - (prev.to - prev.from + 1),\n }));\n onPrevClick?.(\n new Date(\n displayYears.from - (displayYears.to - displayYears.from),\n 0,\n 1\n )\n );\n return;\n }\n goToMonth(previousMonth);\n onPrevClick?.(previousMonth);\n }, [previousMonth, goToMonth]);\n\n const handleNextClick = React.useCallback(() => {\n if (navView === 'years') {\n setDisplayYears((prev) => ({\n from: prev.from + (prev.to - prev.from + 1),\n to: prev.to + (prev.to - prev.from + 1),\n }));\n onNextClick?.(\n new Date(\n displayYears.from + (displayYears.to - displayYears.from),\n 0,\n 1\n )\n );\n return;\n }\n if (!nextMonth) return;\n goToMonth(nextMonth);\n onNextClick?.(nextMonth);\n }, [goToMonth, nextMonth]);\n\n return (\n <nav className={cn('flex items-center', className)}>\n <Button\n aria-label={\n navView === 'years'\n ? `Go to the previous ${\n displayYears.to - displayYears.from + 1\n } years`\n : labelPrevious(previousMonth)\n }\n className=\"absolute left-0 h-7 w-7 bg-transparent p-0 opacity-80 hover:opacity-100\"\n disabled={isPreviousDisabled}\n onClick={handlePreviousClick}\n tabIndex={isPreviousDisabled ? undefined : -1}\n type=\"button\"\n variant=\"outline\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n\n <Button\n aria-label={\n navView === 'years'\n ? `Go to the next ${\n displayYears.to - displayYears.from + 1\n } years`\n : labelNext(nextMonth)\n }\n className=\"absolute right-0 h-7 w-7 bg-transparent p-0 opacity-80 hover:opacity-100\"\n disabled={isNextDisabled}\n onClick={handleNextClick}\n tabIndex={isNextDisabled ? undefined : -1}\n type=\"button\"\n variant=\"outline\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </nav>\n );\n },\n CaptionLabel: ({ children }) => (\n <Button\n className=\"h-7 w-full truncate text-sm font-medium capitalize\"\n onClick={() =>\n setNavView((prev) => (prev === 'days' ? 'years' : 'days'))\n }\n size=\"sm\"\n variant=\"ghost\"\n >\n {navView === 'days'\n ? children\n : displayYears.from + ' - ' + displayYears.to}\n </Button>\n ),\n MonthGrid: ({ className, children, ...props }) => {\n const { goToMonth } = useDayPicker();\n if (navView === 'years') {\n return (\n <div\n className={cn('grid grid-cols-4 gap-y-1', className)}\n {...props}\n >\n {Array.from(\n { length: displayYears.to - displayYears.from + 1 },\n (_, i) => {\n const isBefore =\n differenceInCalendarDays(\n new Date(displayYears.from + i, 12, 31),\n startMonth!\n ) < 0;\n\n const isAfter =\n differenceInCalendarDays(\n new Date(displayYears.from + i, 0, 0),\n endMonth!\n ) > 0;\n\n const isDisabled = isBefore || isAfter;\n return (\n <Button\n className={cn(\n 'h-10 w-full text-sm font-normal text-foreground',\n displayYears.from + i === new Date().getFullYear() &&\n 'bg-accent font-medium text-accent-foreground'\n )}\n disabled={navView === 'years' ? isDisabled : undefined}\n key={i}\n onClick={() => {\n setNavView('days');\n goToMonth(\n new Date(\n displayYears.from + i,\n new Date().getMonth()\n )\n );\n }}\n variant=\"ghost\"\n >\n {displayYears.from + i}\n </Button>\n );\n }\n )}\n </div>\n );\n }\n return (\n <table className={className} {...props}>\n {children}\n </table>\n );\n },\n }}\n numberOfMonths={columnsDisplayed}\n showOutsideDays={showOutsideDays}\n style={{\n width: 248.8 * (columnsDisplayed ?? 1) + 'px',\n }}\n {...props}\n />\n );\n}\nCalendar.displayName = 'Calendar';\n\nexport { Calendar };\n","import { ComponentProps, useEffect, useState } from 'react';\n\nimport type { ControllerRenderProps } from 'react-hook-form';\nimport withMask from '@/hooks/with-mask';\n\nimport { isValid, parse } from 'date-fns';\nimport { Input } from './input';\n\nconst InputDateField: React.FC<\n {\n field: ControllerRenderProps<any, string>;\n disabled?: boolean;\n onFinish?: () => void;\n id?: string;\n dateOnly?: boolean;\n } & ComponentProps<typeof Input>\n> = ({ field, disabled, onFinish, id, dateOnly, ...props }) => {\n const [inputValue, setInputValue] = useState('');\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const parts = e.target.value.split('/');\n let day = parts[0];\n let month = parts[1];\n if (day && Number(day) > 31) {\n parts[0] = day.slice(0, 1).padStart(2, '0');\n }\n if (month && Number(month) > 12) {\n parts[1] = month.slice(0, 1).padStart(2, '0');\n }\n\n const newValue = parts.join('/');\n setInputValue(parts.join('/'));\n\n if (newValue.length === 10) {\n const parsedDate = parse(newValue, 'dd/MM/yyyy', new Date());\n if (isValid(parsedDate)) {\n if (dateOnly) {\n const year = parsedDate.getFullYear();\n const monthStr = String(parsedDate.getMonth() + 1).padStart(2, '0');\n const dayStr = String(parsedDate.getDate()).padStart(2, '0');\n field.onChange(`${year}-${monthStr}-${dayStr}`);\n } else {\n field.onChange(parsedDate);\n }\n onFinish?.();\n }\n }\n };\n\n useEffect(() => {\n if (field.value) {\n const value =\n typeof field.value === 'string'\n ? parse(field.value, 'yyyy-MM-dd', new Date())\n : field.value;\n\n if (isValid(value)) {\n setInputValue(value.toLocaleDateString('pt-BR'));\n }\n } else {\n setInputValue('');\n }\n }, [field.value]);\n\n return (\n <Input\n autoComplete=\"off\"\n className=\"w-full outline-hidden\"\n id={id}\n onChange={handleChange}\n placeholder=\"Selecione a data\"\n readOnly={disabled}\n ref={\n withMask('99/99/9999', {\n undoOnEscape: false,\n }) as any\n }\n value={inputValue}\n {...props}\n />\n );\n};\n\nexport { InputDateField };\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { n as Options, t as Mask } from "./with-mask-Chm8kVE1.js";
1
+ import { n as Options, t as Mask } from "./with-mask-BLZS7b9k.js";
2
2
  import { FieldPath, FieldValues, UseControllerProps } from "react-hook-form";
3
3
  import { Dispatch, SetStateAction } from "react";
4
- import * as react_jsx_runtime8 from "react/jsx-runtime";
4
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
5
5
  import { PopoverProps } from "@radix-ui/react-popover";
6
6
 
7
7
  //#region src/components/input-suggest/input-suggest.d.ts
@@ -71,7 +71,7 @@ declare function InputSuggest<TFieldValues extends FieldValues = FieldValues, TF
71
71
  debounceTime,
72
72
  maxWait,
73
73
  ...props
74
- }: InputSuggestProps<TFieldValues, TFieldName> & PopoverProps): react_jsx_runtime8.JSX.Element;
74
+ }: InputSuggestProps<TFieldValues, TFieldName> & PopoverProps): react_jsx_runtime0.JSX.Element;
75
75
  //#endregion
76
76
  export { InputSuggest, type InputSuggestProps };
77
77
  //# sourceMappingURL=input-suggest.d.ts.map
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime7 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime6 from "react/jsx-runtime";
2
2
 
3
3
  //#region src/components/page-header/page-header.d.ts
4
4
  interface PageHeaderProps {
@@ -10,7 +10,7 @@ declare function PageHeader({
10
10
  title,
11
11
  help,
12
12
  description
13
- }: PageHeaderProps): react_jsx_runtime7.JSX.Element;
13
+ }: PageHeaderProps): react_jsx_runtime6.JSX.Element;
14
14
  //#endregion
15
15
  export { PageHeader, type PageHeaderProps };
16
16
  //# sourceMappingURL=page-header.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { FieldPath, FieldPathValue, FieldValues, UseControllerProps } from "react-hook-form";
2
- import * as react_jsx_runtime5 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime8 from "react/jsx-runtime";
3
3
  import { Options } from "nuqs";
4
4
  import { PopoverProps } from "@radix-ui/react-popover";
5
5
 
@@ -76,7 +76,7 @@ declare function RemoteSelectorField<T, TFieldValues extends FieldValues = Field
76
76
  ...props
77
77
  }: RemoteSelectorFieldProps<TFieldValues, TFieldName> & BaseRemoteSelectorProps<T> & {
78
78
  withPortal?: boolean;
79
- }): react_jsx_runtime5.JSX.Element;
79
+ }): react_jsx_runtime8.JSX.Element;
80
80
  interface RemoteSelectorQueryProps<T> extends BaseRemoteSelectorProps<T> {
81
81
  name: string;
82
82
  defaultValue?: string;
@@ -96,7 +96,7 @@ declare function RemoteSelectorQuery<T>({
96
96
  fieldLabel,
97
97
  type,
98
98
  ...props
99
- }: RemoteSelectorQueryProps<T>): react_jsx_runtime5.JSX.Element;
99
+ }: RemoteSelectorQueryProps<T>): react_jsx_runtime8.JSX.Element;
100
100
  //#endregion
101
101
  export { type BaseRemoteSelectorProps, RemoteSelectorField as RemoteSelector, RemoteSelectorField, type RemoteSelectorFieldProps, RemoteSelectorQuery, type RemoteSelectorQueryProps, type TUseData };
102
102
  //# sourceMappingURL=remote-selector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"split-text-poor.d.ts","names":[],"sources":["../src/components/split-text-poor/split-text-poor.tsx"],"sourcesContent":[],"mappings":";cAwBM;EAAA,EAAA,EAAA;;;;;;IAoBM,OAAA,EAAA,CAAA;MAAA,KAAkB;MAAA;KAAA,EAAA;MASxB,KAAA,EAAA,MAuDL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAhEW,kBAAA;YACA,KAAA,CAAM;;wBAEM;;;;;cAMlB,eAAe,KAAA,CAAM,GAAG"}
1
+ {"version":3,"file":"split-text-poor.d.ts","names":[],"sources":["../src/components/split-text-poor/split-text-poor.tsx"],"sourcesContent":[],"mappings":";cAwBM;EAAA,EAAA,EAAA;;;;;;IAoBM,OAAA,EAAA,CAAA;MAAA,KAAkB;MAAA;KAAA,EAClB;MAQN,KAAA,EAAA,MAuDL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAhEW,kBAAA;YACA,KAAA,CAAM;;wBAEM;;;;;cAMlB,eAAe,KAAA,CAAM,GAAG"}
@@ -1,6 +1,6 @@
1
- import { n as Options$1 } from "./with-mask-Chm8kVE1.js";
1
+ import { n as Options$1 } from "./with-mask-BLZS7b9k.js";
2
2
  import { FieldPath, FieldPathValue, FieldValues, UseControllerProps } from "react-hook-form";
3
- import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+ import * as react_jsx_runtime2 from "react/jsx-runtime";
4
4
  import { Options } from "nuqs";
5
5
 
6
6
  //#region src/components/text-field/TextField.d.ts
@@ -57,7 +57,7 @@ declare function InputText({
57
57
  name,
58
58
  onChange,
59
59
  ...props
60
- }: InputTextProps): react_jsx_runtime0.JSX.Element;
60
+ }: InputTextProps): react_jsx_runtime2.JSX.Element;
61
61
  interface TextFieldProps<TFieldValues extends FieldValues = FieldValues, TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> extends UseControllerProps<TFieldValues, TFieldName> {
62
62
  disabled?: boolean;
63
63
  required?: boolean;
@@ -75,7 +75,7 @@ declare function TextField<TFieldValues extends FieldValues = FieldValues, TFiel
75
75
  transform,
76
76
  prefix,
77
77
  ...props
78
- }: TextFieldProps<TFieldValues, TFieldName> & Omit<InputTextProps, 'onChange'>): react_jsx_runtime0.JSX.Element;
78
+ }: TextFieldProps<TFieldValues, TFieldName> & Omit<InputTextProps, 'onChange'>): react_jsx_runtime2.JSX.Element;
79
79
  interface QueryTextFieldProps extends Omit<InputTextProps, 'onChange'> {
80
80
  name: string;
81
81
  defaultValue?: string;
@@ -87,7 +87,7 @@ declare function QueryTextField({
87
87
  defaultValue,
88
88
  options,
89
89
  ...props
90
- }: QueryTextFieldProps): react_jsx_runtime0.JSX.Element;
90
+ }: QueryTextFieldProps): react_jsx_runtime2.JSX.Element;
91
91
  interface CookieTextFieldProps extends InputTextProps {
92
92
  name: string;
93
93
  maxAge?: number;
@@ -97,7 +97,7 @@ declare function CookieTextField({
97
97
  maxAge,
98
98
  onChange,
99
99
  ...inputProps
100
- }: CookieTextFieldProps): react_jsx_runtime0.JSX.Element;
100
+ }: CookieTextFieldProps): react_jsx_runtime2.JSX.Element;
101
101
  //#endregion
102
102
  export { CookieTextField, type CookieTextFieldProps, InputText, type InputTextProps, QueryTextField, type QueryTextFieldProps, TextField, type TextFieldProps };
103
103
  //# sourceMappingURL=text-field.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import * as React$1 from "react";
2
- import * as react_jsx_runtime9 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime10 from "react/jsx-runtime";
3
3
  import { Item, Root } from "@radix-ui/react-toggle-group";
4
4
  import { VariantProps } from "class-variance-authority";
5
5
  import * as class_variance_authority_types0 from "class-variance-authority/types";
@@ -28,7 +28,7 @@ declare function ToggleGroup({
28
28
  transition,
29
29
  activeClassName,
30
30
  ...props
31
- }: ToggleGroupProps): react_jsx_runtime9.JSX.Element;
31
+ }: ToggleGroupProps): react_jsx_runtime10.JSX.Element;
32
32
  //#endregion
33
33
  //#region src/components/toggle-field/ToggleField.d.ts
34
34
  type ToggleOption = {
@@ -1 +1 @@
1
- {"version":3,"file":"toggle-field.d.ts","names":[],"sources":["../src/components/toggle-field/ToggleGroup.tsx","../src/components/toggle-field/ToggleField.tsx"],"sourcesContent":[],"mappings":";;;;;;;;cAiBa,sBAuCX;;;;EAvCW,SAAA,CAAA,EAAA,YA8BZ,GAAA,UAAA,GAAA,IAAA,GAAA,SAAA;AAAC,CAAA,GAAD,+BAAA,CAAA,SASC,CAAA,GAAA,SAAA,EAAA,GAAA,MAAA;cAPI,mBA4Be,EAAA,CAAA,KAAS,CAAT,EAAA,CAAA;EAA+B,SAAA,CAAA,EAAA,YAAA,GAAA,UAAA,GAAA,IAAA,GAAA,SAAA;CAA5B,GArBtB,+BAAA,CAAA,SAqB4B,CAAA,GAAA,SAAA,EAAA,GAAA,MAAA;KAAzB,gBAAA,GAAmB,OAAA,CAAM,cACH,CAAA,OADyB,IACzB,CAAA,GAAzB,IAAyB,CAApB,YAAoB,CAAA,OAAA,cAAA,CAAA,EAAA,MAAA,CAAA,GACzB,YADyB,CAAA,OACL,mBADK,CAAA,GAAA;EAApB,UAAA,CAAA,EAEU,UAFV;EAAL,eAAA,CAAA,EAAA,MAAA;CACoB;iBAKb,WAAA,CALP;EAAA,SAAA;EAAA,OAAA;EAAA,SAAA;EAAA,IAAA;EAAA,QAAA;EAAA,UAAA;EAAA,eAAA;EAAA,GAAA;AAAA,CAAA,EAcC,gBAdD,CAAA,EAciB,kBAAA,CAAA,GAAA,CAAA,OAdjB;;;KCrEU,YAAA;;kBAAgD,KAAA,CAAM;;KAEtD,gBAAA,GAAmB,KAC7B,KAAA,CAAM,sBAAsB;;WAInB;EDAE,IAAA,CAAA,EAAA,QAAA,GA8BZ,UAAA;EAEK,IAAA,EAAA,MAAA;EA4BD,YAAA,CAAA,ECzDY,YDyDI,GCzDW,YDyDX,EAAA;EAA+B,kBAAA,CAAA,EAAA,OAAA;CAA5B;cCrDlB,WDsDqB,ECtDR,KAAA,CAAM,EDsDE,CCtDC,gBDsDD,CAAA"}
1
+ {"version":3,"file":"toggle-field.d.ts","names":[],"sources":["../src/components/toggle-field/ToggleGroup.tsx","../src/components/toggle-field/ToggleField.tsx"],"sourcesContent":[],"mappings":";;;;;;;;cAiBa,sBAuCX;;;;EAvCW,SAAA,CAAA,EAAA,YA8BZ,GAAA,UAAA,GAAA,IAAA,GAAA,SAAA;AAAC,CAAA,GAAD,+BAAA,CAAA,SASC,CAAA,GAAA,SAAA,EAAA,GAAA,MAAA;cAPI,mBA4Be,EAAA,CAAA,KAAS,CAAT,EAAA,CAAA;EAA+B,SAAA,CAAA,EAAA,YAAA,GAAA,UAAA,GAAA,IAAA,GAAA,SAAA;CAA5B,GArBtB,+BAAA,CAAA,SAqB4B,CAAA,GAAA,SAAA,EAAA,GAAA,MAAA;KAAzB,gBAAA,GAAmB,OAAA,CAAM,cACH,CAAA,OADyB,IACzB,CAAA,GAAzB,IAAyB,CAApB,YAAoB,CAAA,OAAA,cAAA,CAAA,EAAA,MAAA,CAAA,GACzB,YADyB,CAAA,OACL,mBADK,CAAA,GAAA;EAApB,UAAA,CAAA,EAEU,UAFV;EAAL,eAAA,CAAA,EAAA,MAAA;CACoB;iBAKb,WAAA,CALP;EAAA,SAAA;EAAA,OAAA;EAAA,SAAA;EAAA,IAAA;EAAA,QAAA;EAAA,UAAA;EAAA,eAAA;EAAA,GAAA;AAAA,CAAA,EAcC,gBAdD,CAAA,EAciB,mBAAA,CAAA,GAAA,CAAA,OAdjB;;;KCrEU,YAAA;;kBAAgD,KAAA,CAAM;;KAEtD,gBAAA,GAAmB,KAC7B,KAAA,CAAM,sBAAsB;;WAInB;EDAE,IAAA,CAAA,EAAA,QAAA,GA8BZ,UAAA;EAEK,IAAA,EAAA,MAAA;EA4BD,YAAA,CAAA,ECzDY,YDyDI,GCzDW,YDyDX,EAAA;EAA+B,kBAAA,CAAA,EAAA,OAAA;CAA5B;cCrDlB,WDsDqB,ECtDR,KAAA,CAAM,EDsDE,CCtDC,gBDsDD,CAAA"}
@@ -6,4 +6,4 @@ type Mask = 'datetime' | 'email' | 'numeric' | 'currency' | 'decimal' | 'integer
6
6
  type Options = inputmask.Options;
7
7
  //#endregion
8
8
  export { Options as n, Mask as t };
9
- //# sourceMappingURL=with-mask-Chm8kVE1.d.ts.map
9
+ //# sourceMappingURL=with-mask-BLZS7b9k.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-mask-BLZS7b9k.d.ts","names":[],"sources":["../src/hooks/with-mask.ts"],"sourcesContent":[],"mappings":";;;;KAQY,IAAA;KAkBA,OAAA,GAAU,SAAA,CAAU"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "maquinaweb-ui",
3
- "version": "2.57.2",
3
+ "version": "2.58.0",
4
4
  "description": "A minimal React component library",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -13,6 +13,10 @@
13
13
  "import": "./dist/remote-selector.js",
14
14
  "types": "./dist/remote-selector.d.ts"
15
15
  },
16
+ "./date-hour-field": {
17
+ "import": "./dist/date-hour-field.js",
18
+ "types": "./dist/date-hour-field.d.ts"
19
+ },
16
20
  "./kanban-dnd": {
17
21
  "import": "./dist/kanban-dnd.js",
18
22
  "types": "./dist/kanban-dnd.d.ts"
@@ -111,6 +115,9 @@
111
115
  "class-variance-authority": "^0.7.1",
112
116
  "clsx": "^2.1.1",
113
117
  "date-fns": "^4.1.0",
118
+ "embla-carousel": "^8.6.0",
119
+ "embla-carousel-react": "^8.6.0",
120
+ "embla-carousel-wheel-gestures": "^8.1.0",
114
121
  "inputmask": "5.0.10-beta.61",
115
122
  "react-day-picker": "^9.13.0",
116
123
  "react-intersection-observer": "^10.0.2",
@@ -1 +0,0 @@
1
- {"version":3,"file":"with-mask-Chm8kVE1.d.ts","names":[],"sources":["../src/hooks/with-mask.ts"],"sourcesContent":[],"mappings":";;;;KAQY,IAAA;KAkBA,OAAA,GAAU,SAAA,CAAU"}