@automattic/date-range-picker 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +80 -0
- package/dist/cjs/button-stack.js +9 -0
- package/dist/cjs/button-stack.js.map +1 -0
- package/dist/cjs/date-inputs.js +37 -0
- package/dist/cjs/date-inputs.js.map +1 -0
- package/dist/cjs/date-range-content.js +194 -0
- package/dist/cjs/date-range-content.js.map +1 -0
- package/dist/cjs/date-range-picker.js +48 -0
- package/dist/cjs/date-range-picker.js.map +1 -0
- package/dist/cjs/datetime.js +56 -0
- package/dist/cjs/datetime.js.map +1 -0
- package/dist/cjs/index.js +16 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/presets-listbox.js +18 -0
- package/dist/cjs/presets-listbox.js.map +1 -0
- package/dist/cjs/utils.js +137 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/button-stack.js +6 -0
- package/dist/esm/button-stack.js.map +1 -0
- package/dist/esm/date-inputs.js +34 -0
- package/dist/esm/date-inputs.js.map +1 -0
- package/dist/esm/date-range-content.js +191 -0
- package/dist/esm/date-range-content.js.map +1 -0
- package/dist/esm/date-range-picker.js +45 -0
- package/dist/esm/date-range-picker.js.map +1 -0
- package/dist/esm/datetime.js +50 -0
- package/dist/esm/datetime.js.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/presets-listbox.js +15 -0
- package/dist/esm/presets-listbox.js.map +1 -0
- package/dist/esm/utils.js +130 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/tsconfig-cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/button-stack.d.ts +8 -0
- package/dist/types/button-stack.d.ts.map +1 -0
- package/dist/types/date-inputs.d.ts +21 -0
- package/dist/types/date-inputs.d.ts.map +1 -0
- package/dist/types/date-range-content.d.ts +39 -0
- package/dist/types/date-range-content.d.ts.map +1 -0
- package/dist/types/date-range-picker.d.ts +25 -0
- package/dist/types/date-range-picker.d.ts.map +1 -0
- package/dist/types/datetime.d.ts +15 -0
- package/dist/types/datetime.d.ts.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/presets-listbox.d.ts +12 -0
- package/dist/types/presets-listbox.d.ts.map +1 -0
- package/dist/types/utils.d.ts +40 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/package.json +71 -0
- package/src/button-stack.tsx +17 -0
- package/src/date-inputs.tsx +142 -0
- package/src/date-range-content.tsx +379 -0
- package/src/date-range-picker.tsx +197 -0
- package/src/datetime.ts +58 -0
- package/src/index.ts +11 -0
- package/src/presets-listbox.tsx +65 -0
- package/src/style.scss +72 -0
- package/src/test/date-range-picker.test.tsx +334 -0
- package/src/test/utils.test.ts +58 -0
- package/src/types.d.ts +1 -0
- package/src/utils.ts +174 -0
package/README.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# @automattic/date-range-picker
|
|
2
|
+
|
|
3
|
+
A date-range picker built on top of `@automattic/ui`'s `DateRangeCalendar`. It
|
|
4
|
+
provides a popover-style trigger, keyboard-navigable preset shortcuts (last 7
|
|
5
|
+
days, month-to-date, etc.), accessible date inputs, and timezone-aware
|
|
6
|
+
site-day handling.
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
npm install @automattic/date-range-picker
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Consumers must also load the calendar styles from `@automattic/ui` and import
|
|
15
|
+
the picker's own stylesheet. The package ships SCSS source; compile it via
|
|
16
|
+
your own build pipeline (sass-loader, etc.):
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
import '@automattic/ui/style.css';
|
|
20
|
+
import '@automattic/date-range-picker/src/style.scss';
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The SCSS expects `$grid-unit-*`, `$radius-small`, and `$gray-600` from
|
|
24
|
+
`@wordpress/base-styles` to be in scope (either via a global `@import` or via
|
|
25
|
+
sass-loader's `additionalData`).
|
|
26
|
+
|
|
27
|
+
## Usage
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
import { DateRangePicker } from '@automattic/date-range-picker';
|
|
31
|
+
|
|
32
|
+
function Example() {
|
|
33
|
+
const [ range, setRange ] = useState( { start: new Date(), end: new Date() } );
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<DateRangePicker
|
|
37
|
+
start={ range.start }
|
|
38
|
+
end={ range.end }
|
|
39
|
+
onChange={ setRange }
|
|
40
|
+
locale="en-US"
|
|
41
|
+
timezoneString="America/New_York"
|
|
42
|
+
/>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Props
|
|
48
|
+
|
|
49
|
+
| Prop | Type | Default | Description |
|
|
50
|
+
| ----------------------- | ------------------------------------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
|
51
|
+
| `start` | `Date` | _required_ | Start of the selected range. |
|
|
52
|
+
| `end` | `Date` | _required_ | End of the selected range. |
|
|
53
|
+
| `onChange` | `( next: { start: Date; end: Date } ) => void` | _required_ | Called when the user applies a new range. |
|
|
54
|
+
| `locale` | `string` | _required_ | BCP 47 locale used to format the trigger label (e.g. `"en-US"`). |
|
|
55
|
+
| `timezoneString` | `string` | `undefined` | Optional IANA timezone for the calendar (e.g. `"America/New_York"`). |
|
|
56
|
+
| `gmtOffset` | `number` | `undefined` | Fallback offset in hours when `timezoneString` is not available. |
|
|
57
|
+
| `disableFuture` | `boolean` | `true` | Disable days after today. |
|
|
58
|
+
| `disabledBefore` | `Date` | `undefined` | Disable days before this date. |
|
|
59
|
+
| `defaultFallbackPreset` | `PresetId` | `'last-7-days'` | Preset applied when the user clicks Apply with no dates selected. |
|
|
60
|
+
| `hiddenPresets` | `PresetId[]` | `[]` | Presets to hide from the listbox. Use to scope down the default set per consumer. |
|
|
61
|
+
| `inputsProps` | `{ onStartFocus?, onEndFocus?, onStartBlur?, … }` | `undefined` | Focus/blur callbacks for the date inputs (analytics hooks, etc.). |
|
|
62
|
+
|
|
63
|
+
### Exports
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import {
|
|
67
|
+
DateRangePicker,
|
|
68
|
+
formatLabel,
|
|
69
|
+
presetDefs,
|
|
70
|
+
getActivePresetId,
|
|
71
|
+
computePresetRange,
|
|
72
|
+
type PresetId,
|
|
73
|
+
} from '@automattic/date-range-picker';
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Translations
|
|
77
|
+
|
|
78
|
+
The package uses `@wordpress/i18n` directly. Strings are extracted with the
|
|
79
|
+
default text domain; consumers can override the domain via their build
|
|
80
|
+
pipeline (e.g. Jetpack's `i18n-loader-webpack-plugin`).
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ButtonStack = ButtonStack;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const components_1 = require("@wordpress/components");
|
|
6
|
+
function ButtonStack({ children, ...hStackProps }) {
|
|
7
|
+
return ((0, jsx_runtime_1.jsx)(components_1.__experimentalHStack, { ...hStackProps, spacing: 3, children: children }));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=button-stack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-stack.js","sourceRoot":"","sources":["../../src/button-stack.tsx"],"names":[],"mappings":";;AAOA,kCASC;;AAhBD,sDAAuE;AAOvE,SAAgB,WAAW,CAAE,EAC5B,QAAQ,EACR,GAAG,WAAW,EACyD;IACvE,OAAO,CACN,uBAAC,iCAAM,OAAM,WAAW,EAAG,OAAO,EAAG,CAAC,YACnC,QAAQ,GACF,CACT,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DateInputs = DateInputs;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const components_1 = require("@wordpress/components");
|
|
6
|
+
const i18n_1 = require("@wordpress/i18n");
|
|
7
|
+
function DateInputs({ fromStr, toStr, onFromChange, onToChange, todayStr, minStr, fromStyle, toStyle, stack = false, justify = 'flex-start', containerStyle, onFromFocus, onToFocus, onFromBlur, onToBlur, }) {
|
|
8
|
+
if (stack) {
|
|
9
|
+
return ((0, jsx_runtime_1.jsxs)(components_1.__experimentalVStack, { as: "div", spacing: 2, className: "daterange-inputs", style: containerStyle, children: [(0, jsx_runtime_1.jsx)(components_1.__experimentalInputControl, { type: "date", label: (0, i18n_1.__)('Start date'), value: fromStr, onFocus: (e) => {
|
|
10
|
+
onFromFocus?.(e);
|
|
11
|
+
}, onBlur: (e) => {
|
|
12
|
+
onFromBlur?.(e);
|
|
13
|
+
}, onChange: (value) => {
|
|
14
|
+
onFromChange(value ?? '');
|
|
15
|
+
}, autoComplete: "off", min: minStr, max: toStr || todayStr, style: { width: '100%', ...(fromStyle || {}) }, __next40pxDefaultSize: true }), (0, jsx_runtime_1.jsx)(components_1.__experimentalInputControl, { type: "date", label: (0, i18n_1.__)('End date'), value: toStr, onFocus: (e) => {
|
|
16
|
+
onToFocus?.(e);
|
|
17
|
+
}, onBlur: (e) => {
|
|
18
|
+
onToBlur?.(e);
|
|
19
|
+
}, onChange: (value) => {
|
|
20
|
+
onToChange(value ?? '');
|
|
21
|
+
}, autoComplete: "off", min: fromStr || minStr, style: { width: '100%', ...(toStyle || {}) }, __next40pxDefaultSize: true })] }));
|
|
22
|
+
}
|
|
23
|
+
return ((0, jsx_runtime_1.jsxs)(components_1.__experimentalHStack, { as: "div", spacing: 8, justify: justify, className: "daterange-inputs", wrap: false, style: containerStyle, children: [(0, jsx_runtime_1.jsx)(components_1.__experimentalInputControl, { type: "date", label: (0, i18n_1.__)('Start date'), value: fromStr, onFocus: (e) => {
|
|
24
|
+
onFromFocus?.(e);
|
|
25
|
+
}, onBlur: (e) => {
|
|
26
|
+
onFromBlur?.(e);
|
|
27
|
+
}, onChange: (value) => {
|
|
28
|
+
onFromChange(value ?? '');
|
|
29
|
+
}, autoComplete: "off", min: minStr, max: toStr || todayStr, style: fromStyle, __next40pxDefaultSize: true }), (0, jsx_runtime_1.jsx)(components_1.__experimentalInputControl, { type: "date", label: (0, i18n_1.__)('End date'), value: toStr, onFocus: (e) => {
|
|
30
|
+
onToFocus?.(e);
|
|
31
|
+
}, onBlur: (e) => {
|
|
32
|
+
onToBlur?.(e);
|
|
33
|
+
}, onChange: (value) => {
|
|
34
|
+
onToChange(value ?? '');
|
|
35
|
+
}, autoComplete: "off", min: fromStr || minStr, style: toStyle, __next40pxDefaultSize: true })] }));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=date-inputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-inputs.js","sourceRoot":"","sources":["../../src/date-inputs.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DateRangeContent = DateRangeContent;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const ui_1 = require("@automattic/ui");
|
|
6
|
+
const components_1 = require("@wordpress/components");
|
|
7
|
+
const i18n_1 = require("@wordpress/i18n");
|
|
8
|
+
const date_fns_1 = require("date-fns");
|
|
9
|
+
const react_1 = require("react");
|
|
10
|
+
const button_stack_1 = require("./button-stack");
|
|
11
|
+
const date_inputs_1 = require("./date-inputs");
|
|
12
|
+
const datetime_1 = require("./datetime");
|
|
13
|
+
const presets_listbox_1 = require("./presets-listbox");
|
|
14
|
+
const utils_1 = require("./utils");
|
|
15
|
+
function DateRangeContent(props) {
|
|
16
|
+
const { isSmall, showTwoMonths = false, fromDraft, toDraft, fromStr, toStr, setFromDraft, setToDraft, setFromStr, setToStr, timezoneString, gmtOffset, onChange, onClose, compositeActiveId, setCompositeActiveId, today, todayStr, mobileLabelId, desktopLabelId, disableFuture = true, disabledBefore, defaultFallbackPreset = 'last-7-days', hiddenPresets, inputsProps, } = props;
|
|
17
|
+
// Avoid passing invalid or empty time zones to Intl consumers
|
|
18
|
+
const isValidIanaTimeZone = (timeZone) => {
|
|
19
|
+
if (!timeZone) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
// Will throw for invalid IANA identifiers (including empty strings)
|
|
24
|
+
Intl.DateTimeFormat('en-US', { timeZone: timeZone });
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
catch (_e) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const timeZoneForCalendar = isValidIanaTimeZone(timezoneString) ? timezoneString : undefined;
|
|
32
|
+
const [isTyping, setIsTyping] = (0, react_1.useState)(false);
|
|
33
|
+
const [inputsVersion, setInputsVersion] = (0, react_1.useState)(0);
|
|
34
|
+
const clear = () => {
|
|
35
|
+
setFromDraft(undefined);
|
|
36
|
+
setToDraft(undefined);
|
|
37
|
+
setFromStr('');
|
|
38
|
+
setToStr('');
|
|
39
|
+
setIsTyping(false);
|
|
40
|
+
// Force controlled inputs to remount so any internal buffers are reset
|
|
41
|
+
setInputsVersion((version) => version + 1);
|
|
42
|
+
};
|
|
43
|
+
const canDefaultApply = !fromDraft && !toDraft && !fromStr && !toStr && !isTyping;
|
|
44
|
+
const defaultPresetLabel = utils_1.presetDefs.find((p) => p.id === defaultFallbackPreset)?.label || (0, i18n_1.__)('default range');
|
|
45
|
+
const apply = () => {
|
|
46
|
+
if (fromDraft && toDraft) {
|
|
47
|
+
const [startPoint, endPoint] = fromDraft <= toDraft ? [fromDraft, toDraft] : [toDraft, fromDraft];
|
|
48
|
+
onChange({ start: startPoint, end: endPoint });
|
|
49
|
+
onClose?.();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (canDefaultApply) {
|
|
53
|
+
const range = (0, utils_1.computePresetRange)(defaultFallbackPreset, today);
|
|
54
|
+
if (range) {
|
|
55
|
+
onChange({ start: range.from, end: range.to });
|
|
56
|
+
onClose?.();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const setPreset = (id) => {
|
|
61
|
+
const range = (0, utils_1.computePresetRange)(id, today);
|
|
62
|
+
if (!range) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
setFromDraft(range.from);
|
|
66
|
+
setToDraft(range.to);
|
|
67
|
+
setFromStr((0, datetime_1.formatYmd)(range.from, timezoneString, gmtOffset));
|
|
68
|
+
setToStr((0, datetime_1.formatYmd)(range.to, timezoneString, gmtOffset));
|
|
69
|
+
onChange({ start: range.from, end: range.to });
|
|
70
|
+
onClose?.();
|
|
71
|
+
};
|
|
72
|
+
const activePresetId = (() => {
|
|
73
|
+
const preset = (0, utils_1.getActivePresetId)(fromDraft, toDraft, today);
|
|
74
|
+
if (preset) {
|
|
75
|
+
return preset;
|
|
76
|
+
}
|
|
77
|
+
// Only mark "custom" when both dates are present and do not match a known preset
|
|
78
|
+
if (fromDraft && toDraft) {
|
|
79
|
+
return 'custom';
|
|
80
|
+
}
|
|
81
|
+
// When cleared or incomplete, highlight nothing
|
|
82
|
+
return undefined;
|
|
83
|
+
})();
|
|
84
|
+
// Site “today” as a site-day Date
|
|
85
|
+
const siteToday = (0, datetime_1.parseYmdLocal)((0, datetime_1.formatYmd)(today, timezoneString, gmtOffset)) ??
|
|
86
|
+
new Date(today.getFullYear(), today.getMonth(), today.getDate());
|
|
87
|
+
// Month anchors in site time
|
|
88
|
+
const siteMonthStart = (0, date_fns_1.startOfMonth)(siteToday);
|
|
89
|
+
const prevMonthStart = (0, date_fns_1.subMonths)(siteMonthStart, 1);
|
|
90
|
+
// Build calendar month refs
|
|
91
|
+
const makeTZMonthFromDate = (d) => timeZoneForCalendar
|
|
92
|
+
? new ui_1.TZDate(Date.UTC(d.getFullYear(), d.getMonth(), 1, 12), timeZoneForCalendar)
|
|
93
|
+
: new Date(d.getFullYear(), d.getMonth(), 1);
|
|
94
|
+
const defaultMonth = showTwoMonths
|
|
95
|
+
? makeTZMonthFromDate(prevMonthStart)
|
|
96
|
+
: makeTZMonthFromDate(siteMonthStart);
|
|
97
|
+
const endMonth = makeTZMonthFromDate(siteMonthStart);
|
|
98
|
+
// Use TZDate for calendar selection when a valid IANA time zone is available
|
|
99
|
+
const selected = timeZoneForCalendar && (fromDraft || toDraft)
|
|
100
|
+
? {
|
|
101
|
+
from: fromDraft ? new ui_1.TZDate(+fromDraft, timeZoneForCalendar) : undefined,
|
|
102
|
+
to: toDraft ? new ui_1.TZDate(+toDraft, timeZoneForCalendar) : undefined,
|
|
103
|
+
}
|
|
104
|
+
: { from: fromDraft ?? undefined, to: toDraft ?? undefined };
|
|
105
|
+
const disabledMatcher = (() => {
|
|
106
|
+
const matchers = [];
|
|
107
|
+
if (disableFuture) {
|
|
108
|
+
matchers.push({ after: today });
|
|
109
|
+
}
|
|
110
|
+
if (disabledBefore) {
|
|
111
|
+
matchers.push({ before: disabledBefore });
|
|
112
|
+
}
|
|
113
|
+
if (matchers.length === 0) {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
return matchers.length === 1 ? matchers[0] : matchers;
|
|
117
|
+
})();
|
|
118
|
+
const minInputStr = disabledBefore ? (0, datetime_1.formatSiteYmd)(disabledBefore) : undefined;
|
|
119
|
+
return ((0, jsx_runtime_1.jsxs)(components_1.__experimentalVStack, { as: "div", spacing: 3, style: { padding: 12 }, children: [(0, jsx_runtime_1.jsx)(components_1.__experimentalText, { as: "div", weight: 600, align: "center", size: "smallTitle", children: (0, i18n_1.__)('Date Range') }), isSmall ? ((0, jsx_runtime_1.jsxs)(components_1.__experimentalVStack, { as: "div", spacing: 2, children: [(0, jsx_runtime_1.jsx)(presets_listbox_1.PresetsListbox, { labelId: mobileLabelId, activePresetId: activePresetId, onSelect: setPreset, compositeActiveId: compositeActiveId, setCompositeActiveId: setCompositeActiveId, hiddenPresets: hiddenPresets }), (0, jsx_runtime_1.jsx)(date_inputs_1.DateInputs, { fromStr: fromStr, toStr: toStr, onFromChange: (value) => {
|
|
120
|
+
setFromStr(value);
|
|
121
|
+
const parsed = value ? (0, datetime_1.parseYmdLocal)(value) || undefined : undefined;
|
|
122
|
+
setFromDraft(parsed);
|
|
123
|
+
setIsTyping(Boolean(value || toStr));
|
|
124
|
+
}, onToChange: (value) => {
|
|
125
|
+
setToStr(value);
|
|
126
|
+
const parsed = value ? (0, datetime_1.parseYmdLocal)(value) || undefined : undefined;
|
|
127
|
+
setToDraft(parsed);
|
|
128
|
+
setIsTyping(Boolean(fromStr || value));
|
|
129
|
+
}, todayStr: todayStr, minStr: minInputStr, onFromFocus: (e) => {
|
|
130
|
+
setIsTyping(true);
|
|
131
|
+
inputsProps?.onStartFocus?.(e);
|
|
132
|
+
}, onToFocus: (e) => {
|
|
133
|
+
setIsTyping(true);
|
|
134
|
+
inputsProps?.onEndFocus?.(e);
|
|
135
|
+
}, onFromBlur: (e) => {
|
|
136
|
+
if (!fromStr && !toStr) {
|
|
137
|
+
setIsTyping(false);
|
|
138
|
+
}
|
|
139
|
+
inputsProps?.onStartBlur?.(e);
|
|
140
|
+
}, onToBlur: (e) => {
|
|
141
|
+
if (!fromStr && !toStr) {
|
|
142
|
+
setIsTyping(false);
|
|
143
|
+
}
|
|
144
|
+
inputsProps?.onEndBlur?.(e);
|
|
145
|
+
}, stack: true, fromStyle: { minWidth: 140 }, toStyle: { minWidth: 140 } }, `inputs-${inputsVersion}-mobile`)] })) : ((0, jsx_runtime_1.jsx)(components_1.__experimentalHStack, { as: "div", spacing: 4, justify: "flex-end", className: "daterange-inputs", wrap: false, style: { width: '100%' }, children: (0, jsx_runtime_1.jsx)(date_inputs_1.DateInputs, { fromStr: fromStr, toStr: toStr, onFromChange: (value) => {
|
|
146
|
+
setFromStr(value);
|
|
147
|
+
const parsed = value ? (0, datetime_1.parseYmdLocal)(value) || undefined : undefined;
|
|
148
|
+
setFromDraft(parsed);
|
|
149
|
+
setIsTyping(Boolean(value || toStr));
|
|
150
|
+
}, onToChange: (value) => {
|
|
151
|
+
setToStr(value);
|
|
152
|
+
const parsed = value ? (0, datetime_1.parseYmdLocal)(value) || undefined : undefined;
|
|
153
|
+
setToDraft(parsed);
|
|
154
|
+
setIsTyping(Boolean(fromStr || value));
|
|
155
|
+
}, todayStr: todayStr, minStr: minInputStr, onFromFocus: (e) => {
|
|
156
|
+
setIsTyping(true);
|
|
157
|
+
inputsProps?.onStartFocus?.(e);
|
|
158
|
+
}, onToFocus: (e) => {
|
|
159
|
+
setIsTyping(true);
|
|
160
|
+
inputsProps?.onEndFocus?.(e);
|
|
161
|
+
}, onFromBlur: (e) => {
|
|
162
|
+
if (!fromStr && !toStr) {
|
|
163
|
+
setIsTyping(false);
|
|
164
|
+
}
|
|
165
|
+
inputsProps?.onStartBlur?.(e);
|
|
166
|
+
}, onToBlur: (e) => {
|
|
167
|
+
if (!fromStr && !toStr) {
|
|
168
|
+
setIsTyping(false);
|
|
169
|
+
}
|
|
170
|
+
inputsProps?.onEndBlur?.(e);
|
|
171
|
+
}, fromStyle: { minWidth: 220, flex: '0 0 auto' }, toStyle: { minWidth: 220, flex: '0 0 auto' }, justify: "flex-end", containerStyle: { width: '100%' } }, `inputs-${inputsVersion}-desktop`) })), (0, jsx_runtime_1.jsxs)(components_1.__experimentalHStack, { as: "div", spacing: 4, justify: "flex-start", className: "daterange-body", wrap: false, children: [!isSmall && ((0, jsx_runtime_1.jsx)(presets_listbox_1.PresetsListbox, { labelId: desktopLabelId, activePresetId: activePresetId, onSelect: setPreset, compositeActiveId: compositeActiveId, setCompositeActiveId: setCompositeActiveId, hiddenPresets: hiddenPresets })), (0, jsx_runtime_1.jsx)("div", { className: "daterange-calendar", children: (0, jsx_runtime_1.jsx)(ui_1.DateRangeCalendar, { timeZone: timeZoneForCalendar, numberOfMonths: isSmall ? 1 : 2, defaultMonth: defaultMonth, endMonth: endMonth, disabled: disabledMatcher, excludeDisabled: true, selected: selected, onSelect: (range) => {
|
|
172
|
+
const toNative = (d) => (d ? new Date(d.getTime()) : undefined);
|
|
173
|
+
if (range?.from) {
|
|
174
|
+
const from = toNative(range.from);
|
|
175
|
+
setFromDraft(from);
|
|
176
|
+
if (from) {
|
|
177
|
+
setFromStr((0, datetime_1.formatYmd)(from, timezoneString, gmtOffset));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (range?.to) {
|
|
181
|
+
const to = toNative(range.to);
|
|
182
|
+
setToDraft(to);
|
|
183
|
+
if (to) {
|
|
184
|
+
setToStr((0, datetime_1.formatYmd)(to, timezoneString, gmtOffset));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
setIsTyping(false);
|
|
188
|
+
} }) })] }), (0, jsx_runtime_1.jsxs)(button_stack_1.ButtonStack, { as: "div", justify: "flex-end", children: [(0, jsx_runtime_1.jsx)(components_1.Button, { variant: "secondary", onClick: clear, children: (0, i18n_1.__)('Clear') }), (0, jsx_runtime_1.jsx)(components_1.Button, { variant: "primary", onClick: apply, disabled: (!fromDraft || !toDraft) && !canDefaultApply, "aria-label":
|
|
189
|
+
/* translators: %s is the preset label, e.g. 'Last 30 days' */
|
|
190
|
+
canDefaultApply ? (0, i18n_1.sprintf)((0, i18n_1.__)('Apply %s'), defaultPresetLabel) : (0, i18n_1.__)('Apply'), children:
|
|
191
|
+
/* translators: %s is the preset label, e.g. 'Last 30 days' */
|
|
192
|
+
canDefaultApply ? (0, i18n_1.sprintf)((0, i18n_1.__)('Apply %s'), defaultPresetLabel) : (0, i18n_1.__)('Apply') })] })] }));
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=date-range-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-range-content.js","sourceRoot":"","sources":["../../src/date-range-content.tsx"],"names":[],"mappings":";;AAiDA,4CAyUC;;AA1XD,uCAA2D;AAC3D,sDAK+B;AAC/B,0CAA8C;AAC9C,uCAAmD;AACnD,iCAAiC;AACjC,iDAA6C;AAC7C,+CAA2C;AAC3C,yCAAqE;AACrE,uDAAmD;AACnD,mCAAsF;AAmCtF,SAAgB,gBAAgB,CAAE,KAA4B;IAC7D,MAAM,EACL,OAAO,EACP,aAAa,GAAG,KAAK,EACrB,SAAS,EACT,OAAO,EACP,OAAO,EACP,KAAK,EACL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,QAAQ,EACR,cAAc,EACd,SAAS,EACT,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,EACL,QAAQ,EACR,aAAa,EACb,cAAc,EACd,aAAa,GAAG,IAAI,EACpB,cAAc,EACd,qBAAqB,GAAG,aAAa,EACrC,aAAa,EACb,WAAW,GACX,GAAG,KAAK,CAAC;IAEV,8DAA8D;IAC9D,MAAM,mBAAmB,GAAG,CAAE,QAAiB,EAAuB,EAAE;QACvE,IAAK,CAAE,QAAQ,EAAG,CAAC;YAClB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,CAAC;YACJ,oEAAoE;YACpE,IAAI,CAAC,cAAc,CAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAE,CAAC;YACvD,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,OAAQ,EAAE,EAAG,CAAC;YACf,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,mBAAmB,CAAE,cAAc,CAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/F,MAAM,CAAE,QAAQ,EAAE,WAAW,CAAE,GAAG,IAAA,gBAAQ,EAAE,KAAK,CAAE,CAAC;IACpD,MAAM,CAAE,aAAa,EAAE,gBAAgB,CAAE,GAAG,IAAA,gBAAQ,EAAE,CAAC,CAAE,CAAC;IAE1D,MAAM,KAAK,GAAG,GAAG,EAAE;QAClB,YAAY,CAAE,SAAS,CAAE,CAAC;QAC1B,UAAU,CAAE,SAAS,CAAE,CAAC;QACxB,UAAU,CAAE,EAAE,CAAE,CAAC;QACjB,QAAQ,CAAE,EAAE,CAAE,CAAC;QACf,WAAW,CAAE,KAAK,CAAE,CAAC;QACrB,uEAAuE;QACvE,gBAAgB,CAAE,CAAE,OAAO,EAAG,EAAE,CAAC,OAAO,GAAG,CAAC,CAAE,CAAC;IAChD,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAE,SAAS,IAAI,CAAE,OAAO,IAAI,CAAE,OAAO,IAAI,CAAE,KAAK,IAAI,CAAE,QAAQ,CAAC;IACvF,MAAM,kBAAkB,GACvB,kBAAU,CAAC,IAAI,CAAE,CAAE,CAAC,EAAG,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,qBAAqB,CAAE,EAAE,KAAK,IAAI,IAAA,SAAE,EAAE,eAAe,CAAE,CAAC;IAE5F,MAAM,KAAK,GAAG,GAAG,EAAE;QAClB,IAAK,SAAS,IAAI,OAAO,EAAG,CAAC;YAC5B,MAAM,CAAE,UAAU,EAAE,QAAQ,CAAE,GAC7B,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,CAAE,SAAS,EAAE,OAAO,CAAE,CAAC,CAAC,CAAC,CAAE,OAAO,EAAE,SAAS,CAAE,CAAC;YACxE,QAAQ,CAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAE,CAAC;YACjD,OAAO,EAAE,EAAE,CAAC;YACZ,OAAO;QACR,CAAC;QACD,IAAK,eAAe,EAAG,CAAC;YACvB,MAAM,KAAK,GAAG,IAAA,0BAAkB,EAAE,qBAAqB,EAAE,KAAK,CAAE,CAAC;YACjE,IAAK,KAAK,EAAG,CAAC;gBACb,QAAQ,CAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAE,CAAC;gBACjD,OAAO,EAAE,EAAE,CAAC;YACb,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAE,EAAY,EAAG,EAAE;QACpC,MAAM,KAAK,GAAG,IAAA,0BAAkB,EAAE,EAAE,EAAE,KAAK,CAAE,CAAC;QAC9C,IAAK,CAAE,KAAK,EAAG,CAAC;YACf,OAAO;QACR,CAAC;QACD,YAAY,CAAE,KAAK,CAAC,IAAI,CAAE,CAAC;QAC3B,UAAU,CAAE,KAAK,CAAC,EAAE,CAAE,CAAC;QACvB,UAAU,CAAE,IAAA,oBAAS,EAAE,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,CAAE,CAAE,CAAC;QACjE,QAAQ,CAAE,IAAA,oBAAS,EAAE,KAAK,CAAC,EAAE,EAAE,cAAc,EAAE,SAAS,CAAE,CAAE,CAAC;QAC7D,QAAQ,CAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAE,CAAC;QACjD,OAAO,EAAE,EAAE,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,cAAc,GAAyB,CAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,IAAA,yBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAE,CAAC;QAC9D,IAAK,MAAM,EAAG,CAAC;YACd,OAAO,MAAM,CAAC;QACf,CAAC;QACD,iFAAiF;QACjF,IAAK,SAAS,IAAI,OAAO,EAAG,CAAC;YAC5B,OAAO,QAAQ,CAAC;QACjB,CAAC;QACD,gDAAgD;QAChD,OAAO,SAAS,CAAC;IAClB,CAAC,CAAE,EAAE,CAAC;IAEN,kCAAkC;IAClC,MAAM,SAAS,GACd,IAAA,wBAAa,EAAE,IAAA,oBAAS,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,CAAE,CAAE;QAC9D,IAAI,IAAI,CAAE,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,CAAE,CAAC;IAEpE,6BAA6B;IAC7B,MAAM,cAAc,GAAG,IAAA,uBAAY,EAAE,SAAS,CAAE,CAAC;IACjD,MAAM,cAAc,GAAG,IAAA,oBAAS,EAAE,cAAc,EAAE,CAAC,CAAE,CAAC;IAEtD,4BAA4B;IAC5B,MAAM,mBAAmB,GAAG,CAAE,CAAO,EAAG,EAAE,CACzC,mBAAmB;QAClB,CAAC,CAAC,IAAI,WAAM,CAAE,IAAI,CAAC,GAAG,CAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAE,EAAE,mBAAmB,CAAE;QACrF,CAAC,CAAC,IAAI,IAAI,CAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAE,CAAC;IAEjD,MAAM,YAAY,GAAG,aAAa;QACjC,CAAC,CAAC,mBAAmB,CAAE,cAAc,CAAE;QACvC,CAAC,CAAC,mBAAmB,CAAE,cAAc,CAAE,CAAC;IAEzC,MAAM,QAAQ,GAAG,mBAAmB,CAAE,cAAc,CAAE,CAAC;IAEvD,6EAA6E;IAC7E,MAAM,QAAQ,GACb,mBAAmB,IAAI,CAAE,SAAS,IAAI,OAAO,CAAE;QAC9C,CAAC,CAAC;YACA,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,WAAM,CAAE,CAAC,SAAS,EAAE,mBAAmB,CAAE,CAAC,CAAC,CAAC,SAAS;YAC3E,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,WAAM,CAAE,CAAC,OAAO,EAAE,mBAAmB,CAAE,CAAC,CAAC,CAAC,SAAS;SACpE;QACH,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,IAAI,SAAS,EAAE,EAAE,EAAE,OAAO,IAAI,SAAS,EAAE,CAAC;IAE/D,MAAM,eAAe,GAAG,CAAE,GAAG,EAAE;QAC9B,MAAM,QAAQ,GAAgD,EAAE,CAAC;QACjE,IAAK,aAAa,EAAG,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAE,CAAC;QACnC,CAAC;QACD,IAAK,cAAc,EAAG,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAE,CAAC;QAC7C,CAAC;QACD,IAAK,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAG,CAAC;YAC7B,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAE,CAAC,CAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzD,CAAC,CAAE,EAAE,CAAC;IAEN,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,IAAA,wBAAa,EAAE,cAAc,CAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAEjF,OAAO,CACN,wBAAC,iCAAM,IAAC,EAAE,EAAC,KAAK,EAAC,OAAO,EAAG,CAAC,EAAG,KAAK,EAAG,EAAE,OAAO,EAAE,EAAE,EAAE,aACrD,uBAAC,+BAAI,IAAC,EAAE,EAAC,KAAK,EAAC,MAAM,EAAG,GAAG,EAAG,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,YAAY,YAC3D,IAAA,SAAE,EAAE,YAAY,CAAE,GACd,EAEL,OAAO,CAAC,CAAC,CAAC,CACX,wBAAC,iCAAM,IAAC,EAAE,EAAC,KAAK,EAAC,OAAO,EAAG,CAAC,aAC3B,uBAAC,gCAAc,IACd,OAAO,EAAG,aAAa,EACvB,cAAc,EAAG,cAAc,EAC/B,QAAQ,EAAG,SAAS,EACpB,iBAAiB,EAAG,iBAAiB,EACrC,oBAAoB,EAAG,oBAAoB,EAC3C,aAAa,EAAG,aAAa,GAC5B,EAEF,uBAAC,wBAAU,IAEV,OAAO,EAAG,OAAO,EACjB,KAAK,EAAG,KAAK,EACb,YAAY,EAAG,CAAE,KAAK,EAAG,EAAE;4BAC1B,UAAU,CAAE,KAAK,CAAE,CAAC;4BACpB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAA,wBAAa,EAAE,KAAK,CAAE,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;4BACvE,YAAY,CAAE,MAAM,CAAE,CAAC;4BACvB,WAAW,CAAE,OAAO,CAAE,KAAK,IAAI,KAAK,CAAE,CAAE,CAAC;wBAC1C,CAAC,EACD,UAAU,EAAG,CAAE,KAAK,EAAG,EAAE;4BACxB,QAAQ,CAAE,KAAK,CAAE,CAAC;4BAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAA,wBAAa,EAAE,KAAK,CAAE,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;4BACvE,UAAU,CAAE,MAAM,CAAE,CAAC;4BACrB,WAAW,CAAE,OAAO,CAAE,OAAO,IAAI,KAAK,CAAE,CAAE,CAAC;wBAC5C,CAAC,EACD,QAAQ,EAAG,QAAQ,EACnB,MAAM,EAAG,WAAW,EACpB,WAAW,EAAG,CAAE,CAAC,EAAG,EAAE;4BACrB,WAAW,CAAE,IAAI,CAAE,CAAC;4BACpB,WAAW,EAAE,YAAY,EAAE,CAAE,CAAC,CAAE,CAAC;wBAClC,CAAC,EACD,SAAS,EAAG,CAAE,CAAC,EAAG,EAAE;4BACnB,WAAW,CAAE,IAAI,CAAE,CAAC;4BACpB,WAAW,EAAE,UAAU,EAAE,CAAE,CAAC,CAAE,CAAC;wBAChC,CAAC,EACD,UAAU,EAAG,CAAE,CAAC,EAAG,EAAE;4BACpB,IAAK,CAAE,OAAO,IAAI,CAAE,KAAK,EAAG,CAAC;gCAC5B,WAAW,CAAE,KAAK,CAAE,CAAC;4BACtB,CAAC;4BACD,WAAW,EAAE,WAAW,EAAE,CAAE,CAAC,CAAE,CAAC;wBACjC,CAAC,EACD,QAAQ,EAAG,CAAE,CAAC,EAAG,EAAE;4BAClB,IAAK,CAAE,OAAO,IAAI,CAAE,KAAK,EAAG,CAAC;gCAC5B,WAAW,CAAE,KAAK,CAAE,CAAC;4BACtB,CAAC;4BACD,WAAW,EAAE,SAAS,EAAE,CAAE,CAAC,CAAE,CAAC;wBAC/B,CAAC,EACD,KAAK,QACL,SAAS,EAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,EAC7B,OAAO,EAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAvCrB,UAAW,aAAc,SAAS,CAwCvC,IACM,CACT,CAAC,CAAC,CAAC,CACH,uBAAC,iCAAM,IACN,EAAE,EAAC,KAAK,EACR,OAAO,EAAG,CAAC,EACX,OAAO,EAAC,UAAU,EAClB,SAAS,EAAC,kBAAkB,EAC5B,IAAI,EAAG,KAAK,EACZ,KAAK,EAAG,EAAE,KAAK,EAAE,MAAM,EAAE,YAEzB,uBAAC,wBAAU,IAEV,OAAO,EAAG,OAAO,EACjB,KAAK,EAAG,KAAK,EACb,YAAY,EAAG,CAAE,KAAK,EAAG,EAAE;wBAC1B,UAAU,CAAE,KAAK,CAAE,CAAC;wBACpB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAA,wBAAa,EAAE,KAAK,CAAE,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;wBACvE,YAAY,CAAE,MAAM,CAAE,CAAC;wBACvB,WAAW,CAAE,OAAO,CAAE,KAAK,IAAI,KAAK,CAAE,CAAE,CAAC;oBAC1C,CAAC,EACD,UAAU,EAAG,CAAE,KAAK,EAAG,EAAE;wBACxB,QAAQ,CAAE,KAAK,CAAE,CAAC;wBAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAA,wBAAa,EAAE,KAAK,CAAE,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;wBACvE,UAAU,CAAE,MAAM,CAAE,CAAC;wBACrB,WAAW,CAAE,OAAO,CAAE,OAAO,IAAI,KAAK,CAAE,CAAE,CAAC;oBAC5C,CAAC,EACD,QAAQ,EAAG,QAAQ,EACnB,MAAM,EAAG,WAAW,EACpB,WAAW,EAAG,CAAE,CAAC,EAAG,EAAE;wBACrB,WAAW,CAAE,IAAI,CAAE,CAAC;wBACpB,WAAW,EAAE,YAAY,EAAE,CAAE,CAAC,CAAE,CAAC;oBAClC,CAAC,EACD,SAAS,EAAG,CAAE,CAAC,EAAG,EAAE;wBACnB,WAAW,CAAE,IAAI,CAAE,CAAC;wBACpB,WAAW,EAAE,UAAU,EAAE,CAAE,CAAC,CAAE,CAAC;oBAChC,CAAC,EACD,UAAU,EAAG,CAAE,CAAC,EAAG,EAAE;wBACpB,IAAK,CAAE,OAAO,IAAI,CAAE,KAAK,EAAG,CAAC;4BAC5B,WAAW,CAAE,KAAK,CAAE,CAAC;wBACtB,CAAC;wBACD,WAAW,EAAE,WAAW,EAAE,CAAE,CAAC,CAAE,CAAC;oBACjC,CAAC,EACD,QAAQ,EAAG,CAAE,CAAC,EAAG,EAAE;wBAClB,IAAK,CAAE,OAAO,IAAI,CAAE,KAAK,EAAG,CAAC;4BAC5B,WAAW,CAAE,KAAK,CAAE,CAAC;wBACtB,CAAC;wBACD,WAAW,EAAE,SAAS,EAAE,CAAE,CAAC,CAAE,CAAC;oBAC/B,CAAC,EACD,SAAS,EAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAC/C,OAAO,EAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAC7C,OAAO,EAAC,UAAU,EAClB,cAAc,EAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAxC5B,UAAW,aAAc,UAAU,CAyCxC,GACM,CACT,EAED,wBAAC,iCAAM,IAAC,EAAE,EAAC,KAAK,EAAC,OAAO,EAAG,CAAC,EAAG,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,gBAAgB,EAAC,IAAI,EAAG,KAAK,aACxF,CAAE,OAAO,IAAI,CACd,uBAAC,gCAAc,IACd,OAAO,EAAG,cAAc,EACxB,cAAc,EAAG,cAAc,EAC/B,QAAQ,EAAG,SAAS,EACpB,iBAAiB,EAAG,iBAAiB,EACrC,oBAAoB,EAAG,oBAAoB,EAC3C,aAAa,EAAG,aAAa,GAC5B,CACF,EAED,gCAAK,SAAS,EAAC,oBAAoB,YAClC,uBAAC,sBAAiB,IACjB,QAAQ,EAAG,mBAAmB,EAC9B,cAAc,EAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAChC,YAAY,EAAG,YAAY,EAC3B,QAAQ,EAAG,QAAQ,EACnB,QAAQ,EAAG,eAAe,EAC1B,eAAe,QACf,QAAQ,EAAG,QAAQ,EACnB,QAAQ,EAAG,CAAE,KAAK,EAAG,EAAE;gCACtB,MAAM,QAAQ,GAAG,CAAE,CAAQ,EAAG,EAAE,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAE,CAAC,CAAC,OAAO,EAAE,CAAE,CAAC,CAAC,CAAC,SAAS,CAAE,CAAC;gCAC7E,IAAK,KAAK,EAAE,IAAI,EAAG,CAAC;oCACnB,MAAM,IAAI,GAAG,QAAQ,CAAE,KAAK,CAAC,IAAI,CAAE,CAAC;oCACpC,YAAY,CAAE,IAAI,CAAE,CAAC;oCACrB,IAAK,IAAI,EAAG,CAAC;wCACZ,UAAU,CAAE,IAAA,oBAAS,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,CAAE,CAAE,CAAC;oCAC5D,CAAC;gCACF,CAAC;gCACD,IAAK,KAAK,EAAE,EAAE,EAAG,CAAC;oCACjB,MAAM,EAAE,GAAG,QAAQ,CAAE,KAAK,CAAC,EAAE,CAAE,CAAC;oCAChC,UAAU,CAAE,EAAE,CAAE,CAAC;oCACjB,IAAK,EAAE,EAAG,CAAC;wCACV,QAAQ,CAAE,IAAA,oBAAS,EAAE,EAAE,EAAE,cAAc,EAAE,SAAS,CAAE,CAAE,CAAC;oCACxD,CAAC;gCACF,CAAC;gCACD,WAAW,CAAE,KAAK,CAAE,CAAC;4BACtB,CAAC,GACA,GACG,IACE,EAET,wBAAC,0BAAW,IAAC,EAAE,EAAC,KAAK,EAAC,OAAO,EAAC,UAAU,aACvC,uBAAC,mBAAM,IAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAG,KAAK,YACxC,IAAA,SAAE,EAAE,OAAO,CAAE,GACP,EACT,uBAAC,mBAAM,IACN,OAAO,EAAC,SAAS,EACjB,OAAO,EAAG,KAAK,EACf,QAAQ,EAAG,CAAE,CAAE,SAAS,IAAI,CAAE,OAAO,CAAE,IAAI,CAAE,eAAe;wBAE3D,8DAA8D;wBAC9D,eAAe,CAAC,CAAC,CAAC,IAAA,cAAO,EAAE,IAAA,SAAE,EAAE,UAAU,CAAE,EAAE,kBAAkB,CAAE,CAAC,CAAC,CAAC,IAAA,SAAE,EAAE,OAAO,CAAE;wBAIjF,8DAA8D;wBAC9D,eAAe,CAAC,CAAC,CAAC,IAAA,cAAO,EAAE,IAAA,SAAE,EAAE,UAAU,CAAE,EAAE,kBAAkB,CAAE,CAAC,CAAC,CAAC,IAAA,SAAE,EAAE,OAAO,CAAE,GAE1E,IACI,IACN,CACT,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DateRangePicker = DateRangePicker;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const components_1 = require("@wordpress/components");
|
|
6
|
+
const compose_1 = require("@wordpress/compose");
|
|
7
|
+
const i18n_1 = require("@wordpress/i18n");
|
|
8
|
+
const icons_1 = require("@wordpress/icons");
|
|
9
|
+
const react_1 = require("react");
|
|
10
|
+
const date_range_content_1 = require("./date-range-content");
|
|
11
|
+
const datetime_1 = require("./datetime");
|
|
12
|
+
const utils_1 = require("./utils");
|
|
13
|
+
require("./style.scss");
|
|
14
|
+
function DateRangePicker({ start, end, onChange, gmtOffset, timezoneString, locale, disableFuture = true, disabledBefore, defaultFallbackPreset = 'last-7-days', hiddenPresets, inputsProps, }) {
|
|
15
|
+
const isSmall = (0, compose_1.useMediaQuery)('(max-width: 600px)');
|
|
16
|
+
// Use a wider breakpoint to decide when two calendars can fit comfortably
|
|
17
|
+
const showTwoMonths = (0, compose_1.useMediaQuery)('(min-width: 900px)');
|
|
18
|
+
const instanceId = (0, compose_1.useInstanceId)(DateRangePicker, 'daterange');
|
|
19
|
+
const mobileLabelId = `presets-label-${instanceId}-mobile`;
|
|
20
|
+
const desktopLabelId = `presets-label-${instanceId}-desktop`;
|
|
21
|
+
const label = (0, utils_1.formatLabel)(start, end, locale);
|
|
22
|
+
// Reset internal draft state when key inputs change by remounting the inner component
|
|
23
|
+
const resetKey = [
|
|
24
|
+
(0, datetime_1.formatSiteYmd)(start),
|
|
25
|
+
(0, datetime_1.formatSiteYmd)(end),
|
|
26
|
+
timezoneString ?? '',
|
|
27
|
+
gmtOffset ?? '',
|
|
28
|
+
].join('|');
|
|
29
|
+
return ((0, jsx_runtime_1.jsx)(components_1.Dropdown, { popoverProps: { className: 'daterange-popover' }, renderToggle: ({ onToggle, isOpen }) => ((0, jsx_runtime_1.jsx)(components_1.Tooltip, { text: (0, i18n_1.__)('Select a date range'), placement: "top", children: (0, jsx_runtime_1.jsx)("div", { className: "daterange-input__toggle", children: (0, jsx_runtime_1.jsx)(components_1.Button, { type: "button", variant: "tertiary", onClick: onToggle, "aria-haspopup": "dialog", "aria-expanded": isOpen, "aria-label": (0, i18n_1.sprintf)(
|
|
30
|
+
/* Translators: %s: date range label */
|
|
31
|
+
(0, i18n_1.__)('Date range: %s. Activate to open calendar.'), label), className: "daterange-input__field", icon: icons_1.calendar, iconPosition: "right", children: (0, jsx_runtime_1.jsx)("span", { "aria-hidden": "true", className: "daterange-input__text", children: label }) }) }) })), renderContent: ({ onClose }) => ((0, jsx_runtime_1.jsx)(DateRangePickerInner, { isSmall: isSmall, showTwoMonths: showTwoMonths, start: start, end: end, timezoneString: timezoneString, gmtOffset: gmtOffset, onChange: onChange, onClose: onClose, mobileLabelId: mobileLabelId, desktopLabelId: desktopLabelId, disableFuture: disableFuture, disabledBefore: disabledBefore, defaultFallbackPreset: defaultFallbackPreset, hiddenPresets: hiddenPresets, inputsProps: inputsProps }, resetKey)) }));
|
|
32
|
+
}
|
|
33
|
+
function DateRangePickerInner({ isSmall, showTwoMonths, start, end, timezoneString, gmtOffset, onChange, onClose, mobileLabelId, desktopLabelId, disableFuture, disabledBefore, defaultFallbackPreset, hiddenPresets, inputsProps, }) {
|
|
34
|
+
const [fromDraft, setFromDraft] = (0, react_1.useState)(() => start);
|
|
35
|
+
const [toDraft, setToDraft] = (0, react_1.useState)(() => end);
|
|
36
|
+
const [fromStr, setFromStr] = (0, react_1.useState)(() => (0, datetime_1.formatSiteYmd)(start));
|
|
37
|
+
const [toStr, setToStr] = (0, react_1.useState)(() => (0, datetime_1.formatSiteYmd)(end));
|
|
38
|
+
// Tracks the keyboard-focused preset in the listbox (roving focus), not the selected preset.
|
|
39
|
+
const [compositeActiveId, setCompositeActiveId] = (0, react_1.useState)(null);
|
|
40
|
+
const today = (0, react_1.useMemo)(() => {
|
|
41
|
+
const parsed = (0, datetime_1.parseYmdLocal)((0, datetime_1.formatYmd)(new Date(), timezoneString, gmtOffset));
|
|
42
|
+
// Fallback to local midnight if parsing ever fails
|
|
43
|
+
return (parsed ?? new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate()));
|
|
44
|
+
}, [timezoneString, gmtOffset]);
|
|
45
|
+
const todayStr = (0, react_1.useMemo)(() => (0, datetime_1.formatSiteYmd)(today), [today]);
|
|
46
|
+
return ((0, jsx_runtime_1.jsx)(date_range_content_1.DateRangeContent, { isSmall: isSmall, fromDraft: fromDraft, toDraft: toDraft, fromStr: fromStr, toStr: toStr, setFromDraft: setFromDraft, setToDraft: setToDraft, setFromStr: setFromStr, setToStr: setToStr, timezoneString: timezoneString, gmtOffset: gmtOffset, onChange: onChange, onClose: onClose, compositeActiveId: compositeActiveId, setCompositeActiveId: setCompositeActiveId, today: today, todayStr: todayStr, mobileLabelId: mobileLabelId, desktopLabelId: desktopLabelId, disableFuture: disableFuture, disabledBefore: disabledBefore, showTwoMonths: showTwoMonths, defaultFallbackPreset: defaultFallbackPreset, hiddenPresets: hiddenPresets, inputsProps: inputsProps }));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=date-range-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-range-picker.js","sourceRoot":"","sources":["../../src/date-range-picker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatDate = formatDate;
|
|
4
|
+
exports.parseYmdLocal = parseYmdLocal;
|
|
5
|
+
exports.formatYmd = formatYmd;
|
|
6
|
+
exports.formatSiteYmd = formatSiteYmd;
|
|
7
|
+
const date_1 = require("@wordpress/date");
|
|
8
|
+
const date_fns_1 = require("date-fns");
|
|
9
|
+
const YMD_REGEX = /^\d{4}-\d{2}-\d{2}$/;
|
|
10
|
+
function formatDate(date, locale, formatOptions = { dateStyle: 'medium' }) {
|
|
11
|
+
if (isNaN(date.getTime())) {
|
|
12
|
+
return '';
|
|
13
|
+
}
|
|
14
|
+
return new Intl.DateTimeFormat(locale, formatOptions).format(date);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parse a date string in the format "YYYY-MM-DD" (local time).
|
|
18
|
+
*/
|
|
19
|
+
function parseYmdLocal(value) {
|
|
20
|
+
if (!YMD_REGEX.test(value)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const parsed = (0, date_fns_1.parse)(value, 'yyyy-MM-dd', new Date());
|
|
24
|
+
if (!(0, date_fns_1.isValid)(parsed)) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
// Ensure strict match (reject overflows like 2023-02-31 -> 2023-03-03)
|
|
28
|
+
return (0, date_fns_1.format)(parsed, 'yyyy-MM-dd') === value ? parsed : null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Format a date as a site calendar day (YYYY-MM-DD).
|
|
32
|
+
*/
|
|
33
|
+
function formatYmd(date, timezoneString, gmtOffset) {
|
|
34
|
+
if (timezoneString) {
|
|
35
|
+
return (0, date_1.dateI18n)('Y-m-d', date, timezoneString);
|
|
36
|
+
}
|
|
37
|
+
if (typeof gmtOffset === 'number') {
|
|
38
|
+
const shifted = new Date(date.getTime() + gmtOffset * 60 * 60 * 1000);
|
|
39
|
+
const year = shifted.getUTCFullYear();
|
|
40
|
+
const month = String(shifted.getUTCMonth() + 1).padStart(2, '0');
|
|
41
|
+
const day = String(shifted.getUTCDate()).padStart(2, '0');
|
|
42
|
+
return `${year}-${month}-${day}`;
|
|
43
|
+
}
|
|
44
|
+
return (0, date_1.dateI18n)('Y-m-d', date);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Format a Date that already represents a site calendar day.
|
|
48
|
+
* This avoids reapplying timezone math to dates coming from the picker or URL.
|
|
49
|
+
*/
|
|
50
|
+
function formatSiteYmd(date) {
|
|
51
|
+
const year = date.getFullYear();
|
|
52
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
53
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
54
|
+
return `${year}-${month}-${day}`;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=datetime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datetime.js","sourceRoot":"","sources":["../../src/datetime.ts"],"names":[],"mappings":";;AAKA,gCASC;AAKD,sCAUC;AAKD,8BAYC;AAMD,sCAKC;AAzDD,0CAA2C;AAC3C,uCAAkD;AAElD,MAAM,SAAS,GAAG,qBAAqB,CAAC;AAExC,SAAgB,UAAU,CACzB,IAAU,EACV,MAAc,EACd,gBAA4C,EAAE,SAAS,EAAE,QAAQ,EAAE;IAEnE,IAAK,KAAK,CAAE,IAAI,CAAC,OAAO,EAAE,CAAE,EAAG,CAAC;QAC/B,OAAO,EAAE,CAAC;IACX,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,cAAc,CAAE,MAAM,EAAE,aAAa,CAAE,CAAC,MAAM,CAAE,IAAI,CAAE,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAE,KAAa;IAC3C,IAAK,CAAE,SAAS,CAAC,IAAI,CAAE,KAAK,CAAE,EAAG,CAAC;QACjC,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,MAAM,GAAG,IAAA,gBAAK,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAE,CAAC;IACxD,IAAK,CAAE,IAAA,kBAAO,EAAE,MAAM,CAAE,EAAG,CAAC;QAC3B,OAAO,IAAI,CAAC;IACb,CAAC;IACD,uEAAuE;IACvE,OAAO,IAAA,iBAAM,EAAE,MAAM,EAAE,YAAY,CAAE,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAE,IAAU,EAAE,cAAuB,EAAE,SAAkB;IACjF,IAAK,cAAc,EAAG,CAAC;QACtB,OAAO,IAAA,eAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,CAAE,CAAC;IAClD,CAAC;IACD,IAAK,OAAO,SAAS,KAAK,QAAQ,EAAG,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAE,IAAI,CAAC,OAAO,EAAE,GAAG,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAE,CAAC;QACxE,MAAM,IAAI,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAE,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAE,CAAC,QAAQ,CAAE,CAAC,EAAE,GAAG,CAAE,CAAC;QACrE,MAAM,GAAG,GAAG,MAAM,CAAE,OAAO,CAAC,UAAU,EAAE,CAAE,CAAC,QAAQ,CAAE,CAAC,EAAE,GAAG,CAAE,CAAC;QAC9D,OAAO,GAAI,IAAK,IAAK,KAAM,IAAK,GAAI,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,IAAA,eAAQ,EAAE,OAAO,EAAE,IAAI,CAAE,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAAE,IAAU;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAE,CAAC,QAAQ,CAAE,CAAC,EAAE,GAAG,CAAE,CAAC;IAC/D,MAAM,GAAG,GAAG,MAAM,CAAE,IAAI,CAAC,OAAO,EAAE,CAAE,CAAC,QAAQ,CAAE,CAAC,EAAE,GAAG,CAAE,CAAC;IACxD,OAAO,GAAI,IAAK,IAAK,KAAM,IAAK,GAAI,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseYmdLocal = exports.formatSiteYmd = exports.formatYmd = exports.presetDefs = exports.isLast7Days = exports.getActivePresetId = exports.formatLabel = exports.computePresetRange = exports.DateRangePicker = void 0;
|
|
4
|
+
var date_range_picker_1 = require("./date-range-picker");
|
|
5
|
+
Object.defineProperty(exports, "DateRangePicker", { enumerable: true, get: function () { return date_range_picker_1.DateRangePicker; } });
|
|
6
|
+
var utils_1 = require("./utils");
|
|
7
|
+
Object.defineProperty(exports, "computePresetRange", { enumerable: true, get: function () { return utils_1.computePresetRange; } });
|
|
8
|
+
Object.defineProperty(exports, "formatLabel", { enumerable: true, get: function () { return utils_1.formatLabel; } });
|
|
9
|
+
Object.defineProperty(exports, "getActivePresetId", { enumerable: true, get: function () { return utils_1.getActivePresetId; } });
|
|
10
|
+
Object.defineProperty(exports, "isLast7Days", { enumerable: true, get: function () { return utils_1.isLast7Days; } });
|
|
11
|
+
Object.defineProperty(exports, "presetDefs", { enumerable: true, get: function () { return utils_1.presetDefs; } });
|
|
12
|
+
var datetime_1 = require("./datetime");
|
|
13
|
+
Object.defineProperty(exports, "formatYmd", { enumerable: true, get: function () { return datetime_1.formatYmd; } });
|
|
14
|
+
Object.defineProperty(exports, "formatSiteYmd", { enumerable: true, get: function () { return datetime_1.formatSiteYmd; } });
|
|
15
|
+
Object.defineProperty(exports, "parseYmdLocal", { enumerable: true, get: function () { return datetime_1.parseYmdLocal; } });
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yDAAsD;AAA7C,oHAAA,eAAe,OAAA;AAExB,iCAMiB;AALhB,2GAAA,kBAAkB,OAAA;AAClB,oGAAA,WAAW,OAAA;AACX,0GAAA,iBAAiB,OAAA;AACjB,oGAAA,WAAW,OAAA;AACX,mGAAA,UAAU,OAAA;AAGX,uCAAqE;AAA5D,qGAAA,SAAS,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,yGAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PresetsListbox = PresetsListbox;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const components_1 = require("@wordpress/components");
|
|
6
|
+
const i18n_1 = require("@wordpress/i18n");
|
|
7
|
+
const utils_1 = require("./utils");
|
|
8
|
+
function PresetsListbox({ labelId, activePresetId, onSelect, compositeActiveId, setCompositeActiveId, hiddenPresets, }) {
|
|
9
|
+
const items = [
|
|
10
|
+
...utils_1.presetDefs,
|
|
11
|
+
{ id: 'custom', label: (0, i18n_1.__)('Custom') },
|
|
12
|
+
].filter((item) => !hiddenPresets?.includes(item.id));
|
|
13
|
+
return ((0, jsx_runtime_1.jsxs)(components_1.__experimentalVStack, { justify: "flex-start", alignment: "stretch", spacing: 1, className: "daterange-presets", children: [(0, jsx_runtime_1.jsx)(components_1.VisuallyHidden, { id: labelId, children: (0, i18n_1.__)('Date range presets') }), (0, jsx_runtime_1.jsx)(components_1.Composite, { "aria-labelledby": labelId, activeId: compositeActiveId ?? undefined, setActiveId: (id) => setCompositeActiveId(id ?? null), focusLoop: true, virtualFocus: true, role: "listbox", children: (0, jsx_runtime_1.jsx)(components_1.__experimentalVStack, { justify: "flex-start", alignment: "stretch", spacing: 1, children: items.map((preset) => {
|
|
14
|
+
const isSelected = activePresetId === preset.id;
|
|
15
|
+
return ((0, jsx_runtime_1.jsx)(components_1.Composite.Item, { id: preset.id, render: (0, jsx_runtime_1.jsx)(components_1.Button, { size: "compact", variant: isSelected ? 'primary' : undefined }), onClick: () => onSelect(preset.id), role: "option", "aria-selected": isSelected || undefined, className: "preset-listbox__item", children: preset.label }, preset.id));
|
|
16
|
+
}) }) })] }));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=presets-listbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets-listbox.js","sourceRoot":"","sources":["../../src/presets-listbox.tsx"],"names":[],"mappings":";;AAmBA,wCA6CC;;AAhED,sDAK+B;AAC/B,0CAAqC;AACrC,mCAAqC;AAYrC,SAAgB,cAAc,CAAE,EAC/B,OAAO,EACP,cAAc,EACd,QAAQ,EACR,iBAAiB,EACjB,oBAAoB,EACpB,aAAa,GACQ;IACrB,MAAM,KAAK,GAAqD;QAC/D,GAAG,kBAAU;QACb,EAAE,EAAE,EAAE,QAAiB,EAAE,KAAK,EAAE,IAAA,SAAE,EAAE,QAAQ,CAAE,EAAE;KAChD,CAAC,MAAM,CAAE,CAAE,IAAI,EAAG,EAAE,CAAC,CAAE,aAAa,EAAE,QAAQ,CAAE,IAAI,CAAC,EAAE,CAAE,CAAE,CAAC;IAE7D,OAAO,CACN,wBAAC,iCAAM,IAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,EAAC,OAAO,EAAG,CAAC,EAAG,SAAS,EAAC,mBAAmB,aAC3F,uBAAC,2BAAc,IAAC,EAAE,EAAG,OAAO,YAAK,IAAA,SAAE,EAAE,oBAAoB,CAAE,GAAmB,EAC9E,uBAAC,sBAAS,uBACS,OAAO,EACzB,QAAQ,EAAG,iBAAiB,IAAI,SAAS,EACzC,WAAW,EAAG,CAAE,EAAE,EAAG,EAAE,CAAC,oBAAoB,CAAE,EAAE,IAAI,IAAI,CAAE,EAC1D,SAAS,QACT,YAAY,QACZ,IAAI,EAAC,SAAS,YAEd,uBAAC,iCAAM,IAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,EAAC,OAAO,EAAG,CAAC,YACzD,KAAK,CAAC,GAAG,CAAE,CAAE,MAAM,EAAG,EAAE;wBACzB,MAAM,UAAU,GAAG,cAAc,KAAK,MAAM,CAAC,EAAE,CAAC;wBAChD,OAAO,CACN,uBAAC,sBAAS,CAAC,IAAI,IAEd,EAAE,EAAG,MAAM,CAAC,EAAE,EACd,MAAM,EAAG,uBAAC,mBAAM,IAAC,IAAI,EAAC,SAAS,EAAC,OAAO,EAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAK,EACjF,OAAO,EAAG,GAAG,EAAE,CAAC,QAAQ,CAAE,MAAM,CAAC,EAAE,CAAE,EACrC,IAAI,EAAC,QAAQ,mBACG,UAAU,IAAI,SAAS,EACvC,SAAS,EAAC,sBAAsB,YAE9B,MAAM,CAAC,KAAK,IARR,MAAM,CAAC,EAAE,CASC,CACjB,CAAC;oBACH,CAAC,CAAE,GACK,GACE,IACJ,CACT,CAAC;AACH,CAAC"}
|