@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 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` supplies the native calendar, editable year and **Latest**
371
- reset. Keep its controlled value in your router to support shared URLs and
372
- back/forward navigation:
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 selects the latest window. */
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
- /** Inclusive end_date of a DailyReleases query; empty means latest. */
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. Browser-local today by default. */
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
- /** Native calendar with an editable year, so old dates need no month-by-month paging. */
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 n } from "../../ui/button.js";
4
- import { Input as r } from "../../ui/input.js";
5
- import { useId as i } from "react";
6
- import { jsx as a, jsxs as o } from "react/jsx-runtime";
7
- import { cn as s } from "cn";
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 c(e = /* @__PURE__ */ new Date()) {
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 l(e, t = c()) {
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
- function u({ value: u = "", onValueChange: d, max: f = c(), className: p, appearance: m }) {
19
- let h = i(), { t: g } = e(), _ = l(u, f);
20
- return /* @__PURE__ */ o(t, {
21
- appearance: m,
22
- className: s("grid justify-items-start gap-2", p),
23
- "data-ckui": "release-date-picker",
24
- children: [/* @__PURE__ */ o("div", {
25
- className: "flex flex-wrap items-center gap-3",
26
- children: [
27
- /* @__PURE__ */ a("label", {
28
- htmlFor: h,
29
- className: "text-base font-medium",
30
- children: g("releases.throughDate")
31
- }),
32
- /* @__PURE__ */ a(r, {
33
- id: h,
34
- type: "date",
35
- min: "0001-01-01",
36
- max: f,
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
- disabled: !u,
50
- onClick: () => d(""),
51
- children: g("releases.latest")
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
- }), !_ && /* @__PURE__ */ a("p", {
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 { u as ReleaseDatePicker, l as isReleaseDate, c as localReleaseDate };
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 { cn } from \"cn\";\nimport { Button } from \"#ckui/ui/button\";\nimport { Input } from \"#ckui/ui/input\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport type { ContentKitUiAppearance } from \"../../appearance.js\";\nimport { ContentKitUiRoot } 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 selects the latest window. */\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\nexport interface ReleaseDatePickerProps {\n /** Inclusive end_date of a DailyReleases query; empty means latest. */\n value?: string;\n onValueChange: (value: string) => void;\n /** YYYY-MM-DD in the listing's calendar. Browser-local today by default. */\n max?: string;\n className?: string;\n appearance?: ContentKitUiAppearance;\n}\n\n/** Native calendar with an editable year, so old dates need no month-by-month paging. */\nexport function ReleaseDatePicker({ value = \"\", onValueChange, max = localReleaseDate(), className, appearance }: ReleaseDatePickerProps) {\n const id = useId();\n const { t } = useMessages();\n const valid = isReleaseDate(value, max);\n return <ContentKitUiRoot appearance={appearance} className={cn(\"grid justify-items-start gap-2\", className)} data-ckui=\"release-date-picker\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <label htmlFor={id} className=\"text-base font-medium\">{t(\"releases.throughDate\")}</label>\n <Input id={id} type=\"date\" min=\"0001-01-01\" max={max} value={valid ? value : \"\"} className=\"h-11 w-auto min-w-40 text-base\" aria-invalid={!valid || undefined} aria-describedby={!valid ? `${id}-error` : undefined} onChange={(event) => {\n const next = event.currentTarget.value;\n if (isReleaseDate(next, max)) onValueChange(next);\n }} />\n <Button type=\"button\" variant=\"outline\" disabled={!value} onClick={() => onValueChange(\"\")}>{t(\"releases.latest\")}</Button>\n </div>\n {!valid && <p id={`${id}-error`} role=\"alert\" className=\"text-sm text-destructive\">{t(\"releases.invalidDate\")}</p>}\n </ContentKitUiRoot>;\n}\n"],"mappings":";;;;;;;;AASA,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;AAaA,SAAgB,EAAkB,EAAE,WAAQ,IAAI,kBAAe,SAAM,EAAiB,GAAG,cAAW,iBAAsC;CACxI,IAAM,IAAK,EAAM,GACX,EAAE,SAAM,EAAY,GACpB,IAAQ,EAAc,GAAO,CAAG;CACtC,OAAO,kBAAC,GAAD;EAA8B;EAAY,WAAW,EAAG,kCAAkC,CAAS;EAAG,aAAU;EAAhH,UAAA,CACL,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAAC,SAAD;KAAO,SAAS;KAAI,WAAU;KAAyB,UAAA,EAAE,sBAAsB;IAAS,CAAA;IACxF,kBAAC,GAAD;KAAW;KAAI,MAAK;KAAO,KAAI;KAAkB;KAAK,OAAO,IAAQ,IAAQ;KAAI,WAAU;KAAiC,gBAAc,CAAC,KAAS,KAAA;KAAW,oBAAmB,IAAwB,KAAA,IAAhB,GAAG,EAAG;KAAqB,WAAW,MAAU;MACxO,IAAM,IAAO,EAAM,cAAc;MACjC,AAAI,EAAc,GAAM,CAAG,KAAG,EAAc,CAAI;KAClD;IAAI,CAAA;IACJ,kBAAC,GAAD;KAAQ,MAAK;KAAS,SAAQ;KAAU,UAAU,CAAC;KAAO,eAAe,EAAc,EAAE;KAAI,UAAA,EAAE,iBAAiB;IAAU,CAAA;GACvH;EACJ,CAAA,GAAA,CAAC,KAAS,kBAAC,KAAD;GAAG,IAAI,GAAG,EAAG;GAAS,MAAK;GAAQ,WAAU;GAA4B,UAAA,EAAE,sBAAsB;EAAK,CAAA,CACjG;;AACpB"}
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":"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"}