kanto-ds 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +26 -0
- package/README.md +155 -0
- package/dist/assets/fonts/README.md +19 -0
- package/dist/assets/fonts/manrope/OFL.txt +93 -0
- package/dist/assets/fonts/manrope/manrope-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/manrope/manrope-cyrillic-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/manrope/manrope-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/manrope/manrope-latin-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/mulish/OFL.txt +93 -0
- package/dist/assets/fonts/mulish/mulish-cyrillic-ext-wght-italic.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-cyrillic-wght-italic.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-cyrillic-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-latin-ext-wght-italic.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-latin-wght-italic.woff2 +0 -0
- package/dist/assets/fonts/mulish/mulish-latin-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/source_code_pro/OFL.txt +93 -0
- package/dist/assets/fonts/source_code_pro/SourceCodePro-Regular.woff2 +0 -0
- package/dist/chunks/dialog-CPIfFIlF.js +29 -0
- package/dist/chunks/dialog-CPIfFIlF.js.map +1 -0
- package/dist/chunks/events-Bjl5Zmmq.js +18 -0
- package/dist/chunks/events-Bjl5Zmmq.js.map +1 -0
- package/dist/chunks/form-control-CxjBTt1c.js +17 -0
- package/dist/chunks/form-control-CxjBTt1c.js.map +1 -0
- package/dist/chunks/kt-element-CcMLO5e8.js +28 -0
- package/dist/chunks/kt-element-CcMLO5e8.js.map +1 -0
- package/dist/chunks/listbox-CUXYn_3S.js +101 -0
- package/dist/chunks/listbox-CUXYn_3S.js.map +1 -0
- package/dist/chunks/registry-X4LS9J5K.js +30 -0
- package/dist/chunks/registry-X4LS9J5K.js.map +1 -0
- package/dist/chunks/slots-BPbIdxAJ.js +7 -0
- package/dist/chunks/slots-BPbIdxAJ.js.map +1 -0
- package/dist/chunks/toaster-PmdKSV5x.js +40 -0
- package/dist/chunks/toaster-PmdKSV5x.js.map +1 -0
- package/dist/components/core/kt-avatar/kt-avatar.d.ts +49 -0
- package/dist/components/core/kt-avatar/kt-avatar.js +156 -0
- package/dist/components/core/kt-avatar/kt-avatar.js.map +1 -0
- package/dist/components/core/kt-badge/kt-badge.d.ts +77 -0
- package/dist/components/core/kt-badge/kt-badge.js +254 -0
- package/dist/components/core/kt-badge/kt-badge.js.map +1 -0
- package/dist/components/core/kt-button/kt-button.d.ts +71 -0
- package/dist/components/core/kt-button/kt-button.js +271 -0
- package/dist/components/core/kt-button/kt-button.js.map +1 -0
- package/dist/components/core/kt-card/kt-card.d.ts +62 -0
- package/dist/components/core/kt-card/kt-card.js +230 -0
- package/dist/components/core/kt-card/kt-card.js.map +1 -0
- package/dist/components/core/kt-code/kt-code.d.ts +55 -0
- package/dist/components/core/kt-code/kt-code.js +155 -0
- package/dist/components/core/kt-code/kt-code.js.map +1 -0
- package/dist/components/core/kt-icon/kt-icon.d.ts +44 -0
- package/dist/components/core/kt-icon/kt-icon.js +85 -0
- package/dist/components/core/kt-icon/kt-icon.js.map +1 -0
- package/dist/components/core/kt-kbd/kt-kbd.d.ts +38 -0
- package/dist/components/core/kt-kbd/kt-kbd.js +89 -0
- package/dist/components/core/kt-kbd/kt-kbd.js.map +1 -0
- package/dist/components/data/kt-chart/kt-chart.d.ts +99 -0
- package/dist/components/data/kt-chart/kt-chart.js +406 -0
- package/dist/components/data/kt-chart/kt-chart.js.map +1 -0
- package/dist/components/data/kt-meter/kt-meter.d.ts +63 -0
- package/dist/components/data/kt-meter/kt-meter.js +177 -0
- package/dist/components/data/kt-meter/kt-meter.js.map +1 -0
- package/dist/components/data/kt-pagination/kt-pagination.d.ts +35 -0
- package/dist/components/data/kt-pagination/kt-pagination.js +88 -0
- package/dist/components/data/kt-pagination/kt-pagination.js.map +1 -0
- package/dist/components/data/kt-stat/kt-stat.d.ts +60 -0
- package/dist/components/data/kt-stat/kt-stat.js +137 -0
- package/dist/components/data/kt-stat/kt-stat.js.map +1 -0
- package/dist/components/data/kt-table/kt-table.d.ts +99 -0
- package/dist/components/data/kt-table/kt-table.js +340 -0
- package/dist/components/data/kt-table/kt-table.js.map +1 -0
- package/dist/components/data/kt-timeline/kt-timeline.d.ts +78 -0
- package/dist/components/data/kt-timeline/kt-timeline.js +252 -0
- package/dist/components/data/kt-timeline/kt-timeline.js.map +1 -0
- package/dist/components/feedback/kt-alert/kt-alert.d.ts +46 -0
- package/dist/components/feedback/kt-alert/kt-alert.js +180 -0
- package/dist/components/feedback/kt-alert/kt-alert.js.map +1 -0
- package/dist/components/feedback/kt-empty-state/kt-empty-state.d.ts +40 -0
- package/dist/components/feedback/kt-empty-state/kt-empty-state.js +100 -0
- package/dist/components/feedback/kt-empty-state/kt-empty-state.js.map +1 -0
- package/dist/components/feedback/kt-progress-bar/kt-progress-bar.d.ts +53 -0
- package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +212 -0
- package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js.map +1 -0
- package/dist/components/feedback/kt-skeleton/kt-skeleton.d.ts +43 -0
- package/dist/components/feedback/kt-skeleton/kt-skeleton.js +117 -0
- package/dist/components/feedback/kt-skeleton/kt-skeleton.js.map +1 -0
- package/dist/components/feedback/kt-toast/kt-toast.d.ts +57 -0
- package/dist/components/feedback/kt-toast/kt-toast.js +231 -0
- package/dist/components/feedback/kt-toast/kt-toast.js.map +1 -0
- package/dist/components/feedback/kt-toast-container/kt-toast-container.d.ts +60 -0
- package/dist/components/feedback/kt-toast-container/kt-toast-container.js +100 -0
- package/dist/components/feedback/kt-toast-container/kt-toast-container.js.map +1 -0
- package/dist/components/feedback/kt-toast-container/toaster.d.ts +37 -0
- package/dist/components/feedback/kt-tooltip/kt-tooltip.d.ts +57 -0
- package/dist/components/feedback/kt-tooltip/kt-tooltip.js +138 -0
- package/dist/components/feedback/kt-tooltip/kt-tooltip.js.map +1 -0
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.d.ts +68 -0
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +287 -0
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.js.map +1 -0
- package/dist/components/forms/kt-form/kt-form.d.ts +75 -0
- package/dist/components/forms/kt-form/kt-form.js +187 -0
- package/dist/components/forms/kt-form/kt-form.js.map +1 -0
- package/dist/components/forms/kt-input/kt-input.d.ts +112 -0
- package/dist/components/forms/kt-input/kt-input.js +556 -0
- package/dist/components/forms/kt-input/kt-input.js.map +1 -0
- package/dist/components/forms/kt-input-menu/kt-input-menu.d.ts +60 -0
- package/dist/components/forms/kt-input-menu/kt-input-menu.js +313 -0
- package/dist/components/forms/kt-input-menu/kt-input-menu.js.map +1 -0
- package/dist/components/forms/kt-label-input/kt-label-input.d.ts +42 -0
- package/dist/components/forms/kt-label-input/kt-label-input.js +69 -0
- package/dist/components/forms/kt-label-input/kt-label-input.js.map +1 -0
- package/dist/components/forms/kt-select/kt-select.d.ts +80 -0
- package/dist/components/forms/kt-select/kt-select.js +334 -0
- package/dist/components/forms/kt-select/kt-select.js.map +1 -0
- package/dist/components/forms/kt-textarea/kt-textarea.d.ts +62 -0
- package/dist/components/forms/kt-textarea/kt-textarea.js +239 -0
- package/dist/components/forms/kt-textarea/kt-textarea.js.map +1 -0
- package/dist/components/forms/kt-toggle/kt-toggle.d.ts +53 -0
- package/dist/components/forms/kt-toggle/kt-toggle.js +170 -0
- package/dist/components/forms/kt-toggle/kt-toggle.js.map +1 -0
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.d.ts +45 -0
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +93 -0
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js.map +1 -0
- package/dist/components/navigation/kt-header/kt-header.d.ts +67 -0
- package/dist/components/navigation/kt-header/kt-header.js +195 -0
- package/dist/components/navigation/kt-header/kt-header.js.map +1 -0
- package/dist/components/navigation/kt-page-header/kt-page-header.d.ts +48 -0
- package/dist/components/navigation/kt-page-header/kt-page-header.js +111 -0
- package/dist/components/navigation/kt-page-header/kt-page-header.js.map +1 -0
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.d.ts +63 -0
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +228 -0
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -0
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.d.ts +94 -0
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +265 -0
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js.map +1 -0
- package/dist/components/navigation/kt-tabs/kt-tabs.d.ts +64 -0
- package/dist/components/navigation/kt-tabs/kt-tabs.js +175 -0
- package/dist/components/navigation/kt-tabs/kt-tabs.js.map +1 -0
- package/dist/components/navigation/kt-toggle-button/kt-toggle-button.d.ts +50 -0
- package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +191 -0
- package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js.map +1 -0
- package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.d.ts +55 -0
- package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +128 -0
- package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js.map +1 -0
- package/dist/components/overlays/kt-collapsible/kt-collapsible.d.ts +42 -0
- package/dist/components/overlays/kt-collapsible/kt-collapsible.js +107 -0
- package/dist/components/overlays/kt-collapsible/kt-collapsible.js.map +1 -0
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.d.ts +56 -0
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +155 -0
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js.map +1 -0
- package/dist/components/overlays/kt-dropdown/kt-dropdown.d.ts +64 -0
- package/dist/components/overlays/kt-dropdown/kt-dropdown.js +212 -0
- package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -0
- package/dist/components/overlays/kt-modal/kt-modal.d.ts +61 -0
- package/dist/components/overlays/kt-modal/kt-modal.js +207 -0
- package/dist/components/overlays/kt-modal/kt-modal.js.map +1 -0
- package/dist/components/overlays/kt-side-panel/kt-side-panel.d.ts +52 -0
- package/dist/components/overlays/kt-side-panel/kt-side-panel.js +178 -0
- package/dist/components/overlays/kt-side-panel/kt-side-panel.js.map +1 -0
- package/dist/icons/defaults.d.ts +25 -0
- package/dist/icons/index.d.ts +3 -0
- package/dist/icons/index.js +37 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/icons/registry.d.ts +38 -0
- package/dist/index.d.ts +81 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/countries.d.ts +37 -0
- package/dist/internal/dialog.d.ts +22 -0
- package/dist/internal/events.d.ts +14 -0
- package/dist/internal/form-control.d.ts +27 -0
- package/dist/internal/format.d.ts +8 -0
- package/dist/internal/kt-element.d.ts +22 -0
- package/dist/internal/listbox.d.ts +36 -0
- package/dist/internal/slots.d.ts +10 -0
- package/dist/react/index.d.ts +208 -0
- package/dist/react/index.js +314 -0
- package/dist/react/index.js.map +1 -0
- package/dist/styles.css +13 -0
- package/dist/tokens/README.md +63 -0
- package/dist/tokens/base.css +79 -0
- package/dist/tokens/colors.css +125 -0
- package/dist/tokens/fonts.css +136 -0
- package/dist/tokens/index.css +12 -0
- package/dist/tokens/responsive.css +108 -0
- package/dist/tokens/spacing.css +66 -0
- package/dist/tokens/theme-light.css +144 -0
- package/dist/tokens/typography.css +41 -0
- package/dist/vue/index.d.ts +143 -0
- package/dist/vue/index.js +56 -0
- package/dist/vue/index.js.map +1 -0
- package/package.json +296 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { css as m, nothing as i, html as s } from "lit";
|
|
2
|
+
import { query as f, property as a } from "lit/decorators.js";
|
|
3
|
+
import { classMap as u } from "lit/directives/class-map.js";
|
|
4
|
+
import { live as b } from "lit/directives/live.js";
|
|
5
|
+
import { K as c, d as g } from "../../../chunks/kt-element-CcMLO5e8.js";
|
|
6
|
+
import { e as p } from "../../../chunks/events-Bjl5Zmmq.js";
|
|
7
|
+
import { a as y, s as v, b as x } from "../../../chunks/form-control-CxjBTt1c.js";
|
|
8
|
+
import "../../core/kt-icon/kt-icon.js";
|
|
9
|
+
var w = Object.defineProperty, r = (n, e, o, $) => {
|
|
10
|
+
for (var l = void 0, h = n.length - 1, d; h >= 0; h--)
|
|
11
|
+
(d = n[h]) && (l = d(e, o, l) || l);
|
|
12
|
+
return l && w(e, o, l), l;
|
|
13
|
+
};
|
|
14
|
+
class t extends c {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments), this.internals = null, this.defaultValue = "", this.value = "", this.name = "", this.placeholder = "", this.rows = 3, this.disabled = !1, this.readonly = !1, this.required = !1, this.error = "", this.label = "", this.resize = "none";
|
|
17
|
+
}
|
|
18
|
+
static {
|
|
19
|
+
this.formAssociated = !0;
|
|
20
|
+
}
|
|
21
|
+
static {
|
|
22
|
+
this.styles = [
|
|
23
|
+
c.styles,
|
|
24
|
+
m`
|
|
25
|
+
:host {
|
|
26
|
+
display: block;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.field {
|
|
30
|
+
display: flex;
|
|
31
|
+
align-items: flex-start;
|
|
32
|
+
width: 100%;
|
|
33
|
+
min-height: var(--button-height);
|
|
34
|
+
background-color: var(--surface-field);
|
|
35
|
+
border-radius: var(--radius-input);
|
|
36
|
+
/* A resting hairline. A field is a fill on --surface-field, which is
|
|
37
|
+
one ramp step from the page in dark and almost the same colour in
|
|
38
|
+
light — so on a card or inside a modal it simply disappeared and
|
|
39
|
+
read as a bare native control.
|
|
40
|
+
|
|
41
|
+
A border rather than an outline, because the control inside fills
|
|
42
|
+
the field exactly and a coincident outline is painted over by the
|
|
43
|
+
native widget. A border insets the control by its own width, so it
|
|
44
|
+
cannot be covered. box-sizing: border-box keeps the outer size.
|
|
45
|
+
|
|
46
|
+
The hover and focus rings stay outlines on top of it, and the
|
|
47
|
+
transparent resting outline is what they animate from: without it
|
|
48
|
+
outline-color starts at the initial value, which resolves to the
|
|
49
|
+
text colour, and hover flashed near-white before settling. */
|
|
50
|
+
border: var(--border-width) solid var(--border-field);
|
|
51
|
+
outline: var(--outline-width) solid transparent;
|
|
52
|
+
transition: outline-color var(--duration-instant);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.field:hover {
|
|
56
|
+
outline: var(--outline-width) solid var(--color-text-700);
|
|
57
|
+
}
|
|
58
|
+
.field:focus-within {
|
|
59
|
+
outline: var(--outline-width) solid var(--color-primary-base);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.error,
|
|
63
|
+
.error:hover,
|
|
64
|
+
.error:focus-within {
|
|
65
|
+
outline: var(--outline-width) solid var(--color-danger-base);
|
|
66
|
+
}
|
|
67
|
+
.error textarea {
|
|
68
|
+
color: var(--color-danger-base);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.disabled {
|
|
72
|
+
background-color: var(--color-dark-14);
|
|
73
|
+
pointer-events: none;
|
|
74
|
+
}
|
|
75
|
+
.disabled textarea {
|
|
76
|
+
color: var(--text-disabled);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
textarea {
|
|
80
|
+
width: 100%;
|
|
81
|
+
min-height: calc(var(--button-height) - var(--gap-element) * 2);
|
|
82
|
+
padding: var(--text-area-padding);
|
|
83
|
+
color: var(--text-body);
|
|
84
|
+
font: var(--font-input);
|
|
85
|
+
background: transparent;
|
|
86
|
+
border: none;
|
|
87
|
+
outline: none;
|
|
88
|
+
resize: none;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
:host([resize='vertical']) textarea {
|
|
92
|
+
resize: vertical;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
textarea::placeholder {
|
|
96
|
+
color: var(--color-text-500);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.meta {
|
|
100
|
+
display: flex;
|
|
101
|
+
flex: none;
|
|
102
|
+
flex-direction: column;
|
|
103
|
+
align-items: center;
|
|
104
|
+
gap: var(--gap-element);
|
|
105
|
+
margin: 10px var(--button-padding-x) 0 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.counter {
|
|
109
|
+
color: var(--color-text-700);
|
|
110
|
+
font: var(--font-normal-small);
|
|
111
|
+
font-variant-numeric: tabular-nums;
|
|
112
|
+
white-space: nowrap;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.counter.at-limit {
|
|
116
|
+
color: var(--color-danger-base);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.error-icon {
|
|
120
|
+
display: flex;
|
|
121
|
+
color: var(--color-danger-base);
|
|
122
|
+
}
|
|
123
|
+
`
|
|
124
|
+
];
|
|
125
|
+
}
|
|
126
|
+
connectedCallback() {
|
|
127
|
+
super.connectedCallback(), this.internals ??= y(this), this.defaultValue = this.value, v(this.internals, this.value);
|
|
128
|
+
}
|
|
129
|
+
willUpdate(e) {
|
|
130
|
+
if (e.has("value") || e.has("required") || e.has("error")) {
|
|
131
|
+
v(this.internals, this.value);
|
|
132
|
+
const o = this.required && this.value.length === 0;
|
|
133
|
+
x(
|
|
134
|
+
this.internals,
|
|
135
|
+
{ valueMissing: o, customError: !!this.error },
|
|
136
|
+
this.error || (o ? "This field is required." : "")
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
formResetCallback() {
|
|
141
|
+
this.value = this.defaultValue;
|
|
142
|
+
}
|
|
143
|
+
formStateRestoreCallback(e) {
|
|
144
|
+
this.value = e;
|
|
145
|
+
}
|
|
146
|
+
focus(e) {
|
|
147
|
+
this.control?.focus(e);
|
|
148
|
+
}
|
|
149
|
+
blur() {
|
|
150
|
+
this.control?.blur();
|
|
151
|
+
}
|
|
152
|
+
onInput(e) {
|
|
153
|
+
this.value = e.target.value, p(this, "kt-input", { value: this.value });
|
|
154
|
+
}
|
|
155
|
+
onChange(e) {
|
|
156
|
+
e.stopPropagation(), p(this, "kt-change", { value: this.value });
|
|
157
|
+
}
|
|
158
|
+
render() {
|
|
159
|
+
const e = this.maxlength !== void 0, o = this.maxlength !== void 0 && this.value.length >= this.maxlength;
|
|
160
|
+
return s`<div
|
|
161
|
+
part="base"
|
|
162
|
+
class=${u({
|
|
163
|
+
field: !0,
|
|
164
|
+
error: !!this.error,
|
|
165
|
+
disabled: this.disabled
|
|
166
|
+
})}
|
|
167
|
+
>
|
|
168
|
+
<textarea
|
|
169
|
+
part="control"
|
|
170
|
+
name=${this.name || i}
|
|
171
|
+
rows=${this.rows}
|
|
172
|
+
maxlength=${this.maxlength ?? i}
|
|
173
|
+
placeholder=${this.placeholder || i}
|
|
174
|
+
aria-label=${this.label || i}
|
|
175
|
+
aria-invalid=${this.error ? "true" : i}
|
|
176
|
+
.value=${b(this.value)}
|
|
177
|
+
?disabled=${this.disabled}
|
|
178
|
+
?readonly=${this.readonly}
|
|
179
|
+
?required=${this.required}
|
|
180
|
+
@input=${this.onInput}
|
|
181
|
+
@change=${this.onChange}
|
|
182
|
+
></textarea>
|
|
183
|
+
|
|
184
|
+
${this.error || e ? s`<div class="meta">
|
|
185
|
+
${this.error ? s`<span class="error-icon" title=${this.error}>
|
|
186
|
+
<kt-icon name="circle-alert" size="18" label=${this.error}></kt-icon>
|
|
187
|
+
</span>` : i}
|
|
188
|
+
${e ? s`<span
|
|
189
|
+
part="counter"
|
|
190
|
+
class=${u({ counter: !0, "at-limit": o })}
|
|
191
|
+
aria-live="polite"
|
|
192
|
+
>
|
|
193
|
+
${this.value.length} / ${this.maxlength}
|
|
194
|
+
</span>` : i}
|
|
195
|
+
</div>` : i}
|
|
196
|
+
</div>`;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
r([
|
|
200
|
+
f("textarea")
|
|
201
|
+
], t.prototype, "control");
|
|
202
|
+
r([
|
|
203
|
+
a({ type: String })
|
|
204
|
+
], t.prototype, "value");
|
|
205
|
+
r([
|
|
206
|
+
a({ type: String })
|
|
207
|
+
], t.prototype, "name");
|
|
208
|
+
r([
|
|
209
|
+
a({ type: String })
|
|
210
|
+
], t.prototype, "placeholder");
|
|
211
|
+
r([
|
|
212
|
+
a({ type: Number })
|
|
213
|
+
], t.prototype, "rows");
|
|
214
|
+
r([
|
|
215
|
+
a({ type: Number })
|
|
216
|
+
], t.prototype, "maxlength");
|
|
217
|
+
r([
|
|
218
|
+
a({ type: Boolean, reflect: !0 })
|
|
219
|
+
], t.prototype, "disabled");
|
|
220
|
+
r([
|
|
221
|
+
a({ type: Boolean, reflect: !0 })
|
|
222
|
+
], t.prototype, "readonly");
|
|
223
|
+
r([
|
|
224
|
+
a({ type: Boolean, reflect: !0 })
|
|
225
|
+
], t.prototype, "required");
|
|
226
|
+
r([
|
|
227
|
+
a({ type: String, reflect: !0 })
|
|
228
|
+
], t.prototype, "error");
|
|
229
|
+
r([
|
|
230
|
+
a({ type: String })
|
|
231
|
+
], t.prototype, "label");
|
|
232
|
+
r([
|
|
233
|
+
a({ type: String, reflect: !0 })
|
|
234
|
+
], t.prototype, "resize");
|
|
235
|
+
g("kt-textarea", t);
|
|
236
|
+
export {
|
|
237
|
+
t as KtTextarea
|
|
238
|
+
};
|
|
239
|
+
//# sourceMappingURL=kt-textarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kt-textarea.js","sources":["../../../../src/components/forms/kt-textarea/kt-textarea.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { live } from 'lit/directives/live.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from '#internal/form-control';\nimport '../../core/kt-icon/kt-icon.js';\n\n/**\n * A multi-line text field, with the same borderless fill and outline states as\n * `<kt-input>`.\n *\n * A character counter appears whenever `maxlength` is set — the field tells\n * the user where the limit is before the browser silently stops accepting\n * keystrokes.\n *\n * @element kt-textarea\n *\n * @csspart base - The field container.\n * @csspart control - The native `<textarea>`.\n * @csspart counter - The character counter.\n *\n * @fires kt-input - On every keystroke. `detail: { value }`.\n * @fires kt-change - When the value is committed. `detail: { value }`.\n */\nexport class KtTextarea extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .field {\n display: flex;\n align-items: flex-start;\n width: 100%;\n min-height: var(--button-height);\n background-color: var(--surface-field);\n border-radius: var(--radius-input);\n /* A resting hairline. A field is a fill on --surface-field, which is\n one ramp step from the page in dark and almost the same colour in\n light — so on a card or inside a modal it simply disappeared and\n read as a bare native control.\n\n A border rather than an outline, because the control inside fills\n the field exactly and a coincident outline is painted over by the\n native widget. A border insets the control by its own width, so it\n cannot be covered. box-sizing: border-box keeps the outer size.\n\n The hover and focus rings stay outlines on top of it, and the\n transparent resting outline is what they animate from: without it\n outline-color starts at the initial value, which resolves to the\n text colour, and hover flashed near-white before settling. */\n border: var(--border-width) solid var(--border-field);\n outline: var(--outline-width) solid transparent;\n transition: outline-color var(--duration-instant);\n }\n\n .field:hover {\n outline: var(--outline-width) solid var(--color-text-700);\n }\n .field:focus-within {\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n\n .error,\n .error:hover,\n .error:focus-within {\n outline: var(--outline-width) solid var(--color-danger-base);\n }\n .error textarea {\n color: var(--color-danger-base);\n }\n\n .disabled {\n background-color: var(--color-dark-14);\n pointer-events: none;\n }\n .disabled textarea {\n color: var(--text-disabled);\n }\n\n textarea {\n width: 100%;\n min-height: calc(var(--button-height) - var(--gap-element) * 2);\n padding: var(--text-area-padding);\n color: var(--text-body);\n font: var(--font-input);\n background: transparent;\n border: none;\n outline: none;\n resize: none;\n }\n\n :host([resize='vertical']) textarea {\n resize: vertical;\n }\n\n textarea::placeholder {\n color: var(--color-text-500);\n }\n\n .meta {\n display: flex;\n flex: none;\n flex-direction: column;\n align-items: center;\n gap: var(--gap-element);\n margin: 10px var(--button-padding-x) 0 0;\n }\n\n .counter {\n color: var(--color-text-700);\n font: var(--font-normal-small);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n }\n\n .counter.at-limit {\n color: var(--color-danger-base);\n }\n\n .error-icon {\n display: flex;\n color: var(--color-danger-base);\n }\n `,\n ];\n\n @query('textarea')\n private control!: HTMLTextAreaElement;\n\n private internals: UsableInternals | null = null;\n private defaultValue = '';\n\n @property({ type: String })\n value = '';\n\n @property({ type: String })\n name = '';\n\n @property({ type: String })\n placeholder = '';\n\n @property({ type: Number })\n rows = 3;\n\n @property({ type: Number })\n maxlength?: number;\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n readonly = false;\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /** Error message. A non-empty value puts the field in its error state. */\n @property({ type: String, reflect: true })\n error = '';\n\n /** Accessible name, when no `<kt-label-input>` wraps the field. */\n @property({ type: String })\n label = '';\n\n /**\n * Whether the reader may drag the field taller.\n *\n * Off by default, as in the rest of Kanto: the grip is drawn by the operating\n * system, lands on the field's rounded corner and belongs to no design\n * system — and a field the layout sized is not usually the reader's to\n * resize. Turn it on where the content genuinely varies.\n */\n @property({ type: String, reflect: true })\n resize: 'vertical' | 'none' = 'none';\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultValue = this.value;\n setFormValue(this.internals, this.value);\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('value') || changed.has('required') || changed.has('error')) {\n setFormValue(this.internals, this.value);\n\n const missing = this.required && this.value.length === 0;\n setValidity(\n this.internals,\n { valueMissing: missing, customError: Boolean(this.error) },\n this.error || (missing ? 'This field is required.' : ''),\n );\n }\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n }\n\n formStateRestoreCallback(state: string): void {\n this.value = state;\n }\n\n override focus(options?: FocusOptions): void {\n this.control?.focus(options);\n }\n\n override blur(): void {\n this.control?.blur();\n }\n\n private onInput(event: Event): void {\n this.value = (event.target as HTMLTextAreaElement).value;\n emit(this, 'kt-input', { value: this.value });\n }\n\n private onChange(event: Event): void {\n event.stopPropagation();\n emit(this, 'kt-change', { value: this.value });\n }\n\n override render(): TemplateResult {\n const showCounter = this.maxlength !== undefined;\n const atLimit = this.maxlength !== undefined && this.value.length >= this.maxlength;\n\n return html`<div\n part=\"base\"\n class=${classMap({\n field: true,\n error: Boolean(this.error),\n disabled: this.disabled,\n })}\n >\n <textarea\n part=\"control\"\n name=${this.name || nothing}\n rows=${this.rows}\n maxlength=${this.maxlength ?? nothing}\n placeholder=${this.placeholder || nothing}\n aria-label=${this.label || nothing}\n aria-invalid=${this.error ? 'true' : nothing}\n .value=${live(this.value)}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n ?required=${this.required}\n @input=${this.onInput}\n @change=${this.onChange}\n ></textarea>\n\n ${\n this.error || showCounter\n ? html`<div class=\"meta\">\n ${\n this.error\n ? html`<span class=\"error-icon\" title=${this.error}>\n <kt-icon name=\"circle-alert\" size=\"18\" label=${this.error}></kt-icon>\n </span>`\n : nothing\n }\n ${\n showCounter\n ? html`<span\n part=\"counter\"\n class=${classMap({ counter: true, 'at-limit': atLimit })}\n aria-live=\"polite\"\n >\n ${this.value.length} / ${this.maxlength}\n </span>`\n : nothing\n }\n </div>`\n : nothing\n }\n </div>`;\n }\n}\n\ndefineElement('kt-textarea', KtTextarea);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-textarea': KtTextarea;\n }\n}\n"],"names":["KtTextarea","KtElement","css","attachFormInternals","setFormValue","changed","missing","setValidity","state","options","event","emit","showCounter","atLimit","html","classMap","nothing","live","__decorateClass","query","property","defineElement"],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
2
|
+
import { KtElement } from '#internal/kt-element';
|
|
3
|
+
export type KtToggleSize = 'small' | 'medium' | 'large';
|
|
4
|
+
/**
|
|
5
|
+
* An on/off switch.
|
|
6
|
+
*
|
|
7
|
+
* Sized off the button heights so a toggle lines up with the controls beside
|
|
8
|
+
* it: the track is 1.8× the field height, the thumb is inset by 12% of it.
|
|
9
|
+
* Change `--button-height` and the switch follows.
|
|
10
|
+
*
|
|
11
|
+
* @element kt-toggle
|
|
12
|
+
*
|
|
13
|
+
* @slot - Optional label, rendered beside the switch and clickable.
|
|
14
|
+
*
|
|
15
|
+
* @csspart base - The button carrying `role="switch"`.
|
|
16
|
+
* @csspart track - The track.
|
|
17
|
+
* @csspart thumb - The sliding thumb.
|
|
18
|
+
*
|
|
19
|
+
* @fires kt-change - The state changed. `detail: { checked }`.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```html
|
|
23
|
+
* <kt-toggle checked>Notifications</kt-toggle>
|
|
24
|
+
* <kt-toggle size="small" disabled></kt-toggle>
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare class KtToggle extends KtElement {
|
|
28
|
+
static readonly formAssociated = true;
|
|
29
|
+
static styles: import("lit").CSSResultGroup[];
|
|
30
|
+
private internals;
|
|
31
|
+
private defaultChecked;
|
|
32
|
+
checked: boolean;
|
|
33
|
+
disabled: boolean;
|
|
34
|
+
size: KtToggleSize;
|
|
35
|
+
name: string;
|
|
36
|
+
/** Submitted when checked, as for a native checkbox. */
|
|
37
|
+
value: string;
|
|
38
|
+
/** Accessible name, when nothing is slotted. */
|
|
39
|
+
label: string;
|
|
40
|
+
connectedCallback(): void;
|
|
41
|
+
willUpdate(changed: PropertyValues<this>): void;
|
|
42
|
+
private syncFormValue;
|
|
43
|
+
formResetCallback(): void;
|
|
44
|
+
formStateRestoreCallback(state: string): void;
|
|
45
|
+
focus(options?: FocusOptions): void;
|
|
46
|
+
private toggle;
|
|
47
|
+
render(): TemplateResult;
|
|
48
|
+
}
|
|
49
|
+
declare global {
|
|
50
|
+
interface HTMLElementTagNameMap {
|
|
51
|
+
'kt-toggle': KtToggle;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { css as n, nothing as d, html as u } from "lit";
|
|
2
|
+
import { property as r } from "lit/decorators.js";
|
|
3
|
+
import { K as h, d as b } from "../../../chunks/kt-element-CcMLO5e8.js";
|
|
4
|
+
import { e as p } from "../../../chunks/events-Bjl5Zmmq.js";
|
|
5
|
+
import { a as m, s as g } from "../../../chunks/form-control-CxjBTt1c.js";
|
|
6
|
+
var k = Object.defineProperty, s = (i, t, l, v) => {
|
|
7
|
+
for (var a = void 0, o = i.length - 1, c; o >= 0; o--)
|
|
8
|
+
(c = i[o]) && (a = c(t, l, a) || a);
|
|
9
|
+
return a && k(t, l, a), a;
|
|
10
|
+
};
|
|
11
|
+
class e extends h {
|
|
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 = "";
|
|
14
|
+
}
|
|
15
|
+
static {
|
|
16
|
+
this.formAssociated = !0;
|
|
17
|
+
}
|
|
18
|
+
static {
|
|
19
|
+
this.styles = [
|
|
20
|
+
h.styles,
|
|
21
|
+
n`
|
|
22
|
+
:host {
|
|
23
|
+
display: inline-flex;
|
|
24
|
+
align-items: center;
|
|
25
|
+
gap: var(--gap-button);
|
|
26
|
+
|
|
27
|
+
/* The whole switch derives from the field height, so it keeps its
|
|
28
|
+
proportions at every breakpoint and every size. */
|
|
29
|
+
--switch-height: var(--button-height);
|
|
30
|
+
--switch-inset: calc(var(--switch-height) * 0.12);
|
|
31
|
+
--thumb-size: calc(var(--switch-height) - var(--switch-inset) * 2);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
:host([size='small']) {
|
|
35
|
+
--switch-height: var(--button-height-small);
|
|
36
|
+
}
|
|
37
|
+
:host([size='large']) {
|
|
38
|
+
--switch-height: var(--button-height-large);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
button {
|
|
42
|
+
display: inline-flex;
|
|
43
|
+
margin: 0;
|
|
44
|
+
padding: 0;
|
|
45
|
+
background: transparent;
|
|
46
|
+
border: none;
|
|
47
|
+
outline: none;
|
|
48
|
+
appearance: none;
|
|
49
|
+
cursor: pointer;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
button:disabled {
|
|
53
|
+
cursor: not-allowed;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
button:focus-visible .track {
|
|
57
|
+
outline: var(--outline-width) solid var(--color-primary-base);
|
|
58
|
+
outline-offset: 2px;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.track {
|
|
62
|
+
position: relative;
|
|
63
|
+
display: inline-block;
|
|
64
|
+
width: calc(var(--switch-height) * 1.8);
|
|
65
|
+
height: var(--switch-height);
|
|
66
|
+
background-color: var(--color-dark-24);
|
|
67
|
+
border-radius: var(--radius-full);
|
|
68
|
+
transition: background-color var(--duration-instant);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
button[aria-checked='true'] .track {
|
|
72
|
+
background-color: var(--color-primary-base);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.thumb {
|
|
76
|
+
position: absolute;
|
|
77
|
+
top: var(--switch-inset);
|
|
78
|
+
left: var(--switch-inset);
|
|
79
|
+
width: var(--thumb-size);
|
|
80
|
+
height: var(--thumb-size);
|
|
81
|
+
background-color: var(--color-white);
|
|
82
|
+
border-radius: var(--radius-full);
|
|
83
|
+
transition: left var(--duration-normal);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
button[aria-checked='true'] .thumb {
|
|
87
|
+
left: calc(100% - var(--switch-inset) - var(--thumb-size));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
:host([disabled]) .track {
|
|
91
|
+
background-color: var(--color-dark-22);
|
|
92
|
+
}
|
|
93
|
+
:host([disabled]) .thumb {
|
|
94
|
+
background-color: var(--color-text-500);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.label {
|
|
98
|
+
color: var(--text-body);
|
|
99
|
+
font: var(--font-normal-regular);
|
|
100
|
+
cursor: pointer;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
:host([disabled]) .label {
|
|
104
|
+
color: var(--text-disabled);
|
|
105
|
+
cursor: not-allowed;
|
|
106
|
+
}
|
|
107
|
+
`
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
connectedCallback() {
|
|
111
|
+
super.connectedCallback(), this.internals ??= m(this), this.defaultChecked = this.checked, this.syncFormValue();
|
|
112
|
+
}
|
|
113
|
+
willUpdate(t) {
|
|
114
|
+
(t.has("checked") || t.has("value")) && this.syncFormValue();
|
|
115
|
+
}
|
|
116
|
+
syncFormValue() {
|
|
117
|
+
g(this.internals, this.checked ? this.value : null);
|
|
118
|
+
}
|
|
119
|
+
formResetCallback() {
|
|
120
|
+
this.checked = this.defaultChecked;
|
|
121
|
+
}
|
|
122
|
+
formStateRestoreCallback(t) {
|
|
123
|
+
this.checked = t === this.value;
|
|
124
|
+
}
|
|
125
|
+
focus(t) {
|
|
126
|
+
this.shadowRoot?.querySelector("button")?.focus(t);
|
|
127
|
+
}
|
|
128
|
+
toggle() {
|
|
129
|
+
this.disabled || (this.checked = !this.checked, p(this, "kt-change", { checked: this.checked }));
|
|
130
|
+
}
|
|
131
|
+
render() {
|
|
132
|
+
return u`<button
|
|
133
|
+
part="base"
|
|
134
|
+
type="button"
|
|
135
|
+
role="switch"
|
|
136
|
+
aria-checked=${this.checked ? "true" : "false"}
|
|
137
|
+
aria-label=${this.label || d}
|
|
138
|
+
?disabled=${this.disabled}
|
|
139
|
+
@click=${this.toggle}
|
|
140
|
+
>
|
|
141
|
+
<span part="track" class="track">
|
|
142
|
+
<span part="thumb" class="thumb"></span>
|
|
143
|
+
</span>
|
|
144
|
+
</button>
|
|
145
|
+
<span class="label" @click=${this.toggle}><slot></slot></span>`;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
s([
|
|
149
|
+
r({ type: Boolean, reflect: !0 })
|
|
150
|
+
], e.prototype, "checked");
|
|
151
|
+
s([
|
|
152
|
+
r({ type: Boolean, reflect: !0 })
|
|
153
|
+
], e.prototype, "disabled");
|
|
154
|
+
s([
|
|
155
|
+
r({ type: String, reflect: !0 })
|
|
156
|
+
], e.prototype, "size");
|
|
157
|
+
s([
|
|
158
|
+
r({ type: String })
|
|
159
|
+
], e.prototype, "name");
|
|
160
|
+
s([
|
|
161
|
+
r({ type: String })
|
|
162
|
+
], e.prototype, "value");
|
|
163
|
+
s([
|
|
164
|
+
r({ type: String })
|
|
165
|
+
], e.prototype, "label");
|
|
166
|
+
b("kt-toggle", e);
|
|
167
|
+
export {
|
|
168
|
+
e as KtToggle
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=kt-toggle.js.map
|
|
@@ -0,0 +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([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 @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 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.disabled) 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 ?disabled=${this.disabled}\n @click=${this.toggle}\n >\n <span part=\"track\" class=\"track\">\n <span part=\"thumb\" class=\"thumb\"></span>\n </span>\n </button>\n <span 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","state","options","emit","html","nothing","__decorateClass","property","defineElement"],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type TemplateResult } from 'lit';
|
|
2
|
+
import { KtElement } from '#internal/kt-element';
|
|
3
|
+
import '../../core/kt-icon/kt-icon.js';
|
|
4
|
+
export interface KtBreadcrumbItem {
|
|
5
|
+
readonly label: string;
|
|
6
|
+
readonly href?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A trail showing where the current page sits.
|
|
10
|
+
*
|
|
11
|
+
* The last entry is the current page: rendered as text, not a link, and marked
|
|
12
|
+
* `aria-current="page"`. A breadcrumb whose final item links to the page you
|
|
13
|
+
* are already on is a dead control.
|
|
14
|
+
*
|
|
15
|
+
* @element kt-breadcrumb
|
|
16
|
+
*
|
|
17
|
+
* @csspart nav - The `<nav>`.
|
|
18
|
+
* @csspart item - A trail entry.
|
|
19
|
+
*
|
|
20
|
+
* @fires kt-navigate - An entry was activated. `detail: { item, index }`.
|
|
21
|
+
* Cancel it to keep the browser from following the href.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```js
|
|
25
|
+
* trail.items = [
|
|
26
|
+
* { label: 'Home', href: '/' },
|
|
27
|
+
* { label: 'Entities', href: '/entities' },
|
|
28
|
+
* { label: 'Entity 4812' },
|
|
29
|
+
* ];
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare class KtBreadcrumb extends KtElement {
|
|
33
|
+
static styles: import("lit").CSSResultGroup[];
|
|
34
|
+
/** The trail, root first. The last entry is the current page. */
|
|
35
|
+
items: readonly KtBreadcrumbItem[];
|
|
36
|
+
/** Accessible name for the navigation landmark. */
|
|
37
|
+
label: string;
|
|
38
|
+
private onSelect;
|
|
39
|
+
render(): TemplateResult;
|
|
40
|
+
}
|
|
41
|
+
declare global {
|
|
42
|
+
interface HTMLElementTagNameMap {
|
|
43
|
+
'kt-breadcrumb': KtBreadcrumb;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { css as d, nothing as f, html as s } from "lit";
|
|
2
|
+
import { property as c } from "lit/decorators.js";
|
|
3
|
+
import { K as p, d as u } from "../../../chunks/kt-element-CcMLO5e8.js";
|
|
4
|
+
import { e as h } from "../../../chunks/events-Bjl5Zmmq.js";
|
|
5
|
+
import "../../core/kt-icon/kt-icon.js";
|
|
6
|
+
var b = Object.defineProperty, m = (o, t, e, a) => {
|
|
7
|
+
for (var r = void 0, i = o.length - 1, l; i >= 0; i--)
|
|
8
|
+
(l = o[i]) && (r = l(t, e, r) || r);
|
|
9
|
+
return r && b(t, e, r), r;
|
|
10
|
+
};
|
|
11
|
+
class n extends p {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments), this.items = [], this.label = "Breadcrumb";
|
|
14
|
+
}
|
|
15
|
+
static {
|
|
16
|
+
this.styles = [
|
|
17
|
+
p.styles,
|
|
18
|
+
d`
|
|
19
|
+
:host {
|
|
20
|
+
display: block;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
nav {
|
|
24
|
+
display: flex;
|
|
25
|
+
flex-wrap: wrap;
|
|
26
|
+
align-items: center;
|
|
27
|
+
gap: 6px;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.item {
|
|
31
|
+
padding: 2px 6px;
|
|
32
|
+
color: var(--text-muted);
|
|
33
|
+
font: var(--font-normal-regular);
|
|
34
|
+
border-radius: 6px;
|
|
35
|
+
text-decoration: none;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
a.item:hover {
|
|
39
|
+
color: var(--text-body);
|
|
40
|
+
background: var(--color-dark-18);
|
|
41
|
+
text-decoration: none;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
a.item:focus-visible {
|
|
45
|
+
outline: var(--outline-width) solid var(--color-primary-base);
|
|
46
|
+
outline-offset: 1px;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.current {
|
|
50
|
+
color: var(--text-body);
|
|
51
|
+
font: var(--font-normal-medium);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.separator {
|
|
55
|
+
display: inline-flex;
|
|
56
|
+
color: var(--color-text-600);
|
|
57
|
+
}
|
|
58
|
+
`
|
|
59
|
+
];
|
|
60
|
+
}
|
|
61
|
+
onSelect(t, e, a) {
|
|
62
|
+
t.metaKey || t.ctrlKey || t.shiftKey || t.button !== 0 || !h(this, "kt-navigate", { item: e, index: a }).defaultPrevented || t.preventDefault();
|
|
63
|
+
}
|
|
64
|
+
render() {
|
|
65
|
+
const t = this.items.length - 1;
|
|
66
|
+
return s`<nav part="nav" aria-label=${this.label}>
|
|
67
|
+
${this.items.map(
|
|
68
|
+
(e, a) => a === t ? s`<span part="item" class="item current" aria-current="page">${e.label}</span>` : s`<a
|
|
69
|
+
part="item"
|
|
70
|
+
class="item"
|
|
71
|
+
href=${e.href ?? "#"}
|
|
72
|
+
@click=${(r) => this.onSelect(r, e, a)}
|
|
73
|
+
>${e.label}</a
|
|
74
|
+
>
|
|
75
|
+
<span class="separator" aria-hidden="true">
|
|
76
|
+
<kt-icon name="chevron-right" size="14"></kt-icon>
|
|
77
|
+
</span>`
|
|
78
|
+
)}
|
|
79
|
+
${this.items.length === 0 ? f : ""}
|
|
80
|
+
</nav>`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
m([
|
|
84
|
+
c({ attribute: !1 })
|
|
85
|
+
], n.prototype, "items");
|
|
86
|
+
m([
|
|
87
|
+
c({ type: String })
|
|
88
|
+
], n.prototype, "label");
|
|
89
|
+
u("kt-breadcrumb", n);
|
|
90
|
+
export {
|
|
91
|
+
n as KtBreadcrumb
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=kt-breadcrumb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kt-breadcrumb.js","sources":["../../../../src/components/navigation/kt-breadcrumb/kt-breadcrumb.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport '../../core/kt-icon/kt-icon.js';\n\nexport interface KtBreadcrumbItem {\n readonly label: string;\n readonly href?: string;\n}\n\n/**\n * A trail showing where the current page sits.\n *\n * The last entry is the current page: rendered as text, not a link, and marked\n * `aria-current=\"page\"`. A breadcrumb whose final item links to the page you\n * are already on is a dead control.\n *\n * @element kt-breadcrumb\n *\n * @csspart nav - The `<nav>`.\n * @csspart item - A trail entry.\n *\n * @fires kt-navigate - An entry was activated. `detail: { item, index }`.\n * Cancel it to keep the browser from following the href.\n *\n * @example\n * ```js\n * trail.items = [\n * { label: 'Home', href: '/' },\n * { label: 'Entities', href: '/entities' },\n * { label: 'Entity 4812' },\n * ];\n * ```\n */\nexport class KtBreadcrumb extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n nav {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n }\n\n .item {\n padding: 2px 6px;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n border-radius: 6px;\n text-decoration: none;\n }\n\n a.item:hover {\n color: var(--text-body);\n background: var(--color-dark-18);\n text-decoration: none;\n }\n\n a.item:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 1px;\n }\n\n .current {\n color: var(--text-body);\n font: var(--font-normal-medium);\n }\n\n .separator {\n display: inline-flex;\n color: var(--color-text-600);\n }\n `,\n ];\n\n /** The trail, root first. The last entry is the current page. */\n @property({ attribute: false })\n items: readonly KtBreadcrumbItem[] = [];\n\n /** Accessible name for the navigation landmark. */\n @property({ type: String })\n label = 'Breadcrumb';\n\n private onSelect(event: MouseEvent, item: KtBreadcrumbItem, index: number): void {\n // Let modified clicks through: they open a new tab, which is the user\n // asking the browser for something we should not intercept.\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.button !== 0) return;\n\n const proceed = emit(this, 'kt-navigate', { item, index });\n if (!proceed.defaultPrevented) return;\n event.preventDefault();\n }\n\n override render(): TemplateResult {\n const lastIndex = this.items.length - 1;\n\n return html`<nav part=\"nav\" aria-label=${this.label}>\n ${this.items.map((item, index) =>\n index === lastIndex\n ? html`<span part=\"item\" class=\"item current\" aria-current=\"page\">${item.label}</span>`\n : html`<a\n part=\"item\"\n class=\"item\"\n href=${item.href ?? '#'}\n @click=${(event: MouseEvent) => this.onSelect(event, item, index)}\n >${item.label}</a\n >\n <span class=\"separator\" aria-hidden=\"true\">\n <kt-icon name=\"chevron-right\" size=\"14\"></kt-icon>\n </span>`,\n )}\n ${this.items.length === 0 ? nothing : ''}\n </nav>`;\n }\n}\n\ndefineElement('kt-breadcrumb', KtBreadcrumb);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-breadcrumb': KtBreadcrumb;\n }\n}\n"],"names":["KtBreadcrumb","KtElement","css","event","item","index","emit","lastIndex","html","nothing","__decorateClass","property","defineElement"],"mappings":";;;;;;;;;;AAmCO,MAAMA,UAAqBC,EAAU;AAAA,EAArC,cAAA;AAAA,UAAA,GAAA,SAAA,GAgDL,KAAA,QAAqC,CAAA,GAIrC,KAAA,QAAQ;AAAA,EAAA;AAAA,EAnDR,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBA,EAAU;AAAA,MACVC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAyCF;AAAA,EAUQ,SAASC,GAAmBC,GAAwBC,GAAqB;AAM/E,IAHIF,EAAM,WAAWA,EAAM,WAAWA,EAAM,YAAYA,EAAM,WAAW,KAGrE,CADYG,EAAK,MAAM,eAAe,EAAE,MAAAF,GAAM,OAAAC,GAAO,EAC5C,oBACbF,EAAM,eAAA;AAAA,EACR;AAAA,EAES,SAAyB;AAChC,UAAMI,IAAY,KAAK,MAAM,SAAS;AAEtC,WAAOC,+BAAkC,KAAK,KAAK;AAAA,QAC/C,KAAK,MAAM;AAAA,MAAI,CAACJ,GAAMC,MACtBA,MAAUE,IACNC,+DAAkEJ,EAAK,KAAK,YAC5EI;AAAA;AAAA;AAAA,uBAGWJ,EAAK,QAAQ,GAAG;AAAA,yBACd,CAACD,MAAsB,KAAK,SAASA,GAAOC,GAAMC,CAAK,CAAC;AAAA,mBAC9DD,EAAK,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKtB;AAAA,QACC,KAAK,MAAM,WAAW,IAAIK,IAAU,EAAE;AAAA;AAAA,EAE5C;AACF;AArCEC,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GA/CnBX,EAgDX,WAAA,OAAA;AAIAU,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAnDfX,EAoDX,WAAA,OAAA;AAmCFY,EAAc,iBAAiBZ,CAAY;"}
|