@skdx/web-components-blocks 0.1.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 +21 -0
- package/README.md +9 -0
- package/custom-elements.json +695 -0
- package/dist/dashboard-layout/DashboardLayout.cjs +50 -0
- package/dist/dashboard-layout/DashboardLayout.d.cts +87 -0
- package/dist/dashboard-layout/DashboardLayout.d.ts +87 -0
- package/dist/dashboard-layout/DashboardLayout.js +50 -0
- package/dist/dashboard-layout/index.cjs +1 -0
- package/dist/dashboard-layout/index.d.cts +1 -0
- package/dist/dashboard-layout/index.d.ts +1 -0
- package/dist/dashboard-layout/index.js +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.cts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -0
- package/dist/internal/define.cjs +1 -0
- package/dist/internal/define.d.cts +8 -0
- package/dist/internal/define.d.ts +8 -0
- package/dist/internal/define.js +1 -0
- package/dist/internal/events.cjs +1 -0
- package/dist/internal/events.d.cts +12 -0
- package/dist/internal/events.d.ts +12 -0
- package/dist/internal/events.js +1 -0
- package/dist/internal/part.cjs +1 -0
- package/dist/internal/part.d.cts +10 -0
- package/dist/internal/part.d.ts +10 -0
- package/dist/internal/part.js +1 -0
- package/dist/internal/slots.cjs +1 -0
- package/dist/internal/slots.d.cts +9 -0
- package/dist/internal/slots.d.ts +9 -0
- package/dist/internal/slots.js +1 -0
- package/dist/page-container/PageContainer.cjs +29 -0
- package/dist/page-container/PageContainer.d.cts +70 -0
- package/dist/page-container/PageContainer.d.ts +70 -0
- package/dist/page-container/PageContainer.js +29 -0
- package/dist/page-container/index.cjs +1 -0
- package/dist/page-container/index.d.cts +1 -0
- package/dist/page-container/index.d.ts +1 -0
- package/dist/page-container/index.js +1 -0
- package/dist/sign-in-page/SignInPage.cjs +63 -0
- package/dist/sign-in-page/SignInPage.d.cts +101 -0
- package/dist/sign-in-page/SignInPage.d.ts +101 -0
- package/dist/sign-in-page/SignInPage.js +63 -0
- package/dist/sign-in-page/index.cjs +1 -0
- package/dist/sign-in-page/index.d.cts +1 -0
- package/dist/sign-in-page/index.d.ts +1 -0
- package/dist/sign-in-page/index.js +1 -0
- package/package.json +117 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
var p=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var r=(o,a,i,s)=>{for(var t=s>1?void 0:s?m(a,i):a,l=o.length-1,d;l>=0;l--)(d=o[l])&&(t=(s?d(a,i,t):d(t))||t);return s&&t&&p(a,i,t),t};import{html as c,LitElement as u,nothing as b}from"lit";import{property as n}from"lit/decorators.js";import{customElement as g}from"../internal/define.js";import{placeSlotted as h}from"../internal/slots.js";import"@skdx/web-components/breadcrumb";import"@skdx/web-components/heading";import"@skdx/web-components/toolbar";var k="data-skdx-page-container-generated",v=0,e=class extends u{constructor(){super(...arguments);this.headingLevel=1;this.breadcrumbLabel="Breadcrumb";this.actionsLabel="Page actions";this.titleId=`skdx-page-container-title-${++v}`}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),this.setAttribute("role","region"),this.setAttribute("aria-labelledby",this.titleId),queueMicrotask(()=>this.requestUpdate())}get hasActions(){return this.querySelector('[slot="actions"]')!==null}region(i){return this.querySelector(`.skdx-page-container__${i}`)}updated(){h(this,k,{actions:this.region("actions")},this.region("content"))}render(){return c`
|
|
2
|
+
<header
|
|
3
|
+
class="skdx-page-container__header"
|
|
4
|
+
data-skdx-page-container-generated
|
|
5
|
+
role="none"
|
|
6
|
+
>
|
|
7
|
+
${this.breadcrumbs?.length?c`<skdx-breadcrumb
|
|
8
|
+
class="skdx-page-container__breadcrumbs"
|
|
9
|
+
label=${this.breadcrumbLabel}
|
|
10
|
+
.items=${this.breadcrumbs}
|
|
11
|
+
></skdx-breadcrumb>`:b}
|
|
12
|
+
<div class="skdx-page-container__heading-row">
|
|
13
|
+
<skdx-heading
|
|
14
|
+
class="skdx-page-container__title"
|
|
15
|
+
as=${`h${this.headingLevel}`}
|
|
16
|
+
id=${this.titleId}
|
|
17
|
+
>${this.title??""}</skdx-heading
|
|
18
|
+
>
|
|
19
|
+
${this.hasActions?c`<skdx-toolbar
|
|
20
|
+
class="skdx-page-container__actions"
|
|
21
|
+
aria-label=${this.actionsLabel}
|
|
22
|
+
></skdx-toolbar>`:b}
|
|
23
|
+
</div>
|
|
24
|
+
</header>
|
|
25
|
+
<div
|
|
26
|
+
class="skdx-page-container__content"
|
|
27
|
+
data-skdx-page-container-generated
|
|
28
|
+
></div>
|
|
29
|
+
`}};r([n({type:String})],e.prototype,"title",2),r([n({type:Number,attribute:"heading-level"})],e.prototype,"headingLevel",2),r([n({attribute:!1})],e.prototype,"breadcrumbs",2),r([n({type:String,attribute:"breadcrumb-label"})],e.prototype,"breadcrumbLabel",2),r([n({type:String,attribute:"actions-label"})],e.prototype,"actionsLabel",2),e=r([g("skdx-page-container","page-container","root")],e);export{e as SkdxPageContainer};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var o=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var k=(r,e)=>{for(var n in e)o(r,n,{get:e[n],enumerable:!0})},m=(r,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of g(e))!i.call(r,a)&&a!==n&&o(r,a,{get:()=>e[a],enumerable:!(t=x(e,a))||t.enumerable});return r};var p=r=>m(o({},"__esModule",{value:!0}),r);var C={};k(C,{SkdxPageContainer:()=>d.SkdxPageContainer});module.exports=p(C);var d=require("./PageContainer.cjs");0&&(module.exports={SkdxPageContainer});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SkdxPageContainer, type SkdxPageContainerBreadcrumb } from './PageContainer.cjs';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SkdxPageContainer, type SkdxPageContainerBreadcrumb } from './PageContainer.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{SkdxPageContainer as a}from"./PageContainer.js";export{a as SkdxPageContainer};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";var m=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var f=(s,r)=>{for(var e in r)m(s,e,{get:r[e],enumerable:!0})},_=(s,r,e,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of x(r))!h.call(s,t)&&t!==e&&m(s,t,{get:()=>r[t],enumerable:!(i=c(r,t))||i.enumerable});return s};var L=s=>_(m({},"__esModule",{value:!0}),s),l=(s,r,e,i)=>{for(var t=i>1?void 0:i?c(r,e):r,p=s.length-1,a;p>=0;p--)(a=s[p])&&(t=(i?a(r,e,t):a(t))||t);return i&&t&&m(r,e,t),t};var y={};f(y,{SkdxSignInPage:()=>d,defaultProviderLabel:()=>k});module.exports=L(y);var n=require("lit"),o=require("lit/decorators.js"),v=require("../internal/define.cjs"),g=require("../internal/events.cjs"),E=require("@skdx/web-components/alert"),S=require("@skdx/web-components/button"),I=require("@skdx/web-components/divider"),R=require("@skdx/web-components/field"),T=require("@skdx/web-components/form"),D=require("@skdx/web-components/heading"),q=require("@skdx/web-components/password-input"),M=require("@skdx/web-components/text-field");function k(s){return`Sign in with ${s.name}`}var u=new Set(["credentials","magic-link"]),$=0,d=class extends n.LitElement{constructor(){super(...arguments);this.title="Sign in";this.emailLabel="Email";this.passwordLabel="Password";this.submitLabel="Sign in";this.magicLinkLabel="Send magic link";this.titleId=`skdx-sign-in-page-title-${++$}`;this.handleSubmit=e=>{let i=e.target?.closest("skdx-form[data-provider]");if(!i)return;e.preventDefault();let t=i.getAttribute("data-provider")??"",p=b(i,"email");(0,g.emit)(this,"sign-in",t==="credentials"?{providerId:t,email:p,password:b(i,"password")}:{providerId:t,email:p})}}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),this.setAttribute("role","region"),this.setAttribute("aria-labelledby",this.titleId),this.addEventListener("submit",this.handleSubmit)}disconnectedCallback(){this.removeEventListener("submit",this.handleSubmit),super.disconnectedCallback()}signInWithProvider(e){(0,g.emit)(this,"sign-in",{providerId:e})}signInForm(e){let i=e.id==="credentials";return n.html`<skdx-form
|
|
2
|
+
class="skdx-sign-in-page__form"
|
|
3
|
+
data-provider=${e.id}
|
|
4
|
+
>
|
|
5
|
+
<form>
|
|
6
|
+
<skdx-field
|
|
7
|
+
class="skdx-sign-in-page__field"
|
|
8
|
+
label=${this.emailLabel}
|
|
9
|
+
required
|
|
10
|
+
>
|
|
11
|
+
<skdx-text-field
|
|
12
|
+
name="email"
|
|
13
|
+
type="email"
|
|
14
|
+
required
|
|
15
|
+
>
|
|
16
|
+
<skdx-text-field-input
|
|
17
|
+
type="email"
|
|
18
|
+
autocomplete="email"
|
|
19
|
+
></skdx-text-field-input>
|
|
20
|
+
</skdx-text-field>
|
|
21
|
+
</skdx-field>
|
|
22
|
+
${i?n.html`<skdx-field
|
|
23
|
+
class="skdx-sign-in-page__field"
|
|
24
|
+
label=${this.passwordLabel}
|
|
25
|
+
required
|
|
26
|
+
>
|
|
27
|
+
<skdx-password-input
|
|
28
|
+
name="password"
|
|
29
|
+
required
|
|
30
|
+
></skdx-password-input>
|
|
31
|
+
</skdx-field>`:n.nothing}
|
|
32
|
+
<skdx-button
|
|
33
|
+
class="skdx-sign-in-page__submit"
|
|
34
|
+
type="submit"
|
|
35
|
+
>${i?this.submitLabel:this.magicLinkLabel}</skdx-button
|
|
36
|
+
>
|
|
37
|
+
</form>
|
|
38
|
+
</skdx-form>`}render(){let e=this.providers??[],i=e.filter(a=>!u.has(a.id)),t=e.filter(a=>u.has(a.id)),p=this.getProviderLabel??k;return n.html`
|
|
39
|
+
<div class="skdx-sign-in-page__panel">
|
|
40
|
+
<skdx-heading
|
|
41
|
+
class="skdx-sign-in-page__title"
|
|
42
|
+
as="h1"
|
|
43
|
+
id=${this.titleId}
|
|
44
|
+
>${this.title}</skdx-heading
|
|
45
|
+
>
|
|
46
|
+
${this.error?n.html`<skdx-alert
|
|
47
|
+
class="skdx-sign-in-page__error"
|
|
48
|
+
data-status="danger"
|
|
49
|
+
>${this.error}</skdx-alert
|
|
50
|
+
>`:n.nothing}
|
|
51
|
+
${i.length?n.html`<div class="skdx-sign-in-page__providers">
|
|
52
|
+
${i.map(a=>n.html`<skdx-button
|
|
53
|
+
class="skdx-sign-in-page__provider"
|
|
54
|
+
type="button"
|
|
55
|
+
data-provider=${a.id}
|
|
56
|
+
@click=${()=>this.signInWithProvider(a.id)}
|
|
57
|
+
>${p(a)}</skdx-button
|
|
58
|
+
>`)}
|
|
59
|
+
</div>`:n.nothing}
|
|
60
|
+
${i.length&&t.length?n.html`<skdx-divider class="skdx-sign-in-page__divider"></skdx-divider>`:n.nothing}
|
|
61
|
+
${t.map(a=>this.signInForm(a))}
|
|
62
|
+
</div>
|
|
63
|
+
`}};l([(0,o.property)({type:String})],d.prototype,"title",2),l([(0,o.property)({attribute:!1})],d.prototype,"providers",2),l([(0,o.property)({type:String})],d.prototype,"error",2),l([(0,o.property)({type:String,attribute:"email-label"})],d.prototype,"emailLabel",2),l([(0,o.property)({type:String,attribute:"password-label"})],d.prototype,"passwordLabel",2),l([(0,o.property)({type:String,attribute:"submit-label"})],d.prototype,"submitLabel",2),l([(0,o.property)({type:String,attribute:"magic-link-label"})],d.prototype,"magicLinkLabel",2),l([(0,o.property)({attribute:!1})],d.prototype,"getProviderLabel",2),d=l([(0,v.customElement)("skdx-sign-in-page","sign-in-page","root")],d);function b(s,r){return s.querySelector(`[name="${r}"]`)?.value??""}0&&(module.exports={SkdxSignInPage,defaultProviderLabel});
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { LitElement, type TemplateResult } from 'lit';
|
|
2
|
+
import '@skdx/web-components/alert';
|
|
3
|
+
import '@skdx/web-components/button';
|
|
4
|
+
import '@skdx/web-components/divider';
|
|
5
|
+
import '@skdx/web-components/field';
|
|
6
|
+
import '@skdx/web-components/form';
|
|
7
|
+
import '@skdx/web-components/heading';
|
|
8
|
+
import '@skdx/web-components/password-input';
|
|
9
|
+
import '@skdx/web-components/text-field';
|
|
10
|
+
/** One way to sign in, rendered as a provider button or as one of the two forms. */
|
|
11
|
+
export interface SkdxSignInProvider {
|
|
12
|
+
/** The provider's id; `'credentials'` and `'magic-link'` render forms, anything else a button. */
|
|
13
|
+
id: string;
|
|
14
|
+
/** The provider's display name, which the default button label reads. */
|
|
15
|
+
name: string;
|
|
16
|
+
}
|
|
17
|
+
/** What a `sign-in` event carries: the chosen provider, plus the values of the form that submitted. */
|
|
18
|
+
export interface SkdxSignInDetail {
|
|
19
|
+
/** The `id` of the provider the user chose. */
|
|
20
|
+
providerId: string;
|
|
21
|
+
/** The email the submitted form held; absent for a provider button. */
|
|
22
|
+
email?: string;
|
|
23
|
+
/** The password the credentials form held; absent otherwise. */
|
|
24
|
+
password?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Default provider button text, reading "Sign in with Google" for a provider named Google. */
|
|
27
|
+
export declare function defaultProviderLabel(provider: SkdxSignInProvider): string;
|
|
28
|
+
/**
|
|
29
|
+
* Sign-in block: provider buttons, an email and password form, and a magic-link form.
|
|
30
|
+
*
|
|
31
|
+
* Renders light DOM, so its parts are classes rather than shadow `::part()`
|
|
32
|
+
* targets: `.skdx-sign-in-page` on the host, then `__panel`, `__title`,
|
|
33
|
+
* `__error`, `__providers`, `__provider`, `__divider`, `__form`, `__field`
|
|
34
|
+
* and `__submit`.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```html
|
|
38
|
+
* <skdx-sign-in-page id="sign-in"></skdx-sign-in-page>
|
|
39
|
+
* <script>
|
|
40
|
+
* const page = document.getElementById('sign-in');
|
|
41
|
+
* page.providers = [{ id: 'credentials', name: 'Email' }];
|
|
42
|
+
* page.addEventListener('sign-in', (event) => console.log(event.detail));
|
|
43
|
+
* </script>
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @fires sign-in - Fires with `{ providerId, email?, password? }` when a provider button is activated or a form submits with valid fields.
|
|
47
|
+
*/
|
|
48
|
+
export declare class SkdxSignInPage extends LitElement {
|
|
49
|
+
/** Light DOM, so `@skdx/skins` and consumer CSS reach the composed core elements. */
|
|
50
|
+
createRenderRoot(): HTMLElement | DocumentFragment;
|
|
51
|
+
/**
|
|
52
|
+
* Heading text, rendered into a derived `<h1>` that names the section.
|
|
53
|
+
* @default 'Sign in'
|
|
54
|
+
*/
|
|
55
|
+
title: string;
|
|
56
|
+
/** The ways to sign in, in render order; `'credentials'` and `'magic-link'` render their forms. */
|
|
57
|
+
providers: readonly SkdxSignInProvider[];
|
|
58
|
+
/**
|
|
59
|
+
* Message rendered into a derived error Alert above the providers. The block never clears it.
|
|
60
|
+
* @default undefined — no alert renders.
|
|
61
|
+
*/
|
|
62
|
+
error?: string;
|
|
63
|
+
/**
|
|
64
|
+
* Label of the email field in both forms.
|
|
65
|
+
* @default 'Email'
|
|
66
|
+
*/
|
|
67
|
+
emailLabel: string;
|
|
68
|
+
/**
|
|
69
|
+
* Label of the password field in the credentials form.
|
|
70
|
+
* @default 'Password'
|
|
71
|
+
*/
|
|
72
|
+
passwordLabel: string;
|
|
73
|
+
/**
|
|
74
|
+
* Text of the credentials form submit button.
|
|
75
|
+
* @default 'Sign in'
|
|
76
|
+
*/
|
|
77
|
+
submitLabel: string;
|
|
78
|
+
/**
|
|
79
|
+
* Text of the magic-link form submit button.
|
|
80
|
+
* @default 'Send magic link'
|
|
81
|
+
*/
|
|
82
|
+
magicLinkLabel: string;
|
|
83
|
+
/**
|
|
84
|
+
* Formats a provider button's text from its entry.
|
|
85
|
+
* @default defaultProviderLabel — reads "Sign in with Google".
|
|
86
|
+
*/
|
|
87
|
+
getProviderLabel?: (provider: SkdxSignInProvider) => string;
|
|
88
|
+
/** Generated title id, published as the section's `aria-labelledby`. */
|
|
89
|
+
private readonly titleId;
|
|
90
|
+
connectedCallback(): void;
|
|
91
|
+
disconnectedCallback(): void;
|
|
92
|
+
private readonly handleSubmit;
|
|
93
|
+
private signInWithProvider;
|
|
94
|
+
private signInForm;
|
|
95
|
+
render(): TemplateResult;
|
|
96
|
+
}
|
|
97
|
+
declare global {
|
|
98
|
+
interface HTMLElementTagNameMap {
|
|
99
|
+
'skdx-sign-in-page': SkdxSignInPage;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { LitElement, type TemplateResult } from 'lit';
|
|
2
|
+
import '@skdx/web-components/alert';
|
|
3
|
+
import '@skdx/web-components/button';
|
|
4
|
+
import '@skdx/web-components/divider';
|
|
5
|
+
import '@skdx/web-components/field';
|
|
6
|
+
import '@skdx/web-components/form';
|
|
7
|
+
import '@skdx/web-components/heading';
|
|
8
|
+
import '@skdx/web-components/password-input';
|
|
9
|
+
import '@skdx/web-components/text-field';
|
|
10
|
+
/** One way to sign in, rendered as a provider button or as one of the two forms. */
|
|
11
|
+
export interface SkdxSignInProvider {
|
|
12
|
+
/** The provider's id; `'credentials'` and `'magic-link'` render forms, anything else a button. */
|
|
13
|
+
id: string;
|
|
14
|
+
/** The provider's display name, which the default button label reads. */
|
|
15
|
+
name: string;
|
|
16
|
+
}
|
|
17
|
+
/** What a `sign-in` event carries: the chosen provider, plus the values of the form that submitted. */
|
|
18
|
+
export interface SkdxSignInDetail {
|
|
19
|
+
/** The `id` of the provider the user chose. */
|
|
20
|
+
providerId: string;
|
|
21
|
+
/** The email the submitted form held; absent for a provider button. */
|
|
22
|
+
email?: string;
|
|
23
|
+
/** The password the credentials form held; absent otherwise. */
|
|
24
|
+
password?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Default provider button text, reading "Sign in with Google" for a provider named Google. */
|
|
27
|
+
export declare function defaultProviderLabel(provider: SkdxSignInProvider): string;
|
|
28
|
+
/**
|
|
29
|
+
* Sign-in block: provider buttons, an email and password form, and a magic-link form.
|
|
30
|
+
*
|
|
31
|
+
* Renders light DOM, so its parts are classes rather than shadow `::part()`
|
|
32
|
+
* targets: `.skdx-sign-in-page` on the host, then `__panel`, `__title`,
|
|
33
|
+
* `__error`, `__providers`, `__provider`, `__divider`, `__form`, `__field`
|
|
34
|
+
* and `__submit`.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```html
|
|
38
|
+
* <skdx-sign-in-page id="sign-in"></skdx-sign-in-page>
|
|
39
|
+
* <script>
|
|
40
|
+
* const page = document.getElementById('sign-in');
|
|
41
|
+
* page.providers = [{ id: 'credentials', name: 'Email' }];
|
|
42
|
+
* page.addEventListener('sign-in', (event) => console.log(event.detail));
|
|
43
|
+
* </script>
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @fires sign-in - Fires with `{ providerId, email?, password? }` when a provider button is activated or a form submits with valid fields.
|
|
47
|
+
*/
|
|
48
|
+
export declare class SkdxSignInPage extends LitElement {
|
|
49
|
+
/** Light DOM, so `@skdx/skins` and consumer CSS reach the composed core elements. */
|
|
50
|
+
createRenderRoot(): HTMLElement | DocumentFragment;
|
|
51
|
+
/**
|
|
52
|
+
* Heading text, rendered into a derived `<h1>` that names the section.
|
|
53
|
+
* @default 'Sign in'
|
|
54
|
+
*/
|
|
55
|
+
title: string;
|
|
56
|
+
/** The ways to sign in, in render order; `'credentials'` and `'magic-link'` render their forms. */
|
|
57
|
+
providers: readonly SkdxSignInProvider[];
|
|
58
|
+
/**
|
|
59
|
+
* Message rendered into a derived error Alert above the providers. The block never clears it.
|
|
60
|
+
* @default undefined — no alert renders.
|
|
61
|
+
*/
|
|
62
|
+
error?: string;
|
|
63
|
+
/**
|
|
64
|
+
* Label of the email field in both forms.
|
|
65
|
+
* @default 'Email'
|
|
66
|
+
*/
|
|
67
|
+
emailLabel: string;
|
|
68
|
+
/**
|
|
69
|
+
* Label of the password field in the credentials form.
|
|
70
|
+
* @default 'Password'
|
|
71
|
+
*/
|
|
72
|
+
passwordLabel: string;
|
|
73
|
+
/**
|
|
74
|
+
* Text of the credentials form submit button.
|
|
75
|
+
* @default 'Sign in'
|
|
76
|
+
*/
|
|
77
|
+
submitLabel: string;
|
|
78
|
+
/**
|
|
79
|
+
* Text of the magic-link form submit button.
|
|
80
|
+
* @default 'Send magic link'
|
|
81
|
+
*/
|
|
82
|
+
magicLinkLabel: string;
|
|
83
|
+
/**
|
|
84
|
+
* Formats a provider button's text from its entry.
|
|
85
|
+
* @default defaultProviderLabel — reads "Sign in with Google".
|
|
86
|
+
*/
|
|
87
|
+
getProviderLabel?: (provider: SkdxSignInProvider) => string;
|
|
88
|
+
/** Generated title id, published as the section's `aria-labelledby`. */
|
|
89
|
+
private readonly titleId;
|
|
90
|
+
connectedCallback(): void;
|
|
91
|
+
disconnectedCallback(): void;
|
|
92
|
+
private readonly handleSubmit;
|
|
93
|
+
private signInWithProvider;
|
|
94
|
+
private signInForm;
|
|
95
|
+
render(): TemplateResult;
|
|
96
|
+
}
|
|
97
|
+
declare global {
|
|
98
|
+
interface HTMLElementTagNameMap {
|
|
99
|
+
'skdx-sign-in-page': SkdxSignInPage;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
var b=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var n=(l,o,t,e)=>{for(var i=e>1?void 0:e?v(o,t):o,a=l.length-1,r;a>=0;a--)(r=l[a])&&(i=(e?r(o,t,i):r(i))||i);return e&&i&&b(o,t,i),i};import{html as p,LitElement as k,nothing as m}from"lit";import{property as d}from"lit/decorators.js";import{customElement as x}from"../internal/define.js";import{emit as g}from"../internal/events.js";import"@skdx/web-components/alert";import"@skdx/web-components/button";import"@skdx/web-components/divider";import"@skdx/web-components/field";import"@skdx/web-components/form";import"@skdx/web-components/heading";import"@skdx/web-components/password-input";import"@skdx/web-components/text-field";function h(l){return`Sign in with ${l.name}`}var c=new Set(["credentials","magic-link"]),f=0,s=class extends k{constructor(){super(...arguments);this.title="Sign in";this.emailLabel="Email";this.passwordLabel="Password";this.submitLabel="Sign in";this.magicLinkLabel="Send magic link";this.titleId=`skdx-sign-in-page-title-${++f}`;this.handleSubmit=t=>{let e=t.target?.closest("skdx-form[data-provider]");if(!e)return;t.preventDefault();let i=e.getAttribute("data-provider")??"",a=u(e,"email");g(this,"sign-in",i==="credentials"?{providerId:i,email:a,password:u(e,"password")}:{providerId:i,email:a})}}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),this.setAttribute("role","region"),this.setAttribute("aria-labelledby",this.titleId),this.addEventListener("submit",this.handleSubmit)}disconnectedCallback(){this.removeEventListener("submit",this.handleSubmit),super.disconnectedCallback()}signInWithProvider(t){g(this,"sign-in",{providerId:t})}signInForm(t){let e=t.id==="credentials";return p`<skdx-form
|
|
2
|
+
class="skdx-sign-in-page__form"
|
|
3
|
+
data-provider=${t.id}
|
|
4
|
+
>
|
|
5
|
+
<form>
|
|
6
|
+
<skdx-field
|
|
7
|
+
class="skdx-sign-in-page__field"
|
|
8
|
+
label=${this.emailLabel}
|
|
9
|
+
required
|
|
10
|
+
>
|
|
11
|
+
<skdx-text-field
|
|
12
|
+
name="email"
|
|
13
|
+
type="email"
|
|
14
|
+
required
|
|
15
|
+
>
|
|
16
|
+
<skdx-text-field-input
|
|
17
|
+
type="email"
|
|
18
|
+
autocomplete="email"
|
|
19
|
+
></skdx-text-field-input>
|
|
20
|
+
</skdx-text-field>
|
|
21
|
+
</skdx-field>
|
|
22
|
+
${e?p`<skdx-field
|
|
23
|
+
class="skdx-sign-in-page__field"
|
|
24
|
+
label=${this.passwordLabel}
|
|
25
|
+
required
|
|
26
|
+
>
|
|
27
|
+
<skdx-password-input
|
|
28
|
+
name="password"
|
|
29
|
+
required
|
|
30
|
+
></skdx-password-input>
|
|
31
|
+
</skdx-field>`:m}
|
|
32
|
+
<skdx-button
|
|
33
|
+
class="skdx-sign-in-page__submit"
|
|
34
|
+
type="submit"
|
|
35
|
+
>${e?this.submitLabel:this.magicLinkLabel}</skdx-button
|
|
36
|
+
>
|
|
37
|
+
</form>
|
|
38
|
+
</skdx-form>`}render(){let t=this.providers??[],e=t.filter(r=>!c.has(r.id)),i=t.filter(r=>c.has(r.id)),a=this.getProviderLabel??h;return p`
|
|
39
|
+
<div class="skdx-sign-in-page__panel">
|
|
40
|
+
<skdx-heading
|
|
41
|
+
class="skdx-sign-in-page__title"
|
|
42
|
+
as="h1"
|
|
43
|
+
id=${this.titleId}
|
|
44
|
+
>${this.title}</skdx-heading
|
|
45
|
+
>
|
|
46
|
+
${this.error?p`<skdx-alert
|
|
47
|
+
class="skdx-sign-in-page__error"
|
|
48
|
+
data-status="danger"
|
|
49
|
+
>${this.error}</skdx-alert
|
|
50
|
+
>`:m}
|
|
51
|
+
${e.length?p`<div class="skdx-sign-in-page__providers">
|
|
52
|
+
${e.map(r=>p`<skdx-button
|
|
53
|
+
class="skdx-sign-in-page__provider"
|
|
54
|
+
type="button"
|
|
55
|
+
data-provider=${r.id}
|
|
56
|
+
@click=${()=>this.signInWithProvider(r.id)}
|
|
57
|
+
>${a(r)}</skdx-button
|
|
58
|
+
>`)}
|
|
59
|
+
</div>`:m}
|
|
60
|
+
${e.length&&i.length?p`<skdx-divider class="skdx-sign-in-page__divider"></skdx-divider>`:m}
|
|
61
|
+
${i.map(r=>this.signInForm(r))}
|
|
62
|
+
</div>
|
|
63
|
+
`}};n([d({type:String})],s.prototype,"title",2),n([d({attribute:!1})],s.prototype,"providers",2),n([d({type:String})],s.prototype,"error",2),n([d({type:String,attribute:"email-label"})],s.prototype,"emailLabel",2),n([d({type:String,attribute:"password-label"})],s.prototype,"passwordLabel",2),n([d({type:String,attribute:"submit-label"})],s.prototype,"submitLabel",2),n([d({type:String,attribute:"magic-link-label"})],s.prototype,"magicLinkLabel",2),n([d({attribute:!1})],s.prototype,"getProviderLabel",2),s=n([x("skdx-sign-in-page","sign-in-page","root")],s);function u(l,o){return l.querySelector(`[name="${o}"]`)?.value??""}export{s as SkdxSignInPage,h as defaultProviderLabel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var S=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var o=Object.prototype.hasOwnProperty;var x=(d,e)=>{for(var n in e)S(d,n,{get:e[n],enumerable:!0})},k=(d,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of g(e))!o.call(d,i)&&i!==n&&S(d,i,{get:()=>e[i],enumerable:!(t=a(e,i))||t.enumerable});return d};var l=d=>k(S({},"__esModule",{value:!0}),d);var p={};x(p,{SkdxSignInPage:()=>r.SkdxSignInPage,defaultProviderLabel:()=>r.defaultProviderLabel});module.exports=l(p);var r=require("./SignInPage.cjs");0&&(module.exports={SkdxSignInPage,defaultProviderLabel});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { defaultProviderLabel, SkdxSignInPage, type SkdxSignInDetail, type SkdxSignInProvider, } from './SignInPage.cjs';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { defaultProviderLabel, SkdxSignInPage, type SkdxSignInDetail, type SkdxSignInProvider, } from './SignInPage.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{defaultProviderLabel as i,SkdxSignInPage as n}from"./SignInPage.js";export{n as SkdxSignInPage,i as defaultProviderLabel};
|
package/package.json
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@skdx/web-components-blocks",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Web Components blocks for the SkandaDX design system — page-level compositions of @skdx/web-components styled by @skdx/skins",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/SkandaDX/ui.skdx/tree/main/packages/web-components-blocks#readme",
|
|
10
|
+
"repository": {
|
|
11
|
+
"directory": "packages/web-components-blocks",
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/SkandaDX/ui.skdx.git"
|
|
14
|
+
},
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/SkandaDX/ui.skdx/issues"
|
|
17
|
+
},
|
|
18
|
+
"type": "module",
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=18.18.0"
|
|
21
|
+
},
|
|
22
|
+
"main": "./dist/index.cjs",
|
|
23
|
+
"module": "./dist/index.js",
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"customElements": "custom-elements.json",
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"import": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"default": "./dist/index.js"
|
|
31
|
+
},
|
|
32
|
+
"require": {
|
|
33
|
+
"types": "./dist/index.d.cts",
|
|
34
|
+
"default": "./dist/index.cjs"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"./dashboard-layout": {
|
|
38
|
+
"import": {
|
|
39
|
+
"types": "./dist/dashboard-layout/index.d.ts",
|
|
40
|
+
"default": "./dist/dashboard-layout/index.js"
|
|
41
|
+
},
|
|
42
|
+
"require": {
|
|
43
|
+
"types": "./dist/dashboard-layout/index.d.cts",
|
|
44
|
+
"default": "./dist/dashboard-layout/index.cjs"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"./package.json": "./package.json",
|
|
48
|
+
"./page-container": {
|
|
49
|
+
"import": {
|
|
50
|
+
"types": "./dist/page-container/index.d.ts",
|
|
51
|
+
"default": "./dist/page-container/index.js"
|
|
52
|
+
},
|
|
53
|
+
"require": {
|
|
54
|
+
"types": "./dist/page-container/index.d.cts",
|
|
55
|
+
"default": "./dist/page-container/index.cjs"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"./sign-in-page": {
|
|
59
|
+
"import": {
|
|
60
|
+
"types": "./dist/sign-in-page/index.d.ts",
|
|
61
|
+
"default": "./dist/sign-in-page/index.js"
|
|
62
|
+
},
|
|
63
|
+
"require": {
|
|
64
|
+
"types": "./dist/sign-in-page/index.d.cts",
|
|
65
|
+
"default": "./dist/sign-in-page/index.cjs"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"files": [
|
|
70
|
+
"dist",
|
|
71
|
+
"custom-elements.json",
|
|
72
|
+
"!dist/**/*.md",
|
|
73
|
+
"!dist/**/*.test.*",
|
|
74
|
+
"!dist/**/*.map"
|
|
75
|
+
],
|
|
76
|
+
"sideEffects": [
|
|
77
|
+
"./dist/dashboard-layout/DashboardLayout.cjs",
|
|
78
|
+
"./dist/dashboard-layout/DashboardLayout.js",
|
|
79
|
+
"./dist/dashboard-layout/index.cjs",
|
|
80
|
+
"./dist/dashboard-layout/index.js",
|
|
81
|
+
"./dist/index.cjs",
|
|
82
|
+
"./dist/index.js",
|
|
83
|
+
"./dist/page-container/PageContainer.cjs",
|
|
84
|
+
"./dist/page-container/PageContainer.js",
|
|
85
|
+
"./dist/page-container/index.cjs",
|
|
86
|
+
"./dist/page-container/index.js",
|
|
87
|
+
"./dist/sign-in-page/SignInPage.cjs",
|
|
88
|
+
"./dist/sign-in-page/SignInPage.js",
|
|
89
|
+
"./dist/sign-in-page/index.cjs",
|
|
90
|
+
"./dist/sign-in-page/index.js"
|
|
91
|
+
],
|
|
92
|
+
"peerDependencies": {
|
|
93
|
+
"lit": "^3.3.0",
|
|
94
|
+
"@skdx/web-components": "^0.33.0"
|
|
95
|
+
},
|
|
96
|
+
"devDependencies": {
|
|
97
|
+
"@custom-elements-manifest/analyzer": "^0.10.4",
|
|
98
|
+
"@vitest/coverage-v8": "^4.1.10",
|
|
99
|
+
"axe-core": "^4.12.1",
|
|
100
|
+
"jsdom": "^29.1.1",
|
|
101
|
+
"lit": "^3.3.0",
|
|
102
|
+
"tsup": "^8.5.1",
|
|
103
|
+
"typescript": "^6.0.3",
|
|
104
|
+
"vitest": "^4.1.10",
|
|
105
|
+
"@skdx/web-components": "0.33.0"
|
|
106
|
+
},
|
|
107
|
+
"scripts": {
|
|
108
|
+
"lint": "eslint . --cache --cache-location node_modules/.cache/eslint/",
|
|
109
|
+
"build": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsup && tsc -p tsconfig.build.json --emitDeclarationOnly && node ../../scripts/declarations-cjs.mjs",
|
|
110
|
+
"analyze": "cem analyze --litelement --globs \"src/**/*.ts\" --exclude \"src/**/*.test.ts\" --outdir .",
|
|
111
|
+
"dev": "tsup --watch",
|
|
112
|
+
"typecheck": "tsc --noEmit --incremental --tsBuildInfoFile node_modules/.cache/tsc/typecheck.tsbuildinfo",
|
|
113
|
+
"test": "vitest run",
|
|
114
|
+
"test:watch": "vitest",
|
|
115
|
+
"test:coverage": "vitest run --coverage"
|
|
116
|
+
}
|
|
117
|
+
}
|