@wow-two-beta/ui 0.0.68 → 0.0.70

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.
Files changed (38) hide show
  1. package/dist/{chunk-HPA5BHDK.js → chunk-KD6MJOL5.js} +73 -68
  2. package/dist/chunk-KD6MJOL5.js.map +1 -0
  3. package/dist/{chunk-3BKZLK7D.js → chunk-SIAFOCT4.js} +74 -56
  4. package/dist/chunk-SIAFOCT4.js.map +1 -0
  5. package/dist/{chunk-D5QVCOX5.js → chunk-UFTKE5U7.js} +143 -151
  6. package/dist/chunk-UFTKE5U7.js.map +1 -0
  7. package/dist/display/eventCalendar/EventCalendar.d.ts +9 -6
  8. package/dist/display/gantt/Gantt.d.ts +6 -5
  9. package/dist/display/heatmapCalendar/HeatmapCalendar.d.ts +4 -2
  10. package/dist/display/index.js +2 -2
  11. package/dist/display/scheduleView/ScheduleView.d.ts +6 -4
  12. package/dist/forms/DateExtensions.d.ts +56 -25
  13. package/dist/forms/MonthGrid.d.ts +8 -7
  14. package/dist/forms/calendar/Calendar.d.ts +8 -7
  15. package/dist/forms/colorPicker/ColorPicker.d.ts +7 -0
  16. package/dist/forms/dateField/DateField.d.ts +6 -5
  17. package/dist/forms/datePicker/DatePicker.d.ts +8 -7
  18. package/dist/forms/dateRangePicker/DateRangePicker.d.ts +5 -4
  19. package/dist/forms/index.js +2 -2
  20. package/dist/forms/rangeCalendar/RangeCalendar.d.ts +8 -6
  21. package/dist/forms/recurrenceEditor/RecurrenceEditor.d.ts +3 -2
  22. package/dist/forms/timeField/TimeField.d.ts +4 -7
  23. package/dist/forms/timeField/index.d.ts +1 -1
  24. package/dist/forms/timePicker/TimePicker.d.ts +5 -5
  25. package/dist/http/ApiError.d.ts +7 -0
  26. package/dist/http/ApiResponse.d.ts +4 -0
  27. package/dist/http/DateBrands.d.ts +8 -0
  28. package/dist/http/ProblemDetails.d.ts +9 -0
  29. package/dist/http/index.d.ts +5 -0
  30. package/dist/http/index.js +58 -0
  31. package/dist/http/index.js.map +1 -0
  32. package/dist/http/temporalReviver.d.ts +9 -0
  33. package/dist/index.js +4 -4
  34. package/dist/layout/index.js +1 -1
  35. package/package.json +7 -1
  36. package/dist/chunk-3BKZLK7D.js.map +0 -1
  37. package/dist/chunk-D5QVCOX5.js.map +0 -1
  38. package/dist/chunk-HPA5BHDK.js.map +0 -1
@@ -4,6 +4,7 @@ import { cn } from './chunk-D4ZT36AZ.js';
4
4
  import { forwardRef } from 'react';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
6
6
  import { X } from 'lucide-react';
7
+ import { Temporal } from '@js-temporal/polyfill';
7
8
 
8
9
  var Kbd = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
9
10
  "kbd",
@@ -52,8 +53,6 @@ var Tag = forwardRef(
52
53
  ] })
53
54
  );
54
55
  Tag.displayName = "Tag";
55
-
56
- // src/forms/DateExtensions.ts
57
56
  var WEEKDAYS_SHORT = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
58
57
  var MONTHS_LONG = [
59
58
  "January",
@@ -69,95 +68,114 @@ var MONTHS_LONG = [
69
68
  "November",
70
69
  "December"
71
70
  ];
72
- function startOfDay(d) {
73
- const c = new Date(d);
74
- c.setHours(0, 0, 0, 0);
75
- return c;
71
+ function sundayIndex(d) {
72
+ return d.dayOfWeek % 7;
73
+ }
74
+ function today() {
75
+ return Temporal.Now.plainDateISO();
76
76
  }
77
77
  function isSameDay(a, b) {
78
78
  if (!a || !b) return false;
79
- return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
79
+ return a.equals(b);
80
80
  }
81
81
  function isToday(d) {
82
- return isSameDay(d, /* @__PURE__ */ new Date());
82
+ return d.equals(today());
83
83
  }
84
84
  function addMonths(d, n) {
85
- const c = new Date(d);
86
- const month = d.getMonth() + n;
87
- c.setMonth(month, Math.min(d.getDate(), daysInMonth(d.getFullYear(), month)));
88
- return c;
85
+ return d.add({ months: n });
89
86
  }
90
87
  function addDays(d, n) {
91
- const c = new Date(d);
92
- c.setDate(c.getDate() + n);
93
- return c;
88
+ return d.add({ days: n });
94
89
  }
95
90
  function startOfMonth(d) {
96
- return new Date(d.getFullYear(), d.getMonth(), 1);
91
+ return d.with({ day: 1 });
97
92
  }
98
93
  function daysInMonth(year, month) {
99
- return new Date(year, month + 1, 0).getDate();
94
+ return Temporal.PlainDate.from({ year, month, day: 1 }).daysInMonth;
100
95
  }
101
96
  function buildMonthGrid(year, month) {
102
- const first = new Date(year, month, 1);
103
- const firstWeekday = first.getDay();
104
- const start = addDays(first, -firstWeekday);
97
+ const first = Temporal.PlainDate.from({ year, month, day: 1 });
98
+ const start = first.subtract({ days: sundayIndex(first) });
105
99
  const cells = [];
106
100
  for (let i = 0; i < 42; i++) {
107
- const date = addDays(start, i);
108
- cells.push({ date, outOfMonth: date.getMonth() !== month });
101
+ const date = start.add({ days: i });
102
+ cells.push({ date, outOfMonth: date.month !== month });
109
103
  }
110
104
  return cells;
111
105
  }
112
106
  function formatISODate(d) {
113
107
  if (!d) return "";
114
- const year = d.getFullYear();
115
- const month = String(d.getMonth() + 1).padStart(2, "0");
116
- const day = String(d.getDate()).padStart(2, "0");
117
- return `${year}-${month}-${day}`;
108
+ return d.toString();
118
109
  }
119
110
  function parseISODate(s) {
120
111
  if (!s) return null;
121
- const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(s);
122
- if (!m) return null;
123
- const [, y, mo, d] = m;
124
- if (!y || !mo || !d) return null;
125
- const date = new Date(Number(y), Number(mo) - 1, Number(d));
126
- if (isNaN(date.getTime())) return null;
127
- return date;
128
- }
129
- function formatISOTime(d) {
130
- if (!d) return "";
131
- const h = String(d.getHours()).padStart(2, "0");
132
- const m = String(d.getMinutes()).padStart(2, "0");
133
- return `${h}:${m}`;
112
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(s)) return null;
113
+ try {
114
+ return Temporal.PlainDate.from(s, { overflow: "reject" });
115
+ } catch {
116
+ return null;
117
+ }
118
+ }
119
+ function formatISOTime(t) {
120
+ if (!t) return "";
121
+ return t.toString({ smallestUnit: "minute" });
134
122
  }
135
123
  function parseISOTime(s) {
136
124
  if (!s) return null;
137
- const m = /^(\d{2}):(\d{2})$/.exec(s);
138
- if (!m) return null;
139
- const [, h, mi] = m;
140
- if (!h || !mi) return null;
141
- const hours = Number(h);
142
- const minutes = Number(mi);
143
- if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return null;
144
- return { hours, minutes };
125
+ if (!/^\d{2}:\d{2}$/.test(s)) return null;
126
+ try {
127
+ return Temporal.PlainTime.from(s, { overflow: "reject" });
128
+ } catch {
129
+ return null;
130
+ }
145
131
  }
146
132
  function isDateDisabled(d, options) {
147
133
  const { min, max, isDisabled } = options;
148
- if (min && startOfDay(d) < startOfDay(min)) return true;
149
- if (max && startOfDay(d) > startOfDay(max)) return true;
134
+ if (min && Temporal.PlainDate.compare(d, min) < 0) return true;
135
+ if (max && Temporal.PlainDate.compare(d, max) > 0) return true;
150
136
  if (isDisabled?.(d)) return true;
151
137
  return false;
152
138
  }
153
139
  function isInRange(d, start, end) {
154
140
  if (!start || !end) return false;
155
- const t = startOfDay(d).getTime();
156
- const s = startOfDay(start).getTime();
157
- const e = startOfDay(end).getTime();
158
- return t >= Math.min(s, e) && t <= Math.max(s, e);
141
+ const lo = Temporal.PlainDate.compare(start, end) <= 0 ? start : end;
142
+ const hi = Temporal.PlainDate.compare(start, end) <= 0 ? end : start;
143
+ return Temporal.PlainDate.compare(d, lo) >= 0 && Temporal.PlainDate.compare(d, hi) <= 0;
144
+ }
145
+ function daysBetween(a, b) {
146
+ return a.until(b, { largestUnit: "day" }).days;
147
+ }
148
+ function isWeekend(d) {
149
+ return d.dayOfWeek === 6 || d.dayOfWeek === 7;
150
+ }
151
+ function nowZoned() {
152
+ return Temporal.Now.zonedDateTimeISO();
153
+ }
154
+ function isZonedOnDay(z, day) {
155
+ return z.toPlainDate().equals(day);
156
+ }
157
+ function zonedAtHour(day, hour, timeZone) {
158
+ return day.toZonedDateTime({
159
+ timeZone,
160
+ plainTime: new Temporal.PlainTime(hour)
161
+ });
162
+ }
163
+ function minutesBetween(a, b) {
164
+ return a.until(b, { largestUnit: "minute", smallestUnit: "minute" }).minutes;
165
+ }
166
+ function maxZoned(a, b) {
167
+ return Temporal.ZonedDateTime.compare(a, b) >= 0 ? a : b;
168
+ }
169
+ function minZoned(a, b) {
170
+ return Temporal.ZonedDateTime.compare(a, b) <= 0 ? a : b;
171
+ }
172
+ function isZonedDayInRange(z, start, end) {
173
+ return isInRange(z.toPlainDate(), start.toPlainDate(), end.toPlainDate());
174
+ }
175
+ function formatZonedTime(z) {
176
+ return z.toLocaleString(void 0, { hour: "2-digit", minute: "2-digit" });
159
177
  }
160
178
 
161
- export { Kbd, MONTHS_LONG, Tag, WEEKDAYS_SHORT, addDays, addMonths, buildMonthGrid, formatISODate, formatISOTime, isDateDisabled, isInRange, isSameDay, isToday, parseISODate, parseISOTime, startOfDay, startOfMonth, tagVariants };
162
- //# sourceMappingURL=chunk-3BKZLK7D.js.map
163
- //# sourceMappingURL=chunk-3BKZLK7D.js.map
179
+ export { Kbd, MONTHS_LONG, Tag, WEEKDAYS_SHORT, addDays, addMonths, buildMonthGrid, daysBetween, daysInMonth, formatISODate, formatISOTime, formatZonedTime, isDateDisabled, isInRange, isSameDay, isToday, isWeekend, isZonedDayInRange, isZonedOnDay, maxZoned, minZoned, minutesBetween, nowZoned, parseISODate, parseISOTime, startOfMonth, sundayIndex, tagVariants, today, zonedAtHour };
180
+ //# sourceMappingURL=chunk-SIAFOCT4.js.map
181
+ //# sourceMappingURL=chunk-SIAFOCT4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/display/kbd/Kbd.tsx","../src/display/tag/Tag.variants.ts","../src/display/tag/Tag.tsx","../src/forms/DateExtensions.ts"],"names":["forwardRef","jsx"],"mappings":"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","file":"chunk-SIAFOCT4.js","sourcesContent":["import { forwardRef, type ComponentPropsWithoutRef } from 'react';\nimport { cn } from '../../utils';\n\nexport type KbdProps = ComponentPropsWithoutRef<'kbd'>;\n\n/**\n * Keyboard key affordance — `<kbd>` styled with subtle border and inset\n * shadow. Single key per `<Kbd>`; chain via `<Kbd>⌘</Kbd> + <Kbd>K</Kbd>`.\n */\nexport const Kbd = forwardRef<HTMLElement, KbdProps>(({ className, ...props }, ref) => (\n <kbd\n ref={ref}\n className={cn(\n 'inline-flex h-5 min-w-5 items-center justify-center rounded-sm border border-border',\n 'bg-muted px-1.5 font-mono text-xs text-muted-foreground shadow-[inset_0_-1px_0_0_rgb(0_0_0/0.05)]',\n className,\n )}\n {...props}\n />\n));\nKbd.displayName = 'Kbd';\n","import { tv, type VariantProps } from '../../utils';\n\nexport const tagVariants = tv({\n base: 'inline-flex items-center gap-1 rounded-md border border-border bg-card px-2 py-0.5 text-xs font-medium text-card-foreground',\n variants: {\n variant: {\n neutral: '',\n brand: 'border-transparent bg-primary-soft text-primary-soft-foreground',\n success: 'border-transparent bg-success-soft text-success-soft-foreground',\n warning: 'border-transparent bg-warning-soft text-warning-soft-foreground',\n danger: 'border-transparent bg-destructive-soft text-destructive-soft-foreground',\n info: 'border-transparent bg-info-soft text-info-soft-foreground',\n },\n },\n defaultVariants: {\n variant: 'neutral',\n },\n});\n\nexport type TagVariants = VariantProps<typeof tagVariants>;\n","import { forwardRef, type ComponentPropsWithoutRef, type ReactNode } from 'react';\nimport { X } from 'lucide-react';\nimport { cn } from '../../utils';\nimport { Icon } from '../../icons';\nimport { tagVariants, type TagVariants } from './Tag.variants';\n\nexport interface TagProps\n extends Omit<ComponentPropsWithoutRef<'span'>, 'children'>,\n TagVariants {\n children?: ReactNode;\n /** Show a close (×) button. Pass a handler to receive the click. */\n onClose?: () => void;\n /** Accessible label for the close button. Default `\"Remove\"`. */\n closeLabel?: string;\n}\n\n/**\n * Pill with an optional close button. The close button is a raw `<button>`\n * to keep the strict atom rule (Tag is L3, so importing Button would make\n * this an atom-on-atom composition).\n */\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(\n ({ children, onClose, closeLabel = 'Remove', variant, className, ...props }, ref) => (\n <span ref={ref} className={cn(tagVariants({ variant }), className)} {...props}>\n {children}\n {onClose && (\n <button\n type=\"button\"\n aria-label={closeLabel}\n onClick={onClose}\n className=\"-mr-1 inline-flex h-4 w-4 items-center justify-center rounded-sm text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <Icon icon={X} size={12} />\n </button>\n )}\n </span>\n ),\n);\nTag.displayName = 'Tag';\n","// Shared date helpers for Calendar / DatePicker / DateField / RangeCalendar.\n// Co-located in `forms/` so imports stay within-domain.\n//\n// Temporal-based — the ecosystem standardizes on the Temporal API (dates =\n// `Temporal.*`). `Temporal.PlainDate` carries calendar math (no timezone), so\n// these helpers are inherently local/wall-clock, which is what calendar UIs want.\n// `Temporal.PlainTime` carries hour/minute for the time components.\n\nimport { Temporal } from '@js-temporal/polyfill';\n\nexport const WEEKDAYS_SHORT = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\nexport const MONTHS_LONG = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\n/** Sunday-anchored column index (0 = Sun … 6 = Sat) for a PlainDate. */\nexport function sundayIndex(d: Temporal.PlainDate): number {\n // Temporal `dayOfWeek` is 1 (Mon) … 7 (Sun); map Sunday to 0 for our Su-first grid.\n return d.dayOfWeek % 7;\n}\n\n/** Today as a PlainDate in the local time zone. */\nexport function today(): Temporal.PlainDate {\n return Temporal.Now.plainDateISO();\n}\n\nexport function isSameDay(\n a: Temporal.PlainDate | null | undefined,\n b: Temporal.PlainDate | null | undefined,\n): boolean {\n if (!a || !b) return false;\n return a.equals(b);\n}\n\nexport function isToday(d: Temporal.PlainDate): boolean {\n return d.equals(today());\n}\n\n/** Add `n` months; Temporal clamps to the target month's last day (Jan 31 +1 → Feb 28). */\nexport function addMonths(d: Temporal.PlainDate, n: number): Temporal.PlainDate {\n return d.add({ months: n });\n}\n\nexport function addDays(d: Temporal.PlainDate, n: number): Temporal.PlainDate {\n return d.add({ days: n });\n}\n\n/** First day of `d`'s month. */\nexport function startOfMonth(d: Temporal.PlainDate): Temporal.PlainDate {\n return d.with({ day: 1 });\n}\n\n/** Number of days in the given year/month (1-indexed month). */\nexport function daysInMonth(year: number, month: number): number {\n return Temporal.PlainDate.from({ year, month, day: 1 }).daysInMonth;\n}\n\n/**\n * Build the 6-week (42-cell) grid that the calendar UI renders.\n * `year`/`month` are 1-indexed (Temporal convention). Cells outside the target\n * month carry `outOfMonth: true`.\n */\nexport function buildMonthGrid(\n year: number,\n month: number,\n): { date: Temporal.PlainDate; outOfMonth: boolean }[] {\n const first = Temporal.PlainDate.from({ year, month, day: 1 });\n const start = first.subtract({ days: sundayIndex(first) });\n const cells: { date: Temporal.PlainDate; outOfMonth: boolean }[] = [];\n for (let i = 0; i < 42; i++) {\n const date = start.add({ days: i });\n cells.push({ date, outOfMonth: date.month !== month });\n }\n return cells;\n}\n\n/** Format PlainDate → \"YYYY-MM-DD\" for a native `<input type=\"date\">` value. */\nexport function formatISODate(d: Temporal.PlainDate | null | undefined): string {\n if (!d) return '';\n return d.toString();\n}\n\n/** Parse \"YYYY-MM-DD\" → PlainDate. Returns null for invalid input. */\nexport function parseISODate(s: string | null | undefined): Temporal.PlainDate | null {\n if (!s) return null;\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) return null;\n try {\n return Temporal.PlainDate.from(s, { overflow: 'reject' });\n } catch {\n return null;\n }\n}\n\n/** Format PlainTime → \"HH:MM\" for a native `<input type=\"time\">` value. */\nexport function formatISOTime(t: Temporal.PlainTime | null | undefined): string {\n if (!t) return '';\n return t.toString({ smallestUnit: 'minute' });\n}\n\n/** Parse \"HH:MM\" → PlainTime. Returns null for invalid input. */\nexport function parseISOTime(s: string | null | undefined): Temporal.PlainTime | null {\n if (!s) return null;\n if (!/^\\d{2}:\\d{2}$/.test(s)) return null;\n try {\n return Temporal.PlainTime.from(s, { overflow: 'reject' });\n } catch {\n return null;\n }\n}\n\nexport function clampDate(\n d: Temporal.PlainDate,\n min?: Temporal.PlainDate | null,\n max?: Temporal.PlainDate | null,\n): Temporal.PlainDate {\n if (min && Temporal.PlainDate.compare(d, min) < 0) return min;\n if (max && Temporal.PlainDate.compare(d, max) > 0) return max;\n return d;\n}\n\nexport function isDateDisabled(\n d: Temporal.PlainDate,\n options: {\n min?: Temporal.PlainDate | null;\n max?: Temporal.PlainDate | null;\n isDisabled?: (d: Temporal.PlainDate) => boolean;\n },\n): boolean {\n const { min, max, isDisabled } = options;\n if (min && Temporal.PlainDate.compare(d, min) < 0) return true;\n if (max && Temporal.PlainDate.compare(d, max) > 0) return true;\n if (isDisabled?.(d)) return true;\n return false;\n}\n\nexport function isInRange(\n d: Temporal.PlainDate,\n start: Temporal.PlainDate | null | undefined,\n end: Temporal.PlainDate | null | undefined,\n): boolean {\n if (!start || !end) return false;\n const lo = Temporal.PlainDate.compare(start, end) <= 0 ? start : end;\n const hi = Temporal.PlainDate.compare(start, end) <= 0 ? end : start;\n return Temporal.PlainDate.compare(d, lo) >= 0 && Temporal.PlainDate.compare(d, hi) <= 0;\n}\n\n/** Signed whole-day count from `a` to `b` (positive when `b` is later). */\nexport function daysBetween(a: Temporal.PlainDate, b: Temporal.PlainDate): number {\n return a.until(b, { largestUnit: 'day' }).days;\n}\n\n/** True when `d` falls on a Saturday or Sunday. */\nexport function isWeekend(d: Temporal.PlainDate): boolean {\n // Temporal `dayOfWeek`: 1 (Mon) … 7 (Sun); 6 = Sat, 7 = Sun.\n return d.dayOfWeek === 6 || d.dayOfWeek === 7;\n}\n\n// ── Datetime helpers (ZonedDateTime) ──────────────────────────────────────\n// EventCalendar / ScheduleView model absolute instants (a wall-clock time in a\n// specific zone) — the `Temporal.ZonedDateTime` peer of .NET `DateTimeOffset`.\n// The grid + navigation still project down to `Temporal.PlainDate` (via the\n// helpers above); these cover the intra-day time-slot math the grid needs.\n\n/** Now as a ZonedDateTime in the local (system) time zone. */\nexport function nowZoned(): Temporal.ZonedDateTime {\n return Temporal.Now.zonedDateTimeISO();\n}\n\n/** The calendar day a ZonedDateTime falls on (its wall-clock PlainDate). */\nexport function zonedToPlainDate(z: Temporal.ZonedDateTime): Temporal.PlainDate {\n return z.toPlainDate();\n}\n\n/** True when two ZonedDateTimes land on the same wall-clock day (same zone assumed). */\nexport function isSameZonedDay(a: Temporal.ZonedDateTime, b: Temporal.ZonedDateTime): boolean {\n return a.toPlainDate().equals(b.toPlainDate());\n}\n\n/** True when a ZonedDateTime falls on `day` (its wall-clock date equals `day`). */\nexport function isZonedOnDay(z: Temporal.ZonedDateTime, day: Temporal.PlainDate): boolean {\n return z.toPlainDate().equals(day);\n}\n\n/** Start-of-day (00:00, zone-correct) for `day` in `z`'s time zone. */\nexport function startOfZonedDay(day: Temporal.PlainDate, timeZone: Temporal.TimeZoneLike): Temporal.ZonedDateTime {\n return day.toZonedDateTime({ timeZone, plainTime: Temporal.PlainTime.from('00:00') });\n}\n\n/** `day` at hour `hour` (minutes/seconds zeroed), zone-correct, in `timeZone`. */\nexport function zonedAtHour(\n day: Temporal.PlainDate,\n hour: number,\n timeZone: Temporal.TimeZoneLike,\n): Temporal.ZonedDateTime {\n return day.toZonedDateTime({\n timeZone,\n plainTime: new Temporal.PlainTime(hour),\n });\n}\n\n/** Signed minutes from `a` to `b` (positive when `b` is later). */\nexport function minutesBetween(a: Temporal.ZonedDateTime, b: Temporal.ZonedDateTime): number {\n return a.until(b, { largestUnit: 'minute', smallestUnit: 'minute' }).minutes;\n}\n\n/** Later of two instants. */\nexport function maxZoned(a: Temporal.ZonedDateTime, b: Temporal.ZonedDateTime): Temporal.ZonedDateTime {\n return Temporal.ZonedDateTime.compare(a, b) >= 0 ? a : b;\n}\n\n/** Earlier of two instants. */\nexport function minZoned(a: Temporal.ZonedDateTime, b: Temporal.ZonedDateTime): Temporal.ZonedDateTime {\n return Temporal.ZonedDateTime.compare(a, b) <= 0 ? a : b;\n}\n\n/** True when `z`'s calendar day lies within [start, end] (inclusive, by day). */\nexport function isZonedDayInRange(\n z: Temporal.ZonedDateTime,\n start: Temporal.ZonedDateTime,\n end: Temporal.ZonedDateTime,\n): boolean {\n return isInRange(z.toPlainDate(), start.toPlainDate(), end.toPlainDate());\n}\n\n/** Format a ZonedDateTime's time-of-day as \"HH:MM\" (locale-aware). */\nexport function formatZonedTime(z: Temporal.ZonedDateTime): string {\n return z.toLocaleString(undefined, { hour: '2-digit', minute: '2-digit' });\n}\n"]}