@mitcsutt/kiln-ui 0.5.0 → 0.7.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.
Files changed (188) hide show
  1. package/dist/components/actions/CopyButton/CopyButton.d.ts +58 -0
  2. package/dist/components/actions/CopyButton/CopyButton.js +63 -0
  3. package/dist/components/actions/CopyButton/CopyButton.js.map +1 -0
  4. package/dist/components/actions/CopyButton/CopyButton.module.js +9 -0
  5. package/dist/components/actions/CopyButton/CopyButton.module.js.map +1 -0
  6. package/dist/components/actions/CopyButton/index.d.ts +4 -0
  7. package/dist/components/actions/CopyButton/useClipboard.d.ts +35 -0
  8. package/dist/components/actions/CopyButton/useClipboard.js +62 -0
  9. package/dist/components/actions/CopyButton/useClipboard.js.map +1 -0
  10. package/dist/components/actions/ToggleChip/ToggleChip.d.ts +6 -0
  11. package/dist/components/actions/ToggleChip/ToggleChip.js +26 -24
  12. package/dist/components/actions/ToggleChip/ToggleChip.js.map +1 -1
  13. package/dist/components/display/Badge/Badge.d.ts +6 -0
  14. package/dist/components/display/Badge/Badge.js +16 -15
  15. package/dist/components/display/Badge/Badge.js.map +1 -1
  16. package/dist/components/display/CodeBlock/CodeBlock.d.ts +44 -3
  17. package/dist/components/display/CodeBlock/CodeBlock.js +39 -47
  18. package/dist/components/display/CodeBlock/CodeBlock.js.map +1 -1
  19. package/dist/components/display/CodeBlock/CodeBlock.module.js +4 -3
  20. package/dist/components/display/CodeBlock/CodeBlock.module.js.map +1 -1
  21. package/dist/components/display/CodeBlock/index.d.ts +1 -1
  22. package/dist/components/display/Swatch/Swatch.d.ts +52 -0
  23. package/dist/components/display/Swatch/Swatch.js +27 -0
  24. package/dist/components/display/Swatch/Swatch.js.map +1 -0
  25. package/dist/components/display/Swatch/Swatch.module.js +6 -0
  26. package/dist/components/display/Swatch/Swatch.module.js.map +1 -0
  27. package/dist/components/display/Swatch/index.d.ts +2 -0
  28. package/dist/components/display/Tag/Tag.d.ts +7 -0
  29. package/dist/components/display/Tag/Tag.js +31 -26
  30. package/dist/components/display/Tag/Tag.js.map +1 -1
  31. package/dist/components/feedback/Indicator/Indicator.d.ts +74 -0
  32. package/dist/components/feedback/Indicator/Indicator.js +50 -0
  33. package/dist/components/feedback/Indicator/Indicator.js.map +1 -0
  34. package/dist/components/feedback/Indicator/Indicator.module.js +12 -0
  35. package/dist/components/feedback/Indicator/Indicator.module.js.map +1 -0
  36. package/dist/components/feedback/Indicator/index.d.ts +2 -0
  37. package/dist/components/feedback/Toaster/Toaster.d.ts +71 -0
  38. package/dist/components/feedback/Toaster/Toaster.js +121 -0
  39. package/dist/components/feedback/Toaster/Toaster.js.map +1 -0
  40. package/dist/components/feedback/Toaster/Toaster.module.js +20 -0
  41. package/dist/components/feedback/Toaster/Toaster.module.js.map +1 -0
  42. package/dist/components/feedback/Toaster/index.d.ts +4 -0
  43. package/dist/components/feedback/Toaster/toast.d.ts +96 -0
  44. package/dist/components/feedback/Toaster/toast.js +131 -0
  45. package/dist/components/feedback/Toaster/toast.js.map +1 -0
  46. package/dist/components/inputs/Calendar/Calendar.d.ts +87 -0
  47. package/dist/components/inputs/Calendar/Calendar.js +217 -0
  48. package/dist/components/inputs/Calendar/Calendar.js.map +1 -0
  49. package/dist/components/inputs/Calendar/Calendar.module.js +18 -0
  50. package/dist/components/inputs/Calendar/Calendar.module.js.map +1 -0
  51. package/dist/components/inputs/Calendar/index.d.ts +2 -0
  52. package/dist/components/inputs/Combobox/Combobox.js +36 -44
  53. package/dist/components/inputs/Combobox/Combobox.js.map +1 -1
  54. package/dist/components/inputs/DateField/DateField.d.ts +17 -0
  55. package/dist/components/inputs/DateField/DateField.js +26 -0
  56. package/dist/components/inputs/DateField/DateField.js.map +1 -0
  57. package/dist/components/inputs/DateField/index.d.ts +2 -0
  58. package/dist/components/inputs/DateInput/DateInput.d.ts +75 -0
  59. package/dist/components/inputs/DateInput/DateInput.js +139 -0
  60. package/dist/components/inputs/DateInput/DateInput.js.map +1 -0
  61. package/dist/components/inputs/DateInput/index.d.ts +3 -0
  62. package/dist/components/inputs/DateRangeField/DateRangeField.d.ts +18 -3
  63. package/dist/components/inputs/DateRangeField/DateRangeField.js.map +1 -1
  64. package/dist/components/inputs/DateRangeField/DateRangeField.module.js +8 -3
  65. package/dist/components/inputs/DateRangeField/DateRangeField.module.js.map +1 -1
  66. package/dist/components/inputs/DateRangeField/DateRangePickerField.d.ts +48 -0
  67. package/dist/components/inputs/DateRangeField/DateRangePickerField.js +246 -0
  68. package/dist/components/inputs/DateRangeField/DateRangePickerField.js.map +1 -0
  69. package/dist/components/inputs/DateRangeField/index.d.ts +2 -0
  70. package/dist/components/inputs/DateTimeField/DateTimeField.d.ts +17 -0
  71. package/dist/components/inputs/DateTimeField/DateTimeField.js +26 -0
  72. package/dist/components/inputs/DateTimeField/DateTimeField.js.map +1 -0
  73. package/dist/components/inputs/DateTimeField/index.d.ts +2 -0
  74. package/dist/components/inputs/DateTimeInput/DateTimeInput.d.ts +83 -0
  75. package/dist/components/inputs/DateTimeInput/DateTimeInput.js +216 -0
  76. package/dist/components/inputs/DateTimeInput/DateTimeInput.js.map +1 -0
  77. package/dist/components/inputs/DateTimeInput/index.d.ts +2 -0
  78. package/dist/components/inputs/JsonField/JsonField.d.ts +23 -0
  79. package/dist/components/inputs/JsonField/JsonField.js +33 -0
  80. package/dist/components/inputs/JsonField/JsonField.js.map +1 -0
  81. package/dist/components/inputs/JsonField/index.d.ts +2 -0
  82. package/dist/components/inputs/JsonInput/JsonInput.d.ts +119 -0
  83. package/dist/components/inputs/JsonInput/JsonInput.js +282 -0
  84. package/dist/components/inputs/JsonInput/JsonInput.js.map +1 -0
  85. package/dist/components/inputs/JsonInput/JsonInput.module.js +16 -0
  86. package/dist/components/inputs/JsonInput/JsonInput.module.js.map +1 -0
  87. package/dist/components/inputs/JsonInput/index.d.ts +4 -0
  88. package/dist/components/inputs/JsonInput/json.d.ts +59 -0
  89. package/dist/components/inputs/JsonInput/json.js +231 -0
  90. package/dist/components/inputs/JsonInput/json.js.map +1 -0
  91. package/dist/components/inputs/TagsInput/TagsInput.js +5 -5
  92. package/dist/components/inputs/TimeField/TimeField.d.ts +17 -0
  93. package/dist/components/inputs/TimeField/TimeField.js +26 -0
  94. package/dist/components/inputs/TimeField/TimeField.js.map +1 -0
  95. package/dist/components/inputs/TimeField/index.d.ts +2 -0
  96. package/dist/components/inputs/TimeInput/TimeInput.d.ts +54 -0
  97. package/dist/components/inputs/TimeInput/TimeInput.js +107 -0
  98. package/dist/components/inputs/TimeInput/TimeInput.js.map +1 -0
  99. package/dist/components/inputs/TimeInput/index.d.ts +2 -0
  100. package/dist/components/inputs/internal/DateSegments.d.ts +80 -0
  101. package/dist/components/inputs/internal/DateSegments.js +345 -0
  102. package/dist/components/inputs/internal/DateSegments.js.map +1 -0
  103. package/dist/components/inputs/internal/dates.d.ts +101 -0
  104. package/dist/components/inputs/internal/dates.js +262 -0
  105. package/dist/components/inputs/internal/dates.js.map +1 -0
  106. package/dist/components/inputs/internal/filterOptions.d.ts +22 -1
  107. package/dist/components/inputs/internal/filterOptions.js +32 -1
  108. package/dist/components/inputs/internal/filterOptions.js.map +1 -1
  109. package/dist/components/inputs/internal/picker.d.ts +31 -0
  110. package/dist/components/inputs/internal/picker.js +29 -0
  111. package/dist/components/inputs/internal/picker.js.map +1 -0
  112. package/dist/components/inputs/internal/picker.module.js +15 -0
  113. package/dist/components/inputs/internal/picker.module.js.map +1 -0
  114. package/dist/components/inputs/internal/segments.module.js +10 -0
  115. package/dist/components/inputs/internal/segments.module.js.map +1 -0
  116. package/dist/components/layout/Collapse/Collapse.d.ts +39 -0
  117. package/dist/components/layout/Collapse/Collapse.js +24 -0
  118. package/dist/components/layout/Collapse/Collapse.js.map +1 -0
  119. package/dist/components/layout/Collapse/Collapse.module.js +6 -0
  120. package/dist/components/layout/Collapse/Collapse.module.js.map +1 -0
  121. package/dist/components/layout/Collapse/index.d.ts +2 -0
  122. package/dist/components/layout/Collapse/useHeightMotion.d.ts +16 -0
  123. package/dist/components/layout/Collapse/useHeightMotion.js +60 -0
  124. package/dist/components/layout/Collapse/useHeightMotion.js.map +1 -0
  125. package/dist/components/layout/ShowMore/ShowMore.d.ts +59 -0
  126. package/dist/components/layout/ShowMore/ShowMore.js +114 -0
  127. package/dist/components/layout/ShowMore/ShowMore.js.map +1 -0
  128. package/dist/components/layout/ShowMore/ShowMore.module.js +12 -0
  129. package/dist/components/layout/ShowMore/ShowMore.module.js.map +1 -0
  130. package/dist/components/layout/ShowMore/index.d.ts +2 -0
  131. package/dist/components/layout/Transition/Transition.d.ts +63 -0
  132. package/dist/components/layout/Transition/Transition.js +63 -0
  133. package/dist/components/layout/Transition/Transition.js.map +1 -0
  134. package/dist/components/layout/Transition/Transition.module.js +17 -0
  135. package/dist/components/layout/Transition/Transition.module.js.map +1 -0
  136. package/dist/components/layout/Transition/index.d.ts +2 -0
  137. package/dist/components/navigation/Collapsible/Collapsible.d.ts +49 -0
  138. package/dist/components/navigation/Collapsible/Collapsible.js +83 -0
  139. package/dist/components/navigation/Collapsible/Collapsible.js.map +1 -0
  140. package/dist/components/navigation/Collapsible/Collapsible.module.js +11 -0
  141. package/dist/components/navigation/Collapsible/Collapsible.module.js.map +1 -0
  142. package/dist/components/navigation/Collapsible/index.d.ts +2 -0
  143. package/dist/components/navigation/NavLinks/NavLinks.d.ts +32 -4
  144. package/dist/components/navigation/NavLinks/NavLinks.js +69 -39
  145. package/dist/components/navigation/NavLinks/NavLinks.js.map +1 -1
  146. package/dist/components/navigation/NavLinks/NavLinks.module.js +13 -3
  147. package/dist/components/navigation/NavLinks/NavLinks.module.js.map +1 -1
  148. package/dist/components/navigation/NavLinks/NavLinksGroup.d.ts +49 -0
  149. package/dist/components/navigation/NavLinks/NavLinksGroup.js +185 -0
  150. package/dist/components/navigation/NavLinks/NavLinksGroup.js.map +1 -0
  151. package/dist/components/navigation/NavLinks/context.d.ts +28 -0
  152. package/dist/components/navigation/NavLinks/context.js +13 -0
  153. package/dist/components/navigation/NavLinks/context.js.map +1 -0
  154. package/dist/components/navigation/NavLinks/index.d.ts +2 -0
  155. package/dist/components/navigation/NavLinks/treeKeys.d.ts +8 -0
  156. package/dist/components/navigation/NavLinks/treeKeys.js +57 -0
  157. package/dist/components/navigation/NavLinks/treeKeys.js.map +1 -0
  158. package/dist/components/overlays/CommandPalette/CommandPalette.d.ts +120 -0
  159. package/dist/components/overlays/CommandPalette/CommandPalette.js +386 -0
  160. package/dist/components/overlays/CommandPalette/CommandPalette.js.map +1 -0
  161. package/dist/components/overlays/CommandPalette/CommandPalette.module.js +31 -0
  162. package/dist/components/overlays/CommandPalette/CommandPalette.module.js.map +1 -0
  163. package/dist/components/overlays/CommandPalette/index.d.ts +2 -0
  164. package/dist/components/overlays/CommandPalette/shortcut.d.ts +28 -0
  165. package/dist/components/overlays/CommandPalette/shortcut.js +104 -0
  166. package/dist/components/overlays/CommandPalette/shortcut.js.map +1 -0
  167. package/dist/highlight/index.d.ts +18 -0
  168. package/dist/highlight/index.js +103 -0
  169. package/dist/highlight/index.js.map +1 -0
  170. package/dist/index.d.ts +41 -5
  171. package/dist/index.js +123 -100
  172. package/dist/styles.css +1 -1
  173. package/dist/themes/fiesta.css +1 -1
  174. package/dist/themes/flightdeck.css +1 -1
  175. package/dist/themes/ledger.css +1 -1
  176. package/dist/themes/monograph.css +1 -1
  177. package/dist/themes/riso.css +1 -1
  178. package/dist/utils/newlines.d.ts +2 -0
  179. package/dist/utils/newlines.js +10 -0
  180. package/dist/utils/newlines.js.map +1 -0
  181. package/package.json +13 -2
  182. package/skills/custom-theme/SKILL.md +32 -0
  183. package/skills/custom-theme/references/colour.md +20 -0
  184. package/skills/custom-theme/references/motion.md +9 -0
  185. package/skills/custom-theme/references/tokens.md +35 -0
  186. package/skills/design-rules/SKILL.md +5 -2
  187. package/skills/setup-and-theming/SKILL.md +2 -1
  188. package/skills/setup-and-theming/references/paper.md +1 -1
@@ -0,0 +1,345 @@
1
+ import { DEFAULT_LOCALE as e, daysInMonth as t, pad as n } from "./dates.js";
2
+ import r from "./segments.module.js";
3
+ import { forwardRef as i, useRef as a, useState as o } from "react";
4
+ import { jsx as s } from "react/jsx-runtime";
5
+ //#region src/components/inputs/internal/DateSegments.tsx
6
+ var c = {
7
+ year: "Year",
8
+ month: "Month",
9
+ day: "Day",
10
+ hour: "Hour",
11
+ minute: "Minute",
12
+ second: "Second",
13
+ dayPeriod: "AM/PM",
14
+ empty: "Empty",
15
+ yearPlaceholder: "yyyy",
16
+ monthPlaceholder: "mm",
17
+ dayPlaceholder: "dd",
18
+ hourPlaceholder: "––",
19
+ minutePlaceholder: "––",
20
+ secondPlaceholder: "––"
21
+ }, l = /* @__PURE__ */ new Set([
22
+ "year",
23
+ "month",
24
+ "day",
25
+ "hour",
26
+ "minute",
27
+ "second"
28
+ ]), u = /* @__PURE__ */ new Set([
29
+ "year",
30
+ "month",
31
+ "day"
32
+ ]);
33
+ function d(t, n, r, i) {
34
+ let a = {
35
+ timeZone: "UTC",
36
+ calendar: "gregory",
37
+ numberingSystem: "latn"
38
+ };
39
+ t !== "time" && Object.assign(a, {
40
+ year: "numeric",
41
+ month: "2-digit",
42
+ day: "2-digit"
43
+ }), t !== "date" && (Object.assign(a, {
44
+ hour: "2-digit",
45
+ minute: "2-digit",
46
+ hourCycle: i === 12 ? "h12" : "h23"
47
+ }), r === "second" && (a.second = "2-digit"));
48
+ let o;
49
+ try {
50
+ o = new Intl.DateTimeFormat(n, a).formatToParts(Date.UTC(2026, 10, 22, 13, 45));
51
+ } catch {
52
+ o = new Intl.DateTimeFormat(e, a).formatToParts(Date.UTC(2026, 10, 22, 13, 45));
53
+ }
54
+ let s = [];
55
+ for (let e of o) l.has(e.type) || e.type === "dayPeriod" ? s.push({ type: e.type }) : e.type === "literal" && s.length > 0 && s.push({
56
+ type: "literal",
57
+ value: e.value.replace(/[\u200e\u200f]/g, "")
58
+ });
59
+ for (; s.length > 0 && s[s.length - 1]?.type === "literal";) s.pop();
60
+ return s;
61
+ }
62
+ function f(e, t) {
63
+ return {
64
+ ...e,
65
+ ...t
66
+ };
67
+ }
68
+ function p(e) {
69
+ let { year: t, month: n, day: r } = e;
70
+ return t !== void 0 && n !== void 0 && r !== void 0 ? {
71
+ year: t,
72
+ month: n,
73
+ day: r
74
+ } : null;
75
+ }
76
+ function m(e) {
77
+ let { hour: t, minute: n, second: r = 0 } = e;
78
+ return t !== void 0 && n !== void 0 ? {
79
+ hour: t,
80
+ minute: n,
81
+ second: r
82
+ } : null;
83
+ }
84
+ function h(e, t, n, r) {
85
+ let [i, a] = o(() => t(e)), [s, c] = o(e);
86
+ return e !== s && (c(e), a(t(e))), [i, (i) => {
87
+ let o = n(i);
88
+ a(o ? t(o) : i), o !== e && (c(o), r(o));
89
+ }];
90
+ }
91
+ function g(e, n, r) {
92
+ switch (e) {
93
+ case "year": return {
94
+ min: 1,
95
+ max: 9999
96
+ };
97
+ case "month": return {
98
+ min: 1,
99
+ max: 12
100
+ };
101
+ case "day": return {
102
+ min: 1,
103
+ max: n.month === void 0 ? 31 : t(n.year ?? 2024, n.month)
104
+ };
105
+ case "hour": return r === 12 ? {
106
+ min: 1,
107
+ max: 12
108
+ } : {
109
+ min: 0,
110
+ max: 23
111
+ };
112
+ case "minute":
113
+ case "second": return {
114
+ min: 0,
115
+ max: 59
116
+ };
117
+ case "dayPeriod": return {
118
+ min: 0,
119
+ max: 1
120
+ };
121
+ }
122
+ }
123
+ function _(e) {
124
+ return e.hour === void 0 ? e.period === void 0 ? void 0 : e.period === "pm" : e.hour >= 12;
125
+ }
126
+ function v(e, t, n) {
127
+ if (e === "dayPeriod") {
128
+ let e = _(t);
129
+ return e === void 0 ? void 0 : +!!e;
130
+ }
131
+ let r = t[e];
132
+ return e === "hour" && n === 12 && r !== void 0 ? r % 12 || 12 : r;
133
+ }
134
+ function y(e, t) {
135
+ return Object.fromEntries(Object.entries(e).filter(([e]) => e !== t));
136
+ }
137
+ function b(e, n, r, i) {
138
+ let a = { ...e };
139
+ if (n === "dayPeriod") {
140
+ let e = r === 1;
141
+ if (a.hour !== void 0) a.hour = a.hour % 12 + (e ? 12 : 0);
142
+ else if (r === void 0) return y(a, "period");
143
+ else a.period = e ? "pm" : "am";
144
+ return a;
145
+ }
146
+ return r === void 0 ? (n === "hour" && a.hour !== void 0 && i === 12 && (a.period = a.hour >= 12 ? "pm" : "am"), a = y(a, n)) : n === "hour" && i === 12 ? (a.hour = r % 12 + (_(e) ? 12 : 0), a = y(a, "period")) : a[n] = r, a.day !== void 0 && a.month !== void 0 && (a.day = Math.min(a.day, t(a.year ?? 2024, a.month))), a;
147
+ }
148
+ var x = /* @__PURE__ */ new Set([
149
+ "/",
150
+ "-",
151
+ ".",
152
+ ":",
153
+ ",",
154
+ " "
155
+ ]), S = i(function({ pattern: e, draft: t, onDraftChange: i, hourCycle: c, periodNames: l, labels: d, reference: f, firstId: p, disabled: m = !1, readOnly: h = !1, invalid: _ = !1, required: y = !1, describedBy: S, onFocus: C, onBlur: w }, T) {
156
+ let [E, D] = o(null), O = a(null), k = (e) => {
157
+ O.current = e, D(e);
158
+ }, A = !m && !h, j = e.flatMap((e) => e.type === "literal" ? [] : [e.type]), M = (e, t) => {
159
+ let n = Array.from(e.parentElement?.querySelectorAll("[data-segment]") ?? []);
160
+ n[n.indexOf(e) + t]?.focus();
161
+ }, N = (e, n) => {
162
+ i(b(t, e, n, c));
163
+ }, P = () => {
164
+ let e = O.current;
165
+ e && (e.type === "year" && Number(e.text) >= 1 && N("year", Number(e.text)), k(null));
166
+ }, F = (e, n, r) => {
167
+ let { min: i, max: a } = g(e, t, c), o = e === "year" ? 4 : 2, s = O.current, l = (s?.type === e ? s.text : "") + n;
168
+ (Number(l) > a || l.length > o) && (l = n);
169
+ let u = Number(l), d = l.length >= o || u * 10 > a;
170
+ e === "year" ? d && N(e, Math.max(u, i)) : u >= i && N(e, u), d && (e !== "year" || u >= i) ? (k(null), M(r, 1)) : k({
171
+ type: e,
172
+ text: l
173
+ });
174
+ }, I = (e, n) => {
175
+ k(null);
176
+ let r = v(e, t, c), { min: i, max: a } = g(e, t, c);
177
+ if (r === void 0) {
178
+ N(e, v(e, f, c) ?? i);
179
+ return;
180
+ }
181
+ if (e === "year") {
182
+ N(e, Math.min(a, Math.max(i, r + n)));
183
+ return;
184
+ }
185
+ let o = a - i + 1;
186
+ N(e, ((r - i + n) % o + o) % o + i);
187
+ }, L = (e, n, r) => {
188
+ let i = O.current;
189
+ if (i?.type === e && i.text.length > 1 && r === "Backspace") {
190
+ let n = i.text.slice(0, -1);
191
+ k({
192
+ type: e,
193
+ text: n
194
+ }), e !== "year" && Number(n) >= g(e, t, c).min && N(e, Number(n));
195
+ return;
196
+ }
197
+ if (v(e, t, c) !== void 0 || i?.type === e) {
198
+ k(null), N(e, void 0);
199
+ return;
200
+ }
201
+ r === "Backspace" && M(n, -1);
202
+ }, R = (e) => {
203
+ let t = e.toLowerCase(), [n, r] = l.map((e) => e.toLowerCase());
204
+ n?.startsWith(t) && !r?.startsWith(t) ? N("dayPeriod", 0) : r?.startsWith(t) && !n?.startsWith(t) ? N("dayPeriod", 1) : t === "a" ? N("dayPeriod", 0) : t === "p" && N("dayPeriod", 1);
205
+ }, z = (e, n) => {
206
+ let { key: r } = n, i = n.currentTarget;
207
+ if (n.metaKey || n.ctrlKey || n.altKey) return;
208
+ if (r === "ArrowLeft" || r === "ArrowRight") {
209
+ n.preventDefault(), P(), M(i, r === "ArrowRight" ? 1 : -1);
210
+ return;
211
+ }
212
+ if (r === "Tab" || r === "Escape") return;
213
+ if (r === "Enter") {
214
+ n.preventDefault(), P();
215
+ return;
216
+ }
217
+ if (!A) {
218
+ r.length === 1 && n.preventDefault();
219
+ return;
220
+ }
221
+ let { min: a, max: o } = g(e, t, c);
222
+ switch (r) {
223
+ case "ArrowUp":
224
+ case "ArrowDown":
225
+ n.preventDefault(), I(e, r === "ArrowUp" ? 1 : -1);
226
+ return;
227
+ case "PageUp":
228
+ case "PageDown": {
229
+ n.preventDefault();
230
+ let t = e === "year" || e === "minute" || e === "second" ? 10 : 1;
231
+ I(e, r === "PageUp" ? t : -t);
232
+ return;
233
+ }
234
+ case "Home":
235
+ case "End":
236
+ n.preventDefault(), k(null), N(e, r === "Home" ? a : o);
237
+ return;
238
+ case "Backspace":
239
+ case "Delete":
240
+ n.preventDefault(), L(e, i, r);
241
+ return;
242
+ }
243
+ if (r.length === 1) {
244
+ if (n.preventDefault(), e === "dayPeriod") {
245
+ /\p{L}/u.test(r) ? R(r) : x.has(r) && M(i, 1);
246
+ return;
247
+ }
248
+ /^\d$/.test(r) ? F(e, r, i) : x.has(r) && v(e, t, c) !== void 0 && (P(), M(i, 1));
249
+ }
250
+ }, B = (e, t) => {
251
+ if (t.preventDefault(), !A) return;
252
+ let n = t.nativeEvent.data ?? "";
253
+ for (let r of n) e === "dayPeriod" ? R(r) : /\d/.test(r) && F(e, r, t.currentTarget);
254
+ }, V = (e) => {
255
+ if (e.preventDefault(), !A) return;
256
+ let n = e.clipboardData.getData("text"), r = (n.match(/\d+/g) ?? []).map(Number);
257
+ if (r.length === 0) return;
258
+ let a = /^\s*\d{4}-\d{1,2}-\d{1,2}/.test(n), o = a ? [
259
+ "year",
260
+ "month",
261
+ "day",
262
+ "hour",
263
+ "minute",
264
+ "second"
265
+ ].filter((e) => j.includes(e)) : j.filter((e) => e !== "dayPeriod"), s = /\d:\d/.test(n), l = !a && s && !/\d[/.-]\d/.test(n) ? o.findIndex((e) => !u.has(e)) : 0, d = { ...t };
266
+ o.slice(Math.max(l, 0)).forEach((e, t) => {
267
+ let n = r[t];
268
+ if (n === void 0) return;
269
+ let { min: i, max: a } = g(e, d, c);
270
+ n >= i && n <= a && (d = b(d, e, n, c));
271
+ }), j.includes("dayPeriod") && (/p\.?\s*m/i.test(n) ? d = b(d, "dayPeriod", 1, c) : /a\.?\s*m/i.test(n) && (d = b(d, "dayPeriod", 0, c))), k(null), i(d);
272
+ }, H = (e) => {
273
+ if (E?.type === e) return {
274
+ text: E.text,
275
+ empty: !1
276
+ };
277
+ let r = v(e, t, c);
278
+ return r === void 0 ? {
279
+ text: e === "dayPeriod" ? l[0] : d[`${e}Placeholder`],
280
+ empty: !0
281
+ } : e === "dayPeriod" ? {
282
+ text: l[r] ?? "",
283
+ empty: !1
284
+ } : e === "year" ? {
285
+ text: n(r, 4),
286
+ empty: !1
287
+ } : {
288
+ text: n(r),
289
+ empty: !1
290
+ };
291
+ }, U = e.findIndex((e) => e.type !== "literal");
292
+ return /* @__PURE__ */ s("span", {
293
+ ref: T,
294
+ className: r.segments,
295
+ children: e.map((e, n) => {
296
+ if (e.type === "literal") return /* @__PURE__ */ s("span", {
297
+ className: r.literal,
298
+ "aria-hidden": "true",
299
+ children: e.value
300
+ }, n);
301
+ let i = e.type, { text: a, empty: o } = H(i), u = v(i, t, c), { min: f, max: b } = g(i, t, c), x = u === void 0 ? d.empty : i === "dayPeriod" ? l[u] ?? "" : String(u);
302
+ return /* @__PURE__ */ s("span", {
303
+ id: n === U ? p : void 0,
304
+ role: "spinbutton",
305
+ className: r.segment,
306
+ "data-segment": i,
307
+ "data-placeholder": o || void 0,
308
+ tabIndex: m ? void 0 : 0,
309
+ contentEditable: A,
310
+ suppressContentEditableWarning: !0,
311
+ inputMode: i === "dayPeriod" ? "text" : "numeric",
312
+ spellCheck: !1,
313
+ autoCorrect: "off",
314
+ autoCapitalize: "off",
315
+ enterKeyHint: "next",
316
+ "aria-label": d[i],
317
+ "aria-valuenow": u,
318
+ "aria-valuemin": f,
319
+ "aria-valuemax": b,
320
+ "aria-valuetext": x,
321
+ "aria-invalid": _ || void 0,
322
+ "aria-required": y || void 0,
323
+ "aria-readonly": h || void 0,
324
+ "aria-disabled": m || void 0,
325
+ "aria-describedby": S,
326
+ onKeyDown: (e) => {
327
+ z(i, e);
328
+ },
329
+ onBeforeInput: (e) => {
330
+ B(i, e);
331
+ },
332
+ onPaste: V,
333
+ onFocus: C,
334
+ onBlur: (e) => {
335
+ P(), w?.(e);
336
+ },
337
+ children: a
338
+ }, n);
339
+ })
340
+ });
341
+ });
342
+ //#endregion
343
+ export { c as DEFAULT_SEGMENT_LABELS, S as DateSegments, p as draftDate, f as draftFromParts, m as draftTime, d as segmentPattern, h as useSegmentDraft };
344
+
345
+ //# sourceMappingURL=DateSegments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateSegments.js","names":["styles","segments_module_default","DEFAULT_SEGMENT_LABELS","FIELD_TYPES","DATE_TYPES","segmentPattern","options","kind","hourCycle","granularity","parts","locale","DEFAULT_LOCALE","pattern","part","draftFromParts","date","time","draftDate","draft","year","month","day","draftTime","hour","minute","useSegmentDraft","setDraft","useState","toDraft","value","synced","setSynced","nextValue","fromDraft","next","setValue","boundsOf","type","daysInMonth","isPm","displayValue","pm","without","name","key","withValue","SEPARATOR_KEYS","DateSegments","forwardRef","typed","setTypedState","typedRef","useRef","setTyped","editable","disabled","readOnly","types","focusSibling","all","from","step","set","commitTyped","pending","typeDigit","maxLength","text","digit","max","number","done","min","target","current","reference","delta","span","erase","typePeriod","lower","char","am","periodNames","handleKeyDown","event","big","handleBeforeInput","data","handlePaste","numbers","iso","order","t","pastedTime","start","index","onDraftChange","textOf","labels","pad","firstIndex","valueText","firstId","empty","invalid","required","describedBy","onBlur"],"sources":["../../../../src/components/inputs/internal/DateSegments.tsx"],"sourcesContent":["import {\n forwardRef,\n useRef,\n useState,\n type ClipboardEvent,\n type FocusEvent,\n type SyntheticEvent,\n type KeyboardEvent,\n} from 'react'\nimport {\n DEFAULT_LOCALE,\n daysInMonth,\n pad,\n type CalendarDate,\n type TimeGranularity,\n type TimeOfDay,\n} from './dates'\nimport styles from './segments.module.css'\n\n/**\n * Segmented entry for dates and times: each part (day, month, year, hour, minute, second,\n * am/pm) is its own spin button. Typing digits fills a part and moves on once it can't take\n * another digit; arrows step it; Backspace clears it. Shared by DateInput, TimeInput,\n * DateTimeInput and DateRangePickerField (internal, not exported).\n *\n * Each part is `contenteditable` only so a phone opens its numeric keyboard: every key and\n * `beforeinput` is handled here and the DOM text never changes under React.\n */\n\nexport type SegmentField = 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second'\nexport type SegmentType = SegmentField | 'dayPeriod'\n\n/** The parts typed so far. `hour` is 0 to 23; `period` holds am/pm while the hour is empty. */\nexport type Draft = Partial<Record<SegmentField, number>> & { period?: 'am' | 'pm' }\n\nexport type SegmentPattern = ({ type: SegmentType } | { type: 'literal'; value: string })[]\n\n/** Accessible names of the parts, and the text an empty part shows. */\nexport interface SegmentLabels {\n year: string\n month: string\n day: string\n hour: string\n minute: string\n second: string\n dayPeriod: string\n /** Read for an empty part. */\n empty: string\n yearPlaceholder: string\n monthPlaceholder: string\n dayPlaceholder: string\n hourPlaceholder: string\n minutePlaceholder: string\n secondPlaceholder: string\n}\n\nexport const DEFAULT_SEGMENT_LABELS: SegmentLabels = {\n year: 'Year',\n month: 'Month',\n day: 'Day',\n hour: 'Hour',\n minute: 'Minute',\n second: 'Second',\n dayPeriod: 'AM/PM',\n empty: 'Empty',\n yearPlaceholder: 'yyyy',\n monthPlaceholder: 'mm',\n dayPlaceholder: 'dd',\n hourPlaceholder: '––',\n minutePlaceholder: '––',\n secondPlaceholder: '––',\n}\n\nconst FIELD_TYPES = new Set<string>(['year', 'month', 'day', 'hour', 'minute', 'second'])\nconst DATE_TYPES = new Set<string>(['year', 'month', 'day'])\n\n/**\n * The parts and separators for `kind`, in the locale's order: \"15/10/2026\", \"2:30 pm\",\n * \"15/10/2026, 2:30 pm\" in en-AU.\n */\nexport function segmentPattern(\n kind: 'date' | 'time' | 'datetime',\n locale: string,\n granularity: TimeGranularity,\n hourCycle: 12 | 24,\n): SegmentPattern {\n const options: Intl.DateTimeFormatOptions = {\n timeZone: 'UTC',\n calendar: 'gregory',\n numberingSystem: 'latn',\n }\n if (kind !== 'time') Object.assign(options, { year: 'numeric', month: '2-digit', day: '2-digit' })\n if (kind !== 'date') {\n Object.assign(options, {\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: hourCycle === 12 ? 'h12' : 'h23',\n })\n if (granularity === 'second') options.second = '2-digit'\n }\n let parts: Intl.DateTimeFormatPart[]\n try {\n parts = new Intl.DateTimeFormat(locale, options).formatToParts(Date.UTC(2026, 10, 22, 13, 45))\n } catch {\n parts = new Intl.DateTimeFormat(DEFAULT_LOCALE, options).formatToParts(\n Date.UTC(2026, 10, 22, 13, 45),\n )\n }\n const pattern: SegmentPattern = []\n for (const part of parts) {\n if (FIELD_TYPES.has(part.type) || part.type === 'dayPeriod')\n pattern.push({ type: part.type as SegmentType })\n else if (part.type === 'literal' && pattern.length > 0)\n pattern.push({ type: 'literal', value: part.value.replace(/[\\u200e\\u200f]/g, '') })\n }\n while (pattern.length > 0 && pattern[pattern.length - 1]?.type === 'literal') pattern.pop()\n return pattern\n}\n\n/** Whether every part in `pattern` has a value. */\nexport function isDraftComplete(draft: Draft, pattern: SegmentPattern): boolean {\n return pattern.every(\n (part) =>\n part.type === 'literal' || part.type === 'dayPeriod' || draft[part.type] !== undefined,\n )\n}\n\nexport function draftFromParts(date?: CalendarDate | null, time?: TimeOfDay | null): Draft {\n return { ...date, ...time }\n}\n\nexport function draftDate(draft: Draft): CalendarDate | null {\n const { year, month, day } = draft\n return year !== undefined && month !== undefined && day !== undefined\n ? { year, month, day }\n : null\n}\n\nexport function draftTime(draft: Draft): TimeOfDay | null {\n const { hour, minute, second = 0 } = draft\n return hour !== undefined && minute !== undefined ? { hour, minute, second } : null\n}\n\n/**\n * Value ↔ draft for a segmented control. The draft holds partial entry (a day and month with\n * no year yet); the value only changes once the draft is complete, or empties when a complete\n * draft loses a part. A new value from outside (controlled, or a calendar pick) resets it.\n */\nexport function useSegmentDraft(\n value: string,\n toDraft: (value: string) => Draft,\n fromDraft: (draft: Draft) => string,\n setValue: (value: string) => void,\n): [Draft, (next: Draft) => void] {\n const [draft, setDraft] = useState<Draft>(() => toDraft(value))\n const [synced, setSynced] = useState(value)\n if (value !== synced) {\n setSynced(value)\n setDraft(toDraft(value))\n }\n const update = (next: Draft) => {\n const nextValue = fromDraft(next)\n setDraft(nextValue ? toDraft(nextValue) : next)\n if (nextValue !== value) {\n setSynced(nextValue)\n setValue(nextValue)\n }\n }\n return [draft, update]\n}\n\ninterface Bounds {\n min: number\n max: number\n}\n\nfunction boundsOf(type: SegmentType, draft: Draft, hourCycle: 12 | 24): Bounds {\n switch (type) {\n case 'year':\n return { min: 1, max: 9999 }\n case 'month':\n return { min: 1, max: 12 }\n case 'day':\n return {\n min: 1,\n max: draft.month === undefined ? 31 : daysInMonth(draft.year ?? 2024, draft.month),\n }\n case 'hour':\n return hourCycle === 12 ? { min: 1, max: 12 } : { min: 0, max: 23 }\n case 'minute':\n case 'second':\n return { min: 0, max: 59 }\n case 'dayPeriod':\n return { min: 0, max: 1 }\n }\n}\n\nfunction isPm(draft: Draft): boolean | undefined {\n if (draft.hour !== undefined) return draft.hour >= 12\n return draft.period === undefined ? undefined : draft.period === 'pm'\n}\n\n/** A part's value as shown: the hour on the 12-hour clock where it's in use, 0/1 for am/pm. */\nfunction displayValue(type: SegmentType, draft: Draft, hourCycle: 12 | 24): number | undefined {\n if (type === 'dayPeriod') {\n const pm = isPm(draft)\n return pm === undefined ? undefined : pm ? 1 : 0\n }\n const value = draft[type]\n if (type === 'hour' && hourCycle === 12 && value !== undefined) return value % 12 || 12\n return value\n}\n\nfunction without(draft: Draft, key: keyof Draft): Draft {\n return Object.fromEntries(Object.entries(draft).filter(([name]) => name !== key))\n}\n\n/** Sets a part from its shown value, keeping the hour and am/pm consistent and the day real. */\nfunction withValue(\n draft: Draft,\n type: SegmentType,\n value: number | undefined,\n hourCycle: 12 | 24,\n): Draft {\n let next: Draft = { ...draft }\n if (type === 'dayPeriod') {\n const pm = value === 1\n if (next.hour !== undefined) next.hour = (next.hour % 12) + (pm ? 12 : 0)\n else if (value === undefined) return without(next, 'period')\n else next.period = pm ? 'pm' : 'am'\n return next\n }\n if (value === undefined) {\n if (type === 'hour' && next.hour !== undefined && hourCycle === 12)\n next.period = next.hour >= 12 ? 'pm' : 'am'\n next = without(next, type)\n } else if (type === 'hour' && hourCycle === 12) {\n next.hour = (value % 12) + (isPm(draft) ? 12 : 0)\n next = without(next, 'period')\n } else {\n next[type] = value\n }\n if (next.day !== undefined && next.month !== undefined) {\n next.day = Math.min(next.day, daysInMonth(next.year ?? 2024, next.month))\n }\n return next\n}\n\ninterface Typed {\n type: SegmentType\n text: string\n}\n\nconst SEPARATOR_KEYS = new Set(['/', '-', '.', ':', ',', ' '])\n\nexport interface DateSegmentsProps {\n pattern: SegmentPattern\n draft: Draft\n onDraftChange: (next: Draft) => void\n hourCycle: 12 | 24\n /** The locale's am and pm markers. */\n periodNames: [string, string]\n labels: SegmentLabels\n /** What an arrow key starts an empty part from (today, now). */\n reference: Draft\n /** Id of the first part, which the field label points at. */\n firstId?: string\n disabled?: boolean\n readOnly?: boolean\n invalid?: boolean\n required?: boolean\n describedBy?: string\n onFocus?: (event: FocusEvent<HTMLElement>) => void\n onBlur?: (event: FocusEvent<HTMLElement>) => void\n}\n\n/** The parts and separators. The caller supplies the box and the `group` role around it. */\nexport const DateSegments = forwardRef<HTMLSpanElement, DateSegmentsProps>(function DateSegments(\n {\n pattern,\n draft,\n onDraftChange,\n hourCycle,\n periodNames,\n labels,\n reference,\n firstId,\n disabled = false,\n readOnly = false,\n invalid = false,\n required = false,\n describedBy,\n onFocus,\n onBlur,\n },\n ref,\n) {\n // Digits typed into the focused part so far (\"1\" waiting for a second digit of the day).\n // Read through the ref in handlers: focusing the next part blurs this one synchronously,\n // before the state update lands.\n const [typed, setTypedState] = useState<Typed | null>(null)\n const typedRef = useRef<Typed | null>(null)\n const setTyped = (next: Typed | null) => {\n typedRef.current = next\n setTypedState(next)\n }\n const editable = !disabled && !readOnly\n const types = pattern.flatMap((part) => (part.type === 'literal' ? [] : [part.type]))\n\n const focusSibling = (from: HTMLElement, step: 1 | -1) => {\n const all = Array.from(\n from.parentElement?.querySelectorAll<HTMLElement>('[data-segment]') ?? [],\n )\n all[all.indexOf(from) + step]?.focus()\n }\n\n const set = (type: SegmentType, value: number | undefined) => {\n onDraftChange(withValue(draft, type, value, hourCycle))\n }\n\n const commitTyped = () => {\n const pending = typedRef.current\n if (!pending) return\n if (pending.type === 'year' && Number(pending.text) >= 1) set('year', Number(pending.text))\n setTyped(null)\n }\n\n const typeDigit = (type: SegmentType, digit: string, target: HTMLElement) => {\n const { min, max } = boundsOf(type, draft, hourCycle)\n const maxLength = type === 'year' ? 4 : 2\n const pending = typedRef.current\n let text = (pending?.type === type ? pending.text : '') + digit\n if (Number(text) > max || text.length > maxLength) text = digit\n const number = Number(text)\n const done = text.length >= maxLength || number * 10 > max\n if (type === 'year') {\n if (done) set(type, Math.max(number, min))\n } else if (number >= min) {\n set(type, number)\n }\n if (done && (type !== 'year' || number >= min)) {\n setTyped(null)\n focusSibling(target, 1)\n } else {\n setTyped({ type, text })\n }\n }\n\n const step = (type: SegmentType, delta: number) => {\n setTyped(null)\n const current = displayValue(type, draft, hourCycle)\n const { min, max } = boundsOf(type, draft, hourCycle)\n if (current === undefined) {\n set(type, displayValue(type, reference, hourCycle) ?? min)\n return\n }\n if (type === 'year') {\n set(type, Math.min(max, Math.max(min, current + delta)))\n return\n }\n const span = max - min + 1\n set(type, ((((current - min + delta) % span) + span) % span) + min)\n }\n\n const erase = (type: SegmentType, target: HTMLElement, key: string) => {\n const pending = typedRef.current\n if (pending?.type === type && pending.text.length > 1 && key === 'Backspace') {\n const text = pending.text.slice(0, -1)\n setTyped({ type, text })\n if (type !== 'year' && Number(text) >= boundsOf(type, draft, hourCycle).min)\n set(type, Number(text))\n return\n }\n if (displayValue(type, draft, hourCycle) !== undefined || pending?.type === type) {\n setTyped(null)\n set(type, undefined)\n return\n }\n if (key === 'Backspace') focusSibling(target, -1)\n }\n\n const typePeriod = (char: string) => {\n const lower = char.toLowerCase()\n const [am, pm] = periodNames.map((name) => name.toLowerCase())\n if (am?.startsWith(lower) && !pm?.startsWith(lower)) set('dayPeriod', 0)\n else if (pm?.startsWith(lower) && !am?.startsWith(lower)) set('dayPeriod', 1)\n else if (lower === 'a') set('dayPeriod', 0)\n else if (lower === 'p') set('dayPeriod', 1)\n }\n\n const handleKeyDown = (type: SegmentType, event: KeyboardEvent<HTMLElement>) => {\n const { key } = event\n const target = event.currentTarget\n if (event.metaKey || event.ctrlKey || event.altKey) return\n if (key === 'ArrowLeft' || key === 'ArrowRight') {\n event.preventDefault()\n commitTyped()\n focusSibling(target, key === 'ArrowRight' ? 1 : -1)\n return\n }\n if (key === 'Tab' || key === 'Escape') return\n if (key === 'Enter') {\n // Never a newline in the part; let a form listen for it on the way up.\n event.preventDefault()\n commitTyped()\n return\n }\n if (!editable) {\n if (key.length === 1) event.preventDefault()\n return\n }\n const { min, max } = boundsOf(type, draft, hourCycle)\n switch (key) {\n case 'ArrowUp':\n case 'ArrowDown':\n event.preventDefault()\n step(type, key === 'ArrowUp' ? 1 : -1)\n return\n case 'PageUp':\n case 'PageDown': {\n event.preventDefault()\n const big = type === 'year' ? 10 : type === 'minute' || type === 'second' ? 10 : 1\n step(type, key === 'PageUp' ? big : -big)\n return\n }\n case 'Home':\n case 'End':\n event.preventDefault()\n setTyped(null)\n set(type, key === 'Home' ? min : max)\n return\n case 'Backspace':\n case 'Delete':\n event.preventDefault()\n erase(type, target, key)\n return\n }\n if (key.length !== 1) return\n event.preventDefault()\n if (type === 'dayPeriod') {\n if (/\\p{L}/u.test(key)) typePeriod(key)\n else if (SEPARATOR_KEYS.has(key)) focusSibling(target, 1)\n return\n }\n if (/^\\d$/.test(key)) typeDigit(type, key, target)\n else if (SEPARATOR_KEYS.has(key) && displayValue(type, draft, hourCycle) !== undefined) {\n commitTyped()\n focusSibling(target, 1)\n }\n }\n\n // Touch keyboards send `beforeinput` without a usable keydown.\n const handleBeforeInput = (type: SegmentType, event: SyntheticEvent<HTMLElement>) => {\n event.preventDefault()\n if (!editable) return\n const data = (event.nativeEvent as InputEvent).data ?? ''\n for (const char of data) {\n if (type === 'dayPeriod') typePeriod(char)\n else if (/\\d/.test(char)) typeDigit(type, char, event.currentTarget)\n }\n }\n\n // Pasting \"2026-10-15\", \"15/10/2026\" or \"14:30\" fills every part it can.\n const handlePaste = (event: ClipboardEvent<HTMLElement>) => {\n event.preventDefault()\n if (!editable) return\n const text = event.clipboardData.getData('text')\n const numbers = (text.match(/\\d+/g) ?? []).map(Number)\n if (numbers.length === 0) return\n const iso = /^\\s*\\d{4}-\\d{1,2}-\\d{1,2}/.test(text)\n const order = iso\n ? (['year', 'month', 'day', 'hour', 'minute', 'second'] as const).filter((t) =>\n types.includes(t),\n )\n : types.filter((t): t is SegmentField => t !== 'dayPeriod')\n const pastedTime = /\\d:\\d/.test(text)\n const start =\n !iso && pastedTime && !/\\d[/.-]\\d/.test(text) ? order.findIndex((t) => !DATE_TYPES.has(t)) : 0\n let next: Draft = { ...draft }\n order.slice(Math.max(start, 0)).forEach((type, index) => {\n const number = numbers[index]\n if (number === undefined) return\n const { min, max } = boundsOf(type, next, hourCycle)\n if (number >= min && number <= max) next = withValue(next, type, number, hourCycle)\n })\n if (types.includes('dayPeriod')) {\n if (/p\\.?\\s*m/i.test(text)) next = withValue(next, 'dayPeriod', 1, hourCycle)\n else if (/a\\.?\\s*m/i.test(text)) next = withValue(next, 'dayPeriod', 0, hourCycle)\n }\n setTyped(null)\n onDraftChange(next)\n }\n\n const textOf = (type: SegmentType): { text: string; empty: boolean } => {\n if (typed?.type === type) return { text: typed.text, empty: false }\n const value = displayValue(type, draft, hourCycle)\n if (value === undefined) {\n const placeholder = type === 'dayPeriod' ? periodNames[0] : labels[`${type}Placeholder`]\n return { text: placeholder, empty: true }\n }\n if (type === 'dayPeriod') return { text: periodNames[value] ?? '', empty: false }\n if (type === 'year') return { text: pad(value, 4), empty: false }\n return { text: pad(value), empty: false }\n }\n\n const firstIndex = pattern.findIndex((part) => part.type !== 'literal')\n return (\n <span ref={ref} className={styles.segments}>\n {pattern.map((part, index) => {\n if (part.type === 'literal') {\n return (\n <span key={index} className={styles.literal} aria-hidden=\"true\">\n {part.value}\n </span>\n )\n }\n const type = part.type\n const { text, empty } = textOf(type)\n const value = displayValue(type, draft, hourCycle)\n const { min, max } = boundsOf(type, draft, hourCycle)\n const valueText =\n value === undefined\n ? labels.empty\n : type === 'dayPeriod'\n ? (periodNames[value] ?? '')\n : String(value)\n return (\n // A disabled part leaves the tab order, as a disabled native input does.\n // eslint-disable-next-line jsx-a11y/interactive-supports-focus\n <span\n key={index}\n id={index === firstIndex ? firstId : undefined}\n role=\"spinbutton\"\n className={styles.segment}\n data-segment={type}\n data-placeholder={empty || undefined}\n tabIndex={disabled ? undefined : 0}\n contentEditable={editable}\n suppressContentEditableWarning\n inputMode={type === 'dayPeriod' ? 'text' : 'numeric'}\n spellCheck={false}\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n enterKeyHint=\"next\"\n aria-label={labels[type]}\n aria-valuenow={value}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuetext={valueText}\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n aria-readonly={readOnly || undefined}\n aria-disabled={disabled || undefined}\n aria-describedby={describedBy}\n onKeyDown={(event) => {\n handleKeyDown(type, event)\n }}\n onBeforeInput={(event) => {\n handleBeforeInput(type, event)\n }}\n onPaste={handlePaste}\n onFocus={onFocus}\n onBlur={(event) => {\n commitTyped()\n onBlur?.(event)\n }}\n >\n {text}\n </span>\n )\n })}\n </span>\n )\n})\n"],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Date and time helpers shared by Calendar and the date, time and date-time inputs.
3
+ *
4
+ * Values travel as ISO strings (`2026-10-15`, `14:30`, `2026-10-15T14:30`), never `Date`
5
+ * objects. A `CalendarDate` is a civil date with no time zone: arithmetic runs on day numbers
6
+ * through `Date.UTC`, so a daylight-saving change can never move a day. Time zones only matter
7
+ * for an instant (`…Z`), and those go through `Intl.DateTimeFormat` (ADR 0042).
8
+ */
9
+ /** A civil date. `month` is 1 to 12. */
10
+ export interface CalendarDate {
11
+ year: number;
12
+ month: number;
13
+ day: number;
14
+ }
15
+ /** A time of day on the 24-hour clock. */
16
+ export interface TimeOfDay {
17
+ hour: number;
18
+ minute: number;
19
+ second: number;
20
+ }
21
+ /** The smallest unit a time value keeps. */
22
+ export type TimeGranularity = 'minute' | 'second';
23
+ export declare const pad: (value: number, length?: number) => string;
24
+ export declare function isLeapYear(year: number): boolean;
25
+ export declare function daysInMonth(year: number, month: number): number;
26
+ /** `YYYY-MM-DD` → a date, or `null` when it isn't one (`2026-02-30` isn't). */
27
+ export declare function parseDate(text: string): CalendarDate | null;
28
+ export declare function formatDate(date: CalendarDate): string;
29
+ /** `HH:mm` or `HH:mm:ss` (fractions ignored) → a time, or `null`. */
30
+ export declare function parseTime(text: string): TimeOfDay | null;
31
+ export declare function formatTime(time: TimeOfDay, granularity?: TimeGranularity): string;
32
+ /** Days since 1970-01-01. */
33
+ export declare function toDayNumber(date: CalendarDate): number;
34
+ export declare function fromDayNumber(days: number): CalendarDate;
35
+ export declare function compareDates(a: CalendarDate, b: CalendarDate): number;
36
+ export declare function isSameDay(a: CalendarDate | null | undefined, b: CalendarDate | null | undefined): boolean;
37
+ export declare function addDays(date: CalendarDate, days: number): CalendarDate;
38
+ /** Moves by whole months, keeping the day where the month has it (31 Jan + 1 month = 28 Feb). */
39
+ export declare function addMonths(date: CalendarDate, months: number): CalendarDate;
40
+ /** 0 (Sunday) to 6 (Saturday). */
41
+ export declare function dayOfWeek(date: CalendarDate): number;
42
+ export declare function clampDate(date: CalendarDate, min: CalendarDate | null, max: CalendarDate | null): CalendarDate;
43
+ /** The wall-clock date and time at instant `ms` in `timeZone` (an IANA name or `UTC`). */
44
+ export declare function zonedParts(ms: number, timeZone: string): {
45
+ date: CalendarDate;
46
+ time: TimeOfDay;
47
+ };
48
+ /**
49
+ * The instant a wall-clock time in `timeZone` names. A time skipped by a daylight-saving change
50
+ * moves forward with the clocks; a repeated one resolves to its first occurrence.
51
+ */
52
+ export declare function zonedToInstant(date: CalendarDate, time: TimeOfDay, timeZone: string): number;
53
+ /** Today's date, in `timeZone` or the runtime's own zone. */
54
+ export declare function todayIn(timeZone?: string, now?: number): CalendarDate;
55
+ /** Whether `timeZone` is one this runtime knows. */
56
+ export declare function isValidTimeZone(timeZone: string): boolean;
57
+ export interface DateTimeParts {
58
+ date: CalendarDate;
59
+ time: TimeOfDay;
60
+ }
61
+ /**
62
+ * Reads a date-time value. With `timeZone`, the value is an instant: a string with `Z` or an
63
+ * offset is converted to the wall clock there, and one without is taken as that wall clock.
64
+ * Without it, the value is a wall clock (`2026-10-15T14:30`, like `datetime-local`), and an
65
+ * instant is shown in the runtime's own zone.
66
+ */
67
+ export declare function parseDateTime(text: string, timeZone?: string): DateTimeParts | null;
68
+ /**
69
+ * Writes a date-time value: a wall clock (`2026-10-15T14:30`) without `timeZone`, or the UTC
70
+ * instant (`2026-10-15T03:30:00Z`) that wall clock names in `timeZone`.
71
+ */
72
+ export declare function formatDateTime(parts: DateTimeParts, granularity?: TimeGranularity, timeZone?: string): string;
73
+ /** The date part of a date or date-time value, for calendar comparisons. */
74
+ export declare function dateOf(text: string, timeZone?: string): CalendarDate | null;
75
+ export declare const DEFAULT_LOCALE = "en-AU";
76
+ /** The first day of the week for `locale`: 0 (Sunday) to 6 (Saturday). */
77
+ export declare function defaultFirstDayOfWeek(locale: string): number;
78
+ /** 12 or 24, from the locale's own clock. */
79
+ export declare function defaultHourCycle(locale: string): 12 | 24;
80
+ export type DateSegmentType = 'year' | 'month' | 'day';
81
+ export type DatePattern = ({
82
+ type: DateSegmentType;
83
+ } | {
84
+ type: 'literal';
85
+ value: string;
86
+ })[];
87
+ /** The order of day, month and year for `locale`, with the separators between them. */
88
+ export declare function datePattern(locale: string): DatePattern;
89
+ /** "October 2026". */
90
+ export declare function formatMonthYear(locale: string, year: number, month: number): string;
91
+ /** "Thursday 15 October 2026": a day's accessible name. */
92
+ export declare function formatFullDate(locale: string, date: CalendarDate): string;
93
+ /** Seven weekday names starting at `firstDay`, short ("Mon") and long ("Monday"). */
94
+ export declare function weekdayNames(locale: string, firstDay: number): {
95
+ short: string;
96
+ long: string;
97
+ }[];
98
+ /** The locale's AM and PM markers ("am", "pm" in en-AU). */
99
+ export declare function dayPeriodNames(locale: string): [string, string];
100
+ /** A short name for `timeZone` at instant `ms` ("AEDT", "UTC", "GMT+10"). */
101
+ export declare function timeZoneName(locale: string, timeZone: string, ms?: number): string;