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,252 @@
1
+ import { css as h, html as s, nothing as m } from "lit";
2
+ import { property as a } from "lit/decorators.js";
3
+ import { classMap as k } from "lit/directives/class-map.js";
4
+ import { K as c, d as f } from "../../../chunks/kt-element-CcMLO5e8.js";
5
+ import "../../core/kt-icon/kt-icon.js";
6
+ var v = Object.defineProperty, i = (l, r, o, n) => {
7
+ for (var e = void 0, p = l.length - 1, d; p >= 0; p--)
8
+ (d = l[p]) && (e = d(r, o, e) || e);
9
+ return e && v(r, o, e), e;
10
+ };
11
+ class g extends c {
12
+ constructor() {
13
+ super(...arguments), this.compact = !1, this.#r = () => {
14
+ const r = this.shadowRoot?.querySelector("slot");
15
+ if (!r) return;
16
+ const o = r.assignedElements({ flatten: !0 }).filter((n) => n instanceof t);
17
+ o.forEach((n, e) => {
18
+ n.last = e === o.length - 1, n.compact = this.compact;
19
+ });
20
+ };
21
+ }
22
+ static {
23
+ this.styles = [
24
+ c.styles,
25
+ h`
26
+ :host {
27
+ display: block;
28
+ }
29
+
30
+ .timeline {
31
+ display: flex;
32
+ flex-direction: column;
33
+ }
34
+ `
35
+ ];
36
+ }
37
+ render() {
38
+ return s`<div part="base" class="timeline" role="list">
39
+ <slot @slotchange=${this.#r}></slot>
40
+ </div>`;
41
+ }
42
+ /**
43
+ * The first `slotchange` is a microtask that can land after `updateComplete`,
44
+ * so a caller that awaits the element would read stale items. Sync once the
45
+ * shadow root exists as well as on every later change.
46
+ */
47
+ firstUpdated() {
48
+ this.#r();
49
+ }
50
+ updated(r) {
51
+ r.has("compact") && this.#r();
52
+ }
53
+ #r;
54
+ }
55
+ i([
56
+ a({ type: Boolean, reflect: !0 })
57
+ ], g.prototype, "compact");
58
+ class t extends c {
59
+ constructor() {
60
+ super(...arguments), this.heading = "", this.time = "", this.icon = "", this.variant = "neutral", this.last = !1, this.compact = !1;
61
+ }
62
+ static {
63
+ this.styles = [
64
+ c.styles,
65
+ h`
66
+ :host {
67
+ display: block;
68
+ }
69
+
70
+ .item {
71
+ display: grid;
72
+ grid-template-columns: 26px 1fr;
73
+ gap: 12px;
74
+ padding-bottom: 20px;
75
+ }
76
+
77
+ :host([compact]) .item {
78
+ padding-bottom: 12px;
79
+ }
80
+
81
+ :host([last]) .item {
82
+ padding-bottom: 0;
83
+ }
84
+
85
+ /* The rail. It hangs below the marker, so the last item drops it. */
86
+ .rail {
87
+ display: flex;
88
+ flex-direction: column;
89
+ align-items: center;
90
+ gap: 6px;
91
+ }
92
+
93
+ .rail::after {
94
+ flex: 1;
95
+ width: 1px;
96
+ min-height: 8px;
97
+ background: var(--border-subtle);
98
+ content: '';
99
+ }
100
+
101
+ :host([last]) .rail::after {
102
+ content: none;
103
+ }
104
+
105
+ /* Hairline, wash, ink — the same three parts a chip and a badge wear, so
106
+ a marker beside them reads as the same system. A soft fill with no
107
+ border is a different one's idea of a timeline. */
108
+ .marker {
109
+ display: flex;
110
+ flex-shrink: 0;
111
+ align-items: center;
112
+ justify-content: center;
113
+ box-sizing: border-box;
114
+ width: 26px;
115
+ height: 26px;
116
+ color: var(--marker-ink, var(--text-muted));
117
+ background: var(--marker-wash, var(--surface-raised));
118
+ border: var(--border-width) solid var(--marker-line, var(--border-subtle));
119
+ border-radius: var(--radius-full);
120
+ }
121
+
122
+ /* Without an icon the marker is a dot, not an empty ring — but it keeps
123
+ the ring, so the rail reads as one line of marks rather than two. */
124
+ .marker.dot {
125
+ width: 11px;
126
+ height: 11px;
127
+ margin-top: 7px;
128
+ background: var(--marker-ink, var(--text-disabled));
129
+ border-color: color-mix(
130
+ in srgb,
131
+ var(--marker-ink, var(--text-disabled)) 45%,
132
+ var(--surface-page)
133
+ );
134
+ }
135
+
136
+ .marker.primary {
137
+ --marker-ink: var(--color-primary-base);
138
+ --marker-wash: var(--color-primary-soft);
139
+ --marker-line: color-mix(in srgb, var(--color-primary-base) 45%, transparent);
140
+ }
141
+ .marker.success {
142
+ --marker-ink: var(--color-success-base);
143
+ --marker-wash: var(--color-success-soft);
144
+ --marker-line: color-mix(in srgb, var(--color-success-base) 45%, transparent);
145
+ }
146
+ .marker.warning {
147
+ --marker-ink: var(--color-warning-base);
148
+ --marker-wash: var(--color-warning-soft);
149
+ --marker-line: color-mix(in srgb, var(--color-warning-base) 45%, transparent);
150
+ }
151
+ .marker.danger {
152
+ --marker-ink: var(--color-danger-base);
153
+ --marker-wash: var(--color-danger-soft);
154
+ --marker-line: color-mix(in srgb, var(--color-danger-base) 45%, transparent);
155
+ }
156
+ .marker.info {
157
+ --marker-ink: var(--color-info-base);
158
+ --marker-wash: var(--color-info-soft);
159
+ --marker-line: color-mix(in srgb, var(--color-info-base) 45%, transparent);
160
+ }
161
+
162
+ .content {
163
+ display: flex;
164
+ flex-direction: column;
165
+ gap: 2px;
166
+ min-width: 0;
167
+ padding-top: 2px;
168
+ }
169
+
170
+ .top {
171
+ display: flex;
172
+ align-items: baseline;
173
+ gap: 8px;
174
+ }
175
+
176
+ .heading {
177
+ color: var(--text-body);
178
+ font: var(--font-medium-regular);
179
+ }
180
+
181
+ .time {
182
+ margin-left: auto;
183
+ color: var(--text-muted);
184
+ font: var(--font-normal-small);
185
+ font-variant-numeric: tabular-nums;
186
+ white-space: nowrap;
187
+ }
188
+
189
+ .body {
190
+ color: var(--text-muted);
191
+ font: var(--font-normal-regular);
192
+ line-height: 1.6;
193
+ }
194
+
195
+ ::slotted(*) {
196
+ margin: 0;
197
+ }
198
+ `
199
+ ];
200
+ }
201
+ connectedCallback() {
202
+ super.connectedCallback(), this.setAttribute("role", "listitem");
203
+ }
204
+ render() {
205
+ const r = k({
206
+ marker: !0,
207
+ dot: !this.icon,
208
+ [this.variant]: !0
209
+ });
210
+ return s`<div part="base" class="item">
211
+ <div class="rail">
212
+ <span part="marker" class=${r}>
213
+ ${this.icon ? s`<kt-icon name=${this.icon} size="14"></kt-icon>` : m}
214
+ </span>
215
+ </div>
216
+
217
+ <div class="content">
218
+ ${this.heading || this.time ? s`<div class="top">
219
+ ${this.heading ? s`<span class="heading">${this.heading}</span>` : m}
220
+ <slot name="actions"></slot>
221
+ ${this.time ? s`<span class="time">${this.time}</span>` : m}
222
+ </div>` : m}
223
+ <div class="body"><slot></slot></div>
224
+ </div>
225
+ </div>`;
226
+ }
227
+ }
228
+ i([
229
+ a({ type: String })
230
+ ], t.prototype, "heading");
231
+ i([
232
+ a({ type: String })
233
+ ], t.prototype, "time");
234
+ i([
235
+ a({ type: String })
236
+ ], t.prototype, "icon");
237
+ i([
238
+ a({ type: String, reflect: !0 })
239
+ ], t.prototype, "variant");
240
+ i([
241
+ a({ type: Boolean, reflect: !0 })
242
+ ], t.prototype, "last");
243
+ i([
244
+ a({ type: Boolean, reflect: !0 })
245
+ ], t.prototype, "compact");
246
+ f("kt-timeline", g);
247
+ f("kt-timeline-item", t);
248
+ export {
249
+ g as KtTimeline,
250
+ t as KtTimelineItem
251
+ };
252
+ //# sourceMappingURL=kt-timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-timeline.js","sources":["../../../../src/components/data/kt-timeline/kt-timeline.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport type KtTimelineVariant = 'neutral' | 'primary' | 'success' | 'warning' | 'danger' | 'info';\n\n/**\n * An ordered run of events on a rail.\n *\n * The same shape keeps reappearing — an activity feed, an audit log, a\n * changelog, the stages of a delivery, a résumé — and every time it gets\n * rebuilt out of a list, a pseudo-element line and a hand-placed dot. The\n * fiddly part is the rail: it must start at the first dot and stop at the\n * last, which a border on the list cannot do. Here each item draws its own\n * segment and the last one is told to stop.\n *\n * `<kt-timeline>` is the semantic list; `<kt-timeline-item>` is one event.\n *\n * @element kt-timeline\n *\n * @slot - The `<kt-timeline-item>` children.\n *\n * @csspart base - The list.\n *\n * @example\n * ```html\n * <kt-timeline>\n * <kt-timeline-item heading=\"Deployed\" time=\"09:24\" variant=\"success\" icon=\"rocket\">\n * Build 4210 went to production.\n * </kt-timeline-item>\n * <kt-timeline-item heading=\"Review requested\" time=\"09:02\" icon=\"eye\"></kt-timeline-item>\n * </kt-timeline>\n * ```\n */\nexport class KtTimeline extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .timeline {\n display: flex;\n flex-direction: column;\n }\n `,\n ];\n\n /** Tighter rhythm, for a feed in a side panel. */\n @property({ type: Boolean, reflect: true })\n compact = false;\n\n override render(): TemplateResult {\n return html`<div part=\"base\" class=\"timeline\" role=\"list\">\n <slot @slotchange=${this.#markLast}></slot>\n </div>`;\n }\n\n /**\n * The first `slotchange` is a microtask that can land after `updateComplete`,\n * so a caller that awaits the element would read stale items. Sync once the\n * shadow root exists as well as on every later change.\n */\n override firstUpdated(): void {\n this.#markLast();\n }\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('compact')) this.#markLast();\n }\n\n /**\n * The rail has to stop at the last dot rather than run past it, and CSS\n * cannot select \"last slotted element\" from inside the shadow root —\n * `:last-child` matches in the light tree, which the item's own styles\n * cannot see. So the parent tells it.\n */\n #markLast = (): void => {\n const slot = this.shadowRoot?.querySelector('slot');\n if (!slot) return;\n\n const items = slot\n .assignedElements({ flatten: true })\n .filter((el): el is KtTimelineItem => el instanceof KtTimelineItem);\n\n items.forEach((item, index) => {\n item.last = index === items.length - 1;\n item.compact = this.compact;\n });\n };\n}\n\n/**\n * One event on a `<kt-timeline>`.\n *\n * @element kt-timeline-item\n *\n * @slot - The body of the event.\n * @slot actions - Trailing controls, aligned with the heading.\n *\n * @csspart base - The row.\n * @csspart marker - The dot or icon.\n */\nexport class KtTimelineItem extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .item {\n display: grid;\n grid-template-columns: 26px 1fr;\n gap: 12px;\n padding-bottom: 20px;\n }\n\n :host([compact]) .item {\n padding-bottom: 12px;\n }\n\n :host([last]) .item {\n padding-bottom: 0;\n }\n\n /* The rail. It hangs below the marker, so the last item drops it. */\n .rail {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n }\n\n .rail::after {\n flex: 1;\n width: 1px;\n min-height: 8px;\n background: var(--border-subtle);\n content: '';\n }\n\n :host([last]) .rail::after {\n content: none;\n }\n\n /* Hairline, wash, ink — the same three parts a chip and a badge wear, so\n a marker beside them reads as the same system. A soft fill with no\n border is a different one's idea of a timeline. */\n .marker {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: 26px;\n height: 26px;\n color: var(--marker-ink, var(--text-muted));\n background: var(--marker-wash, var(--surface-raised));\n border: var(--border-width) solid var(--marker-line, var(--border-subtle));\n border-radius: var(--radius-full);\n }\n\n /* Without an icon the marker is a dot, not an empty ring — but it keeps\n the ring, so the rail reads as one line of marks rather than two. */\n .marker.dot {\n width: 11px;\n height: 11px;\n margin-top: 7px;\n background: var(--marker-ink, var(--text-disabled));\n border-color: color-mix(\n in srgb,\n var(--marker-ink, var(--text-disabled)) 45%,\n var(--surface-page)\n );\n }\n\n .marker.primary {\n --marker-ink: var(--color-primary-base);\n --marker-wash: var(--color-primary-soft);\n --marker-line: color-mix(in srgb, var(--color-primary-base) 45%, transparent);\n }\n .marker.success {\n --marker-ink: var(--color-success-base);\n --marker-wash: var(--color-success-soft);\n --marker-line: color-mix(in srgb, var(--color-success-base) 45%, transparent);\n }\n .marker.warning {\n --marker-ink: var(--color-warning-base);\n --marker-wash: var(--color-warning-soft);\n --marker-line: color-mix(in srgb, var(--color-warning-base) 45%, transparent);\n }\n .marker.danger {\n --marker-ink: var(--color-danger-base);\n --marker-wash: var(--color-danger-soft);\n --marker-line: color-mix(in srgb, var(--color-danger-base) 45%, transparent);\n }\n .marker.info {\n --marker-ink: var(--color-info-base);\n --marker-wash: var(--color-info-soft);\n --marker-line: color-mix(in srgb, var(--color-info-base) 45%, transparent);\n }\n\n .content {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n padding-top: 2px;\n }\n\n .top {\n display: flex;\n align-items: baseline;\n gap: 8px;\n }\n\n .heading {\n color: var(--text-body);\n font: var(--font-medium-regular);\n }\n\n .time {\n margin-left: auto;\n color: var(--text-muted);\n font: var(--font-normal-small);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n }\n\n .body {\n color: var(--text-muted);\n font: var(--font-normal-regular);\n line-height: 1.6;\n }\n\n ::slotted(*) {\n margin: 0;\n }\n `,\n ];\n\n @property({ type: String })\n heading = '';\n\n /** Shown right-aligned on the heading row. Any string — \"09:24\", \"2 days ago\". */\n @property({ type: String })\n time = '';\n\n /** Lucide icon name. Without one the marker is a plain dot. */\n @property({ type: String })\n icon = '';\n\n @property({ type: String, reflect: true })\n variant: KtTimelineVariant = 'neutral';\n\n /** Set by the parent `<kt-timeline>`: drops the trailing rail segment. */\n @property({ type: Boolean, reflect: true })\n last = false;\n\n /** Set by the parent `<kt-timeline>`. */\n @property({ type: Boolean, reflect: true })\n compact = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('role', 'listitem');\n }\n\n override render(): TemplateResult {\n const marker = classMap({\n marker: true,\n dot: !this.icon,\n [this.variant]: true,\n });\n\n return html`<div part=\"base\" class=\"item\">\n <div class=\"rail\">\n <span part=\"marker\" class=${marker}>\n ${this.icon ? html`<kt-icon name=${this.icon} size=\"14\"></kt-icon>` : nothing}\n </span>\n </div>\n\n <div class=\"content\">\n ${\n this.heading || this.time\n ? html`<div class=\"top\">\n ${this.heading ? html`<span class=\"heading\">${this.heading}</span>` : nothing}\n <slot name=\"actions\"></slot>\n ${this.time ? html`<span class=\"time\">${this.time}</span>` : nothing}\n </div>`\n : nothing\n }\n <div class=\"body\"><slot></slot></div>\n </div>\n </div>`;\n }\n}\n\ndefineElement('kt-timeline', KtTimeline);\ndefineElement('kt-timeline-item', KtTimelineItem);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-timeline': KtTimeline;\n 'kt-timeline-item': KtTimelineItem;\n }\n}\n"],"names":["KtTimeline","KtElement","#markLast","slot","items","el","KtTimelineItem","item","index","css","html","changed","__decorateClass","property","marker","classMap","nothing","defineElement"],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ import '../../core/kt-icon/kt-icon.js';
4
+ export type KtAlertVariant = 'info' | 'success' | 'warning' | 'danger' | 'neutral';
5
+ /**
6
+ * A message that stays on the page.
7
+ *
8
+ * Against a toast: a toast is transient and interrupts; an alert sits in the
9
+ * layout and waits. Use an alert when the message belongs to the page — a form
10
+ * that failed to save, a trial about to expire, a consent notice — and a toast
11
+ * when it belongs to the moment.
12
+ *
13
+ * @element kt-alert
14
+ *
15
+ * @slot - Body text, when `description` is not used.
16
+ * @slot actions - Buttons, at the end.
17
+ *
18
+ * @csspart base - The alert.
19
+ * @csspart close - The dismiss button.
20
+ *
21
+ * @fires kt-close - The dismiss button was pressed.
22
+ *
23
+ * @example
24
+ * ```html
25
+ * <kt-alert variant="warning" heading="Storage almost full"
26
+ * description="You are using 88% of your quota."></kt-alert>
27
+ * ```
28
+ */
29
+ export declare class KtAlert extends KtElement {
30
+ static styles: import("lit").CSSResultGroup[];
31
+ variant: KtAlertVariant;
32
+ heading: string;
33
+ description: string;
34
+ /** Adds a dismiss button. Removing the alert is the caller's job. */
35
+ dismissible: boolean;
36
+ /** Hides the leading icon. */
37
+ noIcon: boolean;
38
+ /** Overrides the icon the variant would pick. */
39
+ icon: string;
40
+ render(): TemplateResult;
41
+ }
42
+ declare global {
43
+ interface HTMLElementTagNameMap {
44
+ 'kt-alert': KtAlert;
45
+ }
46
+ }
@@ -0,0 +1,180 @@
1
+ import { css as v, nothing as s, html as e } from "lit";
2
+ import { property as a } from "lit/decorators.js";
3
+ import { K as p, d as h } from "../../../chunks/kt-element-CcMLO5e8.js";
4
+ import { e as g } from "../../../chunks/events-Bjl5Zmmq.js";
5
+ import "../../core/kt-icon/kt-icon.js";
6
+ var f = Object.defineProperty, t = (n, i, c, b) => {
7
+ for (var r = void 0, l = n.length - 1, d; l >= 0; l--)
8
+ (d = n[l]) && (r = d(i, c, r) || r);
9
+ return r && f(i, c, r), r;
10
+ };
11
+ const u = {
12
+ info: "info",
13
+ success: "circle-check",
14
+ warning: "triangle-alert",
15
+ danger: "circle-alert",
16
+ neutral: "info"
17
+ };
18
+ class o extends p {
19
+ constructor() {
20
+ super(...arguments), this.variant = "info", this.heading = "", this.description = "", this.dismissible = !1, this.noIcon = !1, this.icon = "";
21
+ }
22
+ static {
23
+ this.styles = [
24
+ p.styles,
25
+ v`
26
+ :host {
27
+ display: block;
28
+ }
29
+
30
+ .alert {
31
+ display: flex;
32
+ align-items: flex-start;
33
+ gap: var(--gap-form);
34
+ padding: var(--padding-form);
35
+ color: var(--text-body);
36
+ background: var(--surface-card);
37
+ border: var(--border-width) solid var(--border-subtle);
38
+ border-radius: var(--border-radius);
39
+ }
40
+
41
+ /* A tinted fill plus a matching border, rather than a coloured bar: the
42
+ whole block should read as the message's temperature. */
43
+ :host([variant='info']) .alert {
44
+ background: var(--color-info-soft);
45
+ border-color: var(--color-info-base);
46
+ }
47
+ :host([variant='success']) .alert {
48
+ background: var(--color-success-soft);
49
+ border-color: var(--color-success-base);
50
+ }
51
+ :host([variant='warning']) .alert {
52
+ background: var(--color-warning-soft);
53
+ border-color: var(--color-warning-base);
54
+ }
55
+ :host([variant='danger']) .alert {
56
+ background: var(--color-danger-soft);
57
+ border-color: var(--color-danger-base);
58
+ }
59
+
60
+ .icon {
61
+ display: flex;
62
+ flex: none;
63
+ padding-top: 1px;
64
+ }
65
+
66
+ :host([variant='info']) .icon {
67
+ color: var(--color-info-base);
68
+ }
69
+ :host([variant='success']) .icon {
70
+ color: var(--color-success-base);
71
+ }
72
+ :host([variant='warning']) .icon {
73
+ color: var(--color-warning-base);
74
+ }
75
+ :host([variant='danger']) .icon {
76
+ color: var(--color-danger-base);
77
+ }
78
+ :host([variant='neutral']) .icon {
79
+ color: var(--text-muted);
80
+ }
81
+
82
+ .content {
83
+ display: flex;
84
+ flex: 1;
85
+ flex-direction: column;
86
+ gap: var(--gap-element);
87
+ min-width: 0;
88
+ }
89
+
90
+ .heading {
91
+ font: var(--font-normal-medium);
92
+ }
93
+
94
+ .description {
95
+ color: var(--text-muted);
96
+ font: var(--font-normal-regular);
97
+ }
98
+
99
+ .actions {
100
+ display: flex;
101
+ flex-wrap: wrap;
102
+ gap: var(--gap-button);
103
+ margin-top: 4px;
104
+ }
105
+
106
+ .actions:not(:has(*)) {
107
+ display: none;
108
+ }
109
+
110
+ .close {
111
+ display: flex;
112
+ flex: none;
113
+ align-items: center;
114
+ padding: 2px;
115
+ color: currentcolor;
116
+ background: none;
117
+ border: none;
118
+ border-radius: 4px;
119
+ cursor: pointer;
120
+ opacity: 0.7;
121
+ }
122
+
123
+ .close:hover {
124
+ opacity: 1;
125
+ }
126
+
127
+ .close:focus-visible {
128
+ outline: var(--outline-width) solid var(--color-primary-base);
129
+ }
130
+ `
131
+ ];
132
+ }
133
+ render() {
134
+ const i = this.variant === "danger" ? "assertive" : "polite";
135
+ return e`<div part="base" class="alert" role="alert" aria-live=${i}>
136
+ ${this.noIcon ? s : e`<span class="icon">
137
+ <kt-icon name=${this.icon || u[this.variant]} size="20"></kt-icon>
138
+ </span>`}
139
+
140
+ <div class="content">
141
+ ${this.heading ? e`<span class="heading">${this.heading}</span>` : s}
142
+ ${this.description ? e`<span class="description">${this.description}</span>` : s}
143
+ <slot></slot>
144
+ <div class="actions"><slot name="actions"></slot></div>
145
+ </div>
146
+
147
+ ${this.dismissible ? e`<button
148
+ part="close"
149
+ class="close"
150
+ aria-label="Dismiss"
151
+ @click=${() => g(this, "kt-close")}
152
+ >
153
+ <kt-icon name="x" size="16"></kt-icon>
154
+ </button>` : s}
155
+ </div>`;
156
+ }
157
+ }
158
+ t([
159
+ a({ type: String, reflect: !0 })
160
+ ], o.prototype, "variant");
161
+ t([
162
+ a({ type: String })
163
+ ], o.prototype, "heading");
164
+ t([
165
+ a({ type: String })
166
+ ], o.prototype, "description");
167
+ t([
168
+ a({ type: Boolean })
169
+ ], o.prototype, "dismissible");
170
+ t([
171
+ a({ type: Boolean, attribute: "no-icon" })
172
+ ], o.prototype, "noIcon");
173
+ t([
174
+ a({ type: String })
175
+ ], o.prototype, "icon");
176
+ h("kt-alert", o);
177
+ export {
178
+ o as KtAlert
179
+ };
180
+ //# sourceMappingURL=kt-alert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-alert.js","sources":["../../../../src/components/feedback/kt-alert/kt-alert.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport type KtAlertVariant = 'info' | 'success' | 'warning' | 'danger' | 'neutral';\n\nconst ICONS: Record<KtAlertVariant, string> = {\n info: 'info',\n success: 'circle-check',\n warning: 'triangle-alert',\n danger: 'circle-alert',\n neutral: 'info',\n};\n\n/**\n * A message that stays on the page.\n *\n * Against a toast: a toast is transient and interrupts; an alert sits in the\n * layout and waits. Use an alert when the message belongs to the page — a form\n * that failed to save, a trial about to expire, a consent notice — and a toast\n * when it belongs to the moment.\n *\n * @element kt-alert\n *\n * @slot - Body text, when `description` is not used.\n * @slot actions - Buttons, at the end.\n *\n * @csspart base - The alert.\n * @csspart close - The dismiss button.\n *\n * @fires kt-close - The dismiss button was pressed.\n *\n * @example\n * ```html\n * <kt-alert variant=\"warning\" heading=\"Storage almost full\"\n * description=\"You are using 88% of your quota.\"></kt-alert>\n * ```\n */\nexport class KtAlert extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .alert {\n display: flex;\n align-items: flex-start;\n gap: var(--gap-form);\n padding: var(--padding-form);\n color: var(--text-body);\n background: var(--surface-card);\n border: var(--border-width) solid var(--border-subtle);\n border-radius: var(--border-radius);\n }\n\n /* A tinted fill plus a matching border, rather than a coloured bar: the\n whole block should read as the message's temperature. */\n :host([variant='info']) .alert {\n background: var(--color-info-soft);\n border-color: var(--color-info-base);\n }\n :host([variant='success']) .alert {\n background: var(--color-success-soft);\n border-color: var(--color-success-base);\n }\n :host([variant='warning']) .alert {\n background: var(--color-warning-soft);\n border-color: var(--color-warning-base);\n }\n :host([variant='danger']) .alert {\n background: var(--color-danger-soft);\n border-color: var(--color-danger-base);\n }\n\n .icon {\n display: flex;\n flex: none;\n padding-top: 1px;\n }\n\n :host([variant='info']) .icon {\n color: var(--color-info-base);\n }\n :host([variant='success']) .icon {\n color: var(--color-success-base);\n }\n :host([variant='warning']) .icon {\n color: var(--color-warning-base);\n }\n :host([variant='danger']) .icon {\n color: var(--color-danger-base);\n }\n :host([variant='neutral']) .icon {\n color: var(--text-muted);\n }\n\n .content {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--gap-element);\n min-width: 0;\n }\n\n .heading {\n font: var(--font-normal-medium);\n }\n\n .description {\n color: var(--text-muted);\n font: var(--font-normal-regular);\n }\n\n .actions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--gap-button);\n margin-top: 4px;\n }\n\n .actions:not(:has(*)) {\n display: none;\n }\n\n .close {\n display: flex;\n flex: none;\n align-items: center;\n padding: 2px;\n color: currentcolor;\n background: none;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n opacity: 0.7;\n }\n\n .close:hover {\n opacity: 1;\n }\n\n .close:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n `,\n ];\n\n @property({ type: String, reflect: true })\n variant: KtAlertVariant = 'info';\n\n @property({ type: String })\n heading = '';\n\n @property({ type: String })\n description = '';\n\n /** Adds a dismiss button. Removing the alert is the caller's job. */\n @property({ type: Boolean })\n dismissible = false;\n\n /** Hides the leading icon. */\n @property({ type: Boolean, attribute: 'no-icon' })\n noIcon = false;\n\n /** Overrides the icon the variant would pick. */\n @property({ type: String })\n icon = '';\n\n override render(): TemplateResult {\n // Danger interrupts; the rest wait their turn.\n const live = this.variant === 'danger' ? 'assertive' : 'polite';\n\n return html`<div part=\"base\" class=\"alert\" role=\"alert\" aria-live=${live}>\n ${\n this.noIcon\n ? nothing\n : html`<span class=\"icon\">\n <kt-icon name=${this.icon || ICONS[this.variant]} size=\"20\"></kt-icon>\n </span>`\n }\n\n <div class=\"content\">\n ${this.heading ? html`<span class=\"heading\">${this.heading}</span>` : nothing}\n ${this.description ? html`<span class=\"description\">${this.description}</span>` : nothing}\n <slot></slot>\n <div class=\"actions\"><slot name=\"actions\"></slot></div>\n </div>\n\n ${\n this.dismissible\n ? html`<button\n part=\"close\"\n class=\"close\"\n aria-label=\"Dismiss\"\n @click=${() => emit(this, 'kt-close')}\n >\n <kt-icon name=\"x\" size=\"16\"></kt-icon>\n </button>`\n : nothing\n }\n </div>`;\n }\n}\n\ndefineElement('kt-alert', KtAlert);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-alert': KtAlert;\n }\n}\n"],"names":["ICONS","KtAlert","KtElement","css","live","html","nothing","emit","__decorateClass","property","defineElement"],"mappings":";;;;;;;;;;AAQA,MAAMA,IAAwC;AAAA,EAC5C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACX;AA0BO,MAAMC,UAAgBC,EAAU;AAAA,EAAhC,cAAA;AAAA,UAAA,GAAA,SAAA,GAgHL,KAAA,UAA0B,QAG1B,KAAA,UAAU,IAGV,KAAA,cAAc,IAId,KAAA,cAAc,IAId,KAAA,SAAS,IAIT,KAAA,OAAO;AAAA,EAAA;AAAA,EAjIP,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBA,EAAU;AAAA,MACVC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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,EA0GF;AAAA,EAuBS,SAAyB;AAEhC,UAAMC,IAAO,KAAK,YAAY,WAAW,cAAc;AAEvD,WAAOC,0DAA6DD,CAAI;AAAA,QAEpE,KAAK,SACDE,IACAD;AAAA,8BACkB,KAAK,QAAQL,EAAM,KAAK,OAAO,CAAC;AAAA,oBAExD;AAAA;AAAA;AAAA,UAGI,KAAK,UAAUK,0BAA6B,KAAK,OAAO,YAAYC,CAAO;AAAA,UAC3E,KAAK,cAAcD,8BAAiC,KAAK,WAAW,YAAYC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,QAMzF,KAAK,cACDD;AAAA;AAAA;AAAA;AAAA,uBAIW,MAAME,EAAK,MAAM,UAAU,CAAC;AAAA;AAAA;AAAA,yBAIvCD,CACN;AAAA;AAAA,EAEJ;AACF;AAtDEE,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GA/G9BR,EAgHX,WAAA,SAAA;AAGAO,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAlHfR,EAmHX,WAAA,SAAA;AAGAO,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GArHfR,EAsHX,WAAA,aAAA;AAIAO,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GAzHhBR,EA0HX,WAAA,aAAA;AAIAO,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,WAAW,WAAW;AAAA,GA7HtCR,EA8HX,WAAA,QAAA;AAIAO,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAjIfR,EAkIX,WAAA,MAAA;AAsCFS,EAAc,YAAYT,CAAO;"}
@@ -0,0 +1,40 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ import '../../core/kt-icon/kt-icon.js';
4
+ /**
5
+ * What a screen shows when it has nothing to show.
6
+ *
7
+ * Worth a component because the empty case is where products are usually
8
+ * thinnest, and where they most need to say what to do next. An icon, a
9
+ * sentence and an action beat a blank panel every time.
10
+ *
11
+ * @element kt-empty-state
12
+ *
13
+ * @slot - Extra content between the description and the actions.
14
+ * @slot actions - Buttons.
15
+ *
16
+ * @csspart base - The container.
17
+ *
18
+ * @example
19
+ * ```html
20
+ * <kt-empty-state icon="inbox" heading="Nothing here"
21
+ * description="New messages will appear in this list.">
22
+ * <kt-button slot="actions" icon="plus">Compose</kt-button>
23
+ * </kt-empty-state>
24
+ * ```
25
+ */
26
+ export declare class KtEmptyState extends KtElement {
27
+ static styles: import("lit").CSSResultGroup[];
28
+ /** Lucide icon name, kebab-case. */
29
+ icon: string;
30
+ heading: string;
31
+ description: string;
32
+ /** Tighter padding, for an empty state inside a card or a panel. */
33
+ compact: boolean;
34
+ render(): TemplateResult;
35
+ }
36
+ declare global {
37
+ interface HTMLElementTagNameMap {
38
+ 'kt-empty-state': KtEmptyState;
39
+ }
40
+ }
@@ -0,0 +1,100 @@
1
+ import { css as h, nothing as r, html as i } from "lit";
2
+ import { property as n } from "lit/decorators.js";
3
+ import { K as d, d as m } from "../../../chunks/kt-element-CcMLO5e8.js";
4
+ import "../../core/kt-icon/kt-icon.js";
5
+ var g = Object.defineProperty, o = (s, p, c, f) => {
6
+ for (var t = void 0, a = s.length - 1, l; a >= 0; a--)
7
+ (l = s[a]) && (t = l(p, c, t) || t);
8
+ return t && g(p, c, t), t;
9
+ };
10
+ class e extends d {
11
+ constructor() {
12
+ super(...arguments), this.icon = "inbox", this.heading = "", this.description = "", this.compact = !1;
13
+ }
14
+ static {
15
+ this.styles = [
16
+ d.styles,
17
+ h`
18
+ :host {
19
+ display: block;
20
+ }
21
+
22
+ .empty {
23
+ display: flex;
24
+ flex-direction: column;
25
+ align-items: center;
26
+ justify-content: center;
27
+ gap: var(--gap-button);
28
+ padding: 48px 24px;
29
+ text-align: center;
30
+ }
31
+
32
+ :host([compact]) .empty {
33
+ padding: 24px 16px;
34
+ }
35
+
36
+ .icon {
37
+ display: flex;
38
+ align-items: center;
39
+ justify-content: center;
40
+ width: 48px;
41
+ height: 48px;
42
+ margin-bottom: 4px;
43
+ color: var(--text-muted);
44
+ background: var(--surface-raised);
45
+ border-radius: var(--radius-full);
46
+ }
47
+
48
+ .heading {
49
+ color: var(--text-body);
50
+ font: var(--font-title-h6);
51
+ }
52
+
53
+ .description {
54
+ max-width: 42ch;
55
+ color: var(--text-muted);
56
+ font: var(--font-normal-regular);
57
+ line-height: 1.6;
58
+ }
59
+
60
+ .actions {
61
+ display: flex;
62
+ flex-wrap: wrap;
63
+ justify-content: center;
64
+ gap: var(--gap-button);
65
+ margin-top: 8px;
66
+ }
67
+
68
+ .actions:not(:has(*)) {
69
+ display: none;
70
+ }
71
+ `
72
+ ];
73
+ }
74
+ render() {
75
+ return i`<div part="base" class="empty">
76
+ ${this.icon ? i`<span class="icon"><kt-icon name=${this.icon} size="22"></kt-icon></span>` : r}
77
+ ${this.heading ? i`<span class="heading">${this.heading}</span>` : r}
78
+ ${this.description ? i`<p class="description">${this.description}</p>` : r}
79
+ <slot></slot>
80
+ <div class="actions"><slot name="actions"></slot></div>
81
+ </div>`;
82
+ }
83
+ }
84
+ o([
85
+ n({ type: String })
86
+ ], e.prototype, "icon");
87
+ o([
88
+ n({ type: String })
89
+ ], e.prototype, "heading");
90
+ o([
91
+ n({ type: String })
92
+ ], e.prototype, "description");
93
+ o([
94
+ n({ type: Boolean, reflect: !0 })
95
+ ], e.prototype, "compact");
96
+ m("kt-empty-state", e);
97
+ export {
98
+ e as KtEmptyState
99
+ };
100
+ //# sourceMappingURL=kt-empty-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-empty-state.js","sources":["../../../../src/components/feedback/kt-empty-state/kt-empty-state.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';\n\n/**\n * What a screen shows when it has nothing to show.\n *\n * Worth a component because the empty case is where products are usually\n * thinnest, and where they most need to say what to do next. An icon, a\n * sentence and an action beat a blank panel every time.\n *\n * @element kt-empty-state\n *\n * @slot - Extra content between the description and the actions.\n * @slot actions - Buttons.\n *\n * @csspart base - The container.\n *\n * @example\n * ```html\n * <kt-empty-state icon=\"inbox\" heading=\"Nothing here\"\n * description=\"New messages will appear in this list.\">\n * <kt-button slot=\"actions\" icon=\"plus\">Compose</kt-button>\n * </kt-empty-state>\n * ```\n */\nexport class KtEmptyState extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--gap-button);\n padding: 48px 24px;\n text-align: center;\n }\n\n :host([compact]) .empty {\n padding: 24px 16px;\n }\n\n .icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n margin-bottom: 4px;\n color: var(--text-muted);\n background: var(--surface-raised);\n border-radius: var(--radius-full);\n }\n\n .heading {\n color: var(--text-body);\n font: var(--font-title-h6);\n }\n\n .description {\n max-width: 42ch;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n line-height: 1.6;\n }\n\n .actions {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: var(--gap-button);\n margin-top: 8px;\n }\n\n .actions:not(:has(*)) {\n display: none;\n }\n `,\n ];\n\n /** Lucide icon name, kebab-case. */\n @property({ type: String })\n icon = 'inbox';\n\n @property({ type: String })\n heading = '';\n\n @property({ type: String })\n description = '';\n\n /** Tighter padding, for an empty state inside a card or a panel. */\n @property({ type: Boolean, reflect: true })\n compact = false;\n\n override render(): TemplateResult {\n return html`<div part=\"base\" class=\"empty\">\n ${\n this.icon\n ? html`<span class=\"icon\"><kt-icon name=${this.icon} size=\"22\"></kt-icon></span>`\n : nothing\n }\n ${this.heading ? html`<span class=\"heading\">${this.heading}</span>` : nothing}\n ${this.description ? html`<p class=\"description\">${this.description}</p>` : nothing}\n <slot></slot>\n <div class=\"actions\"><slot name=\"actions\"></slot></div>\n </div>`;\n }\n}\n\ndefineElement('kt-empty-state', KtEmptyState);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-empty-state': KtEmptyState;\n }\n}\n"],"names":["KtEmptyState","KtElement","css","html","nothing","__decorateClass","property","defineElement"],"mappings":";;;;;;;;;AA2BO,MAAMA,UAAqBC,EAAU;AAAA,EAArC,cAAA;AAAA,UAAA,GAAA,SAAA,GA8DL,KAAA,OAAO,SAGP,KAAA,UAAU,IAGV,KAAA,cAAc,IAId,KAAA,UAAU;AAAA,EAAA;AAAA,EAvEV,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,IAAA;AAAA,EAuDF;AAAA,EAgBS,SAAyB;AAChC,WAAOC;AAAA,QAEH,KAAK,OACDA,qCAAwC,KAAK,IAAI,iCACjDC,CACN;AAAA,QACE,KAAK,UAAUD,0BAA6B,KAAK,OAAO,YAAYC,CAAO;AAAA,QAC3E,KAAK,cAAcD,2BAA8B,KAAK,WAAW,SAASC,CAAO;AAAA;AAAA;AAAA;AAAA,EAIvF;AACF;AAzBEC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA7DfN,EA8DX,WAAA,MAAA;AAGAK,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAhEfN,EAiEX,WAAA,SAAA;AAGAK,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAnEfN,EAoEX,WAAA,aAAA;AAIAK,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAvE/BN,EAwEX,WAAA,SAAA;AAiBFO,EAAc,kBAAkBP,CAAY;"}