kanto-ds 1.7.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/README.md +26 -14
  2. package/dist/AGENTS.md +157 -0
  3. package/dist/cdn/kanto.min.js +4743 -932
  4. package/dist/chunks/block-Cci-Kff_.js +69 -0
  5. package/dist/chunks/block-Cci-Kff_.js.map +1 -0
  6. package/dist/chunks/defaults-yhaR6U65.js +70 -0
  7. package/dist/chunks/{defaults-Cpeg13O5.js.map → defaults-yhaR6U65.js.map} +1 -1
  8. package/dist/chunks/heading-DsnZsfg-.js +21 -0
  9. package/dist/chunks/heading-DsnZsfg-.js.map +1 -0
  10. package/dist/chunks/{index-TWJzttLX.js → index-1ZFgagWW.js} +37 -12
  11. package/dist/chunks/index-1ZFgagWW.js.map +1 -0
  12. package/dist/chunks/indicator-B_Rs8F92.js +49 -0
  13. package/dist/chunks/indicator-B_Rs8F92.js.map +1 -0
  14. package/dist/chunks/{kt-calendar-CtwOby1R.js → kt-calendar-SK8eapuy.js} +3 -3
  15. package/dist/chunks/{kt-calendar-CtwOby1R.js.map → kt-calendar-SK8eapuy.js.map} +1 -1
  16. package/dist/chunks/kt-color-picker-BoezCAmx.js +365 -0
  17. package/dist/chunks/kt-color-picker-BoezCAmx.js.map +1 -0
  18. package/dist/chunks/{kt-element-T0VbIBNp.js → kt-element-DvWtPQ1Y.js} +2 -2
  19. package/dist/chunks/{kt-element-T0VbIBNp.js.map → kt-element-DvWtPQ1Y.js.map} +1 -1
  20. package/dist/chunks/motion-ChVUUO7O.js +28 -0
  21. package/dist/chunks/motion-ChVUUO7O.js.map +1 -0
  22. package/dist/chunks/numbers-QyecMiSJ.js +9 -0
  23. package/dist/chunks/numbers-QyecMiSJ.js.map +1 -0
  24. package/dist/chunks/{segmented-field-BBXR4XFL.js → segmented-field-T_Zo6lc1.js} +2 -2
  25. package/dist/chunks/{segmented-field-BBXR4XFL.js.map → segmented-field-T_Zo6lc1.js.map} +1 -1
  26. package/dist/chunks/{typed-date-CPAUNHzr.js → typed-date-CaU0kXoY.js} +2 -2
  27. package/dist/chunks/{typed-date-CPAUNHzr.js.map → typed-date-CaU0kXoY.js.map} +1 -1
  28. package/dist/components/blocks/kt-auth-form/kt-auth-form.d.ts +143 -0
  29. package/dist/components/blocks/kt-auth-form/kt-auth-form.js +368 -0
  30. package/dist/components/blocks/kt-auth-form/kt-auth-form.js.map +1 -0
  31. package/dist/components/blocks/kt-blog-post/kt-blog-post.d.ts +75 -0
  32. package/dist/components/blocks/kt-blog-post/kt-blog-post.js +285 -0
  33. package/dist/components/blocks/kt-blog-post/kt-blog-post.js.map +1 -0
  34. package/dist/components/blocks/kt-cta/kt-cta.d.ts +51 -0
  35. package/dist/components/blocks/kt-cta/kt-cta.js +126 -0
  36. package/dist/components/blocks/kt-cta/kt-cta.js.map +1 -0
  37. package/dist/components/blocks/kt-empty-page/kt-empty-page.d.ts +75 -0
  38. package/dist/components/blocks/kt-empty-page/kt-empty-page.js +245 -0
  39. package/dist/components/blocks/kt-empty-page/kt-empty-page.js.map +1 -0
  40. package/dist/components/blocks/kt-error-page/kt-error-page.d.ts +65 -0
  41. package/dist/components/blocks/kt-error-page/kt-error-page.js +177 -0
  42. package/dist/components/blocks/kt-error-page/kt-error-page.js.map +1 -0
  43. package/dist/components/blocks/kt-faq/kt-faq.d.ts +61 -0
  44. package/dist/components/blocks/kt-faq/kt-faq.js +129 -0
  45. package/dist/components/blocks/kt-faq/kt-faq.js.map +1 -0
  46. package/dist/components/blocks/kt-feature-grid/kt-feature-grid.d.ts +59 -0
  47. package/dist/components/blocks/kt-feature-grid/kt-feature-grid.js +166 -0
  48. package/dist/components/blocks/kt-feature-grid/kt-feature-grid.js.map +1 -0
  49. package/dist/components/blocks/kt-hero/kt-hero.d.ts +51 -0
  50. package/dist/components/blocks/kt-hero/kt-hero.js +138 -0
  51. package/dist/components/blocks/kt-hero/kt-hero.js.map +1 -0
  52. package/dist/components/blocks/kt-logo-cloud/kt-logo-cloud.d.ts +46 -0
  53. package/dist/components/blocks/kt-logo-cloud/kt-logo-cloud.js +100 -0
  54. package/dist/components/blocks/kt-logo-cloud/kt-logo-cloud.js.map +1 -0
  55. package/dist/components/blocks/kt-newsletter/kt-newsletter.d.ts +85 -0
  56. package/dist/components/blocks/kt-newsletter/kt-newsletter.js +247 -0
  57. package/dist/components/blocks/kt-newsletter/kt-newsletter.js.map +1 -0
  58. package/dist/components/blocks/kt-post-grid/kt-post-grid.d.ts +73 -0
  59. package/dist/components/blocks/kt-post-grid/kt-post-grid.js +249 -0
  60. package/dist/components/blocks/kt-post-grid/kt-post-grid.js.map +1 -0
  61. package/dist/components/blocks/kt-pricing-table/kt-pricing-table.d.ts +102 -0
  62. package/dist/components/blocks/kt-pricing-table/kt-pricing-table.js +307 -0
  63. package/dist/components/blocks/kt-pricing-table/kt-pricing-table.js.map +1 -0
  64. package/dist/components/blocks/kt-settings-section/kt-settings-section.d.ts +52 -0
  65. package/dist/components/blocks/kt-settings-section/kt-settings-section.js +158 -0
  66. package/dist/components/blocks/kt-settings-section/kt-settings-section.js.map +1 -0
  67. package/dist/components/blocks/kt-testimonials/kt-testimonials.d.ts +56 -0
  68. package/dist/components/blocks/kt-testimonials/kt-testimonials.js +161 -0
  69. package/dist/components/blocks/kt-testimonials/kt-testimonials.js.map +1 -0
  70. package/dist/components/core/kt-avatar/kt-avatar.js +2 -2
  71. package/dist/components/core/kt-avatar-group/kt-avatar-group.d.ts +42 -0
  72. package/dist/components/core/kt-avatar-group/kt-avatar-group.js +97 -0
  73. package/dist/components/core/kt-avatar-group/kt-avatar-group.js.map +1 -0
  74. package/dist/components/core/kt-badge/kt-badge.js +2 -2
  75. package/dist/components/core/kt-button/flights.d.ts +27 -0
  76. package/dist/components/core/kt-button/kt-button.d.ts +52 -1
  77. package/dist/components/core/kt-button/kt-button.js +353 -77
  78. package/dist/components/core/kt-button/kt-button.js.map +1 -1
  79. package/dist/components/core/kt-button/morph.d.ts +27 -0
  80. package/dist/components/core/kt-card/kt-card.js +1 -1
  81. package/dist/components/core/kt-code/kt-code.d.ts +2 -1
  82. package/dist/components/core/kt-code/kt-code.js +52 -37
  83. package/dist/components/core/kt-code/kt-code.js.map +1 -1
  84. package/dist/components/core/kt-copy-button/kt-copy-button.d.ts +47 -0
  85. package/dist/components/core/kt-copy-button/kt-copy-button.js +74 -0
  86. package/dist/components/core/kt-copy-button/kt-copy-button.js.map +1 -0
  87. package/dist/components/core/kt-icon/kt-icon.js +2 -2
  88. package/dist/components/core/kt-kbd/kt-kbd.js +1 -1
  89. package/dist/components/core/kt-split-button/kt-split-button.js +2 -2
  90. package/dist/components/data/kt-chart/kt-chart.js +2 -2
  91. package/dist/components/data/kt-chat-message/kt-chat-message.d.ts +60 -0
  92. package/dist/components/data/kt-chat-message/kt-chat-message.js +204 -0
  93. package/dist/components/data/kt-chat-message/kt-chat-message.js.map +1 -0
  94. package/dist/components/data/kt-description-list/kt-description-list.d.ts +56 -0
  95. package/dist/components/data/kt-description-list/kt-description-list.js +120 -0
  96. package/dist/components/data/kt-description-list/kt-description-list.js.map +1 -0
  97. package/dist/components/data/kt-meter/kt-meter.js +8 -6
  98. package/dist/components/data/kt-meter/kt-meter.js.map +1 -1
  99. package/dist/components/data/kt-pagination/kt-pagination.js +2 -2
  100. package/dist/components/data/kt-stat/kt-stat.d.ts +3 -1
  101. package/dist/components/data/kt-stat/kt-stat.js +31 -16
  102. package/dist/components/data/kt-stat/kt-stat.js.map +1 -1
  103. package/dist/components/data/kt-table/kt-table.js +2 -2
  104. package/dist/components/data/kt-timeline/kt-timeline.js +2 -2
  105. package/dist/components/data/kt-timeline/kt-timeline.js.map +1 -1
  106. package/dist/components/data/kt-tree/kt-tree.d.ts +69 -0
  107. package/dist/components/data/kt-tree/kt-tree.js +208 -0
  108. package/dist/components/data/kt-tree/kt-tree.js.map +1 -0
  109. package/dist/components/feedback/kt-alert/kt-alert.js +2 -2
  110. package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
  111. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +1 -1
  112. package/dist/components/feedback/kt-skeleton/kt-skeleton.js +1 -1
  113. package/dist/components/feedback/kt-toast/kt-toast.js +2 -2
  114. package/dist/components/feedback/kt-toast-container/kt-toast-container.d.ts +8 -1
  115. package/dist/components/feedback/kt-toast-container/kt-toast-container.js +65 -26
  116. package/dist/components/feedback/kt-toast-container/kt-toast-container.js.map +1 -1
  117. package/dist/components/feedback/kt-tooltip/kt-tooltip.js +1 -1
  118. package/dist/components/forms/kt-calendar/kt-calendar.js +3 -3
  119. package/dist/components/forms/kt-checkbox/kt-checkbox.d.ts +2 -0
  120. package/dist/components/forms/kt-checkbox/kt-checkbox.js +19 -8
  121. package/dist/components/forms/kt-checkbox/kt-checkbox.js.map +1 -1
  122. package/dist/components/forms/kt-color-picker/kt-color-picker.d.ts +66 -0
  123. package/dist/components/forms/kt-color-picker/kt-color-picker.js +14 -0
  124. package/dist/components/forms/kt-color-picker/kt-color-picker.js.map +1 -0
  125. package/dist/components/forms/kt-date-input/kt-date-input.js +5 -5
  126. package/dist/components/forms/kt-date-picker/kt-date-picker.js +4 -4
  127. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +2 -2
  128. package/dist/components/forms/kt-form/kt-form.js +2 -2
  129. package/dist/components/forms/kt-input/kt-input.js +2 -2
  130. package/dist/components/forms/kt-input-menu/kt-input-menu.js +2 -2
  131. package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
  132. package/dist/components/forms/kt-multi-select/kt-multi-select.js +2 -2
  133. package/dist/components/forms/kt-number-input/kt-number-input.d.ts +92 -0
  134. package/dist/components/forms/kt-number-input/kt-number-input.js +366 -0
  135. package/dist/components/forms/kt-number-input/kt-number-input.js.map +1 -0
  136. package/dist/components/forms/kt-otp-input/kt-otp-input.d.ts +74 -0
  137. package/dist/components/forms/kt-otp-input/kt-otp-input.js +232 -0
  138. package/dist/components/forms/kt-otp-input/kt-otp-input.js.map +1 -0
  139. package/dist/components/forms/kt-prompt-input/kt-prompt-input.d.ts +74 -0
  140. package/dist/components/forms/kt-prompt-input/kt-prompt-input.js +213 -0
  141. package/dist/components/forms/kt-prompt-input/kt-prompt-input.js.map +1 -0
  142. package/dist/components/forms/kt-radio-group/kt-radio-group.js +2 -2
  143. package/dist/components/forms/kt-select/kt-select.js +2 -2
  144. package/dist/components/forms/kt-slider/kt-slider.d.ts +69 -0
  145. package/dist/components/forms/kt-slider/kt-slider.js +252 -0
  146. package/dist/components/forms/kt-slider/kt-slider.js.map +1 -0
  147. package/dist/components/forms/kt-textarea/kt-textarea.js +2 -2
  148. package/dist/components/forms/kt-time-input/kt-time-input.js +3 -3
  149. package/dist/components/forms/kt-toggle/kt-toggle.js +1 -1
  150. package/dist/components/navigation/kt-app-shell/kt-app-shell.d.ts +85 -0
  151. package/dist/components/navigation/kt-app-shell/kt-app-shell.js +220 -0
  152. package/dist/components/navigation/kt-app-shell/kt-app-shell.js.map +1 -0
  153. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +2 -2
  154. package/dist/components/navigation/kt-footer/kt-footer.d.ts +82 -0
  155. package/dist/components/navigation/kt-footer/kt-footer.js +220 -0
  156. package/dist/components/navigation/kt-footer/kt-footer.js.map +1 -0
  157. package/dist/components/navigation/kt-header/kt-header.js +2 -2
  158. package/dist/components/navigation/kt-page-header/kt-page-header.js +2 -2
  159. package/dist/components/navigation/kt-page-header/kt-page-header.js.map +1 -1
  160. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.d.ts +1 -0
  161. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +81 -44
  162. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -1
  163. package/dist/components/navigation/kt-steps/kt-steps.d.ts +68 -0
  164. package/dist/components/navigation/kt-steps/kt-steps.js +286 -0
  165. package/dist/components/navigation/kt-steps/kt-steps.js.map +1 -0
  166. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +3 -3
  167. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js.map +1 -1
  168. package/dist/components/navigation/kt-tabs/kt-tabs.d.ts +1 -0
  169. package/dist/components/navigation/kt-tabs/kt-tabs.js +92 -64
  170. package/dist/components/navigation/kt-tabs/kt-tabs.js.map +1 -1
  171. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +1 -1
  172. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +2 -2
  173. package/dist/components/navigation/kt-user-menu/kt-user-menu.d.ts +86 -0
  174. package/dist/components/navigation/kt-user-menu/kt-user-menu.js +298 -0
  175. package/dist/components/navigation/kt-user-menu/kt-user-menu.js.map +1 -0
  176. package/dist/components/overlays/kt-accordion/kt-accordion.d.ts +47 -0
  177. package/dist/components/overlays/kt-accordion/kt-accordion.js +80 -0
  178. package/dist/components/overlays/kt-accordion/kt-accordion.js.map +1 -0
  179. package/dist/components/overlays/kt-collapsible/kt-collapsible.d.ts +17 -1
  180. package/dist/components/overlays/kt-collapsible/kt-collapsible.js +87 -32
  181. package/dist/components/overlays/kt-collapsible/kt-collapsible.js.map +1 -1
  182. package/dist/components/overlays/kt-command-palette/kt-command-palette.d.ts +87 -0
  183. package/dist/components/overlays/kt-command-palette/kt-command-palette.js +370 -0
  184. package/dist/components/overlays/kt-command-palette/kt-command-palette.js.map +1 -0
  185. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +2 -2
  186. package/dist/components/overlays/kt-dropdown/kt-dropdown.js +2 -2
  187. package/dist/components/overlays/kt-modal/kt-modal.js +2 -2
  188. package/dist/components/overlays/kt-side-panel/kt-side-panel.js +2 -2
  189. package/dist/components/overlays/kt-tour/kt-tour.d.ts +77 -0
  190. package/dist/components/overlays/kt-tour/kt-tour.js +200 -0
  191. package/dist/components/overlays/kt-tour/kt-tour.js.map +1 -0
  192. package/dist/custom-elements.json +16427 -8061
  193. package/dist/docs/kt-accordion.md +49 -0
  194. package/dist/docs/kt-app-shell.md +89 -0
  195. package/dist/docs/kt-auth-form.md +111 -0
  196. package/dist/docs/kt-avatar-group.md +49 -0
  197. package/dist/docs/kt-blog-post.md +77 -0
  198. package/dist/docs/kt-button.md +21 -0
  199. package/dist/docs/kt-chat-message.md +68 -0
  200. package/dist/docs/kt-color-picker.md +67 -0
  201. package/dist/docs/kt-command-palette.md +99 -0
  202. package/dist/docs/kt-copy-button.md +50 -0
  203. package/dist/docs/kt-cta.md +45 -0
  204. package/dist/docs/kt-description-list.md +58 -0
  205. package/dist/docs/kt-empty-page.md +92 -0
  206. package/dist/docs/kt-error-page.md +64 -0
  207. package/dist/docs/kt-faq.md +54 -0
  208. package/dist/docs/kt-feature-grid.md +53 -0
  209. package/dist/docs/kt-footer.md +115 -0
  210. package/dist/docs/kt-hero.md +53 -0
  211. package/dist/docs/kt-logo-cloud.md +41 -0
  212. package/dist/docs/kt-newsletter.md +69 -0
  213. package/dist/docs/kt-number-input.md +77 -0
  214. package/dist/docs/kt-otp-input.md +68 -0
  215. package/dist/docs/kt-post-grid.md +66 -0
  216. package/dist/docs/kt-pricing-table.md +101 -0
  217. package/dist/docs/kt-prompt-input.md +86 -0
  218. package/dist/docs/kt-settings-section.md +65 -0
  219. package/dist/docs/kt-slider.md +76 -0
  220. package/dist/docs/kt-steps.md +79 -0
  221. package/dist/docs/kt-testimonials.md +52 -0
  222. package/dist/docs/kt-tour.md +75 -0
  223. package/dist/docs/kt-tree.md +83 -0
  224. package/dist/docs/kt-user-menu.md +77 -0
  225. package/dist/icons/defaults.d.ts +2 -0
  226. package/dist/icons/index.js +1 -1
  227. package/dist/index.d.ts +56 -0
  228. package/dist/index.js +225 -284
  229. package/dist/index.js.map +1 -1
  230. package/dist/internal/block.d.ts +23 -0
  231. package/dist/internal/command-search.d.ts +27 -0
  232. package/dist/internal/heading.d.ts +8 -0
  233. package/dist/internal/indicator.d.ts +34 -0
  234. package/dist/internal/motion.d.ts +25 -0
  235. package/dist/internal/numbers.d.ts +2 -0
  236. package/dist/internal/strings.d.ts +36 -0
  237. package/dist/react/index.d.ts +165 -0
  238. package/dist/react/index.js +420 -171
  239. package/dist/react/index.js.map +1 -1
  240. package/dist/react/jsx.d.ts +128 -1
  241. package/dist/strings/index.js +1 -1
  242. package/dist/tokens/base.css +35 -2
  243. package/dist/vscode.css-custom-data.json +165 -19
  244. package/dist/vscode.html-custom-data.json +1023 -149
  245. package/dist/vue/index.d.ts +62 -0
  246. package/dist/vue/index.js +39 -8
  247. package/dist/vue/index.js.map +1 -1
  248. package/dist/web-types.json +3238 -836
  249. package/package.json +128 -3
  250. package/dist/chunks/defaults-Cpeg13O5.js +0 -68
  251. package/dist/chunks/index-TWJzttLX.js.map +0 -1
@@ -0,0 +1,220 @@
1
+ import { css as c, nothing as m, html as s } from "lit";
2
+ import { property as o, state as g, query as b } from "lit/decorators.js";
3
+ import { K as p, d as v } from "../../../chunks/kt-element-DvWtPQ1Y.js";
4
+ import { u, e as h } from "../../../chunks/events-r51msXNf.js";
5
+ import { s as f } from "../../../chunks/index-1ZFgagWW.js";
6
+ import "../../core/kt-button/kt-button.js";
7
+ var w = Object.defineProperty, a = (n, e, r, k) => {
8
+ for (var i = void 0, l = n.length - 1, d; l >= 0; l--)
9
+ (d = n[l]) && (i = d(e, r, i) || i);
10
+ return i && w(e, r, i), i;
11
+ };
12
+ class t extends p {
13
+ constructor() {
14
+ super(...arguments), this.collapsed = !1, this.sidebarOpen = !1, this.breakpoint = 900, this.noToggle = !1, this.noLandmarks = !1, this.label = "", this.narrow = !1, this.sidebarId = u("kt-app-shell-sidebar"), this.observer = null, this.onKeyDown = (e) => {
15
+ e.key === "Escape" && this.narrow && this.sidebarOpen && (e.preventDefault(), this.closeDrawer());
16
+ };
17
+ }
18
+ static {
19
+ this.styles = [
20
+ p.styles,
21
+ c`
22
+ :host {
23
+ display: block;
24
+ height: 100%;
25
+ --kt-app-shell-sidebar-width: 240px;
26
+ --kt-app-shell-rail-width: 64px;
27
+ --kt-app-shell-header-height: 56px;
28
+ }
29
+
30
+ .shell {
31
+ position: relative;
32
+ display: grid;
33
+ grid-template:
34
+ 'header header' auto
35
+ 'sidebar main' minmax(0, 1fr)
36
+ / var(--kt-app-shell-sidebar-width) minmax(0, 1fr);
37
+ height: 100%;
38
+ overflow: hidden;
39
+ color: var(--text-body);
40
+ background: var(--surface-page);
41
+ transition: grid-template-columns var(--duration-normal) var(--easing-standard);
42
+ }
43
+ :host([collapsed]:not([narrow])) .shell {
44
+ grid-template-columns: var(--kt-app-shell-rail-width) minmax(0, 1fr);
45
+ }
46
+
47
+ .header {
48
+ grid-area: header;
49
+ display: flex;
50
+ align-items: center;
51
+ gap: var(--gap-form);
52
+ min-height: var(--kt-app-shell-header-height);
53
+ padding: 0 var(--padding-form);
54
+ border-bottom: var(--border-width) solid var(--border-subtle);
55
+ }
56
+ .header-content {
57
+ display: flex;
58
+ flex: 1;
59
+ align-items: center;
60
+ gap: var(--gap-form);
61
+ min-width: 0;
62
+ }
63
+
64
+ .sidebar {
65
+ grid-area: sidebar;
66
+ min-width: 0;
67
+ overflow: hidden auto;
68
+ background: var(--surface-page);
69
+ border-right: var(--border-width) solid var(--border-subtle);
70
+ outline: none;
71
+ }
72
+
73
+ .main {
74
+ grid-area: main;
75
+ min-width: 0;
76
+ overflow: auto;
77
+ }
78
+
79
+ .backdrop {
80
+ display: none;
81
+ }
82
+
83
+ /* === Narrow: the sidebar is a drawer over the content === */
84
+ :host([narrow]) .shell {
85
+ grid-template:
86
+ 'header' auto
87
+ 'main' minmax(0, 1fr)
88
+ / minmax(0, 1fr);
89
+ }
90
+ :host([narrow]) .sidebar {
91
+ position: absolute;
92
+ top: 0;
93
+ bottom: 0;
94
+ left: 0;
95
+ z-index: 2;
96
+ width: min(var(--kt-app-shell-sidebar-width), 85%);
97
+ box-shadow: var(--shadow-popover);
98
+ translate: -100% 0;
99
+ visibility: hidden;
100
+ transition:
101
+ translate var(--duration-normal) var(--easing-standard),
102
+ visibility 0s linear var(--duration-normal);
103
+ }
104
+ :host([narrow][sidebar-open]) .sidebar {
105
+ translate: 0 0;
106
+ visibility: visible;
107
+ transition: translate var(--duration-normal) var(--easing-standard);
108
+ }
109
+ :host([narrow][sidebar-open]) .backdrop {
110
+ position: absolute;
111
+ inset: 0;
112
+ z-index: 1;
113
+ display: block;
114
+ background: var(--color-backdrop);
115
+ }
116
+ `
117
+ ];
118
+ }
119
+ connectedCallback() {
120
+ super.connectedCallback(), this.addEventListener("keydown", this.onKeyDown), typeof ResizeObserver == "function" && (this.observer = new ResizeObserver(([e]) => {
121
+ e && this.measure(e.contentRect.width);
122
+ }), this.observer.observe(this));
123
+ }
124
+ disconnectedCallback() {
125
+ super.disconnectedCallback(), this.removeEventListener("keydown", this.onKeyDown), this.observer?.disconnect(), this.observer = null;
126
+ }
127
+ measure(e) {
128
+ const r = e > 0 && e < this.breakpoint;
129
+ r !== this.narrow && (this.narrow = r, r || (this.sidebarOpen = !1));
130
+ }
131
+ /** Whether the sidebar shows: expanded when wide, open when narrow. */
132
+ get open() {
133
+ return this.narrow ? this.sidebarOpen : !this.collapsed;
134
+ }
135
+ /** Opens or closes the sidebar, as its toggle does. */
136
+ toggleSidebar() {
137
+ this.narrow ? this.sidebarOpen = !this.sidebarOpen : this.collapsed = !this.collapsed, h(this, "kt-sidebar-toggle", { open: this.open });
138
+ }
139
+ closeDrawer() {
140
+ !this.narrow || !this.sidebarOpen || (this.sidebarOpen = !1, h(this, "kt-sidebar-toggle", { open: !1 }));
141
+ }
142
+ willUpdate(e) {
143
+ e.has("breakpoint") && this.measure(this.getBoundingClientRect().width);
144
+ }
145
+ // `narrow` is private, so the map is read untyped.
146
+ updated(e) {
147
+ super.updated(e), this.toggleAttribute("narrow", this.narrow), !(!e.has("sidebarOpen") || !this.narrow) && (this.sidebarOpen ? this.aside.focus() : e.get("sidebarOpen") === !0 && this.toggle?.focus());
148
+ }
149
+ render() {
150
+ const e = this.label || f().sidebar;
151
+ return s`<div class="shell">
152
+ <div part="header" class="header">
153
+ ${this.noToggle ? m : s`<kt-button
154
+ part="toggle"
155
+ class="toggle"
156
+ variant="secondary-no-bg"
157
+ size="small"
158
+ icon=${this.narrow ? "menu" : "panel-left"}
159
+ label=${e}
160
+ aria-controls=${this.sidebarId}
161
+ aria-expanded=${this.open ? "true" : "false"}
162
+ @click=${() => this.toggleSidebar()}
163
+ ></kt-button>`}
164
+ <div class="header-content"><slot name="header"></slot></div>
165
+ </div>
166
+ ${this.noLandmarks ? s`<div
167
+ part="sidebar"
168
+ class="sidebar"
169
+ id=${this.sidebarId}
170
+ tabindex="-1"
171
+ ?inert=${this.narrow && !this.sidebarOpen}
172
+ >
173
+ <slot name="sidebar"></slot>
174
+ </div>` : s`<aside
175
+ part="sidebar"
176
+ class="sidebar"
177
+ id=${this.sidebarId}
178
+ aria-label=${e}
179
+ tabindex="-1"
180
+ ?inert=${this.narrow && !this.sidebarOpen}
181
+ >
182
+ <slot name="sidebar"></slot>
183
+ </aside>`}
184
+ <div class="backdrop" @click=${() => this.closeDrawer()}></div>
185
+ ${this.noLandmarks ? s`<div part="main" class="main"><slot></slot></div>` : s`<main part="main" class="main"><slot></slot></main>`}
186
+ </div>`;
187
+ }
188
+ }
189
+ a([
190
+ o({ type: Boolean, reflect: !0 })
191
+ ], t.prototype, "collapsed");
192
+ a([
193
+ o({ type: Boolean, reflect: !0, attribute: "sidebar-open" })
194
+ ], t.prototype, "sidebarOpen");
195
+ a([
196
+ o({ type: Number })
197
+ ], t.prototype, "breakpoint");
198
+ a([
199
+ o({ type: Boolean, attribute: "no-toggle" })
200
+ ], t.prototype, "noToggle");
201
+ a([
202
+ o({ type: Boolean, attribute: "no-landmarks" })
203
+ ], t.prototype, "noLandmarks");
204
+ a([
205
+ o({ type: String })
206
+ ], t.prototype, "label");
207
+ a([
208
+ g()
209
+ ], t.prototype, "narrow");
210
+ a([
211
+ b(".sidebar")
212
+ ], t.prototype, "aside");
213
+ a([
214
+ b(".toggle")
215
+ ], t.prototype, "toggle");
216
+ v("kt-app-shell", t);
217
+ export {
218
+ t as KtAppShell
219
+ };
220
+ //# sourceMappingURL=kt-app-shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-app-shell.js","sources":["../../../../src/components/navigation/kt-app-shell/kt-app-shell.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit, uniqueId } from '#internal/events';\nimport { strings } from '#internal/strings';\nimport '../../core/kt-button/kt-button.js';\n\n/**\n * The frame of an application: a header along the top, a sidebar down the\n * side, and the content, which scrolls on its own.\n *\n * Wide, the sidebar sits beside the content, and its toggle narrows it to a\n * rail (`collapsed`). Narrower than `breakpoint` — measured on the shell\n * itself, not the viewport — the sidebar leaves the layout: the toggle opens\n * it as a drawer over the content, behind a backdrop, closed by Escape or a\n * click outside. A closed drawer is inert, so Tab never wanders into it.\n *\n * The shell fills its container's height; give the container one —\n * `height: 100dvh` on a page, a fixed height in a preview.\n *\n * @element kt-app-shell\n *\n * @slot header - The top bar: a wordmark, a search, an account menu.\n * @slot sidebar - Down the side: the application's navigation.\n * @slot - The content.\n *\n * @csspart header - The top bar.\n * @csspart sidebar - The `<aside>`.\n * @csspart main - The `<main>`.\n * @csspart toggle - The sidebar's toggle.\n *\n * @cssproperty --kt-app-shell-sidebar-width - The sidebar's width. 240px.\n * @cssproperty --kt-app-shell-rail-width - Its width when collapsed. 64px.\n * @cssproperty --kt-app-shell-header-height - The top bar's height. 56px.\n *\n * @fires kt-sidebar-toggle - The sidebar opened or closed — collapsed or\n * expanded when wide, the drawer when narrow. `detail: { open }`.\n *\n * @example\n * ```html\n * <kt-app-shell style=\"height: 100dvh\">\n * <a slot=\"header\" href=\"/\">Northwind</a>\n * <kt-sub-menu-navigation slot=\"sidebar\"></kt-sub-menu-navigation>\n * <h1>Overview</h1>\n * </kt-app-shell>\n * ```\n */\nexport class KtAppShell extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n height: 100%;\n --kt-app-shell-sidebar-width: 240px;\n --kt-app-shell-rail-width: 64px;\n --kt-app-shell-header-height: 56px;\n }\n\n .shell {\n position: relative;\n display: grid;\n grid-template:\n 'header header' auto\n 'sidebar main' minmax(0, 1fr)\n / var(--kt-app-shell-sidebar-width) minmax(0, 1fr);\n height: 100%;\n overflow: hidden;\n color: var(--text-body);\n background: var(--surface-page);\n transition: grid-template-columns var(--duration-normal) var(--easing-standard);\n }\n :host([collapsed]:not([narrow])) .shell {\n grid-template-columns: var(--kt-app-shell-rail-width) minmax(0, 1fr);\n }\n\n .header {\n grid-area: header;\n display: flex;\n align-items: center;\n gap: var(--gap-form);\n min-height: var(--kt-app-shell-header-height);\n padding: 0 var(--padding-form);\n border-bottom: var(--border-width) solid var(--border-subtle);\n }\n .header-content {\n display: flex;\n flex: 1;\n align-items: center;\n gap: var(--gap-form);\n min-width: 0;\n }\n\n .sidebar {\n grid-area: sidebar;\n min-width: 0;\n overflow: hidden auto;\n background: var(--surface-page);\n border-right: var(--border-width) solid var(--border-subtle);\n outline: none;\n }\n\n .main {\n grid-area: main;\n min-width: 0;\n overflow: auto;\n }\n\n .backdrop {\n display: none;\n }\n\n /* === Narrow: the sidebar is a drawer over the content === */\n :host([narrow]) .shell {\n grid-template:\n 'header' auto\n 'main' minmax(0, 1fr)\n / minmax(0, 1fr);\n }\n :host([narrow]) .sidebar {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n z-index: 2;\n width: min(var(--kt-app-shell-sidebar-width), 85%);\n box-shadow: var(--shadow-popover);\n translate: -100% 0;\n visibility: hidden;\n transition:\n translate var(--duration-normal) var(--easing-standard),\n visibility 0s linear var(--duration-normal);\n }\n :host([narrow][sidebar-open]) .sidebar {\n translate: 0 0;\n visibility: visible;\n transition: translate var(--duration-normal) var(--easing-standard);\n }\n :host([narrow][sidebar-open]) .backdrop {\n position: absolute;\n inset: 0;\n z-index: 1;\n display: block;\n background: var(--color-backdrop);\n }\n `,\n ];\n\n /** Wide: the sidebar narrowed to a rail. */\n @property({ type: Boolean, reflect: true })\n collapsed = false;\n\n /** Narrow: the sidebar open as a drawer. */\n @property({ type: Boolean, reflect: true, attribute: 'sidebar-open' })\n sidebarOpen = false;\n\n /** Below this width, in pixels of the shell itself, the sidebar becomes a drawer. */\n @property({ type: Number })\n breakpoint = 900;\n\n /** Leaves the toggle out, for a header that brings its own. */\n @property({ type: Boolean, attribute: 'no-toggle' })\n noToggle = false;\n\n /**\n * Draws the sidebar and the content as plain boxes rather than an \\`<aside>\\`\n * and a \\`<main>\\` — for a shell shown inside a page that has its own, a\n * preview or a demo, where a second main landmark would be wrong.\n */\n @property({ type: Boolean, attribute: 'no-landmarks' })\n noLandmarks = false;\n\n /** Accessible name for the sidebar. Defaults to the translated \"Sidebar\". */\n @property({ type: String })\n label = '';\n\n /** Narrower than `breakpoint`: reflected as the `narrow` attribute, for styling. */\n @state() private narrow = false;\n\n @query('.sidebar') private aside!: HTMLElement;\n @query('.toggle') private toggle?: HTMLElement;\n\n private readonly sidebarId = uniqueId('kt-app-shell-sidebar');\n private observer: ResizeObserver | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('keydown', this.onKeyDown);\n if (typeof ResizeObserver === 'function') {\n this.observer = new ResizeObserver(([entry]) => {\n if (entry) this.measure(entry.contentRect.width);\n });\n this.observer.observe(this);\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('keydown', this.onKeyDown);\n this.observer?.disconnect();\n this.observer = null;\n }\n\n private measure(width: number): void {\n const narrow = width > 0 && width < this.breakpoint;\n if (narrow === this.narrow) return;\n this.narrow = narrow;\n if (!narrow) this.sidebarOpen = false;\n }\n\n /** Whether the sidebar shows: expanded when wide, open when narrow. */\n private get open(): boolean {\n return this.narrow ? this.sidebarOpen : !this.collapsed;\n }\n\n /** Opens or closes the sidebar, as its toggle does. */\n toggleSidebar(): void {\n if (this.narrow) this.sidebarOpen = !this.sidebarOpen;\n else this.collapsed = !this.collapsed;\n emit(this, 'kt-sidebar-toggle', { open: this.open });\n }\n\n private closeDrawer(): void {\n if (!this.narrow || !this.sidebarOpen) return;\n this.sidebarOpen = false;\n emit(this, 'kt-sidebar-toggle', { open: false });\n }\n\n private onKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.narrow && this.sidebarOpen) {\n event.preventDefault();\n this.closeDrawer();\n }\n };\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('breakpoint')) this.measure(this.getBoundingClientRect().width);\n }\n\n // `narrow` is private, so the map is read untyped.\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n this.toggleAttribute('narrow', this.narrow);\n if (!changed.has('sidebarOpen') || !this.narrow) return;\n // The drawer takes the focus as it opens, and gives it back as it closes.\n if (this.sidebarOpen) this.aside.focus();\n else if (changed.get('sidebarOpen') === true) this.toggle?.focus();\n }\n\n override render(): TemplateResult {\n const label = this.label || strings().sidebar;\n return html`<div class=\"shell\">\n <div part=\"header\" class=\"header\">\n ${\n this.noToggle\n ? nothing\n : html`<kt-button\n part=\"toggle\"\n class=\"toggle\"\n variant=\"secondary-no-bg\"\n size=\"small\"\n icon=${this.narrow ? 'menu' : 'panel-left'}\n label=${label}\n aria-controls=${this.sidebarId}\n aria-expanded=${this.open ? 'true' : 'false'}\n @click=${() => this.toggleSidebar()}\n ></kt-button>`\n }\n <div class=\"header-content\"><slot name=\"header\"></slot></div>\n </div>\n ${\n this.noLandmarks\n ? html`<div\n part=\"sidebar\"\n class=\"sidebar\"\n id=${this.sidebarId}\n tabindex=\"-1\"\n ?inert=${this.narrow && !this.sidebarOpen}\n >\n <slot name=\"sidebar\"></slot>\n </div>`\n : html`<aside\n part=\"sidebar\"\n class=\"sidebar\"\n id=${this.sidebarId}\n aria-label=${label}\n tabindex=\"-1\"\n ?inert=${this.narrow && !this.sidebarOpen}\n >\n <slot name=\"sidebar\"></slot>\n </aside>`\n }\n <div class=\"backdrop\" @click=${() => this.closeDrawer()}></div>\n ${\n this.noLandmarks\n ? html`<div part=\"main\" class=\"main\"><slot></slot></div>`\n : html`<main part=\"main\" class=\"main\"><slot></slot></main>`\n }\n </div>`;\n }\n}\n\ndefineElement('kt-app-shell', KtAppShell);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-app-shell': KtAppShell;\n }\n}\n"],"names":["KtAppShell","KtElement","uniqueId","event","css","entry","width","narrow","emit","changed","label","strings","html","nothing","__decorateClass","property","state","query","defineElement"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { css as d, nothing as f, html as s } from "lit";
2
2
  import { property as c } from "lit/decorators.js";
3
- import { K as p, d as u } from "../../../chunks/kt-element-T0VbIBNp.js";
3
+ import { K as p, d as u } from "../../../chunks/kt-element-DvWtPQ1Y.js";
4
4
  import { e as h } from "../../../chunks/events-r51msXNf.js";
5
- import { s as v } from "../../../chunks/index-TWJzttLX.js";
5
+ import { s as v } from "../../../chunks/index-1ZFgagWW.js";
6
6
  import "../../core/kt-icon/kt-icon.js";
7
7
  var b = Object.defineProperty, m = (o, t, e, a) => {
8
8
  for (var r = void 0, i = o.length - 1, l; i >= 0; i--)
@@ -0,0 +1,82 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ import '../../core/kt-icon/kt-icon.js';
4
+ export interface KtFooterLink {
5
+ readonly label: string;
6
+ readonly href: string;
7
+ /** Leaves the site: marked with an icon, and given `rel="noopener"`. */
8
+ readonly external?: boolean;
9
+ }
10
+ export interface KtFooterColumn {
11
+ readonly heading: string;
12
+ readonly links: readonly KtFooterLink[];
13
+ }
14
+ export type KtFooterVariant = 'columns' | 'simple';
15
+ /**
16
+ * The site footer: a contentinfo landmark holding the brand and a word about
17
+ * the product, columns of links, actions, and a legal line under them.
18
+ *
19
+ * The columns are data — `footer.columns = [{ heading, links }]` — so they are
20
+ * laid out, named and marked alike; the brand, the actions and the legal line
21
+ * are slots, for whatever a product puts there. It lays itself out from its
22
+ * own width, not the viewport's: in a narrow panel it stacks as on a phone.
23
+ *
24
+ * `variant="simple"` is a single row — the brand, the links run together, the
25
+ * actions — for a page that needs a footer rather than a site map.
26
+ *
27
+ * @element kt-footer
28
+ *
29
+ * @slot brand - Logo or wordmark.
30
+ * @slot - A word under the brand: what the product is.
31
+ * @slot actions - Buttons and links under it — social links, a newsletter form.
32
+ * @slot legal - The bottom line: copyright, terms, privacy. Its row is left out while empty.
33
+ *
34
+ * @csspart base - The `<footer>`.
35
+ * @csspart brand - The brand, its text and the actions.
36
+ * @csspart columns - The navigation holding the columns.
37
+ * @csspart column - One column.
38
+ * @csspart bottom - The legal row.
39
+ *
40
+ * @cssproperty --kt-footer-max-width - How wide the content runs. None by default.
41
+ * @cssproperty --kt-footer-padding-inline - The space at its sides. The card padding by default;
42
+ * zero lines it up with a page's content when the page already has its own.
43
+ *
44
+ * @example
45
+ * ```html
46
+ * <kt-footer label="Site">
47
+ * <a slot="brand" href="/">ACME</a>
48
+ * Invoicing for small teams.
49
+ * <span slot="legal">© 2026 Acme</span>
50
+ * </kt-footer>
51
+ * <script>
52
+ * footer.columns = [
53
+ * { heading: 'Product', links: [{ label: 'Pricing', href: '/pricing' }] },
54
+ * { heading: 'Company', links: [{ label: 'GitHub', href: 'https://github.com/acme', external: true }] },
55
+ * ];
56
+ * </script>
57
+ * ```
58
+ */
59
+ export declare class KtFooter extends KtElement {
60
+ static styles: import("lit").CSSResultGroup[];
61
+ /** The columns of links. Set as a property: `footer.columns = [...]`. */
62
+ columns: readonly KtFooterColumn[];
63
+ /** `columns`: a heading over each list. `simple`: one row of links. */
64
+ variant: KtFooterVariant;
65
+ /** A rule along the top. */
66
+ bordered: boolean;
67
+ /** The level of the column headings, 2 to 6. */
68
+ headingLevel: number;
69
+ /** Accessible name for the footer and its navigation. */
70
+ label: string;
71
+ private hasLegal;
72
+ /** The first slotchange can land after the first render; read the slot once as well. */
73
+ firstUpdated(): void;
74
+ private readLegal;
75
+ private link;
76
+ render(): TemplateResult;
77
+ }
78
+ declare global {
79
+ interface HTMLElementTagNameMap {
80
+ 'kt-footer': KtFooter;
81
+ }
82
+ }
@@ -0,0 +1,220 @@
1
+ import { css as g, nothing as i, html as n } from "lit";
2
+ import { property as l, state as h } from "lit/decorators.js";
3
+ import { K as c, d as v } from "../../../chunks/kt-element-DvWtPQ1Y.js";
4
+ import { h as u } from "../../../chunks/slots-BPbIdxAJ.js";
5
+ import { h as f } from "../../../chunks/heading-DsnZsfg-.js";
6
+ import "../../core/kt-icon/kt-icon.js";
7
+ var b = Object.defineProperty, r = (s, a, o, p) => {
8
+ for (var e = void 0, d = s.length - 1, m; d >= 0; d--)
9
+ (m = s[d]) && (e = m(a, o, e) || e);
10
+ return e && b(a, o, e), e;
11
+ };
12
+ class t extends c {
13
+ constructor() {
14
+ super(...arguments), this.columns = [], this.variant = "columns", this.bordered = !0, this.headingLevel = 2, this.label = "", this.hasLegal = !1;
15
+ }
16
+ static {
17
+ this.styles = [
18
+ c.styles,
19
+ g`
20
+ :host {
21
+ display: block;
22
+ container-type: inline-size;
23
+ --kt-footer-max-width: none;
24
+ --kt-footer-padding-inline: var(--padding-card);
25
+ }
26
+
27
+ footer {
28
+ color: var(--text-muted);
29
+ font: var(--font-normal-regular);
30
+ background-color: var(--surface-page);
31
+ }
32
+ :host([bordered]) footer {
33
+ border-top: var(--border-width) solid var(--border-subtle);
34
+ }
35
+
36
+ .inner {
37
+ max-width: var(--kt-footer-max-width);
38
+ margin: 0 auto;
39
+ padding: calc(var(--padding-card) * 2) var(--kt-footer-padding-inline);
40
+ }
41
+
42
+ /* Stacked by default — a phone, a narrow panel — and side by side once
43
+ the footer itself is wide enough. */
44
+ .top {
45
+ display: grid;
46
+ gap: calc(var(--gap-card) * 2);
47
+ }
48
+ @container (min-width: 720px) {
49
+ .top {
50
+ grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
51
+ }
52
+ }
53
+
54
+ .brand {
55
+ display: grid;
56
+ gap: var(--gap-form);
57
+ align-content: start;
58
+ }
59
+ .brand-mark {
60
+ display: flex;
61
+ align-items: center;
62
+ gap: var(--gap-button);
63
+ color: var(--text-body);
64
+ font: var(--font-title-h6);
65
+ line-height: 1;
66
+ }
67
+ .about {
68
+ max-width: 36ch;
69
+ }
70
+ .actions {
71
+ display: flex;
72
+ flex-wrap: wrap;
73
+ align-items: center;
74
+ gap: var(--gap-button);
75
+ }
76
+
77
+ .columns {
78
+ display: grid;
79
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
80
+ gap: var(--gap-card);
81
+ }
82
+ .heading {
83
+ margin: 0 0 var(--gap-form);
84
+ color: var(--text-body);
85
+ font: var(--font-normal-medium);
86
+ }
87
+ ul {
88
+ display: grid;
89
+ gap: var(--gap-button);
90
+ margin: 0;
91
+ padding: 0;
92
+ list-style: none;
93
+ }
94
+
95
+ a {
96
+ display: inline-flex;
97
+ align-items: center;
98
+ gap: 4px;
99
+ color: var(--text-muted);
100
+ text-decoration: none;
101
+ border-radius: var(--radius-sub-menu);
102
+ transition: color var(--duration-instant);
103
+ }
104
+ a:hover {
105
+ color: var(--text-body);
106
+ }
107
+ a:focus-visible {
108
+ outline: var(--outline-width) solid var(--color-primary-base);
109
+ outline-offset: 2px;
110
+ }
111
+
112
+ .bottom {
113
+ display: flex;
114
+ flex-wrap: wrap;
115
+ align-items: center;
116
+ justify-content: space-between;
117
+ gap: var(--gap-button) var(--gap-card);
118
+ margin-top: calc(var(--gap-card) * 2);
119
+ padding-top: var(--padding-card);
120
+ font: var(--font-normal-small);
121
+ border-top: var(--border-width) solid var(--border-subtle);
122
+ }
123
+ .bottom[hidden] {
124
+ display: none;
125
+ }
126
+
127
+ /* === Simple: one row, the links run together === */
128
+ :host([variant='simple']) .top {
129
+ grid-template-columns: none;
130
+ align-items: center;
131
+ }
132
+ @container (min-width: 720px) {
133
+ :host([variant='simple']) .top {
134
+ grid-template-columns: auto minmax(0, 1fr);
135
+ }
136
+ }
137
+ :host([variant='simple']) .about,
138
+ :host([variant='simple']) .heading {
139
+ display: none;
140
+ }
141
+ :host([variant='simple']) .columns,
142
+ :host([variant='simple']) [part='column'],
143
+ :host([variant='simple']) ul {
144
+ display: flex;
145
+ flex-wrap: wrap;
146
+ gap: var(--gap-button) var(--gap-card);
147
+ }
148
+ @container (min-width: 720px) {
149
+ :host([variant='simple']) .columns {
150
+ justify-content: flex-end;
151
+ }
152
+ }
153
+ `
154
+ ];
155
+ }
156
+ /** The first slotchange can land after the first render; read the slot once as well. */
157
+ firstUpdated() {
158
+ this.readLegal();
159
+ }
160
+ readLegal() {
161
+ this.hasLegal = u(this.shadowRoot?.querySelector('slot[name="legal"]'));
162
+ }
163
+ link(a) {
164
+ return n`<li>
165
+ <a href=${a.href} rel=${a.external ? "noopener" : i}
166
+ >${a.label}${a.external ? n`<kt-icon name="external-link" size="14" aria-hidden="true"></kt-icon>` : i}</a
167
+ >
168
+ </li>`;
169
+ }
170
+ render() {
171
+ const a = Math.max(2, this.headingLevel);
172
+ return n`<footer part="base" role="contentinfo" aria-label=${this.label || i}>
173
+ <div class="inner">
174
+ <div class="top">
175
+ <div part="brand" class="brand">
176
+ <div class="brand-mark"><slot name="brand"></slot></div>
177
+ <div class="about"><slot></slot></div>
178
+ <div class="actions"><slot name="actions"></slot></div>
179
+ </div>
180
+ ${this.columns.length ? n`<nav part="columns" class="columns" aria-label=${this.label || i}>
181
+ ${this.columns.map(
182
+ (o) => n`<div part="column">
183
+ ${f(a, o.heading, "heading")}
184
+ <ul>
185
+ ${o.links.map((p) => this.link(p))}
186
+ </ul>
187
+ </div>`
188
+ )}
189
+ </nav>` : i}
190
+ </div>
191
+ <div part="bottom" class="bottom" ?hidden=${!this.hasLegal}>
192
+ <slot name="legal" @slotchange=${this.readLegal}></slot>
193
+ </div>
194
+ </div>
195
+ </footer>`;
196
+ }
197
+ }
198
+ r([
199
+ l({ attribute: !1 })
200
+ ], t.prototype, "columns");
201
+ r([
202
+ l({ type: String, reflect: !0 })
203
+ ], t.prototype, "variant");
204
+ r([
205
+ l({ type: Boolean, reflect: !0 })
206
+ ], t.prototype, "bordered");
207
+ r([
208
+ l({ type: Number, attribute: "heading-level" })
209
+ ], t.prototype, "headingLevel");
210
+ r([
211
+ l({ type: String })
212
+ ], t.prototype, "label");
213
+ r([
214
+ h()
215
+ ], t.prototype, "hasLegal");
216
+ v("kt-footer", t);
217
+ export {
218
+ t as KtFooter
219
+ };
220
+ //# sourceMappingURL=kt-footer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-footer.js","sources":["../../../../src/components/navigation/kt-footer/kt-footer.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { hasAssignedContent } from '#internal/slots';\nimport { heading } from '#internal/heading';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport interface KtFooterLink {\n readonly label: string;\n readonly href: string;\n /** Leaves the site: marked with an icon, and given `rel=\"noopener\"`. */\n readonly external?: boolean;\n}\n\nexport interface KtFooterColumn {\n readonly heading: string;\n readonly links: readonly KtFooterLink[];\n}\n\nexport type KtFooterVariant = 'columns' | 'simple';\n\n/**\n * The site footer: a contentinfo landmark holding the brand and a word about\n * the product, columns of links, actions, and a legal line under them.\n *\n * The columns are data — `footer.columns = [{ heading, links }]` — so they are\n * laid out, named and marked alike; the brand, the actions and the legal line\n * are slots, for whatever a product puts there. It lays itself out from its\n * own width, not the viewport's: in a narrow panel it stacks as on a phone.\n *\n * `variant=\"simple\"` is a single row — the brand, the links run together, the\n * actions — for a page that needs a footer rather than a site map.\n *\n * @element kt-footer\n *\n * @slot brand - Logo or wordmark.\n * @slot - A word under the brand: what the product is.\n * @slot actions - Buttons and links under it — social links, a newsletter form.\n * @slot legal - The bottom line: copyright, terms, privacy. Its row is left out while empty.\n *\n * @csspart base - The `<footer>`.\n * @csspart brand - The brand, its text and the actions.\n * @csspart columns - The navigation holding the columns.\n * @csspart column - One column.\n * @csspart bottom - The legal row.\n *\n * @cssproperty --kt-footer-max-width - How wide the content runs. None by default.\n * @cssproperty --kt-footer-padding-inline - The space at its sides. The card padding by default;\n * zero lines it up with a page's content when the page already has its own.\n *\n * @example\n * ```html\n * <kt-footer label=\"Site\">\n * <a slot=\"brand\" href=\"/\">ACME</a>\n * Invoicing for small teams.\n * <span slot=\"legal\">© 2026 Acme</span>\n * </kt-footer>\n * <script>\n * footer.columns = [\n * { heading: 'Product', links: [{ label: 'Pricing', href: '/pricing' }] },\n * { heading: 'Company', links: [{ label: 'GitHub', href: 'https://github.com/acme', external: true }] },\n * ];\n * </script>\n * ```\n */\nexport class KtFooter extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n container-type: inline-size;\n --kt-footer-max-width: none;\n --kt-footer-padding-inline: var(--padding-card);\n }\n\n footer {\n color: var(--text-muted);\n font: var(--font-normal-regular);\n background-color: var(--surface-page);\n }\n :host([bordered]) footer {\n border-top: var(--border-width) solid var(--border-subtle);\n }\n\n .inner {\n max-width: var(--kt-footer-max-width);\n margin: 0 auto;\n padding: calc(var(--padding-card) * 2) var(--kt-footer-padding-inline);\n }\n\n /* Stacked by default — a phone, a narrow panel — and side by side once\n the footer itself is wide enough. */\n .top {\n display: grid;\n gap: calc(var(--gap-card) * 2);\n }\n @container (min-width: 720px) {\n .top {\n grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);\n }\n }\n\n .brand {\n display: grid;\n gap: var(--gap-form);\n align-content: start;\n }\n .brand-mark {\n display: flex;\n align-items: center;\n gap: var(--gap-button);\n color: var(--text-body);\n font: var(--font-title-h6);\n line-height: 1;\n }\n .about {\n max-width: 36ch;\n }\n .actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--gap-button);\n }\n\n .columns {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: var(--gap-card);\n }\n .heading {\n margin: 0 0 var(--gap-form);\n color: var(--text-body);\n font: var(--font-normal-medium);\n }\n ul {\n display: grid;\n gap: var(--gap-button);\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n a {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--text-muted);\n text-decoration: none;\n border-radius: var(--radius-sub-menu);\n transition: color var(--duration-instant);\n }\n a:hover {\n color: var(--text-body);\n }\n a:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n .bottom {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--gap-button) var(--gap-card);\n margin-top: calc(var(--gap-card) * 2);\n padding-top: var(--padding-card);\n font: var(--font-normal-small);\n border-top: var(--border-width) solid var(--border-subtle);\n }\n .bottom[hidden] {\n display: none;\n }\n\n /* === Simple: one row, the links run together === */\n :host([variant='simple']) .top {\n grid-template-columns: none;\n align-items: center;\n }\n @container (min-width: 720px) {\n :host([variant='simple']) .top {\n grid-template-columns: auto minmax(0, 1fr);\n }\n }\n :host([variant='simple']) .about,\n :host([variant='simple']) .heading {\n display: none;\n }\n :host([variant='simple']) .columns,\n :host([variant='simple']) [part='column'],\n :host([variant='simple']) ul {\n display: flex;\n flex-wrap: wrap;\n gap: var(--gap-button) var(--gap-card);\n }\n @container (min-width: 720px) {\n :host([variant='simple']) .columns {\n justify-content: flex-end;\n }\n }\n `,\n ];\n\n /** The columns of links. Set as a property: `footer.columns = [...]`. */\n @property({ attribute: false })\n columns: readonly KtFooterColumn[] = [];\n\n /** `columns`: a heading over each list. `simple`: one row of links. */\n @property({ type: String, reflect: true })\n variant: KtFooterVariant = 'columns';\n\n /** A rule along the top. */\n @property({ type: Boolean, reflect: true })\n bordered = true;\n\n /** The level of the column headings, 2 to 6. */\n @property({ type: Number, attribute: 'heading-level' })\n headingLevel = 2;\n\n /** Accessible name for the footer and its navigation. */\n @property({ type: String })\n label = '';\n\n @state() private hasLegal = false;\n\n /** The first slotchange can land after the first render; read the slot once as well. */\n override firstUpdated(): void {\n this.readLegal();\n }\n\n private readLegal(): void {\n this.hasLegal = hasAssignedContent(this.shadowRoot?.querySelector('slot[name=\"legal\"]'));\n }\n\n private link(link: KtFooterLink): TemplateResult {\n return html`<li>\n <a href=${link.href} rel=${link.external ? 'noopener' : nothing}\n >${link.label}${\n link.external\n ? html`<kt-icon name=\"external-link\" size=\"14\" aria-hidden=\"true\"></kt-icon>`\n : nothing\n }</a\n >\n </li>`;\n }\n\n override render(): TemplateResult {\n const level = Math.max(2, this.headingLevel);\n return html`<footer part=\"base\" role=\"contentinfo\" aria-label=${this.label || nothing}>\n <div class=\"inner\">\n <div class=\"top\">\n <div part=\"brand\" class=\"brand\">\n <div class=\"brand-mark\"><slot name=\"brand\"></slot></div>\n <div class=\"about\"><slot></slot></div>\n <div class=\"actions\"><slot name=\"actions\"></slot></div>\n </div>\n ${\n this.columns.length\n ? html`<nav part=\"columns\" class=\"columns\" aria-label=${this.label || nothing}>\n ${this.columns.map(\n (column) =>\n html`<div part=\"column\">\n ${heading(level, column.heading, 'heading')}\n <ul>\n ${column.links.map((link) => this.link(link))}\n </ul>\n </div>`,\n )}\n </nav>`\n : nothing\n }\n </div>\n <div part=\"bottom\" class=\"bottom\" ?hidden=${!this.hasLegal}>\n <slot name=\"legal\" @slotchange=${this.readLegal}></slot>\n </div>\n </div>\n </footer>`;\n }\n}\n\ndefineElement('kt-footer', KtFooter);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-footer': KtFooter;\n }\n}\n"],"names":["KtFooter","KtElement","css","hasAssignedContent","link","html","nothing","level","column","heading","__decorateClass","property","state","defineElement"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { css as c, nothing as u, html as m } from "lit";
2
2
  import { state as b, property as n } from "lit/decorators.js";
3
- import { K as d, d as f } from "../../../chunks/kt-element-T0VbIBNp.js";
3
+ import { K as d, d as f } from "../../../chunks/kt-element-DvWtPQ1Y.js";
4
4
  import { e as p } from "../../../chunks/events-r51msXNf.js";
5
- import { s as h } from "../../../chunks/index-TWJzttLX.js";
5
+ import { s as h } from "../../../chunks/index-1ZFgagWW.js";
6
6
  import "../../core/kt-button/kt-button.js";
7
7
  var g = Object.defineProperty, a = (r, o, s, v) => {
8
8
  for (var e = void 0, i = r.length - 1, l; i >= 0; i--)
@@ -1,6 +1,6 @@
1
1
  import { css as c, html as t, nothing as l } from "lit";
2
2
  import { property as s } from "lit/decorators.js";
3
- import { K as h, d as g } from "../../../chunks/kt-element-T0VbIBNp.js";
3
+ import { K as h, d as g } from "../../../chunks/kt-element-DvWtPQ1Y.js";
4
4
  var f = Object.defineProperty, o = (a, r, p, v) => {
5
5
  for (var e = void 0, n = a.length - 1, d; n >= 0; n--)
6
6
  (d = a[n]) && (e = d(r, p, e) || e);
@@ -50,7 +50,7 @@ class i extends h {
50
50
  h2 {
51
51
  margin: 0;
52
52
  color: var(--text-body);
53
- font: var(--font-title-h5);
53
+ font: var(--font-title-h4);
54
54
  }
55
55
 
56
56
  .description {
@@ -1 +1 @@
1
- {"version":3,"file":"kt-page-header.js","sources":["../../../../src/components/navigation/kt-page-header/kt-page-header.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\n\n/**\n * The block every screen opens with: an overline, a title, a sentence, and the\n * actions that belong to the page rather than to anything on it.\n *\n * It exists because it was being rebuilt on every screen, and the copies drifted\n * — different heading levels, different gaps, actions sometimes above and\n * sometimes beside. Those are not decisions worth making twice.\n *\n * At `level=\"section\"` the same block introduces a region inside a page: a\n * smaller heading, and the action is usually a link onward rather than a button.\n *\n * @element kt-page-header\n *\n * @slot - Extra content under the description.\n * @slot actions - Buttons or a link, trailing on wide screens.\n *\n * @csspart base - The container.\n * @csspart heading - The heading element.\n *\n * @example\n * ```html\n * <kt-page-header eyebrow=\"Dashboard\" heading=\"Good evening\"\n * description=\"Recent files, integrations and activity.\">\n * <kt-button slot=\"actions\" icon=\"plus\">New document</kt-button>\n * </kt-page-header>\n *\n * <kt-page-header level=\"section\" heading=\"Recently opened\">\n * <a slot=\"actions\" href=\"#/files\">See all files</a>\n * </kt-page-header>\n * ```\n */\nexport class KtPageHeader extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n justify-content: space-between;\n gap: 16px;\n }\n\n .copy {\n display: flex;\n flex: 1 1 320px;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n }\n\n .eyebrow {\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 h1 {\n margin: 0;\n color: var(--text-body);\n font: var(--font-title-h1);\n }\n\n h2 {\n margin: 0;\n color: var(--text-body);\n font: var(--font-title-h5);\n }\n\n .description {\n max-width: 72ch;\n margin: 0;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n line-height: 1.6;\n }\n\n .actions {\n display: flex;\n flex: none;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--gap-button);\n }\n\n /* A section header sits tight against what it introduces. */\n :host([level='section']) .header {\n align-items: center;\n }\n\n :host([level='section']) .description {\n font: var(--font-normal-small);\n }\n `,\n ];\n\n /** Small uppercase label above the heading — \"Dashboard\", \"Settings\". */\n @property({ type: String })\n eyebrow = '';\n\n @property({ type: String })\n heading = '';\n\n @property({ type: String })\n description = '';\n\n /** `page` renders an `<h1>`; `section` an `<h2>` at body scale. */\n @property({ type: String, reflect: true })\n level: 'page' | 'section' = 'page';\n\n override render(): TemplateResult {\n const title = this.heading\n ? this.level === 'section'\n ? html`<h2 part=\"heading\">${this.heading}</h2>`\n : html`<h1 part=\"heading\">${this.heading}</h1>`\n : nothing;\n\n return html`<div part=\"base\" class=\"header\">\n <div class=\"copy\">\n ${this.eyebrow ? html`<span class=\"eyebrow\">${this.eyebrow}</span>` : nothing} ${title}\n ${this.description ? html`<p class=\"description\">${this.description}</p>` : nothing}\n <slot></slot>\n </div>\n <div class=\"actions\"><slot name=\"actions\"></slot></div>\n </div>`;\n }\n}\n\ndefineElement('kt-page-header', KtPageHeader);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-page-header': KtPageHeader;\n }\n}\n"],"names":["KtPageHeader","KtElement","css","title","html","nothing","__decorateClass","property","defineElement"],"mappings":";;;;;;;;AAmCO,MAAMA,UAAqBC,EAAU;AAAA,EAArC,cAAA;AAAA,UAAA,GAAA,SAAA,GAwEL,KAAA,UAAU,IAGV,KAAA,UAAU,IAGV,KAAA,cAAc,IAId,KAAA,QAA4B;AAAA,EAAA;AAAA,EAjF5B,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,IAAA;AAAA,EAiEF;AAAA,EAgBS,SAAyB;AAChC,UAAMC,IAAQ,KAAK,UACf,KAAK,UAAU,YACbC,uBAA0B,KAAK,OAAO,UACtCA,uBAA0B,KAAK,OAAO,UACxCC;AAEJ,WAAOD;AAAA;AAAA,UAED,KAAK,UAAUA,0BAA6B,KAAK,OAAO,YAAYC,CAAO,IAAIF,CAAK;AAAA,UACpF,KAAK,cAAcC,2BAA8B,KAAK,WAAW,SAASC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKzF;AACF;AA5BEC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAvEfP,EAwEX,WAAA,SAAA;AAGAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA1EfP,EA2EX,WAAA,SAAA;AAGAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA7EfP,EA8EX,WAAA,aAAA;AAIAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAjF9BP,EAkFX,WAAA,OAAA;AAoBFQ,EAAc,kBAAkBR,CAAY;"}
1
+ {"version":3,"file":"kt-page-header.js","sources":["../../../../src/components/navigation/kt-page-header/kt-page-header.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\n\n/**\n * The block every screen opens with: an overline, a title, a sentence, and the\n * actions that belong to the page rather than to anything on it.\n *\n * It exists because it was being rebuilt on every screen, and the copies drifted\n * — different heading levels, different gaps, actions sometimes above and\n * sometimes beside. Those are not decisions worth making twice.\n *\n * At `level=\"section\"` the same block introduces a region inside a page: a\n * smaller heading, and the action is usually a link onward rather than a button.\n *\n * @element kt-page-header\n *\n * @slot - Extra content under the description.\n * @slot actions - Buttons or a link, trailing on wide screens.\n *\n * @csspart base - The container.\n * @csspart heading - The heading element.\n *\n * @example\n * ```html\n * <kt-page-header eyebrow=\"Dashboard\" heading=\"Good evening\"\n * description=\"Recent files, integrations and activity.\">\n * <kt-button slot=\"actions\" icon=\"plus\">New document</kt-button>\n * </kt-page-header>\n *\n * <kt-page-header level=\"section\" heading=\"Recently opened\">\n * <a slot=\"actions\" href=\"#/files\">See all files</a>\n * </kt-page-header>\n * ```\n */\nexport class KtPageHeader extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n justify-content: space-between;\n gap: 16px;\n }\n\n .copy {\n display: flex;\n flex: 1 1 320px;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n }\n\n .eyebrow {\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 h1 {\n margin: 0;\n color: var(--text-body);\n font: var(--font-title-h1);\n }\n\n h2 {\n margin: 0;\n color: var(--text-body);\n font: var(--font-title-h4);\n }\n\n .description {\n max-width: 72ch;\n margin: 0;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n line-height: 1.6;\n }\n\n .actions {\n display: flex;\n flex: none;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--gap-button);\n }\n\n /* A section header sits tight against what it introduces. */\n :host([level='section']) .header {\n align-items: center;\n }\n\n :host([level='section']) .description {\n font: var(--font-normal-small);\n }\n `,\n ];\n\n /** Small uppercase label above the heading — \"Dashboard\", \"Settings\". */\n @property({ type: String })\n eyebrow = '';\n\n @property({ type: String })\n heading = '';\n\n @property({ type: String })\n description = '';\n\n /** `page` renders an `<h1>`; `section` an `<h2>` at body scale. */\n @property({ type: String, reflect: true })\n level: 'page' | 'section' = 'page';\n\n override render(): TemplateResult {\n const title = this.heading\n ? this.level === 'section'\n ? html`<h2 part=\"heading\">${this.heading}</h2>`\n : html`<h1 part=\"heading\">${this.heading}</h1>`\n : nothing;\n\n return html`<div part=\"base\" class=\"header\">\n <div class=\"copy\">\n ${this.eyebrow ? html`<span class=\"eyebrow\">${this.eyebrow}</span>` : nothing} ${title}\n ${this.description ? html`<p class=\"description\">${this.description}</p>` : nothing}\n <slot></slot>\n </div>\n <div class=\"actions\"><slot name=\"actions\"></slot></div>\n </div>`;\n }\n}\n\ndefineElement('kt-page-header', KtPageHeader);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-page-header': KtPageHeader;\n }\n}\n"],"names":["KtPageHeader","KtElement","css","title","html","nothing","__decorateClass","property","defineElement"],"mappings":";;;;;;;;AAmCO,MAAMA,UAAqBC,EAAU;AAAA,EAArC,cAAA;AAAA,UAAA,GAAA,SAAA,GAwEL,KAAA,UAAU,IAGV,KAAA,UAAU,IAGV,KAAA,cAAc,IAId,KAAA,QAA4B;AAAA,EAAA;AAAA,EAjF5B,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,IAAA;AAAA,EAiEF;AAAA,EAgBS,SAAyB;AAChC,UAAMC,IAAQ,KAAK,UACf,KAAK,UAAU,YACbC,uBAA0B,KAAK,OAAO,UACtCA,uBAA0B,KAAK,OAAO,UACxCC;AAEJ,WAAOD;AAAA;AAAA,UAED,KAAK,UAAUA,0BAA6B,KAAK,OAAO,YAAYC,CAAO,IAAIF,CAAK;AAAA,UACpF,KAAK,cAAcC,2BAA8B,KAAK,WAAW,SAASC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKzF;AACF;AA5BEC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAvEfP,EAwEX,WAAA,SAAA;AAGAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA1EfP,EA2EX,WAAA,SAAA;AAGAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA7EfP,EA8EX,WAAA,aAAA;AAIAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAjF9BP,EAkFX,WAAA,OAAA;AAoBFQ,EAAc,kBAAkBR,CAAY;"}
@@ -40,6 +40,7 @@ export declare class KtSegmentedControl extends KtElement {
40
40
  static readonly formAssociated = true;
41
41
  static styles: import("lit").CSSResultGroup[];
42
42
  private segments;
43
+ constructor();
43
44
  private internals;
44
45
  private defaultValue;
45
46
  options: readonly KtSegmentedOption[];