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 @@
1
+ {"version":3,"file":"kt-pricing-table.js","sources":["../../../../src/components/blocks/kt-pricing-table/kt-pricing-table.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-badge/kt-badge.js';\nimport '../../core/kt-button/kt-button.js';\nimport '../../core/kt-icon/kt-icon.js';\nimport '../../navigation/kt-segmented-control/kt-segmented-control.js';\n\nexport type KtBilling = 'monthly' | 'yearly';\n\n/** A number is formatted in `currency`; a string, \"Custom\", is shown as written. */\nexport type KtPlanPrice = number | string;\n\nexport interface KtPlan {\n readonly id: string;\n readonly name: string;\n readonly description?: string;\n /** One price, or one per billing period — which shows the switch. */\n readonly price: KtPlanPrice | { readonly monthly: KtPlanPrice; readonly yearly: KtPlanPrice };\n /** What the plan includes, a line each. */\n readonly features: readonly string[];\n /** The button's words. Get started until given others. */\n readonly action?: string;\n /** Makes the button a link. Without it, the button fires `kt-plan`. */\n readonly href?: string;\n /** The plan to pick: raised, and badged. */\n readonly featured?: boolean;\n}\n\n/** Every word the table says, in English until given others. */\nexport interface KtPricingTableTexts {\n readonly monthly: string;\n readonly yearly: string;\n readonly billing: string;\n readonly perMonth: string;\n readonly perYear: string;\n readonly featured: string;\n readonly action: string;\n}\n\nconst TEXTS: KtPricingTableTexts = {\n monthly: 'Monthly',\n yearly: 'Yearly',\n billing: 'Billing period',\n perMonth: '/month',\n perYear: '/year',\n featured: 'Most popular',\n action: 'Get started',\n};\n\n/**\n * The plans, side by side: what each costs, what it includes, and the way in —\n * with a switch between monthly and yearly prices when the plans have both.\n *\n * The plans are data: `table.plans = [{ id, name, price, features }]`. A price\n * that is a number is formatted in `currency`; a string is shown as written. A\n * plan's button fires `kt-plan`, or is a link with an `href`.\n *\n * @element kt-pricing-table\n *\n * @slot note - Under the plans: taxes, a link to compare every feature.\n *\n * @csspart base - The section.\n * @csspart plan - One plan.\n *\n * @fires kt-billing - The billing period changed. `detail: { billing }`.\n * @fires kt-plan - A plan's button was pressed. `detail: { id, billing }`.\n *\n * @example\n * ```html\n * <kt-pricing-table heading=\"Pricing\" currency=\"EUR\" yearly-note=\"2 months free\"></kt-pricing-table>\n * <script>\n * table.plans = [\n * { id: 'team', name: 'Team', price: { monthly: 29, yearly: 290 }, features: ['Unlimited invoices'] },\n * ];\n * </script>\n * ```\n */\nexport class KtPricingTable extends KtElement {\n static override styles = [\n KtElement.styles,\n blockStyles,\n css`\n .switch {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n align-items: center;\n }\n :host([align='center']) .switch {\n justify-content: center;\n }\n .saving {\n color: var(--color-primary-text);\n font: var(--font-normal-small);\n }\n\n .plans {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr));\n gap: var(--gap-card);\n align-items: stretch;\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n .plan {\n display: flex;\n flex-direction: column;\n gap: var(--gap-card);\n min-width: 0;\n text-align: start;\n padding: calc(var(--padding-card) * 1.25);\n border: var(--border-width) solid var(--border-subtle);\n border-radius: var(--border-radius-card);\n }\n .plan.featured {\n border-color: var(--color-primary-base);\n box-shadow: 0 0 0 1px var(--color-primary-base);\n }\n\n .plan-head {\n display: grid;\n gap: 6px;\n }\n .name-row {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n align-items: center;\n justify-content: space-between;\n min-height: 28px;\n }\n .plan-name {\n margin: 0;\n color: var(--text-body);\n font: var(--font-title-h6);\n }\n .plan-description {\n margin: 0;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n }\n\n .price {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n align-items: baseline;\n margin: 0;\n }\n .amount {\n color: var(--text-body);\n font: 600 40px / 1.1 var(--font-family-display);\n font-variant-numeric: tabular-nums;\n letter-spacing: -0.03em;\n }\n .period {\n color: var(--text-muted);\n font: var(--font-normal-regular);\n }\n\n .action {\n width: 100%;\n }\n a.action {\n display: inline-flex;\n align-items: center;\n justify-content: 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 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 .featured a.action {\n color: var(--color-white);\n background-color: var(--color-primary-base);\n }\n .featured a.action:hover {\n background-color: var(--color-primary-hover);\n }\n a.action:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n .features {\n display: grid;\n gap: 10px;\n margin: 0;\n padding: var(--gap-card) 0 0;\n color: var(--text-body);\n font: var(--font-normal-regular);\n list-style: none;\n border-top: var(--border-width) solid var(--border-subtle);\n }\n .features li {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n gap: 10px;\n align-items: start;\n }\n .features kt-icon {\n margin-top: 2px;\n color: var(--color-primary-text);\n }\n\n .note {\n color: var(--text-muted);\n font: var(--font-normal-small);\n }\n :host([align='center']) .note {\n text-align: center;\n }\n .note.empty {\n display: none;\n }\n `,\n ];\n\n @property({ type: String })\n heading = '';\n\n @property({ type: String })\n lead = '';\n\n /** `center` or `start`: the head and the switch. */\n @property({ type: String, reflect: true })\n align: 'center' | 'start' = 'center';\n\n /** The plans, in order. */\n @property({ attribute: false })\n plans: readonly KtPlan[] = [];\n\n /** The prices shown: `monthly` or `yearly`. */\n @property({ type: String, reflect: true })\n billing: KtBilling = 'monthly';\n\n /** The currency numeric prices are in: an ISO code, USD until given another. */\n @property({ type: String })\n currency = 'USD';\n\n /** The locale prices are formatted in; the page's language when empty. */\n @property({ type: String })\n locale = '';\n\n /** Beside the switch: what paying yearly saves — \"2 months free\". */\n @property({ type: String, attribute: 'yearly-note' })\n yearlyNote = '';\n\n /** The heading's level; the plans' names sit one under. */\n @property({ type: Number, attribute: 'heading-level' })\n headingLevel = 2;\n\n /** The words, English until given others. */\n @property({ attribute: false })\n texts: Partial<KtPricingTableTexts> = {};\n\n @state() private hasNote = false;\n\n private readonly headingId = blockId('kt-pricing-table');\n\n override firstUpdated(): void {\n this.readNote();\n }\n\n private readNote(): void {\n this.hasNote = hasAssignedContent(this.shadowRoot?.querySelector('slot[name=\"note\"]'));\n }\n\n private get words(): KtPricingTableTexts {\n return { ...TEXTS, ...this.texts };\n }\n\n private format(price: KtPlanPrice): string {\n if (typeof price === 'string') return price;\n const whole = Number.isInteger(price);\n return new Intl.NumberFormat(this.locale || document.documentElement.lang || undefined, {\n style: 'currency',\n currency: this.currency,\n minimumFractionDigits: whole ? 0 : 2,\n maximumFractionDigits: whole ? 0 : 2,\n }).format(price);\n }\n\n private choose(plan: KtPlan): void {\n emit(this, 'kt-plan', { id: plan.id, billing: this.billing });\n }\n\n private onBilling(event: CustomEvent<{ value: string }>): void {\n event.stopPropagation();\n const billing: KtBilling = event.detail.value === 'yearly' ? 'yearly' : 'monthly';\n if (billing === this.billing) return;\n this.billing = billing;\n emit(this, 'kt-billing', { billing });\n }\n\n private price(plan: KtPlan): TemplateResult {\n const t = this.words;\n const both = typeof plan.price === 'object';\n const price = typeof plan.price === 'object' ? plan.price[this.billing] : plan.price;\n const period =\n typeof price === 'number' ? (both && this.billing === 'yearly' ? t.perYear : t.perMonth) : '';\n return html`<p class=\"price\">\n <span class=\"amount\">${this.format(price)}</span>\n ${period ? html`<span class=\"period\">${period}</span>` : nothing}\n </p>`;\n }\n\n private plan(plan: KtPlan): TemplateResult {\n const t = this.words;\n const label = plan.action || t.action;\n return html`<li part=\"plan\" class=${plan.featured ? 'plan featured' : 'plan'}>\n <div class=\"plan-head\">\n <div class=\"name-row\">\n ${heading(this.headingLevel + 1, plan.name, 'plan-name', 3)}\n ${\n plan.featured\n ? html`<kt-badge class=\"badge\" tone=\"primary\" size=\"small\">${t.featured}</kt-badge>`\n : nothing\n }\n </div>\n ${plan.description ? html`<p class=\"plan-description\">${plan.description}</p>` : nothing}\n </div>\n ${this.price(plan)}\n ${\n plan.href\n ? html`<a class=\"action\" href=${plan.href}>${label}</a>`\n : html`<kt-button\n class=\"action\"\n variant=${plan.featured ? 'primary' : 'secondary'}\n @click=${() => this.choose(plan)}\n >${label}</kt-button\n >`\n }\n ${\n plan.features.length\n ? html`<ul class=\"features\" role=\"list\">\n ${plan.features.map(\n (feature) =>\n html`<li>\n <kt-icon name=\"check\" size=\"16\" aria-hidden=\"true\"></kt-icon\n ><span>${feature}</span>\n </li>`,\n )}\n </ul>`\n : nothing\n }\n </li>`;\n }\n\n override render(): TemplateResult {\n const t = this.words;\n const both = this.plans.some((plan) => typeof plan.price === 'object');\n return html`<section\n part=\"base\"\n class=\"block\"\n aria-labelledby=${this.heading ? this.headingId : nothing}\n >\n ${blockHead({ title: this.heading, lead: this.lead, level: this.headingLevel, id: this.headingId })}\n ${\n both\n ? html`<div class=\"switch\">\n <kt-segmented-control\n label=${t.billing}\n .options=${[\n { value: 'monthly', label: t.monthly },\n { value: 'yearly', label: t.yearly },\n ]}\n .value=${this.billing}\n @kt-change=${this.onBilling}\n ></kt-segmented-control>\n ${this.yearlyNote ? html`<span class=\"saving\">${this.yearlyNote}</span>` : nothing}\n </div>`\n : nothing\n }\n <ul class=\"plans\" role=\"list\">\n ${this.plans.map((plan) => this.plan(plan))}\n </ul>\n <div class=${this.hasNote ? 'note' : 'note empty'}>\n <slot name=\"note\" @slotchange=${this.readNote}></slot>\n </div>\n </section>`;\n }\n}\n\ndefineElement('kt-pricing-table', KtPricingTable);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-pricing-table': KtPricingTable;\n }\n}\n"],"names":["TEXTS","KtPricingTable","KtElement","blockId","blockStyles","css","hasAssignedContent","price","whole","plan","emit","event","billing","t","both","period","html","nothing","label","heading","feature","blockHead","__decorateClass","property","state","defineElement"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ export type KtSettingsSectionLayout = 'split' | 'stacked';
4
+ /**
5
+ * One part of a settings page: what it is about, the fields that change it,
6
+ * and the button that saves them.
7
+ *
8
+ * `split`, the default, sets the heading and its description beside the
9
+ * fields once the section is wide enough — the settings page most products
10
+ * have; `stacked` puts them over the fields. `danger` marks the section that
11
+ * deletes things.
12
+ *
13
+ * @element kt-settings-section
14
+ *
15
+ * @slot - The fields.
16
+ * @slot actions - In the footer, at the end: Save, Cancel.
17
+ * @slot note - In the footer, at the start: when it was last saved, what saving does.
18
+ *
19
+ * @csspart base - The section.
20
+ * @csspart card - The fields and the footer.
21
+ * @csspart footer - The footer.
22
+ *
23
+ * @example
24
+ * ```html
25
+ * <kt-settings-section heading="Profile" description="How others see you in the workspace.">
26
+ * <kt-label-input label="Name"><kt-input value="Ada Park"></kt-input></kt-label-input>
27
+ * <kt-button slot="actions">Save</kt-button>
28
+ * </kt-settings-section>
29
+ * ```
30
+ */
31
+ export declare class KtSettingsSection extends KtElement {
32
+ static styles: import("lit").CSSResultGroup[];
33
+ heading: string;
34
+ /** What the section changes, under its heading. */
35
+ description: string;
36
+ /** `split`: the heading beside the fields, where there is room. `stacked`: over them. */
37
+ layout: KtSettingsSectionLayout;
38
+ /** The section that deletes things: its heading and card turn red. */
39
+ danger: boolean;
40
+ /** The heading's level. */
41
+ headingLevel: number;
42
+ private filled;
43
+ private readonly headingId;
44
+ firstUpdated(): void;
45
+ private readSlots;
46
+ render(): TemplateResult;
47
+ }
48
+ declare global {
49
+ interface HTMLElementTagNameMap {
50
+ 'kt-settings-section': KtSettingsSection;
51
+ }
52
+ }
@@ -0,0 +1,158 @@
1
+ import { css as h, nothing as l, html as p } from "lit";
2
+ import { property as s, state as g } from "lit/decorators.js";
3
+ import { K as c, d as f } from "../../../chunks/kt-element-DvWtPQ1Y.js";
4
+ import { b as m } from "../../../chunks/block-Cci-Kff_.js";
5
+ import { h as v } from "../../../chunks/heading-DsnZsfg-.js";
6
+ import { h as y } from "../../../chunks/slots-BPbIdxAJ.js";
7
+ var b = Object.defineProperty, a = (o, t, r, u) => {
8
+ for (var i = void 0, d = o.length - 1, n; d >= 0; d--)
9
+ (n = o[d]) && (i = n(t, r, i) || i);
10
+ return i && b(t, r, i), i;
11
+ };
12
+ class e extends c {
13
+ constructor() {
14
+ super(...arguments), this.heading = "", this.description = "", this.layout = "split", this.danger = !1, this.headingLevel = 2, this.filled = /* @__PURE__ */ new Set(), this.headingId = m("kt-settings-section"), this.readSlots = () => {
15
+ const t = /* @__PURE__ */ new Set();
16
+ for (const r of this.shadowRoot?.querySelectorAll("slot") ?? [])
17
+ y(r) && t.add(r.name);
18
+ this.filled = t;
19
+ };
20
+ }
21
+ static {
22
+ this.styles = [
23
+ c.styles,
24
+ h`
25
+ :host {
26
+ display: block;
27
+ container-type: inline-size;
28
+ }
29
+
30
+ section {
31
+ display: grid;
32
+ gap: var(--gap-card);
33
+ }
34
+ @container (min-width: 760px) {
35
+ :host([layout='split']) section {
36
+ grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);
37
+ gap: calc(var(--gap-card) * 2);
38
+ align-items: start;
39
+ }
40
+ }
41
+
42
+ .about {
43
+ display: grid;
44
+ gap: 6px;
45
+ align-content: start;
46
+ }
47
+ .heading {
48
+ margin: 0;
49
+ color: var(--text-body);
50
+ font: var(--font-title-h6);
51
+ }
52
+ :host([danger]) .heading {
53
+ color: var(--color-danger-text);
54
+ }
55
+ .description {
56
+ margin: 0;
57
+ color: var(--text-muted);
58
+ font: var(--font-normal-regular);
59
+ line-height: 1.55;
60
+ text-wrap: pretty;
61
+ }
62
+
63
+ .card {
64
+ min-width: 0;
65
+ border: var(--border-width) solid var(--border-subtle);
66
+ border-radius: var(--border-radius-card);
67
+ }
68
+ :host([danger]) .card {
69
+ border-color: var(--color-danger-base);
70
+ }
71
+ .fields {
72
+ display: grid;
73
+ gap: var(--gap-form);
74
+ padding: calc(var(--padding-card) * 1.25);
75
+ }
76
+ .fields.empty {
77
+ display: none;
78
+ }
79
+
80
+ .footer {
81
+ display: flex;
82
+ flex-wrap: wrap;
83
+ gap: 12px var(--gap-card);
84
+ align-items: center;
85
+ justify-content: space-between;
86
+ padding: 12px calc(var(--padding-card) * 1.25);
87
+ border-top: var(--border-width) solid var(--border-subtle);
88
+ }
89
+ .fields.empty + .footer {
90
+ border-top: 0;
91
+ }
92
+ .footer.empty {
93
+ display: none;
94
+ }
95
+ .note {
96
+ color: var(--text-muted);
97
+ font: var(--font-normal-small);
98
+ }
99
+ .actions {
100
+ display: flex;
101
+ flex-wrap: wrap;
102
+ gap: var(--gap-button);
103
+ margin-inline-start: auto;
104
+ }
105
+ `
106
+ ];
107
+ }
108
+ firstUpdated() {
109
+ this.readSlots();
110
+ }
111
+ render() {
112
+ const t = this.filled.has("actions") || this.filled.has("note");
113
+ return p`<section
114
+ part="base"
115
+ aria-labelledby=${this.headingId}
116
+ aria-describedby=${this.description ? `${this.headingId}-description` : l}
117
+ >
118
+ <div class="about">
119
+ <div id=${this.headingId}>${v(this.headingLevel, this.heading, "heading", 2)}</div>
120
+ ${this.description ? p`<p id=${`${this.headingId}-description`} class="description">
121
+ ${this.description}
122
+ </p>` : l}
123
+ </div>
124
+ <div part="card" class="card">
125
+ <div class=${this.filled.has("") ? "fields" : "fields empty"}>
126
+ <slot @slotchange=${this.readSlots}></slot>
127
+ </div>
128
+ <div part="footer" class=${t ? "footer" : "footer empty"}>
129
+ <span class="note"><slot name="note" @slotchange=${this.readSlots}></slot></span>
130
+ <span class="actions"><slot name="actions" @slotchange=${this.readSlots}></slot></span>
131
+ </div>
132
+ </div>
133
+ </section>`;
134
+ }
135
+ }
136
+ a([
137
+ s({ type: String })
138
+ ], e.prototype, "heading");
139
+ a([
140
+ s({ type: String })
141
+ ], e.prototype, "description");
142
+ a([
143
+ s({ type: String, reflect: !0 })
144
+ ], e.prototype, "layout");
145
+ a([
146
+ s({ type: Boolean, reflect: !0 })
147
+ ], e.prototype, "danger");
148
+ a([
149
+ s({ type: Number, attribute: "heading-level" })
150
+ ], e.prototype, "headingLevel");
151
+ a([
152
+ g()
153
+ ], e.prototype, "filled");
154
+ f("kt-settings-section", e);
155
+ export {
156
+ e as KtSettingsSection
157
+ };
158
+ //# sourceMappingURL=kt-settings-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-settings-section.js","sources":["../../../../src/components/blocks/kt-settings-section/kt-settings-section.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 { blockId } from '#internal/block';\nimport { heading } from '#internal/heading';\nimport { hasAssignedContent } from '#internal/slots';\n\nexport type KtSettingsSectionLayout = 'split' | 'stacked';\n\n/**\n * One part of a settings page: what it is about, the fields that change it,\n * and the button that saves them.\n *\n * `split`, the default, sets the heading and its description beside the\n * fields once the section is wide enough — the settings page most products\n * have; `stacked` puts them over the fields. `danger` marks the section that\n * deletes things.\n *\n * @element kt-settings-section\n *\n * @slot - The fields.\n * @slot actions - In the footer, at the end: Save, Cancel.\n * @slot note - In the footer, at the start: when it was last saved, what saving does.\n *\n * @csspart base - The section.\n * @csspart card - The fields and the footer.\n * @csspart footer - The footer.\n *\n * @example\n * ```html\n * <kt-settings-section heading=\"Profile\" description=\"How others see you in the workspace.\">\n * <kt-label-input label=\"Name\"><kt-input value=\"Ada Park\"></kt-input></kt-label-input>\n * <kt-button slot=\"actions\">Save</kt-button>\n * </kt-settings-section>\n * ```\n */\nexport class KtSettingsSection extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n container-type: inline-size;\n }\n\n section {\n display: grid;\n gap: var(--gap-card);\n }\n @container (min-width: 760px) {\n :host([layout='split']) section {\n grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);\n gap: calc(var(--gap-card) * 2);\n align-items: start;\n }\n }\n\n .about {\n display: grid;\n gap: 6px;\n align-content: start;\n }\n .heading {\n margin: 0;\n color: var(--text-body);\n font: var(--font-title-h6);\n }\n :host([danger]) .heading {\n color: var(--color-danger-text);\n }\n .description {\n margin: 0;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n line-height: 1.55;\n text-wrap: pretty;\n }\n\n .card {\n min-width: 0;\n border: var(--border-width) solid var(--border-subtle);\n border-radius: var(--border-radius-card);\n }\n :host([danger]) .card {\n border-color: var(--color-danger-base);\n }\n .fields {\n display: grid;\n gap: var(--gap-form);\n padding: calc(var(--padding-card) * 1.25);\n }\n .fields.empty {\n display: none;\n }\n\n .footer {\n display: flex;\n flex-wrap: wrap;\n gap: 12px var(--gap-card);\n align-items: center;\n justify-content: space-between;\n padding: 12px calc(var(--padding-card) * 1.25);\n border-top: var(--border-width) solid var(--border-subtle);\n }\n .fields.empty + .footer {\n border-top: 0;\n }\n .footer.empty {\n display: none;\n }\n .note {\n color: var(--text-muted);\n font: var(--font-normal-small);\n }\n .actions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--gap-button);\n margin-inline-start: auto;\n }\n `,\n ];\n\n @property({ type: String })\n heading = '';\n\n /** What the section changes, under its heading. */\n @property({ type: String })\n description = '';\n\n /** `split`: the heading beside the fields, where there is room. `stacked`: over them. */\n @property({ type: String, reflect: true })\n layout: KtSettingsSectionLayout = 'split';\n\n /** The section that deletes things: its heading and card turn red. */\n @property({ type: Boolean, reflect: true })\n danger = false;\n\n /** The heading's level. */\n @property({ type: Number, attribute: 'heading-level' })\n headingLevel = 2;\n\n @state() private filled = new Set<string>();\n\n private readonly headingId = blockId('kt-settings-section');\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 override render(): TemplateResult {\n const footer = this.filled.has('actions') || this.filled.has('note');\n return html`<section\n part=\"base\"\n aria-labelledby=${this.headingId}\n aria-describedby=${this.description ? `${this.headingId}-description` : nothing}\n >\n <div class=\"about\">\n <div id=${this.headingId}>${heading(this.headingLevel, this.heading, 'heading', 2)}</div>\n ${\n this.description\n ? html`<p id=${`${this.headingId}-description`} class=\"description\">\n ${this.description}\n </p>`\n : nothing\n }\n </div>\n <div part=\"card\" class=\"card\">\n <div class=${this.filled.has('') ? 'fields' : 'fields empty'}>\n <slot @slotchange=${this.readSlots}></slot>\n </div>\n <div part=\"footer\" class=${footer ? 'footer' : 'footer empty'}>\n <span class=\"note\"><slot name=\"note\" @slotchange=${this.readSlots}></slot></span>\n <span class=\"actions\"><slot name=\"actions\" @slotchange=${this.readSlots}></slot></span>\n </div>\n </div>\n </section>`;\n }\n}\n\ndefineElement('kt-settings-section', KtSettingsSection);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-settings-section': KtSettingsSection;\n }\n}\n"],"names":["KtSettingsSection","KtElement","blockId","filled","slot","hasAssignedContent","css","footer","html","nothing","heading","__decorateClass","property","state","defineElement"],"mappings":";;;;;;;;;;;AAoCO,MAAMA,UAA0BC,EAAU;AAAA,EAA1C,cAAA;AAAA,UAAA,GAAA,SAAA,GAwFL,KAAA,UAAU,IAIV,KAAA,cAAc,IAId,KAAA,SAAkC,SAIlC,KAAA,SAAS,IAIT,KAAA,eAAe,GAEN,KAAQ,6BAAa,IAAA,GAE9B,KAAiB,YAAYC,EAAQ,qBAAqB,GAM1D,KAAQ,YAAY,MAAY;AAC9B,YAAMC,wBAAa,IAAA;AACnB,iBAAWC,KAAQ,KAAK,YAAY,iBAAiB,MAAM,KAAK;AAC9D,QAAIC,EAAmBD,CAAI,KAAGD,EAAO,IAAIC,EAAK,IAAI;AAEpD,WAAK,SAASD;AAAA,IAChB;AAAA,EAAA;AAAA,EAvHA,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBF,EAAU;AAAA,MACVK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAkFF;AAAA,EAyBS,eAAqB;AAC5B,SAAK,UAAA;AAAA,EACP;AAAA,EAUS,SAAyB;AAChC,UAAMC,IAAS,KAAK,OAAO,IAAI,SAAS,KAAK,KAAK,OAAO,IAAI,MAAM;AACnE,WAAOC;AAAA;AAAA,wBAEa,KAAK,SAAS;AAAA,yBACb,KAAK,cAAc,GAAG,KAAK,SAAS,iBAAiBC,CAAO;AAAA;AAAA;AAAA,kBAGnE,KAAK,SAAS,IAAIC,EAAQ,KAAK,cAAc,KAAK,SAAS,WAAW,CAAC,CAAC;AAAA,UAEhF,KAAK,cACDF,UAAa,GAAG,KAAK,SAAS,cAAc;AAAA,kBACxC,KAAK,WAAW;AAAA,sBAEpBC,CACN;AAAA;AAAA;AAAA,qBAGa,KAAK,OAAO,IAAI,EAAE,IAAI,WAAW,cAAc;AAAA,8BACtC,KAAK,SAAS;AAAA;AAAA,mCAETF,IAAS,WAAW,cAAc;AAAA,6DACR,KAAK,SAAS;AAAA,mEACR,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA,EAI/E;AACF;AA9DEI,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAvFfZ,EAwFX,WAAA,SAAA;AAIAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA3FfZ,EA4FX,WAAA,aAAA;AAIAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GA/F9BZ,EAgGX,WAAA,QAAA;AAIAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAnG/BZ,EAoGX,WAAA,QAAA;AAIAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,iBAAiB;AAAA,GAvG3CZ,EAwGX,WAAA,cAAA;AAEiBW,EAAA;AAAA,EAAhBE,EAAA;AAAM,GA1GIb,EA0GM,WAAA,QAAA;AA8CnBc,EAAc,uBAAuBd,CAAiB;"}
@@ -0,0 +1,56 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ import '../../core/kt-avatar/kt-avatar.js';
4
+ export interface KtTestimonial {
5
+ readonly quote: string;
6
+ readonly name: string;
7
+ /** Their role and company: "CFO, Northwind". */
8
+ readonly role?: string;
9
+ /** A photo's URL; without one, the avatar shows their initials. */
10
+ readonly avatar?: string;
11
+ }
12
+ export type KtTestimonialsLayout = 'grid' | 'single';
13
+ /**
14
+ * What the people who use it say: a quote, and who said it.
15
+ *
16
+ * The quotes are data: `wall.testimonials = [{ quote, name, role, avatar }]`.
17
+ * `grid`, the default, sets them in columns that pack quotes of any length;
18
+ * `single` gives each the width of the page, in larger type — for one quote
19
+ * that carries the section.
20
+ *
21
+ * @element kt-testimonials
22
+ *
23
+ * @csspart base - The section.
24
+ * @csspart testimonial - One quote and who said it.
25
+ *
26
+ * @example
27
+ * ```html
28
+ * <kt-testimonials heading="What teams say"></kt-testimonials>
29
+ * <script>
30
+ * wall.testimonials = [
31
+ * { quote: 'We closed the month in a day.', name: 'Ada Park', role: 'CFO, Northwind' },
32
+ * ];
33
+ * </script>
34
+ * ```
35
+ */
36
+ export declare class KtTestimonials extends KtElement {
37
+ static styles: import("lit").CSSResultGroup[];
38
+ heading: string;
39
+ lead: string;
40
+ /** `center` or `start`. */
41
+ align: 'center' | 'start';
42
+ /** The quotes, in order. */
43
+ testimonials: readonly KtTestimonial[];
44
+ /** `grid`: in packed columns. `single`: each the page's width, large. */
45
+ layout: KtTestimonialsLayout;
46
+ /** The heading's level. */
47
+ headingLevel: number;
48
+ private readonly headingId;
49
+ private testimonial;
50
+ render(): TemplateResult;
51
+ }
52
+ declare global {
53
+ interface HTMLElementTagNameMap {
54
+ 'kt-testimonials': KtTestimonials;
55
+ }
56
+ }
@@ -0,0 +1,161 @@
1
+ import { css as c, nothing as p, html as n } from "lit";
2
+ import { property as i } from "lit/decorators.js";
3
+ import { K as g, d as m } from "../../../chunks/kt-element-DvWtPQ1Y.js";
4
+ import { b as h, a as u, c as f } from "../../../chunks/block-Cci-Kff_.js";
5
+ import "../../core/kt-avatar/kt-avatar.js";
6
+ var y = Object.defineProperty, r = (l, t, s, b) => {
7
+ for (var a = void 0, o = l.length - 1, d; o >= 0; o--)
8
+ (d = l[o]) && (a = d(t, s, a) || a);
9
+ return a && y(t, s, a), a;
10
+ };
11
+ class e extends g {
12
+ constructor() {
13
+ super(...arguments), this.heading = "", this.lead = "", this.align = "center", this.testimonials = [], this.layout = "grid", this.headingLevel = 2, this.headingId = h("kt-testimonials");
14
+ }
15
+ static {
16
+ this.styles = [
17
+ g.styles,
18
+ u,
19
+ c`
20
+ .list {
21
+ margin: 0;
22
+ padding: 0;
23
+ list-style: none;
24
+ columns: 3 260px;
25
+ column-gap: var(--gap-card);
26
+ }
27
+ .list > li {
28
+ break-inside: avoid;
29
+ margin-bottom: var(--gap-card);
30
+ }
31
+
32
+ figure {
33
+ display: grid;
34
+ gap: var(--gap-card);
35
+ margin: 0;
36
+ padding: calc(var(--padding-card) * 1.25);
37
+ text-align: start;
38
+ border: var(--border-width) solid var(--border-subtle);
39
+ border-radius: var(--border-radius-card);
40
+ }
41
+ blockquote {
42
+ margin: 0;
43
+ color: var(--text-body);
44
+ font: var(--font-normal-regular);
45
+ font-size: calc(16px * var(--text-scale, 1));
46
+ line-height: 1.6;
47
+ text-wrap: pretty;
48
+ }
49
+ blockquote p {
50
+ margin: 0;
51
+ }
52
+ blockquote p::before {
53
+ content: '“';
54
+ }
55
+ blockquote p::after {
56
+ content: '”';
57
+ }
58
+
59
+ figcaption {
60
+ display: flex;
61
+ gap: 12px;
62
+ align-items: center;
63
+ min-width: 0;
64
+ }
65
+ .who {
66
+ display: grid;
67
+ min-width: 0;
68
+ }
69
+ .name {
70
+ color: var(--text-body);
71
+ font: var(--font-normal-medium);
72
+ }
73
+ .role {
74
+ color: var(--text-muted);
75
+ font: var(--font-normal-small);
76
+ }
77
+
78
+ /* Single: each quote the width of the page, set large, on no card. */
79
+ :host([layout='single']) .list {
80
+ columns: auto;
81
+ max-width: 820px;
82
+ margin-inline: auto;
83
+ }
84
+ :host([layout='single']) .list > li {
85
+ margin-bottom: calc(var(--gap-card) * 3);
86
+ }
87
+ :host([layout='single']) .list > li:last-child {
88
+ margin-bottom: 0;
89
+ }
90
+ :host([layout='single']) figure {
91
+ gap: calc(var(--gap-card) * 1.5);
92
+ padding: 0;
93
+ border: 0;
94
+ }
95
+ :host([layout='single'][align='center']) figure {
96
+ justify-items: center;
97
+ text-align: center;
98
+ }
99
+ :host([layout='single']) blockquote {
100
+ font: 500 clamp(20px, 3cqi, 28px) / 1.4 var(--font-family-display);
101
+ letter-spacing: -0.01em;
102
+ text-wrap: balance;
103
+ }
104
+ `
105
+ ];
106
+ }
107
+ testimonial(t) {
108
+ return n`<li>
109
+ <figure part="testimonial">
110
+ <blockquote><p>${t.quote}</p></blockquote>
111
+ <figcaption>
112
+ <kt-avatar
113
+ name=${t.name}
114
+ src=${t.avatar ?? ""}
115
+ size=${this.layout === "single" ? "large" : "medium"}
116
+ aria-hidden="true"
117
+ ></kt-avatar>
118
+ <span class="who">
119
+ <span class="name">${t.name}</span>
120
+ ${t.role ? n`<span class="role">${t.role}</span>` : p}
121
+ </span>
122
+ </figcaption>
123
+ </figure>
124
+ </li>`;
125
+ }
126
+ render() {
127
+ return n`<section
128
+ part="base"
129
+ class="block"
130
+ aria-labelledby=${this.heading ? this.headingId : p}
131
+ >
132
+ ${f({ title: this.heading, lead: this.lead, level: this.headingLevel, id: this.headingId })}
133
+ <ul class="list" role="list">
134
+ ${this.testimonials.map((t) => this.testimonial(t))}
135
+ </ul>
136
+ </section>`;
137
+ }
138
+ }
139
+ r([
140
+ i({ type: String })
141
+ ], e.prototype, "heading");
142
+ r([
143
+ i({ type: String })
144
+ ], e.prototype, "lead");
145
+ r([
146
+ i({ type: String, reflect: !0 })
147
+ ], e.prototype, "align");
148
+ r([
149
+ i({ attribute: !1 })
150
+ ], e.prototype, "testimonials");
151
+ r([
152
+ i({ type: String, reflect: !0 })
153
+ ], e.prototype, "layout");
154
+ r([
155
+ i({ type: Number, attribute: "heading-level" })
156
+ ], e.prototype, "headingLevel");
157
+ m("kt-testimonials", e);
158
+ export {
159
+ e as KtTestimonials
160
+ };
161
+ //# sourceMappingURL=kt-testimonials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-testimonials.js","sources":["../../../../src/components/blocks/kt-testimonials/kt-testimonials.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { blockHead, blockId, blockStyles } from '#internal/block';\nimport '../../core/kt-avatar/kt-avatar.js';\n\nexport interface KtTestimonial {\n readonly quote: string;\n readonly name: string;\n /** Their role and company: \"CFO, Northwind\". */\n readonly role?: string;\n /** A photo's URL; without one, the avatar shows their initials. */\n readonly avatar?: string;\n}\n\nexport type KtTestimonialsLayout = 'grid' | 'single';\n\n/**\n * What the people who use it say: a quote, and who said it.\n *\n * The quotes are data: `wall.testimonials = [{ quote, name, role, avatar }]`.\n * `grid`, the default, sets them in columns that pack quotes of any length;\n * `single` gives each the width of the page, in larger type — for one quote\n * that carries the section.\n *\n * @element kt-testimonials\n *\n * @csspart base - The section.\n * @csspart testimonial - One quote and who said it.\n *\n * @example\n * ```html\n * <kt-testimonials heading=\"What teams say\"></kt-testimonials>\n * <script>\n * wall.testimonials = [\n * { quote: 'We closed the month in a day.', name: 'Ada Park', role: 'CFO, Northwind' },\n * ];\n * </script>\n * ```\n */\nexport class KtTestimonials extends KtElement {\n static override styles = [\n KtElement.styles,\n blockStyles,\n css`\n .list {\n margin: 0;\n padding: 0;\n list-style: none;\n columns: 3 260px;\n column-gap: var(--gap-card);\n }\n .list > li {\n break-inside: avoid;\n margin-bottom: var(--gap-card);\n }\n\n figure {\n display: grid;\n gap: var(--gap-card);\n margin: 0;\n padding: calc(var(--padding-card) * 1.25);\n text-align: start;\n border: var(--border-width) solid var(--border-subtle);\n border-radius: var(--border-radius-card);\n }\n blockquote {\n margin: 0;\n color: var(--text-body);\n font: var(--font-normal-regular);\n font-size: calc(16px * var(--text-scale, 1));\n line-height: 1.6;\n text-wrap: pretty;\n }\n blockquote p {\n margin: 0;\n }\n blockquote p::before {\n content: '“';\n }\n blockquote p::after {\n content: '”';\n }\n\n figcaption {\n display: flex;\n gap: 12px;\n align-items: center;\n min-width: 0;\n }\n .who {\n display: grid;\n min-width: 0;\n }\n .name {\n color: var(--text-body);\n font: var(--font-normal-medium);\n }\n .role {\n color: var(--text-muted);\n font: var(--font-normal-small);\n }\n\n /* Single: each quote the width of the page, set large, on no card. */\n :host([layout='single']) .list {\n columns: auto;\n max-width: 820px;\n margin-inline: auto;\n }\n :host([layout='single']) .list > li {\n margin-bottom: calc(var(--gap-card) * 3);\n }\n :host([layout='single']) .list > li:last-child {\n margin-bottom: 0;\n }\n :host([layout='single']) figure {\n gap: calc(var(--gap-card) * 1.5);\n padding: 0;\n border: 0;\n }\n :host([layout='single'][align='center']) figure {\n justify-items: center;\n text-align: center;\n }\n :host([layout='single']) blockquote {\n font: 500 clamp(20px, 3cqi, 28px) / 1.4 var(--font-family-display);\n letter-spacing: -0.01em;\n text-wrap: balance;\n }\n `,\n ];\n\n @property({ type: String })\n heading = '';\n\n @property({ type: String })\n lead = '';\n\n /** `center` or `start`. */\n @property({ type: String, reflect: true })\n align: 'center' | 'start' = 'center';\n\n /** The quotes, in order. */\n @property({ attribute: false })\n testimonials: readonly KtTestimonial[] = [];\n\n /** `grid`: in packed columns. `single`: each the page's width, large. */\n @property({ type: String, reflect: true })\n layout: KtTestimonialsLayout = 'grid';\n\n /** The heading's level. */\n @property({ type: Number, attribute: 'heading-level' })\n headingLevel = 2;\n\n private readonly headingId = blockId('kt-testimonials');\n\n private testimonial(item: KtTestimonial): TemplateResult {\n return html`<li>\n <figure part=\"testimonial\">\n <blockquote><p>${item.quote}</p></blockquote>\n <figcaption>\n <kt-avatar\n name=${item.name}\n src=${item.avatar ?? ''}\n size=${this.layout === 'single' ? 'large' : 'medium'}\n aria-hidden=\"true\"\n ></kt-avatar>\n <span class=\"who\">\n <span class=\"name\">${item.name}</span>\n ${item.role ? html`<span class=\"role\">${item.role}</span>` : nothing}\n </span>\n </figcaption>\n </figure>\n </li>`;\n }\n\n override render(): TemplateResult {\n return html`<section\n part=\"base\"\n class=\"block\"\n aria-labelledby=${this.heading ? this.headingId : nothing}\n >\n ${blockHead({ title: this.heading, lead: this.lead, level: this.headingLevel, id: this.headingId })}\n <ul class=\"list\" role=\"list\">\n ${this.testimonials.map((item) => this.testimonial(item))}\n </ul>\n </section>`;\n }\n}\n\ndefineElement('kt-testimonials', KtTestimonials);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-testimonials': KtTestimonials;\n }\n}\n"],"names":["KtTestimonials","KtElement","blockId","blockStyles","css","item","html","nothing","blockHead","__decorateClass","property","defineElement"],"mappings":";;;;;;;;;;AAwCO,MAAMA,UAAuBC,EAAU;AAAA,EAAvC,cAAA;AAAA,UAAA,GAAA,SAAA,GA6FL,KAAA,UAAU,IAGV,KAAA,OAAO,IAIP,KAAA,QAA4B,UAI5B,KAAA,eAAyC,CAAA,GAIzC,KAAA,SAA+B,QAI/B,KAAA,eAAe,GAEf,KAAiB,YAAYC,EAAQ,iBAAiB;AAAA,EAAA;AAAA,EAjHtD,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBD,EAAU;AAAA,MACVE;AAAA,MACAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAsFF;AAAA,EA0BQ,YAAYC,GAAqC;AACvD,WAAOC;AAAA;AAAA,yBAEcD,EAAK,KAAK;AAAA;AAAA;AAAA,mBAGhBA,EAAK,IAAI;AAAA,kBACVA,EAAK,UAAU,EAAE;AAAA,mBAChB,KAAK,WAAW,WAAW,UAAU,QAAQ;AAAA;AAAA;AAAA;AAAA,iCAI/BA,EAAK,IAAI;AAAA,cAC5BA,EAAK,OAAOC,uBAA0BD,EAAK,IAAI,YAAYE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9E;AAAA,EAES,SAAyB;AAChC,WAAOD;AAAA;AAAA;AAAA,wBAGa,KAAK,UAAU,KAAK,YAAYC,CAAO;AAAA;AAAA,QAEvDC,EAAU,EAAE,OAAO,KAAK,SAAS,MAAM,KAAK,MAAM,OAAO,KAAK,cAAc,IAAI,KAAK,UAAA,CAAW,CAAC;AAAA;AAAA,UAE/F,KAAK,aAAa,IAAI,CAACH,MAAS,KAAK,YAAYA,CAAI,CAAC,CAAC;AAAA;AAAA;AAAA,EAG/D;AACF;AAvDEI,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA5FfV,EA6FX,WAAA,SAAA;AAGAS,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA/FfV,EAgGX,WAAA,MAAA;AAIAS,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAnG9BV,EAoGX,WAAA,OAAA;AAIAS,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAvGnBV,EAwGX,WAAA,cAAA;AAIAS,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GA3G9BV,EA4GX,WAAA,QAAA;AAIAS,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,WAAW,iBAAiB;AAAA,GA/G3CV,EAgHX,WAAA,cAAA;AAsCFW,EAAc,mBAAmBX,CAAc;"}
@@ -1,8 +1,8 @@
1
1
  import { css as p, nothing as f, html as n } from "lit";
2
2
  import { state as v, property as o } from "lit/decorators.js";
3
3
  import { classMap as c } from "lit/directives/class-map.js";
4
- import { K as d, d as g } from "../../../chunks/kt-element-T0VbIBNp.js";
5
- import { s as m } from "../../../chunks/index-TWJzttLX.js";
4
+ import { K as d, d as g } from "../../../chunks/kt-element-DvWtPQ1Y.js";
5
+ import { s as m } from "../../../chunks/index-1ZFgagWW.js";
6
6
  import "../kt-icon/kt-icon.js";
7
7
  var y = Object.defineProperty, s = (a, e, t, k) => {
8
8
  for (var i = void 0, l = a.length - 1, h; l >= 0; l--)
@@ -0,0 +1,42 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ import '../kt-avatar/kt-avatar.js';
4
+ import type { KtAvatarSize } from '../kt-avatar/kt-avatar.js';
5
+ export interface KtAvatarGroupPerson {
6
+ readonly name: string;
7
+ /** A picture; without one the avatar draws the name's initials. */
8
+ readonly src?: string;
9
+ }
10
+ /**
11
+ * The people on something — a project's members, a document's editors — as
12
+ * avatars overlapping in a row, the rest summed up as "+N".
13
+ *
14
+ * @element kt-avatar-group
15
+ *
16
+ * @csspart list - The `<ul>`.
17
+ * @csspart more - The "+N" at the end.
18
+ *
19
+ * @example
20
+ * ```html
21
+ * <kt-avatar-group label="Project members" max="3"></kt-avatar-group>
22
+ * <script>
23
+ * group.people = [{ name: 'Dana Whitfield' }, { name: 'Hank Scorpio', src: '/hank.png' }];
24
+ * </script>
25
+ * ```
26
+ */
27
+ export declare class KtAvatarGroup extends KtElement {
28
+ static styles: import("lit").CSSResultGroup[];
29
+ /** The people. Set as a property: `group.people = [...]`. */
30
+ people: readonly KtAvatarGroupPerson[];
31
+ /** How many avatars to show before summing the rest up. */
32
+ max: number;
33
+ size: KtAvatarSize;
34
+ /** Accessible name for the group: "Project members". */
35
+ label: string;
36
+ render(): TemplateResult;
37
+ }
38
+ declare global {
39
+ interface HTMLElementTagNameMap {
40
+ 'kt-avatar-group': KtAvatarGroup;
41
+ }
42
+ }
@@ -0,0 +1,97 @@
1
+ import { css as v, nothing as n, html as m } from "lit";
2
+ import { property as s } from "lit/decorators.js";
3
+ import { K as h, d as u } from "../../../chunks/kt-element-DvWtPQ1Y.js";
4
+ import { s as c } from "../../../chunks/index-1ZFgagWW.js";
5
+ import "../kt-avatar/kt-avatar.js";
6
+ var f = Object.defineProperty, i = (l, e, a, o) => {
7
+ for (var t = void 0, p = l.length - 1, d; p >= 0; p--)
8
+ (d = l[p]) && (t = d(e, a, t) || t);
9
+ return t && f(e, a, t), t;
10
+ };
11
+ class r extends h {
12
+ constructor() {
13
+ super(...arguments), this.people = [], this.max = 4, this.size = "medium", this.label = "";
14
+ }
15
+ static {
16
+ this.styles = [
17
+ h.styles,
18
+ v`
19
+ :host {
20
+ display: inline-block;
21
+ --kt-avatar-size: 32px;
22
+ }
23
+ :host([size='small']) {
24
+ --kt-avatar-size: 24px;
25
+ }
26
+ :host([size='large']) {
27
+ --kt-avatar-size: 48px;
28
+ }
29
+
30
+ ul {
31
+ display: flex;
32
+ margin: 0;
33
+ padding: 0;
34
+ list-style: none;
35
+ }
36
+ /* Each one over the last by a third, ringed in the page's colour so the
37
+ overlap reads as a stack, not a smudge. */
38
+ li {
39
+ display: flex;
40
+ border-radius: var(--radius-full);
41
+ box-shadow: 0 0 0 2px var(--surface-page);
42
+ }
43
+ li + li {
44
+ margin-inline-start: calc(var(--kt-avatar-size) * -0.3);
45
+ }
46
+
47
+ .more {
48
+ display: grid;
49
+ place-items: center;
50
+ min-width: var(--kt-avatar-size);
51
+ height: var(--kt-avatar-size);
52
+ padding: 0 4px;
53
+ color: var(--text-body);
54
+ font: 600 calc(var(--kt-avatar-size) * 0.36) / 1 var(--font-family-body);
55
+ background: var(--surface-raised);
56
+ border-radius: var(--radius-full);
57
+ }
58
+ `
59
+ ];
60
+ }
61
+ render() {
62
+ const e = this.people.slice(0, Math.max(0, this.max)), a = this.people.length - e.length;
63
+ return m`<ul part="list" aria-label=${this.label || n}>
64
+ ${e.map(
65
+ (o) => m`<li>
66
+ <kt-avatar
67
+ name=${o.name}
68
+ src=${o.src || n}
69
+ size=${this.size}
70
+ ></kt-avatar>
71
+ </li>`
72
+ )}
73
+ ${a > 0 ? m`<li>
74
+ <span part="more" class="more" role="img" aria-label=${c().moreCount(a)}
75
+ >+${a}</span
76
+ >
77
+ </li>` : n}
78
+ </ul>`;
79
+ }
80
+ }
81
+ i([
82
+ s({ attribute: !1 })
83
+ ], r.prototype, "people");
84
+ i([
85
+ s({ type: Number })
86
+ ], r.prototype, "max");
87
+ i([
88
+ s({ type: String, reflect: !0 })
89
+ ], r.prototype, "size");
90
+ i([
91
+ s({ type: String })
92
+ ], r.prototype, "label");
93
+ u("kt-avatar-group", r);
94
+ export {
95
+ r as KtAvatarGroup
96
+ };
97
+ //# sourceMappingURL=kt-avatar-group.js.map