kanto-ds 1.7.0 → 1.9.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 +26 -14
- package/dist/AGENTS.md +157 -0
- package/dist/cdn/kanto.min.js +4743 -932
- package/dist/chunks/block-Cci-Kff_.js +69 -0
- package/dist/chunks/block-Cci-Kff_.js.map +1 -0
- package/dist/chunks/defaults-yhaR6U65.js +70 -0
- package/dist/chunks/{defaults-Cpeg13O5.js.map → defaults-yhaR6U65.js.map} +1 -1
- package/dist/chunks/heading-DsnZsfg-.js +21 -0
- package/dist/chunks/heading-DsnZsfg-.js.map +1 -0
- package/dist/chunks/{index-TWJzttLX.js → index-1ZFgagWW.js} +37 -12
- package/dist/chunks/index-1ZFgagWW.js.map +1 -0
- package/dist/chunks/indicator-B_Rs8F92.js +49 -0
- package/dist/chunks/indicator-B_Rs8F92.js.map +1 -0
- package/dist/chunks/{kt-calendar-CtwOby1R.js → kt-calendar-SK8eapuy.js} +3 -3
- package/dist/chunks/{kt-calendar-CtwOby1R.js.map → kt-calendar-SK8eapuy.js.map} +1 -1
- package/dist/chunks/kt-color-picker-BoezCAmx.js +365 -0
- package/dist/chunks/kt-color-picker-BoezCAmx.js.map +1 -0
- package/dist/chunks/{kt-element-T0VbIBNp.js → kt-element-DvWtPQ1Y.js} +2 -2
- package/dist/chunks/{kt-element-T0VbIBNp.js.map → kt-element-DvWtPQ1Y.js.map} +1 -1
- package/dist/chunks/motion-ChVUUO7O.js +28 -0
- package/dist/chunks/motion-ChVUUO7O.js.map +1 -0
- package/dist/chunks/numbers-QyecMiSJ.js +9 -0
- package/dist/chunks/numbers-QyecMiSJ.js.map +1 -0
- package/dist/chunks/{segmented-field-BBXR4XFL.js → segmented-field-T_Zo6lc1.js} +2 -2
- package/dist/chunks/{segmented-field-BBXR4XFL.js.map → segmented-field-T_Zo6lc1.js.map} +1 -1
- package/dist/chunks/{typed-date-CPAUNHzr.js → typed-date-CaU0kXoY.js} +2 -2
- package/dist/chunks/{typed-date-CPAUNHzr.js.map → typed-date-CaU0kXoY.js.map} +1 -1
- package/dist/components/blocks/kt-auth-form/kt-auth-form.d.ts +143 -0
- package/dist/components/blocks/kt-auth-form/kt-auth-form.js +368 -0
- package/dist/components/blocks/kt-auth-form/kt-auth-form.js.map +1 -0
- package/dist/components/blocks/kt-blog-post/kt-blog-post.d.ts +75 -0
- package/dist/components/blocks/kt-blog-post/kt-blog-post.js +285 -0
- package/dist/components/blocks/kt-blog-post/kt-blog-post.js.map +1 -0
- package/dist/components/blocks/kt-cta/kt-cta.d.ts +51 -0
- package/dist/components/blocks/kt-cta/kt-cta.js +126 -0
- package/dist/components/blocks/kt-cta/kt-cta.js.map +1 -0
- package/dist/components/blocks/kt-empty-page/kt-empty-page.d.ts +75 -0
- package/dist/components/blocks/kt-empty-page/kt-empty-page.js +245 -0
- package/dist/components/blocks/kt-empty-page/kt-empty-page.js.map +1 -0
- package/dist/components/blocks/kt-error-page/kt-error-page.d.ts +65 -0
- package/dist/components/blocks/kt-error-page/kt-error-page.js +177 -0
- package/dist/components/blocks/kt-error-page/kt-error-page.js.map +1 -0
- package/dist/components/blocks/kt-faq/kt-faq.d.ts +61 -0
- package/dist/components/blocks/kt-faq/kt-faq.js +129 -0
- package/dist/components/blocks/kt-faq/kt-faq.js.map +1 -0
- package/dist/components/blocks/kt-feature-grid/kt-feature-grid.d.ts +59 -0
- package/dist/components/blocks/kt-feature-grid/kt-feature-grid.js +166 -0
- package/dist/components/blocks/kt-feature-grid/kt-feature-grid.js.map +1 -0
- package/dist/components/blocks/kt-hero/kt-hero.d.ts +51 -0
- package/dist/components/blocks/kt-hero/kt-hero.js +138 -0
- package/dist/components/blocks/kt-hero/kt-hero.js.map +1 -0
- package/dist/components/blocks/kt-logo-cloud/kt-logo-cloud.d.ts +46 -0
- package/dist/components/blocks/kt-logo-cloud/kt-logo-cloud.js +100 -0
- package/dist/components/blocks/kt-logo-cloud/kt-logo-cloud.js.map +1 -0
- package/dist/components/blocks/kt-newsletter/kt-newsletter.d.ts +85 -0
- package/dist/components/blocks/kt-newsletter/kt-newsletter.js +247 -0
- package/dist/components/blocks/kt-newsletter/kt-newsletter.js.map +1 -0
- package/dist/components/blocks/kt-post-grid/kt-post-grid.d.ts +73 -0
- package/dist/components/blocks/kt-post-grid/kt-post-grid.js +249 -0
- package/dist/components/blocks/kt-post-grid/kt-post-grid.js.map +1 -0
- package/dist/components/blocks/kt-pricing-table/kt-pricing-table.d.ts +102 -0
- package/dist/components/blocks/kt-pricing-table/kt-pricing-table.js +307 -0
- package/dist/components/blocks/kt-pricing-table/kt-pricing-table.js.map +1 -0
- package/dist/components/blocks/kt-settings-section/kt-settings-section.d.ts +52 -0
- package/dist/components/blocks/kt-settings-section/kt-settings-section.js +158 -0
- package/dist/components/blocks/kt-settings-section/kt-settings-section.js.map +1 -0
- package/dist/components/blocks/kt-testimonials/kt-testimonials.d.ts +56 -0
- package/dist/components/blocks/kt-testimonials/kt-testimonials.js +161 -0
- package/dist/components/blocks/kt-testimonials/kt-testimonials.js.map +1 -0
- package/dist/components/core/kt-avatar/kt-avatar.js +2 -2
- package/dist/components/core/kt-avatar-group/kt-avatar-group.d.ts +42 -0
- package/dist/components/core/kt-avatar-group/kt-avatar-group.js +97 -0
- package/dist/components/core/kt-avatar-group/kt-avatar-group.js.map +1 -0
- package/dist/components/core/kt-badge/kt-badge.js +2 -2
- package/dist/components/core/kt-button/flights.d.ts +27 -0
- package/dist/components/core/kt-button/kt-button.d.ts +52 -1
- package/dist/components/core/kt-button/kt-button.js +353 -77
- package/dist/components/core/kt-button/kt-button.js.map +1 -1
- package/dist/components/core/kt-button/morph.d.ts +27 -0
- package/dist/components/core/kt-card/kt-card.js +1 -1
- package/dist/components/core/kt-code/kt-code.d.ts +2 -1
- package/dist/components/core/kt-code/kt-code.js +52 -37
- package/dist/components/core/kt-code/kt-code.js.map +1 -1
- package/dist/components/core/kt-copy-button/kt-copy-button.d.ts +47 -0
- package/dist/components/core/kt-copy-button/kt-copy-button.js +74 -0
- package/dist/components/core/kt-copy-button/kt-copy-button.js.map +1 -0
- 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.js +2 -2
- package/dist/components/data/kt-chart/kt-chart.js +2 -2
- package/dist/components/data/kt-chat-message/kt-chat-message.d.ts +60 -0
- package/dist/components/data/kt-chat-message/kt-chat-message.js +204 -0
- package/dist/components/data/kt-chat-message/kt-chat-message.js.map +1 -0
- package/dist/components/data/kt-description-list/kt-description-list.d.ts +56 -0
- package/dist/components/data/kt-description-list/kt-description-list.js +120 -0
- package/dist/components/data/kt-description-list/kt-description-list.js.map +1 -0
- package/dist/components/data/kt-meter/kt-meter.js +8 -6
- package/dist/components/data/kt-meter/kt-meter.js.map +1 -1
- package/dist/components/data/kt-pagination/kt-pagination.js +2 -2
- package/dist/components/data/kt-stat/kt-stat.d.ts +3 -1
- package/dist/components/data/kt-stat/kt-stat.js +31 -16
- package/dist/components/data/kt-stat/kt-stat.js.map +1 -1
- package/dist/components/data/kt-table/kt-table.js +2 -2
- package/dist/components/data/kt-timeline/kt-timeline.js +2 -2
- package/dist/components/data/kt-timeline/kt-timeline.js.map +1 -1
- package/dist/components/data/kt-tree/kt-tree.d.ts +69 -0
- package/dist/components/data/kt-tree/kt-tree.js +208 -0
- package/dist/components/data/kt-tree/kt-tree.js.map +1 -0
- package/dist/components/feedback/kt-alert/kt-alert.js +2 -2
- 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 +2 -2
- package/dist/components/feedback/kt-toast-container/kt-toast-container.d.ts +8 -1
- package/dist/components/feedback/kt-toast-container/kt-toast-container.js +65 -26
- package/dist/components/feedback/kt-toast-container/kt-toast-container.js.map +1 -1
- package/dist/components/feedback/kt-tooltip/kt-tooltip.js +1 -1
- package/dist/components/forms/kt-calendar/kt-calendar.js +3 -3
- package/dist/components/forms/kt-checkbox/kt-checkbox.d.ts +2 -0
- package/dist/components/forms/kt-checkbox/kt-checkbox.js +19 -8
- package/dist/components/forms/kt-checkbox/kt-checkbox.js.map +1 -1
- package/dist/components/forms/kt-color-picker/kt-color-picker.d.ts +66 -0
- package/dist/components/forms/kt-color-picker/kt-color-picker.js +14 -0
- package/dist/components/forms/kt-color-picker/kt-color-picker.js.map +1 -0
- package/dist/components/forms/kt-date-input/kt-date-input.js +5 -5
- package/dist/components/forms/kt-date-picker/kt-date-picker.js +4 -4
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +2 -2
- package/dist/components/forms/kt-form/kt-form.js +2 -2
- package/dist/components/forms/kt-input/kt-input.js +2 -2
- package/dist/components/forms/kt-input-menu/kt-input-menu.js +2 -2
- package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
- package/dist/components/forms/kt-multi-select/kt-multi-select.js +2 -2
- package/dist/components/forms/kt-number-input/kt-number-input.d.ts +92 -0
- package/dist/components/forms/kt-number-input/kt-number-input.js +366 -0
- package/dist/components/forms/kt-number-input/kt-number-input.js.map +1 -0
- package/dist/components/forms/kt-otp-input/kt-otp-input.d.ts +74 -0
- package/dist/components/forms/kt-otp-input/kt-otp-input.js +232 -0
- package/dist/components/forms/kt-otp-input/kt-otp-input.js.map +1 -0
- package/dist/components/forms/kt-prompt-input/kt-prompt-input.d.ts +74 -0
- package/dist/components/forms/kt-prompt-input/kt-prompt-input.js +213 -0
- package/dist/components/forms/kt-prompt-input/kt-prompt-input.js.map +1 -0
- package/dist/components/forms/kt-radio-group/kt-radio-group.js +2 -2
- package/dist/components/forms/kt-select/kt-select.js +2 -2
- package/dist/components/forms/kt-slider/kt-slider.d.ts +69 -0
- package/dist/components/forms/kt-slider/kt-slider.js +252 -0
- package/dist/components/forms/kt-slider/kt-slider.js.map +1 -0
- package/dist/components/forms/kt-textarea/kt-textarea.js +2 -2
- package/dist/components/forms/kt-time-input/kt-time-input.js +3 -3
- package/dist/components/forms/kt-toggle/kt-toggle.js +1 -1
- package/dist/components/navigation/kt-app-shell/kt-app-shell.d.ts +85 -0
- package/dist/components/navigation/kt-app-shell/kt-app-shell.js +220 -0
- package/dist/components/navigation/kt-app-shell/kt-app-shell.js.map +1 -0
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +2 -2
- package/dist/components/navigation/kt-footer/kt-footer.d.ts +82 -0
- package/dist/components/navigation/kt-footer/kt-footer.js +220 -0
- package/dist/components/navigation/kt-footer/kt-footer.js.map +1 -0
- package/dist/components/navigation/kt-header/kt-header.js +2 -2
- package/dist/components/navigation/kt-page-header/kt-page-header.js +2 -2
- package/dist/components/navigation/kt-page-header/kt-page-header.js.map +1 -1
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.d.ts +1 -0
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +81 -44
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -1
- package/dist/components/navigation/kt-steps/kt-steps.d.ts +68 -0
- package/dist/components/navigation/kt-steps/kt-steps.js +286 -0
- package/dist/components/navigation/kt-steps/kt-steps.js.map +1 -0
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +3 -3
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js.map +1 -1
- package/dist/components/navigation/kt-tabs/kt-tabs.d.ts +1 -0
- package/dist/components/navigation/kt-tabs/kt-tabs.js +92 -64
- package/dist/components/navigation/kt-tabs/kt-tabs.js.map +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 +2 -2
- package/dist/components/navigation/kt-user-menu/kt-user-menu.d.ts +86 -0
- package/dist/components/navigation/kt-user-menu/kt-user-menu.js +298 -0
- package/dist/components/navigation/kt-user-menu/kt-user-menu.js.map +1 -0
- package/dist/components/overlays/kt-accordion/kt-accordion.d.ts +47 -0
- package/dist/components/overlays/kt-accordion/kt-accordion.js +80 -0
- package/dist/components/overlays/kt-accordion/kt-accordion.js.map +1 -0
- package/dist/components/overlays/kt-collapsible/kt-collapsible.d.ts +17 -1
- package/dist/components/overlays/kt-collapsible/kt-collapsible.js +87 -32
- package/dist/components/overlays/kt-collapsible/kt-collapsible.js.map +1 -1
- package/dist/components/overlays/kt-command-palette/kt-command-palette.d.ts +87 -0
- package/dist/components/overlays/kt-command-palette/kt-command-palette.js +370 -0
- package/dist/components/overlays/kt-command-palette/kt-command-palette.js.map +1 -0
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +2 -2
- package/dist/components/overlays/kt-dropdown/kt-dropdown.js +2 -2
- package/dist/components/overlays/kt-modal/kt-modal.js +2 -2
- package/dist/components/overlays/kt-side-panel/kt-side-panel.js +2 -2
- package/dist/components/overlays/kt-tour/kt-tour.d.ts +77 -0
- package/dist/components/overlays/kt-tour/kt-tour.js +200 -0
- package/dist/components/overlays/kt-tour/kt-tour.js.map +1 -0
- package/dist/custom-elements.json +16427 -8061
- package/dist/docs/kt-accordion.md +49 -0
- package/dist/docs/kt-app-shell.md +89 -0
- package/dist/docs/kt-auth-form.md +111 -0
- package/dist/docs/kt-avatar-group.md +49 -0
- package/dist/docs/kt-blog-post.md +77 -0
- package/dist/docs/kt-button.md +21 -0
- package/dist/docs/kt-chat-message.md +68 -0
- package/dist/docs/kt-color-picker.md +67 -0
- package/dist/docs/kt-command-palette.md +99 -0
- package/dist/docs/kt-copy-button.md +50 -0
- package/dist/docs/kt-cta.md +45 -0
- package/dist/docs/kt-description-list.md +58 -0
- package/dist/docs/kt-empty-page.md +92 -0
- package/dist/docs/kt-error-page.md +64 -0
- package/dist/docs/kt-faq.md +54 -0
- package/dist/docs/kt-feature-grid.md +53 -0
- package/dist/docs/kt-footer.md +115 -0
- package/dist/docs/kt-hero.md +53 -0
- package/dist/docs/kt-logo-cloud.md +41 -0
- package/dist/docs/kt-newsletter.md +69 -0
- package/dist/docs/kt-number-input.md +77 -0
- package/dist/docs/kt-otp-input.md +68 -0
- package/dist/docs/kt-post-grid.md +66 -0
- package/dist/docs/kt-pricing-table.md +101 -0
- package/dist/docs/kt-prompt-input.md +86 -0
- package/dist/docs/kt-settings-section.md +65 -0
- package/dist/docs/kt-slider.md +76 -0
- package/dist/docs/kt-steps.md +79 -0
- package/dist/docs/kt-testimonials.md +52 -0
- package/dist/docs/kt-tour.md +75 -0
- package/dist/docs/kt-tree.md +83 -0
- package/dist/docs/kt-user-menu.md +77 -0
- package/dist/icons/defaults.d.ts +2 -0
- package/dist/icons/index.js +1 -1
- package/dist/index.d.ts +56 -0
- package/dist/index.js +225 -284
- package/dist/index.js.map +1 -1
- package/dist/internal/block.d.ts +23 -0
- package/dist/internal/command-search.d.ts +27 -0
- package/dist/internal/heading.d.ts +8 -0
- package/dist/internal/indicator.d.ts +34 -0
- package/dist/internal/motion.d.ts +25 -0
- package/dist/internal/numbers.d.ts +2 -0
- package/dist/internal/strings.d.ts +36 -0
- package/dist/react/index.d.ts +165 -0
- package/dist/react/index.js +420 -171
- package/dist/react/index.js.map +1 -1
- package/dist/react/jsx.d.ts +128 -1
- package/dist/strings/index.js +1 -1
- package/dist/tokens/base.css +35 -2
- package/dist/vscode.css-custom-data.json +165 -19
- package/dist/vscode.html-custom-data.json +1023 -149
- package/dist/vue/index.d.ts +62 -0
- package/dist/vue/index.js +39 -8
- package/dist/vue/index.js.map +1 -1
- package/dist/web-types.json +3238 -836
- package/package.json +128 -3
- package/dist/chunks/defaults-Cpeg13O5.js +0 -68
- package/dist/chunks/index-TWJzttLX.js.map +0 -1
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { css as c, nothing as r, html as s } from "lit";
|
|
2
|
+
import { property as l, state as g, query as f } from "lit/decorators.js";
|
|
3
|
+
import { classMap as v } from "lit/directives/class-map.js";
|
|
4
|
+
import { K as u, d as b } from "../../../chunks/kt-element-DvWtPQ1Y.js";
|
|
5
|
+
import { u as w, t as y, e as m } from "../../../chunks/events-r51msXNf.js";
|
|
6
|
+
import { F as x, f as k } from "../../../chunks/floating-C9RLa6cZ.js";
|
|
7
|
+
import "../../core/kt-avatar/kt-avatar.js";
|
|
8
|
+
import "../../core/kt-icon/kt-icon.js";
|
|
9
|
+
var $ = Object.defineProperty, n = (p, e, t, h) => {
|
|
10
|
+
for (var a = void 0, i = p.length - 1, d; i >= 0; i--)
|
|
11
|
+
(d = p[i]) && (a = d(e, t, a) || a);
|
|
12
|
+
return a && $(e, t, a), a;
|
|
13
|
+
};
|
|
14
|
+
class o extends u {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments), this.name = "", this.email = "", this.avatar = "", this.items = [], this.showName = !1, this.open = !1, this.menuId = w("kt-user-menu"), this.floating = new x(this, {
|
|
17
|
+
panel: () => this.shadowRoot?.querySelector(".panel"),
|
|
18
|
+
anchor: () => this.trigger,
|
|
19
|
+
align: () => "end"
|
|
20
|
+
}), this.onDocumentPointerDown = (e) => {
|
|
21
|
+
e.composedPath().includes(this) || this.hide(!1);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
static {
|
|
25
|
+
this.styles = [
|
|
26
|
+
u.styles,
|
|
27
|
+
k,
|
|
28
|
+
c`
|
|
29
|
+
:host {
|
|
30
|
+
display: inline-block;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.trigger {
|
|
34
|
+
display: inline-flex;
|
|
35
|
+
gap: var(--gap-button);
|
|
36
|
+
align-items: center;
|
|
37
|
+
padding: 2px;
|
|
38
|
+
color: var(--text-body);
|
|
39
|
+
font: var(--font-normal-medium);
|
|
40
|
+
background: none;
|
|
41
|
+
border: none;
|
|
42
|
+
border-radius: var(--radius-full);
|
|
43
|
+
cursor: pointer;
|
|
44
|
+
}
|
|
45
|
+
:host([show-name]) .trigger {
|
|
46
|
+
padding-inline-end: 10px;
|
|
47
|
+
}
|
|
48
|
+
.trigger:hover {
|
|
49
|
+
background: var(--surface-hover);
|
|
50
|
+
}
|
|
51
|
+
.trigger:focus-visible {
|
|
52
|
+
outline: var(--outline-width) solid var(--color-primary-base);
|
|
53
|
+
outline-offset: 2px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.panel {
|
|
57
|
+
box-sizing: border-box;
|
|
58
|
+
width: 260px;
|
|
59
|
+
padding: var(--padding-expand);
|
|
60
|
+
background: var(--surface-popover);
|
|
61
|
+
border-radius: var(--radius-input);
|
|
62
|
+
opacity: 1;
|
|
63
|
+
transform: none;
|
|
64
|
+
transition:
|
|
65
|
+
opacity var(--duration-fast) var(--easing-standard),
|
|
66
|
+
transform var(--duration-fast) var(--easing-standard);
|
|
67
|
+
}
|
|
68
|
+
@starting-style {
|
|
69
|
+
.panel {
|
|
70
|
+
opacity: 0;
|
|
71
|
+
transform: translateY(-6px);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.who {
|
|
76
|
+
display: flex;
|
|
77
|
+
gap: var(--gap-form);
|
|
78
|
+
align-items: center;
|
|
79
|
+
padding: 8px 8px 12px;
|
|
80
|
+
}
|
|
81
|
+
.who-text {
|
|
82
|
+
display: grid;
|
|
83
|
+
min-width: 0;
|
|
84
|
+
}
|
|
85
|
+
.who-name {
|
|
86
|
+
overflow: hidden;
|
|
87
|
+
color: var(--text-body);
|
|
88
|
+
font: var(--font-normal-medium);
|
|
89
|
+
white-space: nowrap;
|
|
90
|
+
text-overflow: ellipsis;
|
|
91
|
+
}
|
|
92
|
+
.who-email {
|
|
93
|
+
overflow: hidden;
|
|
94
|
+
color: var(--text-muted);
|
|
95
|
+
font: var(--font-normal-small);
|
|
96
|
+
white-space: nowrap;
|
|
97
|
+
text-overflow: ellipsis;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
[role='menu'] {
|
|
101
|
+
display: grid;
|
|
102
|
+
gap: 2px;
|
|
103
|
+
margin: 0;
|
|
104
|
+
padding: 4px 0 0;
|
|
105
|
+
list-style: none;
|
|
106
|
+
border-top: var(--border-width) solid var(--divider-popover);
|
|
107
|
+
}
|
|
108
|
+
[role='separator'] {
|
|
109
|
+
height: var(--border-width);
|
|
110
|
+
margin: 4px 0;
|
|
111
|
+
background: var(--divider-popover);
|
|
112
|
+
}
|
|
113
|
+
.item {
|
|
114
|
+
display: flex;
|
|
115
|
+
gap: 10px;
|
|
116
|
+
align-items: center;
|
|
117
|
+
padding: 8px 10px;
|
|
118
|
+
color: var(--text-body);
|
|
119
|
+
font: var(--font-normal-regular);
|
|
120
|
+
border-radius: var(--radius-input);
|
|
121
|
+
outline: none;
|
|
122
|
+
cursor: pointer;
|
|
123
|
+
}
|
|
124
|
+
.item kt-icon {
|
|
125
|
+
color: var(--text-muted);
|
|
126
|
+
}
|
|
127
|
+
.item:hover,
|
|
128
|
+
.item:focus-visible {
|
|
129
|
+
background: var(--surface-hover);
|
|
130
|
+
}
|
|
131
|
+
.item:focus-visible {
|
|
132
|
+
box-shadow: inset 0 0 0 var(--outline-width) var(--color-primary-base);
|
|
133
|
+
}
|
|
134
|
+
.item.danger,
|
|
135
|
+
.item.danger kt-icon {
|
|
136
|
+
color: var(--color-danger-text);
|
|
137
|
+
}
|
|
138
|
+
.item.disabled {
|
|
139
|
+
color: var(--text-disabled);
|
|
140
|
+
cursor: not-allowed;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.extra:empty {
|
|
144
|
+
display: none;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
@media (prefers-reduced-motion: reduce) {
|
|
148
|
+
.panel {
|
|
149
|
+
transition: none;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
`
|
|
153
|
+
];
|
|
154
|
+
}
|
|
155
|
+
disconnectedCallback() {
|
|
156
|
+
super.disconnectedCallback(), this.listen(!1);
|
|
157
|
+
}
|
|
158
|
+
listen(e) {
|
|
159
|
+
y(e, document, "pointerdown", this.onDocumentPointerDown);
|
|
160
|
+
}
|
|
161
|
+
get menuItems() {
|
|
162
|
+
return [
|
|
163
|
+
...this.shadowRoot?.querySelectorAll(
|
|
164
|
+
'[role="menuitem"]:not([aria-disabled])'
|
|
165
|
+
) ?? []
|
|
166
|
+
];
|
|
167
|
+
}
|
|
168
|
+
/** Opens the menu, focusing its first item, or its last with `from: 'end'`. */
|
|
169
|
+
show(e = "start") {
|
|
170
|
+
this.open || (this.open = !0, m(this, "kt-open")), this.updateComplete.then(() => {
|
|
171
|
+
const t = this.menuItems;
|
|
172
|
+
(e === "end" ? t.at(-1) : t[0])?.focus();
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
/** Closes the menu; the focus goes back to the button unless told otherwise. */
|
|
176
|
+
hide(e = !0) {
|
|
177
|
+
this.open && (this.open = !1, m(this, "kt-close"), e && this.updateComplete.then(() => this.trigger.focus()));
|
|
178
|
+
}
|
|
179
|
+
// `open` is a state, so the map is read untyped.
|
|
180
|
+
updated(e) {
|
|
181
|
+
e.has("open") && this.listen(this.open), this.floating.sync(this.open);
|
|
182
|
+
}
|
|
183
|
+
choose(e) {
|
|
184
|
+
e.disabled || (this.hide(), m(this, "kt-select", { id: e.id, item: e }));
|
|
185
|
+
}
|
|
186
|
+
onTriggerKeyDown(e) {
|
|
187
|
+
(e.key === "ArrowDown" || e.key === "ArrowUp") && (e.preventDefault(), this.show(e.key === "ArrowUp" ? "end" : "start"));
|
|
188
|
+
}
|
|
189
|
+
onMenuKeyDown(e) {
|
|
190
|
+
const t = this.menuItems, h = t.indexOf(e.target), a = (i) => {
|
|
191
|
+
e.preventDefault(), t[(i + t.length) % t.length]?.focus();
|
|
192
|
+
};
|
|
193
|
+
switch (e.key) {
|
|
194
|
+
case "ArrowDown":
|
|
195
|
+
a(h + 1);
|
|
196
|
+
break;
|
|
197
|
+
case "ArrowUp":
|
|
198
|
+
a(h - 1);
|
|
199
|
+
break;
|
|
200
|
+
case "Home":
|
|
201
|
+
a(0);
|
|
202
|
+
break;
|
|
203
|
+
case "End":
|
|
204
|
+
a(t.length - 1);
|
|
205
|
+
break;
|
|
206
|
+
case "Escape":
|
|
207
|
+
e.preventDefault(), this.hide();
|
|
208
|
+
break;
|
|
209
|
+
case "Tab":
|
|
210
|
+
this.hide(!1);
|
|
211
|
+
break;
|
|
212
|
+
case "Enter":
|
|
213
|
+
case " ": {
|
|
214
|
+
e.preventDefault();
|
|
215
|
+
const i = this.items.find(
|
|
216
|
+
(d) => d.id === e.target.dataset.id
|
|
217
|
+
);
|
|
218
|
+
i && this.choose(i);
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
renderItem(e) {
|
|
224
|
+
return s`${e.separator ? s`<li role="separator"></li>` : r}
|
|
225
|
+
<li
|
|
226
|
+
part="item"
|
|
227
|
+
role="menuitem"
|
|
228
|
+
tabindex="-1"
|
|
229
|
+
data-id=${e.id}
|
|
230
|
+
class=${v({ item: !0, danger: !!e.danger, disabled: !!e.disabled })}
|
|
231
|
+
aria-disabled=${e.disabled ? "true" : r}
|
|
232
|
+
@click=${() => this.choose(e)}
|
|
233
|
+
>
|
|
234
|
+
${e.icon ? s`<kt-icon name=${e.icon} size="16"></kt-icon>` : r}
|
|
235
|
+
<span>${e.label}</span>
|
|
236
|
+
</li>`;
|
|
237
|
+
}
|
|
238
|
+
render() {
|
|
239
|
+
return s`<button
|
|
240
|
+
part="trigger"
|
|
241
|
+
class="trigger"
|
|
242
|
+
type="button"
|
|
243
|
+
aria-label=${this.name || r}
|
|
244
|
+
aria-haspopup="menu"
|
|
245
|
+
aria-expanded=${this.open ? "true" : "false"}
|
|
246
|
+
aria-controls=${this.open ? this.menuId : r}
|
|
247
|
+
@click=${() => this.open ? this.hide() : this.show()}
|
|
248
|
+
@keydown=${this.onTriggerKeyDown}
|
|
249
|
+
>
|
|
250
|
+
<kt-avatar name=${this.name} src=${this.avatar || r} size="small"></kt-avatar>
|
|
251
|
+
${this.showName ? s`<span aria-hidden="true">${this.name}</span>` : r}
|
|
252
|
+
</button>
|
|
253
|
+
${this.open ? s`<div part="panel" class="panel floating" popover="manual">
|
|
254
|
+
<div class="who">
|
|
255
|
+
<kt-avatar name=${this.name} src=${this.avatar || r}></kt-avatar>
|
|
256
|
+
<div class="who-text">
|
|
257
|
+
<span class="who-name">${this.name}</span>
|
|
258
|
+
${this.email ? s`<span class="who-email">${this.email}</span>` : r}
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
<ul
|
|
262
|
+
role="menu"
|
|
263
|
+
id=${this.menuId}
|
|
264
|
+
aria-label=${this.name || r}
|
|
265
|
+
@keydown=${this.onMenuKeyDown}
|
|
266
|
+
>
|
|
267
|
+
${this.items.map((e) => this.renderItem(e))}
|
|
268
|
+
</ul>
|
|
269
|
+
<div class="extra"><slot></slot></div>
|
|
270
|
+
</div>` : r}`;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
n([
|
|
274
|
+
l({ type: String })
|
|
275
|
+
], o.prototype, "name");
|
|
276
|
+
n([
|
|
277
|
+
l({ type: String })
|
|
278
|
+
], o.prototype, "email");
|
|
279
|
+
n([
|
|
280
|
+
l({ type: String })
|
|
281
|
+
], o.prototype, "avatar");
|
|
282
|
+
n([
|
|
283
|
+
l({ attribute: !1 })
|
|
284
|
+
], o.prototype, "items");
|
|
285
|
+
n([
|
|
286
|
+
l({ type: Boolean, reflect: !0, attribute: "show-name" })
|
|
287
|
+
], o.prototype, "showName");
|
|
288
|
+
n([
|
|
289
|
+
g()
|
|
290
|
+
], o.prototype, "open");
|
|
291
|
+
n([
|
|
292
|
+
f(".trigger")
|
|
293
|
+
], o.prototype, "trigger");
|
|
294
|
+
b("kt-user-menu", o);
|
|
295
|
+
export {
|
|
296
|
+
o as KtUserMenu
|
|
297
|
+
};
|
|
298
|
+
//# sourceMappingURL=kt-user-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kt-user-menu.js","sources":["../../../../src/components/navigation/kt-user-menu/kt-user-menu.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit, toggleListener, uniqueId } from '#internal/events';\nimport { FloatingController, floatingStyles } from '#internal/floating';\nimport '../../core/kt-avatar/kt-avatar.js';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport interface KtUserMenuItem {\n readonly id: string;\n readonly label: string;\n /** A Lucide icon name, before the label. */\n readonly icon?: string;\n /** A rule above it, setting it apart from the items before. */\n readonly separator?: boolean;\n /** Drawn in the danger colour: sign out, delete the account. */\n readonly danger?: boolean;\n readonly disabled?: boolean;\n}\n\n/**\n * The account menu at the end of an application's header: the person's\n * avatar, and under it who is signed in and what they can do — their profile,\n * their settings, switching workspace, signing out.\n *\n * A menu button, as the WAI-ARIA pattern describes: Enter, Space or the down\n * arrow open it on the first item, the up arrow on the last; the arrows, Home\n * and End move between items; Escape closes it and gives the focus back; Tab\n * or a click outside close it too. The panel is drawn in the top layer, so no\n * overflow clips it.\n *\n * @element kt-user-menu\n *\n * @slot - Under the items: a workspace switcher, a theme toggle, a plan badge.\n *\n * @csspart trigger - The button.\n * @csspart panel - The menu's panel.\n * @csspart item - One item.\n *\n * @fires kt-select - An item was chosen. `detail: { id, item }`.\n * @fires kt-open - The menu opened.\n * @fires kt-close - The menu closed.\n *\n * @example\n * ```html\n * <kt-user-menu name=\"Dana Whitfield\" email=\"dana@northwind.io\"></kt-user-menu>\n * <script>\n * menu.items = [\n * { id: 'profile', label: 'Profile', icon: 'user' },\n * { id: 'signout', label: 'Sign out', separator: true, danger: true },\n * ];\n * </script>\n * ```\n */\nexport class KtUserMenu extends KtElement {\n static override styles = [\n KtElement.styles,\n floatingStyles,\n css`\n :host {\n display: inline-block;\n }\n\n .trigger {\n display: inline-flex;\n gap: var(--gap-button);\n align-items: center;\n padding: 2px;\n color: var(--text-body);\n font: var(--font-normal-medium);\n background: none;\n border: none;\n border-radius: var(--radius-full);\n cursor: pointer;\n }\n :host([show-name]) .trigger {\n padding-inline-end: 10px;\n }\n .trigger:hover {\n background: var(--surface-hover);\n }\n .trigger:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n .panel {\n box-sizing: border-box;\n width: 260px;\n padding: var(--padding-expand);\n background: var(--surface-popover);\n border-radius: var(--radius-input);\n opacity: 1;\n transform: none;\n transition:\n opacity var(--duration-fast) var(--easing-standard),\n transform var(--duration-fast) var(--easing-standard);\n }\n @starting-style {\n .panel {\n opacity: 0;\n transform: translateY(-6px);\n }\n }\n\n .who {\n display: flex;\n gap: var(--gap-form);\n align-items: center;\n padding: 8px 8px 12px;\n }\n .who-text {\n display: grid;\n min-width: 0;\n }\n .who-name {\n overflow: hidden;\n color: var(--text-body);\n font: var(--font-normal-medium);\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n .who-email {\n overflow: hidden;\n color: var(--text-muted);\n font: var(--font-normal-small);\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n [role='menu'] {\n display: grid;\n gap: 2px;\n margin: 0;\n padding: 4px 0 0;\n list-style: none;\n border-top: var(--border-width) solid var(--divider-popover);\n }\n [role='separator'] {\n height: var(--border-width);\n margin: 4px 0;\n background: var(--divider-popover);\n }\n .item {\n display: flex;\n gap: 10px;\n align-items: center;\n padding: 8px 10px;\n color: var(--text-body);\n font: var(--font-normal-regular);\n border-radius: var(--radius-input);\n outline: none;\n cursor: pointer;\n }\n .item kt-icon {\n color: var(--text-muted);\n }\n .item:hover,\n .item:focus-visible {\n background: var(--surface-hover);\n }\n .item:focus-visible {\n box-shadow: inset 0 0 0 var(--outline-width) var(--color-primary-base);\n }\n .item.danger,\n .item.danger kt-icon {\n color: var(--color-danger-text);\n }\n .item.disabled {\n color: var(--text-disabled);\n cursor: not-allowed;\n }\n\n .extra:empty {\n display: none;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .panel {\n transition: none;\n }\n }\n `,\n ];\n\n /** The person signed in: names the button, draws the avatar's initials. */\n @property({ type: String })\n name = '';\n\n /** Under the name in the panel. */\n @property({ type: String })\n email = '';\n\n /** A picture for the avatar. */\n @property({ type: String })\n avatar = '';\n\n /** The menu's items. Set as a property: `menu.items = [...]`. */\n @property({ attribute: false })\n items: readonly KtUserMenuItem[] = [];\n\n /** Shows the name beside the avatar on the button. */\n @property({ type: Boolean, reflect: true, attribute: 'show-name' })\n showName = false;\n\n /** Whether the menu is open. */\n @state() open = false;\n\n @query('.trigger') private trigger!: HTMLButtonElement;\n\n private readonly menuId = uniqueId('kt-user-menu');\n private readonly floating = new FloatingController(this, {\n panel: () => this.shadowRoot?.querySelector<HTMLElement>('.panel'),\n anchor: () => this.trigger,\n align: () => 'end',\n });\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.listen(false);\n }\n\n private listen(on: boolean): void {\n toggleListener(on, document, 'pointerdown', this.onDocumentPointerDown);\n }\n\n private onDocumentPointerDown = (event: Event): void => {\n if (!event.composedPath().includes(this)) this.hide(false);\n };\n\n private get menuItems(): HTMLElement[] {\n return [\n ...(this.shadowRoot?.querySelectorAll<HTMLElement>(\n '[role=\"menuitem\"]:not([aria-disabled])',\n ) ?? []),\n ];\n }\n\n /** Opens the menu, focusing its first item, or its last with `from: 'end'`. */\n show(from: 'start' | 'end' = 'start'): void {\n if (!this.open) {\n this.open = true;\n emit(this, 'kt-open');\n }\n void this.updateComplete.then(() => {\n const items = this.menuItems;\n (from === 'end' ? items.at(-1) : items[0])?.focus();\n });\n }\n\n /** Closes the menu; the focus goes back to the button unless told otherwise. */\n hide(refocus = true): void {\n if (!this.open) return;\n this.open = false;\n emit(this, 'kt-close');\n if (refocus) void this.updateComplete.then(() => this.trigger.focus());\n }\n\n // `open` is a state, so the map is read untyped.\n override updated(changed: PropertyValues): void {\n if (changed.has('open')) this.listen(this.open);\n this.floating.sync(this.open);\n }\n\n private choose(item: KtUserMenuItem): void {\n if (item.disabled) return;\n this.hide();\n emit(this, 'kt-select', { id: item.id, item });\n }\n\n private onTriggerKeyDown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n this.show(event.key === 'ArrowUp' ? 'end' : 'start');\n }\n }\n\n private onMenuKeyDown(event: KeyboardEvent): void {\n const items = this.menuItems;\n const index = items.indexOf(event.target as HTMLElement);\n const go = (to: number) => {\n event.preventDefault();\n items[(to + items.length) % items.length]?.focus();\n };\n switch (event.key) {\n case 'ArrowDown':\n go(index + 1);\n break;\n case 'ArrowUp':\n go(index - 1);\n break;\n case 'Home':\n go(0);\n break;\n case 'End':\n go(items.length - 1);\n break;\n case 'Escape':\n event.preventDefault();\n this.hide();\n break;\n case 'Tab':\n this.hide(false);\n break;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n const item = this.items.find(\n (candidate) => candidate.id === (event.target as HTMLElement).dataset['id'],\n );\n if (item) this.choose(item);\n break;\n }\n }\n }\n\n private renderItem(item: KtUserMenuItem): TemplateResult {\n return html`${item.separator ? html`<li role=\"separator\"></li>` : nothing}\n <li\n part=\"item\"\n role=\"menuitem\"\n tabindex=\"-1\"\n data-id=${item.id}\n class=${classMap({ item: true, danger: Boolean(item.danger), disabled: Boolean(item.disabled) })}\n aria-disabled=${item.disabled ? 'true' : nothing}\n @click=${() => this.choose(item)}\n >\n ${item.icon ? html`<kt-icon name=${item.icon} size=\"16\"></kt-icon>` : nothing}\n <span>${item.label}</span>\n </li>`;\n }\n\n override render(): TemplateResult {\n return html`<button\n part=\"trigger\"\n class=\"trigger\"\n type=\"button\"\n aria-label=${this.name || nothing}\n aria-haspopup=\"menu\"\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-controls=${this.open ? this.menuId : nothing}\n @click=${() => (this.open ? this.hide() : this.show())}\n @keydown=${this.onTriggerKeyDown}\n >\n <kt-avatar name=${this.name} src=${this.avatar || nothing} size=\"small\"></kt-avatar>\n ${this.showName ? html`<span aria-hidden=\"true\">${this.name}</span>` : nothing}\n </button>\n ${\n this.open\n ? html`<div part=\"panel\" class=\"panel floating\" popover=\"manual\">\n <div class=\"who\">\n <kt-avatar name=${this.name} src=${this.avatar || nothing}></kt-avatar>\n <div class=\"who-text\">\n <span class=\"who-name\">${this.name}</span>\n ${this.email ? html`<span class=\"who-email\">${this.email}</span>` : nothing}\n </div>\n </div>\n <ul\n role=\"menu\"\n id=${this.menuId}\n aria-label=${this.name || nothing}\n @keydown=${this.onMenuKeyDown}\n >\n ${this.items.map((item) => this.renderItem(item))}\n </ul>\n <div class=\"extra\"><slot></slot></div>\n </div>`\n : nothing\n }`;\n }\n}\n\ndefineElement('kt-user-menu', KtUserMenu);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-user-menu': KtUserMenu;\n }\n}\n"],"names":["KtUserMenu","KtElement","uniqueId","FloatingController","event","floatingStyles","css","on","toggleListener","from","emit","items","refocus","changed","item","index","go","to","candidate","html","nothing","classMap","__decorateClass","property","state","query","defineElement"],"mappings":";;;;;;;;;;;;;AAuDO,MAAMA,UAAmBC,EAAU;AAAA,EAAnC,cAAA;AAAA,UAAA,GAAA,SAAA,GAqIL,KAAA,OAAO,IAIP,KAAA,QAAQ,IAIR,KAAA,SAAS,IAIT,KAAA,QAAmC,CAAA,GAInC,KAAA,WAAW,IAGF,KAAA,OAAO,IAIhB,KAAiB,SAASC,EAAS,cAAc,GACjD,KAAiB,WAAW,IAAIC,EAAmB,MAAM;AAAA,MACvD,OAAO,MAAM,KAAK,YAAY,cAA2B,QAAQ;AAAA,MACjE,QAAQ,MAAM,KAAK;AAAA,MACnB,OAAO,MAAM;AAAA,IAAA,CACd,GAWD,KAAQ,wBAAwB,CAACC,MAAuB;AACtD,MAAKA,EAAM,eAAe,SAAS,IAAI,KAAG,KAAK,KAAK,EAAK;AAAA,IAC3D;AAAA,EAAA;AAAA,EA7KA,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBH,EAAU;AAAA,MACVI;AAAA,MACAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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,EA6HF;AAAA,EAkCS,uBAA6B;AACpC,UAAM,qBAAA,GACN,KAAK,OAAO,EAAK;AAAA,EACnB;AAAA,EAEQ,OAAOC,GAAmB;AAChC,IAAAC,EAAeD,GAAI,UAAU,eAAe,KAAK,qBAAqB;AAAA,EACxE;AAAA,EAMA,IAAY,YAA2B;AACrC,WAAO;AAAA,MACL,GAAI,KAAK,YAAY;AAAA,QACnB;AAAA,MAAA,KACG,CAAA;AAAA,IAAC;AAAA,EAEV;AAAA;AAAA,EAGA,KAAKE,IAAwB,SAAe;AAC1C,IAAK,KAAK,SACR,KAAK,OAAO,IACZC,EAAK,MAAM,SAAS,IAEjB,KAAK,eAAe,KAAK,MAAM;AAClC,YAAMC,IAAQ,KAAK;AACnB,OAACF,MAAS,QAAQE,EAAM,GAAG,EAAE,IAAIA,EAAM,CAAC,IAAI,MAAA;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,KAAKC,IAAU,IAAY;AACzB,IAAK,KAAK,SACV,KAAK,OAAO,IACZF,EAAK,MAAM,UAAU,GACjBE,KAAc,KAAK,eAAe,KAAK,MAAM,KAAK,QAAQ,OAAO;AAAA,EACvE;AAAA;AAAA,EAGS,QAAQC,GAA+B;AAC9C,IAAIA,EAAQ,IAAI,MAAM,KAAG,KAAK,OAAO,KAAK,IAAI,GAC9C,KAAK,SAAS,KAAK,KAAK,IAAI;AAAA,EAC9B;AAAA,EAEQ,OAAOC,GAA4B;AACzC,IAAIA,EAAK,aACT,KAAK,KAAA,GACLJ,EAAK,MAAM,aAAa,EAAE,IAAII,EAAK,IAAI,MAAAA,GAAM;AAAA,EAC/C;AAAA,EAEQ,iBAAiBV,GAA4B;AACnD,KAAIA,EAAM,QAAQ,eAAeA,EAAM,QAAQ,eAC7CA,EAAM,eAAA,GACN,KAAK,KAAKA,EAAM,QAAQ,YAAY,QAAQ,OAAO;AAAA,EAEvD;AAAA,EAEQ,cAAcA,GAA4B;AAChD,UAAMO,IAAQ,KAAK,WACbI,IAAQJ,EAAM,QAAQP,EAAM,MAAqB,GACjDY,IAAK,CAACC,MAAe;AACzB,MAAAb,EAAM,eAAA,GACNO,GAAOM,IAAKN,EAAM,UAAUA,EAAM,MAAM,GAAG,MAAA;AAAA,IAC7C;AACA,YAAQP,EAAM,KAAA;AAAA,MACZ,KAAK;AACH,QAAAY,EAAGD,IAAQ,CAAC;AACZ;AAAA,MACF,KAAK;AACH,QAAAC,EAAGD,IAAQ,CAAC;AACZ;AAAA,MACF,KAAK;AACH,QAAAC,EAAG,CAAC;AACJ;AAAA,MACF,KAAK;AACH,QAAAA,EAAGL,EAAM,SAAS,CAAC;AACnB;AAAA,MACF,KAAK;AACH,QAAAP,EAAM,eAAA,GACN,KAAK,KAAA;AACL;AAAA,MACF,KAAK;AACH,aAAK,KAAK,EAAK;AACf;AAAA,MACF,KAAK;AAAA,MACL,KAAK,KAAK;AACR,QAAAA,EAAM,eAAA;AACN,cAAMU,IAAO,KAAK,MAAM;AAAA,UACtB,CAACI,MAAcA,EAAU,OAAQd,EAAM,OAAuB,QAAQ;AAAA,QAAI;AAE5E,QAAIU,KAAM,KAAK,OAAOA,CAAI;AAC1B;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,WAAWA,GAAsC;AACvD,WAAOK,IAAOL,EAAK,YAAYK,gCAAmCC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,kBAK3DN,EAAK,EAAE;AAAA,gBACTO,EAAS,EAAE,MAAM,IAAM,QAAQ,EAAQP,EAAK,QAAS,UAAU,EAAQA,EAAK,SAAQ,CAAG,CAAC;AAAA,wBAChFA,EAAK,WAAW,SAASM,CAAO;AAAA,iBACvC,MAAM,KAAK,OAAON,CAAI,CAAC;AAAA;AAAA,UAE9BA,EAAK,OAAOK,kBAAqBL,EAAK,IAAI,0BAA0BM,CAAO;AAAA,gBACrEN,EAAK,KAAK;AAAA;AAAA,EAExB;AAAA,EAES,SAAyB;AAChC,WAAOK;AAAA;AAAA;AAAA;AAAA,qBAIU,KAAK,QAAQC,CAAO;AAAA;AAAA,wBAEjB,KAAK,OAAO,SAAS,OAAO;AAAA,wBAC5B,KAAK,OAAO,KAAK,SAASA,CAAO;AAAA,iBACxC,MAAO,KAAK,OAAO,KAAK,SAAS,KAAK,MAAO;AAAA,mBAC3C,KAAK,gBAAgB;AAAA;AAAA,0BAEd,KAAK,IAAI,QAAQ,KAAK,UAAUA,CAAO;AAAA,UACvD,KAAK,WAAWD,6BAAgC,KAAK,IAAI,YAAYC,CAAO;AAAA;AAAA,QAG9E,KAAK,OACDD;AAAA;AAAA,kCAEsB,KAAK,IAAI,QAAQ,KAAK,UAAUC,CAAO;AAAA;AAAA,2CAE9B,KAAK,IAAI;AAAA,oBAChC,KAAK,QAAQD,4BAA+B,KAAK,KAAK,YAAYC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKxE,KAAK,MAAM;AAAA,6BACH,KAAK,QAAQA,CAAO;AAAA,2BACtB,KAAK,aAAa;AAAA;AAAA,kBAE3B,KAAK,MAAM,IAAI,CAACN,MAAS,KAAK,WAAWA,CAAI,CAAC,CAAC;AAAA;AAAA;AAAA,sBAIrDM,CACN;AAAA,EACJ;AACF;AAvLEE,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GApIfvB,EAqIX,WAAA,MAAA;AAIAsB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAxIfvB,EAyIX,WAAA,OAAA;AAIAsB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA5IfvB,EA6IX,WAAA,QAAA;AAIAsB,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAhJnBvB,EAiJX,WAAA,OAAA;AAIAsB,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,aAAa;AAAA,GApJvDvB,EAqJX,WAAA,UAAA;AAGSsB,EAAA;AAAA,EAARE,EAAA;AAAM,GAxJIxB,EAwJF,WAAA,MAAA;AAEkBsB,EAAA;AAAA,EAA1BG,EAAM,UAAU;AAAA,GA1JNzB,EA0JgB,WAAA,SAAA;AAoK7B0B,EAAc,gBAAgB1B,CAAU;"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type TemplateResult } from 'lit';
|
|
2
|
+
import { KtElement } from '#internal/kt-element';
|
|
3
|
+
import type { KtCollapsible } from '../kt-collapsible/kt-collapsible.js';
|
|
4
|
+
/**
|
|
5
|
+
* A set of `kt-collapsible` sections that open one at a time: opening one
|
|
6
|
+
* folds the one that was open, so the page stays the length of one answer.
|
|
7
|
+
* `multiple` lets each open on its own.
|
|
8
|
+
*
|
|
9
|
+
* The arrows, Home and End move between the sections' summaries, as the
|
|
10
|
+
* WAI-ARIA accordion pattern describes; Enter and Space open them, as they
|
|
11
|
+
* always do.
|
|
12
|
+
*
|
|
13
|
+
* @element kt-accordion
|
|
14
|
+
*
|
|
15
|
+
* @slot - The `kt-collapsible` sections.
|
|
16
|
+
*
|
|
17
|
+
* @fires kt-change - A section opened or closed. `detail: { open }`, the indexes of the open sections.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```html
|
|
21
|
+
* <kt-accordion>
|
|
22
|
+
* <kt-collapsible heading="Shipping">Three to five days.</kt-collapsible>
|
|
23
|
+
* <kt-collapsible heading="Returns">Thirty days, no questions.</kt-collapsible>
|
|
24
|
+
* </kt-accordion>
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare class KtAccordion extends KtElement {
|
|
28
|
+
static styles: import("lit").CSSResultGroup[];
|
|
29
|
+
/** Lets each section open on its own, instead of one at a time. */
|
|
30
|
+
multiple: boolean;
|
|
31
|
+
connectedCallback(): void;
|
|
32
|
+
disconnectedCallback(): void;
|
|
33
|
+
/** The sections, in order: the direct `kt-collapsible` children. */
|
|
34
|
+
get sections(): KtCollapsible[];
|
|
35
|
+
/** The first slotchange can land after the first render; settle once directly as well. */
|
|
36
|
+
firstUpdated(): void;
|
|
37
|
+
/** One open at a time: of several opened in the markup, the first stays. */
|
|
38
|
+
private settle;
|
|
39
|
+
private onToggle;
|
|
40
|
+
private onKeyDown;
|
|
41
|
+
render(): TemplateResult;
|
|
42
|
+
}
|
|
43
|
+
declare global {
|
|
44
|
+
interface HTMLElementTagNameMap {
|
|
45
|
+
'kt-accordion': KtAccordion;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { css as a, html as h } from "lit";
|
|
2
|
+
import { property as d } from "lit/decorators.js";
|
|
3
|
+
import { K as l, d as p } from "../../../chunks/kt-element-DvWtPQ1Y.js";
|
|
4
|
+
import { e as f } from "../../../chunks/events-r51msXNf.js";
|
|
5
|
+
var m = Object.defineProperty, u = (i, e, o, s) => {
|
|
6
|
+
for (var t = void 0, n = i.length - 1, r; n >= 0; n--)
|
|
7
|
+
(r = i[n]) && (t = r(e, o, t) || t);
|
|
8
|
+
return t && m(e, o, t), t;
|
|
9
|
+
};
|
|
10
|
+
class c extends l {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments), this.multiple = !1, this.onToggle = (e) => {
|
|
13
|
+
const o = e.target;
|
|
14
|
+
if (o.parentElement !== this) return;
|
|
15
|
+
if (!this.multiple && o.open)
|
|
16
|
+
for (const t of this.sections) t !== o && (t.open = !1);
|
|
17
|
+
const s = this.sections.flatMap((t, n) => t.open ? [n] : []);
|
|
18
|
+
f(this, "kt-change", { open: s });
|
|
19
|
+
}, this.onKeyDown = (e) => {
|
|
20
|
+
const o = e.target;
|
|
21
|
+
if (o.parentElement !== this || e.composedPath()[0].localName !== "summary")
|
|
22
|
+
return;
|
|
23
|
+
const s = this.sections, t = s.indexOf(o), n = {
|
|
24
|
+
ArrowDown: (t + 1) % s.length,
|
|
25
|
+
ArrowUp: (t - 1 + s.length) % s.length,
|
|
26
|
+
Home: 0,
|
|
27
|
+
End: s.length - 1
|
|
28
|
+
}[e.key];
|
|
29
|
+
n !== void 0 && (e.preventDefault(), s[n]?.focus());
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
static {
|
|
33
|
+
this.styles = [
|
|
34
|
+
l.styles,
|
|
35
|
+
a`
|
|
36
|
+
:host {
|
|
37
|
+
display: block;
|
|
38
|
+
}
|
|
39
|
+
/* The sections' rules run between them; one along the top closes the set. */
|
|
40
|
+
::slotted(kt-collapsible:first-child) {
|
|
41
|
+
border-top: var(--border-width) solid var(--border-subtle);
|
|
42
|
+
}
|
|
43
|
+
`
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
connectedCallback() {
|
|
47
|
+
super.connectedCallback(), this.addEventListener("kt-toggle", this.onToggle), this.addEventListener("keydown", this.onKeyDown);
|
|
48
|
+
}
|
|
49
|
+
disconnectedCallback() {
|
|
50
|
+
super.disconnectedCallback(), this.removeEventListener("kt-toggle", this.onToggle), this.removeEventListener("keydown", this.onKeyDown);
|
|
51
|
+
}
|
|
52
|
+
/** The sections, in order: the direct `kt-collapsible` children. */
|
|
53
|
+
get sections() {
|
|
54
|
+
return [...this.children].filter(
|
|
55
|
+
(e) => e.localName === "kt-collapsible"
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
/** The first slotchange can land after the first render; settle once directly as well. */
|
|
59
|
+
firstUpdated() {
|
|
60
|
+
this.settle();
|
|
61
|
+
}
|
|
62
|
+
/** One open at a time: of several opened in the markup, the first stays. */
|
|
63
|
+
settle() {
|
|
64
|
+
if (this.multiple) return;
|
|
65
|
+
let e = !1;
|
|
66
|
+
for (const o of this.sections)
|
|
67
|
+
o.open && (e && (o.open = !1), e = !0);
|
|
68
|
+
}
|
|
69
|
+
render() {
|
|
70
|
+
return h`<slot @slotchange=${() => this.settle()}></slot>`;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
u([
|
|
74
|
+
d({ type: Boolean, reflect: !0 })
|
|
75
|
+
], c.prototype, "multiple");
|
|
76
|
+
p("kt-accordion", c);
|
|
77
|
+
export {
|
|
78
|
+
c as KtAccordion
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=kt-accordion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kt-accordion.js","sources":["../../../../src/components/overlays/kt-accordion/kt-accordion.ts"],"sourcesContent":["import { css, html, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport type { KtCollapsible } from '../kt-collapsible/kt-collapsible.js';\n\n/**\n * A set of `kt-collapsible` sections that open one at a time: opening one\n * folds the one that was open, so the page stays the length of one answer.\n * `multiple` lets each open on its own.\n *\n * The arrows, Home and End move between the sections' summaries, as the\n * WAI-ARIA accordion pattern describes; Enter and Space open them, as they\n * always do.\n *\n * @element kt-accordion\n *\n * @slot - The `kt-collapsible` sections.\n *\n * @fires kt-change - A section opened or closed. `detail: { open }`, the indexes of the open sections.\n *\n * @example\n * ```html\n * <kt-accordion>\n * <kt-collapsible heading=\"Shipping\">Three to five days.</kt-collapsible>\n * <kt-collapsible heading=\"Returns\">Thirty days, no questions.</kt-collapsible>\n * </kt-accordion>\n * ```\n */\nexport class KtAccordion extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n /* The sections' rules run between them; one along the top closes the set. */\n ::slotted(kt-collapsible:first-child) {\n border-top: var(--border-width) solid var(--border-subtle);\n }\n `,\n ];\n\n /** Lets each section open on its own, instead of one at a time. */\n @property({ type: Boolean, reflect: true })\n multiple = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('kt-toggle', this.onToggle);\n this.addEventListener('keydown', this.onKeyDown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('kt-toggle', this.onToggle);\n this.removeEventListener('keydown', this.onKeyDown);\n }\n\n /** The sections, in order: the direct `kt-collapsible` children. */\n get sections(): KtCollapsible[] {\n return [...this.children].filter(\n (child): child is KtCollapsible => child.localName === 'kt-collapsible',\n );\n }\n\n /** The first slotchange can land after the first render; settle once directly as well. */\n override firstUpdated(): void {\n this.settle();\n }\n\n /** One open at a time: of several opened in the markup, the first stays. */\n private settle(): void {\n if (this.multiple) return;\n let seen = false;\n for (const section of this.sections) {\n if (!section.open) continue;\n if (seen) section.open = false;\n seen = true;\n }\n }\n\n private onToggle = (event: Event): void => {\n const opened = event.target as KtCollapsible;\n if (opened.parentElement !== this) return;\n if (!this.multiple && opened.open) {\n for (const section of this.sections) if (section !== opened) section.open = false;\n }\n const open = this.sections.flatMap((section, index) => (section.open ? [index] : []));\n emit(this, 'kt-change', { open });\n };\n\n private onKeyDown = (event: KeyboardEvent): void => {\n const from = event.target as Element;\n // From a section's summary only: keys inside its content are its own.\n if (\n from.parentElement !== this ||\n (event.composedPath()[0] as Element).localName !== 'summary'\n ) {\n return;\n }\n const sections = this.sections;\n const index = sections.indexOf(from as KtCollapsible);\n const to = {\n ArrowDown: (index + 1) % sections.length,\n ArrowUp: (index - 1 + sections.length) % sections.length,\n Home: 0,\n End: sections.length - 1,\n }[event.key];\n if (to === undefined) return;\n event.preventDefault();\n sections[to]?.focus();\n };\n\n override render(): TemplateResult {\n return html`<slot @slotchange=${() => this.settle()}></slot>`;\n }\n}\n\ndefineElement('kt-accordion', KtAccordion);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-accordion': KtAccordion;\n }\n}\n"],"names":["KtAccordion","KtElement","event","opened","section","open","index","emit","from","sections","to","css","child","seen","html","__decorateClass","property","defineElement"],"mappings":";;;;;;;;;AA6BO,MAAMA,UAAoBC,EAAU;AAAA,EAApC,cAAA;AAAA,UAAA,GAAA,SAAA,GAgBL,KAAA,WAAW,IAqCX,KAAQ,WAAW,CAACC,MAAuB;AACzC,YAAMC,IAASD,EAAM;AACrB,UAAIC,EAAO,kBAAkB,KAAM;AACnC,UAAI,CAAC,KAAK,YAAYA,EAAO;AAC3B,mBAAWC,KAAW,KAAK,UAAcA,MAAYD,QAAgB,OAAO;AAE9E,YAAME,IAAO,KAAK,SAAS,QAAQ,CAACD,GAASE,MAAWF,EAAQ,OAAO,CAACE,CAAK,IAAI,CAAA,CAAG;AACpF,MAAAC,EAAK,MAAM,aAAa,EAAE,MAAAF,EAAA,CAAM;AAAA,IAClC,GAEA,KAAQ,YAAY,CAACH,MAA+B;AAClD,YAAMM,IAAON,EAAM;AAEnB,UACEM,EAAK,kBAAkB,QACtBN,EAAM,eAAe,CAAC,EAAc,cAAc;AAEnD;AAEF,YAAMO,IAAW,KAAK,UAChBH,IAAQG,EAAS,QAAQD,CAAqB,GAC9CE,IAAK;AAAA,QACT,YAAYJ,IAAQ,KAAKG,EAAS;AAAA,QAClC,UAAUH,IAAQ,IAAIG,EAAS,UAAUA,EAAS;AAAA,QAClD,MAAM;AAAA,QACN,KAAKA,EAAS,SAAS;AAAA,MAAA,EACvBP,EAAM,GAAG;AACX,MAAIQ,MAAO,WACXR,EAAM,eAAA,GACNO,EAASC,CAAE,GAAG,MAAA;AAAA,IAChB;AAAA,EAAA;AAAA,EAlFA,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBT,EAAU;AAAA,MACVU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EASF;AAAA,EAMS,oBAA0B;AACjC,UAAM,kBAAA,GACN,KAAK,iBAAiB,aAAa,KAAK,QAAQ,GAChD,KAAK,iBAAiB,WAAW,KAAK,SAAS;AAAA,EACjD;AAAA,EAES,uBAA6B;AACpC,UAAM,qBAAA,GACN,KAAK,oBAAoB,aAAa,KAAK,QAAQ,GACnD,KAAK,oBAAoB,WAAW,KAAK,SAAS;AAAA,EACpD;AAAA;AAAA,EAGA,IAAI,WAA4B;AAC9B,WAAO,CAAC,GAAG,KAAK,QAAQ,EAAE;AAAA,MACxB,CAACC,MAAkCA,EAAM,cAAc;AAAA,IAAA;AAAA,EAE3D;AAAA;AAAA,EAGS,eAAqB;AAC5B,SAAK,OAAA;AAAA,EACP;AAAA;AAAA,EAGQ,SAAe;AACrB,QAAI,KAAK,SAAU;AACnB,QAAIC,IAAO;AACX,eAAWT,KAAW,KAAK;AACzB,MAAKA,EAAQ,SACTS,QAAc,OAAO,KACzBA,IAAO;AAAA,EAEX;AAAA,EAkCS,SAAyB;AAChC,WAAOC,sBAAyB,MAAM,KAAK,OAAA,CAAQ;AAAA,EACrD;AACF;AAxEEC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAf/BhB,EAgBX,WAAA,UAAA;AA0EFiB,EAAc,gBAAgBjB,CAAW;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type TemplateResult } from 'lit';
|
|
1
|
+
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
2
2
|
import { KtElement } from '#internal/kt-element';
|
|
3
3
|
import '../../core/kt-icon/kt-icon.js';
|
|
4
4
|
/**
|
|
@@ -8,6 +8,11 @@ import '../../core/kt-icon/kt-icon.js';
|
|
|
8
8
|
* survives find-in-page — the browser opens a closed section to reveal a match —
|
|
9
9
|
* and needs no ARIA of its own.
|
|
10
10
|
*
|
|
11
|
+
* Opening unfolds the content to its height and closing folds it away, in
|
|
12
|
+
* every browser: the details stays open until the fold is done, and a click
|
|
13
|
+
* half-way turns back from where it is. Not on the first render, and not
|
|
14
|
+
* under reduced motion.
|
|
15
|
+
*
|
|
11
16
|
* @element kt-collapsible
|
|
12
17
|
*
|
|
13
18
|
* @slot - The contents.
|
|
@@ -32,6 +37,17 @@ export declare class KtCollapsible extends KtElement {
|
|
|
32
37
|
heading: string;
|
|
33
38
|
/** Drops the bottom rule, for a collapsible that is not part of a list. */
|
|
34
39
|
plain: boolean;
|
|
40
|
+
/** Moves the focus to the summary, the control a person reaches it by. */
|
|
41
|
+
focus(options?: FocusOptions): void;
|
|
42
|
+
/** Closing, with the details kept open until the content has folded away. */
|
|
43
|
+
private folding;
|
|
44
|
+
private fold;
|
|
45
|
+
/** The summary opens and closes it here, so a close can wait for the fold. */
|
|
46
|
+
private onSummaryClick;
|
|
47
|
+
willUpdate(changed: PropertyValues<this>): void;
|
|
48
|
+
updated(changed: PropertyValues<this>): void;
|
|
49
|
+
/** Moves the content's height to its own (opening) or to nothing (closing), from where it is. */
|
|
50
|
+
private animateFold;
|
|
35
51
|
private onToggle;
|
|
36
52
|
render(): TemplateResult;
|
|
37
53
|
}
|
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
import { css as
|
|
2
|
-
import { property as
|
|
3
|
-
import { K as p, d as
|
|
4
|
-
import { e as
|
|
1
|
+
import { css as u, nothing as g, html as y } from "lit";
|
|
2
|
+
import { property as h, state as v } from "lit/decorators.js";
|
|
3
|
+
import { K as p, d as b } from "../../../chunks/kt-element-DvWtPQ1Y.js";
|
|
4
|
+
import { e as c } from "../../../chunks/events-r51msXNf.js";
|
|
5
|
+
import { d as k, p as w } from "../../../chunks/motion-ChVUUO7O.js";
|
|
5
6
|
import "../../core/kt-icon/kt-icon.js";
|
|
6
|
-
var
|
|
7
|
-
for (var
|
|
8
|
-
(
|
|
9
|
-
return
|
|
7
|
+
var x = Object.defineProperty, l = (d, t, e, a) => {
|
|
8
|
+
for (var o = void 0, i = d.length - 1, s; i >= 0; i--)
|
|
9
|
+
(s = d[i]) && (o = s(t, e, o) || o);
|
|
10
|
+
return o && x(t, e, o), o;
|
|
10
11
|
};
|
|
11
|
-
class
|
|
12
|
+
class n extends p {
|
|
12
13
|
constructor() {
|
|
13
|
-
super(...arguments), this.open = !1, this.heading = "", this.plain = !1;
|
|
14
|
+
super(...arguments), this.open = !1, this.heading = "", this.plain = !1, this.folding = !1, this.fold = null;
|
|
14
15
|
}
|
|
15
16
|
static {
|
|
16
17
|
this.styles = [
|
|
17
18
|
p.styles,
|
|
18
|
-
|
|
19
|
+
u`
|
|
19
20
|
:host {
|
|
20
21
|
display: block;
|
|
21
22
|
}
|
|
@@ -58,10 +59,14 @@ class r extends p {
|
|
|
58
59
|
display: inline-flex;
|
|
59
60
|
flex: none;
|
|
60
61
|
color: var(--text-muted);
|
|
61
|
-
|
|
62
|
+
/* Turns with the fold, as long, overshooting a touch before it
|
|
63
|
+
settles — so it reads as moving, not as swapped. */
|
|
64
|
+
transition: transform var(--duration-normal) cubic-bezier(0.34, 1.4, 0.64, 1);
|
|
62
65
|
}
|
|
63
66
|
|
|
64
|
-
details
|
|
67
|
+
/* Follows what was asked, not the details, which stays open while
|
|
68
|
+
the content folds: the chevron turns back at the click. */
|
|
69
|
+
:host([open]) .chevron {
|
|
65
70
|
transform: rotate(90deg);
|
|
66
71
|
}
|
|
67
72
|
|
|
@@ -70,38 +75,88 @@ class r extends p {
|
|
|
70
75
|
min-width: 0;
|
|
71
76
|
}
|
|
72
77
|
|
|
78
|
+
/* The fold animates .content, which has no padding of its own: the
|
|
79
|
+
space sits inside it, so a height of nothing is nothing. */
|
|
73
80
|
.content {
|
|
74
|
-
padding: 0 0 16px;
|
|
75
81
|
color: var(--text-muted);
|
|
76
82
|
}
|
|
83
|
+
.inner {
|
|
84
|
+
padding: 0 0 16px;
|
|
85
|
+
}
|
|
77
86
|
`
|
|
78
87
|
];
|
|
79
88
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
89
|
+
/** Moves the focus to the summary, the control a person reaches it by. */
|
|
90
|
+
focus(t) {
|
|
91
|
+
this.shadowRoot?.querySelector("summary")?.focus(t);
|
|
92
|
+
}
|
|
93
|
+
/** The summary opens and closes it here, so a close can wait for the fold. */
|
|
94
|
+
onSummaryClick(t) {
|
|
95
|
+
t.preventDefault(), this.open = !this.open, c(this, "kt-toggle", { open: this.open });
|
|
96
|
+
}
|
|
97
|
+
willUpdate(t) {
|
|
98
|
+
t.has("open") && this.hasUpdated && !this.open && k(this, "--duration-normal") > 0 && (this.folding = !0);
|
|
99
|
+
}
|
|
100
|
+
updated(t) {
|
|
101
|
+
t.has("open") && t.get("open") !== void 0 && this.animateFold(this.open);
|
|
102
|
+
}
|
|
103
|
+
/** Moves the content's height to its own (opening) or to nothing (closing), from where it is. */
|
|
104
|
+
animateFold(t) {
|
|
105
|
+
const e = this.renderRoot.querySelector(".content");
|
|
106
|
+
if (!e) return;
|
|
107
|
+
const a = this.fold, o = a ? e.getBoundingClientRect().height : t ? 0 : null, i = a ? Number(getComputedStyle(e).opacity) : t ? 0 : 1;
|
|
108
|
+
a?.cancel();
|
|
109
|
+
const s = e.getBoundingClientRect().height, f = o ?? s, m = t ? s : 0, r = w(
|
|
110
|
+
e,
|
|
111
|
+
[
|
|
112
|
+
{ height: `${f}px`, opacity: i, overflow: "clip" },
|
|
113
|
+
{ height: `${m}px`, opacity: t ? 1 : 0, overflow: "clip" }
|
|
114
|
+
],
|
|
115
|
+
"--duration-normal",
|
|
116
|
+
"kt-collapsible-fold"
|
|
117
|
+
);
|
|
118
|
+
if (this.fold = r, !r) {
|
|
119
|
+
this.folding = !1;
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
r.finished.then(
|
|
123
|
+
() => {
|
|
124
|
+
this.fold === r && (this.fold = null, t || (this.folding = !1));
|
|
125
|
+
},
|
|
126
|
+
() => {
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
onToggle(t) {
|
|
131
|
+
const e = t.target;
|
|
132
|
+
e.open !== (this.open || this.folding) && (this.open = e.open, c(this, "kt-toggle", { open: this.open }));
|
|
83
133
|
}
|
|
84
134
|
render() {
|
|
85
|
-
return
|
|
86
|
-
<summary part="summary">
|
|
135
|
+
return y`<details part="base" ?open=${this.open || this.folding} @toggle=${this.onToggle}>
|
|
136
|
+
<summary part="summary" @click=${this.onSummaryClick}>
|
|
87
137
|
<span class="chevron"><kt-icon name="chevron-right" size="16"></kt-icon></span>
|
|
88
|
-
<span class="label"><slot name="summary">${this.heading ||
|
|
138
|
+
<span class="label"><slot name="summary">${this.heading || g}</slot></span>
|
|
89
139
|
</summary>
|
|
90
|
-
<div part="content" class="content"
|
|
140
|
+
<div part="content" class="content">
|
|
141
|
+
<div class="inner"><slot></slot></div>
|
|
142
|
+
</div>
|
|
91
143
|
</details>`;
|
|
92
144
|
}
|
|
93
145
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
],
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
],
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
],
|
|
103
|
-
|
|
146
|
+
l([
|
|
147
|
+
h({ type: Boolean, reflect: !0 })
|
|
148
|
+
], n.prototype, "open");
|
|
149
|
+
l([
|
|
150
|
+
h({ type: String })
|
|
151
|
+
], n.prototype, "heading");
|
|
152
|
+
l([
|
|
153
|
+
h({ type: Boolean, reflect: !0 })
|
|
154
|
+
], n.prototype, "plain");
|
|
155
|
+
l([
|
|
156
|
+
v()
|
|
157
|
+
], n.prototype, "folding");
|
|
158
|
+
b("kt-collapsible", n);
|
|
104
159
|
export {
|
|
105
|
-
|
|
160
|
+
n as KtCollapsible
|
|
106
161
|
};
|
|
107
162
|
//# sourceMappingURL=kt-collapsible.js.map
|