kanto-ds 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +155 -0
  3. package/dist/assets/fonts/README.md +19 -0
  4. package/dist/assets/fonts/manrope/OFL.txt +93 -0
  5. package/dist/assets/fonts/manrope/manrope-cyrillic-ext-wght-normal.woff2 +0 -0
  6. package/dist/assets/fonts/manrope/manrope-cyrillic-wght-normal.woff2 +0 -0
  7. package/dist/assets/fonts/manrope/manrope-latin-ext-wght-normal.woff2 +0 -0
  8. package/dist/assets/fonts/manrope/manrope-latin-wght-normal.woff2 +0 -0
  9. package/dist/assets/fonts/mulish/OFL.txt +93 -0
  10. package/dist/assets/fonts/mulish/mulish-cyrillic-ext-wght-italic.woff2 +0 -0
  11. package/dist/assets/fonts/mulish/mulish-cyrillic-ext-wght-normal.woff2 +0 -0
  12. package/dist/assets/fonts/mulish/mulish-cyrillic-wght-italic.woff2 +0 -0
  13. package/dist/assets/fonts/mulish/mulish-cyrillic-wght-normal.woff2 +0 -0
  14. package/dist/assets/fonts/mulish/mulish-latin-ext-wght-italic.woff2 +0 -0
  15. package/dist/assets/fonts/mulish/mulish-latin-ext-wght-normal.woff2 +0 -0
  16. package/dist/assets/fonts/mulish/mulish-latin-wght-italic.woff2 +0 -0
  17. package/dist/assets/fonts/mulish/mulish-latin-wght-normal.woff2 +0 -0
  18. package/dist/assets/fonts/source_code_pro/OFL.txt +93 -0
  19. package/dist/assets/fonts/source_code_pro/SourceCodePro-Regular.woff2 +0 -0
  20. package/dist/chunks/dialog-CPIfFIlF.js +29 -0
  21. package/dist/chunks/dialog-CPIfFIlF.js.map +1 -0
  22. package/dist/chunks/events-Bjl5Zmmq.js +18 -0
  23. package/dist/chunks/events-Bjl5Zmmq.js.map +1 -0
  24. package/dist/chunks/form-control-CxjBTt1c.js +17 -0
  25. package/dist/chunks/form-control-CxjBTt1c.js.map +1 -0
  26. package/dist/chunks/kt-element-CcMLO5e8.js +28 -0
  27. package/dist/chunks/kt-element-CcMLO5e8.js.map +1 -0
  28. package/dist/chunks/listbox-CUXYn_3S.js +101 -0
  29. package/dist/chunks/listbox-CUXYn_3S.js.map +1 -0
  30. package/dist/chunks/registry-X4LS9J5K.js +30 -0
  31. package/dist/chunks/registry-X4LS9J5K.js.map +1 -0
  32. package/dist/chunks/slots-BPbIdxAJ.js +7 -0
  33. package/dist/chunks/slots-BPbIdxAJ.js.map +1 -0
  34. package/dist/chunks/toaster-PmdKSV5x.js +40 -0
  35. package/dist/chunks/toaster-PmdKSV5x.js.map +1 -0
  36. package/dist/components/core/kt-avatar/kt-avatar.d.ts +49 -0
  37. package/dist/components/core/kt-avatar/kt-avatar.js +156 -0
  38. package/dist/components/core/kt-avatar/kt-avatar.js.map +1 -0
  39. package/dist/components/core/kt-badge/kt-badge.d.ts +77 -0
  40. package/dist/components/core/kt-badge/kt-badge.js +254 -0
  41. package/dist/components/core/kt-badge/kt-badge.js.map +1 -0
  42. package/dist/components/core/kt-button/kt-button.d.ts +71 -0
  43. package/dist/components/core/kt-button/kt-button.js +271 -0
  44. package/dist/components/core/kt-button/kt-button.js.map +1 -0
  45. package/dist/components/core/kt-card/kt-card.d.ts +62 -0
  46. package/dist/components/core/kt-card/kt-card.js +230 -0
  47. package/dist/components/core/kt-card/kt-card.js.map +1 -0
  48. package/dist/components/core/kt-code/kt-code.d.ts +55 -0
  49. package/dist/components/core/kt-code/kt-code.js +155 -0
  50. package/dist/components/core/kt-code/kt-code.js.map +1 -0
  51. package/dist/components/core/kt-icon/kt-icon.d.ts +44 -0
  52. package/dist/components/core/kt-icon/kt-icon.js +85 -0
  53. package/dist/components/core/kt-icon/kt-icon.js.map +1 -0
  54. package/dist/components/core/kt-kbd/kt-kbd.d.ts +38 -0
  55. package/dist/components/core/kt-kbd/kt-kbd.js +89 -0
  56. package/dist/components/core/kt-kbd/kt-kbd.js.map +1 -0
  57. package/dist/components/data/kt-chart/kt-chart.d.ts +99 -0
  58. package/dist/components/data/kt-chart/kt-chart.js +406 -0
  59. package/dist/components/data/kt-chart/kt-chart.js.map +1 -0
  60. package/dist/components/data/kt-meter/kt-meter.d.ts +63 -0
  61. package/dist/components/data/kt-meter/kt-meter.js +177 -0
  62. package/dist/components/data/kt-meter/kt-meter.js.map +1 -0
  63. package/dist/components/data/kt-pagination/kt-pagination.d.ts +35 -0
  64. package/dist/components/data/kt-pagination/kt-pagination.js +88 -0
  65. package/dist/components/data/kt-pagination/kt-pagination.js.map +1 -0
  66. package/dist/components/data/kt-stat/kt-stat.d.ts +60 -0
  67. package/dist/components/data/kt-stat/kt-stat.js +137 -0
  68. package/dist/components/data/kt-stat/kt-stat.js.map +1 -0
  69. package/dist/components/data/kt-table/kt-table.d.ts +99 -0
  70. package/dist/components/data/kt-table/kt-table.js +340 -0
  71. package/dist/components/data/kt-table/kt-table.js.map +1 -0
  72. package/dist/components/data/kt-timeline/kt-timeline.d.ts +78 -0
  73. package/dist/components/data/kt-timeline/kt-timeline.js +252 -0
  74. package/dist/components/data/kt-timeline/kt-timeline.js.map +1 -0
  75. package/dist/components/feedback/kt-alert/kt-alert.d.ts +46 -0
  76. package/dist/components/feedback/kt-alert/kt-alert.js +180 -0
  77. package/dist/components/feedback/kt-alert/kt-alert.js.map +1 -0
  78. package/dist/components/feedback/kt-empty-state/kt-empty-state.d.ts +40 -0
  79. package/dist/components/feedback/kt-empty-state/kt-empty-state.js +100 -0
  80. package/dist/components/feedback/kt-empty-state/kt-empty-state.js.map +1 -0
  81. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.d.ts +53 -0
  82. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +212 -0
  83. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js.map +1 -0
  84. package/dist/components/feedback/kt-skeleton/kt-skeleton.d.ts +43 -0
  85. package/dist/components/feedback/kt-skeleton/kt-skeleton.js +117 -0
  86. package/dist/components/feedback/kt-skeleton/kt-skeleton.js.map +1 -0
  87. package/dist/components/feedback/kt-toast/kt-toast.d.ts +57 -0
  88. package/dist/components/feedback/kt-toast/kt-toast.js +231 -0
  89. package/dist/components/feedback/kt-toast/kt-toast.js.map +1 -0
  90. package/dist/components/feedback/kt-toast-container/kt-toast-container.d.ts +60 -0
  91. package/dist/components/feedback/kt-toast-container/kt-toast-container.js +100 -0
  92. package/dist/components/feedback/kt-toast-container/kt-toast-container.js.map +1 -0
  93. package/dist/components/feedback/kt-toast-container/toaster.d.ts +37 -0
  94. package/dist/components/feedback/kt-tooltip/kt-tooltip.d.ts +57 -0
  95. package/dist/components/feedback/kt-tooltip/kt-tooltip.js +138 -0
  96. package/dist/components/feedback/kt-tooltip/kt-tooltip.js.map +1 -0
  97. package/dist/components/forms/kt-drag-drop/kt-drag-drop.d.ts +68 -0
  98. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +287 -0
  99. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js.map +1 -0
  100. package/dist/components/forms/kt-form/kt-form.d.ts +75 -0
  101. package/dist/components/forms/kt-form/kt-form.js +187 -0
  102. package/dist/components/forms/kt-form/kt-form.js.map +1 -0
  103. package/dist/components/forms/kt-input/kt-input.d.ts +112 -0
  104. package/dist/components/forms/kt-input/kt-input.js +556 -0
  105. package/dist/components/forms/kt-input/kt-input.js.map +1 -0
  106. package/dist/components/forms/kt-input-menu/kt-input-menu.d.ts +60 -0
  107. package/dist/components/forms/kt-input-menu/kt-input-menu.js +313 -0
  108. package/dist/components/forms/kt-input-menu/kt-input-menu.js.map +1 -0
  109. package/dist/components/forms/kt-label-input/kt-label-input.d.ts +42 -0
  110. package/dist/components/forms/kt-label-input/kt-label-input.js +69 -0
  111. package/dist/components/forms/kt-label-input/kt-label-input.js.map +1 -0
  112. package/dist/components/forms/kt-select/kt-select.d.ts +80 -0
  113. package/dist/components/forms/kt-select/kt-select.js +334 -0
  114. package/dist/components/forms/kt-select/kt-select.js.map +1 -0
  115. package/dist/components/forms/kt-textarea/kt-textarea.d.ts +62 -0
  116. package/dist/components/forms/kt-textarea/kt-textarea.js +239 -0
  117. package/dist/components/forms/kt-textarea/kt-textarea.js.map +1 -0
  118. package/dist/components/forms/kt-toggle/kt-toggle.d.ts +53 -0
  119. package/dist/components/forms/kt-toggle/kt-toggle.js +170 -0
  120. package/dist/components/forms/kt-toggle/kt-toggle.js.map +1 -0
  121. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.d.ts +45 -0
  122. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +93 -0
  123. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js.map +1 -0
  124. package/dist/components/navigation/kt-header/kt-header.d.ts +67 -0
  125. package/dist/components/navigation/kt-header/kt-header.js +195 -0
  126. package/dist/components/navigation/kt-header/kt-header.js.map +1 -0
  127. package/dist/components/navigation/kt-page-header/kt-page-header.d.ts +48 -0
  128. package/dist/components/navigation/kt-page-header/kt-page-header.js +111 -0
  129. package/dist/components/navigation/kt-page-header/kt-page-header.js.map +1 -0
  130. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.d.ts +63 -0
  131. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +228 -0
  132. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -0
  133. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.d.ts +94 -0
  134. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +265 -0
  135. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js.map +1 -0
  136. package/dist/components/navigation/kt-tabs/kt-tabs.d.ts +64 -0
  137. package/dist/components/navigation/kt-tabs/kt-tabs.js +175 -0
  138. package/dist/components/navigation/kt-tabs/kt-tabs.js.map +1 -0
  139. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.d.ts +50 -0
  140. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +191 -0
  141. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js.map +1 -0
  142. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.d.ts +55 -0
  143. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +128 -0
  144. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js.map +1 -0
  145. package/dist/components/overlays/kt-collapsible/kt-collapsible.d.ts +42 -0
  146. package/dist/components/overlays/kt-collapsible/kt-collapsible.js +107 -0
  147. package/dist/components/overlays/kt-collapsible/kt-collapsible.js.map +1 -0
  148. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.d.ts +56 -0
  149. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +155 -0
  150. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js.map +1 -0
  151. package/dist/components/overlays/kt-dropdown/kt-dropdown.d.ts +64 -0
  152. package/dist/components/overlays/kt-dropdown/kt-dropdown.js +212 -0
  153. package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -0
  154. package/dist/components/overlays/kt-modal/kt-modal.d.ts +61 -0
  155. package/dist/components/overlays/kt-modal/kt-modal.js +207 -0
  156. package/dist/components/overlays/kt-modal/kt-modal.js.map +1 -0
  157. package/dist/components/overlays/kt-side-panel/kt-side-panel.d.ts +52 -0
  158. package/dist/components/overlays/kt-side-panel/kt-side-panel.js +178 -0
  159. package/dist/components/overlays/kt-side-panel/kt-side-panel.js.map +1 -0
  160. package/dist/icons/defaults.d.ts +25 -0
  161. package/dist/icons/index.d.ts +3 -0
  162. package/dist/icons/index.js +37 -0
  163. package/dist/icons/index.js.map +1 -0
  164. package/dist/icons/registry.d.ts +38 -0
  165. package/dist/index.d.ts +81 -0
  166. package/dist/index.js +96 -0
  167. package/dist/index.js.map +1 -0
  168. package/dist/internal/countries.d.ts +37 -0
  169. package/dist/internal/dialog.d.ts +22 -0
  170. package/dist/internal/events.d.ts +14 -0
  171. package/dist/internal/form-control.d.ts +27 -0
  172. package/dist/internal/format.d.ts +8 -0
  173. package/dist/internal/kt-element.d.ts +22 -0
  174. package/dist/internal/listbox.d.ts +36 -0
  175. package/dist/internal/slots.d.ts +10 -0
  176. package/dist/react/index.d.ts +208 -0
  177. package/dist/react/index.js +314 -0
  178. package/dist/react/index.js.map +1 -0
  179. package/dist/styles.css +13 -0
  180. package/dist/tokens/README.md +63 -0
  181. package/dist/tokens/base.css +79 -0
  182. package/dist/tokens/colors.css +125 -0
  183. package/dist/tokens/fonts.css +136 -0
  184. package/dist/tokens/index.css +12 -0
  185. package/dist/tokens/responsive.css +108 -0
  186. package/dist/tokens/spacing.css +66 -0
  187. package/dist/tokens/theme-light.css +144 -0
  188. package/dist/tokens/typography.css +41 -0
  189. package/dist/vue/index.d.ts +143 -0
  190. package/dist/vue/index.js +56 -0
  191. package/dist/vue/index.js.map +1 -0
  192. package/package.json +296 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-stat.js","sources":["../../../../src/components/data/kt-stat/kt-stat.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport '../../core/kt-icon/kt-icon.js';\nimport '../../core/kt-badge/kt-badge.js';\nimport '../../feedback/kt-skeleton/kt-skeleton.js';\n\nexport type KtStatTrend = 'up' | 'down' | 'flat';\n\n/**\n * One headline figure: a label, a value, and how it moved.\n *\n * Worth its own element because every dashboard rebuilds this tile, and every\n * rebuild makes the same two mistakes — the delta coloured by sign rather than\n * by meaning, and the label competing with the number.\n *\n * **The colour comes from `trend`, not from the sign.** Falling costs are good\n * news; rising churn is not. Pass `trend` to say which, and `inverted` when\n * down is the direction you want.\n *\n * @element kt-stat\n *\n * @slot - Extra content under the value — a sparkline, a caption.\n *\n * @csspart base - The tile.\n * @csspart value - The figure.\n *\n * @example\n * ```html\n * <kt-stat label=\"Revenue\" value=\"$292,342\" delta=\"-3%\" trend=\"down\"></kt-stat>\n * <kt-stat label=\"Customers\" value=\"712\" delta=\"+12%\" trend=\"up\" icon=\"users\"></kt-stat>\n * ```\n */\nexport class KtStat extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .stat {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: var(--padding-card);\n }\n\n .head {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n /* A tinted disc rather than a bare glyph: at this size an icon on its\n own reads as noise beside the figure. */\n .icon {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n color: var(--color-primary-base);\n background: var(--color-primary-soft);\n border-radius: var(--radius-full);\n }\n\n .label {\n color: var(--color-text-500);\n font: var(--font-title-overline);\n letter-spacing: var(--letter-spacing-overline);\n text-transform: uppercase;\n }\n\n .figure {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 10px;\n }\n\n .value {\n color: var(--text-body);\n font: var(--font-title-h1);\n font-variant-numeric: tabular-nums;\n line-height: 1.1;\n }\n\n :host([size='small']) .value {\n font: var(--font-title-h4);\n }\n\n .caption {\n color: var(--text-muted);\n font: var(--font-normal-small);\n }\n `,\n ];\n\n @property({ type: String })\n label = '';\n\n @property({ type: String })\n value = '';\n\n /** The movement, shown as a badge: `+12%`, `-3%`, `+2`. */\n @property({ type: String })\n delta = '';\n\n /**\n * What the movement means. Drives the badge colour.\n * `flat` — and the default — stay neutral.\n */\n @property({ type: String, reflect: true })\n trend: KtStatTrend = 'flat';\n\n /**\n * Down is the good direction here — churn, cost, latency.\n * Swaps which trend reads as success.\n */\n @property({ type: Boolean })\n inverted = false;\n\n /** Lucide icon name, kebab-case. */\n @property({ type: String })\n icon = '';\n\n /** Small print under the figure — \"vs last month\". */\n @property({ type: String })\n caption = '';\n\n @property({ type: String, reflect: true })\n size: 'small' | 'medium' = 'medium';\n\n @property({ type: Boolean, reflect: true })\n loading = false;\n\n private get deltaVariant(): 'success' | 'danger' | 'neutral' {\n if (this.trend === 'flat') return 'neutral';\n const good = this.inverted ? 'down' : 'up';\n return this.trend === good ? 'success' : 'danger';\n }\n\n override render(): TemplateResult {\n return html`<div part=\"base\" class=\"stat\">\n <div class=\"head\">\n ${\n this.icon\n ? html`<span class=\"icon\"><kt-icon name=${this.icon} size=\"18\"></kt-icon></span>`\n : nothing\n }\n <span class=\"label\">${this.label}</span>\n </div>\n\n ${\n this.loading\n ? html`<kt-skeleton variant=\"rect\" height=\"38px\" width=\"60%\"></kt-skeleton>`\n : html`<div class=\"figure\">\n <span part=\"value\" class=\"value\">${this.value}</span>\n ${\n this.delta\n ? html`<kt-badge variant=\"count\" tone=${this.deltaVariant}\n >${this.delta}</kt-badge\n >`\n : nothing\n }\n </div>`\n }\n ${this.caption ? html`<span class=\"caption\">${this.caption}</span>` : nothing}\n <slot></slot>\n </div>`;\n }\n}\n\ndefineElement('kt-stat', KtStat);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-stat': KtStat;\n }\n}\n"],"names":["KtStat","KtElement","css","good","html","nothing","__decorateClass","property","defineElement"],"mappings":";;;;;;;;;;;AAiCO,MAAMA,UAAeC,EAAU;AAAA,EAA/B,cAAA;AAAA,UAAA,GAAA,SAAA,GAoEL,KAAA,QAAQ,IAGR,KAAA,QAAQ,IAIR,KAAA,QAAQ,IAOR,KAAA,QAAqB,QAOrB,KAAA,WAAW,IAIX,KAAA,OAAO,IAIP,KAAA,UAAU,IAGV,KAAA,OAA2B,UAG3B,KAAA,UAAU;AAAA,EAAA;AAAA,EAtGV,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBA,EAAU;AAAA,MACVC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EA8DF;AAAA,EAwCA,IAAY,eAAiD;AAC3D,QAAI,KAAK,UAAU,OAAQ,QAAO;AAClC,UAAMC,IAAO,KAAK,WAAW,SAAS;AACtC,WAAO,KAAK,UAAUA,IAAO,YAAY;AAAA,EAC3C;AAAA,EAES,SAAyB;AAChC,WAAOC;AAAA;AAAA,UAGD,KAAK,OACDA,qCAAwC,KAAK,IAAI,iCACjDC,CACN;AAAA,8BACsB,KAAK,KAAK;AAAA;AAAA;AAAA,QAIhC,KAAK,UACDD,0EACAA;AAAA,iDACqC,KAAK,KAAK;AAAA,gBAE3C,KAAK,QACDA,mCAAsC,KAAK,YAAY;AAAA,yBAClD,KAAK,KAAK;AAAA,yBAEfC,CACN;AAAA,mBAER;AAAA,QACE,KAAK,UAAUD,0BAA6B,KAAK,OAAO,YAAYC,CAAO;AAAA;AAAA;AAAA,EAGjF;AACF;AAxEEC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAnEfP,EAoEX,WAAA,OAAA;AAGAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAtEfP,EAuEX,WAAA,OAAA;AAIAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA1EfP,EA2EX,WAAA,OAAA;AAOAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAjF9BP,EAkFX,WAAA,OAAA;AAOAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GAxFhBP,EAyFX,WAAA,UAAA;AAIAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA5FfP,EA6FX,WAAA,MAAA;AAIAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAhGfP,EAiGX,WAAA,SAAA;AAGAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAnG9BP,EAoGX,WAAA,MAAA;AAGAM,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAtG/BP,EAuGX,WAAA,SAAA;AAuCFQ,EAAc,WAAWR,CAAM;"}
@@ -0,0 +1,99 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ import '../kt-pagination/kt-pagination.js';
4
+ export type KtSortDirection = 'asc' | 'desc' | null;
5
+ export type KtTableRow = Record<string, unknown>;
6
+ export interface KtTableColumn {
7
+ /** Key into the row object. */
8
+ readonly key: string;
9
+ /** Header text. Falls back to `key`. */
10
+ readonly label?: string;
11
+ readonly sortable?: boolean;
12
+ readonly align?: 'left' | 'center' | 'right';
13
+ /** Any CSS width. */
14
+ readonly width?: string;
15
+ }
16
+ export interface KtSortState {
17
+ readonly key: string | null;
18
+ readonly direction: KtSortDirection;
19
+ }
20
+ /** Renders a cell. Return `undefined` to fall back to the raw value. */
21
+ export type KtCellRenderer = (row: KtTableRow, column: KtTableColumn) => unknown;
22
+ /**
23
+ * A data table: tri-state sorting, single or multiple selection, paging.
24
+ *
25
+ * @element kt-table
26
+ *
27
+ * @csspart table - The `<table>`.
28
+ * @csspart header-cell - A `<th>`.
29
+ * @csspart row - A `<tr>`.
30
+ * @csspart cell - A `<td>`.
31
+ *
32
+ * @fires kt-sort-change - Sorting changed. `detail: { key, direction }`.
33
+ * @fires kt-selection-change - Selection changed. `detail: { selected, rows }`.
34
+ * @fires kt-row-click - A row was clicked. `detail: { row, index }`.
35
+ * @fires kt-page-change - The page changed. `detail: { page }`.
36
+ *
37
+ * @example
38
+ * ```js
39
+ * table.columns = [
40
+ * { key: 'name', label: 'Name', sortable: true },
41
+ * { key: 'amount', label: 'Amount', sortable: true, align: 'right' },
42
+ * ];
43
+ * table.data = rows;
44
+ * ```
45
+ */
46
+ export declare class KtTable extends KtElement {
47
+ static styles: import("lit").CSSResultGroup[];
48
+ private page;
49
+ columns: readonly KtTableColumn[];
50
+ data: readonly KtTableRow[];
51
+ selectable: boolean;
52
+ selectionMode: 'single' | 'multiple';
53
+ /** The identities of the selected rows. */
54
+ selected: readonly unknown[];
55
+ /** Rows per page. Zero shows everything and hides the footer. */
56
+ pageSize: number;
57
+ loading: boolean;
58
+ compact: boolean;
59
+ sortKey: string | null;
60
+ sortDirection: KtSortDirection;
61
+ /** Renders a cell. Return `undefined` to fall back to the raw value. */
62
+ renderCell: KtCellRenderer | undefined;
63
+ emptyText: string;
64
+ loadingText: string;
65
+ /** Accessible name for the table. */
66
+ label: string;
67
+ /** The rows after sorting, before paging. */
68
+ get sortedRows(): readonly KtTableRow[];
69
+ get totalPages(): number;
70
+ /** The rows actually on screen. */
71
+ get visibleRows(): readonly KtTableRow[];
72
+ /**
73
+ * Cycles a column: unsorted → ascending → descending → unsorted. The third
74
+ * press restoring the original order is what makes sorting undoable.
75
+ */
76
+ private toggleSort;
77
+ private isSelected;
78
+ private toggleSelection;
79
+ /** Selects or clears every row on the current page. */
80
+ private toggleAll;
81
+ /** The selected rows themselves, not just their identities. */
82
+ get selectedRows(): readonly KtTableRow[];
83
+ private onPageChange;
84
+ /**
85
+ * The aria-sort value for a column.
86
+ *
87
+ * Not named ariaSort: HTMLElement reflects that ARIA attribute as a string
88
+ * property, and shadowing it with a method breaks the element's own typing.
89
+ */
90
+ private sortStateFor;
91
+ private renderHeaderCell;
92
+ private renderBody;
93
+ render(): TemplateResult;
94
+ }
95
+ declare global {
96
+ interface HTMLElementTagNameMap {
97
+ 'kt-table': KtTable;
98
+ }
99
+ }
@@ -0,0 +1,340 @@
1
+ import { css as x, html as d, nothing as h } from "lit";
2
+ import { state as k, property as n } from "lit/decorators.js";
3
+ import { classMap as S } from "lit/directives/class-map.js";
4
+ import { styleMap as b } from "lit/directives/style-map.js";
5
+ import { K as f, d as $ } from "../../../chunks/kt-element-CcMLO5e8.js";
6
+ import { e as g } from "../../../chunks/events-Bjl5Zmmq.js";
7
+ import "../kt-pagination/kt-pagination.js";
8
+ var v = Object.defineProperty, a = (o, t, e, s) => {
9
+ for (var i = void 0, c = o.length - 1, l; c >= 0; c--)
10
+ (l = o[c]) && (i = l(t, e, i) || i);
11
+ return i && v(t, e, i), i;
12
+ };
13
+ const w = new Intl.Collator("en", { numeric: !0, sensitivity: "base" });
14
+ function m(o) {
15
+ if (typeof o == "string") return o;
16
+ if (typeof o == "number" || typeof o == "boolean" || typeof o == "bigint")
17
+ return String(o);
18
+ try {
19
+ return JSON.stringify(o) ?? "";
20
+ } catch {
21
+ return "";
22
+ }
23
+ }
24
+ function u(o) {
25
+ return o.id ?? o.uid ?? o;
26
+ }
27
+ class r extends f {
28
+ constructor() {
29
+ super(...arguments), this.page = 1, this.columns = [], this.data = [], this.selectable = !1, this.selectionMode = "multiple", this.selected = [], this.pageSize = 0, this.loading = !1, this.compact = !1, this.sortKey = null, this.sortDirection = null, this.emptyText = "No data to display", this.loadingText = "Loading…", this.label = "";
30
+ }
31
+ static {
32
+ this.styles = [
33
+ f.styles,
34
+ x`
35
+ :host {
36
+ display: block;
37
+ width: 100%;
38
+ color: var(--text-body);
39
+ font: var(--font-normal-regular);
40
+ }
41
+
42
+ .scroller {
43
+ overflow: auto;
44
+ border-radius: var(--border-radius);
45
+ }
46
+
47
+ table {
48
+ width: 100%;
49
+ min-width: 600px;
50
+ border-spacing: 0;
51
+ border-collapse: separate;
52
+ }
53
+
54
+ thead {
55
+ background: var(--surface-card);
56
+ color: var(--text-muted);
57
+ }
58
+
59
+ th {
60
+ padding: 16px 18px;
61
+ font-size: 13px;
62
+ font-weight: inherit;
63
+ text-align: left;
64
+ white-space: nowrap;
65
+ vertical-align: middle;
66
+ user-select: none;
67
+ }
68
+
69
+ /* Sortable headers are buttons, not clickable <th>s: a header you can
70
+ only sort with a mouse is a table half the users cannot sort. */
71
+ th button {
72
+ display: flex;
73
+ align-items: center;
74
+ gap: 8px;
75
+ width: 100%;
76
+ padding: 0;
77
+ color: inherit;
78
+ font: inherit;
79
+ text-align: inherit;
80
+ background: none;
81
+ border: none;
82
+ cursor: pointer;
83
+ }
84
+
85
+ th button:focus-visible {
86
+ outline: var(--outline-width) solid var(--color-primary-base);
87
+ outline-offset: 2px;
88
+ }
89
+
90
+ .indicator {
91
+ color: var(--color-primary-base);
92
+ font-size: 10px;
93
+ }
94
+
95
+ tbody tr {
96
+ transition: background-color 120ms linear;
97
+ }
98
+
99
+ tbody tr:hover {
100
+ background: var(--color-dark-14);
101
+ }
102
+
103
+ tbody tr.selected {
104
+ background: var(--color-primary-soft);
105
+ }
106
+
107
+ td {
108
+ padding: 14px 18px;
109
+ font-size: 14px;
110
+ border-bottom: var(--border-width) solid var(--surface-hover);
111
+ }
112
+
113
+ :host([compact]) td {
114
+ padding: 8px 12px;
115
+ }
116
+ :host([compact]) th {
117
+ padding: 10px 12px;
118
+ }
119
+
120
+ .select-cell {
121
+ width: 56px;
122
+ text-align: center;
123
+ }
124
+
125
+ .placeholder {
126
+ padding: 28px 0;
127
+ color: var(--text-muted);
128
+ text-align: center;
129
+ }
130
+
131
+ footer {
132
+ display: flex;
133
+ align-items: center;
134
+ justify-content: flex-end;
135
+ gap: 12px;
136
+ padding-top: 12px;
137
+ }
138
+
139
+ @media (max-width: 680px) {
140
+ table {
141
+ min-width: 100%;
142
+ }
143
+ td,
144
+ th {
145
+ padding: 10px 12px;
146
+ }
147
+ }
148
+ `
149
+ ];
150
+ }
151
+ /** The rows after sorting, before paging. */
152
+ get sortedRows() {
153
+ if (!this.sortKey || !this.sortDirection) return this.data;
154
+ const t = this.sortKey, e = this.sortDirection === "asc" ? 1 : -1;
155
+ return [...this.data].sort((s, i) => {
156
+ const c = s[t], l = i[t], p = c == null, y = l == null;
157
+ return p && y ? 0 : p ? 1 : y ? -1 : typeof c == "number" && typeof l == "number" ? (c - l) * e : w.compare(m(c), m(l)) * e;
158
+ });
159
+ }
160
+ get totalPages() {
161
+ return this.pageSize <= 0 ? 1 : Math.max(1, Math.ceil(this.data.length / this.pageSize));
162
+ }
163
+ /** The rows actually on screen. */
164
+ get visibleRows() {
165
+ const t = this.sortedRows;
166
+ if (this.pageSize <= 0) return t;
167
+ const e = Math.min(this.page, this.totalPages);
168
+ return t.slice((e - 1) * this.pageSize, e * this.pageSize);
169
+ }
170
+ /**
171
+ * Cycles a column: unsorted → ascending → descending → unsorted. The third
172
+ * press restoring the original order is what makes sorting undoable.
173
+ */
174
+ toggleSort(t) {
175
+ t.sortable && (this.sortKey !== t.key ? (this.sortKey = t.key, this.sortDirection = "asc") : this.sortDirection === "asc" ? this.sortDirection = "desc" : (this.sortKey = null, this.sortDirection = null), g(this, "kt-sort-change", { key: this.sortKey, direction: this.sortDirection }));
176
+ }
177
+ isSelected(t) {
178
+ return this.selected.includes(u(t));
179
+ }
180
+ toggleSelection(t) {
181
+ const e = u(t);
182
+ this.selectionMode === "single" ? this.selected = this.isSelected(t) ? [] : [e] : this.selected = this.isSelected(t) ? this.selected.filter((s) => s !== e) : [...this.selected, e], g(this, "kt-selection-change", { selected: this.selected, rows: this.selectedRows });
183
+ }
184
+ /** Selects or clears every row on the current page. */
185
+ toggleAll() {
186
+ const e = this.visibleRows.map(u), s = e.every((i) => this.selected.includes(i));
187
+ this.selected = s ? this.selected.filter((i) => !e.includes(i)) : [.../* @__PURE__ */ new Set([...this.selected, ...e])], g(this, "kt-selection-change", { selected: this.selected, rows: this.selectedRows });
188
+ }
189
+ /** The selected rows themselves, not just their identities. */
190
+ get selectedRows() {
191
+ return this.data.filter((t) => this.selected.includes(u(t)));
192
+ }
193
+ onPageChange(t) {
194
+ t.stopPropagation(), this.page = t.detail.page, g(this, "kt-page-change", { page: this.page });
195
+ }
196
+ /**
197
+ * The aria-sort value for a column.
198
+ *
199
+ * Not named ariaSort: HTMLElement reflects that ARIA attribute as a string
200
+ * property, and shadowing it with a method breaks the element's own typing.
201
+ */
202
+ sortStateFor(t) {
203
+ return this.sortKey !== t.key || !this.sortDirection ? "none" : this.sortDirection === "asc" ? "ascending" : "descending";
204
+ }
205
+ renderHeaderCell(t) {
206
+ const e = t.label ?? t.key, s = this.sortKey === t.key && this.sortDirection !== null;
207
+ return d`<th
208
+ part="header-cell"
209
+ scope="col"
210
+ style=${b(t.width ? { width: t.width } : {})}
211
+ aria-sort=${this.sortStateFor(t)}
212
+ >
213
+ ${t.sortable ? d`<button type="button" @click=${() => this.toggleSort(t)}>
214
+ <span>${e}</span>
215
+ <span class="indicator" aria-hidden="true"
216
+ >${s ? this.sortDirection === "asc" ? "▲" : "▼" : ""}</span
217
+ >
218
+ </button>` : d`<span>${e}</span>`}
219
+ </th>`;
220
+ }
221
+ renderBody() {
222
+ const t = this.visibleRows, e = this.columns.length + (this.selectable ? 1 : 0);
223
+ return t.length === 0 ? d`<tr>
224
+ <td colspan=${e}>
225
+ <div class="placeholder">${this.emptyText}</div>
226
+ </td>
227
+ </tr>` : d`${t.map((s, i) => {
228
+ const c = this.isSelected(s);
229
+ return d`<tr
230
+ part="row"
231
+ class=${S({ selected: c })}
232
+ aria-selected=${this.selectable ? String(c) : h}
233
+ @click=${() => g(this, "kt-row-click", { row: s, index: i })}
234
+ >
235
+ ${this.selectable ? d`<td class="select-cell">
236
+ <input
237
+ type=${this.selectionMode === "single" ? "radio" : "checkbox"}
238
+ name=${this.selectionMode === "single" ? "kt-table-selection" : h}
239
+ .checked=${c}
240
+ aria-label="Select row"
241
+ @click=${(l) => l.stopPropagation()}
242
+ @change=${() => this.toggleSelection(s)}
243
+ />
244
+ </td>` : h}
245
+ ${this.columns.map((l) => {
246
+ const p = this.renderCell?.(s, l);
247
+ return d`<td part="cell" style=${b({ textAlign: l.align ?? "left" })}>
248
+ ${p === void 0 ? s[l.key] : p}
249
+ </td>`;
250
+ })}
251
+ </tr>`;
252
+ })}`;
253
+ }
254
+ render() {
255
+ if (this.loading)
256
+ return d`<div class="placeholder" role="status" aria-live="polite">
257
+ ${this.loadingText}
258
+ </div>`;
259
+ const t = this.visibleRows, e = t.length > 0 && t.every((i) => this.isSelected(i)), s = t.some((i) => this.isSelected(i));
260
+ return d`<div class="scroller">
261
+ <table part="table" aria-label=${this.label || h}>
262
+ <thead>
263
+ <tr>
264
+ ${this.selectable ? d`<th class="select-cell" scope="col">
265
+ ${this.selectionMode === "multiple" ? d`<input
266
+ type="checkbox"
267
+ .checked=${e}
268
+ .indeterminate=${s && !e}
269
+ aria-label="Select all"
270
+ @change=${this.toggleAll}
271
+ />` : h}
272
+ </th>` : h}
273
+ ${this.columns.map((i) => this.renderHeaderCell(i))}
274
+ </tr>
275
+ </thead>
276
+ <tbody>
277
+ ${this.renderBody()}
278
+ </tbody>
279
+ </table>
280
+ </div>
281
+
282
+ ${this.pageSize > 0 ? d`<footer>
283
+ <kt-pagination
284
+ .page=${Math.min(this.page, this.totalPages)}
285
+ .totalPages=${this.totalPages}
286
+ @kt-page-change=${this.onPageChange}
287
+ ></kt-pagination>
288
+ </footer>` : h}`;
289
+ }
290
+ }
291
+ a([
292
+ k()
293
+ ], r.prototype, "page");
294
+ a([
295
+ n({ attribute: !1 })
296
+ ], r.prototype, "columns");
297
+ a([
298
+ n({ attribute: !1 })
299
+ ], r.prototype, "data");
300
+ a([
301
+ n({ type: Boolean, reflect: !0 })
302
+ ], r.prototype, "selectable");
303
+ a([
304
+ n({ type: String, attribute: "selection-mode" })
305
+ ], r.prototype, "selectionMode");
306
+ a([
307
+ n({ attribute: !1 })
308
+ ], r.prototype, "selected");
309
+ a([
310
+ n({ type: Number, attribute: "page-size" })
311
+ ], r.prototype, "pageSize");
312
+ a([
313
+ n({ type: Boolean, reflect: !0 })
314
+ ], r.prototype, "loading");
315
+ a([
316
+ n({ type: Boolean, reflect: !0 })
317
+ ], r.prototype, "compact");
318
+ a([
319
+ n({ type: String, attribute: "sort-key" })
320
+ ], r.prototype, "sortKey");
321
+ a([
322
+ n({ type: String, attribute: "sort-direction" })
323
+ ], r.prototype, "sortDirection");
324
+ a([
325
+ n({ attribute: !1 })
326
+ ], r.prototype, "renderCell");
327
+ a([
328
+ n({ type: String, attribute: "empty-text" })
329
+ ], r.prototype, "emptyText");
330
+ a([
331
+ n({ type: String, attribute: "loading-text" })
332
+ ], r.prototype, "loadingText");
333
+ a([
334
+ n({ type: String })
335
+ ], r.prototype, "label");
336
+ $("kt-table", r);
337
+ export {
338
+ r as KtTable
339
+ };
340
+ //# sourceMappingURL=kt-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-table.js","sources":["../../../../src/components/data/kt-table/kt-table.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport '../kt-pagination/kt-pagination.js';\n\nexport type KtSortDirection = 'asc' | 'desc' | null;\nexport type KtTableRow = Record<string, unknown>;\n\nexport interface KtTableColumn {\n /** Key into the row object. */\n readonly key: string;\n /** Header text. Falls back to `key`. */\n readonly label?: string;\n readonly sortable?: boolean;\n readonly align?: 'left' | 'center' | 'right';\n /** Any CSS width. */\n readonly width?: string;\n}\n\nexport interface KtSortState {\n readonly key: string | null;\n readonly direction: KtSortDirection;\n}\n\n/** Renders a cell. Return `undefined` to fall back to the raw value. */\nexport type KtCellRenderer = (row: KtTableRow, column: KtTableColumn) => unknown;\n\n/**\n * Sorts with a locale-aware collator, so \"Ångström\" files next to \"Angstrom\"\n * instead of after \"Zeta\". `numeric` also makes \"Entity 2\" precede\n * \"Entity 10\".\n */\nconst collator = new Intl.Collator('en', { numeric: true, sensitivity: 'base' });\n\n/**\n * A sortable string for any cell value.\n *\n * Objects get their JSON rather than \"[object Object]\", which at least sorts\n * consistently instead of collapsing every object in the column to one key.\n */\nfunction sortableText(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {\n return String(value);\n }\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return '';\n }\n}\n\n/** A row's identity: `id`, else `uid`, else the row itself. */\nfunction rowKey(row: KtTableRow): unknown {\n return row['id'] ?? row['uid'] ?? row;\n}\n\n/**\n * A data table: tri-state sorting, single or multiple selection, paging.\n *\n * @element kt-table\n *\n * @csspart table - The `<table>`.\n * @csspart header-cell - A `<th>`.\n * @csspart row - A `<tr>`.\n * @csspart cell - A `<td>`.\n *\n * @fires kt-sort-change - Sorting changed. `detail: { key, direction }`.\n * @fires kt-selection-change - Selection changed. `detail: { selected, rows }`.\n * @fires kt-row-click - A row was clicked. `detail: { row, index }`.\n * @fires kt-page-change - The page changed. `detail: { page }`.\n *\n * @example\n * ```js\n * table.columns = [\n * { key: 'name', label: 'Name', sortable: true },\n * { key: 'amount', label: 'Amount', sortable: true, align: 'right' },\n * ];\n * table.data = rows;\n * ```\n */\nexport class KtTable extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n width: 100%;\n color: var(--text-body);\n font: var(--font-normal-regular);\n }\n\n .scroller {\n overflow: auto;\n border-radius: var(--border-radius);\n }\n\n table {\n width: 100%;\n min-width: 600px;\n border-spacing: 0;\n border-collapse: separate;\n }\n\n thead {\n background: var(--surface-card);\n color: var(--text-muted);\n }\n\n th {\n padding: 16px 18px;\n font-size: 13px;\n font-weight: inherit;\n text-align: left;\n white-space: nowrap;\n vertical-align: middle;\n user-select: none;\n }\n\n /* Sortable headers are buttons, not clickable <th>s: a header you can\n only sort with a mouse is a table half the users cannot sort. */\n th button {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 0;\n color: inherit;\n font: inherit;\n text-align: inherit;\n background: none;\n border: none;\n cursor: pointer;\n }\n\n th button:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n .indicator {\n color: var(--color-primary-base);\n font-size: 10px;\n }\n\n tbody tr {\n transition: background-color 120ms linear;\n }\n\n tbody tr:hover {\n background: var(--color-dark-14);\n }\n\n tbody tr.selected {\n background: var(--color-primary-soft);\n }\n\n td {\n padding: 14px 18px;\n font-size: 14px;\n border-bottom: var(--border-width) solid var(--surface-hover);\n }\n\n :host([compact]) td {\n padding: 8px 12px;\n }\n :host([compact]) th {\n padding: 10px 12px;\n }\n\n .select-cell {\n width: 56px;\n text-align: center;\n }\n\n .placeholder {\n padding: 28px 0;\n color: var(--text-muted);\n text-align: center;\n }\n\n footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 12px;\n padding-top: 12px;\n }\n\n @media (max-width: 680px) {\n table {\n min-width: 100%;\n }\n td,\n th {\n padding: 10px 12px;\n }\n }\n `,\n ];\n\n @state()\n private page = 1;\n\n @property({ attribute: false })\n columns: readonly KtTableColumn[] = [];\n\n @property({ attribute: false })\n data: readonly KtTableRow[] = [];\n\n @property({ type: Boolean, reflect: true })\n selectable = false;\n\n @property({ type: String, attribute: 'selection-mode' })\n selectionMode: 'single' | 'multiple' = 'multiple';\n\n /** The identities of the selected rows. */\n @property({ attribute: false })\n selected: readonly unknown[] = [];\n\n /** Rows per page. Zero shows everything and hides the footer. */\n @property({ type: Number, attribute: 'page-size' })\n pageSize = 0;\n\n @property({ type: Boolean, reflect: true })\n loading = false;\n\n @property({ type: Boolean, reflect: true })\n compact = false;\n\n @property({ type: String, attribute: 'sort-key' })\n sortKey: string | null = null;\n\n @property({ type: String, attribute: 'sort-direction' })\n sortDirection: KtSortDirection = null;\n\n /** Renders a cell. Return `undefined` to fall back to the raw value. */\n @property({ attribute: false })\n renderCell: KtCellRenderer | undefined;\n\n @property({ type: String, attribute: 'empty-text' })\n emptyText = 'No data to display';\n\n @property({ type: String, attribute: 'loading-text' })\n loadingText = 'Loading…';\n\n /** Accessible name for the table. */\n @property({ type: String })\n label = '';\n\n /** The rows after sorting, before paging. */\n get sortedRows(): readonly KtTableRow[] {\n if (!this.sortKey || !this.sortDirection) return this.data;\n\n const key = this.sortKey;\n const sign = this.sortDirection === 'asc' ? 1 : -1;\n\n return [...this.data].sort((a, b) => {\n const left = a[key];\n const right = b[key];\n\n // Empty values sort to the end whichever way the column points, so a\n // descending sort does not open with a screen of blanks.\n const leftEmpty = left === null || left === undefined;\n const rightEmpty = right === null || right === undefined;\n if (leftEmpty && rightEmpty) return 0;\n if (leftEmpty) return 1;\n if (rightEmpty) return -1;\n\n if (typeof left === 'number' && typeof right === 'number') return (left - right) * sign;\n return collator.compare(sortableText(left), sortableText(right)) * sign;\n });\n }\n\n get totalPages(): number {\n if (this.pageSize <= 0) return 1;\n return Math.max(1, Math.ceil(this.data.length / this.pageSize));\n }\n\n /** The rows actually on screen. */\n get visibleRows(): readonly KtTableRow[] {\n const rows = this.sortedRows;\n if (this.pageSize <= 0) return rows;\n\n const page = Math.min(this.page, this.totalPages);\n return rows.slice((page - 1) * this.pageSize, page * this.pageSize);\n }\n\n /**\n * Cycles a column: unsorted → ascending → descending → unsorted. The third\n * press restoring the original order is what makes sorting undoable.\n */\n private toggleSort(column: KtTableColumn): void {\n if (!column.sortable) return;\n\n if (this.sortKey !== column.key) {\n this.sortKey = column.key;\n this.sortDirection = 'asc';\n } else if (this.sortDirection === 'asc') {\n this.sortDirection = 'desc';\n } else {\n this.sortKey = null;\n this.sortDirection = null;\n }\n\n emit(this, 'kt-sort-change', { key: this.sortKey, direction: this.sortDirection });\n }\n\n private isSelected(row: KtTableRow): boolean {\n return this.selected.includes(rowKey(row));\n }\n\n private toggleSelection(row: KtTableRow): void {\n const key = rowKey(row);\n\n if (this.selectionMode === 'single') {\n this.selected = this.isSelected(row) ? [] : [key];\n } else {\n this.selected = this.isSelected(row)\n ? this.selected.filter((candidate) => candidate !== key)\n : [...this.selected, key];\n }\n\n emit(this, 'kt-selection-change', { selected: this.selected, rows: this.selectedRows });\n }\n\n /** Selects or clears every row on the current page. */\n private toggleAll(): void {\n const rows = this.visibleRows;\n const keys = rows.map(rowKey);\n const allSelected = keys.every((key) => this.selected.includes(key));\n\n this.selected = allSelected\n ? this.selected.filter((key) => !keys.includes(key))\n : [...new Set([...this.selected, ...keys])];\n\n emit(this, 'kt-selection-change', { selected: this.selected, rows: this.selectedRows });\n }\n\n /** The selected rows themselves, not just their identities. */\n get selectedRows(): readonly KtTableRow[] {\n return this.data.filter((row) => this.selected.includes(rowKey(row)));\n }\n\n private onPageChange(event: Event): void {\n event.stopPropagation();\n this.page = (event as CustomEvent<{ page: number }>).detail.page;\n emit(this, 'kt-page-change', { page: this.page });\n }\n\n /**\n * The aria-sort value for a column.\n *\n * Not named ariaSort: HTMLElement reflects that ARIA attribute as a string\n * property, and shadowing it with a method breaks the element's own typing.\n */\n private sortStateFor(column: KtTableColumn): 'ascending' | 'descending' | 'none' {\n if (this.sortKey !== column.key || !this.sortDirection) return 'none';\n return this.sortDirection === 'asc' ? 'ascending' : 'descending';\n }\n\n private renderHeaderCell(column: KtTableColumn): TemplateResult {\n const title = column.label ?? column.key;\n const active = this.sortKey === column.key && this.sortDirection !== null;\n\n return html`<th\n part=\"header-cell\"\n scope=\"col\"\n style=${styleMap(column.width ? { width: column.width } : {})}\n aria-sort=${this.sortStateFor(column)}\n >\n ${\n column.sortable\n ? html`<button type=\"button\" @click=${() => this.toggleSort(column)}>\n <span>${title}</span>\n <span class=\"indicator\" aria-hidden=\"true\"\n >${active ? (this.sortDirection === 'asc' ? '▲' : '▼') : ''}</span\n >\n </button>`\n : html`<span>${title}</span>`\n }\n </th>`;\n }\n\n private renderBody(): TemplateResult {\n const rows = this.visibleRows;\n const columnCount = this.columns.length + (this.selectable ? 1 : 0);\n\n if (rows.length === 0) {\n return html`<tr>\n <td colspan=${columnCount}>\n <div class=\"placeholder\">${this.emptyText}</div>\n </td>\n </tr>`;\n }\n\n return html`${rows.map((row, index) => {\n const selected = this.isSelected(row);\n\n return html`<tr\n part=\"row\"\n class=${classMap({ selected })}\n aria-selected=${this.selectable ? String(selected) : nothing}\n @click=${() => emit(this, 'kt-row-click', { row, index })}\n >\n ${\n this.selectable\n ? html`<td class=\"select-cell\">\n <input\n type=${this.selectionMode === 'single' ? 'radio' : 'checkbox'}\n name=${this.selectionMode === 'single' ? 'kt-table-selection' : nothing}\n .checked=${selected}\n aria-label=\"Select row\"\n @click=${(event: Event) => event.stopPropagation()}\n @change=${() => this.toggleSelection(row)}\n />\n </td>`\n : nothing\n }\n ${this.columns.map((column) => {\n const rendered = this.renderCell?.(row, column);\n return html`<td part=\"cell\" style=${styleMap({ textAlign: column.align ?? 'left' })}>\n ${rendered === undefined ? row[column.key] : rendered}\n </td>`;\n })}\n </tr>`;\n })}`;\n }\n\n override render(): TemplateResult {\n if (this.loading) {\n return html`<div class=\"placeholder\" role=\"status\" aria-live=\"polite\">\n ${this.loadingText}\n </div>`;\n }\n\n const rows = this.visibleRows;\n const allSelected = rows.length > 0 && rows.every((row) => this.isSelected(row));\n const someSelected = rows.some((row) => this.isSelected(row));\n\n return html`<div class=\"scroller\">\n <table part=\"table\" aria-label=${this.label || nothing}>\n <thead>\n <tr>\n ${\n this.selectable\n ? html`<th class=\"select-cell\" scope=\"col\">\n ${\n this.selectionMode === 'multiple'\n ? html`<input\n type=\"checkbox\"\n .checked=${allSelected}\n .indeterminate=${someSelected && !allSelected}\n aria-label=\"Select all\"\n @change=${this.toggleAll}\n />`\n : nothing\n }\n </th>`\n : nothing\n }\n ${this.columns.map((column) => this.renderHeaderCell(column))}\n </tr>\n </thead>\n <tbody>\n ${this.renderBody()}\n </tbody>\n </table>\n </div>\n\n ${\n this.pageSize > 0\n ? html`<footer>\n <kt-pagination\n .page=${Math.min(this.page, this.totalPages)}\n .totalPages=${this.totalPages}\n @kt-page-change=${this.onPageChange}\n ></kt-pagination>\n </footer>`\n : nothing\n }`;\n }\n}\n\ndefineElement('kt-table', KtTable);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-table': KtTable;\n }\n}\n"],"names":["collator","sortableText","value","rowKey","row","KtTable","KtElement","css","key","sign","a","b","left","right","leftEmpty","rightEmpty","rows","page","column","emit","candidate","keys","allSelected","event","title","active","html","styleMap","columnCount","index","selected","classMap","nothing","rendered","someSelected","__decorateClass","state","property","defineElement"],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ import '../../core/kt-icon/kt-icon.js';
4
+ export type KtTimelineVariant = 'neutral' | 'primary' | 'success' | 'warning' | 'danger' | 'info';
5
+ /**
6
+ * An ordered run of events on a rail.
7
+ *
8
+ * The same shape keeps reappearing — an activity feed, an audit log, a
9
+ * changelog, the stages of a delivery, a résumé — and every time it gets
10
+ * rebuilt out of a list, a pseudo-element line and a hand-placed dot. The
11
+ * fiddly part is the rail: it must start at the first dot and stop at the
12
+ * last, which a border on the list cannot do. Here each item draws its own
13
+ * segment and the last one is told to stop.
14
+ *
15
+ * `<kt-timeline>` is the semantic list; `<kt-timeline-item>` is one event.
16
+ *
17
+ * @element kt-timeline
18
+ *
19
+ * @slot - The `<kt-timeline-item>` children.
20
+ *
21
+ * @csspart base - The list.
22
+ *
23
+ * @example
24
+ * ```html
25
+ * <kt-timeline>
26
+ * <kt-timeline-item heading="Deployed" time="09:24" variant="success" icon="rocket">
27
+ * Build 4210 went to production.
28
+ * </kt-timeline-item>
29
+ * <kt-timeline-item heading="Review requested" time="09:02" icon="eye"></kt-timeline-item>
30
+ * </kt-timeline>
31
+ * ```
32
+ */
33
+ export declare class KtTimeline extends KtElement {
34
+ #private;
35
+ static styles: import("lit").CSSResultGroup[];
36
+ /** Tighter rhythm, for a feed in a side panel. */
37
+ compact: boolean;
38
+ render(): TemplateResult;
39
+ /**
40
+ * The first `slotchange` is a microtask that can land after `updateComplete`,
41
+ * so a caller that awaits the element would read stale items. Sync once the
42
+ * shadow root exists as well as on every later change.
43
+ */
44
+ firstUpdated(): void;
45
+ updated(changed: Map<string, unknown>): void;
46
+ }
47
+ /**
48
+ * One event on a `<kt-timeline>`.
49
+ *
50
+ * @element kt-timeline-item
51
+ *
52
+ * @slot - The body of the event.
53
+ * @slot actions - Trailing controls, aligned with the heading.
54
+ *
55
+ * @csspart base - The row.
56
+ * @csspart marker - The dot or icon.
57
+ */
58
+ export declare class KtTimelineItem extends KtElement {
59
+ static styles: import("lit").CSSResultGroup[];
60
+ heading: string;
61
+ /** Shown right-aligned on the heading row. Any string — "09:24", "2 days ago". */
62
+ time: string;
63
+ /** Lucide icon name. Without one the marker is a plain dot. */
64
+ icon: string;
65
+ variant: KtTimelineVariant;
66
+ /** Set by the parent `<kt-timeline>`: drops the trailing rail segment. */
67
+ last: boolean;
68
+ /** Set by the parent `<kt-timeline>`. */
69
+ compact: boolean;
70
+ connectedCallback(): void;
71
+ render(): TemplateResult;
72
+ }
73
+ declare global {
74
+ interface HTMLElementTagNameMap {
75
+ 'kt-timeline': KtTimeline;
76
+ 'kt-timeline-item': KtTimelineItem;
77
+ }
78
+ }