@openrails/contentkit-ui 0.103.0 → 0.103.1
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 +6 -4
- package/dist/components/content/release-date-picker.d.ts +4 -4
- package/dist/components/content/release-date-picker.js +106 -48
- package/dist/components/content/release-date-picker.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/locales/discovery/de.js +1 -2
- package/dist/locales/discovery/de.js.map +1 -1
- package/dist/locales/discovery/en.d.ts +1 -2
- package/dist/locales/discovery/en.js +1 -2
- package/dist/locales/discovery/en.js.map +1 -1
- package/dist/locales/discovery/es.js +1 -2
- package/dist/locales/discovery/es.js.map +1 -1
- package/dist/locales/discovery/ja.js +1 -2
- package/dist/locales/discovery/ja.js.map +1 -1
- package/dist/locales/discovery/ko.js +1 -2
- package/dist/locales/discovery/ko.js.map +1 -1
- package/dist/locales/discovery/zh.js +1 -2
- package/dist/locales/discovery/zh.js.map +1 -1
- package/dist/locales/en.d.ts +1 -2
- package/dist/styles.css +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -367,13 +367,15 @@ the listing's time zone. The same bounded window ends on that date; it does
|
|
|
367
367
|
not load intervening years. Omit it for the latest releases, or combine it
|
|
368
368
|
with `days: 1` for one exact day. Future and invalid dates return HTTP 400.
|
|
369
369
|
Current visibility and access rules still apply to historical windows.
|
|
370
|
-
`ReleaseDatePicker`
|
|
371
|
-
|
|
372
|
-
|
|
370
|
+
`ReleaseDatePicker` opens a themed calendar popover with month/year dropdowns,
|
|
371
|
+
so older dates need no month-by-month paging. It selects one day, disables
|
|
372
|
+
future dates, and closes after selection; there is no typed input or reset
|
|
373
|
+
button. Keep its controlled value in your router for shared URLs and
|
|
374
|
+
back/forward navigation. The app chooses placement and the listing window:
|
|
373
375
|
|
|
374
376
|
```tsx
|
|
375
377
|
<ReleaseDatePicker value={date} onValueChange={setDate} />
|
|
376
|
-
<DailyReleases query={{ kind: "gallery", days: 10, end_date: date || undefined }} />
|
|
378
|
+
<DailyReleases query={{ kind: "gallery", days: date ? 1 : 10, end_date: date || undefined }} />
|
|
377
379
|
```
|
|
378
380
|
|
|
379
381
|
`isReleaseDate(date)` validates URL input before rendering the feed; the picker
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { ContentKitUiAppearance } from '../../appearance.js';
|
|
2
2
|
/** Today's YYYY-MM-DD in the browser's local calendar, without a UTC shift. */
|
|
3
3
|
export declare function localReleaseDate(now?: Date): string;
|
|
4
|
-
/** A real calendar date on or before max; empty
|
|
4
|
+
/** A real calendar date on or before max; empty leaves the feed's default date. */
|
|
5
5
|
export declare function isReleaseDate(value: string, max?: string): boolean;
|
|
6
6
|
export interface ReleaseDatePickerProps {
|
|
7
|
-
/**
|
|
7
|
+
/** Selected YYYY-MM-DD; empty leaves the feed's default date. */
|
|
8
8
|
value?: string;
|
|
9
9
|
onValueChange: (value: string) => void;
|
|
10
|
-
/** YYYY-MM-DD in the listing's calendar.
|
|
10
|
+
/** Latest selectable YYYY-MM-DD in the listing's calendar. Local today by default. */
|
|
11
11
|
max?: string;
|
|
12
12
|
className?: string;
|
|
13
13
|
appearance?: ContentKitUiAppearance;
|
|
14
14
|
}
|
|
15
|
-
/**
|
|
15
|
+
/** A single-day calendar popover with month/year navigation and no typed input. */
|
|
16
16
|
export declare function ReleaseDatePicker({ value, onValueChange, max, className, appearance }: ReleaseDatePickerProps): import('react').JSX.Element;
|
|
@@ -1,65 +1,123 @@
|
|
|
1
1
|
import { useMessages as e } from "../../i18n/context.js";
|
|
2
|
-
import { ContentKitUiRoot as t } from "../../scope.js";
|
|
3
|
-
import { Button as
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
2
|
+
import { ContentKitUiRoot as t, useScopeProps as n } from "../../scope.js";
|
|
3
|
+
import { Button as r } from "../../ui/button.js";
|
|
4
|
+
import { useId as i, useState as a } from "react";
|
|
5
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
6
|
+
import { cn as c } from "cn";
|
|
7
|
+
import { Calendar01Icon as l } from "@hugeicons/core-free-icons";
|
|
8
|
+
import { HugeiconsIcon as u } from "@hugeicons/react";
|
|
9
|
+
import { Popover as d } from "@base-ui/react/popover";
|
|
10
|
+
import { DayPicker as f } from "react-day-picker";
|
|
11
|
+
import { de as p, enUS as m, es as h, ja as g, ko as _, zhCN as v } from "react-day-picker/locale";
|
|
8
12
|
//#region src/components/content/release-date-picker.tsx
|
|
9
|
-
function
|
|
13
|
+
function y(e = /* @__PURE__ */ new Date()) {
|
|
10
14
|
return `${String(e.getFullYear()).padStart(4, "0")}-${String(e.getMonth() + 1).padStart(2, "0")}-${String(e.getDate()).padStart(2, "0")}`;
|
|
11
15
|
}
|
|
12
|
-
function
|
|
16
|
+
function b(e, t = y()) {
|
|
13
17
|
if (!e) return !0;
|
|
14
18
|
if (!/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/.test(e) || e.startsWith("0000") || e > t) return !1;
|
|
15
19
|
let n = /* @__PURE__ */ new Date(`${e}T12:00:00Z`);
|
|
16
20
|
return Number.isFinite(n.getTime()) && n.toISOString().slice(0, 10) === e;
|
|
17
21
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
value: _ ? u : "",
|
|
38
|
-
className: "h-11 w-auto min-w-40 text-base",
|
|
39
|
-
"aria-invalid": !_ || void 0,
|
|
40
|
-
"aria-describedby": _ ? void 0 : `${h}-error`,
|
|
41
|
-
onChange: (e) => {
|
|
42
|
-
let t = e.currentTarget.value;
|
|
43
|
-
l(t, f) && d(t);
|
|
44
|
-
}
|
|
45
|
-
}),
|
|
46
|
-
/* @__PURE__ */ a(n, {
|
|
22
|
+
var x = (e) => /* @__PURE__ */ new Date(`${e}T12:00:00`), S = {
|
|
23
|
+
de: p,
|
|
24
|
+
en: m,
|
|
25
|
+
es: h,
|
|
26
|
+
ja: g,
|
|
27
|
+
ko: _,
|
|
28
|
+
zh: v
|
|
29
|
+
}, C = "absolute top-0 flex size-10 items-center justify-center rounded-md border-0 bg-transparent text-inherit hover:bg-muted focus-visible:outline-2 focus-visible:outline-ring aria-disabled:pointer-events-none aria-disabled:opacity-40";
|
|
30
|
+
function w({ value: p = "", onValueChange: h, max: g = y(), className: _, appearance: v }) {
|
|
31
|
+
let w = i(), [T, E] = a(!1), { t: D, language: O = "en" } = e(), k = n(v), A = g && b(g, "9999-12-31") ? g : y(), j = b(p, A), M = p && j ? x(p) : void 0, N = S[O.split("-")[0]] ?? m, P = M ? new Intl.DateTimeFormat(O, { dateStyle: "medium" }).format(M) : D("releases.goToDay");
|
|
32
|
+
return /* @__PURE__ */ s(d.Root, {
|
|
33
|
+
open: T,
|
|
34
|
+
onOpenChange: E,
|
|
35
|
+
children: [/* @__PURE__ */ s(t, {
|
|
36
|
+
appearance: v,
|
|
37
|
+
className: c("inline-flex flex-col items-end gap-2", _),
|
|
38
|
+
"data-ckui": "release-date-picker",
|
|
39
|
+
children: [/* @__PURE__ */ s(d.Trigger, {
|
|
40
|
+
render: /* @__PURE__ */ o(r, {
|
|
47
41
|
type: "button",
|
|
48
42
|
variant: "outline",
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
43
|
+
className: "h-11 gap-2 text-base"
|
|
44
|
+
}),
|
|
45
|
+
"aria-label": D("releases.goToDay"),
|
|
46
|
+
"aria-invalid": !j || void 0,
|
|
47
|
+
"aria-describedby": j ? void 0 : `${w}-error`,
|
|
48
|
+
children: [/* @__PURE__ */ o(u, {
|
|
49
|
+
icon: l,
|
|
50
|
+
className: "size-5",
|
|
51
|
+
"aria-hidden": "true"
|
|
52
|
+
}), /* @__PURE__ */ o("span", {
|
|
53
|
+
className: "hidden sm:inline",
|
|
54
|
+
children: P
|
|
55
|
+
})]
|
|
56
|
+
}), !j && /* @__PURE__ */ o("p", {
|
|
57
|
+
id: `${w}-error`,
|
|
58
|
+
role: "alert",
|
|
59
|
+
className: "text-sm text-destructive",
|
|
60
|
+
children: D("releases.invalidDate")
|
|
61
|
+
})]
|
|
62
|
+
}), /* @__PURE__ */ o(d.Portal, { children: /* @__PURE__ */ o(d.Positioner, {
|
|
63
|
+
...k,
|
|
64
|
+
className: c(k.className, "z-50"),
|
|
65
|
+
align: "end",
|
|
66
|
+
sideOffset: 8,
|
|
67
|
+
collisionPadding: 8,
|
|
68
|
+
children: /* @__PURE__ */ o(d.Popup, {
|
|
69
|
+
initialFocus: !1,
|
|
70
|
+
"aria-label": D("releases.goToDay"),
|
|
71
|
+
className: "rounded-xl border border-border bg-background p-3 text-foreground shadow-lg outline-none",
|
|
72
|
+
children: /* @__PURE__ */ o(t, {
|
|
73
|
+
appearance: v,
|
|
74
|
+
"data-ckui": "release-date-calendar",
|
|
75
|
+
children: /* @__PURE__ */ o(f, {
|
|
76
|
+
mode: "single",
|
|
77
|
+
required: !0,
|
|
78
|
+
selected: M,
|
|
79
|
+
defaultMonth: M ?? x(A),
|
|
80
|
+
startMonth: x("0001-01-01"),
|
|
81
|
+
endMonth: x(A),
|
|
82
|
+
disabled: { after: x(A) },
|
|
83
|
+
locale: N,
|
|
84
|
+
captionLayout: "dropdown",
|
|
85
|
+
navLayout: "around",
|
|
86
|
+
reverseYears: !0,
|
|
87
|
+
autoFocus: !0,
|
|
88
|
+
showOutsideDays: !0,
|
|
89
|
+
onSelect: (e) => {
|
|
90
|
+
let t = y(e);
|
|
91
|
+
b(t, A) && (h(t), E(!1));
|
|
92
|
+
},
|
|
93
|
+
classNames: {
|
|
94
|
+
root: "w-fit",
|
|
95
|
+
month: "relative space-y-3",
|
|
96
|
+
month_caption: "flex h-10 items-center justify-center px-10",
|
|
97
|
+
dropdowns: "flex items-center gap-2 text-sm font-medium",
|
|
98
|
+
dropdown_root: "relative rounded-md focus-within:outline-2 focus-within:outline-ring",
|
|
99
|
+
dropdown: "absolute inset-0 size-full cursor-pointer bg-popover text-popover-foreground opacity-0",
|
|
100
|
+
caption_label: "flex items-center gap-1 whitespace-nowrap",
|
|
101
|
+
button_previous: c(C, "start-0"),
|
|
102
|
+
button_next: c(C, "end-0"),
|
|
103
|
+
chevron: "size-4 fill-current",
|
|
104
|
+
month_grid: "w-full border-collapse",
|
|
105
|
+
weekday: "size-10 text-xs font-normal text-muted-foreground",
|
|
106
|
+
day: "size-10 p-0 text-center",
|
|
107
|
+
day_button: "size-10 rounded-md border-0 bg-transparent font-normal text-inherit outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none",
|
|
108
|
+
selected: "[&>button]:bg-primary [&>button]:text-primary-foreground [&>button:hover]:bg-primary",
|
|
109
|
+
today: "[&>button]:font-bold",
|
|
110
|
+
outside: "text-muted-foreground",
|
|
111
|
+
disabled: "opacity-40",
|
|
112
|
+
hidden: "invisible"
|
|
113
|
+
}
|
|
114
|
+
}, p || A)
|
|
52
115
|
})
|
|
53
|
-
|
|
54
|
-
})
|
|
55
|
-
id: `${h}-error`,
|
|
56
|
-
role: "alert",
|
|
57
|
-
className: "text-sm text-destructive",
|
|
58
|
-
children: g("releases.invalidDate")
|
|
59
|
-
})]
|
|
116
|
+
})
|
|
117
|
+
}) })]
|
|
60
118
|
});
|
|
61
119
|
}
|
|
62
120
|
//#endregion
|
|
63
|
-
export {
|
|
121
|
+
export { w as ReleaseDatePicker, b as isReleaseDate, y as localReleaseDate };
|
|
64
122
|
|
|
65
123
|
//# sourceMappingURL=release-date-picker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release-date-picker.js","names":[],"sources":["../../../src/components/content/release-date-picker.tsx"],"sourcesContent":["import { useId } from \"react\";\nimport {
|
|
1
|
+
{"version":3,"file":"release-date-picker.js","names":[],"sources":["../../../src/components/content/release-date-picker.tsx"],"sourcesContent":["import { Popover } from \"@base-ui/react/popover\";\nimport { Calendar01Icon } from \"@hugeicons/core-free-icons\";\nimport { HugeiconsIcon } from \"@hugeicons/react\";\nimport { useId, useState } from \"react\";\nimport { DayPicker } from \"react-day-picker\";\nimport { de, enUS, es, ja, ko, zhCN } from \"react-day-picker/locale\";\nimport { cn } from \"cn\";\nimport { Button } from \"#ckui/ui/button\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport type { ContentKitUiAppearance } from \"../../appearance.js\";\nimport { ContentKitUiRoot, useScopeProps } from \"../../scope.js\";\n\n/** Today's YYYY-MM-DD in the browser's local calendar, without a UTC shift. */\nexport function localReleaseDate(now = new Date()): string {\n return `${String(now.getFullYear()).padStart(4, \"0\")}-${String(now.getMonth() + 1).padStart(2, \"0\")}-${String(now.getDate()).padStart(2, \"0\")}`;\n}\n\n/** A real calendar date on or before max; empty leaves the feed's default date. */\nexport function isReleaseDate(value: string, max = localReleaseDate()): boolean {\n if (!value) return true;\n if (!/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/.test(value) || value.startsWith(\"0000\") || value > max) return false;\n const at = new Date(`${value}T12:00:00Z`);\n return Number.isFinite(at.getTime()) && at.toISOString().slice(0, 10) === value;\n}\n\nconst calendarDate = (value: string) => new Date(`${value}T12:00:00`);\nconst locales = { de, en: enUS, es, ja, ko, zh: zhCN };\nconst navigationButton = \"absolute top-0 flex size-10 items-center justify-center rounded-md border-0 bg-transparent text-inherit hover:bg-muted focus-visible:outline-2 focus-visible:outline-ring aria-disabled:pointer-events-none aria-disabled:opacity-40\";\n\nexport interface ReleaseDatePickerProps {\n /** Selected YYYY-MM-DD; empty leaves the feed's default date. */\n value?: string;\n onValueChange: (value: string) => void;\n /** Latest selectable YYYY-MM-DD in the listing's calendar. Local today by default. */\n max?: string;\n className?: string;\n appearance?: ContentKitUiAppearance;\n}\n\n/** A single-day calendar popover with month/year navigation and no typed input. */\nexport function ReleaseDatePicker({ value = \"\", onValueChange, max = localReleaseDate(), className, appearance }: ReleaseDatePickerProps) {\n const id = useId();\n const [open, setOpen] = useState(false);\n const { t, language = \"en\" } = useMessages();\n const scope = useScopeProps(appearance);\n const limit = max && isReleaseDate(max, \"9999-12-31\") ? max : localReleaseDate();\n const valid = isReleaseDate(value, limit);\n const selected = value && valid ? calendarDate(value) : undefined;\n const locale = locales[language.split(\"-\")[0] as keyof typeof locales] ?? enUS;\n const label = selected ? new Intl.DateTimeFormat(language, { dateStyle: \"medium\" }).format(selected) : t(\"releases.goToDay\");\n return <Popover.Root open={open} onOpenChange={setOpen}>\n <ContentKitUiRoot appearance={appearance} className={cn(\"inline-flex flex-col items-end gap-2\", className)} data-ckui=\"release-date-picker\">\n <Popover.Trigger render={<Button type=\"button\" variant=\"outline\" className=\"h-11 gap-2 text-base\" />} aria-label={t(\"releases.goToDay\")} aria-invalid={!valid || undefined} aria-describedby={!valid ? `${id}-error` : undefined}>\n <HugeiconsIcon icon={Calendar01Icon} className=\"size-5\" aria-hidden=\"true\" />\n <span className=\"hidden sm:inline\">{label}</span>\n </Popover.Trigger>\n {!valid && <p id={`${id}-error`} role=\"alert\" className=\"text-sm text-destructive\">{t(\"releases.invalidDate\")}</p>}\n </ContentKitUiRoot>\n <Popover.Portal>\n <Popover.Positioner {...scope} className={cn(scope.className, \"z-50\")} align=\"end\" sideOffset={8} collisionPadding={8}>\n <Popover.Popup initialFocus={false} aria-label={t(\"releases.goToDay\")} className=\"rounded-xl border border-border bg-background p-3 text-foreground shadow-lg outline-none\">\n <ContentKitUiRoot appearance={appearance} data-ckui=\"release-date-calendar\">\n <DayPicker key={value || limit} mode=\"single\" required selected={selected} defaultMonth={selected ?? calendarDate(limit)} startMonth={calendarDate(\"0001-01-01\")} endMonth={calendarDate(limit)} disabled={{ after: calendarDate(limit) }} locale={locale} captionLayout=\"dropdown\" navLayout=\"around\" reverseYears autoFocus showOutsideDays onSelect={(date) => {\n const next = localReleaseDate(date);\n if (isReleaseDate(next, limit)) { onValueChange(next); setOpen(false); }\n }} classNames={{\n root: \"w-fit\",\n month: \"relative space-y-3\",\n month_caption: \"flex h-10 items-center justify-center px-10\",\n dropdowns: \"flex items-center gap-2 text-sm font-medium\",\n dropdown_root: \"relative rounded-md focus-within:outline-2 focus-within:outline-ring\",\n dropdown: \"absolute inset-0 size-full cursor-pointer bg-popover text-popover-foreground opacity-0\",\n caption_label: \"flex items-center gap-1 whitespace-nowrap\",\n button_previous: cn(navigationButton, \"start-0\"),\n button_next: cn(navigationButton, \"end-0\"),\n chevron: \"size-4 fill-current\",\n month_grid: \"w-full border-collapse\",\n weekday: \"size-10 text-xs font-normal text-muted-foreground\",\n day: \"size-10 p-0 text-center\",\n day_button: \"size-10 rounded-md border-0 bg-transparent font-normal text-inherit outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none\",\n selected: \"[&>button]:bg-primary [&>button]:text-primary-foreground [&>button:hover]:bg-primary\",\n today: \"[&>button]:font-bold\",\n outside: \"text-muted-foreground\",\n disabled: \"opacity-40\",\n hidden: \"invisible\",\n }} />\n </ContentKitUiRoot>\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>;\n}\n"],"mappings":";;;;;;;;;;;;AAaA,SAAgB,EAAiB,oBAAM,IAAI,KAAK,GAAW;CACzD,OAAO,GAAG,OAAO,EAAI,YAAY,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,OAAO,EAAI,SAAS,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,OAAO,EAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;AAC9I;AAGA,SAAgB,EAAc,GAAe,IAAM,EAAiB,GAAY;CAC9E,IAAI,CAAC,GAAO,OAAO;CACnB,IAAI,CAAC,+BAA+B,KAAK,CAAK,KAAK,EAAM,WAAW,MAAM,KAAK,IAAQ,GAAK,OAAO;CACnG,IAAM,oBAAK,IAAI,KAAK,GAAG,EAAM,WAAW;CACxC,OAAO,OAAO,SAAS,EAAG,QAAQ,CAAC,KAAK,EAAG,YAAY,CAAC,CAAC,MAAM,GAAG,EAAE,MAAM;AAC5E;AAEA,IAAM,KAAgB,sBAAkB,IAAI,KAAK,GAAG,EAAM,UAAU,GAC9D,IAAU;CAAE;CAAI,IAAI;CAAM;CAAI;CAAI;CAAI,IAAI;AAAK,GAC/C,IAAmB;AAazB,SAAgB,EAAkB,EAAE,WAAQ,IAAI,kBAAe,SAAM,EAAiB,GAAG,cAAW,iBAAsC;CACxI,IAAM,IAAK,EAAM,GACX,CAAC,GAAM,KAAW,EAAS,EAAK,GAChC,EAAE,MAAG,cAAW,SAAS,EAAY,GACrC,IAAQ,EAAc,CAAU,GAChC,IAAQ,KAAO,EAAc,GAAK,YAAY,IAAI,IAAM,EAAiB,GACzE,IAAQ,EAAc,GAAO,CAAK,GAClC,IAAW,KAAS,IAAQ,EAAa,CAAK,IAAI,KAAA,GAClD,IAAS,EAAQ,EAAS,MAAM,GAAG,CAAC,CAAC,OAA+B,GACpE,IAAQ,IAAW,IAAI,KAAK,eAAe,GAAU,EAAE,WAAW,SAAS,CAAC,CAAC,CAAC,OAAO,CAAQ,IAAI,EAAE,kBAAkB;CAC3H,OAAO,kBAAC,EAAQ,MAAT;EAAoB;EAAM,cAAc;EAAxC,UAAA,CACL,kBAAC,GAAD;GAA8B;GAAY,WAAW,EAAG,wCAAwC,CAAS;GAAG,aAAU;GAAtH,UAAA,CACE,kBAAC,EAAQ,SAAT;IAAiB,QAAQ,kBAAC,GAAD;KAAQ,MAAK;KAAS,SAAQ;KAAU,WAAU;IAAwB,CAAA;IAAG,cAAY,EAAE,kBAAkB;IAAG,gBAAc,CAAC,KAAS,KAAA;IAAW,oBAAmB,IAAwB,KAAA,IAAhB,GAAG,EAAG;IAA7M,UAAA,CACE,kBAAC,GAAD;KAAe,MAAM;KAAgB,WAAU;KAAS,eAAY;IAAQ,CAAA,GAC5E,kBAAC,QAAD;KAAM,WAAU;KAAoB,UAAA;IAAY,CAAA,CACjC;GAChB,CAAA,GAAA,CAAC,KAAS,kBAAC,KAAD;IAAG,IAAI,GAAG,EAAG;IAAS,MAAK;IAAQ,WAAU;IAA4B,UAAA,EAAE,sBAAsB;GAAK,CAAA,CACjG;EAClB,CAAA,GAAA,kBAAC,EAAQ,QAAT,EAAA,UACE,kBAAC,EAAQ,YAAT;GAAoB,GAAI;GAAO,WAAW,EAAG,EAAM,WAAW,MAAM;GAAG,OAAM;GAAM,YAAY;GAAG,kBAAkB;GAClH,UAAA,kBAAC,EAAQ,OAAT;IAAe,cAAc;IAAO,cAAY,EAAE,kBAAkB;IAAG,WAAU;IAC/E,UAAA,kBAAC,GAAD;KAA8B;KAAY,aAAU;KAClD,UAAA,kBAAC,GAAD;MAAgC,MAAK;MAAS,UAAA;MAAmB;MAAU,cAAc,KAAY,EAAa,CAAK;MAAG,YAAY,EAAa,YAAY;MAAG,UAAU,EAAa,CAAK;MAAG,UAAU,EAAE,OAAO,EAAa,CAAK,EAAE;MAAW;MAAQ,eAAc;MAAW,WAAU;MAAS,cAAA;MAAa,WAAA;MAAU,iBAAA;MAAgB,WAAW,MAAS;OAChW,IAAM,IAAO,EAAiB,CAAI;OAClC,AAAI,EAAc,GAAM,CAAK,MAAK,EAAc,CAAI,GAAG,EAAQ,EAAK;MACtE;MAAG,YAAY;OACb,MAAM;OACN,OAAO;OACP,eAAe;OACf,WAAW;OACX,eAAe;OACf,UAAU;OACV,eAAe;OACf,iBAAiB,EAAG,GAAkB,SAAS;OAC/C,aAAa,EAAG,GAAkB,OAAO;OACzC,SAAS;OACT,YAAY;OACZ,SAAS;OACT,KAAK;OACL,YAAY;OACZ,UAAU;OACV,OAAO;OACP,SAAS;OACT,UAAU;OACV,QAAQ;MACV;KAAI,GAvBY,KAAS,CAuBrB;IACY,CAAA;GACL,CAAA;EACG,CAAA,EACN,CAAA,CACJ;;AAChB"}
|