kanto-ds 1.7.0 → 1.9.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 (251) hide show
  1. package/README.md +26 -14
  2. package/dist/AGENTS.md +157 -0
  3. package/dist/cdn/kanto.min.js +4743 -932
  4. package/dist/chunks/block-Cci-Kff_.js +69 -0
  5. package/dist/chunks/block-Cci-Kff_.js.map +1 -0
  6. package/dist/chunks/defaults-yhaR6U65.js +70 -0
  7. package/dist/chunks/{defaults-Cpeg13O5.js.map → defaults-yhaR6U65.js.map} +1 -1
  8. package/dist/chunks/heading-DsnZsfg-.js +21 -0
  9. package/dist/chunks/heading-DsnZsfg-.js.map +1 -0
  10. package/dist/chunks/{index-TWJzttLX.js → index-1ZFgagWW.js} +37 -12
  11. package/dist/chunks/index-1ZFgagWW.js.map +1 -0
  12. package/dist/chunks/indicator-B_Rs8F92.js +49 -0
  13. package/dist/chunks/indicator-B_Rs8F92.js.map +1 -0
  14. package/dist/chunks/{kt-calendar-CtwOby1R.js → kt-calendar-SK8eapuy.js} +3 -3
  15. package/dist/chunks/{kt-calendar-CtwOby1R.js.map → kt-calendar-SK8eapuy.js.map} +1 -1
  16. package/dist/chunks/kt-color-picker-BoezCAmx.js +365 -0
  17. package/dist/chunks/kt-color-picker-BoezCAmx.js.map +1 -0
  18. package/dist/chunks/{kt-element-T0VbIBNp.js → kt-element-DvWtPQ1Y.js} +2 -2
  19. package/dist/chunks/{kt-element-T0VbIBNp.js.map → kt-element-DvWtPQ1Y.js.map} +1 -1
  20. package/dist/chunks/motion-ChVUUO7O.js +28 -0
  21. package/dist/chunks/motion-ChVUUO7O.js.map +1 -0
  22. package/dist/chunks/numbers-QyecMiSJ.js +9 -0
  23. package/dist/chunks/numbers-QyecMiSJ.js.map +1 -0
  24. package/dist/chunks/{segmented-field-BBXR4XFL.js → segmented-field-T_Zo6lc1.js} +2 -2
  25. package/dist/chunks/{segmented-field-BBXR4XFL.js.map → segmented-field-T_Zo6lc1.js.map} +1 -1
  26. package/dist/chunks/{typed-date-CPAUNHzr.js → typed-date-CaU0kXoY.js} +2 -2
  27. package/dist/chunks/{typed-date-CPAUNHzr.js.map → typed-date-CaU0kXoY.js.map} +1 -1
  28. package/dist/components/blocks/kt-auth-form/kt-auth-form.d.ts +143 -0
  29. package/dist/components/blocks/kt-auth-form/kt-auth-form.js +368 -0
  30. package/dist/components/blocks/kt-auth-form/kt-auth-form.js.map +1 -0
  31. package/dist/components/blocks/kt-blog-post/kt-blog-post.d.ts +75 -0
  32. package/dist/components/blocks/kt-blog-post/kt-blog-post.js +285 -0
  33. package/dist/components/blocks/kt-blog-post/kt-blog-post.js.map +1 -0
  34. package/dist/components/blocks/kt-cta/kt-cta.d.ts +51 -0
  35. package/dist/components/blocks/kt-cta/kt-cta.js +126 -0
  36. package/dist/components/blocks/kt-cta/kt-cta.js.map +1 -0
  37. package/dist/components/blocks/kt-empty-page/kt-empty-page.d.ts +75 -0
  38. package/dist/components/blocks/kt-empty-page/kt-empty-page.js +245 -0
  39. package/dist/components/blocks/kt-empty-page/kt-empty-page.js.map +1 -0
  40. package/dist/components/blocks/kt-error-page/kt-error-page.d.ts +65 -0
  41. package/dist/components/blocks/kt-error-page/kt-error-page.js +177 -0
  42. package/dist/components/blocks/kt-error-page/kt-error-page.js.map +1 -0
  43. package/dist/components/blocks/kt-faq/kt-faq.d.ts +61 -0
  44. package/dist/components/blocks/kt-faq/kt-faq.js +129 -0
  45. package/dist/components/blocks/kt-faq/kt-faq.js.map +1 -0
  46. package/dist/components/blocks/kt-feature-grid/kt-feature-grid.d.ts +59 -0
  47. package/dist/components/blocks/kt-feature-grid/kt-feature-grid.js +166 -0
  48. package/dist/components/blocks/kt-feature-grid/kt-feature-grid.js.map +1 -0
  49. package/dist/components/blocks/kt-hero/kt-hero.d.ts +51 -0
  50. package/dist/components/blocks/kt-hero/kt-hero.js +138 -0
  51. package/dist/components/blocks/kt-hero/kt-hero.js.map +1 -0
  52. package/dist/components/blocks/kt-logo-cloud/kt-logo-cloud.d.ts +46 -0
  53. package/dist/components/blocks/kt-logo-cloud/kt-logo-cloud.js +100 -0
  54. package/dist/components/blocks/kt-logo-cloud/kt-logo-cloud.js.map +1 -0
  55. package/dist/components/blocks/kt-newsletter/kt-newsletter.d.ts +85 -0
  56. package/dist/components/blocks/kt-newsletter/kt-newsletter.js +247 -0
  57. package/dist/components/blocks/kt-newsletter/kt-newsletter.js.map +1 -0
  58. package/dist/components/blocks/kt-post-grid/kt-post-grid.d.ts +73 -0
  59. package/dist/components/blocks/kt-post-grid/kt-post-grid.js +249 -0
  60. package/dist/components/blocks/kt-post-grid/kt-post-grid.js.map +1 -0
  61. package/dist/components/blocks/kt-pricing-table/kt-pricing-table.d.ts +102 -0
  62. package/dist/components/blocks/kt-pricing-table/kt-pricing-table.js +307 -0
  63. package/dist/components/blocks/kt-pricing-table/kt-pricing-table.js.map +1 -0
  64. package/dist/components/blocks/kt-settings-section/kt-settings-section.d.ts +52 -0
  65. package/dist/components/blocks/kt-settings-section/kt-settings-section.js +158 -0
  66. package/dist/components/blocks/kt-settings-section/kt-settings-section.js.map +1 -0
  67. package/dist/components/blocks/kt-testimonials/kt-testimonials.d.ts +56 -0
  68. package/dist/components/blocks/kt-testimonials/kt-testimonials.js +161 -0
  69. package/dist/components/blocks/kt-testimonials/kt-testimonials.js.map +1 -0
  70. package/dist/components/core/kt-avatar/kt-avatar.js +2 -2
  71. package/dist/components/core/kt-avatar-group/kt-avatar-group.d.ts +42 -0
  72. package/dist/components/core/kt-avatar-group/kt-avatar-group.js +97 -0
  73. package/dist/components/core/kt-avatar-group/kt-avatar-group.js.map +1 -0
  74. package/dist/components/core/kt-badge/kt-badge.js +2 -2
  75. package/dist/components/core/kt-button/flights.d.ts +27 -0
  76. package/dist/components/core/kt-button/kt-button.d.ts +52 -1
  77. package/dist/components/core/kt-button/kt-button.js +353 -77
  78. package/dist/components/core/kt-button/kt-button.js.map +1 -1
  79. package/dist/components/core/kt-button/morph.d.ts +27 -0
  80. package/dist/components/core/kt-card/kt-card.js +1 -1
  81. package/dist/components/core/kt-code/kt-code.d.ts +2 -1
  82. package/dist/components/core/kt-code/kt-code.js +52 -37
  83. package/dist/components/core/kt-code/kt-code.js.map +1 -1
  84. package/dist/components/core/kt-copy-button/kt-copy-button.d.ts +47 -0
  85. package/dist/components/core/kt-copy-button/kt-copy-button.js +74 -0
  86. package/dist/components/core/kt-copy-button/kt-copy-button.js.map +1 -0
  87. package/dist/components/core/kt-icon/kt-icon.js +2 -2
  88. package/dist/components/core/kt-kbd/kt-kbd.js +1 -1
  89. package/dist/components/core/kt-split-button/kt-split-button.js +2 -2
  90. package/dist/components/data/kt-chart/kt-chart.js +2 -2
  91. package/dist/components/data/kt-chat-message/kt-chat-message.d.ts +60 -0
  92. package/dist/components/data/kt-chat-message/kt-chat-message.js +204 -0
  93. package/dist/components/data/kt-chat-message/kt-chat-message.js.map +1 -0
  94. package/dist/components/data/kt-description-list/kt-description-list.d.ts +56 -0
  95. package/dist/components/data/kt-description-list/kt-description-list.js +120 -0
  96. package/dist/components/data/kt-description-list/kt-description-list.js.map +1 -0
  97. package/dist/components/data/kt-meter/kt-meter.js +8 -6
  98. package/dist/components/data/kt-meter/kt-meter.js.map +1 -1
  99. package/dist/components/data/kt-pagination/kt-pagination.js +2 -2
  100. package/dist/components/data/kt-stat/kt-stat.d.ts +3 -1
  101. package/dist/components/data/kt-stat/kt-stat.js +31 -16
  102. package/dist/components/data/kt-stat/kt-stat.js.map +1 -1
  103. package/dist/components/data/kt-table/kt-table.js +2 -2
  104. package/dist/components/data/kt-timeline/kt-timeline.js +2 -2
  105. package/dist/components/data/kt-timeline/kt-timeline.js.map +1 -1
  106. package/dist/components/data/kt-tree/kt-tree.d.ts +69 -0
  107. package/dist/components/data/kt-tree/kt-tree.js +208 -0
  108. package/dist/components/data/kt-tree/kt-tree.js.map +1 -0
  109. package/dist/components/feedback/kt-alert/kt-alert.js +2 -2
  110. package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
  111. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +1 -1
  112. package/dist/components/feedback/kt-skeleton/kt-skeleton.js +1 -1
  113. package/dist/components/feedback/kt-toast/kt-toast.js +2 -2
  114. package/dist/components/feedback/kt-toast-container/kt-toast-container.d.ts +8 -1
  115. package/dist/components/feedback/kt-toast-container/kt-toast-container.js +65 -26
  116. package/dist/components/feedback/kt-toast-container/kt-toast-container.js.map +1 -1
  117. package/dist/components/feedback/kt-tooltip/kt-tooltip.js +1 -1
  118. package/dist/components/forms/kt-calendar/kt-calendar.js +3 -3
  119. package/dist/components/forms/kt-checkbox/kt-checkbox.d.ts +2 -0
  120. package/dist/components/forms/kt-checkbox/kt-checkbox.js +19 -8
  121. package/dist/components/forms/kt-checkbox/kt-checkbox.js.map +1 -1
  122. package/dist/components/forms/kt-color-picker/kt-color-picker.d.ts +66 -0
  123. package/dist/components/forms/kt-color-picker/kt-color-picker.js +14 -0
  124. package/dist/components/forms/kt-color-picker/kt-color-picker.js.map +1 -0
  125. package/dist/components/forms/kt-date-input/kt-date-input.js +5 -5
  126. package/dist/components/forms/kt-date-picker/kt-date-picker.js +4 -4
  127. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +2 -2
  128. package/dist/components/forms/kt-form/kt-form.js +2 -2
  129. package/dist/components/forms/kt-input/kt-input.js +2 -2
  130. package/dist/components/forms/kt-input-menu/kt-input-menu.js +2 -2
  131. package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
  132. package/dist/components/forms/kt-multi-select/kt-multi-select.js +2 -2
  133. package/dist/components/forms/kt-number-input/kt-number-input.d.ts +92 -0
  134. package/dist/components/forms/kt-number-input/kt-number-input.js +366 -0
  135. package/dist/components/forms/kt-number-input/kt-number-input.js.map +1 -0
  136. package/dist/components/forms/kt-otp-input/kt-otp-input.d.ts +74 -0
  137. package/dist/components/forms/kt-otp-input/kt-otp-input.js +232 -0
  138. package/dist/components/forms/kt-otp-input/kt-otp-input.js.map +1 -0
  139. package/dist/components/forms/kt-prompt-input/kt-prompt-input.d.ts +74 -0
  140. package/dist/components/forms/kt-prompt-input/kt-prompt-input.js +213 -0
  141. package/dist/components/forms/kt-prompt-input/kt-prompt-input.js.map +1 -0
  142. package/dist/components/forms/kt-radio-group/kt-radio-group.js +2 -2
  143. package/dist/components/forms/kt-select/kt-select.js +2 -2
  144. package/dist/components/forms/kt-slider/kt-slider.d.ts +69 -0
  145. package/dist/components/forms/kt-slider/kt-slider.js +252 -0
  146. package/dist/components/forms/kt-slider/kt-slider.js.map +1 -0
  147. package/dist/components/forms/kt-textarea/kt-textarea.js +2 -2
  148. package/dist/components/forms/kt-time-input/kt-time-input.js +3 -3
  149. package/dist/components/forms/kt-toggle/kt-toggle.js +1 -1
  150. package/dist/components/navigation/kt-app-shell/kt-app-shell.d.ts +85 -0
  151. package/dist/components/navigation/kt-app-shell/kt-app-shell.js +220 -0
  152. package/dist/components/navigation/kt-app-shell/kt-app-shell.js.map +1 -0
  153. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +2 -2
  154. package/dist/components/navigation/kt-footer/kt-footer.d.ts +82 -0
  155. package/dist/components/navigation/kt-footer/kt-footer.js +220 -0
  156. package/dist/components/navigation/kt-footer/kt-footer.js.map +1 -0
  157. package/dist/components/navigation/kt-header/kt-header.js +2 -2
  158. package/dist/components/navigation/kt-page-header/kt-page-header.js +2 -2
  159. package/dist/components/navigation/kt-page-header/kt-page-header.js.map +1 -1
  160. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.d.ts +1 -0
  161. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +81 -44
  162. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -1
  163. package/dist/components/navigation/kt-steps/kt-steps.d.ts +68 -0
  164. package/dist/components/navigation/kt-steps/kt-steps.js +286 -0
  165. package/dist/components/navigation/kt-steps/kt-steps.js.map +1 -0
  166. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +3 -3
  167. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js.map +1 -1
  168. package/dist/components/navigation/kt-tabs/kt-tabs.d.ts +1 -0
  169. package/dist/components/navigation/kt-tabs/kt-tabs.js +92 -64
  170. package/dist/components/navigation/kt-tabs/kt-tabs.js.map +1 -1
  171. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +1 -1
  172. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +2 -2
  173. package/dist/components/navigation/kt-user-menu/kt-user-menu.d.ts +86 -0
  174. package/dist/components/navigation/kt-user-menu/kt-user-menu.js +298 -0
  175. package/dist/components/navigation/kt-user-menu/kt-user-menu.js.map +1 -0
  176. package/dist/components/overlays/kt-accordion/kt-accordion.d.ts +47 -0
  177. package/dist/components/overlays/kt-accordion/kt-accordion.js +80 -0
  178. package/dist/components/overlays/kt-accordion/kt-accordion.js.map +1 -0
  179. package/dist/components/overlays/kt-collapsible/kt-collapsible.d.ts +17 -1
  180. package/dist/components/overlays/kt-collapsible/kt-collapsible.js +87 -32
  181. package/dist/components/overlays/kt-collapsible/kt-collapsible.js.map +1 -1
  182. package/dist/components/overlays/kt-command-palette/kt-command-palette.d.ts +87 -0
  183. package/dist/components/overlays/kt-command-palette/kt-command-palette.js +370 -0
  184. package/dist/components/overlays/kt-command-palette/kt-command-palette.js.map +1 -0
  185. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +2 -2
  186. package/dist/components/overlays/kt-dropdown/kt-dropdown.js +2 -2
  187. package/dist/components/overlays/kt-modal/kt-modal.js +2 -2
  188. package/dist/components/overlays/kt-side-panel/kt-side-panel.js +2 -2
  189. package/dist/components/overlays/kt-tour/kt-tour.d.ts +77 -0
  190. package/dist/components/overlays/kt-tour/kt-tour.js +200 -0
  191. package/dist/components/overlays/kt-tour/kt-tour.js.map +1 -0
  192. package/dist/custom-elements.json +16427 -8061
  193. package/dist/docs/kt-accordion.md +49 -0
  194. package/dist/docs/kt-app-shell.md +89 -0
  195. package/dist/docs/kt-auth-form.md +111 -0
  196. package/dist/docs/kt-avatar-group.md +49 -0
  197. package/dist/docs/kt-blog-post.md +77 -0
  198. package/dist/docs/kt-button.md +21 -0
  199. package/dist/docs/kt-chat-message.md +68 -0
  200. package/dist/docs/kt-color-picker.md +67 -0
  201. package/dist/docs/kt-command-palette.md +99 -0
  202. package/dist/docs/kt-copy-button.md +50 -0
  203. package/dist/docs/kt-cta.md +45 -0
  204. package/dist/docs/kt-description-list.md +58 -0
  205. package/dist/docs/kt-empty-page.md +92 -0
  206. package/dist/docs/kt-error-page.md +64 -0
  207. package/dist/docs/kt-faq.md +54 -0
  208. package/dist/docs/kt-feature-grid.md +53 -0
  209. package/dist/docs/kt-footer.md +115 -0
  210. package/dist/docs/kt-hero.md +53 -0
  211. package/dist/docs/kt-logo-cloud.md +41 -0
  212. package/dist/docs/kt-newsletter.md +69 -0
  213. package/dist/docs/kt-number-input.md +77 -0
  214. package/dist/docs/kt-otp-input.md +68 -0
  215. package/dist/docs/kt-post-grid.md +66 -0
  216. package/dist/docs/kt-pricing-table.md +101 -0
  217. package/dist/docs/kt-prompt-input.md +86 -0
  218. package/dist/docs/kt-settings-section.md +65 -0
  219. package/dist/docs/kt-slider.md +76 -0
  220. package/dist/docs/kt-steps.md +79 -0
  221. package/dist/docs/kt-testimonials.md +52 -0
  222. package/dist/docs/kt-tour.md +75 -0
  223. package/dist/docs/kt-tree.md +83 -0
  224. package/dist/docs/kt-user-menu.md +77 -0
  225. package/dist/icons/defaults.d.ts +2 -0
  226. package/dist/icons/index.js +1 -1
  227. package/dist/index.d.ts +56 -0
  228. package/dist/index.js +225 -284
  229. package/dist/index.js.map +1 -1
  230. package/dist/internal/block.d.ts +23 -0
  231. package/dist/internal/command-search.d.ts +27 -0
  232. package/dist/internal/heading.d.ts +8 -0
  233. package/dist/internal/indicator.d.ts +34 -0
  234. package/dist/internal/motion.d.ts +25 -0
  235. package/dist/internal/numbers.d.ts +2 -0
  236. package/dist/internal/strings.d.ts +36 -0
  237. package/dist/react/index.d.ts +165 -0
  238. package/dist/react/index.js +420 -171
  239. package/dist/react/index.js.map +1 -1
  240. package/dist/react/jsx.d.ts +128 -1
  241. package/dist/strings/index.js +1 -1
  242. package/dist/tokens/base.css +35 -2
  243. package/dist/vscode.css-custom-data.json +165 -19
  244. package/dist/vscode.html-custom-data.json +1023 -149
  245. package/dist/vue/index.d.ts +62 -0
  246. package/dist/vue/index.js +39 -8
  247. package/dist/vue/index.js.map +1 -1
  248. package/dist/web-types.json +3238 -836
  249. package/package.json +128 -3
  250. package/dist/chunks/defaults-Cpeg13O5.js +0 -68
  251. package/dist/chunks/index-TWJzttLX.js.map +0 -1
@@ -0,0 +1,92 @@
1
+ import { type PropertyValues, type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ import '../../core/kt-icon/kt-icon.js';
4
+ export type KtNumberInputSize = 'small' | 'medium' | 'large';
5
+ /**
6
+ * A number typed the way `locale` writes one, or NaN. "1 234,5" in French is
7
+ * 1234.5; "−20" with a true minus sign is -20; a percent sign is dropped, and
8
+ * `percent` divides by a hundred. Text holding letters is no number: it is
9
+ * turned down rather than guessed at.
10
+ */
11
+ export declare function parseLocaleNumber(text: string, locale: string, percent?: boolean): number;
12
+ /**
13
+ * A number field with − and + beside it: a quantity, a seat count, an amount.
14
+ *
15
+ * Type a number the way your language writes one — "1 234,5" in French — or
16
+ * step it with the buttons, the arrows (Page Up and Down by ten steps, Home
17
+ * and End to the bounds). It is kept within `min` and `max` and on `step`
18
+ * when the field is left. At rest it reads as the locale writes it, through
19
+ * `formatOptions` — a currency, a percentage, a unit.
20
+ *
21
+ * @element kt-number-input
22
+ *
23
+ * @csspart field - The field.
24
+ * @csspart input - The text field.
25
+ * @csspart decrease - The − button.
26
+ * @csspart increase - The + button.
27
+ *
28
+ * @fires kt-change - The value changed. `detail: { value }`, a number or null.
29
+ *
30
+ * @example
31
+ * ```html
32
+ * <kt-number-input label="Seats" min="1" max="50" value="5"></kt-number-input>
33
+ * ```
34
+ */
35
+ export declare class KtNumberInput extends KtElement {
36
+ static readonly formAssociated = true;
37
+ static styles: import("lit").CSSResultGroup[];
38
+ /** The number, or null while empty. An attribute that is no number reads as empty. */
39
+ value: number | null;
40
+ min: number;
41
+ max: number;
42
+ step: number;
43
+ name: string;
44
+ /** Accessible name, when no `<kt-label-input>` wraps it. */
45
+ label: string;
46
+ /** BCP 47 locale for reading and writing numbers. Empty: page, then browser. */
47
+ locale: string;
48
+ placeholder: string;
49
+ size: KtNumberInputSize;
50
+ disabled: boolean;
51
+ required: boolean;
52
+ /** Error message. A non-empty value puts the field in its error state. */
53
+ error: string;
54
+ /** How the number reads at rest: `{ style: 'currency', currency: 'EUR' }`. */
55
+ formatOptions: Intl.NumberFormatOptions;
56
+ private focused;
57
+ private formDisabled;
58
+ private input;
59
+ private internals;
60
+ private defaultValue;
61
+ private readonly errorId;
62
+ connectedCallback(): void;
63
+ willUpdate(changed: PropertyValues<this>): void;
64
+ formResetCallback(): void;
65
+ formDisabledCallback(disabled: boolean): void;
66
+ formStateRestoreCallback(state: string | null): void;
67
+ focus(options?: FocusOptions): void;
68
+ private get resolvedLocale();
69
+ private get inactive();
70
+ /** `n` within bounds and on the step, counted from `min` when it has one. */
71
+ private clamp;
72
+ private commit;
73
+ /** The text for `value`: plain while typing, the locale's format at rest. */
74
+ private text;
75
+ /** Shown as a percentage: what is typed is on a scale of a hundred. */
76
+ private get percent();
77
+ /** Which way the last step went, for the number to roll that way: 1, -1 or 0. */
78
+ private rolling;
79
+ private stepBy;
80
+ updated(changed: PropertyValues<this>): void;
81
+ private onKeyDown;
82
+ /** What was typed, read; text that is no number puts back what it had. */
83
+ private readTyped;
84
+ private onFocus;
85
+ private onBlur;
86
+ render(): TemplateResult;
87
+ }
88
+ declare global {
89
+ interface HTMLElementTagNameMap {
90
+ 'kt-number-input': KtNumberInput;
91
+ }
92
+ }
@@ -0,0 +1,366 @@
1
+ import { css as b, nothing as u, html as d } 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-DvWtPQ1Y.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-1ZFgagWW.js";
9
+ import { d as p } from "../../../chunks/numbers-QyecMiSJ.js";
10
+ import { p as I } from "../../../chunks/motion-ChVUUO7O.js";
11
+ import "../../core/kt-icon/kt-icon.js";
12
+ var B = Object.defineProperty, s = (n, t, e, r) => {
13
+ for (var a = void 0, l = n.length - 1, h; l >= 0; l--)
14
+ (h = n[l]) && (a = h(t, e, a) || a);
15
+ return a && B(t, e, a), a;
16
+ };
17
+ function D(n) {
18
+ const t = new Intl.NumberFormat(n).formatToParts(12345.6);
19
+ return {
20
+ group: t.find((e) => e.type === "group")?.value ?? ",",
21
+ decimal: t.find((e) => e.type === "decimal")?.value ?? "."
22
+ };
23
+ }
24
+ function M(n, t, e = !1) {
25
+ const { group: r, decimal: a } = D(t), l = n.replace(/[\u200e\u200f\u061c]/g, "").replace(/[\u2212\u2012\u2013\u2014]/g, "-").replace(/\s/g, "").split(r).join("").replace(a, ".").replace(/[%\p{Sc}]/gu, "");
26
+ if (!/^[+-]?(\d+\.?\d*|\.\d+)$/.test(l)) return NaN;
27
+ const h = Number(l);
28
+ return e ? h / 100 : h;
29
+ }
30
+ class i extends c {
31
+ constructor() {
32
+ 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"), this.rolling = 0;
33
+ }
34
+ static {
35
+ this.formAssociated = !0;
36
+ }
37
+ static {
38
+ this.styles = [
39
+ c.styles,
40
+ b`
41
+ :host {
42
+ display: block;
43
+ --field-height: var(--button-height);
44
+ }
45
+ :host([size='small']) {
46
+ --field-height: var(--button-height-small);
47
+ }
48
+ :host([size='large']) {
49
+ --field-height: var(--button-height-large);
50
+ }
51
+
52
+ .field {
53
+ display: flex;
54
+ align-items: center;
55
+ height: var(--field-height);
56
+ background-color: var(--surface-field);
57
+ border: var(--border-width) solid var(--border-field);
58
+ border-radius: var(--radius-input);
59
+ /* Keeps a rolling number inside the field. */
60
+ overflow: clip;
61
+ outline: var(--outline-width) solid transparent;
62
+ transition: outline-color var(--duration-instant);
63
+ }
64
+ .field:hover {
65
+ outline: var(--outline-width) solid var(--color-text-700);
66
+ }
67
+ .field:focus-within {
68
+ outline: var(--outline-width) solid var(--color-primary-base);
69
+ }
70
+ .field.error,
71
+ .field.error:hover,
72
+ .field.error:focus-within {
73
+ outline: var(--outline-width) solid var(--color-danger-base);
74
+ }
75
+ .field.disabled {
76
+ background-color: var(--color-dark-14);
77
+ pointer-events: none;
78
+ }
79
+
80
+ input {
81
+ flex: 1;
82
+ min-width: 0;
83
+ height: 100%;
84
+ padding: 0 4px;
85
+ color: var(--text-body);
86
+ font: var(--font-input);
87
+ font-variant-numeric: tabular-nums;
88
+ text-align: center;
89
+ background: transparent;
90
+ border: none;
91
+ outline: none;
92
+ }
93
+ .disabled input {
94
+ color: var(--text-disabled);
95
+ }
96
+
97
+ button {
98
+ display: inline-grid;
99
+ flex: none;
100
+ place-items: center;
101
+ width: var(--field-height);
102
+ height: 100%;
103
+ padding: 0;
104
+ color: var(--text-muted);
105
+ background: none;
106
+ border: none;
107
+ cursor: pointer;
108
+ transition:
109
+ color var(--duration-instant),
110
+ background-color var(--duration-instant);
111
+ }
112
+ button:hover:not(:disabled) {
113
+ color: var(--text-body);
114
+ background: var(--surface-hover);
115
+ }
116
+ .minus {
117
+ border-radius: calc(var(--radius-input) - 1px) 0 0 calc(var(--radius-input) - 1px);
118
+ }
119
+ .plus {
120
+ border-radius: 0 calc(var(--radius-input) - 1px) calc(var(--radius-input) - 1px) 0;
121
+ }
122
+ button:disabled {
123
+ color: var(--text-disabled);
124
+ cursor: not-allowed;
125
+ }
126
+ .visually-hidden {
127
+ position: absolute;
128
+ width: 1px;
129
+ height: 1px;
130
+ overflow: hidden;
131
+ clip-path: inset(50%);
132
+ white-space: nowrap;
133
+ }
134
+ button:focus-visible {
135
+ outline: var(--outline-width) solid var(--color-primary-base);
136
+ outline-offset: -2px;
137
+ }
138
+ `
139
+ ];
140
+ }
141
+ connectedCallback() {
142
+ super.connectedCallback(), this.internals ??= w(this), this.value = this.value === null ? null : this.clamp(this.value), this.defaultValue = this.value;
143
+ }
144
+ willUpdate(t) {
145
+ if (t.has("value") || t.has("required") || t.has("error") || this.stringsChanged(t)) {
146
+ $(this.internals, this.value === null ? null : String(this.value));
147
+ const e = this.required && this.value === null;
148
+ k(
149
+ this.internals,
150
+ { valueMissing: e, customError: !!this.error },
151
+ this.error || (e ? m().numberRequired : "")
152
+ );
153
+ }
154
+ }
155
+ formResetCallback() {
156
+ this.value = this.defaultValue;
157
+ }
158
+ formDisabledCallback(t) {
159
+ this.formDisabled = t;
160
+ }
161
+ formStateRestoreCallback(t) {
162
+ this.value = t === null || t === "" ? null : Number(t);
163
+ }
164
+ focus(t) {
165
+ this.input?.focus(t);
166
+ }
167
+ get resolvedLocale() {
168
+ return F(this.locale);
169
+ }
170
+ get inactive() {
171
+ return this.disabled || this.formDisabled;
172
+ }
173
+ /** `n` within bounds and on the step, counted from `min` when it has one. */
174
+ clamp(t) {
175
+ const e = this.step > 0 ? this.step : 1, r = Number.isFinite(this.min) ? this.min : 0, a = r + Math.round((t - r) / e) * e, l = Math.max(p(e), p(r));
176
+ return Number(Math.min(this.max, Math.max(this.min, a)).toFixed(l));
177
+ }
178
+ commit(t) {
179
+ const e = t === null ? null : this.clamp(t);
180
+ this.input && (this.input.value = this.text(e)), e !== this.value && (this.value = e, N(this, "kt-change", { value: e }));
181
+ }
182
+ /** The text for `value`: plain while typing, the locale's format at rest. */
183
+ text(t) {
184
+ if (t === null) return "";
185
+ const e = Math.max(p(this.step), p(this.min));
186
+ if (this.focused) {
187
+ const a = this.percent ? t * 100 : t;
188
+ return new Intl.NumberFormat(this.resolvedLocale, {
189
+ maximumFractionDigits: 20,
190
+ useGrouping: !1
191
+ }).format(Number(a.toPrecision(15)));
192
+ }
193
+ const r = this.formatOptions.minimumFractionDigits ?? 0;
194
+ return new Intl.NumberFormat(this.resolvedLocale, {
195
+ maximumFractionDigits: Math.max(e, 3, r),
196
+ ...this.formatOptions
197
+ }).format(t);
198
+ }
199
+ /** Shown as a percentage: what is typed is on a scale of a hundred. */
200
+ get percent() {
201
+ return this.formatOptions.style === "percent";
202
+ }
203
+ stepBy(t) {
204
+ if (this.inactive) return;
205
+ const e = this.value, r = e ?? (Number.isFinite(this.min) ? this.min : 0);
206
+ this.commit(e === null ? r : r + t * this.step), e !== null && this.value !== null && this.value !== e && (this.rolling = Math.sign(this.value - e));
207
+ }
208
+ updated(t) {
209
+ if (super.updated(t), !this.rolling) return;
210
+ const e = `${this.rolling * 0.6}em`;
211
+ this.rolling = 0, I(
212
+ this.renderRoot.querySelector("input"),
213
+ [
214
+ { translate: `0 ${e}`, opacity: 0 },
215
+ { translate: "0 0", opacity: 1 }
216
+ ],
217
+ "--duration-fast",
218
+ "kt-number-roll"
219
+ );
220
+ }
221
+ onKeyDown(t) {
222
+ const r = {
223
+ ArrowUp: () => this.stepBy(1),
224
+ ArrowDown: () => this.stepBy(-1),
225
+ PageUp: () => this.stepBy(10),
226
+ PageDown: () => this.stepBy(-10),
227
+ Home: () => Number.isFinite(this.min) && this.commit(this.min),
228
+ End: () => Number.isFinite(this.max) && this.commit(this.max),
229
+ Enter: () => this.readTyped()
230
+ }[t.key];
231
+ r && (t.preventDefault(), r());
232
+ }
233
+ /** What was typed, read; text that is no number puts back what it had. */
234
+ readTyped() {
235
+ const t = this.input.value.trim();
236
+ if (t === "") {
237
+ this.commit(null);
238
+ return;
239
+ }
240
+ const e = M(t, this.resolvedLocale, this.percent);
241
+ if (Number.isNaN(e)) {
242
+ this.input.value = this.text(this.value);
243
+ return;
244
+ }
245
+ this.commit(e);
246
+ }
247
+ onFocus() {
248
+ this.focused = !0, this.input.value = this.text(this.value);
249
+ }
250
+ onBlur() {
251
+ this.readTyped(), this.focused = !1, this.input.value = this.text(this.value);
252
+ }
253
+ render() {
254
+ const t = m(), e = this.inactive, r = this.value !== null && this.value <= this.min, a = this.value !== null && this.value >= this.max, l = this.text(this.value);
255
+ return d`${this.error ? d`<span id=${this.errorId} class="visually-hidden">${this.error}</span>` : u}
256
+ <div
257
+ part="field"
258
+ class=${y({ field: !0, error: !!this.error, disabled: e })}
259
+ >
260
+ <button
261
+ part="decrease"
262
+ class="minus"
263
+ type="button"
264
+ tabindex="-1"
265
+ aria-label=${t.decrease}
266
+ ?disabled=${e || r}
267
+ @click=${() => this.stepBy(-1)}
268
+ >
269
+ <kt-icon name="minus" size="16"></kt-icon>
270
+ </button>
271
+ <input
272
+ part="input"
273
+ type="text"
274
+ role="spinbutton"
275
+ inputmode="decimal"
276
+ autocomplete="off"
277
+ .value=${l}
278
+ placeholder=${this.placeholder || u}
279
+ aria-label=${this.label || u}
280
+ aria-valuenow=${this.value ?? u}
281
+ aria-valuetext=${this.value === null ? u : l}
282
+ aria-valuemin=${Number.isFinite(this.min) ? this.min : u}
283
+ aria-valuemax=${Number.isFinite(this.max) ? this.max : u}
284
+ aria-invalid=${this.error ? "true" : u}
285
+ aria-describedby=${this.error ? this.errorId : u}
286
+ aria-required=${this.required ? "true" : u}
287
+ ?disabled=${e}
288
+ @keydown=${this.onKeyDown}
289
+ @focus=${this.onFocus}
290
+ @blur=${this.onBlur}
291
+ />
292
+ <button
293
+ part="increase"
294
+ class="plus"
295
+ type="button"
296
+ tabindex="-1"
297
+ aria-label=${t.increase}
298
+ ?disabled=${e || a}
299
+ @click=${() => this.stepBy(1)}
300
+ >
301
+ <kt-icon name="plus" size="16"></kt-icon>
302
+ </button>
303
+ </div>`;
304
+ }
305
+ }
306
+ s([
307
+ o({
308
+ converter: {
309
+ fromAttribute: (n) => {
310
+ const t = n === null || n.trim() === "" ? NaN : Number(n);
311
+ return Number.isFinite(t) ? t : null;
312
+ }
313
+ }
314
+ })
315
+ ], i.prototype, "value");
316
+ s([
317
+ o({ type: Number })
318
+ ], i.prototype, "min");
319
+ s([
320
+ o({ type: Number })
321
+ ], i.prototype, "max");
322
+ s([
323
+ o({ type: Number })
324
+ ], i.prototype, "step");
325
+ s([
326
+ o({ type: String })
327
+ ], i.prototype, "name");
328
+ s([
329
+ o({ type: String })
330
+ ], i.prototype, "label");
331
+ s([
332
+ o({ type: String })
333
+ ], i.prototype, "locale");
334
+ s([
335
+ o({ type: String })
336
+ ], i.prototype, "placeholder");
337
+ s([
338
+ o({ type: String, reflect: !0 })
339
+ ], i.prototype, "size");
340
+ s([
341
+ o({ type: Boolean, reflect: !0 })
342
+ ], i.prototype, "disabled");
343
+ s([
344
+ o({ type: Boolean, reflect: !0 })
345
+ ], i.prototype, "required");
346
+ s([
347
+ o({ type: String, reflect: !0 })
348
+ ], i.prototype, "error");
349
+ s([
350
+ o({ attribute: !1 })
351
+ ], i.prototype, "formatOptions");
352
+ s([
353
+ f()
354
+ ], i.prototype, "focused");
355
+ s([
356
+ f()
357
+ ], i.prototype, "formDisabled");
358
+ s([
359
+ v("input")
360
+ ], i.prototype, "input");
361
+ g("kt-number-input", i);
362
+ export {
363
+ i as KtNumberInput,
364
+ M as parseLocaleNumber
365
+ };
366
+ //# 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 { play } from '#internal/motion';\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 /* Keeps a rolling number inside the field. */\n overflow: clip;\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 /** Which way the last step went, for the number to roll that way: 1, -1 or 0. */\n private rolling = 0;\n\n private stepBy(steps: number): void {\n if (this.inactive) return;\n const before = this.value;\n const from = before ?? (Number.isFinite(this.min) ? this.min : 0);\n this.commit(before === null ? from : from + steps * this.step);\n if (before !== null && this.value !== null && this.value !== before) {\n this.rolling = Math.sign(this.value - before);\n }\n }\n\n override updated(changed: PropertyValues<this>): void {\n super.updated(changed);\n if (!this.rolling) return;\n // Up as it grows, the new number coming from below; down as it shrinks.\n const offset = `${this.rolling * 0.6}em`;\n this.rolling = 0;\n play(\n this.renderRoot.querySelector('input')!,\n [\n { translate: `0 ${offset}`, opacity: 0 },\n { translate: '0 0', opacity: 1 },\n ],\n '--duration-fast',\n 'kt-number-roll',\n );\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","before","from","offset","play","event","move","typed","parsed","s","inactive","atMin","atMax","html","nothing","classMap","__decorateClass","property","query","defineElement"],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { type PropertyValues, type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ export type KtOtpInputType = 'numeric' | 'alphanumeric';
4
+ /**
5
+ * A one-time code — the six digits of a sign-in, a verification, a
6
+ * second factor — one box per character.
7
+ *
8
+ * Typing moves to the next box, Backspace from an empty box steps back and
9
+ * clears the one before, the arrows move between boxes, and a pasted code is
10
+ * spread over them. The first box asks the browser for `one-time-code`, so a
11
+ * code that arrived by text message fills itself in. `kt-complete` fires when
12
+ * the code is whole.
13
+ *
14
+ * A form control: submitted under `name`, `required` until whole, reset with
15
+ * the form.
16
+ *
17
+ * @element kt-otp-input
18
+ *
19
+ * @csspart group - The boxes.
20
+ * @csspart box - One box.
21
+ * @csspart error - The error message.
22
+ *
23
+ * @fires kt-change - The code changed. `detail: { value }`.
24
+ * @fires kt-complete - The code is whole. `detail: { value }`.
25
+ *
26
+ * @example
27
+ * ```html
28
+ * <kt-otp-input label="Verification code" name="code" required></kt-otp-input>
29
+ * ```
30
+ */
31
+ export declare class KtOtpInput extends KtElement {
32
+ static readonly formAssociated = true;
33
+ static styles: import("lit").CSSResultGroup[];
34
+ /** The code so far. */
35
+ value: string;
36
+ /** How many characters the code has. */
37
+ length: number;
38
+ /** `numeric` takes digits; `alphanumeric` letters and digits, in capitals. */
39
+ type: KtOtpInputType;
40
+ /** Accessible name for the group: "Verification code". */
41
+ label: string;
42
+ name: string;
43
+ required: boolean;
44
+ disabled: boolean;
45
+ /** An error to show and announce under the boxes. */
46
+ error: string;
47
+ private formDisabled;
48
+ private boxes;
49
+ private internals;
50
+ private defaultValue;
51
+ private readonly errorId;
52
+ connectedCallback(): void;
53
+ willUpdate(changed: PropertyValues<this>): void;
54
+ updated(changed: PropertyValues<this>): void;
55
+ formResetCallback(): void;
56
+ formDisabledCallback(disabled: boolean): void;
57
+ formStateRestoreCallback(state: string | null): void;
58
+ focus(options?: FocusOptions): void;
59
+ private get inactive();
60
+ /** What the code may hold: digits, or letters and digits in capitals, and no more than `length`. */
61
+ private clean;
62
+ private box;
63
+ /** Sets the code, says so, and says when it is whole. */
64
+ private commit;
65
+ private onInput;
66
+ private onKeyDown;
67
+ private onPaste;
68
+ render(): TemplateResult;
69
+ }
70
+ declare global {
71
+ interface HTMLElementTagNameMap {
72
+ 'kt-otp-input': KtOtpInput;
73
+ }
74
+ }