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,232 @@
1
+ import { css as v, nothing as h, html as c } from "lit";
2
+ import { property as n, state as f, queryAll as b } from "lit/decorators.js";
3
+ import { live as g } from "lit/directives/live.js";
4
+ import { K as p, d as y } from "../../../chunks/kt-element-DvWtPQ1Y.js";
5
+ import { u as x, e as d } from "../../../chunks/events-r51msXNf.js";
6
+ import { a as k, s as $, b as w } from "../../../chunks/form-control-B74_EHtG.js";
7
+ import { s as m } from "../../../chunks/index-1ZFgagWW.js";
8
+ var C = Object.defineProperty, l = (u, t, e, a) => {
9
+ for (var r = void 0, i = u.length - 1, o; i >= 0; i--)
10
+ (o = u[i]) && (r = o(t, e, r) || r);
11
+ return r && C(t, e, r), r;
12
+ };
13
+ class s extends p {
14
+ constructor() {
15
+ super(...arguments), this.value = "", this.length = 6, this.type = "numeric", this.label = "", this.name = "", this.required = !1, this.disabled = !1, this.error = "", this.formDisabled = !1, this.internals = null, this.defaultValue = "", this.errorId = x("kt-otp-error");
16
+ }
17
+ static {
18
+ this.formAssociated = !0;
19
+ }
20
+ static {
21
+ this.styles = [
22
+ p.styles,
23
+ v`
24
+ :host {
25
+ display: inline-block;
26
+ --kt-otp-box-size: calc(var(--button-height) + 8px);
27
+ }
28
+
29
+ .group {
30
+ display: flex;
31
+ gap: var(--gap-button);
32
+ }
33
+
34
+ input {
35
+ box-sizing: border-box;
36
+ width: var(--kt-otp-box-size);
37
+ height: var(--kt-otp-box-size);
38
+ padding: 0;
39
+ color: var(--text-body);
40
+ font: 600 calc(20px * var(--text-scale, 1)) / 1 var(--font-family-body);
41
+ font-variant-numeric: tabular-nums;
42
+ text-align: center;
43
+ text-transform: uppercase;
44
+ background-color: var(--surface-field);
45
+ border: var(--border-width) solid var(--border-field);
46
+ border-radius: var(--radius-input);
47
+ outline: var(--outline-width) solid transparent;
48
+ caret-color: var(--color-primary-base);
49
+ transition: outline-color var(--duration-instant);
50
+ }
51
+ input:hover {
52
+ outline-color: var(--color-text-700);
53
+ }
54
+ input:focus {
55
+ outline-color: var(--color-primary-base);
56
+ }
57
+ input[aria-invalid='true'] {
58
+ outline-color: var(--color-danger-base);
59
+ }
60
+ input:disabled {
61
+ color: var(--text-disabled);
62
+ background-color: var(--color-dark-14);
63
+ cursor: not-allowed;
64
+ outline-color: transparent;
65
+ }
66
+
67
+ .error {
68
+ margin: var(--gap-element) 0 0;
69
+ color: var(--color-danger-text);
70
+ font: var(--font-normal-small);
71
+ }
72
+ `
73
+ ];
74
+ }
75
+ connectedCallback() {
76
+ super.connectedCallback(), this.internals ??= k(this), this.value = this.clean(this.value), this.defaultValue = this.value;
77
+ }
78
+ willUpdate(t) {
79
+ if (t.has("value") || t.has("length") || t.has("type")) {
80
+ const e = this.clean(this.value);
81
+ e !== this.value && (this.value = e);
82
+ }
83
+ }
84
+ // After the render: the first box anchors the browser's message.
85
+ updated(t) {
86
+ if (t.has("value") || t.has("required") || t.has("error") || t.has("length") || this.stringsChanged(t)) {
87
+ $(this.internals, this.value || null);
88
+ const e = this.required && this.value.length < this.length;
89
+ w(
90
+ this.internals,
91
+ { valueMissing: e, customError: !!this.error },
92
+ this.error || (e ? m().otpRequired : ""),
93
+ this.boxes?.[0]
94
+ );
95
+ }
96
+ }
97
+ formResetCallback() {
98
+ this.value = this.defaultValue;
99
+ }
100
+ formDisabledCallback(t) {
101
+ this.formDisabled = t;
102
+ }
103
+ formStateRestoreCallback(t) {
104
+ this.value = t ?? "";
105
+ }
106
+ focus(t) {
107
+ this.box(Math.min(this.value.length, this.length - 1))?.focus(t);
108
+ }
109
+ get inactive() {
110
+ return this.disabled || this.formDisabled;
111
+ }
112
+ /** What the code may hold: digits, or letters and digits in capitals, and no more than `length`. */
113
+ clean(t) {
114
+ const e = this.type === "numeric" ? /[0-9]/ : /[A-Za-z0-9]/;
115
+ return [...t].filter((a) => e.test(a)).join("").toUpperCase().slice(0, Math.max(1, this.length));
116
+ }
117
+ box(t) {
118
+ return this.boxes?.[t];
119
+ }
120
+ /** Sets the code, says so, and says when it is whole. */
121
+ commit(t) {
122
+ const e = this.clean(t);
123
+ if (e === this.value) {
124
+ this.requestUpdate();
125
+ return;
126
+ }
127
+ this.value = e, d(this, "kt-change", { value: e }), e.length === this.length && d(this, "kt-complete", { value: e });
128
+ }
129
+ onInput(t, e) {
130
+ const a = this.clean(t.target.value), r = Math.min(e, this.value.length);
131
+ if (!a) {
132
+ this.commit(this.value);
133
+ return;
134
+ }
135
+ const i = (this.value.slice(0, r) + a).slice(0, this.length);
136
+ this.commit(i + this.value.slice(r + a.length)), this.updateComplete.then(() => this.box(Math.min(i.length, this.length - 1))?.focus());
137
+ }
138
+ onKeyDown(t, e) {
139
+ const a = (r) => {
140
+ t.preventDefault(), this.box(Math.max(0, Math.min(this.length - 1, r)))?.focus();
141
+ };
142
+ switch (t.key) {
143
+ case "Backspace": {
144
+ t.preventDefault();
145
+ const r = e < this.value.length ? e : this.value.length - 1;
146
+ if (r < 0) return;
147
+ this.commit(this.value.slice(0, r) + this.value.slice(r + 1)), this.updateComplete.then(() => this.box(r)?.focus());
148
+ break;
149
+ }
150
+ case "ArrowLeft":
151
+ a(e - 1);
152
+ break;
153
+ case "ArrowRight":
154
+ a(Math.min(e + 1, this.value.length));
155
+ break;
156
+ case "Home":
157
+ a(0);
158
+ break;
159
+ case "End":
160
+ a(this.value.length);
161
+ break;
162
+ }
163
+ }
164
+ onPaste(t, e) {
165
+ const a = this.clean(t.clipboardData?.getData("text") ?? "");
166
+ if (!a) return;
167
+ t.preventDefault();
168
+ const r = Math.min(e, this.value.length), i = (this.value.slice(0, r) + a).slice(0, this.length);
169
+ this.commit(i), this.updateComplete.then(() => this.box(Math.min(i.length, this.length - 1))?.focus());
170
+ }
171
+ render() {
172
+ const t = m(), e = Math.max(1, Math.round(this.length));
173
+ return c`<div part="group" class="group" role="group" aria-label=${this.label || h}>
174
+ ${Array.from({ length: e }, (a, r) => {
175
+ const i = this.value[r] ?? "";
176
+ return c`<input
177
+ part="box"
178
+ .value=${g(i)}
179
+ maxlength=${r === 0 ? e : 1}
180
+ inputmode=${this.type === "numeric" ? "numeric" : "text"}
181
+ autocomplete=${r === 0 ? "one-time-code" : "off"}
182
+ autocapitalize="characters"
183
+ spellcheck="false"
184
+ aria-label=${t.otpCharacter(r + 1, e)}
185
+ aria-invalid=${this.error ? "true" : h}
186
+ aria-describedby=${this.error ? this.errorId : h}
187
+ ?disabled=${this.inactive}
188
+ @input=${(o) => this.onInput(o, r)}
189
+ @keydown=${(o) => this.onKeyDown(o, r)}
190
+ @paste=${(o) => this.onPaste(o, r)}
191
+ @focus=${(o) => o.target.select()}
192
+ />`;
193
+ })}
194
+ </div>
195
+ ${this.error ? c`<p part="error" class="error" id=${this.errorId}>${this.error}</p>` : h}`;
196
+ }
197
+ }
198
+ l([
199
+ n({ type: String })
200
+ ], s.prototype, "value");
201
+ l([
202
+ n({ type: Number })
203
+ ], s.prototype, "length");
204
+ l([
205
+ n({ type: String })
206
+ ], s.prototype, "type");
207
+ l([
208
+ n({ type: String })
209
+ ], s.prototype, "label");
210
+ l([
211
+ n({ type: String })
212
+ ], s.prototype, "name");
213
+ l([
214
+ n({ type: Boolean, reflect: !0 })
215
+ ], s.prototype, "required");
216
+ l([
217
+ n({ type: Boolean, reflect: !0 })
218
+ ], s.prototype, "disabled");
219
+ l([
220
+ n({ type: String, reflect: !0 })
221
+ ], s.prototype, "error");
222
+ l([
223
+ f()
224
+ ], s.prototype, "formDisabled");
225
+ l([
226
+ b("input")
227
+ ], s.prototype, "boxes");
228
+ y("kt-otp-input", s);
229
+ export {
230
+ s as KtOtpInput
231
+ };
232
+ //# sourceMappingURL=kt-otp-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-otp-input.js","sources":["../../../../src/components/forms/kt-otp-input/kt-otp-input.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, queryAll, state } from 'lit/decorators.js';\nimport { live } from 'lit/directives/live.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 { strings } from '#internal/strings';\n\nexport type KtOtpInputType = 'numeric' | 'alphanumeric';\n\n/**\n * A one-time code — the six digits of a sign-in, a verification, a\n * second factor — one box per character.\n *\n * Typing moves to the next box, Backspace from an empty box steps back and\n * clears the one before, the arrows move between boxes, and a pasted code is\n * spread over them. The first box asks the browser for `one-time-code`, so a\n * code that arrived by text message fills itself in. `kt-complete` fires when\n * the code is whole.\n *\n * A form control: submitted under `name`, `required` until whole, reset with\n * the form.\n *\n * @element kt-otp-input\n *\n * @csspart group - The boxes.\n * @csspart box - One box.\n * @csspart error - The error message.\n *\n * @fires kt-change - The code changed. `detail: { value }`.\n * @fires kt-complete - The code is whole. `detail: { value }`.\n *\n * @example\n * ```html\n * <kt-otp-input label=\"Verification code\" name=\"code\" required></kt-otp-input>\n * ```\n */\nexport class KtOtpInput extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-block;\n --kt-otp-box-size: calc(var(--button-height) + 8px);\n }\n\n .group {\n display: flex;\n gap: var(--gap-button);\n }\n\n input {\n box-sizing: border-box;\n width: var(--kt-otp-box-size);\n height: var(--kt-otp-box-size);\n padding: 0;\n color: var(--text-body);\n font: 600 calc(20px * var(--text-scale, 1)) / 1 var(--font-family-body);\n font-variant-numeric: tabular-nums;\n text-align: center;\n text-transform: uppercase;\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 caret-color: var(--color-primary-base);\n transition: outline-color var(--duration-instant);\n }\n input:hover {\n outline-color: var(--color-text-700);\n }\n input:focus {\n outline-color: var(--color-primary-base);\n }\n input[aria-invalid='true'] {\n outline-color: var(--color-danger-base);\n }\n input:disabled {\n color: var(--text-disabled);\n background-color: var(--color-dark-14);\n cursor: not-allowed;\n outline-color: transparent;\n }\n\n .error {\n margin: var(--gap-element) 0 0;\n color: var(--color-danger-text);\n font: var(--font-normal-small);\n }\n `,\n ];\n\n /** The code so far. */\n @property({ type: String })\n value = '';\n\n /** How many characters the code has. */\n @property({ type: Number })\n length = 6;\n\n /** `numeric` takes digits; `alphanumeric` letters and digits, in capitals. */\n @property({ type: String })\n type: KtOtpInputType = 'numeric';\n\n /** Accessible name for the group: \"Verification code\". */\n @property({ type: String })\n label = '';\n\n @property({ type: String })\n name = '';\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** An error to show and announce under the boxes. */\n @property({ type: String, reflect: true })\n error = '';\n\n @state() private formDisabled = false;\n\n @queryAll('input') private boxes!: NodeListOf<HTMLInputElement>;\n\n private internals: UsableInternals | null = null;\n private defaultValue = '';\n private readonly errorId = uniqueId('kt-otp-error');\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.value = this.clean(this.value);\n this.defaultValue = this.value;\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('value') || changed.has('length') || changed.has('type')) {\n const cleaned = this.clean(this.value);\n if (cleaned !== this.value) this.value = cleaned;\n }\n }\n\n // After the render: the first box anchors the browser's message.\n override updated(changed: PropertyValues<this>): void {\n if (\n changed.has('value') ||\n changed.has('required') ||\n changed.has('error') ||\n changed.has('length') ||\n this.stringsChanged(changed)\n ) {\n setFormValue(this.internals, this.value || null);\n const missing = this.required && this.value.length < this.length;\n setValidity(\n this.internals,\n { valueMissing: missing, customError: Boolean(this.error) },\n this.error || (missing ? strings().otpRequired : ''),\n this.boxes?.[0],\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 ?? '';\n }\n\n override focus(options?: FocusOptions): void {\n this.box(Math.min(this.value.length, this.length - 1))?.focus(options);\n }\n\n private get inactive(): boolean {\n return this.disabled || this.formDisabled;\n }\n\n /** What the code may hold: digits, or letters and digits in capitals, and no more than `length`. */\n private clean(text: string): string {\n const allowed = this.type === 'numeric' ? /[0-9]/ : /[A-Za-z0-9]/;\n return [...text]\n .filter((character) => allowed.test(character))\n .join('')\n .toUpperCase()\n .slice(0, Math.max(1, this.length));\n }\n\n private box(index: number): HTMLInputElement | undefined {\n return this.boxes?.[index];\n }\n\n /** Sets the code, says so, and says when it is whole. */\n private commit(next: string): void {\n const value = this.clean(next);\n if (value === this.value) {\n this.requestUpdate();\n return;\n }\n this.value = value;\n emit(this, 'kt-change', { value });\n if (value.length === this.length) emit(this, 'kt-complete', { value });\n }\n\n private onInput(event: InputEvent, index: number): void {\n const typed = this.clean((event.target as HTMLInputElement).value);\n // Characters go in order: a box past the first empty one fills that one.\n const at = Math.min(index, this.value.length);\n if (!typed) {\n this.commit(this.value);\n return;\n }\n // More than one character — autofill, a fast typist — spreads on.\n const next = (this.value.slice(0, at) + typed).slice(0, this.length);\n this.commit(next + this.value.slice(at + typed.length));\n void this.updateComplete.then(() => this.box(Math.min(next.length, this.length - 1))?.focus());\n }\n\n private onKeyDown(event: KeyboardEvent, index: number): void {\n const move = (to: number) => {\n event.preventDefault();\n this.box(Math.max(0, Math.min(this.length - 1, to)))?.focus();\n };\n switch (event.key) {\n case 'Backspace': {\n event.preventDefault();\n const at = index < this.value.length ? index : this.value.length - 1;\n if (at < 0) return;\n this.commit(this.value.slice(0, at) + this.value.slice(at + 1));\n void this.updateComplete.then(() => this.box(at)?.focus());\n break;\n }\n case 'ArrowLeft':\n move(index - 1);\n break;\n case 'ArrowRight':\n move(Math.min(index + 1, this.value.length));\n break;\n case 'Home':\n move(0);\n break;\n case 'End':\n move(this.value.length);\n break;\n }\n }\n\n private onPaste(event: ClipboardEvent, index: number): void {\n const pasted = this.clean(event.clipboardData?.getData('text') ?? '');\n if (!pasted) return;\n event.preventDefault();\n const at = Math.min(index, this.value.length);\n const next = (this.value.slice(0, at) + pasted).slice(0, this.length);\n this.commit(next);\n void this.updateComplete.then(() => this.box(Math.min(next.length, this.length - 1))?.focus());\n }\n\n override render(): TemplateResult {\n const s = strings();\n const count = Math.max(1, Math.round(this.length));\n return html`<div part=\"group\" class=\"group\" role=\"group\" aria-label=${this.label || nothing}>\n ${Array.from({ length: count }, (_, index) => {\n const character = this.value[index] ?? '';\n return html`<input\n part=\"box\"\n .value=${live(character)}\n maxlength=${index === 0 ? count : 1}\n inputmode=${this.type === 'numeric' ? 'numeric' : 'text'}\n autocomplete=${index === 0 ? 'one-time-code' : 'off'}\n autocapitalize=\"characters\"\n spellcheck=\"false\"\n aria-label=${s.otpCharacter(index + 1, count)}\n aria-invalid=${this.error ? 'true' : nothing}\n aria-describedby=${this.error ? this.errorId : nothing}\n ?disabled=${this.inactive}\n @input=${(event: InputEvent) => this.onInput(event, index)}\n @keydown=${(event: KeyboardEvent) => this.onKeyDown(event, index)}\n @paste=${(event: ClipboardEvent) => this.onPaste(event, index)}\n @focus=${(event: FocusEvent) => (event.target as HTMLInputElement).select()}\n />`;\n })}\n </div>\n ${\n this.error\n ? html`<p part=\"error\" class=\"error\" id=${this.errorId}>${this.error}</p>`\n : nothing\n }`;\n }\n}\n\ndefineElement('kt-otp-input', KtOtpInput);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-otp-input': KtOtpInput;\n }\n}\n"],"names":["KtOtpInput","KtElement","uniqueId","css","attachFormInternals","changed","cleaned","setFormValue","missing","setValidity","strings","disabled","state","options","text","allowed","character","index","next","value","emit","event","typed","at","move","to","pasted","s","count","html","nothing","_","live","__decorateClass","property","queryAll","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
+ import '../../core/kt-button/kt-button.js';
4
+ export type KtPromptInputSubmitOn = 'enter' | 'mod-enter';
5
+ /** What `kt-submit` carries: the text, and a way to have the input wait for its sending. */
6
+ export interface KtPromptSubmitDetail {
7
+ readonly value: string;
8
+ /** Hand it the sending: the field holds the text until it resolves, and keeps it if it fails. */
9
+ readonly wait: (sending: Promise<unknown>) => void;
10
+ }
11
+ /**
12
+ * The field a person writes to an assistant in: it grows with what is
13
+ * written, sends on Enter, and shows the sending on its own send button.
14
+ *
15
+ * Enter sends and Shift+Enter starts a line; with `submit-on="mod-enter"`,
16
+ * Enter starts a line and Cmd or Ctrl+Enter sends. `kt-submit` carries the
17
+ * text and `wait(promise)`: hand it the request, and the send button runs it
18
+ * — its plane turning into the spinner and flying off — while the field holds
19
+ * the text, emptied on success, kept on failure. Without `wait` the field
20
+ * empties at once.
21
+ *
22
+ * @element kt-prompt-input
23
+ *
24
+ * @slot attachments - Above the text: files or context added to the message.
25
+ * @slot actions - Beside the send button: attach, a model picker, a mode.
26
+ *
27
+ * @csspart base - The field.
28
+ * @csspart textarea - The native `<textarea>`.
29
+ * @csspart send - The send button.
30
+ *
31
+ * @fires kt-input - On every keystroke. `detail: { value }`.
32
+ * @fires kt-submit - The text was sent. `detail: { value, wait(promise) }`.
33
+ *
34
+ * @example
35
+ * ```html
36
+ * <kt-prompt-input placeholder="Ask anything"></kt-prompt-input>
37
+ * <script>
38
+ * prompt.addEventListener('kt-submit', (e) => e.detail.wait(api.ask(e.detail.value)));
39
+ * </script>
40
+ * ```
41
+ */
42
+ export declare class KtPromptInput extends KtElement {
43
+ static styles: import("lit").CSSResultGroup[];
44
+ /** The text in the field. */
45
+ value: string;
46
+ placeholder: string;
47
+ /** Accessible name for the field. Defaults to the translated "Message". */
48
+ label: string;
49
+ disabled: boolean;
50
+ /** How many lines it grows to before it scrolls. */
51
+ maxRows: number;
52
+ /** `enter` sends on Enter; `mod-enter` on Cmd or Ctrl+Enter, leaving Enter for new lines. */
53
+ submitOn: KtPromptInputSubmitOn;
54
+ private sending;
55
+ private hasAttachments;
56
+ private field;
57
+ private button;
58
+ focus(options?: FocusOptions): void;
59
+ /** Sends what is written, as Enter would. Nothing when it is blank, disabled or sending. */
60
+ submit(): void;
61
+ firstUpdated(): void;
62
+ updated(changed: PropertyValues<this>): void;
63
+ /** As tall as the text, up to `max-rows`; past that it scrolls. */
64
+ private fit;
65
+ private readAttachments;
66
+ private onInput;
67
+ private onKeyDown;
68
+ render(): TemplateResult;
69
+ }
70
+ declare global {
71
+ interface HTMLElementTagNameMap {
72
+ 'kt-prompt-input': KtPromptInput;
73
+ }
74
+ }
@@ -0,0 +1,213 @@
1
+ import { css as f, nothing as b, html as v } from "lit";
2
+ import { property as o, state as m, query as c } from "lit/decorators.js";
3
+ import { classMap as p } from "lit/directives/class-map.js";
4
+ import { live as y } from "lit/directives/live.js";
5
+ import { K as h, d as g } from "../../../chunks/kt-element-DvWtPQ1Y.js";
6
+ import { e as u } from "../../../chunks/events-r51msXNf.js";
7
+ import { h as x } from "../../../chunks/slots-BPbIdxAJ.js";
8
+ import { s as w } from "../../../chunks/index-1ZFgagWW.js";
9
+ import "../../core/kt-button/kt-button.js";
10
+ var k = Object.defineProperty, i = (d, t, e, l) => {
11
+ for (var s = void 0, r = d.length - 1, n; r >= 0; r--)
12
+ (n = d[r]) && (s = n(t, e, s) || s);
13
+ return s && k(t, e, s), s;
14
+ };
15
+ class a extends h {
16
+ constructor() {
17
+ super(...arguments), this.value = "", this.placeholder = "", this.label = "", this.disabled = !1, this.maxRows = 8, this.submitOn = "enter", this.sending = !1, this.hasAttachments = !1;
18
+ }
19
+ static {
20
+ this.styles = [
21
+ h.styles,
22
+ f`
23
+ :host {
24
+ display: block;
25
+ }
26
+
27
+ .field {
28
+ display: grid;
29
+ gap: var(--gap-element);
30
+ padding: var(--gap-element);
31
+ background-color: var(--surface-field);
32
+ border: var(--border-width) solid var(--border-field);
33
+ border-radius: var(--border-radius-card);
34
+ outline: var(--outline-width) solid transparent;
35
+ transition: outline-color var(--duration-instant);
36
+ }
37
+ .field:hover {
38
+ outline: var(--outline-width) solid var(--color-text-700);
39
+ }
40
+ .field:focus-within {
41
+ outline: var(--outline-width) solid var(--color-primary-base);
42
+ }
43
+ .disabled {
44
+ background-color: var(--color-dark-14);
45
+ pointer-events: none;
46
+ }
47
+
48
+ .attachments {
49
+ display: flex;
50
+ flex-wrap: wrap;
51
+ gap: var(--gap-button);
52
+ }
53
+ .attachments.empty {
54
+ display: none;
55
+ }
56
+
57
+ textarea {
58
+ box-sizing: border-box;
59
+ width: 100%;
60
+ padding: var(--text-area-padding);
61
+ overflow-y: hidden;
62
+ color: var(--text-body);
63
+ font: var(--font-input);
64
+ background: transparent;
65
+ border: none;
66
+ outline: none;
67
+ resize: none;
68
+ }
69
+ textarea::placeholder {
70
+ color: var(--text-muted);
71
+ }
72
+ .disabled textarea {
73
+ color: var(--text-disabled);
74
+ }
75
+
76
+ .bar {
77
+ display: flex;
78
+ align-items: center;
79
+ justify-content: space-between;
80
+ gap: var(--gap-button);
81
+ }
82
+ .actions {
83
+ display: flex;
84
+ flex-wrap: wrap;
85
+ align-items: center;
86
+ gap: var(--gap-button);
87
+ min-width: 0;
88
+ }
89
+ `
90
+ ];
91
+ }
92
+ focus(t) {
93
+ this.field?.focus(t);
94
+ }
95
+ /** Sends what is written, as Enter would. Nothing when it is blank, disabled or sending. */
96
+ submit() {
97
+ const t = this.value;
98
+ if (this.disabled || this.sending || !t.trim()) return;
99
+ let e = null;
100
+ if (u(this, "kt-submit", {
101
+ value: t,
102
+ wait: (s) => {
103
+ e = s;
104
+ }
105
+ }), !e) {
106
+ this.value = "";
107
+ return;
108
+ }
109
+ const l = e;
110
+ this.sending = !0, this.button.run(() => l).then(
111
+ () => {
112
+ this.value === t && (this.value = "");
113
+ },
114
+ () => {
115
+ }
116
+ ).finally(() => {
117
+ this.sending = !1;
118
+ });
119
+ }
120
+ firstUpdated() {
121
+ this.readAttachments(), this.fit();
122
+ }
123
+ updated(t) {
124
+ (t.has("value") || t.has("maxRows")) && this.fit();
125
+ }
126
+ /** As tall as the text, up to `max-rows`; past that it scrolls. */
127
+ fit() {
128
+ const t = this.field;
129
+ if (!t) return;
130
+ const e = getComputedStyle(t), l = parseFloat(e.lineHeight) || 20, s = parseFloat(e.paddingTop) + parseFloat(e.paddingBottom) || 0, r = l * Math.max(1, this.maxRows) + s;
131
+ t.style.height = "auto";
132
+ const n = t.scrollHeight;
133
+ t.style.height = `${Math.min(n, r)}px`, t.style.overflowY = n > r ? "auto" : "hidden";
134
+ }
135
+ readAttachments() {
136
+ this.hasAttachments = x(
137
+ this.shadowRoot?.querySelector('slot[name="attachments"]')
138
+ );
139
+ }
140
+ onInput() {
141
+ this.value = this.field.value, u(this, "kt-input", { value: this.value });
142
+ }
143
+ onKeyDown(t) {
144
+ if (t.key !== "Enter" || t.isComposing || t.shiftKey) return;
145
+ const e = t.metaKey || t.ctrlKey;
146
+ this.submitOn === "mod-enter" && !e || (t.preventDefault(), this.submit());
147
+ }
148
+ render() {
149
+ const t = w(), e = !this.value.trim();
150
+ return v`<div part="base" class=${p({ field: !0, disabled: this.disabled })}>
151
+ <div class=${p({ attachments: !0, empty: !this.hasAttachments })}>
152
+ <slot name="attachments" @slotchange=${this.readAttachments}></slot>
153
+ </div>
154
+ <textarea
155
+ part="textarea"
156
+ rows="1"
157
+ .value=${y(this.value)}
158
+ placeholder=${this.placeholder || b}
159
+ aria-label=${this.label || t.message}
160
+ ?disabled=${this.disabled}
161
+ ?readonly=${this.sending}
162
+ @input=${this.onInput}
163
+ @keydown=${this.onKeyDown}
164
+ ></textarea>
165
+ <div class="bar">
166
+ <div class="actions"><slot name="actions"></slot></div>
167
+ <kt-button
168
+ part="send"
169
+ icon="send"
170
+ size="small"
171
+ label=${t.send}
172
+ ?disabled=${e && !this.sending || this.disabled}
173
+ @click=${() => this.submit()}
174
+ ></kt-button>
175
+ </div>
176
+ </div>`;
177
+ }
178
+ }
179
+ i([
180
+ o({ type: String })
181
+ ], a.prototype, "value");
182
+ i([
183
+ o({ type: String })
184
+ ], a.prototype, "placeholder");
185
+ i([
186
+ o({ type: String })
187
+ ], a.prototype, "label");
188
+ i([
189
+ o({ type: Boolean, reflect: !0 })
190
+ ], a.prototype, "disabled");
191
+ i([
192
+ o({ type: Number, attribute: "max-rows" })
193
+ ], a.prototype, "maxRows");
194
+ i([
195
+ o({ type: String, attribute: "submit-on" })
196
+ ], a.prototype, "submitOn");
197
+ i([
198
+ m()
199
+ ], a.prototype, "sending");
200
+ i([
201
+ m()
202
+ ], a.prototype, "hasAttachments");
203
+ i([
204
+ c("textarea")
205
+ ], a.prototype, "field");
206
+ i([
207
+ c("kt-button")
208
+ ], a.prototype, "button");
209
+ g("kt-prompt-input", a);
210
+ export {
211
+ a as KtPromptInput
212
+ };
213
+ //# sourceMappingURL=kt-prompt-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-prompt-input.js","sources":["../../../../src/components/forms/kt-prompt-input/kt-prompt-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 { live } from 'lit/directives/live.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { hasAssignedContent } from '#internal/slots';\nimport { strings } from '#internal/strings';\nimport '../../core/kt-button/kt-button.js';\nimport type { KtButton } from '../../core/kt-button/kt-button.js';\n\nexport type KtPromptInputSubmitOn = 'enter' | 'mod-enter';\n\n/** What `kt-submit` carries: the text, and a way to have the input wait for its sending. */\nexport interface KtPromptSubmitDetail {\n readonly value: string;\n /** Hand it the sending: the field holds the text until it resolves, and keeps it if it fails. */\n readonly wait: (sending: Promise<unknown>) => void;\n}\n\n/**\n * The field a person writes to an assistant in: it grows with what is\n * written, sends on Enter, and shows the sending on its own send button.\n *\n * Enter sends and Shift+Enter starts a line; with `submit-on=\"mod-enter\"`,\n * Enter starts a line and Cmd or Ctrl+Enter sends. `kt-submit` carries the\n * text and `wait(promise)`: hand it the request, and the send button runs it\n * — its plane turning into the spinner and flying off — while the field holds\n * the text, emptied on success, kept on failure. Without `wait` the field\n * empties at once.\n *\n * @element kt-prompt-input\n *\n * @slot attachments - Above the text: files or context added to the message.\n * @slot actions - Beside the send button: attach, a model picker, a mode.\n *\n * @csspart base - The field.\n * @csspart textarea - The native `<textarea>`.\n * @csspart send - The send button.\n *\n * @fires kt-input - On every keystroke. `detail: { value }`.\n * @fires kt-submit - The text was sent. `detail: { value, wait(promise) }`.\n *\n * @example\n * ```html\n * <kt-prompt-input placeholder=\"Ask anything\"></kt-prompt-input>\n * <script>\n * prompt.addEventListener('kt-submit', (e) => e.detail.wait(api.ask(e.detail.value)));\n * </script>\n * ```\n */\nexport class KtPromptInput extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .field {\n display: grid;\n gap: var(--gap-element);\n padding: var(--gap-element);\n background-color: var(--surface-field);\n border: var(--border-width) solid var(--border-field);\n border-radius: var(--border-radius-card);\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 .disabled {\n background-color: var(--color-dark-14);\n pointer-events: none;\n }\n\n .attachments {\n display: flex;\n flex-wrap: wrap;\n gap: var(--gap-button);\n }\n .attachments.empty {\n display: none;\n }\n\n textarea {\n box-sizing: border-box;\n width: 100%;\n padding: var(--text-area-padding);\n overflow-y: hidden;\n color: var(--text-body);\n font: var(--font-input);\n background: transparent;\n border: none;\n outline: none;\n resize: none;\n }\n textarea::placeholder {\n color: var(--text-muted);\n }\n .disabled textarea {\n color: var(--text-disabled);\n }\n\n .bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--gap-button);\n }\n .actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--gap-button);\n min-width: 0;\n }\n `,\n ];\n\n /** The text in the field. */\n @property({ type: String })\n value = '';\n\n @property({ type: String })\n placeholder = '';\n\n /** Accessible name for the field. Defaults to the translated \"Message\". */\n @property({ type: String })\n label = '';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** How many lines it grows to before it scrolls. */\n @property({ type: Number, attribute: 'max-rows' })\n maxRows = 8;\n\n /** `enter` sends on Enter; `mod-enter` on Cmd or Ctrl+Enter, leaving Enter for new lines. */\n @property({ type: String, attribute: 'submit-on' })\n submitOn: KtPromptInputSubmitOn = 'enter';\n\n @state() private sending = false;\n @state() private hasAttachments = false;\n\n @query('textarea') private field!: HTMLTextAreaElement;\n @query('kt-button') private button!: KtButton;\n\n override focus(options?: FocusOptions): void {\n this.field?.focus(options);\n }\n\n /** Sends what is written, as Enter would. Nothing when it is blank, disabled or sending. */\n submit(): void {\n const value = this.value;\n if (this.disabled || this.sending || !value.trim()) return;\n let sending: Promise<unknown> | null = null;\n emit<KtPromptSubmitDetail>(this, 'kt-submit', {\n value,\n wait: (promise) => {\n sending = promise;\n },\n });\n if (!sending) {\n this.value = '';\n return;\n }\n const waited: Promise<unknown> = sending;\n this.sending = true;\n void this.button\n .run(() => waited)\n .then(\n () => {\n // A newer text typed meanwhile is the reader's, not the sent one.\n if (this.value === value) this.value = '';\n },\n () => undefined,\n )\n .finally(() => {\n this.sending = false;\n });\n }\n\n override firstUpdated(): void {\n this.readAttachments();\n this.fit();\n }\n\n override updated(changed: PropertyValues<this>): void {\n if (changed.has('value') || changed.has('maxRows')) this.fit();\n }\n\n /** As tall as the text, up to `max-rows`; past that it scrolls. */\n private fit(): void {\n const field = this.field;\n if (!field) return;\n const style = getComputedStyle(field);\n const line = parseFloat(style.lineHeight) || 20;\n const padding = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom) || 0;\n const most = line * Math.max(1, this.maxRows) + padding;\n field.style.height = 'auto';\n const wanted = field.scrollHeight;\n field.style.height = `${Math.min(wanted, most)}px`;\n field.style.overflowY = wanted > most ? 'auto' : 'hidden';\n }\n\n private readAttachments(): void {\n this.hasAttachments = hasAssignedContent(\n this.shadowRoot?.querySelector('slot[name=\"attachments\"]'),\n );\n }\n\n private onInput(): void {\n this.value = this.field.value;\n emit(this, 'kt-input', { value: this.value });\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n if (event.key !== 'Enter' || event.isComposing || event.shiftKey) return;\n const mod = event.metaKey || event.ctrlKey;\n if (this.submitOn === 'mod-enter' && !mod) return;\n event.preventDefault();\n this.submit();\n }\n\n override render(): TemplateResult {\n const s = strings();\n const blank = !this.value.trim();\n return html`<div part=\"base\" class=${classMap({ field: true, disabled: this.disabled })}>\n <div class=${classMap({ attachments: true, empty: !this.hasAttachments })}>\n <slot name=\"attachments\" @slotchange=${this.readAttachments}></slot>\n </div>\n <textarea\n part=\"textarea\"\n rows=\"1\"\n .value=${live(this.value)}\n placeholder=${this.placeholder || nothing}\n aria-label=${this.label || s.message}\n ?disabled=${this.disabled}\n ?readonly=${this.sending}\n @input=${this.onInput}\n @keydown=${this.onKeyDown}\n ></textarea>\n <div class=\"bar\">\n <div class=\"actions\"><slot name=\"actions\"></slot></div>\n <kt-button\n part=\"send\"\n icon=\"send\"\n size=\"small\"\n label=${s.send}\n ?disabled=${(blank && !this.sending) || this.disabled}\n @click=${() => this.submit()}\n ></kt-button>\n </div>\n </div>`;\n }\n}\n\ndefineElement('kt-prompt-input', KtPromptInput);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-prompt-input': KtPromptInput;\n }\n}\n"],"names":["KtPromptInput","KtElement","css","options","value","sending","emit","promise","waited","changed","field","style","line","padding","most","wanted","hasAssignedContent","event","mod","s","strings","blank","html","classMap","live","nothing","__decorateClass","property","state","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-DvWtPQ1Y.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-1ZFgagWW.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-DvWtPQ1Y.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-1ZFgagWW.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--)