@kya-os/consent 0.1.0 → 0.1.1
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/dist/bundle/index.d.ts +44 -0
- package/dist/bundle/index.d.ts.map +1 -0
- package/dist/bundle/index.js +45 -0
- package/dist/bundle/index.js.map +1 -0
- package/dist/bundle/inline.d.ts +18 -0
- package/dist/bundle/inline.d.ts.map +1 -0
- package/dist/bundle/inline.js +18 -0
- package/dist/bundle/inline.js.map +1 -0
- package/dist/bundle/shell.d.ts +91 -0
- package/dist/bundle/shell.d.ts.map +1 -0
- package/dist/bundle/shell.js +282 -0
- package/dist/bundle/shell.js.map +1 -0
- package/dist/components/consent-button.d.ts +61 -0
- package/dist/components/consent-button.d.ts.map +1 -0
- package/dist/components/consent-button.js +177 -0
- package/dist/components/consent-button.js.map +1 -0
- package/dist/components/consent-checkbox.d.ts +61 -0
- package/dist/components/consent-checkbox.d.ts.map +1 -0
- package/dist/components/consent-checkbox.js +220 -0
- package/dist/components/consent-checkbox.js.map +1 -0
- package/dist/components/consent-input.d.ts +91 -0
- package/dist/components/consent-input.d.ts.map +1 -0
- package/dist/components/consent-input.js +332 -0
- package/dist/components/consent-input.js.map +1 -0
- package/dist/components/consent-oauth-button.d.ts +87 -0
- package/dist/components/consent-oauth-button.d.ts.map +1 -0
- package/dist/components/consent-oauth-button.js +389 -0
- package/dist/components/consent-oauth-button.js.map +1 -0
- package/dist/components/consent-otp-input.d.ts +92 -0
- package/dist/components/consent-otp-input.d.ts.map +1 -0
- package/dist/components/consent-otp-input.js +378 -0
- package/dist/components/consent-otp-input.js.map +1 -0
- package/dist/components/consent-permissions.d.ts +104 -0
- package/dist/components/consent-permissions.d.ts.map +1 -0
- package/dist/components/consent-permissions.js +430 -0
- package/dist/components/consent-permissions.js.map +1 -0
- package/dist/components/consent-shell.d.ts +72 -0
- package/dist/components/consent-shell.d.ts.map +1 -0
- package/dist/components/consent-shell.js +231 -0
- package/dist/components/consent-shell.js.map +1 -0
- package/dist/components/consent-terms.d.ts +89 -0
- package/dist/components/consent-terms.d.ts.map +1 -0
- package/dist/components/consent-terms.js +284 -0
- package/dist/components/consent-terms.js.map +1 -0
- package/dist/components/index.d.ts +19 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +23 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/mcp-consent.d.ts +152 -0
- package/dist/components/mcp-consent.d.ts.map +1 -0
- package/dist/components/mcp-consent.js +874 -0
- package/dist/components/mcp-consent.js.map +1 -0
- package/dist/consent.js +3737 -0
- package/dist/consent.min.js +1564 -0
- package/dist/constants/auth-modes.d.ts +7 -2
- package/dist/constants/auth-modes.d.ts.map +1 -1
- package/dist/constants/auth-modes.js +28 -36
- package/dist/constants/auth-modes.js.map +1 -1
- package/dist/constants/colors.js +1 -4
- package/dist/constants/colors.js.map +1 -1
- package/dist/constants/defaults.d.ts +1 -1
- package/dist/constants/defaults.d.ts.map +1 -1
- package/dist/constants/defaults.js +16 -19
- package/dist/constants/defaults.js.map +1 -1
- package/dist/constants/index.d.ts +3 -3
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +3 -26
- package/dist/constants/index.js.map +1 -1
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -23
- package/dist/index.js.map +1 -1
- package/dist/react/index.d.ts +123 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +154 -0
- package/dist/react/index.js.map +1 -0
- package/dist/resolution/index.d.ts +3 -3
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +3 -19
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/resolve-branding.d.ts +1 -1
- package/dist/resolution/resolve-branding.d.ts.map +1 -1
- package/dist/resolution/resolve-branding.js +14 -24
- package/dist/resolution/resolve-branding.js.map +1 -1
- package/dist/resolution/resolve-config.d.ts +2 -2
- package/dist/resolution/resolve-config.d.ts.map +1 -1
- package/dist/resolution/resolve-config.js +57 -53
- package/dist/resolution/resolve-config.js.map +1 -1
- package/dist/resolution/resolve-copy.d.ts +2 -2
- package/dist/resolution/resolve-copy.d.ts.map +1 -1
- package/dist/resolution/resolve-copy.js +35 -43
- package/dist/resolution/resolve-copy.js.map +1 -1
- package/dist/schemas/api.schemas.d.ts +7 -4
- package/dist/schemas/api.schemas.d.ts.map +1 -1
- package/dist/schemas/api.schemas.js +70 -74
- package/dist/schemas/api.schemas.js.map +1 -1
- package/dist/schemas/branding.schemas.js +17 -20
- package/dist/schemas/branding.schemas.js.map +1 -1
- package/dist/schemas/config.schemas.d.ts +1 -1
- package/dist/schemas/config.schemas.d.ts.map +1 -1
- package/dist/schemas/config.schemas.js +64 -70
- package/dist/schemas/config.schemas.js.map +1 -1
- package/dist/schemas/index.d.ts +4 -4
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +4 -20
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/modes.schemas.js +60 -63
- package/dist/schemas/modes.schemas.js.map +1 -1
- package/dist/security/escape.d.ts.map +1 -1
- package/dist/security/escape.js +12 -17
- package/dist/security/escape.js.map +1 -1
- package/dist/security/index.d.ts +2 -2
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +2 -18
- package/dist/security/index.js.map +1 -1
- package/dist/security/validators.js +9 -20
- package/dist/security/validators.js.map +1 -1
- package/dist/styles/css-variables.d.ts +1 -1
- package/dist/styles/css-variables.d.ts.map +1 -1
- package/dist/styles/css-variables.js +18 -27
- package/dist/styles/css-variables.js.map +1 -1
- package/dist/styles/index.d.ts +3 -3
- package/dist/styles/index.d.ts.map +1 -1
- package/dist/styles/index.js +3 -19
- package/dist/styles/index.js.map +1 -1
- package/dist/styles/stylesheet.d.ts +1 -1
- package/dist/styles/stylesheet.d.ts.map +1 -1
- package/dist/styles/stylesheet.js +20 -27
- package/dist/styles/stylesheet.js.map +1 -1
- package/dist/styles/tokens.js +1 -4
- package/dist/styles/tokens.js.map +1 -1
- package/dist/templates/base/base-template.d.ts +3 -3
- package/dist/templates/base/base-template.d.ts.map +1 -1
- package/dist/templates/base/base-template.js +31 -35
- package/dist/templates/base/base-template.js.map +1 -1
- package/dist/templates/base/components.js +49 -65
- package/dist/templates/base/components.js.map +1 -1
- package/dist/templates/base/index.d.ts +2 -2
- package/dist/templates/base/index.d.ts.map +1 -1
- package/dist/templates/base/index.js +2 -20
- package/dist/templates/base/index.js.map +1 -1
- package/dist/templates/index.d.ts +9 -9
- package/dist/templates/index.d.ts.map +1 -1
- package/dist/templates/index.js +9 -25
- package/dist/templates/index.js.map +1 -1
- package/dist/templates/modes/consent-only.template.d.ts +2 -2
- package/dist/templates/modes/consent-only.template.d.ts.map +1 -1
- package/dist/templates/modes/consent-only.template.js +11 -15
- package/dist/templates/modes/consent-only.template.js.map +1 -1
- package/dist/templates/modes/credentials.template.d.ts +4 -4
- package/dist/templates/modes/credentials.template.d.ts.map +1 -1
- package/dist/templates/modes/credentials.template.js +20 -24
- package/dist/templates/modes/credentials.template.js.map +1 -1
- package/dist/templates/modes/index.d.ts +6 -6
- package/dist/templates/modes/index.d.ts.map +1 -1
- package/dist/templates/modes/index.js +6 -16
- package/dist/templates/modes/index.js.map +1 -1
- package/dist/templates/modes/magic-link.template.d.ts +2 -2
- package/dist/templates/modes/magic-link.template.d.ts.map +1 -1
- package/dist/templates/modes/magic-link.template.js +14 -18
- package/dist/templates/modes/magic-link.template.js.map +1 -1
- package/dist/templates/modes/oauth.template.d.ts +2 -2
- package/dist/templates/modes/oauth.template.d.ts.map +1 -1
- package/dist/templates/modes/oauth.template.js +21 -25
- package/dist/templates/modes/oauth.template.js.map +1 -1
- package/dist/templates/modes/otp.template.d.ts +2 -2
- package/dist/templates/modes/otp.template.d.ts.map +1 -1
- package/dist/templates/modes/otp.template.js +17 -21
- package/dist/templates/modes/otp.template.js.map +1 -1
- package/dist/templates/modes/success.template.d.ts +2 -2
- package/dist/templates/modes/success.template.d.ts.map +1 -1
- package/dist/templates/modes/success.template.js +24 -29
- package/dist/templates/modes/success.template.js.map +1 -1
- package/dist/templates/registry.d.ts +4 -4
- package/dist/templates/registry.d.ts.map +1 -1
- package/dist/templates/registry.js +30 -38
- package/dist/templates/registry.js.map +1 -1
- package/dist/types/api.types.d.ts +6 -5
- package/dist/types/api.types.d.ts.map +1 -1
- package/dist/types/api.types.js +1 -2
- package/dist/types/api.types.js.map +1 -1
- package/dist/types/branding.types.js +1 -2
- package/dist/types/branding.types.js.map +1 -1
- package/dist/types/config.types.d.ts +5 -5
- package/dist/types/config.types.d.ts.map +1 -1
- package/dist/types/config.types.js +1 -2
- package/dist/types/config.types.js.map +1 -1
- package/dist/types/copy.types.js +1 -2
- package/dist/types/copy.types.js.map +1 -1
- package/dist/types/index.d.ts +6 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +6 -22
- package/dist/types/index.js.map +1 -1
- package/dist/types/modes.types.js +1 -4
- package/dist/types/modes.types.js.map +1 -1
- package/dist/types/page.types.d.ts +6 -6
- package/dist/types/page.types.d.ts.map +1 -1
- package/dist/types/page.types.js +1 -2
- package/dist/types/page.types.js.map +1 -1
- package/package.json +41 -4
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consent OAuth Button Web Component
|
|
3
|
+
*
|
|
4
|
+
* A styled button for OAuth provider authentication with provider branding.
|
|
5
|
+
* Supports common OAuth providers with built-in icons.
|
|
6
|
+
*
|
|
7
|
+
* @module components/consent-oauth-button
|
|
8
|
+
*/
|
|
9
|
+
import { LitElement, TemplateResult } from 'lit';
|
|
10
|
+
/**
|
|
11
|
+
* Supported OAuth providers with built-in styling
|
|
12
|
+
*/
|
|
13
|
+
export type OAuthProvider = 'google' | 'microsoft' | 'apple' | 'github' | 'twitter' | 'facebook' | 'custom';
|
|
14
|
+
/**
|
|
15
|
+
* ConsentOAuthButton - OAuth provider sign-in button
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```html
|
|
19
|
+
* <consent-oauth-button
|
|
20
|
+
* provider="google"
|
|
21
|
+
* url="/auth/google"
|
|
22
|
+
* ></consent-oauth-button>
|
|
23
|
+
*
|
|
24
|
+
* <consent-oauth-button
|
|
25
|
+
* provider="custom"
|
|
26
|
+
* provider-name="Acme Corp"
|
|
27
|
+
* url="/auth/acme"
|
|
28
|
+
* ></consent-oauth-button>
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @fires oauth-click - When button is clicked (includes provider and url in detail)
|
|
32
|
+
* @csspart button - The button element
|
|
33
|
+
* @csspart icon - The provider icon
|
|
34
|
+
* @csspart text - The button text
|
|
35
|
+
*/
|
|
36
|
+
export declare class ConsentOAuthButton extends LitElement {
|
|
37
|
+
/**
|
|
38
|
+
* OAuth provider type
|
|
39
|
+
*/
|
|
40
|
+
provider: OAuthProvider;
|
|
41
|
+
/**
|
|
42
|
+
* Custom provider name (used when provider='custom')
|
|
43
|
+
*/
|
|
44
|
+
providerName?: string;
|
|
45
|
+
/**
|
|
46
|
+
* OAuth authorization URL
|
|
47
|
+
*/
|
|
48
|
+
url: string;
|
|
49
|
+
/**
|
|
50
|
+
* Custom button text (overrides default)
|
|
51
|
+
*/
|
|
52
|
+
buttonText?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Loading state
|
|
55
|
+
*/
|
|
56
|
+
loading: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Disabled state
|
|
59
|
+
*/
|
|
60
|
+
disabled: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Full width mode
|
|
63
|
+
*/
|
|
64
|
+
fullWidth: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Custom icon SVG string (for custom providers)
|
|
67
|
+
*/
|
|
68
|
+
customIcon?: string;
|
|
69
|
+
/**
|
|
70
|
+
* Internal state for tracking redirect
|
|
71
|
+
*/
|
|
72
|
+
private redirecting;
|
|
73
|
+
static styles: import("lit").CSSResult;
|
|
74
|
+
private get config();
|
|
75
|
+
private get displayName();
|
|
76
|
+
private get displayText();
|
|
77
|
+
private handleClick;
|
|
78
|
+
private renderProviderIcon;
|
|
79
|
+
protected updated(changedProperties: Map<string, unknown>): void;
|
|
80
|
+
render(): TemplateResult<1>;
|
|
81
|
+
}
|
|
82
|
+
declare global {
|
|
83
|
+
interface HTMLElementTagNameMap {
|
|
84
|
+
'consent-oauth-button': ConsentOAuthButton;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=consent-oauth-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-oauth-button.d.ts","sourceRoot":"","sources":["../../src/components/consent-oauth-button.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAa,cAAc,EAAW,MAAM,KAAK,CAAC;AAIrE;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,WAAW,GACX,OAAO,GACP,QAAQ,GACR,SAAS,GACT,UAAU,GACV,QAAQ,CAAC;AA4Fb;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBACa,kBAAmB,SAAQ,UAAU;IAChD;;OAEG;IAEH,QAAQ,EAAE,aAAa,CAAY;IAEnC;;OAEG;IAEH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IAEH,GAAG,SAAM;IAET;;OAEG;IAEH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IAEH,OAAO,UAAS;IAEhB;;OAEG;IAEH,QAAQ,UAAS;IAEjB;;OAEG;IAEH,SAAS,UAAS;IAElB;;OAEG;IAEH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IAEH,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAgB,MAAM,0BAmEpB;IAEF,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,WAAW,GAGtB;IAED,OAAO,KAAK,WAAW,GAGtB;IAED,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,kBAAkB;cAiGP,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAUzD,MAAM;CAuBhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,sBAAsB,EAAE,kBAAkB,CAAC;KAC5C;CACF"}
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consent OAuth Button Web Component
|
|
3
|
+
*
|
|
4
|
+
* A styled button for OAuth provider authentication with provider branding.
|
|
5
|
+
* Supports common OAuth providers with built-in icons.
|
|
6
|
+
*
|
|
7
|
+
* @module components/consent-oauth-button
|
|
8
|
+
*/
|
|
9
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
10
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
11
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
12
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
13
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
14
|
+
};
|
|
15
|
+
import { LitElement, html, css, nothing } from 'lit';
|
|
16
|
+
import { customElement, property, state } from 'lit/decorators.js';
|
|
17
|
+
import { unsafeSVG } from 'lit/directives/unsafe-svg.js';
|
|
18
|
+
/**
|
|
19
|
+
* Sanitize SVG content to prevent XSS attacks.
|
|
20
|
+
* Removes script tags, event handlers, and dangerous attributes.
|
|
21
|
+
*
|
|
22
|
+
* @param svg - Raw SVG string
|
|
23
|
+
* @returns Sanitized SVG safe for rendering
|
|
24
|
+
*/
|
|
25
|
+
function sanitizeSvg(svg) {
|
|
26
|
+
if (!svg || typeof svg !== 'string')
|
|
27
|
+
return '';
|
|
28
|
+
// Remove script tags and their content
|
|
29
|
+
let sanitized = svg.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
|
|
30
|
+
// Remove event handlers (onclick, onerror, onload, etc.)
|
|
31
|
+
sanitized = sanitized.replace(/\s*on\w+\s*=\s*["'][^"']*["']/gi, '');
|
|
32
|
+
sanitized = sanitized.replace(/\s*on\w+\s*=\s*[^\s>]*/gi, '');
|
|
33
|
+
// Remove javascript: and data: URLs from href, src, xlink:href
|
|
34
|
+
sanitized = sanitized.replace(/(href|src|xlink:href)\s*=\s*["']?\s*javascript:[^"'>\s]*/gi, '$1=""');
|
|
35
|
+
sanitized = sanitized.replace(/(href|src|xlink:href)\s*=\s*["']?\s*data:[^"'>\s]*/gi, '$1=""');
|
|
36
|
+
// Remove base64 embedded content that might be executable
|
|
37
|
+
sanitized = sanitized.replace(/data:text\/html[^"'>\s]*/gi, '');
|
|
38
|
+
return sanitized;
|
|
39
|
+
}
|
|
40
|
+
const PROVIDER_CONFIGS = {
|
|
41
|
+
google: {
|
|
42
|
+
name: 'Google',
|
|
43
|
+
bgColor: '#ffffff',
|
|
44
|
+
textColor: '#374151',
|
|
45
|
+
borderColor: '#d1d5db',
|
|
46
|
+
hoverBgColor: '#f9fafb',
|
|
47
|
+
},
|
|
48
|
+
microsoft: {
|
|
49
|
+
name: 'Microsoft',
|
|
50
|
+
bgColor: '#2f2f2f',
|
|
51
|
+
textColor: '#ffffff',
|
|
52
|
+
borderColor: '#2f2f2f',
|
|
53
|
+
hoverBgColor: '#1f1f1f',
|
|
54
|
+
},
|
|
55
|
+
apple: {
|
|
56
|
+
name: 'Apple',
|
|
57
|
+
bgColor: '#000000',
|
|
58
|
+
textColor: '#ffffff',
|
|
59
|
+
borderColor: '#000000',
|
|
60
|
+
hoverBgColor: '#1a1a1a',
|
|
61
|
+
},
|
|
62
|
+
github: {
|
|
63
|
+
name: 'GitHub',
|
|
64
|
+
bgColor: '#24292f',
|
|
65
|
+
textColor: '#ffffff',
|
|
66
|
+
borderColor: '#24292f',
|
|
67
|
+
hoverBgColor: '#1b1f23',
|
|
68
|
+
},
|
|
69
|
+
twitter: {
|
|
70
|
+
name: 'Twitter',
|
|
71
|
+
bgColor: '#1da1f2',
|
|
72
|
+
textColor: '#ffffff',
|
|
73
|
+
borderColor: '#1da1f2',
|
|
74
|
+
hoverBgColor: '#0c8de4',
|
|
75
|
+
},
|
|
76
|
+
facebook: {
|
|
77
|
+
name: 'Facebook',
|
|
78
|
+
bgColor: '#1877f2',
|
|
79
|
+
textColor: '#ffffff',
|
|
80
|
+
borderColor: '#1877f2',
|
|
81
|
+
hoverBgColor: '#0b5ed7',
|
|
82
|
+
},
|
|
83
|
+
custom: {
|
|
84
|
+
name: 'Sign in',
|
|
85
|
+
bgColor: '#ffffff',
|
|
86
|
+
textColor: '#374151',
|
|
87
|
+
borderColor: '#d1d5db',
|
|
88
|
+
hoverBgColor: '#f9fafb',
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* ConsentOAuthButton - OAuth provider sign-in button
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```html
|
|
96
|
+
* <consent-oauth-button
|
|
97
|
+
* provider="google"
|
|
98
|
+
* url="/auth/google"
|
|
99
|
+
* ></consent-oauth-button>
|
|
100
|
+
*
|
|
101
|
+
* <consent-oauth-button
|
|
102
|
+
* provider="custom"
|
|
103
|
+
* provider-name="Acme Corp"
|
|
104
|
+
* url="/auth/acme"
|
|
105
|
+
* ></consent-oauth-button>
|
|
106
|
+
* ```
|
|
107
|
+
*
|
|
108
|
+
* @fires oauth-click - When button is clicked (includes provider and url in detail)
|
|
109
|
+
* @csspart button - The button element
|
|
110
|
+
* @csspart icon - The provider icon
|
|
111
|
+
* @csspart text - The button text
|
|
112
|
+
*/
|
|
113
|
+
let ConsentOAuthButton = class ConsentOAuthButton extends LitElement {
|
|
114
|
+
constructor() {
|
|
115
|
+
super(...arguments);
|
|
116
|
+
/**
|
|
117
|
+
* OAuth provider type
|
|
118
|
+
*/
|
|
119
|
+
this.provider = 'custom';
|
|
120
|
+
/**
|
|
121
|
+
* OAuth authorization URL
|
|
122
|
+
*/
|
|
123
|
+
this.url = '';
|
|
124
|
+
/**
|
|
125
|
+
* Loading state
|
|
126
|
+
*/
|
|
127
|
+
this.loading = false;
|
|
128
|
+
/**
|
|
129
|
+
* Disabled state
|
|
130
|
+
*/
|
|
131
|
+
this.disabled = false;
|
|
132
|
+
/**
|
|
133
|
+
* Full width mode
|
|
134
|
+
*/
|
|
135
|
+
this.fullWidth = false;
|
|
136
|
+
/**
|
|
137
|
+
* Internal state for tracking redirect
|
|
138
|
+
*/
|
|
139
|
+
this.redirecting = false;
|
|
140
|
+
}
|
|
141
|
+
get config() {
|
|
142
|
+
return PROVIDER_CONFIGS[this.provider] || PROVIDER_CONFIGS.custom;
|
|
143
|
+
}
|
|
144
|
+
get displayName() {
|
|
145
|
+
if (this.providerName)
|
|
146
|
+
return this.providerName;
|
|
147
|
+
return this.config.name;
|
|
148
|
+
}
|
|
149
|
+
get displayText() {
|
|
150
|
+
if (this.buttonText)
|
|
151
|
+
return this.buttonText;
|
|
152
|
+
return `Continue with ${this.displayName}`;
|
|
153
|
+
}
|
|
154
|
+
handleClick() {
|
|
155
|
+
if (this.disabled || this.loading || this.redirecting)
|
|
156
|
+
return;
|
|
157
|
+
if (this.url) {
|
|
158
|
+
this.redirecting = true;
|
|
159
|
+
window.location.href = this.url;
|
|
160
|
+
}
|
|
161
|
+
// Dispatch custom event with provider details (named 'oauth-click' to avoid
|
|
162
|
+
// collision with native 'click' event which already bubbles through shadow DOM)
|
|
163
|
+
this.dispatchEvent(new CustomEvent('oauth-click', {
|
|
164
|
+
detail: { provider: this.provider, url: this.url },
|
|
165
|
+
bubbles: true,
|
|
166
|
+
composed: true,
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
renderProviderIcon() {
|
|
170
|
+
if (this.customIcon) {
|
|
171
|
+
// Sanitize custom SVG to prevent XSS attacks
|
|
172
|
+
const sanitized = sanitizeSvg(this.customIcon);
|
|
173
|
+
return html `<div class="icon">${unsafeSVG(sanitized)}</div>`;
|
|
174
|
+
}
|
|
175
|
+
switch (this.provider) {
|
|
176
|
+
case 'google':
|
|
177
|
+
return html `
|
|
178
|
+
<div class="icon">
|
|
179
|
+
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
180
|
+
<path
|
|
181
|
+
fill="#4285F4"
|
|
182
|
+
d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"
|
|
183
|
+
/>
|
|
184
|
+
<path
|
|
185
|
+
fill="#34A853"
|
|
186
|
+
d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
|
|
187
|
+
/>
|
|
188
|
+
<path
|
|
189
|
+
fill="#FBBC05"
|
|
190
|
+
d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"
|
|
191
|
+
/>
|
|
192
|
+
<path
|
|
193
|
+
fill="#EA4335"
|
|
194
|
+
d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
|
|
195
|
+
/>
|
|
196
|
+
</svg>
|
|
197
|
+
</div>
|
|
198
|
+
`;
|
|
199
|
+
case 'microsoft':
|
|
200
|
+
return html `
|
|
201
|
+
<div class="icon">
|
|
202
|
+
<svg viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
|
|
203
|
+
<rect x="1" y="1" width="9" height="9" fill="#f25022" />
|
|
204
|
+
<rect x="1" y="11" width="9" height="9" fill="#00a4ef" />
|
|
205
|
+
<rect x="11" y="1" width="9" height="9" fill="#7fba00" />
|
|
206
|
+
<rect x="11" y="11" width="9" height="9" fill="#ffb900" />
|
|
207
|
+
</svg>
|
|
208
|
+
</div>
|
|
209
|
+
`;
|
|
210
|
+
case 'apple':
|
|
211
|
+
return html `
|
|
212
|
+
<div class="icon">
|
|
213
|
+
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
214
|
+
<path
|
|
215
|
+
fill="currentColor"
|
|
216
|
+
d="M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z"
|
|
217
|
+
/>
|
|
218
|
+
</svg>
|
|
219
|
+
</div>
|
|
220
|
+
`;
|
|
221
|
+
case 'github':
|
|
222
|
+
return html `
|
|
223
|
+
<div class="icon">
|
|
224
|
+
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
225
|
+
<path
|
|
226
|
+
fill="currentColor"
|
|
227
|
+
d="M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.604-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.464-1.11-1.464-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0112 6.836c.85.004 1.705.114 2.504.336 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z"
|
|
228
|
+
/>
|
|
229
|
+
</svg>
|
|
230
|
+
</div>
|
|
231
|
+
`;
|
|
232
|
+
case 'twitter':
|
|
233
|
+
return html `
|
|
234
|
+
<div class="icon">
|
|
235
|
+
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
236
|
+
<path
|
|
237
|
+
fill="currentColor"
|
|
238
|
+
d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"
|
|
239
|
+
/>
|
|
240
|
+
</svg>
|
|
241
|
+
</div>
|
|
242
|
+
`;
|
|
243
|
+
case 'facebook':
|
|
244
|
+
return html `
|
|
245
|
+
<div class="icon">
|
|
246
|
+
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
247
|
+
<path
|
|
248
|
+
fill="currentColor"
|
|
249
|
+
d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"
|
|
250
|
+
/>
|
|
251
|
+
</svg>
|
|
252
|
+
</div>
|
|
253
|
+
`;
|
|
254
|
+
default:
|
|
255
|
+
return nothing;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
updated(changedProperties) {
|
|
259
|
+
if (changedProperties.has('provider')) {
|
|
260
|
+
const config = this.config;
|
|
261
|
+
this.style.setProperty('--button-bg', config.bgColor);
|
|
262
|
+
this.style.setProperty('--button-text', config.textColor);
|
|
263
|
+
this.style.setProperty('--button-border', config.borderColor);
|
|
264
|
+
this.style.setProperty('--button-hover-bg', config.hoverBgColor);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
render() {
|
|
268
|
+
const isLoading = this.loading || this.redirecting;
|
|
269
|
+
return html `
|
|
270
|
+
<button
|
|
271
|
+
part="button"
|
|
272
|
+
type="button"
|
|
273
|
+
?disabled=${this.disabled || isLoading}
|
|
274
|
+
@click=${this.handleClick}
|
|
275
|
+
style="
|
|
276
|
+
background-color: var(--button-bg, ${this.config.bgColor});
|
|
277
|
+
color: var(--button-text, ${this.config.textColor});
|
|
278
|
+
border: 1px solid var(--button-border, ${this.config.borderColor});
|
|
279
|
+
"
|
|
280
|
+
aria-busy=${isLoading}
|
|
281
|
+
>
|
|
282
|
+
${isLoading
|
|
283
|
+
? html `<span class="spinner"></span>`
|
|
284
|
+
: this.renderProviderIcon()}
|
|
285
|
+
<span class="text" part="text">${this.displayText}</span>
|
|
286
|
+
</button>
|
|
287
|
+
`;
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
ConsentOAuthButton.styles = css `
|
|
291
|
+
:host {
|
|
292
|
+
display: inline-block;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
:host([full-width]) {
|
|
296
|
+
display: block;
|
|
297
|
+
width: 100%;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
button {
|
|
301
|
+
width: 100%;
|
|
302
|
+
padding: 0.75rem 1rem;
|
|
303
|
+
height: 2.75rem;
|
|
304
|
+
border-radius: 0.5rem;
|
|
305
|
+
font-size: 0.875rem;
|
|
306
|
+
font-weight: 500;
|
|
307
|
+
font-family: inherit;
|
|
308
|
+
cursor: pointer;
|
|
309
|
+
transition: background-color 0.15s ease, opacity 0.15s ease;
|
|
310
|
+
display: inline-flex;
|
|
311
|
+
align-items: center;
|
|
312
|
+
justify-content: center;
|
|
313
|
+
gap: 0.75rem;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
button:disabled {
|
|
317
|
+
opacity: 0.5;
|
|
318
|
+
cursor: not-allowed;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
button:focus-visible {
|
|
322
|
+
outline: 2px solid #2563eb;
|
|
323
|
+
outline-offset: 2px;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
.icon {
|
|
327
|
+
width: 1.125rem;
|
|
328
|
+
height: 1.125rem;
|
|
329
|
+
flex-shrink: 0;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
.icon svg {
|
|
333
|
+
width: 100%;
|
|
334
|
+
height: 100%;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/* Loading spinner */
|
|
338
|
+
.spinner {
|
|
339
|
+
width: 1rem;
|
|
340
|
+
height: 1rem;
|
|
341
|
+
border: 2px solid currentColor;
|
|
342
|
+
border-top-color: transparent;
|
|
343
|
+
border-radius: 50%;
|
|
344
|
+
animation: spin 0.8s linear infinite;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
@keyframes spin {
|
|
348
|
+
to {
|
|
349
|
+
transform: rotate(360deg);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
.text {
|
|
354
|
+
flex: 1;
|
|
355
|
+
text-align: center;
|
|
356
|
+
}
|
|
357
|
+
`;
|
|
358
|
+
__decorate([
|
|
359
|
+
property({ type: String })
|
|
360
|
+
], ConsentOAuthButton.prototype, "provider", void 0);
|
|
361
|
+
__decorate([
|
|
362
|
+
property({ type: String, attribute: 'provider-name' })
|
|
363
|
+
], ConsentOAuthButton.prototype, "providerName", void 0);
|
|
364
|
+
__decorate([
|
|
365
|
+
property({ type: String })
|
|
366
|
+
], ConsentOAuthButton.prototype, "url", void 0);
|
|
367
|
+
__decorate([
|
|
368
|
+
property({ type: String, attribute: 'button-text' })
|
|
369
|
+
], ConsentOAuthButton.prototype, "buttonText", void 0);
|
|
370
|
+
__decorate([
|
|
371
|
+
property({ type: Boolean, reflect: true })
|
|
372
|
+
], ConsentOAuthButton.prototype, "loading", void 0);
|
|
373
|
+
__decorate([
|
|
374
|
+
property({ type: Boolean, reflect: true })
|
|
375
|
+
], ConsentOAuthButton.prototype, "disabled", void 0);
|
|
376
|
+
__decorate([
|
|
377
|
+
property({ type: Boolean, attribute: 'full-width' })
|
|
378
|
+
], ConsentOAuthButton.prototype, "fullWidth", void 0);
|
|
379
|
+
__decorate([
|
|
380
|
+
property({ type: String, attribute: 'custom-icon' })
|
|
381
|
+
], ConsentOAuthButton.prototype, "customIcon", void 0);
|
|
382
|
+
__decorate([
|
|
383
|
+
state()
|
|
384
|
+
], ConsentOAuthButton.prototype, "redirecting", void 0);
|
|
385
|
+
ConsentOAuthButton = __decorate([
|
|
386
|
+
customElement('consent-oauth-button')
|
|
387
|
+
], ConsentOAuthButton);
|
|
388
|
+
export { ConsentOAuthButton };
|
|
389
|
+
//# sourceMappingURL=consent-oauth-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-oauth-button.js","sourceRoot":"","sources":["../../src/components/consent-oauth-button.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consent OTP Input Web Component
|
|
3
|
+
*
|
|
4
|
+
* Individual digit input boxes for one-time password entry.
|
|
5
|
+
* Supports auto-focus, paste handling, and keyboard navigation.
|
|
6
|
+
* Implements Form Associated Custom Elements for proper form participation.
|
|
7
|
+
*
|
|
8
|
+
* @module components/consent-otp-input
|
|
9
|
+
*/
|
|
10
|
+
import { LitElement, TemplateResult } from 'lit';
|
|
11
|
+
/**
|
|
12
|
+
* ConsentOTPInput - OTP digit input boxes
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```html
|
|
16
|
+
* <consent-otp-input
|
|
17
|
+
* length="6"
|
|
18
|
+
* name="otp"
|
|
19
|
+
* ></consent-otp-input>
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* @fires input - Fired on each digit entry
|
|
23
|
+
* @fires complete - Fired when all digits are entered
|
|
24
|
+
* @fires change - Fired when value changes
|
|
25
|
+
* @csspart container - The container for all digit boxes
|
|
26
|
+
* @csspart input - Individual digit input
|
|
27
|
+
* @cssprop --consent-primary - Primary brand color for focus state
|
|
28
|
+
*/
|
|
29
|
+
export declare class ConsentOTPInput extends LitElement {
|
|
30
|
+
static formAssociated: boolean;
|
|
31
|
+
private internals;
|
|
32
|
+
constructor();
|
|
33
|
+
/**
|
|
34
|
+
* Number of OTP digits
|
|
35
|
+
*/
|
|
36
|
+
length: number;
|
|
37
|
+
/**
|
|
38
|
+
* Form field name
|
|
39
|
+
*/
|
|
40
|
+
name: string;
|
|
41
|
+
/**
|
|
42
|
+
* Current OTP value
|
|
43
|
+
*/
|
|
44
|
+
value: string;
|
|
45
|
+
/**
|
|
46
|
+
* Disabled state
|
|
47
|
+
*/
|
|
48
|
+
disabled: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Error state
|
|
51
|
+
*/
|
|
52
|
+
error: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Auto-focus first input on mount
|
|
55
|
+
*/
|
|
56
|
+
autoFocus: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Input type (text or number)
|
|
59
|
+
*/
|
|
60
|
+
inputType: 'text' | 'number';
|
|
61
|
+
/**
|
|
62
|
+
* Internal digit values
|
|
63
|
+
*/
|
|
64
|
+
private digits;
|
|
65
|
+
private inputs;
|
|
66
|
+
static styles: import("lit").CSSResult;
|
|
67
|
+
connectedCallback(): void;
|
|
68
|
+
private initializeDigits;
|
|
69
|
+
protected firstUpdated(): void;
|
|
70
|
+
protected updated(changedProperties: Map<string, unknown>): void;
|
|
71
|
+
private getFullValue;
|
|
72
|
+
private handleInput;
|
|
73
|
+
private handleKeyDown;
|
|
74
|
+
private handlePaste;
|
|
75
|
+
private handleFocus;
|
|
76
|
+
/**
|
|
77
|
+
* Focus the first empty input or the last input
|
|
78
|
+
*/
|
|
79
|
+
focus(): void;
|
|
80
|
+
/**
|
|
81
|
+
* Clear all digits
|
|
82
|
+
*/
|
|
83
|
+
clear(): void;
|
|
84
|
+
private renderDigitInput;
|
|
85
|
+
render(): TemplateResult<1>;
|
|
86
|
+
}
|
|
87
|
+
declare global {
|
|
88
|
+
interface HTMLElementTagNameMap {
|
|
89
|
+
'consent-otp-input': ConsentOTPInput;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=consent-otp-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-otp-input.d.ts","sourceRoot":"","sources":["../../src/components/consent-otp-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAa,cAAc,EAAE,MAAM,KAAK,CAAC;AAG5D;;;;;;;;;;;;;;;;;GAiBG;AACH,qBACa,eAAgB,SAAQ,UAAU;IAE7C,MAAM,CAAC,cAAc,UAAQ;IAE7B,OAAO,CAAC,SAAS,CAAmB;;IAOpC;;OAEG;IAEH,MAAM,SAAK;IAEX;;OAEG;IAEH,IAAI,SAAS;IAEb;;OAEG;IAEH,KAAK,SAAM;IAEX;;OAEG;IAEH,QAAQ,UAAS;IAEjB;;OAEG;IAEH,KAAK,UAAS;IAEd;;OAEG;IAEH,SAAS,UAAS;IAElB;;OAEG;IAEH,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAU;IAEtC;;OAEG;IAEH,OAAO,CAAC,MAAM,CAAgB;IAG9B,OAAO,CAAC,MAAM,CAAgC;IAE9C,OAAgB,MAAM,0BA+EpB;IAEO,iBAAiB;IAK1B,OAAO,CAAC,gBAAgB;cAYL,YAAY;cAMZ,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAclE,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,WAAW;IAyDnB,OAAO,CAAC,aAAa;IAuCrB,OAAO,CAAC,WAAW;IAwCnB,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACa,KAAK;IAMrB;;OAEG;IACI,KAAK;IAMZ,OAAO,CAAC,gBAAgB;IAwBf,MAAM;CAOhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,mBAAmB,EAAE,eAAe,CAAC;KACtC;CACF"}
|