kanto-ds 1.4.0 → 1.5.2
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 +10 -10
- package/dist/chunks/{defaults-BwgjMcww.js → defaults-CFrjqae2.js} +22 -21
- package/dist/chunks/{defaults-BwgjMcww.js.map → defaults-CFrjqae2.js.map} +1 -1
- package/dist/chunks/events-r51msXNf.js +22 -0
- package/dist/chunks/{events-Bjl5Zmmq.js.map → events-r51msXNf.js.map} +1 -1
- package/dist/chunks/floating-B7_Dahpn.js +54 -0
- package/dist/chunks/floating-B7_Dahpn.js.map +1 -0
- package/dist/chunks/{form-control-CxjBTt1c.js → form-control-B74_EHtG.js} +7 -7
- package/dist/chunks/form-control-B74_EHtG.js.map +1 -0
- package/dist/chunks/{index-DSSLJirw.js → index-STEEvEP7.js} +24 -12
- package/dist/chunks/index-STEEvEP7.js.map +1 -0
- package/dist/chunks/kt-calendar-B_hFdD9V.js +640 -0
- package/dist/chunks/kt-calendar-B_hFdD9V.js.map +1 -0
- package/dist/chunks/{kt-element-E-tfJpGQ.js → kt-element-Djx2JcGl.js} +2 -2
- package/dist/chunks/{kt-element-E-tfJpGQ.js.map → kt-element-Djx2JcGl.js.map} +1 -1
- package/dist/chunks/{listbox-Sm3nvsC6.js → listbox-llcUu_V-.js} +18 -14
- package/dist/chunks/{listbox-Sm3nvsC6.js.map → listbox-llcUu_V-.js.map} +1 -1
- package/dist/chunks/locale-C5xLkGx5.js +14 -0
- package/dist/chunks/locale-C5xLkGx5.js.map +1 -0
- package/dist/chunks/position-Cx_ZH5zh.js +39 -0
- package/dist/chunks/position-Cx_ZH5zh.js.map +1 -0
- package/dist/components/core/kt-avatar/kt-avatar.js +2 -2
- package/dist/components/core/kt-badge/kt-badge.js +3 -3
- package/dist/components/core/kt-button/kt-button.js +1 -1
- package/dist/components/core/kt-card/kt-card.js +2 -2
- package/dist/components/core/kt-code/kt-code.js +3 -3
- 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 +4 -4
- package/dist/components/data/kt-chart/kt-chart.js +3 -3
- package/dist/components/data/kt-meter/kt-meter.js +1 -1
- package/dist/components/data/kt-pagination/kt-pagination.js +3 -3
- package/dist/components/data/kt-stat/kt-stat.js +1 -1
- package/dist/components/data/kt-table/kt-table.d.ts +53 -3
- package/dist/components/data/kt-table/kt-table.js +286 -131
- package/dist/components/data/kt-table/kt-table.js.map +1 -1
- package/dist/components/data/kt-table/window.d.ts +19 -0
- package/dist/components/data/kt-timeline/kt-timeline.js +1 -1
- package/dist/components/feedback/kt-alert/kt-alert.js +3 -3
- package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
- package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +10 -10
- package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js.map +1 -1
- package/dist/components/feedback/kt-skeleton/kt-skeleton.js +1 -1
- package/dist/components/feedback/kt-toast/kt-toast.js +58 -42
- package/dist/components/feedback/kt-toast/kt-toast.js.map +1 -1
- package/dist/components/feedback/kt-toast-container/kt-toast-container.js +1 -1
- package/dist/components/feedback/kt-tooltip/kt-tooltip.d.ts +20 -0
- package/dist/components/feedback/kt-tooltip/kt-tooltip.js +95 -51
- package/dist/components/feedback/kt-tooltip/kt-tooltip.js.map +1 -1
- package/dist/components/forms/kt-calendar/kt-calendar.d.ts +96 -0
- package/dist/components/forms/kt-calendar/kt-calendar.js +13 -0
- package/dist/components/forms/kt-calendar/kt-calendar.js.map +1 -0
- package/dist/components/forms/kt-checkbox/kt-checkbox.d.ts +9 -0
- package/dist/components/forms/kt-checkbox/kt-checkbox.js +34 -20
- package/dist/components/forms/kt-checkbox/kt-checkbox.js.map +1 -1
- package/dist/components/forms/kt-date-picker/kt-date-picker.d.ts +105 -0
- package/dist/components/forms/kt-date-picker/kt-date-picker.js +382 -0
- package/dist/components/forms/kt-date-picker/kt-date-picker.js.map +1 -0
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.d.ts +9 -0
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +36 -22
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.js.map +1 -1
- package/dist/components/forms/kt-form/kt-form.js +2 -2
- package/dist/components/forms/kt-input/kt-input.d.ts +37 -1
- package/dist/components/forms/kt-input/kt-input.js +380 -194
- package/dist/components/forms/kt-input/kt-input.js.map +1 -1
- package/dist/components/forms/kt-input-menu/kt-input-menu.d.ts +13 -0
- package/dist/components/forms/kt-input-menu/kt-input-menu.js +73 -42
- package/dist/components/forms/kt-input-menu/kt-input-menu.js.map +1 -1
- package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
- package/dist/components/forms/kt-radio-group/kt-radio-group.d.ts +9 -0
- package/dist/components/forms/kt-radio-group/kt-radio-group.js +67 -53
- package/dist/components/forms/kt-radio-group/kt-radio-group.js.map +1 -1
- package/dist/components/forms/kt-select/kt-select.d.ts +13 -0
- package/dist/components/forms/kt-select/kt-select.js +87 -56
- package/dist/components/forms/kt-select/kt-select.js.map +1 -1
- package/dist/components/forms/kt-textarea/kt-textarea.d.ts +9 -0
- package/dist/components/forms/kt-textarea/kt-textarea.js +28 -14
- package/dist/components/forms/kt-textarea/kt-textarea.js.map +1 -1
- package/dist/components/forms/kt-toggle/kt-toggle.d.ts +9 -0
- package/dist/components/forms/kt-toggle/kt-toggle.js +43 -29
- package/dist/components/forms/kt-toggle/kt-toggle.js.map +1 -1
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +3 -3
- package/dist/components/navigation/kt-header/kt-header.js +3 -3
- package/dist/components/navigation/kt-page-header/kt-page-header.js +1 -1
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.d.ts +9 -0
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +40 -22
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -1
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +3 -3
- package/dist/components/navigation/kt-tabs/kt-tabs.js +2 -2
- package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +2 -2
- package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +3 -3
- package/dist/components/overlays/kt-collapsible/kt-collapsible.js +2 -2
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +3 -3
- package/dist/components/overlays/kt-dropdown/kt-dropdown.d.ts +7 -5
- package/dist/components/overlays/kt-dropdown/kt-dropdown.js +67 -57
- package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -1
- package/dist/components/overlays/kt-modal/kt-modal.js +3 -3
- package/dist/components/overlays/kt-side-panel/kt-side-panel.js +3 -3
- package/dist/custom-elements.json +2110 -124
- package/dist/icons/defaults.d.ts +1 -0
- package/dist/icons/index.js +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +91 -87
- package/dist/index.js.map +1 -1
- package/dist/internal/countries.d.ts +24 -9
- package/dist/internal/date.d.ts +53 -0
- package/dist/internal/events.d.ts +5 -0
- package/dist/internal/floating.d.ts +48 -0
- package/dist/internal/form-control.d.ts +5 -1
- package/dist/internal/locale.d.ts +15 -0
- package/dist/internal/position.d.ts +27 -0
- package/dist/internal/strings.d.ts +15 -0
- package/dist/react/index.d.ts +12 -0
- package/dist/react/index.js +180 -166
- package/dist/react/index.js.map +1 -1
- package/dist/react/jsx.d.ts +11 -1
- package/dist/strings/index.js +1 -1
- package/dist/tokens/base.css +2 -0
- package/dist/tokens/responsive.css +1 -0
- package/dist/tokens/spacing.css +1 -0
- package/dist/vscode.css-custom-data.json +8 -0
- package/dist/vscode.html-custom-data.json +138 -11
- package/dist/vue/index.d.ts +4 -0
- package/dist/vue/index.js +9 -7
- package/dist/vue/index.js.map +1 -1
- package/dist/web-types.json +292 -14
- package/package.json +10 -1
- package/dist/chunks/events-Bjl5Zmmq.js +0 -18
- package/dist/chunks/form-control-CxjBTt1c.js.map +0 -1
- package/dist/chunks/index-DSSLJirw.js.map +0 -1
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { css as d, nothing as h, html as u } from "lit";
|
|
2
|
-
import { property as
|
|
3
|
-
import { K as n, d as
|
|
4
|
-
import { e as
|
|
5
|
-
import { a as
|
|
6
|
-
var
|
|
7
|
-
for (var
|
|
8
|
-
(c =
|
|
9
|
-
return
|
|
2
|
+
import { property as i, state as b } from "lit/decorators.js";
|
|
3
|
+
import { K as n, d as p } from "../../../chunks/kt-element-Djx2JcGl.js";
|
|
4
|
+
import { e as m } from "../../../chunks/events-r51msXNf.js";
|
|
5
|
+
import { a as f, s as v } from "../../../chunks/form-control-B74_EHtG.js";
|
|
6
|
+
var g = Object.defineProperty, a = (s, t, l, k) => {
|
|
7
|
+
for (var r = void 0, o = s.length - 1, c; o >= 0; o--)
|
|
8
|
+
(c = s[o]) && (r = c(t, l, r) || r);
|
|
9
|
+
return r && g(t, l, r), r;
|
|
10
10
|
};
|
|
11
11
|
class e extends n {
|
|
12
12
|
constructor() {
|
|
13
|
-
super(...arguments), this.internals = null, this.defaultChecked = !1, this.checked = !1, this.disabled = !1, this.size = "medium", this.name = "", this.value = "on", this.label = "";
|
|
13
|
+
super(...arguments), this.internals = null, this.defaultChecked = !1, this.checked = !1, this.disabled = !1, this.formDisabled = !1, this.size = "medium", this.name = "", this.value = "on", this.label = "";
|
|
14
14
|
}
|
|
15
15
|
static {
|
|
16
16
|
this.formAssociated = !0;
|
|
@@ -87,10 +87,10 @@ class e extends n {
|
|
|
87
87
|
left: calc(100% - var(--switch-inset) - var(--thumb-size));
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
:host(
|
|
90
|
+
:host(:disabled) .track {
|
|
91
91
|
background-color: var(--color-dark-22);
|
|
92
92
|
}
|
|
93
|
-
:host(
|
|
93
|
+
:host(:disabled) .thumb {
|
|
94
94
|
background-color: var(--color-text-500);
|
|
95
95
|
}
|
|
96
96
|
|
|
@@ -100,25 +100,36 @@ class e extends n {
|
|
|
100
100
|
cursor: pointer;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
:host(
|
|
103
|
+
:host(:disabled) .label {
|
|
104
104
|
color: var(--text-disabled);
|
|
105
105
|
cursor: not-allowed;
|
|
106
106
|
}
|
|
107
107
|
`
|
|
108
108
|
];
|
|
109
109
|
}
|
|
110
|
+
/** Whether the control is off, by its own `disabled` or by its form. */
|
|
111
|
+
get inactive() {
|
|
112
|
+
return this.disabled || this.formDisabled;
|
|
113
|
+
}
|
|
110
114
|
connectedCallback() {
|
|
111
|
-
super.connectedCallback(), this.internals ??=
|
|
115
|
+
super.connectedCallback(), this.internals ??= f(this), this.defaultChecked = this.checked, this.syncFormValue();
|
|
112
116
|
}
|
|
113
117
|
willUpdate(t) {
|
|
114
118
|
(t.has("checked") || t.has("value")) && this.syncFormValue();
|
|
115
119
|
}
|
|
116
120
|
syncFormValue() {
|
|
117
|
-
|
|
121
|
+
v(this.internals, this.checked ? this.value : null);
|
|
118
122
|
}
|
|
119
123
|
formResetCallback() {
|
|
120
124
|
this.checked = this.defaultChecked;
|
|
121
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* Called by the platform when the control's disabled state changes — its
|
|
128
|
+
* own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.
|
|
129
|
+
*/
|
|
130
|
+
formDisabledCallback(t) {
|
|
131
|
+
this.formDisabled = t;
|
|
132
|
+
}
|
|
122
133
|
formStateRestoreCallback(t) {
|
|
123
134
|
this.checked = t === this.value;
|
|
124
135
|
}
|
|
@@ -126,7 +137,7 @@ class e extends n {
|
|
|
126
137
|
this.shadowRoot?.querySelector("button")?.focus(t);
|
|
127
138
|
}
|
|
128
139
|
toggle() {
|
|
129
|
-
this.
|
|
140
|
+
this.inactive || (this.checked = !this.checked, m(this, "kt-change", { checked: this.checked }));
|
|
130
141
|
}
|
|
131
142
|
render() {
|
|
132
143
|
return u`<button
|
|
@@ -136,7 +147,7 @@ class e extends n {
|
|
|
136
147
|
aria-checked=${this.checked ? "true" : "false"}
|
|
137
148
|
aria-label=${this.label || h}
|
|
138
149
|
aria-labelledby=${this.label ? h : "label"}
|
|
139
|
-
?disabled=${this.
|
|
150
|
+
?disabled=${this.inactive}
|
|
140
151
|
@click=${this.toggle}
|
|
141
152
|
>
|
|
142
153
|
<span part="track" class="track">
|
|
@@ -146,25 +157,28 @@ class e extends n {
|
|
|
146
157
|
<span id="label" class="label" @click=${this.toggle}><slot></slot></span>`;
|
|
147
158
|
}
|
|
148
159
|
}
|
|
149
|
-
|
|
150
|
-
|
|
160
|
+
a([
|
|
161
|
+
i({ type: Boolean, reflect: !0 })
|
|
151
162
|
], e.prototype, "checked");
|
|
152
|
-
|
|
153
|
-
|
|
163
|
+
a([
|
|
164
|
+
i({ type: Boolean, reflect: !0 })
|
|
154
165
|
], e.prototype, "disabled");
|
|
155
|
-
|
|
156
|
-
|
|
166
|
+
a([
|
|
167
|
+
b()
|
|
168
|
+
], e.prototype, "formDisabled");
|
|
169
|
+
a([
|
|
170
|
+
i({ type: String, reflect: !0 })
|
|
157
171
|
], e.prototype, "size");
|
|
158
|
-
|
|
159
|
-
|
|
172
|
+
a([
|
|
173
|
+
i({ type: String })
|
|
160
174
|
], e.prototype, "name");
|
|
161
|
-
|
|
162
|
-
|
|
175
|
+
a([
|
|
176
|
+
i({ type: String })
|
|
163
177
|
], e.prototype, "value");
|
|
164
|
-
|
|
165
|
-
|
|
178
|
+
a([
|
|
179
|
+
i({ type: String })
|
|
166
180
|
], e.prototype, "label");
|
|
167
|
-
|
|
181
|
+
p("kt-toggle", e);
|
|
168
182
|
export {
|
|
169
183
|
e as KtToggle
|
|
170
184
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kt-toggle.js","sources":["../../../../src/components/forms/kt-toggle/kt-toggle.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { attachFormInternals, setFormValue, type UsableInternals } from '#internal/form-control';\n\nexport type KtToggleSize = 'small' | 'medium' | 'large';\n\n/**\n * An on/off switch.\n *\n * Sized off the button heights so a toggle lines up with the controls beside\n * it: the track is 1.8× the field height, the thumb is inset by 12% of it.\n * Change `--button-height` and the switch follows.\n *\n * @element kt-toggle\n *\n * @slot - Optional label, rendered beside the switch and clickable.\n *\n * @csspart base - The button carrying `role=\"switch\"`.\n * @csspart track - The track.\n * @csspart thumb - The sliding thumb.\n *\n * @fires kt-change - The state changed. `detail: { checked }`.\n *\n * @example\n * ```html\n * <kt-toggle checked>Notifications</kt-toggle>\n * <kt-toggle size=\"small\" disabled></kt-toggle>\n * ```\n */\nexport class KtToggle extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-flex;\n align-items: center;\n gap: var(--gap-button);\n\n /* The whole switch derives from the field height, so it keeps its\n proportions at every breakpoint and every size. */\n --switch-height: var(--button-height);\n --switch-inset: calc(var(--switch-height) * 0.12);\n --thumb-size: calc(var(--switch-height) - var(--switch-inset) * 2);\n }\n\n :host([size='small']) {\n --switch-height: var(--button-height-small);\n }\n :host([size='large']) {\n --switch-height: var(--button-height-large);\n }\n\n button {\n display: inline-flex;\n margin: 0;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n appearance: none;\n cursor: pointer;\n }\n\n button:disabled {\n cursor: not-allowed;\n }\n\n button:focus-visible .track {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n .track {\n position: relative;\n display: inline-block;\n width: calc(var(--switch-height) * 1.8);\n height: var(--switch-height);\n background-color: var(--color-dark-24);\n border-radius: var(--radius-full);\n transition: background-color var(--duration-instant);\n }\n\n button[aria-checked='true'] .track {\n background-color: var(--color-primary-base);\n }\n\n .thumb {\n position: absolute;\n top: var(--switch-inset);\n left: var(--switch-inset);\n width: var(--thumb-size);\n height: var(--thumb-size);\n background-color: var(--color-white);\n border-radius: var(--radius-full);\n transition: left var(--duration-normal);\n }\n\n button[aria-checked='true'] .thumb {\n left: calc(100% - var(--switch-inset) - var(--thumb-size));\n }\n\n :host(
|
|
1
|
+
{"version":3,"file":"kt-toggle.js","sources":["../../../../src/components/forms/kt-toggle/kt-toggle.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { attachFormInternals, setFormValue, type UsableInternals } from '#internal/form-control';\n\nexport type KtToggleSize = 'small' | 'medium' | 'large';\n\n/**\n * An on/off switch.\n *\n * Sized off the button heights so a toggle lines up with the controls beside\n * it: the track is 1.8× the field height, the thumb is inset by 12% of it.\n * Change `--button-height` and the switch follows.\n *\n * @element kt-toggle\n *\n * @slot - Optional label, rendered beside the switch and clickable.\n *\n * @csspart base - The button carrying `role=\"switch\"`.\n * @csspart track - The track.\n * @csspart thumb - The sliding thumb.\n *\n * @fires kt-change - The state changed. `detail: { checked }`.\n *\n * @example\n * ```html\n * <kt-toggle checked>Notifications</kt-toggle>\n * <kt-toggle size=\"small\" disabled></kt-toggle>\n * ```\n */\nexport class KtToggle extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-flex;\n align-items: center;\n gap: var(--gap-button);\n\n /* The whole switch derives from the field height, so it keeps its\n proportions at every breakpoint and every size. */\n --switch-height: var(--button-height);\n --switch-inset: calc(var(--switch-height) * 0.12);\n --thumb-size: calc(var(--switch-height) - var(--switch-inset) * 2);\n }\n\n :host([size='small']) {\n --switch-height: var(--button-height-small);\n }\n :host([size='large']) {\n --switch-height: var(--button-height-large);\n }\n\n button {\n display: inline-flex;\n margin: 0;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n appearance: none;\n cursor: pointer;\n }\n\n button:disabled {\n cursor: not-allowed;\n }\n\n button:focus-visible .track {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n .track {\n position: relative;\n display: inline-block;\n width: calc(var(--switch-height) * 1.8);\n height: var(--switch-height);\n background-color: var(--color-dark-24);\n border-radius: var(--radius-full);\n transition: background-color var(--duration-instant);\n }\n\n button[aria-checked='true'] .track {\n background-color: var(--color-primary-base);\n }\n\n .thumb {\n position: absolute;\n top: var(--switch-inset);\n left: var(--switch-inset);\n width: var(--thumb-size);\n height: var(--thumb-size);\n background-color: var(--color-white);\n border-radius: var(--radius-full);\n transition: left var(--duration-normal);\n }\n\n button[aria-checked='true'] .thumb {\n left: calc(100% - var(--switch-inset) - var(--thumb-size));\n }\n\n :host(:disabled) .track {\n background-color: var(--color-dark-22);\n }\n :host(:disabled) .thumb {\n background-color: var(--color-text-500);\n }\n\n .label {\n color: var(--text-body);\n font: var(--font-normal-regular);\n cursor: pointer;\n }\n\n :host(:disabled) .label {\n color: var(--text-disabled);\n cursor: not-allowed;\n }\n `,\n ];\n\n private internals: UsableInternals | null = null;\n private defaultChecked = false;\n\n @property({ type: Boolean, reflect: true })\n checked = false;\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Disabled by an enclosing `<fieldset>`, which leaves `disabled` alone. */\n @state()\n private formDisabled = false;\n\n /** Whether the control is off, by its own `disabled` or by its form. */\n private get inactive(): boolean {\n return this.disabled || this.formDisabled;\n }\n\n @property({ type: String, reflect: true })\n size: KtToggleSize = 'medium';\n\n @property({ type: String })\n name = '';\n\n /** Submitted when checked, as for a native checkbox. */\n @property({ type: String })\n value = 'on';\n\n /** Accessible name, when nothing is slotted. */\n @property({ type: String })\n label = '';\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultChecked = this.checked;\n this.syncFormValue();\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('checked') || changed.has('value')) this.syncFormValue();\n }\n\n private syncFormValue(): void {\n // An unchecked checkbox contributes nothing to a submission, not an empty\n // string — null is how ElementInternals says \"leave me out\".\n setFormValue(this.internals, this.checked ? this.value : null);\n }\n\n formResetCallback(): void {\n this.checked = this.defaultChecked;\n }\n\n /**\n * Called by the platform when the control's disabled state changes — its\n * own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.\n */\n formDisabledCallback(disabled: boolean): void {\n this.formDisabled = disabled;\n }\n\n formStateRestoreCallback(state: string): void {\n this.checked = state === this.value;\n }\n\n override focus(options?: FocusOptions): void {\n this.shadowRoot?.querySelector('button')?.focus(options);\n }\n\n private toggle(): void {\n if (this.inactive) return;\n this.checked = !this.checked;\n emit(this, 'kt-change', { checked: this.checked });\n }\n\n override render(): TemplateResult {\n return html`<button\n part=\"base\"\n type=\"button\"\n role=\"switch\"\n aria-checked=${this.checked ? 'true' : 'false'}\n aria-label=${this.label || nothing}\n aria-labelledby=${this.label ? nothing : 'label'}\n ?disabled=${this.inactive}\n @click=${this.toggle}\n >\n <span part=\"track\" class=\"track\">\n <span part=\"thumb\" class=\"thumb\"></span>\n </span>\n </button>\n <span id=\"label\" class=\"label\" @click=${this.toggle}><slot></slot></span>`;\n }\n}\n\ndefineElement('kt-toggle', KtToggle);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-toggle': KtToggle;\n }\n}\n"],"names":["KtToggle","KtElement","css","attachFormInternals","changed","setFormValue","disabled","state","options","emit","html","nothing","__decorateClass","property","defineElement"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { css as d, nothing as f, html as s } from "lit";
|
|
2
2
|
import { property as c } from "lit/decorators.js";
|
|
3
|
-
import { K as p, d as u } from "../../../chunks/kt-element-
|
|
4
|
-
import { e as h } from "../../../chunks/events-
|
|
5
|
-
import { s as b } from "../../../chunks/index-
|
|
3
|
+
import { K as p, d as u } from "../../../chunks/kt-element-Djx2JcGl.js";
|
|
4
|
+
import { e as h } from "../../../chunks/events-r51msXNf.js";
|
|
5
|
+
import { s as b } from "../../../chunks/index-STEEvEP7.js";
|
|
6
6
|
import "../../core/kt-icon/kt-icon.js";
|
|
7
7
|
var v = Object.defineProperty, m = (o, t, e, a) => {
|
|
8
8
|
for (var r = void 0, i = o.length - 1, l; i >= 0; i--)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { css as c, nothing as u, html as m } from "lit";
|
|
2
2
|
import { state as b, property as n } from "lit/decorators.js";
|
|
3
|
-
import { K as d, d as f } from "../../../chunks/kt-element-
|
|
4
|
-
import { e as p } from "../../../chunks/events-
|
|
5
|
-
import { s as h } from "../../../chunks/index-
|
|
3
|
+
import { K as d, d as f } from "../../../chunks/kt-element-Djx2JcGl.js";
|
|
4
|
+
import { e as p } from "../../../chunks/events-r51msXNf.js";
|
|
5
|
+
import { s as h } from "../../../chunks/index-STEEvEP7.js";
|
|
6
6
|
import "../../core/kt-button/kt-button.js";
|
|
7
7
|
var g = Object.defineProperty, a = (r, o, s, v) => {
|
|
8
8
|
for (var e = void 0, i = r.length - 1, l; i >= 0; i--)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { css as c, html as t, nothing as l } from "lit";
|
|
2
2
|
import { property as s } from "lit/decorators.js";
|
|
3
|
-
import { K as h, d as g } from "../../../chunks/kt-element-
|
|
3
|
+
import { K as h, d as g } from "../../../chunks/kt-element-Djx2JcGl.js";
|
|
4
4
|
var f = Object.defineProperty, o = (a, r, p, v) => {
|
|
5
5
|
for (var e = void 0, n = a.length - 1, d; n >= 0; n--)
|
|
6
6
|
(d = a[n]) && (e = d(r, p, e) || e);
|
|
@@ -47,6 +47,10 @@ export declare class KtSegmentedControl extends KtElement {
|
|
|
47
47
|
size: KtSegmentedSize;
|
|
48
48
|
orientation: 'horizontal' | 'vertical';
|
|
49
49
|
disabled: boolean;
|
|
50
|
+
/** Disabled by an enclosing `<fieldset>`, which leaves `disabled` alone. */
|
|
51
|
+
private formDisabled;
|
|
52
|
+
/** Whether the control is off, by its own `disabled` or by its form. */
|
|
53
|
+
private get inactive();
|
|
50
54
|
/** Accessible name for the group. */
|
|
51
55
|
label: string;
|
|
52
56
|
name: string;
|
|
@@ -54,6 +58,11 @@ export declare class KtSegmentedControl extends KtElement {
|
|
|
54
58
|
connectedCallback(): void;
|
|
55
59
|
willUpdate(changed: PropertyValues<this>): void;
|
|
56
60
|
formResetCallback(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Called by the platform when the control's disabled state changes — its
|
|
63
|
+
* own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.
|
|
64
|
+
*/
|
|
65
|
+
formDisabledCallback(disabled: boolean): void;
|
|
57
66
|
formStateRestoreCallback(state: string): void;
|
|
58
67
|
private get selectedIndex();
|
|
59
68
|
private choose;
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { css as b, nothing as c, html as p } from "lit";
|
|
2
|
-
import { queryAll as v, property as n } from "lit/decorators.js";
|
|
3
|
-
import { classMap as
|
|
4
|
-
import { K as f, d as g } from "../../../chunks/kt-element-
|
|
5
|
-
import { e as
|
|
6
|
-
import { a as
|
|
7
|
-
import { s as $ } from "../../../chunks/index-
|
|
2
|
+
import { queryAll as v, property as n, state as m } from "lit/decorators.js";
|
|
3
|
+
import { classMap as u } from "lit/directives/class-map.js";
|
|
4
|
+
import { K as f, d as g } from "../../../chunks/kt-element-Djx2JcGl.js";
|
|
5
|
+
import { e as x } from "../../../chunks/events-r51msXNf.js";
|
|
6
|
+
import { a as y, s as k, b as w } from "../../../chunks/form-control-B74_EHtG.js";
|
|
7
|
+
import { s as $ } from "../../../chunks/index-STEEvEP7.js";
|
|
8
8
|
import "../../core/kt-icon/kt-icon.js";
|
|
9
|
-
var
|
|
10
|
-
for (var e = void 0, r =
|
|
11
|
-
(l =
|
|
12
|
-
return e &&
|
|
9
|
+
var I = Object.defineProperty, s = (h, t, i, o) => {
|
|
10
|
+
for (var e = void 0, r = h.length - 1, l; r >= 0; r--)
|
|
11
|
+
(l = h[r]) && (e = l(t, i, e) || e);
|
|
12
|
+
return e && I(t, i, e), e;
|
|
13
13
|
};
|
|
14
|
-
const
|
|
14
|
+
const S = { small: 16, medium: 20, large: 24 };
|
|
15
15
|
class a extends f {
|
|
16
16
|
constructor() {
|
|
17
|
-
super(...arguments), this.internals = null, this.defaultValue = null, this.options = [], this.value = null, this.size = "medium", this.orientation = "horizontal", this.disabled = !1, this.label = "", this.name = "", this.required = !1;
|
|
17
|
+
super(...arguments), this.internals = null, this.defaultValue = null, this.options = [], this.value = null, this.size = "medium", this.orientation = "horizontal", this.disabled = !1, this.formDisabled = !1, this.label = "", this.name = "", this.required = !1;
|
|
18
18
|
}
|
|
19
19
|
static {
|
|
20
20
|
this.formAssociated = !0;
|
|
@@ -50,7 +50,7 @@ class a extends f {
|
|
|
50
50
|
width: fit-content;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
:host(
|
|
53
|
+
:host(:disabled) .track {
|
|
54
54
|
opacity: 0.5;
|
|
55
55
|
pointer-events: none;
|
|
56
56
|
}
|
|
@@ -66,6 +66,10 @@ class a extends f {
|
|
|
66
66
|
padding: 0 12px;
|
|
67
67
|
color: var(--text-muted);
|
|
68
68
|
font: var(--font-normal-regular);
|
|
69
|
+
/* Segments share the width equally from a basis of zero, so in a
|
|
70
|
+
container that shrinks to fit they would split a label over two
|
|
71
|
+
lines of a fixed-height button. */
|
|
72
|
+
white-space: nowrap;
|
|
69
73
|
background-color: transparent;
|
|
70
74
|
border: none;
|
|
71
75
|
border-radius: calc(var(--border-radius) - 4px);
|
|
@@ -131,19 +135,30 @@ class a extends f {
|
|
|
131
135
|
`
|
|
132
136
|
];
|
|
133
137
|
}
|
|
138
|
+
/** Whether the control is off, by its own `disabled` or by its form. */
|
|
139
|
+
get inactive() {
|
|
140
|
+
return this.disabled || this.formDisabled;
|
|
141
|
+
}
|
|
134
142
|
connectedCallback() {
|
|
135
|
-
super.connectedCallback(), this.internals ??=
|
|
143
|
+
super.connectedCallback(), this.internals ??= y(this), this.defaultValue = this.value;
|
|
136
144
|
}
|
|
137
145
|
willUpdate(t) {
|
|
138
146
|
if (t.has("value") || t.has("required") || this.stringsChanged(t)) {
|
|
139
|
-
|
|
147
|
+
k(this.internals, this.value === null ? null : String(this.value));
|
|
140
148
|
const i = this.required && this.value === null;
|
|
141
|
-
|
|
149
|
+
w(this.internals, { valueMissing: i }, i ? $().selectOption : "");
|
|
142
150
|
}
|
|
143
151
|
}
|
|
144
152
|
formResetCallback() {
|
|
145
153
|
this.value = this.defaultValue;
|
|
146
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Called by the platform when the control's disabled state changes — its
|
|
157
|
+
* own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.
|
|
158
|
+
*/
|
|
159
|
+
formDisabledCallback(t) {
|
|
160
|
+
this.formDisabled = t;
|
|
161
|
+
}
|
|
147
162
|
formStateRestoreCallback(t) {
|
|
148
163
|
this.value = this.options.find((i) => String(i.value) === t)?.value ?? t;
|
|
149
164
|
}
|
|
@@ -151,7 +166,7 @@ class a extends f {
|
|
|
151
166
|
return this.options.findIndex((t) => t.value === this.value);
|
|
152
167
|
}
|
|
153
168
|
choose(t) {
|
|
154
|
-
this.
|
|
169
|
+
this.inactive || t.disabled || this.value === t.value || (this.value = t.value, x(this, "kt-change", { value: t.value, option: t }));
|
|
155
170
|
}
|
|
156
171
|
/**
|
|
157
172
|
* Radio-group semantics: the arrows move *and* select, wrapping at the ends
|
|
@@ -185,7 +200,7 @@ class a extends f {
|
|
|
185
200
|
const t = this.selectedIndex, i = t >= 0 ? t : this.options.findIndex((o) => !o.disabled);
|
|
186
201
|
return p`<div
|
|
187
202
|
part="base"
|
|
188
|
-
class=${
|
|
203
|
+
class=${u({
|
|
189
204
|
track: !0,
|
|
190
205
|
[this.size]: !0,
|
|
191
206
|
vertical: this.orientation === "vertical"
|
|
@@ -193,7 +208,7 @@ class a extends f {
|
|
|
193
208
|
role="radiogroup"
|
|
194
209
|
aria-label=${this.label || c}
|
|
195
210
|
aria-orientation=${this.orientation}
|
|
196
|
-
aria-disabled=${this.
|
|
211
|
+
aria-disabled=${this.inactive ? "true" : c}
|
|
197
212
|
@keydown=${this.onKeyDown}
|
|
198
213
|
>
|
|
199
214
|
${this.options.map((o, e) => {
|
|
@@ -202,7 +217,7 @@ class a extends f {
|
|
|
202
217
|
part="option"
|
|
203
218
|
type="button"
|
|
204
219
|
role="radio"
|
|
205
|
-
class=${
|
|
220
|
+
class=${u({
|
|
206
221
|
option: !0,
|
|
207
222
|
[this.size]: !0,
|
|
208
223
|
selected: r,
|
|
@@ -211,10 +226,10 @@ class a extends f {
|
|
|
211
226
|
aria-checked=${r ? "true" : "false"}
|
|
212
227
|
aria-label=${d ? o.icon ?? "" : c}
|
|
213
228
|
tabindex=${e === i ? 0 : -1}
|
|
214
|
-
?disabled=${this.
|
|
229
|
+
?disabled=${this.inactive || o.disabled}
|
|
215
230
|
@click=${() => this.choose(o)}
|
|
216
231
|
>
|
|
217
|
-
${o.icon ? p`<kt-icon name=${o.icon} size=${
|
|
232
|
+
${o.icon ? p`<kt-icon name=${o.icon} size=${S[this.size]}></kt-icon>` : c}
|
|
218
233
|
${d ? c : p`<span class="text">${l}</span>`}
|
|
219
234
|
</button>`;
|
|
220
235
|
})}
|
|
@@ -239,6 +254,9 @@ s([
|
|
|
239
254
|
s([
|
|
240
255
|
n({ type: Boolean, reflect: !0 })
|
|
241
256
|
], a.prototype, "disabled");
|
|
257
|
+
s([
|
|
258
|
+
m()
|
|
259
|
+
], a.prototype, "formDisabled");
|
|
242
260
|
s([
|
|
243
261
|
n({ type: String })
|
|
244
262
|
], a.prototype, "label");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kt-segmented-control.js","sources":["../../../../src/components/navigation/kt-segmented-control/kt-segmented-control.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, queryAll } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from '#internal/form-control';\nimport { strings } from '#internal/strings';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport type KtSegmentedSize = 'small' | 'medium' | 'large';\n\nexport interface KtSegmentedOption {\n readonly value: string | number;\n readonly label?: string;\n readonly icon?: string;\n readonly disabled?: boolean;\n}\n\nconst ICON_SIZE: Record<KtSegmentedSize, number> = { small: 16, medium: 20, large: 24 };\n\n/**\n * A small set of mutually exclusive choices, shown as one inset track with the\n * selected segment raised out of it.\n *\n * Use it for two to five options that all fit on screen — a view switch, a date\n * range. Past that, `<kt-select>`.\n *\n * Implemented as a radio group: one tab stop for the whole control, arrows to\n * move between segments. That is what a keyboard user expects here, and it\n * keeps a five-option control from adding five tab stops to the page.\n *\n * @element kt-segmented-control\n *\n * @csspart base - The track.\n * @csspart option - A segment.\n *\n * @fires kt-change - A segment was chosen. `detail: { value, option }`.\n *\n * @example\n * ```js\n * control.options = [\n * { value: 'day', label: 'Day' },\n * { value: 'week', label: 'Week' },\n * { value: 'month', label: 'Month' },\n * ];\n * control.value = 'week';\n * ```\n */\nexport class KtSegmentedControl extends KtElement {\n static readonly formAssociated = true;\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-block;\n }\n\n .track {\n display: inline-flex;\n box-sizing: border-box;\n gap: 4px;\n padding: 4px;\n background-color: var(--color-dark-14);\n border-radius: var(--border-radius);\n }\n\n .track.small {\n gap: 3px;\n padding: 3px;\n }\n .track.large {\n gap: 5px;\n padding: 5px;\n }\n\n .track.vertical {\n flex-direction: column;\n width: fit-content;\n }\n\n :host([disabled]) .track {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .option {\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n gap: var(--gap-button);\n height: var(--button-height-small);\n padding: 0 12px;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n background-color: transparent;\n border: none;\n border-radius: calc(var(--border-radius) - 4px);\n cursor: pointer;\n transition:\n background-color var(--duration-normal) var(--easing-standard),\n color var(--duration-normal) var(--easing-standard);\n }\n\n .option:hover:not(:disabled) {\n background-color: var(--color-dark-18);\n }\n .option:active:not(:disabled) {\n background-color: var(--surface-card);\n }\n\n .option.selected {\n color: var(--text-body);\n background-color: var(--surface-raised);\n }\n .option.selected:hover:not(:disabled) {\n background-color: var(--surface-hover);\n }\n\n .option:disabled {\n color: var(--text-disabled);\n background-color: transparent;\n pointer-events: none;\n }\n\n .option:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: -2px;\n }\n\n .option.small {\n height: 24px;\n gap: 6px;\n padding: 0 8px;\n font: var(--font-normal-small);\n }\n .option.large {\n height: var(--button-height);\n padding: 0 16px;\n font: var(--font-normal-medium);\n }\n\n .option.icon-only {\n width: var(--button-height-small);\n padding: 0;\n }\n .option.icon-only.small {\n width: 24px;\n }\n .option.icon-only.large {\n width: var(--button-height);\n }\n\n .text {\n flex: 1;\n text-align: center;\n }\n `,\n ];\n\n @queryAll('.option')\n private segments!: NodeListOf<HTMLButtonElement>;\n\n private internals: UsableInternals | null = null;\n private defaultValue: string | number | null = null;\n\n @property({ attribute: false })\n options: readonly KtSegmentedOption[] = [];\n\n @property({ type: String })\n value: string | number | null = null;\n\n @property({ type: String, reflect: true })\n size: KtSegmentedSize = 'medium';\n\n @property({ type: String, reflect: true })\n orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Accessible name for the group. */\n @property({ type: String })\n label = '';\n\n @property({ type: String })\n name = '';\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultValue = this.value;\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('value') || changed.has('required') || this.stringsChanged(changed)) {\n setFormValue(this.internals, this.value === null ? null : String(this.value));\n\n const missing = this.required && this.value === null;\n setValidity(this.internals, { valueMissing: missing }, missing ? strings().selectOption : '');\n }\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n }\n\n formStateRestoreCallback(state: string): void {\n // The form stores a string; hand back the option's own value, which may be\n // a number.\n this.value = this.options.find((option) => String(option.value) === state)?.value ?? state;\n }\n\n private get selectedIndex(): number {\n return this.options.findIndex((option) => option.value === this.value);\n }\n\n private choose(option: KtSegmentedOption): void {\n if (this.disabled || option.disabled || this.value === option.value) return;\n this.value = option.value;\n emit(this, 'kt-change', { value: option.value, option });\n }\n\n /**\n * Radio-group semantics: the arrows move *and* select, wrapping at the ends\n * and skipping disabled segments.\n */\n private onKeyDown(event: KeyboardEvent): void {\n const forward = this.orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const back = this.orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n let target: number | undefined;\n if (event.key === forward) target = this.step(1);\n else if (event.key === back) target = this.step(-1);\n else if (event.key === 'Home') target = this.options.findIndex((o) => !o.disabled);\n else if (event.key === 'End')\n target = this.options.length - 1 - [...this.options].reverse().findIndex((o) => !o.disabled);\n else return;\n\n event.preventDefault();\n if (target === undefined || target < 0) return;\n\n const option = this.options[target];\n if (!option) return;\n\n const index = target;\n this.choose(option);\n void this.updateComplete.then(() => this.segments[index]?.focus());\n }\n\n private step(direction: 1 | -1): number | undefined {\n const count = this.options.length;\n if (count === 0) return undefined;\n\n const from = this.selectedIndex < 0 ? (direction === 1 ? -1 : 0) : this.selectedIndex;\n for (let offset = 1; offset <= count; offset += 1) {\n const index = (((from + direction * offset) % count) + count) % count;\n if (!this.options[index]?.disabled) return index;\n }\n return undefined;\n }\n\n override render(): TemplateResult {\n const selectedIndex = this.selectedIndex;\n // One tab stop for the whole group: the selected segment holds it, or the\n // first selectable one when nothing is chosen yet.\n const tabStop = selectedIndex >= 0 ? selectedIndex : this.options.findIndex((o) => !o.disabled);\n\n return html`<div\n part=\"base\"\n class=${classMap({\n track: true,\n [this.size]: true,\n vertical: this.orientation === 'vertical',\n })}\n role=\"radiogroup\"\n aria-label=${this.label || nothing}\n aria-orientation=${this.orientation}\n aria-disabled=${this.disabled ? 'true' : nothing}\n @keydown=${this.onKeyDown}\n >\n ${this.options.map((option, index) => {\n const selected = option.value === this.value;\n const text = option.label ?? '';\n const iconOnly = Boolean(option.icon) && text === '';\n\n return html`<button\n part=\"option\"\n type=\"button\"\n role=\"radio\"\n class=${classMap({\n option: true,\n [this.size]: true,\n selected,\n 'icon-only': iconOnly,\n })}\n aria-checked=${selected ? 'true' : 'false'}\n aria-label=${iconOnly ? (option.icon ?? '') : nothing}\n tabindex=${index === tabStop ? 0 : -1}\n ?disabled=${this.disabled || option.disabled}\n @click=${() => this.choose(option)}\n >\n ${\n option.icon\n ? html`<kt-icon name=${option.icon} size=${ICON_SIZE[this.size]}></kt-icon>`\n : nothing\n }\n ${iconOnly ? nothing : html`<span class=\"text\">${text}</span>`}\n </button>`;\n })}\n </div>`;\n }\n}\n\ndefineElement('kt-segmented-control', KtSegmentedControl);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-segmented-control': KtSegmentedControl;\n }\n}\n"],"names":["ICON_SIZE","KtSegmentedControl","KtElement","css","attachFormInternals","changed","setFormValue","missing","setValidity","strings","state","option","emit","event","forward","back","target","o","index","direction","count","from","offset","selectedIndex","tabStop","html","classMap","nothing","selected","text","iconOnly","__decorateClass","queryAll","property","defineElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kt-segmented-control.js","sources":["../../../../src/components/navigation/kt-segmented-control/kt-segmented-control.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, queryAll, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from '#internal/form-control';\nimport { strings } from '#internal/strings';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport type KtSegmentedSize = 'small' | 'medium' | 'large';\n\nexport interface KtSegmentedOption {\n readonly value: string | number;\n readonly label?: string;\n readonly icon?: string;\n readonly disabled?: boolean;\n}\n\nconst ICON_SIZE: Record<KtSegmentedSize, number> = { small: 16, medium: 20, large: 24 };\n\n/**\n * A small set of mutually exclusive choices, shown as one inset track with the\n * selected segment raised out of it.\n *\n * Use it for two to five options that all fit on screen — a view switch, a date\n * range. Past that, `<kt-select>`.\n *\n * Implemented as a radio group: one tab stop for the whole control, arrows to\n * move between segments. That is what a keyboard user expects here, and it\n * keeps a five-option control from adding five tab stops to the page.\n *\n * @element kt-segmented-control\n *\n * @csspart base - The track.\n * @csspart option - A segment.\n *\n * @fires kt-change - A segment was chosen. `detail: { value, option }`.\n *\n * @example\n * ```js\n * control.options = [\n * { value: 'day', label: 'Day' },\n * { value: 'week', label: 'Week' },\n * { value: 'month', label: 'Month' },\n * ];\n * control.value = 'week';\n * ```\n */\nexport class KtSegmentedControl extends KtElement {\n static readonly formAssociated = true;\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-block;\n }\n\n .track {\n display: inline-flex;\n box-sizing: border-box;\n gap: 4px;\n padding: 4px;\n background-color: var(--color-dark-14);\n border-radius: var(--border-radius);\n }\n\n .track.small {\n gap: 3px;\n padding: 3px;\n }\n .track.large {\n gap: 5px;\n padding: 5px;\n }\n\n .track.vertical {\n flex-direction: column;\n width: fit-content;\n }\n\n :host(:disabled) .track {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .option {\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n gap: var(--gap-button);\n height: var(--button-height-small);\n padding: 0 12px;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n /* Segments share the width equally from a basis of zero, so in a\n container that shrinks to fit they would split a label over two\n lines of a fixed-height button. */\n white-space: nowrap;\n background-color: transparent;\n border: none;\n border-radius: calc(var(--border-radius) - 4px);\n cursor: pointer;\n transition:\n background-color var(--duration-normal) var(--easing-standard),\n color var(--duration-normal) var(--easing-standard);\n }\n\n .option:hover:not(:disabled) {\n background-color: var(--color-dark-18);\n }\n .option:active:not(:disabled) {\n background-color: var(--surface-card);\n }\n\n .option.selected {\n color: var(--text-body);\n background-color: var(--surface-raised);\n }\n .option.selected:hover:not(:disabled) {\n background-color: var(--surface-hover);\n }\n\n .option:disabled {\n color: var(--text-disabled);\n background-color: transparent;\n pointer-events: none;\n }\n\n .option:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: -2px;\n }\n\n .option.small {\n height: 24px;\n gap: 6px;\n padding: 0 8px;\n font: var(--font-normal-small);\n }\n .option.large {\n height: var(--button-height);\n padding: 0 16px;\n font: var(--font-normal-medium);\n }\n\n .option.icon-only {\n width: var(--button-height-small);\n padding: 0;\n }\n .option.icon-only.small {\n width: 24px;\n }\n .option.icon-only.large {\n width: var(--button-height);\n }\n\n .text {\n flex: 1;\n text-align: center;\n }\n `,\n ];\n\n @queryAll('.option')\n private segments!: NodeListOf<HTMLButtonElement>;\n\n private internals: UsableInternals | null = null;\n private defaultValue: string | number | null = null;\n\n @property({ attribute: false })\n options: readonly KtSegmentedOption[] = [];\n\n @property({ type: String })\n value: string | number | null = null;\n\n @property({ type: String, reflect: true })\n size: KtSegmentedSize = 'medium';\n\n @property({ type: String, reflect: true })\n orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Disabled by an enclosing `<fieldset>`, which leaves `disabled` alone. */\n @state()\n private formDisabled = false;\n\n /** Whether the control is off, by its own `disabled` or by its form. */\n private get inactive(): boolean {\n return this.disabled || this.formDisabled;\n }\n\n /** Accessible name for the group. */\n @property({ type: String })\n label = '';\n\n @property({ type: String })\n name = '';\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultValue = this.value;\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('value') || changed.has('required') || this.stringsChanged(changed)) {\n setFormValue(this.internals, this.value === null ? null : String(this.value));\n\n const missing = this.required && this.value === null;\n setValidity(this.internals, { valueMissing: missing }, missing ? strings().selectOption : '');\n }\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n }\n\n /**\n * Called by the platform when the control's disabled state changes — its\n * own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.\n */\n formDisabledCallback(disabled: boolean): void {\n this.formDisabled = disabled;\n }\n\n formStateRestoreCallback(state: string): void {\n // The form stores a string; hand back the option's own value, which may be\n // a number.\n this.value = this.options.find((option) => String(option.value) === state)?.value ?? state;\n }\n\n private get selectedIndex(): number {\n return this.options.findIndex((option) => option.value === this.value);\n }\n\n private choose(option: KtSegmentedOption): void {\n if (this.inactive || option.disabled || this.value === option.value) return;\n this.value = option.value;\n emit(this, 'kt-change', { value: option.value, option });\n }\n\n /**\n * Radio-group semantics: the arrows move *and* select, wrapping at the ends\n * and skipping disabled segments.\n */\n private onKeyDown(event: KeyboardEvent): void {\n const forward = this.orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const back = this.orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n let target: number | undefined;\n if (event.key === forward) target = this.step(1);\n else if (event.key === back) target = this.step(-1);\n else if (event.key === 'Home') target = this.options.findIndex((o) => !o.disabled);\n else if (event.key === 'End')\n target = this.options.length - 1 - [...this.options].reverse().findIndex((o) => !o.disabled);\n else return;\n\n event.preventDefault();\n if (target === undefined || target < 0) return;\n\n const option = this.options[target];\n if (!option) return;\n\n const index = target;\n this.choose(option);\n void this.updateComplete.then(() => this.segments[index]?.focus());\n }\n\n private step(direction: 1 | -1): number | undefined {\n const count = this.options.length;\n if (count === 0) return undefined;\n\n const from = this.selectedIndex < 0 ? (direction === 1 ? -1 : 0) : this.selectedIndex;\n for (let offset = 1; offset <= count; offset += 1) {\n const index = (((from + direction * offset) % count) + count) % count;\n if (!this.options[index]?.disabled) return index;\n }\n return undefined;\n }\n\n override render(): TemplateResult {\n const selectedIndex = this.selectedIndex;\n // One tab stop for the whole group: the selected segment holds it, or the\n // first selectable one when nothing is chosen yet.\n const tabStop = selectedIndex >= 0 ? selectedIndex : this.options.findIndex((o) => !o.disabled);\n\n return html`<div\n part=\"base\"\n class=${classMap({\n track: true,\n [this.size]: true,\n vertical: this.orientation === 'vertical',\n })}\n role=\"radiogroup\"\n aria-label=${this.label || nothing}\n aria-orientation=${this.orientation}\n aria-disabled=${this.inactive ? 'true' : nothing}\n @keydown=${this.onKeyDown}\n >\n ${this.options.map((option, index) => {\n const selected = option.value === this.value;\n const text = option.label ?? '';\n const iconOnly = Boolean(option.icon) && text === '';\n\n return html`<button\n part=\"option\"\n type=\"button\"\n role=\"radio\"\n class=${classMap({\n option: true,\n [this.size]: true,\n selected,\n 'icon-only': iconOnly,\n })}\n aria-checked=${selected ? 'true' : 'false'}\n aria-label=${iconOnly ? (option.icon ?? '') : nothing}\n tabindex=${index === tabStop ? 0 : -1}\n ?disabled=${this.inactive || option.disabled}\n @click=${() => this.choose(option)}\n >\n ${\n option.icon\n ? html`<kt-icon name=${option.icon} size=${ICON_SIZE[this.size]}></kt-icon>`\n : nothing\n }\n ${iconOnly ? nothing : html`<span class=\"text\">${text}</span>`}\n </button>`;\n })}\n </div>`;\n }\n}\n\ndefineElement('kt-segmented-control', KtSegmentedControl);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-segmented-control': KtSegmentedControl;\n }\n}\n"],"names":["ICON_SIZE","KtSegmentedControl","KtElement","css","attachFormInternals","changed","setFormValue","missing","setValidity","strings","disabled","state","option","emit","event","forward","back","target","o","index","direction","count","from","offset","selectedIndex","tabStop","html","classMap","nothing","selected","text","iconOnly","__decorateClass","queryAll","property","defineElement"],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@ import { css as y, html as a, nothing as n } from "lit";
|
|
|
2
2
|
import { property as c, state as x } from "lit/decorators.js";
|
|
3
3
|
import { classMap as f } from "lit/directives/class-map.js";
|
|
4
4
|
import { styleMap as $ } from "lit/directives/style-map.js";
|
|
5
|
-
import { K as b, d as k } from "../../../chunks/kt-element-
|
|
6
|
-
import { e as g } from "../../../chunks/events-
|
|
7
|
-
import { s as w } from "../../../chunks/index-
|
|
5
|
+
import { K as b, d as k } from "../../../chunks/kt-element-Djx2JcGl.js";
|
|
6
|
+
import { e as g } from "../../../chunks/events-r51msXNf.js";
|
|
7
|
+
import { s as w } from "../../../chunks/index-STEEvEP7.js";
|
|
8
8
|
import "../../core/kt-icon/kt-icon.js";
|
|
9
9
|
import "../../core/kt-badge/kt-badge.js";
|
|
10
10
|
var A = Object.defineProperty, d = (p, e, t, o) => {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { css as u, html as l, nothing as p } from "lit";
|
|
2
2
|
import { queryAll as h, property as n } from "lit/decorators.js";
|
|
3
3
|
import { classMap as f } from "lit/directives/class-map.js";
|
|
4
|
-
import { K as c, d as v } from "../../../chunks/kt-element-
|
|
5
|
-
import { e as m } from "../../../chunks/events-
|
|
4
|
+
import { K as c, d as v } from "../../../chunks/kt-element-Djx2JcGl.js";
|
|
5
|
+
import { e as m } from "../../../chunks/events-r51msXNf.js";
|
|
6
6
|
import "../../core/kt-icon/kt-icon.js";
|
|
7
7
|
import "../../feedback/kt-skeleton/kt-skeleton.js";
|
|
8
8
|
var x = Object.defineProperty, i = (d, e, t, r) => {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { css as p, html as c, nothing as n } from "lit";
|
|
2
2
|
import { property as o } from "lit/decorators.js";
|
|
3
3
|
import { classMap as b } from "lit/directives/class-map.js";
|
|
4
|
-
import { K as u, d as g } from "../../../chunks/kt-element-
|
|
5
|
-
import { e as v } from "../../../chunks/events-
|
|
4
|
+
import { K as u, d as g } from "../../../chunks/kt-element-Djx2JcGl.js";
|
|
5
|
+
import { e as v } from "../../../chunks/events-r51msXNf.js";
|
|
6
6
|
import "../../core/kt-icon/kt-icon.js";
|
|
7
7
|
var m = Object.defineProperty, r = (l, e, i, s) => {
|
|
8
8
|
for (var a = void 0, d = l.length - 1, h; d >= 0; d--)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { css as c, html as h } from "lit";
|
|
2
2
|
import { queryAssignedElements as g, property as l } from "lit/decorators.js";
|
|
3
|
-
import { K as d, d as b } from "../../../chunks/kt-element-
|
|
4
|
-
import { e as p } from "../../../chunks/events-
|
|
5
|
-
import { s as v } from "../../../chunks/index-
|
|
3
|
+
import { K as d, d as b } from "../../../chunks/kt-element-Djx2JcGl.js";
|
|
4
|
+
import { e as p } from "../../../chunks/events-r51msXNf.js";
|
|
5
|
+
import { s as v } from "../../../chunks/index-STEEvEP7.js";
|
|
6
6
|
import { KtToggleButton as f } from "../kt-toggle-button/kt-toggle-button.js";
|
|
7
7
|
var m = Object.defineProperty, s = (n, t, e, r) => {
|
|
8
8
|
for (var o = void 0, a = n.length - 1, u; a >= 0; a--)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { css as d, nothing as m, html as c } from "lit";
|
|
2
2
|
import { property as n } from "lit/decorators.js";
|
|
3
|
-
import { K as p, d as u } from "../../../chunks/kt-element-
|
|
4
|
-
import { e as f } from "../../../chunks/events-
|
|
3
|
+
import { K as p, d as u } from "../../../chunks/kt-element-Djx2JcGl.js";
|
|
4
|
+
import { e as f } from "../../../chunks/events-r51msXNf.js";
|
|
5
5
|
import "../../core/kt-icon/kt-icon.js";
|
|
6
6
|
var h = Object.defineProperty, i = (a, o, t, y) => {
|
|
7
7
|
for (var e = void 0, s = a.length - 1, l; s >= 0; s--)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { css as h, nothing as c, html as p } from "lit";
|
|
2
2
|
import { query as m, property as o } from "lit/decorators.js";
|
|
3
|
-
import { K as g, d as y } from "../../../chunks/kt-element-
|
|
4
|
-
import { e as f } from "../../../chunks/events-
|
|
3
|
+
import { K as g, d as y } from "../../../chunks/kt-element-Djx2JcGl.js";
|
|
4
|
+
import { e as f } from "../../../chunks/events-r51msXNf.js";
|
|
5
5
|
import { o as u, c as b, i as v } from "../../../chunks/dialog-CPIfFIlF.js";
|
|
6
|
-
import { s as r } from "../../../chunks/index-
|
|
6
|
+
import { s as r } from "../../../chunks/index-STEEvEP7.js";
|
|
7
7
|
import "../../core/kt-button/kt-button.js";
|
|
8
8
|
var k = Object.defineProperty, a = (n, e, l, x) => {
|
|
9
9
|
for (var i = void 0, s = n.length - 1, d; s >= 0; s--)
|
|
@@ -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 { type KtOption } from '#internal/listbox';
|
|
4
4
|
export type KtDropdownPlacement = 'bottom' | 'top';
|
|
@@ -32,6 +32,7 @@ export declare class KtDropdown extends KtElement {
|
|
|
32
32
|
private open;
|
|
33
33
|
/** Where the panel actually landed, after checking the room available. */
|
|
34
34
|
private placement;
|
|
35
|
+
private floating;
|
|
35
36
|
/** Menu rows. Leave empty and slot into `panel` for custom content. */
|
|
36
37
|
options: readonly KtOption[];
|
|
37
38
|
/** Marks one row as current. */
|
|
@@ -47,13 +48,14 @@ export declare class KtDropdown extends KtElement {
|
|
|
47
48
|
connectedCallback(): void;
|
|
48
49
|
disconnectedCallback(): void;
|
|
49
50
|
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
51
|
+
* The outside click and Escape a panel reacts to — only while it is
|
|
52
|
+
* open. A page of closed menus should not run a handler per menu on every
|
|
53
|
+
* click and keystroke.
|
|
52
54
|
*/
|
|
53
|
-
private
|
|
55
|
+
private listen;
|
|
54
56
|
private onDocumentPointerDown;
|
|
55
57
|
private onDocumentKeyDown;
|
|
56
|
-
updated(): void;
|
|
58
|
+
updated(changed: PropertyValues): void;
|
|
57
59
|
/**
|
|
58
60
|
* Puts the popup state on the slotted trigger — the element that takes focus,
|
|
59
61
|
* so the one a screen reader announces. A `<kt-button>` gets it through its
|