@k2b/ui 0.44.0 → 0.45.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 (123) hide show
  1. package/dist/browser/actions/Tabs.js +3 -4
  2. package/dist/browser/actions/Tabs.js.map +1 -1
  3. package/dist/browser/actions/menu-sheet.js +2 -3
  4. package/dist/browser/actions/menu-sheet.js.map +1 -1
  5. package/dist/browser/actions/phone-sheet.js +4 -0
  6. package/dist/browser/actions/phone-sheet.js.map +1 -0
  7. package/dist/browser/content/DataTable.js +47 -51
  8. package/dist/browser/content/DataTable.js.map +1 -1
  9. package/dist/browser/feedback/dialog-core.js +5 -1
  10. package/dist/browser/feedback/dialog-core.js.map +1 -1
  11. package/dist/browser/feedback/dialog-tone.js +26 -0
  12. package/dist/browser/feedback/dialog-tone.js.map +1 -0
  13. package/dist/browser/feedback/index.js.map +1 -1
  14. package/dist/browser/feedback/prompt-confirm.js +223 -0
  15. package/dist/browser/feedback/prompt-confirm.js.map +1 -0
  16. package/dist/browser/feedback/prompts.js +195 -343
  17. package/dist/browser/feedback/prompts.js.map +1 -1
  18. package/dist/browser/inputs/ChoiceList.js +45 -17
  19. package/dist/browser/inputs/ChoiceList.js.map +1 -1
  20. package/dist/browser/inputs/DatePicker.js +1647 -334
  21. package/dist/browser/inputs/DatePicker.js.map +1 -1
  22. package/dist/browser/inputs/TextInput.js +5 -4
  23. package/dist/browser/inputs/TextInput.js.map +1 -1
  24. package/dist/browser/inputs/date-input-messages.js +128 -0
  25. package/dist/browser/inputs/date-input-messages.js.map +1 -0
  26. package/dist/browser/inputs/date-input-status.js +132 -0
  27. package/dist/browser/inputs/date-input-status.js.map +1 -0
  28. package/dist/browser/inputs/date-input.js +334 -0
  29. package/dist/browser/inputs/date-input.js.map +1 -0
  30. package/dist/browser/inputs/date-sheet.js +49 -0
  31. package/dist/browser/inputs/date-sheet.js.map +1 -0
  32. package/dist/browser/internal/reveal-in-scroller.js +28 -0
  33. package/dist/browser/internal/reveal-in-scroller.js.map +1 -0
  34. package/dist/browser/intl/messages.js +6 -0
  35. package/dist/browser/intl/messages.js.map +1 -1
  36. package/dist/browser/layout/AppWorkspace.js +536 -512
  37. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  38. package/dist/browser/layout/BottomSheet.js +3 -0
  39. package/dist/browser/layout/BottomSheet.js.map +1 -1
  40. package/dist/browser/layout/PanelDialog.js +167 -132
  41. package/dist/browser/layout/PanelDialog.js.map +1 -1
  42. package/dist/browser/layout/Settings.js +175 -139
  43. package/dist/browser/layout/Settings.js.map +1 -1
  44. package/dist/browser/layout/SettingsModal.js +2 -4
  45. package/dist/browser/layout/SettingsModal.js.map +1 -1
  46. package/dist/browser/layout/index.js.map +1 -1
  47. package/dist/browser/surfaces/StatusBadge.js +47 -14
  48. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  49. package/dist/browser/text-editor/TextEditor.js +7 -0
  50. package/dist/browser/text-editor/TextEditor.js.map +1 -1
  51. package/dist/ssr/actions/Tabs.js +3 -4
  52. package/dist/ssr/actions/Tabs.js.map +1 -1
  53. package/dist/ssr/actions/menu-sheet.js +2 -3
  54. package/dist/ssr/actions/menu-sheet.js.map +1 -1
  55. package/dist/ssr/actions/phone-sheet.js +4 -0
  56. package/dist/ssr/actions/phone-sheet.js.map +1 -0
  57. package/dist/ssr/content/DataTable.js +1 -2
  58. package/dist/ssr/content/DataTable.js.map +1 -1
  59. package/dist/ssr/feedback/dialog-core.js +5 -1
  60. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  61. package/dist/ssr/feedback/dialog-tone.js +26 -0
  62. package/dist/ssr/feedback/dialog-tone.js.map +1 -0
  63. package/dist/ssr/feedback/index.js.map +1 -1
  64. package/dist/ssr/feedback/prompt-confirm.js +123 -0
  65. package/dist/ssr/feedback/prompt-confirm.js.map +1 -0
  66. package/dist/ssr/feedback/prompts.js +60 -132
  67. package/dist/ssr/feedback/prompts.js.map +1 -1
  68. package/dist/ssr/inputs/ChoiceList.js +29 -9
  69. package/dist/ssr/inputs/ChoiceList.js.map +1 -1
  70. package/dist/ssr/inputs/DatePicker.js +1183 -166
  71. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  72. package/dist/ssr/inputs/TextInput.js +5 -4
  73. package/dist/ssr/inputs/TextInput.js.map +1 -1
  74. package/dist/ssr/inputs/date-input-messages.js +128 -0
  75. package/dist/ssr/inputs/date-input-messages.js.map +1 -0
  76. package/dist/ssr/inputs/date-input-status.js +132 -0
  77. package/dist/ssr/inputs/date-input-status.js.map +1 -0
  78. package/dist/ssr/inputs/date-input.js +334 -0
  79. package/dist/ssr/inputs/date-input.js.map +1 -0
  80. package/dist/ssr/inputs/date-sheet.js +44 -0
  81. package/dist/ssr/inputs/date-sheet.js.map +1 -0
  82. package/dist/ssr/internal/reveal-in-scroller.js +28 -0
  83. package/dist/ssr/internal/reveal-in-scroller.js.map +1 -0
  84. package/dist/ssr/intl/messages.js +6 -0
  85. package/dist/ssr/intl/messages.js.map +1 -1
  86. package/dist/ssr/layout/AppWorkspace.js +44 -23
  87. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  88. package/dist/ssr/layout/BottomSheet.js +3 -0
  89. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  90. package/dist/ssr/layout/PanelDialog.js +48 -30
  91. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  92. package/dist/ssr/layout/Settings.js +34 -18
  93. package/dist/ssr/layout/Settings.js.map +1 -1
  94. package/dist/ssr/layout/SettingsModal.js +2 -4
  95. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  96. package/dist/ssr/layout/index.js.map +1 -1
  97. package/dist/ssr/surfaces/StatusBadge.js +26 -8
  98. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  99. package/dist/ssr/text-editor/TextEditor.js +7 -0
  100. package/dist/ssr/text-editor/TextEditor.js.map +1 -1
  101. package/dist/styles.css +1 -1
  102. package/dist/types/actions/menu-sheet.d.ts +1 -3
  103. package/dist/types/actions/phone-sheet.d.ts +3 -0
  104. package/dist/types/feedback/dialog-tone.d.ts +10 -0
  105. package/dist/types/feedback/index.d.ts +1 -0
  106. package/dist/types/feedback/prompt-confirm.d.ts +19 -0
  107. package/dist/types/feedback/prompts.d.ts +4 -8
  108. package/dist/types/inputs/ChoiceList.d.ts +7 -3
  109. package/dist/types/inputs/DatePicker.d.ts +13 -3
  110. package/dist/types/inputs/TextInput.d.ts +1 -1
  111. package/dist/types/inputs/date-input-messages.d.ts +64 -0
  112. package/dist/types/inputs/date-input-status.d.ts +35 -0
  113. package/dist/types/inputs/date-input.d.ts +90 -0
  114. package/dist/types/inputs/date-sheet.d.ts +14 -0
  115. package/dist/types/internal/reveal-in-scroller.d.ts +6 -0
  116. package/dist/types/intl/messages.d.ts +3 -0
  117. package/dist/types/layout/AppWorkspace.d.ts +14 -0
  118. package/dist/types/layout/BottomSheet.d.ts +3 -0
  119. package/dist/types/layout/PanelDialog.d.ts +3 -0
  120. package/dist/types/layout/Settings.d.ts +17 -1
  121. package/dist/types/layout/index.d.ts +1 -1
  122. package/dist/types/surfaces/StatusBadge.d.ts +5 -0
  123. package/package.json +1 -1
@@ -0,0 +1,334 @@
1
+ /**
2
+ * Typed date input: a small, predictable grammar instead of a natural-language parser. Every input resolves to one
3
+ * calendar day (a date key such as `2026-11-11`), so the field can show the absolute date before it is committed.
4
+ *
5
+ * - Dates in the locale's order of day, month and year: `11.11.2026`, `11.11.26`, `11.11.`, `11.11`, `11/11/2026`.
6
+ * - Digits only: 1–2 digits are a day of the current month; 4, 6 or 8 digits are day, month and year without separators.
7
+ * - ISO dates (`2026-11-11`) and month names (`11. November 2026`, `Nov 11, 2026`).
8
+ * - Day words and weekdays in German and English: `heute`, `morgen`, `mi`, `wed`, `Mittwoch`. A weekday is its next
9
+ * occurrence after today; today's weekday is the same day next week.
10
+ * - One offset at the end: `[anchor] ± N [unit]`, such as `+14`, `-3`, `heute +2w`, `gestern + 34`, `mi +7`, `11.11. -3`.
11
+ * The anchor is any of the forms above; without one it is today, never the saved value.
12
+ */
13
+
14
+ /** What a word or offset meant, so the field can say it next to the resolved date. */
15
+
16
+ /** Weekday indexes count from Monday (0) to Sunday (6). */
17
+ // Pairs, not object keys: a bundler prints a key such as `übermorgen` as a bare identifier, and a script read as
18
+ // Latin-1 then stops at its first non-ASCII byte.
19
+ const DAY_WORDS = [["vorgestern", -2], ["gestern", -1], ["heute", 0], ["morgen", 1], ["übermorgen", 2], ["yesterday", -1], ["today", 0], ["tomorrow", 1]];
20
+ const WEEKDAY_NAMES = [["montag", "monday"], ["dienstag", "tuesday"], ["mittwoch", "wednesday"], ["donnerstag", "thursday"], ["freitag", "friday"], ["samstag", "saturday"], ["sonntag", "sunday"]];
21
+ /** Abbreviations are matched exactly and win over prefixes: `mo` is Monday, `mor` is morgen. */
22
+ const WEEKDAY_ABBREVIATIONS = [["mo", "mon"], ["di", "tue"], ["mi", "wed"], ["do", "thu"], ["fr", "fri"], ["sa", "sat"], ["so", "sun"]];
23
+ const MONTH_PREFIXES = [["jan", "jän"], ["feb"], ["mär", "mar", "mae"], ["apr"], ["mai", "may"], ["jun"], ["jul"], ["aug"], ["sep"], ["okt", "oct"], ["nov"], ["dez", "dec"]];
24
+ const UNITS = {
25
+ "": "day",
26
+ t: "day",
27
+ tag: "day",
28
+ tage: "day",
29
+ tagen: "day",
30
+ d: "day",
31
+ day: "day",
32
+ days: "day",
33
+ w: "week",
34
+ wo: "week",
35
+ woche: "week",
36
+ wochen: "week",
37
+ week: "week",
38
+ weeks: "week",
39
+ m: "month",
40
+ monat: "month",
41
+ monate: "month",
42
+ monaten: "month",
43
+ month: "month",
44
+ months: "month",
45
+ j: "year",
46
+ jahr: "year",
47
+ jahre: "year",
48
+ jahren: "year",
49
+ y: "year",
50
+ year: "year",
51
+ years: "year"
52
+ };
53
+
54
+ /** Right-to-left locales put direction marks between the parts of a date. */
55
+ const DIRECTION_MARKS = /[\u200e\u200f\u061c]/g;
56
+ const pad = value => String(value).padStart(2, "0");
57
+ const toKey = (year, month, day) => `${year}-${pad(month)}-${pad(day)}`;
58
+ const keyParts = key => {
59
+ const [year = 1970, month = 1, day = 1] = key.split("-").map(Number);
60
+ return [year, month, day];
61
+ };
62
+ const keyTime = key => {
63
+ const [year, month, day] = keyParts(key);
64
+ return Date.UTC(year, month - 1, day, 12);
65
+ };
66
+ const timeKey = time => {
67
+ const date = new Date(time);
68
+ return toKey(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate());
69
+ };
70
+ const daysInMonth = (year, month) => new Date(Date.UTC(year, month, 0)).getUTCDate();
71
+ export const addDaysToKey = (key, days) => timeKey(keyTime(key) + days * 86_400_000);
72
+
73
+ /** Months and years keep the day where it exists and otherwise end on the last day of the month (31.01. + 1m = 28.02.). */
74
+ export const addMonthsToKey = (key, months) => {
75
+ const [year, month, day] = keyParts(key);
76
+ const index = year * 12 + month - 1 + months;
77
+ const nextYear = Math.floor(index / 12);
78
+ const nextMonth = index % 12 + 1;
79
+ return toKey(nextYear, nextMonth, Math.min(day, daysInMonth(nextYear, nextMonth)));
80
+ };
81
+
82
+ /** Monday 0 … Sunday 6. */
83
+ export const weekdayOfKey = key => (new Date(keyTime(key)).getUTCDay() + 6) % 7;
84
+
85
+ /** Whole days from `from` to `to`. */
86
+ export const daysBetweenKeys = (from, to) => Math.round((keyTime(to) - keyTime(from)) / 86_400_000);
87
+
88
+ /**
89
+ * The editable numeric form: the locale's order and separators, but always the Gregorian calendar with Latin digits,
90
+ * so the text the field shows (`ar-EG`, `th-TH`, `fa-IR` included) is text it can read back.
91
+ */
92
+ const numericFormat = locale => new Intl.DateTimeFormat(locale, {
93
+ day: "2-digit",
94
+ month: "2-digit",
95
+ year: "numeric",
96
+ timeZone: "UTC",
97
+ calendar: "gregory",
98
+ numberingSystem: "latn"
99
+ });
100
+
101
+ /** The locale's order of day, month and year in a numeric date, read from Intl; day-month-year without data. */
102
+ export const dateOrder = locale => {
103
+ try {
104
+ const parts = numericFormat(locale).formatToParts(Date.UTC(2026, 10, 22, 12));
105
+ const order = parts.map(part => part.type).filter(type => type === "day" || type === "month" || type === "year");
106
+ return order.length === 3 ? order : ["day", "month", "year"];
107
+ } catch {
108
+ return ["day", "month", "year"];
109
+ }
110
+ };
111
+
112
+ /** The numeric form the field shows after a commit, such as `11.11.2026` or `11/11/2026`. */
113
+ export const formatDateInput = (key, locale) => numericFormat(locale).format(keyTime(key)).replace(DIRECTION_MARKS, "");
114
+
115
+ /** The placeholder pattern in the locale's order, with letters from the caller (`TT.MM.JJJJ`, `MM/DD/YYYY`). */
116
+ export const dateInputPattern = (locale, letters) => {
117
+ try {
118
+ return numericFormat(locale).formatToParts(Date.UTC(2026, 10, 22, 12)).map(part => part.type === "day" || part.type === "month" || part.type === "year" ? letters[part.type] : part.value).join("");
119
+ } catch {
120
+ return `${letters.day}.${letters.month}.${letters.year}`;
121
+ }
122
+ };
123
+ const ok = (date, note) => ({
124
+ kind: "date",
125
+ date,
126
+ note
127
+ });
128
+ const fail = error => ({
129
+ kind: "error",
130
+ error
131
+ });
132
+ const resolveYear = (text, today) => {
133
+ const [currentYear] = keyParts(today);
134
+ if (!text) return currentYear;
135
+ if (text.length === 4) return Number(text);
136
+ if (text.length === 2) {
137
+ // Two digits name the nearest year that is at most 20 years ahead: `26` is 2026, `85` is 1985.
138
+ const year = Math.floor(currentYear / 100) * 100 + Number(text);
139
+ return year > currentYear + 20 ? year - 100 : year;
140
+ }
141
+ return null;
142
+ };
143
+ const build = (day, month, yearText, today) => {
144
+ const year = resolveYear(yearText, today);
145
+ if (year === null) return fail({
146
+ code: "year"
147
+ });
148
+ if (month < 1 || month > 12) return fail({
149
+ code: "month",
150
+ month
151
+ });
152
+ const days = daysInMonth(year, month);
153
+ if (day < 1 || day > days) return fail({
154
+ code: "day",
155
+ year,
156
+ month,
157
+ days
158
+ });
159
+ return ok(toKey(year, month, day));
160
+ };
161
+
162
+ /** Maps numeric groups to day, month and year in the locale's order; two groups leave out the year. */
163
+ const fromGroups = (groups, order, today) => {
164
+ const parts = groups.length === 3 ? order : order.filter(part => part !== "year");
165
+ const value = part => groups[parts.indexOf(part)];
166
+ return build(Number(value("day")), Number(value("month")), value("year"), today);
167
+ };
168
+ const monthFromName = word => {
169
+ const cleaned = word.replace(/\./g, "");
170
+ if (cleaned.length < 3) return null;
171
+ const index = MONTH_PREFIXES.findIndex(prefixes => prefixes.some(prefix => cleaned.startsWith(prefix)));
172
+ return index < 0 ? null : index + 1;
173
+ };
174
+ const weekdayDate = (weekday, today) => {
175
+ const delta = (weekday - weekdayOfKey(today) + 7) % 7 || 7;
176
+ return ok(addDaysToKey(today, delta), {
177
+ kind: "weekday",
178
+ weekday,
179
+ nextWeek: delta === 7
180
+ });
181
+ };
182
+ const parseWord = (word, today) => {
183
+ const abbreviation = WEEKDAY_ABBREVIATIONS.findIndex(names => names.includes(word));
184
+ if (abbreviation >= 0) return weekdayDate(abbreviation, today);
185
+ const candidates = [];
186
+ for (const [name, offset] of DAY_WORDS) {
187
+ if (name === word || word.length >= 3 && name.startsWith(word)) {
188
+ candidates.push({
189
+ key: `day:${offset}`,
190
+ exact: name === word,
191
+ resolve: () => ok(addDaysToKey(today, offset), {
192
+ kind: "day",
193
+ offset
194
+ })
195
+ });
196
+ }
197
+ }
198
+ WEEKDAY_NAMES.forEach((names, weekday) => {
199
+ for (const name of names) {
200
+ if (name === word || word.length >= 3 && name.startsWith(word)) {
201
+ candidates.push({
202
+ key: `weekday:${weekday}`,
203
+ exact: name === word,
204
+ resolve: () => weekdayDate(weekday, today)
205
+ });
206
+ }
207
+ }
208
+ });
209
+ const exact = candidates.find(candidate => candidate.exact);
210
+ if (exact) return exact.resolve();
211
+ const meanings = new Set(candidates.map(candidate => candidate.key));
212
+ if (meanings.size === 1) return candidates[0].resolve();
213
+ if (meanings.size > 1) return fail({
214
+ code: "ambiguous"
215
+ });
216
+ return fail({
217
+ code: "not-a-date"
218
+ });
219
+ };
220
+ const anchorOf = result => {
221
+ if (result.note?.kind === "day") return result.note.offset === 0 ? {
222
+ kind: "today"
223
+ } : {
224
+ kind: "day",
225
+ offset: result.note.offset
226
+ };
227
+ if (result.note?.kind === "weekday") return {
228
+ kind: "weekday",
229
+ weekday: result.note.weekday
230
+ };
231
+ return {
232
+ kind: "date",
233
+ date: result.date
234
+ };
235
+ };
236
+ const applyOffset = (base, amount, unit) => {
237
+ if (unit === "day") return addDaysToKey(base, amount);
238
+ if (unit === "week") return addDaysToKey(base, amount * 7);
239
+ return addMonthsToKey(base, unit === "month" ? amount : amount * 12);
240
+ };
241
+ const OFFSET_TAIL = /([+-]) ?(\d{1,3}) ?([a-zäöü]*)\.?$/;
242
+ const parseBase = (text, today, order) => {
243
+ if (/^[a-zäöüß]+$/.test(text)) return parseWord(text, today);
244
+ // A pasted ISO date may carry a time, nothing else: "2026-11-11 nonsense" is not a date.
245
+ let match = text.match(/^(\d{4})-(\d{1,2})-(\d{1,2})(?:[t ]\d{1,2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:z|[+-]\d{2}:?\d{2})?)?$/);
246
+ if (match) return build(Number(match[3]), Number(match[2]), match[1], today);
247
+ match = text.match(/^(\d{1,2})\.? ?([a-zäöü]{3,}\.?) ?,? ?(\d{2}|\d{4})?$/);
248
+ if (match) {
249
+ const month = monthFromName(match[2]);
250
+ return month ? build(Number(match[1]), month, match[3], today) : fail({
251
+ code: "not-a-date"
252
+ });
253
+ }
254
+ match = text.match(/^([a-zäöü]{3,}\.?) ?(\d{1,2})(?:st|nd|rd|th)?,? ?(\d{2}|\d{4})?$/);
255
+ if (match) {
256
+ const month = monthFromName(match[1]);
257
+ return month ? build(Number(match[2]), month, match[3], today) : fail({
258
+ code: "not-a-date"
259
+ });
260
+ }
261
+ match = text.match(/^(\d{1,4})[.,/\- ]+(\d{1,2})(?:[.,/\- ]+(\d*))?\.?$/);
262
+ if (match) {
263
+ const groups = [match[1], match[2], ...(match[3] ? [match[3]] : [])];
264
+ if (groups[0].length > 2 && order[0] !== "year") return fail({
265
+ code: "not-a-date"
266
+ });
267
+ return fromGroups(groups, order, today);
268
+ }
269
+ if (/^\d+$/.test(text)) {
270
+ const [, currentMonth] = keyParts(today);
271
+ if (text.length <= 2) return build(Number(text), currentMonth, undefined, today);
272
+ if (text.length === 4) return fromGroups([text.slice(0, 2), text.slice(2)], order, today);
273
+ if (text.length === 6) return fromGroups([text.slice(0, 2), text.slice(2, 4), text.slice(4)], order, today);
274
+ if (text.length === 8) {
275
+ const yearFirst = order[0] === "year";
276
+ const groups = yearFirst ? [text.slice(0, 4), text.slice(4, 6), text.slice(6)] : [text.slice(0, 2), text.slice(2, 4), text.slice(4)];
277
+ return fromGroups(groups, order, today);
278
+ }
279
+ return fail({
280
+ code: "incomplete"
281
+ });
282
+ }
283
+ return fail({
284
+ code: "not-a-date"
285
+ });
286
+ };
287
+
288
+ /**
289
+ * Parses what a person typed into a date field. `today` is the current date key in the field's time zone; the result
290
+ * never depends on the clock.
291
+ */
292
+ export const parseDateInput = (raw, options) => {
293
+ const text = raw.replace(DIRECTION_MARKS, "").trim().replace(/\s+/g, " ").toLowerCase();
294
+ if (!text) return {
295
+ kind: "empty"
296
+ };
297
+ const order = dateOrder(options.locale);
298
+ const offset = text.match(OFFSET_TAIL);
299
+ if (offset) {
300
+ const head = text.slice(0, offset.index);
301
+ const anchorText = head.trim();
302
+ // `+` always starts an offset; `-` only at the start, after a space or after a word, so `11-11-2026` stays a date.
303
+ if (offset[1] === "+" || head === "" || /\s$/.test(head) || /[a-zäöüß]$/.test(anchorText)) {
304
+ const unit = UNITS[offset[3]];
305
+ if (!unit) return fail({
306
+ code: "unit"
307
+ });
308
+ const amount = Number(offset[2]) * (offset[1] === "-" ? -1 : 1);
309
+ if (!anchorText) return ok(applyOffset(options.today, amount, unit), {
310
+ kind: "offset",
311
+ anchor: {
312
+ kind: "today"
313
+ },
314
+ amount,
315
+ unit
316
+ });
317
+ const anchor = parseBase(anchorText, options.today, order);
318
+ if (anchor.kind !== "date") return anchor.kind === "empty" ? fail({
319
+ code: "not-a-date"
320
+ }) : anchor;
321
+ return ok(applyOffset(anchor.date, amount, unit), {
322
+ kind: "offset",
323
+ anchor: anchorOf(anchor),
324
+ amount,
325
+ unit
326
+ });
327
+ }
328
+ }
329
+ if (/[+-]$/.test(text)) return fail({
330
+ code: "incomplete"
331
+ });
332
+ return parseBase(text, options.today, order);
333
+ };
334
+ //# sourceMappingURL=date-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/date-input.ts"],"sourcesContent":["/**\n * Typed date input: a small, predictable grammar instead of a natural-language parser. Every input resolves to one\n * calendar day (a date key such as `2026-11-11`), so the field can show the absolute date before it is committed.\n *\n * - Dates in the locale's order of day, month and year: `11.11.2026`, `11.11.26`, `11.11.`, `11.11`, `11/11/2026`.\n * - Digits only: 1–2 digits are a day of the current month; 4, 6 or 8 digits are day, month and year without separators.\n * - ISO dates (`2026-11-11`) and month names (`11. November 2026`, `Nov 11, 2026`).\n * - Day words and weekdays in German and English: `heute`, `morgen`, `mi`, `wed`, `Mittwoch`. A weekday is its next\n * occurrence after today; today's weekday is the same day next week.\n * - One offset at the end: `[anchor] ± N [unit]`, such as `+14`, `-3`, `heute +2w`, `gestern + 34`, `mi +7`, `11.11. -3`.\n * The anchor is any of the forms above; without one it is today, never the saved value.\n */\n\nexport type DatePart = \"day\" | \"month\" | \"year\";\nexport type DateUnit = \"day\" | \"week\" | \"month\" | \"year\";\n\n/** What a word or offset meant, so the field can say it next to the resolved date. */\nexport type DateInputAnchor =\n | { kind: \"today\" }\n | { kind: \"date\"; date: string }\n | { kind: \"day\"; offset: number }\n | { kind: \"weekday\"; weekday: number };\n\nexport type DateInputNote =\n | { kind: \"day\"; offset: number }\n | { kind: \"weekday\"; weekday: number; nextWeek: boolean }\n | { kind: \"offset\"; anchor: DateInputAnchor; amount: number; unit: DateUnit };\n\nexport type DateInputError =\n | { code: \"not-a-date\" }\n | { code: \"incomplete\" }\n | { code: \"ambiguous\" }\n | { code: \"year\" }\n | { code: \"unit\" }\n | { code: \"month\"; month: number }\n | { code: \"day\"; year: number; month: number; days: number };\n\nexport type DateInputResult =\n | { kind: \"empty\" }\n | { kind: \"date\"; date: string; note?: DateInputNote }\n | { kind: \"error\"; error: DateInputError };\n\n/** Weekday indexes count from Monday (0) to Sunday (6). */\n// Pairs, not object keys: a bundler prints a key such as `übermorgen` as a bare identifier, and a script read as\n// Latin-1 then stops at its first non-ASCII byte.\nconst DAY_WORDS: readonly (readonly [string, number])[] = [\n [\"vorgestern\", -2],\n [\"gestern\", -1],\n [\"heute\", 0],\n [\"morgen\", 1],\n [\"übermorgen\", 2],\n [\"yesterday\", -1],\n [\"today\", 0],\n [\"tomorrow\", 1],\n];\nconst WEEKDAY_NAMES: readonly (readonly string[])[] = [\n [\"montag\", \"monday\"],\n [\"dienstag\", \"tuesday\"],\n [\"mittwoch\", \"wednesday\"],\n [\"donnerstag\", \"thursday\"],\n [\"freitag\", \"friday\"],\n [\"samstag\", \"saturday\"],\n [\"sonntag\", \"sunday\"],\n];\n/** Abbreviations are matched exactly and win over prefixes: `mo` is Monday, `mor` is morgen. */\nconst WEEKDAY_ABBREVIATIONS: readonly (readonly string[])[] = [\n [\"mo\", \"mon\"],\n [\"di\", \"tue\"],\n [\"mi\", \"wed\"],\n [\"do\", \"thu\"],\n [\"fr\", \"fri\"],\n [\"sa\", \"sat\"],\n [\"so\", \"sun\"],\n];\nconst MONTH_PREFIXES: readonly (readonly string[])[] = [\n [\"jan\", \"jän\"],\n [\"feb\"],\n [\"mär\", \"mar\", \"mae\"],\n [\"apr\"],\n [\"mai\", \"may\"],\n [\"jun\"],\n [\"jul\"],\n [\"aug\"],\n [\"sep\"],\n [\"okt\", \"oct\"],\n [\"nov\"],\n [\"dez\", \"dec\"],\n];\nconst UNITS: Record<string, DateUnit> = {\n \"\": \"day\",\n t: \"day\",\n tag: \"day\",\n tage: \"day\",\n tagen: \"day\",\n d: \"day\",\n day: \"day\",\n days: \"day\",\n w: \"week\",\n wo: \"week\",\n woche: \"week\",\n wochen: \"week\",\n week: \"week\",\n weeks: \"week\",\n m: \"month\",\n monat: \"month\",\n monate: \"month\",\n monaten: \"month\",\n month: \"month\",\n months: \"month\",\n j: \"year\",\n jahr: \"year\",\n jahre: \"year\",\n jahren: \"year\",\n y: \"year\",\n year: \"year\",\n years: \"year\",\n};\n\n/** Right-to-left locales put direction marks between the parts of a date. */\nconst DIRECTION_MARKS = /[\\u200e\\u200f\\u061c]/g;\n\nconst pad = (value: number): string => String(value).padStart(2, \"0\");\nconst toKey = (year: number, month: number, day: number): string => `${year}-${pad(month)}-${pad(day)}`;\nconst keyParts = (key: string): [number, number, number] => {\n const [year = 1970, month = 1, day = 1] = key.split(\"-\").map(Number);\n return [year, month, day];\n};\nconst keyTime = (key: string): number => {\n const [year, month, day] = keyParts(key);\n return Date.UTC(year, month - 1, day, 12);\n};\nconst timeKey = (time: number): string => {\n const date = new Date(time);\n return toKey(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate());\n};\nconst daysInMonth = (year: number, month: number): number => new Date(Date.UTC(year, month, 0)).getUTCDate();\n\nexport const addDaysToKey = (key: string, days: number): string => timeKey(keyTime(key) + days * 86_400_000);\n\n/** Months and years keep the day where it exists and otherwise end on the last day of the month (31.01. + 1m = 28.02.). */\nexport const addMonthsToKey = (key: string, months: number): string => {\n const [year, month, day] = keyParts(key);\n const index = year * 12 + month - 1 + months;\n const nextYear = Math.floor(index / 12);\n const nextMonth = (index % 12) + 1;\n return toKey(nextYear, nextMonth, Math.min(day, daysInMonth(nextYear, nextMonth)));\n};\n\n/** Monday 0 … Sunday 6. */\nexport const weekdayOfKey = (key: string): number => (new Date(keyTime(key)).getUTCDay() + 6) % 7;\n\n/** Whole days from `from` to `to`. */\nexport const daysBetweenKeys = (from: string, to: string): number => Math.round((keyTime(to) - keyTime(from)) / 86_400_000);\n\n/**\n * The editable numeric form: the locale's order and separators, but always the Gregorian calendar with Latin digits,\n * so the text the field shows (`ar-EG`, `th-TH`, `fa-IR` included) is text it can read back.\n */\nconst numericFormat = (locale?: string): Intl.DateTimeFormat =>\n new Intl.DateTimeFormat(locale, {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n timeZone: \"UTC\",\n calendar: \"gregory\",\n numberingSystem: \"latn\",\n });\n\n/** The locale's order of day, month and year in a numeric date, read from Intl; day-month-year without data. */\nexport const dateOrder = (locale?: string): DatePart[] => {\n try {\n const parts = numericFormat(locale).formatToParts(Date.UTC(2026, 10, 22, 12));\n const order = parts.map((part) => part.type).filter((type): type is DatePart => type === \"day\" || type === \"month\" || type === \"year\");\n return order.length === 3 ? order : [\"day\", \"month\", \"year\"];\n } catch {\n return [\"day\", \"month\", \"year\"];\n }\n};\n\n/** The numeric form the field shows after a commit, such as `11.11.2026` or `11/11/2026`. */\nexport const formatDateInput = (key: string, locale?: string): string =>\n numericFormat(locale).format(keyTime(key)).replace(DIRECTION_MARKS, \"\");\n\n/** The placeholder pattern in the locale's order, with letters from the caller (`TT.MM.JJJJ`, `MM/DD/YYYY`). */\nexport const dateInputPattern = (locale: string | undefined, letters: Record<DatePart, string>): string => {\n try {\n return numericFormat(locale)\n .formatToParts(Date.UTC(2026, 10, 22, 12))\n .map((part) => (part.type === \"day\" || part.type === \"month\" || part.type === \"year\" ? letters[part.type] : part.value))\n .join(\"\");\n } catch {\n return `${letters.day}.${letters.month}.${letters.year}`;\n }\n};\n\nconst ok = (date: string, note?: DateInputNote): DateInputResult => ({ kind: \"date\", date, note });\nconst fail = (error: DateInputError): DateInputResult => ({ kind: \"error\", error });\n\nconst resolveYear = (text: string | undefined, today: string): number | null => {\n const [currentYear] = keyParts(today);\n if (!text) return currentYear;\n if (text.length === 4) return Number(text);\n if (text.length === 2) {\n // Two digits name the nearest year that is at most 20 years ahead: `26` is 2026, `85` is 1985.\n const year = Math.floor(currentYear / 100) * 100 + Number(text);\n return year > currentYear + 20 ? year - 100 : year;\n }\n return null;\n};\n\nconst build = (day: number, month: number, yearText: string | undefined, today: string): DateInputResult => {\n const year = resolveYear(yearText, today);\n if (year === null) return fail({ code: \"year\" });\n if (month < 1 || month > 12) return fail({ code: \"month\", month });\n const days = daysInMonth(year, month);\n if (day < 1 || day > days) return fail({ code: \"day\", year, month, days });\n return ok(toKey(year, month, day));\n};\n\n/** Maps numeric groups to day, month and year in the locale's order; two groups leave out the year. */\nconst fromGroups = (groups: readonly string[], order: readonly DatePart[], today: string): DateInputResult => {\n const parts = groups.length === 3 ? order : order.filter((part) => part !== \"year\");\n const value = (part: DatePart) => groups[parts.indexOf(part)];\n return build(Number(value(\"day\")), Number(value(\"month\")), value(\"year\"), today);\n};\n\nconst monthFromName = (word: string): number | null => {\n const cleaned = word.replace(/\\./g, \"\");\n if (cleaned.length < 3) return null;\n const index = MONTH_PREFIXES.findIndex((prefixes) => prefixes.some((prefix) => cleaned.startsWith(prefix)));\n return index < 0 ? null : index + 1;\n};\n\nconst weekdayDate = (weekday: number, today: string): DateInputResult => {\n const delta = (weekday - weekdayOfKey(today) + 7) % 7 || 7;\n return ok(addDaysToKey(today, delta), { kind: \"weekday\", weekday, nextWeek: delta === 7 });\n};\n\nconst parseWord = (word: string, today: string): DateInputResult => {\n const abbreviation = WEEKDAY_ABBREVIATIONS.findIndex((names) => names.includes(word));\n if (abbreviation >= 0) return weekdayDate(abbreviation, today);\n const candidates: { key: string; exact: boolean; resolve: () => DateInputResult }[] = [];\n for (const [name, offset] of DAY_WORDS) {\n if (name === word || (word.length >= 3 && name.startsWith(word))) {\n candidates.push({\n key: `day:${offset}`,\n exact: name === word,\n resolve: () => ok(addDaysToKey(today, offset), { kind: \"day\", offset }),\n });\n }\n }\n WEEKDAY_NAMES.forEach((names, weekday) => {\n for (const name of names) {\n if (name === word || (word.length >= 3 && name.startsWith(word))) {\n candidates.push({ key: `weekday:${weekday}`, exact: name === word, resolve: () => weekdayDate(weekday, today) });\n }\n }\n });\n const exact = candidates.find((candidate) => candidate.exact);\n if (exact) return exact.resolve();\n const meanings = new Set(candidates.map((candidate) => candidate.key));\n if (meanings.size === 1) return candidates[0]!.resolve();\n if (meanings.size > 1) return fail({ code: \"ambiguous\" });\n return fail({ code: \"not-a-date\" });\n};\n\nconst anchorOf = (result: Extract<DateInputResult, { kind: \"date\" }>): DateInputAnchor => {\n if (result.note?.kind === \"day\") return result.note.offset === 0 ? { kind: \"today\" } : { kind: \"day\", offset: result.note.offset };\n if (result.note?.kind === \"weekday\") return { kind: \"weekday\", weekday: result.note.weekday };\n return { kind: \"date\", date: result.date };\n};\n\nconst applyOffset = (base: string, amount: number, unit: DateUnit): string => {\n if (unit === \"day\") return addDaysToKey(base, amount);\n if (unit === \"week\") return addDaysToKey(base, amount * 7);\n return addMonthsToKey(base, unit === \"month\" ? amount : amount * 12);\n};\n\nconst OFFSET_TAIL = /([+-]) ?(\\d{1,3}) ?([a-zäöü]*)\\.?$/;\n\nconst parseBase = (text: string, today: string, order: readonly DatePart[]): DateInputResult => {\n if (/^[a-zäöüß]+$/.test(text)) return parseWord(text, today);\n // A pasted ISO date may carry a time, nothing else: \"2026-11-11 nonsense\" is not a date.\n let match = text.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[t ]\\d{1,2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:z|[+-]\\d{2}:?\\d{2})?)?$/);\n if (match) return build(Number(match[3]), Number(match[2]), match[1], today);\n match = text.match(/^(\\d{1,2})\\.? ?([a-zäöü]{3,}\\.?) ?,? ?(\\d{2}|\\d{4})?$/);\n if (match) {\n const month = monthFromName(match[2]!);\n return month ? build(Number(match[1]), month, match[3], today) : fail({ code: \"not-a-date\" });\n }\n match = text.match(/^([a-zäöü]{3,}\\.?) ?(\\d{1,2})(?:st|nd|rd|th)?,? ?(\\d{2}|\\d{4})?$/);\n if (match) {\n const month = monthFromName(match[1]!);\n return month ? build(Number(match[2]), month, match[3], today) : fail({ code: \"not-a-date\" });\n }\n match = text.match(/^(\\d{1,4})[.,/\\- ]+(\\d{1,2})(?:[.,/\\- ]+(\\d*))?\\.?$/);\n if (match) {\n const groups = [match[1]!, match[2]!, ...(match[3] ? [match[3]] : [])];\n if (groups[0]!.length > 2 && order[0] !== \"year\") return fail({ code: \"not-a-date\" });\n return fromGroups(groups, order, today);\n }\n if (/^\\d+$/.test(text)) {\n const [, currentMonth] = keyParts(today);\n if (text.length <= 2) return build(Number(text), currentMonth, undefined, today);\n if (text.length === 4) return fromGroups([text.slice(0, 2), text.slice(2)], order, today);\n if (text.length === 6) return fromGroups([text.slice(0, 2), text.slice(2, 4), text.slice(4)], order, today);\n if (text.length === 8) {\n const yearFirst = order[0] === \"year\";\n const groups = yearFirst ? [text.slice(0, 4), text.slice(4, 6), text.slice(6)] : [text.slice(0, 2), text.slice(2, 4), text.slice(4)];\n return fromGroups(groups, order, today);\n }\n return fail({ code: \"incomplete\" });\n }\n return fail({ code: \"not-a-date\" });\n};\n\n/**\n * Parses what a person typed into a date field. `today` is the current date key in the field's time zone; the result\n * never depends on the clock.\n */\nexport const parseDateInput = (raw: string, options: { today: string; locale?: string }): DateInputResult => {\n const text = raw.replace(DIRECTION_MARKS, \"\").trim().replace(/\\s+/g, \" \").toLowerCase();\n if (!text) return { kind: \"empty\" };\n const order = dateOrder(options.locale);\n const offset = text.match(OFFSET_TAIL);\n if (offset) {\n const head = text.slice(0, offset.index);\n const anchorText = head.trim();\n // `+` always starts an offset; `-` only at the start, after a space or after a word, so `11-11-2026` stays a date.\n if (offset[1] === \"+\" || head === \"\" || /\\s$/.test(head) || /[a-zäöüß]$/.test(anchorText)) {\n const unit = UNITS[offset[3]!];\n if (!unit) return fail({ code: \"unit\" });\n const amount = Number(offset[2]) * (offset[1] === \"-\" ? -1 : 1);\n if (!anchorText) return ok(applyOffset(options.today, amount, unit), { kind: \"offset\", anchor: { kind: \"today\" }, amount, unit });\n const anchor = parseBase(anchorText, options.today, order);\n if (anchor.kind !== \"date\") return anchor.kind === \"empty\" ? fail({ code: \"not-a-date\" }) : anchor;\n return ok(applyOffset(anchor.date, amount, unit), { kind: \"offset\", anchor: anchorOf(anchor), amount, unit });\n }\n }\n if (/[+-]$/.test(text)) return fail({ code: \"incomplete\" });\n return parseBase(text, options.today, order);\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,49 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { setAttribute as _$setAttribute } from "solid-js/web";
3
+ import { effect as _$effect } from "solid-js/web";
4
+ import { getNextElement as _$getNextElement } from "solid-js/web";
5
+ import { insert as _$insert } from "solid-js/web";
6
+ import { createComponent as _$createComponent } from "solid-js/web";
7
+ var _tmpl$ = /*#__PURE__*/_$template(`<div class=k2b-date-sheet>`);
8
+ import { dialogCore } from "../feedback/dialog-core";
9
+ import { LocaleProvider } from "../intl/locale";
10
+ import BottomSheet, { bottomSheetOptions } from "../layout/BottomSheet";
11
+
12
+ /**
13
+ * The phone calendar of a typed date field as a bottom sheet. Date pickers load this module only when the sheet opens:
14
+ * the sheet reaches `PanelDialog`, whose prompts render date pickers, so a static import would be a cycle.
15
+ */
16
+ export const openDateSheet = options => dialogCore.open((close, context) => _$createComponent(LocaleProvider, {
17
+ get locale() {
18
+ return options.locale;
19
+ },
20
+ get children() {
21
+ return _$createComponent(BottomSheet, {
22
+ get onDismiss() {
23
+ return context.requestDismiss;
24
+ },
25
+ get children() {
26
+ return [_$createComponent(BottomSheet.Header, {
27
+ get title() {
28
+ return options.title;
29
+ },
30
+ get subtitle() {
31
+ return options.subtitle;
32
+ }
33
+ }), _$createComponent(BottomSheet.Body, {
34
+ get children() {
35
+ var _el$ = _$getNextElement(_tmpl$);
36
+ _$insert(_el$, () => options.content(result => close(result)));
37
+ _$effect(() => _$setAttribute(_el$, "id", options.id));
38
+ return _el$;
39
+ }
40
+ })];
41
+ }
42
+ });
43
+ }
44
+ }), {
45
+ ...bottomSheetOptions,
46
+ ariaLabel: options.ariaLabel,
47
+ history: true
48
+ });
49
+ //# sourceMappingURL=date-sheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/date-sheet.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { dialogCore } from \"../feedback/dialog-core\";\nimport { LocaleProvider } from \"../intl/locale\";\nimport BottomSheet, { bottomSheetOptions } from \"../layout/BottomSheet\";\n\n/**\n * The phone calendar of a typed date field as a bottom sheet. Date pickers load this module only when the sheet opens:\n * the sheet reaches `PanelDialog`, whose prompts render date pickers, so a static import would be a cycle.\n */\nexport const openDateSheet = <T,>(options: {\n title: JSX.Element;\n subtitle: string;\n ariaLabel?: string;\n /** The calendar's id, which the field's `aria-controls` names while the sheet is open. */\n id: string;\n locale: string;\n content: (close: (result: T) => void) => JSX.Element;\n}): Promise<T | undefined> =>\n dialogCore.open<T>(\n (close, context) => (\n <LocaleProvider locale={options.locale}>\n <BottomSheet onDismiss={context.requestDismiss}>\n <BottomSheet.Header title={options.title} subtitle={options.subtitle} />\n <BottomSheet.Body>\n <div id={options.id} class=\"k2b-date-sheet\">\n {options.content((result) => close(result))}\n </div>\n </BottomSheet.Body>\n </BottomSheet>\n </LocaleProvider>\n ),\n { ...bottomSheetOptions, ariaLabel: options.ariaLabel, history: true },\n );\n"],"mappings":";;;;;;;AACA,SAAS,UAAU,QAAQ,yBAAyB;AACpD,SAAS,cAAc,QAAQ,gBAAgB;AAC/C,OAAO,WAAW,IAAI,kBAAkB,QAAQ,uBAAuB;;AAEvE;AACA;AACA;AACA;AACA,OAAO,MAAM,aAAa,GAAQ,OAQjC,IACC,UAAU,CAAC,IAAI,CACb,CAAC,KAAK,EAAE,OAAO,uBACZ,cAAc;EAAA,IAAC,MAAM;IAAA,OAAE,OAAO,CAAC,MAAM;EAAA;EAAA;IAAA,yBACnC,WAAW;MAAA,IAAC,SAAS;QAAA,OAAE,OAAO,CAAC,cAAc;MAAA;MAAA;QAAA,0BAC3C,WAAW,CAAC,MAAM;UAAA,IAAC,KAAK;YAAA,OAAE,OAAO,CAAC,KAAK;UAAA;UAAA,IAAE,QAAQ;YAAA,OAAE,OAAO,CAAC,QAAQ;UAAA;QAAA,sBACnE,WAAW,CAAC,IAAI;UAAA;YAAA;YAAA,qBAEZ,OAAO,CAAC,OAAO,CAAE,MAAM,IAAK,KAAK,CAAC,MAAM,CAAC,CAAC;YAAA,0CADpC,OAAO,CAAC,EAAE;YAAA;UAAA;QAAA;MAAA;IAAA;EAAA;AAAA,EAM1B,EACD;EAAE,GAAG,kBAAkB;EAAE,SAAS,EAAE,OAAO,CAAC,SAAS;EAAE,OAAO,EAAE;AAAK,CACvE,CAAC","ignoreList":[]}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Scrolls `scroller` alone so `item` sits fully inside it, with the "nearest" rule of `scrollIntoView`: an item already
3
+ * in view stays put, and one larger than the view keeps its start in view. Unlike `scrollIntoView`, no ancestor moves,
4
+ * so a strip that keeps its selection visible never scrolls the page or panel around it.
5
+ */
6
+ export function revealInScroller(scroller, item) {
7
+ if (!scroller || !item || !scroller.contains(item)) return;
8
+ const view = scroller.getBoundingClientRect();
9
+ const box = item.getBoundingClientRect();
10
+ const style = scroller.ownerDocument.defaultView?.getComputedStyle(scroller);
11
+ const padding = value => Number.parseFloat(value ?? "") || 0;
12
+ const nearest = (start, end, viewStart, viewEnd) => {
13
+ if (start >= viewStart && end <= viewEnd) return 0;
14
+ if (start < viewStart && end > viewEnd) return 0;
15
+ return start < viewStart ? start - viewStart : Math.min(end - viewEnd, start - viewStart);
16
+ };
17
+ const left = view.left + scroller.clientLeft;
18
+ const top = view.top + scroller.clientTop;
19
+ const dx = nearest(box.left, box.right, left + padding(style?.scrollPaddingLeft), left + scroller.clientWidth - padding(style?.scrollPaddingRight));
20
+ const dy = nearest(box.top, box.bottom, top + padding(style?.scrollPaddingTop), top + scroller.clientHeight - padding(style?.scrollPaddingBottom));
21
+ // Instant, like the first frame of a newly mounted strip: there is no motion to follow.
22
+ if (dx || dy) scroller.scrollBy?.({
23
+ left: dx,
24
+ top: dy,
25
+ behavior: "instant"
26
+ });
27
+ }
28
+ //# sourceMappingURL=reveal-in-scroller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["internal/reveal-in-scroller.ts"],"sourcesContent":["/**\n * Scrolls `scroller` alone so `item` sits fully inside it, with the \"nearest\" rule of `scrollIntoView`: an item already\n * in view stays put, and one larger than the view keeps its start in view. Unlike `scrollIntoView`, no ancestor moves,\n * so a strip that keeps its selection visible never scrolls the page or panel around it.\n */\nexport function revealInScroller(scroller: HTMLElement | undefined, item: HTMLElement | undefined) {\n if (!scroller || !item || !scroller.contains(item)) return;\n const view = scroller.getBoundingClientRect();\n const box = item.getBoundingClientRect();\n const style = scroller.ownerDocument.defaultView?.getComputedStyle(scroller);\n const padding = (value: string | undefined) => Number.parseFloat(value ?? \"\") || 0;\n const nearest = (start: number, end: number, viewStart: number, viewEnd: number) => {\n if (start >= viewStart && end <= viewEnd) return 0;\n if (start < viewStart && end > viewEnd) return 0;\n return start < viewStart ? start - viewStart : Math.min(end - viewEnd, start - viewStart);\n };\n const left = view.left + scroller.clientLeft;\n const top = view.top + scroller.clientTop;\n const dx = nearest(\n box.left,\n box.right,\n left + padding(style?.scrollPaddingLeft),\n left + scroller.clientWidth - padding(style?.scrollPaddingRight),\n );\n const dy = nearest(\n box.top,\n box.bottom,\n top + padding(style?.scrollPaddingTop),\n top + scroller.clientHeight - padding(style?.scrollPaddingBottom),\n );\n // Instant, like the first frame of a newly mounted strip: there is no motion to follow.\n if (dx || dy) scroller.scrollBy?.({ left: dx, top: dy, behavior: \"instant\" });\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,gBAAgB,CAAC,QAAiC,EAAE,IAA6B,EAAE;EACjG,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;EACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC;EAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC;EACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,gBAAgB,CAAC,QAAQ,CAAC;EAC5E,MAAM,OAAO,GAAI,KAAyB,IAAK,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC;EAClF,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,SAAiB,EAAE,OAAe,KAAK;IAClF,IAAI,KAAK,IAAI,SAAS,IAAI,GAAG,IAAI,OAAO,EAAE,OAAO,CAAC;IAClD,IAAI,KAAK,GAAG,SAAS,IAAI,GAAG,GAAG,OAAO,EAAE,OAAO,CAAC;IAChD,OAAO,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,GAAG,SAAS,CAAC;EAC3F,CAAC;EACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,UAAU;EAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,SAAS;EACzC,MAAM,EAAE,GAAG,OAAO,CAChB,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,KAAK,EACT,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,EACxC,IAAI,GAAG,QAAQ,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE,kBAAkB,CACjE,CAAC;EACD,MAAM,EAAE,GAAG,OAAO,CAChB,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,MAAM,EACV,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,EACtC,GAAG,GAAG,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAClE,CAAC;EACD;EACA,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG;IAAE,IAAI,EAAE,EAAE;IAAE,GAAG,EAAE,EAAE;IAAE,QAAQ,EAAE;EAAU,CAAC,CAAC;AAC/E","ignoreList":[]}
@@ -82,6 +82,9 @@ const uiMessages = i18n.define({
82
82
  info: "Info",
83
83
  ok: "OK",
84
84
  success: "Success",
85
+ dialogToneSuccess: "Success",
86
+ dialogToneWarning: "Warning",
87
+ dialogToneDanger: "Caution",
85
88
  unknown: "Unknown",
86
89
  name: "Name",
87
90
  color: "Color",
@@ -170,6 +173,9 @@ const uiMessages = i18n.define({
170
173
  info: "Information",
171
174
  ok: "OK",
172
175
  success: "Erfolg",
176
+ dialogToneSuccess: "Erfolgreich",
177
+ dialogToneWarning: "Warnung",
178
+ dialogToneDanger: "Achtung",
173
179
  unknown: "Unbekannt",
174
180
  name: "Name",
175
181
  color: "Farbe",
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["intl/messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"./locale\";\n\n/** Common control chrome and date basics; specialized strings live beside their component families. */\nconst uiMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n actions: \"Actions\",\n add: \"Add\",\n apply: \"Apply\",\n all: \"All\",\n calendar: \"Calendar\",\n clear: \"Clear\",\n clearDate: \"Clear date\",\n clearSelection: \"Clear selection\",\n close: \"Close\",\n closeDialog: \"close dialog\",\n copied: \"Copied\",\n copy: \"Copy\",\n couldNotLoadData: \"Could not load this data\",\n datePicker: \"Date picker\",\n datePresets: \"Date presets\",\n download: \"Download\",\n dropdownMenu: \"Dropdown menu\",\n durationPresets: \"Duration presets\",\n loading: \"Loading...\",\n noData: \"No data.\",\n noResults: \"No results\",\n nothingHere: \"Nothing here yet.\",\n nothingToShow: \"Nothing to show.\",\n no: \"No\",\n options: \"Options\",\n more: \"More\",\n moreViews: \"More views\",\n pickDate: \"Pick date\",\n previousMonth: \"Previous month\",\n previousYear: \"Previous year\",\n nextMonth: \"Next month\",\n nextYear: \"Next year\",\n retry: \"Retry\",\n tryAgain: \"Try again\",\n movedHintDismiss: \"Got it\",\n reset: \"Reset\",\n required: \"Required\",\n delete: \"Delete\",\n remove: \"Remove\",\n search: \"Search...\",\n searchLabel: \"Search\",\n searchResults: \"Search results\",\n searchMatches: ({ count }: { count: number }) => (count === 1 ? \"1 match\" : `${count} matches`),\n save: \"Save\",\n select: \"Select...\",\n time: \"Time\",\n timeLabel: ({ label }: { label: string }) => `${label} time`,\n contextMenu: \"Context menu\",\n start: \"Start\",\n end: \"End\",\n today: \"Today\",\n todayDate: ({ date }: { date: string }) => `Today, ${date}`,\n day: \"Day\",\n week: \"Week\",\n month: \"Month\",\n year: \"Year\",\n allDay: \"All day\",\n addTime: \"Add time\",\n removeTime: \"Remove time\",\n previous: \"Previous\",\n next: \"Next\",\n cancel: \"Cancel\",\n code: \"Code\",\n change: \"Change\",\n message: \"Message\",\n dialog: \"Dialog\",\n error: \"Error\",\n info: \"Info\",\n ok: \"OK\",\n success: \"Success\",\n unknown: \"Unknown\",\n name: \"Name\",\n color: \"Color\",\n preview: \"Preview\",\n closeNamed: ({ name }: { name: string }) => `Close ${name}`,\n range: \"Range\",\n edit: \"Edit\",\n yes: \"Yes\",\n },\n de: {\n actions: \"Aktionen\",\n add: \"Hinzufügen\",\n apply: \"Übernehmen\",\n all: \"Alle\",\n calendar: \"Kalender\",\n clear: \"Leeren\",\n clearDate: \"Datum löschen\",\n clearSelection: \"Auswahl löschen\",\n close: \"Schließen\",\n closeDialog: \"Dialog schließen\",\n copied: \"Kopiert\",\n copy: \"Kopieren\",\n couldNotLoadData: \"Diese Daten konnten nicht geladen werden\",\n datePicker: \"Datumsauswahl\",\n datePresets: \"Datumsvorgaben\",\n download: \"Herunterladen\",\n dropdownMenu: \"Dropdown-Menü\",\n durationPresets: \"Dauervorgaben\",\n loading: \"Wird geladen...\",\n noData: \"Keine Daten.\",\n noResults: \"Keine Ergebnisse\",\n nothingHere: \"Noch nichts vorhanden.\",\n nothingToShow: \"Nichts anzuzeigen.\",\n no: \"Nein\",\n options: \"Optionen\",\n more: \"Weitere\",\n moreViews: \"Weitere Ansichten\",\n pickDate: \"Datum auswählen\",\n previousMonth: \"Vorheriger Monat\",\n previousYear: \"Vorheriges Jahr\",\n nextMonth: \"Nächster Monat\",\n nextYear: \"Nächstes Jahr\",\n retry: \"Erneut versuchen\",\n tryAgain: \"Erneut versuchen\",\n movedHintDismiss: \"Verstanden\",\n reset: \"Zurücksetzen\",\n required: \"Erforderlich\",\n delete: \"Löschen\",\n remove: \"Entfernen\",\n search: \"Suchen...\",\n searchLabel: \"Suchen\",\n searchResults: \"Suchergebnisse\",\n searchMatches: ({ count }: { count: number }) => (count === 1 ? \"1 Treffer\" : `${count} Treffer`),\n save: \"Speichern\",\n select: \"Auswählen...\",\n time: \"Uhrzeit\",\n timeLabel: ({ label }) => `${label}zeit`,\n contextMenu: \"Kontextmenü\",\n start: \"Beginn\",\n end: \"Ende\",\n today: \"Heute\",\n todayDate: ({ date }) => `Heute, ${date}`,\n day: \"Tag\",\n week: \"Woche\",\n month: \"Monat\",\n year: \"Jahr\",\n allDay: \"Ganztägig\",\n addTime: \"Uhrzeit hinzufügen\",\n removeTime: \"Uhrzeit entfernen\",\n previous: \"Zurück\",\n next: \"Weiter\",\n cancel: \"Abbrechen\",\n code: \"Code\",\n change: \"Ändern\",\n message: \"Nachricht\",\n dialog: \"Dialog\",\n error: \"Fehler\",\n info: \"Information\",\n ok: \"OK\",\n success: \"Erfolg\",\n unknown: \"Unbekannt\",\n name: \"Name\",\n color: \"Farbe\",\n preview: \"Vorschau\",\n closeNamed: ({ name }) => `${name} schließen`,\n range: \"Zeitraum\",\n edit: \"Bearbeiten\",\n yes: \"Ja\",\n },\n },\n});\n\nexport type UiMessages = ReturnType<(typeof uiMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useUiMessages = (): (() => UiMessages) => {\n const locale = useLocale();\n return () => uiMessages.resolve([locale()]).t;\n};\n\n/** Imperative UI inherits the document locale when no locale is supplied. */\nexport const resolveUiMessages = (locale?: string): UiMessages =>\n uiMessages.resolve([locale ?? (typeof document === \"undefined\" ? uiMessages.baseLocale : document.documentElement.lang)]).t;\n\nexport const checkUiMessages = () => uiMessages.check();\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["intl/messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"./locale\";\n\n/** Common control chrome and date basics; specialized strings live beside their component families. */\nconst uiMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n actions: \"Actions\",\n add: \"Add\",\n apply: \"Apply\",\n all: \"All\",\n calendar: \"Calendar\",\n clear: \"Clear\",\n clearDate: \"Clear date\",\n clearSelection: \"Clear selection\",\n close: \"Close\",\n closeDialog: \"close dialog\",\n copied: \"Copied\",\n copy: \"Copy\",\n couldNotLoadData: \"Could not load this data\",\n datePicker: \"Date picker\",\n datePresets: \"Date presets\",\n download: \"Download\",\n dropdownMenu: \"Dropdown menu\",\n durationPresets: \"Duration presets\",\n loading: \"Loading...\",\n noData: \"No data.\",\n noResults: \"No results\",\n nothingHere: \"Nothing here yet.\",\n nothingToShow: \"Nothing to show.\",\n no: \"No\",\n options: \"Options\",\n more: \"More\",\n moreViews: \"More views\",\n pickDate: \"Pick date\",\n previousMonth: \"Previous month\",\n previousYear: \"Previous year\",\n nextMonth: \"Next month\",\n nextYear: \"Next year\",\n retry: \"Retry\",\n tryAgain: \"Try again\",\n movedHintDismiss: \"Got it\",\n reset: \"Reset\",\n required: \"Required\",\n delete: \"Delete\",\n remove: \"Remove\",\n search: \"Search...\",\n searchLabel: \"Search\",\n searchResults: \"Search results\",\n searchMatches: ({ count }: { count: number }) => (count === 1 ? \"1 match\" : `${count} matches`),\n save: \"Save\",\n select: \"Select...\",\n time: \"Time\",\n timeLabel: ({ label }: { label: string }) => `${label} time`,\n contextMenu: \"Context menu\",\n start: \"Start\",\n end: \"End\",\n today: \"Today\",\n todayDate: ({ date }: { date: string }) => `Today, ${date}`,\n day: \"Day\",\n week: \"Week\",\n month: \"Month\",\n year: \"Year\",\n allDay: \"All day\",\n addTime: \"Add time\",\n removeTime: \"Remove time\",\n previous: \"Previous\",\n next: \"Next\",\n cancel: \"Cancel\",\n code: \"Code\",\n change: \"Change\",\n message: \"Message\",\n dialog: \"Dialog\",\n error: \"Error\",\n info: \"Info\",\n ok: \"OK\",\n success: \"Success\",\n dialogToneSuccess: \"Success\",\n dialogToneWarning: \"Warning\",\n dialogToneDanger: \"Caution\",\n unknown: \"Unknown\",\n name: \"Name\",\n color: \"Color\",\n preview: \"Preview\",\n closeNamed: ({ name }: { name: string }) => `Close ${name}`,\n range: \"Range\",\n edit: \"Edit\",\n yes: \"Yes\",\n },\n de: {\n actions: \"Aktionen\",\n add: \"Hinzufügen\",\n apply: \"Übernehmen\",\n all: \"Alle\",\n calendar: \"Kalender\",\n clear: \"Leeren\",\n clearDate: \"Datum löschen\",\n clearSelection: \"Auswahl löschen\",\n close: \"Schließen\",\n closeDialog: \"Dialog schließen\",\n copied: \"Kopiert\",\n copy: \"Kopieren\",\n couldNotLoadData: \"Diese Daten konnten nicht geladen werden\",\n datePicker: \"Datumsauswahl\",\n datePresets: \"Datumsvorgaben\",\n download: \"Herunterladen\",\n dropdownMenu: \"Dropdown-Menü\",\n durationPresets: \"Dauervorgaben\",\n loading: \"Wird geladen...\",\n noData: \"Keine Daten.\",\n noResults: \"Keine Ergebnisse\",\n nothingHere: \"Noch nichts vorhanden.\",\n nothingToShow: \"Nichts anzuzeigen.\",\n no: \"Nein\",\n options: \"Optionen\",\n more: \"Weitere\",\n moreViews: \"Weitere Ansichten\",\n pickDate: \"Datum auswählen\",\n previousMonth: \"Vorheriger Monat\",\n previousYear: \"Vorheriges Jahr\",\n nextMonth: \"Nächster Monat\",\n nextYear: \"Nächstes Jahr\",\n retry: \"Erneut versuchen\",\n tryAgain: \"Erneut versuchen\",\n movedHintDismiss: \"Verstanden\",\n reset: \"Zurücksetzen\",\n required: \"Erforderlich\",\n delete: \"Löschen\",\n remove: \"Entfernen\",\n search: \"Suchen...\",\n searchLabel: \"Suchen\",\n searchResults: \"Suchergebnisse\",\n searchMatches: ({ count }: { count: number }) => (count === 1 ? \"1 Treffer\" : `${count} Treffer`),\n save: \"Speichern\",\n select: \"Auswählen...\",\n time: \"Uhrzeit\",\n timeLabel: ({ label }) => `${label}zeit`,\n contextMenu: \"Kontextmenü\",\n start: \"Beginn\",\n end: \"Ende\",\n today: \"Heute\",\n todayDate: ({ date }) => `Heute, ${date}`,\n day: \"Tag\",\n week: \"Woche\",\n month: \"Monat\",\n year: \"Jahr\",\n allDay: \"Ganztägig\",\n addTime: \"Uhrzeit hinzufügen\",\n removeTime: \"Uhrzeit entfernen\",\n previous: \"Zurück\",\n next: \"Weiter\",\n cancel: \"Abbrechen\",\n code: \"Code\",\n change: \"Ändern\",\n message: \"Nachricht\",\n dialog: \"Dialog\",\n error: \"Fehler\",\n info: \"Information\",\n ok: \"OK\",\n success: \"Erfolg\",\n dialogToneSuccess: \"Erfolgreich\",\n dialogToneWarning: \"Warnung\",\n dialogToneDanger: \"Achtung\",\n unknown: \"Unbekannt\",\n name: \"Name\",\n color: \"Farbe\",\n preview: \"Vorschau\",\n closeNamed: ({ name }) => `${name} schließen`,\n range: \"Zeitraum\",\n edit: \"Bearbeiten\",\n yes: \"Ja\",\n },\n },\n});\n\nexport type UiMessages = ReturnType<(typeof uiMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useUiMessages = (): (() => UiMessages) => {\n const locale = useLocale();\n return () => uiMessages.resolve([locale()]).t;\n};\n\n/** Imperative UI inherits the document locale when no locale is supplied. */\nexport const resolveUiMessages = (locale?: string): UiMessages =>\n uiMessages.resolve([locale ?? (typeof document === \"undefined\" ? uiMessages.baseLocale : document.documentElement.lang)]).t;\n\nexport const checkUiMessages = () => uiMessages.check();\n"],"mappings":"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","ignoreList":[]}