kanto-ds 1.7.0 → 1.8.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.
- package/README.md +15 -10
- package/dist/cdn/kanto.min.js +887 -234
- package/dist/chunks/{index-TWJzttLX.js → index-BEWmAE0T.js} +21 -7
- package/dist/chunks/index-BEWmAE0T.js.map +1 -0
- package/dist/chunks/{kt-calendar-CtwOby1R.js → kt-calendar-D72xa8qr.js} +3 -3
- package/dist/chunks/{kt-calendar-CtwOby1R.js.map → kt-calendar-D72xa8qr.js.map} +1 -1
- package/dist/chunks/{kt-element-T0VbIBNp.js → kt-element-COgh6Yr1.js} +2 -2
- package/dist/chunks/{kt-element-T0VbIBNp.js.map → kt-element-COgh6Yr1.js.map} +1 -1
- package/dist/chunks/numbers-QyecMiSJ.js +9 -0
- package/dist/chunks/numbers-QyecMiSJ.js.map +1 -0
- package/dist/chunks/{segmented-field-BBXR4XFL.js → segmented-field-BCjCGF4I.js} +2 -2
- package/dist/chunks/{segmented-field-BBXR4XFL.js.map → segmented-field-BCjCGF4I.js.map} +1 -1
- package/dist/chunks/{typed-date-CPAUNHzr.js → typed-date-Z3vcUJbb.js} +2 -2
- package/dist/chunks/{typed-date-CPAUNHzr.js.map → typed-date-Z3vcUJbb.js.map} +1 -1
- package/dist/components/core/kt-avatar/kt-avatar.js +2 -2
- package/dist/components/core/kt-badge/kt-badge.js +2 -2
- package/dist/components/core/kt-button/kt-button.js +1 -1
- package/dist/components/core/kt-card/kt-card.js +1 -1
- package/dist/components/core/kt-code/kt-code.js +2 -2
- package/dist/components/core/kt-icon/kt-icon.js +1 -1
- package/dist/components/core/kt-kbd/kt-kbd.js +1 -1
- package/dist/components/core/kt-split-button/kt-split-button.js +2 -2
- package/dist/components/data/kt-chart/kt-chart.js +2 -2
- package/dist/components/data/kt-meter/kt-meter.js +1 -1
- package/dist/components/data/kt-pagination/kt-pagination.js +2 -2
- package/dist/components/data/kt-stat/kt-stat.js +1 -1
- package/dist/components/data/kt-table/kt-table.js +2 -2
- package/dist/components/data/kt-timeline/kt-timeline.js +1 -1
- package/dist/components/feedback/kt-alert/kt-alert.js +2 -2
- package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
- package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +1 -1
- package/dist/components/feedback/kt-skeleton/kt-skeleton.js +1 -1
- package/dist/components/feedback/kt-toast/kt-toast.js +2 -2
- package/dist/components/feedback/kt-toast-container/kt-toast-container.js +1 -1
- package/dist/components/feedback/kt-tooltip/kt-tooltip.js +1 -1
- package/dist/components/forms/kt-calendar/kt-calendar.js +3 -3
- package/dist/components/forms/kt-checkbox/kt-checkbox.js +2 -2
- package/dist/components/forms/kt-date-input/kt-date-input.js +5 -5
- package/dist/components/forms/kt-date-picker/kt-date-picker.js +4 -4
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +2 -2
- package/dist/components/forms/kt-form/kt-form.js +2 -2
- package/dist/components/forms/kt-input/kt-input.js +2 -2
- package/dist/components/forms/kt-input-menu/kt-input-menu.js +2 -2
- package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
- package/dist/components/forms/kt-multi-select/kt-multi-select.js +2 -2
- package/dist/components/forms/kt-number-input/kt-number-input.d.ts +89 -0
- package/dist/components/forms/kt-number-input/kt-number-input.js +350 -0
- package/dist/components/forms/kt-number-input/kt-number-input.js.map +1 -0
- package/dist/components/forms/kt-radio-group/kt-radio-group.js +2 -2
- package/dist/components/forms/kt-select/kt-select.js +2 -2
- package/dist/components/forms/kt-slider/kt-slider.d.ts +69 -0
- package/dist/components/forms/kt-slider/kt-slider.js +252 -0
- package/dist/components/forms/kt-slider/kt-slider.js.map +1 -0
- package/dist/components/forms/kt-textarea/kt-textarea.js +2 -2
- package/dist/components/forms/kt-time-input/kt-time-input.js +3 -3
- package/dist/components/forms/kt-toggle/kt-toggle.js +1 -1
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +2 -2
- package/dist/components/navigation/kt-header/kt-header.js +2 -2
- package/dist/components/navigation/kt-page-header/kt-page-header.js +1 -1
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +2 -2
- package/dist/components/navigation/kt-steps/kt-steps.d.ts +65 -0
- package/dist/components/navigation/kt-steps/kt-steps.js +244 -0
- package/dist/components/navigation/kt-steps/kt-steps.js.map +1 -0
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +2 -2
- package/dist/components/navigation/kt-tabs/kt-tabs.js +1 -1
- package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +1 -1
- package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +2 -2
- package/dist/components/overlays/kt-collapsible/kt-collapsible.js +1 -1
- package/dist/components/overlays/kt-command-palette/kt-command-palette.d.ts +87 -0
- package/dist/components/overlays/kt-command-palette/kt-command-palette.js +370 -0
- package/dist/components/overlays/kt-command-palette/kt-command-palette.js.map +1 -0
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +2 -2
- package/dist/components/overlays/kt-dropdown/kt-dropdown.js +2 -2
- package/dist/components/overlays/kt-modal/kt-modal.js +2 -2
- package/dist/components/overlays/kt-side-panel/kt-side-panel.js +2 -2
- package/dist/custom-elements.json +3279 -1754
- package/dist/docs/kt-command-palette.md +99 -0
- package/dist/docs/kt-number-input.md +77 -0
- package/dist/docs/kt-slider.md +76 -0
- package/dist/docs/kt-steps.md +79 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +105 -97
- package/dist/index.js.map +1 -1
- package/dist/internal/command-search.d.ts +27 -0
- package/dist/internal/numbers.d.ts +2 -0
- package/dist/internal/strings.d.ts +14 -0
- package/dist/react/index.d.ts +31 -0
- package/dist/react/index.js +199 -164
- package/dist/react/index.js.map +1 -1
- package/dist/react/jsx.d.ts +27 -1
- package/dist/strings/index.js +1 -1
- package/dist/tokens/base.css +4 -0
- package/dist/vscode.css-custom-data.json +26 -2
- package/dist/vscode.html-custom-data.json +120 -12
- package/dist/vue/index.d.ts +8 -0
- package/dist/vue/index.js +12 -8
- package/dist/vue/index.js.map +1 -1
- package/dist/web-types.json +347 -39
- package/package.json +20 -3
- package/dist/chunks/index-TWJzttLX.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const n = Object.freeze({
|
|
2
2
|
clear: "Clear",
|
|
3
3
|
close: "Close",
|
|
4
4
|
dismiss: "Dismiss",
|
|
@@ -62,6 +62,20 @@ const s = Object.freeze({
|
|
|
62
62
|
placeholderTime: "--",
|
|
63
63
|
timeRequired: "Enter a time.",
|
|
64
64
|
timeOutOfRange: "This time is outside the times you can choose.",
|
|
65
|
+
commandPalette: "Command palette",
|
|
66
|
+
commandPlaceholder: "Type a command or search…",
|
|
67
|
+
commandHintMove: "to move",
|
|
68
|
+
commandHintRun: "to run",
|
|
69
|
+
commandHintClose: "to close",
|
|
70
|
+
sliderMinimum: "minimum",
|
|
71
|
+
sliderMaximum: "maximum",
|
|
72
|
+
stepComplete: "Completed",
|
|
73
|
+
stepCurrent: "Current step",
|
|
74
|
+
stepUpcoming: "Not started",
|
|
75
|
+
stepError: "Needs attention",
|
|
76
|
+
numberRequired: "Enter a number.",
|
|
77
|
+
decrease: "Decrease",
|
|
78
|
+
increase: "Increase",
|
|
65
79
|
phoneTrunkPrefix: (e) => `Enter the number without the leading ${e}.`,
|
|
66
80
|
openMenu: "Open menu",
|
|
67
81
|
closeMenu: "Close menu",
|
|
@@ -89,26 +103,26 @@ const s = Object.freeze({
|
|
|
89
103
|
details: "Details",
|
|
90
104
|
avatar: "Avatar"
|
|
91
105
|
});
|
|
92
|
-
let o = { ...
|
|
106
|
+
let o = { ...n };
|
|
93
107
|
const a = /* @__PURE__ */ new Set();
|
|
94
108
|
function r() {
|
|
95
109
|
return o;
|
|
96
110
|
}
|
|
97
|
-
function
|
|
111
|
+
function s(e) {
|
|
98
112
|
o = { ...o, ...e };
|
|
99
113
|
for (const t of a) t();
|
|
100
114
|
}
|
|
101
115
|
function i() {
|
|
102
|
-
n
|
|
116
|
+
s(n);
|
|
103
117
|
}
|
|
104
118
|
function c(e) {
|
|
105
119
|
return a.add(e), () => a.delete(e);
|
|
106
120
|
}
|
|
107
121
|
export {
|
|
108
|
-
|
|
109
|
-
|
|
122
|
+
s as a,
|
|
123
|
+
n as d,
|
|
110
124
|
c as o,
|
|
111
125
|
i as r,
|
|
112
126
|
r as s
|
|
113
127
|
};
|
|
114
|
-
//# sourceMappingURL=index-
|
|
128
|
+
//# sourceMappingURL=index-BEWmAE0T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BEWmAE0T.js","sources":["../../src/internal/strings.ts"],"sourcesContent":["/**\n * Every piece of copy the elements write themselves — empty states, button\n * labels, validation messages, and the accessible names a screen reader\n * announces but nobody sees.\n *\n * English by default. An application in another language replaces them once,\n * at start-up, and every element follows:\n *\n * import { setStrings } from 'kanto-ds/strings';\n *\n * setStrings({\n * clear: 'Effacer',\n * pageOf: (page, total) => `Page ${page} sur ${total}`,\n * });\n *\n * Anything left out keeps its English default. A string an element also takes\n * as a property — `emptyText`, `placeholder`, `confirmLabel` — still wins when\n * it is set, so one screen can say something different from the rest.\n *\n * Copy that carries a value is a function, not a template with placeholders:\n * the translation owns the word order, and \"Remove {name}\" does not survive\n * languages that put the object first.\n */\n\nexport interface KtStrings {\n // --- Shared actions ---\n /** Clear button in fields. */\n clear: string;\n /** Close button on toasts, alerts' dismiss button. */\n close: string;\n dismiss: string;\n /** Copy button on `kt-code`, and its state once copied. */\n copy: string;\n copied: string;\n copyCode: string;\n /** The countdown bar on a toast that closes itself. */\n timeRemaining: string;\n /** Remove button on a badge or a dropped file. */\n remove: (name: string) => string;\n\n // --- Empty and loading states ---\n noOptions: string;\n noResults: string;\n noActions: string;\n noData: string;\n loading: string;\n\n // --- Fields ---\n /** `kt-select` with nothing chosen. */\n select: string;\n openList: string;\n closeList: string;\n showPassword: string;\n hidePassword: string;\n searchCountry: string;\n noCountry: string;\n countryCode: (country: string | undefined) => string;\n /** How many values a multi-select holds, for a screen reader. */\n selectedCount: (count: number) => string;\n dragAndDrop: string;\n browseFiles: string;\n recommendedSize: (size: string) => string;\n selectedFiles: string;\n /** `kt-date-picker` with nothing chosen, and its calendar's name. */\n selectDate: string;\n selectPeriod: string;\n previousMonth: string;\n nextMonth: string;\n previousYear: string;\n nextYear: string;\n previousYears: string;\n nextYears: string;\n /** The calendar header's month and year buttons, which open those views. */\n chooseMonth: string;\n chooseYear: string;\n\n // --- Validation messages, shown by the browser on submit ---\n required: string;\n selectOption: string;\n selectFile: string;\n /** A required checkbox left unchecked. */\n checkRequired: string;\n dateRequired: string;\n /** A typed date that does not read as one; `example` is today, written the reader's way. */\n dateInvalid: (example: string) => string;\n /** A typed date outside the field's min and max. */\n dateOutOfRange: string;\n /** The date field's button that opens its calendar. */\n openCalendar: string;\n /** The date picker's ready-made periods, and the button for today. */\n presetToday: string;\n presetLast7Days: string;\n presetLast30Days: string;\n presetThisMonth: string;\n presetLastMonth: string;\n presetThisYear: string;\n /** The segments of the date and time inputs: their names, then what an empty one shows. */\n segmentDay: string;\n segmentMonth: string;\n segmentYear: string;\n segmentHour: string;\n segmentMinute: string;\n segmentSecond: string;\n segmentDayPeriod: string;\n placeholderDay: string;\n placeholderMonth: string;\n placeholderYear: string;\n placeholderTime: string;\n /** A required time left empty, and one outside min and max. */\n timeRequired: string;\n timeOutOfRange: string;\n commandPalette: string;\n commandPlaceholder: string;\n commandHintMove: string;\n commandHintRun: string;\n commandHintClose: string;\n sliderMinimum: string;\n sliderMaximum: string;\n stepComplete: string;\n stepCurrent: string;\n stepUpcoming: string;\n stepError: string;\n numberRequired: string;\n decrease: string;\n increase: string;\n /** A phone number typed with the prefix only dialled from inside the country. */\n phoneTrunkPrefix: (prefix: string) => string;\n\n // --- Navigation ---\n openMenu: string;\n closeMenu: string;\n breadcrumb: string;\n secondaryNavigation: string;\n pagination: string;\n previous: string;\n next: string;\n pageOf: (page: number, total: number) => string;\n moreActions: string;\n\n // --- Groups and sections ---\n /** A button or choice group with no label of its own. */\n options: string;\n /** A `kt-form` section with no heading. */\n formSection: string;\n\n // --- Data ---\n selectRow: string;\n selectAll: string;\n total: string;\n /** Column headers of the data table every chart renders for assistive tech. */\n chartSeries: string;\n chartPoint: string;\n chartSlice: string;\n chartShare: string;\n /** Caption of a chart's data table when the chart has no label. */\n chartData: string;\n /** Value column of a single-series chart's data table when the series has no name. */\n chartValue: string;\n\n // --- Overlays ---\n confirmHeading: string;\n confirm: string;\n cancel: string;\n details: string;\n\n // --- Identity ---\n avatar: string;\n}\n\nexport const defaultStrings: Readonly<KtStrings> = Object.freeze({\n clear: 'Clear',\n close: 'Close',\n dismiss: 'Dismiss',\n copy: 'Copy',\n copied: 'Copied',\n copyCode: 'Copy code',\n timeRemaining: 'Time remaining',\n remove: (name: string) => (name ? `Remove ${name}` : 'Remove'),\n\n noOptions: 'No options available',\n noResults: 'No results',\n noActions: 'No actions',\n noData: 'No data to display',\n loading: 'Loading…',\n\n select: 'Select',\n openList: 'Open list',\n closeList: 'Close list',\n showPassword: 'Show password',\n hidePassword: 'Hide password',\n searchCountry: 'Search country or dial code',\n noCountry: 'No country found',\n countryCode: (country: string | undefined) => `Country code: ${country ?? 'none'}`,\n selectedCount: (count: number) => `${count} selected`,\n dragAndDrop: 'Drag and drop or',\n browseFiles: 'browse your files',\n recommendedSize: (size: string) => `Recommended image size: ${size}`,\n selectedFiles: 'Selected files',\n selectDate: 'Select a date',\n selectPeriod: 'Select a period',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n previousYear: 'Previous year',\n nextYear: 'Next year',\n previousYears: 'Previous years',\n nextYears: 'Next years',\n chooseMonth: 'Choose month',\n chooseYear: 'Choose year',\n\n required: 'This field is required.',\n selectOption: 'Select an option.',\n selectFile: 'Select a file.',\n checkRequired: 'Check this box to continue.',\n dateRequired: 'Select a date.',\n dateInvalid: (example: string) => `Enter a date like ${example}.`,\n dateOutOfRange: 'This date is outside the dates you can choose.',\n openCalendar: 'Open calendar',\n presetToday: 'Today',\n presetLast7Days: 'Last 7 days',\n presetLast30Days: 'Last 30 days',\n presetThisMonth: 'This month',\n presetLastMonth: 'Last month',\n presetThisYear: 'This year',\n segmentDay: 'Day',\n segmentMonth: 'Month',\n segmentYear: 'Year',\n segmentHour: 'Hour',\n segmentMinute: 'Minute',\n segmentSecond: 'Second',\n segmentDayPeriod: 'AM or PM',\n placeholderDay: 'dd',\n placeholderMonth: 'mm',\n placeholderYear: 'yyyy',\n placeholderTime: '--',\n timeRequired: 'Enter a time.',\n timeOutOfRange: 'This time is outside the times you can choose.',\n commandPalette: 'Command palette',\n commandPlaceholder: 'Type a command or search…',\n commandHintMove: 'to move',\n commandHintRun: 'to run',\n commandHintClose: 'to close',\n sliderMinimum: 'minimum',\n sliderMaximum: 'maximum',\n stepComplete: 'Completed',\n stepCurrent: 'Current step',\n stepUpcoming: 'Not started',\n stepError: 'Needs attention',\n numberRequired: 'Enter a number.',\n decrease: 'Decrease',\n increase: 'Increase',\n phoneTrunkPrefix: (prefix: string) => `Enter the number without the leading ${prefix}.`,\n\n openMenu: 'Open menu',\n closeMenu: 'Close menu',\n breadcrumb: 'Breadcrumb',\n secondaryNavigation: 'Secondary navigation',\n pagination: 'Pagination',\n previous: 'Previous',\n next: 'Next',\n pageOf: (page: number, total: number) => `Page ${page} / ${total}`,\n moreActions: 'More actions',\n\n options: 'Options',\n formSection: 'Form section',\n\n selectRow: 'Select row',\n selectAll: 'Select all',\n total: 'Total',\n chartSeries: 'Series',\n chartPoint: 'Point',\n chartSlice: 'Slice',\n chartShare: 'Share',\n chartData: 'Chart data',\n chartValue: 'Value',\n\n confirmHeading: 'Are you sure?',\n confirm: 'Confirm',\n cancel: 'Cancel',\n details: 'Details',\n\n avatar: 'Avatar',\n});\n\nlet current: KtStrings = { ...defaultStrings };\nconst listeners = new Set<() => void>();\n\n/** The strings in effect. Elements read them at render time. */\nexport function strings(): Readonly<KtStrings> {\n return current;\n}\n\n/**\n * Replaces some or all of the strings, and re-renders every connected element\n * so the change shows at once — switching language at runtime works.\n */\nexport function setStrings(overrides: Partial<KtStrings>): void {\n current = { ...current, ...overrides };\n for (const listener of listeners) listener();\n}\n\n/** Back to the English defaults. */\nexport function resetStrings(): void {\n setStrings(defaultStrings);\n}\n\n/** Calls `listener` after every `setStrings`. Returns the unsubscribe function. */\nexport function onStringsChange(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n"],"names":["defaultStrings","name","country","count","size","example","prefix","page","total","current","listeners","strings","setStrings","overrides","listener","resetStrings","onStringsChange"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { css as P, html as l, nothing as D } from "lit";
|
|
2
2
|
import { state as T, property as b } from "lit/decorators.js";
|
|
3
3
|
import { classMap as A } from "lit/directives/class-map.js";
|
|
4
|
-
import { K as M, d as O } from "./kt-element-
|
|
4
|
+
import { K as M, d as O } from "./kt-element-COgh6Yr1.js";
|
|
5
5
|
import { u as z, e as E } from "./events-r51msXNf.js";
|
|
6
6
|
import { r as K, d as R } from "./locale-C5xLkGx5.js";
|
|
7
|
-
import { s as Y } from "./index-
|
|
7
|
+
import { s as Y } from "./index-BEWmAE0T.js";
|
|
8
8
|
import "../components/core/kt-icon/kt-icon.js";
|
|
9
9
|
const j = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
10
10
|
function $(a, t) {
|
|
@@ -777,4 +777,4 @@ export {
|
|
|
777
777
|
x as p,
|
|
778
778
|
k as t
|
|
779
779
|
};
|
|
780
|
-
//# sourceMappingURL=kt-calendar-
|
|
780
|
+
//# sourceMappingURL=kt-calendar-D72xa8qr.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kt-calendar-CtwOby1R.js","sources":["../../src/internal/date.ts","../../src/components/forms/kt-calendar/kt-calendar.ts"],"sourcesContent":["/**\n * Calendar dates without a time or a time zone.\n *\n * A date picker deals in days, and `Date` deals in instants: \"2026-03-29\" at\n * local midnight does not exist in some zones on DST night, and a day computed\n * in UTC is off by one for half the planet. So dates here are plain\n * `{ year, month, day }` values (month 1–12), serialised as ISO `YYYY-MM-DD`.\n * `Date` is only built — at noon, clear of any DST gap — to hand to `Intl`\n * for formatting.\n */\n\nexport interface PlainDate {\n readonly year: number;\n readonly month: number;\n readonly day: number;\n}\n\nconst ISO = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nexport function daysInMonth(year: number, month: number): number {\n return new Date(Date.UTC(year, month, 0)).getUTCDate();\n}\n\n/** `2026-09-25` → date, or `null` when malformed or impossible (Feb 30). */\nexport function parseDate(value: string | null | undefined): PlainDate | null {\n const match = ISO.exec(value?.trim() ?? '');\n if (!match) return null;\n const [year, month, day] = [Number(match[1]), Number(match[2]), Number(match[3])];\n if (month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month)) return null;\n return { year, month, day };\n}\n\nexport function formatDate(date: PlainDate): string {\n const pad = (n: number, width = 2) => String(n).padStart(width, '0');\n return `${pad(date.year, 4)}-${pad(date.month)}-${pad(date.day)}`;\n}\n\n/** An ISO 8601 interval, `start/end`. Either half may be missing or malformed. */\nexport function parseRange(value: string | null | undefined): {\n start: PlainDate | null;\n end: PlainDate | null;\n} {\n const [start, end] = (value ?? '').split('/');\n return { start: parseDate(start), end: parseDate(end) };\n}\n\nexport function formatRange(start: PlainDate, end: PlainDate): string {\n return `${formatDate(start)}/${formatDate(end)}`;\n}\n\n/** Negative, zero or positive, like a sort comparator. */\nexport function compareDates(a: PlainDate, b: PlainDate): number {\n return a.year - b.year || a.month - b.month || a.day - b.day;\n}\n\nexport function isSameDay(a: PlainDate | null, b: PlainDate | null): boolean {\n return a !== null && b !== null && compareDates(a, b) === 0;\n}\n\n/** Whether `date` falls between `a` and `b`, inclusive, in either order. */\nexport function isBetween(date: PlainDate, a: PlainDate, b: PlainDate): boolean {\n const [low, high] = compareDates(a, b) <= 0 ? [a, b] : [b, a];\n return compareDates(date, low) >= 0 && compareDates(date, high) <= 0;\n}\n\nfunction fromUtc(time: number): PlainDate {\n const d = new Date(time);\n return { year: d.getUTCFullYear(), month: d.getUTCMonth() + 1, day: d.getUTCDate() };\n}\n\n/** Day arithmetic in UTC, where every day is 24 hours long. */\nexport function addDays(date: PlainDate, days: number): PlainDate {\n return fromUtc(Date.UTC(date.year, date.month - 1, date.day + days));\n}\n\n/** Month arithmetic that clamps: 31 January + 1 month is 28 or 29 February. */\nexport function addMonths(date: PlainDate, months: number): PlainDate {\n const index = date.year * 12 + (date.month - 1) + months;\n const year = Math.floor(index / 12);\n const month = (index % 12) + 1;\n return { year, month, day: Math.min(date.day, daysInMonth(year, month)) };\n}\n\n/** 1 = Monday … 7 = Sunday, as ISO 8601 and `Intl.Locale#weekInfo` count them. */\nexport function isoWeekday(date: PlainDate): number {\n const day = new Date(Date.UTC(date.year, date.month - 1, date.day)).getUTCDay();\n return day === 0 ? 7 : day;\n}\n\n/** The first day of the week containing `date`, weeks starting on `firstDay`. */\nexport function startOfWeek(date: PlainDate, firstDay: number): PlainDate {\n return addDays(date, -((isoWeekday(date) - firstDay + 7) % 7));\n}\n\n/**\n * The six weeks a month view shows — always six, so the calendar keeps its\n * height from one month to the next instead of jumping under the pointer.\n */\nexport function monthGrid(year: number, month: number, firstDay: number): PlainDate[][] {\n let cursor = startOfWeek({ year, month, day: 1 }, firstDay);\n const weeks: PlainDate[][] = [];\n for (let week = 0; week < 6; week += 1) {\n const days: PlainDate[] = [];\n for (let day = 0; day < 7; day += 1) {\n days.push(cursor);\n cursor = addDays(cursor, 1);\n }\n weeks.push(days);\n }\n return weeks;\n}\n\nexport function today(): PlainDate {\n const now = new Date();\n return { year: now.getFullYear(), month: now.getMonth() + 1, day: now.getDate() };\n}\n\n/** A `Date` for `Intl` to format: local noon, clear of any DST transition. */\nexport function toLocalDate(date: PlainDate): Date {\n return new Date(date.year, date.month - 1, date.day, 12);\n}\n\n/**\n * The first day of the week in `locale` — Monday in most of the world,\n * Sunday in the US, Saturday in parts of the Middle East. Read from\n * `Intl.Locale#getWeekInfo` (or the older `weekInfo` getter) where the\n * browser has it, Monday otherwise.\n */\nexport function firstDayOfWeek(locale: string): number {\n try {\n const info = new Intl.Locale(locale) as Intl.Locale & {\n getWeekInfo?: () => { firstDay: number };\n weekInfo?: { firstDay: number };\n };\n const firstDay = info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay;\n return firstDay && firstDay >= 1 && firstDay <= 7 ? firstDay : 1;\n } catch {\n return 1;\n }\n}\n","import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit, uniqueId } from '#internal/events';\nimport { dateFormat, resolveLocale } from '#internal/locale';\nimport { strings } from '#internal/strings';\nimport {\n addDays,\n addMonths,\n compareDates,\n daysInMonth,\n firstDayOfWeek,\n formatDate,\n formatRange,\n isBetween,\n isSameDay,\n monthGrid,\n parseDate,\n parseRange,\n startOfWeek,\n toLocalDate,\n today,\n type PlainDate,\n} from '#internal/date';\nimport '../../core/kt-icon/kt-icon.js';\n\n/** The grid of days, or the panel of years and months the title opens. */\nexport type KtCalendarView = 'day' | 'month';\n\n/** How far the year list reaches without a min or max: birthdays to plans. */\nconst YEARS_BACK = 120;\nconst YEARS_AHEAD = 50;\n\n/** Digits typed into the year list within this long make one year. */\nconst TYPING_PAUSE = 1000;\n\n/**\n * A month calendar to pick a day or a period from, shown in the page.\n *\n * The same calendar `<kt-date-picker>` opens in its popup, for when the\n * calendar is the interface rather than a way to fill a field: a booking\n * page, a dashboard's date filter, a planning view.\n *\n * The title — \"September 2026\" — opens one panel: a scrolling list of years\n * beside the twelve months of the one chosen. A year is a click or four typed\n * digits away, then its month a second click, whatever the distance.\n *\n * Keyboard, in the day grid (the WAI-ARIA date grid pattern): arrows by day\n * and week, Home/End to the week's ends, Page Up/Down by month and with Shift\n * by year, Enter to choose. In the year list: arrows, Page Up/Down by ten,\n * Home/End, or type the year; Enter or Tab on to the months. In the months:\n * arrows, Enter to choose. Escape returns to the days.\n *\n * @element kt-calendar\n *\n * @csspart base - The calendar.\n * @csspart day - A day cell.\n *\n * @fires kt-change - A day, or a whole period, was chosen. `detail: { value }`.\n *\n * @example\n * ```html\n * <kt-calendar value=\"2026-09-25\"></kt-calendar>\n * <kt-calendar range value=\"2026-09-01/2026-09-25\" min=\"2026-01-01\"></kt-calendar>\n * ```\n */\nexport class KtCalendar extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-block;\n --day-size: 32px;\n }\n\n .calendar {\n display: flex;\n flex-direction: column;\n gap: var(--gap-element);\n width: calc(var(--day-size) * 7);\n }\n /* Two months side by side, for a period that spans a month's end. */\n .calendar.two {\n width: calc(var(--day-size) * 14 + var(--month-gap));\n }\n :host {\n --month-gap: 24px;\n }\n .months {\n display: flex;\n gap: var(--month-gap);\n height: 100%;\n }\n .months > table {\n flex: 1;\n }\n .two .header {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: var(--month-gap);\n }\n .two .header .title {\n justify-self: start;\n }\n .second {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .second-title {\n padding-left: 8px;\n color: var(--text-body);\n font: var(--font-normal-medium);\n text-transform: capitalize;\n }\n td.blank {\n pointer-events: none;\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--gap-element);\n }\n .navs {\n display: flex;\n gap: 2px;\n }\n\n .nav,\n .title {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--day-size);\n padding: 0;\n color: var(--text-muted);\n background: none;\n border: none;\n border-radius: var(--radius-input);\n cursor: pointer;\n }\n .nav {\n width: var(--day-size);\n }\n /* The month and year as one control: it is one place in time. */\n /* A faint veil of the text colour at rest, so the title reads as a\n button that opens something rather than as a heading — the same\n lightness of touch on white and on the dark ramp. */\n .title {\n gap: 4px;\n padding: 0 6px 0 10px;\n color: var(--text-body);\n font: var(--font-normal-medium);\n text-transform: capitalize;\n background: color-mix(in srgb, var(--text-body) 6%, transparent);\n transition: background-color var(--duration-instant);\n }\n .title kt-icon {\n color: var(--text-muted);\n transition: transform var(--duration-fast) var(--easing-standard);\n }\n .title[aria-expanded='true'] kt-icon {\n transform: scaleY(-1);\n }\n .nav:hover {\n color: var(--text-body);\n background: var(--color-dark-22);\n }\n .title:hover,\n .title[aria-expanded='true'] {\n background: color-mix(in srgb, var(--text-body) 11%, transparent);\n }\n .nav:focus-visible,\n .title:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n\n /* One height for every view, so the calendar does not shrink under the\n pointer when it switches from days to months or years. */\n .body {\n height: calc(var(--day-size) * 7 + 16px);\n }\n table {\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n border-spacing: 0 2px;\n }\n /* The months keep a cell's height and sit at the top, beside the\n years, rather than stretching into tall blocks. */\n table.wide {\n align-self: start;\n border-spacing: 2px;\n }\n th {\n padding-bottom: 4px;\n color: var(--text-muted);\n font: var(--font-normal-small);\n font-weight: 600;\n }\n th abbr {\n text-decoration: none;\n }\n\n .cell {\n position: relative;\n height: var(--day-size);\n padding: 0;\n color: var(--text-body);\n font: var(--font-normal-regular);\n font-variant-numeric: tabular-nums;\n text-align: center;\n border-radius: var(--radius-input);\n outline: none;\n cursor: pointer;\n }\n .cell:hover {\n background: var(--color-dark-22);\n }\n .cell:focus-visible {\n box-shadow: inset 0 0 0 var(--outline-width) var(--color-primary-base);\n }\n /* Months and years sit three to a row, sharing the height the days use. */\n .wide .cell {\n height: 40px;\n text-transform: capitalize;\n }\n .cell.outside {\n color: var(--text-muted);\n }\n /* Today: a dot under the number, which a selection's fill keeps. */\n .cell.current::after {\n content: '';\n position: absolute;\n bottom: 3px;\n left: 50%;\n width: 4px;\n height: 4px;\n margin-left: -2px;\n background: currentColor;\n border-radius: var(--radius-full);\n }\n\n /* A period reads as one band: the days between are tinted and squared\n off, and only its two ends are rounded. */\n /* A clear band, not a wash: the -soft tint faded on a white popup. */\n .cell.in-range {\n background: color-mix(in srgb, var(--color-primary-base) 18%, transparent);\n border-radius: 0;\n }\n .cell.range-start {\n border-radius: var(--radius-input) 0 0 var(--radius-input);\n }\n .cell.range-end {\n border-radius: 0 var(--radius-input) var(--radius-input) 0;\n }\n .cell.range-start.range-end {\n border-radius: var(--radius-input);\n }\n .cell.selected {\n color: var(--color-white);\n background: var(--color-primary-base);\n }\n\n /* The month and year panel: the years scroll beside the months. */\n .month-year {\n display: grid;\n grid-template-columns: 72px 1fr;\n gap: var(--gap-element);\n height: 100%;\n }\n .years {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding-right: 6px;\n overflow-y: auto;\n border-right: var(--border-width) solid var(--divider-popover);\n outline: none;\n scrollbar-width: thin;\n }\n .year {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--day-size);\n color: var(--text-body);\n font: var(--font-normal-regular);\n font-variant-numeric: tabular-nums;\n border-radius: var(--radius-input);\n outline: none;\n cursor: pointer;\n }\n .year:hover {\n background: var(--color-dark-22);\n }\n .year:focus-visible {\n box-shadow: inset 0 0 0 var(--outline-width) var(--color-primary-base);\n }\n /* Where the list is, not what is chosen: tinted, so the one solid\n fill in the panel stays the chosen month. */\n .year[aria-selected='true'] {\n color: var(--color-primary-text);\n font-weight: 600;\n background: var(--color-primary-soft);\n }\n\n .cell[aria-disabled='true'] {\n color: var(--text-disabled);\n background: none;\n text-decoration: line-through;\n cursor: not-allowed;\n }\n `,\n ];\n\n private readonly liveId = uniqueId('kt-calendar-live');\n private focusCell = false;\n /** Set when the year list should scroll its year into view, and focus it. */\n private focusYear = false;\n /** Digits typed into the year list, and when the last one came. */\n private typed = '';\n private typedAt = 0;\n /** Set while the calendar writes its own value, which should not move it. */\n private committing = false;\n\n @state() private view: KtCalendarView = 'day';\n /** First day of the month the day view shows. */\n @state() private month: PlainDate = { ...today(), day: 1 };\n /** The day, month or year holding the grid's one tab stop. */\n @state() private focused: PlainDate = today();\n /** In a period: the first end chosen, while the second is pending. */\n @state() private anchor: PlainDate | null = null;\n\n /** ISO date, or `start/end` interval with `range`. `null` when empty. */\n @property({ type: String, reflect: true })\n value: string | null = null;\n\n /** Choose a period — two dates — instead of one day. */\n @property({ type: Boolean, reflect: true })\n range = false;\n\n /** Earliest date that can be chosen, ISO. */\n @property({ type: String })\n min = '';\n\n /** Latest date that can be chosen, ISO. */\n @property({ type: String })\n max = '';\n\n /**\n * BCP 47 language tag for names and the first day of the week. Empty: the\n * page's `lang`, then the browser's language.\n */\n @property({ type: String })\n locale = '';\n\n /** How many months the day view shows side by side: 1, or 2 for a period. */\n @property({ type: Number, reflect: true })\n months: 1 | 2 = 1;\n\n /** Accessible name of the calendar. Defaults to the strings registry. */\n @property({ type: String })\n label = '';\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Open on the chosen day, or today, kept inside the bounds.\n this.jumpTo(this.clamp(this.selection.start ?? today()), false);\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n // A value set from outside — a \"today\" button, a reset — moves the\n // calendar to it. One the user just picked leaves it where it is.\n if (changed.has('value') && !this.committing && this.hasUpdated) {\n this.anchor = null;\n const start = this.selection.start;\n if (start) this.jumpTo(this.clamp(start), false);\n }\n this.committing = false;\n }\n\n override updated(): void {\n if (this.view === 'month') this.revealYear(this.focusYear);\n this.focusYear = false;\n if (!this.focusCell) return;\n this.focusCell = false;\n this.shadowRoot?.querySelector<HTMLElement>('.cell[tabindex=\"0\"]')?.focus();\n }\n\n /**\n * Keeps the chosen year in sight in its list — centred when the panel\n * opens — and focuses it when asked. The list scrolls itself; the page\n * never does.\n */\n private revealYear(focus: boolean): void {\n const list = this.shadowRoot?.querySelector<HTMLElement>('.years');\n const option = list?.querySelector<HTMLElement>('[aria-selected=\"true\"]');\n if (!list || !option) return;\n\n const top = option.offsetTop - list.offsetTop;\n if (focus) {\n list.scrollTop = top - (list.clientHeight - option.offsetHeight) / 2;\n option.focus({ preventScroll: true });\n } else if (top < list.scrollTop) {\n list.scrollTop = top;\n } else if (top + option.offsetHeight > list.scrollTop + list.clientHeight) {\n list.scrollTop = top + option.offsetHeight - list.clientHeight;\n }\n }\n\n /** Focuses the grid's current cell — the chosen day, or today. */\n override focus(): void {\n this.focusCell = true;\n this.requestUpdate();\n }\n\n // --- Reading the value ---\n\n private get resolvedLocale(): string {\n return resolveLocale(this.locale);\n }\n\n private get selection(): { start: PlainDate | null; end: PlainDate | null } {\n return this.range\n ? parseRange(this.value)\n : { start: parseDate(this.value), end: parseDate(this.value) };\n }\n\n private get bounds(): { min: PlainDate | null; max: PlainDate | null } {\n return { min: parseDate(this.min), max: parseDate(this.max) };\n }\n\n private clamp(date: PlainDate): PlainDate {\n const { min, max } = this.bounds;\n if (min && compareDates(date, min) < 0) return min;\n if (max && compareDates(date, max) > 0) return max;\n return date;\n }\n\n private isOutOfBounds(date: PlainDate): boolean {\n const { min, max } = this.bounds;\n return (\n (min !== null && compareDates(date, min) < 0) || (max !== null && compareDates(date, max) > 0)\n );\n }\n\n /** A month or a year is unavailable only when every day of it is. */\n private isSpanOutOfBounds(first: PlainDate, last: PlainDate): boolean {\n const { min, max } = this.bounds;\n return (\n (max !== null && compareDates(first, max) > 0) ||\n (min !== null && compareDates(last, min) < 0)\n );\n }\n\n private format(options: Intl.DateTimeFormatOptions, date: PlainDate): string {\n return dateFormat(this.resolvedLocale, options).format(toLocalDate(date));\n }\n\n // --- Moving ---\n\n private get monthSpan(): number {\n return this.months === 2 ? 2 : 1;\n }\n\n /**\n * Moves the tab stop, and the day view with it only when the date leaves\n * the months on screen — moving across two months does not page.\n */\n private jumpTo(date: PlainDate, focus = true): void {\n this.focused = date;\n const index = (date.year - this.month.year) * 12 + (date.month - this.month.month);\n if (index < 0) {\n this.month = { year: date.year, month: date.month, day: 1 };\n } else if (index >= this.monthSpan) {\n this.month = addMonths({ year: date.year, month: date.month, day: 1 }, 1 - this.monthSpan);\n }\n this.focusCell = focus;\n }\n\n /** The header's arrows: the whole view, and the tab stop with it, by a month. */\n private page(by: number): void {\n this.month = addMonths(this.month, by);\n this.focused = addMonths(this.focused, by);\n }\n\n private setView(view: KtCalendarView): void {\n this.view = view;\n if (view === 'month') {\n // Open on the month on screen, and on its year in the list.\n this.focused = { ...this.month, day: this.focused.day };\n this.focusYear = true;\n } else {\n this.focusCell = true;\n }\n }\n\n /** The years the list offers: the bounds, or a span around today. */\n private get yearRange(): { first: number; last: number } {\n const { min, max } = this.bounds;\n const now = today().year;\n return { first: min?.year ?? now - YEARS_BACK, last: max?.year ?? now + YEARS_AHEAD };\n }\n\n // --- Choosing ---\n\n private chooseDay(date: PlainDate): void {\n if (this.isOutOfBounds(date)) return;\n this.focused = date;\n\n if (!this.range) {\n this.commit(formatDate(date));\n return;\n }\n if (!this.anchor) {\n this.anchor = date;\n return;\n }\n const [start, end] =\n compareDates(this.anchor, date) <= 0 ? [this.anchor, date] : [date, this.anchor];\n this.anchor = null;\n this.commit(formatRange(start, end));\n }\n\n private commit(value: string): void {\n this.committing = true;\n this.value = value;\n emit(this, 'kt-change', { value });\n }\n\n private chooseMonth(month: number): void {\n const day = Math.min(this.focused.day, daysInMonth(this.focused.year, month));\n this.jumpTo(this.clamp({ year: this.focused.year, month, day }));\n this.setView('day');\n }\n\n /** Shows a year's months, staying in the panel. */\n private chooseYear(year: number, focus = true): void {\n const { first, last } = this.yearRange;\n const target = Math.min(Math.max(year, first), last);\n const day = Math.min(this.focused.day, daysInMonth(target, this.focused.month));\n this.focused = { year: target, month: this.focused.month, day };\n this.focusYear = focus;\n }\n\n private onYearKeyDown(event: KeyboardEvent): void {\n const { year } = this.focused;\n const { first, last } = this.yearRange;\n\n if (/^\\d$/.test(event.key)) {\n // Four digits in a row make a year: type 1987, land on 1987.\n const now = Date.now();\n this.typed = now - this.typedAt > TYPING_PAUSE ? event.key : this.typed + event.key;\n this.typedAt = now;\n if (this.typed.length === 4) {\n this.chooseYear(Number(this.typed));\n this.typed = '';\n }\n event.preventDefault();\n return;\n }\n\n switch (event.key) {\n case 'ArrowUp':\n this.chooseYear(year - 1);\n break;\n case 'ArrowDown':\n this.chooseYear(year + 1);\n break;\n case 'PageUp':\n this.chooseYear(year - 10);\n break;\n case 'PageDown':\n this.chooseYear(year + 10);\n break;\n case 'Home':\n this.chooseYear(first);\n break;\n case 'End':\n this.chooseYear(last);\n break;\n case 'Enter':\n case ' ':\n // On to the months of the year.\n this.focusCell = true;\n this.requestUpdate();\n break;\n case 'Escape':\n // Back to the days, not out of whatever holds the calendar.\n event.stopPropagation();\n this.setView('day');\n break;\n default:\n return;\n }\n event.preventDefault();\n }\n\n // --- Keyboard ---\n\n private onDayKeyDown(event: KeyboardEvent): void {\n const firstDay = firstDayOfWeek(this.resolvedLocale);\n const from = this.focused;\n let next: PlainDate;\n\n switch (event.key) {\n case 'ArrowLeft':\n next = addDays(from, -1);\n break;\n case 'ArrowRight':\n next = addDays(from, 1);\n break;\n case 'ArrowUp':\n next = addDays(from, -7);\n break;\n case 'ArrowDown':\n next = addDays(from, 7);\n break;\n case 'Home':\n next = startOfWeek(from, firstDay);\n break;\n case 'End':\n next = addDays(startOfWeek(from, firstDay), 6);\n break;\n case 'PageUp':\n next = addMonths(from, event.shiftKey ? -12 : -1);\n break;\n case 'PageDown':\n next = addMonths(from, event.shiftKey ? 12 : 1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.chooseDay(from);\n return;\n default:\n return;\n }\n event.preventDefault();\n this.jumpTo(next);\n }\n\n /** The months, three to a row; crossing a year end moves the year list too. */\n private onPickerKeyDown(event: KeyboardEvent): void {\n const step = (by: number) => addMonths(this.focused, by);\n\n let next: PlainDate;\n switch (event.key) {\n case 'ArrowLeft':\n next = step(-1);\n break;\n case 'ArrowRight':\n next = step(1);\n break;\n case 'ArrowUp':\n next = step(-3);\n break;\n case 'ArrowDown':\n next = step(3);\n break;\n case 'PageUp':\n next = step(-12);\n break;\n case 'PageDown':\n next = step(12);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.chooseMonth(this.focused.month);\n return;\n case 'Escape':\n // Back to the days, not out of whatever holds the calendar.\n event.preventDefault();\n event.stopPropagation();\n this.setView('day');\n return;\n default:\n return;\n }\n event.preventDefault();\n this.focused = next;\n this.focusCell = true;\n }\n\n // --- Rendering ---\n\n private renderHeader(): TemplateResult {\n const s = strings();\n const open = this.view === 'month';\n const shown = open ? this.focused : this.month;\n\n const navs = html`<div class=\"navs\">\n <button type=\"button\" class=\"nav\" aria-label=${s.previousMonth} @click=${() => this.page(-1)}>\n <kt-icon name=\"chevron-left\" size=\"18\"></kt-icon>\n </button>\n <button type=\"button\" class=\"nav\" aria-label=${s.nextMonth} @click=${() => this.page(1)}>\n <kt-icon name=\"chevron-right\" size=\"18\"></kt-icon>\n </button>\n </div>`;\n\n return html`<div class=\"header\">\n <button\n type=\"button\"\n class=\"title\"\n aria-expanded=${open ? 'true' : 'false'}\n @click=${() => this.setView(open ? 'day' : 'month')}\n >\n ${this.format({ month: 'long', year: 'numeric' }, shown)}\n <kt-icon name=\"chevron-down\" size=\"16\"></kt-icon>\n </button>\n ${\n open\n ? nothing\n : this.monthSpan === 2\n ? html`<div class=\"second\">\n <span class=\"second-title\" aria-hidden=\"true\"\n >${this.format({ month: 'long', year: 'numeric' }, addMonths(this.month, 1))}</span\n >\n ${navs}\n </div>`\n : navs\n }\n </div>`;\n }\n\n private renderDay(date: PlainDate, gridMonth: PlainDate): TemplateResult {\n const outside = date.month !== gridMonth.month;\n // Beside a second month, the neighbours' days would show twice: leave them out.\n if (outside && this.monthSpan === 2) return html`<td class=\"blank\" role=\"gridcell\"></td>`;\n\n const { start, end } = this.selection;\n const rangeStart = this.anchor ?? start;\n const rangeEnd = this.anchor ? this.focused : end;\n const [low, high] =\n rangeStart && rangeEnd && compareDates(rangeStart, rangeEnd) > 0\n ? [rangeEnd, rangeStart]\n : [rangeStart, rangeEnd];\n\n const selected = this.range\n ? isSameDay(date, low) || isSameDay(date, high)\n : isSameDay(date, start);\n const inRange = this.range && low !== null && high !== null && isBetween(date, low, high);\n const isToday = isSameDay(date, today());\n\n return html`<td\n part=\"day\"\n role=\"gridcell\"\n class=${classMap({\n cell: true,\n outside,\n current: isToday,\n selected,\n 'in-range': inRange,\n 'range-start': inRange && isSameDay(date, low),\n 'range-end': inRange && isSameDay(date, high),\n })}\n data-date=${formatDate(date)}\n tabindex=${isSameDay(date, this.focused) ? 0 : -1}\n aria-selected=${selected ? 'true' : 'false'}\n aria-disabled=${this.isOutOfBounds(date) ? 'true' : nothing}\n aria-current=${isToday ? 'date' : nothing}\n aria-label=${this.format({ dateStyle: 'full' }, date)}\n @click=${() => this.chooseDay(date)}\n @pointerenter=${() => {\n if (this.anchor) this.focused = date;\n }}\n >\n ${date.day}\n </td>`;\n }\n\n private renderDays(): TemplateResult {\n const grids = Array.from({ length: this.monthSpan }, (_, index) =>\n this.renderMonth(addMonths(this.month, index)),\n );\n return this.monthSpan === 2 ? html`<div class=\"months\">${grids}</div>` : grids[0]!;\n }\n\n private renderMonth(month: PlainDate): TemplateResult {\n const weeks = monthGrid(month.year, month.month, firstDayOfWeek(this.resolvedLocale));\n return html`<table\n role=\"grid\"\n aria-label=${this.format({ month: 'long', year: 'numeric' }, month)}\n @keydown=${this.onDayKeyDown}\n >\n <thead>\n <tr>\n ${weeks[0]!.map(\n (day) =>\n html`<th scope=\"col\">\n <abbr title=${this.format({ weekday: 'long' }, day)}\n >${this.format({ weekday: 'short' }, day)}</abbr\n >\n </th>`,\n )}\n </tr>\n </thead>\n <tbody>\n ${weeks.map(\n (week) =>\n html`<tr>\n ${week.map((day) => this.renderDay(day, month))}\n </tr>`,\n )}\n </tbody>\n </table>`;\n }\n\n /** The panel the title opens: the years, and the twelve months of one. */\n private renderPicker(): TemplateResult {\n const s = strings();\n const { year } = this.focused;\n const now = today();\n const { first, last } = this.yearRange;\n const years = Array.from({ length: last - first + 1 }, (_, index) => first + index);\n\n const months = Array.from({ length: 12 }, (_, index) => {\n const month = index + 1;\n const firstDay = { year, month, day: 1 };\n return {\n month,\n label: this.format({ month: 'short' }, firstDay),\n fullLabel: this.format({ month: 'long', year: 'numeric' }, firstDay),\n selected: month === this.month.month && year === this.month.year,\n current: month === now.month && year === now.year,\n disabled: this.isSpanOutOfBounds(firstDay, {\n year,\n month,\n day: daysInMonth(year, month),\n }),\n };\n });\n const rows = [0, 3, 6, 9].map((start) => months.slice(start, start + 3));\n\n return html`<div class=\"month-year\">\n <div class=\"years\" role=\"listbox\" aria-label=${s.chooseYear} @keydown=${this.onYearKeyDown}>\n ${years.map(\n (candidate) =>\n html`<div\n class=\"year\"\n role=\"option\"\n data-year=${candidate}\n aria-selected=${candidate === year ? 'true' : 'false'}\n tabindex=${candidate === year ? 0 : -1}\n @click=${() => this.chooseYear(candidate)}\n >\n ${candidate}\n </div>`,\n )}\n </div>\n\n <table role=\"grid\" class=\"wide\" aria-label=${s.chooseMonth} @keydown=${this.onPickerKeyDown}>\n <tbody>\n ${rows.map(\n (row) =>\n html`<tr>\n ${row.map(\n (cell) =>\n html`<td\n role=\"gridcell\"\n class=${classMap({\n cell: true,\n selected: cell.selected,\n current: cell.current,\n })}\n data-key=${`${year}-${cell.month}`}\n tabindex=${cell.month === this.focused.month ? 0 : -1}\n aria-selected=${cell.selected ? 'true' : 'false'}\n aria-disabled=${cell.disabled ? 'true' : nothing}\n aria-label=${cell.fullLabel}\n @click=${() => {\n if (!cell.disabled) this.chooseMonth(cell.month);\n }}\n >\n ${cell.label}\n </td>`,\n )}\n </tr>`,\n )}\n </tbody>\n </table>\n </div>`;\n }\n\n override render(): TemplateResult {\n const s = strings();\n const announced =\n this.view === 'day'\n ? this.format({ month: 'long', year: 'numeric' }, this.month)\n : String(this.focused.year);\n\n return html`<div\n part=\"base\"\n class=${classMap({ calendar: true, two: this.monthSpan === 2 })}\n role=\"group\"\n aria-label=${this.label || (this.range ? s.selectPeriod : s.selectDate)}\n >\n <span id=${this.liveId} class=\"visually-hidden\" aria-live=\"polite\">${announced}</span>\n ${this.renderHeader()}\n <div class=\"body\">${this.view === 'day' ? this.renderDays() : this.renderPicker()}</div>\n </div>`;\n }\n}\n\ndefineElement('kt-calendar', KtCalendar);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-calendar': KtCalendar;\n }\n}\n"],"names":["ISO","daysInMonth","year","month","parseDate","value","match","day","formatDate","date","pad","n","width","parseRange","start","end","formatRange","compareDates","b","isSameDay","isBetween","a","low","high","fromUtc","time","d","addDays","days","addMonths","months","index","isoWeekday","startOfWeek","firstDay","monthGrid","cursor","weeks","week","today","now","toLocalDate","firstDayOfWeek","locale","info","YEARS_BACK","YEARS_AHEAD","TYPING_PAUSE","KtCalendar","KtElement","uniqueId","css","changed","focus","list","option","top","resolveLocale","min","max","first","last","options","dateFormat","by","view","emit","target","event","from","next","step","s","strings","open","shown","navs","html","nothing","gridMonth","outside","rangeStart","rangeEnd","selected","inRange","isToday","classMap","grids","_","years","rows","candidate","row","cell","announced","__decorateClass","state","property","defineElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kt-calendar-D72xa8qr.js","sources":["../../src/internal/date.ts","../../src/components/forms/kt-calendar/kt-calendar.ts"],"sourcesContent":["/**\n * Calendar dates without a time or a time zone.\n *\n * A date picker deals in days, and `Date` deals in instants: \"2026-03-29\" at\n * local midnight does not exist in some zones on DST night, and a day computed\n * in UTC is off by one for half the planet. So dates here are plain\n * `{ year, month, day }` values (month 1–12), serialised as ISO `YYYY-MM-DD`.\n * `Date` is only built — at noon, clear of any DST gap — to hand to `Intl`\n * for formatting.\n */\n\nexport interface PlainDate {\n readonly year: number;\n readonly month: number;\n readonly day: number;\n}\n\nconst ISO = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nexport function daysInMonth(year: number, month: number): number {\n return new Date(Date.UTC(year, month, 0)).getUTCDate();\n}\n\n/** `2026-09-25` → date, or `null` when malformed or impossible (Feb 30). */\nexport function parseDate(value: string | null | undefined): PlainDate | null {\n const match = ISO.exec(value?.trim() ?? '');\n if (!match) return null;\n const [year, month, day] = [Number(match[1]), Number(match[2]), Number(match[3])];\n if (month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month)) return null;\n return { year, month, day };\n}\n\nexport function formatDate(date: PlainDate): string {\n const pad = (n: number, width = 2) => String(n).padStart(width, '0');\n return `${pad(date.year, 4)}-${pad(date.month)}-${pad(date.day)}`;\n}\n\n/** An ISO 8601 interval, `start/end`. Either half may be missing or malformed. */\nexport function parseRange(value: string | null | undefined): {\n start: PlainDate | null;\n end: PlainDate | null;\n} {\n const [start, end] = (value ?? '').split('/');\n return { start: parseDate(start), end: parseDate(end) };\n}\n\nexport function formatRange(start: PlainDate, end: PlainDate): string {\n return `${formatDate(start)}/${formatDate(end)}`;\n}\n\n/** Negative, zero or positive, like a sort comparator. */\nexport function compareDates(a: PlainDate, b: PlainDate): number {\n return a.year - b.year || a.month - b.month || a.day - b.day;\n}\n\nexport function isSameDay(a: PlainDate | null, b: PlainDate | null): boolean {\n return a !== null && b !== null && compareDates(a, b) === 0;\n}\n\n/** Whether `date` falls between `a` and `b`, inclusive, in either order. */\nexport function isBetween(date: PlainDate, a: PlainDate, b: PlainDate): boolean {\n const [low, high] = compareDates(a, b) <= 0 ? [a, b] : [b, a];\n return compareDates(date, low) >= 0 && compareDates(date, high) <= 0;\n}\n\nfunction fromUtc(time: number): PlainDate {\n const d = new Date(time);\n return { year: d.getUTCFullYear(), month: d.getUTCMonth() + 1, day: d.getUTCDate() };\n}\n\n/** Day arithmetic in UTC, where every day is 24 hours long. */\nexport function addDays(date: PlainDate, days: number): PlainDate {\n return fromUtc(Date.UTC(date.year, date.month - 1, date.day + days));\n}\n\n/** Month arithmetic that clamps: 31 January + 1 month is 28 or 29 February. */\nexport function addMonths(date: PlainDate, months: number): PlainDate {\n const index = date.year * 12 + (date.month - 1) + months;\n const year = Math.floor(index / 12);\n const month = (index % 12) + 1;\n return { year, month, day: Math.min(date.day, daysInMonth(year, month)) };\n}\n\n/** 1 = Monday … 7 = Sunday, as ISO 8601 and `Intl.Locale#weekInfo` count them. */\nexport function isoWeekday(date: PlainDate): number {\n const day = new Date(Date.UTC(date.year, date.month - 1, date.day)).getUTCDay();\n return day === 0 ? 7 : day;\n}\n\n/** The first day of the week containing `date`, weeks starting on `firstDay`. */\nexport function startOfWeek(date: PlainDate, firstDay: number): PlainDate {\n return addDays(date, -((isoWeekday(date) - firstDay + 7) % 7));\n}\n\n/**\n * The six weeks a month view shows — always six, so the calendar keeps its\n * height from one month to the next instead of jumping under the pointer.\n */\nexport function monthGrid(year: number, month: number, firstDay: number): PlainDate[][] {\n let cursor = startOfWeek({ year, month, day: 1 }, firstDay);\n const weeks: PlainDate[][] = [];\n for (let week = 0; week < 6; week += 1) {\n const days: PlainDate[] = [];\n for (let day = 0; day < 7; day += 1) {\n days.push(cursor);\n cursor = addDays(cursor, 1);\n }\n weeks.push(days);\n }\n return weeks;\n}\n\nexport function today(): PlainDate {\n const now = new Date();\n return { year: now.getFullYear(), month: now.getMonth() + 1, day: now.getDate() };\n}\n\n/** A `Date` for `Intl` to format: local noon, clear of any DST transition. */\nexport function toLocalDate(date: PlainDate): Date {\n return new Date(date.year, date.month - 1, date.day, 12);\n}\n\n/**\n * The first day of the week in `locale` — Monday in most of the world,\n * Sunday in the US, Saturday in parts of the Middle East. Read from\n * `Intl.Locale#getWeekInfo` (or the older `weekInfo` getter) where the\n * browser has it, Monday otherwise.\n */\nexport function firstDayOfWeek(locale: string): number {\n try {\n const info = new Intl.Locale(locale) as Intl.Locale & {\n getWeekInfo?: () => { firstDay: number };\n weekInfo?: { firstDay: number };\n };\n const firstDay = info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay;\n return firstDay && firstDay >= 1 && firstDay <= 7 ? firstDay : 1;\n } catch {\n return 1;\n }\n}\n","import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit, uniqueId } from '#internal/events';\nimport { dateFormat, resolveLocale } from '#internal/locale';\nimport { strings } from '#internal/strings';\nimport {\n addDays,\n addMonths,\n compareDates,\n daysInMonth,\n firstDayOfWeek,\n formatDate,\n formatRange,\n isBetween,\n isSameDay,\n monthGrid,\n parseDate,\n parseRange,\n startOfWeek,\n toLocalDate,\n today,\n type PlainDate,\n} from '#internal/date';\nimport '../../core/kt-icon/kt-icon.js';\n\n/** The grid of days, or the panel of years and months the title opens. */\nexport type KtCalendarView = 'day' | 'month';\n\n/** How far the year list reaches without a min or max: birthdays to plans. */\nconst YEARS_BACK = 120;\nconst YEARS_AHEAD = 50;\n\n/** Digits typed into the year list within this long make one year. */\nconst TYPING_PAUSE = 1000;\n\n/**\n * A month calendar to pick a day or a period from, shown in the page.\n *\n * The same calendar `<kt-date-picker>` opens in its popup, for when the\n * calendar is the interface rather than a way to fill a field: a booking\n * page, a dashboard's date filter, a planning view.\n *\n * The title — \"September 2026\" — opens one panel: a scrolling list of years\n * beside the twelve months of the one chosen. A year is a click or four typed\n * digits away, then its month a second click, whatever the distance.\n *\n * Keyboard, in the day grid (the WAI-ARIA date grid pattern): arrows by day\n * and week, Home/End to the week's ends, Page Up/Down by month and with Shift\n * by year, Enter to choose. In the year list: arrows, Page Up/Down by ten,\n * Home/End, or type the year; Enter or Tab on to the months. In the months:\n * arrows, Enter to choose. Escape returns to the days.\n *\n * @element kt-calendar\n *\n * @csspart base - The calendar.\n * @csspart day - A day cell.\n *\n * @fires kt-change - A day, or a whole period, was chosen. `detail: { value }`.\n *\n * @example\n * ```html\n * <kt-calendar value=\"2026-09-25\"></kt-calendar>\n * <kt-calendar range value=\"2026-09-01/2026-09-25\" min=\"2026-01-01\"></kt-calendar>\n * ```\n */\nexport class KtCalendar extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-block;\n --day-size: 32px;\n }\n\n .calendar {\n display: flex;\n flex-direction: column;\n gap: var(--gap-element);\n width: calc(var(--day-size) * 7);\n }\n /* Two months side by side, for a period that spans a month's end. */\n .calendar.two {\n width: calc(var(--day-size) * 14 + var(--month-gap));\n }\n :host {\n --month-gap: 24px;\n }\n .months {\n display: flex;\n gap: var(--month-gap);\n height: 100%;\n }\n .months > table {\n flex: 1;\n }\n .two .header {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: var(--month-gap);\n }\n .two .header .title {\n justify-self: start;\n }\n .second {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .second-title {\n padding-left: 8px;\n color: var(--text-body);\n font: var(--font-normal-medium);\n text-transform: capitalize;\n }\n td.blank {\n pointer-events: none;\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--gap-element);\n }\n .navs {\n display: flex;\n gap: 2px;\n }\n\n .nav,\n .title {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--day-size);\n padding: 0;\n color: var(--text-muted);\n background: none;\n border: none;\n border-radius: var(--radius-input);\n cursor: pointer;\n }\n .nav {\n width: var(--day-size);\n }\n /* The month and year as one control: it is one place in time. */\n /* A faint veil of the text colour at rest, so the title reads as a\n button that opens something rather than as a heading — the same\n lightness of touch on white and on the dark ramp. */\n .title {\n gap: 4px;\n padding: 0 6px 0 10px;\n color: var(--text-body);\n font: var(--font-normal-medium);\n text-transform: capitalize;\n background: color-mix(in srgb, var(--text-body) 6%, transparent);\n transition: background-color var(--duration-instant);\n }\n .title kt-icon {\n color: var(--text-muted);\n transition: transform var(--duration-fast) var(--easing-standard);\n }\n .title[aria-expanded='true'] kt-icon {\n transform: scaleY(-1);\n }\n .nav:hover {\n color: var(--text-body);\n background: var(--color-dark-22);\n }\n .title:hover,\n .title[aria-expanded='true'] {\n background: color-mix(in srgb, var(--text-body) 11%, transparent);\n }\n .nav:focus-visible,\n .title:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n\n /* One height for every view, so the calendar does not shrink under the\n pointer when it switches from days to months or years. */\n .body {\n height: calc(var(--day-size) * 7 + 16px);\n }\n table {\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n border-spacing: 0 2px;\n }\n /* The months keep a cell's height and sit at the top, beside the\n years, rather than stretching into tall blocks. */\n table.wide {\n align-self: start;\n border-spacing: 2px;\n }\n th {\n padding-bottom: 4px;\n color: var(--text-muted);\n font: var(--font-normal-small);\n font-weight: 600;\n }\n th abbr {\n text-decoration: none;\n }\n\n .cell {\n position: relative;\n height: var(--day-size);\n padding: 0;\n color: var(--text-body);\n font: var(--font-normal-regular);\n font-variant-numeric: tabular-nums;\n text-align: center;\n border-radius: var(--radius-input);\n outline: none;\n cursor: pointer;\n }\n .cell:hover {\n background: var(--color-dark-22);\n }\n .cell:focus-visible {\n box-shadow: inset 0 0 0 var(--outline-width) var(--color-primary-base);\n }\n /* Months and years sit three to a row, sharing the height the days use. */\n .wide .cell {\n height: 40px;\n text-transform: capitalize;\n }\n .cell.outside {\n color: var(--text-muted);\n }\n /* Today: a dot under the number, which a selection's fill keeps. */\n .cell.current::after {\n content: '';\n position: absolute;\n bottom: 3px;\n left: 50%;\n width: 4px;\n height: 4px;\n margin-left: -2px;\n background: currentColor;\n border-radius: var(--radius-full);\n }\n\n /* A period reads as one band: the days between are tinted and squared\n off, and only its two ends are rounded. */\n /* A clear band, not a wash: the -soft tint faded on a white popup. */\n .cell.in-range {\n background: color-mix(in srgb, var(--color-primary-base) 18%, transparent);\n border-radius: 0;\n }\n .cell.range-start {\n border-radius: var(--radius-input) 0 0 var(--radius-input);\n }\n .cell.range-end {\n border-radius: 0 var(--radius-input) var(--radius-input) 0;\n }\n .cell.range-start.range-end {\n border-radius: var(--radius-input);\n }\n .cell.selected {\n color: var(--color-white);\n background: var(--color-primary-base);\n }\n\n /* The month and year panel: the years scroll beside the months. */\n .month-year {\n display: grid;\n grid-template-columns: 72px 1fr;\n gap: var(--gap-element);\n height: 100%;\n }\n .years {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding-right: 6px;\n overflow-y: auto;\n border-right: var(--border-width) solid var(--divider-popover);\n outline: none;\n scrollbar-width: thin;\n }\n .year {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--day-size);\n color: var(--text-body);\n font: var(--font-normal-regular);\n font-variant-numeric: tabular-nums;\n border-radius: var(--radius-input);\n outline: none;\n cursor: pointer;\n }\n .year:hover {\n background: var(--color-dark-22);\n }\n .year:focus-visible {\n box-shadow: inset 0 0 0 var(--outline-width) var(--color-primary-base);\n }\n /* Where the list is, not what is chosen: tinted, so the one solid\n fill in the panel stays the chosen month. */\n .year[aria-selected='true'] {\n color: var(--color-primary-text);\n font-weight: 600;\n background: var(--color-primary-soft);\n }\n\n .cell[aria-disabled='true'] {\n color: var(--text-disabled);\n background: none;\n text-decoration: line-through;\n cursor: not-allowed;\n }\n `,\n ];\n\n private readonly liveId = uniqueId('kt-calendar-live');\n private focusCell = false;\n /** Set when the year list should scroll its year into view, and focus it. */\n private focusYear = false;\n /** Digits typed into the year list, and when the last one came. */\n private typed = '';\n private typedAt = 0;\n /** Set while the calendar writes its own value, which should not move it. */\n private committing = false;\n\n @state() private view: KtCalendarView = 'day';\n /** First day of the month the day view shows. */\n @state() private month: PlainDate = { ...today(), day: 1 };\n /** The day, month or year holding the grid's one tab stop. */\n @state() private focused: PlainDate = today();\n /** In a period: the first end chosen, while the second is pending. */\n @state() private anchor: PlainDate | null = null;\n\n /** ISO date, or `start/end` interval with `range`. `null` when empty. */\n @property({ type: String, reflect: true })\n value: string | null = null;\n\n /** Choose a period — two dates — instead of one day. */\n @property({ type: Boolean, reflect: true })\n range = false;\n\n /** Earliest date that can be chosen, ISO. */\n @property({ type: String })\n min = '';\n\n /** Latest date that can be chosen, ISO. */\n @property({ type: String })\n max = '';\n\n /**\n * BCP 47 language tag for names and the first day of the week. Empty: the\n * page's `lang`, then the browser's language.\n */\n @property({ type: String })\n locale = '';\n\n /** How many months the day view shows side by side: 1, or 2 for a period. */\n @property({ type: Number, reflect: true })\n months: 1 | 2 = 1;\n\n /** Accessible name of the calendar. Defaults to the strings registry. */\n @property({ type: String })\n label = '';\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Open on the chosen day, or today, kept inside the bounds.\n this.jumpTo(this.clamp(this.selection.start ?? today()), false);\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n // A value set from outside — a \"today\" button, a reset — moves the\n // calendar to it. One the user just picked leaves it where it is.\n if (changed.has('value') && !this.committing && this.hasUpdated) {\n this.anchor = null;\n const start = this.selection.start;\n if (start) this.jumpTo(this.clamp(start), false);\n }\n this.committing = false;\n }\n\n override updated(): void {\n if (this.view === 'month') this.revealYear(this.focusYear);\n this.focusYear = false;\n if (!this.focusCell) return;\n this.focusCell = false;\n this.shadowRoot?.querySelector<HTMLElement>('.cell[tabindex=\"0\"]')?.focus();\n }\n\n /**\n * Keeps the chosen year in sight in its list — centred when the panel\n * opens — and focuses it when asked. The list scrolls itself; the page\n * never does.\n */\n private revealYear(focus: boolean): void {\n const list = this.shadowRoot?.querySelector<HTMLElement>('.years');\n const option = list?.querySelector<HTMLElement>('[aria-selected=\"true\"]');\n if (!list || !option) return;\n\n const top = option.offsetTop - list.offsetTop;\n if (focus) {\n list.scrollTop = top - (list.clientHeight - option.offsetHeight) / 2;\n option.focus({ preventScroll: true });\n } else if (top < list.scrollTop) {\n list.scrollTop = top;\n } else if (top + option.offsetHeight > list.scrollTop + list.clientHeight) {\n list.scrollTop = top + option.offsetHeight - list.clientHeight;\n }\n }\n\n /** Focuses the grid's current cell — the chosen day, or today. */\n override focus(): void {\n this.focusCell = true;\n this.requestUpdate();\n }\n\n // --- Reading the value ---\n\n private get resolvedLocale(): string {\n return resolveLocale(this.locale);\n }\n\n private get selection(): { start: PlainDate | null; end: PlainDate | null } {\n return this.range\n ? parseRange(this.value)\n : { start: parseDate(this.value), end: parseDate(this.value) };\n }\n\n private get bounds(): { min: PlainDate | null; max: PlainDate | null } {\n return { min: parseDate(this.min), max: parseDate(this.max) };\n }\n\n private clamp(date: PlainDate): PlainDate {\n const { min, max } = this.bounds;\n if (min && compareDates(date, min) < 0) return min;\n if (max && compareDates(date, max) > 0) return max;\n return date;\n }\n\n private isOutOfBounds(date: PlainDate): boolean {\n const { min, max } = this.bounds;\n return (\n (min !== null && compareDates(date, min) < 0) || (max !== null && compareDates(date, max) > 0)\n );\n }\n\n /** A month or a year is unavailable only when every day of it is. */\n private isSpanOutOfBounds(first: PlainDate, last: PlainDate): boolean {\n const { min, max } = this.bounds;\n return (\n (max !== null && compareDates(first, max) > 0) ||\n (min !== null && compareDates(last, min) < 0)\n );\n }\n\n private format(options: Intl.DateTimeFormatOptions, date: PlainDate): string {\n return dateFormat(this.resolvedLocale, options).format(toLocalDate(date));\n }\n\n // --- Moving ---\n\n private get monthSpan(): number {\n return this.months === 2 ? 2 : 1;\n }\n\n /**\n * Moves the tab stop, and the day view with it only when the date leaves\n * the months on screen — moving across two months does not page.\n */\n private jumpTo(date: PlainDate, focus = true): void {\n this.focused = date;\n const index = (date.year - this.month.year) * 12 + (date.month - this.month.month);\n if (index < 0) {\n this.month = { year: date.year, month: date.month, day: 1 };\n } else if (index >= this.monthSpan) {\n this.month = addMonths({ year: date.year, month: date.month, day: 1 }, 1 - this.monthSpan);\n }\n this.focusCell = focus;\n }\n\n /** The header's arrows: the whole view, and the tab stop with it, by a month. */\n private page(by: number): void {\n this.month = addMonths(this.month, by);\n this.focused = addMonths(this.focused, by);\n }\n\n private setView(view: KtCalendarView): void {\n this.view = view;\n if (view === 'month') {\n // Open on the month on screen, and on its year in the list.\n this.focused = { ...this.month, day: this.focused.day };\n this.focusYear = true;\n } else {\n this.focusCell = true;\n }\n }\n\n /** The years the list offers: the bounds, or a span around today. */\n private get yearRange(): { first: number; last: number } {\n const { min, max } = this.bounds;\n const now = today().year;\n return { first: min?.year ?? now - YEARS_BACK, last: max?.year ?? now + YEARS_AHEAD };\n }\n\n // --- Choosing ---\n\n private chooseDay(date: PlainDate): void {\n if (this.isOutOfBounds(date)) return;\n this.focused = date;\n\n if (!this.range) {\n this.commit(formatDate(date));\n return;\n }\n if (!this.anchor) {\n this.anchor = date;\n return;\n }\n const [start, end] =\n compareDates(this.anchor, date) <= 0 ? [this.anchor, date] : [date, this.anchor];\n this.anchor = null;\n this.commit(formatRange(start, end));\n }\n\n private commit(value: string): void {\n this.committing = true;\n this.value = value;\n emit(this, 'kt-change', { value });\n }\n\n private chooseMonth(month: number): void {\n const day = Math.min(this.focused.day, daysInMonth(this.focused.year, month));\n this.jumpTo(this.clamp({ year: this.focused.year, month, day }));\n this.setView('day');\n }\n\n /** Shows a year's months, staying in the panel. */\n private chooseYear(year: number, focus = true): void {\n const { first, last } = this.yearRange;\n const target = Math.min(Math.max(year, first), last);\n const day = Math.min(this.focused.day, daysInMonth(target, this.focused.month));\n this.focused = { year: target, month: this.focused.month, day };\n this.focusYear = focus;\n }\n\n private onYearKeyDown(event: KeyboardEvent): void {\n const { year } = this.focused;\n const { first, last } = this.yearRange;\n\n if (/^\\d$/.test(event.key)) {\n // Four digits in a row make a year: type 1987, land on 1987.\n const now = Date.now();\n this.typed = now - this.typedAt > TYPING_PAUSE ? event.key : this.typed + event.key;\n this.typedAt = now;\n if (this.typed.length === 4) {\n this.chooseYear(Number(this.typed));\n this.typed = '';\n }\n event.preventDefault();\n return;\n }\n\n switch (event.key) {\n case 'ArrowUp':\n this.chooseYear(year - 1);\n break;\n case 'ArrowDown':\n this.chooseYear(year + 1);\n break;\n case 'PageUp':\n this.chooseYear(year - 10);\n break;\n case 'PageDown':\n this.chooseYear(year + 10);\n break;\n case 'Home':\n this.chooseYear(first);\n break;\n case 'End':\n this.chooseYear(last);\n break;\n case 'Enter':\n case ' ':\n // On to the months of the year.\n this.focusCell = true;\n this.requestUpdate();\n break;\n case 'Escape':\n // Back to the days, not out of whatever holds the calendar.\n event.stopPropagation();\n this.setView('day');\n break;\n default:\n return;\n }\n event.preventDefault();\n }\n\n // --- Keyboard ---\n\n private onDayKeyDown(event: KeyboardEvent): void {\n const firstDay = firstDayOfWeek(this.resolvedLocale);\n const from = this.focused;\n let next: PlainDate;\n\n switch (event.key) {\n case 'ArrowLeft':\n next = addDays(from, -1);\n break;\n case 'ArrowRight':\n next = addDays(from, 1);\n break;\n case 'ArrowUp':\n next = addDays(from, -7);\n break;\n case 'ArrowDown':\n next = addDays(from, 7);\n break;\n case 'Home':\n next = startOfWeek(from, firstDay);\n break;\n case 'End':\n next = addDays(startOfWeek(from, firstDay), 6);\n break;\n case 'PageUp':\n next = addMonths(from, event.shiftKey ? -12 : -1);\n break;\n case 'PageDown':\n next = addMonths(from, event.shiftKey ? 12 : 1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.chooseDay(from);\n return;\n default:\n return;\n }\n event.preventDefault();\n this.jumpTo(next);\n }\n\n /** The months, three to a row; crossing a year end moves the year list too. */\n private onPickerKeyDown(event: KeyboardEvent): void {\n const step = (by: number) => addMonths(this.focused, by);\n\n let next: PlainDate;\n switch (event.key) {\n case 'ArrowLeft':\n next = step(-1);\n break;\n case 'ArrowRight':\n next = step(1);\n break;\n case 'ArrowUp':\n next = step(-3);\n break;\n case 'ArrowDown':\n next = step(3);\n break;\n case 'PageUp':\n next = step(-12);\n break;\n case 'PageDown':\n next = step(12);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.chooseMonth(this.focused.month);\n return;\n case 'Escape':\n // Back to the days, not out of whatever holds the calendar.\n event.preventDefault();\n event.stopPropagation();\n this.setView('day');\n return;\n default:\n return;\n }\n event.preventDefault();\n this.focused = next;\n this.focusCell = true;\n }\n\n // --- Rendering ---\n\n private renderHeader(): TemplateResult {\n const s = strings();\n const open = this.view === 'month';\n const shown = open ? this.focused : this.month;\n\n const navs = html`<div class=\"navs\">\n <button type=\"button\" class=\"nav\" aria-label=${s.previousMonth} @click=${() => this.page(-1)}>\n <kt-icon name=\"chevron-left\" size=\"18\"></kt-icon>\n </button>\n <button type=\"button\" class=\"nav\" aria-label=${s.nextMonth} @click=${() => this.page(1)}>\n <kt-icon name=\"chevron-right\" size=\"18\"></kt-icon>\n </button>\n </div>`;\n\n return html`<div class=\"header\">\n <button\n type=\"button\"\n class=\"title\"\n aria-expanded=${open ? 'true' : 'false'}\n @click=${() => this.setView(open ? 'day' : 'month')}\n >\n ${this.format({ month: 'long', year: 'numeric' }, shown)}\n <kt-icon name=\"chevron-down\" size=\"16\"></kt-icon>\n </button>\n ${\n open\n ? nothing\n : this.monthSpan === 2\n ? html`<div class=\"second\">\n <span class=\"second-title\" aria-hidden=\"true\"\n >${this.format({ month: 'long', year: 'numeric' }, addMonths(this.month, 1))}</span\n >\n ${navs}\n </div>`\n : navs\n }\n </div>`;\n }\n\n private renderDay(date: PlainDate, gridMonth: PlainDate): TemplateResult {\n const outside = date.month !== gridMonth.month;\n // Beside a second month, the neighbours' days would show twice: leave them out.\n if (outside && this.monthSpan === 2) return html`<td class=\"blank\" role=\"gridcell\"></td>`;\n\n const { start, end } = this.selection;\n const rangeStart = this.anchor ?? start;\n const rangeEnd = this.anchor ? this.focused : end;\n const [low, high] =\n rangeStart && rangeEnd && compareDates(rangeStart, rangeEnd) > 0\n ? [rangeEnd, rangeStart]\n : [rangeStart, rangeEnd];\n\n const selected = this.range\n ? isSameDay(date, low) || isSameDay(date, high)\n : isSameDay(date, start);\n const inRange = this.range && low !== null && high !== null && isBetween(date, low, high);\n const isToday = isSameDay(date, today());\n\n return html`<td\n part=\"day\"\n role=\"gridcell\"\n class=${classMap({\n cell: true,\n outside,\n current: isToday,\n selected,\n 'in-range': inRange,\n 'range-start': inRange && isSameDay(date, low),\n 'range-end': inRange && isSameDay(date, high),\n })}\n data-date=${formatDate(date)}\n tabindex=${isSameDay(date, this.focused) ? 0 : -1}\n aria-selected=${selected ? 'true' : 'false'}\n aria-disabled=${this.isOutOfBounds(date) ? 'true' : nothing}\n aria-current=${isToday ? 'date' : nothing}\n aria-label=${this.format({ dateStyle: 'full' }, date)}\n @click=${() => this.chooseDay(date)}\n @pointerenter=${() => {\n if (this.anchor) this.focused = date;\n }}\n >\n ${date.day}\n </td>`;\n }\n\n private renderDays(): TemplateResult {\n const grids = Array.from({ length: this.monthSpan }, (_, index) =>\n this.renderMonth(addMonths(this.month, index)),\n );\n return this.monthSpan === 2 ? html`<div class=\"months\">${grids}</div>` : grids[0]!;\n }\n\n private renderMonth(month: PlainDate): TemplateResult {\n const weeks = monthGrid(month.year, month.month, firstDayOfWeek(this.resolvedLocale));\n return html`<table\n role=\"grid\"\n aria-label=${this.format({ month: 'long', year: 'numeric' }, month)}\n @keydown=${this.onDayKeyDown}\n >\n <thead>\n <tr>\n ${weeks[0]!.map(\n (day) =>\n html`<th scope=\"col\">\n <abbr title=${this.format({ weekday: 'long' }, day)}\n >${this.format({ weekday: 'short' }, day)}</abbr\n >\n </th>`,\n )}\n </tr>\n </thead>\n <tbody>\n ${weeks.map(\n (week) =>\n html`<tr>\n ${week.map((day) => this.renderDay(day, month))}\n </tr>`,\n )}\n </tbody>\n </table>`;\n }\n\n /** The panel the title opens: the years, and the twelve months of one. */\n private renderPicker(): TemplateResult {\n const s = strings();\n const { year } = this.focused;\n const now = today();\n const { first, last } = this.yearRange;\n const years = Array.from({ length: last - first + 1 }, (_, index) => first + index);\n\n const months = Array.from({ length: 12 }, (_, index) => {\n const month = index + 1;\n const firstDay = { year, month, day: 1 };\n return {\n month,\n label: this.format({ month: 'short' }, firstDay),\n fullLabel: this.format({ month: 'long', year: 'numeric' }, firstDay),\n selected: month === this.month.month && year === this.month.year,\n current: month === now.month && year === now.year,\n disabled: this.isSpanOutOfBounds(firstDay, {\n year,\n month,\n day: daysInMonth(year, month),\n }),\n };\n });\n const rows = [0, 3, 6, 9].map((start) => months.slice(start, start + 3));\n\n return html`<div class=\"month-year\">\n <div class=\"years\" role=\"listbox\" aria-label=${s.chooseYear} @keydown=${this.onYearKeyDown}>\n ${years.map(\n (candidate) =>\n html`<div\n class=\"year\"\n role=\"option\"\n data-year=${candidate}\n aria-selected=${candidate === year ? 'true' : 'false'}\n tabindex=${candidate === year ? 0 : -1}\n @click=${() => this.chooseYear(candidate)}\n >\n ${candidate}\n </div>`,\n )}\n </div>\n\n <table role=\"grid\" class=\"wide\" aria-label=${s.chooseMonth} @keydown=${this.onPickerKeyDown}>\n <tbody>\n ${rows.map(\n (row) =>\n html`<tr>\n ${row.map(\n (cell) =>\n html`<td\n role=\"gridcell\"\n class=${classMap({\n cell: true,\n selected: cell.selected,\n current: cell.current,\n })}\n data-key=${`${year}-${cell.month}`}\n tabindex=${cell.month === this.focused.month ? 0 : -1}\n aria-selected=${cell.selected ? 'true' : 'false'}\n aria-disabled=${cell.disabled ? 'true' : nothing}\n aria-label=${cell.fullLabel}\n @click=${() => {\n if (!cell.disabled) this.chooseMonth(cell.month);\n }}\n >\n ${cell.label}\n </td>`,\n )}\n </tr>`,\n )}\n </tbody>\n </table>\n </div>`;\n }\n\n override render(): TemplateResult {\n const s = strings();\n const announced =\n this.view === 'day'\n ? this.format({ month: 'long', year: 'numeric' }, this.month)\n : String(this.focused.year);\n\n return html`<div\n part=\"base\"\n class=${classMap({ calendar: true, two: this.monthSpan === 2 })}\n role=\"group\"\n aria-label=${this.label || (this.range ? s.selectPeriod : s.selectDate)}\n >\n <span id=${this.liveId} class=\"visually-hidden\" aria-live=\"polite\">${announced}</span>\n ${this.renderHeader()}\n <div class=\"body\">${this.view === 'day' ? this.renderDays() : this.renderPicker()}</div>\n </div>`;\n }\n}\n\ndefineElement('kt-calendar', KtCalendar);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-calendar': KtCalendar;\n }\n}\n"],"names":["ISO","daysInMonth","year","month","parseDate","value","match","day","formatDate","date","pad","n","width","parseRange","start","end","formatRange","compareDates","b","isSameDay","isBetween","a","low","high","fromUtc","time","d","addDays","days","addMonths","months","index","isoWeekday","startOfWeek","firstDay","monthGrid","cursor","weeks","week","today","now","toLocalDate","firstDayOfWeek","locale","info","YEARS_BACK","YEARS_AHEAD","TYPING_PAUSE","KtCalendar","KtElement","uniqueId","css","changed","focus","list","option","top","resolveLocale","min","max","first","last","options","dateFormat","by","view","emit","target","event","from","next","step","s","strings","open","shown","navs","html","nothing","gridMonth","outside","rangeStart","rangeEnd","selected","inRange","isToday","classMap","grids","_","years","rows","candidate","row","cell","announced","__decorateClass","state","property","defineElement"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { LitElement as n, css as i } from "lit";
|
|
2
|
-
import { o } from "./index-
|
|
2
|
+
import { o } from "./index-BEWmAE0T.js";
|
|
3
3
|
const t = "kt-strings";
|
|
4
4
|
class c extends n {
|
|
5
5
|
static {
|
|
@@ -49,4 +49,4 @@ export {
|
|
|
49
49
|
c as K,
|
|
50
50
|
d
|
|
51
51
|
};
|
|
52
|
-
//# sourceMappingURL=kt-element-
|
|
52
|
+
//# sourceMappingURL=kt-element-COgh6Yr1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kt-element-
|
|
1
|
+
{"version":3,"file":"kt-element-COgh6Yr1.js","sources":["../../src/internal/kt-element.ts"],"sourcesContent":["import { LitElement, css, type CSSResultGroup, type PropertyValues } from 'lit';\nimport { onStringsChange } from './strings.js';\n\n/**\n * The key a `setStrings` call marks in `changedProperties`, so an element can\n * recompute copy it caches outside `render()` — a validation message.\n */\nconst STRINGS_CHANGED = 'kt-strings';\n\n/**\n * Base class for every Kanto element.\n *\n * It exists for two reasons. First, `box-sizing: border-box` does not cross a\n * shadow boundary, so each root has to re-establish it. Second, `[hidden]`\n * loses to a `:host { display: flex }` rule inside the shadow root, and every\n * element in this system sets its own display — without the override here,\n * hiding a Kanto element from the outside silently does nothing.\n */\nexport class KtElement extends LitElement {\n static override styles: CSSResultGroup = css`\n :host {\n box-sizing: border-box;\n }\n\n :host([hidden]) {\n display: none !important;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: inherit;\n }\n\n /* Read by assistive technology, never drawn. */\n .visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n }\n `;\n\n private unsubscribeStrings: (() => void) | undefined;\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Copy comes from the strings registry at render time; follow it when an\n // application switches language.\n // A fresh old value, because Lit skips a named update whose value did not\n // change — and 'kt-strings' is not a property, so it is always undefined.\n this.unsubscribeStrings = onStringsChange(() =>\n this.requestUpdate(STRINGS_CHANGED, Symbol('previous strings')),\n );\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.unsubscribeStrings?.();\n this.unsubscribeStrings = undefined;\n }\n\n /** True when this update was triggered by `setStrings`. */\n protected stringsChanged(changed: PropertyValues): boolean {\n return changed.has(STRINGS_CHANGED);\n }\n}\n\n/**\n * Registers a custom element, tolerating a repeat call.\n *\n * A design system gets loaded twice more often than you would like — two\n * versions in one dependency tree, a dev-server hot reload, a micro-frontend\n * mounting a second copy. `customElements.define` throws on a duplicate tag\n * and would take the whole page down with it.\n */\nexport function defineElement(tag: string, ctor: CustomElementConstructor): void {\n if (customElements.get(tag)) return;\n customElements.define(tag, ctor);\n}\n"],"names":["STRINGS_CHANGED","KtElement","LitElement","css","onStringsChange","changed","defineElement","tag","ctor"],"mappings":";;AAOA,MAAMA,IAAkB;AAWjB,MAAMC,UAAkBC,EAAW;AAAA,EACxC,OAAA;AAAA,SAAgB,SAAyBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAAA,EA4BhC,oBAA0B;AACjC,UAAM,kBAAA,GAKN,KAAK,qBAAqBC;AAAA,MAAgB,MACxC,KAAK,cAAcJ,GAAiB,uBAAO,kBAAkB,CAAC;AAAA,IAAA;AAAA,EAElE;AAAA,EAES,uBAA6B;AACpC,UAAM,qBAAA,GACN,KAAK,qBAAA,GACL,KAAK,qBAAqB;AAAA,EAC5B;AAAA;AAAA,EAGU,eAAeK,GAAkC;AACzD,WAAOA,EAAQ,IAAIL,CAAe;AAAA,EACpC;AACF;AAUO,SAASM,EAAcC,GAAaC,GAAsC;AAC/E,EAAI,eAAe,IAAID,CAAG,KAC1B,eAAe,OAAOA,GAAKC,CAAI;AACjC;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numbers-QyecMiSJ.js","sources":["../../src/internal/numbers.ts"],"sourcesContent":["/** How many decimals `n` is written with: 0.25 has two, 1e-7 seven. */\nexport function decimalsOf(n: number): number {\n if (!Number.isFinite(n)) return 0;\n const [mantissa = '', exponent] = n.toExponential().split('e');\n const digits = (mantissa.split('.')[1] ?? '').length;\n return Math.max(0, digits - Number(exponent));\n}\n"],"names":["decimalsOf","n","mantissa","exponent","digits"],"mappings":"AACO,SAASA,EAAWC,GAAmB;AAC5C,MAAI,CAAC,OAAO,SAASA,CAAC,EAAG,QAAO;AAChC,QAAM,CAACC,IAAW,IAAIC,CAAQ,IAAIF,EAAE,cAAA,EAAgB,MAAM,GAAG,GACvDG,KAAUF,EAAS,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;AAC9C,SAAO,KAAK,IAAI,GAAGE,IAAS,OAAOD,CAAQ,CAAC;AAC9C;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { css as b, nothing as h, html as p } from "lit";
|
|
2
2
|
import { state as d, property as u } from "lit/decorators.js";
|
|
3
3
|
import { classMap as y } from "lit/directives/class-map.js";
|
|
4
|
-
import { K as v } from "./kt-element-
|
|
4
|
+
import { K as v } from "./kt-element-COgh6Yr1.js";
|
|
5
5
|
import { u as g, e as k } from "./events-r51msXNf.js";
|
|
6
6
|
import { a as w, s as $, b as S } from "./form-control-B74_EHtG.js";
|
|
7
7
|
import { r as K } from "./locale-C5xLkGx5.js";
|
|
@@ -381,4 +381,4 @@ n([
|
|
|
381
381
|
export {
|
|
382
382
|
c as K
|
|
383
383
|
};
|
|
384
|
-
//# sourceMappingURL=segmented-field-
|
|
384
|
+
//# sourceMappingURL=segmented-field-BCjCGF4I.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"segmented-field-BBXR4XFL.js","sources":["../../src/internal/segments.ts","../../src/internal/segmented-field.ts"],"sourcesContent":["/**\n * The arithmetic of a segmented field — a day, a month, a year, an hour —\n * each typed digit by digit and stepped with the arrows. Pure, so the two\n * fields that share it, `<kt-date-input>` and `<kt-time-input>`, agree on\n * every key.\n */\n\nexport interface SegmentSpec {\n readonly min: number;\n readonly max: number;\n /** Digits when full: 2 for a day, 4 for a year. */\n readonly length: number;\n}\n\n/**\n * The segment's text once `digit` is typed, and whether the focus should move\n * on. It moves on when the segment is full, or as soon as no further digit\n * could follow — a day starting with 4 is the 4th. A digit that would\n * overshoot the maximum, or one typed into a full segment, starts it over.\n */\nexport function typeDigit(\n current: string,\n digit: string,\n spec: SegmentSpec,\n): { text: string; advance: boolean } {\n let text = current.length >= spec.length ? digit : current + digit;\n if (Number(text) > spec.max) text = digit;\n const advance = text.length >= spec.length || Number(text) * 10 > spec.max;\n return { text, advance };\n}\n\n/**\n * The value an arrow press lands on: the next multiple of the step — counted\n * from the minimum — in the direction of `by`, wrapping past either end. An\n * empty segment starts from its first value going up, its last going down.\n */\nexport function stepSegment(value: number | null, by: number, spec: SegmentSpec): number {\n const step = Math.abs(by) || 1;\n const first = spec.min;\n const last = spec.min + Math.floor((spec.max - spec.min) / step) * step;\n if (value === null) return by > 0 ? first : last;\n\n const offset = value - spec.min;\n if (by > 0) {\n const next = spec.min + (Math.floor(offset / step) + 1) * step;\n return next > spec.max ? first : next;\n }\n const next = offset % step === 0 ? value - step : spec.min + Math.floor(offset / step) * step;\n return next < spec.min ? last : next;\n}\n\n/** A value written with the segment's leading zeros: 4 → \"04\". */\nexport function padSegment(value: number, spec: SegmentSpec): string {\n return String(value).padStart(spec.length, '0');\n}\n","import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement } from './kt-element.js';\nimport { emit, uniqueId } from './events.js';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from './form-control.js';\nimport { resolveLocale } from './locale.js';\nimport { padSegment, stepSegment, typeDigit, type SegmentSpec } from './segments.js';\n\n/** One part of a segmented field: a number typed digit by digit, or one of a few words. */\nexport interface Segment {\n readonly key: string;\n readonly label: string;\n /** What the segment shows while empty: \"dd\", \"--\". */\n readonly placeholder: string;\n /** A number, typed and stepped within these bounds… */\n readonly spec?: SegmentSpec;\n /** …stepped by this much with the arrows… */\n readonly step?: number;\n /** …or one of these words, picked by its first letter: AM, PM. */\n readonly choices?: readonly string[];\n}\n\n/** What a segmented field is made of: segments, and the characters between them. */\nexport type FieldItem = Segment | { readonly literal: string };\n\nconst isSegment = (item: FieldItem): item is Segment => 'key' in item;\n\n/** Characters that move on to the next segment, as a typist expects. */\nconst SEPARATORS = new Set(['/', '.', '-', ':', ',', ' ']);\n\nexport type KtSegmentedFieldSize = 'small' | 'medium' | 'large';\n\n/**\n * The common ground of `<kt-date-input>` and `<kt-time-input>`: a field of\n * segments — a day, a month, an hour — each its own spinbutton, typed digit by\n * digit, stepped with the arrows, the focus moving on as each fills.\n *\n * Each segment is `contenteditable`, so a phone shows its number pad, but the\n * text never changes behind the field's back: every keystroke and every input\n * event is turned into the segment's new value here. A subclass says what its\n * segments are, how they read into a value, and how a value fills them.\n */\nexport abstract class KtSegmentedField extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n --field-height: var(--button-height);\n }\n :host([size='small']) {\n --field-height: var(--button-height-small);\n }\n :host([size='large']) {\n --field-height: var(--button-height-large);\n }\n\n /* The field as kt-input draws one: a fill with a resting hairline, an\n outline on hover and focus that never reflows it. */\n .field {\n display: flex;\n align-items: center;\n gap: var(--gap-element);\n height: var(--field-height);\n /* Less the segment's own padding, so the digits line up with a\n kt-input's text. */\n padding: 0 10px 0 calc(var(--button-padding-x) - 2px);\n color: var(--text-body);\n font: var(--font-input);\n background-color: var(--surface-field);\n border: var(--border-width) solid var(--border-field);\n border-radius: var(--radius-input);\n outline: var(--outline-width) solid transparent;\n cursor: text;\n transition: outline-color var(--duration-instant);\n }\n .field:hover {\n outline: var(--outline-width) solid var(--color-text-700);\n }\n .field:focus-within,\n .field.open {\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n .field.error,\n .field.error:hover,\n .field.error:focus-within {\n outline: var(--outline-width) solid var(--color-danger-base);\n }\n .field.disabled {\n color: var(--text-disabled);\n background-color: var(--color-dark-14);\n cursor: not-allowed;\n }\n\n .segments {\n display: flex;\n flex: 1;\n align-items: center;\n min-width: 0;\n font-variant-numeric: tabular-nums;\n }\n\n /* A segment takes a tint while it has focus, so it is plain which part\n a digit will go into; the caret itself would only flicker. */\n .segment {\n padding: 1px 2px;\n border-radius: calc(4px * var(--radius-scale, 1));\n outline: none;\n caret-color: transparent;\n white-space: nowrap;\n }\n .segment.empty {\n color: var(--text-muted);\n }\n .segment:focus {\n color: var(--color-primary-text);\n background: var(--color-primary-soft);\n }\n .error .segment:not(.empty) {\n color: var(--color-danger-text);\n }\n .literal {\n padding: 0 1px;\n color: var(--text-muted);\n }\n\n .error-icon {\n flex: none;\n color: var(--color-danger-text);\n }\n `,\n ];\n\n protected internals: UsableInternals | null = null;\n private defaultValue: string | null = null;\n /** Set while the field writes its own value, which should not refill it. */\n private committing = false;\n protected readonly errorId = uniqueId('kt-segmented-error');\n\n /** What each segment holds, by key: digits, or the index of a choice. */\n @state() protected texts: Record<string, string> = {};\n /** Why the segments do not make a value, when they are all filled. */\n @state() protected typedError = '';\n @state() private focusedKey: string | null = null;\n /** Disabled by an enclosing `<fieldset>`, which leaves `disabled` alone. */\n @state() private formDisabled = false;\n\n @property({ type: String, reflect: true })\n value: string | null = null;\n\n @property({ type: String })\n name = '';\n\n /** Accessible name of the field, when no `<kt-label-input>` wraps it. */\n @property({ type: String })\n label = '';\n\n /** BCP 47 locale for the order and names of the segments. Empty: page, then browser. */\n @property({ type: String })\n locale = '';\n\n @property({ type: String })\n min = '';\n\n @property({ type: String })\n max = '';\n\n @property({ type: String, reflect: true })\n size: KtSegmentedFieldSize = 'medium';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /** Error message. A non-empty value puts the field in its error state. */\n @property({ type: String, reflect: true })\n error = '';\n\n // --- What a subclass says ---\n\n /** The segments, in order, with what goes between them. */\n protected abstract items(): FieldItem[];\n /** What each segment holds for a value. */\n protected abstract fill(value: string | null): Record<string, string>;\n /** The value the segments make — null until they all hold something — and why not, if not. */\n protected abstract read(texts: Record<string, string>): { value: string | null; error: string };\n /** The message of a required field left empty. */\n protected abstract requiredMessage(): string;\n /** Anything after the segments: a calendar button. */\n protected renderAfter(): TemplateResult | typeof nothing {\n return nothing;\n }\n /**\n * What a segment left half-typed becomes when the focus leaves it — a\n * two-digit year written out — or null to leave it as typed.\n */\n protected completeOnBlur(_segment: Segment, _text: string): string | null {\n return null;\n }\n /** Whether a popup belonging to the field is open, for the field's outline. */\n protected get expanded(): boolean {\n return false;\n }\n\n // --- Lifecycle ---\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultValue = this.value;\n this.texts = this.fill(this.value);\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n // A value set from outside fills the segments; one the field wrote does not.\n if ((changed.has('value') || changed.has('locale')) && !this.committing) {\n this.texts = this.fill(this.value);\n this.typedError = '';\n }\n this.committing = false;\n\n if (\n changed.has('value') ||\n changed.has('required') ||\n changed.has('error') ||\n changed.has('typedError' as keyof KtSegmentedField) ||\n this.stringsChanged(changed)\n ) {\n setFormValue(this.internals, this.value);\n const missing = this.required && this.value === null && !this.typedError;\n setValidity(\n this.internals,\n {\n valueMissing: missing,\n badInput: Boolean(this.typedError),\n customError: Boolean(this.error),\n },\n this.error || this.typedError || (missing ? this.requiredMessage() : ''),\n );\n }\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n this.texts = this.fill(this.value);\n this.typedError = '';\n }\n\n /**\n * Called by the platform when the control's disabled state changes — its\n * own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.\n */\n formDisabledCallback(disabled: boolean): void {\n this.formDisabled = disabled;\n }\n\n /** Called by the platform when the browser restores a session. */\n formStateRestoreCallback(state: string | null): void {\n this.value = state;\n }\n\n /** Focuses the first segment. */\n override focus(options?: FocusOptions): void {\n this.segmentElements()[0]?.focus(options);\n }\n\n protected get inactive(): boolean {\n return this.disabled || this.formDisabled;\n }\n\n protected get resolvedLocale(): string {\n return resolveLocale(this.locale);\n }\n\n // --- Values ---\n\n /** Sets a value chosen outside the segments — a day picked in a calendar. */\n protected commitValue(value: string | null): void {\n this.texts = this.fill(value);\n this.typedError = '';\n this.apply(value);\n }\n\n private setText(key: string, text: string): void {\n this.texts = { ...this.texts, [key]: text };\n const { value, error } = this.read(this.texts);\n this.typedError = error;\n this.apply(value);\n }\n\n private apply(value: string | null): void {\n if (value === this.value) return;\n this.committing = true;\n this.value = value;\n emit(this, 'kt-change', { value });\n }\n\n // --- Keyboard ---\n\n private segmentElements(): HTMLElement[] {\n return [...(this.shadowRoot?.querySelectorAll<HTMLElement>('[role=\"spinbutton\"]') ?? [])];\n }\n\n private focusSegment(index: number): void {\n this.segmentElements()[index]?.focus();\n }\n\n /** One key's effect on a segment; true when the key was the field's to handle. */\n private applyKey(key: string, segment: Segment, index: number): boolean {\n const text = this.texts[segment.key] ?? '';\n\n if (/^\\d$/.test(key) && segment.spec) {\n const typed = typeDigit(text, key, segment.spec);\n this.setText(segment.key, typed.text);\n if (typed.advance) this.focusSegment(index + 1);\n return true;\n }\n if (segment.choices && /^\\p{L}$/u.test(key)) {\n const pick = segment.choices.findIndex((choice) =>\n choice.toLowerCase().startsWith(key.toLowerCase()),\n );\n if (pick >= 0) {\n this.setText(segment.key, String(pick));\n this.focusSegment(index + 1);\n }\n return true;\n }\n\n switch (key) {\n case 'ArrowUp':\n case 'ArrowDown': {\n const by = key === 'ArrowUp' ? 1 : -1;\n if (segment.spec) {\n const current = text === '' ? null : Number(text);\n const next = stepSegment(current, by * (segment.step ?? 1), segment.spec);\n this.setText(segment.key, padSegment(next, segment.spec));\n } else if (segment.choices) {\n const count = segment.choices.length;\n const current = text === '' ? (by > 0 ? -1 : 0) : Number(text);\n this.setText(segment.key, String((current + by + count) % count));\n }\n return true;\n }\n case 'Home':\n case 'End':\n if (segment.spec) {\n const bound = key === 'Home' ? segment.spec.min : segment.spec.max;\n this.setText(segment.key, padSegment(bound, segment.spec));\n }\n return true;\n case 'ArrowLeft':\n this.focusSegment(index - 1);\n return true;\n case 'ArrowRight':\n this.focusSegment(index + 1);\n return true;\n case 'Backspace':\n case 'Delete':\n // Erase a digit at a time; once empty, Backspace goes back a segment.\n if (text) this.setText(segment.key, segment.choices ? '' : text.slice(0, -1));\n else if (key === 'Backspace') this.focusSegment(index - 1);\n return true;\n default:\n if (SEPARATORS.has(key)) {\n if (text) this.focusSegment(index + 1);\n return true;\n }\n // Any other character would land in the contenteditable as text.\n return key.length === 1;\n }\n }\n\n private onKeyDown(event: KeyboardEvent, segment: Segment, index: number): void {\n if (this.inactive || event.metaKey || event.ctrlKey || event.altKey) return;\n if (this.applyKey(event.key, segment, index)) event.preventDefault();\n }\n\n /**\n * What a phone's keyboard sends: input events rather than key presses.\n * The text is never left to the browser; each character goes through the\n * same path as a key.\n */\n private onBeforeInput(event: InputEvent, segment: Segment, index: number): void {\n event.preventDefault();\n if (this.inactive) return;\n if (event.inputType.startsWith('delete')) {\n this.applyKey('Backspace', segment, index);\n return;\n }\n for (const character of event.data ?? '') this.applyKey(character, segment, index);\n }\n\n /** A click on the field's padding or separators lands in its first empty segment. */\n private onFieldClick(event: MouseEvent): void {\n if (this.inactive) return;\n if ((event.target as HTMLElement).closest('[role=\"spinbutton\"], button, kt-tooltip')) return;\n const segments = this.items().filter(isSegment);\n const empty = segments.findIndex((segment) => !this.texts[segment.key]);\n this.focusSegment(empty >= 0 ? empty : segments.length - 1);\n }\n\n // --- Rendering ---\n\n private renderSegment(segment: Segment, index: number): TemplateResult {\n const text = this.texts[segment.key] ?? '';\n const focused = this.focusedKey === segment.key;\n let shown = segment.placeholder;\n let now: number | typeof nothing = nothing;\n if (text !== '') {\n now = Number(text);\n if (segment.choices) shown = segment.choices[Number(text)] ?? '';\n else if (segment.spec) shown = focused ? text : padSegment(Number(text), segment.spec);\n }\n\n return html`<span\n part=\"segment\"\n role=\"spinbutton\"\n class=${classMap({ segment: true, empty: text === '' })}\n data-key=${segment.key}\n tabindex=${this.inactive ? -1 : 0}\n contenteditable=${this.inactive ? 'false' : 'true'}\n inputmode=${segment.spec ? 'numeric' : 'text'}\n spellcheck=\"false\"\n autocorrect=\"off\"\n enterkeyhint=\"next\"\n aria-label=${segment.label}\n aria-valuemin=${segment.spec ? segment.spec.min : nothing}\n aria-valuemax=${segment.spec ? segment.spec.max : nothing}\n aria-valuenow=${now}\n aria-valuetext=${text === '' ? segment.placeholder : shown}\n aria-disabled=${this.inactive ? 'true' : nothing}\n @keydown=${(event: KeyboardEvent) => this.onKeyDown(event, segment, index)}\n @beforeinput=${(event: InputEvent) => this.onBeforeInput(event, segment, index)}\n @focus=${() => {\n this.focusedKey = segment.key;\n }}\n @blur=${() => {\n this.focusedKey = null;\n const completed = this.completeOnBlur(segment, this.texts[segment.key] ?? '');\n if (completed !== null && completed !== this.texts[segment.key]) {\n this.setText(segment.key, completed);\n }\n }}\n >${shown}</span\n >`;\n }\n\n override render(): TemplateResult {\n const error = this.error || this.typedError;\n let index = -1;\n\n return html`${\n error ? html`<span id=${this.errorId} class=\"visually-hidden\">${error}</span>` : nothing\n }\n <div\n part=\"field\"\n class=${classMap({\n field: true,\n error: Boolean(error),\n disabled: this.inactive,\n open: this.expanded,\n })}\n role=\"group\"\n aria-label=${this.label || nothing}\n aria-invalid=${error ? 'true' : nothing}\n aria-describedby=${error ? this.errorId : nothing}\n @click=${this.onFieldClick}\n >\n <div class=\"segments\">\n ${this.items().map((item) => {\n if (!isSegment(item)) {\n return html`<span class=\"literal\" aria-hidden=\"true\">${item.literal}</span>`;\n }\n index += 1;\n return this.renderSegment(item, index);\n })}\n </div>\n ${\n error\n ? html`<kt-tooltip class=\"error-icon\" text=${error} ?open=${this.focusedKey !== null}>\n <kt-icon name=\"circle-alert\" size=\"18\"></kt-icon>\n </kt-tooltip>`\n : nothing\n }\n ${this.renderAfter()}\n </div>`;\n }\n}\n"],"names":["typeDigit","current","digit","spec","text","advance","stepSegment","value","by","step","first","last","offset","next","padSegment","isSegment","item","SEPARATORS","KtSegmentedField","KtElement","uniqueId","css","nothing","_segment","_text","attachFormInternals","changed","setFormValue","missing","setValidity","disabled","state","options","resolveLocale","key","error","emit","index","segment","typed","pick","choice","count","bound","event","character","segments","empty","focused","shown","now","html","classMap","completed","__decorateClass","property"],"mappings":";;;;;;;AAoBO,SAASA,EACdC,GACAC,GACAC,GACoC;AACpC,MAAIC,IAAOH,EAAQ,UAAUE,EAAK,SAASD,IAAQD,IAAUC;AAC7D,EAAI,OAAOE,CAAI,IAAID,EAAK,QAAKC,IAAOF;AACpC,QAAMG,IAAUD,EAAK,UAAUD,EAAK,UAAU,OAAOC,CAAI,IAAI,KAAKD,EAAK;AACvE,SAAO,EAAE,MAAAC,GAAM,SAAAC,EAAA;AACjB;AAOO,SAASC,EAAYC,GAAsBC,GAAYL,GAA2B;AACvF,QAAMM,IAAO,KAAK,IAAID,CAAE,KAAK,GACvBE,IAAQP,EAAK,KACbQ,IAAOR,EAAK,MAAM,KAAK,OAAOA,EAAK,MAAMA,EAAK,OAAOM,CAAI,IAAIA;AACnE,MAAIF,MAAU,KAAM,QAAOC,IAAK,IAAIE,IAAQC;AAE5C,QAAMC,IAASL,IAAQJ,EAAK;AAC5B,MAAIK,IAAK,GAAG;AACV,UAAMK,IAAOV,EAAK,OAAO,KAAK,MAAMS,IAASH,CAAI,IAAI,KAAKA;AAC1D,WAAOI,IAAOV,EAAK,MAAMO,IAAQG;AAAAA,EACnC;AACA,QAAMA,IAAOD,IAASH,MAAS,IAAIF,IAAQE,IAAON,EAAK,MAAM,KAAK,MAAMS,IAASH,CAAI,IAAIA;AACzF,SAAOI,IAAOV,EAAK,MAAMQ,IAAOE;AAClC;AAGO,SAASC,EAAWP,GAAeJ,GAA2B;AACnE,SAAO,OAAOI,CAAK,EAAE,SAASJ,EAAK,QAAQ,GAAG;AAChD;;;;;;ACvBA,MAAMY,IAAY,CAACC,MAAqC,SAASA,GAG3DC,IAAa,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAclD,MAAeC,UAAyBC,EAAU;AAAA,EAAlD,cAAA;AAAA,UAAA,GAAA,SAAA,GA6FL,KAAU,YAAoC,MAC9C,KAAQ,eAA8B,MAEtC,KAAQ,aAAa,IACrB,KAAmB,UAAUC,EAAS,oBAAoB,GAGjD,KAAU,QAAgC,CAAA,GAE1C,KAAU,aAAa,IACvB,KAAQ,aAA4B,MAEpC,KAAQ,eAAe,IAGhC,KAAA,QAAuB,MAGvB,KAAA,OAAO,IAIP,KAAA,QAAQ,IAIR,KAAA,SAAS,IAGT,KAAA,MAAM,IAGN,KAAA,MAAM,IAGN,KAAA,OAA6B,UAG7B,KAAA,WAAW,IAGX,KAAA,WAAW,IAIX,KAAA,QAAQ;AAAA,EAAA;AAAA,EAzIR,OAAA;AAAA,SAAgB,iBAAiB;AAAA,EAAA;AAAA,EAEjC,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBD,EAAU;AAAA,MACVE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAsFF;AAAA;AAAA,EA4DU,cAA+C;AACvD,WAAOC;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKU,eAAeC,GAAmBC,GAA8B;AACxE,WAAO;AAAA,EACT;AAAA;AAAA,EAEA,IAAc,WAAoB;AAChC,WAAO;AAAA,EACT;AAAA;AAAA,EAIS,oBAA0B;AACjC,UAAM,kBAAA,GACN,KAAK,cAAcC,EAAoB,IAAI,GAC3C,KAAK,eAAe,KAAK,OACzB,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK;AAAA,EACnC;AAAA,EAES,WAAWC,GAAqC;AAQvD,SANKA,EAAQ,IAAI,OAAO,KAAKA,EAAQ,IAAI,QAAQ,MAAM,CAAC,KAAK,eAC3D,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,GACjC,KAAK,aAAa,KAEpB,KAAK,aAAa,IAGhBA,EAAQ,IAAI,OAAO,KACnBA,EAAQ,IAAI,UAAU,KACtBA,EAAQ,IAAI,OAAO,KACnBA,EAAQ,IAAI,YAAsC,KAClD,KAAK,eAAeA,CAAO,GAC3B;AACA,MAAAC,EAAa,KAAK,WAAW,KAAK,KAAK;AACvC,YAAMC,IAAU,KAAK,YAAY,KAAK,UAAU,QAAQ,CAAC,KAAK;AAC9D,MAAAC;AAAA,QACE,KAAK;AAAA,QACL;AAAA,UACE,cAAcD;AAAA,UACd,UAAU,EAAQ,KAAK;AAAA,UACvB,aAAa,EAAQ,KAAK;AAAA,QAAK;AAAA,QAEjC,KAAK,SAAS,KAAK,eAAeA,IAAU,KAAK,oBAAoB;AAAA,MAAA;AAAA,IAEzE;AAAA,EACF;AAAA,EAEA,oBAA0B;AACxB,SAAK,QAAQ,KAAK,cAClB,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,GACjC,KAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqBE,GAAyB;AAC5C,SAAK,eAAeA;AAAA,EACtB;AAAA;AAAA,EAGA,yBAAyBC,GAA4B;AACnD,SAAK,QAAQA;AAAAA,EACf;AAAA;AAAA,EAGS,MAAMC,GAA8B;AAC3C,SAAK,gBAAA,EAAkB,CAAC,GAAG,MAAMA,CAAO;AAAA,EAC1C;AAAA,EAEA,IAAc,WAAoB;AAChC,WAAO,KAAK,YAAY,KAAK;AAAA,EAC/B;AAAA,EAEA,IAAc,iBAAyB;AACrC,WAAOC,EAAc,KAAK,MAAM;AAAA,EAClC;AAAA;AAAA;AAAA,EAKU,YAAY1B,GAA4B;AAChD,SAAK,QAAQ,KAAK,KAAKA,CAAK,GAC5B,KAAK,aAAa,IAClB,KAAK,MAAMA,CAAK;AAAA,EAClB;AAAA,EAEQ,QAAQ2B,GAAa9B,GAAoB;AAC/C,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAC8B,CAAG,GAAG9B,EAAA;AACrC,UAAM,EAAE,OAAAG,GAAO,OAAA4B,EAAA,IAAU,KAAK,KAAK,KAAK,KAAK;AAC7C,SAAK,aAAaA,GAClB,KAAK,MAAM5B,CAAK;AAAA,EAClB;AAAA,EAEQ,MAAMA,GAA4B;AACxC,IAAIA,MAAU,KAAK,UACnB,KAAK,aAAa,IAClB,KAAK,QAAQA,GACb6B,EAAK,MAAM,aAAa,EAAE,OAAA7B,EAAA,CAAO;AAAA,EACnC;AAAA;AAAA,EAIQ,kBAAiC;AACvC,WAAO,CAAC,GAAI,KAAK,YAAY,iBAA8B,qBAAqB,KAAK,EAAG;AAAA,EAC1F;AAAA,EAEQ,aAAa8B,GAAqB;AACxC,SAAK,gBAAA,EAAkBA,CAAK,GAAG,MAAA;AAAA,EACjC;AAAA;AAAA,EAGQ,SAASH,GAAaI,GAAkBD,GAAwB;AACtE,UAAMjC,IAAO,KAAK,MAAMkC,EAAQ,GAAG,KAAK;AAExC,QAAI,OAAO,KAAKJ,CAAG,KAAKI,EAAQ,MAAM;AACpC,YAAMC,IAAQvC,EAAUI,GAAM8B,GAAKI,EAAQ,IAAI;AAC/C,kBAAK,QAAQA,EAAQ,KAAKC,EAAM,IAAI,GAChCA,EAAM,WAAS,KAAK,aAAaF,IAAQ,CAAC,GACvC;AAAA,IACT;AACA,QAAIC,EAAQ,WAAW,WAAW,KAAKJ,CAAG,GAAG;AAC3C,YAAMM,IAAOF,EAAQ,QAAQ;AAAA,QAAU,CAACG,MACtCA,EAAO,YAAA,EAAc,WAAWP,EAAI,aAAa;AAAA,MAAA;AAEnD,aAAIM,KAAQ,MACV,KAAK,QAAQF,EAAQ,KAAK,OAAOE,CAAI,CAAC,GACtC,KAAK,aAAaH,IAAQ,CAAC,IAEtB;AAAA,IACT;AAEA,YAAQH,GAAA;AAAA,MACN,KAAK;AAAA,MACL,KAAK,aAAa;AAChB,cAAM1B,IAAK0B,MAAQ,YAAY,IAAI;AACnC,YAAII,EAAQ,MAAM;AAChB,gBAAMrC,IAAUG,MAAS,KAAK,OAAO,OAAOA,CAAI,GAC1CS,IAAOP,EAAYL,GAASO,KAAM8B,EAAQ,QAAQ,IAAIA,EAAQ,IAAI;AACxE,eAAK,QAAQA,EAAQ,KAAKxB,EAAWD,GAAMyB,EAAQ,IAAI,CAAC;AAAA,QAC1D,WAAWA,EAAQ,SAAS;AAC1B,gBAAMI,IAAQJ,EAAQ,QAAQ,QACxBrC,IAAUG,MAAS,KAAMI,IAAK,IAAI,KAAK,IAAK,OAAOJ,CAAI;AAC7D,eAAK,QAAQkC,EAAQ,KAAK,QAAQrC,IAAUO,IAAKkC,KAASA,CAAK,CAAC;AAAA,QAClE;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AACH,YAAIJ,EAAQ,MAAM;AAChB,gBAAMK,IAAQT,MAAQ,SAASI,EAAQ,KAAK,MAAMA,EAAQ,KAAK;AAC/D,eAAK,QAAQA,EAAQ,KAAKxB,EAAW6B,GAAOL,EAAQ,IAAI,CAAC;AAAA,QAC3D;AACA,eAAO;AAAA,MACT,KAAK;AACH,oBAAK,aAAaD,IAAQ,CAAC,GACpB;AAAA,MACT,KAAK;AACH,oBAAK,aAAaA,IAAQ,CAAC,GACpB;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAEH,eAAIjC,IAAM,KAAK,QAAQkC,EAAQ,KAAKA,EAAQ,UAAU,KAAKlC,EAAK,MAAM,GAAG,EAAE,CAAC,IACnE8B,MAAQ,eAAa,KAAK,aAAaG,IAAQ,CAAC,GAClD;AAAA,MACT;AACE,eAAIpB,EAAW,IAAIiB,CAAG,KAChB9B,KAAM,KAAK,aAAaiC,IAAQ,CAAC,GAC9B,MAGFH,EAAI,WAAW;AAAA,IAAA;AAAA,EAE5B;AAAA,EAEQ,UAAUU,GAAsBN,GAAkBD,GAAqB;AAC7E,IAAI,KAAK,YAAYO,EAAM,WAAWA,EAAM,WAAWA,EAAM,UACzD,KAAK,SAASA,EAAM,KAAKN,GAASD,CAAK,OAAS,eAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,cAAcO,GAAmBN,GAAkBD,GAAqB;AAE9E,QADAO,EAAM,eAAA,GACF,MAAK,UACT;AAAA,UAAIA,EAAM,UAAU,WAAW,QAAQ,GAAG;AACxC,aAAK,SAAS,aAAaN,GAASD,CAAK;AACzC;AAAA,MACF;AACA,iBAAWQ,KAAaD,EAAM,QAAQ,SAAS,SAASC,GAAWP,GAASD,CAAK;AAAA;AAAA,EACnF;AAAA;AAAA,EAGQ,aAAaO,GAAyB;AAE5C,QADI,KAAK,YACJA,EAAM,OAAuB,QAAQ,yCAAyC,EAAG;AACtF,UAAME,IAAW,KAAK,MAAA,EAAQ,OAAO/B,CAAS,GACxCgC,IAAQD,EAAS,UAAU,CAACR,MAAY,CAAC,KAAK,MAAMA,EAAQ,GAAG,CAAC;AACtE,SAAK,aAAaS,KAAS,IAAIA,IAAQD,EAAS,SAAS,CAAC;AAAA,EAC5D;AAAA;AAAA,EAIQ,cAAcR,GAAkBD,GAA+B;AACrE,UAAMjC,IAAO,KAAK,MAAMkC,EAAQ,GAAG,KAAK,IAClCU,IAAU,KAAK,eAAeV,EAAQ;AAC5C,QAAIW,IAAQX,EAAQ,aAChBY,IAA+B5B;AACnC,WAAIlB,MAAS,OACX8C,IAAM,OAAO9C,CAAI,GACbkC,EAAQ,UAASW,IAAQX,EAAQ,QAAQ,OAAOlC,CAAI,CAAC,KAAK,KACrDkC,EAAQ,SAAMW,IAAQD,IAAU5C,IAAOU,EAAW,OAAOV,CAAI,GAAGkC,EAAQ,IAAI,KAGhFa;AAAA;AAAA;AAAA,cAGGC,EAAS,EAAE,SAAS,IAAM,OAAOhD,MAAS,IAAI,CAAC;AAAA,iBAC5CkC,EAAQ,GAAG;AAAA,iBACX,KAAK,WAAW,KAAK,CAAC;AAAA,wBACf,KAAK,WAAW,UAAU,MAAM;AAAA,kBACtCA,EAAQ,OAAO,YAAY,MAAM;AAAA;AAAA;AAAA;AAAA,mBAIhCA,EAAQ,KAAK;AAAA,sBACVA,EAAQ,OAAOA,EAAQ,KAAK,MAAMhB,CAAO;AAAA,sBACzCgB,EAAQ,OAAOA,EAAQ,KAAK,MAAMhB,CAAO;AAAA,sBACzC4B,CAAG;AAAA,uBACF9C,MAAS,KAAKkC,EAAQ,cAAcW,CAAK;AAAA,sBAC1C,KAAK,WAAW,SAAS3B,CAAO;AAAA,iBACrC,CAACsB,MAAyB,KAAK,UAAUA,GAAON,GAASD,CAAK,CAAC;AAAA,qBAC3D,CAACO,MAAsB,KAAK,cAAcA,GAAON,GAASD,CAAK,CAAC;AAAA,eACtE,MAAM;AACb,WAAK,aAAaC,EAAQ;AAAA,IAC5B,CAAC;AAAA,cACO,MAAM;AACZ,WAAK,aAAa;AAClB,YAAMe,IAAY,KAAK,eAAef,GAAS,KAAK,MAAMA,EAAQ,GAAG,KAAK,EAAE;AAC5E,MAAIe,MAAc,QAAQA,MAAc,KAAK,MAAMf,EAAQ,GAAG,KAC5D,KAAK,QAAQA,EAAQ,KAAKe,CAAS;AAAA,IAEvC,CAAC;AAAA,SACEJ,CAAK;AAAA;AAAA,EAEZ;AAAA,EAES,SAAyB;AAChC,UAAMd,IAAQ,KAAK,SAAS,KAAK;AACjC,QAAIE,IAAQ;AAEZ,WAAOc,IACHhB,IAAQgB,aAAgB,KAAK,OAAO,4BAA4BhB,CAAK,YAAYb,CACnF;AAAA;AAAA;AAAA,gBAGU8B,EAAS;AAAA,MACf,OAAO;AAAA,MACP,OAAO,EAAQjB;AAAA,MACf,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,IAAA,CACZ,CAAC;AAAA;AAAA,qBAEW,KAAK,SAASb,CAAO;AAAA,uBACnBa,IAAQ,SAASb,CAAO;AAAA,2BACpBa,IAAQ,KAAK,UAAUb,CAAO;AAAA,iBACxC,KAAK,YAAY;AAAA;AAAA;AAAA,YAGtB,KAAK,MAAA,EAAQ,IAAI,CAACN,MACbD,EAAUC,CAAI,KAGnBqB,KAAS,GACF,KAAK,cAAcrB,GAAMqB,CAAK,KAH5Bc,6CAAgDnC,EAAK,OAAO,SAItE,CAAC;AAAA;AAAA,UAGFmB,IACIgB,wCAA2ChB,CAAK,UAAU,KAAK,eAAe,IAAI;AAAA;AAAA,+BAGlFb,CACN;AAAA,UACE,KAAK,aAAa;AAAA;AAAA,EAE1B;AACF;AA7VqBgC,EAAA;AAAA,EAAlBvB,EAAA;AAAM,GApGab,EAoGD,WAAA,OAAA;AAEAoC,EAAA;AAAA,EAAlBvB,EAAA;AAAM,GAtGab,EAsGD,WAAA,YAAA;AACFoC,EAAA;AAAA,EAAhBvB,EAAA;AAAM,GAvGab,EAuGH,WAAA,YAAA;AAEAoC,EAAA;AAAA,EAAhBvB,EAAA;AAAM,GAzGab,EAyGH,WAAA,cAAA;AAGjBoC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GA3GrBrC,EA4GpB,WAAA,OAAA;AAGAoC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA9GNrC,EA+GpB,WAAA,MAAA;AAIAoC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAlHNrC,EAmHpB,WAAA,OAAA;AAIAoC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAtHNrC,EAuHpB,WAAA,QAAA;AAGAoC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAzHNrC,EA0HpB,WAAA,KAAA;AAGAoC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA5HNrC,EA6HpB,WAAA,KAAA;AAGAoC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GA/HrBrC,EAgIpB,WAAA,MAAA;AAGAoC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAlItBrC,EAmIpB,WAAA,UAAA;AAGAoC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GArItBrC,EAsIpB,WAAA,UAAA;AAIAoC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAzIrBrC,EA0IpB,WAAA,OAAA;"}
|
|
1
|
+
{"version":3,"file":"segmented-field-BCjCGF4I.js","sources":["../../src/internal/segments.ts","../../src/internal/segmented-field.ts"],"sourcesContent":["/**\n * The arithmetic of a segmented field — a day, a month, a year, an hour —\n * each typed digit by digit and stepped with the arrows. Pure, so the two\n * fields that share it, `<kt-date-input>` and `<kt-time-input>`, agree on\n * every key.\n */\n\nexport interface SegmentSpec {\n readonly min: number;\n readonly max: number;\n /** Digits when full: 2 for a day, 4 for a year. */\n readonly length: number;\n}\n\n/**\n * The segment's text once `digit` is typed, and whether the focus should move\n * on. It moves on when the segment is full, or as soon as no further digit\n * could follow — a day starting with 4 is the 4th. A digit that would\n * overshoot the maximum, or one typed into a full segment, starts it over.\n */\nexport function typeDigit(\n current: string,\n digit: string,\n spec: SegmentSpec,\n): { text: string; advance: boolean } {\n let text = current.length >= spec.length ? digit : current + digit;\n if (Number(text) > spec.max) text = digit;\n const advance = text.length >= spec.length || Number(text) * 10 > spec.max;\n return { text, advance };\n}\n\n/**\n * The value an arrow press lands on: the next multiple of the step — counted\n * from the minimum — in the direction of `by`, wrapping past either end. An\n * empty segment starts from its first value going up, its last going down.\n */\nexport function stepSegment(value: number | null, by: number, spec: SegmentSpec): number {\n const step = Math.abs(by) || 1;\n const first = spec.min;\n const last = spec.min + Math.floor((spec.max - spec.min) / step) * step;\n if (value === null) return by > 0 ? first : last;\n\n const offset = value - spec.min;\n if (by > 0) {\n const next = spec.min + (Math.floor(offset / step) + 1) * step;\n return next > spec.max ? first : next;\n }\n const next = offset % step === 0 ? value - step : spec.min + Math.floor(offset / step) * step;\n return next < spec.min ? last : next;\n}\n\n/** A value written with the segment's leading zeros: 4 → \"04\". */\nexport function padSegment(value: number, spec: SegmentSpec): string {\n return String(value).padStart(spec.length, '0');\n}\n","import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement } from './kt-element.js';\nimport { emit, uniqueId } from './events.js';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from './form-control.js';\nimport { resolveLocale } from './locale.js';\nimport { padSegment, stepSegment, typeDigit, type SegmentSpec } from './segments.js';\n\n/** One part of a segmented field: a number typed digit by digit, or one of a few words. */\nexport interface Segment {\n readonly key: string;\n readonly label: string;\n /** What the segment shows while empty: \"dd\", \"--\". */\n readonly placeholder: string;\n /** A number, typed and stepped within these bounds… */\n readonly spec?: SegmentSpec;\n /** …stepped by this much with the arrows… */\n readonly step?: number;\n /** …or one of these words, picked by its first letter: AM, PM. */\n readonly choices?: readonly string[];\n}\n\n/** What a segmented field is made of: segments, and the characters between them. */\nexport type FieldItem = Segment | { readonly literal: string };\n\nconst isSegment = (item: FieldItem): item is Segment => 'key' in item;\n\n/** Characters that move on to the next segment, as a typist expects. */\nconst SEPARATORS = new Set(['/', '.', '-', ':', ',', ' ']);\n\nexport type KtSegmentedFieldSize = 'small' | 'medium' | 'large';\n\n/**\n * The common ground of `<kt-date-input>` and `<kt-time-input>`: a field of\n * segments — a day, a month, an hour — each its own spinbutton, typed digit by\n * digit, stepped with the arrows, the focus moving on as each fills.\n *\n * Each segment is `contenteditable`, so a phone shows its number pad, but the\n * text never changes behind the field's back: every keystroke and every input\n * event is turned into the segment's new value here. A subclass says what its\n * segments are, how they read into a value, and how a value fills them.\n */\nexport abstract class KtSegmentedField extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n --field-height: var(--button-height);\n }\n :host([size='small']) {\n --field-height: var(--button-height-small);\n }\n :host([size='large']) {\n --field-height: var(--button-height-large);\n }\n\n /* The field as kt-input draws one: a fill with a resting hairline, an\n outline on hover and focus that never reflows it. */\n .field {\n display: flex;\n align-items: center;\n gap: var(--gap-element);\n height: var(--field-height);\n /* Less the segment's own padding, so the digits line up with a\n kt-input's text. */\n padding: 0 10px 0 calc(var(--button-padding-x) - 2px);\n color: var(--text-body);\n font: var(--font-input);\n background-color: var(--surface-field);\n border: var(--border-width) solid var(--border-field);\n border-radius: var(--radius-input);\n outline: var(--outline-width) solid transparent;\n cursor: text;\n transition: outline-color var(--duration-instant);\n }\n .field:hover {\n outline: var(--outline-width) solid var(--color-text-700);\n }\n .field:focus-within,\n .field.open {\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n .field.error,\n .field.error:hover,\n .field.error:focus-within {\n outline: var(--outline-width) solid var(--color-danger-base);\n }\n .field.disabled {\n color: var(--text-disabled);\n background-color: var(--color-dark-14);\n cursor: not-allowed;\n }\n\n .segments {\n display: flex;\n flex: 1;\n align-items: center;\n min-width: 0;\n font-variant-numeric: tabular-nums;\n }\n\n /* A segment takes a tint while it has focus, so it is plain which part\n a digit will go into; the caret itself would only flicker. */\n .segment {\n padding: 1px 2px;\n border-radius: calc(4px * var(--radius-scale, 1));\n outline: none;\n caret-color: transparent;\n white-space: nowrap;\n }\n .segment.empty {\n color: var(--text-muted);\n }\n .segment:focus {\n color: var(--color-primary-text);\n background: var(--color-primary-soft);\n }\n .error .segment:not(.empty) {\n color: var(--color-danger-text);\n }\n .literal {\n padding: 0 1px;\n color: var(--text-muted);\n }\n\n .error-icon {\n flex: none;\n color: var(--color-danger-text);\n }\n `,\n ];\n\n protected internals: UsableInternals | null = null;\n private defaultValue: string | null = null;\n /** Set while the field writes its own value, which should not refill it. */\n private committing = false;\n protected readonly errorId = uniqueId('kt-segmented-error');\n\n /** What each segment holds, by key: digits, or the index of a choice. */\n @state() protected texts: Record<string, string> = {};\n /** Why the segments do not make a value, when they are all filled. */\n @state() protected typedError = '';\n @state() private focusedKey: string | null = null;\n /** Disabled by an enclosing `<fieldset>`, which leaves `disabled` alone. */\n @state() private formDisabled = false;\n\n @property({ type: String, reflect: true })\n value: string | null = null;\n\n @property({ type: String })\n name = '';\n\n /** Accessible name of the field, when no `<kt-label-input>` wraps it. */\n @property({ type: String })\n label = '';\n\n /** BCP 47 locale for the order and names of the segments. Empty: page, then browser. */\n @property({ type: String })\n locale = '';\n\n @property({ type: String })\n min = '';\n\n @property({ type: String })\n max = '';\n\n @property({ type: String, reflect: true })\n size: KtSegmentedFieldSize = 'medium';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /** Error message. A non-empty value puts the field in its error state. */\n @property({ type: String, reflect: true })\n error = '';\n\n // --- What a subclass says ---\n\n /** The segments, in order, with what goes between them. */\n protected abstract items(): FieldItem[];\n /** What each segment holds for a value. */\n protected abstract fill(value: string | null): Record<string, string>;\n /** The value the segments make — null until they all hold something — and why not, if not. */\n protected abstract read(texts: Record<string, string>): { value: string | null; error: string };\n /** The message of a required field left empty. */\n protected abstract requiredMessage(): string;\n /** Anything after the segments: a calendar button. */\n protected renderAfter(): TemplateResult | typeof nothing {\n return nothing;\n }\n /**\n * What a segment left half-typed becomes when the focus leaves it — a\n * two-digit year written out — or null to leave it as typed.\n */\n protected completeOnBlur(_segment: Segment, _text: string): string | null {\n return null;\n }\n /** Whether a popup belonging to the field is open, for the field's outline. */\n protected get expanded(): boolean {\n return false;\n }\n\n // --- Lifecycle ---\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultValue = this.value;\n this.texts = this.fill(this.value);\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n // A value set from outside fills the segments; one the field wrote does not.\n if ((changed.has('value') || changed.has('locale')) && !this.committing) {\n this.texts = this.fill(this.value);\n this.typedError = '';\n }\n this.committing = false;\n\n if (\n changed.has('value') ||\n changed.has('required') ||\n changed.has('error') ||\n changed.has('typedError' as keyof KtSegmentedField) ||\n this.stringsChanged(changed)\n ) {\n setFormValue(this.internals, this.value);\n const missing = this.required && this.value === null && !this.typedError;\n setValidity(\n this.internals,\n {\n valueMissing: missing,\n badInput: Boolean(this.typedError),\n customError: Boolean(this.error),\n },\n this.error || this.typedError || (missing ? this.requiredMessage() : ''),\n );\n }\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n this.texts = this.fill(this.value);\n this.typedError = '';\n }\n\n /**\n * Called by the platform when the control's disabled state changes — its\n * own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.\n */\n formDisabledCallback(disabled: boolean): void {\n this.formDisabled = disabled;\n }\n\n /** Called by the platform when the browser restores a session. */\n formStateRestoreCallback(state: string | null): void {\n this.value = state;\n }\n\n /** Focuses the first segment. */\n override focus(options?: FocusOptions): void {\n this.segmentElements()[0]?.focus(options);\n }\n\n protected get inactive(): boolean {\n return this.disabled || this.formDisabled;\n }\n\n protected get resolvedLocale(): string {\n return resolveLocale(this.locale);\n }\n\n // --- Values ---\n\n /** Sets a value chosen outside the segments — a day picked in a calendar. */\n protected commitValue(value: string | null): void {\n this.texts = this.fill(value);\n this.typedError = '';\n this.apply(value);\n }\n\n private setText(key: string, text: string): void {\n this.texts = { ...this.texts, [key]: text };\n const { value, error } = this.read(this.texts);\n this.typedError = error;\n this.apply(value);\n }\n\n private apply(value: string | null): void {\n if (value === this.value) return;\n this.committing = true;\n this.value = value;\n emit(this, 'kt-change', { value });\n }\n\n // --- Keyboard ---\n\n private segmentElements(): HTMLElement[] {\n return [...(this.shadowRoot?.querySelectorAll<HTMLElement>('[role=\"spinbutton\"]') ?? [])];\n }\n\n private focusSegment(index: number): void {\n this.segmentElements()[index]?.focus();\n }\n\n /** One key's effect on a segment; true when the key was the field's to handle. */\n private applyKey(key: string, segment: Segment, index: number): boolean {\n const text = this.texts[segment.key] ?? '';\n\n if (/^\\d$/.test(key) && segment.spec) {\n const typed = typeDigit(text, key, segment.spec);\n this.setText(segment.key, typed.text);\n if (typed.advance) this.focusSegment(index + 1);\n return true;\n }\n if (segment.choices && /^\\p{L}$/u.test(key)) {\n const pick = segment.choices.findIndex((choice) =>\n choice.toLowerCase().startsWith(key.toLowerCase()),\n );\n if (pick >= 0) {\n this.setText(segment.key, String(pick));\n this.focusSegment(index + 1);\n }\n return true;\n }\n\n switch (key) {\n case 'ArrowUp':\n case 'ArrowDown': {\n const by = key === 'ArrowUp' ? 1 : -1;\n if (segment.spec) {\n const current = text === '' ? null : Number(text);\n const next = stepSegment(current, by * (segment.step ?? 1), segment.spec);\n this.setText(segment.key, padSegment(next, segment.spec));\n } else if (segment.choices) {\n const count = segment.choices.length;\n const current = text === '' ? (by > 0 ? -1 : 0) : Number(text);\n this.setText(segment.key, String((current + by + count) % count));\n }\n return true;\n }\n case 'Home':\n case 'End':\n if (segment.spec) {\n const bound = key === 'Home' ? segment.spec.min : segment.spec.max;\n this.setText(segment.key, padSegment(bound, segment.spec));\n }\n return true;\n case 'ArrowLeft':\n this.focusSegment(index - 1);\n return true;\n case 'ArrowRight':\n this.focusSegment(index + 1);\n return true;\n case 'Backspace':\n case 'Delete':\n // Erase a digit at a time; once empty, Backspace goes back a segment.\n if (text) this.setText(segment.key, segment.choices ? '' : text.slice(0, -1));\n else if (key === 'Backspace') this.focusSegment(index - 1);\n return true;\n default:\n if (SEPARATORS.has(key)) {\n if (text) this.focusSegment(index + 1);\n return true;\n }\n // Any other character would land in the contenteditable as text.\n return key.length === 1;\n }\n }\n\n private onKeyDown(event: KeyboardEvent, segment: Segment, index: number): void {\n if (this.inactive || event.metaKey || event.ctrlKey || event.altKey) return;\n if (this.applyKey(event.key, segment, index)) event.preventDefault();\n }\n\n /**\n * What a phone's keyboard sends: input events rather than key presses.\n * The text is never left to the browser; each character goes through the\n * same path as a key.\n */\n private onBeforeInput(event: InputEvent, segment: Segment, index: number): void {\n event.preventDefault();\n if (this.inactive) return;\n if (event.inputType.startsWith('delete')) {\n this.applyKey('Backspace', segment, index);\n return;\n }\n for (const character of event.data ?? '') this.applyKey(character, segment, index);\n }\n\n /** A click on the field's padding or separators lands in its first empty segment. */\n private onFieldClick(event: MouseEvent): void {\n if (this.inactive) return;\n if ((event.target as HTMLElement).closest('[role=\"spinbutton\"], button, kt-tooltip')) return;\n const segments = this.items().filter(isSegment);\n const empty = segments.findIndex((segment) => !this.texts[segment.key]);\n this.focusSegment(empty >= 0 ? empty : segments.length - 1);\n }\n\n // --- Rendering ---\n\n private renderSegment(segment: Segment, index: number): TemplateResult {\n const text = this.texts[segment.key] ?? '';\n const focused = this.focusedKey === segment.key;\n let shown = segment.placeholder;\n let now: number | typeof nothing = nothing;\n if (text !== '') {\n now = Number(text);\n if (segment.choices) shown = segment.choices[Number(text)] ?? '';\n else if (segment.spec) shown = focused ? text : padSegment(Number(text), segment.spec);\n }\n\n return html`<span\n part=\"segment\"\n role=\"spinbutton\"\n class=${classMap({ segment: true, empty: text === '' })}\n data-key=${segment.key}\n tabindex=${this.inactive ? -1 : 0}\n contenteditable=${this.inactive ? 'false' : 'true'}\n inputmode=${segment.spec ? 'numeric' : 'text'}\n spellcheck=\"false\"\n autocorrect=\"off\"\n enterkeyhint=\"next\"\n aria-label=${segment.label}\n aria-valuemin=${segment.spec ? segment.spec.min : nothing}\n aria-valuemax=${segment.spec ? segment.spec.max : nothing}\n aria-valuenow=${now}\n aria-valuetext=${text === '' ? segment.placeholder : shown}\n aria-disabled=${this.inactive ? 'true' : nothing}\n @keydown=${(event: KeyboardEvent) => this.onKeyDown(event, segment, index)}\n @beforeinput=${(event: InputEvent) => this.onBeforeInput(event, segment, index)}\n @focus=${() => {\n this.focusedKey = segment.key;\n }}\n @blur=${() => {\n this.focusedKey = null;\n const completed = this.completeOnBlur(segment, this.texts[segment.key] ?? '');\n if (completed !== null && completed !== this.texts[segment.key]) {\n this.setText(segment.key, completed);\n }\n }}\n >${shown}</span\n >`;\n }\n\n override render(): TemplateResult {\n const error = this.error || this.typedError;\n let index = -1;\n\n return html`${\n error ? html`<span id=${this.errorId} class=\"visually-hidden\">${error}</span>` : nothing\n }\n <div\n part=\"field\"\n class=${classMap({\n field: true,\n error: Boolean(error),\n disabled: this.inactive,\n open: this.expanded,\n })}\n role=\"group\"\n aria-label=${this.label || nothing}\n aria-invalid=${error ? 'true' : nothing}\n aria-describedby=${error ? this.errorId : nothing}\n @click=${this.onFieldClick}\n >\n <div class=\"segments\">\n ${this.items().map((item) => {\n if (!isSegment(item)) {\n return html`<span class=\"literal\" aria-hidden=\"true\">${item.literal}</span>`;\n }\n index += 1;\n return this.renderSegment(item, index);\n })}\n </div>\n ${\n error\n ? html`<kt-tooltip class=\"error-icon\" text=${error} ?open=${this.focusedKey !== null}>\n <kt-icon name=\"circle-alert\" size=\"18\"></kt-icon>\n </kt-tooltip>`\n : nothing\n }\n ${this.renderAfter()}\n </div>`;\n }\n}\n"],"names":["typeDigit","current","digit","spec","text","advance","stepSegment","value","by","step","first","last","offset","next","padSegment","isSegment","item","SEPARATORS","KtSegmentedField","KtElement","uniqueId","css","nothing","_segment","_text","attachFormInternals","changed","setFormValue","missing","setValidity","disabled","state","options","resolveLocale","key","error","emit","index","segment","typed","pick","choice","count","bound","event","character","segments","empty","focused","shown","now","html","classMap","completed","__decorateClass","property"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as w, p as x, d as $ } from "./kt-calendar-
|
|
1
|
+
import { c as w, p as x, d as $ } from "./kt-calendar-D72xa8qr.js";
|
|
2
2
|
import { d } from "./locale-C5xLkGx5.js";
|
|
3
3
|
function y(t) {
|
|
4
4
|
return t.normalize("NFD").replace(/\p{Diacritic}/gu, "").replace(/\.$/, "").toLowerCase();
|
|
@@ -100,4 +100,4 @@ export {
|
|
|
100
100
|
B as p,
|
|
101
101
|
L as t
|
|
102
102
|
};
|
|
103
|
-
//# sourceMappingURL=typed-date-
|
|
103
|
+
//# sourceMappingURL=typed-date-Z3vcUJbb.js.map
|