@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.
- package/dist/appearance.d.ts +293 -0
- package/dist/appearance.js +206 -0
- package/dist/appearance.js.map +1 -0
- package/dist/client.d.ts +12 -0
- package/dist/client.js +49 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.js +61 -0
- package/dist/config.js.map +1 -0
- package/dist/element.d.ts +23 -0
- package/dist/element.js +51 -0
- package/dist/element.js.map +1 -0
- package/dist/embed.js +361 -0
- package/dist/icons.d.ts +17 -0
- package/dist/icons.js +53 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/mount.d.ts +7 -0
- package/dist/mount.js +33 -0
- package/dist/mount.js.map +1 -0
- package/dist/redirect.d.ts +17 -0
- package/dist/redirect.js +51 -0
- package/dist/redirect.js.map +1 -0
- package/dist/standalone.d.ts +25 -0
- package/dist/standalone.js +34 -0
- package/dist/standalone.js.map +1 -0
- package/dist/styles.d.ts +17 -0
- package/dist/styles.js +389 -0
- package/dist/styles.js.map +1 -0
- package/dist/widget/captcha.d.ts +21 -0
- package/dist/widget/captcha.js +197 -0
- package/dist/widget/captcha.js.map +1 -0
- package/dist/widget/constants.d.ts +16 -0
- package/dist/widget/constants.js +14 -0
- package/dist/widget/constants.js.map +1 -0
- package/dist/widget/dom.d.ts +18 -0
- package/dist/widget/dom.js +71 -0
- package/dist/widget/dom.js.map +1 -0
- package/dist/widget/flow.d.ts +41 -0
- package/dist/widget/flow.js +424 -0
- package/dist/widget/flow.js.map +1 -0
- package/dist/widget/forms.d.ts +35 -0
- package/dist/widget/forms.js +499 -0
- package/dist/widget/forms.js.map +1 -0
- package/dist/widget/passkey.d.ts +18 -0
- package/dist/widget/passkey.js +88 -0
- package/dist/widget/passkey.js.map +1 -0
- package/dist/widget/render.d.ts +21 -0
- package/dist/widget/render.js +210 -0
- package/dist/widget/render.js.map +1 -0
- package/dist/widget/social.d.ts +44 -0
- package/dist/widget/social.js +331 -0
- package/dist/widget/social.js.map +1 -0
- package/dist/widget.d.ts +124 -0
- package/dist/widget.js +182 -0
- package/dist/widget.js.map +1 -0
- package/package.json +27 -0
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderReset = renderReset;
|
|
4
|
+
exports.fieldInto = fieldInto;
|
|
5
|
+
exports.codeFieldInto = codeFieldInto;
|
|
6
|
+
exports.renderForm = renderForm;
|
|
7
|
+
exports.renderLegalConsent = renderLegalConsent;
|
|
8
|
+
exports.renderSignUpForm = renderSignUpForm;
|
|
9
|
+
const js_1 = require("@atlasauth/js");
|
|
10
|
+
const constants_1 = require("./constants");
|
|
11
|
+
const dom_1 = require("./dom");
|
|
12
|
+
const render_1 = require("./render");
|
|
13
|
+
const flow_1 = require("./flow");
|
|
14
|
+
/**
|
|
15
|
+
* §5.4 the reset sub-flow panel: email → emailed code → (2FA) → new password →
|
|
16
|
+
* signed in. Reuses the shared field builders + the segmented code input, and
|
|
17
|
+
* always offers a way back to sign in.
|
|
18
|
+
*/
|
|
19
|
+
function renderReset(w) {
|
|
20
|
+
const flow = w.resetFlow;
|
|
21
|
+
const step = (0, js_1.resetStep)(flow);
|
|
22
|
+
const wrap = (0, dom_1.el)(w, 'div', 'atlas-embed-reset');
|
|
23
|
+
wrap.appendChild((0, dom_1.el)(w, 'h1', (0, dom_1.cls)(w, 'title', 'atlas-embed-title'), 'Reset your password'));
|
|
24
|
+
const form = (0, dom_1.doc)(w).createElement('form');
|
|
25
|
+
const errors = flow.errors;
|
|
26
|
+
const inputs = new Map();
|
|
27
|
+
const formError = errors.find((e) => !e.param);
|
|
28
|
+
if (formError)
|
|
29
|
+
form.appendChild((0, dom_1.el)(w, 'div', 'atlas-embed-form-error', formError.message));
|
|
30
|
+
let subtitle = null;
|
|
31
|
+
let submitLabel = 'Continue';
|
|
32
|
+
let showSubmit = true;
|
|
33
|
+
switch (step) {
|
|
34
|
+
case 'request':
|
|
35
|
+
subtitle = 'Enter your email and we’ll send you a reset code.';
|
|
36
|
+
submitLabel = 'Send reset code';
|
|
37
|
+
fieldInto(w, form, inputs, errors, 'email', 'Email address', 'email', 'username');
|
|
38
|
+
{
|
|
39
|
+
const emailField = inputs.get('email');
|
|
40
|
+
if (emailField) {
|
|
41
|
+
if (w.enteredIdentifier)
|
|
42
|
+
emailField.value = w.enteredIdentifier;
|
|
43
|
+
emailField.setAttribute('data-atlas-autofocus', '');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
break;
|
|
47
|
+
case 'collect_email_code':
|
|
48
|
+
subtitle = w.enteredIdentifier
|
|
49
|
+
? `Enter the code we sent to ${w.enteredIdentifier}`
|
|
50
|
+
: 'Enter the code we sent to your email';
|
|
51
|
+
codeFieldInto(w, form, inputs, errors, 'code', 'Reset code', true);
|
|
52
|
+
break;
|
|
53
|
+
case 'collect_second_factor':
|
|
54
|
+
subtitle = 'Enter the code from your authenticator app';
|
|
55
|
+
codeFieldInto(w, form, inputs, errors, 'code', 'Two-factor code', true);
|
|
56
|
+
break;
|
|
57
|
+
case 'collect_new_password':
|
|
58
|
+
subtitle = 'Choose a new password';
|
|
59
|
+
submitLabel = 'Set new password';
|
|
60
|
+
fieldInto(w, form, inputs, errors, 'password', 'New password', 'password', 'new-password');
|
|
61
|
+
inputs.get('password')?.setAttribute('data-atlas-autofocus', '');
|
|
62
|
+
break;
|
|
63
|
+
default:
|
|
64
|
+
showSubmit = false;
|
|
65
|
+
form.appendChild((0, dom_1.el)(w, 'p', 'atlas-embed-note', 'You’re all set.'));
|
|
66
|
+
}
|
|
67
|
+
if (subtitle) {
|
|
68
|
+
wrap.appendChild((0, dom_1.el)(w, 'p', (0, dom_1.cls)(w, 'subtitle', 'atlas-embed-subtitle'), subtitle));
|
|
69
|
+
}
|
|
70
|
+
wrap.appendChild(form);
|
|
71
|
+
if (showSubmit) {
|
|
72
|
+
form.appendChild((0, dom_1.submitButton)(w, submitLabel));
|
|
73
|
+
}
|
|
74
|
+
const back = (0, dom_1.el)(w, 'button', 'atlas-embed-step-back', 'Back to sign in');
|
|
75
|
+
back.type = 'button';
|
|
76
|
+
back.addEventListener('click', () => {
|
|
77
|
+
w.resetFlow = null;
|
|
78
|
+
(0, render_1.render)(w);
|
|
79
|
+
});
|
|
80
|
+
form.appendChild(back);
|
|
81
|
+
form.addEventListener('submit', (event) => {
|
|
82
|
+
event.preventDefault();
|
|
83
|
+
const values = {};
|
|
84
|
+
for (const [name, input] of inputs)
|
|
85
|
+
values[name] = input.value;
|
|
86
|
+
void (0, flow_1.submitReset)(w, values);
|
|
87
|
+
});
|
|
88
|
+
return wrap;
|
|
89
|
+
}
|
|
90
|
+
/** A labelled text input, appended to `form` and registered in `inputs`. */
|
|
91
|
+
function fieldInto(w, form, inputs, errors, name, label, type, autocomplete) {
|
|
92
|
+
const field = (0, dom_1.el)(w, 'label', (0, dom_1.cls)(w, 'field', 'atlas-embed-field'));
|
|
93
|
+
field.appendChild((0, dom_1.el)(w, 'span', (0, dom_1.cls)(w, 'label', 'atlas-embed-label'), label));
|
|
94
|
+
const input = (0, dom_1.doc)(w).createElement('input');
|
|
95
|
+
input.className = (0, dom_1.cls)(w, 'input', 'atlas-embed-input');
|
|
96
|
+
input.type = type;
|
|
97
|
+
input.name = name;
|
|
98
|
+
input.setAttribute('autocomplete', autocomplete);
|
|
99
|
+
if (type === 'password') {
|
|
100
|
+
// A show/hide eye toggle — reveals the typed password. preventDefault keeps
|
|
101
|
+
// the wrapping <label> from stealing focus back to the input on the click.
|
|
102
|
+
const wrap = (0, dom_1.el)(w, 'div', 'atlas-embed-password');
|
|
103
|
+
wrap.appendChild(input);
|
|
104
|
+
const toggle = (0, dom_1.el)(w, 'button', 'atlas-embed-password-toggle', 'Show');
|
|
105
|
+
toggle.type = 'button';
|
|
106
|
+
toggle.setAttribute('aria-label', 'Show password');
|
|
107
|
+
toggle.addEventListener('click', (event) => {
|
|
108
|
+
event.preventDefault();
|
|
109
|
+
const revealing = input.type === 'password';
|
|
110
|
+
input.type = revealing ? 'text' : 'password';
|
|
111
|
+
toggle.textContent = revealing ? 'Hide' : 'Show';
|
|
112
|
+
toggle.setAttribute('aria-label', revealing ? 'Hide password' : 'Show password');
|
|
113
|
+
});
|
|
114
|
+
wrap.appendChild(toggle);
|
|
115
|
+
field.appendChild(wrap);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
field.appendChild(input);
|
|
119
|
+
}
|
|
120
|
+
for (const err of errors.filter((e) => e.param === name)) {
|
|
121
|
+
field.appendChild((0, dom_1.el)(w, 'span', (0, dom_1.cls)(w, 'error', 'atlas-embed-error'), err.message));
|
|
122
|
+
}
|
|
123
|
+
inputs.set(name, input);
|
|
124
|
+
form.appendChild(field);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* A verification-code field. `boxes` (default) is a segmented one-box-per-digit
|
|
128
|
+
* input that auto-advances, accepts a paste, and auto-submits when full;
|
|
129
|
+
* `single` (or a non-6-digit code) is a plain field. Both feed the same `name`.
|
|
130
|
+
* Shared by the sign-in and the password-reset forms.
|
|
131
|
+
*/
|
|
132
|
+
function codeFieldInto(w, form, inputs, errors, name, label, autofocus) {
|
|
133
|
+
const CODE_LEN = 6;
|
|
134
|
+
if (w.codeInputStyle === 'single') {
|
|
135
|
+
fieldInto(w, form, inputs, errors, name, label, 'text', 'one-time-code');
|
|
136
|
+
if (autofocus)
|
|
137
|
+
inputs.get(name)?.setAttribute('data-atlas-autofocus', '');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const field = (0, dom_1.el)(w, 'div', (0, dom_1.cls)(w, 'field', 'atlas-embed-field'));
|
|
141
|
+
field.appendChild((0, dom_1.el)(w, 'span', (0, dom_1.cls)(w, 'label', 'atlas-embed-label'), label));
|
|
142
|
+
const group = (0, dom_1.el)(w, 'div', 'atlas-embed-code');
|
|
143
|
+
group.setAttribute('role', 'group');
|
|
144
|
+
group.setAttribute('aria-label', label);
|
|
145
|
+
const hidden = (0, dom_1.doc)(w).createElement('input');
|
|
146
|
+
hidden.type = 'hidden';
|
|
147
|
+
hidden.name = name;
|
|
148
|
+
inputs.set(name, hidden);
|
|
149
|
+
const boxes = [];
|
|
150
|
+
const sync = () => {
|
|
151
|
+
hidden.value = boxes.map((b) => b.value).join('');
|
|
152
|
+
};
|
|
153
|
+
const maybeSubmit = () => {
|
|
154
|
+
// A complete code submits itself — the expected OTP UX — but only once.
|
|
155
|
+
// Dispatch the form's own submit event (our listener preventDefaults it and
|
|
156
|
+
// drives the flow); we never want native navigation, so this works on every
|
|
157
|
+
// host, jsdom included.
|
|
158
|
+
if (hidden.value.length !== CODE_LEN || w.busy)
|
|
159
|
+
return;
|
|
160
|
+
form.dispatchEvent(new Event('submit', { cancelable: true, bubbles: true }));
|
|
161
|
+
};
|
|
162
|
+
for (let i = 0; i < CODE_LEN; i++) {
|
|
163
|
+
const box = (0, dom_1.doc)(w).createElement('input');
|
|
164
|
+
box.className = 'atlas-embed-code-box';
|
|
165
|
+
box.type = 'text';
|
|
166
|
+
box.setAttribute('inputmode', 'numeric');
|
|
167
|
+
box.setAttribute('autocomplete', i === 0 ? 'one-time-code' : 'off');
|
|
168
|
+
box.setAttribute('aria-label', `${label} digit ${i + 1}`);
|
|
169
|
+
box.maxLength = 1;
|
|
170
|
+
if (autofocus && i === 0)
|
|
171
|
+
box.setAttribute('data-atlas-autofocus', '');
|
|
172
|
+
box.addEventListener('input', () => {
|
|
173
|
+
box.value = box.value.replace(/\D/g, '').slice(0, 1);
|
|
174
|
+
sync();
|
|
175
|
+
if (box.value && i < CODE_LEN - 1)
|
|
176
|
+
boxes[i + 1].focus();
|
|
177
|
+
maybeSubmit();
|
|
178
|
+
});
|
|
179
|
+
box.addEventListener('keydown', (event) => {
|
|
180
|
+
if (event.key === 'Backspace' && !box.value && i > 0)
|
|
181
|
+
boxes[i - 1].focus();
|
|
182
|
+
});
|
|
183
|
+
box.addEventListener('paste', (event) => {
|
|
184
|
+
event.preventDefault();
|
|
185
|
+
const text = (event.clipboardData?.getData('text') ?? '').replace(/\D/g, '').slice(0, CODE_LEN);
|
|
186
|
+
for (let j = 0; j < CODE_LEN; j++)
|
|
187
|
+
boxes[j].value = text[j] ?? '';
|
|
188
|
+
sync();
|
|
189
|
+
boxes[Math.min(text.length, CODE_LEN - 1)].focus();
|
|
190
|
+
maybeSubmit();
|
|
191
|
+
});
|
|
192
|
+
boxes.push(box);
|
|
193
|
+
group.appendChild(box);
|
|
194
|
+
}
|
|
195
|
+
field.appendChild(group);
|
|
196
|
+
field.appendChild(hidden);
|
|
197
|
+
for (const err of errors.filter((e) => e.param === name)) {
|
|
198
|
+
field.appendChild((0, dom_1.el)(w, 'span', (0, dom_1.cls)(w, 'error', 'atlas-embed-error'), err.message));
|
|
199
|
+
}
|
|
200
|
+
form.appendChild(field);
|
|
201
|
+
}
|
|
202
|
+
function renderForm(w, stepKind) {
|
|
203
|
+
const form = (0, dom_1.doc)(w).createElement('form');
|
|
204
|
+
const formError = w.state.errors.find((e) => !e.param);
|
|
205
|
+
if (formError) {
|
|
206
|
+
form.appendChild((0, dom_1.el)(w, 'div', 'atlas-embed-form-error', formError.message));
|
|
207
|
+
}
|
|
208
|
+
const inputs = new Map();
|
|
209
|
+
const errors = w.state.errors;
|
|
210
|
+
const addField = (name, label, type, autocomplete) => fieldInto(w, form, inputs, errors, name, label, type, autocomplete);
|
|
211
|
+
const addCodeField = (name, label, autofocus) => codeFieldInto(w, form, inputs, errors, name, label, autofocus);
|
|
212
|
+
let showSubmit = true;
|
|
213
|
+
switch (stepKind) {
|
|
214
|
+
case 'collect_identifier':
|
|
215
|
+
// §5.5 the `webauthn` autocomplete token opts this field into passkey
|
|
216
|
+
// autofill (conditional UI), so the browser can surface saved passkeys in
|
|
217
|
+
// the email field when the instance offers them.
|
|
218
|
+
addField('identifier', 'Email address', 'email', w.passkeyEnabled && (0, js_1.passkeysSupported)() ? 'username webauthn' : 'username');
|
|
219
|
+
// Prefill what they last typed so a wrong-password retry keeps the email
|
|
220
|
+
// in place (the single-screen box never loses it).
|
|
221
|
+
if (w.enteredIdentifier)
|
|
222
|
+
inputs.get('identifier').value = w.enteredIdentifier;
|
|
223
|
+
// Single-screen sign-in: email + password on one form (the classic login
|
|
224
|
+
// box), matching the sign-up form. `submit()` sends the identifier, then
|
|
225
|
+
// auto-submits this password when the server asks for the first factor.
|
|
226
|
+
// Omitted when password isn't enabled (a passwordless instance branches).
|
|
227
|
+
if (w.mode === 'sign-in' && w.passwordEnabled) {
|
|
228
|
+
addField('password', 'Password', 'password', 'current-password');
|
|
229
|
+
}
|
|
230
|
+
// §7.5 Remember me — ticked keeps a persistent session; unticked makes it a
|
|
231
|
+
// browser-session cookie. Its value is read live via `this.remember`, so it
|
|
232
|
+
// is carried to the ticket exchange even though it is not a form field.
|
|
233
|
+
if (w.mode === 'sign-in' && w.rememberMeEnabled) {
|
|
234
|
+
const row = (0, dom_1.el)(w, 'label', 'atlas-embed-remember');
|
|
235
|
+
const box = (0, dom_1.doc)(w).createElement('input');
|
|
236
|
+
box.type = 'checkbox';
|
|
237
|
+
box.className = 'atlas-embed-remember-check';
|
|
238
|
+
box.checked = w.remember;
|
|
239
|
+
box.addEventListener('change', () => {
|
|
240
|
+
w.remember = box.checked;
|
|
241
|
+
});
|
|
242
|
+
row.appendChild(box);
|
|
243
|
+
row.appendChild((0, dom_1.el)(w, 'span', 'atlas-embed-remember-text', 'Remember me'));
|
|
244
|
+
form.appendChild(row);
|
|
245
|
+
}
|
|
246
|
+
break;
|
|
247
|
+
case 'collect_first_factor':
|
|
248
|
+
addField('password', 'Password', 'password', 'current-password');
|
|
249
|
+
break;
|
|
250
|
+
case 'collect_second_factor':
|
|
251
|
+
// A recovery/backup code is alphanumeric + variable-length, so it can't go
|
|
252
|
+
// in fixed digit boxes — the "use a backup code" toggle swaps to a single
|
|
253
|
+
// field for it, and the digit boxes are used for the authenticator code.
|
|
254
|
+
if (w.backupCodeMode)
|
|
255
|
+
addField('code', 'Backup code', 'text', 'one-time-code');
|
|
256
|
+
else
|
|
257
|
+
addCodeField('code', 'Two-factor code', true);
|
|
258
|
+
// §5.3 "Remember this device" — unticked by default (opt-in). Read live via
|
|
259
|
+
// `this.rememberDevice`, injected into the second-factor submit below.
|
|
260
|
+
if (w.trustedDeviceEnabled) {
|
|
261
|
+
const row = (0, dom_1.el)(w, 'label', 'atlas-embed-remember');
|
|
262
|
+
const box = (0, dom_1.doc)(w).createElement('input');
|
|
263
|
+
box.type = 'checkbox';
|
|
264
|
+
box.className = 'atlas-embed-remember-check';
|
|
265
|
+
box.checked = w.rememberDevice;
|
|
266
|
+
box.addEventListener('change', () => {
|
|
267
|
+
w.rememberDevice = box.checked;
|
|
268
|
+
});
|
|
269
|
+
row.appendChild(box);
|
|
270
|
+
row.appendChild((0, dom_1.el)(w, 'span', 'atlas-embed-remember-text', 'Remember this device'));
|
|
271
|
+
form.appendChild(row);
|
|
272
|
+
}
|
|
273
|
+
break;
|
|
274
|
+
case 'collect_email_code':
|
|
275
|
+
addCodeField('code', 'Verification code', true);
|
|
276
|
+
break;
|
|
277
|
+
case 'collect_new_password':
|
|
278
|
+
addField('password', 'New password', 'password', 'new-password');
|
|
279
|
+
break;
|
|
280
|
+
case 'enroll_second_factor':
|
|
281
|
+
addCodeField('code', 'Authenticator code', true);
|
|
282
|
+
addCodeField('secondCode', 'Next code', false);
|
|
283
|
+
break;
|
|
284
|
+
default:
|
|
285
|
+
showSubmit = false;
|
|
286
|
+
form.appendChild((0, dom_1.el)(w, 'p', 'atlas-embed-note', 'Please continue in your application.'));
|
|
287
|
+
}
|
|
288
|
+
if (showSubmit) {
|
|
289
|
+
form.appendChild((0, dom_1.submitButton)(w, constants_1.COPY[w.mode].submit));
|
|
290
|
+
}
|
|
291
|
+
// §5.3 2FA fallback: let the user swap between the authenticator boxes and a
|
|
292
|
+
// free-text backup-code field.
|
|
293
|
+
if (stepKind === 'collect_second_factor') {
|
|
294
|
+
const toggle = (0, dom_1.el)(w, 'button', 'atlas-embed-step-back', w.backupCodeMode ? 'Use your authenticator app' : 'Use a backup code instead');
|
|
295
|
+
toggle.type = 'button';
|
|
296
|
+
toggle.addEventListener('click', () => {
|
|
297
|
+
w.backupCodeMode = !w.backupCodeMode;
|
|
298
|
+
(0, render_1.render)(w);
|
|
299
|
+
});
|
|
300
|
+
form.appendChild(toggle);
|
|
301
|
+
}
|
|
302
|
+
// §5.4 "Forgot password?" — start the reset sub-flow. Shown wherever a password
|
|
303
|
+
// is being asked for (the single-screen box, or a dedicated password step), and
|
|
304
|
+
// only when password sign-in is actually on.
|
|
305
|
+
const passwordStep = (stepKind === 'collect_identifier' && w.mode === 'sign-in' && w.passwordEnabled) ||
|
|
306
|
+
stepKind === 'collect_first_factor';
|
|
307
|
+
if (passwordStep) {
|
|
308
|
+
const forgot = (0, dom_1.el)(w, 'button', 'atlas-embed-step-back', 'Forgot password?');
|
|
309
|
+
forgot.type = 'button';
|
|
310
|
+
forgot.addEventListener('click', () => (0, flow_1.startReset)(w));
|
|
311
|
+
form.appendChild(forgot);
|
|
312
|
+
}
|
|
313
|
+
form.addEventListener('submit', (event) => {
|
|
314
|
+
event.preventDefault();
|
|
315
|
+
const values = {};
|
|
316
|
+
for (const [name, input] of inputs)
|
|
317
|
+
values[name] = input.value;
|
|
318
|
+
// §5.3 carry the "remember this device" choice into the second-factor submit.
|
|
319
|
+
if (stepKind === 'collect_second_factor' && w.trustedDeviceEnabled && w.rememberDevice) {
|
|
320
|
+
values.remember_device = 'true';
|
|
321
|
+
}
|
|
322
|
+
void (0, flow_1.submit)(w, values);
|
|
323
|
+
});
|
|
324
|
+
return form;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* §5.1 legal consent on sign-up: a line linking the Terms of Service / Privacy
|
|
328
|
+
* Policy the tenant configured. When `required`, it carries a checkbox that gates
|
|
329
|
+
* account creation. Returns null when the tenant set no links. The URLs are
|
|
330
|
+
* https-sanitised server-side, so they are safe to render as anchors.
|
|
331
|
+
*/
|
|
332
|
+
function renderLegalConsent(w) {
|
|
333
|
+
const legal = w.appearance?.legal;
|
|
334
|
+
if (!legal || (!legal.termsUrl && !legal.privacyUrl))
|
|
335
|
+
return null;
|
|
336
|
+
const document = (0, dom_1.doc)(w);
|
|
337
|
+
const row = (0, dom_1.el)(w, 'div', 'atlas-embed-consent');
|
|
338
|
+
let checkbox = null;
|
|
339
|
+
if (legal.required) {
|
|
340
|
+
checkbox = document.createElement('input');
|
|
341
|
+
checkbox.type = 'checkbox';
|
|
342
|
+
checkbox.className = 'atlas-embed-consent-check';
|
|
343
|
+
checkbox.setAttribute('aria-label', 'Agree to the terms and privacy policy');
|
|
344
|
+
row.appendChild(checkbox);
|
|
345
|
+
}
|
|
346
|
+
const text = (0, dom_1.el)(w, 'span', 'atlas-embed-consent-text');
|
|
347
|
+
const link = (url, label) => {
|
|
348
|
+
const a = document.createElement('a');
|
|
349
|
+
a.href = url;
|
|
350
|
+
a.textContent = label;
|
|
351
|
+
a.target = '_blank';
|
|
352
|
+
a.rel = 'noopener noreferrer';
|
|
353
|
+
a.className = 'atlas-embed-consent-link';
|
|
354
|
+
return a;
|
|
355
|
+
};
|
|
356
|
+
text.appendChild(document.createTextNode(legal.required ? 'I agree to the ' : 'By continuing you agree to the '));
|
|
357
|
+
const parts = [];
|
|
358
|
+
if (legal.termsUrl)
|
|
359
|
+
parts.push(link(legal.termsUrl, 'Terms of Service'));
|
|
360
|
+
if (legal.privacyUrl)
|
|
361
|
+
parts.push(link(legal.privacyUrl, 'Privacy Policy'));
|
|
362
|
+
parts.forEach((part, i) => {
|
|
363
|
+
if (i > 0)
|
|
364
|
+
text.appendChild(document.createTextNode(' and '));
|
|
365
|
+
text.appendChild(part);
|
|
366
|
+
});
|
|
367
|
+
text.appendChild(document.createTextNode('.'));
|
|
368
|
+
row.appendChild(text);
|
|
369
|
+
return { row, checkbox };
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* §5 The create-account form: the tenant's configured fields (name, company,
|
|
373
|
+
* phone, custom…) followed by email + password. Submits to
|
|
374
|
+
* /v1/client/sign_ups; the server then emails a code and the shared flow drives
|
|
375
|
+
* verification to completion.
|
|
376
|
+
*/
|
|
377
|
+
function renderSignUpForm(w) {
|
|
378
|
+
const form = (0, dom_1.doc)(w).createElement('form');
|
|
379
|
+
const formError = w.state.errors.find((e) => !e.param);
|
|
380
|
+
if (formError)
|
|
381
|
+
form.appendChild((0, dom_1.el)(w, 'div', 'atlas-embed-form-error', formError.message));
|
|
382
|
+
// Each field registers a reader that produces its string value at submit —
|
|
383
|
+
// this is what lets one loop collect text, dropdowns, checkboxes, radio and
|
|
384
|
+
// multi-select uniformly.
|
|
385
|
+
const readers = new Map();
|
|
386
|
+
const addField = (name, label, opts) => {
|
|
387
|
+
const type = opts.type ?? 'text';
|
|
388
|
+
const asLabel = type === 'radio' || type === 'multiselect';
|
|
389
|
+
const field = (0, dom_1.el)(w, asLabel ? 'fieldset' : 'label', (0, dom_1.cls)(w, 'field', 'atlas-embed-field'));
|
|
390
|
+
field.appendChild((0, dom_1.el)(w, asLabel ? 'legend' : 'span', (0, dom_1.cls)(w, 'label', 'atlas-embed-label'), opts.required ? label : `${label} (optional)`));
|
|
391
|
+
const document = (0, dom_1.doc)(w);
|
|
392
|
+
if (type === 'select') {
|
|
393
|
+
const select = document.createElement('select');
|
|
394
|
+
select.className = (0, dom_1.cls)(w, 'input', 'atlas-embed-input');
|
|
395
|
+
select.name = name;
|
|
396
|
+
const blank = document.createElement('option');
|
|
397
|
+
blank.value = '';
|
|
398
|
+
blank.textContent = opts.placeholder || 'Select…';
|
|
399
|
+
select.appendChild(blank);
|
|
400
|
+
for (const o of opts.options ?? []) {
|
|
401
|
+
const element = document.createElement('option');
|
|
402
|
+
element.value = o;
|
|
403
|
+
element.textContent = o;
|
|
404
|
+
select.appendChild(element);
|
|
405
|
+
}
|
|
406
|
+
field.appendChild(select);
|
|
407
|
+
readers.set(name, () => select.value);
|
|
408
|
+
}
|
|
409
|
+
else if (type === 'textarea') {
|
|
410
|
+
const area = document.createElement('textarea');
|
|
411
|
+
area.className = (0, dom_1.cls)(w, 'input', 'atlas-embed-input');
|
|
412
|
+
area.name = name;
|
|
413
|
+
area.rows = 3;
|
|
414
|
+
if (opts.placeholder)
|
|
415
|
+
area.setAttribute('placeholder', opts.placeholder);
|
|
416
|
+
field.appendChild(area);
|
|
417
|
+
readers.set(name, () => area.value);
|
|
418
|
+
}
|
|
419
|
+
else if (type === 'checkbox') {
|
|
420
|
+
const box = document.createElement('input');
|
|
421
|
+
box.type = 'checkbox';
|
|
422
|
+
box.name = name;
|
|
423
|
+
box.className = 'atlas-embed-checkbox';
|
|
424
|
+
field.classList.add('atlas-embed-field-checkbox');
|
|
425
|
+
field.appendChild(box);
|
|
426
|
+
readers.set(name, () => (box.checked ? 'true' : ''));
|
|
427
|
+
}
|
|
428
|
+
else if (type === 'radio' || type === 'multiselect') {
|
|
429
|
+
const group = document.createElement('div');
|
|
430
|
+
group.className = 'atlas-embed-choices';
|
|
431
|
+
const boxes = [];
|
|
432
|
+
for (const choice of opts.options ?? []) {
|
|
433
|
+
const row = document.createElement('label');
|
|
434
|
+
row.className = 'atlas-embed-choice';
|
|
435
|
+
const box = document.createElement('input');
|
|
436
|
+
box.type = type === 'radio' ? 'radio' : 'checkbox';
|
|
437
|
+
box.name = name;
|
|
438
|
+
box.value = choice;
|
|
439
|
+
boxes.push(box);
|
|
440
|
+
row.appendChild(box);
|
|
441
|
+
row.appendChild((0, dom_1.el)(w, 'span', undefined, choice));
|
|
442
|
+
group.appendChild(row);
|
|
443
|
+
}
|
|
444
|
+
field.appendChild(group);
|
|
445
|
+
readers.set(name, () => type === 'radio'
|
|
446
|
+
? boxes.find((b) => b.checked)?.value ?? ''
|
|
447
|
+
: boxes.filter((b) => b.checked).map((b) => b.value).join(', '));
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
const text = document.createElement('input');
|
|
451
|
+
text.className = (0, dom_1.cls)(w, 'input', 'atlas-embed-input');
|
|
452
|
+
text.type = type;
|
|
453
|
+
text.name = name;
|
|
454
|
+
if (opts.autocomplete)
|
|
455
|
+
text.setAttribute('autocomplete', opts.autocomplete);
|
|
456
|
+
if (opts.placeholder)
|
|
457
|
+
text.setAttribute('placeholder', opts.placeholder);
|
|
458
|
+
field.appendChild(text);
|
|
459
|
+
readers.set(name, () => text.value);
|
|
460
|
+
}
|
|
461
|
+
for (const err of w.state.errors.filter((e) => e.param === name)) {
|
|
462
|
+
field.appendChild((0, dom_1.el)(w, 'span', (0, dom_1.cls)(w, 'error', 'atlas-embed-error'), err.message));
|
|
463
|
+
}
|
|
464
|
+
form.appendChild(field);
|
|
465
|
+
};
|
|
466
|
+
// The tenant's fields first, then the always-present credentials.
|
|
467
|
+
for (const f of w.signUpFields) {
|
|
468
|
+
addField(f.key, f.label, {
|
|
469
|
+
type: f.type,
|
|
470
|
+
required: f.required,
|
|
471
|
+
placeholder: f.placeholder,
|
|
472
|
+
options: f.options,
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
addField('identifier', 'Email address', { type: 'email', required: true, autocomplete: 'email' });
|
|
476
|
+
addField('password', 'Password', { type: 'password', required: true, autocomplete: 'new-password' });
|
|
477
|
+
// §5.1 legal consent — links, and a checkbox that gates the button when
|
|
478
|
+
// agreement is required (no re-render, so typed values are never lost).
|
|
479
|
+
const consent = renderLegalConsent(w);
|
|
480
|
+
if (consent)
|
|
481
|
+
form.appendChild(consent.row);
|
|
482
|
+
const button = (0, dom_1.submitButton)(w, constants_1.COPY[w.mode].submit);
|
|
483
|
+
const consentOk = () => !consent?.checkbox || consent.checkbox.checked;
|
|
484
|
+
button.disabled = w.busy || !consentOk();
|
|
485
|
+
consent?.checkbox?.addEventListener('change', () => {
|
|
486
|
+
button.disabled = w.busy || !consentOk();
|
|
487
|
+
});
|
|
488
|
+
form.appendChild(button);
|
|
489
|
+
form.addEventListener('submit', (event) => {
|
|
490
|
+
event.preventDefault();
|
|
491
|
+
const values = {};
|
|
492
|
+
for (const [name, read] of readers)
|
|
493
|
+
values[name] = read();
|
|
494
|
+
// §5.1 carry the consent tick to the server (true when there is no gate).
|
|
495
|
+
void (0, flow_1.submitSignUp)(w, values, consentOk());
|
|
496
|
+
});
|
|
497
|
+
return form;
|
|
498
|
+
}
|
|
499
|
+
//# sourceMappingURL=forms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/widget/forms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AtlasWidget } from '../widget';
|
|
2
|
+
/**
|
|
3
|
+
* §5.5 usernameless passkey sign-in: begin (discoverable-credential options) →
|
|
4
|
+
* navigator.credentials.get via the SDK helper → finish. The finish endpoint
|
|
5
|
+
* mints the session and sets the cookie itself, so there is NO ticket exchange —
|
|
6
|
+
* on `complete` we go straight to complete(). A cancelled ceremony quietly
|
|
7
|
+
* returns to the form; a server error surfaces on the panel.
|
|
8
|
+
*/
|
|
9
|
+
export declare function passkeySignIn(w: AtlasWidget): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* §5.5 conditional-UI passkey autofill. Armed once after the sign-in form
|
|
12
|
+
* mounts (when the instance offers passkeys and the browser supports the
|
|
13
|
+
* conditional mediation), it runs a discoverable-credential `get` in the
|
|
14
|
+
* background so saved passkeys appear in the email field's autofill. It NEVER
|
|
15
|
+
* shows UI of its own and is aborted the moment the user does anything else
|
|
16
|
+
* (submits / clicks the passkey button), so it can't fight the normal flow.
|
|
17
|
+
*/
|
|
18
|
+
export declare function startConditionalPasskey(w: AtlasWidget): Promise<void>;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.passkeySignIn = passkeySignIn;
|
|
4
|
+
exports.startConditionalPasskey = startConditionalPasskey;
|
|
5
|
+
const js_1 = require("@atlasauth/js");
|
|
6
|
+
const render_1 = require("./render");
|
|
7
|
+
const flow_1 = require("./flow");
|
|
8
|
+
/**
|
|
9
|
+
* §5.5 usernameless passkey sign-in: begin (discoverable-credential options) →
|
|
10
|
+
* navigator.credentials.get via the SDK helper → finish. The finish endpoint
|
|
11
|
+
* mints the session and sets the cookie itself, so there is NO ticket exchange —
|
|
12
|
+
* on `complete` we go straight to complete(). A cancelled ceremony quietly
|
|
13
|
+
* returns to the form; a server error surfaces on the panel.
|
|
14
|
+
*/
|
|
15
|
+
async function passkeySignIn(w) {
|
|
16
|
+
if (w.busy)
|
|
17
|
+
return;
|
|
18
|
+
w.conditionalAbort?.abort(); // the explicit button supersedes autofill
|
|
19
|
+
w.busy = true;
|
|
20
|
+
(0, render_1.render)(w);
|
|
21
|
+
const begin = await w.client.post('/v1/client/sign_ins/passkey/begin', {});
|
|
22
|
+
if (!begin.ok || !begin.data) {
|
|
23
|
+
w.busy = false;
|
|
24
|
+
(0, render_1.renderErrors)(w, begin.errors);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
let finishBody;
|
|
28
|
+
try {
|
|
29
|
+
finishBody = await (0, js_1.getPasskeyAssertion)(begin.data);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// User cancelled the OS prompt, or no credential — return to the form.
|
|
33
|
+
w.busy = false;
|
|
34
|
+
(0, render_1.render)(w);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const res = await w.client.post('/v1/client/sign_ins/passkey/finish', finishBody);
|
|
38
|
+
w.busy = false;
|
|
39
|
+
if (res.ok && res.data?.status === 'complete') {
|
|
40
|
+
// The cookie is already set by /finish — no exchange, just finish up.
|
|
41
|
+
await (0, flow_1.complete)(w, res.data.created_session_id ?? null);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
(0, render_1.renderErrors)(w, res.errors);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* §5.5 conditional-UI passkey autofill. Armed once after the sign-in form
|
|
48
|
+
* mounts (when the instance offers passkeys and the browser supports the
|
|
49
|
+
* conditional mediation), it runs a discoverable-credential `get` in the
|
|
50
|
+
* background so saved passkeys appear in the email field's autofill. It NEVER
|
|
51
|
+
* shows UI of its own and is aborted the moment the user does anything else
|
|
52
|
+
* (submits / clicks the passkey button), so it can't fight the normal flow.
|
|
53
|
+
*/
|
|
54
|
+
async function startConditionalPasskey(w) {
|
|
55
|
+
if (w.mode !== 'sign-in' || !w.passkeyEnabled || !(0, js_1.passkeysSupported)())
|
|
56
|
+
return;
|
|
57
|
+
let available = false;
|
|
58
|
+
try {
|
|
59
|
+
available = await (0, js_1.conditionalUiAvailable)();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
available = false;
|
|
63
|
+
}
|
|
64
|
+
if (!available)
|
|
65
|
+
return;
|
|
66
|
+
w.conditionalAbort?.abort();
|
|
67
|
+
const controller = new AbortController();
|
|
68
|
+
w.conditionalAbort = controller;
|
|
69
|
+
try {
|
|
70
|
+
const begin = await w.client.post('/v1/client/sign_ins/passkey/begin', {});
|
|
71
|
+
if (!begin.ok || !begin.data || controller.signal.aborted)
|
|
72
|
+
return;
|
|
73
|
+
const finishBody = await (0, js_1.getPasskeyAssertion)(begin.data, {
|
|
74
|
+
mediation: 'conditional',
|
|
75
|
+
signal: controller.signal,
|
|
76
|
+
});
|
|
77
|
+
if (controller.signal.aborted)
|
|
78
|
+
return;
|
|
79
|
+
const res = await w.client.post('/v1/client/sign_ins/passkey/finish', finishBody);
|
|
80
|
+
if (res.ok && res.data?.status === 'complete') {
|
|
81
|
+
await (0, flow_1.complete)(w, res.data.created_session_id ?? null);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Aborted (the user typed/submitted instead) or no passkey selected — silent.
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=passkey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passkey.js","sourceRoot":"","sources":["../../src/widget/passkey.ts"],"names":[],"mappings":"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"}
|