@atlasauth/embed 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.
Files changed (59) hide show
  1. package/dist/appearance.d.ts +293 -0
  2. package/dist/appearance.js +206 -0
  3. package/dist/appearance.js.map +1 -0
  4. package/dist/client.d.ts +12 -0
  5. package/dist/client.js +49 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/config.d.ts +27 -0
  8. package/dist/config.js +61 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/element.d.ts +23 -0
  11. package/dist/element.js +51 -0
  12. package/dist/element.js.map +1 -0
  13. package/dist/embed.js +361 -0
  14. package/dist/icons.d.ts +17 -0
  15. package/dist/icons.js +53 -0
  16. package/dist/icons.js.map +1 -0
  17. package/dist/index.d.ts +19 -0
  18. package/dist/index.js +39 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/mount.d.ts +7 -0
  21. package/dist/mount.js +33 -0
  22. package/dist/mount.js.map +1 -0
  23. package/dist/redirect.d.ts +17 -0
  24. package/dist/redirect.js +51 -0
  25. package/dist/redirect.js.map +1 -0
  26. package/dist/standalone.d.ts +25 -0
  27. package/dist/standalone.js +34 -0
  28. package/dist/standalone.js.map +1 -0
  29. package/dist/styles.d.ts +17 -0
  30. package/dist/styles.js +389 -0
  31. package/dist/styles.js.map +1 -0
  32. package/dist/widget/captcha.d.ts +21 -0
  33. package/dist/widget/captcha.js +197 -0
  34. package/dist/widget/captcha.js.map +1 -0
  35. package/dist/widget/constants.d.ts +16 -0
  36. package/dist/widget/constants.js +14 -0
  37. package/dist/widget/constants.js.map +1 -0
  38. package/dist/widget/dom.d.ts +18 -0
  39. package/dist/widget/dom.js +71 -0
  40. package/dist/widget/dom.js.map +1 -0
  41. package/dist/widget/flow.d.ts +41 -0
  42. package/dist/widget/flow.js +424 -0
  43. package/dist/widget/flow.js.map +1 -0
  44. package/dist/widget/forms.d.ts +35 -0
  45. package/dist/widget/forms.js +499 -0
  46. package/dist/widget/forms.js.map +1 -0
  47. package/dist/widget/passkey.d.ts +18 -0
  48. package/dist/widget/passkey.js +88 -0
  49. package/dist/widget/passkey.js.map +1 -0
  50. package/dist/widget/render.d.ts +21 -0
  51. package/dist/widget/render.js +210 -0
  52. package/dist/widget/render.js.map +1 -0
  53. package/dist/widget/social.d.ts +44 -0
  54. package/dist/widget/social.js +331 -0
  55. package/dist/widget/social.js.map +1 -0
  56. package/dist/widget.d.ts +124 -0
  57. package/dist/widget.js +182 -0
  58. package/dist/widget.js.map +1 -0
  59. package/package.json +27 -0
@@ -0,0 +1,21 @@
1
+ import { type FieldError } from '@atlasauth/js';
2
+ import type { AtlasWidget } from '../widget';
3
+ export declare function renderNote(w: AtlasWidget, text: string): void;
4
+ /**
5
+ * A proper loading state — shown while /v1/appearance resolves, while an
6
+ * OAuth/hosted ticket is exchanged on redirect-back, and (via `busy`) while a
7
+ * form submits. Replaces the old bare "Loading…" text so the widget never
8
+ * flashes blank. The indicator style is the tenant's `interaction.loading`
9
+ * (spinner | skeleton | dots | bar); `role="status"` announces it to AT.
10
+ */
11
+ export declare function renderLoading(w: AtlasWidget): void;
12
+ export declare function renderErrors(w: AtlasWidget, errors: readonly FieldError[]): void;
13
+ export declare function render(w: AtlasWidget): void;
14
+ /**
15
+ * The continuation line under the title on a non-start step: what to do, where
16
+ * the code went, and (where it makes sense) a way back to the email panel — so
17
+ * the step reads as the SAME panel spawning the next field, not a new screen.
18
+ */
19
+ export declare function renderStepContext(w: AtlasWidget, stepKind: string): HTMLElement | null;
20
+ /** Back to the start — a fresh identifier panel (the "use a different email" action). */
21
+ export declare function restart(w: AtlasWidget): void;
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderNote = renderNote;
4
+ exports.renderLoading = renderLoading;
5
+ exports.renderErrors = renderErrors;
6
+ exports.render = render;
7
+ exports.renderStepContext = renderStepContext;
8
+ exports.restart = restart;
9
+ const js_1 = require("@atlasauth/js");
10
+ const constants_1 = require("./constants");
11
+ const dom_1 = require("./dom");
12
+ const forms_1 = require("./forms");
13
+ const social_1 = require("./social");
14
+ // ---- rendering -----------------------------------------------------------
15
+ function renderNote(w, text) {
16
+ w.root.textContent = '';
17
+ const card = (0, dom_1.el)(w, 'div', (0, dom_1.cls)(w, 'card', 'atlas-embed-card'));
18
+ card.appendChild((0, dom_1.el)(w, 'p', 'atlas-embed-note', text));
19
+ w.root.appendChild(card);
20
+ }
21
+ /**
22
+ * A proper loading state — shown while /v1/appearance resolves, while an
23
+ * OAuth/hosted ticket is exchanged on redirect-back, and (via `busy`) while a
24
+ * form submits. Replaces the old bare "Loading…" text so the widget never
25
+ * flashes blank. The indicator style is the tenant's `interaction.loading`
26
+ * (spinner | skeleton | dots | bar); `role="status"` announces it to AT.
27
+ */
28
+ function renderLoading(w) {
29
+ w.root.textContent = '';
30
+ const card = (0, dom_1.el)(w, 'div', (0, dom_1.cls)(w, 'card', 'atlas-embed-card'));
31
+ const style = w.interaction.loading;
32
+ const box = (0, dom_1.el)(w, 'div', 'atlas-embed-loading');
33
+ box.setAttribute('data-loading', style);
34
+ box.setAttribute('role', 'status');
35
+ box.setAttribute('aria-label', 'Loading');
36
+ if (style === 'skeleton') {
37
+ for (const kind of ['title', 'sub', 'input', 'input', 'button']) {
38
+ box.appendChild((0, dom_1.el)(w, 'div', `atlas-embed-skel atlas-embed-skel-${kind}`));
39
+ }
40
+ }
41
+ else if (style === 'dots') {
42
+ for (let i = 0; i < 3; i += 1)
43
+ box.appendChild((0, dom_1.el)(w, 'span', 'atlas-embed-dot'));
44
+ }
45
+ else if (style === 'bar') {
46
+ box.appendChild((0, dom_1.el)(w, 'span', 'atlas-embed-loadbar'));
47
+ }
48
+ else {
49
+ box.appendChild((0, dom_1.el)(w, 'span', 'atlas-embed-spinner'));
50
+ }
51
+ // A visually-hidden label so a screen reader announces progress for every style.
52
+ const sr = (0, dom_1.el)(w, 'span', 'atlas-embed-sr', 'Loading…');
53
+ box.appendChild(sr);
54
+ card.appendChild(box);
55
+ w.root.appendChild(card);
56
+ }
57
+ function renderErrors(w, errors) {
58
+ // Re-render then surface the errors on the current step.
59
+ w.state = { ...w.state, errors: [...errors] };
60
+ render(w);
61
+ }
62
+ function render(w) {
63
+ w.root.textContent = '';
64
+ const card = (0, dom_1.el)(w, 'div', (0, dom_1.cls)(w, 'card', 'atlas-embed-card'));
65
+ const logoUrl = w.appearance?.logoUrl ?? null;
66
+ if (logoUrl) {
67
+ const img = (0, dom_1.doc)(w).createElement('img');
68
+ img.className = 'atlas-embed-logo';
69
+ img.src = logoUrl;
70
+ img.alt = w.appearance?.applicationName ?? '';
71
+ card.appendChild(img);
72
+ }
73
+ // §5.4 the "forgot password" sub-flow takes over the whole panel until it
74
+ // completes or the user goes back to sign in.
75
+ if (w.resetFlow) {
76
+ const rk = `reset_${(0, js_1.resetStep)(w.resetFlow)}`;
77
+ card.setAttribute('data-step', rk);
78
+ if (rk !== w.lastStepKind)
79
+ card.setAttribute('data-enter', '');
80
+ w.lastStepKind = rk;
81
+ card.appendChild((0, forms_1.renderReset)(w));
82
+ if (w.appearance?.footer) {
83
+ card.appendChild((0, dom_1.el)(w, 'p', (0, dom_1.cls)(w, 'footer', 'atlas-embed-footer'), w.appearance.footer));
84
+ }
85
+ w.root.appendChild(card);
86
+ if (card.hasAttribute('data-enter')) {
87
+ const focusTarget = card.querySelector('[data-atlas-autofocus]');
88
+ if (focusTarget instanceof HTMLElement)
89
+ focusTarget.focus();
90
+ }
91
+ return;
92
+ }
93
+ const step = w.state.attempt
94
+ ? (0, js_1.nextStep)(w.state.attempt)
95
+ : { kind: 'collect_identifier' };
96
+ // Sign-up mode with no attempt yet: the create-account form — the tenant's
97
+ // configured fields + email + password — posted to /v1/client/sign_ups.
98
+ const isSignUpStart = w.mode === 'sign-up' && !w.state.attempt;
99
+ const atStart = isSignUpStart || step.kind === 'collect_identifier';
100
+ // Mark the card with the step so it can be styled + animate ONLY when the
101
+ // step actually changes (not on every error/busy re-render), so a code step
102
+ // spawns in once rather than flickering on each keystroke.
103
+ const stepKind = w.handlePrompt ? 'handle' : step.kind;
104
+ card.setAttribute('data-step', stepKind);
105
+ if (stepKind !== w.lastStepKind)
106
+ card.setAttribute('data-enter', '');
107
+ w.lastStepKind = stepKind;
108
+ const title = w.appearance?.headline ?? constants_1.COPY[w.mode].title;
109
+ card.appendChild((0, dom_1.el)(w, 'h1', (0, dom_1.cls)(w, 'title', 'atlas-embed-title'), title));
110
+ // At the start, the tenant's own subheadline. On a later step, a context line
111
+ // that ties it back to the email panel ("Enter the code we sent to …") plus a
112
+ // way back — so the code/password step reads as a continuation of the same
113
+ // panel, not a brand-new screen.
114
+ const context = atStart ? null : renderStepContext(w, step.kind);
115
+ if (context) {
116
+ card.appendChild(context);
117
+ }
118
+ else if (w.appearance?.subheadline) {
119
+ card.appendChild((0, dom_1.el)(w, 'p', (0, dom_1.cls)(w, 'subtitle', 'atlas-embed-subtitle'), w.appearance.subheadline));
120
+ }
121
+ // A one-time confirmation banner (e.g. after a force-login password reset).
122
+ if (w.flash)
123
+ card.appendChild((0, dom_1.el)(w, 'div', 'atlas-embed-flash', w.flash));
124
+ // Handle-first provider (Bluesky): a dedicated sub-screen collecting the
125
+ // handle, in place of the normal identifier form + social buttons.
126
+ if (w.handlePrompt) {
127
+ card.appendChild((0, social_1.renderHandlePrompt)(w, w.handlePrompt));
128
+ if (w.appearance?.footer) {
129
+ card.appendChild((0, dom_1.el)(w, 'p', (0, dom_1.cls)(w, 'footer', 'atlas-embed-footer'), w.appearance.footer));
130
+ }
131
+ w.root.appendChild(card);
132
+ return;
133
+ }
134
+ // Social buttons (and "Sign in with Atlas") only make sense at the very start.
135
+ if (atStart && ((0, social_1.socialProviders)(w).length > 0 || w.signInWithAtlas.enabled)) {
136
+ card.appendChild((0, social_1.renderSocial)(w));
137
+ card.appendChild((0, dom_1.el)(w, 'div', (0, dom_1.cls)(w, 'divider', 'atlas-embed-divider'), 'or'));
138
+ }
139
+ card.appendChild(isSignUpStart ? (0, forms_1.renderSignUpForm)(w) : (0, forms_1.renderForm)(w, step.kind));
140
+ // §5.5 passkey sign-in: a usernameless/discoverable-credential button at the
141
+ // start of a sign-in, shown only when the instance offers passkeys and the
142
+ // browser supports WebAuthn. The server-side finish sets the session cookie
143
+ // directly (no ticket exchange).
144
+ if (atStart && w.mode === 'sign-in' && w.passkeyEnabled && (0, js_1.passkeysSupported)()) {
145
+ card.appendChild((0, social_1.renderPasskeyButton)(w));
146
+ }
147
+ if (w.appearance?.footer) {
148
+ card.appendChild((0, dom_1.el)(w, 'p', (0, dom_1.cls)(w, 'footer', 'atlas-embed-footer'), w.appearance.footer));
149
+ }
150
+ w.root.appendChild(card);
151
+ // Focus the first code box (or single field) once it is in the DOM, so a code
152
+ // step is ready to type into — but only when the step just changed, never on a
153
+ // busy/error re-render (which would steal focus mid-typing).
154
+ if (card.hasAttribute('data-enter')) {
155
+ const focusTarget = card.querySelector('[data-atlas-autofocus]');
156
+ if (focusTarget instanceof HTMLElement)
157
+ focusTarget.focus();
158
+ }
159
+ }
160
+ /**
161
+ * The continuation line under the title on a non-start step: what to do, where
162
+ * the code went, and (where it makes sense) a way back to the email panel — so
163
+ * the step reads as the SAME panel spawning the next field, not a new screen.
164
+ */
165
+ function renderStepContext(w, stepKind) {
166
+ const email = w.enteredIdentifier;
167
+ let text = null;
168
+ let back = false;
169
+ switch (stepKind) {
170
+ case 'collect_email_code':
171
+ text = email ? `Enter the code we sent to ${email}` : 'Enter the code we sent to your email';
172
+ back = true;
173
+ break;
174
+ case 'collect_first_factor':
175
+ text = email ? `Enter the password for ${email}` : 'Enter your password';
176
+ back = true;
177
+ break;
178
+ case 'collect_second_factor':
179
+ text = w.backupCodeMode
180
+ ? 'Enter one of your backup codes'
181
+ : 'Enter the code from your authenticator app';
182
+ break;
183
+ case 'collect_new_password':
184
+ text = 'Choose a new password';
185
+ break;
186
+ case 'enroll_second_factor':
187
+ text = 'Enter two codes from your authenticator app to finish setup';
188
+ break;
189
+ default:
190
+ return null;
191
+ }
192
+ const wrap = (0, dom_1.el)(w, 'div', 'atlas-embed-step-context');
193
+ wrap.appendChild((0, dom_1.el)(w, 'p', (0, dom_1.cls)(w, 'subtitle', 'atlas-embed-subtitle'), text));
194
+ if (back) {
195
+ const button = (0, dom_1.el)(w, 'button', 'atlas-embed-step-back', 'Use a different email');
196
+ button.type = 'button';
197
+ button.addEventListener('click', () => restart(w));
198
+ wrap.appendChild(button);
199
+ }
200
+ return wrap;
201
+ }
202
+ /** Back to the start — a fresh identifier panel (the "use a different email" action). */
203
+ function restart(w) {
204
+ w.state = js_1.initialFlow;
205
+ w.backupCodeMode = false;
206
+ w.handlePrompt = null;
207
+ w.enteredIdentifier = null;
208
+ render(w);
209
+ }
210
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/widget/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { AtlasWidget } from '../widget';
2
+ /** §5.5 the "Sign in with a passkey" button on the identifier screen. */
3
+ export declare function renderPasskeyButton(w: AtlasWidget): HTMLElement;
4
+ /**
5
+ * All providers to render as buttons: the redirect providers PLUS any native
6
+ * provider (e.g. Google GSI) not already among them. A native-only provider —
7
+ * one configured with a client_id but absent from `strategies.oauthProviders`
8
+ * — must still get a button, or an instance whose only social login is Google
9
+ * would render none at all.
10
+ */
11
+ export declare function socialProviders(w: AtlasWidget): string[];
12
+ /**
13
+ * The "Sign in with Atlas" button — starts the preset OIDC connection's SSO
14
+ * flow. It is a first-class social login: it lives in the provider grid and
15
+ * takes the same layout/size/variant as every other provider button (a full
16
+ * bar in `block`, a tile in `grid`, icon-only in `icon`), so it reads as one
17
+ * of the grid, not a banner bolted above it.
18
+ */
19
+ export declare function atlasButton(w: AtlasWidget, connectionId: string): HTMLElement;
20
+ export declare function renderSocial(w: AtlasWidget): HTMLElement;
21
+ /**
22
+ * Wrap a carousel scroll-row with prev/next arrow buttons. The arrows page the
23
+ * row left/right, hide themselves entirely when everything already fits, and
24
+ * disable at each end — so a long row reads as a real, clickable carousel
25
+ * rather than a bare overflow the user might not notice they can scroll. State
26
+ * is recomputed on scroll and on resize (via ResizeObserver when available).
27
+ */
28
+ export declare function carouselShell(w: AtlasWidget, row: HTMLElement): HTMLElement;
29
+ /** The uniform, always-styled visual button (no click behaviour of its own). */
30
+ export declare function styledSocialButton(w: AtlasWidget, provider: string, tag?: 'button' | 'div'): HTMLElement;
31
+ export declare function redirectButton(w: AtlasWidget, provider: string): HTMLElement;
32
+ /**
33
+ * The handle-first sub-screen (Bluesky). AT-Proto resolves the user's PDS from
34
+ * their handle, so we collect it here, then hand it to startOAuth. A Back link
35
+ * returns to the normal start screen.
36
+ */
37
+ export declare function renderHandlePrompt(w: AtlasWidget, provider: string): HTMLElement;
38
+ /**
39
+ * Our uniform Google button, backed by Google's invisible real button. A DIV
40
+ * (role=button), not a <button>, so Google's own button can be nested legally.
41
+ * If GSI can't load, the same element falls back to the redirect flow so it is
42
+ * never a dead button.
43
+ */
44
+ export declare function googleOverlayButton(w: AtlasWidget, clientId: string): HTMLElement;
@@ -0,0 +1,331 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderPasskeyButton = renderPasskeyButton;
4
+ exports.socialProviders = socialProviders;
5
+ exports.atlasButton = atlasButton;
6
+ exports.renderSocial = renderSocial;
7
+ exports.carouselShell = carouselShell;
8
+ exports.styledSocialButton = styledSocialButton;
9
+ exports.redirectButton = redirectButton;
10
+ exports.renderHandlePrompt = renderHandlePrompt;
11
+ exports.googleOverlayButton = googleOverlayButton;
12
+ const js_1 = require("@atlasauth/js");
13
+ const appearance_1 = require("../appearance");
14
+ const icons_1 = require("../icons");
15
+ const constants_1 = require("./constants");
16
+ const dom_1 = require("./dom");
17
+ const render_1 = require("./render");
18
+ const flow_1 = require("./flow");
19
+ const passkey_1 = require("./passkey");
20
+ /** §5.5 the "Sign in with a passkey" button on the identifier screen. */
21
+ function renderPasskeyButton(w) {
22
+ const btn = (0, dom_1.el)(w, 'button', (0, dom_1.cls)(w, 'socialButton', 'atlas-embed-social-button'), 'Sign in with a passkey');
23
+ btn.type = 'button';
24
+ btn.setAttribute('data-atlas-passkey', '');
25
+ btn.disabled = w.busy;
26
+ btn.addEventListener('click', () => {
27
+ void (0, passkey_1.passkeySignIn)(w);
28
+ });
29
+ return btn;
30
+ }
31
+ /**
32
+ * All providers to render as buttons: the redirect providers PLUS any native
33
+ * provider (e.g. Google GSI) not already among them. A native-only provider —
34
+ * one configured with a client_id but absent from `strategies.oauthProviders`
35
+ * — must still get a button, or an instance whose only social login is Google
36
+ * would render none at all.
37
+ */
38
+ function socialProviders(w) {
39
+ const ids = [...w.providers];
40
+ for (const native of w.nativeProviders) {
41
+ if (!ids.includes(native.provider))
42
+ ids.push(native.provider);
43
+ }
44
+ return ids;
45
+ }
46
+ // The Atlas mark — a trusted, static, first-party SVG (never tenant input).
47
+ const ATLAS_MARK = '<svg viewBox="0 0 24 24" width="18" height="18" aria-hidden="true" fill="none">' +
48
+ '<path d="M12 2 3 21h4l5-11 5 11h4L12 2z" fill="currentColor"/>' +
49
+ '</svg>';
50
+ /**
51
+ * The "Sign in with Atlas" button — starts the preset OIDC connection's SSO
52
+ * flow. It is a first-class social login: it lives in the provider grid and
53
+ * takes the same layout/size/variant as every other provider button (a full
54
+ * bar in `block`, a tile in `grid`, icon-only in `icon`), so it reads as one
55
+ * of the grid, not a banner bolted above it.
56
+ */
57
+ function atlasButton(w, connectionId) {
58
+ const { variant, labels } = w.social;
59
+ // Mirror styledSocialButton's copy rules: "Continue with Atlas" for the bar,
60
+ // "Atlas" for the tile/compact forms, with a per-provider label override.
61
+ const text = labels.atlas ?? (variant === 'block' ? 'Continue with Atlas' : 'Atlas');
62
+ const button = (0, dom_1.el)(w, 'button', (0, dom_1.cls)(w, 'socialButton', 'atlas-embed-social-button'));
63
+ button.type = 'button';
64
+ button.setAttribute('data-atlas-provider', 'atlas');
65
+ button.setAttribute('data-variant', variant);
66
+ const icon = (0, dom_1.doc)(w).createElement('span');
67
+ icon.className = 'atlas-embed-social-icon';
68
+ icon.innerHTML = ATLAS_MARK;
69
+ button.appendChild(icon);
70
+ if (variant === 'icon') {
71
+ // Icon-only: the name lives in the tooltip and the a11y label instead.
72
+ button.setAttribute('aria-label', 'Continue with Atlas');
73
+ button.setAttribute('title', 'Atlas');
74
+ }
75
+ else {
76
+ const label = (0, dom_1.doc)(w).createElement('span');
77
+ label.className = 'atlas-embed-social-label';
78
+ label.textContent = text;
79
+ button.appendChild(label);
80
+ }
81
+ // GSI-style: open the Atlas sign-in in a popup (with a redirect fallback when
82
+ // popups are blocked) so the host page never loses its own state.
83
+ button.addEventListener('click', () => {
84
+ void (0, flow_1.startSso)(w, connectionId, { popup: true });
85
+ });
86
+ return button;
87
+ }
88
+ function renderSocial(w) {
89
+ const providers = socialProviders(w);
90
+ const wrap = (0, dom_1.el)(w, 'div', 'atlas-embed-social');
91
+ // The layout/size/variant drive the CSS: list vs grid vs a scroll-snap
92
+ // carousel, button scale, and whether each button is a full bar or icon-only.
93
+ wrap.setAttribute('data-layout', w.social.layout);
94
+ wrap.setAttribute('data-size', w.social.size);
95
+ wrap.setAttribute('data-variant', w.social.variant);
96
+ // "Sign in with Atlas" leads the provider grid as its first tile — a social
97
+ // login among the rest, taking the same layout/variant (not a banner above).
98
+ if (w.signInWithAtlas.enabled && w.signInWithAtlas.connection_id) {
99
+ wrap.appendChild(atlasButton(w, w.signInWithAtlas.connection_id));
100
+ }
101
+ for (const provider of providers) {
102
+ // A native provider (Google GSI) shows OUR uniform button with Google's
103
+ // real button invisibly overlaid — the user sees our design, the click
104
+ // drives the secretless id_token flow (no redirect, no Google styling).
105
+ // Every other provider uses the redirect button.
106
+ const native = w.nativeProviders.find((n) => n.provider === provider);
107
+ const button = provider === 'google' && native?.client_id
108
+ ? googleOverlayButton(w, native.client_id)
109
+ : redirectButton(w, provider);
110
+ // Guarantee the filter can find the provider even on the Google overlay.
111
+ if (!button.getAttribute('data-atlas-provider')) {
112
+ button.setAttribute('data-atlas-provider', provider);
113
+ }
114
+ wrap.appendChild(button);
115
+ }
116
+ // Carousel layout: wrap the scroll row in prev/next controls so a long row
117
+ // is obviously scrollable AND clickable, not just swipeable, with the arrows
118
+ // auto-hiding when everything already fits and disabling at each end.
119
+ const body = w.social.layout === 'carousel' ? carouselShell(w, wrap) : wrap;
120
+ // §customization: a search box to narrow a long provider list. `always`
121
+ // forces it; `auto` (default) shows it only past the threshold so a common
122
+ // handful stays button-only while a wall of 20 becomes filterable; `never`
123
+ // hides it. Pure client-side filter over the already-rendered buttons — it
124
+ // adds no request and touches no config, so it cannot expose a provider the
125
+ // instance has not enabled.
126
+ const showSearch = w.social.search === 'always' ||
127
+ (w.social.search === 'auto' && providers.length > appearance_1.SEARCH_AUTO_THRESHOLD);
128
+ if (!showSearch)
129
+ return body;
130
+ const field = (0, dom_1.el)(w, 'div', 'atlas-embed-social-field');
131
+ const input = (0, dom_1.doc)(w).createElement('input');
132
+ input.type = 'search';
133
+ input.className = 'atlas-embed-social-search';
134
+ input.setAttribute('placeholder', 'Search sign-in options…');
135
+ input.setAttribute('aria-label', 'Search sign-in options');
136
+ input.autocomplete = 'off';
137
+ const empty = (0, dom_1.el)(w, 'div', 'atlas-embed-social-empty');
138
+ empty.textContent = 'No matching sign-in options.';
139
+ empty.setAttribute('hidden', '');
140
+ const buttons = Array.from(wrap.children);
141
+ input.addEventListener('input', () => {
142
+ const q = input.value.trim().toLowerCase();
143
+ let visible = 0;
144
+ for (const b of buttons) {
145
+ const key = b.getAttribute('data-atlas-provider') ?? '';
146
+ // Match on both the display name ("GitHub") and the key ("github"), so
147
+ // typing either narrows correctly regardless of a label override.
148
+ const match = q === '' || (0, appearance_1.providerLabel)(key).toLowerCase().includes(q) || key.toLowerCase().includes(q);
149
+ b.toggleAttribute('hidden', !match);
150
+ if (match)
151
+ visible += 1;
152
+ }
153
+ empty.toggleAttribute('hidden', visible !== 0);
154
+ // Hiding buttons changes the scrollable width, so nudge the carousel to
155
+ // re-evaluate its arrows (a no-op for the non-carousel layouts).
156
+ wrap.dispatchEvent(new Event('scroll'));
157
+ });
158
+ field.appendChild(input);
159
+ field.appendChild(body);
160
+ field.appendChild(empty);
161
+ return field;
162
+ }
163
+ /**
164
+ * Wrap a carousel scroll-row with prev/next arrow buttons. The arrows page the
165
+ * row left/right, hide themselves entirely when everything already fits, and
166
+ * disable at each end — so a long row reads as a real, clickable carousel
167
+ * rather than a bare overflow the user might not notice they can scroll. State
168
+ * is recomputed on scroll and on resize (via ResizeObserver when available).
169
+ */
170
+ function carouselShell(w, row) {
171
+ const win = (0, dom_1.doc)(w).defaultView ?? (typeof window !== 'undefined' ? window : null);
172
+ const shell = (0, dom_1.el)(w, 'div', 'atlas-embed-carousel');
173
+ const nav = (dir) => {
174
+ const b = (0, dom_1.el)(w, 'button', 'atlas-embed-carousel-nav');
175
+ b.type = 'button';
176
+ b.setAttribute('data-dir', dir);
177
+ b.setAttribute('aria-label', dir === 'prev' ? 'Scroll to previous sign-in options' : 'Scroll to more sign-in options');
178
+ b.innerHTML = dir === 'prev' ? constants_1.CHEVRON_LEFT : constants_1.CHEVRON_RIGHT;
179
+ b.addEventListener('click', () => {
180
+ const amount = Math.max(row.clientWidth * 0.8, 140);
181
+ // Guarded: not every host (jsdom in tests) implements scrollBy.
182
+ if (typeof row.scrollBy === 'function') {
183
+ row.scrollBy({ left: (dir === 'prev' ? -1 : 1) * amount, behavior: 'smooth' });
184
+ }
185
+ });
186
+ return b;
187
+ };
188
+ const prev = nav('prev');
189
+ const next = nav('next');
190
+ const update = () => {
191
+ const max = row.scrollWidth - row.clientWidth;
192
+ const overflow = max > 2;
193
+ shell.setAttribute('data-overflow', overflow ? 'true' : 'false');
194
+ prev.disabled = !overflow || row.scrollLeft <= 1;
195
+ next.disabled = !overflow || row.scrollLeft >= max - 1;
196
+ };
197
+ row.addEventListener('scroll', update, { passive: true });
198
+ const RO = win && win.ResizeObserver;
199
+ if (RO)
200
+ new RO(update).observe(row);
201
+ else if (win)
202
+ win.addEventListener('resize', update);
203
+ // Measure once the row has real dimensions (it is still detached here).
204
+ if (win?.requestAnimationFrame)
205
+ win.requestAnimationFrame(update);
206
+ update();
207
+ shell.appendChild(prev);
208
+ shell.appendChild(row);
209
+ shell.appendChild(next);
210
+ return shell;
211
+ }
212
+ /** The uniform, always-styled visual button (no click behaviour of its own). */
213
+ function styledSocialButton(w, provider, tag = 'button') {
214
+ const { variant, labels } = w.social;
215
+ const name = (0, appearance_1.providerLabel)(provider);
216
+ // `block` → "Continue with Google"; `compact`/`icon` → "Google". A per-provider
217
+ // label override wins for the text variants.
218
+ const text = labels[provider] ?? (variant === 'block' ? `Continue with ${name}` : name);
219
+ const element = (0, dom_1.el)(w, tag, (0, dom_1.cls)(w, 'socialButton', 'atlas-embed-social-button'));
220
+ if (tag === 'button')
221
+ element.type = 'button';
222
+ element.setAttribute('data-atlas-provider', provider);
223
+ element.setAttribute('data-variant', variant);
224
+ const iconSvg = (0, icons_1.providerIcon)(provider);
225
+ if (iconSvg) {
226
+ const icon = (0, dom_1.doc)(w).createElement('span');
227
+ icon.className = 'atlas-embed-social-icon';
228
+ // Trusted, static, first-party SVG (see icons.ts) — never tenant input.
229
+ icon.innerHTML = iconSvg;
230
+ element.appendChild(icon);
231
+ }
232
+ if (variant === 'icon') {
233
+ // Icon-only: the name lives in the tooltip and the a11y label instead.
234
+ element.setAttribute('aria-label', `Continue with ${name}`);
235
+ element.setAttribute('title', name);
236
+ }
237
+ else {
238
+ const label = (0, dom_1.doc)(w).createElement('span');
239
+ label.className = 'atlas-embed-social-label';
240
+ label.textContent = text;
241
+ element.appendChild(label);
242
+ }
243
+ return element;
244
+ }
245
+ function redirectButton(w, provider) {
246
+ const button = styledSocialButton(w, provider);
247
+ button.addEventListener('click', () => {
248
+ // Handle-first providers (Bluesky) need the user's handle to resolve their
249
+ // PDS before the redirect — show the small prompt instead of navigating.
250
+ if (constants_1.HANDLE_PROVIDERS.has(provider)) {
251
+ w.handlePrompt = provider;
252
+ (0, render_1.render)(w);
253
+ }
254
+ else {
255
+ void (0, flow_1.startOAuth)(w, provider);
256
+ }
257
+ });
258
+ return button;
259
+ }
260
+ /**
261
+ * The handle-first sub-screen (Bluesky). AT-Proto resolves the user's PDS from
262
+ * their handle, so we collect it here, then hand it to startOAuth. A Back link
263
+ * returns to the normal start screen.
264
+ */
265
+ function renderHandlePrompt(w, provider) {
266
+ const name = (0, appearance_1.providerLabel)(provider);
267
+ const form = (0, dom_1.doc)(w).createElement('form');
268
+ form.className = 'atlas-embed-form';
269
+ form.setAttribute('novalidate', 'true');
270
+ for (const err of w.state.errors.filter((e) => !e.param)) {
271
+ form.appendChild((0, dom_1.el)(w, 'div', 'atlas-embed-form-error', err.message));
272
+ }
273
+ const field = (0, dom_1.el)(w, 'label', (0, dom_1.cls)(w, 'field', 'atlas-embed-field'));
274
+ field.appendChild((0, dom_1.el)(w, 'span', (0, dom_1.cls)(w, 'label', 'atlas-embed-label'), `${name} handle`));
275
+ const input = (0, dom_1.doc)(w).createElement('input');
276
+ input.className = (0, dom_1.cls)(w, 'input', 'atlas-embed-input');
277
+ input.type = 'text';
278
+ input.name = 'identifier';
279
+ input.placeholder = 'you.bsky.social';
280
+ input.setAttribute('autocomplete', 'username');
281
+ input.setAttribute('autocapitalize', 'none');
282
+ input.setAttribute('spellcheck', 'false');
283
+ field.appendChild(input);
284
+ form.appendChild(field);
285
+ const button = (0, dom_1.submitButton)(w, constants_1.COPY[w.mode].submit);
286
+ form.appendChild(button);
287
+ const back = (0, dom_1.el)(w, 'button', 'atlas-embed-handle-back', 'Back');
288
+ back.type = 'button';
289
+ back.addEventListener('click', () => {
290
+ w.handlePrompt = null;
291
+ w.state = { ...w.state, errors: [] };
292
+ (0, render_1.render)(w);
293
+ });
294
+ form.appendChild(back);
295
+ form.addEventListener('submit', (event) => {
296
+ event.preventDefault();
297
+ const handle = input.value.trim();
298
+ if (!handle) {
299
+ w.state = {
300
+ ...w.state,
301
+ errors: [{ code: 'validation_error', message: `Enter your ${name} handle.` }],
302
+ };
303
+ (0, render_1.render)(w);
304
+ return;
305
+ }
306
+ void (0, flow_1.startOAuth)(w, provider, handle);
307
+ });
308
+ return form;
309
+ }
310
+ /**
311
+ * Our uniform Google button, backed by Google's invisible real button. A DIV
312
+ * (role=button), not a <button>, so Google's own button can be nested legally.
313
+ * If GSI can't load, the same element falls back to the redirect flow so it is
314
+ * never a dead button.
315
+ */
316
+ function googleOverlayButton(w, clientId) {
317
+ const element = styledSocialButton(w, 'google', 'div');
318
+ element.setAttribute('role', 'button');
319
+ element.setAttribute('tabindex', '0');
320
+ void (0, js_1.renderGoogleOverlayButton)({
321
+ wrapper: element,
322
+ clientId,
323
+ onCredential: (idToken) => void (0, flow_1.completeIdToken)(w, 'google', idToken),
324
+ onError: () => (0, render_1.renderNote)(w, 'Google sign-in could not start.'),
325
+ }).catch(() => {
326
+ // GSI blocked/offline — make the same button do the redirect flow instead.
327
+ element.addEventListener('click', () => void (0, flow_1.startOAuth)(w, 'google'));
328
+ });
329
+ return element;
330
+ }
331
+ //# sourceMappingURL=social.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social.js","sourceRoot":"","sources":["../../src/widget/social.ts"],"names":[],"mappings":"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"}