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,254 @@
1
+ import { css as u, nothing as n, html as l } from "lit";
2
+ import { property as e } from "lit/decorators.js";
3
+ import { classMap as h } from "lit/directives/class-map.js";
4
+ import { styleMap as m } from "lit/directives/style-map.js";
5
+ import { K as p, d as v } from "../../../chunks/kt-element-CcMLO5e8.js";
6
+ import { e as b } from "../../../chunks/events-Bjl5Zmmq.js";
7
+ import "../kt-icon/kt-icon.js";
8
+ var g = Object.defineProperty, t = (s, r, i, f) => {
9
+ for (var a = void 0, c = s.length - 1, d; c >= 0; c--)
10
+ (d = s[c]) && (a = d(r, i, a) || a);
11
+ return a && g(r, i, a), a;
12
+ };
13
+ class o extends p {
14
+ constructor() {
15
+ super(...arguments), this.variant = "tag", this.tone = "neutral", this.size = "medium", this.label = "", this.color = "", this.icon = "", this.clickable = !1, this.removable = !1, this.error = !1;
16
+ }
17
+ static {
18
+ this.styles = [
19
+ p.styles,
20
+ u`
21
+ :host {
22
+ display: inline-flex;
23
+ vertical-align: middle;
24
+ --kt-badge-color: var(--color-primary-hover);
25
+ }
26
+
27
+ .badge {
28
+ display: inline-flex;
29
+ align-items: center;
30
+ gap: var(--gap-element);
31
+ width: fit-content;
32
+ margin: 0;
33
+ padding: var(--padding-chip);
34
+ color: var(--text-body);
35
+ font: var(--font-normal-regular);
36
+ background-color: var(--color-dark-20);
37
+ border: var(--border-width) solid var(--color-text-600);
38
+ border-radius: var(--radius-input);
39
+ white-space: normal;
40
+ }
41
+
42
+ .small {
43
+ padding: 2px 8px;
44
+ font: var(--font-normal-small);
45
+ }
46
+
47
+ /* === TAG === */
48
+ .tag {
49
+ border-radius: var(--radius-pill);
50
+ }
51
+
52
+ /* === CODE ===
53
+ Uses the semantic code surface rather than a ramp step: --color-dark-8
54
+ is the darkest surface in the dark theme and pure white in the light
55
+ one, which made this badge white-on-white. */
56
+ .code {
57
+ color: var(--text-code);
58
+ font: var(--font-code-regular);
59
+ background-color: var(--surface-code);
60
+ border-color: var(--border-code);
61
+ }
62
+
63
+ /* === CATEGORY ===
64
+ color-mix keeps the 20% fill honest for any colour notation the host
65
+ hands us; concatenating a "33" onto a hex string produces garbage
66
+ for rgb() and named colours. */
67
+ .category {
68
+ color: var(--kt-badge-color);
69
+ background-color: color-mix(in srgb, var(--kt-badge-color) 20%, transparent);
70
+ border-color: var(--kt-badge-color);
71
+ }
72
+
73
+ /* === COUNT ===
74
+ No border: a number pinned to a nav item is a mark on the thing it
75
+ counts, not a label with an outline of its own. */
76
+ .count {
77
+ min-width: 20px;
78
+ padding: 2px 6px;
79
+ justify-content: center;
80
+ color: var(--text-muted);
81
+ font: var(--font-normal-small);
82
+ font-variant-numeric: tabular-nums;
83
+ line-height: 1.4;
84
+ white-space: nowrap;
85
+ background: var(--surface-raised);
86
+ border: none;
87
+ border-radius: var(--radius-pill);
88
+ }
89
+
90
+ /* === TONES ===
91
+ The system's tinted pair everywhere: the colour at 12% behind, the
92
+ colour itself as the ink. The border follows on the bordered shapes
93
+ and is simply absent on the count shape. */
94
+ .primary {
95
+ color: var(--color-primary-base);
96
+ background-color: var(--color-primary-soft);
97
+ border-color: var(--color-primary-base);
98
+ }
99
+ .success {
100
+ color: var(--color-success-base);
101
+ background-color: var(--color-success-soft);
102
+ border-color: var(--color-success-base);
103
+ }
104
+ .warning {
105
+ color: var(--color-warning-base);
106
+ background-color: var(--color-warning-soft);
107
+ border-color: var(--color-warning-base);
108
+ }
109
+ .danger {
110
+ color: var(--color-danger-base);
111
+ background-color: var(--color-danger-soft);
112
+ border-color: var(--color-danger-base);
113
+ }
114
+ .info {
115
+ color: var(--color-info-base);
116
+ background-color: var(--color-info-soft);
117
+ border-color: var(--color-info-base);
118
+ }
119
+
120
+ .count.primary,
121
+ .count.success,
122
+ .count.warning,
123
+ .count.danger,
124
+ .count.info {
125
+ border: none;
126
+ }
127
+
128
+ /* === CLICKABLE === */
129
+ .clickable {
130
+ cursor: pointer;
131
+ }
132
+ .clickable:hover {
133
+ outline: var(--outline-width) solid var(--text-muted);
134
+ }
135
+ .clickable:active {
136
+ color: var(--color-white);
137
+ background-color: var(--color-primary-base);
138
+ border-color: transparent;
139
+ }
140
+ .clickable:focus-visible {
141
+ outline: var(--outline-width) solid var(--color-primary-base);
142
+ outline-offset: 2px;
143
+ }
144
+
145
+ .remove {
146
+ display: inline-flex;
147
+ align-items: center;
148
+ justify-content: center;
149
+ margin-right: -4px;
150
+ padding: 0;
151
+ color: inherit;
152
+ background: none;
153
+ border: none;
154
+ border-radius: var(--radius-pill);
155
+ cursor: pointer;
156
+ opacity: 0.65;
157
+ }
158
+
159
+ .remove:hover {
160
+ opacity: 1;
161
+ }
162
+
163
+ .remove:focus-visible {
164
+ outline: var(--outline-width) solid var(--color-primary-base);
165
+ outline-offset: 1px;
166
+ }
167
+
168
+ kt-icon {
169
+ flex: none;
170
+ }
171
+ `
172
+ ];
173
+ }
174
+ get display() {
175
+ const r = this.label || (this.textContent ?? "").trim();
176
+ if (this.max === void 0) return r;
177
+ const i = Number(r);
178
+ return Number.isFinite(i) && i > this.max ? `${this.max}+` : r;
179
+ }
180
+ activate() {
181
+ this.clickable && b(this, "kt-badge-click");
182
+ }
183
+ onKeyDown(r) {
184
+ this.clickable && (r.key !== "Enter" && r.key !== " " || (r.preventDefault(), this.activate()));
185
+ }
186
+ onRemove(r) {
187
+ r.stopPropagation(), b(this, "kt-remove");
188
+ }
189
+ render() {
190
+ const r = this.error ? "danger" : this.tone;
191
+ return l`<span
192
+ part="base"
193
+ class=${h({
194
+ badge: !0,
195
+ [this.variant]: !0,
196
+ [r]: r !== "neutral",
197
+ small: this.size === "small",
198
+ clickable: this.clickable
199
+ })}
200
+ style=${m(this.color ? { "--kt-badge-color": this.color } : {})}
201
+ role=${this.clickable ? "button" : n}
202
+ tabindex=${this.clickable ? 0 : n}
203
+ @click=${this.activate}
204
+ @keydown=${this.onKeyDown}
205
+ >
206
+ ${this.icon ? l`<kt-icon name=${this.icon} size="14"></kt-icon>` : n}
207
+ ${this.max === void 0 ? l`<slot>${this.label}</slot>` : this.display}
208
+ ${this.removable ? l`<button
209
+ part="remove"
210
+ type="button"
211
+ class="remove"
212
+ aria-label=${`Remove ${this.display || "this"}`}
213
+ @click=${this.onRemove}
214
+ >
215
+ <kt-icon name="x" size="12"></kt-icon>
216
+ </button>` : n}
217
+ </span>`;
218
+ }
219
+ }
220
+ t([
221
+ e({ type: String, reflect: !0 })
222
+ ], o.prototype, "variant");
223
+ t([
224
+ e({ type: String, reflect: !0 })
225
+ ], o.prototype, "tone");
226
+ t([
227
+ e({ type: String, reflect: !0 })
228
+ ], o.prototype, "size");
229
+ t([
230
+ e({ type: String })
231
+ ], o.prototype, "label");
232
+ t([
233
+ e({ type: String })
234
+ ], o.prototype, "color");
235
+ t([
236
+ e({ type: String })
237
+ ], o.prototype, "icon");
238
+ t([
239
+ e({ type: Boolean, reflect: !0 })
240
+ ], o.prototype, "clickable");
241
+ t([
242
+ e({ type: Boolean, reflect: !0 })
243
+ ], o.prototype, "removable");
244
+ t([
245
+ e({ type: Number })
246
+ ], o.prototype, "max");
247
+ t([
248
+ e({ type: Boolean, reflect: !0 })
249
+ ], o.prototype, "error");
250
+ v("kt-badge", o);
251
+ export {
252
+ o as KtBadge
253
+ };
254
+ //# sourceMappingURL=kt-badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-badge.js","sources":["../../../../src/components/core/kt-badge/kt-badge.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 { styleMap } from 'lit/directives/style-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport '../kt-icon/kt-icon.js';\n\nexport type KtBadgeVariant = 'tag' | 'code' | 'category' | 'count';\nexport type KtBadgeTone = 'neutral' | 'primary' | 'success' | 'warning' | 'danger' | 'info';\nexport type KtBadgeSize = 'small' | 'medium';\n\n/**\n * A compact label: a pill `tag`, a monospaced `code` token, a `category`\n * tinted with a colour of your choosing, or a `count`.\n *\n * Two independent axes, because they answer different questions. `variant` is\n * the **shape** — what kind of thing this is. `tone` is the **colour** — what\n * it means. A tag can be neutral or dangerous; so can a count. Folding them\n * into one list would give you nine variants and no way to say \"a tag, but\n * this one is a warning\".\n *\n * `count` is the exception that carries no border, because a number pinned to\n * a nav item is not a label with an outline — it is a mark on the thing it\n * counts.\n *\n * @element kt-badge\n *\n * @slot - The text. Falls back to the `label` attribute.\n *\n * @csspart base - The container.\n * @csspart remove - The remove button, when `removable`.\n *\n * @cssproperty --kt-badge-color - Category hue. The fill is this colour at 20%.\n *\n * @fires kt-badge-click - A `clickable` badge was activated. Cancelable.\n * @fires kt-remove - The remove button was pressed. Cancelable: cancel it and\n * remove the badge yourself once the server agrees.\n *\n * @example\n * ```html\n * <kt-badge>Design systems</kt-badge>\n * <kt-badge tone=\"success\">Active</kt-badge>\n * <kt-badge variant=\"code\">--surface-card</kt-badge>\n * <kt-badge variant=\"category\" color=\"#3987e5\">Infrastructure</kt-badge>\n * <kt-badge variant=\"count\" tone=\"danger\" max=\"99\">128</kt-badge>\n * <kt-badge icon=\"user\" removable>Assigned to me</kt-badge>\n * ```\n */\nexport class KtBadge extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-flex;\n vertical-align: middle;\n --kt-badge-color: var(--color-primary-hover);\n }\n\n .badge {\n display: inline-flex;\n align-items: center;\n gap: var(--gap-element);\n width: fit-content;\n margin: 0;\n padding: var(--padding-chip);\n color: var(--text-body);\n font: var(--font-normal-regular);\n background-color: var(--color-dark-20);\n border: var(--border-width) solid var(--color-text-600);\n border-radius: var(--radius-input);\n white-space: normal;\n }\n\n .small {\n padding: 2px 8px;\n font: var(--font-normal-small);\n }\n\n /* === TAG === */\n .tag {\n border-radius: var(--radius-pill);\n }\n\n /* === CODE ===\n Uses the semantic code surface rather than a ramp step: --color-dark-8\n is the darkest surface in the dark theme and pure white in the light\n one, which made this badge white-on-white. */\n .code {\n color: var(--text-code);\n font: var(--font-code-regular);\n background-color: var(--surface-code);\n border-color: var(--border-code);\n }\n\n /* === CATEGORY ===\n color-mix keeps the 20% fill honest for any colour notation the host\n hands us; concatenating a \"33\" onto a hex string produces garbage\n for rgb() and named colours. */\n .category {\n color: var(--kt-badge-color);\n background-color: color-mix(in srgb, var(--kt-badge-color) 20%, transparent);\n border-color: var(--kt-badge-color);\n }\n\n /* === COUNT ===\n No border: a number pinned to a nav item is a mark on the thing it\n counts, not a label with an outline of its own. */\n .count {\n min-width: 20px;\n padding: 2px 6px;\n justify-content: center;\n color: var(--text-muted);\n font: var(--font-normal-small);\n font-variant-numeric: tabular-nums;\n line-height: 1.4;\n white-space: nowrap;\n background: var(--surface-raised);\n border: none;\n border-radius: var(--radius-pill);\n }\n\n /* === TONES ===\n The system's tinted pair everywhere: the colour at 12% behind, the\n colour itself as the ink. The border follows on the bordered shapes\n and is simply absent on the count shape. */\n .primary {\n color: var(--color-primary-base);\n background-color: var(--color-primary-soft);\n border-color: var(--color-primary-base);\n }\n .success {\n color: var(--color-success-base);\n background-color: var(--color-success-soft);\n border-color: var(--color-success-base);\n }\n .warning {\n color: var(--color-warning-base);\n background-color: var(--color-warning-soft);\n border-color: var(--color-warning-base);\n }\n .danger {\n color: var(--color-danger-base);\n background-color: var(--color-danger-soft);\n border-color: var(--color-danger-base);\n }\n .info {\n color: var(--color-info-base);\n background-color: var(--color-info-soft);\n border-color: var(--color-info-base);\n }\n\n .count.primary,\n .count.success,\n .count.warning,\n .count.danger,\n .count.info {\n border: none;\n }\n\n /* === CLICKABLE === */\n .clickable {\n cursor: pointer;\n }\n .clickable:hover {\n outline: var(--outline-width) solid var(--text-muted);\n }\n .clickable:active {\n color: var(--color-white);\n background-color: var(--color-primary-base);\n border-color: transparent;\n }\n .clickable:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n .remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: -4px;\n padding: 0;\n color: inherit;\n background: none;\n border: none;\n border-radius: var(--radius-pill);\n cursor: pointer;\n opacity: 0.65;\n }\n\n .remove:hover {\n opacity: 1;\n }\n\n .remove:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 1px;\n }\n\n kt-icon {\n flex: none;\n }\n `,\n ];\n\n /** The shape: what kind of thing this is. */\n @property({ type: String, reflect: true })\n variant: KtBadgeVariant = 'tag';\n\n /** The colour: what it means. Independent of `variant`. */\n @property({ type: String, reflect: true })\n tone: KtBadgeTone = 'neutral';\n\n @property({ type: String, reflect: true })\n size: KtBadgeSize = 'medium';\n\n /** Badge text. The default slot wins when both are present. */\n @property({ type: String })\n label = '';\n\n /** Category hue: any CSS colour. The fill is this colour at 20%. */\n @property({ type: String })\n color = '';\n\n /** Lucide icon name, before the text. */\n @property({ type: String })\n icon = '';\n\n @property({ type: Boolean, reflect: true })\n clickable = false;\n\n /** Adds a remove button. Fires a cancelable `kt-remove`. */\n @property({ type: Boolean, reflect: true })\n removable = false;\n\n /**\n * Caps a numeric label: `max=\"99\"` shows `99+`.\n * Ignored when the content is not a number.\n */\n @property({ type: Number })\n max?: number;\n\n /** Shorthand for `tone=\"danger\"`, kept from the field components. */\n @property({ type: Boolean, reflect: true })\n error = false;\n\n private get display(): string {\n const raw = this.label || (this.textContent ?? '').trim();\n if (this.max === undefined) return raw;\n\n const n = Number(raw);\n return Number.isFinite(n) && n > this.max ? `${this.max}+` : raw;\n }\n\n private activate(): void {\n if (this.clickable) emit(this, 'kt-badge-click');\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n if (!this.clickable) return;\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n this.activate();\n }\n\n private onRemove(event: Event): void {\n // Otherwise a removable clickable badge reports both at once.\n event.stopPropagation();\n emit(this, 'kt-remove');\n }\n\n override render(): TemplateResult {\n const tone = this.error ? 'danger' : this.tone;\n\n return html`<span\n part=\"base\"\n class=${classMap({\n badge: true,\n [this.variant]: true,\n [tone]: tone !== 'neutral',\n small: this.size === 'small',\n clickable: this.clickable,\n })}\n style=${styleMap(this.color ? { '--kt-badge-color': this.color } : {})}\n role=${this.clickable ? 'button' : nothing}\n tabindex=${this.clickable ? 0 : nothing}\n @click=${this.activate}\n @keydown=${this.onKeyDown}\n >\n ${this.icon ? html`<kt-icon name=${this.icon} size=\"14\"></kt-icon>` : nothing}\n ${this.max === undefined ? html`<slot>${this.label}</slot>` : this.display}\n ${\n this.removable\n ? html`<button\n part=\"remove\"\n type=\"button\"\n class=\"remove\"\n aria-label=${`Remove ${this.display || 'this'}`}\n @click=${this.onRemove}\n >\n <kt-icon name=\"x\" size=\"12\"></kt-icon>\n </button>`\n : nothing\n }\n </span>`;\n }\n}\n\ndefineElement('kt-badge', KtBadge);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-badge': KtBadge;\n }\n}\n"],"names":["KtBadge","KtElement","css","raw","n","emit","event","tone","html","classMap","styleMap","nothing","__decorateClass","property","defineElement"],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import { KtElement } from '#internal/kt-element';
3
+ import '../kt-icon/kt-icon.js';
4
+ export type KtButtonVariant = 'primary' | 'secondary' | 'secondary-no-bg' | 'dark' | 'danger' | 'delete' | 'warning' | 'info' | 'success' | 'text';
5
+ export type KtButtonSize = 'small' | 'medium' | 'large';
6
+ export type KtButtonType = 'button' | 'submit' | 'reset';
7
+ /**
8
+ * The Kanto action button.
9
+ *
10
+ * Ten variants; `primary` for the one action a screen is about, `secondary`
11
+ * (a soft indigo tint) for everything supporting it. The semantic variants —
12
+ * `danger`, `warning`, `info`, `success` — are tinted fills with coloured
13
+ * text; `delete` is the only solid red, reserved for irreversible actions.
14
+ *
15
+ * Setting `icon` with no slotted text produces a square icon-only button,
16
+ * which then requires a `label`.
17
+ *
18
+ * @element kt-button
19
+ *
20
+ * @slot - The button label.
21
+ *
22
+ * @csspart button - The native `<button>`.
23
+ * @csspart icon - The icon, when `icon` is set.
24
+ *
25
+ * @example
26
+ * ```html
27
+ * <kt-button icon="plus">New entity</kt-button>
28
+ * <kt-button variant="secondary" icon="refresh-cw">Refresh</kt-button>
29
+ * <kt-button variant="danger">Delete</kt-button>
30
+ * ```
31
+ */
32
+ export declare class KtButton extends KtElement {
33
+ static styles: import("lit").CSSResultGroup[];
34
+ /** Visual variant. */
35
+ variant: KtButtonVariant;
36
+ /** Height: 32 / 40 / 48px at the desktop scale. */
37
+ size: KtButtonSize;
38
+ disabled: boolean;
39
+ /** Native button behaviour. `submit` and `reset` act on the enclosing form. */
40
+ type: KtButtonType;
41
+ /** Lucide icon name, kebab-case. */
42
+ icon: string;
43
+ /** Which side of the label the icon sits on. */
44
+ iconPosition: 'left' | 'right';
45
+ /** Accessible name. Required for an icon-only button. */
46
+ label: string;
47
+ /** Stretches the button to the width of its container. */
48
+ fullWidth: boolean;
49
+ /** Submitted with the form, as on a native button. */
50
+ name: string;
51
+ /** @see name */
52
+ value: string;
53
+ /** Moves focus to the button. */
54
+ focus(options?: FocusOptions): void;
55
+ blur(): void;
56
+ private get hasLabelText();
57
+ /**
58
+ * A button inside a shadow root is invisible to the enclosing form, so
59
+ * `type="submit"` would do nothing. Click a throwaway native button instead:
60
+ * that runs constraint validation, fires a real `submit` event, and carries
61
+ * `name`/`value` into the submission the way an author expects.
62
+ */
63
+ private submitEnclosingForm;
64
+ private onClick;
65
+ render(): TemplateResult;
66
+ }
67
+ declare global {
68
+ interface HTMLElementTagNameMap {
69
+ 'kt-button': KtButton;
70
+ }
71
+ }
@@ -0,0 +1,271 @@
1
+ import { css as h, html as d, nothing as i } from "lit";
2
+ import { property as a } from "lit/decorators.js";
3
+ import { classMap as v } from "lit/directives/class-map.js";
4
+ import { K as u, d as b } from "../../../chunks/kt-element-CcMLO5e8.js";
5
+ import "../kt-icon/kt-icon.js";
6
+ var g = Object.defineProperty, e = (l, r, o, y) => {
7
+ for (var n = void 0, c = l.length - 1, s; c >= 0; c--)
8
+ (s = l[c]) && (n = s(r, o, n) || n);
9
+ return n && g(r, o, n), n;
10
+ };
11
+ const p = { small: 16, medium: 20, large: 24 };
12
+ class t extends u {
13
+ constructor() {
14
+ super(...arguments), this.variant = "primary", this.size = "medium", this.disabled = !1, this.type = "button", this.icon = "", this.iconPosition = "left", this.label = "", this.fullWidth = !1, this.name = "", this.value = "";
15
+ }
16
+ static {
17
+ this.styles = [
18
+ u.styles,
19
+ h`
20
+ :host {
21
+ display: inline-flex;
22
+ vertical-align: middle;
23
+ }
24
+
25
+ :host([full-width]) {
26
+ display: flex;
27
+ width: 100%;
28
+ }
29
+
30
+ button {
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: center;
34
+ width: 100%;
35
+ height: var(--button-height);
36
+ padding: 0 var(--button-padding-x);
37
+ gap: var(--gap-button);
38
+ border: none;
39
+ border-radius: var(--border-radius);
40
+ font: var(--font-normal-regular);
41
+ cursor: pointer;
42
+ transition:
43
+ background-color var(--duration-instant),
44
+ color var(--duration-instant);
45
+ }
46
+
47
+ /* === SIZES === */
48
+ .small {
49
+ height: var(--button-height-small);
50
+ padding: 0 8px;
51
+ font: var(--font-normal-small);
52
+ }
53
+
54
+ .large {
55
+ height: var(--button-height-large);
56
+ padding: 0 calc(var(--button-padding-x) + 8px);
57
+ font: var(--font-normal-medium);
58
+ }
59
+
60
+ /* === VARIANTS ===
61
+ Press returns to the base colour; Kanto has no scale or shrink. */
62
+ .primary {
63
+ color: var(--color-white);
64
+ background-color: var(--color-primary-base);
65
+ }
66
+ .primary:hover {
67
+ background-color: var(--color-primary-hover);
68
+ }
69
+ .primary:active {
70
+ background-color: var(--color-primary-base);
71
+ }
72
+
73
+ .secondary {
74
+ color: var(--color-primary-base);
75
+ background-color: var(--color-primary-soft);
76
+ }
77
+ .secondary:hover {
78
+ background-color: var(--color-secondary-hover);
79
+ }
80
+ .secondary:active {
81
+ background-color: var(--color-primary-soft);
82
+ }
83
+
84
+ .secondary-no-bg {
85
+ color: var(--color-primary-base);
86
+ background: none;
87
+ }
88
+ .secondary-no-bg:hover {
89
+ background-color: var(--color-secondary-hover);
90
+ }
91
+ .secondary-no-bg:active {
92
+ background-color: var(--color-dark-14);
93
+ }
94
+
95
+ .dark {
96
+ color: var(--color-text-400);
97
+ background-color: var(--color-dark-20);
98
+ }
99
+ .dark:hover {
100
+ background-color: var(--color-dark-22);
101
+ }
102
+ .dark:active {
103
+ background-color: var(--color-dark-20);
104
+ }
105
+
106
+ .danger {
107
+ color: var(--color-danger-base);
108
+ background-color: var(--color-danger-soft);
109
+ }
110
+ .danger:hover {
111
+ background-color: var(--color-danger-hover);
112
+ }
113
+ .danger:active {
114
+ background-color: var(--color-danger-soft);
115
+ }
116
+
117
+ .delete {
118
+ color: var(--color-white);
119
+ background-color: var(--color-navigation-icon-close);
120
+ }
121
+ .delete:hover {
122
+ background-color: var(--color-danger-base);
123
+ }
124
+
125
+ .warning {
126
+ color: var(--color-warning-base);
127
+ background-color: var(--color-warning-soft);
128
+ }
129
+ .warning:hover {
130
+ background-color: var(--color-warning-hover);
131
+ }
132
+
133
+ .info {
134
+ color: var(--color-info-base);
135
+ background-color: var(--color-info-soft);
136
+ }
137
+ .info:hover {
138
+ background-color: var(--color-info-hover);
139
+ }
140
+
141
+ .success {
142
+ color: var(--color-success-base);
143
+ background-color: var(--color-success-soft);
144
+ }
145
+ .success:hover {
146
+ background-color: var(--color-success-hover);
147
+ }
148
+
149
+ .text {
150
+ height: auto;
151
+ padding: 0;
152
+ color: var(--color-primary-base);
153
+ background: none;
154
+ }
155
+ .text:active {
156
+ background-color: var(--color-dark-14);
157
+ }
158
+
159
+ /* === ICON-ONLY === */
160
+ .icon-only {
161
+ width: var(--button-height);
162
+ padding: 0;
163
+ }
164
+ .icon-only.small {
165
+ width: var(--button-height-small);
166
+ }
167
+ .icon-only.large {
168
+ width: var(--button-height-large);
169
+ }
170
+
171
+ /* === DISABLED === */
172
+ button:disabled {
173
+ color: var(--text-disabled);
174
+ background-color: var(--color-dark-14);
175
+ cursor: not-allowed;
176
+ }
177
+ button:disabled:hover {
178
+ background-color: var(--color-dark-14);
179
+ }
180
+
181
+ button:focus-visible {
182
+ outline: var(--outline-width) solid var(--color-primary-base);
183
+ outline-offset: 2px;
184
+ }
185
+ `
186
+ ];
187
+ }
188
+ /** Moves focus to the button. */
189
+ focus(r) {
190
+ this.shadowRoot?.querySelector("button")?.focus(r);
191
+ }
192
+ blur() {
193
+ this.shadowRoot?.querySelector("button")?.blur();
194
+ }
195
+ get hasLabelText() {
196
+ return this.textContent !== null && this.textContent.trim().length > 0;
197
+ }
198
+ /**
199
+ * A button inside a shadow root is invisible to the enclosing form, so
200
+ * `type="submit"` would do nothing. Click a throwaway native button instead:
201
+ * that runs constraint validation, fires a real `submit` event, and carries
202
+ * `name`/`value` into the submission the way an author expects.
203
+ */
204
+ submitEnclosingForm() {
205
+ const r = this.closest("form");
206
+ if (!r) return;
207
+ const o = document.createElement("button");
208
+ o.type = this.type, o.hidden = !0, this.name && (o.name = this.name), this.value && (o.value = this.value), r.append(o), o.click(), o.remove();
209
+ }
210
+ onClick(r) {
211
+ if (this.disabled) {
212
+ r.preventDefault(), r.stopPropagation();
213
+ return;
214
+ }
215
+ this.type !== "button" && this.submitEnclosingForm();
216
+ }
217
+ render() {
218
+ const r = !!this.icon && !this.hasLabelText, o = this.icon ? d`<kt-icon part="icon" name=${this.icon} size=${p[this.size]}></kt-icon>` : i;
219
+ return d`<button
220
+ part="button"
221
+ class=${v({
222
+ [this.variant]: !0,
223
+ [this.size]: !0,
224
+ "icon-only": r
225
+ })}
226
+ type=${this.type}
227
+ ?disabled=${this.disabled}
228
+ aria-label=${this.label || i}
229
+ @click=${this.onClick}
230
+ >
231
+ ${this.iconPosition === "left" ? o : i}
232
+ <slot></slot>
233
+ ${this.iconPosition === "right" ? o : i}
234
+ </button>`;
235
+ }
236
+ }
237
+ e([
238
+ a({ type: String, reflect: !0 })
239
+ ], t.prototype, "variant");
240
+ e([
241
+ a({ type: String, reflect: !0 })
242
+ ], t.prototype, "size");
243
+ e([
244
+ a({ type: Boolean, reflect: !0 })
245
+ ], t.prototype, "disabled");
246
+ e([
247
+ a({ type: String })
248
+ ], t.prototype, "type");
249
+ e([
250
+ a({ type: String })
251
+ ], t.prototype, "icon");
252
+ e([
253
+ a({ type: String, attribute: "icon-position" })
254
+ ], t.prototype, "iconPosition");
255
+ e([
256
+ a({ type: String })
257
+ ], t.prototype, "label");
258
+ e([
259
+ a({ type: Boolean, reflect: !0, attribute: "full-width" })
260
+ ], t.prototype, "fullWidth");
261
+ e([
262
+ a({ type: String })
263
+ ], t.prototype, "name");
264
+ e([
265
+ a({ type: String })
266
+ ], t.prototype, "value");
267
+ b("kt-button", t);
268
+ export {
269
+ t as KtButton
270
+ };
271
+ //# sourceMappingURL=kt-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kt-button.js","sources":["../../../../src/components/core/kt-button/kt-button.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 '../kt-icon/kt-icon.js';\n\nexport type KtButtonVariant =\n | 'primary'\n | 'secondary'\n | 'secondary-no-bg'\n | 'dark'\n | 'danger'\n | 'delete'\n | 'warning'\n | 'info'\n | 'success'\n | 'text';\n\nexport type KtButtonSize = 'small' | 'medium' | 'large';\nexport type KtButtonType = 'button' | 'submit' | 'reset';\n\n/** Icon size per button size, so the glyph stays optically balanced. */\nconst ICON_SIZE: Record<KtButtonSize, number> = { small: 16, medium: 20, large: 24 };\n\n/**\n * The Kanto action button.\n *\n * Ten variants; `primary` for the one action a screen is about, `secondary`\n * (a soft indigo tint) for everything supporting it. The semantic variants —\n * `danger`, `warning`, `info`, `success` — are tinted fills with coloured\n * text; `delete` is the only solid red, reserved for irreversible actions.\n *\n * Setting `icon` with no slotted text produces a square icon-only button,\n * which then requires a `label`.\n *\n * @element kt-button\n *\n * @slot - The button label.\n *\n * @csspart button - The native `<button>`.\n * @csspart icon - The icon, when `icon` is set.\n *\n * @example\n * ```html\n * <kt-button icon=\"plus\">New entity</kt-button>\n * <kt-button variant=\"secondary\" icon=\"refresh-cw\">Refresh</kt-button>\n * <kt-button variant=\"danger\">Delete</kt-button>\n * ```\n */\nexport class KtButton extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-flex;\n vertical-align: middle;\n }\n\n :host([full-width]) {\n display: flex;\n width: 100%;\n }\n\n button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: var(--button-height);\n padding: 0 var(--button-padding-x);\n gap: var(--gap-button);\n border: none;\n border-radius: var(--border-radius);\n font: var(--font-normal-regular);\n cursor: pointer;\n transition:\n background-color var(--duration-instant),\n color var(--duration-instant);\n }\n\n /* === SIZES === */\n .small {\n height: var(--button-height-small);\n padding: 0 8px;\n font: var(--font-normal-small);\n }\n\n .large {\n height: var(--button-height-large);\n padding: 0 calc(var(--button-padding-x) + 8px);\n font: var(--font-normal-medium);\n }\n\n /* === VARIANTS ===\n Press returns to the base colour; Kanto has no scale or shrink. */\n .primary {\n color: var(--color-white);\n background-color: var(--color-primary-base);\n }\n .primary:hover {\n background-color: var(--color-primary-hover);\n }\n .primary:active {\n background-color: var(--color-primary-base);\n }\n\n .secondary {\n color: var(--color-primary-base);\n background-color: var(--color-primary-soft);\n }\n .secondary:hover {\n background-color: var(--color-secondary-hover);\n }\n .secondary:active {\n background-color: var(--color-primary-soft);\n }\n\n .secondary-no-bg {\n color: var(--color-primary-base);\n background: none;\n }\n .secondary-no-bg:hover {\n background-color: var(--color-secondary-hover);\n }\n .secondary-no-bg:active {\n background-color: var(--color-dark-14);\n }\n\n .dark {\n color: var(--color-text-400);\n background-color: var(--color-dark-20);\n }\n .dark:hover {\n background-color: var(--color-dark-22);\n }\n .dark:active {\n background-color: var(--color-dark-20);\n }\n\n .danger {\n color: var(--color-danger-base);\n background-color: var(--color-danger-soft);\n }\n .danger:hover {\n background-color: var(--color-danger-hover);\n }\n .danger:active {\n background-color: var(--color-danger-soft);\n }\n\n .delete {\n color: var(--color-white);\n background-color: var(--color-navigation-icon-close);\n }\n .delete:hover {\n background-color: var(--color-danger-base);\n }\n\n .warning {\n color: var(--color-warning-base);\n background-color: var(--color-warning-soft);\n }\n .warning:hover {\n background-color: var(--color-warning-hover);\n }\n\n .info {\n color: var(--color-info-base);\n background-color: var(--color-info-soft);\n }\n .info:hover {\n background-color: var(--color-info-hover);\n }\n\n .success {\n color: var(--color-success-base);\n background-color: var(--color-success-soft);\n }\n .success:hover {\n background-color: var(--color-success-hover);\n }\n\n .text {\n height: auto;\n padding: 0;\n color: var(--color-primary-base);\n background: none;\n }\n .text:active {\n background-color: var(--color-dark-14);\n }\n\n /* === ICON-ONLY === */\n .icon-only {\n width: var(--button-height);\n padding: 0;\n }\n .icon-only.small {\n width: var(--button-height-small);\n }\n .icon-only.large {\n width: var(--button-height-large);\n }\n\n /* === DISABLED === */\n button:disabled {\n color: var(--text-disabled);\n background-color: var(--color-dark-14);\n cursor: not-allowed;\n }\n button:disabled:hover {\n background-color: var(--color-dark-14);\n }\n\n button:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n `,\n ];\n\n /** Visual variant. */\n @property({ type: String, reflect: true })\n variant: KtButtonVariant = 'primary';\n\n /** Height: 32 / 40 / 48px at the desktop scale. */\n @property({ type: String, reflect: true })\n size: KtButtonSize = 'medium';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Native button behaviour. `submit` and `reset` act on the enclosing form. */\n @property({ type: String })\n type: KtButtonType = 'button';\n\n /** Lucide icon name, kebab-case. */\n @property({ type: String })\n icon = '';\n\n /** Which side of the label the icon sits on. */\n @property({ type: String, attribute: 'icon-position' })\n iconPosition: 'left' | 'right' = 'left';\n\n /** Accessible name. Required for an icon-only button. */\n @property({ type: String })\n label = '';\n\n /** Stretches the button to the width of its container. */\n @property({ type: Boolean, reflect: true, attribute: 'full-width' })\n fullWidth = false;\n\n /** Submitted with the form, as on a native button. */\n @property({ type: String })\n name = '';\n\n /** @see name */\n @property({ type: String })\n value = '';\n\n /** Moves focus to the button. */\n override focus(options?: FocusOptions): void {\n this.shadowRoot?.querySelector('button')?.focus(options);\n }\n\n override blur(): void {\n this.shadowRoot?.querySelector('button')?.blur();\n }\n\n private get hasLabelText(): boolean {\n return this.textContent !== null && this.textContent.trim().length > 0;\n }\n\n /**\n * A button inside a shadow root is invisible to the enclosing form, so\n * `type=\"submit\"` would do nothing. Click a throwaway native button instead:\n * that runs constraint validation, fires a real `submit` event, and carries\n * `name`/`value` into the submission the way an author expects.\n */\n private submitEnclosingForm(): void {\n const form = this.closest('form');\n if (!form) return;\n\n const proxy = document.createElement('button');\n proxy.type = this.type;\n proxy.hidden = true;\n if (this.name) proxy.name = this.name;\n if (this.value) proxy.value = this.value;\n\n form.append(proxy);\n proxy.click();\n proxy.remove();\n }\n\n private onClick(event: MouseEvent): void {\n if (this.disabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n if (this.type !== 'button') this.submitEnclosingForm();\n }\n\n override render(): TemplateResult {\n const iconOnly = Boolean(this.icon) && !this.hasLabelText;\n const icon = this.icon\n ? html`<kt-icon part=\"icon\" name=${this.icon} size=${ICON_SIZE[this.size]}></kt-icon>`\n : nothing;\n\n return html`<button\n part=\"button\"\n class=${classMap({\n [this.variant]: true,\n [this.size]: true,\n 'icon-only': iconOnly,\n })}\n type=${this.type}\n ?disabled=${this.disabled}\n aria-label=${this.label || nothing}\n @click=${this.onClick}\n >\n ${this.iconPosition === 'left' ? icon : nothing}\n <slot></slot>\n ${this.iconPosition === 'right' ? icon : nothing}\n </button>`;\n }\n}\n\ndefineElement('kt-button', KtButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-button': KtButton;\n }\n}\n"],"names":["ICON_SIZE","KtButton","KtElement","css","options","form","proxy","event","iconOnly","icon","html","nothing","classMap","__decorateClass","property","defineElement"],"mappings":"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"}