kanto-ds 1.0.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 (192) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +155 -0
  3. package/dist/assets/fonts/README.md +19 -0
  4. package/dist/assets/fonts/manrope/OFL.txt +93 -0
  5. package/dist/assets/fonts/manrope/manrope-cyrillic-ext-wght-normal.woff2 +0 -0
  6. package/dist/assets/fonts/manrope/manrope-cyrillic-wght-normal.woff2 +0 -0
  7. package/dist/assets/fonts/manrope/manrope-latin-ext-wght-normal.woff2 +0 -0
  8. package/dist/assets/fonts/manrope/manrope-latin-wght-normal.woff2 +0 -0
  9. package/dist/assets/fonts/mulish/OFL.txt +93 -0
  10. package/dist/assets/fonts/mulish/mulish-cyrillic-ext-wght-italic.woff2 +0 -0
  11. package/dist/assets/fonts/mulish/mulish-cyrillic-ext-wght-normal.woff2 +0 -0
  12. package/dist/assets/fonts/mulish/mulish-cyrillic-wght-italic.woff2 +0 -0
  13. package/dist/assets/fonts/mulish/mulish-cyrillic-wght-normal.woff2 +0 -0
  14. package/dist/assets/fonts/mulish/mulish-latin-ext-wght-italic.woff2 +0 -0
  15. package/dist/assets/fonts/mulish/mulish-latin-ext-wght-normal.woff2 +0 -0
  16. package/dist/assets/fonts/mulish/mulish-latin-wght-italic.woff2 +0 -0
  17. package/dist/assets/fonts/mulish/mulish-latin-wght-normal.woff2 +0 -0
  18. package/dist/assets/fonts/source_code_pro/OFL.txt +93 -0
  19. package/dist/assets/fonts/source_code_pro/SourceCodePro-Regular.woff2 +0 -0
  20. package/dist/chunks/dialog-CPIfFIlF.js +29 -0
  21. package/dist/chunks/dialog-CPIfFIlF.js.map +1 -0
  22. package/dist/chunks/events-Bjl5Zmmq.js +18 -0
  23. package/dist/chunks/events-Bjl5Zmmq.js.map +1 -0
  24. package/dist/chunks/form-control-CxjBTt1c.js +17 -0
  25. package/dist/chunks/form-control-CxjBTt1c.js.map +1 -0
  26. package/dist/chunks/kt-element-CcMLO5e8.js +28 -0
  27. package/dist/chunks/kt-element-CcMLO5e8.js.map +1 -0
  28. package/dist/chunks/listbox-CUXYn_3S.js +101 -0
  29. package/dist/chunks/listbox-CUXYn_3S.js.map +1 -0
  30. package/dist/chunks/registry-X4LS9J5K.js +30 -0
  31. package/dist/chunks/registry-X4LS9J5K.js.map +1 -0
  32. package/dist/chunks/slots-BPbIdxAJ.js +7 -0
  33. package/dist/chunks/slots-BPbIdxAJ.js.map +1 -0
  34. package/dist/chunks/toaster-PmdKSV5x.js +40 -0
  35. package/dist/chunks/toaster-PmdKSV5x.js.map +1 -0
  36. package/dist/components/core/kt-avatar/kt-avatar.d.ts +49 -0
  37. package/dist/components/core/kt-avatar/kt-avatar.js +156 -0
  38. package/dist/components/core/kt-avatar/kt-avatar.js.map +1 -0
  39. package/dist/components/core/kt-badge/kt-badge.d.ts +77 -0
  40. package/dist/components/core/kt-badge/kt-badge.js +254 -0
  41. package/dist/components/core/kt-badge/kt-badge.js.map +1 -0
  42. package/dist/components/core/kt-button/kt-button.d.ts +71 -0
  43. package/dist/components/core/kt-button/kt-button.js +271 -0
  44. package/dist/components/core/kt-button/kt-button.js.map +1 -0
  45. package/dist/components/core/kt-card/kt-card.d.ts +62 -0
  46. package/dist/components/core/kt-card/kt-card.js +230 -0
  47. package/dist/components/core/kt-card/kt-card.js.map +1 -0
  48. package/dist/components/core/kt-code/kt-code.d.ts +55 -0
  49. package/dist/components/core/kt-code/kt-code.js +155 -0
  50. package/dist/components/core/kt-code/kt-code.js.map +1 -0
  51. package/dist/components/core/kt-icon/kt-icon.d.ts +44 -0
  52. package/dist/components/core/kt-icon/kt-icon.js +85 -0
  53. package/dist/components/core/kt-icon/kt-icon.js.map +1 -0
  54. package/dist/components/core/kt-kbd/kt-kbd.d.ts +38 -0
  55. package/dist/components/core/kt-kbd/kt-kbd.js +89 -0
  56. package/dist/components/core/kt-kbd/kt-kbd.js.map +1 -0
  57. package/dist/components/data/kt-chart/kt-chart.d.ts +99 -0
  58. package/dist/components/data/kt-chart/kt-chart.js +406 -0
  59. package/dist/components/data/kt-chart/kt-chart.js.map +1 -0
  60. package/dist/components/data/kt-meter/kt-meter.d.ts +63 -0
  61. package/dist/components/data/kt-meter/kt-meter.js +177 -0
  62. package/dist/components/data/kt-meter/kt-meter.js.map +1 -0
  63. package/dist/components/data/kt-pagination/kt-pagination.d.ts +35 -0
  64. package/dist/components/data/kt-pagination/kt-pagination.js +88 -0
  65. package/dist/components/data/kt-pagination/kt-pagination.js.map +1 -0
  66. package/dist/components/data/kt-stat/kt-stat.d.ts +60 -0
  67. package/dist/components/data/kt-stat/kt-stat.js +137 -0
  68. package/dist/components/data/kt-stat/kt-stat.js.map +1 -0
  69. package/dist/components/data/kt-table/kt-table.d.ts +99 -0
  70. package/dist/components/data/kt-table/kt-table.js +340 -0
  71. package/dist/components/data/kt-table/kt-table.js.map +1 -0
  72. package/dist/components/data/kt-timeline/kt-timeline.d.ts +78 -0
  73. package/dist/components/data/kt-timeline/kt-timeline.js +252 -0
  74. package/dist/components/data/kt-timeline/kt-timeline.js.map +1 -0
  75. package/dist/components/feedback/kt-alert/kt-alert.d.ts +46 -0
  76. package/dist/components/feedback/kt-alert/kt-alert.js +180 -0
  77. package/dist/components/feedback/kt-alert/kt-alert.js.map +1 -0
  78. package/dist/components/feedback/kt-empty-state/kt-empty-state.d.ts +40 -0
  79. package/dist/components/feedback/kt-empty-state/kt-empty-state.js +100 -0
  80. package/dist/components/feedback/kt-empty-state/kt-empty-state.js.map +1 -0
  81. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.d.ts +53 -0
  82. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +212 -0
  83. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js.map +1 -0
  84. package/dist/components/feedback/kt-skeleton/kt-skeleton.d.ts +43 -0
  85. package/dist/components/feedback/kt-skeleton/kt-skeleton.js +117 -0
  86. package/dist/components/feedback/kt-skeleton/kt-skeleton.js.map +1 -0
  87. package/dist/components/feedback/kt-toast/kt-toast.d.ts +57 -0
  88. package/dist/components/feedback/kt-toast/kt-toast.js +231 -0
  89. package/dist/components/feedback/kt-toast/kt-toast.js.map +1 -0
  90. package/dist/components/feedback/kt-toast-container/kt-toast-container.d.ts +60 -0
  91. package/dist/components/feedback/kt-toast-container/kt-toast-container.js +100 -0
  92. package/dist/components/feedback/kt-toast-container/kt-toast-container.js.map +1 -0
  93. package/dist/components/feedback/kt-toast-container/toaster.d.ts +37 -0
  94. package/dist/components/feedback/kt-tooltip/kt-tooltip.d.ts +57 -0
  95. package/dist/components/feedback/kt-tooltip/kt-tooltip.js +138 -0
  96. package/dist/components/feedback/kt-tooltip/kt-tooltip.js.map +1 -0
  97. package/dist/components/forms/kt-drag-drop/kt-drag-drop.d.ts +68 -0
  98. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +287 -0
  99. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js.map +1 -0
  100. package/dist/components/forms/kt-form/kt-form.d.ts +75 -0
  101. package/dist/components/forms/kt-form/kt-form.js +187 -0
  102. package/dist/components/forms/kt-form/kt-form.js.map +1 -0
  103. package/dist/components/forms/kt-input/kt-input.d.ts +112 -0
  104. package/dist/components/forms/kt-input/kt-input.js +556 -0
  105. package/dist/components/forms/kt-input/kt-input.js.map +1 -0
  106. package/dist/components/forms/kt-input-menu/kt-input-menu.d.ts +60 -0
  107. package/dist/components/forms/kt-input-menu/kt-input-menu.js +313 -0
  108. package/dist/components/forms/kt-input-menu/kt-input-menu.js.map +1 -0
  109. package/dist/components/forms/kt-label-input/kt-label-input.d.ts +42 -0
  110. package/dist/components/forms/kt-label-input/kt-label-input.js +69 -0
  111. package/dist/components/forms/kt-label-input/kt-label-input.js.map +1 -0
  112. package/dist/components/forms/kt-select/kt-select.d.ts +80 -0
  113. package/dist/components/forms/kt-select/kt-select.js +334 -0
  114. package/dist/components/forms/kt-select/kt-select.js.map +1 -0
  115. package/dist/components/forms/kt-textarea/kt-textarea.d.ts +62 -0
  116. package/dist/components/forms/kt-textarea/kt-textarea.js +239 -0
  117. package/dist/components/forms/kt-textarea/kt-textarea.js.map +1 -0
  118. package/dist/components/forms/kt-toggle/kt-toggle.d.ts +53 -0
  119. package/dist/components/forms/kt-toggle/kt-toggle.js +170 -0
  120. package/dist/components/forms/kt-toggle/kt-toggle.js.map +1 -0
  121. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.d.ts +45 -0
  122. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +93 -0
  123. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js.map +1 -0
  124. package/dist/components/navigation/kt-header/kt-header.d.ts +67 -0
  125. package/dist/components/navigation/kt-header/kt-header.js +195 -0
  126. package/dist/components/navigation/kt-header/kt-header.js.map +1 -0
  127. package/dist/components/navigation/kt-page-header/kt-page-header.d.ts +48 -0
  128. package/dist/components/navigation/kt-page-header/kt-page-header.js +111 -0
  129. package/dist/components/navigation/kt-page-header/kt-page-header.js.map +1 -0
  130. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.d.ts +63 -0
  131. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +228 -0
  132. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -0
  133. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.d.ts +94 -0
  134. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +265 -0
  135. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js.map +1 -0
  136. package/dist/components/navigation/kt-tabs/kt-tabs.d.ts +64 -0
  137. package/dist/components/navigation/kt-tabs/kt-tabs.js +175 -0
  138. package/dist/components/navigation/kt-tabs/kt-tabs.js.map +1 -0
  139. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.d.ts +50 -0
  140. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +191 -0
  141. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js.map +1 -0
  142. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.d.ts +55 -0
  143. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +128 -0
  144. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js.map +1 -0
  145. package/dist/components/overlays/kt-collapsible/kt-collapsible.d.ts +42 -0
  146. package/dist/components/overlays/kt-collapsible/kt-collapsible.js +107 -0
  147. package/dist/components/overlays/kt-collapsible/kt-collapsible.js.map +1 -0
  148. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.d.ts +56 -0
  149. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +155 -0
  150. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js.map +1 -0
  151. package/dist/components/overlays/kt-dropdown/kt-dropdown.d.ts +64 -0
  152. package/dist/components/overlays/kt-dropdown/kt-dropdown.js +212 -0
  153. package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -0
  154. package/dist/components/overlays/kt-modal/kt-modal.d.ts +61 -0
  155. package/dist/components/overlays/kt-modal/kt-modal.js +207 -0
  156. package/dist/components/overlays/kt-modal/kt-modal.js.map +1 -0
  157. package/dist/components/overlays/kt-side-panel/kt-side-panel.d.ts +52 -0
  158. package/dist/components/overlays/kt-side-panel/kt-side-panel.js +178 -0
  159. package/dist/components/overlays/kt-side-panel/kt-side-panel.js.map +1 -0
  160. package/dist/icons/defaults.d.ts +25 -0
  161. package/dist/icons/index.d.ts +3 -0
  162. package/dist/icons/index.js +37 -0
  163. package/dist/icons/index.js.map +1 -0
  164. package/dist/icons/registry.d.ts +38 -0
  165. package/dist/index.d.ts +81 -0
  166. package/dist/index.js +96 -0
  167. package/dist/index.js.map +1 -0
  168. package/dist/internal/countries.d.ts +37 -0
  169. package/dist/internal/dialog.d.ts +22 -0
  170. package/dist/internal/events.d.ts +14 -0
  171. package/dist/internal/form-control.d.ts +27 -0
  172. package/dist/internal/format.d.ts +8 -0
  173. package/dist/internal/kt-element.d.ts +22 -0
  174. package/dist/internal/listbox.d.ts +36 -0
  175. package/dist/internal/slots.d.ts +10 -0
  176. package/dist/react/index.d.ts +208 -0
  177. package/dist/react/index.js +314 -0
  178. package/dist/react/index.js.map +1 -0
  179. package/dist/styles.css +13 -0
  180. package/dist/tokens/README.md +63 -0
  181. package/dist/tokens/base.css +79 -0
  182. package/dist/tokens/colors.css +125 -0
  183. package/dist/tokens/fonts.css +136 -0
  184. package/dist/tokens/index.css +12 -0
  185. package/dist/tokens/responsive.css +108 -0
  186. package/dist/tokens/spacing.css +66 -0
  187. package/dist/tokens/theme-light.css +144 -0
  188. package/dist/tokens/typography.css +41 -0
  189. package/dist/vue/index.d.ts +143 -0
  190. package/dist/vue/index.js +56 -0
  191. package/dist/vue/index.js.map +1 -0
  192. package/package.json +296 -0
@@ -0,0 +1,228 @@
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";
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";
5
+ import { e as m } from "../../../chunks/events-Bjl5Zmmq.js";
6
+ 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;
11
+ };
12
+ const y = { small: 16, medium: 20, large: 24 };
13
+ class n extends b {
14
+ constructor() {
15
+ super(...arguments), this.options = [], this.value = null, this.size = "medium", this.orientation = "horizontal", this.disabled = !1, this.label = "";
16
+ }
17
+ static {
18
+ this.styles = [
19
+ b.styles,
20
+ f`
21
+ :host {
22
+ display: inline-block;
23
+ }
24
+
25
+ .track {
26
+ display: inline-flex;
27
+ box-sizing: border-box;
28
+ gap: 4px;
29
+ padding: 4px;
30
+ background-color: var(--color-dark-14);
31
+ border-radius: var(--border-radius);
32
+ }
33
+
34
+ .track.small {
35
+ gap: 3px;
36
+ padding: 3px;
37
+ }
38
+ .track.large {
39
+ gap: 5px;
40
+ padding: 5px;
41
+ }
42
+
43
+ .track.vertical {
44
+ flex-direction: column;
45
+ width: fit-content;
46
+ }
47
+
48
+ :host([disabled]) .track {
49
+ opacity: 0.5;
50
+ pointer-events: none;
51
+ }
52
+
53
+ .option {
54
+ display: flex;
55
+ flex: 1;
56
+ align-items: center;
57
+ justify-content: center;
58
+ box-sizing: border-box;
59
+ gap: var(--gap-button);
60
+ height: var(--button-height-small);
61
+ padding: 0 12px;
62
+ color: var(--text-muted);
63
+ font: var(--font-normal-regular);
64
+ background-color: transparent;
65
+ border: none;
66
+ border-radius: calc(var(--border-radius) - 4px);
67
+ cursor: pointer;
68
+ transition:
69
+ background-color var(--duration-normal) var(--easing-standard),
70
+ color var(--duration-normal) var(--easing-standard);
71
+ }
72
+
73
+ .option:hover:not(:disabled) {
74
+ background-color: var(--color-dark-18);
75
+ }
76
+ .option:active:not(:disabled) {
77
+ background-color: var(--surface-card);
78
+ }
79
+
80
+ .option.selected {
81
+ color: var(--text-body);
82
+ background-color: var(--surface-raised);
83
+ }
84
+ .option.selected:hover:not(:disabled) {
85
+ background-color: var(--surface-hover);
86
+ }
87
+
88
+ .option:disabled {
89
+ color: var(--text-disabled);
90
+ background-color: transparent;
91
+ pointer-events: none;
92
+ }
93
+
94
+ .option:focus-visible {
95
+ outline: var(--outline-width) solid var(--color-primary-base);
96
+ outline-offset: -2px;
97
+ }
98
+
99
+ .option.small {
100
+ height: 24px;
101
+ gap: 6px;
102
+ padding: 0 8px;
103
+ font: var(--font-normal-small);
104
+ }
105
+ .option.large {
106
+ height: var(--button-height);
107
+ padding: 0 16px;
108
+ font: var(--font-normal-medium);
109
+ }
110
+
111
+ .option.icon-only {
112
+ width: var(--button-height-small);
113
+ padding: 0;
114
+ }
115
+ .option.icon-only.small {
116
+ width: 24px;
117
+ }
118
+ .option.icon-only.large {
119
+ width: var(--button-height);
120
+ }
121
+
122
+ .text {
123
+ flex: 1;
124
+ text-align: center;
125
+ }
126
+ `
127
+ ];
128
+ }
129
+ get selectedIndex() {
130
+ return this.options.findIndex((t) => t.value === this.value);
131
+ }
132
+ choose(t) {
133
+ t.disabled || this.value === t.value || (this.value = t.value, m(this, "kt-change", { value: t.value, option: t }));
134
+ }
135
+ /**
136
+ * Radio-group semantics: the arrows move *and* select, wrapping at the ends
137
+ * and skipping disabled segments.
138
+ */
139
+ onKeyDown(t) {
140
+ const r = this.orientation === "vertical" ? "ArrowDown" : "ArrowRight", o = this.orientation === "vertical" ? "ArrowUp" : "ArrowLeft";
141
+ 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);
145
+ else if (t.key === "End")
146
+ e = this.options.length - 1 - [...this.options].reverse().findIndex((s) => !s.disabled);
147
+ else return;
148
+ 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());
153
+ }
154
+ 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;
161
+ }
162
+ }
163
+ render() {
164
+ const t = this.selectedIndex, r = t >= 0 ? t : this.options.findIndex((o) => !o.disabled);
165
+ return p`<div
166
+ part="base"
167
+ class=${h({
168
+ track: !0,
169
+ [this.size]: !0,
170
+ vertical: this.orientation === "vertical"
171
+ })}
172
+ role="radiogroup"
173
+ aria-label=${this.label || c}
174
+ aria-orientation=${this.orientation}
175
+ aria-disabled=${this.disabled ? "true" : c}
176
+ @keydown=${this.onKeyDown}
177
+ >
178
+ ${this.options.map((o, e) => {
179
+ const i = o.value === this.value, a = o.label ?? "", s = !!o.icon && a === "";
180
+ return p`<button
181
+ part="option"
182
+ type="button"
183
+ role="radio"
184
+ class=${h({
185
+ option: !0,
186
+ [this.size]: !0,
187
+ selected: i,
188
+ "icon-only": s
189
+ })}
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)}
195
+ >
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>`}
198
+ </button>`;
199
+ })}
200
+ </div>`;
201
+ }
202
+ }
203
+ l([
204
+ 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
+ export {
226
+ n as KtSegmentedControl
227
+ };
228
+ //# sourceMappingURL=kt-segmented-control.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,94 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ import '../../core/kt-icon/kt-icon.js';
4
+ import '../../core/kt-badge/kt-badge.js';
5
+ export interface KtNavItem {
6
+ readonly label: string;
7
+ readonly href?: string;
8
+ /** Lucide icon name. Conventionally only the top level carries one. */
9
+ readonly icon?: string;
10
+ /** A count or a short status, right-aligned. */
11
+ readonly badge?: string;
12
+ readonly active?: boolean;
13
+ readonly disabled?: boolean;
14
+ /** Nested items. Any depth: a branch is drawn exactly like the level above. */
15
+ readonly children?: readonly KtNavItem[];
16
+ /** Open on first render. A branch holding the active item opens regardless. */
17
+ readonly open?: boolean;
18
+ }
19
+ export interface KtNavSection {
20
+ readonly title?: string;
21
+ readonly items: readonly KtNavItem[];
22
+ }
23
+ /**
24
+ * The sidebar navigation: uppercase overline section titles over lists of
25
+ * links, to any depth.
26
+ *
27
+ * The recursion is the point. Every product grows a third level eventually —
28
+ * Settings holds Members holds Roles — and the usual answer is to hand-roll
29
+ * that one branch beside the component, which is how two navigation styles end
30
+ * up on one screen. Here a branch renders exactly like the level above it,
31
+ * indented by depth, and a branch containing the current page opens itself.
32
+ *
33
+ * @element kt-sub-menu-navigation
34
+ *
35
+ * @csspart nav - The `<nav>`.
36
+ * @csspart section - A section.
37
+ * @csspart title - A section title.
38
+ * @csspart item - A navigation link or branch button, at any depth.
39
+ *
40
+ * @fires kt-navigate - A link was activated. `detail: { item }`. Cancel it to
41
+ * keep the browser from following the href, for client-side routing.
42
+ * @fires kt-toggle - A branch opened or closed. `detail: { item, open }`.
43
+ *
44
+ * @example
45
+ * ```js
46
+ * nav.sections = [
47
+ * {
48
+ * title: 'Workspace',
49
+ * items: [
50
+ * { label: 'Home', href: '#/home', icon: 'house' },
51
+ * { label: 'Inbox', href: '#/inbox', icon: 'inbox', badge: '4' },
52
+ * {
53
+ * label: 'Settings',
54
+ * icon: 'settings',
55
+ * children: [
56
+ * { label: 'General', href: '#/settings/general' },
57
+ * { label: 'Members', href: '#/settings/members',
58
+ * children: [{ label: 'Roles', href: '#/settings/members/roles' }] },
59
+ * ],
60
+ * },
61
+ * ],
62
+ * },
63
+ * ];
64
+ * nav.activeHref = '#/settings/members/roles';
65
+ * ```
66
+ */
67
+ export declare class KtSubMenuNavigation extends KtElement {
68
+ static styles: import("lit").CSSResultGroup[];
69
+ sections: readonly KtNavSection[];
70
+ /** The href of the current page. Marks the matching link active. */
71
+ activeHref: string;
72
+ label: string;
73
+ /** Drops the card background, for a sidebar that owns its own surface. */
74
+ flush: boolean;
75
+ /** Icons only. Labels, badges and branches are hidden rather than clipped. */
76
+ collapsed: boolean;
77
+ /** Branch paths the reader has opened or closed, overriding the default. */
78
+ private overrides;
79
+ private isActive;
80
+ /** True when this item, or anything under it, is the current page. */
81
+ private holdsActive;
82
+ private isOpen;
83
+ private onSelect;
84
+ private onToggle;
85
+ /** Opens every branch down to `activeHref`. Called on the section list. */
86
+ private renderItems;
87
+ private renderItem;
88
+ render(): TemplateResult;
89
+ }
90
+ declare global {
91
+ interface HTMLElementTagNameMap {
92
+ 'kt-sub-menu-navigation': KtSubMenuNavigation;
93
+ }
94
+ }
@@ -0,0 +1,265 @@
1
+ import { css as y, html as a, nothing as n } from "lit";
2
+ import { property as c, state as x } from "lit/decorators.js";
3
+ import { classMap as f } from "lit/directives/class-map.js";
4
+ import { styleMap as $ } from "lit/directives/style-map.js";
5
+ import { K as b, d as k } from "../../../chunks/kt-element-CcMLO5e8.js";
6
+ import { e as g } from "../../../chunks/events-Bjl5Zmmq.js";
7
+ import "../../core/kt-icon/kt-icon.js";
8
+ import "../../core/kt-badge/kt-badge.js";
9
+ var w = Object.defineProperty, d = (p, e, t, o) => {
10
+ for (var r = void 0, i = p.length - 1, l; i >= 0; i--)
11
+ (l = p[i]) && (r = l(e, t, r) || r);
12
+ return r && w(e, t, r), r;
13
+ };
14
+ class s extends b {
15
+ constructor() {
16
+ super(...arguments), this.sections = [], this.activeHref = "", this.label = "Secondary navigation", this.flush = !1, this.collapsed = !1, this.overrides = {};
17
+ }
18
+ static {
19
+ this.styles = [
20
+ b.styles,
21
+ y`
22
+ :host {
23
+ display: block;
24
+ }
25
+
26
+ nav {
27
+ display: flex;
28
+ flex-direction: column;
29
+ gap: var(--gap-sub-menu);
30
+ padding: var(--padding-card);
31
+ background-color: var(--surface-card);
32
+ border-radius: var(--radius-sub-menu);
33
+ }
34
+
35
+ /* A full-height sidebar owns its own background; the card chrome would
36
+ be a panel inside a panel. */
37
+ :host([flush]) nav {
38
+ gap: 20px;
39
+ padding: 0;
40
+ background: none;
41
+ border-radius: 0;
42
+ }
43
+
44
+ .title {
45
+ margin: 0;
46
+ padding: 0 var(--nav-inset, 0) 6px;
47
+ color: var(--color-text-500);
48
+ font: var(--font-title-overline);
49
+ letter-spacing: var(--letter-spacing-overline);
50
+ text-transform: uppercase;
51
+ }
52
+
53
+ ul {
54
+ display: flex;
55
+ flex-direction: column;
56
+ gap: var(--gap-element);
57
+ margin: 0;
58
+ padding: 0;
59
+ list-style: none;
60
+ }
61
+
62
+ /* width: 100% matters on the branch rows: a <button> sizes to its content
63
+ even as a flex container, so a branch's hover and active fill stopped
64
+ at the end of its label while a link's ran the full row. */
65
+ .item {
66
+ position: relative;
67
+ display: flex;
68
+ box-sizing: border-box;
69
+ align-items: center;
70
+ width: 100%;
71
+ gap: 10px;
72
+ padding: var(--padding-sub-menu-item);
73
+ padding-left: calc(var(--nav-pad-left, 16px) + var(--depth, 0) * 20px);
74
+ color: var(--text-muted);
75
+ font: var(--font-normal-regular);
76
+ text-align: left;
77
+ text-decoration: none;
78
+ background: none;
79
+ border: none;
80
+ border-radius: var(--radius-input);
81
+ cursor: pointer;
82
+ }
83
+
84
+ .item:hover {
85
+ color: var(--text-body);
86
+ background-color: var(--surface-hover);
87
+ text-decoration: none;
88
+ }
89
+
90
+ .item:focus-visible {
91
+ outline: var(--outline-width) solid var(--color-primary-base);
92
+ outline-offset: -2px;
93
+ }
94
+
95
+ .item[aria-disabled='true'] {
96
+ color: var(--text-disabled);
97
+ pointer-events: none;
98
+ }
99
+
100
+ .active {
101
+ color: var(--color-primary-base);
102
+ background-color: var(--color-primary-soft);
103
+ }
104
+
105
+ .active:hover {
106
+ color: var(--color-primary-base);
107
+ background-color: var(--color-primary-soft);
108
+ }
109
+
110
+ /* The accent bar marks the current page without relying on the tint
111
+ alone, which is the part that survives a forced-colors mode. */
112
+ .active::before {
113
+ position: absolute;
114
+ top: 50%;
115
+ left: 0;
116
+ width: 3px;
117
+ height: 18px;
118
+ background: var(--color-primary-base);
119
+ border-radius: 0 var(--radius-full) var(--radius-full) 0;
120
+ transform: translateY(-50%);
121
+ content: '';
122
+ }
123
+
124
+ /* A branch is highlighted, not marked current: the page is below it. */
125
+ .within {
126
+ color: var(--text-body);
127
+ }
128
+
129
+ .label {
130
+ flex: 1;
131
+ overflow: hidden;
132
+ white-space: nowrap;
133
+ text-overflow: ellipsis;
134
+ }
135
+
136
+ .chevron {
137
+ flex: none;
138
+ color: var(--color-text-500);
139
+ transition: transform var(--duration-fast) var(--ease-standard);
140
+ }
141
+
142
+ .chevron.open {
143
+ transform: rotate(90deg);
144
+ }
145
+
146
+ kt-icon {
147
+ flex: none;
148
+ }
149
+
150
+ /* Collapsed: icons only. Hidden rather than clipped — a label sliced in
151
+ half at 48px reads as a bug, not as a narrow sidebar. */
152
+ :host([collapsed]) .title,
153
+ :host([collapsed]) .label,
154
+ :host([collapsed]) .chevron,
155
+ :host([collapsed]) kt-badge,
156
+ :host([collapsed]) .children {
157
+ display: none;
158
+ }
159
+
160
+ :host([collapsed]) .item {
161
+ justify-content: center;
162
+ padding-right: 0;
163
+ padding-left: 0;
164
+ }
165
+ `
166
+ ];
167
+ }
168
+ isActive(e) {
169
+ return e.active === !0 || this.activeHref !== "" && e.href === this.activeHref;
170
+ }
171
+ /** True when this item, or anything under it, is the current page. */
172
+ holdsActive(e) {
173
+ return this.isActive(e) ? !0 : (e.children ?? []).some((t) => this.holdsActive(t));
174
+ }
175
+ isOpen(e, t) {
176
+ return this.holdsActive(e) ? !0 : this.overrides[t] ?? e.open === !0;
177
+ }
178
+ onSelect(e, t) {
179
+ if (e.metaKey || e.ctrlKey || e.shiftKey || e.button !== 0) return;
180
+ g(this, "kt-navigate", { item: t }).defaultPrevented && e.preventDefault();
181
+ }
182
+ onToggle(e, t) {
183
+ const o = !this.isOpen(e, t);
184
+ this.overrides = { ...this.overrides, [t]: o }, g(this, "kt-toggle", { item: e, open: o });
185
+ }
186
+ /** Opens every branch down to `activeHref`. Called on the section list. */
187
+ renderItems(e, t, o) {
188
+ return a`<ul>
189
+ ${e.map((r, i) => this.renderItem(r, t, `${o}.${i}`))}
190
+ </ul>`;
191
+ }
192
+ renderItem(e, t, o) {
193
+ const r = (e.children ?? []).length > 0, i = this.isActive(e), l = r && this.isOpen(e, o), h = f({
194
+ item: !0,
195
+ active: i,
196
+ within: r && !i && this.holdsActive(e)
197
+ }), u = $({ "--depth": String(t) }), v = a`
198
+ ${e.icon ? a`<kt-icon name=${e.icon} size="16"></kt-icon>` : n}
199
+ <span class="label">${e.label}</span>
200
+ ${e.badge ? a`<kt-badge variant="count">${e.badge}</kt-badge>` : n}
201
+ ${r ? a`<kt-icon
202
+ class=${f({ chevron: !0, open: l })}
203
+ name="chevron-right"
204
+ size="14"
205
+ ></kt-icon>` : n}
206
+ `;
207
+ return a`<li>
208
+ ${r ? a`<button
209
+ part="item"
210
+ type="button"
211
+ class=${h}
212
+ style=${u}
213
+ aria-expanded=${l ? "true" : "false"}
214
+ aria-disabled=${e.disabled ? "true" : n}
215
+ @click=${() => this.onToggle(e, o)}
216
+ >
217
+ ${v}
218
+ </button>` : a`<a
219
+ part="item"
220
+ class=${h}
221
+ style=${u}
222
+ href=${e.href ?? "#"}
223
+ aria-current=${i ? "page" : n}
224
+ aria-disabled=${e.disabled ? "true" : n}
225
+ @click=${(m) => this.onSelect(m, e)}
226
+ >
227
+ ${v}
228
+ </a>`}
229
+ ${r && l ? a`<div class="children">${this.renderItems(e.children, t + 1, o)}</div>` : n}
230
+ </li>`;
231
+ }
232
+ render() {
233
+ return a`<nav part="nav" aria-label=${this.label}>
234
+ ${this.sections.map(
235
+ (e, t) => a`<div part="section">
236
+ ${e.title ? a`<h6 part="title" class="title">${e.title}</h6>` : n}
237
+ ${this.renderItems(e.items, 0, String(t))}
238
+ </div>`
239
+ )}
240
+ </nav>`;
241
+ }
242
+ }
243
+ d([
244
+ c({ attribute: !1 })
245
+ ], s.prototype, "sections");
246
+ d([
247
+ c({ type: String, attribute: "active-href" })
248
+ ], s.prototype, "activeHref");
249
+ d([
250
+ c({ type: String })
251
+ ], s.prototype, "label");
252
+ d([
253
+ c({ type: Boolean, reflect: !0 })
254
+ ], s.prototype, "flush");
255
+ d([
256
+ c({ type: Boolean, reflect: !0 })
257
+ ], s.prototype, "collapsed");
258
+ d([
259
+ x()
260
+ ], s.prototype, "overrides");
261
+ k("kt-sub-menu-navigation", s);
262
+ export {
263
+ s as KtSubMenuNavigation
264
+ };
265
+ //# sourceMappingURL=kt-sub-menu-navigation.js.map
@@ -0,0 +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":"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"}