kanto-ds 1.0.1 → 1.2.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 (90) hide show
  1. package/README.md +20 -2
  2. package/dist/chunks/form-control-CxjBTt1c.js.map +1 -1
  3. package/dist/chunks/kt-element-B_jjQDhg.js +38 -0
  4. package/dist/chunks/kt-element-B_jjQDhg.js.map +1 -0
  5. package/dist/components/core/kt-avatar/kt-avatar.js +9 -6
  6. package/dist/components/core/kt-avatar/kt-avatar.js.map +1 -1
  7. package/dist/components/core/kt-badge/kt-badge.js +17 -17
  8. package/dist/components/core/kt-badge/kt-badge.js.map +1 -1
  9. package/dist/components/core/kt-button/kt-button.d.ts +7 -0
  10. package/dist/components/core/kt-button/kt-button.js +68 -60
  11. package/dist/components/core/kt-button/kt-button.js.map +1 -1
  12. package/dist/components/core/kt-card/kt-card.js +1 -1
  13. package/dist/components/core/kt-code/kt-code.js +12 -12
  14. package/dist/components/core/kt-code/kt-code.js.map +1 -1
  15. package/dist/components/core/kt-icon/kt-icon.js +1 -1
  16. package/dist/components/core/kt-kbd/kt-kbd.js +14 -14
  17. package/dist/components/core/kt-kbd/kt-kbd.js.map +1 -1
  18. package/dist/components/core/kt-split-button/kt-split-button.js +3 -3
  19. package/dist/components/core/kt-split-button/kt-split-button.js.map +1 -1
  20. package/dist/components/data/kt-chart/kt-chart.js +1 -1
  21. package/dist/components/data/kt-meter/kt-meter.js +1 -1
  22. package/dist/components/data/kt-pagination/kt-pagination.js +1 -1
  23. package/dist/components/data/kt-stat/kt-stat.js +5 -5
  24. package/dist/components/data/kt-stat/kt-stat.js.map +1 -1
  25. package/dist/components/data/kt-table/kt-table.js +2 -2
  26. package/dist/components/data/kt-table/kt-table.js.map +1 -1
  27. package/dist/components/data/kt-timeline/kt-timeline.js +1 -1
  28. package/dist/components/feedback/kt-alert/kt-alert.js +26 -26
  29. package/dist/components/feedback/kt-alert/kt-alert.js.map +1 -1
  30. package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
  31. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +2 -2
  32. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js.map +1 -1
  33. package/dist/components/feedback/kt-skeleton/kt-skeleton.js +1 -1
  34. package/dist/components/feedback/kt-toast/kt-toast.js +22 -22
  35. package/dist/components/feedback/kt-toast/kt-toast.js.map +1 -1
  36. package/dist/components/feedback/kt-toast-container/kt-toast-container.js +1 -1
  37. package/dist/components/feedback/kt-tooltip/kt-tooltip.js +1 -1
  38. package/dist/components/forms/kt-drag-drop/kt-drag-drop.d.ts +11 -1
  39. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +69 -36
  40. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js.map +1 -1
  41. package/dist/components/forms/kt-form/kt-form.js +1 -1
  42. package/dist/components/forms/kt-input/kt-input.js +95 -91
  43. package/dist/components/forms/kt-input/kt-input.js.map +1 -1
  44. package/dist/components/forms/kt-input-menu/kt-input-menu.d.ts +10 -1
  45. package/dist/components/forms/kt-input-menu/kt-input-menu.js +83 -53
  46. package/dist/components/forms/kt-input-menu/kt-input-menu.js.map +1 -1
  47. package/dist/components/forms/kt-label-input/kt-label-input.js +2 -2
  48. package/dist/components/forms/kt-label-input/kt-label-input.js.map +1 -1
  49. package/dist/components/forms/kt-select/kt-select.js +2 -2
  50. package/dist/components/forms/kt-select/kt-select.js.map +1 -1
  51. package/dist/components/forms/kt-textarea/kt-textarea.js +15 -13
  52. package/dist/components/forms/kt-textarea/kt-textarea.js.map +1 -1
  53. package/dist/components/forms/kt-toggle/kt-toggle.js +8 -7
  54. package/dist/components/forms/kt-toggle/kt-toggle.js.map +1 -1
  55. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +1 -1
  56. package/dist/components/navigation/kt-header/kt-header.js +1 -1
  57. package/dist/components/navigation/kt-page-header/kt-page-header.js +18 -18
  58. package/dist/components/navigation/kt-page-header/kt-page-header.js.map +1 -1
  59. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.d.ts +10 -1
  60. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +88 -62
  61. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -1
  62. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +5 -5
  63. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js.map +1 -1
  64. package/dist/components/navigation/kt-tabs/kt-tabs.js +1 -1
  65. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +3 -3
  66. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js.map +1 -1
  67. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +1 -1
  68. package/dist/components/overlays/kt-collapsible/kt-collapsible.js +1 -1
  69. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +1 -1
  70. package/dist/components/overlays/kt-dropdown/kt-dropdown.d.ts +13 -0
  71. package/dist/components/overlays/kt-dropdown/kt-dropdown.js +74 -59
  72. package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -1
  73. package/dist/components/overlays/kt-modal/kt-modal.js +1 -1
  74. package/dist/components/overlays/kt-side-panel/kt-side-panel.js +1 -1
  75. package/dist/custom-elements.json +11791 -0
  76. package/dist/index.js +1 -1
  77. package/dist/internal/form-control.d.ts +7 -2
  78. package/dist/react/index.js.map +1 -1
  79. package/dist/react/jsx.d.ts +213 -0
  80. package/dist/react/jsx.js +2 -0
  81. package/dist/react/jsx.js.map +1 -0
  82. package/dist/tokens/README.md +7 -3
  83. package/dist/tokens/colors.css +24 -5
  84. package/dist/tokens/theme-light.css +18 -0
  85. package/dist/vscode.css-custom-data.json +154 -0
  86. package/dist/vscode.html-custom-data.json +1136 -0
  87. package/dist/web-types.json +3186 -0
  88. package/package.json +28 -9
  89. package/dist/chunks/kt-element-CcMLO5e8.js +0 -28
  90. package/dist/chunks/kt-element-CcMLO5e8.js.map +0 -1
@@ -1,23 +1,27 @@
1
- import { css as f, nothing as c, html as p } from "lit";
2
- import { queryAll as v, property as d } from "lit/decorators.js";
1
+ import { css as b, nothing as c, html as p } from "lit";
2
+ import { queryAll as v, property as s } from "lit/decorators.js";
3
3
  import { classMap as h } from "lit/directives/class-map.js";
4
- import { K as b, d as g } from "../../../chunks/kt-element-CcMLO5e8.js";
4
+ import { K as f, d as g } from "../../../chunks/kt-element-B_jjQDhg.js";
5
5
  import { e as m } from "../../../chunks/events-Bjl5Zmmq.js";
6
+ import { a as x, s as y, b as k } from "../../../chunks/form-control-CxjBTt1c.js";
6
7
  import "../../core/kt-icon/kt-icon.js";
7
- var x = Object.defineProperty, l = (u, t, r, o) => {
8
- for (var e = void 0, i = u.length - 1, a; i >= 0; i--)
9
- (a = u[i]) && (e = a(t, r, e) || e);
10
- return e && x(t, r, e), e;
8
+ var $ = Object.defineProperty, n = (u, t, o, i) => {
9
+ for (var e = void 0, r = u.length - 1, l; r >= 0; r--)
10
+ (l = u[r]) && (e = l(t, o, e) || e);
11
+ return e && $(t, o, e), e;
11
12
  };
12
- const y = { small: 16, medium: 20, large: 24 };
13
- class n extends b {
13
+ const w = { small: 16, medium: 20, large: 24 };
14
+ class a extends f {
14
15
  constructor() {
15
- super(...arguments), this.options = [], this.value = null, this.size = "medium", this.orientation = "horizontal", this.disabled = !1, this.label = "";
16
+ super(...arguments), this.internals = null, this.defaultValue = null, this.options = [], this.value = null, this.size = "medium", this.orientation = "horizontal", this.disabled = !1, this.label = "", this.name = "", this.required = !1;
17
+ }
18
+ static {
19
+ this.formAssociated = !0;
16
20
  }
17
21
  static {
18
22
  this.styles = [
19
- b.styles,
20
- f`
23
+ f.styles,
24
+ b`
21
25
  :host {
22
26
  display: inline-block;
23
27
  }
@@ -126,42 +130,58 @@ class n extends b {
126
130
  `
127
131
  ];
128
132
  }
133
+ connectedCallback() {
134
+ super.connectedCallback(), this.internals ??= x(this), this.defaultValue = this.value;
135
+ }
136
+ willUpdate(t) {
137
+ if (t.has("value") || t.has("required")) {
138
+ y(this.internals, this.value === null ? null : String(this.value));
139
+ const o = this.required && this.value === null;
140
+ k(this.internals, { valueMissing: o }, o ? "Select an option." : "");
141
+ }
142
+ }
143
+ formResetCallback() {
144
+ this.value = this.defaultValue;
145
+ }
146
+ formStateRestoreCallback(t) {
147
+ this.value = this.options.find((o) => String(o.value) === t)?.value ?? t;
148
+ }
129
149
  get selectedIndex() {
130
150
  return this.options.findIndex((t) => t.value === this.value);
131
151
  }
132
152
  choose(t) {
133
- t.disabled || this.value === t.value || (this.value = t.value, m(this, "kt-change", { value: t.value, option: t }));
153
+ this.disabled || t.disabled || this.value === t.value || (this.value = t.value, m(this, "kt-change", { value: t.value, option: t }));
134
154
  }
135
155
  /**
136
156
  * Radio-group semantics: the arrows move *and* select, wrapping at the ends
137
157
  * and skipping disabled segments.
138
158
  */
139
159
  onKeyDown(t) {
140
- const r = this.orientation === "vertical" ? "ArrowDown" : "ArrowRight", o = this.orientation === "vertical" ? "ArrowUp" : "ArrowLeft";
160
+ const o = this.orientation === "vertical" ? "ArrowDown" : "ArrowRight", i = this.orientation === "vertical" ? "ArrowUp" : "ArrowLeft";
141
161
  let e;
142
- if (t.key === r) e = this.step(1);
143
- else if (t.key === o) e = this.step(-1);
144
- else if (t.key === "Home") e = this.options.findIndex((s) => !s.disabled);
162
+ if (t.key === o) e = this.step(1);
163
+ else if (t.key === i) e = this.step(-1);
164
+ else if (t.key === "Home") e = this.options.findIndex((d) => !d.disabled);
145
165
  else if (t.key === "End")
146
- e = this.options.length - 1 - [...this.options].reverse().findIndex((s) => !s.disabled);
166
+ e = this.options.length - 1 - [...this.options].reverse().findIndex((d) => !d.disabled);
147
167
  else return;
148
168
  if (t.preventDefault(), e === void 0 || e < 0) return;
149
- const i = this.options[e];
150
- if (!i) return;
151
- const a = e;
152
- this.choose(i), this.updateComplete.then(() => this.segments[a]?.focus());
169
+ const r = this.options[e];
170
+ if (!r) return;
171
+ const l = e;
172
+ this.choose(r), this.updateComplete.then(() => this.segments[l]?.focus());
153
173
  }
154
174
  step(t) {
155
- const r = this.options.length;
156
- if (r === 0) return;
157
- const o = this.selectedIndex < 0 ? t === 1 ? -1 : 0 : this.selectedIndex;
158
- for (let e = 1; e <= r; e += 1) {
159
- const i = ((o + t * e) % r + r) % r;
160
- if (!this.options[i]?.disabled) return i;
175
+ const o = this.options.length;
176
+ if (o === 0) return;
177
+ const i = this.selectedIndex < 0 ? t === 1 ? -1 : 0 : this.selectedIndex;
178
+ for (let e = 1; e <= o; e += 1) {
179
+ const r = ((i + t * e) % o + o) % o;
180
+ if (!this.options[r]?.disabled) return r;
161
181
  }
162
182
  }
163
183
  render() {
164
- const t = this.selectedIndex, r = t >= 0 ? t : this.options.findIndex((o) => !o.disabled);
184
+ const t = this.selectedIndex, o = t >= 0 ? t : this.options.findIndex((i) => !i.disabled);
165
185
  return p`<div
166
186
  part="base"
167
187
  class=${h({
@@ -175,8 +195,8 @@ class n extends b {
175
195
  aria-disabled=${this.disabled ? "true" : c}
176
196
  @keydown=${this.onKeyDown}
177
197
  >
178
- ${this.options.map((o, e) => {
179
- const i = o.value === this.value, a = o.label ?? "", s = !!o.icon && a === "";
198
+ ${this.options.map((i, e) => {
199
+ const r = i.value === this.value, l = i.label ?? "", d = !!i.icon && l === "";
180
200
  return p`<button
181
201
  part="option"
182
202
  type="button"
@@ -184,45 +204,51 @@ class n extends b {
184
204
  class=${h({
185
205
  option: !0,
186
206
  [this.size]: !0,
187
- selected: i,
188
- "icon-only": s
207
+ selected: r,
208
+ "icon-only": d
189
209
  })}
190
- aria-checked=${i ? "true" : "false"}
191
- aria-label=${s ? o.icon ?? "" : c}
192
- tabindex=${e === r ? 0 : -1}
193
- ?disabled=${o.disabled}
194
- @click=${() => this.choose(o)}
210
+ aria-checked=${r ? "true" : "false"}
211
+ aria-label=${d ? i.icon ?? "" : c}
212
+ tabindex=${e === o ? 0 : -1}
213
+ ?disabled=${this.disabled || i.disabled}
214
+ @click=${() => this.choose(i)}
195
215
  >
196
- ${o.icon ? p`<kt-icon name=${o.icon} size=${y[this.size]}></kt-icon>` : c}
197
- ${s ? c : p`<span class="text">${a}</span>`}
216
+ ${i.icon ? p`<kt-icon name=${i.icon} size=${w[this.size]}></kt-icon>` : c}
217
+ ${d ? c : p`<span class="text">${l}</span>`}
198
218
  </button>`;
199
219
  })}
200
220
  </div>`;
201
221
  }
202
222
  }
203
- l([
223
+ n([
204
224
  v(".option")
205
- ], n.prototype, "segments");
206
- l([
207
- d({ attribute: !1 })
208
- ], n.prototype, "options");
209
- l([
210
- d({ type: String })
211
- ], n.prototype, "value");
212
- l([
213
- d({ type: String, reflect: !0 })
214
- ], n.prototype, "size");
215
- l([
216
- d({ type: String, reflect: !0 })
217
- ], n.prototype, "orientation");
218
- l([
219
- d({ type: Boolean, reflect: !0 })
220
- ], n.prototype, "disabled");
221
- l([
222
- d({ type: String })
223
- ], n.prototype, "label");
224
- g("kt-segmented-control", n);
225
+ ], a.prototype, "segments");
226
+ n([
227
+ s({ attribute: !1 })
228
+ ], a.prototype, "options");
229
+ n([
230
+ s({ type: String })
231
+ ], a.prototype, "value");
232
+ n([
233
+ s({ type: String, reflect: !0 })
234
+ ], a.prototype, "size");
235
+ n([
236
+ s({ type: String, reflect: !0 })
237
+ ], a.prototype, "orientation");
238
+ n([
239
+ s({ type: Boolean, reflect: !0 })
240
+ ], a.prototype, "disabled");
241
+ n([
242
+ s({ type: String })
243
+ ], a.prototype, "label");
244
+ n([
245
+ s({ type: String })
246
+ ], a.prototype, "name");
247
+ n([
248
+ s({ type: Boolean, reflect: !0 })
249
+ ], a.prototype, "required");
250
+ g("kt-segmented-control", a);
225
251
  export {
226
- n as KtSegmentedControl
252
+ a as KtSegmentedControl
227
253
  };
228
254
  //# sourceMappingURL=kt-segmented-control.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"kt-segmented-control.js","sources":["../../../../src/components/navigation/kt-segmented-control/kt-segmented-control.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property, queryAll } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport type KtSegmentedSize = 'small' | 'medium' | 'large';\n\nexport interface KtSegmentedOption {\n readonly value: string | number;\n readonly label?: string;\n readonly icon?: string;\n readonly disabled?: boolean;\n}\n\nconst ICON_SIZE: Record<KtSegmentedSize, number> = { small: 16, medium: 20, large: 24 };\n\n/**\n * A small set of mutually exclusive choices, shown as one inset track with the\n * selected segment raised out of it.\n *\n * Use it for two to five options that all fit on screen — a view switch, a date\n * range. Past that, `<kt-select>`.\n *\n * Implemented as a radio group: one tab stop for the whole control, arrows to\n * move between segments. That is what a keyboard user expects here, and it\n * keeps a five-option control from adding five tab stops to the page.\n *\n * @element kt-segmented-control\n *\n * @csspart base - The track.\n * @csspart option - A segment.\n *\n * @fires kt-change - A segment was chosen. `detail: { value, option }`.\n *\n * @example\n * ```js\n * control.options = [\n * { value: 'day', label: 'Day' },\n * { value: 'week', label: 'Week' },\n * { value: 'month', label: 'Month' },\n * ];\n * control.value = 'week';\n * ```\n */\nexport class KtSegmentedControl extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-block;\n }\n\n .track {\n display: inline-flex;\n box-sizing: border-box;\n gap: 4px;\n padding: 4px;\n background-color: var(--color-dark-14);\n border-radius: var(--border-radius);\n }\n\n .track.small {\n gap: 3px;\n padding: 3px;\n }\n .track.large {\n gap: 5px;\n padding: 5px;\n }\n\n .track.vertical {\n flex-direction: column;\n width: fit-content;\n }\n\n :host([disabled]) .track {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .option {\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n gap: var(--gap-button);\n height: var(--button-height-small);\n padding: 0 12px;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n background-color: transparent;\n border: none;\n border-radius: calc(var(--border-radius) - 4px);\n cursor: pointer;\n transition:\n background-color var(--duration-normal) var(--easing-standard),\n color var(--duration-normal) var(--easing-standard);\n }\n\n .option:hover:not(:disabled) {\n background-color: var(--color-dark-18);\n }\n .option:active:not(:disabled) {\n background-color: var(--surface-card);\n }\n\n .option.selected {\n color: var(--text-body);\n background-color: var(--surface-raised);\n }\n .option.selected:hover:not(:disabled) {\n background-color: var(--surface-hover);\n }\n\n .option:disabled {\n color: var(--text-disabled);\n background-color: transparent;\n pointer-events: none;\n }\n\n .option:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: -2px;\n }\n\n .option.small {\n height: 24px;\n gap: 6px;\n padding: 0 8px;\n font: var(--font-normal-small);\n }\n .option.large {\n height: var(--button-height);\n padding: 0 16px;\n font: var(--font-normal-medium);\n }\n\n .option.icon-only {\n width: var(--button-height-small);\n padding: 0;\n }\n .option.icon-only.small {\n width: 24px;\n }\n .option.icon-only.large {\n width: var(--button-height);\n }\n\n .text {\n flex: 1;\n text-align: center;\n }\n `,\n ];\n\n @queryAll('.option')\n private segments!: NodeListOf<HTMLButtonElement>;\n\n @property({ attribute: false })\n options: readonly KtSegmentedOption[] = [];\n\n @property({ type: String })\n value: string | number | null = null;\n\n @property({ type: String, reflect: true })\n size: KtSegmentedSize = 'medium';\n\n @property({ type: String, reflect: true })\n orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Accessible name for the group. */\n @property({ type: String })\n label = '';\n\n private get selectedIndex(): number {\n return this.options.findIndex((option) => option.value === this.value);\n }\n\n private choose(option: KtSegmentedOption): void {\n if (option.disabled || this.value === option.value) return;\n this.value = option.value;\n emit(this, 'kt-change', { value: option.value, option });\n }\n\n /**\n * Radio-group semantics: the arrows move *and* select, wrapping at the ends\n * and skipping disabled segments.\n */\n private onKeyDown(event: KeyboardEvent): void {\n const forward = this.orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const back = this.orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n let target: number | undefined;\n if (event.key === forward) target = this.step(1);\n else if (event.key === back) target = this.step(-1);\n else if (event.key === 'Home') target = this.options.findIndex((o) => !o.disabled);\n else if (event.key === 'End')\n target = this.options.length - 1 - [...this.options].reverse().findIndex((o) => !o.disabled);\n else return;\n\n event.preventDefault();\n if (target === undefined || target < 0) return;\n\n const option = this.options[target];\n if (!option) return;\n\n const index = target;\n this.choose(option);\n void this.updateComplete.then(() => this.segments[index]?.focus());\n }\n\n private step(direction: 1 | -1): number | undefined {\n const count = this.options.length;\n if (count === 0) return undefined;\n\n const from = this.selectedIndex < 0 ? (direction === 1 ? -1 : 0) : this.selectedIndex;\n for (let offset = 1; offset <= count; offset += 1) {\n const index = (((from + direction * offset) % count) + count) % count;\n if (!this.options[index]?.disabled) return index;\n }\n return undefined;\n }\n\n override render(): TemplateResult {\n const selectedIndex = this.selectedIndex;\n // One tab stop for the whole group: the selected segment holds it, or the\n // first selectable one when nothing is chosen yet.\n const tabStop = selectedIndex >= 0 ? selectedIndex : this.options.findIndex((o) => !o.disabled);\n\n return html`<div\n part=\"base\"\n class=${classMap({\n track: true,\n [this.size]: true,\n vertical: this.orientation === 'vertical',\n })}\n role=\"radiogroup\"\n aria-label=${this.label || nothing}\n aria-orientation=${this.orientation}\n aria-disabled=${this.disabled ? 'true' : nothing}\n @keydown=${this.onKeyDown}\n >\n ${this.options.map((option, index) => {\n const selected = option.value === this.value;\n const text = option.label ?? '';\n const iconOnly = Boolean(option.icon) && text === '';\n\n return html`<button\n part=\"option\"\n type=\"button\"\n role=\"radio\"\n class=${classMap({\n option: true,\n [this.size]: true,\n selected,\n 'icon-only': iconOnly,\n })}\n aria-checked=${selected ? 'true' : 'false'}\n aria-label=${iconOnly ? (option.icon ?? '') : nothing}\n tabindex=${index === tabStop ? 0 : -1}\n ?disabled=${option.disabled}\n @click=${() => this.choose(option)}\n >\n ${\n option.icon\n ? html`<kt-icon name=${option.icon} size=${ICON_SIZE[this.size]}></kt-icon>`\n : nothing\n }\n ${iconOnly ? nothing : html`<span class=\"text\">${text}</span>`}\n </button>`;\n })}\n </div>`;\n }\n}\n\ndefineElement('kt-segmented-control', KtSegmentedControl);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-segmented-control': KtSegmentedControl;\n }\n}\n"],"names":["ICON_SIZE","KtSegmentedControl","KtElement","css","option","emit","event","forward","back","target","o","index","direction","count","from","offset","selectedIndex","tabStop","html","classMap","nothing","selected","text","iconOnly","__decorateClass","queryAll","property","defineElement"],"mappings":"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"}
1
+ {"version":3,"file":"kt-segmented-control.js","sources":["../../../../src/components/navigation/kt-segmented-control/kt-segmented-control.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, queryAll } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from '#internal/form-control';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport type KtSegmentedSize = 'small' | 'medium' | 'large';\n\nexport interface KtSegmentedOption {\n readonly value: string | number;\n readonly label?: string;\n readonly icon?: string;\n readonly disabled?: boolean;\n}\n\nconst ICON_SIZE: Record<KtSegmentedSize, number> = { small: 16, medium: 20, large: 24 };\n\n/**\n * A small set of mutually exclusive choices, shown as one inset track with the\n * selected segment raised out of it.\n *\n * Use it for two to five options that all fit on screen — a view switch, a date\n * range. Past that, `<kt-select>`.\n *\n * Implemented as a radio group: one tab stop for the whole control, arrows to\n * move between segments. That is what a keyboard user expects here, and it\n * keeps a five-option control from adding five tab stops to the page.\n *\n * @element kt-segmented-control\n *\n * @csspart base - The track.\n * @csspart option - A segment.\n *\n * @fires kt-change - A segment was chosen. `detail: { value, option }`.\n *\n * @example\n * ```js\n * control.options = [\n * { value: 'day', label: 'Day' },\n * { value: 'week', label: 'Week' },\n * { value: 'month', label: 'Month' },\n * ];\n * control.value = 'week';\n * ```\n */\nexport class KtSegmentedControl extends KtElement {\n static readonly formAssociated = true;\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-block;\n }\n\n .track {\n display: inline-flex;\n box-sizing: border-box;\n gap: 4px;\n padding: 4px;\n background-color: var(--color-dark-14);\n border-radius: var(--border-radius);\n }\n\n .track.small {\n gap: 3px;\n padding: 3px;\n }\n .track.large {\n gap: 5px;\n padding: 5px;\n }\n\n .track.vertical {\n flex-direction: column;\n width: fit-content;\n }\n\n :host([disabled]) .track {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .option {\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n gap: var(--gap-button);\n height: var(--button-height-small);\n padding: 0 12px;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n background-color: transparent;\n border: none;\n border-radius: calc(var(--border-radius) - 4px);\n cursor: pointer;\n transition:\n background-color var(--duration-normal) var(--easing-standard),\n color var(--duration-normal) var(--easing-standard);\n }\n\n .option:hover:not(:disabled) {\n background-color: var(--color-dark-18);\n }\n .option:active:not(:disabled) {\n background-color: var(--surface-card);\n }\n\n .option.selected {\n color: var(--text-body);\n background-color: var(--surface-raised);\n }\n .option.selected:hover:not(:disabled) {\n background-color: var(--surface-hover);\n }\n\n .option:disabled {\n color: var(--text-disabled);\n background-color: transparent;\n pointer-events: none;\n }\n\n .option:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: -2px;\n }\n\n .option.small {\n height: 24px;\n gap: 6px;\n padding: 0 8px;\n font: var(--font-normal-small);\n }\n .option.large {\n height: var(--button-height);\n padding: 0 16px;\n font: var(--font-normal-medium);\n }\n\n .option.icon-only {\n width: var(--button-height-small);\n padding: 0;\n }\n .option.icon-only.small {\n width: 24px;\n }\n .option.icon-only.large {\n width: var(--button-height);\n }\n\n .text {\n flex: 1;\n text-align: center;\n }\n `,\n ];\n\n @queryAll('.option')\n private segments!: NodeListOf<HTMLButtonElement>;\n\n private internals: UsableInternals | null = null;\n private defaultValue: string | number | null = null;\n\n @property({ attribute: false })\n options: readonly KtSegmentedOption[] = [];\n\n @property({ type: String })\n value: string | number | null = null;\n\n @property({ type: String, reflect: true })\n size: KtSegmentedSize = 'medium';\n\n @property({ type: String, reflect: true })\n orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Accessible name for the group. */\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 override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultValue = this.value;\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('value') || changed.has('required')) {\n setFormValue(this.internals, this.value === null ? null : String(this.value));\n\n const missing = this.required && this.value === null;\n setValidity(this.internals, { valueMissing: missing }, missing ? 'Select an option.' : '');\n }\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n }\n\n formStateRestoreCallback(state: string): void {\n // The form stores a string; hand back the option's own value, which may be\n // a number.\n this.value = this.options.find((option) => String(option.value) === state)?.value ?? state;\n }\n\n private get selectedIndex(): number {\n return this.options.findIndex((option) => option.value === this.value);\n }\n\n private choose(option: KtSegmentedOption): void {\n if (this.disabled || option.disabled || this.value === option.value) return;\n this.value = option.value;\n emit(this, 'kt-change', { value: option.value, option });\n }\n\n /**\n * Radio-group semantics: the arrows move *and* select, wrapping at the ends\n * and skipping disabled segments.\n */\n private onKeyDown(event: KeyboardEvent): void {\n const forward = this.orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const back = this.orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n let target: number | undefined;\n if (event.key === forward) target = this.step(1);\n else if (event.key === back) target = this.step(-1);\n else if (event.key === 'Home') target = this.options.findIndex((o) => !o.disabled);\n else if (event.key === 'End')\n target = this.options.length - 1 - [...this.options].reverse().findIndex((o) => !o.disabled);\n else return;\n\n event.preventDefault();\n if (target === undefined || target < 0) return;\n\n const option = this.options[target];\n if (!option) return;\n\n const index = target;\n this.choose(option);\n void this.updateComplete.then(() => this.segments[index]?.focus());\n }\n\n private step(direction: 1 | -1): number | undefined {\n const count = this.options.length;\n if (count === 0) return undefined;\n\n const from = this.selectedIndex < 0 ? (direction === 1 ? -1 : 0) : this.selectedIndex;\n for (let offset = 1; offset <= count; offset += 1) {\n const index = (((from + direction * offset) % count) + count) % count;\n if (!this.options[index]?.disabled) return index;\n }\n return undefined;\n }\n\n override render(): TemplateResult {\n const selectedIndex = this.selectedIndex;\n // One tab stop for the whole group: the selected segment holds it, or the\n // first selectable one when nothing is chosen yet.\n const tabStop = selectedIndex >= 0 ? selectedIndex : this.options.findIndex((o) => !o.disabled);\n\n return html`<div\n part=\"base\"\n class=${classMap({\n track: true,\n [this.size]: true,\n vertical: this.orientation === 'vertical',\n })}\n role=\"radiogroup\"\n aria-label=${this.label || nothing}\n aria-orientation=${this.orientation}\n aria-disabled=${this.disabled ? 'true' : nothing}\n @keydown=${this.onKeyDown}\n >\n ${this.options.map((option, index) => {\n const selected = option.value === this.value;\n const text = option.label ?? '';\n const iconOnly = Boolean(option.icon) && text === '';\n\n return html`<button\n part=\"option\"\n type=\"button\"\n role=\"radio\"\n class=${classMap({\n option: true,\n [this.size]: true,\n selected,\n 'icon-only': iconOnly,\n })}\n aria-checked=${selected ? 'true' : 'false'}\n aria-label=${iconOnly ? (option.icon ?? '') : nothing}\n tabindex=${index === tabStop ? 0 : -1}\n ?disabled=${this.disabled || option.disabled}\n @click=${() => this.choose(option)}\n >\n ${\n option.icon\n ? html`<kt-icon name=${option.icon} size=${ICON_SIZE[this.size]}></kt-icon>`\n : nothing\n }\n ${iconOnly ? nothing : html`<span class=\"text\">${text}</span>`}\n </button>`;\n })}\n </div>`;\n }\n}\n\ndefineElement('kt-segmented-control', KtSegmentedControl);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-segmented-control': KtSegmentedControl;\n }\n}\n"],"names":["ICON_SIZE","KtSegmentedControl","KtElement","css","attachFormInternals","changed","setFormValue","missing","setValidity","state","option","emit","event","forward","back","target","o","index","direction","count","from","offset","selectedIndex","tabStop","html","classMap","nothing","selected","text","iconOnly","__decorateClass","queryAll","property","defineElement"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { css as y, html as a, nothing as n } from "lit";
2
2
  import { property as c, state as x } from "lit/decorators.js";
3
3
  import { classMap as f } from "lit/directives/class-map.js";
4
4
  import { styleMap as $ } from "lit/directives/style-map.js";
5
- import { K as b, d as k } from "../../../chunks/kt-element-CcMLO5e8.js";
5
+ import { K as b, d as k } from "../../../chunks/kt-element-B_jjQDhg.js";
6
6
  import { e as g } from "../../../chunks/events-Bjl5Zmmq.js";
7
7
  import "../../core/kt-icon/kt-icon.js";
8
8
  import "../../core/kt-badge/kt-badge.js";
@@ -44,7 +44,7 @@ class s extends b {
44
44
  .title {
45
45
  margin: 0;
46
46
  padding: 0 var(--nav-inset, 0) 6px;
47
- color: var(--color-text-500);
47
+ color: var(--text-muted);
48
48
  font: var(--font-title-overline);
49
49
  letter-spacing: var(--letter-spacing-overline);
50
50
  text-transform: uppercase;
@@ -98,12 +98,12 @@ class s extends b {
98
98
  }
99
99
 
100
100
  .active {
101
- color: var(--color-primary-base);
101
+ color: var(--color-primary-text);
102
102
  background-color: var(--color-primary-soft);
103
103
  }
104
104
 
105
105
  .active:hover {
106
- color: var(--color-primary-base);
106
+ color: var(--color-primary-text);
107
107
  background-color: var(--color-primary-soft);
108
108
  }
109
109
 
@@ -135,7 +135,7 @@ class s extends b {
135
135
 
136
136
  .chevron {
137
137
  flex: none;
138
- color: var(--color-text-500);
138
+ color: var(--text-muted);
139
139
  transition: transform var(--duration-fast) var(--ease-standard);
140
140
  }
141
141
 
@@ -1 +1 @@
1
- {"version":3,"file":"kt-sub-menu-navigation.js","sources":["../../../../src/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport '../../core/kt-icon/kt-icon.js';\nimport '../../core/kt-badge/kt-badge.js';\n\nexport interface KtNavItem {\n readonly label: string;\n readonly href?: string;\n /** Lucide icon name. Conventionally only the top level carries one. */\n readonly icon?: string;\n /** A count or a short status, right-aligned. */\n readonly badge?: string;\n readonly active?: boolean;\n readonly disabled?: boolean;\n /** Nested items. Any depth: a branch is drawn exactly like the level above. */\n readonly children?: readonly KtNavItem[];\n /** Open on first render. A branch holding the active item opens regardless. */\n readonly open?: boolean;\n}\n\nexport interface KtNavSection {\n readonly title?: string;\n readonly items: readonly KtNavItem[];\n}\n\n/**\n * The sidebar navigation: uppercase overline section titles over lists of\n * links, to any depth.\n *\n * The recursion is the point. Every product grows a third level eventually —\n * Settings holds Members holds Roles — and the usual answer is to hand-roll\n * that one branch beside the component, which is how two navigation styles end\n * up on one screen. Here a branch renders exactly like the level above it,\n * indented by depth, and a branch containing the current page opens itself.\n *\n * @element kt-sub-menu-navigation\n *\n * @csspart nav - The `<nav>`.\n * @csspart section - A section.\n * @csspart title - A section title.\n * @csspart item - A navigation link or branch button, at any depth.\n *\n * @fires kt-navigate - A link was activated. `detail: { item }`. Cancel it to\n * keep the browser from following the href, for client-side routing.\n * @fires kt-toggle - A branch opened or closed. `detail: { item, open }`.\n *\n * @example\n * ```js\n * nav.sections = [\n * {\n * title: 'Workspace',\n * items: [\n * { label: 'Home', href: '#/home', icon: 'house' },\n * { label: 'Inbox', href: '#/inbox', icon: 'inbox', badge: '4' },\n * {\n * label: 'Settings',\n * icon: 'settings',\n * children: [\n * { label: 'General', href: '#/settings/general' },\n * { label: 'Members', href: '#/settings/members',\n * children: [{ label: 'Roles', href: '#/settings/members/roles' }] },\n * ],\n * },\n * ],\n * },\n * ];\n * nav.activeHref = '#/settings/members/roles';\n * ```\n */\nexport class KtSubMenuNavigation extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n nav {\n display: flex;\n flex-direction: column;\n gap: var(--gap-sub-menu);\n padding: var(--padding-card);\n background-color: var(--surface-card);\n border-radius: var(--radius-sub-menu);\n }\n\n /* A full-height sidebar owns its own background; the card chrome would\n be a panel inside a panel. */\n :host([flush]) nav {\n gap: 20px;\n padding: 0;\n background: none;\n border-radius: 0;\n }\n\n .title {\n margin: 0;\n padding: 0 var(--nav-inset, 0) 6px;\n color: var(--color-text-500);\n font: var(--font-title-overline);\n letter-spacing: var(--letter-spacing-overline);\n text-transform: uppercase;\n }\n\n ul {\n display: flex;\n flex-direction: column;\n gap: var(--gap-element);\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n /* width: 100% matters on the branch rows: a <button> sizes to its content\n even as a flex container, so a branch's hover and active fill stopped\n at the end of its label while a link's ran the full row. */\n .item {\n position: relative;\n display: flex;\n box-sizing: border-box;\n align-items: center;\n width: 100%;\n gap: 10px;\n padding: var(--padding-sub-menu-item);\n padding-left: calc(var(--nav-pad-left, 16px) + var(--depth, 0) * 20px);\n color: var(--text-muted);\n font: var(--font-normal-regular);\n text-align: left;\n text-decoration: none;\n background: none;\n border: none;\n border-radius: var(--radius-input);\n cursor: pointer;\n }\n\n .item:hover {\n color: var(--text-body);\n background-color: var(--surface-hover);\n text-decoration: none;\n }\n\n .item:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: -2px;\n }\n\n .item[aria-disabled='true'] {\n color: var(--text-disabled);\n pointer-events: none;\n }\n\n .active {\n color: var(--color-primary-base);\n background-color: var(--color-primary-soft);\n }\n\n .active:hover {\n color: var(--color-primary-base);\n background-color: var(--color-primary-soft);\n }\n\n /* The accent bar marks the current page without relying on the tint\n alone, which is the part that survives a forced-colors mode. */\n .active::before {\n position: absolute;\n top: 50%;\n left: 0;\n width: 3px;\n height: 18px;\n background: var(--color-primary-base);\n border-radius: 0 var(--radius-full) var(--radius-full) 0;\n transform: translateY(-50%);\n content: '';\n }\n\n /* A branch is highlighted, not marked current: the page is below it. */\n .within {\n color: var(--text-body);\n }\n\n .label {\n flex: 1;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .chevron {\n flex: none;\n color: var(--color-text-500);\n transition: transform var(--duration-fast) var(--ease-standard);\n }\n\n .chevron.open {\n transform: rotate(90deg);\n }\n\n kt-icon {\n flex: none;\n }\n\n /* Collapsed: icons only. Hidden rather than clipped — a label sliced in\n half at 48px reads as a bug, not as a narrow sidebar. */\n :host([collapsed]) .title,\n :host([collapsed]) .label,\n :host([collapsed]) .chevron,\n :host([collapsed]) kt-badge,\n :host([collapsed]) .children {\n display: none;\n }\n\n :host([collapsed]) .item {\n justify-content: center;\n padding-right: 0;\n padding-left: 0;\n }\n `,\n ];\n\n @property({ attribute: false })\n sections: readonly KtNavSection[] = [];\n\n /** The href of the current page. Marks the matching link active. */\n @property({ type: String, attribute: 'active-href' })\n activeHref = '';\n\n @property({ type: String })\n label = 'Secondary navigation';\n\n /** Drops the card background, for a sidebar that owns its own surface. */\n @property({ type: Boolean, reflect: true })\n flush = false;\n\n /** Icons only. Labels, badges and branches are hidden rather than clipped. */\n @property({ type: Boolean, reflect: true })\n collapsed = false;\n\n /** Branch paths the reader has opened or closed, overriding the default. */\n @state()\n private overrides: Record<string, boolean> = {};\n\n private isActive(item: KtNavItem): boolean {\n return item.active === true || (this.activeHref !== '' && item.href === this.activeHref);\n }\n\n /** True when this item, or anything under it, is the current page. */\n private holdsActive(item: KtNavItem): boolean {\n if (this.isActive(item)) return true;\n return (item.children ?? []).some((child) => this.holdsActive(child));\n }\n\n private isOpen(item: KtNavItem, path: string): boolean {\n // A branch holding the current page opens regardless of what was clicked:\n // navigating to a page that is not visible is worse than losing a fold.\n if (this.holdsActive(item)) return true;\n return this.overrides[path] ?? item.open === true;\n }\n\n private onSelect(event: MouseEvent, item: KtNavItem): void {\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.button !== 0) return;\n\n const proceed = emit(this, 'kt-navigate', { item });\n if (proceed.defaultPrevented) event.preventDefault();\n }\n\n private onToggle(item: KtNavItem, path: string): void {\n const open = !this.isOpen(item, path);\n this.overrides = { ...this.overrides, [path]: open };\n emit(this, 'kt-toggle', { item, open });\n }\n\n /** Opens every branch down to `activeHref`. Called on the section list. */\n private renderItems(items: readonly KtNavItem[], depth: number, prefix: string): TemplateResult {\n return html`<ul>\n ${items.map((item, index) => this.renderItem(item, depth, `${prefix}.${index}`))}\n </ul>`;\n }\n\n private renderItem(item: KtNavItem, depth: number, path: string): TemplateResult {\n const branch = (item.children ?? []).length > 0;\n const active = this.isActive(item);\n const open = branch && this.isOpen(item, path);\n const classes = classMap({\n item: true,\n active,\n within: branch && !active && this.holdsActive(item),\n });\n const inset = styleMap({ '--depth': String(depth) });\n\n const body = html`\n ${item.icon ? html`<kt-icon name=${item.icon} size=\"16\"></kt-icon>` : nothing}\n <span class=\"label\">${item.label}</span>\n ${item.badge ? html`<kt-badge variant=\"count\">${item.badge}</kt-badge>` : nothing}\n ${\n branch\n ? html`<kt-icon\n class=${classMap({ chevron: true, open })}\n name=\"chevron-right\"\n size=\"14\"\n ></kt-icon>`\n : nothing\n }\n `;\n\n return html`<li>\n ${\n branch\n ? html`<button\n part=\"item\"\n type=\"button\"\n class=${classes}\n style=${inset}\n aria-expanded=${open ? 'true' : 'false'}\n aria-disabled=${item.disabled ? 'true' : nothing}\n @click=${() => this.onToggle(item, path)}\n >\n ${body}\n </button>`\n : html`<a\n part=\"item\"\n class=${classes}\n style=${inset}\n href=${item.href ?? '#'}\n aria-current=${active ? 'page' : nothing}\n aria-disabled=${item.disabled ? 'true' : nothing}\n @click=${(event: MouseEvent) => this.onSelect(event, item)}\n >\n ${body}\n </a>`\n }\n ${\n branch && open\n ? html`<div class=\"children\">${this.renderItems(item.children!, depth + 1, path)}</div>`\n : nothing\n }\n </li>`;\n }\n\n override render(): TemplateResult {\n return html`<nav part=\"nav\" aria-label=${this.label}>\n ${this.sections.map(\n (section, index) =>\n html`<div part=\"section\">\n ${section.title ? html`<h6 part=\"title\" class=\"title\">${section.title}</h6>` : nothing}\n ${this.renderItems(section.items, 0, String(index))}\n </div>`,\n )}\n </nav>`;\n }\n}\n\ndefineElement('kt-sub-menu-navigation', KtSubMenuNavigation);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-sub-menu-navigation': KtSubMenuNavigation;\n }\n}\n"],"names":["KtSubMenuNavigation","KtElement","css","item","child","path","event","emit","open","items","depth","prefix","html","index","branch","active","classes","classMap","inset","styleMap","body","nothing","section","__decorateClass","property","state","defineElement"],"mappings":";;;;;;;;;;;;;AAyEO,MAAMA,UAA4BC,EAAU;AAAA,EAA5C,cAAA;AAAA,UAAA,GAAA,SAAA,GAuJL,KAAA,WAAoC,CAAA,GAIpC,KAAA,aAAa,IAGb,KAAA,QAAQ,wBAIR,KAAA,QAAQ,IAIR,KAAA,YAAY,IAIZ,KAAQ,YAAqC,CAAA;AAAA,EAAC;AAAA,EAzK9C,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBA,EAAU;AAAA,MACVC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAiJF;AAAA,EAwBQ,SAASC,GAA0B;AACzC,WAAOA,EAAK,WAAW,MAAS,KAAK,eAAe,MAAMA,EAAK,SAAS,KAAK;AAAA,EAC/E;AAAA;AAAA,EAGQ,YAAYA,GAA0B;AAC5C,WAAI,KAAK,SAASA,CAAI,IAAU,MACxBA,EAAK,YAAY,IAAI,KAAK,CAACC,MAAU,KAAK,YAAYA,CAAK,CAAC;AAAA,EACtE;AAAA,EAEQ,OAAOD,GAAiBE,GAAuB;AAGrD,WAAI,KAAK,YAAYF,CAAI,IAAU,KAC5B,KAAK,UAAUE,CAAI,KAAKF,EAAK,SAAS;AAAA,EAC/C;AAAA,EAEQ,SAASG,GAAmBH,GAAuB;AACzD,QAAIG,EAAM,WAAWA,EAAM,WAAWA,EAAM,YAAYA,EAAM,WAAW,EAAG;AAG5E,IADgBC,EAAK,MAAM,eAAe,EAAE,MAAAJ,GAAM,EACtC,oBAAkBG,EAAM,eAAA;AAAA,EACtC;AAAA,EAEQ,SAASH,GAAiBE,GAAoB;AACpD,UAAMG,IAAO,CAAC,KAAK,OAAOL,GAAME,CAAI;AACpC,SAAK,YAAY,EAAE,GAAG,KAAK,WAAW,CAACA,CAAI,GAAGG,EAAA,GAC9CD,EAAK,MAAM,aAAa,EAAE,MAAAJ,GAAM,MAAAK,GAAM;AAAA,EACxC;AAAA;AAAA,EAGQ,YAAYC,GAA6BC,GAAeC,GAAgC;AAC9F,WAAOC;AAAA,QACHH,EAAM,IAAI,CAACN,GAAMU,MAAU,KAAK,WAAWV,GAAMO,GAAO,GAAGC,CAAM,IAAIE,CAAK,EAAE,CAAC,CAAC;AAAA;AAAA,EAEpF;AAAA,EAEQ,WAAWV,GAAiBO,GAAeL,GAA8B;AAC/E,UAAMS,KAAUX,EAAK,YAAY,CAAA,GAAI,SAAS,GACxCY,IAAS,KAAK,SAASZ,CAAI,GAC3BK,IAAOM,KAAU,KAAK,OAAOX,GAAME,CAAI,GACvCW,IAAUC,EAAS;AAAA,MACvB,MAAM;AAAA,MACN,QAAAF;AAAA,MACA,QAAQD,KAAU,CAACC,KAAU,KAAK,YAAYZ,CAAI;AAAA,IAAA,CACnD,GACKe,IAAQC,EAAS,EAAE,WAAW,OAAOT,CAAK,GAAG,GAE7CU,IAAOR;AAAA,QACTT,EAAK,OAAOS,kBAAqBT,EAAK,IAAI,0BAA0BkB,CAAO;AAAA,4BACvDlB,EAAK,KAAK;AAAA,QAC9BA,EAAK,QAAQS,8BAAiCT,EAAK,KAAK,gBAAgBkB,CAAO;AAAA,QAE/EP,IACIF;AAAA,sBACUK,EAAS,EAAE,SAAS,IAAM,MAAAT,EAAA,CAAM,CAAC;AAAA;AAAA;AAAA,2BAI3Ca,CACN;AAAA;AAGF,WAAOT;AAAA,QAEHE,IACIF;AAAA;AAAA;AAAA,sBAGUI,CAAO;AAAA,sBACPE,CAAK;AAAA,8BACGV,IAAO,SAAS,OAAO;AAAA,8BACvBL,EAAK,WAAW,SAASkB,CAAO;AAAA,uBACvC,MAAM,KAAK,SAASlB,GAAME,CAAI,CAAC;AAAA;AAAA,gBAEtCe,CAAI;AAAA,yBAERR;AAAA;AAAA,sBAEUI,CAAO;AAAA,sBACPE,CAAK;AAAA,qBACNf,EAAK,QAAQ,GAAG;AAAA,6BACRY,IAAS,SAASM,CAAO;AAAA,8BACxBlB,EAAK,WAAW,SAASkB,CAAO;AAAA,uBACvC,CAACf,MAAsB,KAAK,SAASA,GAAOH,CAAI,CAAC;AAAA;AAAA,gBAExDiB,CAAI;AAAA,iBAEd;AAAA,QAEEN,KAAUN,IACNI,0BAA6B,KAAK,YAAYT,EAAK,UAAWO,IAAQ,GAAGL,CAAI,CAAC,WAC9EgB,CACN;AAAA;AAAA,EAEJ;AAAA,EAES,SAAyB;AAChC,WAAOT,+BAAkC,KAAK,KAAK;AAAA,QAC/C,KAAK,SAAS;AAAA,MACd,CAACU,GAAST,MACRD;AAAA,cACIU,EAAQ,QAAQV,mCAAsCU,EAAQ,KAAK,UAAUD,CAAO;AAAA,cACpF,KAAK,YAAYC,EAAQ,OAAO,GAAG,OAAOT,CAAK,CAAC,CAAC;AAAA;AAAA,IAAA,CAExD;AAAA;AAAA,EAEL;AACF;AAjIEU,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAtJnBxB,EAuJX,WAAA,UAAA;AAIAuB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,eAAe;AAAA,GA1JzCxB,EA2JX,WAAA,YAAA;AAGAuB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA7JfxB,EA8JX,WAAA,OAAA;AAIAuB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAjK/BxB,EAkKX,WAAA,OAAA;AAIAuB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GArK/BxB,EAsKX,WAAA,WAAA;AAIQuB,EAAA;AAAA,EADPE,EAAA;AAAM,GAzKIzB,EA0KH,WAAA,WAAA;AAgHV0B,EAAc,0BAA0B1B,CAAmB;"}
1
+ {"version":3,"file":"kt-sub-menu-navigation.js","sources":["../../../../src/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport '../../core/kt-icon/kt-icon.js';\nimport '../../core/kt-badge/kt-badge.js';\n\nexport interface KtNavItem {\n readonly label: string;\n readonly href?: string;\n /** Lucide icon name. Conventionally only the top level carries one. */\n readonly icon?: string;\n /** A count or a short status, right-aligned. */\n readonly badge?: string;\n readonly active?: boolean;\n readonly disabled?: boolean;\n /** Nested items. Any depth: a branch is drawn exactly like the level above. */\n readonly children?: readonly KtNavItem[];\n /** Open on first render. A branch holding the active item opens regardless. */\n readonly open?: boolean;\n}\n\nexport interface KtNavSection {\n readonly title?: string;\n readonly items: readonly KtNavItem[];\n}\n\n/**\n * The sidebar navigation: uppercase overline section titles over lists of\n * links, to any depth.\n *\n * The recursion is the point. Every product grows a third level eventually —\n * Settings holds Members holds Roles — and the usual answer is to hand-roll\n * that one branch beside the component, which is how two navigation styles end\n * up on one screen. Here a branch renders exactly like the level above it,\n * indented by depth, and a branch containing the current page opens itself.\n *\n * @element kt-sub-menu-navigation\n *\n * @csspart nav - The `<nav>`.\n * @csspart section - A section.\n * @csspart title - A section title.\n * @csspart item - A navigation link or branch button, at any depth.\n *\n * @fires kt-navigate - A link was activated. `detail: { item }`. Cancel it to\n * keep the browser from following the href, for client-side routing.\n * @fires kt-toggle - A branch opened or closed. `detail: { item, open }`.\n *\n * @example\n * ```js\n * nav.sections = [\n * {\n * title: 'Workspace',\n * items: [\n * { label: 'Home', href: '#/home', icon: 'house' },\n * { label: 'Inbox', href: '#/inbox', icon: 'inbox', badge: '4' },\n * {\n * label: 'Settings',\n * icon: 'settings',\n * children: [\n * { label: 'General', href: '#/settings/general' },\n * { label: 'Members', href: '#/settings/members',\n * children: [{ label: 'Roles', href: '#/settings/members/roles' }] },\n * ],\n * },\n * ],\n * },\n * ];\n * nav.activeHref = '#/settings/members/roles';\n * ```\n */\nexport class KtSubMenuNavigation extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n nav {\n display: flex;\n flex-direction: column;\n gap: var(--gap-sub-menu);\n padding: var(--padding-card);\n background-color: var(--surface-card);\n border-radius: var(--radius-sub-menu);\n }\n\n /* A full-height sidebar owns its own background; the card chrome would\n be a panel inside a panel. */\n :host([flush]) nav {\n gap: 20px;\n padding: 0;\n background: none;\n border-radius: 0;\n }\n\n .title {\n margin: 0;\n padding: 0 var(--nav-inset, 0) 6px;\n color: var(--text-muted);\n font: var(--font-title-overline);\n letter-spacing: var(--letter-spacing-overline);\n text-transform: uppercase;\n }\n\n ul {\n display: flex;\n flex-direction: column;\n gap: var(--gap-element);\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n /* width: 100% matters on the branch rows: a <button> sizes to its content\n even as a flex container, so a branch's hover and active fill stopped\n at the end of its label while a link's ran the full row. */\n .item {\n position: relative;\n display: flex;\n box-sizing: border-box;\n align-items: center;\n width: 100%;\n gap: 10px;\n padding: var(--padding-sub-menu-item);\n padding-left: calc(var(--nav-pad-left, 16px) + var(--depth, 0) * 20px);\n color: var(--text-muted);\n font: var(--font-normal-regular);\n text-align: left;\n text-decoration: none;\n background: none;\n border: none;\n border-radius: var(--radius-input);\n cursor: pointer;\n }\n\n .item:hover {\n color: var(--text-body);\n background-color: var(--surface-hover);\n text-decoration: none;\n }\n\n .item:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: -2px;\n }\n\n .item[aria-disabled='true'] {\n color: var(--text-disabled);\n pointer-events: none;\n }\n\n .active {\n color: var(--color-primary-text);\n background-color: var(--color-primary-soft);\n }\n\n .active:hover {\n color: var(--color-primary-text);\n background-color: var(--color-primary-soft);\n }\n\n /* The accent bar marks the current page without relying on the tint\n alone, which is the part that survives a forced-colors mode. */\n .active::before {\n position: absolute;\n top: 50%;\n left: 0;\n width: 3px;\n height: 18px;\n background: var(--color-primary-base);\n border-radius: 0 var(--radius-full) var(--radius-full) 0;\n transform: translateY(-50%);\n content: '';\n }\n\n /* A branch is highlighted, not marked current: the page is below it. */\n .within {\n color: var(--text-body);\n }\n\n .label {\n flex: 1;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .chevron {\n flex: none;\n color: var(--text-muted);\n transition: transform var(--duration-fast) var(--ease-standard);\n }\n\n .chevron.open {\n transform: rotate(90deg);\n }\n\n kt-icon {\n flex: none;\n }\n\n /* Collapsed: icons only. Hidden rather than clipped — a label sliced in\n half at 48px reads as a bug, not as a narrow sidebar. */\n :host([collapsed]) .title,\n :host([collapsed]) .label,\n :host([collapsed]) .chevron,\n :host([collapsed]) kt-badge,\n :host([collapsed]) .children {\n display: none;\n }\n\n :host([collapsed]) .item {\n justify-content: center;\n padding-right: 0;\n padding-left: 0;\n }\n `,\n ];\n\n @property({ attribute: false })\n sections: readonly KtNavSection[] = [];\n\n /** The href of the current page. Marks the matching link active. */\n @property({ type: String, attribute: 'active-href' })\n activeHref = '';\n\n @property({ type: String })\n label = 'Secondary navigation';\n\n /** Drops the card background, for a sidebar that owns its own surface. */\n @property({ type: Boolean, reflect: true })\n flush = false;\n\n /** Icons only. Labels, badges and branches are hidden rather than clipped. */\n @property({ type: Boolean, reflect: true })\n collapsed = false;\n\n /** Branch paths the reader has opened or closed, overriding the default. */\n @state()\n private overrides: Record<string, boolean> = {};\n\n private isActive(item: KtNavItem): boolean {\n return item.active === true || (this.activeHref !== '' && item.href === this.activeHref);\n }\n\n /** True when this item, or anything under it, is the current page. */\n private holdsActive(item: KtNavItem): boolean {\n if (this.isActive(item)) return true;\n return (item.children ?? []).some((child) => this.holdsActive(child));\n }\n\n private isOpen(item: KtNavItem, path: string): boolean {\n // A branch holding the current page opens regardless of what was clicked:\n // navigating to a page that is not visible is worse than losing a fold.\n if (this.holdsActive(item)) return true;\n return this.overrides[path] ?? item.open === true;\n }\n\n private onSelect(event: MouseEvent, item: KtNavItem): void {\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.button !== 0) return;\n\n const proceed = emit(this, 'kt-navigate', { item });\n if (proceed.defaultPrevented) event.preventDefault();\n }\n\n private onToggle(item: KtNavItem, path: string): void {\n const open = !this.isOpen(item, path);\n this.overrides = { ...this.overrides, [path]: open };\n emit(this, 'kt-toggle', { item, open });\n }\n\n /** Opens every branch down to `activeHref`. Called on the section list. */\n private renderItems(items: readonly KtNavItem[], depth: number, prefix: string): TemplateResult {\n return html`<ul>\n ${items.map((item, index) => this.renderItem(item, depth, `${prefix}.${index}`))}\n </ul>`;\n }\n\n private renderItem(item: KtNavItem, depth: number, path: string): TemplateResult {\n const branch = (item.children ?? []).length > 0;\n const active = this.isActive(item);\n const open = branch && this.isOpen(item, path);\n const classes = classMap({\n item: true,\n active,\n within: branch && !active && this.holdsActive(item),\n });\n const inset = styleMap({ '--depth': String(depth) });\n\n const body = html`\n ${item.icon ? html`<kt-icon name=${item.icon} size=\"16\"></kt-icon>` : nothing}\n <span class=\"label\">${item.label}</span>\n ${item.badge ? html`<kt-badge variant=\"count\">${item.badge}</kt-badge>` : nothing}\n ${\n branch\n ? html`<kt-icon\n class=${classMap({ chevron: true, open })}\n name=\"chevron-right\"\n size=\"14\"\n ></kt-icon>`\n : nothing\n }\n `;\n\n return html`<li>\n ${\n branch\n ? html`<button\n part=\"item\"\n type=\"button\"\n class=${classes}\n style=${inset}\n aria-expanded=${open ? 'true' : 'false'}\n aria-disabled=${item.disabled ? 'true' : nothing}\n @click=${() => this.onToggle(item, path)}\n >\n ${body}\n </button>`\n : html`<a\n part=\"item\"\n class=${classes}\n style=${inset}\n href=${item.href ?? '#'}\n aria-current=${active ? 'page' : nothing}\n aria-disabled=${item.disabled ? 'true' : nothing}\n @click=${(event: MouseEvent) => this.onSelect(event, item)}\n >\n ${body}\n </a>`\n }\n ${\n branch && open\n ? html`<div class=\"children\">${this.renderItems(item.children!, depth + 1, path)}</div>`\n : nothing\n }\n </li>`;\n }\n\n override render(): TemplateResult {\n return html`<nav part=\"nav\" aria-label=${this.label}>\n ${this.sections.map(\n (section, index) =>\n html`<div part=\"section\">\n ${section.title ? html`<h6 part=\"title\" class=\"title\">${section.title}</h6>` : nothing}\n ${this.renderItems(section.items, 0, String(index))}\n </div>`,\n )}\n </nav>`;\n }\n}\n\ndefineElement('kt-sub-menu-navigation', KtSubMenuNavigation);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-sub-menu-navigation': KtSubMenuNavigation;\n }\n}\n"],"names":["KtSubMenuNavigation","KtElement","css","item","child","path","event","emit","open","items","depth","prefix","html","index","branch","active","classes","classMap","inset","styleMap","body","nothing","section","__decorateClass","property","state","defineElement"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { css as u, html as l, nothing as p } from "lit";
2
2
  import { queryAll as h, property as n } from "lit/decorators.js";
3
3
  import { classMap as f } from "lit/directives/class-map.js";
4
- import { K as c, d as v } from "../../../chunks/kt-element-CcMLO5e8.js";
4
+ import { K as c, d as v } from "../../../chunks/kt-element-B_jjQDhg.js";
5
5
  import { e as m } from "../../../chunks/events-Bjl5Zmmq.js";
6
6
  import "../../core/kt-icon/kt-icon.js";
7
7
  import "../../feedback/kt-skeleton/kt-skeleton.js";
@@ -1,7 +1,7 @@
1
1
  import { css as p, html as c, nothing as n } from "lit";
2
2
  import { property as o } from "lit/decorators.js";
3
3
  import { classMap as b } from "lit/directives/class-map.js";
4
- import { K as u, d as g } from "../../../chunks/kt-element-CcMLO5e8.js";
4
+ import { K as u, d as g } from "../../../chunks/kt-element-B_jjQDhg.js";
5
5
  import { e as v } from "../../../chunks/events-Bjl5Zmmq.js";
6
6
  import "../../core/kt-icon/kt-icon.js";
7
7
  var m = Object.defineProperty, r = (l, e, i, s) => {
@@ -92,7 +92,7 @@ class t extends u {
92
92
  background-color: var(--color-secondary-hover);
93
93
  }
94
94
  .secondary.selected {
95
- color: var(--color-primary-base);
95
+ color: var(--color-primary-text);
96
96
  background-color: var(--color-primary-soft);
97
97
  }
98
98
 
@@ -107,7 +107,7 @@ class t extends u {
107
107
  border-color: var(--text-muted);
108
108
  }
109
109
  .outline.selected {
110
- color: var(--color-primary-base);
110
+ color: var(--color-primary-text);
111
111
  background-color: var(--color-primary-soft);
112
112
  border-color: var(--color-primary-base);
113
113
  }
@@ -1 +1 @@
1
- {"version":3,"file":"kt-toggle-button.js","sources":["../../../../src/components/navigation/kt-toggle-button/kt-toggle-button.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport type KtToggleButtonVariant = 'primary' | 'secondary' | 'outline';\nexport type KtToggleButtonSize = 'small' | 'medium' | 'large';\n\nconst ICON_SIZE: Record<KtToggleButtonSize, number> = { small: 16, medium: 20, large: 24 };\n\n/**\n * A button that stays pressed.\n *\n * `aria-pressed` rather than `aria-checked`: this is a control that holds a\n * state, not one option among several. Put several in a\n * `<kt-toggle-button-group>` when they are.\n *\n * @element kt-toggle-button\n *\n * @slot - The button label.\n *\n * @csspart button - The native `<button>`.\n *\n * @fires kt-change - The state changed. `detail: { selected, value }`.\n */\nexport class KtToggleButton extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-flex;\n }\n\n button {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: 100%;\n height: var(--button-height);\n padding: 0 var(--button-padding-x);\n gap: var(--gap-button);\n font: var(--font-normal-regular);\n border: var(--border-width) solid transparent;\n /* Overridden by kt-toggle-button-group, which is the only thing that\n knows whether this button is first, last or in the middle. */\n border-radius: var(--kt-toggle-button-radius, var(--border-radius));\n cursor: pointer;\n transition:\n background-color var(--duration-normal) var(--easing-standard),\n border-color var(--duration-normal) var(--easing-standard),\n color var(--duration-normal) var(--easing-standard);\n }\n\n button:disabled {\n color: var(--text-disabled);\n background-color: var(--color-dark-14);\n border-color: transparent;\n pointer-events: none;\n }\n\n button:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n .small {\n height: var(--button-height-small);\n padding: 0 8px;\n font: var(--font-normal-small);\n }\n .large {\n height: var(--button-height-large);\n padding: 0 calc(var(--button-padding-x) + 8px);\n font: var(--font-normal-medium);\n }\n\n /* === PRIMARY === */\n .primary {\n color: var(--text-muted);\n background-color: var(--surface-raised);\n }\n .primary:hover:not(:disabled) {\n background-color: var(--surface-hover);\n }\n .primary.selected {\n color: var(--color-white);\n background-color: var(--color-primary-base);\n border-color: var(--color-primary-base);\n }\n .primary.selected:hover:not(:disabled) {\n background-color: var(--color-primary-hover);\n }\n\n /* === SECONDARY === */\n .secondary {\n color: var(--text-muted);\n background-color: var(--color-dark-14);\n }\n .secondary:hover:not(:disabled) {\n background-color: var(--color-secondary-hover);\n }\n .secondary.selected {\n color: var(--color-primary-base);\n background-color: var(--color-primary-soft);\n }\n\n /* === OUTLINE === */\n .outline {\n color: var(--text-muted);\n background-color: transparent;\n border-color: var(--color-text-600);\n }\n .outline:hover:not(:disabled) {\n background-color: var(--color-dark-14);\n border-color: var(--text-muted);\n }\n .outline.selected {\n color: var(--color-primary-base);\n background-color: var(--color-primary-soft);\n border-color: var(--color-primary-base);\n }\n\n .icon-only {\n width: var(--button-height);\n padding: 0;\n }\n .icon-only.small {\n width: var(--button-height-small);\n }\n .icon-only.large {\n width: var(--button-height-large);\n }\n\n .text {\n white-space: nowrap;\n }\n `,\n ];\n\n @property({ type: Boolean, reflect: true })\n selected = false;\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: String, reflect: true })\n variant: KtToggleButtonVariant = 'primary';\n\n @property({ type: String, reflect: true })\n size: KtToggleButtonSize = 'medium';\n\n /** Identifies this button inside a `<kt-toggle-button-group>`. */\n @property({ type: String })\n value = '';\n\n @property({ type: String })\n icon = '';\n\n @property({ type: String, attribute: 'icon-position' })\n iconPosition: 'left' | 'right' = 'left';\n\n /** Accessible name. Required when the button is icon-only. */\n @property({ type: String })\n label = '';\n\n /**\n * Set by `<kt-toggle-button-group>` on the buttons it owns.\n *\n * A managed button is a display, not a control: it neither flips itself nor\n * emits. The group reads the click, decides what the selection now is, and\n * writes `selected` back. Without this the two both react to the same click\n * and consumers hear two different kt-change events for one press.\n */\n @property({ attribute: false })\n managed = false;\n\n override focus(options?: FocusOptions): void {\n this.shadowRoot?.querySelector('button')?.focus(options);\n }\n\n private toggle(): void {\n if (this.disabled || this.managed) return;\n this.selected = !this.selected;\n emit(this, 'kt-change', { selected: this.selected, value: this.value });\n }\n\n override render(): TemplateResult {\n const hasText = this.textContent !== null && this.textContent.trim().length > 0;\n const iconOnly = Boolean(this.icon) && !hasText;\n const icon = this.icon\n ? html`<kt-icon name=${this.icon} size=${ICON_SIZE[this.size]}></kt-icon>`\n : nothing;\n\n return html`<button\n part=\"button\"\n type=\"button\"\n class=${classMap({\n [this.variant]: true,\n [this.size]: true,\n selected: this.selected,\n 'icon-only': iconOnly,\n })}\n aria-pressed=${this.selected ? 'true' : 'false'}\n aria-label=${this.label || nothing}\n ?disabled=${this.disabled}\n @click=${this.toggle}\n >\n ${this.iconPosition === 'left' ? icon : nothing}\n ${iconOnly ? nothing : html`<span class=\"text\"><slot></slot></span>`}\n ${this.iconPosition === 'right' ? icon : nothing}\n </button>`;\n }\n}\n\ndefineElement('kt-toggle-button', KtToggleButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-toggle-button': KtToggleButton;\n }\n}\n"],"names":["ICON_SIZE","KtToggleButton","KtElement","css","options","emit","hasText","iconOnly","icon","html","nothing","classMap","__decorateClass","property","defineElement"],"mappings":"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"}
1
+ {"version":3,"file":"kt-toggle-button.js","sources":["../../../../src/components/navigation/kt-toggle-button/kt-toggle-button.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport type KtToggleButtonVariant = 'primary' | 'secondary' | 'outline';\nexport type KtToggleButtonSize = 'small' | 'medium' | 'large';\n\nconst ICON_SIZE: Record<KtToggleButtonSize, number> = { small: 16, medium: 20, large: 24 };\n\n/**\n * A button that stays pressed.\n *\n * `aria-pressed` rather than `aria-checked`: this is a control that holds a\n * state, not one option among several. Put several in a\n * `<kt-toggle-button-group>` when they are.\n *\n * @element kt-toggle-button\n *\n * @slot - The button label.\n *\n * @csspart button - The native `<button>`.\n *\n * @fires kt-change - The state changed. `detail: { selected, value }`.\n */\nexport class KtToggleButton extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-flex;\n }\n\n button {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: 100%;\n height: var(--button-height);\n padding: 0 var(--button-padding-x);\n gap: var(--gap-button);\n font: var(--font-normal-regular);\n border: var(--border-width) solid transparent;\n /* Overridden by kt-toggle-button-group, which is the only thing that\n knows whether this button is first, last or in the middle. */\n border-radius: var(--kt-toggle-button-radius, var(--border-radius));\n cursor: pointer;\n transition:\n background-color var(--duration-normal) var(--easing-standard),\n border-color var(--duration-normal) var(--easing-standard),\n color var(--duration-normal) var(--easing-standard);\n }\n\n button:disabled {\n color: var(--text-disabled);\n background-color: var(--color-dark-14);\n border-color: transparent;\n pointer-events: none;\n }\n\n button:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n .small {\n height: var(--button-height-small);\n padding: 0 8px;\n font: var(--font-normal-small);\n }\n .large {\n height: var(--button-height-large);\n padding: 0 calc(var(--button-padding-x) + 8px);\n font: var(--font-normal-medium);\n }\n\n /* === PRIMARY === */\n .primary {\n color: var(--text-muted);\n background-color: var(--surface-raised);\n }\n .primary:hover:not(:disabled) {\n background-color: var(--surface-hover);\n }\n .primary.selected {\n color: var(--color-white);\n background-color: var(--color-primary-base);\n border-color: var(--color-primary-base);\n }\n .primary.selected:hover:not(:disabled) {\n background-color: var(--color-primary-hover);\n }\n\n /* === SECONDARY === */\n .secondary {\n color: var(--text-muted);\n background-color: var(--color-dark-14);\n }\n .secondary:hover:not(:disabled) {\n background-color: var(--color-secondary-hover);\n }\n .secondary.selected {\n color: var(--color-primary-text);\n background-color: var(--color-primary-soft);\n }\n\n /* === OUTLINE === */\n .outline {\n color: var(--text-muted);\n background-color: transparent;\n border-color: var(--color-text-600);\n }\n .outline:hover:not(:disabled) {\n background-color: var(--color-dark-14);\n border-color: var(--text-muted);\n }\n .outline.selected {\n color: var(--color-primary-text);\n background-color: var(--color-primary-soft);\n border-color: var(--color-primary-base);\n }\n\n .icon-only {\n width: var(--button-height);\n padding: 0;\n }\n .icon-only.small {\n width: var(--button-height-small);\n }\n .icon-only.large {\n width: var(--button-height-large);\n }\n\n .text {\n white-space: nowrap;\n }\n `,\n ];\n\n @property({ type: Boolean, reflect: true })\n selected = false;\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: String, reflect: true })\n variant: KtToggleButtonVariant = 'primary';\n\n @property({ type: String, reflect: true })\n size: KtToggleButtonSize = 'medium';\n\n /** Identifies this button inside a `<kt-toggle-button-group>`. */\n @property({ type: String })\n value = '';\n\n @property({ type: String })\n icon = '';\n\n @property({ type: String, attribute: 'icon-position' })\n iconPosition: 'left' | 'right' = 'left';\n\n /** Accessible name. Required when the button is icon-only. */\n @property({ type: String })\n label = '';\n\n /**\n * Set by `<kt-toggle-button-group>` on the buttons it owns.\n *\n * A managed button is a display, not a control: it neither flips itself nor\n * emits. The group reads the click, decides what the selection now is, and\n * writes `selected` back. Without this the two both react to the same click\n * and consumers hear two different kt-change events for one press.\n */\n @property({ attribute: false })\n managed = false;\n\n override focus(options?: FocusOptions): void {\n this.shadowRoot?.querySelector('button')?.focus(options);\n }\n\n private toggle(): void {\n if (this.disabled || this.managed) return;\n this.selected = !this.selected;\n emit(this, 'kt-change', { selected: this.selected, value: this.value });\n }\n\n override render(): TemplateResult {\n const hasText = this.textContent !== null && this.textContent.trim().length > 0;\n const iconOnly = Boolean(this.icon) && !hasText;\n const icon = this.icon\n ? html`<kt-icon name=${this.icon} size=${ICON_SIZE[this.size]}></kt-icon>`\n : nothing;\n\n return html`<button\n part=\"button\"\n type=\"button\"\n class=${classMap({\n [this.variant]: true,\n [this.size]: true,\n selected: this.selected,\n 'icon-only': iconOnly,\n })}\n aria-pressed=${this.selected ? 'true' : 'false'}\n aria-label=${this.label || nothing}\n ?disabled=${this.disabled}\n @click=${this.toggle}\n >\n ${this.iconPosition === 'left' ? icon : nothing}\n ${iconOnly ? nothing : html`<span class=\"text\"><slot></slot></span>`}\n ${this.iconPosition === 'right' ? icon : nothing}\n </button>`;\n }\n}\n\ndefineElement('kt-toggle-button', KtToggleButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-toggle-button': KtToggleButton;\n }\n}\n"],"names":["ICON_SIZE","KtToggleButton","KtElement","css","options","emit","hasText","iconOnly","icon","html","nothing","classMap","__decorateClass","property","defineElement"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { css as c, html as h } from "lit";
2
2
  import { queryAssignedElements as g, property as l } from "lit/decorators.js";
3
- import { K as d, d as b } from "../../../chunks/kt-element-CcMLO5e8.js";
3
+ import { K as d, d as b } from "../../../chunks/kt-element-B_jjQDhg.js";
4
4
  import { e as p } from "../../../chunks/events-Bjl5Zmmq.js";
5
5
  import { KtToggleButton as v } from "../kt-toggle-button/kt-toggle-button.js";
6
6
  var f = Object.defineProperty, s = (n, t, e, r) => {
@@ -1,6 +1,6 @@
1
1
  import { css as d, nothing as m, html as c } from "lit";
2
2
  import { property as n } from "lit/decorators.js";
3
- import { K as p, d as u } from "../../../chunks/kt-element-CcMLO5e8.js";
3
+ import { K as p, d as u } from "../../../chunks/kt-element-B_jjQDhg.js";
4
4
  import { e as f } from "../../../chunks/events-Bjl5Zmmq.js";
5
5
  import "../../core/kt-icon/kt-icon.js";
6
6
  var h = Object.defineProperty, i = (a, o, t, y) => {
@@ -1,6 +1,6 @@
1
1
  import { css as f, nothing as d, html as c } from "lit";
2
2
  import { query as h, property as o } from "lit/decorators.js";
3
- import { K as p, d as m } from "../../../chunks/kt-element-CcMLO5e8.js";
3
+ import { K as p, d as m } from "../../../chunks/kt-element-B_jjQDhg.js";
4
4
  import { e as g } from "../../../chunks/events-Bjl5Zmmq.js";
5
5
  import { o as y, c as u, i as b } from "../../../chunks/dialog-CPIfFIlF.js";
6
6
  import "../../core/kt-button/kt-button.js";
@@ -27,6 +27,8 @@ export type KtDropdownAlign = 'start' | 'end';
27
27
  export declare class KtDropdown extends KtElement {
28
28
  static styles: import("lit").CSSResultGroup[];
29
29
  private triggerWrapper;
30
+ private triggerSlot?;
31
+ private panelSlot?;
30
32
  private open;
31
33
  /** Where the panel actually landed, after checking the room available. */
32
34
  private placement;
@@ -51,6 +53,17 @@ export declare class KtDropdown extends KtElement {
51
53
  private reposition;
52
54
  private onDocumentPointerDown;
53
55
  private onDocumentKeyDown;
56
+ updated(): void;
57
+ /**
58
+ * Puts the popup state on the slotted trigger — the element that takes focus,
59
+ * so the one a screen reader announces. A `<kt-button>` gets it through its
60
+ * properties and passes it to its inner button; anything else as attributes.
61
+ *
62
+ * Only a menu is announced as one: the built-in list of options, or a
63
+ * slotted panel that says `role="menu"` itself. A panel of free content is a
64
+ * disclosure — `aria-expanded` alone.
65
+ */
66
+ private syncTrigger;
54
67
  /** Opens the panel. */
55
68
  show(): void;
56
69
  /** Closes the panel. */