periplo-ui 3.17.0 → 3.19.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/DatePicker/DatePicker.d.ts +65 -25
- package/dist/components/DatePicker/DatePicker.js +83 -35
- package/dist/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/Select/Select.d.ts +2 -1
- package/dist/components/Select/Select.js +30 -19
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/lib/dateUtils.d.ts +41 -0
- package/dist/lib/dateUtils.js +50 -0
- package/dist/lib/dateUtils.js.map +1 -0
- package/package.json +2 -2
|
@@ -1,38 +1,78 @@
|
|
|
1
|
+
import { Locale } from 'date-fns';
|
|
1
2
|
import { DateRange, PropsBase } from 'react-day-picker';
|
|
2
|
-
|
|
3
|
+
import { ValueFormat } from '../../lib/dateUtils';
|
|
4
|
+
type SupportedLocaleString = 'enUS' | 'es' | 'pt' | 'enGB' | 'de' | 'it' | 'fr';
|
|
5
|
+
type DatePickerOutput<Variant extends 'single' | 'range', Format extends ValueFormat> = Variant extends 'single' ? Format extends 'date' ? Date | undefined : string | undefined : Format extends 'date' ? DateRange | undefined : {
|
|
6
|
+
from?: string;
|
|
7
|
+
to?: string;
|
|
8
|
+
} | undefined;
|
|
9
|
+
type DatePickerInput<V extends 'single' | 'range'> = V extends 'single' ? Date | string | undefined : {
|
|
10
|
+
from?: Date | string;
|
|
11
|
+
to?: Date | string;
|
|
12
|
+
} | undefined;
|
|
13
|
+
export interface DatePickerProps<V extends 'single' | 'range' = 'single', F extends ValueFormat = 'iso'> extends Omit<PropsBase, 'mode' | 'selected' | 'onSelect' | 'locale'> {
|
|
3
14
|
/**
|
|
4
15
|
* Placeholder text displayed when no date is selected
|
|
5
|
-
* @default 'Pick a date'
|
|
16
|
+
* @default 'Pick a date' for single mode, 'Pick a date range' for range mode
|
|
6
17
|
*/
|
|
7
|
-
placeholder?: string;
|
|
18
|
+
readonly placeholder?: string;
|
|
8
19
|
/**
|
|
9
|
-
* Format string to use when displaying the selected date
|
|
20
|
+
* Format string to use when displaying the selected date in the button
|
|
10
21
|
* @default 'MMM d, yyyy'
|
|
11
22
|
*/
|
|
12
|
-
|
|
23
|
+
readonly displayFormat?: string;
|
|
13
24
|
/**
|
|
14
25
|
* ClassName for the button
|
|
15
26
|
*/
|
|
16
|
-
buttonClassName?: string;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
27
|
+
readonly buttonClassName?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Whether to allow the user to show the year switcher menu
|
|
30
|
+
* @default true for single mode, false for range mode
|
|
31
|
+
*/
|
|
32
|
+
readonly showYearSwitcher?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Initial value for the date picker
|
|
35
|
+
* Accepts both Date objects and ISO strings regardless of valueFormat setting
|
|
36
|
+
*/
|
|
37
|
+
readonly initialValue?: DatePickerInput<V>;
|
|
38
|
+
/**
|
|
39
|
+
* Current value for the date picker
|
|
40
|
+
* Accepts both Date objects and ISO strings regardless of valueFormat setting
|
|
41
|
+
*/
|
|
42
|
+
readonly value?: DatePickerInput<V>;
|
|
43
|
+
/**
|
|
44
|
+
* Determines if the picker should close after a selection
|
|
45
|
+
* @default true for single mode, false for range mode
|
|
46
|
+
*/
|
|
47
|
+
readonly closeOnSelect?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Determines the format of the value provided to the onChange callback
|
|
50
|
+
* - 'iso' (default): onChange receives ISO string(s) ('yyyy-MM-dd')
|
|
51
|
+
* - 'date': onChange receives JavaScript Date object(s)
|
|
52
|
+
*
|
|
53
|
+
* Note: The component accepts both Date objects and ISO strings for value/initialValue
|
|
54
|
+
* regardless of this setting.
|
|
55
|
+
* @default 'iso'
|
|
56
|
+
*/
|
|
57
|
+
readonly valueFormat?: F;
|
|
58
|
+
/**
|
|
59
|
+
* Callback when date or date range changes
|
|
60
|
+
*/
|
|
61
|
+
readonly onChange?: (value: DatePickerOutput<V, F>) => void;
|
|
62
|
+
/**
|
|
63
|
+
* DatePicker mode - single date or date range
|
|
64
|
+
* @default 'single'
|
|
65
|
+
*/
|
|
66
|
+
readonly variant?: V;
|
|
67
|
+
/**
|
|
68
|
+
* The locale to use for formatting dates and determining the start of the week.
|
|
69
|
+
* Can be a string identifier for supported locales ('enUS', 'es', 'pt', 'enGB', 'de', 'it', 'fr')
|
|
70
|
+
* or a Locale object from date-fns/locale for other languages.
|
|
71
|
+
* @default 'enUS'
|
|
72
|
+
*/
|
|
73
|
+
readonly locale?: SupportedLocaleString | Locale;
|
|
74
|
+
}
|
|
75
|
+
declare function DatePicker<V extends 'single' | 'range' = 'single', F extends ValueFormat = 'iso'>({ variant, placeholder, valueFormat, initialValue: initialValueProp, value: valueProp, onChange, buttonClassName, displayFormat, closeOnSelect, showYearSwitcher, locale: localeProp, ...rest }: DatePickerProps<V, F>): import("react/jsx-runtime").JSX.Element;
|
|
36
76
|
declare namespace DatePicker {
|
|
37
77
|
var displayName: string;
|
|
38
78
|
}
|
|
@@ -1,64 +1,112 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
-
import
|
|
3
|
+
import { CalendarBlank } from '@phosphor-icons/react';
|
|
4
4
|
import { format } from 'date-fns';
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
5
|
+
import { enUS, es, pt, enGB, de, it, fr } from 'date-fns/locale';
|
|
6
|
+
import * as React from 'react';
|
|
7
7
|
import { Button, buttonVariants } from '../Button/Button.js';
|
|
8
8
|
import { Calendar } from '../Calendar/Calendar.js';
|
|
9
|
-
import {
|
|
9
|
+
import { PopoverRoot, PopoverTrigger, PopoverContent } from '../Popover/Popover.js';
|
|
10
|
+
import { parseInputDate, parseInputRange, formatOutputDate, formatOutputRange } from '../../lib/dateUtils.js';
|
|
11
|
+
import { cn } from '../../lib/utils.js';
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
13
|
+
const localeMap = {
|
|
14
|
+
enUS,
|
|
15
|
+
es,
|
|
16
|
+
pt,
|
|
17
|
+
enGB,
|
|
18
|
+
de,
|
|
19
|
+
it,
|
|
20
|
+
fr
|
|
21
|
+
};
|
|
22
|
+
function DatePicker({
|
|
23
|
+
variant = "single",
|
|
24
|
+
placeholder = variant === "single" ? "Pick a date" : "Pick a date range",
|
|
25
|
+
valueFormat = "iso",
|
|
26
|
+
initialValue: initialValueProp,
|
|
27
|
+
value: valueProp,
|
|
28
|
+
onChange,
|
|
29
|
+
buttonClassName,
|
|
30
|
+
displayFormat = "MMM d, yyyy",
|
|
31
|
+
closeOnSelect = variant === "single",
|
|
32
|
+
showYearSwitcher = variant === "single",
|
|
33
|
+
locale: localeProp = "enUS",
|
|
34
|
+
...rest
|
|
35
|
+
}) {
|
|
26
36
|
const [isOpen, setIsOpen] = React.useState(false);
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
);
|
|
33
|
-
const
|
|
34
|
-
|
|
37
|
+
const resolvedLocale = React.useMemo(() => {
|
|
38
|
+
if (typeof localeProp === "string") {
|
|
39
|
+
return localeMap[localeProp];
|
|
40
|
+
}
|
|
41
|
+
return localeProp;
|
|
42
|
+
}, [localeProp]);
|
|
43
|
+
const [internalSingleDate, setInternalSingleDate] = React.useState(() => {
|
|
44
|
+
if (variant === "single") {
|
|
45
|
+
return parseInputDate(initialValueProp);
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
});
|
|
49
|
+
const [internalDateRange, setInternalDateRange] = React.useState(() => {
|
|
50
|
+
if (variant === "range") {
|
|
51
|
+
return parseInputRange(initialValueProp);
|
|
52
|
+
}
|
|
53
|
+
return undefined;
|
|
54
|
+
});
|
|
55
|
+
React.useEffect(() => {
|
|
56
|
+
if (variant === "single") {
|
|
57
|
+
const parsedValue = parseInputDate(valueProp);
|
|
58
|
+
if (parsedValue?.getTime() !== internalSingleDate?.getTime()) {
|
|
59
|
+
setInternalSingleDate(parsedValue);
|
|
60
|
+
}
|
|
61
|
+
} else {
|
|
62
|
+
const parsedValue = parseInputRange(valueProp);
|
|
63
|
+
if (parsedValue?.from?.getTime() !== internalDateRange?.from?.getTime() || parsedValue?.to?.getTime() !== internalDateRange?.to?.getTime()) {
|
|
64
|
+
setInternalDateRange(parsedValue);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}, [valueProp, variant]);
|
|
68
|
+
const singleDate = internalSingleDate;
|
|
69
|
+
const dateRange = internalDateRange;
|
|
35
70
|
const handleSelect = React.useCallback(
|
|
36
71
|
(selectedDate) => {
|
|
37
72
|
if (variant === "single") {
|
|
38
73
|
const date = selectedDate;
|
|
39
74
|
setInternalSingleDate(date);
|
|
40
|
-
if (onChange
|
|
75
|
+
if (onChange) {
|
|
76
|
+
const output = valueFormat === "date" ? date : formatOutputDate(date, "iso");
|
|
77
|
+
onChange(output);
|
|
78
|
+
}
|
|
41
79
|
if (closeOnSelect) {
|
|
42
80
|
setIsOpen(false);
|
|
43
81
|
}
|
|
44
82
|
} else {
|
|
45
83
|
const range = selectedDate;
|
|
46
84
|
setInternalDateRange(range);
|
|
47
|
-
if (onChange
|
|
85
|
+
if (onChange) {
|
|
86
|
+
const output = valueFormat === "date" ? range : formatOutputRange(range, "iso");
|
|
87
|
+
onChange(output);
|
|
88
|
+
}
|
|
48
89
|
}
|
|
49
90
|
},
|
|
50
|
-
[variant, onChange, closeOnSelect]
|
|
91
|
+
[variant, valueFormat, onChange, closeOnSelect]
|
|
51
92
|
);
|
|
52
|
-
const
|
|
93
|
+
const formatForDisplay = () => {
|
|
94
|
+
const formatOptions = { locale: resolvedLocale };
|
|
53
95
|
if (variant === "single") {
|
|
54
|
-
return singleDate ? format(singleDate,
|
|
96
|
+
return singleDate ? format(singleDate, displayFormat, formatOptions) : placeholder;
|
|
55
97
|
}
|
|
56
98
|
if (!dateRange) return placeholder;
|
|
57
|
-
|
|
99
|
+
const fromStr = dateRange.from ? format(dateRange.from, displayFormat, formatOptions) : "...";
|
|
100
|
+
const toStr = dateRange.to ? format(dateRange.to, displayFormat, formatOptions) : "...";
|
|
101
|
+
if (!dateRange.from && !dateRange.to) return placeholder;
|
|
102
|
+
if (!dateRange.from) return `... - ${toStr}`;
|
|
103
|
+
if (!dateRange.to) return `${fromStr} - ...`;
|
|
104
|
+
return `${fromStr} - ${toStr}`;
|
|
58
105
|
};
|
|
59
106
|
const calendarProps = React.useMemo(() => {
|
|
60
107
|
const baseProps = {
|
|
61
108
|
...rest,
|
|
109
|
+
locale: resolvedLocale,
|
|
62
110
|
initialFocus: true
|
|
63
111
|
};
|
|
64
112
|
if (variant === "single") {
|
|
@@ -78,7 +126,7 @@ function DatePicker(props) {
|
|
|
78
126
|
defaultMonth: dateRange?.from ?? /* @__PURE__ */ new Date(),
|
|
79
127
|
numberOfMonths: rest.numberOfMonths ?? 2
|
|
80
128
|
};
|
|
81
|
-
}, [variant, rest, singleDate, dateRange, handleSelect]);
|
|
129
|
+
}, [variant, rest, singleDate, dateRange, handleSelect, resolvedLocale]);
|
|
82
130
|
return /* @__PURE__ */ jsxs(PopoverRoot, { open: isOpen, onOpenChange: setIsOpen, children: [
|
|
83
131
|
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
84
132
|
Button,
|
|
@@ -94,7 +142,7 @@ function DatePicker(props) {
|
|
|
94
142
|
disabled: typeof rest.disabled === "boolean" ? rest.disabled : false,
|
|
95
143
|
children: [
|
|
96
144
|
/* @__PURE__ */ jsx(CalendarBlank, { className: "absolute left-4 h-4 w-4 shrink-0" }),
|
|
97
|
-
/* @__PURE__ */ jsx("span", { className: "w-full pl-7 text-center", children:
|
|
145
|
+
/* @__PURE__ */ jsx("span", { className: "w-full pl-7 text-center", children: formatForDisplay() })
|
|
98
146
|
]
|
|
99
147
|
}
|
|
100
148
|
) }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.js","sources":["../../../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["'use client'\n\nimport
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sources":["../../../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["'use client'\n\nimport { CalendarBlank } from '@phosphor-icons/react'\nimport { format as formatFn, Locale } from 'date-fns'\nimport { enUS, es, pt, enGB, de, it, fr } from 'date-fns/locale'\nimport * as React from 'react'\nimport { DateRange, PropsBase } from 'react-day-picker'\n\nimport { Button, buttonVariants } from '../Button'\nimport { Calendar } from '../Calendar'\nimport { PopoverContent, PopoverRoot, PopoverTrigger } from '../Popover'\n\nimport {\n formatOutputDate,\n formatOutputRange,\n parseInputDate,\n parseInputRange,\n InputDate,\n InputRange,\n ValueFormat,\n} from '@/lib/dateUtils'\nimport { cn } from '@/lib/utils'\n\ntype SupportedLocaleString = 'enUS' | 'es' | 'pt' | 'enGB' | 'de' | 'it' | 'fr'\n\nconst localeMap: Record<SupportedLocaleString, Locale> = {\n enUS,\n es,\n pt,\n enGB,\n de,\n it,\n fr,\n}\n\ntype DatePickerOutput<Variant extends 'single' | 'range', Format extends ValueFormat> = Variant extends 'single'\n ? Format extends 'date'\n ? Date | undefined\n : string | undefined\n : Format extends 'date'\n ? DateRange | undefined\n : { from?: string; to?: string } | undefined\n\ntype DatePickerInput<V extends 'single' | 'range'> = V extends 'single'\n ? Date | string | undefined\n : { from?: Date | string; to?: Date | string } | undefined\n\nexport interface DatePickerProps<V extends 'single' | 'range' = 'single', F extends ValueFormat = 'iso'>\n extends Omit<PropsBase, 'mode' | 'selected' | 'onSelect' | 'locale'> {\n /**\n * Placeholder text displayed when no date is selected\n * @default 'Pick a date' for single mode, 'Pick a date range' for range mode\n */\n readonly placeholder?: string\n\n /**\n * Format string to use when displaying the selected date in the button\n * @default 'MMM d, yyyy'\n */\n readonly displayFormat?: string\n\n /**\n * ClassName for the button\n */\n readonly buttonClassName?: string\n\n /**\n * Whether to allow the user to show the year switcher menu\n * @default true for single mode, false for range mode\n */\n readonly showYearSwitcher?: boolean\n\n /**\n * Initial value for the date picker\n * Accepts both Date objects and ISO strings regardless of valueFormat setting\n */\n readonly initialValue?: DatePickerInput<V>\n\n /**\n * Current value for the date picker\n * Accepts both Date objects and ISO strings regardless of valueFormat setting\n */\n readonly value?: DatePickerInput<V>\n\n /**\n * Determines if the picker should close after a selection\n * @default true for single mode, false for range mode\n */\n readonly closeOnSelect?: boolean\n\n /**\n * Determines the format of the value provided to the onChange callback\n * - 'iso' (default): onChange receives ISO string(s) ('yyyy-MM-dd')\n * - 'date': onChange receives JavaScript Date object(s)\n *\n * Note: The component accepts both Date objects and ISO strings for value/initialValue\n * regardless of this setting.\n * @default 'iso'\n */\n readonly valueFormat?: F\n\n /**\n * Callback when date or date range changes\n */\n readonly onChange?: (value: DatePickerOutput<V, F>) => void\n\n /**\n * DatePicker mode - single date or date range\n * @default 'single'\n */\n readonly variant?: V\n\n /**\n * The locale to use for formatting dates and determining the start of the week.\n * Can be a string identifier for supported locales ('enUS', 'es', 'pt', 'enGB', 'de', 'it', 'fr')\n * or a Locale object from date-fns/locale for other languages.\n * @default 'enUS'\n */\n readonly locale?: SupportedLocaleString | Locale\n}\n\nfunction DatePicker<V extends 'single' | 'range' = 'single', F extends ValueFormat = 'iso'>({\n variant = 'single' as V,\n placeholder = variant === 'single' ? 'Pick a date' : 'Pick a date range',\n valueFormat = 'iso' as F,\n initialValue: initialValueProp,\n value: valueProp,\n onChange,\n buttonClassName,\n displayFormat = 'MMM d, yyyy',\n closeOnSelect = variant === 'single',\n showYearSwitcher = variant === 'single',\n locale: localeProp = 'enUS',\n ...rest\n}: DatePickerProps<V, F>) {\n const [isOpen, setIsOpen] = React.useState(false)\n\n const resolvedLocale = React.useMemo(() => {\n if (typeof localeProp === 'string') {\n return localeMap[localeProp]\n }\n return localeProp\n }, [localeProp])\n\n const [internalSingleDate, setInternalSingleDate] = React.useState<Date | undefined>(() => {\n if (variant === 'single') {\n return parseInputDate(initialValueProp as InputDate)\n }\n return undefined\n })\n\n const [internalDateRange, setInternalDateRange] = React.useState<DateRange | undefined>(() => {\n if (variant === 'range') {\n return parseInputRange(initialValueProp as InputRange)\n }\n return undefined\n })\n\n React.useEffect(() => {\n if (variant === 'single') {\n const parsedValue = parseInputDate(valueProp as InputDate)\n if (parsedValue?.getTime() !== internalSingleDate?.getTime()) {\n setInternalSingleDate(parsedValue)\n }\n } else {\n const parsedValue = parseInputRange(valueProp as InputRange)\n if (\n parsedValue?.from?.getTime() !== internalDateRange?.from?.getTime() ||\n parsedValue?.to?.getTime() !== internalDateRange?.to?.getTime()\n ) {\n setInternalDateRange(parsedValue)\n }\n }\n }, [valueProp, variant])\n\n const singleDate = internalSingleDate\n const dateRange = internalDateRange\n\n const handleSelect = React.useCallback(\n (selectedDate: Date | DateRange | undefined) => {\n if (variant === 'single') {\n const date = selectedDate as Date | undefined\n setInternalSingleDate(date)\n if (onChange) {\n const output = valueFormat === 'date' ? date : formatOutputDate(date, 'iso')\n onChange(output as DatePickerOutput<V, F>)\n }\n if (closeOnSelect) {\n setIsOpen(false)\n }\n } else {\n const range = selectedDate as DateRange | undefined\n setInternalDateRange(range)\n if (onChange) {\n const output = valueFormat === 'date' ? range : formatOutputRange(range, 'iso')\n onChange(output as DatePickerOutput<V, F>)\n }\n }\n },\n [variant, valueFormat, onChange, closeOnSelect],\n )\n\n const formatForDisplay = () => {\n const formatOptions = { locale: resolvedLocale }\n if (variant === 'single') {\n return singleDate ? formatFn(singleDate, displayFormat, formatOptions) : placeholder\n }\n\n if (!dateRange) return placeholder\n const fromStr = dateRange.from ? formatFn(dateRange.from, displayFormat, formatOptions) : '...'\n const toStr = dateRange.to ? formatFn(dateRange.to, displayFormat, formatOptions) : '...'\n if (!dateRange.from && !dateRange.to) return placeholder\n if (!dateRange.from) return `... - ${toStr}`\n if (!dateRange.to) return `${fromStr} - ...`\n return `${fromStr} - ${toStr}`\n }\n\n const calendarProps = React.useMemo(() => {\n const baseProps = {\n ...rest,\n locale: resolvedLocale,\n initialFocus: true,\n }\n\n if (variant === 'single') {\n return {\n ...baseProps,\n mode: 'single' as const,\n selected: singleDate,\n onSelect: (date: Date | undefined) => handleSelect(date),\n defaultMonth: singleDate ?? new Date(),\n }\n }\n\n return {\n ...baseProps,\n mode: 'range' as const,\n selected: dateRange,\n onSelect: (range: DateRange | undefined) => handleSelect(range),\n defaultMonth: dateRange?.from ?? new Date(),\n numberOfMonths: rest.numberOfMonths ?? 2,\n }\n }, [variant, rest, singleDate, dateRange, handleSelect, resolvedLocale])\n\n return (\n <PopoverRoot open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>\n <Button\n id={rest.id}\n variant=\"ghost\"\n className={cn(\n 'relative flex w-fit items-center justify-start text-left font-normal',\n !(variant === 'single' ? singleDate : dateRange) && 'text-muted-foreground',\n buttonVariants({ variant: 'input' }),\n buttonClassName,\n )}\n disabled={typeof rest.disabled === 'boolean' ? rest.disabled : false}\n >\n <CalendarBlank className=\"absolute left-4 h-4 w-4 shrink-0\" />\n <span className=\"w-full pl-7 text-center\">{formatForDisplay()}</span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"center\">\n <Calendar\n {...calendarProps}\n className=\"border-0\"\n showYearSwitcher={variant === 'single' ? showYearSwitcher : false}\n />\n </PopoverContent>\n </PopoverRoot>\n )\n}\n\nDatePicker.displayName = 'DatePicker'\n\nexport { DatePicker }\nexport type { DateRange }\n"],"names":[],"mappings":";;;;;;;;;;;;AAyBA;AAAyD;AACvD;AACA;AACA;AACA;AACA;AACA;AAEF;AAwFA;AAA4F;AAChF;AAC2C;AACvC;AACA;AACP;AACP;AACA;AACgB;AACY;AACG;AACV;AAEvB;AACE;AAEA;AACE;AACE;AAA2B;AAE7B;AAAO;AAGT;AACE;AACE;AAAmD;AAErD;AAAO;AAGT;AACE;AACE;AAAqD;AAEvD;AAAO;AAGT;AACE;AACE;AACA;AACE;AAAiC;AACnC;AAEA;AACA;AAIE;AAAgC;AAClC;AACF;AAGF;AACA;AAEA;AAA2B;AAEvB;AACE;AACA;AACA;AACE;AACA;AAAyC;AAE3C;AACE;AAAe;AACjB;AAEA;AACA;AACA;AACE;AACA;AAAyC;AAC3C;AACF;AACF;AAC8C;AAGhD;AACE;AACA;AACE;AAAyE;AAG3E;AACA;AACA;AACA;AACA;AACA;AACA;AAA4B;AAG9B;AACE;AAAkB;AACb;AACK;AACM;AAGhB;AACE;AAAO;AACF;AACG;AACI;AAC6C;AAClB;AACvC;AAGF;AAAO;AACF;AACG;AACI;AACoD;AACpB;AACH;AACzC;AAGF;AAEI;AACE;AAAC;AAAA;AACU;AACD;AACG;AACT;AACoD;AACjB;AACnC;AACF;AAC+D;AAE/D;AAA4D;AACE;AAAA;AAAA;AAElE;AAEE;AAAC;AAAA;AACK;AACM;AACkD;AAAA;AAEhE;AAGN;AAEA;;"}
|
|
@@ -18,6 +18,7 @@ interface Option {
|
|
|
18
18
|
interface Props {
|
|
19
19
|
onValueChange?: (value: string) => void;
|
|
20
20
|
defaultValue?: string;
|
|
21
|
+
value?: string;
|
|
21
22
|
placeholder?: string;
|
|
22
23
|
options: Array<Option>;
|
|
23
24
|
className?: string;
|
|
@@ -26,4 +27,4 @@ interface Props {
|
|
|
26
27
|
id?: string;
|
|
27
28
|
onKeyDown?: (event: React.KeyboardEvent<HTMLButtonElement>) => void;
|
|
28
29
|
}
|
|
29
|
-
export declare function Select({ onValueChange, defaultValue, options, placeholder, className, disabled, error, id, onKeyDown, ...props }: Readonly<Props>): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
export declare function Select({ onValueChange, defaultValue, value, options, placeholder, className, disabled, error, id, onKeyDown, ...props }: Readonly<Props>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { CaretDown, CaretUp, Check } from '@phosphor-icons/react/dist/ssr';
|
|
2
3
|
import * as SelectPrimitive from '@radix-ui/react-select';
|
|
3
4
|
import * as React from 'react';
|
|
4
|
-
import { cn } from '../../lib/utils.js';
|
|
5
|
-
import { CaretDown, CaretUp, Check } from '@phosphor-icons/react/dist/ssr';
|
|
6
5
|
import { buttonVariants } from '../Button/Button.js';
|
|
6
|
+
import { cn } from '../../lib/utils.js';
|
|
7
7
|
|
|
8
8
|
const SelectRoot = SelectPrimitive.Root;
|
|
9
9
|
const SelectGroup = SelectPrimitive.Group;
|
|
@@ -84,6 +84,7 @@ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
|
|
|
84
84
|
function Select({
|
|
85
85
|
onValueChange,
|
|
86
86
|
defaultValue,
|
|
87
|
+
value,
|
|
87
88
|
options,
|
|
88
89
|
placeholder,
|
|
89
90
|
className,
|
|
@@ -94,24 +95,34 @@ function Select({
|
|
|
94
95
|
...props
|
|
95
96
|
}) {
|
|
96
97
|
return /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-col gap-1", children: [
|
|
97
|
-
/* @__PURE__ */ jsxs(
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
98
|
+
/* @__PURE__ */ jsxs(
|
|
99
|
+
SelectRoot,
|
|
100
|
+
{
|
|
101
|
+
...props,
|
|
102
|
+
onValueChange,
|
|
103
|
+
value,
|
|
104
|
+
defaultValue,
|
|
105
|
+
disabled,
|
|
106
|
+
children: [
|
|
107
|
+
/* @__PURE__ */ jsx(
|
|
108
|
+
SelectTrigger,
|
|
109
|
+
{
|
|
110
|
+
id,
|
|
111
|
+
onKeyDown,
|
|
112
|
+
"aria-invalid": error ? "true" : "false",
|
|
113
|
+
className: cn(
|
|
114
|
+
buttonVariants({ variant: "input" }),
|
|
115
|
+
"flex justify-between",
|
|
116
|
+
error && "border-none ring-1 ring-error-400 focus-within:ring-error-700",
|
|
117
|
+
className
|
|
118
|
+
),
|
|
119
|
+
children: /* @__PURE__ */ jsx(SelectValue, { placeholder })
|
|
120
|
+
}
|
|
109
121
|
),
|
|
110
|
-
children: /* @__PURE__ */ jsx(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
] }),
|
|
122
|
+
/* @__PURE__ */ jsx(SelectContent, { children: options.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: option.value, "data-testid": option.value, children: option.label }, option.value)) })
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
),
|
|
115
126
|
typeof error === "string" && /* @__PURE__ */ jsx("span", { className: "text-sm text-error-500", children: error })
|
|
116
127
|
] });
|
|
117
128
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.js","sources":["../../../src/components/Select/Select.tsx"],"sourcesContent":["import * as SelectPrimitive from '@radix-ui/react-select'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\nimport { CaretDown, CaretUp, Check } from '@phosphor-icons/react/dist/ssr'\nimport { buttonVariants } from '../Button'\n\nconst SelectRoot = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger ref={ref} className={className} {...props}>\n {children}\n <SelectPrimitive.Icon asChild>\n <CaretDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <CaretUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <CaretDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-[#fff] text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label ref={ref} className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)} {...props} />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-neutral-100 focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator ref={ref} className={cn('bg-muted -mx-1 my-1 h-px', className)} {...props} />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n SelectRoot,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\ninterface Option {\n value: string\n label: React.ReactElement | string | number\n}\ninterface Props {\n onValueChange?: (value: string) => void\n defaultValue?: string\n placeholder?: string\n options: Array<Option>\n className?: string\n disabled?: boolean\n error?: boolean | string\n id?: string\n onKeyDown?: (event: React.KeyboardEvent<HTMLButtonElement>) => void\n}\n\nexport function Select({\n onValueChange,\n defaultValue,\n options,\n placeholder,\n className,\n disabled = false,\n error,\n id,\n onKeyDown,\n ...props\n}: Readonly<Props>) {\n return (\n <div className=\"flex w-full flex-col gap-1\">\n <SelectRoot {...props} onValueChange={onValueChange} defaultValue={defaultValue} disabled={disabled}>\n <SelectTrigger\n id={id}\n onKeyDown={onKeyDown}\n aria-invalid={error ? 'true' : 'false'}\n className={cn(\n buttonVariants({ variant: 'input' }),\n 'flex justify-between',\n error && 'border-none ring-1 ring-error-400 focus-within:ring-error-700',\n className,\n )}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value} data-testid={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </SelectRoot>\n {typeof error === 'string' && <span className=\"text-sm text-error-500\">{error}</span>}\n </div>\n )\n}\n"],"names":[],"mappings":";;;;;;;AAOA,MAAM,aAAa,eAAgB,CAAA;AAEnC,MAAM,cAAc,eAAgB,CAAA;AAEpC,MAAM,cAAc,eAAgB,CAAA;AAEpC,MAAM,gBAAgB,KAAM,CAAA,UAAA,CAG1B,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,EAAS,EAAA,GAAA,0BACnC,eAAgB,CAAA,OAAA,EAAhB,EAAwB,GAAU,EAAA,SAAA,EAAuB,GAAG,KAC1D,EAAA,QAAA,EAAA;AAAA,EAAA,QAAA;AAAA,kBACD,GAAA,CAAC,eAAgB,CAAA,IAAA,EAAhB,EAAqB,OAAA,EAAO,MAC3B,QAAC,kBAAA,GAAA,CAAA,SAAA,EAAA,EAAU,SAAU,EAAA,oBAAA,EAAqB,CAC5C,EAAA;AAAA,CAAA,EACF,CACD;AACD,aAAc,CAAA,WAAA,GAAc,gBAAgB,OAAQ,CAAA,WAAA;AAE9C,MAAA,oBAAA,GAAuB,MAAM,UAGjC,CAAA,CAAC,EAAE,SAAW,EAAA,GAAG,KAAM,EAAA,EAAG,GAC1B,qBAAA,GAAA;AAAA,EAAC,eAAgB,CAAA,cAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAG,CAAA,sDAAA,EAAwD,SAAS,CAAA;AAAA,IAC9E,GAAG,KAAA;AAAA,IAEJ,QAAA,kBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,SAAA,EAAU,SAAU,EAAA;AAAA;AAC/B,CACD;AACD,oBAAqB,CAAA,WAAA,GAAc,gBAAgB,cAAe,CAAA,WAAA;AAE5D,MAAA,sBAAA,GAAyB,MAAM,UAGnC,CAAA,CAAC,EAAE,SAAW,EAAA,GAAG,KAAM,EAAA,EAAG,GAC1B,qBAAA,GAAA;AAAA,EAAC,eAAgB,CAAA,gBAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAG,CAAA,sDAAA,EAAwD,SAAS,CAAA;AAAA,IAC9E,GAAG,KAAA;AAAA,IAEJ,QAAA,kBAAA,GAAA,CAAC,SAAU,EAAA,EAAA,SAAA,EAAU,SAAU,EAAA;AAAA;AACjC,CACD;AACD,sBAAuB,CAAA,WAAA,GAAc,gBAAgB,gBAAiB,CAAA,WAAA;AAEtE,MAAM,gBAAgB,KAAM,CAAA,UAAA,CAG1B,CAAC,EAAE,WAAW,QAAU,EAAA,QAAA,GAAW,QAAU,EAAA,GAAG,OAAS,EAAA,GAAA,qBACxD,GAAA,CAAA,eAAA,CAAgB,QAAhB,EACC,QAAA,kBAAA,IAAA;AAAA,EAAC,eAAgB,CAAA,OAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAW,EAAA,EAAA;AAAA,MACT,ocAAA;AAAA,MACA,aAAa,QACX,IAAA,iIAAA;AAAA,MACF;AAAA,KACF;AAAA,IACA,QAAA;AAAA,IACC,GAAG,KAAA;AAAA,IAEJ,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,oBAAqB,EAAA,EAAA,CAAA;AAAA,sBACtB,GAAA;AAAA,QAAC,eAAgB,CAAA,QAAA;AAAA,QAAhB;AAAA,UACC,SAAW,EAAA,EAAA;AAAA,YACT,KAAA;AAAA,YACA,aAAa,QACX,IAAA;AAAA,WACJ;AAAA,UAEC;AAAA;AAAA,OACH;AAAA,0BACC,sBAAuB,EAAA,EAAA;AAAA;AAAA;AAC1B,CAAA,EACF,CACD;AACD,aAAc,CAAA,WAAA,GAAc,gBAAgB,OAAQ,CAAA,WAAA;AAE9C,MAAA,WAAA,GAAc,MAAM,UAGxB,CAAA,CAAC,EAAE,SAAW,EAAA,GAAG,KAAM,EAAA,EAAG,GAC1B,qBAAA,GAAA,CAAC,gBAAgB,KAAhB,EAAA,EAAsB,KAAU,SAAW,EAAA,EAAA,CAAG,0CAA0C,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CACjH;AACD,WAAY,CAAA,WAAA,GAAc,gBAAgB,KAAM,CAAA,WAAA;AAE1C,MAAA,UAAA,GAAa,KAAM,CAAA,UAAA,CAGvB,CAAC,EAAE,WAAW,QAAU,EAAA,GAAG,KAAM,EAAA,EAAG,GACpC,qBAAA,IAAA;AAAA,EAAC,eAAgB,CAAA,IAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAW,EAAA,EAAA;AAAA,MACT,gOAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG,KAAA;AAAA,IAEJ,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAK,EAAA,EAAA,SAAA,EAAU,8DACd,EAAA,QAAA,kBAAA,GAAA,CAAC,eAAgB,CAAA,aAAA,EAAhB,EACC,QAAA,kBAAA,GAAA,CAAC,KAAM,EAAA,EAAA,SAAA,EAAU,SAAU,EAAA,CAAA,EAC7B,CACF,EAAA,CAAA;AAAA,sBAEC,GAAA,CAAA,eAAA,CAAgB,QAAhB,EAAA,EAA0B,QAAS,EAAA;AAAA;AAAA;AACtC,CACD;AACD,UAAW,CAAA,WAAA,GAAc,gBAAgB,IAAK,CAAA,WAAA;AAExC,MAAA,eAAA,GAAkB,MAAM,UAG5B,CAAA,CAAC,EAAE,SAAW,EAAA,GAAG,KAAM,EAAA,EAAG,GAC1B,qBAAA,GAAA,CAAC,gBAAgB,SAAhB,EAAA,EAA0B,KAAU,SAAW,EAAA,EAAA,CAAG,4BAA4B,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CACvG;AACD,eAAgB,CAAA,WAAA,GAAc,gBAAgB,SAAU,CAAA,WAAA;AA8BjD,SAAS,MAAO,CAAA;AAAA,EACrB,aAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAW,GAAA,KAAA;AAAA,EACX,KAAA;AAAA,EACA,EAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAoB,EAAA;AAClB,EACE,uBAAA,IAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,4BACb,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,UAAY,EAAA,EAAA,GAAG,KAAO,EAAA,aAAA,EAA8B,cAA4B,QAC/E,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,EAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA,EAAc,QAAQ,MAAS,GAAA,OAAA;AAAA,UAC/B,SAAW,EAAA,EAAA;AAAA,YACT,cAAe,CAAA,EAAE,OAAS,EAAA,OAAA,EAAS,CAAA;AAAA,YACnC,sBAAA;AAAA,YACA,KAAS,IAAA,+DAAA;AAAA,YACT;AAAA,WACF;AAAA,UAEA,QAAA,kBAAA,GAAA,CAAC,eAAY,WAA0B,EAAA;AAAA;AAAA,OACzC;AAAA,0BACC,aACE,EAAA,EAAA,QAAA,EAAA,OAAA,CAAQ,IAAI,CAAC,MAAA,yBACX,UAA8B,EAAA,EAAA,KAAA,EAAO,OAAO,KAAO,EAAA,aAAA,EAAa,OAAO,KACrE,EAAA,QAAA,EAAA,MAAA,CAAO,SADO,MAAO,CAAA,KAExB,CACD,CACH,EAAA;AAAA,KACF,EAAA,CAAA;AAAA,IACC,OAAO,KAAU,KAAA,QAAA,wBAAa,MAAK,EAAA,EAAA,SAAA,EAAU,0BAA0B,QAAM,EAAA,KAAA,EAAA;AAAA,GAChF,EAAA,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"Select.js","sources":["../../../src/components/Select/Select.tsx"],"sourcesContent":["import { CaretDown, CaretUp, Check } from '@phosphor-icons/react/dist/ssr'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport * as React from 'react'\n\nimport { buttonVariants } from '../Button'\n\nimport { cn } from '@/lib/utils'\n\nconst SelectRoot = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger ref={ref} className={className} {...props}>\n {children}\n <SelectPrimitive.Icon asChild>\n <CaretDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <CaretUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <CaretDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-[#fff] text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label ref={ref} className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)} {...props} />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-neutral-100 focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator ref={ref} className={cn('bg-muted -mx-1 my-1 h-px', className)} {...props} />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n SelectRoot,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\ninterface Option {\n value: string\n label: React.ReactElement | string | number\n}\ninterface Props {\n onValueChange?: (value: string) => void\n defaultValue?: string\n value?: string\n placeholder?: string\n options: Array<Option>\n className?: string\n disabled?: boolean\n error?: boolean | string\n id?: string\n onKeyDown?: (event: React.KeyboardEvent<HTMLButtonElement>) => void\n}\n\nexport function Select({\n onValueChange,\n defaultValue,\n value,\n options,\n placeholder,\n className,\n disabled = false,\n error,\n id,\n onKeyDown,\n ...props\n}: Readonly<Props>) {\n return (\n <div className=\"flex w-full flex-col gap-1\">\n <SelectRoot\n {...props}\n onValueChange={onValueChange}\n value={value}\n defaultValue={defaultValue}\n disabled={disabled}\n >\n <SelectTrigger\n id={id}\n onKeyDown={onKeyDown}\n aria-invalid={error ? 'true' : 'false'}\n className={cn(\n buttonVariants({ variant: 'input' }),\n 'flex justify-between',\n error && 'border-none ring-1 ring-error-400 focus-within:ring-error-700',\n className,\n )}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value} data-testid={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </SelectRoot>\n {typeof error === 'string' && <span className=\"text-sm text-error-500\">{error}</span>}\n </div>\n )\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { DateRange } from 'react-day-picker';
|
|
2
|
+
/**
|
|
3
|
+
* Format options for date values returned by onChange callbacks
|
|
4
|
+
*/
|
|
5
|
+
export type ValueFormat = 'iso' | 'date';
|
|
6
|
+
/**
|
|
7
|
+
* Type for single date input that can be a Date object, ISO string, or undefined
|
|
8
|
+
*/
|
|
9
|
+
export type InputDate = Date | string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Type for date range input that can be a DateRange object, an object with from/to properties, or undefined
|
|
12
|
+
*/
|
|
13
|
+
export type InputRange = DateRange | {
|
|
14
|
+
from?: Date | string;
|
|
15
|
+
to?: Date | string;
|
|
16
|
+
} | undefined;
|
|
17
|
+
export type OutputDate<TFormat extends ValueFormat> = TFormat extends 'iso' ? string | undefined : Date | undefined;
|
|
18
|
+
export type OutputRange<TFormat extends ValueFormat> = TFormat extends 'iso' ? {
|
|
19
|
+
from?: string;
|
|
20
|
+
to?: string;
|
|
21
|
+
} | undefined : DateRange | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Parses an input value (Date or ISO string) into a valid Date object.
|
|
24
|
+
* Returns undefined if the input is invalid or cannot be parsed.
|
|
25
|
+
*/
|
|
26
|
+
export declare const parseInputDate: (input: InputDate) => Date | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Formats a Date object into the specified output format (Date or ISO string).
|
|
29
|
+
* Returns undefined if the input date is undefined or invalid.
|
|
30
|
+
*/
|
|
31
|
+
export declare const formatOutputDate: <TFormat extends "iso" | "date">(date: Date | undefined, format: TFormat) => OutputDate<TFormat>;
|
|
32
|
+
/**
|
|
33
|
+
* Parses an input range value (containing Dates or ISO strings) into a DateRange object.
|
|
34
|
+
* Returns undefined if the input is invalid.
|
|
35
|
+
*/
|
|
36
|
+
export declare const parseInputRange: (input: InputRange) => DateRange | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Formats a DateRange object into the specified output format (DateRange or object with ISO strings).
|
|
39
|
+
* Returns undefined if the input range is undefined.
|
|
40
|
+
*/
|
|
41
|
+
export declare const formatOutputRange: <TFormat extends "iso" | "date">(range: DateRange | undefined, format: TFormat) => OutputRange<TFormat>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { isValid, parseISO, format } from 'date-fns';
|
|
2
|
+
|
|
3
|
+
const parseInputDate = (input) => {
|
|
4
|
+
if (input === undefined || input === null) return undefined;
|
|
5
|
+
if (input instanceof Date && isValid(input)) {
|
|
6
|
+
return input;
|
|
7
|
+
}
|
|
8
|
+
if (typeof input === "string") {
|
|
9
|
+
try {
|
|
10
|
+
const parsedDate = parseISO(input);
|
|
11
|
+
return isValid(parsedDate) ? parsedDate : void 0;
|
|
12
|
+
} catch {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return undefined;
|
|
17
|
+
};
|
|
18
|
+
const formatOutputDate = (date, format$1) => {
|
|
19
|
+
if (date === undefined || !isValid(date)) return undefined;
|
|
20
|
+
if (format$1 === "date") {
|
|
21
|
+
return date;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
return format(date, "yyyy-MM-dd");
|
|
25
|
+
} catch {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const parseInputRange = (input) => {
|
|
30
|
+
if (!input) return undefined;
|
|
31
|
+
const fromDate = parseInputDate(input.from);
|
|
32
|
+
const toDate = parseInputDate(input.to);
|
|
33
|
+
if (fromDate === undefined && toDate === undefined) return undefined;
|
|
34
|
+
return { from: fromDate, to: toDate };
|
|
35
|
+
};
|
|
36
|
+
const formatOutputRange = (range, format) => {
|
|
37
|
+
if (!range) return undefined;
|
|
38
|
+
if (format === "date") {
|
|
39
|
+
return range;
|
|
40
|
+
}
|
|
41
|
+
const fromString = formatOutputDate(range.from, "iso");
|
|
42
|
+
const toString = formatOutputDate(range.to, "iso");
|
|
43
|
+
return {
|
|
44
|
+
from: fromString,
|
|
45
|
+
to: toString
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export { formatOutputDate, formatOutputRange, parseInputDate, parseInputRange };
|
|
50
|
+
//# sourceMappingURL=dateUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dateUtils.js","sources":["../../src/lib/dateUtils.ts"],"sourcesContent":["import { format as formatFn, isValid, parseISO } from 'date-fns' // Used for parsing, formatting, and validating dates\nimport { DateRange } from 'react-day-picker' // Type used for date ranges\n\n/**\n * Format options for date values returned by onChange callbacks\n */\nexport type ValueFormat = 'iso' | 'date'\n\n/**\n * Type for single date input that can be a Date object, ISO string, or undefined\n */\nexport type InputDate = Date | string | undefined\n\n/**\n * Type for date range input that can be a DateRange object, an object with from/to properties, or undefined\n */\nexport type InputRange = DateRange | { from?: Date | string; to?: Date | string } | undefined\n\nexport type OutputDate<TFormat extends ValueFormat> = TFormat extends 'iso' ? string | undefined : Date | undefined\nexport type OutputRange<TFormat extends ValueFormat> = TFormat extends 'iso'\n ? { from?: string; to?: string } | undefined\n : DateRange | undefined\n\n/**\n * Parses an input value (Date or ISO string) into a valid Date object.\n * Returns undefined if the input is invalid or cannot be parsed.\n */\nexport const parseInputDate = (input: InputDate): Date | undefined => {\n if (input === undefined || input === null) return undefined\n\n if (input instanceof Date && isValid(input)) {\n return input\n }\n\n if (typeof input === 'string') {\n try {\n const parsedDate = parseISO(input)\n return isValid(parsedDate) ? parsedDate : undefined\n } catch {\n return undefined\n }\n }\n\n return undefined\n}\n\n/**\n * Formats a Date object into the specified output format (Date or ISO string).\n * Returns undefined if the input date is undefined or invalid.\n */\nexport const formatOutputDate = <TFormat extends 'iso' | 'date'>(\n date: Date | undefined,\n format: TFormat,\n): OutputDate<TFormat> => {\n if (date === undefined || !isValid(date)) return undefined\n\n if (format === 'date') {\n return date as OutputDate<TFormat>\n }\n\n try {\n return formatFn(date, 'yyyy-MM-dd') as OutputDate<TFormat>\n } catch {\n return undefined\n }\n}\n\n/**\n * Parses an input range value (containing Dates or ISO strings) into a DateRange object.\n * Returns undefined if the input is invalid.\n */\nexport const parseInputRange = (input: InputRange): DateRange | undefined => {\n if (!input) return undefined\n\n const fromDate = parseInputDate(input.from)\n const toDate = parseInputDate(input.to)\n\n if (fromDate === undefined && toDate === undefined) return undefined\n\n return { from: fromDate, to: toDate }\n}\n\n/**\n * Formats a DateRange object into the specified output format (DateRange or object with ISO strings).\n * Returns undefined if the input range is undefined.\n */\nexport const formatOutputRange = <TFormat extends 'iso' | 'date'>(\n range: DateRange | undefined,\n format: TFormat,\n): OutputRange<TFormat> => {\n if (!range) return undefined\n\n if (format === 'date') {\n return range as OutputRange<TFormat>\n }\n\n const fromString = formatOutputDate(range.from, 'iso')\n const toString = formatOutputDate(range.to, 'iso')\n\n return {\n from: fromString,\n to: toString,\n } as OutputRange<TFormat>\n}\n"],"names":["format","formatFn"],"mappings":";;AA2Ba,MAAA,cAAA,GAAiB,CAAC,KAAuC,KAAA;AACpE,EAAA,IAAI,KAAU,KAAA,SAAA,IAAa,KAAU,KAAA,IAAA,EAAa,OAAA,SAAA;AAElD,EAAA,IAAI,KAAiB,YAAA,IAAA,IAAQ,OAAQ,CAAA,KAAK,CAAG,EAAA;AAC3C,IAAO,OAAA,KAAA;AAAA;AAGT,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAI,IAAA;AACF,MAAM,MAAA,UAAA,GAAa,SAAS,KAAK,CAAA;AACjC,MAAO,OAAA,OAAA,CAAQ,UAAU,CAAA,GAAI,UAAa,GAAA,KAAA,CAAA;AAAA,KACpC,CAAA,MAAA;AACN,MAAO,OAAA,SAAA;AAAA;AACT;AAGF,EAAO,OAAA,SAAA;AACT;AAMa,MAAA,gBAAA,GAAmB,CAC9B,IAAA,EACAA,QACwB,KAAA;AACxB,EAAA,IAAI,SAAS,SAAa,IAAA,CAAC,OAAQ,CAAA,IAAI,GAAU,OAAA,SAAA;AAEjD,EAAA,IAAIA,aAAW,MAAQ,EAAA;AACrB,IAAO,OAAA,IAAA;AAAA;AAGT,EAAI,IAAA;AACF,IAAO,OAAAC,MAAA,CAAS,MAAM,YAAY,CAAA;AAAA,GAC5B,CAAA,MAAA;AACN,IAAO,OAAA,SAAA;AAAA;AAEX;AAMa,MAAA,eAAA,GAAkB,CAAC,KAA6C,KAAA;AAC3E,EAAI,IAAA,CAAC,OAAc,OAAA,SAAA;AAEnB,EAAM,MAAA,QAAA,GAAW,cAAe,CAAA,KAAA,CAAM,IAAI,CAAA;AAC1C,EAAM,MAAA,MAAA,GAAS,cAAe,CAAA,KAAA,CAAM,EAAE,CAAA;AAEtC,EAAA,IAAI,QAAa,KAAA,SAAA,IAAa,MAAW,KAAA,SAAA,EAAkB,OAAA,SAAA;AAE3D,EAAA,OAAO,EAAE,IAAA,EAAM,QAAU,EAAA,EAAA,EAAI,MAAO,EAAA;AACtC;AAMa,MAAA,iBAAA,GAAoB,CAC/B,KAAA,EACA,MACyB,KAAA;AACzB,EAAI,IAAA,CAAC,OAAc,OAAA,SAAA;AAEnB,EAAA,IAAI,WAAW,MAAQ,EAAA;AACrB,IAAO,OAAA,KAAA;AAAA;AAGT,EAAA,MAAM,UAAa,GAAA,gBAAA,CAAiB,KAAM,CAAA,IAAA,EAAM,KAAK,CAAA;AACrD,EAAA,MAAM,QAAW,GAAA,gBAAA,CAAiB,KAAM,CAAA,EAAA,EAAI,KAAK,CAAA;AAEjD,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,UAAA;AAAA,IACN,EAAI,EAAA;AAAA,GACN;AACF;;;;"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "periplo-ui",
|
|
3
3
|
"description": "IATI UI library",
|
|
4
4
|
"private": false,
|
|
5
|
-
"version": "3.
|
|
5
|
+
"version": "3.19.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"types": "dist/index.d.ts",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"eslint-plugin-react-hooks": "4.6.2",
|
|
68
68
|
"eslint-plugin-storybook": "0.11.2",
|
|
69
69
|
"eslint-plugin-testing-library": "6.5.0",
|
|
70
|
-
"eslint-plugin-vitest": "0.
|
|
70
|
+
"eslint-plugin-vitest": "0.4.1",
|
|
71
71
|
"husky": "9.1.7",
|
|
72
72
|
"jsdom": "24.1.3",
|
|
73
73
|
"lint-staged": "15.3.0",
|