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,245 @@
1
+ import { css as v, nothing as c, html as o } from "lit";
2
+ import { property as p, state as u } from "lit/decorators.js";
3
+ import { K as h, d as b } from "../../../chunks/kt-element-DvWtPQ1Y.js";
4
+ import { b as f, a as y, c as x } from "../../../chunks/block-Cci-Kff_.js";
5
+ import { e as $ } from "../../../chunks/events-r51msXNf.js";
6
+ import { h as k } from "../../../chunks/heading-DsnZsfg-.js";
7
+ import { h as w } from "../../../chunks/slots-BPbIdxAJ.js";
8
+ import "../../core/kt-button/kt-button.js";
9
+ import "../../core/kt-icon/kt-icon.js";
10
+ import "../../feedback/kt-progress-bar/kt-progress-bar.js";
11
+ var S = Object.defineProperty, n = (l, t, a, d) => {
12
+ for (var e = void 0, r = l.length - 1, i; r >= 0; r--)
13
+ (i = l[r]) && (e = i(t, a, e) || e);
14
+ return e && S(t, a, e), e;
15
+ };
16
+ const j = {
17
+ progress: (l, t) => `${l} of ${t} done`,
18
+ done: "Done:",
19
+ start: "Start"
20
+ };
21
+ class s extends h {
22
+ constructor() {
23
+ super(...arguments), this.heading = "", this.lead = "", this.steps = [], this.headingLevel = 1, this.texts = {}, this.filled = /* @__PURE__ */ new Set(), this.headingId = f("kt-empty-page"), this.readSlots = () => {
24
+ const t = /* @__PURE__ */ new Set();
25
+ for (const a of this.shadowRoot?.querySelectorAll("slot") ?? [])
26
+ w(a) && t.add(a.name);
27
+ this.filled = t;
28
+ };
29
+ }
30
+ static {
31
+ this.styles = [
32
+ h.styles,
33
+ y,
34
+ v`
35
+ .block {
36
+ justify-items: center;
37
+ max-width: 720px;
38
+ margin-inline: auto;
39
+ }
40
+ .block-head {
41
+ justify-items: center;
42
+ text-align: center;
43
+ }
44
+ .block-heading {
45
+ font: 600 clamp(28px, 5cqi, 40px) / 1.1 var(--font-family-display);
46
+ letter-spacing: -0.03em;
47
+ }
48
+ .media,
49
+ .actions {
50
+ display: flex;
51
+ flex-wrap: wrap;
52
+ gap: var(--gap-button);
53
+ justify-content: center;
54
+ }
55
+ .empty {
56
+ display: none;
57
+ }
58
+
59
+ .progress {
60
+ display: grid;
61
+ gap: 8px;
62
+ width: 100%;
63
+ }
64
+ .progress-label {
65
+ color: var(--text-muted);
66
+ font: var(--font-normal-small);
67
+ }
68
+
69
+ .steps {
70
+ display: grid;
71
+ width: 100%;
72
+ margin: 0;
73
+ padding: 0;
74
+ list-style: none;
75
+ border: var(--border-width) solid var(--border-subtle);
76
+ border-radius: var(--border-radius-card);
77
+ }
78
+ .step {
79
+ display: grid;
80
+ grid-template-columns: auto minmax(0, 1fr) auto;
81
+ gap: var(--gap-card);
82
+ align-items: center;
83
+ padding: var(--padding-card);
84
+ text-align: start;
85
+ }
86
+ .step + .step {
87
+ border-top: var(--border-width) solid var(--border-subtle);
88
+ }
89
+ @container (max-width: 520px) {
90
+ .step {
91
+ grid-template-columns: auto minmax(0, 1fr);
92
+ }
93
+ .step .act {
94
+ grid-column: 2;
95
+ justify-self: start;
96
+ }
97
+ }
98
+
99
+ .marker {
100
+ display: grid;
101
+ place-items: center;
102
+ width: 32px;
103
+ height: 32px;
104
+ color: var(--text-muted);
105
+ font: var(--font-normal-medium);
106
+ font-variant-numeric: tabular-nums;
107
+ border: var(--border-width) solid var(--border-subtle);
108
+ border-radius: 50%;
109
+ }
110
+ .done .marker {
111
+ color: var(--color-white);
112
+ background-color: var(--color-primary-base);
113
+ border-color: var(--color-primary-base);
114
+ }
115
+
116
+ .step-text {
117
+ display: grid;
118
+ gap: 2px;
119
+ min-width: 0;
120
+ }
121
+ .step-title {
122
+ margin: 0;
123
+ color: var(--text-body);
124
+ font: var(--font-normal-medium);
125
+ }
126
+ .done .step-title {
127
+ color: var(--text-muted);
128
+ text-decoration: line-through;
129
+ text-decoration-color: var(--border-subtle);
130
+ }
131
+ .step-description {
132
+ margin: 0;
133
+ color: var(--text-muted);
134
+ font: var(--font-normal-small);
135
+ line-height: 1.5;
136
+ }
137
+
138
+ a.action {
139
+ display: inline-flex;
140
+ align-items: center;
141
+ height: var(--button-height);
142
+ padding: 0 var(--button-padding-x);
143
+ color: var(--color-primary-text);
144
+ font: var(--font-normal-regular);
145
+ white-space: nowrap;
146
+ text-decoration: none;
147
+ background-color: var(--color-primary-soft);
148
+ border-radius: var(--border-radius);
149
+ transition: background-color var(--duration-instant);
150
+ }
151
+ a.action:hover {
152
+ background-color: var(--color-secondary-hover);
153
+ }
154
+ a.action:focus-visible {
155
+ outline: var(--outline-width) solid var(--color-primary-base);
156
+ outline-offset: 2px;
157
+ }
158
+ /* The next step is the one to take: its action is the primary one. */
159
+ .next a.action {
160
+ color: var(--color-white);
161
+ background-color: var(--color-primary-base);
162
+ }
163
+ .next a.action:hover {
164
+ background-color: var(--color-primary-hover);
165
+ }
166
+
167
+ .visually-hidden {
168
+ position: absolute;
169
+ width: 1px;
170
+ height: 1px;
171
+ overflow: hidden;
172
+ clip-path: inset(50%);
173
+ white-space: nowrap;
174
+ }
175
+ `
176
+ ];
177
+ }
178
+ firstUpdated() {
179
+ this.readSlots();
180
+ }
181
+ step(t, a, d, e) {
182
+ const r = t.action || e.start, i = t.done ? c : t.href ? o`<a class="action" href=${t.href}>${r}</a>` : o`<kt-button
183
+ variant=${d ? "primary" : "secondary"}
184
+ @click=${() => $(this, "kt-step", { id: t.id })}
185
+ >${r}</kt-button
186
+ >`, m = t.done ? o`<span class="visually-hidden">${e.done}</span> ${t.title}` : o`${t.title}`, g = ["step", t.done ? "done" : "", d ? "next" : ""].filter(Boolean).join(" ");
187
+ return o`<li part="step" class=${g}>
188
+ <span class="marker" aria-hidden="true"
189
+ >${t.done ? o`<kt-icon name="check" size="16"></kt-icon>` : a + 1}</span
190
+ >
191
+ <div class="step-text">
192
+ ${k(this.headingLevel + 1, m, "step-title", 2)}
193
+ ${t.description ? o`<p class="step-description">${t.description}</p>` : c}
194
+ </div>
195
+ ${t.done ? c : o`<div class="act">${i}</div>`}
196
+ </li>`;
197
+ }
198
+ render() {
199
+ const t = { ...j, ...this.texts }, a = this.steps.filter((r) => r.done).length, d = this.steps.findIndex((r) => !r.done), e = t.progress(a, this.steps.length);
200
+ return o`<section part="base" class="block" aria-labelledby=${this.headingId}>
201
+ <div class=${this.filled.has("media") ? "media" : "media empty"}>
202
+ <slot name="media" @slotchange=${this.readSlots}></slot>
203
+ </div>
204
+ ${x({ title: this.heading, lead: this.lead, level: this.headingLevel, id: this.headingId })}
205
+ ${this.steps.length ? o`<div class="progress">
206
+ <span class="progress-label" aria-hidden="true">${e}</span>
207
+ <kt-progress-bar
208
+ value=${a}
209
+ max=${this.steps.length}
210
+ size="small"
211
+ label=${e}
212
+ ></kt-progress-bar>
213
+ </div>
214
+ <ol class="steps" role="list">
215
+ ${this.steps.map((r, i) => this.step(r, i, i === d, t))}
216
+ </ol>` : c}
217
+ <div class=${this.filled.has("actions") ? "actions" : "actions empty"}>
218
+ <slot name="actions" @slotchange=${this.readSlots}></slot>
219
+ </div>
220
+ </section>`;
221
+ }
222
+ }
223
+ n([
224
+ p({ type: String })
225
+ ], s.prototype, "heading");
226
+ n([
227
+ p({ type: String })
228
+ ], s.prototype, "lead");
229
+ n([
230
+ p({ attribute: !1 })
231
+ ], s.prototype, "steps");
232
+ n([
233
+ p({ type: Number, attribute: "heading-level" })
234
+ ], s.prototype, "headingLevel");
235
+ n([
236
+ p({ attribute: !1 })
237
+ ], s.prototype, "texts");
238
+ n([
239
+ u()
240
+ ], s.prototype, "filled");
241
+ b("kt-empty-page", s);
242
+ export {
243
+ s as KtEmptyPage
244
+ };
245
+ //# sourceMappingURL=kt-empty-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-empty-page.js","sources":["../../../../src/components/blocks/kt-empty-page/kt-empty-page.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 { blockHead, blockId, blockStyles } from '#internal/block';\nimport { emit } from '#internal/events';\nimport { heading } from '#internal/heading';\nimport { hasAssignedContent } from '#internal/slots';\nimport '../../core/kt-button/kt-button.js';\nimport '../../core/kt-icon/kt-icon.js';\nimport '../../feedback/kt-progress-bar/kt-progress-bar.js';\n\nexport interface KtFirstStep {\n readonly id: string;\n readonly title: string;\n readonly description?: string;\n /** The button's words: what doing the step starts. */\n readonly action?: string;\n /** Makes the action a link. Without it, the action fires `kt-step`. */\n readonly href?: string;\n readonly done?: boolean;\n}\n\n/** Every word the page says, in English until given others. */\nexport interface KtEmptyPageTexts {\n readonly progress: (done: number, total: number) => string;\n /** Read before a done step's title, for assistive tech. */\n readonly done: string;\n readonly start: string;\n}\n\nconst TEXTS: KtEmptyPageTexts = {\n progress: (done, total) => `${done} of ${total} done`,\n done: 'Done:',\n start: 'Start',\n};\n\n/**\n * The page a new account lands on, before there is anything in it: a welcome,\n * and the first steps that fill it — what is done, what is next, and the way\n * to each.\n *\n * The steps are data: `page.steps = [{ id, title, description, action, href,\n * done }]`, numbered in order, with how far along it is over them. A step's\n * action fires `kt-step`, or is a link with an `href`. For a list or a panel\n * that is empty, `kt-empty-state`.\n *\n * @element kt-empty-page\n *\n * @slot media - Over the heading: an illustration, a logo.\n * @slot actions - Under the steps: Skip for now, a link to the docs.\n *\n * @csspart base - The section.\n * @csspart step - One step.\n *\n * @fires kt-step - A step's action was pressed. `detail: { id }`.\n *\n * @example\n * ```html\n * <kt-empty-page heading=\"Welcome, Ada\" lead=\"Three steps and you are sending invoices.\"></kt-empty-page>\n * <script>\n * page.steps = [\n * { id: 'company', title: 'Add your company', done: true },\n * { id: 'invoice', title: 'Send your first invoice', action: 'New invoice', href: '/invoices/new' },\n * ];\n * </script>\n * ```\n */\nexport class KtEmptyPage extends KtElement {\n static override styles = [\n KtElement.styles,\n blockStyles,\n css`\n .block {\n justify-items: center;\n max-width: 720px;\n margin-inline: auto;\n }\n .block-head {\n justify-items: center;\n text-align: center;\n }\n .block-heading {\n font: 600 clamp(28px, 5cqi, 40px) / 1.1 var(--font-family-display);\n letter-spacing: -0.03em;\n }\n .media,\n .actions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--gap-button);\n justify-content: center;\n }\n .empty {\n display: none;\n }\n\n .progress {\n display: grid;\n gap: 8px;\n width: 100%;\n }\n .progress-label {\n color: var(--text-muted);\n font: var(--font-normal-small);\n }\n\n .steps {\n display: grid;\n width: 100%;\n margin: 0;\n padding: 0;\n list-style: none;\n border: var(--border-width) solid var(--border-subtle);\n border-radius: var(--border-radius-card);\n }\n .step {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n gap: var(--gap-card);\n align-items: center;\n padding: var(--padding-card);\n text-align: start;\n }\n .step + .step {\n border-top: var(--border-width) solid var(--border-subtle);\n }\n @container (max-width: 520px) {\n .step {\n grid-template-columns: auto minmax(0, 1fr);\n }\n .step .act {\n grid-column: 2;\n justify-self: start;\n }\n }\n\n .marker {\n display: grid;\n place-items: center;\n width: 32px;\n height: 32px;\n color: var(--text-muted);\n font: var(--font-normal-medium);\n font-variant-numeric: tabular-nums;\n border: var(--border-width) solid var(--border-subtle);\n border-radius: 50%;\n }\n .done .marker {\n color: var(--color-white);\n background-color: var(--color-primary-base);\n border-color: var(--color-primary-base);\n }\n\n .step-text {\n display: grid;\n gap: 2px;\n min-width: 0;\n }\n .step-title {\n margin: 0;\n color: var(--text-body);\n font: var(--font-normal-medium);\n }\n .done .step-title {\n color: var(--text-muted);\n text-decoration: line-through;\n text-decoration-color: var(--border-subtle);\n }\n .step-description {\n margin: 0;\n color: var(--text-muted);\n font: var(--font-normal-small);\n line-height: 1.5;\n }\n\n a.action {\n display: inline-flex;\n align-items: center;\n height: var(--button-height);\n padding: 0 var(--button-padding-x);\n color: var(--color-primary-text);\n font: var(--font-normal-regular);\n white-space: nowrap;\n text-decoration: none;\n background-color: var(--color-primary-soft);\n border-radius: var(--border-radius);\n transition: background-color var(--duration-instant);\n }\n a.action:hover {\n background-color: var(--color-secondary-hover);\n }\n a.action:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n /* The next step is the one to take: its action is the primary one. */\n .next a.action {\n color: var(--color-white);\n background-color: var(--color-primary-base);\n }\n .next a.action:hover {\n background-color: var(--color-primary-hover);\n }\n\n .visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n }\n `,\n ];\n\n @property({ type: String })\n heading = '';\n\n @property({ type: String })\n lead = '';\n\n /** The first steps, in the order to take them. */\n @property({ attribute: false })\n steps: readonly KtFirstStep[] = [];\n\n /** The heading's level: 1, since it is the page; the steps' titles sit one under. */\n @property({ type: Number, attribute: 'heading-level' })\n headingLevel = 1;\n\n /** The words, English until given others. */\n @property({ attribute: false })\n texts: Partial<KtEmptyPageTexts> = {};\n\n @state() private filled = new Set<string>();\n\n private readonly headingId = blockId('kt-empty-page');\n\n override firstUpdated(): void {\n this.readSlots();\n }\n\n private readSlots = (): void => {\n const filled = new Set<string>();\n for (const slot of this.shadowRoot?.querySelectorAll('slot') ?? []) {\n if (hasAssignedContent(slot)) filled.add(slot.name);\n }\n this.filled = filled;\n };\n\n private step(\n step: KtFirstStep,\n index: number,\n next: boolean,\n t: KtEmptyPageTexts,\n ): TemplateResult {\n const label = step.action || t.start;\n const action = step.done\n ? nothing\n : step.href\n ? html`<a class=\"action\" href=${step.href}>${label}</a>`\n : html`<kt-button\n variant=${next ? 'primary' : 'secondary'}\n @click=${() => emit(this, 'kt-step', { id: step.id })}\n >${label}</kt-button\n >`;\n const title = step.done\n ? html`<span class=\"visually-hidden\">${t.done}</span> ${step.title}`\n : html`${step.title}`;\n const classes = ['step', step.done ? 'done' : '', next ? 'next' : ''].filter(Boolean).join(' ');\n return html`<li part=\"step\" class=${classes}>\n <span class=\"marker\" aria-hidden=\"true\"\n >${step.done ? html`<kt-icon name=\"check\" size=\"16\"></kt-icon>` : index + 1}</span\n >\n <div class=\"step-text\">\n ${heading(this.headingLevel + 1, title, 'step-title', 2)}\n ${step.description ? html`<p class=\"step-description\">${step.description}</p>` : nothing}\n </div>\n ${step.done ? nothing : html`<div class=\"act\">${action}</div>`}\n </li>`;\n }\n\n override render(): TemplateResult {\n const t = { ...TEXTS, ...this.texts };\n const done = this.steps.filter((step) => step.done).length;\n const next = this.steps.findIndex((step) => !step.done);\n const progress = t.progress(done, this.steps.length);\n return html`<section part=\"base\" class=\"block\" aria-labelledby=${this.headingId}>\n <div class=${this.filled.has('media') ? 'media' : 'media empty'}>\n <slot name=\"media\" @slotchange=${this.readSlots}></slot>\n </div>\n ${blockHead({ title: this.heading, lead: this.lead, level: this.headingLevel, id: this.headingId })}\n ${\n this.steps.length\n ? html`<div class=\"progress\">\n <span class=\"progress-label\" aria-hidden=\"true\">${progress}</span>\n <kt-progress-bar\n value=${done}\n max=${this.steps.length}\n size=\"small\"\n label=${progress}\n ></kt-progress-bar>\n </div>\n <ol class=\"steps\" role=\"list\">\n ${this.steps.map((step, index) => this.step(step, index, index === next, t))}\n </ol>`\n : nothing\n }\n <div class=${this.filled.has('actions') ? 'actions' : 'actions empty'}>\n <slot name=\"actions\" @slotchange=${this.readSlots}></slot>\n </div>\n </section>`;\n }\n}\n\ndefineElement('kt-empty-page', KtEmptyPage);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-empty-page': KtEmptyPage;\n }\n}\n"],"names":["TEXTS","done","total","KtEmptyPage","KtElement","blockId","filled","slot","hasAssignedContent","blockStyles","css","step","index","next","t","label","action","nothing","html","emit","title","classes","heading","progress","blockHead","__decorateClass","property","state","defineElement"],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ import '../../core/kt-button/kt-button.js';
4
+ export type KtErrorPageKind = 'not-found' | 'error' | 'maintenance';
5
+ /** Every word the page says, in English until given others. */
6
+ export interface KtErrorPageTexts {
7
+ readonly notFoundHeading: string;
8
+ readonly notFoundLead: string;
9
+ readonly errorHeading: string;
10
+ readonly errorLead: string;
11
+ readonly maintenanceHeading: string;
12
+ readonly maintenanceLead: string;
13
+ readonly goHome: string;
14
+ readonly tryAgain: string;
15
+ }
16
+ /**
17
+ * The page a person lands on when the one they wanted is not there: not found,
18
+ * broken, or down for maintenance — said plainly, with the way on.
19
+ *
20
+ * `not-found` leads home (`home-href`); `error` offers to try again, firing
21
+ * `kt-retry` — cancel it to retry your own way, otherwise the page reloads;
22
+ * `maintenance` offers nothing it cannot do. The `actions` slot replaces the
23
+ * buttons. Every word is in `texts`, English until given others.
24
+ *
25
+ * @element kt-error-page
26
+ *
27
+ * @slot actions - Replaces the buttons: a search, a link to the status page.
28
+ * @slot - Under the actions: a contact line, a request id.
29
+ *
30
+ * @csspart base - The block.
31
+ * @csspart code - The code, large.
32
+ *
33
+ * @fires kt-retry - Try again was pressed. Cancelable; uncancelled, the page reloads.
34
+ *
35
+ * @example
36
+ * ```html
37
+ * <kt-error-page fill home-href="/app"></kt-error-page>
38
+ * <kt-error-page kind="error"></kt-error-page>
39
+ * ```
40
+ */
41
+ export declare class KtErrorPage extends KtElement {
42
+ static styles: import("lit").CSSResultGroup[];
43
+ /** `not-found`, `error` or `maintenance`. */
44
+ kind: KtErrorPageKind;
45
+ /** The code shown large. Defaults to the kind's: 404, 500, 503. */
46
+ code: string;
47
+ /** Where Go home leads. */
48
+ homeHref: string;
49
+ /** The heading's level, 1 to 6: 1 when it is the page. */
50
+ headingLevel: number;
51
+ /** Fills its container's height and centres itself in it. */
52
+ fill: boolean;
53
+ /** The words, English until given others. */
54
+ texts: Partial<KtErrorPageTexts>;
55
+ private ownActions;
56
+ firstUpdated(): void;
57
+ private readActions;
58
+ private retry;
59
+ render(): TemplateResult;
60
+ }
61
+ declare global {
62
+ interface HTMLElementTagNameMap {
63
+ 'kt-error-page': KtErrorPage;
64
+ }
65
+ }
@@ -0,0 +1,177 @@
1
+ import { css as m, nothing as d, html as l } from "lit";
2
+ import { property as a, state as g } from "lit/decorators.js";
3
+ import { K as p, d as u } from "../../../chunks/kt-element-DvWtPQ1Y.js";
4
+ import { e as f } from "../../../chunks/events-r51msXNf.js";
5
+ import { h as y } from "../../../chunks/heading-DsnZsfg-.js";
6
+ import { h as v } from "../../../chunks/slots-BPbIdxAJ.js";
7
+ import "../../core/kt-button/kt-button.js";
8
+ var b = Object.defineProperty, r = (s, t, n, c) => {
9
+ for (var e = void 0, i = s.length - 1, h; i >= 0; i--)
10
+ (h = s[i]) && (e = h(t, n, e) || e);
11
+ return e && b(t, n, e), e;
12
+ };
13
+ const k = {
14
+ notFoundHeading: "Page not found",
15
+ notFoundLead: "The page you were looking for has moved, or never was. Check the address, or start again from home.",
16
+ errorHeading: "Something went wrong",
17
+ errorLead: "It is on our side, not yours. Try again in a moment; if it keeps happening, we are already on it.",
18
+ maintenanceHeading: "Back in a moment",
19
+ maintenanceLead: "We are making things better. The page will be back shortly — nothing you have done is lost.",
20
+ goHome: "Go home",
21
+ tryAgain: "Try again"
22
+ }, x = {
23
+ "not-found": "404",
24
+ error: "500",
25
+ maintenance: "503"
26
+ };
27
+ class o extends p {
28
+ constructor() {
29
+ super(...arguments), this.kind = "not-found", this.code = "", this.homeHref = "/", this.headingLevel = 1, this.fill = !1, this.texts = {}, this.ownActions = !1;
30
+ }
31
+ static {
32
+ this.styles = [
33
+ p.styles,
34
+ m`
35
+ :host {
36
+ display: block;
37
+ }
38
+ :host([fill]) {
39
+ display: grid;
40
+ min-height: 100%;
41
+ place-items: center;
42
+ }
43
+
44
+ .page {
45
+ display: grid;
46
+ gap: var(--gap-card);
47
+ justify-items: center;
48
+ max-width: 560px;
49
+ margin: 0 auto;
50
+ padding: calc(var(--padding-card) * 2) var(--padding-card);
51
+ text-align: center;
52
+ }
53
+
54
+ .code {
55
+ color: var(--color-primary-text);
56
+ font: 600 clamp(64px, 12vw, 120px) / 1 var(--font-family-display);
57
+ letter-spacing: -0.04em;
58
+ }
59
+ .heading {
60
+ margin: 0;
61
+ color: var(--text-body);
62
+ font: var(--font-title-h4);
63
+ text-wrap: balance;
64
+ }
65
+ .lead {
66
+ max-width: 46ch;
67
+ margin: 0;
68
+ color: var(--text-muted);
69
+ font: var(--font-normal-regular);
70
+ line-height: 1.6;
71
+ text-wrap: pretty;
72
+ }
73
+
74
+ .actions {
75
+ display: flex;
76
+ flex-wrap: wrap;
77
+ gap: var(--gap-button);
78
+ justify-content: center;
79
+ }
80
+ .actions:empty,
81
+ .actions[hidden] {
82
+ display: none;
83
+ }
84
+
85
+ /* Home is a link, drawn as the primary button. */
86
+ .home {
87
+ display: inline-flex;
88
+ align-items: center;
89
+ height: var(--button-height);
90
+ padding: 0 var(--button-padding-x);
91
+ color: var(--color-white);
92
+ font: var(--font-normal-regular);
93
+ text-decoration: none;
94
+ background-color: var(--color-primary-base);
95
+ border-radius: var(--border-radius);
96
+ transition: background-color var(--duration-instant);
97
+ }
98
+ .home:hover {
99
+ background-color: var(--color-primary-hover);
100
+ }
101
+ /* Second to Try again: a link, not a second primary button. */
102
+ .home.quiet,
103
+ .home.quiet:hover {
104
+ color: var(--color-primary-text);
105
+ background-color: transparent;
106
+ }
107
+ .home:focus-visible {
108
+ outline: var(--outline-width) solid var(--color-primary-base);
109
+ outline-offset: 2px;
110
+ }
111
+
112
+ .more {
113
+ color: var(--text-muted);
114
+ font: var(--font-normal-small);
115
+ }
116
+ .more:empty {
117
+ display: none;
118
+ }
119
+ `
120
+ ];
121
+ }
122
+ firstUpdated() {
123
+ this.readActions();
124
+ }
125
+ readActions() {
126
+ this.ownActions = v(this.shadowRoot?.querySelector('slot[name="actions"]'));
127
+ }
128
+ retry() {
129
+ f(this, "kt-retry").defaultPrevented || location.reload();
130
+ }
131
+ render() {
132
+ const t = { ...k, ...this.texts }, n = {
133
+ "not-found": [t.notFoundHeading, t.notFoundLead],
134
+ error: [t.errorHeading, t.errorLead],
135
+ maintenance: [t.maintenanceHeading, t.maintenanceLead]
136
+ }, [c, e] = n[this.kind] ?? n["not-found"], i = this.kind === "maintenance" ? d : l`${this.kind === "error" ? l`<kt-button @click=${() => this.retry()}>${t.tryAgain}</kt-button>` : d}
137
+ <a class=${this.kind === "error" ? "home quiet" : "home"} href=${this.homeHref}
138
+ >${t.goHome}</a
139
+ >`;
140
+ return l`<section part="base" class="page">
141
+ <div part="code" class="code" aria-hidden="true">${this.code || x[this.kind]}</div>
142
+ ${y(this.headingLevel, c, "heading", 1)}
143
+ <p class="lead">${e}</p>
144
+ <div class="actions">
145
+ <slot name="actions" @slotchange=${this.readActions}></slot>
146
+ ${this.ownActions ? d : i}
147
+ </div>
148
+ <div class="more"><slot></slot></div>
149
+ </section>`;
150
+ }
151
+ }
152
+ r([
153
+ a({ type: String, reflect: !0 })
154
+ ], o.prototype, "kind");
155
+ r([
156
+ a({ type: String })
157
+ ], o.prototype, "code");
158
+ r([
159
+ a({ type: String, attribute: "home-href" })
160
+ ], o.prototype, "homeHref");
161
+ r([
162
+ a({ type: Number, attribute: "heading-level" })
163
+ ], o.prototype, "headingLevel");
164
+ r([
165
+ a({ type: Boolean, reflect: !0 })
166
+ ], o.prototype, "fill");
167
+ r([
168
+ a({ attribute: !1 })
169
+ ], o.prototype, "texts");
170
+ r([
171
+ g()
172
+ ], o.prototype, "ownActions");
173
+ u("kt-error-page", o);
174
+ export {
175
+ o as KtErrorPage
176
+ };
177
+ //# sourceMappingURL=kt-error-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-error-page.js","sources":["../../../../src/components/blocks/kt-error-page/kt-error-page.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 { emit } from '#internal/events';\nimport { heading } from '#internal/heading';\nimport { hasAssignedContent } from '#internal/slots';\nimport '../../core/kt-button/kt-button.js';\n\nexport type KtErrorPageKind = 'not-found' | 'error' | 'maintenance';\n\n/** Every word the page says, in English until given others. */\nexport interface KtErrorPageTexts {\n readonly notFoundHeading: string;\n readonly notFoundLead: string;\n readonly errorHeading: string;\n readonly errorLead: string;\n readonly maintenanceHeading: string;\n readonly maintenanceLead: string;\n readonly goHome: string;\n readonly tryAgain: string;\n}\n\nconst TEXTS: KtErrorPageTexts = {\n notFoundHeading: 'Page not found',\n notFoundLead:\n 'The page you were looking for has moved, or never was. Check the address, or start again from home.',\n errorHeading: 'Something went wrong',\n errorLead:\n 'It is on our side, not yours. Try again in a moment; if it keeps happening, we are already on it.',\n maintenanceHeading: 'Back in a moment',\n maintenanceLead:\n 'We are making things better. The page will be back shortly — nothing you have done is lost.',\n goHome: 'Go home',\n tryAgain: 'Try again',\n};\n\nconst CODES: Record<KtErrorPageKind, string> = {\n 'not-found': '404',\n error: '500',\n maintenance: '503',\n};\n\n/**\n * The page a person lands on when the one they wanted is not there: not found,\n * broken, or down for maintenance — said plainly, with the way on.\n *\n * `not-found` leads home (`home-href`); `error` offers to try again, firing\n * `kt-retry` — cancel it to retry your own way, otherwise the page reloads;\n * `maintenance` offers nothing it cannot do. The `actions` slot replaces the\n * buttons. Every word is in `texts`, English until given others.\n *\n * @element kt-error-page\n *\n * @slot actions - Replaces the buttons: a search, a link to the status page.\n * @slot - Under the actions: a contact line, a request id.\n *\n * @csspart base - The block.\n * @csspart code - The code, large.\n *\n * @fires kt-retry - Try again was pressed. Cancelable; uncancelled, the page reloads.\n *\n * @example\n * ```html\n * <kt-error-page fill home-href=\"/app\"></kt-error-page>\n * <kt-error-page kind=\"error\"></kt-error-page>\n * ```\n */\nexport class KtErrorPage extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n :host([fill]) {\n display: grid;\n min-height: 100%;\n place-items: center;\n }\n\n .page {\n display: grid;\n gap: var(--gap-card);\n justify-items: center;\n max-width: 560px;\n margin: 0 auto;\n padding: calc(var(--padding-card) * 2) var(--padding-card);\n text-align: center;\n }\n\n .code {\n color: var(--color-primary-text);\n font: 600 clamp(64px, 12vw, 120px) / 1 var(--font-family-display);\n letter-spacing: -0.04em;\n }\n .heading {\n margin: 0;\n color: var(--text-body);\n font: var(--font-title-h4);\n text-wrap: balance;\n }\n .lead {\n max-width: 46ch;\n margin: 0;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n line-height: 1.6;\n text-wrap: pretty;\n }\n\n .actions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--gap-button);\n justify-content: center;\n }\n .actions:empty,\n .actions[hidden] {\n display: none;\n }\n\n /* Home is a link, drawn as the primary button. */\n .home {\n display: inline-flex;\n align-items: center;\n height: var(--button-height);\n padding: 0 var(--button-padding-x);\n color: var(--color-white);\n font: var(--font-normal-regular);\n text-decoration: none;\n background-color: var(--color-primary-base);\n border-radius: var(--border-radius);\n transition: background-color var(--duration-instant);\n }\n .home:hover {\n background-color: var(--color-primary-hover);\n }\n /* Second to Try again: a link, not a second primary button. */\n .home.quiet,\n .home.quiet:hover {\n color: var(--color-primary-text);\n background-color: transparent;\n }\n .home:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n .more {\n color: var(--text-muted);\n font: var(--font-normal-small);\n }\n .more:empty {\n display: none;\n }\n `,\n ];\n\n /** `not-found`, `error` or `maintenance`. */\n @property({ type: String, reflect: true })\n kind: KtErrorPageKind = 'not-found';\n\n /** The code shown large. Defaults to the kind's: 404, 500, 503. */\n @property({ type: String })\n code = '';\n\n /** Where Go home leads. */\n @property({ type: String, attribute: 'home-href' })\n homeHref = '/';\n\n /** The heading's level, 1 to 6: 1 when it is the page. */\n @property({ type: Number, attribute: 'heading-level' })\n headingLevel = 1;\n\n /** Fills its container's height and centres itself in it. */\n @property({ type: Boolean, reflect: true })\n fill = false;\n\n /** The words, English until given others. */\n @property({ attribute: false })\n texts: Partial<KtErrorPageTexts> = {};\n\n @state() private ownActions = false;\n\n override firstUpdated(): void {\n this.readActions();\n }\n\n private readActions(): void {\n this.ownActions = hasAssignedContent(this.shadowRoot?.querySelector('slot[name=\"actions\"]'));\n }\n\n private retry(): void {\n const event = emit(this, 'kt-retry');\n if (!event.defaultPrevented) location.reload();\n }\n\n override render(): TemplateResult {\n const t = { ...TEXTS, ...this.texts };\n const words: Record<KtErrorPageKind, readonly [string, string]> = {\n 'not-found': [t.notFoundHeading, t.notFoundLead],\n error: [t.errorHeading, t.errorLead],\n maintenance: [t.maintenanceHeading, t.maintenanceLead],\n };\n const [title, lead] = words[this.kind] ?? words['not-found'];\n const defaults =\n this.kind === 'maintenance'\n ? nothing\n : html`${\n this.kind === 'error'\n ? html`<kt-button @click=${() => this.retry()}>${t.tryAgain}</kt-button>`\n : nothing\n }\n <a class=${this.kind === 'error' ? 'home quiet' : 'home'} href=${this.homeHref}\n >${t.goHome}</a\n >`;\n return html`<section part=\"base\" class=\"page\">\n <div part=\"code\" class=\"code\" aria-hidden=\"true\">${this.code || CODES[this.kind]}</div>\n ${heading(this.headingLevel, title, 'heading', 1)}\n <p class=\"lead\">${lead}</p>\n <div class=\"actions\">\n <slot name=\"actions\" @slotchange=${this.readActions}></slot>\n ${this.ownActions ? nothing : defaults}\n </div>\n <div class=\"more\"><slot></slot></div>\n </section>`;\n }\n}\n\ndefineElement('kt-error-page', KtErrorPage);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-error-page': KtErrorPage;\n }\n}\n"],"names":["TEXTS","CODES","KtErrorPage","KtElement","css","hasAssignedContent","emit","words","title","lead","defaults","nothing","html","heading","__decorateClass","property","state","defineElement"],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ import '../../overlays/kt-accordion/kt-accordion.js';
4
+ import '../../overlays/kt-collapsible/kt-collapsible.js';
5
+ export interface KtFaqItem {
6
+ readonly question: string;
7
+ readonly answer: string;
8
+ }
9
+ export type KtFaqLayout = 'stacked' | 'split';
10
+ /**
11
+ * The questions people ask before they sign up, answered: an accordion under a
12
+ * heading, one answer open at a time.
13
+ *
14
+ * The questions are data: `faq.items = [{ question, answer }]`. `multiple`
15
+ * lets each open on its own; `open-first` opens the first. `stacked` puts the
16
+ * head over the questions; `split` beside them, where the block is wide
17
+ * enough.
18
+ *
19
+ * @element kt-faq
20
+ *
21
+ * @slot note - Under the head: where to ask what is not answered.
22
+ *
23
+ * @csspart base - The section.
24
+ *
25
+ * @example
26
+ * ```html
27
+ * <kt-faq heading="Questions" layout="split">
28
+ * <span slot="note">Something else? <a href="/contact">Ask us</a>.</span>
29
+ * </kt-faq>
30
+ * <script>
31
+ * faq.items = [{ question: 'Can I cancel any time?', answer: 'Yes, from Settings.' }];
32
+ * </script>
33
+ * ```
34
+ */
35
+ export declare class KtFaq extends KtElement {
36
+ static styles: import("lit").CSSResultGroup[];
37
+ heading: string;
38
+ lead: string;
39
+ /** `center` or `start`: the head, when stacked. */
40
+ align: 'center' | 'start';
41
+ /** The questions and their answers, in order. */
42
+ items: readonly KtFaqItem[];
43
+ /** Each answer opens and closes on its own, rather than one at a time. */
44
+ multiple: boolean;
45
+ /** Opens the first answer. */
46
+ openFirst: boolean;
47
+ /** `stacked`: the head over the questions. `split`: beside them, where there is room. */
48
+ layout: KtFaqLayout;
49
+ /** The heading's level. */
50
+ headingLevel: number;
51
+ private hasNote;
52
+ private readonly headingId;
53
+ firstUpdated(): void;
54
+ private readNote;
55
+ render(): TemplateResult;
56
+ }
57
+ declare global {
58
+ interface HTMLElementTagNameMap {
59
+ 'kt-faq': KtFaq;
60
+ }
61
+ }