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.
- package/LICENSE +26 -0
- package/README.md +155 -0
- package/dist/assets/fonts/README.md +19 -0
- package/dist/assets/fonts/manrope/OFL.txt +93 -0
- package/dist/assets/fonts/manrope/manrope-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/manrope/manrope-cyrillic-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/manrope/manrope-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/manrope/manrope-latin-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/mulish/OFL.txt +93 -0
- package/dist/assets/fonts/mulish/mulish-cyrillic-ext-wght-italic.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-cyrillic-wght-italic.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-cyrillic-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-latin-ext-wght-italic.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-latin-wght-italic.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-latin-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/source_code_pro/OFL.txt +93 -0
- package/dist/assets/fonts/source_code_pro/SourceCodePro-Regular.woff2 +0 -0
- package/dist/chunks/dialog-CPIfFIlF.js +29 -0
- package/dist/chunks/dialog-CPIfFIlF.js.map +1 -0
- package/dist/chunks/events-Bjl5Zmmq.js +18 -0
- package/dist/chunks/events-Bjl5Zmmq.js.map +1 -0
- package/dist/chunks/form-control-CxjBTt1c.js +17 -0
- package/dist/chunks/form-control-CxjBTt1c.js.map +1 -0
- package/dist/chunks/kt-element-CcMLO5e8.js +28 -0
- package/dist/chunks/kt-element-CcMLO5e8.js.map +1 -0
- package/dist/chunks/listbox-CUXYn_3S.js +101 -0
- package/dist/chunks/listbox-CUXYn_3S.js.map +1 -0
- package/dist/chunks/registry-X4LS9J5K.js +30 -0
- package/dist/chunks/registry-X4LS9J5K.js.map +1 -0
- package/dist/chunks/slots-BPbIdxAJ.js +7 -0
- package/dist/chunks/slots-BPbIdxAJ.js.map +1 -0
- package/dist/chunks/toaster-PmdKSV5x.js +40 -0
- package/dist/chunks/toaster-PmdKSV5x.js.map +1 -0
- package/dist/components/core/kt-avatar/kt-avatar.d.ts +49 -0
- package/dist/components/core/kt-avatar/kt-avatar.js +156 -0
- package/dist/components/core/kt-avatar/kt-avatar.js.map +1 -0
- package/dist/components/core/kt-badge/kt-badge.d.ts +77 -0
- package/dist/components/core/kt-badge/kt-badge.js +254 -0
- package/dist/components/core/kt-badge/kt-badge.js.map +1 -0
- package/dist/components/core/kt-button/kt-button.d.ts +71 -0
- package/dist/components/core/kt-button/kt-button.js +271 -0
- package/dist/components/core/kt-button/kt-button.js.map +1 -0
- package/dist/components/core/kt-card/kt-card.d.ts +62 -0
- package/dist/components/core/kt-card/kt-card.js +230 -0
- package/dist/components/core/kt-card/kt-card.js.map +1 -0
- package/dist/components/core/kt-code/kt-code.d.ts +55 -0
- package/dist/components/core/kt-code/kt-code.js +155 -0
- package/dist/components/core/kt-code/kt-code.js.map +1 -0
- package/dist/components/core/kt-icon/kt-icon.d.ts +44 -0
- package/dist/components/core/kt-icon/kt-icon.js +85 -0
- package/dist/components/core/kt-icon/kt-icon.js.map +1 -0
- package/dist/components/core/kt-kbd/kt-kbd.d.ts +38 -0
- package/dist/components/core/kt-kbd/kt-kbd.js +89 -0
- package/dist/components/core/kt-kbd/kt-kbd.js.map +1 -0
- package/dist/components/data/kt-chart/kt-chart.d.ts +99 -0
- package/dist/components/data/kt-chart/kt-chart.js +406 -0
- package/dist/components/data/kt-chart/kt-chart.js.map +1 -0
- package/dist/components/data/kt-meter/kt-meter.d.ts +63 -0
- package/dist/components/data/kt-meter/kt-meter.js +177 -0
- package/dist/components/data/kt-meter/kt-meter.js.map +1 -0
- package/dist/components/data/kt-pagination/kt-pagination.d.ts +35 -0
- package/dist/components/data/kt-pagination/kt-pagination.js +88 -0
- package/dist/components/data/kt-pagination/kt-pagination.js.map +1 -0
- package/dist/components/data/kt-stat/kt-stat.d.ts +60 -0
- package/dist/components/data/kt-stat/kt-stat.js +137 -0
- package/dist/components/data/kt-stat/kt-stat.js.map +1 -0
- package/dist/components/data/kt-table/kt-table.d.ts +99 -0
- package/dist/components/data/kt-table/kt-table.js +340 -0
- package/dist/components/data/kt-table/kt-table.js.map +1 -0
- package/dist/components/data/kt-timeline/kt-timeline.d.ts +78 -0
- package/dist/components/data/kt-timeline/kt-timeline.js +252 -0
- package/dist/components/data/kt-timeline/kt-timeline.js.map +1 -0
- package/dist/components/feedback/kt-alert/kt-alert.d.ts +46 -0
- package/dist/components/feedback/kt-alert/kt-alert.js +180 -0
- package/dist/components/feedback/kt-alert/kt-alert.js.map +1 -0
- package/dist/components/feedback/kt-empty-state/kt-empty-state.d.ts +40 -0
- package/dist/components/feedback/kt-empty-state/kt-empty-state.js +100 -0
- package/dist/components/feedback/kt-empty-state/kt-empty-state.js.map +1 -0
- package/dist/components/feedback/kt-progress-bar/kt-progress-bar.d.ts +53 -0
- package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +212 -0
- package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js.map +1 -0
- package/dist/components/feedback/kt-skeleton/kt-skeleton.d.ts +43 -0
- package/dist/components/feedback/kt-skeleton/kt-skeleton.js +117 -0
- package/dist/components/feedback/kt-skeleton/kt-skeleton.js.map +1 -0
- package/dist/components/feedback/kt-toast/kt-toast.d.ts +57 -0
- package/dist/components/feedback/kt-toast/kt-toast.js +231 -0
- package/dist/components/feedback/kt-toast/kt-toast.js.map +1 -0
- package/dist/components/feedback/kt-toast-container/kt-toast-container.d.ts +60 -0
- package/dist/components/feedback/kt-toast-container/kt-toast-container.js +100 -0
- package/dist/components/feedback/kt-toast-container/kt-toast-container.js.map +1 -0
- package/dist/components/feedback/kt-toast-container/toaster.d.ts +37 -0
- package/dist/components/feedback/kt-tooltip/kt-tooltip.d.ts +57 -0
- package/dist/components/feedback/kt-tooltip/kt-tooltip.js +138 -0
- package/dist/components/feedback/kt-tooltip/kt-tooltip.js.map +1 -0
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.d.ts +68 -0
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +287 -0
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.js.map +1 -0
- package/dist/components/forms/kt-form/kt-form.d.ts +75 -0
- package/dist/components/forms/kt-form/kt-form.js +187 -0
- package/dist/components/forms/kt-form/kt-form.js.map +1 -0
- package/dist/components/forms/kt-input/kt-input.d.ts +112 -0
- package/dist/components/forms/kt-input/kt-input.js +556 -0
- package/dist/components/forms/kt-input/kt-input.js.map +1 -0
- package/dist/components/forms/kt-input-menu/kt-input-menu.d.ts +60 -0
- package/dist/components/forms/kt-input-menu/kt-input-menu.js +313 -0
- package/dist/components/forms/kt-input-menu/kt-input-menu.js.map +1 -0
- package/dist/components/forms/kt-label-input/kt-label-input.d.ts +42 -0
- package/dist/components/forms/kt-label-input/kt-label-input.js +69 -0
- package/dist/components/forms/kt-label-input/kt-label-input.js.map +1 -0
- package/dist/components/forms/kt-select/kt-select.d.ts +80 -0
- package/dist/components/forms/kt-select/kt-select.js +334 -0
- package/dist/components/forms/kt-select/kt-select.js.map +1 -0
- package/dist/components/forms/kt-textarea/kt-textarea.d.ts +62 -0
- package/dist/components/forms/kt-textarea/kt-textarea.js +239 -0
- package/dist/components/forms/kt-textarea/kt-textarea.js.map +1 -0
- package/dist/components/forms/kt-toggle/kt-toggle.d.ts +53 -0
- package/dist/components/forms/kt-toggle/kt-toggle.js +170 -0
- package/dist/components/forms/kt-toggle/kt-toggle.js.map +1 -0
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.d.ts +45 -0
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +93 -0
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js.map +1 -0
- package/dist/components/navigation/kt-header/kt-header.d.ts +67 -0
- package/dist/components/navigation/kt-header/kt-header.js +195 -0
- package/dist/components/navigation/kt-header/kt-header.js.map +1 -0
- package/dist/components/navigation/kt-page-header/kt-page-header.d.ts +48 -0
- package/dist/components/navigation/kt-page-header/kt-page-header.js +111 -0
- package/dist/components/navigation/kt-page-header/kt-page-header.js.map +1 -0
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.d.ts +63 -0
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +228 -0
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -0
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.d.ts +94 -0
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +265 -0
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js.map +1 -0
- package/dist/components/navigation/kt-tabs/kt-tabs.d.ts +64 -0
- package/dist/components/navigation/kt-tabs/kt-tabs.js +175 -0
- package/dist/components/navigation/kt-tabs/kt-tabs.js.map +1 -0
- package/dist/components/navigation/kt-toggle-button/kt-toggle-button.d.ts +50 -0
- package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +191 -0
- package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js.map +1 -0
- package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.d.ts +55 -0
- package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +128 -0
- package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js.map +1 -0
- package/dist/components/overlays/kt-collapsible/kt-collapsible.d.ts +42 -0
- package/dist/components/overlays/kt-collapsible/kt-collapsible.js +107 -0
- package/dist/components/overlays/kt-collapsible/kt-collapsible.js.map +1 -0
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.d.ts +56 -0
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +155 -0
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js.map +1 -0
- package/dist/components/overlays/kt-dropdown/kt-dropdown.d.ts +64 -0
- package/dist/components/overlays/kt-dropdown/kt-dropdown.js +212 -0
- package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -0
- package/dist/components/overlays/kt-modal/kt-modal.d.ts +61 -0
- package/dist/components/overlays/kt-modal/kt-modal.js +207 -0
- package/dist/components/overlays/kt-modal/kt-modal.js.map +1 -0
- package/dist/components/overlays/kt-side-panel/kt-side-panel.d.ts +52 -0
- package/dist/components/overlays/kt-side-panel/kt-side-panel.js +178 -0
- package/dist/components/overlays/kt-side-panel/kt-side-panel.js.map +1 -0
- package/dist/icons/defaults.d.ts +25 -0
- package/dist/icons/index.d.ts +3 -0
- package/dist/icons/index.js +37 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/icons/registry.d.ts +38 -0
- package/dist/index.d.ts +81 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/countries.d.ts +37 -0
- package/dist/internal/dialog.d.ts +22 -0
- package/dist/internal/events.d.ts +14 -0
- package/dist/internal/form-control.d.ts +27 -0
- package/dist/internal/format.d.ts +8 -0
- package/dist/internal/kt-element.d.ts +22 -0
- package/dist/internal/listbox.d.ts +36 -0
- package/dist/internal/slots.d.ts +10 -0
- package/dist/react/index.d.ts +208 -0
- package/dist/react/index.js +314 -0
- package/dist/react/index.js.map +1 -0
- package/dist/styles.css +13 -0
- package/dist/tokens/README.md +63 -0
- package/dist/tokens/base.css +79 -0
- package/dist/tokens/colors.css +125 -0
- package/dist/tokens/fonts.css +136 -0
- package/dist/tokens/index.css +12 -0
- package/dist/tokens/responsive.css +108 -0
- package/dist/tokens/spacing.css +66 -0
- package/dist/tokens/theme-light.css +144 -0
- package/dist/tokens/typography.css +41 -0
- package/dist/vue/index.d.ts +143 -0
- package/dist/vue/index.js +56 -0
- package/dist/vue/index.js.map +1 -0
- package/package.json +296 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { css as c, html as h } from "lit";
|
|
2
|
+
import { queryAssignedElements as g, property as l } from "lit/decorators.js";
|
|
3
|
+
import { K as d, d as b } from "../../../chunks/kt-element-CcMLO5e8.js";
|
|
4
|
+
import { e as p } from "../../../chunks/events-Bjl5Zmmq.js";
|
|
5
|
+
import { KtToggleButton as v } from "../kt-toggle-button/kt-toggle-button.js";
|
|
6
|
+
var f = Object.defineProperty, s = (n, t, e, r) => {
|
|
7
|
+
for (var o = void 0, a = n.length - 1, u; a >= 0; a--)
|
|
8
|
+
(u = n[a]) && (o = u(t, e, o) || o);
|
|
9
|
+
return o && f(t, e, o), o;
|
|
10
|
+
};
|
|
11
|
+
class i extends d {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments), this.multiple = !1, this.orientation = "horizontal", this.label = "", this.value = null, this.onButtonClick = (t) => {
|
|
14
|
+
const e = t.composedPath().find((r) => r instanceof v);
|
|
15
|
+
if (!(!e || e.disabled) && this.buttons?.includes(e)) {
|
|
16
|
+
if (this.multiple) {
|
|
17
|
+
const r = Array.isArray(this.value) ? this.value : [];
|
|
18
|
+
this.value = r.includes(e.value) ? r.filter((o) => o !== e.value) : [...r, e.value];
|
|
19
|
+
} else
|
|
20
|
+
this.value = this.value === e.value ? null : e.value;
|
|
21
|
+
this.syncButtons(), p(this, "kt-change", { value: this.value });
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
static {
|
|
26
|
+
this.styles = [
|
|
27
|
+
d.styles,
|
|
28
|
+
c`
|
|
29
|
+
:host {
|
|
30
|
+
display: inline-flex;
|
|
31
|
+
width: fit-content;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.group {
|
|
35
|
+
display: inline-flex;
|
|
36
|
+
gap: 0;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
:host([orientation='vertical']) .group {
|
|
40
|
+
flex-direction: column;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* The buttons butt up against each other: square off the inner corners,
|
|
44
|
+
pull them together by a border width, and lift the selected one so its
|
|
45
|
+
border wins over its neighbour's. */
|
|
46
|
+
::slotted(kt-toggle-button) {
|
|
47
|
+
position: relative;
|
|
48
|
+
z-index: 1;
|
|
49
|
+
--kt-toggle-button-radius: 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
::slotted(kt-toggle-button[selected]) {
|
|
53
|
+
z-index: 3;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
:host(:not([orientation='vertical'])) ::slotted(kt-toggle-button:not(:first-child)) {
|
|
57
|
+
margin-left: calc(var(--border-width) * -1);
|
|
58
|
+
}
|
|
59
|
+
:host(:not([orientation='vertical'])) ::slotted(kt-toggle-button:first-child) {
|
|
60
|
+
--kt-toggle-button-radius: var(--border-radius) 0 0 var(--border-radius);
|
|
61
|
+
}
|
|
62
|
+
:host(:not([orientation='vertical'])) ::slotted(kt-toggle-button:last-child) {
|
|
63
|
+
--kt-toggle-button-radius: 0 var(--border-radius) var(--border-radius) 0;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
:host([orientation='vertical']) ::slotted(kt-toggle-button:not(:first-child)) {
|
|
67
|
+
margin-top: calc(var(--border-width) * -1);
|
|
68
|
+
}
|
|
69
|
+
:host([orientation='vertical']) ::slotted(kt-toggle-button:first-child) {
|
|
70
|
+
--kt-toggle-button-radius: var(--border-radius) var(--border-radius) 0 0;
|
|
71
|
+
}
|
|
72
|
+
:host([orientation='vertical']) ::slotted(kt-toggle-button:last-child) {
|
|
73
|
+
--kt-toggle-button-radius: 0 0 var(--border-radius) var(--border-radius);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* A lone button keeps all four corners. */
|
|
77
|
+
::slotted(kt-toggle-button:only-child) {
|
|
78
|
+
--kt-toggle-button-radius: var(--border-radius);
|
|
79
|
+
}
|
|
80
|
+
`
|
|
81
|
+
];
|
|
82
|
+
}
|
|
83
|
+
connectedCallback() {
|
|
84
|
+
super.connectedCallback(), this.addEventListener("click", this.onButtonClick);
|
|
85
|
+
}
|
|
86
|
+
disconnectedCallback() {
|
|
87
|
+
super.disconnectedCallback(), this.removeEventListener("click", this.onButtonClick);
|
|
88
|
+
}
|
|
89
|
+
firstUpdated() {
|
|
90
|
+
this.syncButtons();
|
|
91
|
+
}
|
|
92
|
+
updated(t) {
|
|
93
|
+
(t.has("value") || t.has("multiple")) && this.syncButtons();
|
|
94
|
+
}
|
|
95
|
+
isSelected(t) {
|
|
96
|
+
return this.multiple ? Array.isArray(this.value) && this.value.includes(t) : this.value === t;
|
|
97
|
+
}
|
|
98
|
+
/** Pushes the group's state down; the buttons are the display, not the truth. */
|
|
99
|
+
syncButtons() {
|
|
100
|
+
for (const t of this.buttons ?? [])
|
|
101
|
+
t.managed = !0, t.selected = this.isSelected(t.value);
|
|
102
|
+
}
|
|
103
|
+
render() {
|
|
104
|
+
return h`<div part="base" class="group" role="group" aria-label=${this.label || "Options"}>
|
|
105
|
+
<slot @slotchange=${this.syncButtons}></slot>
|
|
106
|
+
</div>`;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
s([
|
|
110
|
+
g({ selector: "kt-toggle-button" })
|
|
111
|
+
], i.prototype, "buttons");
|
|
112
|
+
s([
|
|
113
|
+
l({ type: Boolean, reflect: !0 })
|
|
114
|
+
], i.prototype, "multiple");
|
|
115
|
+
s([
|
|
116
|
+
l({ type: String, reflect: !0 })
|
|
117
|
+
], i.prototype, "orientation");
|
|
118
|
+
s([
|
|
119
|
+
l({ type: String })
|
|
120
|
+
], i.prototype, "label");
|
|
121
|
+
s([
|
|
122
|
+
l({ attribute: !1 })
|
|
123
|
+
], i.prototype, "value");
|
|
124
|
+
b("kt-toggle-button-group", i);
|
|
125
|
+
export {
|
|
126
|
+
i as KtToggleButtonGroup
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=kt-toggle-button-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kt-toggle-button-group.js","sources":["../../../../src/components/navigation/kt-toggle-button-group/kt-toggle-button-group.ts"],"sourcesContent":["import { css, html, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, queryAssignedElements } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { KtToggleButton } from '../kt-toggle-button/kt-toggle-button.js';\n\n/**\n * Joins `<kt-toggle-button>`s into one segmented bar and coordinates their\n * selection.\n *\n * Single mode behaves like a radio group with a deselect: clicking the active\n * button clears it. Multiple mode is a set of independent checkboxes that\n * happen to be drawn together.\n *\n * The buttons are slotted rather than described by an options array, so a\n * button can hold whatever its label needs — an icon, a count, a badge.\n *\n * @element kt-toggle-button-group\n *\n * @slot - The `<kt-toggle-button>` children.\n *\n * @csspart base - The group container.\n *\n * @fires kt-change - The selection changed.\n * `detail: { value }` — a single value or `null`, or an array in multiple mode.\n *\n * @example\n * ```html\n * <kt-toggle-button-group>\n * <kt-toggle-button value=\"list\" icon=\"list\" label=\"List\"></kt-toggle-button>\n * <kt-toggle-button value=\"grid\" icon=\"grid\" label=\"Grid\"></kt-toggle-button>\n * </kt-toggle-button-group>\n * ```\n */\nexport class KtToggleButtonGroup extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-flex;\n width: fit-content;\n }\n\n .group {\n display: inline-flex;\n gap: 0;\n }\n\n :host([orientation='vertical']) .group {\n flex-direction: column;\n }\n\n /* The buttons butt up against each other: square off the inner corners,\n pull them together by a border width, and lift the selected one so its\n border wins over its neighbour's. */\n ::slotted(kt-toggle-button) {\n position: relative;\n z-index: 1;\n --kt-toggle-button-radius: 0;\n }\n\n ::slotted(kt-toggle-button[selected]) {\n z-index: 3;\n }\n\n :host(:not([orientation='vertical'])) ::slotted(kt-toggle-button:not(:first-child)) {\n margin-left: calc(var(--border-width) * -1);\n }\n :host(:not([orientation='vertical'])) ::slotted(kt-toggle-button:first-child) {\n --kt-toggle-button-radius: var(--border-radius) 0 0 var(--border-radius);\n }\n :host(:not([orientation='vertical'])) ::slotted(kt-toggle-button:last-child) {\n --kt-toggle-button-radius: 0 var(--border-radius) var(--border-radius) 0;\n }\n\n :host([orientation='vertical']) ::slotted(kt-toggle-button:not(:first-child)) {\n margin-top: calc(var(--border-width) * -1);\n }\n :host([orientation='vertical']) ::slotted(kt-toggle-button:first-child) {\n --kt-toggle-button-radius: var(--border-radius) var(--border-radius) 0 0;\n }\n :host([orientation='vertical']) ::slotted(kt-toggle-button:last-child) {\n --kt-toggle-button-radius: 0 0 var(--border-radius) var(--border-radius);\n }\n\n /* A lone button keeps all four corners. */\n ::slotted(kt-toggle-button:only-child) {\n --kt-toggle-button-radius: var(--border-radius);\n }\n `,\n ];\n\n @queryAssignedElements({ selector: 'kt-toggle-button' })\n private buttons!: KtToggleButton[];\n\n /** `false`: one selection at a time. `true`: any number. */\n @property({ type: Boolean, reflect: true })\n multiple = false;\n\n @property({ type: String, reflect: true })\n orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n /** Accessible name for the group. */\n @property({ type: String })\n label = '';\n\n /** The selected value, or values in multiple mode. */\n @property({ attribute: false })\n value: string | string[] | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Listen on the host: the buttons are slotted light-DOM children, so a\n // listener inside the shadow root would see them through a retargeted\n // event.\n this.addEventListener('click', this.onButtonClick);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('click', this.onButtonClick);\n }\n\n override firstUpdated(): void {\n this.syncButtons();\n }\n\n override updated(changed: PropertyValues<this>): void {\n if (changed.has('value') || changed.has('multiple')) this.syncButtons();\n }\n\n private isSelected(candidate: string): boolean {\n if (this.multiple) return Array.isArray(this.value) && this.value.includes(candidate);\n return this.value === candidate;\n }\n\n /** Pushes the group's state down; the buttons are the display, not the truth. */\n private syncButtons(): void {\n for (const button of this.buttons ?? []) {\n button.managed = true;\n button.selected = this.isSelected(button.value);\n }\n }\n\n private onButtonClick = (event: Event): void => {\n // composedPath rather than target: the click starts on the <button> inside\n // the child's shadow root, and reading target relies on retargeting, which\n // browsers do and test DOMs do not.\n const button = event\n .composedPath()\n .find((node): node is KtToggleButton => node instanceof KtToggleButton);\n\n if (!button || button.disabled) return;\n if (!this.buttons?.includes(button)) return;\n\n if (this.multiple) {\n const current = Array.isArray(this.value) ? this.value : [];\n this.value = current.includes(button.value)\n ? current.filter((candidate) => candidate !== button.value)\n : [...current, button.value];\n } else {\n this.value = this.value === button.value ? null : button.value;\n }\n\n this.syncButtons();\n emit(this, 'kt-change', { value: this.value });\n };\n\n override render(): TemplateResult {\n return html`<div part=\"base\" class=\"group\" role=\"group\" aria-label=${this.label || 'Options'}>\n <slot @slotchange=${this.syncButtons}></slot>\n </div>`;\n }\n}\n\ndefineElement('kt-toggle-button-group', KtToggleButtonGroup);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-toggle-button-group': KtToggleButtonGroup;\n }\n}\n"],"names":["KtToggleButtonGroup","KtElement","event","button","node","KtToggleButton","current","candidate","emit","css","changed","html","__decorateClass","queryAssignedElements","property","defineElement"],"mappings":";;;;;;;;;;AAkCO,MAAMA,UAA4BC,EAAU;AAAA,EAA5C,cAAA;AAAA,UAAA,GAAA,SAAA,GA+DL,KAAA,WAAW,IAGX,KAAA,cAAyC,cAIzC,KAAA,QAAQ,IAIR,KAAA,QAAkC,MAoClC,KAAQ,gBAAgB,CAACC,MAAuB;AAI9C,YAAMC,IAASD,EACZ,aAAA,EACA,KAAK,CAACE,MAAiCA,aAAgBC,CAAc;AAExE,UAAI,GAACF,KAAUA,EAAO,aACjB,KAAK,SAAS,SAASA,CAAM,GAElC;AAAA,YAAI,KAAK,UAAU;AACjB,gBAAMG,IAAU,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAA;AACzD,eAAK,QAAQA,EAAQ,SAASH,EAAO,KAAK,IACtCG,EAAQ,OAAO,CAACC,MAAcA,MAAcJ,EAAO,KAAK,IACxD,CAAC,GAAGG,GAASH,EAAO,KAAK;AAAA,QAC/B;AACE,eAAK,QAAQ,KAAK,UAAUA,EAAO,QAAQ,OAAOA,EAAO;AAG3D,aAAK,YAAA,GACLK,EAAK,MAAM,aAAa,EAAE,OAAO,KAAK,OAAO;AAAA;AAAA,IAC/C;AAAA,EAAA;AAAA,EAnIA,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBP,EAAU;AAAA,MACVQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAqDF;AAAA,EAoBS,oBAA0B;AACjC,UAAM,kBAAA,GAIN,KAAK,iBAAiB,SAAS,KAAK,aAAa;AAAA,EACnD;AAAA,EAES,uBAA6B;AACpC,UAAM,qBAAA,GACN,KAAK,oBAAoB,SAAS,KAAK,aAAa;AAAA,EACtD;AAAA,EAES,eAAqB;AAC5B,SAAK,YAAA;AAAA,EACP;AAAA,EAES,QAAQC,GAAqC;AACpD,KAAIA,EAAQ,IAAI,OAAO,KAAKA,EAAQ,IAAI,UAAU,MAAG,KAAK,YAAA;AAAA,EAC5D;AAAA,EAEQ,WAAWH,GAA4B;AAC7C,WAAI,KAAK,WAAiB,MAAM,QAAQ,KAAK,KAAK,KAAK,KAAK,MAAM,SAASA,CAAS,IAC7E,KAAK,UAAUA;AAAA,EACxB;AAAA;AAAA,EAGQ,cAAoB;AAC1B,eAAWJ,KAAU,KAAK,WAAW,CAAA;AACnC,MAAAA,EAAO,UAAU,IACjBA,EAAO,WAAW,KAAK,WAAWA,EAAO,KAAK;AAAA,EAElD;AAAA,EA0BS,SAAyB;AAChC,WAAOQ,2DAA8D,KAAK,SAAS,SAAS;AAAA,0BACtE,KAAK,WAAW;AAAA;AAAA,EAExC;AACF;AAhFUC,EAAA;AAAA,EADPC,EAAsB,EAAE,UAAU,mBAAA,CAAoB;AAAA,GA1D5Cb,EA2DH,WAAA,SAAA;AAIRY,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GA9D/Bd,EA+DX,WAAA,UAAA;AAGAY,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAjE9Bd,EAkEX,WAAA,aAAA;AAIAY,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GArEfd,EAsEX,WAAA,OAAA;AAIAY,EAAA;AAAA,EADCE,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAzEnBd,EA0EX,WAAA,OAAA;AAmEFe,EAAc,0BAA0Bf,CAAmB;"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type TemplateResult } from 'lit';
|
|
2
|
+
import { KtElement } from '#internal/kt-element';
|
|
3
|
+
import '../../core/kt-icon/kt-icon.js';
|
|
4
|
+
/**
|
|
5
|
+
* A section that folds away.
|
|
6
|
+
*
|
|
7
|
+
* Built on `<details>`, which means it works before the JavaScript loads,
|
|
8
|
+
* survives find-in-page — the browser opens a closed section to reveal a match —
|
|
9
|
+
* and needs no ARIA of its own.
|
|
10
|
+
*
|
|
11
|
+
* @element kt-collapsible
|
|
12
|
+
*
|
|
13
|
+
* @slot - The contents.
|
|
14
|
+
* @slot summary - Replaces the `heading` attribute.
|
|
15
|
+
*
|
|
16
|
+
* @csspart base - The `<details>`.
|
|
17
|
+
* @csspart summary - The clickable row.
|
|
18
|
+
* @csspart content - The revealed panel.
|
|
19
|
+
*
|
|
20
|
+
* @fires kt-toggle - Opened or closed. `detail: { open }`.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```html
|
|
24
|
+
* <kt-collapsible heading="Notifications" open>
|
|
25
|
+
* <kt-toggle checked>Email me about mentions</kt-toggle>
|
|
26
|
+
* </kt-collapsible>
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare class KtCollapsible extends KtElement {
|
|
30
|
+
static styles: import("lit").CSSResultGroup[];
|
|
31
|
+
open: boolean;
|
|
32
|
+
heading: string;
|
|
33
|
+
/** Drops the bottom rule, for a collapsible that is not part of a list. */
|
|
34
|
+
plain: boolean;
|
|
35
|
+
private onToggle;
|
|
36
|
+
render(): TemplateResult;
|
|
37
|
+
}
|
|
38
|
+
declare global {
|
|
39
|
+
interface HTMLElementTagNameMap {
|
|
40
|
+
'kt-collapsible': KtCollapsible;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { css as d, nothing as m, html as c } from "lit";
|
|
2
|
+
import { property as n } from "lit/decorators.js";
|
|
3
|
+
import { K as p, d as u } from "../../../chunks/kt-element-CcMLO5e8.js";
|
|
4
|
+
import { e as f } from "../../../chunks/events-Bjl5Zmmq.js";
|
|
5
|
+
import "../../core/kt-icon/kt-icon.js";
|
|
6
|
+
var h = Object.defineProperty, i = (a, o, t, y) => {
|
|
7
|
+
for (var e = void 0, s = a.length - 1, l; s >= 0; s--)
|
|
8
|
+
(l = a[s]) && (e = l(o, t, e) || e);
|
|
9
|
+
return e && h(o, t, e), e;
|
|
10
|
+
};
|
|
11
|
+
class r extends p {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments), this.open = !1, this.heading = "", this.plain = !1;
|
|
14
|
+
}
|
|
15
|
+
static {
|
|
16
|
+
this.styles = [
|
|
17
|
+
p.styles,
|
|
18
|
+
d`
|
|
19
|
+
:host {
|
|
20
|
+
display: block;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
details {
|
|
24
|
+
border-bottom: var(--border-width) solid var(--border-subtle);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
:host([plain]) details {
|
|
28
|
+
border-bottom: none;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
summary {
|
|
32
|
+
display: flex;
|
|
33
|
+
align-items: center;
|
|
34
|
+
gap: var(--gap-button);
|
|
35
|
+
padding: 12px 0;
|
|
36
|
+
color: var(--text-body);
|
|
37
|
+
font: var(--font-normal-medium);
|
|
38
|
+
cursor: pointer;
|
|
39
|
+
list-style: none;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* The default marker is a triangle nobody asked for. */
|
|
43
|
+
summary::-webkit-details-marker {
|
|
44
|
+
display: none;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
summary:hover {
|
|
48
|
+
color: var(--text-body);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
summary:focus-visible {
|
|
52
|
+
outline: var(--outline-width) solid var(--color-primary-base);
|
|
53
|
+
outline-offset: 2px;
|
|
54
|
+
border-radius: 4px;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.chevron {
|
|
58
|
+
display: inline-flex;
|
|
59
|
+
flex: none;
|
|
60
|
+
color: var(--text-muted);
|
|
61
|
+
transition: transform var(--duration-fast) var(--easing-standard);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
details[open] .chevron {
|
|
65
|
+
transform: rotate(90deg);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.label {
|
|
69
|
+
flex: 1;
|
|
70
|
+
min-width: 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.content {
|
|
74
|
+
padding: 0 0 16px;
|
|
75
|
+
color: var(--text-muted);
|
|
76
|
+
}
|
|
77
|
+
`
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
onToggle(o) {
|
|
81
|
+
const t = o.target;
|
|
82
|
+
t.open !== this.open && (this.open = t.open, f(this, "kt-toggle", { open: this.open }));
|
|
83
|
+
}
|
|
84
|
+
render() {
|
|
85
|
+
return c`<details part="base" ?open=${this.open} @toggle=${this.onToggle}>
|
|
86
|
+
<summary part="summary">
|
|
87
|
+
<span class="chevron"><kt-icon name="chevron-right" size="16"></kt-icon></span>
|
|
88
|
+
<span class="label"><slot name="summary">${this.heading || m}</slot></span>
|
|
89
|
+
</summary>
|
|
90
|
+
<div part="content" class="content"><slot></slot></div>
|
|
91
|
+
</details>`;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
i([
|
|
95
|
+
n({ type: Boolean, reflect: !0 })
|
|
96
|
+
], r.prototype, "open");
|
|
97
|
+
i([
|
|
98
|
+
n({ type: String })
|
|
99
|
+
], r.prototype, "heading");
|
|
100
|
+
i([
|
|
101
|
+
n({ type: Boolean, reflect: !0 })
|
|
102
|
+
], r.prototype, "plain");
|
|
103
|
+
u("kt-collapsible", r);
|
|
104
|
+
export {
|
|
105
|
+
r as KtCollapsible
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=kt-collapsible.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kt-collapsible.js","sources":["../../../../src/components/overlays/kt-collapsible/kt-collapsible.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport '../../core/kt-icon/kt-icon.js';\n\n/**\n * A section that folds away.\n *\n * Built on `<details>`, which means it works before the JavaScript loads,\n * survives find-in-page — the browser opens a closed section to reveal a match —\n * and needs no ARIA of its own.\n *\n * @element kt-collapsible\n *\n * @slot - The contents.\n * @slot summary - Replaces the `heading` attribute.\n *\n * @csspart base - The `<details>`.\n * @csspart summary - The clickable row.\n * @csspart content - The revealed panel.\n *\n * @fires kt-toggle - Opened or closed. `detail: { open }`.\n *\n * @example\n * ```html\n * <kt-collapsible heading=\"Notifications\" open>\n * <kt-toggle checked>Email me about mentions</kt-toggle>\n * </kt-collapsible>\n * ```\n */\nexport class KtCollapsible extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n details {\n border-bottom: var(--border-width) solid var(--border-subtle);\n }\n\n :host([plain]) details {\n border-bottom: none;\n }\n\n summary {\n display: flex;\n align-items: center;\n gap: var(--gap-button);\n padding: 12px 0;\n color: var(--text-body);\n font: var(--font-normal-medium);\n cursor: pointer;\n list-style: none;\n }\n\n /* The default marker is a triangle nobody asked for. */\n summary::-webkit-details-marker {\n display: none;\n }\n\n summary:hover {\n color: var(--text-body);\n }\n\n summary:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .chevron {\n display: inline-flex;\n flex: none;\n color: var(--text-muted);\n transition: transform var(--duration-fast) var(--easing-standard);\n }\n\n details[open] .chevron {\n transform: rotate(90deg);\n }\n\n .label {\n flex: 1;\n min-width: 0;\n }\n\n .content {\n padding: 0 0 16px;\n color: var(--text-muted);\n }\n `,\n ];\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ type: String })\n heading = '';\n\n /** Drops the bottom rule, for a collapsible that is not part of a list. */\n @property({ type: Boolean, reflect: true })\n plain = false;\n\n private onToggle(event: Event): void {\n const details = event.target as HTMLDetailsElement;\n if (details.open === this.open) return;\n\n this.open = details.open;\n emit(this, 'kt-toggle', { open: this.open });\n }\n\n override render(): TemplateResult {\n return html`<details part=\"base\" ?open=${this.open} @toggle=${this.onToggle}>\n <summary part=\"summary\">\n <span class=\"chevron\"><kt-icon name=\"chevron-right\" size=\"16\"></kt-icon></span>\n <span class=\"label\"><slot name=\"summary\">${this.heading || nothing}</slot></span>\n </summary>\n <div part=\"content\" class=\"content\"><slot></slot></div>\n </details>`;\n }\n}\n\ndefineElement('kt-collapsible', KtCollapsible);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-collapsible': KtCollapsible;\n }\n}\n"],"names":["KtCollapsible","KtElement","css","event","details","emit","html","nothing","__decorateClass","property","defineElement"],"mappings":";;;;;;;;;;AA+BO,MAAMA,UAAsBC,EAAU;AAAA,EAAtC,cAAA;AAAA,UAAA,GAAA,SAAA,GAkEL,KAAA,OAAO,IAGP,KAAA,UAAU,IAIV,KAAA,QAAQ;AAAA,EAAA;AAAA,EAxER,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBA,EAAU;AAAA,MACVC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EA4DF;AAAA,EAYQ,SAASC,GAAoB;AACnC,UAAMC,IAAUD,EAAM;AACtB,IAAIC,EAAQ,SAAS,KAAK,SAE1B,KAAK,OAAOA,EAAQ,MACpBC,EAAK,MAAM,aAAa,EAAE,MAAM,KAAK,MAAM;AAAA,EAC7C;AAAA,EAES,SAAyB;AAChC,WAAOC,+BAAkC,KAAK,IAAI,YAAY,KAAK,QAAQ;AAAA;AAAA;AAAA,mDAG5B,KAAK,WAAWC,CAAO;AAAA;AAAA;AAAA;AAAA,EAIxE;AACF;AA1BEC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAjE/BT,EAkEX,WAAA,MAAA;AAGAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GApEfT,EAqEX,WAAA,SAAA;AAIAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAxE/BT,EAyEX,WAAA,OAAA;AAqBFU,EAAc,kBAAkBV,CAAa;"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
2
|
+
import { KtElement } from '#internal/kt-element';
|
|
3
|
+
import '../../core/kt-button/kt-button.js';
|
|
4
|
+
export type KtConfirmVariant = 'danger' | 'primary';
|
|
5
|
+
/**
|
|
6
|
+
* A centred yes/no overlay, for an action worth stopping to think about.
|
|
7
|
+
*
|
|
8
|
+
* Confirmations are for destructive or irreversible work. Editing belongs in a
|
|
9
|
+
* `<kt-side-panel>`, which does not block the page behind it.
|
|
10
|
+
*
|
|
11
|
+
* `role="alertdialog"` and the cancel button takes focus on open, so a stray
|
|
12
|
+
* Enter dismisses rather than confirms.
|
|
13
|
+
*
|
|
14
|
+
* @element kt-confirm-dialog
|
|
15
|
+
*
|
|
16
|
+
* @slot - Extra content between the message and the buttons.
|
|
17
|
+
*
|
|
18
|
+
* @csspart dialog - The `<dialog>`.
|
|
19
|
+
* @csspart actions - The button row.
|
|
20
|
+
*
|
|
21
|
+
* @fires kt-confirm - The confirm button was pressed.
|
|
22
|
+
* @fires kt-cancel - Dismissed, by button, Escape or backdrop.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```html
|
|
26
|
+
* <kt-confirm-dialog
|
|
27
|
+
* heading="Delete this entity?"
|
|
28
|
+
* message="This action cannot be undone."
|
|
29
|
+
* confirm-label="Delete"
|
|
30
|
+
* ></kt-confirm-dialog>
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare class KtConfirmDialog extends KtElement {
|
|
34
|
+
static styles: import("lit").CSSResultGroup[];
|
|
35
|
+
private dialog;
|
|
36
|
+
private cancelButton;
|
|
37
|
+
open: boolean;
|
|
38
|
+
heading: string;
|
|
39
|
+
message: string;
|
|
40
|
+
confirmLabel: string;
|
|
41
|
+
cancelLabel: string;
|
|
42
|
+
/** `danger` gives the confirm button the solid red treatment. */
|
|
43
|
+
variant: KtConfirmVariant;
|
|
44
|
+
updated(changed: PropertyValues<this>): void;
|
|
45
|
+
private confirm;
|
|
46
|
+
private cancel;
|
|
47
|
+
/** Escape closes the native dialog; report it as a cancel. */
|
|
48
|
+
private onDialogClose;
|
|
49
|
+
private onDialogClick;
|
|
50
|
+
render(): TemplateResult;
|
|
51
|
+
}
|
|
52
|
+
declare global {
|
|
53
|
+
interface HTMLElementTagNameMap {
|
|
54
|
+
'kt-confirm-dialog': KtConfirmDialog;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { css as f, nothing as c, html as d } from "lit";
|
|
2
|
+
import { query as m, property as r } from "lit/decorators.js";
|
|
3
|
+
import { K as p, d as h } from "../../../chunks/kt-element-CcMLO5e8.js";
|
|
4
|
+
import { e as g } from "../../../chunks/events-Bjl5Zmmq.js";
|
|
5
|
+
import { o as u, c as b, i as y } from "../../../chunks/dialog-CPIfFIlF.js";
|
|
6
|
+
import "../../core/kt-button/kt-button.js";
|
|
7
|
+
var v = Object.defineProperty, a = (i, o, s, k) => {
|
|
8
|
+
for (var e = void 0, n = i.length - 1, l; n >= 0; n--)
|
|
9
|
+
(l = i[n]) && (e = l(o, s, e) || e);
|
|
10
|
+
return e && v(o, s, e), e;
|
|
11
|
+
};
|
|
12
|
+
class t extends p {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments), this.open = !1, this.heading = "Are you sure?", this.message = "", this.confirmLabel = "Confirm", this.cancelLabel = "Cancel", this.variant = "danger";
|
|
15
|
+
}
|
|
16
|
+
static {
|
|
17
|
+
this.styles = [
|
|
18
|
+
p.styles,
|
|
19
|
+
f`
|
|
20
|
+
:host {
|
|
21
|
+
display: contents;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
dialog {
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
gap: var(--gap-modal);
|
|
28
|
+
box-sizing: border-box;
|
|
29
|
+
width: 400px;
|
|
30
|
+
max-width: calc(100vw - 48px);
|
|
31
|
+
padding: var(--padding-modal);
|
|
32
|
+
color: var(--text-body);
|
|
33
|
+
background: var(--surface-card);
|
|
34
|
+
border: var(--border-width) solid var(--border-subtle);
|
|
35
|
+
border-radius: var(--radius-modal);
|
|
36
|
+
transform: translateY(8px);
|
|
37
|
+
opacity: 0;
|
|
38
|
+
transition:
|
|
39
|
+
transform var(--duration-normal) var(--easing-standard),
|
|
40
|
+
opacity var(--duration-normal) var(--easing-standard),
|
|
41
|
+
overlay var(--duration-normal) allow-discrete,
|
|
42
|
+
display var(--duration-normal) allow-discrete;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
dialog[open] {
|
|
46
|
+
transform: translateY(0);
|
|
47
|
+
opacity: 1;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@starting-style {
|
|
51
|
+
dialog[open] {
|
|
52
|
+
transform: translateY(8px);
|
|
53
|
+
opacity: 0;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
dialog::backdrop {
|
|
58
|
+
background: var(--color-backdrop, rgba(0, 0, 0, 0.45));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
h2 {
|
|
62
|
+
margin: 0;
|
|
63
|
+
color: var(--text-body);
|
|
64
|
+
font: var(--font-title-h6);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
p {
|
|
68
|
+
margin: 0;
|
|
69
|
+
color: var(--text-muted);
|
|
70
|
+
font: var(--font-normal-regular);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.actions {
|
|
74
|
+
display: flex;
|
|
75
|
+
justify-content: flex-end;
|
|
76
|
+
gap: var(--gap-button);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@media (prefers-reduced-motion: reduce) {
|
|
80
|
+
dialog {
|
|
81
|
+
transition: none;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
`
|
|
85
|
+
];
|
|
86
|
+
}
|
|
87
|
+
updated(o) {
|
|
88
|
+
o.has("open") && (this.open ? (u(this.dialog), this.cancelButton?.focus()) : b(this.dialog));
|
|
89
|
+
}
|
|
90
|
+
confirm() {
|
|
91
|
+
this.open = !1, g(this, "kt-confirm");
|
|
92
|
+
}
|
|
93
|
+
cancel() {
|
|
94
|
+
this.open = !1, g(this, "kt-cancel");
|
|
95
|
+
}
|
|
96
|
+
/** Escape closes the native dialog; report it as a cancel. */
|
|
97
|
+
onDialogClose() {
|
|
98
|
+
this.open && this.cancel();
|
|
99
|
+
}
|
|
100
|
+
onDialogClick(o) {
|
|
101
|
+
y(this.dialog, o) && this.cancel();
|
|
102
|
+
}
|
|
103
|
+
render() {
|
|
104
|
+
return d`<dialog
|
|
105
|
+
part="dialog"
|
|
106
|
+
role="alertdialog"
|
|
107
|
+
aria-label=${this.heading}
|
|
108
|
+
aria-describedby=${this.message ? "kt-confirm-message" : c}
|
|
109
|
+
@close=${this.onDialogClose}
|
|
110
|
+
@click=${this.onDialogClick}
|
|
111
|
+
>
|
|
112
|
+
<h2>${this.heading}</h2>
|
|
113
|
+
${this.message ? d`<p id="kt-confirm-message">${this.message}</p>` : c}
|
|
114
|
+
<slot></slot>
|
|
115
|
+
|
|
116
|
+
<div part="actions" class="actions">
|
|
117
|
+
<kt-button data-cancel variant="dark" @click=${this.cancel}>${this.cancelLabel}</kt-button>
|
|
118
|
+
<kt-button
|
|
119
|
+
variant=${this.variant === "danger" ? "delete" : "primary"}
|
|
120
|
+
@click=${this.confirm}
|
|
121
|
+
>${this.confirmLabel}</kt-button
|
|
122
|
+
>
|
|
123
|
+
</div>
|
|
124
|
+
</dialog>`;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
a([
|
|
128
|
+
m("dialog")
|
|
129
|
+
], t.prototype, "dialog");
|
|
130
|
+
a([
|
|
131
|
+
m("kt-button[data-cancel]")
|
|
132
|
+
], t.prototype, "cancelButton");
|
|
133
|
+
a([
|
|
134
|
+
r({ type: Boolean, reflect: !0 })
|
|
135
|
+
], t.prototype, "open");
|
|
136
|
+
a([
|
|
137
|
+
r({ type: String })
|
|
138
|
+
], t.prototype, "heading");
|
|
139
|
+
a([
|
|
140
|
+
r({ type: String })
|
|
141
|
+
], t.prototype, "message");
|
|
142
|
+
a([
|
|
143
|
+
r({ type: String, attribute: "confirm-label" })
|
|
144
|
+
], t.prototype, "confirmLabel");
|
|
145
|
+
a([
|
|
146
|
+
r({ type: String, attribute: "cancel-label" })
|
|
147
|
+
], t.prototype, "cancelLabel");
|
|
148
|
+
a([
|
|
149
|
+
r({ type: String, reflect: !0 })
|
|
150
|
+
], t.prototype, "variant");
|
|
151
|
+
h("kt-confirm-dialog", t);
|
|
152
|
+
export {
|
|
153
|
+
t as KtConfirmDialog
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=kt-confirm-dialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kt-confirm-dialog.js","sources":["../../../../src/components/overlays/kt-confirm-dialog/kt-confirm-dialog.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { closeDialog, isBackdropClick, openModal } from '#internal/dialog';\nimport '../../core/kt-button/kt-button.js';\n\nexport type KtConfirmVariant = 'danger' | 'primary';\n\n/**\n * A centred yes/no overlay, for an action worth stopping to think about.\n *\n * Confirmations are for destructive or irreversible work. Editing belongs in a\n * `<kt-side-panel>`, which does not block the page behind it.\n *\n * `role=\"alertdialog\"` and the cancel button takes focus on open, so a stray\n * Enter dismisses rather than confirms.\n *\n * @element kt-confirm-dialog\n *\n * @slot - Extra content between the message and the buttons.\n *\n * @csspart dialog - The `<dialog>`.\n * @csspart actions - The button row.\n *\n * @fires kt-confirm - The confirm button was pressed.\n * @fires kt-cancel - Dismissed, by button, Escape or backdrop.\n *\n * @example\n * ```html\n * <kt-confirm-dialog\n * heading=\"Delete this entity?\"\n * message=\"This action cannot be undone.\"\n * confirm-label=\"Delete\"\n * ></kt-confirm-dialog>\n * ```\n */\nexport class KtConfirmDialog extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: contents;\n }\n\n dialog {\n display: flex;\n flex-direction: column;\n gap: var(--gap-modal);\n box-sizing: border-box;\n width: 400px;\n max-width: calc(100vw - 48px);\n padding: var(--padding-modal);\n color: var(--text-body);\n background: var(--surface-card);\n border: var(--border-width) solid var(--border-subtle);\n border-radius: var(--radius-modal);\n transform: translateY(8px);\n opacity: 0;\n transition:\n transform var(--duration-normal) var(--easing-standard),\n opacity var(--duration-normal) var(--easing-standard),\n overlay var(--duration-normal) allow-discrete,\n display var(--duration-normal) allow-discrete;\n }\n\n dialog[open] {\n transform: translateY(0);\n opacity: 1;\n }\n\n @starting-style {\n dialog[open] {\n transform: translateY(8px);\n opacity: 0;\n }\n }\n\n dialog::backdrop {\n background: var(--color-backdrop, rgba(0, 0, 0, 0.45));\n }\n\n h2 {\n margin: 0;\n color: var(--text-body);\n font: var(--font-title-h6);\n }\n\n p {\n margin: 0;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n }\n\n .actions {\n display: flex;\n justify-content: flex-end;\n gap: var(--gap-button);\n }\n\n @media (prefers-reduced-motion: reduce) {\n dialog {\n transition: none;\n }\n }\n `,\n ];\n\n @query('dialog')\n private dialog!: HTMLDialogElement;\n\n @query('kt-button[data-cancel]')\n private cancelButton!: HTMLElement | null;\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ type: String })\n heading = 'Are you sure?';\n\n @property({ type: String })\n message = '';\n\n @property({ type: String, attribute: 'confirm-label' })\n confirmLabel = 'Confirm';\n\n @property({ type: String, attribute: 'cancel-label' })\n cancelLabel = 'Cancel';\n\n /** `danger` gives the confirm button the solid red treatment. */\n @property({ type: String, reflect: true })\n variant: KtConfirmVariant = 'danger';\n\n override updated(changed: PropertyValues<this>): void {\n if (!changed.has('open')) return;\n\n if (this.open) {\n openModal(this.dialog);\n // Focus lands on Cancel, not Confirm: an Enter meant for whatever was\n // behind the dialog should not delete anything.\n this.cancelButton?.focus();\n } else {\n closeDialog(this.dialog);\n }\n }\n\n private confirm(): void {\n this.open = false;\n emit(this, 'kt-confirm');\n }\n\n private cancel(): void {\n this.open = false;\n emit(this, 'kt-cancel');\n }\n\n /** Escape closes the native dialog; report it as a cancel. */\n private onDialogClose(): void {\n if (this.open) this.cancel();\n }\n\n private onDialogClick(event: MouseEvent): void {\n if (isBackdropClick(this.dialog, event)) this.cancel();\n }\n\n override render(): TemplateResult {\n return html`<dialog\n part=\"dialog\"\n role=\"alertdialog\"\n aria-label=${this.heading}\n aria-describedby=${this.message ? 'kt-confirm-message' : nothing}\n @close=${this.onDialogClose}\n @click=${this.onDialogClick}\n >\n <h2>${this.heading}</h2>\n ${this.message ? html`<p id=\"kt-confirm-message\">${this.message}</p>` : nothing}\n <slot></slot>\n\n <div part=\"actions\" class=\"actions\">\n <kt-button data-cancel variant=\"dark\" @click=${this.cancel}>${this.cancelLabel}</kt-button>\n <kt-button\n variant=${this.variant === 'danger' ? 'delete' : 'primary'}\n @click=${this.confirm}\n >${this.confirmLabel}</kt-button\n >\n </div>\n </dialog>`;\n }\n}\n\ndefineElement('kt-confirm-dialog', KtConfirmDialog);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-confirm-dialog': KtConfirmDialog;\n }\n}\n"],"names":["KtConfirmDialog","KtElement","css","changed","openModal","closeDialog","emit","event","isBackdropClick","html","nothing","__decorateClass","query","property","defineElement"],"mappings":";;;;;;;;;;;AAqCO,MAAMA,UAAwBC,EAAU;AAAA,EAAxC,cAAA;AAAA,UAAA,GAAA,SAAA,GA8EL,KAAA,OAAO,IAGP,KAAA,UAAU,iBAGV,KAAA,UAAU,IAGV,KAAA,eAAe,WAGf,KAAA,cAAc,UAId,KAAA,UAA4B;AAAA,EAAA;AAAA,EA7F5B,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBA,EAAU;AAAA,MACVC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAkEF;AAAA,EA2BS,QAAQC,GAAqC;AACpD,IAAKA,EAAQ,IAAI,MAAM,MAEnB,KAAK,QACPC,EAAU,KAAK,MAAM,GAGrB,KAAK,cAAc,MAAA,KAEnBC,EAAY,KAAK,MAAM;AAAA,EAE3B;AAAA,EAEQ,UAAgB;AACtB,SAAK,OAAO,IACZC,EAAK,MAAM,YAAY;AAAA,EACzB;AAAA,EAEQ,SAAe;AACrB,SAAK,OAAO,IACZA,EAAK,MAAM,WAAW;AAAA,EACxB;AAAA;AAAA,EAGQ,gBAAsB;AAC5B,IAAI,KAAK,QAAM,KAAK,OAAA;AAAA,EACtB;AAAA,EAEQ,cAAcC,GAAyB;AAC7C,IAAIC,EAAgB,KAAK,QAAQD,CAAK,UAAQ,OAAA;AAAA,EAChD;AAAA,EAES,SAAyB;AAChC,WAAOE;AAAA;AAAA;AAAA,mBAGQ,KAAK,OAAO;AAAA,yBACN,KAAK,UAAU,uBAAuBC,CAAO;AAAA,eACvD,KAAK,aAAa;AAAA,eAClB,KAAK,aAAa;AAAA;AAAA,YAErB,KAAK,OAAO;AAAA,QAChB,KAAK,UAAUD,+BAAkC,KAAK,OAAO,SAASC,CAAO;AAAA;AAAA;AAAA;AAAA,uDAI9B,KAAK,MAAM,IAAI,KAAK,WAAW;AAAA;AAAA,oBAElE,KAAK,YAAY,WAAW,WAAW,SAAS;AAAA,mBACjD,KAAK,OAAO;AAAA,aAClB,KAAK,YAAY;AAAA;AAAA;AAAA;AAAA,EAI5B;AACF;AA/EUC,EAAA;AAAA,EADPC,EAAM,QAAQ;AAAA,GAvEJZ,EAwEH,WAAA,QAAA;AAGAW,EAAA;AAAA,EADPC,EAAM,wBAAwB;AAAA,GA1EpBZ,EA2EH,WAAA,cAAA;AAGRW,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GA7E/Bb,EA8EX,WAAA,MAAA;AAGAW,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAhFfb,EAiFX,WAAA,SAAA;AAGAW,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAnFfb,EAoFX,WAAA,SAAA;AAGAW,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,QAAQ,WAAW,iBAAiB;AAAA,GAtF3Cb,EAuFX,WAAA,cAAA;AAGAW,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,QAAQ,WAAW,gBAAgB;AAAA,GAzF1Cb,EA0FX,WAAA,aAAA;AAIAW,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GA7F9Bb,EA8FX,WAAA,SAAA;AA2DFc,EAAc,qBAAqBd,CAAe;"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type TemplateResult } from 'lit';
|
|
2
|
+
import { KtElement } from '#internal/kt-element';
|
|
3
|
+
import { type KtOption } from '#internal/listbox';
|
|
4
|
+
export type KtDropdownPlacement = 'bottom' | 'top';
|
|
5
|
+
/**
|
|
6
|
+
* A panel anchored to a trigger.
|
|
7
|
+
*
|
|
8
|
+
* The generic overlay: pass `options` for a menu, or slot anything into
|
|
9
|
+
* `panel` for arbitrary content. For choosing a value in a form, reach for
|
|
10
|
+
* `<kt-select>` or `<kt-input-menu>` instead — they carry the listbox
|
|
11
|
+
* semantics this one deliberately does not assume.
|
|
12
|
+
*
|
|
13
|
+
* @element kt-dropdown
|
|
14
|
+
*
|
|
15
|
+
* @slot trigger - What opens the panel.
|
|
16
|
+
* @slot panel - Panel contents, when `options` is not used.
|
|
17
|
+
*
|
|
18
|
+
* @csspart trigger - The trigger wrapper.
|
|
19
|
+
* @csspart panel - The floating panel.
|
|
20
|
+
* @csspart option - A menu row.
|
|
21
|
+
*
|
|
22
|
+
* @fires kt-select - A menu row was chosen. `detail: { value, option }`.
|
|
23
|
+
* @fires kt-open - The panel opened.
|
|
24
|
+
* @fires kt-close - The panel closed.
|
|
25
|
+
*/
|
|
26
|
+
export declare class KtDropdown extends KtElement {
|
|
27
|
+
static styles: import("lit").CSSResultGroup[];
|
|
28
|
+
private triggerWrapper;
|
|
29
|
+
private open;
|
|
30
|
+
/** Where the panel actually landed, after checking the room available. */
|
|
31
|
+
private placement;
|
|
32
|
+
/** Menu rows. Leave empty and slot into `panel` for custom content. */
|
|
33
|
+
options: readonly KtOption[];
|
|
34
|
+
/** Marks one row as current. */
|
|
35
|
+
value: string | number | null;
|
|
36
|
+
/** Where to put the panel when there is room on both sides. */
|
|
37
|
+
preferredPlacement: KtDropdownPlacement;
|
|
38
|
+
disabled: boolean;
|
|
39
|
+
emptyText: string;
|
|
40
|
+
/** Whether the panel is showing. */
|
|
41
|
+
get isOpen(): boolean;
|
|
42
|
+
connectedCallback(): void;
|
|
43
|
+
disconnectedCallback(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Flips the panel above the trigger when there is not enough room below,
|
|
46
|
+
* preferring whichever side has more space if neither fits.
|
|
47
|
+
*/
|
|
48
|
+
private reposition;
|
|
49
|
+
private onDocumentPointerDown;
|
|
50
|
+
private onDocumentKeyDown;
|
|
51
|
+
/** Opens the panel. */
|
|
52
|
+
show(): void;
|
|
53
|
+
/** Closes the panel. */
|
|
54
|
+
hide(): void;
|
|
55
|
+
/** Opens or closes it. */
|
|
56
|
+
toggle(): void;
|
|
57
|
+
private choose;
|
|
58
|
+
render(): TemplateResult;
|
|
59
|
+
}
|
|
60
|
+
declare global {
|
|
61
|
+
interface HTMLElementTagNameMap {
|
|
62
|
+
'kt-dropdown': KtDropdown;
|
|
63
|
+
}
|
|
64
|
+
}
|