@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,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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"}