kanto-ds 1.2.0 → 1.4.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.
- package/README.md +24 -6
- package/dist/chunks/{defaults-DKzFsNbv.js → defaults-BwgjMcww.js} +27 -26
- package/dist/chunks/{defaults-DKzFsNbv.js.map → defaults-BwgjMcww.js.map} +1 -1
- package/dist/chunks/index-DSSLJirw.js +79 -0
- package/dist/chunks/index-DSSLJirw.js.map +1 -0
- package/dist/chunks/kt-element-E-tfJpGQ.js +52 -0
- package/dist/chunks/kt-element-E-tfJpGQ.js.map +1 -0
- package/dist/components/core/kt-avatar/kt-avatar.js +8 -7
- package/dist/components/core/kt-avatar/kt-avatar.js.map +1 -1
- package/dist/components/core/kt-badge/kt-badge.js +7 -6
- package/dist/components/core/kt-badge/kt-badge.js.map +1 -1
- package/dist/components/core/kt-button/kt-button.js +1 -1
- package/dist/components/core/kt-card/kt-card.js +1 -1
- package/dist/components/core/kt-code/kt-code.js +31 -30
- package/dist/components/core/kt-code/kt-code.js.map +1 -1
- package/dist/components/core/kt-icon/kt-icon.js +2 -2
- package/dist/components/core/kt-kbd/kt-kbd.js +1 -1
- package/dist/components/core/kt-split-button/kt-split-button.d.ts +2 -2
- package/dist/components/core/kt-split-button/kt-split-button.js +27 -26
- package/dist/components/core/kt-split-button/kt-split-button.js.map +1 -1
- package/dist/components/data/kt-chart/kt-chart.d.ts +2 -2
- package/dist/components/data/kt-chart/kt-chart.js +222 -221
- package/dist/components/data/kt-chart/kt-chart.js.map +1 -1
- package/dist/components/data/kt-meter/kt-meter.js +1 -1
- package/dist/components/data/kt-pagination/kt-pagination.d.ts +1 -1
- package/dist/components/data/kt-pagination/kt-pagination.js +29 -28
- package/dist/components/data/kt-pagination/kt-pagination.js.map +1 -1
- package/dist/components/data/kt-stat/kt-stat.js +1 -1
- package/dist/components/data/kt-table/kt-table.d.ts +2 -2
- package/dist/components/data/kt-table/kt-table.js +30 -29
- package/dist/components/data/kt-table/kt-table.js.map +1 -1
- package/dist/components/data/kt-timeline/kt-timeline.js +1 -1
- package/dist/components/feedback/kt-alert/kt-alert.js +17 -16
- package/dist/components/feedback/kt-alert/kt-alert.js.map +1 -1
- package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
- package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +1 -1
- package/dist/components/feedback/kt-skeleton/kt-skeleton.js +1 -1
- package/dist/components/feedback/kt-toast/kt-toast.js +25 -19
- package/dist/components/feedback/kt-toast/kt-toast.js.map +1 -1
- package/dist/components/feedback/kt-toast-container/kt-toast-container.js +1 -1
- package/dist/components/feedback/kt-tooltip/kt-tooltip.js +1 -1
- package/dist/components/forms/kt-checkbox/kt-checkbox.d.ts +66 -0
- package/dist/components/forms/kt-checkbox/kt-checkbox.js +198 -0
- package/dist/components/forms/kt-checkbox/kt-checkbox.js.map +1 -0
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.d.ts +2 -2
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +60 -57
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.js.map +1 -1
- package/dist/components/forms/kt-form/kt-form.js +11 -10
- package/dist/components/forms/kt-form/kt-form.js.map +1 -1
- package/dist/components/forms/kt-input/kt-input.js +56 -55
- package/dist/components/forms/kt-input/kt-input.js.map +1 -1
- package/dist/components/forms/kt-input-menu/kt-input-menu.d.ts +1 -1
- package/dist/components/forms/kt-input-menu/kt-input-menu.js +57 -56
- package/dist/components/forms/kt-input-menu/kt-input-menu.js.map +1 -1
- package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
- package/dist/components/forms/kt-radio-group/kt-radio-group.d.ts +103 -0
- package/dist/components/forms/kt-radio-group/kt-radio-group.js +265 -0
- package/dist/components/forms/kt-radio-group/kt-radio-group.js.map +1 -0
- package/dist/components/forms/kt-select/kt-select.d.ts +2 -2
- package/dist/components/forms/kt-select/kt-select.js +62 -61
- package/dist/components/forms/kt-select/kt-select.js.map +1 -1
- package/dist/components/forms/kt-textarea/kt-textarea.js +9 -8
- package/dist/components/forms/kt-textarea/kt-textarea.js.map +1 -1
- package/dist/components/forms/kt-toggle/kt-toggle.js +1 -1
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.d.ts +1 -1
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +6 -5
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js.map +1 -1
- package/dist/components/navigation/kt-header/kt-header.js +11 -10
- package/dist/components/navigation/kt-header/kt-header.js.map +1 -1
- package/dist/components/navigation/kt-page-header/kt-page-header.js +1 -1
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +44 -43
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -1
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.d.ts +1 -1
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +6 -5
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js.map +1 -1
- package/dist/components/navigation/kt-tabs/kt-tabs.js +1 -1
- package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +1 -1
- package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +12 -6
- package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js.map +1 -1
- package/dist/components/overlays/kt-collapsible/kt-collapsible.js +1 -1
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.d.ts +3 -3
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +30 -27
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js.map +1 -1
- package/dist/components/overlays/kt-dropdown/kt-dropdown.d.ts +1 -1
- package/dist/components/overlays/kt-dropdown/kt-dropdown.js +8 -7
- package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -1
- package/dist/components/overlays/kt-modal/kt-modal.js +5 -4
- package/dist/components/overlays/kt-modal/kt-modal.js.map +1 -1
- package/dist/components/overlays/kt-side-panel/kt-side-panel.d.ts +1 -1
- package/dist/components/overlays/kt-side-panel/kt-side-panel.js +24 -23
- package/dist/components/overlays/kt-side-panel/kt-side-panel.js.map +1 -1
- package/dist/custom-elements.json +1870 -1071
- package/dist/icons/defaults.d.ts +1 -0
- package/dist/icons/index.js +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +93 -83
- package/dist/index.js.map +1 -1
- package/dist/internal/kt-element.d.ts +6 -1
- package/dist/internal/strings.d.ts +103 -0
- package/dist/react/index.d.ts +13 -0
- package/dist/react/index.js +176 -157
- package/dist/react/index.js.map +1 -1
- package/dist/react/jsx.d.ts +12 -1
- package/dist/strings/index.d.ts +11 -0
- package/dist/strings/index.js +8 -0
- package/dist/strings/index.js.map +1 -0
- package/dist/tokens/base.css +56 -0
- package/dist/vscode.css-custom-data.json +12 -0
- package/dist/vscode.html-custom-data.json +85 -0
- package/dist/vue/index.d.ts +6 -0
- package/dist/vue/index.js +9 -7
- package/dist/vue/index.js.map +1 -1
- package/dist/web-types.json +263 -39
- package/package.json +19 -3
- package/dist/chunks/kt-element-B_jjQDhg.js +0 -38
- package/dist/chunks/kt-element-B_jjQDhg.js.map +0 -1
|
@@ -1,28 +1,29 @@
|
|
|
1
|
-
import { css as
|
|
2
|
-
import { state as
|
|
3
|
-
import { K as
|
|
4
|
-
import { e as
|
|
1
|
+
import { css as u, nothing as n, html as a } from "lit";
|
|
2
|
+
import { state as v, property as e } from "lit/decorators.js";
|
|
3
|
+
import { K as p, d as m } from "../../../chunks/kt-element-E-tfJpGQ.js";
|
|
4
|
+
import { e as f } from "../../../chunks/events-Bjl5Zmmq.js";
|
|
5
|
+
import { s as h } from "../../../chunks/index-DSSLJirw.js";
|
|
5
6
|
import "../../core/kt-icon/kt-icon.js";
|
|
6
7
|
import "../kt-progress-bar/kt-progress-bar.js";
|
|
7
|
-
var
|
|
8
|
+
var b = Object.defineProperty, i = (c, o, s, x) => {
|
|
8
9
|
for (var r = void 0, d = c.length - 1, l; d >= 0; d--)
|
|
9
10
|
(l = c[d]) && (r = l(o, s, r) || r);
|
|
10
|
-
return r &&
|
|
11
|
+
return r && b(o, s, r), r;
|
|
11
12
|
};
|
|
12
|
-
const
|
|
13
|
+
const w = {
|
|
13
14
|
success: { icon: "circle-check", progress: "success" },
|
|
14
15
|
information: { icon: "info", progress: "info" },
|
|
15
16
|
warning: { icon: "triangle-alert", progress: "warning" },
|
|
16
17
|
error: { icon: "circle-alert", progress: "danger" }
|
|
17
|
-
},
|
|
18
|
-
class t extends
|
|
18
|
+
}, g = 50;
|
|
19
|
+
class t extends p {
|
|
19
20
|
constructor() {
|
|
20
21
|
super(...arguments), this.remaining = 0, this.variant = "information", this.heading = "", this.description = "", this.dismissible = !1, this.duration = 0;
|
|
21
22
|
}
|
|
22
23
|
static {
|
|
23
24
|
this.styles = [
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
p.styles,
|
|
26
|
+
u`
|
|
26
27
|
:host {
|
|
27
28
|
display: block;
|
|
28
29
|
}
|
|
@@ -155,8 +156,8 @@ class t extends h {
|
|
|
155
156
|
/** Runs the countdown from whatever `remaining` currently is. */
|
|
156
157
|
tick() {
|
|
157
158
|
this.timer = setInterval(() => {
|
|
158
|
-
this.remaining -=
|
|
159
|
-
},
|
|
159
|
+
this.remaining -= g, !(this.remaining > 0) && (this.stopCountdown(), this.close());
|
|
160
|
+
}, g);
|
|
160
161
|
}
|
|
161
162
|
stopCountdown() {
|
|
162
163
|
this.timer !== void 0 && clearInterval(this.timer), this.timer = void 0;
|
|
@@ -171,10 +172,10 @@ class t extends h {
|
|
|
171
172
|
}
|
|
172
173
|
/** Asks to be removed. The container is what actually removes it. */
|
|
173
174
|
close() {
|
|
174
|
-
this.stopCountdown(),
|
|
175
|
+
this.stopCountdown(), f(this, "kt-toast-close");
|
|
175
176
|
}
|
|
176
177
|
render() {
|
|
177
|
-
const o =
|
|
178
|
+
const o = w[this.variant], s = this.duration > 0;
|
|
178
179
|
return a`<div
|
|
179
180
|
part="base"
|
|
180
181
|
class="toast"
|
|
@@ -189,7 +190,12 @@ class t extends h {
|
|
|
189
190
|
</div>
|
|
190
191
|
</div>
|
|
191
192
|
|
|
192
|
-
${this.dismissible ? a`<button
|
|
193
|
+
${this.dismissible ? a`<button
|
|
194
|
+
part="close"
|
|
195
|
+
class="close"
|
|
196
|
+
aria-label=${h().close}
|
|
197
|
+
@click=${this.close}
|
|
198
|
+
>
|
|
193
199
|
<kt-icon name="x" size="18"></kt-icon>
|
|
194
200
|
</button>` : n}
|
|
195
201
|
${s ? a`<div class="countdown">
|
|
@@ -200,14 +206,14 @@ class t extends h {
|
|
|
200
206
|
animated
|
|
201
207
|
.value=${this.remaining}
|
|
202
208
|
.max=${this.duration}
|
|
203
|
-
label
|
|
209
|
+
label=${h().timeRemaining}
|
|
204
210
|
></kt-progress-bar>
|
|
205
211
|
</div>` : n}
|
|
206
212
|
</div>`;
|
|
207
213
|
}
|
|
208
214
|
}
|
|
209
215
|
i([
|
|
210
|
-
|
|
216
|
+
v()
|
|
211
217
|
], t.prototype, "remaining");
|
|
212
218
|
i([
|
|
213
219
|
e({ type: String, reflect: !0 })
|
|
@@ -224,7 +230,7 @@ i([
|
|
|
224
230
|
i([
|
|
225
231
|
e({ type: Number })
|
|
226
232
|
], t.prototype, "duration");
|
|
227
|
-
|
|
233
|
+
m("kt-toast", t);
|
|
228
234
|
export {
|
|
229
235
|
t as KtToast
|
|
230
236
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kt-toast.js","sources":["../../../../src/components/feedback/kt-toast/kt-toast.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport '../../core/kt-icon/kt-icon.js';\nimport '../kt-progress-bar/kt-progress-bar.js';\n\nexport type KtToastVariant = 'success' | 'information' | 'warning' | 'error';\n\ninterface VariantMeta {\n readonly icon: string;\n readonly progress: 'success' | 'info' | 'warning' | 'danger';\n}\n\nconst META: Record<KtToastVariant, VariantMeta> = {\n success: { icon: 'circle-check', progress: 'success' },\n information: { icon: 'info', progress: 'info' },\n warning: { icon: 'triangle-alert', progress: 'warning' },\n error: { icon: 'circle-alert', progress: 'danger' },\n};\n\n/** Countdown refresh interval. 50ms is smooth without being a busy loop. */\nconst TICK_MS = 50;\n\n/**\n * A transient notification.\n *\n * The only element in Kanto with a real shadow, and the only one that blurs\n * what is behind it: a toast floats above the page, so it has to say so.\n *\n * @element kt-toast\n *\n * @csspart base - The toast surface.\n * @csspart close - The dismiss button.\n *\n * @fires kt-toast-close - The toast asked to be removed, by timeout or by the\n * dismiss button. `<kt-toast-container>` listens for this.\n */\nexport class KtToast extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .toast {\n position: relative;\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--gap-form);\n max-width: 480px;\n padding: var(--padding-form);\n overflow: hidden;\n color: var(--text-body);\n background: var(--surface-card);\n border: var(--border-width) solid rgba(255, 255, 255, 0.1);\n border-radius: var(--border-radius);\n box-shadow: var(--shadow-toast);\n backdrop-filter: blur(10px);\n }\n\n /* A wash of the variant's hue over the card surface, rather than a\n solid fill: the text stays on a neutral background and keeps its\n contrast. */\n :host([variant='success']) .toast {\n background:\n linear-gradient(135deg, rgba(53, 221, 131, 0.25), rgba(53, 221, 131, 0.15)),\n var(--surface-card);\n }\n :host([variant='information']) .toast {\n background:\n linear-gradient(135deg, rgba(53, 175, 243, 0.25), rgba(53, 175, 243, 0.15)),\n var(--surface-card);\n }\n :host([variant='warning']) .toast {\n background:\n linear-gradient(135deg, rgba(245, 171, 61, 0.25), rgba(245, 171, 61, 0.15)),\n var(--surface-card);\n }\n :host([variant='error']) .toast {\n background:\n linear-gradient(135deg, rgba(245, 61, 92, 0.25), rgba(245, 61, 92, 0.15)),\n var(--surface-card);\n }\n\n :host([variant='success']) .heading {\n color: var(--color-success-text);\n }\n :host([variant='information']) .heading {\n color: var(--color-info-text);\n }\n :host([variant='warning']) .heading {\n color: var(--color-warning-text);\n }\n :host([variant='error']) .heading {\n color: var(--color-danger-text);\n }\n\n :host([variant='success']) .icon {\n color: var(--color-success-text);\n }\n :host([variant='information']) .icon {\n color: var(--color-info-text);\n }\n :host([variant='warning']) .icon {\n color: var(--color-warning-text);\n }\n :host([variant='error']) .icon {\n color: var(--color-danger-text);\n }\n\n .body {\n display: flex;\n align-items: center;\n gap: var(--gap-form);\n }\n\n .icon {\n display: flex;\n align-items: center;\n }\n\n .content {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--gap-element);\n }\n\n .heading {\n font: var(--font-normal-medium);\n }\n\n .description {\n font: var(--font-normal-regular);\n }\n\n .close {\n display: flex;\n align-items: center;\n padding: 4px;\n color: currentcolor;\n background: transparent;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n }\n .close:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n\n .countdown {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n }\n `,\n ];\n\n private timer: ReturnType<typeof setInterval> | undefined;\n\n @state()\n private remaining = 0;\n\n @property({ type: String, reflect: true })\n variant: KtToastVariant = 'information';\n\n /**\n * The toast's title.\n *\n * Named `heading` because every element already has a `title`, and shadowing\n * it would turn the toast into its own tooltip.\n */\n @property({ type: String })\n heading = '';\n\n @property({ type: String })\n description = '';\n\n @property({ type: Boolean })\n dismissible = false;\n\n /**\n * Auto-dismiss after this many milliseconds, with a countdown bar. Zero\n * keeps the toast until something removes it.\n */\n @property({ type: Number })\n duration = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.startCountdown();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.stopCountdown();\n }\n\n private startCountdown(): void {\n this.stopCountdown();\n if (this.duration <= 0) return;\n\n this.remaining = this.duration;\n this.tick();\n }\n\n /** Runs the countdown from whatever `remaining` currently is. */\n private tick(): void {\n this.timer = setInterval(() => {\n this.remaining -= TICK_MS;\n if (this.remaining > 0) return;\n\n this.stopCountdown();\n this.close();\n }, TICK_MS);\n }\n\n private stopCountdown(): void {\n if (this.timer !== undefined) clearInterval(this.timer);\n this.timer = undefined;\n }\n\n /** Pauses the countdown. The container calls this while the pointer is over the stack. */\n pause(): void {\n if (this.timer !== undefined) this.stopCountdown();\n }\n\n /** Resumes a paused countdown from where it stopped. */\n resume(): void {\n if (this.duration <= 0 || this.timer !== undefined || this.remaining <= 0) return;\n this.tick();\n }\n\n /** Asks to be removed. The container is what actually removes it. */\n close(): void {\n this.stopCountdown();\n emit(this, 'kt-toast-close');\n }\n\n override render(): TemplateResult {\n const meta = META[this.variant];\n const showCountdown = this.duration > 0;\n\n return html`<div\n part=\"base\"\n class=\"toast\"\n role=${this.variant === 'error' ? 'alert' : 'status'}\n aria-live=${this.variant === 'error' ? 'assertive' : 'polite'}\n >\n <div class=\"body\">\n <span class=\"icon\"><kt-icon name=${meta.icon} size=\"24\"></kt-icon></span>\n <div class=\"content\">\n ${this.heading ? html`<div class=\"heading\">${this.heading}</div>` : nothing}\n ${this.description ? html`<div class=\"description\">${this.description}</div>` : nothing}\n </div>\n </div>\n\n ${\n this.dismissible\n ? html`<button part=\"close\" class=\"close\" aria-label=\"Close\" @click=${this.close}>\n <kt-icon name=\"x\" size=\"18\"></kt-icon>\n </button>`\n : nothing\n }\n ${\n showCountdown\n ? html`<div class=\"countdown\">\n <kt-progress-bar\n size=\"small\"\n variant=${meta.progress}\n striped\n animated\n .value=${this.remaining}\n .max=${this.duration}\n label=\"Time remaining\"\n ></kt-progress-bar>\n </div>`\n : nothing\n }\n </div>`;\n }\n}\n\ndefineElement('kt-toast', KtToast);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-toast': KtToast;\n }\n}\n"],"names":["META","TICK_MS","KtToast","KtElement","css","emit","meta","showCountdown","html","nothing","__decorateClass","state","property","defineElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kt-toast.js","sources":["../../../../src/components/feedback/kt-toast/kt-toast.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { strings } from '#internal/strings';\nimport '../../core/kt-icon/kt-icon.js';\nimport '../kt-progress-bar/kt-progress-bar.js';\n\nexport type KtToastVariant = 'success' | 'information' | 'warning' | 'error';\n\ninterface VariantMeta {\n readonly icon: string;\n readonly progress: 'success' | 'info' | 'warning' | 'danger';\n}\n\nconst META: Record<KtToastVariant, VariantMeta> = {\n success: { icon: 'circle-check', progress: 'success' },\n information: { icon: 'info', progress: 'info' },\n warning: { icon: 'triangle-alert', progress: 'warning' },\n error: { icon: 'circle-alert', progress: 'danger' },\n};\n\n/** Countdown refresh interval. 50ms is smooth without being a busy loop. */\nconst TICK_MS = 50;\n\n/**\n * A transient notification.\n *\n * The only element in Kanto with a real shadow, and the only one that blurs\n * what is behind it: a toast floats above the page, so it has to say so.\n *\n * @element kt-toast\n *\n * @csspart base - The toast surface.\n * @csspart close - The dismiss button.\n *\n * @fires kt-toast-close - The toast asked to be removed, by timeout or by the\n * dismiss button. `<kt-toast-container>` listens for this.\n */\nexport class KtToast extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .toast {\n position: relative;\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--gap-form);\n max-width: 480px;\n padding: var(--padding-form);\n overflow: hidden;\n color: var(--text-body);\n background: var(--surface-card);\n border: var(--border-width) solid rgba(255, 255, 255, 0.1);\n border-radius: var(--border-radius);\n box-shadow: var(--shadow-toast);\n backdrop-filter: blur(10px);\n }\n\n /* A wash of the variant's hue over the card surface, rather than a\n solid fill: the text stays on a neutral background and keeps its\n contrast. */\n :host([variant='success']) .toast {\n background:\n linear-gradient(135deg, rgba(53, 221, 131, 0.25), rgba(53, 221, 131, 0.15)),\n var(--surface-card);\n }\n :host([variant='information']) .toast {\n background:\n linear-gradient(135deg, rgba(53, 175, 243, 0.25), rgba(53, 175, 243, 0.15)),\n var(--surface-card);\n }\n :host([variant='warning']) .toast {\n background:\n linear-gradient(135deg, rgba(245, 171, 61, 0.25), rgba(245, 171, 61, 0.15)),\n var(--surface-card);\n }\n :host([variant='error']) .toast {\n background:\n linear-gradient(135deg, rgba(245, 61, 92, 0.25), rgba(245, 61, 92, 0.15)),\n var(--surface-card);\n }\n\n :host([variant='success']) .heading {\n color: var(--color-success-text);\n }\n :host([variant='information']) .heading {\n color: var(--color-info-text);\n }\n :host([variant='warning']) .heading {\n color: var(--color-warning-text);\n }\n :host([variant='error']) .heading {\n color: var(--color-danger-text);\n }\n\n :host([variant='success']) .icon {\n color: var(--color-success-text);\n }\n :host([variant='information']) .icon {\n color: var(--color-info-text);\n }\n :host([variant='warning']) .icon {\n color: var(--color-warning-text);\n }\n :host([variant='error']) .icon {\n color: var(--color-danger-text);\n }\n\n .body {\n display: flex;\n align-items: center;\n gap: var(--gap-form);\n }\n\n .icon {\n display: flex;\n align-items: center;\n }\n\n .content {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--gap-element);\n }\n\n .heading {\n font: var(--font-normal-medium);\n }\n\n .description {\n font: var(--font-normal-regular);\n }\n\n .close {\n display: flex;\n align-items: center;\n padding: 4px;\n color: currentcolor;\n background: transparent;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n }\n .close:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n\n .countdown {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n }\n `,\n ];\n\n private timer: ReturnType<typeof setInterval> | undefined;\n\n @state()\n private remaining = 0;\n\n @property({ type: String, reflect: true })\n variant: KtToastVariant = 'information';\n\n /**\n * The toast's title.\n *\n * Named `heading` because every element already has a `title`, and shadowing\n * it would turn the toast into its own tooltip.\n */\n @property({ type: String })\n heading = '';\n\n @property({ type: String })\n description = '';\n\n @property({ type: Boolean })\n dismissible = false;\n\n /**\n * Auto-dismiss after this many milliseconds, with a countdown bar. Zero\n * keeps the toast until something removes it.\n */\n @property({ type: Number })\n duration = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.startCountdown();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.stopCountdown();\n }\n\n private startCountdown(): void {\n this.stopCountdown();\n if (this.duration <= 0) return;\n\n this.remaining = this.duration;\n this.tick();\n }\n\n /** Runs the countdown from whatever `remaining` currently is. */\n private tick(): void {\n this.timer = setInterval(() => {\n this.remaining -= TICK_MS;\n if (this.remaining > 0) return;\n\n this.stopCountdown();\n this.close();\n }, TICK_MS);\n }\n\n private stopCountdown(): void {\n if (this.timer !== undefined) clearInterval(this.timer);\n this.timer = undefined;\n }\n\n /** Pauses the countdown. The container calls this while the pointer is over the stack. */\n pause(): void {\n if (this.timer !== undefined) this.stopCountdown();\n }\n\n /** Resumes a paused countdown from where it stopped. */\n resume(): void {\n if (this.duration <= 0 || this.timer !== undefined || this.remaining <= 0) return;\n this.tick();\n }\n\n /** Asks to be removed. The container is what actually removes it. */\n close(): void {\n this.stopCountdown();\n emit(this, 'kt-toast-close');\n }\n\n override render(): TemplateResult {\n const meta = META[this.variant];\n const showCountdown = this.duration > 0;\n\n return html`<div\n part=\"base\"\n class=\"toast\"\n role=${this.variant === 'error' ? 'alert' : 'status'}\n aria-live=${this.variant === 'error' ? 'assertive' : 'polite'}\n >\n <div class=\"body\">\n <span class=\"icon\"><kt-icon name=${meta.icon} size=\"24\"></kt-icon></span>\n <div class=\"content\">\n ${this.heading ? html`<div class=\"heading\">${this.heading}</div>` : nothing}\n ${this.description ? html`<div class=\"description\">${this.description}</div>` : nothing}\n </div>\n </div>\n\n ${\n this.dismissible\n ? html`<button\n part=\"close\"\n class=\"close\"\n aria-label=${strings().close}\n @click=${this.close}\n >\n <kt-icon name=\"x\" size=\"18\"></kt-icon>\n </button>`\n : nothing\n }\n ${\n showCountdown\n ? html`<div class=\"countdown\">\n <kt-progress-bar\n size=\"small\"\n variant=${meta.progress}\n striped\n animated\n .value=${this.remaining}\n .max=${this.duration}\n label=${strings().timeRemaining}\n ></kt-progress-bar>\n </div>`\n : nothing\n }\n </div>`;\n }\n}\n\ndefineElement('kt-toast', KtToast);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-toast': KtToast;\n }\n}\n"],"names":["META","TICK_MS","KtToast","KtElement","css","emit","meta","showCountdown","html","nothing","strings","__decorateClass","state","property","defineElement"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { css as c, html as m } from "lit";
|
|
2
2
|
import { property as p } from "lit/decorators.js";
|
|
3
|
-
import { K as l, d } from "../../../chunks/kt-element-
|
|
3
|
+
import { K as l, d } from "../../../chunks/kt-element-E-tfJpGQ.js";
|
|
4
4
|
import "../kt-toast/kt-toast.js";
|
|
5
5
|
var f = Object.defineProperty, h = (i, t, e, n) => {
|
|
6
6
|
for (var s = void 0, o = i.length - 1, a; o >= 0; o--)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { css as h, html as l } from "lit";
|
|
2
2
|
import { state as c, property as n } from "lit/decorators.js";
|
|
3
3
|
import { classMap as v } from "lit/directives/class-map.js";
|
|
4
|
-
import { K as d, d as b } from "../../../chunks/kt-element-
|
|
4
|
+
import { K as d, d as b } from "../../../chunks/kt-element-E-tfJpGQ.js";
|
|
5
5
|
import { u as f } from "../../../chunks/events-Bjl5Zmmq.js";
|
|
6
6
|
var u = Object.defineProperty, s = (r, t, a, y) => {
|
|
7
7
|
for (var e = void 0, o = r.length - 1, p; o >= 0; o--)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
2
|
+
import { KtElement } from '#internal/kt-element';
|
|
3
|
+
import '../../core/kt-icon/kt-icon.js';
|
|
4
|
+
export type KtCheckboxSize = 'small' | 'medium' | 'large';
|
|
5
|
+
/**
|
|
6
|
+
* A checkbox: a choice that applies when the form is submitted.
|
|
7
|
+
*
|
|
8
|
+
* Built on a real `<input type="checkbox">`, laid invisibly over the drawn
|
|
9
|
+
* box, so the keyboard, the label click, the indeterminate state and what a
|
|
10
|
+
* screen reader announces all come from the platform rather than a
|
|
11
|
+
* reimplementation of it.
|
|
12
|
+
*
|
|
13
|
+
* For a setting that takes effect the moment it is flipped, use
|
|
14
|
+
* `<kt-toggle>`; for one choice among several, `<kt-radio-group>`.
|
|
15
|
+
*
|
|
16
|
+
* @element kt-checkbox
|
|
17
|
+
*
|
|
18
|
+
* @slot - The label, clickable.
|
|
19
|
+
*
|
|
20
|
+
* @csspart base - The `<label>` around box and text.
|
|
21
|
+
* @csspart input - The native checkbox.
|
|
22
|
+
* @csspart box - The drawn box.
|
|
23
|
+
*
|
|
24
|
+
* @fires kt-change - The box was checked or unchecked. `detail: { checked }`.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```html
|
|
28
|
+
* <kt-checkbox name="terms" required>I accept the terms</kt-checkbox>
|
|
29
|
+
* <kt-checkbox indeterminate>Select all</kt-checkbox>
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare class KtCheckbox extends KtElement {
|
|
33
|
+
static readonly formAssociated = true;
|
|
34
|
+
static styles: import("lit").CSSResultGroup[];
|
|
35
|
+
private input?;
|
|
36
|
+
private internals;
|
|
37
|
+
private defaultChecked;
|
|
38
|
+
checked: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Neither checked nor unchecked — for a "select all" over a partial
|
|
41
|
+
* selection. Cleared as soon as the user clicks, as on a native checkbox.
|
|
42
|
+
*/
|
|
43
|
+
indeterminate: boolean;
|
|
44
|
+
disabled: boolean;
|
|
45
|
+
required: boolean;
|
|
46
|
+
size: KtCheckboxSize;
|
|
47
|
+
name: string;
|
|
48
|
+
/** Submitted when checked, as for a native checkbox. */
|
|
49
|
+
value: string;
|
|
50
|
+
/** Accessible name, when nothing is slotted. */
|
|
51
|
+
label: string;
|
|
52
|
+
/** Error message. A non-empty value puts the box in its error state. */
|
|
53
|
+
error: string;
|
|
54
|
+
connectedCallback(): void;
|
|
55
|
+
willUpdate(changed: PropertyValues<this>): void;
|
|
56
|
+
formResetCallback(): void;
|
|
57
|
+
formStateRestoreCallback(state: string | null): void;
|
|
58
|
+
focus(options?: FocusOptions): void;
|
|
59
|
+
private onChange;
|
|
60
|
+
render(): TemplateResult;
|
|
61
|
+
}
|
|
62
|
+
declare global {
|
|
63
|
+
interface HTMLElementTagNameMap {
|
|
64
|
+
'kt-checkbox': KtCheckbox;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { css as p, nothing as a, html as c } from "lit";
|
|
2
|
+
import { query as u, property as i } from "lit/decorators.js";
|
|
3
|
+
import { live as b } from "lit/directives/live.js";
|
|
4
|
+
import { K as d, d as m } from "../../../chunks/kt-element-E-tfJpGQ.js";
|
|
5
|
+
import { e as f } from "../../../chunks/events-Bjl5Zmmq.js";
|
|
6
|
+
import { a as k, s as v, b as g } from "../../../chunks/form-control-CxjBTt1c.js";
|
|
7
|
+
import { s as y } from "../../../chunks/index-DSSLJirw.js";
|
|
8
|
+
import "../../core/kt-icon/kt-icon.js";
|
|
9
|
+
var x = Object.defineProperty, r = (l, e, o, C) => {
|
|
10
|
+
for (var s = void 0, n = l.length - 1, h; n >= 0; n--)
|
|
11
|
+
(h = l[n]) && (s = h(e, o, s) || s);
|
|
12
|
+
return s && x(e, o, s), s;
|
|
13
|
+
};
|
|
14
|
+
class t extends d {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments), this.internals = null, this.defaultChecked = !1, this.checked = !1, this.indeterminate = !1, this.disabled = !1, this.required = !1, this.size = "medium", this.name = "", this.value = "on", this.label = "", this.error = "";
|
|
17
|
+
}
|
|
18
|
+
static {
|
|
19
|
+
this.formAssociated = !0;
|
|
20
|
+
}
|
|
21
|
+
static {
|
|
22
|
+
this.styles = [
|
|
23
|
+
d.styles,
|
|
24
|
+
p`
|
|
25
|
+
:host {
|
|
26
|
+
display: inline-flex;
|
|
27
|
+
vertical-align: middle;
|
|
28
|
+
/* Sized off the button heights, like the toggle, so a checkbox lines
|
|
29
|
+
up with the fields and buttons beside it. */
|
|
30
|
+
--checkbox-size: calc(var(--button-height) * 0.45);
|
|
31
|
+
}
|
|
32
|
+
:host([size='small']) {
|
|
33
|
+
--checkbox-size: calc(var(--button-height-small) * 0.45);
|
|
34
|
+
}
|
|
35
|
+
:host([size='large']) {
|
|
36
|
+
--checkbox-size: calc(var(--button-height-large) * 0.45);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
label {
|
|
40
|
+
display: inline-flex;
|
|
41
|
+
align-items: flex-start;
|
|
42
|
+
gap: var(--gap-button);
|
|
43
|
+
color: var(--text-body);
|
|
44
|
+
font: var(--font-normal-regular);
|
|
45
|
+
cursor: pointer;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.control {
|
|
49
|
+
position: relative;
|
|
50
|
+
flex: none;
|
|
51
|
+
width: var(--checkbox-size);
|
|
52
|
+
height: var(--checkbox-size);
|
|
53
|
+
/* Centre the box on the first line of text, not the whole block. */
|
|
54
|
+
margin-top: calc((1lh - var(--checkbox-size)) / 2);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
input {
|
|
58
|
+
position: absolute;
|
|
59
|
+
inset: 0;
|
|
60
|
+
width: 100%;
|
|
61
|
+
height: 100%;
|
|
62
|
+
margin: 0;
|
|
63
|
+
opacity: 0;
|
|
64
|
+
cursor: inherit;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.box {
|
|
68
|
+
display: grid;
|
|
69
|
+
place-items: center;
|
|
70
|
+
width: 100%;
|
|
71
|
+
height: 100%;
|
|
72
|
+
color: var(--color-white);
|
|
73
|
+
background-color: var(--surface-field);
|
|
74
|
+
border: var(--border-width) solid var(--border-field);
|
|
75
|
+
border-radius: var(--radius-sub-menu);
|
|
76
|
+
transition:
|
|
77
|
+
background-color var(--duration-instant),
|
|
78
|
+
border-color var(--duration-instant);
|
|
79
|
+
pointer-events: none;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
label:hover .box {
|
|
83
|
+
border-color: var(--text-muted);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
input:focus-visible + .box {
|
|
87
|
+
outline: var(--outline-width) solid var(--color-primary-base);
|
|
88
|
+
outline-offset: 2px;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
input:checked + .box,
|
|
92
|
+
input:indeterminate + .box {
|
|
93
|
+
background-color: var(--color-primary-base);
|
|
94
|
+
border-color: var(--color-primary-base);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.error .box {
|
|
98
|
+
border-color: var(--color-danger-base);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
:host([disabled]) label {
|
|
102
|
+
color: var(--text-disabled);
|
|
103
|
+
cursor: not-allowed;
|
|
104
|
+
}
|
|
105
|
+
:host([disabled]) .box {
|
|
106
|
+
background-color: var(--color-dark-22);
|
|
107
|
+
border-color: var(--color-dark-24);
|
|
108
|
+
color: var(--text-disabled);
|
|
109
|
+
}
|
|
110
|
+
`
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
connectedCallback() {
|
|
114
|
+
super.connectedCallback(), this.internals ??= k(this), this.defaultChecked = this.checked;
|
|
115
|
+
}
|
|
116
|
+
willUpdate(e) {
|
|
117
|
+
if (e.has("checked") || e.has("value") || e.has("required") || e.has("error") || this.stringsChanged(e)) {
|
|
118
|
+
v(this.internals, this.checked ? this.value : null);
|
|
119
|
+
const o = this.required && !this.checked;
|
|
120
|
+
g(
|
|
121
|
+
this.internals,
|
|
122
|
+
{ valueMissing: o, customError: !!this.error },
|
|
123
|
+
this.error || (o ? y().checkRequired : "")
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
formResetCallback() {
|
|
128
|
+
this.checked = this.defaultChecked, this.indeterminate = !1;
|
|
129
|
+
}
|
|
130
|
+
formStateRestoreCallback(e) {
|
|
131
|
+
this.checked = e === this.value;
|
|
132
|
+
}
|
|
133
|
+
focus(e) {
|
|
134
|
+
this.input?.focus(e);
|
|
135
|
+
}
|
|
136
|
+
onChange(e) {
|
|
137
|
+
const o = e.target;
|
|
138
|
+
this.checked = o.checked, this.indeterminate = !1, f(this, "kt-change", { checked: this.checked });
|
|
139
|
+
}
|
|
140
|
+
render() {
|
|
141
|
+
const e = this.indeterminate ? "minus" : this.checked ? "check" : "";
|
|
142
|
+
return c`${this.error ? c`<span id="error-message" class="visually-hidden">${this.error}</span>` : a}<label part="base" class=${this.error ? "error" : ""}>
|
|
143
|
+
<span class="control">
|
|
144
|
+
<input
|
|
145
|
+
part="input"
|
|
146
|
+
type="checkbox"
|
|
147
|
+
.checked=${b(this.checked)}
|
|
148
|
+
.indeterminate=${this.indeterminate}
|
|
149
|
+
?disabled=${this.disabled}
|
|
150
|
+
?required=${this.required}
|
|
151
|
+
aria-label=${this.label || a}
|
|
152
|
+
aria-invalid=${this.error ? "true" : a}
|
|
153
|
+
aria-describedby=${this.error ? "error-message" : a}
|
|
154
|
+
@change=${this.onChange}
|
|
155
|
+
/>
|
|
156
|
+
<span part="box" class="box">
|
|
157
|
+
${e ? c`<kt-icon name=${e} size="14"></kt-icon>` : a}
|
|
158
|
+
</span>
|
|
159
|
+
</span>
|
|
160
|
+
<span class="text"><slot></slot></span>
|
|
161
|
+
</label>`;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
r([
|
|
165
|
+
u("input")
|
|
166
|
+
], t.prototype, "input");
|
|
167
|
+
r([
|
|
168
|
+
i({ type: Boolean, reflect: !0 })
|
|
169
|
+
], t.prototype, "checked");
|
|
170
|
+
r([
|
|
171
|
+
i({ type: Boolean, reflect: !0 })
|
|
172
|
+
], t.prototype, "indeterminate");
|
|
173
|
+
r([
|
|
174
|
+
i({ type: Boolean, reflect: !0 })
|
|
175
|
+
], t.prototype, "disabled");
|
|
176
|
+
r([
|
|
177
|
+
i({ type: Boolean, reflect: !0 })
|
|
178
|
+
], t.prototype, "required");
|
|
179
|
+
r([
|
|
180
|
+
i({ type: String, reflect: !0 })
|
|
181
|
+
], t.prototype, "size");
|
|
182
|
+
r([
|
|
183
|
+
i({ type: String })
|
|
184
|
+
], t.prototype, "name");
|
|
185
|
+
r([
|
|
186
|
+
i({ type: String })
|
|
187
|
+
], t.prototype, "value");
|
|
188
|
+
r([
|
|
189
|
+
i({ type: String })
|
|
190
|
+
], t.prototype, "label");
|
|
191
|
+
r([
|
|
192
|
+
i({ type: String, reflect: !0 })
|
|
193
|
+
], t.prototype, "error");
|
|
194
|
+
m("kt-checkbox", t);
|
|
195
|
+
export {
|
|
196
|
+
t as KtCheckbox
|
|
197
|
+
};
|
|
198
|
+
//# sourceMappingURL=kt-checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kt-checkbox.js","sources":["../../../../src/components/forms/kt-checkbox/kt-checkbox.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { live } from 'lit/directives/live.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from '#internal/form-control';\nimport { strings } from '#internal/strings';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport type KtCheckboxSize = 'small' | 'medium' | 'large';\n\n/**\n * A checkbox: a choice that applies when the form is submitted.\n *\n * Built on a real `<input type=\"checkbox\">`, laid invisibly over the drawn\n * box, so the keyboard, the label click, the indeterminate state and what a\n * screen reader announces all come from the platform rather than a\n * reimplementation of it.\n *\n * For a setting that takes effect the moment it is flipped, use\n * `<kt-toggle>`; for one choice among several, `<kt-radio-group>`.\n *\n * @element kt-checkbox\n *\n * @slot - The label, clickable.\n *\n * @csspart base - The `<label>` around box and text.\n * @csspart input - The native checkbox.\n * @csspart box - The drawn box.\n *\n * @fires kt-change - The box was checked or unchecked. `detail: { checked }`.\n *\n * @example\n * ```html\n * <kt-checkbox name=\"terms\" required>I accept the terms</kt-checkbox>\n * <kt-checkbox indeterminate>Select all</kt-checkbox>\n * ```\n */\nexport class KtCheckbox extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-flex;\n vertical-align: middle;\n /* Sized off the button heights, like the toggle, so a checkbox lines\n up with the fields and buttons beside it. */\n --checkbox-size: calc(var(--button-height) * 0.45);\n }\n :host([size='small']) {\n --checkbox-size: calc(var(--button-height-small) * 0.45);\n }\n :host([size='large']) {\n --checkbox-size: calc(var(--button-height-large) * 0.45);\n }\n\n label {\n display: inline-flex;\n align-items: flex-start;\n gap: var(--gap-button);\n color: var(--text-body);\n font: var(--font-normal-regular);\n cursor: pointer;\n }\n\n .control {\n position: relative;\n flex: none;\n width: var(--checkbox-size);\n height: var(--checkbox-size);\n /* Centre the box on the first line of text, not the whole block. */\n margin-top: calc((1lh - var(--checkbox-size)) / 2);\n }\n\n input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: inherit;\n }\n\n .box {\n display: grid;\n place-items: center;\n width: 100%;\n height: 100%;\n color: var(--color-white);\n background-color: var(--surface-field);\n border: var(--border-width) solid var(--border-field);\n border-radius: var(--radius-sub-menu);\n transition:\n background-color var(--duration-instant),\n border-color var(--duration-instant);\n pointer-events: none;\n }\n\n label:hover .box {\n border-color: var(--text-muted);\n }\n\n input:focus-visible + .box {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n input:checked + .box,\n input:indeterminate + .box {\n background-color: var(--color-primary-base);\n border-color: var(--color-primary-base);\n }\n\n .error .box {\n border-color: var(--color-danger-base);\n }\n\n :host([disabled]) label {\n color: var(--text-disabled);\n cursor: not-allowed;\n }\n :host([disabled]) .box {\n background-color: var(--color-dark-22);\n border-color: var(--color-dark-24);\n color: var(--text-disabled);\n }\n `,\n ];\n\n @query('input')\n private input?: HTMLInputElement;\n\n private internals: UsableInternals | null = null;\n private defaultChecked = false;\n\n @property({ type: Boolean, reflect: true })\n checked = false;\n\n /**\n * Neither checked nor unchecked — for a \"select all\" over a partial\n * selection. Cleared as soon as the user clicks, as on a native checkbox.\n */\n @property({ type: Boolean, reflect: true })\n indeterminate = false;\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n @property({ type: String, reflect: true })\n size: KtCheckboxSize = 'medium';\n\n @property({ type: String })\n name = '';\n\n /** Submitted when checked, as for a native checkbox. */\n @property({ type: String })\n value = 'on';\n\n /** Accessible name, when nothing is slotted. */\n @property({ type: String })\n label = '';\n\n /** Error message. A non-empty value puts the box in its error state. */\n @property({ type: String, reflect: true })\n error = '';\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultChecked = this.checked;\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (\n changed.has('checked') ||\n changed.has('value') ||\n changed.has('required') ||\n changed.has('error') ||\n this.stringsChanged(changed)\n ) {\n // Unchecked contributes nothing to the submission, not an empty string.\n setFormValue(this.internals, this.checked ? this.value : null);\n\n const missing = this.required && !this.checked;\n setValidity(\n this.internals,\n { valueMissing: missing, customError: Boolean(this.error) },\n this.error || (missing ? strings().checkRequired : ''),\n );\n }\n }\n\n formResetCallback(): void {\n this.checked = this.defaultChecked;\n this.indeterminate = false;\n }\n\n formStateRestoreCallback(state: string | null): void {\n this.checked = state === this.value;\n }\n\n override focus(options?: FocusOptions): void {\n this.input?.focus(options);\n }\n\n private onChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.checked = input.checked;\n this.indeterminate = false;\n emit(this, 'kt-change', { checked: this.checked });\n }\n\n override render(): TemplateResult {\n const icon = this.indeterminate ? 'minus' : this.checked ? 'check' : '';\n\n // The message sits outside the <label>: inside it, it would become part of\n // the checkbox's name instead of its description.\n return html`${\n this.error\n ? html`<span id=\"error-message\" class=\"visually-hidden\">${this.error}</span>`\n : nothing\n }<label part=\"base\" class=${this.error ? 'error' : ''}>\n <span class=\"control\">\n <input\n part=\"input\"\n type=\"checkbox\"\n .checked=${live(this.checked)}\n .indeterminate=${this.indeterminate}\n ?disabled=${this.disabled}\n ?required=${this.required}\n aria-label=${this.label || nothing}\n aria-invalid=${this.error ? 'true' : nothing}\n aria-describedby=${this.error ? 'error-message' : nothing}\n @change=${this.onChange}\n />\n <span part=\"box\" class=\"box\">\n ${icon ? html`<kt-icon name=${icon} size=\"14\"></kt-icon>` : nothing}\n </span>\n </span>\n <span class=\"text\"><slot></slot></span>\n </label>`;\n }\n}\n\ndefineElement('kt-checkbox', KtCheckbox);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-checkbox': KtCheckbox;\n }\n}\n"],"names":["KtCheckbox","KtElement","css","attachFormInternals","changed","setFormValue","missing","setValidity","strings","state","options","event","input","emit","icon","html","nothing","live","__decorateClass","query","property","defineElement"],"mappings":"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"}
|
|
@@ -35,9 +35,9 @@ export declare class KtDragDrop extends KtElement {
|
|
|
35
35
|
* Named `heading`, not `title`: an element already has a `title`, and
|
|
36
36
|
* reusing it would put the prompt in a native tooltip on the whole zone.
|
|
37
37
|
*/
|
|
38
|
-
heading: string;
|
|
38
|
+
heading: string | undefined;
|
|
39
39
|
/** The clickable-looking part of the prompt. */
|
|
40
|
-
linkText: string;
|
|
40
|
+
linkText: string | undefined;
|
|
41
41
|
/** Optional hint, e.g. `800×400px`. */
|
|
42
42
|
recommendedSize: string;
|
|
43
43
|
multiple: boolean;
|