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.
Files changed (100) hide show
  1. package/README.md +15 -10
  2. package/dist/cdn/kanto.min.js +887 -234
  3. package/dist/chunks/{index-TWJzttLX.js → index-BEWmAE0T.js} +21 -7
  4. package/dist/chunks/index-BEWmAE0T.js.map +1 -0
  5. package/dist/chunks/{kt-calendar-CtwOby1R.js → kt-calendar-D72xa8qr.js} +3 -3
  6. package/dist/chunks/{kt-calendar-CtwOby1R.js.map → kt-calendar-D72xa8qr.js.map} +1 -1
  7. package/dist/chunks/{kt-element-T0VbIBNp.js → kt-element-COgh6Yr1.js} +2 -2
  8. package/dist/chunks/{kt-element-T0VbIBNp.js.map → kt-element-COgh6Yr1.js.map} +1 -1
  9. package/dist/chunks/numbers-QyecMiSJ.js +9 -0
  10. package/dist/chunks/numbers-QyecMiSJ.js.map +1 -0
  11. package/dist/chunks/{segmented-field-BBXR4XFL.js → segmented-field-BCjCGF4I.js} +2 -2
  12. package/dist/chunks/{segmented-field-BBXR4XFL.js.map → segmented-field-BCjCGF4I.js.map} +1 -1
  13. package/dist/chunks/{typed-date-CPAUNHzr.js → typed-date-Z3vcUJbb.js} +2 -2
  14. package/dist/chunks/{typed-date-CPAUNHzr.js.map → typed-date-Z3vcUJbb.js.map} +1 -1
  15. package/dist/components/core/kt-avatar/kt-avatar.js +2 -2
  16. package/dist/components/core/kt-badge/kt-badge.js +2 -2
  17. package/dist/components/core/kt-button/kt-button.js +1 -1
  18. package/dist/components/core/kt-card/kt-card.js +1 -1
  19. package/dist/components/core/kt-code/kt-code.js +2 -2
  20. package/dist/components/core/kt-icon/kt-icon.js +1 -1
  21. package/dist/components/core/kt-kbd/kt-kbd.js +1 -1
  22. package/dist/components/core/kt-split-button/kt-split-button.js +2 -2
  23. package/dist/components/data/kt-chart/kt-chart.js +2 -2
  24. package/dist/components/data/kt-meter/kt-meter.js +1 -1
  25. package/dist/components/data/kt-pagination/kt-pagination.js +2 -2
  26. package/dist/components/data/kt-stat/kt-stat.js +1 -1
  27. package/dist/components/data/kt-table/kt-table.js +2 -2
  28. package/dist/components/data/kt-timeline/kt-timeline.js +1 -1
  29. package/dist/components/feedback/kt-alert/kt-alert.js +2 -2
  30. package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
  31. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +1 -1
  32. package/dist/components/feedback/kt-skeleton/kt-skeleton.js +1 -1
  33. package/dist/components/feedback/kt-toast/kt-toast.js +2 -2
  34. package/dist/components/feedback/kt-toast-container/kt-toast-container.js +1 -1
  35. package/dist/components/feedback/kt-tooltip/kt-tooltip.js +1 -1
  36. package/dist/components/forms/kt-calendar/kt-calendar.js +3 -3
  37. package/dist/components/forms/kt-checkbox/kt-checkbox.js +2 -2
  38. package/dist/components/forms/kt-date-input/kt-date-input.js +5 -5
  39. package/dist/components/forms/kt-date-picker/kt-date-picker.js +4 -4
  40. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +2 -2
  41. package/dist/components/forms/kt-form/kt-form.js +2 -2
  42. package/dist/components/forms/kt-input/kt-input.js +2 -2
  43. package/dist/components/forms/kt-input-menu/kt-input-menu.js +2 -2
  44. package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
  45. package/dist/components/forms/kt-multi-select/kt-multi-select.js +2 -2
  46. package/dist/components/forms/kt-number-input/kt-number-input.d.ts +89 -0
  47. package/dist/components/forms/kt-number-input/kt-number-input.js +350 -0
  48. package/dist/components/forms/kt-number-input/kt-number-input.js.map +1 -0
  49. package/dist/components/forms/kt-radio-group/kt-radio-group.js +2 -2
  50. package/dist/components/forms/kt-select/kt-select.js +2 -2
  51. package/dist/components/forms/kt-slider/kt-slider.d.ts +69 -0
  52. package/dist/components/forms/kt-slider/kt-slider.js +252 -0
  53. package/dist/components/forms/kt-slider/kt-slider.js.map +1 -0
  54. package/dist/components/forms/kt-textarea/kt-textarea.js +2 -2
  55. package/dist/components/forms/kt-time-input/kt-time-input.js +3 -3
  56. package/dist/components/forms/kt-toggle/kt-toggle.js +1 -1
  57. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +2 -2
  58. package/dist/components/navigation/kt-header/kt-header.js +2 -2
  59. package/dist/components/navigation/kt-page-header/kt-page-header.js +1 -1
  60. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +2 -2
  61. package/dist/components/navigation/kt-steps/kt-steps.d.ts +65 -0
  62. package/dist/components/navigation/kt-steps/kt-steps.js +244 -0
  63. package/dist/components/navigation/kt-steps/kt-steps.js.map +1 -0
  64. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +2 -2
  65. package/dist/components/navigation/kt-tabs/kt-tabs.js +1 -1
  66. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +1 -1
  67. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +2 -2
  68. package/dist/components/overlays/kt-collapsible/kt-collapsible.js +1 -1
  69. package/dist/components/overlays/kt-command-palette/kt-command-palette.d.ts +87 -0
  70. package/dist/components/overlays/kt-command-palette/kt-command-palette.js +370 -0
  71. package/dist/components/overlays/kt-command-palette/kt-command-palette.js.map +1 -0
  72. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +2 -2
  73. package/dist/components/overlays/kt-dropdown/kt-dropdown.js +2 -2
  74. package/dist/components/overlays/kt-modal/kt-modal.js +2 -2
  75. package/dist/components/overlays/kt-side-panel/kt-side-panel.js +2 -2
  76. package/dist/custom-elements.json +3279 -1754
  77. package/dist/docs/kt-command-palette.md +99 -0
  78. package/dist/docs/kt-number-input.md +77 -0
  79. package/dist/docs/kt-slider.md +76 -0
  80. package/dist/docs/kt-steps.md +79 -0
  81. package/dist/index.d.ts +6 -0
  82. package/dist/index.js +105 -97
  83. package/dist/index.js.map +1 -1
  84. package/dist/internal/command-search.d.ts +27 -0
  85. package/dist/internal/numbers.d.ts +2 -0
  86. package/dist/internal/strings.d.ts +14 -0
  87. package/dist/react/index.d.ts +31 -0
  88. package/dist/react/index.js +199 -164
  89. package/dist/react/index.js.map +1 -1
  90. package/dist/react/jsx.d.ts +27 -1
  91. package/dist/strings/index.js +1 -1
  92. package/dist/tokens/base.css +4 -0
  93. package/dist/vscode.css-custom-data.json +26 -2
  94. package/dist/vscode.html-custom-data.json +120 -12
  95. package/dist/vue/index.d.ts +8 -0
  96. package/dist/vue/index.js +12 -8
  97. package/dist/vue/index.js.map +1 -1
  98. package/dist/web-types.json +347 -39
  99. package/package.json +20 -3
  100. package/dist/chunks/index-TWJzttLX.js.map +0 -1
@@ -0,0 +1,350 @@
1
+ import { css as b, nothing as u, html as p } from "lit";
2
+ import { property as o, state as f, query as v } from "lit/decorators.js";
3
+ import { classMap as y } from "lit/directives/class-map.js";
4
+ import { K as c, d as g } from "../../../chunks/kt-element-COgh6Yr1.js";
5
+ import { u as x, e as N } from "../../../chunks/events-r51msXNf.js";
6
+ import { a as w, s as $, b as k } from "../../../chunks/form-control-B74_EHtG.js";
7
+ import { r as F } from "../../../chunks/locale-C5xLkGx5.js";
8
+ import { s as m } from "../../../chunks/index-BEWmAE0T.js";
9
+ import { d } from "../../../chunks/numbers-QyecMiSJ.js";
10
+ import "../../core/kt-icon/kt-icon.js";
11
+ var I = Object.defineProperty, r = (n, t, e, a) => {
12
+ for (var s = void 0, l = n.length - 1, h; l >= 0; l--)
13
+ (h = n[l]) && (s = h(t, e, s) || s);
14
+ return s && I(t, e, s), s;
15
+ };
16
+ function B(n) {
17
+ const t = new Intl.NumberFormat(n).formatToParts(12345.6);
18
+ return {
19
+ group: t.find((e) => e.type === "group")?.value ?? ",",
20
+ decimal: t.find((e) => e.type === "decimal")?.value ?? "."
21
+ };
22
+ }
23
+ function D(n, t, e = !1) {
24
+ const { group: a, decimal: s } = B(t), l = n.replace(/[\u200e\u200f\u061c]/g, "").replace(/[\u2212\u2012\u2013\u2014]/g, "-").replace(/\s/g, "").split(a).join("").replace(s, ".").replace(/[%\p{Sc}]/gu, "");
25
+ if (!/^[+-]?(\d+\.?\d*|\.\d+)$/.test(l)) return NaN;
26
+ const h = Number(l);
27
+ return e ? h / 100 : h;
28
+ }
29
+ class i extends c {
30
+ constructor() {
31
+ super(...arguments), this.value = null, this.min = Number.NEGATIVE_INFINITY, this.max = Number.POSITIVE_INFINITY, this.step = 1, this.name = "", this.label = "", this.locale = "", this.placeholder = "", this.size = "medium", this.disabled = !1, this.required = !1, this.error = "", this.formatOptions = {}, this.focused = !1, this.formDisabled = !1, this.internals = null, this.defaultValue = null, this.errorId = x("kt-number-error");
32
+ }
33
+ static {
34
+ this.formAssociated = !0;
35
+ }
36
+ static {
37
+ this.styles = [
38
+ c.styles,
39
+ b`
40
+ :host {
41
+ display: block;
42
+ --field-height: var(--button-height);
43
+ }
44
+ :host([size='small']) {
45
+ --field-height: var(--button-height-small);
46
+ }
47
+ :host([size='large']) {
48
+ --field-height: var(--button-height-large);
49
+ }
50
+
51
+ .field {
52
+ display: flex;
53
+ align-items: center;
54
+ height: var(--field-height);
55
+ background-color: var(--surface-field);
56
+ border: var(--border-width) solid var(--border-field);
57
+ border-radius: var(--radius-input);
58
+ outline: var(--outline-width) solid transparent;
59
+ transition: outline-color var(--duration-instant);
60
+ }
61
+ .field:hover {
62
+ outline: var(--outline-width) solid var(--color-text-700);
63
+ }
64
+ .field:focus-within {
65
+ outline: var(--outline-width) solid var(--color-primary-base);
66
+ }
67
+ .field.error,
68
+ .field.error:hover,
69
+ .field.error:focus-within {
70
+ outline: var(--outline-width) solid var(--color-danger-base);
71
+ }
72
+ .field.disabled {
73
+ background-color: var(--color-dark-14);
74
+ pointer-events: none;
75
+ }
76
+
77
+ input {
78
+ flex: 1;
79
+ min-width: 0;
80
+ height: 100%;
81
+ padding: 0 4px;
82
+ color: var(--text-body);
83
+ font: var(--font-input);
84
+ font-variant-numeric: tabular-nums;
85
+ text-align: center;
86
+ background: transparent;
87
+ border: none;
88
+ outline: none;
89
+ }
90
+ .disabled input {
91
+ color: var(--text-disabled);
92
+ }
93
+
94
+ button {
95
+ display: inline-grid;
96
+ flex: none;
97
+ place-items: center;
98
+ width: var(--field-height);
99
+ height: 100%;
100
+ padding: 0;
101
+ color: var(--text-muted);
102
+ background: none;
103
+ border: none;
104
+ cursor: pointer;
105
+ transition:
106
+ color var(--duration-instant),
107
+ background-color var(--duration-instant);
108
+ }
109
+ button:hover:not(:disabled) {
110
+ color: var(--text-body);
111
+ background: var(--surface-hover);
112
+ }
113
+ .minus {
114
+ border-radius: calc(var(--radius-input) - 1px) 0 0 calc(var(--radius-input) - 1px);
115
+ }
116
+ .plus {
117
+ border-radius: 0 calc(var(--radius-input) - 1px) calc(var(--radius-input) - 1px) 0;
118
+ }
119
+ button:disabled {
120
+ color: var(--text-disabled);
121
+ cursor: not-allowed;
122
+ }
123
+ .visually-hidden {
124
+ position: absolute;
125
+ width: 1px;
126
+ height: 1px;
127
+ overflow: hidden;
128
+ clip-path: inset(50%);
129
+ white-space: nowrap;
130
+ }
131
+ button:focus-visible {
132
+ outline: var(--outline-width) solid var(--color-primary-base);
133
+ outline-offset: -2px;
134
+ }
135
+ `
136
+ ];
137
+ }
138
+ connectedCallback() {
139
+ super.connectedCallback(), this.internals ??= w(this), this.value = this.value === null ? null : this.clamp(this.value), this.defaultValue = this.value;
140
+ }
141
+ willUpdate(t) {
142
+ if (t.has("value") || t.has("required") || t.has("error") || this.stringsChanged(t)) {
143
+ $(this.internals, this.value === null ? null : String(this.value));
144
+ const e = this.required && this.value === null;
145
+ k(
146
+ this.internals,
147
+ { valueMissing: e, customError: !!this.error },
148
+ this.error || (e ? m().numberRequired : "")
149
+ );
150
+ }
151
+ }
152
+ formResetCallback() {
153
+ this.value = this.defaultValue;
154
+ }
155
+ formDisabledCallback(t) {
156
+ this.formDisabled = t;
157
+ }
158
+ formStateRestoreCallback(t) {
159
+ this.value = t === null || t === "" ? null : Number(t);
160
+ }
161
+ focus(t) {
162
+ this.input?.focus(t);
163
+ }
164
+ get resolvedLocale() {
165
+ return F(this.locale);
166
+ }
167
+ get inactive() {
168
+ return this.disabled || this.formDisabled;
169
+ }
170
+ /** `n` within bounds and on the step, counted from `min` when it has one. */
171
+ clamp(t) {
172
+ const e = this.step > 0 ? this.step : 1, a = Number.isFinite(this.min) ? this.min : 0, s = a + Math.round((t - a) / e) * e, l = Math.max(d(e), d(a));
173
+ return Number(Math.min(this.max, Math.max(this.min, s)).toFixed(l));
174
+ }
175
+ commit(t) {
176
+ const e = t === null ? null : this.clamp(t);
177
+ this.input && (this.input.value = this.text(e)), e !== this.value && (this.value = e, N(this, "kt-change", { value: e }));
178
+ }
179
+ /** The text for `value`: plain while typing, the locale's format at rest. */
180
+ text(t) {
181
+ if (t === null) return "";
182
+ const e = Math.max(d(this.step), d(this.min));
183
+ if (this.focused) {
184
+ const s = this.percent ? t * 100 : t;
185
+ return new Intl.NumberFormat(this.resolvedLocale, {
186
+ maximumFractionDigits: 20,
187
+ useGrouping: !1
188
+ }).format(Number(s.toPrecision(15)));
189
+ }
190
+ const a = this.formatOptions.minimumFractionDigits ?? 0;
191
+ return new Intl.NumberFormat(this.resolvedLocale, {
192
+ maximumFractionDigits: Math.max(e, 3, a),
193
+ ...this.formatOptions
194
+ }).format(t);
195
+ }
196
+ /** Shown as a percentage: what is typed is on a scale of a hundred. */
197
+ get percent() {
198
+ return this.formatOptions.style === "percent";
199
+ }
200
+ stepBy(t) {
201
+ if (this.inactive) return;
202
+ const e = this.value ?? (Number.isFinite(this.min) ? this.min : 0);
203
+ this.commit(this.value === null ? e : e + t * this.step);
204
+ }
205
+ onKeyDown(t) {
206
+ const a = {
207
+ ArrowUp: () => this.stepBy(1),
208
+ ArrowDown: () => this.stepBy(-1),
209
+ PageUp: () => this.stepBy(10),
210
+ PageDown: () => this.stepBy(-10),
211
+ Home: () => Number.isFinite(this.min) && this.commit(this.min),
212
+ End: () => Number.isFinite(this.max) && this.commit(this.max),
213
+ Enter: () => this.readTyped()
214
+ }[t.key];
215
+ a && (t.preventDefault(), a());
216
+ }
217
+ /** What was typed, read; text that is no number puts back what it had. */
218
+ readTyped() {
219
+ const t = this.input.value.trim();
220
+ if (t === "") {
221
+ this.commit(null);
222
+ return;
223
+ }
224
+ const e = D(t, this.resolvedLocale, this.percent);
225
+ if (Number.isNaN(e)) {
226
+ this.input.value = this.text(this.value);
227
+ return;
228
+ }
229
+ this.commit(e);
230
+ }
231
+ onFocus() {
232
+ this.focused = !0, this.input.value = this.text(this.value);
233
+ }
234
+ onBlur() {
235
+ this.readTyped(), this.focused = !1, this.input.value = this.text(this.value);
236
+ }
237
+ render() {
238
+ const t = m(), e = this.inactive, a = this.value !== null && this.value <= this.min, s = this.value !== null && this.value >= this.max, l = this.text(this.value);
239
+ return p`${this.error ? p`<span id=${this.errorId} class="visually-hidden">${this.error}</span>` : u}
240
+ <div
241
+ part="field"
242
+ class=${y({ field: !0, error: !!this.error, disabled: e })}
243
+ >
244
+ <button
245
+ part="decrease"
246
+ class="minus"
247
+ type="button"
248
+ tabindex="-1"
249
+ aria-label=${t.decrease}
250
+ ?disabled=${e || a}
251
+ @click=${() => this.stepBy(-1)}
252
+ >
253
+ <kt-icon name="minus" size="16"></kt-icon>
254
+ </button>
255
+ <input
256
+ part="input"
257
+ type="text"
258
+ role="spinbutton"
259
+ inputmode="decimal"
260
+ autocomplete="off"
261
+ .value=${l}
262
+ placeholder=${this.placeholder || u}
263
+ aria-label=${this.label || u}
264
+ aria-valuenow=${this.value ?? u}
265
+ aria-valuetext=${this.value === null ? u : l}
266
+ aria-valuemin=${Number.isFinite(this.min) ? this.min : u}
267
+ aria-valuemax=${Number.isFinite(this.max) ? this.max : u}
268
+ aria-invalid=${this.error ? "true" : u}
269
+ aria-describedby=${this.error ? this.errorId : u}
270
+ aria-required=${this.required ? "true" : u}
271
+ ?disabled=${e}
272
+ @keydown=${this.onKeyDown}
273
+ @focus=${this.onFocus}
274
+ @blur=${this.onBlur}
275
+ />
276
+ <button
277
+ part="increase"
278
+ class="plus"
279
+ type="button"
280
+ tabindex="-1"
281
+ aria-label=${t.increase}
282
+ ?disabled=${e || s}
283
+ @click=${() => this.stepBy(1)}
284
+ >
285
+ <kt-icon name="plus" size="16"></kt-icon>
286
+ </button>
287
+ </div>`;
288
+ }
289
+ }
290
+ r([
291
+ o({
292
+ converter: {
293
+ fromAttribute: (n) => {
294
+ const t = n === null || n.trim() === "" ? NaN : Number(n);
295
+ return Number.isFinite(t) ? t : null;
296
+ }
297
+ }
298
+ })
299
+ ], i.prototype, "value");
300
+ r([
301
+ o({ type: Number })
302
+ ], i.prototype, "min");
303
+ r([
304
+ o({ type: Number })
305
+ ], i.prototype, "max");
306
+ r([
307
+ o({ type: Number })
308
+ ], i.prototype, "step");
309
+ r([
310
+ o({ type: String })
311
+ ], i.prototype, "name");
312
+ r([
313
+ o({ type: String })
314
+ ], i.prototype, "label");
315
+ r([
316
+ o({ type: String })
317
+ ], i.prototype, "locale");
318
+ r([
319
+ o({ type: String })
320
+ ], i.prototype, "placeholder");
321
+ r([
322
+ o({ type: String, reflect: !0 })
323
+ ], i.prototype, "size");
324
+ r([
325
+ o({ type: Boolean, reflect: !0 })
326
+ ], i.prototype, "disabled");
327
+ r([
328
+ o({ type: Boolean, reflect: !0 })
329
+ ], i.prototype, "required");
330
+ r([
331
+ o({ type: String, reflect: !0 })
332
+ ], i.prototype, "error");
333
+ r([
334
+ o({ attribute: !1 })
335
+ ], i.prototype, "formatOptions");
336
+ r([
337
+ f()
338
+ ], i.prototype, "focused");
339
+ r([
340
+ f()
341
+ ], i.prototype, "formDisabled");
342
+ r([
343
+ v("input")
344
+ ], i.prototype, "input");
345
+ g("kt-number-input", i);
346
+ export {
347
+ i as KtNumberInput,
348
+ D as parseLocaleNumber
349
+ };
350
+ //# sourceMappingURL=kt-number-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-number-input.js","sources":["../../../../src/components/forms/kt-number-input/kt-number-input.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, uniqueId } from '#internal/events';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from '#internal/form-control';\nimport { resolveLocale } from '#internal/locale';\nimport { strings } from '#internal/strings';\nimport { decimalsOf } from '#internal/numbers';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport type KtNumberInputSize = 'small' | 'medium' | 'large';\n\n/** How `locale` writes a number: its group and decimal separators. */\nfunction separators(locale: string): { group: string; decimal: string } {\n const parts = new Intl.NumberFormat(locale).formatToParts(12345.6);\n return {\n group: parts.find((part) => part.type === 'group')?.value ?? ',',\n decimal: parts.find((part) => part.type === 'decimal')?.value ?? '.',\n };\n}\n\n/**\n * A number typed the way `locale` writes one, or NaN. \"1 234,5\" in French is\n * 1234.5; \"−20\" with a true minus sign is -20; a percent sign is dropped, and\n * `percent` divides by a hundred. Text holding letters is no number: it is\n * turned down rather than guessed at.\n */\nexport function parseLocaleNumber(text: string, locale: string, percent = false): number {\n const { group, decimal } = separators(locale);\n const plain = text\n // Bidi marks around a number in Arabic or Hebrew text.\n .replace(/[\\u200e\\u200f\\u061c]/g, '')\n // Minus signs other than the hyphen: Swedish and Finnish write U+2212.\n .replace(/[\\u2212\\u2012\\u2013\\u2014]/g, '-')\n .replace(/\\s/g, '')\n .split(group)\n .join('')\n .replace(decimal, '.')\n .replace(/[%\\p{Sc}]/gu, '');\n if (!/^[+-]?(\\d+\\.?\\d*|\\.\\d+)$/.test(plain)) return NaN;\n const n = Number(plain);\n return percent ? n / 100 : n;\n}\n\n/**\n * A number field with − and + beside it: a quantity, a seat count, an amount.\n *\n * Type a number the way your language writes one — \"1 234,5\" in French — or\n * step it with the buttons, the arrows (Page Up and Down by ten steps, Home\n * and End to the bounds). It is kept within `min` and `max` and on `step`\n * when the field is left. At rest it reads as the locale writes it, through\n * `formatOptions` — a currency, a percentage, a unit.\n *\n * @element kt-number-input\n *\n * @csspart field - The field.\n * @csspart input - The text field.\n * @csspart decrease - The − button.\n * @csspart increase - The + button.\n *\n * @fires kt-change - The value changed. `detail: { value }`, a number or null.\n *\n * @example\n * ```html\n * <kt-number-input label=\"Seats\" min=\"1\" max=\"50\" value=\"5\"></kt-number-input>\n * ```\n */\nexport class KtNumberInput 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 .field {\n display: flex;\n align-items: center;\n height: var(--field-height);\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 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 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 background-color: var(--color-dark-14);\n pointer-events: none;\n }\n\n input {\n flex: 1;\n min-width: 0;\n height: 100%;\n padding: 0 4px;\n color: var(--text-body);\n font: var(--font-input);\n font-variant-numeric: tabular-nums;\n text-align: center;\n background: transparent;\n border: none;\n outline: none;\n }\n .disabled input {\n color: var(--text-disabled);\n }\n\n button {\n display: inline-grid;\n flex: none;\n place-items: center;\n width: var(--field-height);\n height: 100%;\n padding: 0;\n color: var(--text-muted);\n background: none;\n border: none;\n cursor: pointer;\n transition:\n color var(--duration-instant),\n background-color var(--duration-instant);\n }\n button:hover:not(:disabled) {\n color: var(--text-body);\n background: var(--surface-hover);\n }\n .minus {\n border-radius: calc(var(--radius-input) - 1px) 0 0 calc(var(--radius-input) - 1px);\n }\n .plus {\n border-radius: 0 calc(var(--radius-input) - 1px) calc(var(--radius-input) - 1px) 0;\n }\n button:disabled {\n color: var(--text-disabled);\n cursor: not-allowed;\n }\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 button:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: -2px;\n }\n `,\n ];\n\n /** The number, or null while empty. An attribute that is no number reads as empty. */\n @property({\n converter: {\n fromAttribute: (text: string | null) => {\n const n = text === null || text.trim() === '' ? NaN : Number(text);\n return Number.isFinite(n) ? n : null;\n },\n },\n })\n value: number | null = null;\n\n @property({ type: Number })\n min = Number.NEGATIVE_INFINITY;\n\n @property({ type: Number })\n max = Number.POSITIVE_INFINITY;\n\n @property({ type: Number })\n step = 1;\n\n @property({ type: String })\n name = '';\n\n /** Accessible name, when no `<kt-label-input>` wraps it. */\n @property({ type: String })\n label = '';\n\n /** BCP 47 locale for reading and writing numbers. Empty: page, then browser. */\n @property({ type: String })\n locale = '';\n\n @property({ type: String })\n placeholder = '';\n\n @property({ type: String, reflect: true })\n size: KtNumberInputSize = '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 /** How the number reads at rest: `{ style: 'currency', currency: 'EUR' }`. */\n @property({ attribute: false })\n formatOptions: Intl.NumberFormatOptions = {};\n\n @state() private focused = false;\n @state() private formDisabled = false;\n\n @query('input') private input!: HTMLInputElement;\n\n private internals: UsableInternals | null = null;\n private defaultValue: number | null = null;\n private readonly errorId = uniqueId('kt-number-error');\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.value = this.value === null ? null : this.clamp(this.value);\n this.defaultValue = this.value;\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (\n changed.has('value') ||\n changed.has('required') ||\n changed.has('error') ||\n this.stringsChanged(changed)\n ) {\n setFormValue(this.internals, this.value === null ? null : String(this.value));\n const missing = this.required && this.value === null;\n setValidity(\n this.internals,\n { valueMissing: missing, customError: Boolean(this.error) },\n this.error || (missing ? strings().numberRequired : ''),\n );\n }\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n }\n\n formDisabledCallback(disabled: boolean): void {\n this.formDisabled = disabled;\n }\n\n formStateRestoreCallback(state: string | null): void {\n this.value = state === null || state === '' ? null : Number(state);\n }\n\n override focus(options?: FocusOptions): void {\n this.input?.focus(options);\n }\n\n private get resolvedLocale(): string {\n return resolveLocale(this.locale);\n }\n\n private get inactive(): boolean {\n return this.disabled || this.formDisabled;\n }\n\n /** `n` within bounds and on the step, counted from `min` when it has one. */\n private clamp(n: number): number {\n const step = this.step > 0 ? this.step : 1;\n const origin = Number.isFinite(this.min) ? this.min : 0;\n const snapped = origin + Math.round((n - origin) / step) * step;\n // Decimals of the step and of the origin: min 0.5 with step 1 lands on 1.5.\n const decimals = Math.max(decimalsOf(step), decimalsOf(origin));\n return Number(Math.min(this.max, Math.max(this.min, snapped)).toFixed(decimals));\n }\n\n private commit(next: number | null): void {\n const value = next === null ? null : this.clamp(next);\n if (this.input) this.input.value = this.text(value);\n if (value === this.value) return;\n this.value = value;\n emit(this, 'kt-change', { value });\n }\n\n /** The text for `value`: plain while typing, the locale's format at rest. */\n private text(value: number | null): string {\n if (value === null) return '';\n const decimals = Math.max(decimalsOf(this.step), decimalsOf(this.min));\n if (this.focused) {\n // The plain number to edit, on the scale it is shown at: 50 for 50%.\n const shown = this.percent ? value * 100 : value;\n return new Intl.NumberFormat(this.resolvedLocale, {\n maximumFractionDigits: 20,\n useGrouping: false,\n }).format(Number(shown.toPrecision(15)));\n }\n const minimum = this.formatOptions.minimumFractionDigits ?? 0;\n return new Intl.NumberFormat(this.resolvedLocale, {\n maximumFractionDigits: Math.max(decimals, 3, minimum),\n ...this.formatOptions,\n }).format(value);\n }\n\n /** Shown as a percentage: what is typed is on a scale of a hundred. */\n private get percent(): boolean {\n return this.formatOptions.style === 'percent';\n }\n\n private stepBy(steps: number): void {\n if (this.inactive) return;\n const from = this.value ?? (Number.isFinite(this.min) ? this.min : 0);\n this.commit(this.value === null ? from : from + steps * this.step);\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n const moves: Record<string, () => void> = {\n ArrowUp: () => this.stepBy(1),\n ArrowDown: () => this.stepBy(-1),\n PageUp: () => this.stepBy(10),\n PageDown: () => this.stepBy(-10),\n Home: () => Number.isFinite(this.min) && this.commit(this.min),\n End: () => Number.isFinite(this.max) && this.commit(this.max),\n Enter: () => this.readTyped(),\n };\n const move = moves[event.key];\n if (!move) return;\n event.preventDefault();\n move();\n }\n\n /** What was typed, read; text that is no number puts back what it had. */\n private readTyped(): void {\n const typed = this.input.value.trim();\n if (typed === '') {\n this.commit(null);\n return;\n }\n const parsed = parseLocaleNumber(typed, this.resolvedLocale, this.percent);\n if (Number.isNaN(parsed)) {\n this.input.value = this.text(this.value);\n return;\n }\n this.commit(parsed);\n }\n\n private onFocus(): void {\n this.focused = true;\n this.input.value = this.text(this.value);\n }\n\n private onBlur(): void {\n this.readTyped();\n this.focused = false;\n this.input.value = this.text(this.value);\n }\n\n override render(): TemplateResult {\n const s = strings();\n const inactive = this.inactive;\n const atMin = this.value !== null && this.value <= this.min;\n const atMax = this.value !== null && this.value >= this.max;\n const shown = this.text(this.value);\n\n return html`${\n this.error\n ? html`<span id=${this.errorId} class=\"visually-hidden\">${this.error}</span>`\n : nothing\n }\n <div\n part=\"field\"\n class=${classMap({ field: true, error: Boolean(this.error), disabled: inactive })}\n >\n <button\n part=\"decrease\"\n class=\"minus\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=${s.decrease}\n ?disabled=${inactive || atMin}\n @click=${() => this.stepBy(-1)}\n >\n <kt-icon name=\"minus\" size=\"16\"></kt-icon>\n </button>\n <input\n part=\"input\"\n type=\"text\"\n role=\"spinbutton\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n .value=${shown}\n placeholder=${this.placeholder || nothing}\n aria-label=${this.label || nothing}\n aria-valuenow=${this.value ?? nothing}\n aria-valuetext=${this.value === null ? nothing : shown}\n aria-valuemin=${Number.isFinite(this.min) ? this.min : nothing}\n aria-valuemax=${Number.isFinite(this.max) ? this.max : nothing}\n aria-invalid=${this.error ? 'true' : nothing}\n aria-describedby=${this.error ? this.errorId : nothing}\n aria-required=${this.required ? 'true' : nothing}\n ?disabled=${inactive}\n @keydown=${this.onKeyDown}\n @focus=${this.onFocus}\n @blur=${this.onBlur}\n />\n <button\n part=\"increase\"\n class=\"plus\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=${s.increase}\n ?disabled=${inactive || atMax}\n @click=${() => this.stepBy(1)}\n >\n <kt-icon name=\"plus\" size=\"16\"></kt-icon>\n </button>\n </div>`;\n }\n}\n\ndefineElement('kt-number-input', KtNumberInput);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-number-input': KtNumberInput;\n }\n}\n"],"names":["separators","locale","parts","part","parseLocaleNumber","text","percent","group","decimal","plain","n","KtNumberInput","KtElement","uniqueId","css","attachFormInternals","changed","setFormValue","missing","setValidity","strings","disabled","state","options","resolveLocale","step","origin","snapped","decimals","decimalsOf","next","value","emit","shown","minimum","steps","from","event","move","typed","parsed","s","inactive","atMin","atMax","html","nothing","classMap","__decorateClass","property","query","defineElement"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { css as f, nothing as d, html as p } from "lit";
2
2
  import { property as i, queryAssignedElements as y, state as g } from "lit/decorators.js";
3
- import { K as u, d as v } from "../../../chunks/kt-element-T0VbIBNp.js";
3
+ import { K as u, d as v } from "../../../chunks/kt-element-COgh6Yr1.js";
4
4
  import { e as m } from "../../../chunks/events-r51msXNf.js";
5
5
  import { a as k, s as w, b as x } from "../../../chunks/form-control-B74_EHtG.js";
6
- import { s as b } from "../../../chunks/index-TWJzttLX.js";
6
+ import { s as b } from "../../../chunks/index-BEWmAE0T.js";
7
7
  var D = Object.defineProperty, a = (c, e, t, l) => {
8
8
  for (var r = void 0, o = c.length - 1, h; o >= 0; o--)
9
9
  (h = c[o]) && (r = h(e, t, r) || r);
@@ -1,12 +1,12 @@
1
1
  import { css as x, nothing as n, html as h } from "lit";
2
2
  import { state as p, property as s } from "lit/decorators.js";
3
3
  import { classMap as d } from "lit/directives/class-map.js";
4
- import { K as v, d as w } from "../../../chunks/kt-element-T0VbIBNp.js";
4
+ import { K as v, d as w } from "../../../chunks/kt-element-COgh6Yr1.js";
5
5
  import { u as k, t as g, e as m } from "../../../chunks/events-r51msXNf.js";
6
6
  import { a as $, s as I, b as D } from "../../../chunks/form-control-B74_EHtG.js";
7
7
  import { a as S, f as b, l as L, n as C, o as y } from "../../../chunks/listbox-LsUEyGhQ.js";
8
8
  import { F as E, f as P } from "../../../chunks/floating-C9RLa6cZ.js";
9
- import { s as l } from "../../../chunks/index-TWJzttLX.js";
9
+ import { s as l } from "../../../chunks/index-BEWmAE0T.js";
10
10
  import "../../core/kt-icon/kt-icon.js";
11
11
  var q = Object.defineProperty, i = (c, e, o, a) => {
12
12
  for (var r = void 0, u = c.length - 1, f; u >= 0; u--)
@@ -0,0 +1,69 @@
1
+ import { type PropertyValues, type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ /**
4
+ * A value picked by sliding along a range: a volume, a threshold, or with
5
+ * `range`, a price between two ends.
6
+ *
7
+ * Each thumb is a native `<input type="range">`, so the keyboard — arrows,
8
+ * Page Up and Down, Home and End — and what a screen reader announces come
9
+ * from the platform. The value is text, like a form field's: `"40"`, or
10
+ * `"20/80"` with `range`, low then high. It is kept within `min` and `max`
11
+ * and on `step`, and two thumbs never cross.
12
+ *
13
+ * @element kt-slider
14
+ *
15
+ * @csspart track - The rail.
16
+ * @csspart fill - The selected stretch of it.
17
+ * @csspart value - The shown value, with `show-value`.
18
+ *
19
+ * @fires kt-input - While sliding. `detail: { value }`.
20
+ * @fires kt-change - Once let go. `detail: { value }`.
21
+ *
22
+ * @example
23
+ * ```html
24
+ * <kt-slider label="Volume" value="40" show-value></kt-slider>
25
+ * <kt-slider label="Price" range min="0" max="500" step="10" value="50/300"></kt-slider>
26
+ * ```
27
+ */
28
+ export declare class KtSlider extends KtElement {
29
+ static readonly formAssociated = true;
30
+ static styles: import("lit").CSSResultGroup[];
31
+ /** `"40"`, or `"20/80"` with `range`. Kept within bounds and on the step. */
32
+ value: string;
33
+ min: number;
34
+ max: number;
35
+ step: number;
36
+ /** Two thumbs: a low and a high end. */
37
+ range: boolean;
38
+ /** Accessible name; shown above the slider with `show-value`. */
39
+ label: string;
40
+ name: string;
41
+ disabled: boolean;
42
+ /** Shows the label and the current value above the slider. */
43
+ showValue: boolean;
44
+ /** How a number is shown and announced: `(n) => \`$${n}\``. */
45
+ format: (value: number) => string;
46
+ private formDisabled;
47
+ private internals;
48
+ private defaultValue;
49
+ connectedCallback(): void;
50
+ firstUpdated(): void;
51
+ willUpdate(changed: PropertyValues<this>): void;
52
+ formResetCallback(): void;
53
+ formDisabledCallback(disabled: boolean): void;
54
+ formStateRestoreCallback(state: string | null): void;
55
+ /** The thumbs' numbers: one, or low and high. */
56
+ private get numbers();
57
+ /** `n` within bounds and on the step. */
58
+ private snap;
59
+ private normalised;
60
+ /** A thumb moved: the low one cannot pass the high one, nor the other way. */
61
+ private onSlide;
62
+ private percent;
63
+ render(): TemplateResult;
64
+ }
65
+ declare global {
66
+ interface HTMLElementTagNameMap {
67
+ 'kt-slider': KtSlider;
68
+ }
69
+ }