kanto-ds 1.7.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -14
- package/dist/AGENTS.md +157 -0
- package/dist/cdn/kanto.min.js +4743 -932
- package/dist/chunks/block-Cci-Kff_.js +69 -0
- package/dist/chunks/block-Cci-Kff_.js.map +1 -0
- package/dist/chunks/defaults-yhaR6U65.js +70 -0
- package/dist/chunks/{defaults-Cpeg13O5.js.map → defaults-yhaR6U65.js.map} +1 -1
- package/dist/chunks/heading-DsnZsfg-.js +21 -0
- package/dist/chunks/heading-DsnZsfg-.js.map +1 -0
- package/dist/chunks/{index-TWJzttLX.js → index-1ZFgagWW.js} +37 -12
- package/dist/chunks/index-1ZFgagWW.js.map +1 -0
- package/dist/chunks/indicator-B_Rs8F92.js +49 -0
- package/dist/chunks/indicator-B_Rs8F92.js.map +1 -0
- package/dist/chunks/{kt-calendar-CtwOby1R.js → kt-calendar-SK8eapuy.js} +3 -3
- package/dist/chunks/{kt-calendar-CtwOby1R.js.map → kt-calendar-SK8eapuy.js.map} +1 -1
- package/dist/chunks/kt-color-picker-BoezCAmx.js +365 -0
- package/dist/chunks/kt-color-picker-BoezCAmx.js.map +1 -0
- package/dist/chunks/{kt-element-T0VbIBNp.js → kt-element-DvWtPQ1Y.js} +2 -2
- package/dist/chunks/{kt-element-T0VbIBNp.js.map → kt-element-DvWtPQ1Y.js.map} +1 -1
- package/dist/chunks/motion-ChVUUO7O.js +28 -0
- package/dist/chunks/motion-ChVUUO7O.js.map +1 -0
- package/dist/chunks/numbers-QyecMiSJ.js +9 -0
- package/dist/chunks/numbers-QyecMiSJ.js.map +1 -0
- package/dist/chunks/{segmented-field-BBXR4XFL.js → segmented-field-T_Zo6lc1.js} +2 -2
- package/dist/chunks/{segmented-field-BBXR4XFL.js.map → segmented-field-T_Zo6lc1.js.map} +1 -1
- package/dist/chunks/{typed-date-CPAUNHzr.js → typed-date-CaU0kXoY.js} +2 -2
- package/dist/chunks/{typed-date-CPAUNHzr.js.map → typed-date-CaU0kXoY.js.map} +1 -1
- package/dist/components/blocks/kt-auth-form/kt-auth-form.d.ts +143 -0
- package/dist/components/blocks/kt-auth-form/kt-auth-form.js +368 -0
- package/dist/components/blocks/kt-auth-form/kt-auth-form.js.map +1 -0
- package/dist/components/blocks/kt-blog-post/kt-blog-post.d.ts +75 -0
- package/dist/components/blocks/kt-blog-post/kt-blog-post.js +285 -0
- package/dist/components/blocks/kt-blog-post/kt-blog-post.js.map +1 -0
- package/dist/components/blocks/kt-cta/kt-cta.d.ts +51 -0
- package/dist/components/blocks/kt-cta/kt-cta.js +126 -0
- package/dist/components/blocks/kt-cta/kt-cta.js.map +1 -0
- package/dist/components/blocks/kt-empty-page/kt-empty-page.d.ts +75 -0
- package/dist/components/blocks/kt-empty-page/kt-empty-page.js +245 -0
- package/dist/components/blocks/kt-empty-page/kt-empty-page.js.map +1 -0
- package/dist/components/blocks/kt-error-page/kt-error-page.d.ts +65 -0
- package/dist/components/blocks/kt-error-page/kt-error-page.js +177 -0
- package/dist/components/blocks/kt-error-page/kt-error-page.js.map +1 -0
- package/dist/components/blocks/kt-faq/kt-faq.d.ts +61 -0
- package/dist/components/blocks/kt-faq/kt-faq.js +129 -0
- package/dist/components/blocks/kt-faq/kt-faq.js.map +1 -0
- package/dist/components/blocks/kt-feature-grid/kt-feature-grid.d.ts +59 -0
- package/dist/components/blocks/kt-feature-grid/kt-feature-grid.js +166 -0
- package/dist/components/blocks/kt-feature-grid/kt-feature-grid.js.map +1 -0
- package/dist/components/blocks/kt-hero/kt-hero.d.ts +51 -0
- package/dist/components/blocks/kt-hero/kt-hero.js +138 -0
- package/dist/components/blocks/kt-hero/kt-hero.js.map +1 -0
- package/dist/components/blocks/kt-logo-cloud/kt-logo-cloud.d.ts +46 -0
- package/dist/components/blocks/kt-logo-cloud/kt-logo-cloud.js +100 -0
- package/dist/components/blocks/kt-logo-cloud/kt-logo-cloud.js.map +1 -0
- package/dist/components/blocks/kt-newsletter/kt-newsletter.d.ts +85 -0
- package/dist/components/blocks/kt-newsletter/kt-newsletter.js +247 -0
- package/dist/components/blocks/kt-newsletter/kt-newsletter.js.map +1 -0
- package/dist/components/blocks/kt-post-grid/kt-post-grid.d.ts +73 -0
- package/dist/components/blocks/kt-post-grid/kt-post-grid.js +249 -0
- package/dist/components/blocks/kt-post-grid/kt-post-grid.js.map +1 -0
- package/dist/components/blocks/kt-pricing-table/kt-pricing-table.d.ts +102 -0
- package/dist/components/blocks/kt-pricing-table/kt-pricing-table.js +307 -0
- package/dist/components/blocks/kt-pricing-table/kt-pricing-table.js.map +1 -0
- package/dist/components/blocks/kt-settings-section/kt-settings-section.d.ts +52 -0
- package/dist/components/blocks/kt-settings-section/kt-settings-section.js +158 -0
- package/dist/components/blocks/kt-settings-section/kt-settings-section.js.map +1 -0
- package/dist/components/blocks/kt-testimonials/kt-testimonials.d.ts +56 -0
- package/dist/components/blocks/kt-testimonials/kt-testimonials.js +161 -0
- package/dist/components/blocks/kt-testimonials/kt-testimonials.js.map +1 -0
- package/dist/components/core/kt-avatar/kt-avatar.js +2 -2
- package/dist/components/core/kt-avatar-group/kt-avatar-group.d.ts +42 -0
- package/dist/components/core/kt-avatar-group/kt-avatar-group.js +97 -0
- package/dist/components/core/kt-avatar-group/kt-avatar-group.js.map +1 -0
- package/dist/components/core/kt-badge/kt-badge.js +2 -2
- package/dist/components/core/kt-button/flights.d.ts +27 -0
- package/dist/components/core/kt-button/kt-button.d.ts +52 -1
- package/dist/components/core/kt-button/kt-button.js +353 -77
- package/dist/components/core/kt-button/kt-button.js.map +1 -1
- package/dist/components/core/kt-button/morph.d.ts +27 -0
- package/dist/components/core/kt-card/kt-card.js +1 -1
- package/dist/components/core/kt-code/kt-code.d.ts +2 -1
- package/dist/components/core/kt-code/kt-code.js +52 -37
- package/dist/components/core/kt-code/kt-code.js.map +1 -1
- package/dist/components/core/kt-copy-button/kt-copy-button.d.ts +47 -0
- package/dist/components/core/kt-copy-button/kt-copy-button.js +74 -0
- package/dist/components/core/kt-copy-button/kt-copy-button.js.map +1 -0
- package/dist/components/core/kt-icon/kt-icon.js +2 -2
- package/dist/components/core/kt-kbd/kt-kbd.js +1 -1
- package/dist/components/core/kt-split-button/kt-split-button.js +2 -2
- package/dist/components/data/kt-chart/kt-chart.js +2 -2
- package/dist/components/data/kt-chat-message/kt-chat-message.d.ts +60 -0
- package/dist/components/data/kt-chat-message/kt-chat-message.js +204 -0
- package/dist/components/data/kt-chat-message/kt-chat-message.js.map +1 -0
- package/dist/components/data/kt-description-list/kt-description-list.d.ts +56 -0
- package/dist/components/data/kt-description-list/kt-description-list.js +120 -0
- package/dist/components/data/kt-description-list/kt-description-list.js.map +1 -0
- package/dist/components/data/kt-meter/kt-meter.js +8 -6
- package/dist/components/data/kt-meter/kt-meter.js.map +1 -1
- package/dist/components/data/kt-pagination/kt-pagination.js +2 -2
- package/dist/components/data/kt-stat/kt-stat.d.ts +3 -1
- package/dist/components/data/kt-stat/kt-stat.js +31 -16
- package/dist/components/data/kt-stat/kt-stat.js.map +1 -1
- package/dist/components/data/kt-table/kt-table.js +2 -2
- package/dist/components/data/kt-timeline/kt-timeline.js +2 -2
- package/dist/components/data/kt-timeline/kt-timeline.js.map +1 -1
- package/dist/components/data/kt-tree/kt-tree.d.ts +69 -0
- package/dist/components/data/kt-tree/kt-tree.js +208 -0
- package/dist/components/data/kt-tree/kt-tree.js.map +1 -0
- package/dist/components/feedback/kt-alert/kt-alert.js +2 -2
- package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
- package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +1 -1
- package/dist/components/feedback/kt-skeleton/kt-skeleton.js +1 -1
- package/dist/components/feedback/kt-toast/kt-toast.js +2 -2
- package/dist/components/feedback/kt-toast-container/kt-toast-container.d.ts +8 -1
- package/dist/components/feedback/kt-toast-container/kt-toast-container.js +65 -26
- package/dist/components/feedback/kt-toast-container/kt-toast-container.js.map +1 -1
- package/dist/components/feedback/kt-tooltip/kt-tooltip.js +1 -1
- package/dist/components/forms/kt-calendar/kt-calendar.js +3 -3
- package/dist/components/forms/kt-checkbox/kt-checkbox.d.ts +2 -0
- package/dist/components/forms/kt-checkbox/kt-checkbox.js +19 -8
- package/dist/components/forms/kt-checkbox/kt-checkbox.js.map +1 -1
- package/dist/components/forms/kt-color-picker/kt-color-picker.d.ts +66 -0
- package/dist/components/forms/kt-color-picker/kt-color-picker.js +14 -0
- package/dist/components/forms/kt-color-picker/kt-color-picker.js.map +1 -0
- package/dist/components/forms/kt-date-input/kt-date-input.js +5 -5
- package/dist/components/forms/kt-date-picker/kt-date-picker.js +4 -4
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +2 -2
- package/dist/components/forms/kt-form/kt-form.js +2 -2
- package/dist/components/forms/kt-input/kt-input.js +2 -2
- package/dist/components/forms/kt-input-menu/kt-input-menu.js +2 -2
- package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
- package/dist/components/forms/kt-multi-select/kt-multi-select.js +2 -2
- package/dist/components/forms/kt-number-input/kt-number-input.d.ts +92 -0
- package/dist/components/forms/kt-number-input/kt-number-input.js +366 -0
- package/dist/components/forms/kt-number-input/kt-number-input.js.map +1 -0
- package/dist/components/forms/kt-otp-input/kt-otp-input.d.ts +74 -0
- package/dist/components/forms/kt-otp-input/kt-otp-input.js +232 -0
- package/dist/components/forms/kt-otp-input/kt-otp-input.js.map +1 -0
- package/dist/components/forms/kt-prompt-input/kt-prompt-input.d.ts +74 -0
- package/dist/components/forms/kt-prompt-input/kt-prompt-input.js +213 -0
- package/dist/components/forms/kt-prompt-input/kt-prompt-input.js.map +1 -0
- package/dist/components/forms/kt-radio-group/kt-radio-group.js +2 -2
- package/dist/components/forms/kt-select/kt-select.js +2 -2
- package/dist/components/forms/kt-slider/kt-slider.d.ts +69 -0
- package/dist/components/forms/kt-slider/kt-slider.js +252 -0
- package/dist/components/forms/kt-slider/kt-slider.js.map +1 -0
- package/dist/components/forms/kt-textarea/kt-textarea.js +2 -2
- package/dist/components/forms/kt-time-input/kt-time-input.js +3 -3
- package/dist/components/forms/kt-toggle/kt-toggle.js +1 -1
- package/dist/components/navigation/kt-app-shell/kt-app-shell.d.ts +85 -0
- package/dist/components/navigation/kt-app-shell/kt-app-shell.js +220 -0
- package/dist/components/navigation/kt-app-shell/kt-app-shell.js.map +1 -0
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +2 -2
- package/dist/components/navigation/kt-footer/kt-footer.d.ts +82 -0
- package/dist/components/navigation/kt-footer/kt-footer.js +220 -0
- package/dist/components/navigation/kt-footer/kt-footer.js.map +1 -0
- package/dist/components/navigation/kt-header/kt-header.js +2 -2
- package/dist/components/navigation/kt-page-header/kt-page-header.js +2 -2
- package/dist/components/navigation/kt-page-header/kt-page-header.js.map +1 -1
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.d.ts +1 -0
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +81 -44
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -1
- package/dist/components/navigation/kt-steps/kt-steps.d.ts +68 -0
- package/dist/components/navigation/kt-steps/kt-steps.js +286 -0
- package/dist/components/navigation/kt-steps/kt-steps.js.map +1 -0
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +3 -3
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js.map +1 -1
- package/dist/components/navigation/kt-tabs/kt-tabs.d.ts +1 -0
- package/dist/components/navigation/kt-tabs/kt-tabs.js +92 -64
- package/dist/components/navigation/kt-tabs/kt-tabs.js.map +1 -1
- package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +1 -1
- package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +2 -2
- package/dist/components/navigation/kt-user-menu/kt-user-menu.d.ts +86 -0
- package/dist/components/navigation/kt-user-menu/kt-user-menu.js +298 -0
- package/dist/components/navigation/kt-user-menu/kt-user-menu.js.map +1 -0
- package/dist/components/overlays/kt-accordion/kt-accordion.d.ts +47 -0
- package/dist/components/overlays/kt-accordion/kt-accordion.js +80 -0
- package/dist/components/overlays/kt-accordion/kt-accordion.js.map +1 -0
- package/dist/components/overlays/kt-collapsible/kt-collapsible.d.ts +17 -1
- package/dist/components/overlays/kt-collapsible/kt-collapsible.js +87 -32
- package/dist/components/overlays/kt-collapsible/kt-collapsible.js.map +1 -1
- package/dist/components/overlays/kt-command-palette/kt-command-palette.d.ts +87 -0
- package/dist/components/overlays/kt-command-palette/kt-command-palette.js +370 -0
- package/dist/components/overlays/kt-command-palette/kt-command-palette.js.map +1 -0
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +2 -2
- package/dist/components/overlays/kt-dropdown/kt-dropdown.js +2 -2
- package/dist/components/overlays/kt-modal/kt-modal.js +2 -2
- package/dist/components/overlays/kt-side-panel/kt-side-panel.js +2 -2
- package/dist/components/overlays/kt-tour/kt-tour.d.ts +77 -0
- package/dist/components/overlays/kt-tour/kt-tour.js +200 -0
- package/dist/components/overlays/kt-tour/kt-tour.js.map +1 -0
- package/dist/custom-elements.json +16427 -8061
- package/dist/docs/kt-accordion.md +49 -0
- package/dist/docs/kt-app-shell.md +89 -0
- package/dist/docs/kt-auth-form.md +111 -0
- package/dist/docs/kt-avatar-group.md +49 -0
- package/dist/docs/kt-blog-post.md +77 -0
- package/dist/docs/kt-button.md +21 -0
- package/dist/docs/kt-chat-message.md +68 -0
- package/dist/docs/kt-color-picker.md +67 -0
- package/dist/docs/kt-command-palette.md +99 -0
- package/dist/docs/kt-copy-button.md +50 -0
- package/dist/docs/kt-cta.md +45 -0
- package/dist/docs/kt-description-list.md +58 -0
- package/dist/docs/kt-empty-page.md +92 -0
- package/dist/docs/kt-error-page.md +64 -0
- package/dist/docs/kt-faq.md +54 -0
- package/dist/docs/kt-feature-grid.md +53 -0
- package/dist/docs/kt-footer.md +115 -0
- package/dist/docs/kt-hero.md +53 -0
- package/dist/docs/kt-logo-cloud.md +41 -0
- package/dist/docs/kt-newsletter.md +69 -0
- package/dist/docs/kt-number-input.md +77 -0
- package/dist/docs/kt-otp-input.md +68 -0
- package/dist/docs/kt-post-grid.md +66 -0
- package/dist/docs/kt-pricing-table.md +101 -0
- package/dist/docs/kt-prompt-input.md +86 -0
- package/dist/docs/kt-settings-section.md +65 -0
- package/dist/docs/kt-slider.md +76 -0
- package/dist/docs/kt-steps.md +79 -0
- package/dist/docs/kt-testimonials.md +52 -0
- package/dist/docs/kt-tour.md +75 -0
- package/dist/docs/kt-tree.md +83 -0
- package/dist/docs/kt-user-menu.md +77 -0
- package/dist/icons/defaults.d.ts +2 -0
- package/dist/icons/index.js +1 -1
- package/dist/index.d.ts +56 -0
- package/dist/index.js +225 -284
- package/dist/index.js.map +1 -1
- package/dist/internal/block.d.ts +23 -0
- package/dist/internal/command-search.d.ts +27 -0
- package/dist/internal/heading.d.ts +8 -0
- package/dist/internal/indicator.d.ts +34 -0
- package/dist/internal/motion.d.ts +25 -0
- package/dist/internal/numbers.d.ts +2 -0
- package/dist/internal/strings.d.ts +36 -0
- package/dist/react/index.d.ts +165 -0
- package/dist/react/index.js +420 -171
- package/dist/react/index.js.map +1 -1
- package/dist/react/jsx.d.ts +128 -1
- package/dist/strings/index.js +1 -1
- package/dist/tokens/base.css +35 -2
- package/dist/vscode.css-custom-data.json +165 -19
- package/dist/vscode.html-custom-data.json +1023 -149
- package/dist/vue/index.d.ts +62 -0
- package/dist/vue/index.js +39 -8
- package/dist/vue/index.js.map +1 -1
- package/dist/web-types.json +3238 -836
- package/package.json +128 -3
- package/dist/chunks/defaults-Cpeg13O5.js +0 -68
- package/dist/chunks/index-TWJzttLX.js.map +0 -1
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import { css as g, html as o, nothing as u } from "lit";
|
|
2
|
+
import { property as l, state as f, query as b } from "lit/decorators.js";
|
|
3
|
+
import { K as h, d as v } from "../../../chunks/kt-element-DvWtPQ1Y.js";
|
|
4
|
+
import { e as m } from "../../../chunks/events-r51msXNf.js";
|
|
5
|
+
import { h as k } from "../../../chunks/heading-DsnZsfg-.js";
|
|
6
|
+
import "../../core/kt-button/kt-button.js";
|
|
7
|
+
import "../../feedback/kt-alert/kt-alert.js";
|
|
8
|
+
import "../../forms/kt-checkbox/kt-checkbox.js";
|
|
9
|
+
import "../../forms/kt-input/kt-input.js";
|
|
10
|
+
import "../../forms/kt-label-input/kt-label-input.js";
|
|
11
|
+
import "../../forms/kt-otp-input/kt-otp-input.js";
|
|
12
|
+
var w = Object.defineProperty, a = (p, t, i, s) => {
|
|
13
|
+
for (var e = void 0, d = p.length - 1, n; d >= 0; d--)
|
|
14
|
+
(n = p[d]) && (e = n(t, i, e) || e);
|
|
15
|
+
return e && w(t, i, e), e;
|
|
16
|
+
};
|
|
17
|
+
const y = {
|
|
18
|
+
signInHeading: "Sign in",
|
|
19
|
+
signInLead: "Welcome back. Sign in to carry on.",
|
|
20
|
+
signUpHeading: "Create an account",
|
|
21
|
+
signUpLead: "It takes a minute, and no card.",
|
|
22
|
+
forgotHeading: "Reset your password",
|
|
23
|
+
forgotLead: "We will email you a link to choose a new one.",
|
|
24
|
+
codeHeading: "Check your phone",
|
|
25
|
+
codeLead: "Enter the code we sent you.",
|
|
26
|
+
name: "Name",
|
|
27
|
+
email: "Email",
|
|
28
|
+
password: "Password",
|
|
29
|
+
code: "Verification code",
|
|
30
|
+
remember: "Keep me signed in",
|
|
31
|
+
forgotLink: "Forgot password?",
|
|
32
|
+
signIn: "Sign in",
|
|
33
|
+
signUp: "Create account",
|
|
34
|
+
sendLink: "Send the link",
|
|
35
|
+
verify: "Verify",
|
|
36
|
+
toSignUp: "No account yet?",
|
|
37
|
+
toSignUpLink: "Create an account",
|
|
38
|
+
toSignIn: "Already have an account?",
|
|
39
|
+
toSignInLink: "Sign in",
|
|
40
|
+
or: "or",
|
|
41
|
+
sentHeading: "Check your email",
|
|
42
|
+
sentLead: "If an account uses that address, a link to reset its password is on its way.",
|
|
43
|
+
nameMissing: "Enter your name.",
|
|
44
|
+
emailInvalid: "Enter an email address, like name@example.com.",
|
|
45
|
+
passwordMissing: "Enter your password.",
|
|
46
|
+
passwordShort: (p) => `Use at least ${p} characters.`,
|
|
47
|
+
codeMissing: "Enter the whole code.",
|
|
48
|
+
failed: "That did not work. Try again in a moment."
|
|
49
|
+
}, $ = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
50
|
+
class r extends h {
|
|
51
|
+
constructor() {
|
|
52
|
+
super(...arguments), this.mode = "sign-in", this.providers = [], this.remember = !1, this.passwordMin = 8, this.headingLevel = 1, this.plain = !1, this.error = "", this.texts = {}, this.sent = !1;
|
|
53
|
+
}
|
|
54
|
+
static {
|
|
55
|
+
this.styles = [
|
|
56
|
+
h.styles,
|
|
57
|
+
g`
|
|
58
|
+
:host {
|
|
59
|
+
display: block;
|
|
60
|
+
max-width: 420px;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.auth {
|
|
64
|
+
display: grid;
|
|
65
|
+
gap: var(--gap-card);
|
|
66
|
+
padding: calc(var(--padding-card) * 1.5);
|
|
67
|
+
background: var(--surface-card);
|
|
68
|
+
border: var(--border-width) solid var(--border-subtle);
|
|
69
|
+
border-radius: var(--border-radius-card);
|
|
70
|
+
}
|
|
71
|
+
:host([plain]) .auth {
|
|
72
|
+
padding: 0;
|
|
73
|
+
background: none;
|
|
74
|
+
border: none;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.logo:empty {
|
|
78
|
+
display: none;
|
|
79
|
+
}
|
|
80
|
+
.head {
|
|
81
|
+
display: grid;
|
|
82
|
+
gap: 6px;
|
|
83
|
+
}
|
|
84
|
+
.heading {
|
|
85
|
+
margin: 0;
|
|
86
|
+
color: var(--text-body);
|
|
87
|
+
font: var(--font-title-h4);
|
|
88
|
+
}
|
|
89
|
+
.lead {
|
|
90
|
+
margin: 0;
|
|
91
|
+
color: var(--text-muted);
|
|
92
|
+
font: var(--font-normal-regular);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.providers {
|
|
96
|
+
display: grid;
|
|
97
|
+
gap: var(--gap-button);
|
|
98
|
+
}
|
|
99
|
+
.or {
|
|
100
|
+
display: flex;
|
|
101
|
+
gap: var(--gap-form);
|
|
102
|
+
align-items: center;
|
|
103
|
+
color: var(--text-muted);
|
|
104
|
+
font: var(--font-normal-small);
|
|
105
|
+
}
|
|
106
|
+
.or::before,
|
|
107
|
+
.or::after {
|
|
108
|
+
flex: 1;
|
|
109
|
+
height: var(--border-width);
|
|
110
|
+
background: var(--border-subtle);
|
|
111
|
+
content: '';
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
form {
|
|
115
|
+
display: grid;
|
|
116
|
+
gap: var(--gap-form);
|
|
117
|
+
margin: 0;
|
|
118
|
+
}
|
|
119
|
+
.row {
|
|
120
|
+
display: flex;
|
|
121
|
+
flex-wrap: wrap;
|
|
122
|
+
gap: var(--gap-button);
|
|
123
|
+
align-items: center;
|
|
124
|
+
justify-content: space-between;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.link {
|
|
128
|
+
padding: 0;
|
|
129
|
+
color: var(--color-primary-text);
|
|
130
|
+
font: var(--font-normal-medium);
|
|
131
|
+
background: none;
|
|
132
|
+
border: none;
|
|
133
|
+
border-radius: var(--radius-sub-menu);
|
|
134
|
+
cursor: pointer;
|
|
135
|
+
}
|
|
136
|
+
.link:hover {
|
|
137
|
+
text-decoration: underline;
|
|
138
|
+
}
|
|
139
|
+
.link:focus-visible {
|
|
140
|
+
outline: var(--outline-width) solid var(--color-primary-base);
|
|
141
|
+
outline-offset: 2px;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.switch {
|
|
145
|
+
margin: 0;
|
|
146
|
+
color: var(--text-muted);
|
|
147
|
+
font: var(--font-normal-regular);
|
|
148
|
+
text-align: center;
|
|
149
|
+
}
|
|
150
|
+
.footer {
|
|
151
|
+
color: var(--text-muted);
|
|
152
|
+
font: var(--font-normal-small);
|
|
153
|
+
text-align: center;
|
|
154
|
+
}
|
|
155
|
+
.footer:empty {
|
|
156
|
+
display: none;
|
|
157
|
+
}
|
|
158
|
+
`
|
|
159
|
+
];
|
|
160
|
+
}
|
|
161
|
+
get t() {
|
|
162
|
+
return { ...y, ...this.texts };
|
|
163
|
+
}
|
|
164
|
+
/** Moves the form to another mode, as its links do. */
|
|
165
|
+
goTo(t) {
|
|
166
|
+
t !== this.mode && (this.mode = t, this.error = "", this.sent = !1, m(this, "kt-mode", { mode: t }));
|
|
167
|
+
}
|
|
168
|
+
field(t) {
|
|
169
|
+
return this.shadowRoot?.querySelector(`kt-input[name="${t}"]`) ?? null;
|
|
170
|
+
}
|
|
171
|
+
/** Checks what can be checked before sending; marks each field it finds wanting. */
|
|
172
|
+
check() {
|
|
173
|
+
const t = this.t, i = [];
|
|
174
|
+
this.mode === "sign-up" && i.push(["name", (e) => e.trim() ? "" : t.nameMissing]), this.mode !== "code" && i.push(["email", (e) => $.test(e.trim()) ? "" : t.emailInvalid]), this.mode === "sign-in" && i.push(["password", (e) => e ? "" : t.passwordMissing]), this.mode === "sign-up" && i.push([
|
|
175
|
+
"password",
|
|
176
|
+
(e) => e ? e.length < this.passwordMin ? t.passwordShort(this.passwordMin) : "" : t.passwordMissing
|
|
177
|
+
]);
|
|
178
|
+
let s = null;
|
|
179
|
+
for (const [e, d] of i) {
|
|
180
|
+
const n = this.field(e);
|
|
181
|
+
n && (n.error = d(n.value ?? ""), n.error && !s && (s = n));
|
|
182
|
+
}
|
|
183
|
+
if (this.mode === "code") {
|
|
184
|
+
const e = this.shadowRoot?.querySelector("kt-otp-input");
|
|
185
|
+
e && (e.error = e.value.length < e.length ? t.codeMissing : "", e.error && (s = e));
|
|
186
|
+
}
|
|
187
|
+
return s?.focus(), !s;
|
|
188
|
+
}
|
|
189
|
+
values() {
|
|
190
|
+
const t = (i) => this.field(i)?.value;
|
|
191
|
+
switch (this.mode) {
|
|
192
|
+
case "sign-up":
|
|
193
|
+
return {
|
|
194
|
+
name: t("name") ?? "",
|
|
195
|
+
email: t("email") ?? "",
|
|
196
|
+
password: t("password") ?? ""
|
|
197
|
+
};
|
|
198
|
+
case "forgot":
|
|
199
|
+
return { email: t("email") ?? "" };
|
|
200
|
+
case "code":
|
|
201
|
+
return { code: this.shadowRoot?.querySelector("kt-otp-input")?.value ?? "" };
|
|
202
|
+
default: {
|
|
203
|
+
const i = this.shadowRoot?.querySelector(
|
|
204
|
+
"kt-checkbox"
|
|
205
|
+
);
|
|
206
|
+
return {
|
|
207
|
+
email: t("email") ?? "",
|
|
208
|
+
password: t("password") ?? "",
|
|
209
|
+
...i ? { remember: i.checked } : {}
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/** Sends the form, as its button does, once what it holds checks out. */
|
|
215
|
+
submit() {
|
|
216
|
+
if (!this.check()) return;
|
|
217
|
+
this.error = "";
|
|
218
|
+
let t = null;
|
|
219
|
+
if (m(this, "kt-submit", {
|
|
220
|
+
mode: this.mode,
|
|
221
|
+
values: this.values(),
|
|
222
|
+
wait: (e) => {
|
|
223
|
+
t = e;
|
|
224
|
+
}
|
|
225
|
+
}), !t) return;
|
|
226
|
+
const i = t, s = this.mode;
|
|
227
|
+
this.button.run(() => i).then(
|
|
228
|
+
() => {
|
|
229
|
+
s === "forgot" && this.mode === "forgot" && (this.sent = !0);
|
|
230
|
+
},
|
|
231
|
+
(e) => {
|
|
232
|
+
this.error = e instanceof Error && e.message ? e.message : this.t.failed;
|
|
233
|
+
}
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
onSubmit(t) {
|
|
237
|
+
t.preventDefault(), this.submit();
|
|
238
|
+
}
|
|
239
|
+
/** Enter in a field sends, as in any form: the native field is inside the kt-input. */
|
|
240
|
+
onKeyDown(t) {
|
|
241
|
+
t.key !== "Enter" || t.isComposing || t.composedPath()[0].localName !== "input" || (t.preventDefault(), this.submit());
|
|
242
|
+
}
|
|
243
|
+
input(t, i, s, e) {
|
|
244
|
+
return o`<kt-label-input label=${i}>
|
|
245
|
+
<kt-input
|
|
246
|
+
name=${t}
|
|
247
|
+
type=${s}
|
|
248
|
+
autocomplete=${e}
|
|
249
|
+
@kt-input=${(d) => d.currentTarget.error = ""}
|
|
250
|
+
></kt-input>
|
|
251
|
+
</kt-label-input>`;
|
|
252
|
+
}
|
|
253
|
+
fields() {
|
|
254
|
+
const t = this.t;
|
|
255
|
+
switch (this.mode) {
|
|
256
|
+
case "sign-up":
|
|
257
|
+
return o`${this.input("name", t.name, "text", "name")}
|
|
258
|
+
${this.input("email", t.email, "email", "email")}
|
|
259
|
+
${this.input("password", t.password, "password", "new-password")}`;
|
|
260
|
+
case "forgot":
|
|
261
|
+
return this.input("email", t.email, "email", "email");
|
|
262
|
+
case "code":
|
|
263
|
+
return o`<kt-otp-input
|
|
264
|
+
label=${t.code}
|
|
265
|
+
@kt-complete=${() => this.submit()}
|
|
266
|
+
></kt-otp-input>`;
|
|
267
|
+
default:
|
|
268
|
+
return o`${this.input("email", t.email, "email", "email")}
|
|
269
|
+
${this.input("password", t.password, "password", "current-password")}
|
|
270
|
+
<div class="row">
|
|
271
|
+
${this.remember ? o`<kt-checkbox>${t.remember}</kt-checkbox>` : o`<span></span>`}
|
|
272
|
+
<button type="button" class="link" @click=${() => this.goTo("forgot")}>
|
|
273
|
+
${t.forgotLink}
|
|
274
|
+
</button>
|
|
275
|
+
</div>`;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
head(t, i) {
|
|
279
|
+
return o`<div class="head">
|
|
280
|
+
${k(this.headingLevel, t, "heading", 1)}
|
|
281
|
+
<p class="lead">${i}</p>
|
|
282
|
+
</div>`;
|
|
283
|
+
}
|
|
284
|
+
render() {
|
|
285
|
+
const t = this.t, i = {
|
|
286
|
+
"sign-in": [t.signInHeading, t.signInLead, t.signIn],
|
|
287
|
+
"sign-up": [t.signUpHeading, t.signUpLead, t.signUp],
|
|
288
|
+
forgot: [t.forgotHeading, t.forgotLead, t.sendLink],
|
|
289
|
+
code: [t.codeHeading, t.codeLead, t.verify]
|
|
290
|
+
}, [s, e, d] = i[this.mode], n = this.providers.length > 0 && (this.mode === "sign-in" || this.mode === "sign-up");
|
|
291
|
+
return this.sent ? o`<section part="base" class="auth">
|
|
292
|
+
<div class="logo"><slot name="logo"></slot></div>
|
|
293
|
+
${this.head(t.sentHeading, t.sentLead)}
|
|
294
|
+
<p class="switch">
|
|
295
|
+
<button type="button" class="link" @click=${() => this.goTo("sign-in")}>
|
|
296
|
+
${t.toSignInLink}
|
|
297
|
+
</button>
|
|
298
|
+
</p>
|
|
299
|
+
</section>` : o`<section part="base" class="auth">
|
|
300
|
+
<div class="logo"><slot name="logo"></slot></div>
|
|
301
|
+
${this.head(s, e)}
|
|
302
|
+
${this.error ? o`<kt-alert variant="danger" description=${this.error}></kt-alert>` : u}
|
|
303
|
+
${n ? o`<div class="providers">
|
|
304
|
+
${this.providers.map(
|
|
305
|
+
(c) => o`<kt-button
|
|
306
|
+
variant="secondary"
|
|
307
|
+
full-width
|
|
308
|
+
icon=${c.icon || u}
|
|
309
|
+
@click=${() => m(this, "kt-provider", { id: c.id })}
|
|
310
|
+
>${c.label}</kt-button
|
|
311
|
+
>`
|
|
312
|
+
)}
|
|
313
|
+
</div>
|
|
314
|
+
<div class="or">${t.or}</div>` : u}
|
|
315
|
+
<form part="form" novalidate @submit=${this.onSubmit} @keydown=${this.onKeyDown}>
|
|
316
|
+
${this.fields()}
|
|
317
|
+
<kt-button class="submit" full-width @click=${() => this.submit()}>${d}</kt-button>
|
|
318
|
+
</form>
|
|
319
|
+
${this.mode === "sign-in" ? o`<p class="switch">
|
|
320
|
+
${t.toSignUp}
|
|
321
|
+
<button type="button" class="link" @click=${() => this.goTo("sign-up")}>
|
|
322
|
+
${t.toSignUpLink}
|
|
323
|
+
</button>
|
|
324
|
+
</p>` : o`<p class="switch">
|
|
325
|
+
${this.mode === "sign-up" ? t.toSignIn : u}
|
|
326
|
+
<button type="button" class="link" @click=${() => this.goTo("sign-in")}>
|
|
327
|
+
${t.toSignInLink}
|
|
328
|
+
</button>
|
|
329
|
+
</p>`}
|
|
330
|
+
<div class="footer"><slot name="footer"></slot></div>
|
|
331
|
+
</section>`;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
a([
|
|
335
|
+
l({ type: String, reflect: !0 })
|
|
336
|
+
], r.prototype, "mode");
|
|
337
|
+
a([
|
|
338
|
+
l({ attribute: !1 })
|
|
339
|
+
], r.prototype, "providers");
|
|
340
|
+
a([
|
|
341
|
+
l({ type: Boolean })
|
|
342
|
+
], r.prototype, "remember");
|
|
343
|
+
a([
|
|
344
|
+
l({ type: Number, attribute: "password-min" })
|
|
345
|
+
], r.prototype, "passwordMin");
|
|
346
|
+
a([
|
|
347
|
+
l({ type: Number, attribute: "heading-level" })
|
|
348
|
+
], r.prototype, "headingLevel");
|
|
349
|
+
a([
|
|
350
|
+
l({ type: Boolean, reflect: !0 })
|
|
351
|
+
], r.prototype, "plain");
|
|
352
|
+
a([
|
|
353
|
+
l({ type: String })
|
|
354
|
+
], r.prototype, "error");
|
|
355
|
+
a([
|
|
356
|
+
l({ attribute: !1 })
|
|
357
|
+
], r.prototype, "texts");
|
|
358
|
+
a([
|
|
359
|
+
f()
|
|
360
|
+
], r.prototype, "sent");
|
|
361
|
+
a([
|
|
362
|
+
b("kt-button.submit")
|
|
363
|
+
], r.prototype, "button");
|
|
364
|
+
v("kt-auth-form", r);
|
|
365
|
+
export {
|
|
366
|
+
r as KtAuthForm
|
|
367
|
+
};
|
|
368
|
+
//# sourceMappingURL=kt-auth-form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kt-auth-form.js","sources":["../../../../src/components/blocks/kt-auth-form/kt-auth-form.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { heading } from '#internal/heading';\nimport '../../core/kt-button/kt-button.js';\nimport '../../feedback/kt-alert/kt-alert.js';\nimport '../../forms/kt-checkbox/kt-checkbox.js';\nimport '../../forms/kt-input/kt-input.js';\nimport '../../forms/kt-label-input/kt-label-input.js';\nimport '../../forms/kt-otp-input/kt-otp-input.js';\nimport type { KtButton } from '../../core/kt-button/kt-button.js';\n\nexport type KtAuthMode = 'sign-in' | 'sign-up' | 'forgot' | 'code';\n\nexport interface KtAuthProvider {\n readonly id: string;\n /** What the button says: \"Continue with GitHub\". */\n readonly label: string;\n /** A Lucide icon name, registered by the page. */\n readonly icon?: string;\n}\n\n/** Every word the form says, in English until given others. */\nexport interface KtAuthTexts {\n readonly signInHeading: string;\n readonly signInLead: string;\n readonly signUpHeading: string;\n readonly signUpLead: string;\n readonly forgotHeading: string;\n readonly forgotLead: string;\n readonly codeHeading: string;\n readonly codeLead: string;\n readonly name: string;\n readonly email: string;\n readonly password: string;\n readonly code: string;\n readonly remember: string;\n readonly forgotLink: string;\n readonly signIn: string;\n readonly signUp: string;\n readonly sendLink: string;\n readonly verify: string;\n readonly toSignUp: string;\n readonly toSignUpLink: string;\n readonly toSignIn: string;\n readonly toSignInLink: string;\n readonly or: string;\n readonly sentHeading: string;\n readonly sentLead: string;\n readonly nameMissing: string;\n readonly emailInvalid: string;\n readonly passwordMissing: string;\n readonly passwordShort: (least: number) => string;\n readonly codeMissing: string;\n readonly failed: string;\n}\n\nconst TEXTS: KtAuthTexts = {\n signInHeading: 'Sign in',\n signInLead: 'Welcome back. Sign in to carry on.',\n signUpHeading: 'Create an account',\n signUpLead: 'It takes a minute, and no card.',\n forgotHeading: 'Reset your password',\n forgotLead: 'We will email you a link to choose a new one.',\n codeHeading: 'Check your phone',\n codeLead: 'Enter the code we sent you.',\n name: 'Name',\n email: 'Email',\n password: 'Password',\n code: 'Verification code',\n remember: 'Keep me signed in',\n forgotLink: 'Forgot password?',\n signIn: 'Sign in',\n signUp: 'Create account',\n sendLink: 'Send the link',\n verify: 'Verify',\n toSignUp: 'No account yet?',\n toSignUpLink: 'Create an account',\n toSignIn: 'Already have an account?',\n toSignInLink: 'Sign in',\n or: 'or',\n sentHeading: 'Check your email',\n sentLead: 'If an account uses that address, a link to reset its password is on its way.',\n nameMissing: 'Enter your name.',\n emailInvalid: 'Enter an email address, like name@example.com.',\n passwordMissing: 'Enter your password.',\n passwordShort: (least) => `Use at least ${least} characters.`,\n codeMissing: 'Enter the whole code.',\n failed: 'That did not work. Try again in a moment.',\n};\n\n/** What `kt-submit` carries: the mode, what was written, and a way to wait for the sending. */\nexport interface KtAuthSubmitDetail {\n readonly mode: KtAuthMode;\n readonly values: {\n readonly name?: string;\n readonly email?: string;\n readonly password?: string;\n readonly code?: string;\n readonly remember?: boolean;\n };\n /**\n * Hand it the request: the button runs it, and if it rejects, its message\n * is shown above the fields.\n */\n readonly wait: (sending: Promise<unknown>) => void;\n}\n\ntype Field = HTMLElement & { value: string; error: string };\n\nconst EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n/**\n * The way into a product: signing in, creating an account, resetting a\n * password, entering a code — one block, four modes.\n *\n * It checks what it can before sending — an email that is one, a password, a\n * name, a whole code — and says so on the field. Then `kt-submit` carries the\n * mode and the values, and `wait(promise)`: the button runs the request, and\n * if it rejects, its message is shown above the fields. A reset that succeeds\n * says the link is on its way.\n *\n * Sign-in providers go in `providers`; the links between modes move the form\n * itself and fire `kt-mode`. Every word is in `texts`, English until given\n * others.\n *\n * @element kt-auth-form\n *\n * @slot logo - Above the heading: the product's mark.\n * @slot footer - Under the form: the terms, a privacy note.\n *\n * @csspart base - The block.\n * @csspart form - The `<form>`.\n *\n * @fires kt-submit - The form was sent. `detail: { mode, values, wait(promise) }`.\n * @fires kt-mode - The form moved to another mode. `detail: { mode }`.\n * @fires kt-provider - A provider was chosen. `detail: { id }`.\n *\n * @example\n * ```html\n * <kt-auth-form remember></kt-auth-form>\n * <script>\n * form.addEventListener('kt-submit', (e) => e.detail.wait(auth.signIn(e.detail.values)));\n * </script>\n * ```\n */\nexport class KtAuthForm extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n max-width: 420px;\n }\n\n .auth {\n display: grid;\n gap: var(--gap-card);\n padding: calc(var(--padding-card) * 1.5);\n background: var(--surface-card);\n border: var(--border-width) solid var(--border-subtle);\n border-radius: var(--border-radius-card);\n }\n :host([plain]) .auth {\n padding: 0;\n background: none;\n border: none;\n }\n\n .logo:empty {\n display: none;\n }\n .head {\n display: grid;\n gap: 6px;\n }\n .heading {\n margin: 0;\n color: var(--text-body);\n font: var(--font-title-h4);\n }\n .lead {\n margin: 0;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n }\n\n .providers {\n display: grid;\n gap: var(--gap-button);\n }\n .or {\n display: flex;\n gap: var(--gap-form);\n align-items: center;\n color: var(--text-muted);\n font: var(--font-normal-small);\n }\n .or::before,\n .or::after {\n flex: 1;\n height: var(--border-width);\n background: var(--border-subtle);\n content: '';\n }\n\n form {\n display: grid;\n gap: var(--gap-form);\n margin: 0;\n }\n .row {\n display: flex;\n flex-wrap: wrap;\n gap: var(--gap-button);\n align-items: center;\n justify-content: space-between;\n }\n\n .link {\n padding: 0;\n color: var(--color-primary-text);\n font: var(--font-normal-medium);\n background: none;\n border: none;\n border-radius: var(--radius-sub-menu);\n cursor: pointer;\n }\n .link:hover {\n text-decoration: underline;\n }\n .link:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n .switch {\n margin: 0;\n color: var(--text-muted);\n font: var(--font-normal-regular);\n text-align: center;\n }\n .footer {\n color: var(--text-muted);\n font: var(--font-normal-small);\n text-align: center;\n }\n .footer:empty {\n display: none;\n }\n `,\n ];\n\n /** `sign-in`, `sign-up`, `forgot` or `code`. */\n @property({ type: String, reflect: true })\n mode: KtAuthMode = 'sign-in';\n\n /** Sign-in providers, above the fields. Set as a property. */\n @property({ attribute: false })\n providers: readonly KtAuthProvider[] = [];\n\n /** Shows \"Keep me signed in\" when signing in. */\n @property({ type: Boolean })\n remember = false;\n\n /** The shortest password a new account may choose. */\n @property({ type: Number, attribute: 'password-min' })\n passwordMin = 8;\n\n /** The heading's level, 1 to 6: 1 when the form is the page. */\n @property({ type: Number, attribute: 'heading-level' })\n headingLevel = 1;\n\n /** Drops the card around it, for a page that frames it already. */\n @property({ type: Boolean, reflect: true })\n plain = false;\n\n /** An error to show above the fields; a failed sending sets it. */\n @property({ type: String })\n error = '';\n\n /** The words, English until given others: `form.texts = { signInHeading: 'Connexion' }`. */\n @property({ attribute: false })\n texts: Partial<KtAuthTexts> = {};\n\n /** A reset link was sent: the form says so instead of asking again. */\n @state() private sent = false;\n\n @query('kt-button.submit') private button!: KtButton;\n\n private get t(): KtAuthTexts {\n return { ...TEXTS, ...this.texts };\n }\n\n /** Moves the form to another mode, as its links do. */\n goTo(mode: KtAuthMode): void {\n if (mode === this.mode) return;\n this.mode = mode;\n this.error = '';\n this.sent = false;\n emit(this, 'kt-mode', { mode });\n }\n\n private field(name: string): Field | null {\n return this.shadowRoot?.querySelector<Field>(`kt-input[name=\"${name}\"]`) ?? null;\n }\n\n /** Checks what can be checked before sending; marks each field it finds wanting. */\n private check(): boolean {\n const t = this.t;\n const rules: [string, (value: string) => string][] = [];\n if (this.mode === 'sign-up') rules.push(['name', (v) => (v.trim() ? '' : t.nameMissing)]);\n if (this.mode !== 'code') {\n rules.push(['email', (v) => (EMAIL.test(v.trim()) ? '' : t.emailInvalid)]);\n }\n if (this.mode === 'sign-in') rules.push(['password', (v) => (v ? '' : t.passwordMissing)]);\n if (this.mode === 'sign-up') {\n rules.push([\n 'password',\n (v) =>\n !v\n ? t.passwordMissing\n : v.length < this.passwordMin\n ? t.passwordShort(this.passwordMin)\n : '',\n ]);\n }\n let first: Field | null = null;\n for (const [name, rule] of rules) {\n const field = this.field(name);\n if (!field) continue;\n field.error = rule(field.value ?? '');\n if (field.error && !first) first = field;\n }\n if (this.mode === 'code') {\n const otp = this.shadowRoot?.querySelector<Field & { length: number }>('kt-otp-input');\n if (otp) {\n otp.error = otp.value.length < otp.length ? t.codeMissing : '';\n if (otp.error) first = otp;\n }\n }\n first?.focus();\n return !first;\n }\n\n private values(): KtAuthSubmitDetail['values'] {\n const read = (name: string) => this.field(name)?.value;\n switch (this.mode) {\n case 'sign-up':\n return {\n name: read('name') ?? '',\n email: read('email') ?? '',\n password: read('password') ?? '',\n };\n case 'forgot':\n return { email: read('email') ?? '' };\n case 'code':\n return { code: this.shadowRoot?.querySelector<Field>('kt-otp-input')?.value ?? '' };\n default: {\n const remember = this.shadowRoot?.querySelector<HTMLElement & { checked: boolean }>(\n 'kt-checkbox',\n );\n return {\n email: read('email') ?? '',\n password: read('password') ?? '',\n ...(remember ? { remember: remember.checked } : {}),\n };\n }\n }\n }\n\n /** Sends the form, as its button does, once what it holds checks out. */\n submit(): void {\n if (!this.check()) return;\n this.error = '';\n let sending: Promise<unknown> | null = null;\n emit<KtAuthSubmitDetail>(this, 'kt-submit', {\n mode: this.mode,\n values: this.values(),\n wait: (promise) => {\n sending = promise;\n },\n });\n if (!sending) return;\n const waited: Promise<unknown> = sending;\n const mode = this.mode;\n void this.button\n .run(() => waited)\n .then(\n () => {\n if (mode === 'forgot' && this.mode === 'forgot') this.sent = true;\n },\n (reason: unknown) => {\n this.error = reason instanceof Error && reason.message ? reason.message : this.t.failed;\n },\n );\n }\n\n private onSubmit(event: Event): void {\n event.preventDefault();\n this.submit();\n }\n\n /** Enter in a field sends, as in any form: the native field is inside the kt-input. */\n private onKeyDown(event: KeyboardEvent): void {\n if (event.key !== 'Enter' || event.isComposing) return;\n const from = event.composedPath()[0] as Element;\n if (from.localName !== 'input') return;\n event.preventDefault();\n this.submit();\n }\n\n private input(name: string, label: string, type: string, autocomplete: string): TemplateResult {\n return html`<kt-label-input label=${label}>\n <kt-input\n name=${name}\n type=${type}\n autocomplete=${autocomplete}\n @kt-input=${(event: Event) => ((event.currentTarget as Field).error = '')}\n ></kt-input>\n </kt-label-input>`;\n }\n\n private fields(): TemplateResult {\n const t = this.t;\n switch (this.mode) {\n case 'sign-up':\n return html`${this.input('name', t.name, 'text', 'name')}\n ${this.input('email', t.email, 'email', 'email')}\n ${this.input('password', t.password, 'password', 'new-password')}`;\n case 'forgot':\n return this.input('email', t.email, 'email', 'email');\n case 'code':\n return html`<kt-otp-input\n label=${t.code}\n @kt-complete=${() => this.submit()}\n ></kt-otp-input>`;\n default:\n return html`${this.input('email', t.email, 'email', 'email')}\n ${this.input('password', t.password, 'password', 'current-password')}\n <div class=\"row\">\n ${this.remember ? html`<kt-checkbox>${t.remember}</kt-checkbox>` : html`<span></span>`}\n <button type=\"button\" class=\"link\" @click=${() => this.goTo('forgot')}>\n ${t.forgotLink}\n </button>\n </div>`;\n }\n }\n\n private head(title: string, lead: string): TemplateResult {\n return html`<div class=\"head\">\n ${heading(this.headingLevel, title, 'heading', 1)}\n <p class=\"lead\">${lead}</p>\n </div>`;\n }\n\n override render(): TemplateResult {\n const t = this.t;\n const words: Record<KtAuthMode, readonly [string, string, string]> = {\n 'sign-in': [t.signInHeading, t.signInLead, t.signIn],\n 'sign-up': [t.signUpHeading, t.signUpLead, t.signUp],\n forgot: [t.forgotHeading, t.forgotLead, t.sendLink],\n code: [t.codeHeading, t.codeLead, t.verify],\n };\n const [title, lead, send] = words[this.mode];\n const providers =\n this.providers.length > 0 && (this.mode === 'sign-in' || this.mode === 'sign-up');\n\n if (this.sent) {\n return html`<section part=\"base\" class=\"auth\">\n <div class=\"logo\"><slot name=\"logo\"></slot></div>\n ${this.head(t.sentHeading, t.sentLead)}\n <p class=\"switch\">\n <button type=\"button\" class=\"link\" @click=${() => this.goTo('sign-in')}>\n ${t.toSignInLink}\n </button>\n </p>\n </section>`;\n }\n\n return html`<section part=\"base\" class=\"auth\">\n <div class=\"logo\"><slot name=\"logo\"></slot></div>\n ${this.head(title, lead)}\n ${\n this.error\n ? html`<kt-alert variant=\"danger\" description=${this.error}></kt-alert>`\n : nothing\n }\n ${\n providers\n ? html`<div class=\"providers\">\n ${this.providers.map(\n (provider) =>\n html`<kt-button\n variant=\"secondary\"\n full-width\n icon=${provider.icon || nothing}\n @click=${() => emit(this, 'kt-provider', { id: provider.id })}\n >${provider.label}</kt-button\n >`,\n )}\n </div>\n <div class=\"or\">${t.or}</div>`\n : nothing\n }\n <form part=\"form\" novalidate @submit=${this.onSubmit} @keydown=${this.onKeyDown}>\n ${this.fields()}\n <kt-button class=\"submit\" full-width @click=${() => this.submit()}>${send}</kt-button>\n </form>\n ${\n this.mode === 'sign-in'\n ? html`<p class=\"switch\">\n ${t.toSignUp}\n <button type=\"button\" class=\"link\" @click=${() => this.goTo('sign-up')}>\n ${t.toSignUpLink}\n </button>\n </p>`\n : html`<p class=\"switch\">\n ${this.mode === 'sign-up' ? t.toSignIn : nothing}\n <button type=\"button\" class=\"link\" @click=${() => this.goTo('sign-in')}>\n ${t.toSignInLink}\n </button>\n </p>`\n }\n <div class=\"footer\"><slot name=\"footer\"></slot></div>\n </section>`;\n }\n}\n\ndefineElement('kt-auth-form', KtAuthForm);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-auth-form': KtAuthForm;\n }\n}\n"],"names":["TEXTS","least","EMAIL","KtAuthForm","KtElement","css","mode","emit","name","rules","v","first","rule","field","otp","read","remember","sending","promise","waited","reason","event","label","type","autocomplete","html","title","lead","heading","words","send","providers","nothing","provider","__decorateClass","property","state","query","defineElement"],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type TemplateResult } from 'lit';
|
|
2
|
+
import { KtElement } from '#internal/kt-element';
|
|
3
|
+
import '../../core/kt-avatar/kt-avatar.js';
|
|
4
|
+
import '../../core/kt-icon/kt-icon.js';
|
|
5
|
+
/** Every word the post says, in English until given others. */
|
|
6
|
+
export interface KtBlogPostTexts {
|
|
7
|
+
readonly back: string;
|
|
8
|
+
readonly minRead: (minutes: number) => string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* A post, set to be read: its title, who wrote it and when, a cover, and the
|
|
12
|
+
* body in a measure an eye can follow.
|
|
13
|
+
*
|
|
14
|
+
* The body is the default slot — paragraphs, headings, lists, quotes, code,
|
|
15
|
+
* figures — set as prose. The reading time is counted from it, unless given.
|
|
16
|
+
*
|
|
17
|
+
* @element kt-blog-post
|
|
18
|
+
*
|
|
19
|
+
* @slot - The body.
|
|
20
|
+
* @slot cover - Under the header: an image, a figure with its caption.
|
|
21
|
+
* @slot end - After the body: tags, sharing, the next post.
|
|
22
|
+
*
|
|
23
|
+
* @csspart base - The article.
|
|
24
|
+
* @csspart header - The title, the lead and who wrote it.
|
|
25
|
+
* @csspart body - The body's column.
|
|
26
|
+
*
|
|
27
|
+
* @cssproperty --kt-post-measure - The column's width. 700px.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```html
|
|
31
|
+
* <kt-blog-post heading="Closing the month in a day" author="Ada Park" date="2026-09-14" back-href="/blog">
|
|
32
|
+
* <img slot="cover" src="/covers/close.jpg" alt="" />
|
|
33
|
+
* <p>For years, the first week of the month was the close…</p>
|
|
34
|
+
* </kt-blog-post>
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare class KtBlogPost extends KtElement {
|
|
38
|
+
static styles: import("lit").CSSResultGroup[];
|
|
39
|
+
/** The post's title. */
|
|
40
|
+
heading: string;
|
|
41
|
+
/** A line under the title: what the post is about. */
|
|
42
|
+
lead: string;
|
|
43
|
+
/** When it was published: `2026-09-14`. */
|
|
44
|
+
date: string;
|
|
45
|
+
/** Who wrote it. */
|
|
46
|
+
author: string;
|
|
47
|
+
/** Their role: "CFO, Northwind". */
|
|
48
|
+
authorRole: string;
|
|
49
|
+
/** Their photo's URL; without one, their initials. */
|
|
50
|
+
avatar: string;
|
|
51
|
+
/** Minutes to read it. Counted from the body when 0. */
|
|
52
|
+
readingTime: number;
|
|
53
|
+
/** A few words over the title. */
|
|
54
|
+
tags: readonly string[];
|
|
55
|
+
/** Where All posts leads; no link without it. */
|
|
56
|
+
backHref: string;
|
|
57
|
+
/** The locale the date is written in; the page's language when empty. */
|
|
58
|
+
locale: string;
|
|
59
|
+
/** The title's level: 1, since the post is the page. */
|
|
60
|
+
headingLevel: number;
|
|
61
|
+
/** The words, English until given others. */
|
|
62
|
+
texts: Partial<KtBlogPostTexts>;
|
|
63
|
+
private counted;
|
|
64
|
+
private filled;
|
|
65
|
+
private readonly headingId;
|
|
66
|
+
firstUpdated(): void;
|
|
67
|
+
private readSlots;
|
|
68
|
+
private meta;
|
|
69
|
+
render(): TemplateResult;
|
|
70
|
+
}
|
|
71
|
+
declare global {
|
|
72
|
+
interface HTMLElementTagNameMap {
|
|
73
|
+
'kt-blog-post': KtBlogPost;
|
|
74
|
+
}
|
|
75
|
+
}
|