kanto-ds 1.4.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +10 -10
  2. package/dist/chunks/{defaults-BwgjMcww.js → defaults-CFrjqae2.js} +22 -21
  3. package/dist/chunks/{defaults-BwgjMcww.js.map → defaults-CFrjqae2.js.map} +1 -1
  4. package/dist/chunks/events-r51msXNf.js +22 -0
  5. package/dist/chunks/{events-Bjl5Zmmq.js.map → events-r51msXNf.js.map} +1 -1
  6. package/dist/chunks/floating-B7_Dahpn.js +54 -0
  7. package/dist/chunks/floating-B7_Dahpn.js.map +1 -0
  8. package/dist/chunks/{form-control-CxjBTt1c.js → form-control-B74_EHtG.js} +7 -7
  9. package/dist/chunks/form-control-B74_EHtG.js.map +1 -0
  10. package/dist/chunks/{index-DSSLJirw.js → index-STEEvEP7.js} +24 -12
  11. package/dist/chunks/index-STEEvEP7.js.map +1 -0
  12. package/dist/chunks/kt-calendar-B_hFdD9V.js +640 -0
  13. package/dist/chunks/kt-calendar-B_hFdD9V.js.map +1 -0
  14. package/dist/chunks/{kt-element-E-tfJpGQ.js → kt-element-Djx2JcGl.js} +2 -2
  15. package/dist/chunks/{kt-element-E-tfJpGQ.js.map → kt-element-Djx2JcGl.js.map} +1 -1
  16. package/dist/chunks/{listbox-Sm3nvsC6.js → listbox-llcUu_V-.js} +18 -14
  17. package/dist/chunks/{listbox-Sm3nvsC6.js.map → listbox-llcUu_V-.js.map} +1 -1
  18. package/dist/chunks/locale-C5xLkGx5.js +14 -0
  19. package/dist/chunks/locale-C5xLkGx5.js.map +1 -0
  20. package/dist/chunks/position-Cx_ZH5zh.js +39 -0
  21. package/dist/chunks/position-Cx_ZH5zh.js.map +1 -0
  22. package/dist/components/core/kt-avatar/kt-avatar.js +2 -2
  23. package/dist/components/core/kt-badge/kt-badge.js +3 -3
  24. package/dist/components/core/kt-button/kt-button.js +1 -1
  25. package/dist/components/core/kt-card/kt-card.js +2 -2
  26. package/dist/components/core/kt-code/kt-code.js +3 -3
  27. package/dist/components/core/kt-icon/kt-icon.js +2 -2
  28. package/dist/components/core/kt-kbd/kt-kbd.js +1 -1
  29. package/dist/components/core/kt-split-button/kt-split-button.js +4 -4
  30. package/dist/components/data/kt-chart/kt-chart.js +3 -3
  31. package/dist/components/data/kt-meter/kt-meter.js +1 -1
  32. package/dist/components/data/kt-pagination/kt-pagination.js +3 -3
  33. package/dist/components/data/kt-stat/kt-stat.js +1 -1
  34. package/dist/components/data/kt-table/kt-table.d.ts +53 -3
  35. package/dist/components/data/kt-table/kt-table.js +286 -131
  36. package/dist/components/data/kt-table/kt-table.js.map +1 -1
  37. package/dist/components/data/kt-table/window.d.ts +19 -0
  38. package/dist/components/data/kt-timeline/kt-timeline.js +1 -1
  39. package/dist/components/feedback/kt-alert/kt-alert.js +3 -3
  40. package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
  41. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +10 -10
  42. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js.map +1 -1
  43. package/dist/components/feedback/kt-skeleton/kt-skeleton.js +1 -1
  44. package/dist/components/feedback/kt-toast/kt-toast.js +58 -42
  45. package/dist/components/feedback/kt-toast/kt-toast.js.map +1 -1
  46. package/dist/components/feedback/kt-toast-container/kt-toast-container.js +1 -1
  47. package/dist/components/feedback/kt-tooltip/kt-tooltip.d.ts +20 -0
  48. package/dist/components/feedback/kt-tooltip/kt-tooltip.js +95 -51
  49. package/dist/components/feedback/kt-tooltip/kt-tooltip.js.map +1 -1
  50. package/dist/components/forms/kt-calendar/kt-calendar.d.ts +96 -0
  51. package/dist/components/forms/kt-calendar/kt-calendar.js +13 -0
  52. package/dist/components/forms/kt-calendar/kt-calendar.js.map +1 -0
  53. package/dist/components/forms/kt-checkbox/kt-checkbox.d.ts +9 -0
  54. package/dist/components/forms/kt-checkbox/kt-checkbox.js +34 -20
  55. package/dist/components/forms/kt-checkbox/kt-checkbox.js.map +1 -1
  56. package/dist/components/forms/kt-date-picker/kt-date-picker.d.ts +105 -0
  57. package/dist/components/forms/kt-date-picker/kt-date-picker.js +382 -0
  58. package/dist/components/forms/kt-date-picker/kt-date-picker.js.map +1 -0
  59. package/dist/components/forms/kt-drag-drop/kt-drag-drop.d.ts +9 -0
  60. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +36 -22
  61. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js.map +1 -1
  62. package/dist/components/forms/kt-form/kt-form.js +2 -2
  63. package/dist/components/forms/kt-input/kt-input.d.ts +37 -1
  64. package/dist/components/forms/kt-input/kt-input.js +380 -194
  65. package/dist/components/forms/kt-input/kt-input.js.map +1 -1
  66. package/dist/components/forms/kt-input-menu/kt-input-menu.d.ts +13 -0
  67. package/dist/components/forms/kt-input-menu/kt-input-menu.js +73 -42
  68. package/dist/components/forms/kt-input-menu/kt-input-menu.js.map +1 -1
  69. package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
  70. package/dist/components/forms/kt-radio-group/kt-radio-group.d.ts +9 -0
  71. package/dist/components/forms/kt-radio-group/kt-radio-group.js +67 -53
  72. package/dist/components/forms/kt-radio-group/kt-radio-group.js.map +1 -1
  73. package/dist/components/forms/kt-select/kt-select.d.ts +13 -0
  74. package/dist/components/forms/kt-select/kt-select.js +87 -56
  75. package/dist/components/forms/kt-select/kt-select.js.map +1 -1
  76. package/dist/components/forms/kt-textarea/kt-textarea.d.ts +9 -0
  77. package/dist/components/forms/kt-textarea/kt-textarea.js +28 -14
  78. package/dist/components/forms/kt-textarea/kt-textarea.js.map +1 -1
  79. package/dist/components/forms/kt-toggle/kt-toggle.d.ts +9 -0
  80. package/dist/components/forms/kt-toggle/kt-toggle.js +43 -29
  81. package/dist/components/forms/kt-toggle/kt-toggle.js.map +1 -1
  82. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +3 -3
  83. package/dist/components/navigation/kt-header/kt-header.js +3 -3
  84. package/dist/components/navigation/kt-page-header/kt-page-header.js +1 -1
  85. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.d.ts +9 -0
  86. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +40 -22
  87. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -1
  88. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +3 -3
  89. package/dist/components/navigation/kt-tabs/kt-tabs.js +2 -2
  90. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +2 -2
  91. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +3 -3
  92. package/dist/components/overlays/kt-collapsible/kt-collapsible.js +2 -2
  93. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +3 -3
  94. package/dist/components/overlays/kt-dropdown/kt-dropdown.d.ts +7 -5
  95. package/dist/components/overlays/kt-dropdown/kt-dropdown.js +67 -57
  96. package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -1
  97. package/dist/components/overlays/kt-modal/kt-modal.js +3 -3
  98. package/dist/components/overlays/kt-side-panel/kt-side-panel.js +3 -3
  99. package/dist/custom-elements.json +2110 -124
  100. package/dist/icons/defaults.d.ts +1 -0
  101. package/dist/icons/index.js +1 -1
  102. package/dist/index.d.ts +4 -0
  103. package/dist/index.js +91 -87
  104. package/dist/index.js.map +1 -1
  105. package/dist/internal/countries.d.ts +24 -9
  106. package/dist/internal/date.d.ts +53 -0
  107. package/dist/internal/events.d.ts +5 -0
  108. package/dist/internal/floating.d.ts +48 -0
  109. package/dist/internal/form-control.d.ts +5 -1
  110. package/dist/internal/locale.d.ts +15 -0
  111. package/dist/internal/position.d.ts +27 -0
  112. package/dist/internal/strings.d.ts +15 -0
  113. package/dist/react/index.d.ts +12 -0
  114. package/dist/react/index.js +180 -166
  115. package/dist/react/index.js.map +1 -1
  116. package/dist/react/jsx.d.ts +11 -1
  117. package/dist/strings/index.js +1 -1
  118. package/dist/tokens/base.css +2 -0
  119. package/dist/tokens/responsive.css +1 -0
  120. package/dist/tokens/spacing.css +1 -0
  121. package/dist/vscode.css-custom-data.json +8 -0
  122. package/dist/vscode.html-custom-data.json +138 -11
  123. package/dist/vue/index.d.ts +4 -0
  124. package/dist/vue/index.js +9 -7
  125. package/dist/vue/index.js.map +1 -1
  126. package/dist/web-types.json +292 -14
  127. package/package.json +10 -1
  128. package/dist/chunks/events-Bjl5Zmmq.js +0 -18
  129. package/dist/chunks/form-control-CxjBTt1c.js.map +0 -1
  130. package/dist/chunks/index-DSSLJirw.js.map +0 -1
@@ -0,0 +1,105 @@
1
+ import { type PropertyValues, type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ import '../kt-calendar/kt-calendar.js';
4
+ import '../../core/kt-icon/kt-icon.js';
5
+ export type KtDatePickerSize = 'small' | 'medium' | 'large';
6
+ /**
7
+ * A date field with a calendar, for one day or a period.
8
+ *
9
+ * The value is ISO 8601 text, the format a server and a `<input type="date">`
10
+ * already speak: `2026-09-25`, or `2026-09-01/2026-09-25` for a period. What
11
+ * the field shows is the same date formatted for the reader's language, and
12
+ * the calendar starts its weeks on the day their region does.
13
+ *
14
+ * The popup is a `<kt-calendar>`, with its keyboard model and its month and
15
+ * year views: the WAI-ARIA date picker dialog pattern, where Escape closes the
16
+ * dialog and hands focus back to the field, and tabbing out closes it too.
17
+ *
18
+ * @element kt-date-picker
19
+ *
20
+ * @csspart trigger - The field.
21
+ * @csspart panel - The calendar popup.
22
+ * @csspart calendar - The `<kt-calendar>` inside it.
23
+ *
24
+ * @fires kt-change - A date or a whole period was chosen, or the value cleared.
25
+ * `detail: { value }` — the ISO date or interval, or `null`.
26
+ *
27
+ * @example
28
+ * ```html
29
+ * <kt-date-picker label="Due date" name="due" min="2026-01-01"></kt-date-picker>
30
+ * <kt-date-picker range label="Report period" value="2026-09-01/2026-09-25"></kt-date-picker>
31
+ * ```
32
+ */
33
+ export declare class KtDatePicker extends KtElement {
34
+ static readonly formAssociated = true;
35
+ static styles: import("lit").CSSResultGroup[];
36
+ private trigger?;
37
+ private calendar?;
38
+ private internals;
39
+ private defaultValue;
40
+ private readonly panelId;
41
+ private open;
42
+ private placement;
43
+ private floating;
44
+ /** ISO date, or `start/end` interval with `range`. `null` when empty. */
45
+ value: string | null;
46
+ /** Choose a period — two dates — instead of one day. */
47
+ range: boolean;
48
+ /** Earliest date that can be chosen, ISO. */
49
+ min: string;
50
+ /** Latest date that can be chosen, ISO. */
51
+ max: string;
52
+ name: string;
53
+ /** Accessible name, when no `<kt-label-input>` wraps the field. */
54
+ label: string;
55
+ /** Shown while empty. Defaults to the strings registry. */
56
+ placeholder: string | undefined;
57
+ /**
58
+ * BCP 47 language tag for formatting and for the first day of the week.
59
+ * Empty: the page's `lang`, then the browser's language.
60
+ */
61
+ locale: string;
62
+ size: KtDatePickerSize;
63
+ disabled: boolean;
64
+ /** Disabled by an enclosing `<fieldset>`, which leaves `disabled` alone. */
65
+ private formDisabled;
66
+ /** Whether the control is off, by its own `disabled` or by its form. */
67
+ private get inactive();
68
+ required: boolean;
69
+ /** Shows a button that empties the field once it holds a value. */
70
+ clearable: boolean;
71
+ /** Error message. A non-empty value puts the field in its error state. */
72
+ error: string;
73
+ connectedCallback(): void;
74
+ disconnectedCallback(): void;
75
+ updated(changed: PropertyValues): void;
76
+ willUpdate(changed: PropertyValues<this>): void;
77
+ formResetCallback(): void;
78
+ /**
79
+ * Called by the platform when the control's disabled state changes — its
80
+ * own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.
81
+ */
82
+ formDisabledCallback(disabled: boolean): void;
83
+ formStateRestoreCallback(state: string | null): void;
84
+ focus(options?: FocusOptions): void;
85
+ private get resolvedLocale();
86
+ private get selection();
87
+ private isComplete;
88
+ private display;
89
+ private onDocumentPointerDown;
90
+ /** Tabbing out of the calendar closes it; moving within it does not. */
91
+ private onFocusOut;
92
+ private show;
93
+ private close;
94
+ private toggle;
95
+ private onCalendarChange;
96
+ private clear;
97
+ private onTriggerKeyDown;
98
+ private onPanelKeyDown;
99
+ render(): TemplateResult;
100
+ }
101
+ declare global {
102
+ interface HTMLElementTagNameMap {
103
+ 'kt-date-picker': KtDatePicker;
104
+ }
105
+ }
@@ -0,0 +1,382 @@
1
+ import { css as w, nothing as n, html as d } from "lit";
2
+ import { query as k, state as g, property as o } from "lit/decorators.js";
3
+ import { classMap as h } from "lit/directives/class-map.js";
4
+ import { K as m, d as $ } from "../../../chunks/kt-element-Djx2JcGl.js";
5
+ import { u as x, t as v, e as b } from "../../../chunks/events-r51msXNf.js";
6
+ import { a as D, s as C, b as P } from "../../../chunks/form-control-B74_EHtG.js";
7
+ import { F as S, f as R } from "../../../chunks/floating-B7_Dahpn.js";
8
+ import { r as q, d as z } from "../../../chunks/locale-C5xLkGx5.js";
9
+ import { s as l } from "../../../chunks/index-STEEvEP7.js";
10
+ import { p as F, a as y, c as K, t as u } from "../../../chunks/kt-calendar-B_hFdD9V.js";
11
+ import "../../core/kt-icon/kt-icon.js";
12
+ var B = Object.defineProperty, a = (p, e, t, i) => {
13
+ for (var s = void 0, c = p.length - 1, f; c >= 0; c--)
14
+ (f = p[c]) && (s = f(e, t, s) || s);
15
+ return s && B(e, t, s), s;
16
+ };
17
+ class r extends m {
18
+ constructor() {
19
+ super(...arguments), this.internals = null, this.defaultValue = null, this.panelId = x("kt-date-picker-panel"), this.open = !1, this.placement = "bottom", this.floating = new S(this, {
20
+ panel: () => this.shadowRoot?.querySelector(".panel"),
21
+ anchor: () => this.shadowRoot?.querySelector(".trigger"),
22
+ onPlace: (e) => {
23
+ this.placement = e === "top" ? "top" : "bottom";
24
+ }
25
+ }), this.value = null, this.range = !1, this.min = "", this.max = "", this.name = "", this.label = "", this.placeholder = void 0, this.locale = "", this.size = "medium", this.disabled = !1, this.formDisabled = !1, this.required = !1, this.clearable = !0, this.error = "", this.onDocumentPointerDown = (e) => {
26
+ this.open && !e.composedPath().includes(this) && this.close(!1);
27
+ }, this.onFocusOut = (e) => {
28
+ const t = e.relatedTarget;
29
+ !this.open || !t || this.contains(t) || this.shadowRoot?.contains(t) || e.composedPath().includes(t) || this.calendar?.shadowRoot?.contains(t) || this.close(!1);
30
+ };
31
+ }
32
+ static {
33
+ this.formAssociated = !0;
34
+ }
35
+ static {
36
+ this.styles = [
37
+ m.styles,
38
+ R,
39
+ w`
40
+ :host {
41
+ position: relative;
42
+ display: block;
43
+ --field-height: var(--button-height);
44
+ --day-size: 36px;
45
+ }
46
+ :host([size='small']) {
47
+ --field-height: var(--button-height-small);
48
+ }
49
+ :host([size='large']) {
50
+ --field-height: var(--button-height-large);
51
+ }
52
+
53
+ .field {
54
+ position: relative;
55
+ }
56
+
57
+ .trigger {
58
+ display: grid;
59
+ grid-template-columns: 1fr auto;
60
+ align-items: center;
61
+ gap: var(--gap-element);
62
+ width: 100%;
63
+ height: var(--field-height);
64
+ padding: 0 var(--button-padding-x);
65
+ color: var(--text-body);
66
+ font: var(--font-input);
67
+ text-align: left;
68
+ background-color: var(--color-dark-20);
69
+ border: var(--border-width) solid var(--border-field);
70
+ border-radius: var(--radius-input);
71
+ outline: var(--outline-width) solid transparent;
72
+ cursor: pointer;
73
+ transition:
74
+ background-color var(--duration-instant),
75
+ outline-color var(--duration-instant);
76
+ }
77
+ .trigger:hover {
78
+ outline: var(--outline-width) solid var(--color-text-700);
79
+ }
80
+ .trigger:focus-visible,
81
+ .open .trigger {
82
+ background-color: var(--color-dark-12);
83
+ outline: var(--outline-width) solid var(--color-primary-base);
84
+ }
85
+ .error .trigger,
86
+ .error .trigger:hover {
87
+ outline: var(--outline-width) solid var(--color-danger-base);
88
+ }
89
+ :host(:disabled) .trigger {
90
+ color: var(--text-disabled);
91
+ background-color: var(--color-dark-14);
92
+ cursor: not-allowed;
93
+ }
94
+
95
+ .value {
96
+ overflow: hidden;
97
+ white-space: nowrap;
98
+ text-overflow: ellipsis;
99
+ }
100
+ .placeholder {
101
+ color: var(--text-muted);
102
+ }
103
+
104
+ .icons {
105
+ display: inline-flex;
106
+ align-items: center;
107
+ gap: var(--gap-element);
108
+ color: var(--text-muted);
109
+ }
110
+ /* Room for the clear button, which sits over the field, not inside the
111
+ trigger: a button inside a button is not a thing assistive
112
+ technology can operate. */
113
+ .clearable .icons {
114
+ padding-left: calc(18px + var(--gap-element));
115
+ }
116
+ .clear {
117
+ position: absolute;
118
+ top: 50%;
119
+ /* Just left of the calendar icon, in the room .icons keeps for it. */
120
+ right: calc(var(--button-padding-x) + 18px + var(--gap-element));
121
+ display: inline-flex;
122
+ padding: 0;
123
+ color: var(--text-muted);
124
+ background: none;
125
+ border: none;
126
+ border-radius: var(--radius-sub-menu);
127
+ cursor: pointer;
128
+ transform: translateY(-50%);
129
+ }
130
+ .clear:hover {
131
+ color: var(--text-body);
132
+ }
133
+ .clear:focus-visible {
134
+ outline: var(--outline-width) solid var(--color-primary-base);
135
+ }
136
+
137
+ /* Placed from the field by FloatingController. */
138
+ .panel {
139
+ box-sizing: border-box;
140
+ padding: var(--padding-expand);
141
+ background: var(--color-dark-20);
142
+ border-radius: var(--radius-input);
143
+
144
+ visibility: hidden;
145
+ opacity: 0;
146
+ transform: translateY(-6px);
147
+ pointer-events: none;
148
+ transition:
149
+ opacity var(--duration-fast) var(--easing-standard),
150
+ transform var(--duration-fast) var(--easing-standard),
151
+ visibility 0s linear var(--duration-fast);
152
+ }
153
+ .panel.top:not(.open) {
154
+ transform: translateY(6px);
155
+ }
156
+ .panel.open {
157
+ visibility: visible;
158
+ opacity: 1;
159
+ transform: translateY(0);
160
+ pointer-events: auto;
161
+ transition:
162
+ opacity var(--duration-fast) var(--easing-standard),
163
+ transform var(--duration-fast) var(--easing-standard);
164
+ }
165
+
166
+ .panel kt-calendar {
167
+ display: block;
168
+ }
169
+ `
170
+ ];
171
+ }
172
+ /** Whether the control is off, by its own `disabled` or by its form. */
173
+ get inactive() {
174
+ return this.disabled || this.formDisabled;
175
+ }
176
+ connectedCallback() {
177
+ super.connectedCallback(), this.internals ??= D(this), this.defaultValue = this.value, v(this.open, document, "pointerdown", this.onDocumentPointerDown);
178
+ }
179
+ disconnectedCallback() {
180
+ super.disconnectedCallback(), document.removeEventListener("pointerdown", this.onDocumentPointerDown);
181
+ }
182
+ // Untyped: `open` is private, so not among the keys PropertyValues<this> knows.
183
+ updated(e) {
184
+ e.has("open") && v(this.open, document, "pointerdown", this.onDocumentPointerDown), this.floating.sync(this.open);
185
+ }
186
+ willUpdate(e) {
187
+ if (e.has("value") || e.has("range") || e.has("required") || e.has("error") || this.stringsChanged(e)) {
188
+ const t = this.isComplete();
189
+ C(this.internals, t ? this.value : null);
190
+ const i = this.required && !t;
191
+ P(
192
+ this.internals,
193
+ { valueMissing: i, customError: !!this.error },
194
+ this.error || (i ? l().dateRequired : "")
195
+ );
196
+ }
197
+ }
198
+ formResetCallback() {
199
+ this.value = this.defaultValue, this.close(!1);
200
+ }
201
+ /**
202
+ * Called by the platform when the control's disabled state changes — its
203
+ * own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.
204
+ */
205
+ formDisabledCallback(e) {
206
+ this.formDisabled = e;
207
+ }
208
+ formStateRestoreCallback(e) {
209
+ this.value = e;
210
+ }
211
+ focus(e) {
212
+ this.trigger?.focus(e);
213
+ }
214
+ // --- Reading the value ---
215
+ get resolvedLocale() {
216
+ return q(this.locale);
217
+ }
218
+ get selection() {
219
+ return this.range ? F(this.value) : { start: y(this.value), end: y(this.value) };
220
+ }
221
+ isComplete() {
222
+ const { start: e, end: t } = this.selection;
223
+ return e !== null && t !== null && K(e, t) <= 0;
224
+ }
225
+ display() {
226
+ const { start: e, end: t } = this.selection;
227
+ if (!e || !t) return null;
228
+ const i = z(this.resolvedLocale, { dateStyle: "medium" });
229
+ return this.range ? i.formatRange(u(e), u(t)) : i.format(u(e));
230
+ }
231
+ async show() {
232
+ this.inactive || this.open || (this.open = !0, await this.updateComplete, this.calendar?.focus());
233
+ }
234
+ close(e) {
235
+ this.open && (this.open = !1, e && this.focus());
236
+ }
237
+ toggle() {
238
+ this.open ? this.close(!1) : this.show();
239
+ }
240
+ // --- Choosing ---
241
+ onCalendarChange(e) {
242
+ e.stopPropagation(), this.value = e.detail.value, this.close(!0), b(this, "kt-change", { value: this.value });
243
+ }
244
+ clear() {
245
+ this.value = null, b(this, "kt-change", { value: null }), this.focus();
246
+ }
247
+ // --- Keyboard ---
248
+ onTriggerKeyDown(e) {
249
+ (e.key === "ArrowDown" || e.key === "ArrowUp") && (e.preventDefault(), this.show());
250
+ }
251
+ onPanelKeyDown(e) {
252
+ e.key === "Escape" && (e.preventDefault(), e.stopPropagation(), this.close(!0));
253
+ }
254
+ // --- Rendering ---
255
+ render() {
256
+ const e = this.display(), t = this.placeholder ?? (this.range ? l().selectPeriod : l().selectDate), i = this.clearable && this.value !== null && !this.inactive;
257
+ return d`${this.error ? d`<span id="error-message" class="visually-hidden">${this.error}</span>` : n}
258
+ <div
259
+ class=${h({
260
+ field: !0,
261
+ open: this.open,
262
+ error: !!this.error,
263
+ clearable: i
264
+ })}
265
+ @focusout=${this.onFocusOut}
266
+ >
267
+ <button
268
+ part="trigger"
269
+ type="button"
270
+ class="trigger"
271
+ aria-haspopup="dialog"
272
+ aria-expanded=${this.open ? "true" : "false"}
273
+ aria-controls=${this.panelId}
274
+ aria-label=${this.label ? `${this.label}${e ? `, ${e}` : ""}` : n}
275
+ aria-invalid=${this.error ? "true" : n}
276
+ aria-describedby=${this.error ? "error-message" : n}
277
+ ?disabled=${this.inactive}
278
+ @click=${this.toggle}
279
+ @keydown=${this.onTriggerKeyDown}
280
+ >
281
+ <span class=${h({ value: !0, placeholder: !e })}>
282
+ ${e ?? t}
283
+ </span>
284
+ <span class="icons"><kt-icon name="calendar" size="18"></kt-icon></span>
285
+ </button>
286
+ ${i ? d`<button
287
+ type="button"
288
+ class="clear"
289
+ aria-label=${l().clear}
290
+ @click=${this.clear}
291
+ >
292
+ <kt-icon name="x" size="18"></kt-icon>
293
+ </button>` : n}
294
+
295
+ <div
296
+ part="panel"
297
+ id=${this.panelId}
298
+ popover="manual"
299
+ class=${h({
300
+ panel: !0,
301
+ floating: !0,
302
+ open: this.open,
303
+ top: this.placement === "top"
304
+ })}
305
+ role="dialog"
306
+ aria-modal="false"
307
+ aria-label=${this.range ? l().selectPeriod : l().selectDate}
308
+ @keydown=${this.onPanelKeyDown}
309
+ >
310
+ ${this.open ? d`<kt-calendar
311
+ part="calendar"
312
+ .value=${this.value}
313
+ ?range=${this.range}
314
+ min=${this.min}
315
+ max=${this.max}
316
+ locale=${this.locale}
317
+ label=${this.label}
318
+ @kt-change=${this.onCalendarChange}
319
+ ></kt-calendar>` : n}
320
+ </div>
321
+ </div>`;
322
+ }
323
+ }
324
+ a([
325
+ k(".trigger")
326
+ ], r.prototype, "trigger");
327
+ a([
328
+ k("kt-calendar")
329
+ ], r.prototype, "calendar");
330
+ a([
331
+ g()
332
+ ], r.prototype, "open");
333
+ a([
334
+ g()
335
+ ], r.prototype, "placement");
336
+ a([
337
+ o({ type: String, reflect: !0 })
338
+ ], r.prototype, "value");
339
+ a([
340
+ o({ type: Boolean, reflect: !0 })
341
+ ], r.prototype, "range");
342
+ a([
343
+ o({ type: String })
344
+ ], r.prototype, "min");
345
+ a([
346
+ o({ type: String })
347
+ ], r.prototype, "max");
348
+ a([
349
+ o({ type: String })
350
+ ], r.prototype, "name");
351
+ a([
352
+ o({ type: String })
353
+ ], r.prototype, "label");
354
+ a([
355
+ o({ type: String })
356
+ ], r.prototype, "placeholder");
357
+ a([
358
+ o({ type: String })
359
+ ], r.prototype, "locale");
360
+ a([
361
+ o({ type: String, reflect: !0 })
362
+ ], r.prototype, "size");
363
+ a([
364
+ o({ type: Boolean, reflect: !0 })
365
+ ], r.prototype, "disabled");
366
+ a([
367
+ g()
368
+ ], r.prototype, "formDisabled");
369
+ a([
370
+ o({ type: Boolean, reflect: !0 })
371
+ ], r.prototype, "required");
372
+ a([
373
+ o({ type: Boolean })
374
+ ], r.prototype, "clearable");
375
+ a([
376
+ o({ type: String, reflect: !0 })
377
+ ], r.prototype, "error");
378
+ $("kt-date-picker", r);
379
+ export {
380
+ r as KtDatePicker
381
+ };
382
+ //# sourceMappingURL=kt-date-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-date-picker.js","sources":["../../../../src/components/forms/kt-date-picker/kt-date-picker.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit, toggleListener, uniqueId } from '#internal/events';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from '#internal/form-control';\nimport { FloatingController, floatingStyles } from '#internal/floating';\nimport { dateFormat, resolveLocale } from '#internal/locale';\nimport { strings } from '#internal/strings';\nimport { compareDates, parseDate, parseRange, toLocalDate, type PlainDate } from '#internal/date';\nimport '../kt-calendar/kt-calendar.js';\nimport type { KtCalendar } from '../kt-calendar/kt-calendar.js';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport type KtDatePickerSize = 'small' | 'medium' | 'large';\n\n/**\n * A date field with a calendar, for one day or a period.\n *\n * The value is ISO 8601 text, the format a server and a `<input type=\"date\">`\n * already speak: `2026-09-25`, or `2026-09-01/2026-09-25` for a period. What\n * the field shows is the same date formatted for the reader's language, and\n * the calendar starts its weeks on the day their region does.\n *\n * The popup is a `<kt-calendar>`, with its keyboard model and its month and\n * year views: the WAI-ARIA date picker dialog pattern, where Escape closes the\n * dialog and hands focus back to the field, and tabbing out closes it too.\n *\n * @element kt-date-picker\n *\n * @csspart trigger - The field.\n * @csspart panel - The calendar popup.\n * @csspart calendar - The `<kt-calendar>` inside it.\n *\n * @fires kt-change - A date or a whole period was chosen, or the value cleared.\n * `detail: { value }` — the ISO date or interval, or `null`.\n *\n * @example\n * ```html\n * <kt-date-picker label=\"Due date\" name=\"due\" min=\"2026-01-01\"></kt-date-picker>\n * <kt-date-picker range label=\"Report period\" value=\"2026-09-01/2026-09-25\"></kt-date-picker>\n * ```\n */\nexport class KtDatePicker extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n floatingStyles,\n css`\n :host {\n position: relative;\n display: block;\n --field-height: var(--button-height);\n --day-size: 36px;\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 .field {\n position: relative;\n }\n\n .trigger {\n display: grid;\n grid-template-columns: 1fr auto;\n align-items: center;\n gap: var(--gap-element);\n width: 100%;\n height: var(--field-height);\n padding: 0 var(--button-padding-x);\n color: var(--text-body);\n font: var(--font-input);\n text-align: left;\n background-color: var(--color-dark-20);\n border: var(--border-width) solid var(--border-field);\n border-radius: var(--radius-input);\n outline: var(--outline-width) solid transparent;\n cursor: pointer;\n transition:\n background-color var(--duration-instant),\n outline-color var(--duration-instant);\n }\n .trigger:hover {\n outline: var(--outline-width) solid var(--color-text-700);\n }\n .trigger:focus-visible,\n .open .trigger {\n background-color: var(--color-dark-12);\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n .error .trigger,\n .error .trigger:hover {\n outline: var(--outline-width) solid var(--color-danger-base);\n }\n :host(:disabled) .trigger {\n color: var(--text-disabled);\n background-color: var(--color-dark-14);\n cursor: not-allowed;\n }\n\n .value {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n .placeholder {\n color: var(--text-muted);\n }\n\n .icons {\n display: inline-flex;\n align-items: center;\n gap: var(--gap-element);\n color: var(--text-muted);\n }\n /* Room for the clear button, which sits over the field, not inside the\n trigger: a button inside a button is not a thing assistive\n technology can operate. */\n .clearable .icons {\n padding-left: calc(18px + var(--gap-element));\n }\n .clear {\n position: absolute;\n top: 50%;\n /* Just left of the calendar icon, in the room .icons keeps for it. */\n right: calc(var(--button-padding-x) + 18px + var(--gap-element));\n display: inline-flex;\n padding: 0;\n color: var(--text-muted);\n background: none;\n border: none;\n border-radius: var(--radius-sub-menu);\n cursor: pointer;\n transform: translateY(-50%);\n }\n .clear:hover {\n color: var(--text-body);\n }\n .clear:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n\n /* Placed from the field by FloatingController. */\n .panel {\n box-sizing: border-box;\n padding: var(--padding-expand);\n background: var(--color-dark-20);\n border-radius: var(--radius-input);\n\n visibility: hidden;\n opacity: 0;\n transform: translateY(-6px);\n pointer-events: none;\n transition:\n opacity var(--duration-fast) var(--easing-standard),\n transform var(--duration-fast) var(--easing-standard),\n visibility 0s linear var(--duration-fast);\n }\n .panel.top:not(.open) {\n transform: translateY(6px);\n }\n .panel.open {\n visibility: visible;\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n transition:\n opacity var(--duration-fast) var(--easing-standard),\n transform var(--duration-fast) var(--easing-standard);\n }\n\n .panel kt-calendar {\n display: block;\n }\n `,\n ];\n\n @query('.trigger')\n private trigger?: HTMLButtonElement;\n\n @query('kt-calendar')\n private calendar?: KtCalendar;\n\n private internals: UsableInternals | null = null;\n private defaultValue: string | null = null;\n private readonly panelId = uniqueId('kt-date-picker-panel');\n\n @state() private open = false;\n @state() private placement: 'bottom' | 'top' = 'bottom';\n\n private floating = new FloatingController(this, {\n panel: () => this.shadowRoot?.querySelector<HTMLElement>('.panel'),\n anchor: () => this.shadowRoot?.querySelector('.trigger'),\n onPlace: (side) => {\n this.placement = side === 'top' ? 'top' : 'bottom';\n },\n });\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 @property({ type: String })\n name = '';\n\n /** Accessible name, when no `<kt-label-input>` wraps the field. */\n @property({ type: String })\n label = '';\n\n /** Shown while empty. Defaults to the strings registry. */\n @property({ type: String })\n placeholder: string | undefined = undefined;\n\n /**\n * BCP 47 language tag for formatting and for the first day of the week.\n * Empty: the page's `lang`, then the browser's language.\n */\n @property({ type: String })\n locale = '';\n\n @property({ type: String, reflect: true })\n size: KtDatePickerSize = 'medium';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Disabled by an enclosing `<fieldset>`, which leaves `disabled` alone. */\n @state()\n private formDisabled = false;\n\n /** Whether the control is off, by its own `disabled` or by its form. */\n private get inactive(): boolean {\n return this.disabled || this.formDisabled;\n }\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /** Shows a button that empties the field once it holds a value. */\n @property({ type: Boolean })\n clearable = true;\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 override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultValue = this.value;\n // Back on the document if it was reconnected while open.\n toggleListener(this.open, document, 'pointerdown', this.onDocumentPointerDown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('pointerdown', this.onDocumentPointerDown);\n }\n\n // Untyped: `open` is private, so not among the keys PropertyValues<this> knows.\n override updated(changed: PropertyValues): void {\n // Only an open list closes on an outside click, so only an open one listens.\n if (changed.has('open')) {\n toggleListener(this.open, document, 'pointerdown', this.onDocumentPointerDown);\n }\n this.floating.sync(this.open);\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (\n changed.has('value') ||\n changed.has('range') ||\n changed.has('required') ||\n changed.has('error') ||\n this.stringsChanged(changed)\n ) {\n const complete = this.isComplete();\n setFormValue(this.internals, complete ? this.value : null);\n\n const missing = this.required && !complete;\n setValidity(\n this.internals,\n { valueMissing: missing, customError: Boolean(this.error) },\n this.error || (missing ? strings().dateRequired : ''),\n );\n }\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n this.close(false);\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 formStateRestoreCallback(state: string | null): void {\n this.value = state;\n }\n\n override focus(options?: FocusOptions): void {\n this.trigger?.focus(options);\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 isComplete(): boolean {\n const { start, end } = this.selection;\n return start !== null && end !== null && compareDates(start, end) <= 0;\n }\n\n private display(): string | null {\n const { start, end } = this.selection;\n if (!start || !end) return null;\n const format = dateFormat(this.resolvedLocale, { dateStyle: 'medium' });\n if (!this.range) return format.format(toLocalDate(start));\n return format.formatRange(toLocalDate(start), toLocalDate(end));\n }\n\n // --- Opening and closing ---\n\n private onDocumentPointerDown = (event: Event): void => {\n if (this.open && !event.composedPath().includes(this)) this.close(false);\n };\n\n /** Tabbing out of the calendar closes it; moving within it does not. */\n private onFocusOut = (event: FocusEvent): void => {\n const next = event.relatedTarget as Node | null;\n if (!this.open || !next) return;\n if (this.contains(next) || this.shadowRoot?.contains(next)) return;\n // Focus moving into the calendar's own shadow root is still inside.\n if (event.composedPath().includes(next)) return;\n if (this.calendar?.shadowRoot?.contains(next)) return;\n this.close(false);\n };\n\n private async show(): Promise<void> {\n if (this.inactive || this.open) return;\n this.open = true;\n\n // The calendar is rendered fresh on each opening — on the chosen day,\n // in its day view — and takes focus once it is there.\n await this.updateComplete;\n this.calendar?.focus();\n }\n\n private close(returnFocus: boolean): void {\n if (!this.open) return;\n this.open = false;\n if (returnFocus) this.focus();\n }\n\n private toggle(): void {\n if (this.open) this.close(false);\n else void this.show();\n }\n\n // --- Choosing ---\n\n private onCalendarChange(event: CustomEvent<{ value: string }>): void {\n // The calendar's own event stops here; the picker reports its value.\n event.stopPropagation();\n this.value = event.detail.value;\n this.close(true);\n emit(this, 'kt-change', { value: this.value });\n }\n\n private clear(): void {\n this.value = null;\n emit(this, 'kt-change', { value: null });\n this.focus();\n }\n\n // --- Keyboard ---\n\n private onTriggerKeyDown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n void this.show();\n }\n }\n\n private onPanelKeyDown(event: KeyboardEvent): void {\n // The calendar keeps Escape for itself while it shows months or years.\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.close(true);\n }\n }\n\n // --- Rendering ---\n\n override render(): TemplateResult {\n const shown = this.display();\n const placeholder =\n this.placeholder ?? (this.range ? strings().selectPeriod : strings().selectDate);\n const showClear = this.clearable && this.value !== null && !this.inactive;\n\n return html`${\n this.error\n ? html`<span id=\"error-message\" class=\"visually-hidden\">${this.error}</span>`\n : nothing\n }\n <div\n class=${classMap({\n field: true,\n open: this.open,\n error: Boolean(this.error),\n clearable: showClear,\n })}\n @focusout=${this.onFocusOut}\n >\n <button\n part=\"trigger\"\n type=\"button\"\n class=\"trigger\"\n aria-haspopup=\"dialog\"\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-controls=${this.panelId}\n aria-label=${this.label ? `${this.label}${shown ? `, ${shown}` : ''}` : nothing}\n aria-invalid=${this.error ? 'true' : nothing}\n aria-describedby=${this.error ? 'error-message' : nothing}\n ?disabled=${this.inactive}\n @click=${this.toggle}\n @keydown=${this.onTriggerKeyDown}\n >\n <span class=${classMap({ value: true, placeholder: !shown })}>\n ${shown ?? placeholder}\n </span>\n <span class=\"icons\"><kt-icon name=\"calendar\" size=\"18\"></kt-icon></span>\n </button>\n ${\n showClear\n ? html`<button\n type=\"button\"\n class=\"clear\"\n aria-label=${strings().clear}\n @click=${this.clear}\n >\n <kt-icon name=\"x\" size=\"18\"></kt-icon>\n </button>`\n : nothing\n }\n\n <div\n part=\"panel\"\n id=${this.panelId}\n popover=\"manual\"\n class=${classMap({\n panel: true,\n floating: true,\n open: this.open,\n top: this.placement === 'top',\n })}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label=${this.range ? strings().selectPeriod : strings().selectDate}\n @keydown=${this.onPanelKeyDown}\n >\n ${\n this.open\n ? html`<kt-calendar\n part=\"calendar\"\n .value=${this.value}\n ?range=${this.range}\n min=${this.min}\n max=${this.max}\n locale=${this.locale}\n label=${this.label}\n @kt-change=${this.onCalendarChange}\n ></kt-calendar>`\n : nothing\n }\n </div>\n </div>`;\n }\n}\n\ndefineElement('kt-date-picker', KtDatePicker);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-date-picker': KtDatePicker;\n }\n}\n"],"names":["KtDatePicker","KtElement","uniqueId","FloatingController","side","event","next","floatingStyles","css","attachFormInternals","toggleListener","changed","complete","setFormValue","missing","setValidity","strings","disabled","state","options","resolveLocale","parseRange","parseDate","start","end","compareDates","format","dateFormat","toLocalDate","returnFocus","emit","shown","placeholder","showClear","html","nothing","classMap","__decorateClass","query","property","defineElement"],"mappings":"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"}
@@ -46,6 +46,10 @@ export declare class KtDragDrop extends KtElement {
46
46
  /** Largest accepted file, in bytes. Zero means no limit. */
47
47
  maxSize: number;
48
48
  disabled: boolean;
49
+ /** Disabled by an enclosing `<fieldset>`, which leaves `disabled` alone. */
50
+ private formDisabled;
51
+ /** Whether the control is off, by its own `disabled` or by its form. */
52
+ private get inactive();
49
53
  /** The files are submitted under this name, as by `<input type="file">`. */
50
54
  name: string;
51
55
  required: boolean;
@@ -53,6 +57,11 @@ export declare class KtDragDrop extends KtElement {
53
57
  willUpdate(changed: PropertyValues): void;
54
58
  private syncFormValue;
55
59
  formResetCallback(): void;
60
+ /**
61
+ * Called by the platform when the control's disabled state changes — its
62
+ * own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.
63
+ */
64
+ formDisabledCallback(disabled: boolean): void;
56
65
  formStateRestoreCallback(state: string | File | FormData | null): void;
57
66
  /** The files currently held, newest last. */
58
67
  get selectedFiles(): readonly File[];