@a-type/ui 3.0.32 → 3.0.34
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/cjs/components/datePicker/Calendar.d.ts +11 -0
- package/dist/cjs/components/datePicker/Calendar.js +37 -0
- package/dist/cjs/components/datePicker/Calendar.js.map +1 -0
- package/dist/cjs/components/datePicker/DatePicker.d.ts +42 -13
- package/dist/cjs/components/datePicker/DatePicker.js +31 -71
- package/dist/cjs/components/datePicker/DatePicker.js.map +1 -1
- package/dist/cjs/components/datePicker/DatePicker.stories.d.ts +36 -1
- package/dist/cjs/components/datePicker/DatePicker.stories.js +19 -2
- package/dist/cjs/components/datePicker/DatePicker.stories.js.map +1 -1
- package/dist/cjs/components/datePicker/DateRangePicker.d.ts +55 -0
- package/dist/cjs/components/datePicker/DateRangePicker.js +89 -0
- package/dist/cjs/components/datePicker/DateRangePicker.js.map +1 -0
- package/dist/cjs/components/datePicker/index.d.ts +2 -0
- package/dist/cjs/components/datePicker/index.js +1 -0
- package/dist/cjs/components/datePicker/index.js.map +1 -1
- package/dist/css/main.css +1 -1
- package/dist/esm/components/datePicker/Calendar.d.ts +11 -0
- package/dist/esm/components/datePicker/Calendar.js +32 -0
- package/dist/esm/components/datePicker/Calendar.js.map +1 -0
- package/dist/esm/components/datePicker/DatePicker.d.ts +42 -13
- package/dist/esm/components/datePicker/DatePicker.js +32 -68
- package/dist/esm/components/datePicker/DatePicker.js.map +1 -1
- package/dist/esm/components/datePicker/DatePicker.stories.d.ts +36 -1
- package/dist/esm/components/datePicker/DatePicker.stories.js +20 -3
- package/dist/esm/components/datePicker/DatePicker.stories.js.map +1 -1
- package/dist/esm/components/datePicker/DateRangePicker.d.ts +55 -0
- package/dist/esm/components/datePicker/DateRangePicker.js +83 -0
- package/dist/esm/components/datePicker/DateRangePicker.js.map +1 -0
- package/dist/esm/components/datePicker/index.d.ts +2 -0
- package/dist/esm/components/datePicker/index.js +1 -0
- package/dist/esm/components/datePicker/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/datePicker/Calendar.tsx +83 -0
- package/src/components/datePicker/DatePicker.stories.tsx +38 -2
- package/src/components/datePicker/DatePicker.tsx +77 -222
- package/src/components/datePicker/DateRangePicker.tsx +161 -0
- package/src/components/datePicker/index.ts +2 -0
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// @unocss-include
|
|
2
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
import { useState } from 'react';
|
|
4
|
-
import {
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { Spinner } from '../spinner/Spinner.js';
|
|
5
|
+
import { DatePicker } from './DatePicker.js';
|
|
6
|
+
import { DateRangePicker } from './DateRangePicker.js';
|
|
5
7
|
const meta = {
|
|
6
8
|
title: 'Components/DatePicker',
|
|
7
9
|
component: DatePicker,
|
|
@@ -23,4 +25,19 @@ export const Range = {
|
|
|
23
25
|
return _jsx(DateRangePicker, { value: value, onChange: setValue });
|
|
24
26
|
},
|
|
25
27
|
};
|
|
28
|
+
export const CustomComposition = {
|
|
29
|
+
render() {
|
|
30
|
+
const [value, setValue] = useState(null);
|
|
31
|
+
return (_jsxs(DatePicker.Root, { value: value, onChange: setValue, children: [_jsx(DatePicker.MonthControls, {}), _jsx(DatePicker.CalendarGrid, { children: (value) => _jsx(FakeLoadingDay, { value: value }, value.key) })] }));
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
function FakeLoadingDay({ value }) {
|
|
35
|
+
const [loading, setLoading] = useState(true);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
const timeout = setTimeout(() => setLoading(false), Math.random() * 2000 + 500);
|
|
38
|
+
return () => clearTimeout(timeout);
|
|
39
|
+
}, []);
|
|
40
|
+
const [disabled] = useState(() => Math.random() < 0.3);
|
|
41
|
+
return (_jsx(DatePicker.CalendarDay, { value: value, disabled: loading || disabled, children: loading ? _jsx(Spinner, { size: 10 }) : value.date.getDate() }));
|
|
42
|
+
}
|
|
26
43
|
//# sourceMappingURL=DatePicker.stories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.stories.js","sourceRoot":"","sources":["../../../../src/components/datePicker/DatePicker.stories.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"DatePicker.stories.js","sourceRoot":"","sources":["../../../../src/components/datePicker/DatePicker.stories.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,IAAI,GAAG;IACZ,KAAK,EAAE,uBAAuB;IAC9B,SAAS,EAAE,UAAU;IACrB,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE;QACX,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC5B;CACiC,CAAC;AAEpC,eAAe,IAAI,CAAC;AAIpB,MAAM,CAAC,MAAM,OAAO,GAAU;IAC7B,MAAM;QACL,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAC;QACtD,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC;IACzD,CAAC;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAU;IAC3B,MAAM;QACL,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAG/B,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/B,OAAO,KAAC,eAAe,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC;IAC9D,CAAC;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAU;IACvC,MAAM;QACL,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAC;QAEtD,OAAO,CACN,MAAC,UAAU,CAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,aAChD,KAAC,UAAU,CAAC,aAAa,KAAG,EAC5B,KAAC,UAAU,CAAC,YAAY,cACtB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAC,cAAc,IAAC,KAAK,EAAE,KAAK,IAAO,KAAK,CAAC,GAAG,CAAI,GACnC,IACT,CAClB,CAAC;IACH,CAAC;CACD,CAAC;AAEF,SAAS,cAAc,CAAC,EAAE,KAAK,EAA+B;IAC7D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,OAAO,GAAG,UAAU,CACzB,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EACvB,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,GAAG,CAC1B,CAAC;QACF,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IAEvD,OAAO,CACN,KAAC,UAAU,CAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,IAAI,QAAQ,YACjE,OAAO,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAC/B,CACzB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { CalendarDays } from 'calendar-blocks';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { PaletteName } from '../../uno/index.js';
|
|
4
|
+
import { CalendarGrid } from './Calendar.js';
|
|
5
|
+
declare function DateRangePickerMonthControls(): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
declare function DateRangePickerRoot({ children, color, value, onChange, className, ...rest }: DateRangePickerProps & {
|
|
7
|
+
children?: ReactNode;
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export interface DateRangePickerProps {
|
|
10
|
+
value: {
|
|
11
|
+
start: Date | null;
|
|
12
|
+
end: Date | null;
|
|
13
|
+
};
|
|
14
|
+
onChange: (value: {
|
|
15
|
+
start: Date | null;
|
|
16
|
+
end: Date | null;
|
|
17
|
+
}) => void;
|
|
18
|
+
className?: string;
|
|
19
|
+
color?: PaletteName;
|
|
20
|
+
}
|
|
21
|
+
declare function DateRangePickerBase(props: DateRangePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export declare const DateRangePicker: typeof DateRangePickerBase & {
|
|
23
|
+
Root: typeof DateRangePickerRoot;
|
|
24
|
+
RangeLayout: import("react").FunctionComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>>;
|
|
25
|
+
DayLabels: () => import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
CalendarDay: import("react").FunctionComponent<import("calendar-blocks").CalendarDayProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
27
|
+
Calendar: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLDivElement>, "onChange" | "value"> & {
|
|
28
|
+
onDisplayChange?: (newValue: {
|
|
29
|
+
month: number;
|
|
30
|
+
year: number;
|
|
31
|
+
}) => any;
|
|
32
|
+
displayYear: number;
|
|
33
|
+
displayMonth: number;
|
|
34
|
+
value?: Date | null;
|
|
35
|
+
onChange?: (value: Date | null) => any;
|
|
36
|
+
rangeValue?: {
|
|
37
|
+
start: Date | null;
|
|
38
|
+
end: Date | null;
|
|
39
|
+
};
|
|
40
|
+
onRangeChange?: (range: {
|
|
41
|
+
start: Date | null;
|
|
42
|
+
end: Date | null;
|
|
43
|
+
}) => any;
|
|
44
|
+
onRangeStartChange?: (range: Date) => any;
|
|
45
|
+
getDateEnabled?: (date: Date) => boolean;
|
|
46
|
+
defaultDate?: Date;
|
|
47
|
+
weekStartsOn?: import("calendar-blocks/dist/constants.js").WeekDay;
|
|
48
|
+
} & import("react").RefAttributes<any>>;
|
|
49
|
+
CalendarGrid: typeof CalendarGrid;
|
|
50
|
+
CalendarDays: typeof CalendarDays;
|
|
51
|
+
MonthControls: typeof DateRangePickerMonthControls;
|
|
52
|
+
MonthButton: import("react").FunctionComponent<import("../index.js").ButtonProps>;
|
|
53
|
+
MonthLabel: import("react").FunctionComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>>;
|
|
54
|
+
};
|
|
55
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// @unocss-include
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
+
import { Calendar, CalendarDays, useCalendarContext } from 'calendar-blocks';
|
|
15
|
+
import clsx from 'clsx';
|
|
16
|
+
import { useCallback, useState } from 'react';
|
|
17
|
+
import { withClassName } from '../../hooks.js';
|
|
18
|
+
import { Icon } from '../icon/Icon.js';
|
|
19
|
+
import { CalendarDay, CalendarGrid, DayLabels, MonthButton, MonthLabel, } from './Calendar.js';
|
|
20
|
+
const RangeLayout = withClassName('div', 'grid [grid-template-areas:"prevMonth_leftMonth_nextMonth""leftGrid_leftGrid_leftGrid"] [grid-template-columns:auto_1fr_auto]', '[grid-template-rows:auto_1fr] gap-2', 'sm:grid-areas-[prevMonth_leftMonth_rightMonth_nextMonth]-[leftGrid_leftGrid_rightGrid_rightGrid] sm:[grid-template-columns:auto_1fr_1fr_auto]');
|
|
21
|
+
function DateRangePickerMonthControls() {
|
|
22
|
+
const { setDisplayInfo, month, year } = useCalendarContext();
|
|
23
|
+
const monthLabel = new Date(year, month).toLocaleDateString('en-US', {
|
|
24
|
+
month: 'long',
|
|
25
|
+
year: 'numeric',
|
|
26
|
+
});
|
|
27
|
+
const nextMonth = new Date(year, month + 1);
|
|
28
|
+
const nextMonthLabel = nextMonth.toLocaleDateString('en-US', {
|
|
29
|
+
month: 'long',
|
|
30
|
+
year: 'numeric',
|
|
31
|
+
});
|
|
32
|
+
return (_jsxs(_Fragment, { children: [_jsx(MonthButton, { emphasis: "ghost", className: "[grid-area:prevMonth]", onClick: () => setDisplayInfo({
|
|
33
|
+
month: month - 1,
|
|
34
|
+
year: year,
|
|
35
|
+
}), children: _jsx(Icon, { name: "arrowLeft" }) }), _jsx(MonthLabel, { className: "[grid-area:leftMonth]", children: monthLabel }), _jsx(MonthLabel, { className: "[grid-area:rightMonth] !hidden !sm:block", children: nextMonthLabel }), _jsx(MonthButton, { emphasis: "ghost", className: "[grid-area:nextMonth]", onClick: () => setDisplayInfo({
|
|
36
|
+
month: month + 1,
|
|
37
|
+
year: year,
|
|
38
|
+
}), children: _jsx(Icon, { name: "arrowRight" }) })] }));
|
|
39
|
+
}
|
|
40
|
+
function DateRangePickerRoot(_a) {
|
|
41
|
+
var { children, color, value, onChange, className } = _a, rest = __rest(_a, ["children", "color", "value", "onChange", "className"]);
|
|
42
|
+
const [{ month, year }, setDisplay] = useState(() => ({
|
|
43
|
+
month: new Date().getMonth(),
|
|
44
|
+
year: new Date().getFullYear(),
|
|
45
|
+
}));
|
|
46
|
+
const onDisplayChange = useCallback(({ month: newMonth, year: newYear }) => {
|
|
47
|
+
/**
|
|
48
|
+
* Important UX consideration:
|
|
49
|
+
*
|
|
50
|
+
* since we are displaying 2 months at once, we don't
|
|
51
|
+
* always want to change our view if the user's cursor
|
|
52
|
+
* date moves from one month to another. Specifically,
|
|
53
|
+
* if they move from the first visible month to the
|
|
54
|
+
* second visible month, we don't need to change the view,
|
|
55
|
+
* since they are still within the visible range.
|
|
56
|
+
* So, we write logic to ignore that case!
|
|
57
|
+
*/
|
|
58
|
+
if (newMonth === month + 1 && newYear === year) {
|
|
59
|
+
return; // ignore movement from the first to the second frame
|
|
60
|
+
}
|
|
61
|
+
setDisplay({
|
|
62
|
+
month: newMonth,
|
|
63
|
+
year: newYear,
|
|
64
|
+
});
|
|
65
|
+
}, [month, year]);
|
|
66
|
+
return (_jsx(Calendar, Object.assign({ displayMonth: month, displayYear: year, rangeValue: value, onRangeChange: (range) => onChange(range), onDisplayChange: onDisplayChange, className: clsx('flex justify-center', color && `palette-${color}`, className) }, rest, { children: _jsx(RangeLayout, { children: children }) })));
|
|
67
|
+
}
|
|
68
|
+
function DateRangePickerBase(props) {
|
|
69
|
+
return (_jsxs(DateRangePickerRoot, Object.assign({}, props, { children: [_jsx(DateRangePickerMonthControls, {}), _jsx(CalendarGrid, { className: "[grid-area:leftGrid]", children: (value) => _jsx(CalendarDay, { value: value }, value.key) }), _jsx(CalendarGrid, { className: "[grid-area:rightGrid] !hidden !sm:grid", monthOffset: 1, children: (value) => _jsx(CalendarDay, { value: value }, value.key) })] })));
|
|
70
|
+
}
|
|
71
|
+
export const DateRangePicker = Object.assign(DateRangePickerBase, {
|
|
72
|
+
Root: DateRangePickerRoot,
|
|
73
|
+
RangeLayout,
|
|
74
|
+
DayLabels,
|
|
75
|
+
CalendarDay,
|
|
76
|
+
Calendar,
|
|
77
|
+
CalendarGrid,
|
|
78
|
+
CalendarDays,
|
|
79
|
+
MonthControls: DateRangePickerMonthControls,
|
|
80
|
+
MonthButton,
|
|
81
|
+
MonthLabel,
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=DateRangePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateRangePicker.js","sourceRoot":"","sources":["../../../../src/components/datePicker/DateRangePicker.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAa,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EACN,WAAW,EACX,YAAY,EACZ,SAAS,EACT,WAAW,EACX,UAAU,GACV,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,GAAG,aAAa,CAChC,KAAK,EACL,8HAA8H,EAC9H,qCAAqC,EACrC,+IAA+I,CAC/I,CAAC;AAEF,SAAS,4BAA4B;IACpC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACpE,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,SAAS;KACf,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE;QAC5D,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,SAAS;KACf,CAAC,CAAC;IACH,OAAO,CACN,8BACC,KAAC,WAAW,IACX,QAAQ,EAAC,OAAO,EAChB,SAAS,EAAC,uBAAuB,EACjC,OAAO,EAAE,GAAG,EAAE,CACb,cAAc,CAAC;oBACd,KAAK,EAAE,KAAK,GAAG,CAAC;oBAChB,IAAI,EAAE,IAAI;iBACV,CAAC,YAGH,KAAC,IAAI,IAAC,IAAI,EAAC,WAAW,GAAG,GACZ,EACd,KAAC,UAAU,IAAC,SAAS,EAAC,uBAAuB,YAAE,UAAU,GAAc,EACvE,KAAC,UAAU,IAAC,SAAS,EAAC,0CAA0C,YAC9D,cAAc,GACH,EACb,KAAC,WAAW,IACX,QAAQ,EAAC,OAAO,EAChB,SAAS,EAAC,uBAAuB,EACjC,OAAO,EAAE,GAAG,EAAE,CACb,cAAc,CAAC;oBACd,KAAK,EAAE,KAAK,GAAG,CAAC;oBAChB,IAAI,EAAE,IAAI;iBACV,CAAC,YAGH,KAAC,IAAI,IAAC,IAAI,EAAC,YAAY,GAAG,GACb,IACZ,CACH,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,EAS5B;QAT4B,EAC5B,QAAQ,EACR,KAAK,EACL,KAAK,EACL,QAAQ,EACR,SAAS,OAIT,EAHG,IAAI,cANqB,uDAO5B,CADO;IAIP,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QACrD,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE;QAC5B,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC9B,CAAC,CAAC,CAAC;IAEJ,MAAM,eAAe,GAAG,WAAW,CAClC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAmC,EAAE,EAAE;QACvE;;;;;;;;;;WAUG;QACH,IAAI,QAAQ,KAAK,KAAK,GAAG,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAChD,OAAO,CAAC,qDAAqD;QAC9D,CAAC;QAED,UAAU,CAAC;YACV,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,OAAO;SACb,CAAC,CAAC;IACJ,CAAC,EACD,CAAC,KAAK,EAAE,IAAI,CAAC,CACb,CAAC;IAEF,OAAO,CACN,KAAC,QAAQ,kBACR,YAAY,EAAE,KAAK,EACnB,WAAW,EAAE,IAAI,EACjB,UAAU,EAAE,KAAK,EACjB,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EACzC,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,IAAI,CACd,qBAAqB,EACrB,KAAK,IAAI,WAAW,KAAK,EAAE,EAC3B,SAAS,CACT,IACG,IAAI,cAER,KAAC,WAAW,cAAE,QAAQ,GAAe,IAC3B,CACX,CAAC;AACH,CAAC;AASD,SAAS,mBAAmB,CAAC,KAA2B;IACvD,OAAO,CACN,MAAC,mBAAmB,oBAAK,KAAK,eAC7B,KAAC,4BAA4B,KAAG,EAChC,KAAC,YAAY,IAAC,SAAS,EAAC,sBAAsB,YAC5C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,IAAO,KAAK,CAAC,GAAG,CAAI,GAC3C,EACf,KAAC,YAAY,IACZ,SAAS,EAAC,wCAAwC,EAClD,WAAW,EAAE,CAAC,YAEb,CAAC,KAAK,EAAE,EAAE,CAAC,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,IAAO,KAAK,CAAC,GAAG,CAAI,GAC3C,KACM,CACtB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE;IACjE,IAAI,EAAE,mBAAmB;IACzB,WAAW;IACX,SAAS;IACT,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,YAAY;IACZ,aAAa,EAAE,4BAA4B;IAC3C,WAAW;IACX,UAAU;CACV,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/datePicker/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/datePicker/index.ts"],"names":[],"mappings":"AACA,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CalendarDay as BaseCalendarDay,
|
|
3
|
+
CalendarDays,
|
|
4
|
+
CalendarDaysProps,
|
|
5
|
+
} from 'calendar-blocks';
|
|
6
|
+
import { withClassName } from '../../hooks.js';
|
|
7
|
+
import { Button } from '../button/index.js';
|
|
8
|
+
|
|
9
|
+
export const MonthRow = withClassName(
|
|
10
|
+
'div',
|
|
11
|
+
'flex flex-row justify-between items-center w-full',
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
export const MonthLabel = withClassName(
|
|
15
|
+
'span',
|
|
16
|
+
'text-sm font-bold min-w-0 overflow-hidden text-center text-ellipsis',
|
|
17
|
+
'self-center',
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
export const MonthButton = withClassName(Button, 'self-center');
|
|
21
|
+
|
|
22
|
+
export const CalendarGridRoot = withClassName(
|
|
23
|
+
'div',
|
|
24
|
+
'grid grid-cols-[repeat(7,var(--day-size,32px))] [grid-auto-rows:var(--day-size,32px)]',
|
|
25
|
+
'height-[calc(var(--day-size,32px)*7)] rounded overflow-hidden p-2',
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
export const DayLabel = withClassName(
|
|
29
|
+
'div',
|
|
30
|
+
'flex items-center justify-center text-sm color-gray-dark',
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
export const DayLabels = () => (
|
|
34
|
+
<>
|
|
35
|
+
<DayLabel>S</DayLabel>
|
|
36
|
+
<DayLabel>M</DayLabel>
|
|
37
|
+
<DayLabel>T</DayLabel>
|
|
38
|
+
<DayLabel>W</DayLabel>
|
|
39
|
+
<DayLabel>T</DayLabel>
|
|
40
|
+
<DayLabel>F</DayLabel>
|
|
41
|
+
<DayLabel>S</DayLabel>
|
|
42
|
+
</>
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
export function CalendarGrid({
|
|
46
|
+
className,
|
|
47
|
+
...props
|
|
48
|
+
}: CalendarDaysProps & { className?: string }) {
|
|
49
|
+
return (
|
|
50
|
+
<CalendarGridRoot className={className}>
|
|
51
|
+
<DayLabels />
|
|
52
|
+
<CalendarDays {...props} />
|
|
53
|
+
</CalendarGridRoot>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const CalendarDay = withClassName(
|
|
58
|
+
BaseCalendarDay,
|
|
59
|
+
'border border-solid border-transparent bg-white mr--1px mb--1px relative color-black',
|
|
60
|
+
'flex items-center justify-center transition cursor-pointer',
|
|
61
|
+
'[&[data-highlighted]]:(z-1 ring-2 ring-accent)',
|
|
62
|
+
'hover:(z-1 ring-2 ring-accent)',
|
|
63
|
+
'active:(bg-main-light rounded)',
|
|
64
|
+
'[&[data-selected]]:(bg-main z-2 rounded)',
|
|
65
|
+
'[&[data-in-range]]:(bg-main-light rounded-none z-1)',
|
|
66
|
+
'[&[data-range-start]]:(bg-main rounded-l rounded-r-none z-1)',
|
|
67
|
+
'[&[data-range-end]]:(bg-main rounded-r rounded-l-none z-1)',
|
|
68
|
+
'[&[data-disabled=true]]:(opacity-50 cursor-not-allowed)',
|
|
69
|
+
// today dot
|
|
70
|
+
"[&[data-today]]:before:(content-[''] absolute left-[1px] top-[1px] w-[6px] h-[6px] rounded-lg bg-attention border-1 border-solid border-black)",
|
|
71
|
+
// calendar edges
|
|
72
|
+
'[&[data-top-edge]]:(border-t-gray)',
|
|
73
|
+
'[&[data-bottom-edge]]:(border-b-gray)',
|
|
74
|
+
'[&[data-first-column]]:(border-l-gray)',
|
|
75
|
+
'[&[data-last-column]]:(border-r-gray)',
|
|
76
|
+
'[&[data-day-first]]:(border-l-gray rounded-tl)',
|
|
77
|
+
'[&[data-day-last]]:(border-r-gray rounded-br)',
|
|
78
|
+
'[&[data-first-column][data-bottom-edge]]:rounded-bl',
|
|
79
|
+
'[&[data-last-column][data-bottom-edge]]:rounded-br',
|
|
80
|
+
'[&[data-first-column][data-top-edge]]:rounded-tl',
|
|
81
|
+
'[&[data-last-column][data-top-edge]]:rounded-tr',
|
|
82
|
+
'[&[data-different-month]]:[visibility:hidden]',
|
|
83
|
+
);
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { CalendarDayValue } from 'calendar-blocks';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { Spinner } from '../spinner/Spinner.js';
|
|
5
|
+
import { DatePicker } from './DatePicker.js';
|
|
6
|
+
import { DateRangePicker } from './DateRangePicker.js';
|
|
4
7
|
|
|
5
8
|
const meta = {
|
|
6
9
|
title: 'Components/DatePicker',
|
|
@@ -31,3 +34,36 @@ export const Range: Story = {
|
|
|
31
34
|
return <DateRangePicker value={value} onChange={setValue} />;
|
|
32
35
|
},
|
|
33
36
|
};
|
|
37
|
+
|
|
38
|
+
export const CustomComposition: Story = {
|
|
39
|
+
render() {
|
|
40
|
+
const [value, setValue] = useState<Date | null>(null);
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<DatePicker.Root value={value} onChange={setValue}>
|
|
44
|
+
<DatePicker.MonthControls />
|
|
45
|
+
<DatePicker.CalendarGrid>
|
|
46
|
+
{(value) => <FakeLoadingDay value={value} key={value.key} />}
|
|
47
|
+
</DatePicker.CalendarGrid>
|
|
48
|
+
</DatePicker.Root>
|
|
49
|
+
);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
function FakeLoadingDay({ value }: { value: CalendarDayValue }) {
|
|
54
|
+
const [loading, setLoading] = useState(true);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
const timeout = setTimeout(
|
|
57
|
+
() => setLoading(false),
|
|
58
|
+
Math.random() * 2000 + 500,
|
|
59
|
+
);
|
|
60
|
+
return () => clearTimeout(timeout);
|
|
61
|
+
}, []);
|
|
62
|
+
const [disabled] = useState(() => Math.random() < 0.3);
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<DatePicker.CalendarDay value={value} disabled={loading || disabled}>
|
|
66
|
+
{loading ? <Spinner size={10} /> : value.date.getDate()}
|
|
67
|
+
</DatePicker.CalendarDay>
|
|
68
|
+
);
|
|
69
|
+
}
|