kanto-ds 1.2.0 → 1.4.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 (116) hide show
  1. package/README.md +24 -6
  2. package/dist/chunks/{defaults-DKzFsNbv.js → defaults-BwgjMcww.js} +27 -26
  3. package/dist/chunks/{defaults-DKzFsNbv.js.map → defaults-BwgjMcww.js.map} +1 -1
  4. package/dist/chunks/index-DSSLJirw.js +79 -0
  5. package/dist/chunks/index-DSSLJirw.js.map +1 -0
  6. package/dist/chunks/kt-element-E-tfJpGQ.js +52 -0
  7. package/dist/chunks/kt-element-E-tfJpGQ.js.map +1 -0
  8. package/dist/components/core/kt-avatar/kt-avatar.js +8 -7
  9. package/dist/components/core/kt-avatar/kt-avatar.js.map +1 -1
  10. package/dist/components/core/kt-badge/kt-badge.js +7 -6
  11. package/dist/components/core/kt-badge/kt-badge.js.map +1 -1
  12. package/dist/components/core/kt-button/kt-button.js +1 -1
  13. package/dist/components/core/kt-card/kt-card.js +1 -1
  14. package/dist/components/core/kt-code/kt-code.js +31 -30
  15. package/dist/components/core/kt-code/kt-code.js.map +1 -1
  16. package/dist/components/core/kt-icon/kt-icon.js +2 -2
  17. package/dist/components/core/kt-kbd/kt-kbd.js +1 -1
  18. package/dist/components/core/kt-split-button/kt-split-button.d.ts +2 -2
  19. package/dist/components/core/kt-split-button/kt-split-button.js +27 -26
  20. package/dist/components/core/kt-split-button/kt-split-button.js.map +1 -1
  21. package/dist/components/data/kt-chart/kt-chart.d.ts +2 -2
  22. package/dist/components/data/kt-chart/kt-chart.js +222 -221
  23. package/dist/components/data/kt-chart/kt-chart.js.map +1 -1
  24. package/dist/components/data/kt-meter/kt-meter.js +1 -1
  25. package/dist/components/data/kt-pagination/kt-pagination.d.ts +1 -1
  26. package/dist/components/data/kt-pagination/kt-pagination.js +29 -28
  27. package/dist/components/data/kt-pagination/kt-pagination.js.map +1 -1
  28. package/dist/components/data/kt-stat/kt-stat.js +1 -1
  29. package/dist/components/data/kt-table/kt-table.d.ts +2 -2
  30. package/dist/components/data/kt-table/kt-table.js +30 -29
  31. package/dist/components/data/kt-table/kt-table.js.map +1 -1
  32. package/dist/components/data/kt-timeline/kt-timeline.js +1 -1
  33. package/dist/components/feedback/kt-alert/kt-alert.js +17 -16
  34. package/dist/components/feedback/kt-alert/kt-alert.js.map +1 -1
  35. package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
  36. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +1 -1
  37. package/dist/components/feedback/kt-skeleton/kt-skeleton.js +1 -1
  38. package/dist/components/feedback/kt-toast/kt-toast.js +25 -19
  39. package/dist/components/feedback/kt-toast/kt-toast.js.map +1 -1
  40. package/dist/components/feedback/kt-toast-container/kt-toast-container.js +1 -1
  41. package/dist/components/feedback/kt-tooltip/kt-tooltip.js +1 -1
  42. package/dist/components/forms/kt-checkbox/kt-checkbox.d.ts +66 -0
  43. package/dist/components/forms/kt-checkbox/kt-checkbox.js +198 -0
  44. package/dist/components/forms/kt-checkbox/kt-checkbox.js.map +1 -0
  45. package/dist/components/forms/kt-drag-drop/kt-drag-drop.d.ts +2 -2
  46. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +60 -57
  47. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js.map +1 -1
  48. package/dist/components/forms/kt-form/kt-form.js +11 -10
  49. package/dist/components/forms/kt-form/kt-form.js.map +1 -1
  50. package/dist/components/forms/kt-input/kt-input.js +56 -55
  51. package/dist/components/forms/kt-input/kt-input.js.map +1 -1
  52. package/dist/components/forms/kt-input-menu/kt-input-menu.d.ts +1 -1
  53. package/dist/components/forms/kt-input-menu/kt-input-menu.js +57 -56
  54. package/dist/components/forms/kt-input-menu/kt-input-menu.js.map +1 -1
  55. package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
  56. package/dist/components/forms/kt-radio-group/kt-radio-group.d.ts +103 -0
  57. package/dist/components/forms/kt-radio-group/kt-radio-group.js +265 -0
  58. package/dist/components/forms/kt-radio-group/kt-radio-group.js.map +1 -0
  59. package/dist/components/forms/kt-select/kt-select.d.ts +2 -2
  60. package/dist/components/forms/kt-select/kt-select.js +62 -61
  61. package/dist/components/forms/kt-select/kt-select.js.map +1 -1
  62. package/dist/components/forms/kt-textarea/kt-textarea.js +9 -8
  63. package/dist/components/forms/kt-textarea/kt-textarea.js.map +1 -1
  64. package/dist/components/forms/kt-toggle/kt-toggle.js +1 -1
  65. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.d.ts +1 -1
  66. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +6 -5
  67. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js.map +1 -1
  68. package/dist/components/navigation/kt-header/kt-header.js +11 -10
  69. package/dist/components/navigation/kt-header/kt-header.js.map +1 -1
  70. package/dist/components/navigation/kt-page-header/kt-page-header.js +1 -1
  71. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +44 -43
  72. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -1
  73. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.d.ts +1 -1
  74. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +6 -5
  75. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js.map +1 -1
  76. package/dist/components/navigation/kt-tabs/kt-tabs.js +1 -1
  77. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +1 -1
  78. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +12 -6
  79. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js.map +1 -1
  80. package/dist/components/overlays/kt-collapsible/kt-collapsible.js +1 -1
  81. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.d.ts +3 -3
  82. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +30 -27
  83. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js.map +1 -1
  84. package/dist/components/overlays/kt-dropdown/kt-dropdown.d.ts +1 -1
  85. package/dist/components/overlays/kt-dropdown/kt-dropdown.js +8 -7
  86. package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -1
  87. package/dist/components/overlays/kt-modal/kt-modal.js +5 -4
  88. package/dist/components/overlays/kt-modal/kt-modal.js.map +1 -1
  89. package/dist/components/overlays/kt-side-panel/kt-side-panel.d.ts +1 -1
  90. package/dist/components/overlays/kt-side-panel/kt-side-panel.js +24 -23
  91. package/dist/components/overlays/kt-side-panel/kt-side-panel.js.map +1 -1
  92. package/dist/custom-elements.json +1870 -1071
  93. package/dist/icons/defaults.d.ts +1 -0
  94. package/dist/icons/index.js +1 -1
  95. package/dist/index.d.ts +5 -0
  96. package/dist/index.js +93 -83
  97. package/dist/index.js.map +1 -1
  98. package/dist/internal/kt-element.d.ts +6 -1
  99. package/dist/internal/strings.d.ts +103 -0
  100. package/dist/react/index.d.ts +13 -0
  101. package/dist/react/index.js +176 -157
  102. package/dist/react/index.js.map +1 -1
  103. package/dist/react/jsx.d.ts +12 -1
  104. package/dist/strings/index.d.ts +11 -0
  105. package/dist/strings/index.js +8 -0
  106. package/dist/strings/index.js.map +1 -0
  107. package/dist/tokens/base.css +56 -0
  108. package/dist/vscode.css-custom-data.json +12 -0
  109. package/dist/vscode.html-custom-data.json +85 -0
  110. package/dist/vue/index.d.ts +6 -0
  111. package/dist/vue/index.js +9 -7
  112. package/dist/vue/index.js.map +1 -1
  113. package/dist/web-types.json +263 -39
  114. package/package.json +19 -3
  115. package/dist/chunks/kt-element-B_jjQDhg.js +0 -38
  116. package/dist/chunks/kt-element-B_jjQDhg.js.map +0 -1
@@ -1,20 +1,21 @@
1
- import { css as y, nothing as a, html as l } from "lit";
2
- import { query as g, state as v, property as s } from "lit/decorators.js";
3
- import { classMap as d } from "lit/directives/class-map.js";
4
- import { live as x } from "lit/directives/live.js";
5
- import { K as f, d as w } from "../../../chunks/kt-element-B_jjQDhg.js";
6
- import { u as k, e as p } from "../../../chunks/events-Bjl5Zmmq.js";
7
- import { a as $, s as I, b as q } from "../../../chunks/form-control-CxjBTt1c.js";
8
- import { a as D, b as E, o as m, f as c, l as O, n as C } from "../../../chunks/listbox-Sm3nvsC6.js";
1
+ import { css as g, nothing as a, html as h } from "lit";
2
+ import { query as x, state as f, property as n } from "lit/decorators.js";
3
+ import { classMap as p } from "lit/directives/class-map.js";
4
+ import { live as w } from "lit/directives/live.js";
5
+ import { K as m, d as k } from "../../../chunks/kt-element-E-tfJpGQ.js";
6
+ import { u as $, e as c } from "../../../chunks/events-Bjl5Zmmq.js";
7
+ import { a as I, s as q, b as D } from "../../../chunks/form-control-CxjBTt1c.js";
8
+ import { a as O, b as E, o as y, f as v, l as L, n as C } from "../../../chunks/listbox-Sm3nvsC6.js";
9
+ import { s as l } from "../../../chunks/index-DSSLJirw.js";
9
10
  import "../../core/kt-icon/kt-icon.js";
10
- var S = Object.defineProperty, i = (h, t, o, r) => {
11
- for (var n = void 0, u = h.length - 1, b; u >= 0; u--)
12
- (b = h[u]) && (n = b(t, o, n) || n);
13
- return n && S(t, o, n), n;
11
+ var P = Object.defineProperty, i = (d, t, o, r) => {
12
+ for (var s = void 0, u = d.length - 1, b; u >= 0; u--)
13
+ (b = d[u]) && (s = b(t, o, s) || s);
14
+ return s && P(t, o, s), s;
14
15
  };
15
- class e extends f {
16
+ class e extends m {
16
17
  constructor() {
17
- super(...arguments), this.internals = null, this.defaultValue = null, this.listId = k("kt-input-menu-list"), this.open = !1, this.query = "", this.activeIndex = -1, this.options = [], this.value = null, this.placeholder = "", this.name = "", this.disabled = !1, this.required = !1, this.error = "", this.label = "", this.emptyText = "No options available", this.onDocumentPointerDown = (t) => {
18
+ super(...arguments), this.internals = null, this.defaultValue = null, this.listId = $("kt-input-menu-list"), this.open = !1, this.query = "", this.activeIndex = -1, this.options = [], this.value = null, this.placeholder = "", this.name = "", this.disabled = !1, this.required = !1, this.error = "", this.label = "", this.emptyText = void 0, this.onDocumentPointerDown = (t) => {
18
19
  t.composedPath().includes(this) || this.close();
19
20
  };
20
21
  }
@@ -23,9 +24,9 @@ class e extends f {
23
24
  }
24
25
  static {
25
26
  this.styles = [
26
- f.styles,
27
- D,
28
- y`
27
+ m.styles,
28
+ O,
29
+ g`
29
30
  :host {
30
31
  position: relative;
31
32
  display: block;
@@ -128,19 +129,19 @@ class e extends f {
128
129
  ];
129
130
  }
130
131
  connectedCallback() {
131
- super.connectedCallback(), this.internals ??= $(this), this.defaultValue = this.value, document.addEventListener("pointerdown", this.onDocumentPointerDown);
132
+ super.connectedCallback(), this.internals ??= I(this), this.defaultValue = this.value, document.addEventListener("pointerdown", this.onDocumentPointerDown);
132
133
  }
133
134
  disconnectedCallback() {
134
135
  super.disconnectedCallback(), document.removeEventListener("pointerdown", this.onDocumentPointerDown);
135
136
  }
136
137
  willUpdate(t) {
137
- if (t.has("value") || t.has("required") || t.has("error")) {
138
- I(this.internals, this.value === null ? null : String(this.value));
138
+ if (t.has("value") || t.has("required") || t.has("error") || this.stringsChanged(t)) {
139
+ q(this.internals, this.value === null ? null : String(this.value));
139
140
  const o = this.required && this.value === null;
140
- q(
141
+ D(
141
142
  this.internals,
142
143
  { valueMissing: o, customError: !!this.error },
143
- this.error || (o ? "Select an option." : "")
144
+ this.error || (o ? l().selectOption : "")
144
145
  );
145
146
  }
146
147
  }
@@ -168,22 +169,22 @@ class e extends f {
168
169
  get displayValue() {
169
170
  if (this.open && this.query) return this.query;
170
171
  const t = this.selectedOption;
171
- return t ? m(t) : this.query;
172
+ return t ? y(t) : this.query;
172
173
  }
173
174
  openList() {
174
- this.disabled || this.open || (this.open = !0, this.activeIndex = c(this.visibleOptions));
175
+ this.disabled || this.open || (this.open = !0, this.activeIndex = v(this.visibleOptions));
175
176
  }
176
177
  close() {
177
178
  this.open = !1, this.query = "", this.activeIndex = -1;
178
179
  }
179
180
  onInput(t) {
180
- this.query = t.target.value, this.open = !0, this.activeIndex = c(this.visibleOptions), p(this, "kt-filter", { query: this.query });
181
+ this.query = t.target.value, this.open = !0, this.activeIndex = v(this.visibleOptions), c(this, "kt-filter", { query: this.query });
181
182
  }
182
183
  choose(t) {
183
- t.disabled || (this.value = t.id, this.close(), p(this, "kt-change", { value: t.id, option: t }));
184
+ t.disabled || (this.value = t.id, this.close(), c(this, "kt-change", { value: t.id, option: t }));
184
185
  }
185
186
  clear(t) {
186
- t.stopPropagation(), this.value = null, this.query = "", p(this, "kt-change", { value: null, option: null }), this.input?.focus();
187
+ t.stopPropagation(), this.value = null, this.query = "", c(this, "kt-change", { value: null, option: null }), this.input?.focus();
187
188
  }
188
189
  onKeyDown(t) {
189
190
  const o = this.visibleOptions;
@@ -199,11 +200,11 @@ class e extends f {
199
200
  return;
200
201
  case "Home":
201
202
  if (!this.open) return;
202
- t.preventDefault(), this.activeIndex = c(o);
203
+ t.preventDefault(), this.activeIndex = v(o);
203
204
  return;
204
205
  case "End":
205
206
  if (!this.open) return;
206
- t.preventDefault(), this.activeIndex = O(o);
207
+ t.preventDefault(), this.activeIndex = L(o);
207
208
  return;
208
209
  case "Enter": {
209
210
  if (!this.open) return;
@@ -225,8 +226,8 @@ class e extends f {
225
226
  }
226
227
  render() {
227
228
  const t = this.visibleOptions, o = this.selectedOption !== void 0 && !this.disabled;
228
- return l`<div
229
- class=${d({ open: this.open, error: !!this.error })}
229
+ return h`<div
230
+ class=${p({ open: this.open, error: !!this.error })}
230
231
  @keydown=${this.onKeyDown}
231
232
  >
232
233
  <div part="control" class="control" @click=${this.openList}>
@@ -240,16 +241,16 @@ class e extends f {
240
241
  aria-label=${this.label || a}
241
242
  aria-invalid=${this.error ? "true" : a}
242
243
  placeholder=${this.placeholder || a}
243
- .value=${x(this.displayValue)}
244
+ .value=${w(this.displayValue)}
244
245
  ?disabled=${this.disabled}
245
246
  @focus=${this.openList}
246
247
  @input=${this.onInput}
247
248
  />
248
249
 
249
- ${o ? l`<button
250
+ ${o ? h`<button
250
251
  type="button"
251
252
  class="icon-button clear"
252
- aria-label="Clear"
253
+ aria-label=${l().clear}
253
254
  tabindex="-1"
254
255
  @click=${this.clear}
255
256
  >
@@ -259,7 +260,7 @@ class e extends f {
259
260
  <button
260
261
  type="button"
261
262
  class="icon-button toggle"
262
- aria-label=${this.open ? "Close list" : "Open list"}
263
+ aria-label=${this.open ? l().closeList : l().openList}
263
264
  tabindex="-1"
264
265
  @click=${(r) => {
265
266
  r.stopPropagation(), this.open ? this.close() : this.openList();
@@ -272,25 +273,25 @@ class e extends f {
272
273
  <ul
273
274
  part="popup"
274
275
  id=${this.listId}
275
- class=${d({ popup: !0, open: this.open })}
276
+ class=${p({ popup: !0, open: this.open })}
276
277
  role="listbox"
277
278
  aria-label=${this.label || this.placeholder}
278
279
  >
279
- ${t.length === 0 ? l`<li class="empty">${this.emptyText}</li>` : t.map(
280
- (r, n) => l`<li
280
+ ${t.length === 0 ? h`<li class="empty">${this.emptyText ?? l().noOptions}</li>` : t.map(
281
+ (r, s) => h`<li
281
282
  part="option"
282
- id=${this.optionId(n)}
283
- class=${d({
283
+ id=${this.optionId(s)}
284
+ class=${p({
284
285
  option: !0,
285
286
  selected: r.id === this.value,
286
- active: n === this.activeIndex,
287
+ active: s === this.activeIndex,
287
288
  disabled: !!r.disabled
288
289
  })}
289
290
  role="option"
290
291
  aria-selected=${r.id === this.value ? "true" : "false"}
291
292
  @click=${() => this.choose(r)}
292
293
  >
293
- ${m(r)}
294
+ ${y(r)}
294
295
  </li>`
295
296
  )}
296
297
  </ul>
@@ -298,45 +299,45 @@ class e extends f {
298
299
  }
299
300
  }
300
301
  i([
301
- g("input")
302
+ x("input")
302
303
  ], e.prototype, "input");
303
304
  i([
304
- v()
305
+ f()
305
306
  ], e.prototype, "open");
306
307
  i([
307
- v()
308
+ f()
308
309
  ], e.prototype, "query");
309
310
  i([
310
- v()
311
+ f()
311
312
  ], e.prototype, "activeIndex");
312
313
  i([
313
- s({ attribute: !1 })
314
+ n({ attribute: !1 })
314
315
  ], e.prototype, "options");
315
316
  i([
316
- s({ type: String })
317
+ n({ type: String })
317
318
  ], e.prototype, "value");
318
319
  i([
319
- s({ type: String })
320
+ n({ type: String })
320
321
  ], e.prototype, "placeholder");
321
322
  i([
322
- s({ type: String })
323
+ n({ type: String })
323
324
  ], e.prototype, "name");
324
325
  i([
325
- s({ type: Boolean, reflect: !0 })
326
+ n({ type: Boolean, reflect: !0 })
326
327
  ], e.prototype, "disabled");
327
328
  i([
328
- s({ type: Boolean, reflect: !0 })
329
+ n({ type: Boolean, reflect: !0 })
329
330
  ], e.prototype, "required");
330
331
  i([
331
- s({ type: String, reflect: !0 })
332
+ n({ type: String, reflect: !0 })
332
333
  ], e.prototype, "error");
333
334
  i([
334
- s({ type: String })
335
+ n({ type: String })
335
336
  ], e.prototype, "label");
336
337
  i([
337
- s({ type: String, attribute: "empty-text" })
338
+ n({ type: String, attribute: "empty-text" })
338
339
  ], e.prototype, "emptyText");
339
- w("kt-input-menu", e);
340
+ k("kt-input-menu", e);
340
341
  export {
341
342
  e as KtInputMenu
342
343
  };
@@ -1 +1 @@
1
- {"version":3,"file":"kt-input-menu.js","sources":["../../../../src/components/forms/kt-input-menu/kt-input-menu.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, uniqueId } from '#internal/events';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from '#internal/form-control';\nimport {\n filterOptions,\n firstEnabledIndex,\n lastEnabledIndex,\n listboxStyles,\n nextEnabledIndex,\n optionLabel,\n type KtOption,\n} from '#internal/listbox';\nimport '../../core/kt-icon/kt-icon.js';\n\n/**\n * A combobox: type to narrow the list, then pick.\n *\n * Reach for it over `<kt-select>` once the list is long enough that scanning it\n * is slower than typing three letters — somewhere around twenty options.\n *\n * @element kt-input-menu\n *\n * @csspart control - The field.\n * @csspart input - The native `<input>`.\n * @csspart popup - The option list.\n * @csspart option - An option row.\n *\n * @fires kt-change - An option was chosen or cleared. `detail: { value, option }`.\n * @fires kt-filter - The query changed. `detail: { query }`.\n */\nexport class KtInputMenu extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n listboxStyles,\n css`\n :host {\n position: relative;\n display: block;\n --field-height: var(--button-height);\n }\n\n .control {\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--gap-element);\n width: 100%;\n height: var(--field-height);\n padding: 0 var(--button-padding-x);\n color: var(--text-body);\n font: var(--font-input);\n background-color: var(--color-dark-20);\n border: none;\n border-radius: var(--radius-input);\n /* A resting hairline. A field is a fill on --surface-field, which is\n one ramp step from the page in dark and almost the same colour in\n light — so on a card or inside a modal it simply disappeared and\n read as a bare native control.\n\n A border rather than an outline, because the control inside fills\n the field exactly and a coincident outline is painted over by the\n native widget. A border insets the control by its own width, so it\n cannot be covered. box-sizing: border-box keeps the outer size.\n\n The hover and focus rings stay outlines on top of it, and the\n transparent resting outline is what they animate from: without it\n outline-color starts at the initial value, which resolves to the\n text colour, and hover flashed near-white before settling. */\n border: var(--border-width) solid var(--border-field);\n outline: var(--outline-width) solid transparent;\n cursor: text;\n transition:\n background-color var(--duration-instant),\n outline-color var(--duration-instant);\n }\n\n .control:hover {\n outline: var(--outline-width) solid var(--color-text-700);\n }\n .control:focus-within {\n background-color: var(--color-dark-12);\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n\n .error .control,\n .error .control:hover,\n .error .control:focus-within {\n outline: var(--outline-width) solid var(--color-danger-base);\n }\n\n :host([disabled]) {\n pointer-events: none;\n opacity: 0.6;\n }\n\n input {\n width: 100%;\n min-width: 0;\n color: var(--text-body);\n font: var(--font-input);\n background: transparent;\n border: none;\n outline: none;\n }\n\n input::placeholder {\n color: var(--text-muted);\n }\n\n .icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n color: inherit;\n background: transparent;\n border: none;\n cursor: pointer;\n }\n\n .clear {\n transition: transform var(--duration-instant) ease-in-out;\n }\n .clear:hover {\n transform: rotate(90deg);\n }\n\n .toggle {\n transition: transform var(--duration-fast) ease-in-out;\n }\n .open .toggle {\n transform: scaleY(-1);\n }\n `,\n ];\n\n @query('input')\n private input!: HTMLInputElement;\n\n private internals: UsableInternals | null = null;\n private defaultValue: string | number | null = null;\n private readonly listId = uniqueId('kt-input-menu-list');\n\n @state()\n private open = false;\n\n @state()\n private query = '';\n\n @state()\n private activeIndex = -1;\n\n @property({ attribute: false })\n options: readonly KtOption[] = [];\n\n @property({ type: String })\n value: string | number | null = null;\n\n @property({ type: String })\n placeholder = '';\n\n @property({ type: String })\n name = '';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n @property({ type: String, reflect: true })\n error = '';\n\n @property({ type: String })\n label = '';\n\n @property({ type: String, attribute: 'empty-text' })\n emptyText = 'No options available';\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultValue = this.value;\n document.addEventListener('pointerdown', this.onDocumentPointerDown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('pointerdown', this.onDocumentPointerDown);\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('value') || changed.has('required') || changed.has('error')) {\n // The option id is what is submitted, never the label the field shows:\n // the label is for people, the id is for the server.\n setFormValue(this.internals, this.value === null ? null : String(this.value));\n\n const missing = this.required && this.value === null;\n setValidity(\n this.internals,\n { valueMissing: missing, customError: Boolean(this.error) },\n this.error || (missing ? 'Select an option.' : ''),\n );\n }\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n this.close();\n }\n\n formStateRestoreCallback(state: string): void {\n this.value = state;\n }\n\n override focus(options?: FocusOptions): void {\n this.input?.focus(options);\n }\n\n get selectedOption(): KtOption | undefined {\n return this.options.find((option) => option.id === this.value);\n }\n\n /** Options after the current query, which is what the keyboard walks. */\n private get visibleOptions(): readonly KtOption[] {\n return filterOptions(this.options, this.query);\n }\n\n /**\n * While filtering, the field shows the query; otherwise it shows the chosen\n * option. Keeping the two in one input is what makes it a combobox rather\n * than a search box that happens to sit above a list.\n */\n private get displayValue(): string {\n if (this.open && this.query) return this.query;\n const selected = this.selectedOption;\n return selected ? optionLabel(selected) : this.query;\n }\n\n private onDocumentPointerDown = (event: Event): void => {\n if (event.composedPath().includes(this)) return;\n this.close();\n };\n\n private openList(): void {\n if (this.disabled || this.open) return;\n this.open = true;\n this.activeIndex = firstEnabledIndex(this.visibleOptions);\n }\n\n private close(): void {\n this.open = false;\n this.query = '';\n this.activeIndex = -1;\n }\n\n private onInput(event: Event): void {\n this.query = (event.target as HTMLInputElement).value;\n this.open = true;\n this.activeIndex = firstEnabledIndex(this.visibleOptions);\n emit(this, 'kt-filter', { query: this.query });\n }\n\n private choose(option: KtOption): void {\n if (option.disabled) return;\n this.value = option.id;\n this.close();\n emit(this, 'kt-change', { value: option.id, option });\n }\n\n private clear(event: Event): void {\n event.stopPropagation();\n this.value = null;\n this.query = '';\n emit(this, 'kt-change', { value: null, option: null });\n this.input?.focus();\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n const options = this.visibleOptions;\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n if (!this.open) return this.openList();\n this.activeIndex = nextEnabledIndex(\n options,\n this.activeIndex,\n event.key === 'ArrowDown' ? 1 : -1,\n );\n return;\n case 'Home':\n if (!this.open) return;\n event.preventDefault();\n this.activeIndex = firstEnabledIndex(options);\n return;\n case 'End':\n if (!this.open) return;\n event.preventDefault();\n this.activeIndex = lastEnabledIndex(options);\n return;\n case 'Enter': {\n if (!this.open) return;\n event.preventDefault();\n const option = options[this.activeIndex];\n if (option) this.choose(option);\n return;\n }\n case 'Escape':\n if (!this.open) return;\n event.stopPropagation();\n this.close();\n return;\n case 'Tab':\n this.close();\n }\n }\n\n private optionId(index: number): string {\n return `${this.listId}-option-${index}`;\n }\n\n override render(): TemplateResult {\n const options = this.visibleOptions;\n const showClear = this.selectedOption !== undefined && !this.disabled;\n\n return html`<div\n class=${classMap({ open: this.open, error: Boolean(this.error) })}\n @keydown=${this.onKeyDown}\n >\n <div part=\"control\" class=\"control\" @click=${this.openList}>\n <input\n part=\"input\"\n role=\"combobox\"\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-controls=${this.listId}\n aria-autocomplete=\"list\"\n aria-activedescendant=${\n this.open && this.activeIndex >= 0 ? this.optionId(this.activeIndex) : nothing\n }\n aria-label=${this.label || nothing}\n aria-invalid=${this.error ? 'true' : nothing}\n placeholder=${this.placeholder || nothing}\n .value=${live(this.displayValue)}\n ?disabled=${this.disabled}\n @focus=${this.openList}\n @input=${this.onInput}\n />\n\n ${\n showClear\n ? html`<button\n type=\"button\"\n class=\"icon-button clear\"\n aria-label=\"Clear\"\n tabindex=\"-1\"\n @click=${this.clear}\n >\n <kt-icon name=\"x\" size=\"18\"></kt-icon>\n </button>`\n : nothing\n }\n\n <button\n type=\"button\"\n class=\"icon-button toggle\"\n aria-label=${this.open ? 'Close list' : 'Open list'}\n tabindex=\"-1\"\n @click=${(event: Event) => {\n event.stopPropagation();\n if (this.open) this.close();\n else this.openList();\n }}\n >\n <kt-icon name=\"chevron-down\" size=\"18\"></kt-icon>\n </button>\n </div>\n\n <ul\n part=\"popup\"\n id=${this.listId}\n class=${classMap({ popup: true, open: this.open })}\n role=\"listbox\"\n aria-label=${this.label || this.placeholder}\n >\n ${\n options.length === 0\n ? html`<li class=\"empty\">${this.emptyText}</li>`\n : options.map(\n (option, index) =>\n html`<li\n part=\"option\"\n id=${this.optionId(index)}\n class=${classMap({\n option: true,\n selected: option.id === this.value,\n active: index === this.activeIndex,\n disabled: Boolean(option.disabled),\n })}\n role=\"option\"\n aria-selected=${option.id === this.value ? 'true' : 'false'}\n @click=${() => this.choose(option)}\n >\n ${optionLabel(option)}\n </li>`,\n )\n }\n </ul>\n </div>`;\n }\n}\n\ndefineElement('kt-input-menu', KtInputMenu);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-input-menu': KtInputMenu;\n }\n}\n"],"names":["KtInputMenu","KtElement","uniqueId","event","listboxStyles","css","attachFormInternals","changed","setFormValue","missing","setValidity","state","options","option","filterOptions","selected","optionLabel","firstEnabledIndex","emit","nextEnabledIndex","lastEnabledIndex","index","showClear","html","classMap","nothing","live","__decorateClass","query","property","defineElement"],"mappings":"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"}
1
+ {"version":3,"file":"kt-input-menu.js","sources":["../../../../src/components/forms/kt-input-menu/kt-input-menu.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, uniqueId } from '#internal/events';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from '#internal/form-control';\nimport {\n filterOptions,\n firstEnabledIndex,\n lastEnabledIndex,\n listboxStyles,\n nextEnabledIndex,\n optionLabel,\n type KtOption,\n} from '#internal/listbox';\nimport { strings } from '#internal/strings';\nimport '../../core/kt-icon/kt-icon.js';\n\n/**\n * A combobox: type to narrow the list, then pick.\n *\n * Reach for it over `<kt-select>` once the list is long enough that scanning it\n * is slower than typing three letters — somewhere around twenty options.\n *\n * @element kt-input-menu\n *\n * @csspart control - The field.\n * @csspart input - The native `<input>`.\n * @csspart popup - The option list.\n * @csspart option - An option row.\n *\n * @fires kt-change - An option was chosen or cleared. `detail: { value, option }`.\n * @fires kt-filter - The query changed. `detail: { query }`.\n */\nexport class KtInputMenu extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n listboxStyles,\n css`\n :host {\n position: relative;\n display: block;\n --field-height: var(--button-height);\n }\n\n .control {\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--gap-element);\n width: 100%;\n height: var(--field-height);\n padding: 0 var(--button-padding-x);\n color: var(--text-body);\n font: var(--font-input);\n background-color: var(--color-dark-20);\n border: none;\n border-radius: var(--radius-input);\n /* A resting hairline. A field is a fill on --surface-field, which is\n one ramp step from the page in dark and almost the same colour in\n light — so on a card or inside a modal it simply disappeared and\n read as a bare native control.\n\n A border rather than an outline, because the control inside fills\n the field exactly and a coincident outline is painted over by the\n native widget. A border insets the control by its own width, so it\n cannot be covered. box-sizing: border-box keeps the outer size.\n\n The hover and focus rings stay outlines on top of it, and the\n transparent resting outline is what they animate from: without it\n outline-color starts at the initial value, which resolves to the\n text colour, and hover flashed near-white before settling. */\n border: var(--border-width) solid var(--border-field);\n outline: var(--outline-width) solid transparent;\n cursor: text;\n transition:\n background-color var(--duration-instant),\n outline-color var(--duration-instant);\n }\n\n .control:hover {\n outline: var(--outline-width) solid var(--color-text-700);\n }\n .control:focus-within {\n background-color: var(--color-dark-12);\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n\n .error .control,\n .error .control:hover,\n .error .control:focus-within {\n outline: var(--outline-width) solid var(--color-danger-base);\n }\n\n :host([disabled]) {\n pointer-events: none;\n opacity: 0.6;\n }\n\n input {\n width: 100%;\n min-width: 0;\n color: var(--text-body);\n font: var(--font-input);\n background: transparent;\n border: none;\n outline: none;\n }\n\n input::placeholder {\n color: var(--text-muted);\n }\n\n .icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n color: inherit;\n background: transparent;\n border: none;\n cursor: pointer;\n }\n\n .clear {\n transition: transform var(--duration-instant) ease-in-out;\n }\n .clear:hover {\n transform: rotate(90deg);\n }\n\n .toggle {\n transition: transform var(--duration-fast) ease-in-out;\n }\n .open .toggle {\n transform: scaleY(-1);\n }\n `,\n ];\n\n @query('input')\n private input!: HTMLInputElement;\n\n private internals: UsableInternals | null = null;\n private defaultValue: string | number | null = null;\n private readonly listId = uniqueId('kt-input-menu-list');\n\n @state()\n private open = false;\n\n @state()\n private query = '';\n\n @state()\n private activeIndex = -1;\n\n @property({ attribute: false })\n options: readonly KtOption[] = [];\n\n @property({ type: String })\n value: string | number | null = null;\n\n @property({ type: String })\n placeholder = '';\n\n @property({ type: String })\n name = '';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n @property({ type: String, reflect: true })\n error = '';\n\n @property({ type: String })\n label = '';\n\n @property({ type: String, attribute: 'empty-text' })\n emptyText: string | undefined = undefined;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultValue = this.value;\n document.addEventListener('pointerdown', this.onDocumentPointerDown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('pointerdown', this.onDocumentPointerDown);\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 // The option id is what is submitted, never the label the field shows:\n // the label is for people, the id is for the server.\n setFormValue(this.internals, this.value === null ? null : String(this.value));\n\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().selectOption : ''),\n );\n }\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n this.close();\n }\n\n formStateRestoreCallback(state: string): void {\n this.value = state;\n }\n\n override focus(options?: FocusOptions): void {\n this.input?.focus(options);\n }\n\n get selectedOption(): KtOption | undefined {\n return this.options.find((option) => option.id === this.value);\n }\n\n /** Options after the current query, which is what the keyboard walks. */\n private get visibleOptions(): readonly KtOption[] {\n return filterOptions(this.options, this.query);\n }\n\n /**\n * While filtering, the field shows the query; otherwise it shows the chosen\n * option. Keeping the two in one input is what makes it a combobox rather\n * than a search box that happens to sit above a list.\n */\n private get displayValue(): string {\n if (this.open && this.query) return this.query;\n const selected = this.selectedOption;\n return selected ? optionLabel(selected) : this.query;\n }\n\n private onDocumentPointerDown = (event: Event): void => {\n if (event.composedPath().includes(this)) return;\n this.close();\n };\n\n private openList(): void {\n if (this.disabled || this.open) return;\n this.open = true;\n this.activeIndex = firstEnabledIndex(this.visibleOptions);\n }\n\n private close(): void {\n this.open = false;\n this.query = '';\n this.activeIndex = -1;\n }\n\n private onInput(event: Event): void {\n this.query = (event.target as HTMLInputElement).value;\n this.open = true;\n this.activeIndex = firstEnabledIndex(this.visibleOptions);\n emit(this, 'kt-filter', { query: this.query });\n }\n\n private choose(option: KtOption): void {\n if (option.disabled) return;\n this.value = option.id;\n this.close();\n emit(this, 'kt-change', { value: option.id, option });\n }\n\n private clear(event: Event): void {\n event.stopPropagation();\n this.value = null;\n this.query = '';\n emit(this, 'kt-change', { value: null, option: null });\n this.input?.focus();\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n const options = this.visibleOptions;\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n if (!this.open) return this.openList();\n this.activeIndex = nextEnabledIndex(\n options,\n this.activeIndex,\n event.key === 'ArrowDown' ? 1 : -1,\n );\n return;\n case 'Home':\n if (!this.open) return;\n event.preventDefault();\n this.activeIndex = firstEnabledIndex(options);\n return;\n case 'End':\n if (!this.open) return;\n event.preventDefault();\n this.activeIndex = lastEnabledIndex(options);\n return;\n case 'Enter': {\n if (!this.open) return;\n event.preventDefault();\n const option = options[this.activeIndex];\n if (option) this.choose(option);\n return;\n }\n case 'Escape':\n if (!this.open) return;\n event.stopPropagation();\n this.close();\n return;\n case 'Tab':\n this.close();\n }\n }\n\n private optionId(index: number): string {\n return `${this.listId}-option-${index}`;\n }\n\n override render(): TemplateResult {\n const options = this.visibleOptions;\n const showClear = this.selectedOption !== undefined && !this.disabled;\n\n return html`<div\n class=${classMap({ open: this.open, error: Boolean(this.error) })}\n @keydown=${this.onKeyDown}\n >\n <div part=\"control\" class=\"control\" @click=${this.openList}>\n <input\n part=\"input\"\n role=\"combobox\"\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-controls=${this.listId}\n aria-autocomplete=\"list\"\n aria-activedescendant=${\n this.open && this.activeIndex >= 0 ? this.optionId(this.activeIndex) : nothing\n }\n aria-label=${this.label || nothing}\n aria-invalid=${this.error ? 'true' : nothing}\n placeholder=${this.placeholder || nothing}\n .value=${live(this.displayValue)}\n ?disabled=${this.disabled}\n @focus=${this.openList}\n @input=${this.onInput}\n />\n\n ${\n showClear\n ? html`<button\n type=\"button\"\n class=\"icon-button clear\"\n aria-label=${strings().clear}\n tabindex=\"-1\"\n @click=${this.clear}\n >\n <kt-icon name=\"x\" size=\"18\"></kt-icon>\n </button>`\n : nothing\n }\n\n <button\n type=\"button\"\n class=\"icon-button toggle\"\n aria-label=${this.open ? strings().closeList : strings().openList}\n tabindex=\"-1\"\n @click=${(event: Event) => {\n event.stopPropagation();\n if (this.open) this.close();\n else this.openList();\n }}\n >\n <kt-icon name=\"chevron-down\" size=\"18\"></kt-icon>\n </button>\n </div>\n\n <ul\n part=\"popup\"\n id=${this.listId}\n class=${classMap({ popup: true, open: this.open })}\n role=\"listbox\"\n aria-label=${this.label || this.placeholder}\n >\n ${\n options.length === 0\n ? html`<li class=\"empty\">${this.emptyText ?? strings().noOptions}</li>`\n : options.map(\n (option, index) =>\n html`<li\n part=\"option\"\n id=${this.optionId(index)}\n class=${classMap({\n option: true,\n selected: option.id === this.value,\n active: index === this.activeIndex,\n disabled: Boolean(option.disabled),\n })}\n role=\"option\"\n aria-selected=${option.id === this.value ? 'true' : 'false'}\n @click=${() => this.choose(option)}\n >\n ${optionLabel(option)}\n </li>`,\n )\n }\n </ul>\n </div>`;\n }\n}\n\ndefineElement('kt-input-menu', KtInputMenu);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-input-menu': KtInputMenu;\n }\n}\n"],"names":["KtInputMenu","KtElement","uniqueId","event","listboxStyles","css","attachFormInternals","changed","setFormValue","missing","setValidity","strings","state","options","option","filterOptions","selected","optionLabel","firstEnabledIndex","emit","nextEnabledIndex","lastEnabledIndex","index","showClear","html","classMap","nothing","live","__decorateClass","query","property","defineElement"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { css as p, html as i } from "lit";
2
2
  import { query as d, property as f } from "lit/decorators.js";
3
- import { K as u, d as c } from "../../../chunks/kt-element-B_jjQDhg.js";
3
+ import { K as u, d as c } from "../../../chunks/kt-element-E-tfJpGQ.js";
4
4
  var b = Object.defineProperty, a = (r, t, s, h) => {
5
5
  for (var e = void 0, o = r.length - 1, n; o >= 0; o--)
6
6
  (n = r[o]) && (e = n(t, s, e) || e);
@@ -0,0 +1,103 @@
1
+ import { type PropertyValues, type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ export type KtRadioGroupOrientation = 'vertical' | 'horizontal';
4
+ /**
5
+ * One option of a `<kt-radio-group>`.
6
+ *
7
+ * It draws itself and carries `role="radio"`; the group owns the selection,
8
+ * the tab stop and the keyboard. A `<kt-radio>` outside a group does nothing
9
+ * useful.
10
+ *
11
+ * @element kt-radio
12
+ *
13
+ * @slot - The label.
14
+ *
15
+ * @csspart base - The `role="radio"` row.
16
+ * @csspart circle - The drawn circle.
17
+ */
18
+ export declare class KtRadio extends KtElement {
19
+ static styles: import("lit").CSSResultGroup[];
20
+ /** Submitted by the group when this option is chosen. */
21
+ value: string;
22
+ disabled: boolean;
23
+ /** Set by the group. */
24
+ checked: boolean;
25
+ /** Set by the group: whether this option holds the group's one tab stop. */
26
+ tabbable: boolean;
27
+ /** Set by the group while it reports an error. */
28
+ invalid: boolean;
29
+ /** Set by the group while the whole group is disabled. */
30
+ groupDisabled: boolean;
31
+ private get inactive();
32
+ focus(options?: FocusOptions): void;
33
+ render(): TemplateResult;
34
+ }
35
+ /**
36
+ * One choice among a few, all visible at once.
37
+ *
38
+ * Reach for it over `<kt-select>` when there are few enough options to show
39
+ * them all — seeing every option is the point — and over
40
+ * `<kt-segmented-control>` when the options need a sentence each, or the
41
+ * choice belongs in a form rather than a toolbar.
42
+ *
43
+ * Native radios cannot form a group across shadow roots, so this is the ARIA
44
+ * radio group pattern: one tab stop for the whole group, arrow keys move and
45
+ * select, disabled options are skipped.
46
+ *
47
+ * @element kt-radio-group
48
+ *
49
+ * @slot - The `<kt-radio>` options.
50
+ *
51
+ * @csspart base - The `role="radiogroup"` container.
52
+ *
53
+ * @fires kt-change - An option was chosen. `detail: { value }`.
54
+ *
55
+ * @example
56
+ * ```html
57
+ * <kt-radio-group label="Billing" name="billing" value="monthly">
58
+ * <kt-radio value="monthly">Monthly</kt-radio>
59
+ * <kt-radio value="yearly">Yearly — two months free</kt-radio>
60
+ * </kt-radio-group>
61
+ * ```
62
+ */
63
+ export declare class KtRadioGroup extends KtElement {
64
+ static readonly formAssociated = true;
65
+ static styles: import("lit").CSSResultGroup[];
66
+ private radios;
67
+ private internals;
68
+ private defaultValue;
69
+ /** The chosen option's value, or `null`. */
70
+ value: string | null;
71
+ name: string;
72
+ /** Accessible name of the group. */
73
+ label: string;
74
+ disabled: boolean;
75
+ required: boolean;
76
+ orientation: KtRadioGroupOrientation;
77
+ /** Error message. A non-empty value puts the group in its error state. */
78
+ error: string;
79
+ connectedCallback(): void;
80
+ disconnectedCallback(): void;
81
+ willUpdate(changed: PropertyValues<this>): void;
82
+ updated(): void;
83
+ formResetCallback(): void;
84
+ formStateRestoreCallback(state: string | null): void;
85
+ focus(options?: FocusOptions): void;
86
+ private enabled;
87
+ /**
88
+ * Pushes the group's state down; the radios are the display, not the truth.
89
+ * The tab stop sits on the chosen option, or the first enabled one.
90
+ */
91
+ private syncRadios;
92
+ private choose;
93
+ private onClick;
94
+ /** Arrows move and select, wrapping; Space selects the focused option. */
95
+ private onKeyDown;
96
+ render(): TemplateResult;
97
+ }
98
+ declare global {
99
+ interface HTMLElementTagNameMap {
100
+ 'kt-radio': KtRadio;
101
+ 'kt-radio-group': KtRadioGroup;
102
+ }
103
+ }