@atlasauth/angular 0.11.0 → 0.13.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.
@@ -21,6 +21,7 @@ export { UserButtonComponent } from './lib/components/user-button.component';
21
21
  export { OrganizationSwitcherComponent } from './lib/components/organization-switcher.component';
22
22
  export { UserProfileComponent } from './lib/components/user-profile.component';
23
23
  export { OrganizationProfileComponent } from './lib/components/organization-profile.component';
24
+ export { ManageCibaComponent } from './lib/components/manage-ciba.component';
24
25
  export { OrganizationAuditLogComponent } from './lib/components/organization-audit-log.component';
25
26
  export { AtlasOrganizationAuditLog } from './lib/components/organization-audit-log';
26
27
  export { ImpersonationBannerComponent } from './lib/components/impersonation-banner.component';
@@ -45,4 +46,4 @@ export { SignOutError } from '@atlasauth/js';
45
46
  // `onSignOut({ reason })` event types + the `atlas:signout` window event; this SDK's version.
46
47
  export { SIGN_OUT_EVENT, onAtlasSignOut } from '@atlasauth/js';
47
48
  export { ATLAS_ANGULAR_SDK, ATLAS_ANGULAR_VERSION } from './lib/version';
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILHFCQUFxQjtBQUNyQixPQUFPLEVBQUUsYUFBYSxFQUFxQixNQUFNLG9CQUFvQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFaEUsc0RBQXNEO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVuRCxxREFBcUQ7QUFDckQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFM0UsYUFBYTtBQUNiLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDN0UsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDakcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0UsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDL0YsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDbEcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFcEYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDL0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0UsT0FBTyxFQUNMLG1CQUFtQixHQUVwQixNQUFNLHlDQUF5QyxDQUFDO0FBQ2pELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3BGLDZHQUE2RztBQUM3RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN0SCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUMsZUFBZTtBQUNmLE9BQU8sRUFDTCxVQUFVLEVBQ1YsZUFBZSxHQUVoQixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLDZEQUE2RDtBQUM3RCxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsWUFBWSxDQUFDO0FBZ0IzQiwwRUFBMEU7QUFDMUUscUVBQXFFO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0MsOEZBQThGO0FBQzlGLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYEBhdGxhc2F1dGgvYW5ndWxhcmAg4oCUIHRoZSBvZmZpY2lhbCBBbmd1bGFyIFNESyBmb3IgQXRsYXMsIHRoZSBBbmd1bGFyIHBlZXIgb2ZcbiAqIGBAYXRsYXNhdXRoL3JlYWN0YC4gUHVibGljIHN1cmZhY2UuXG4gKi9cblxuLy8gQ29uZmlndXJhdGlvbiArIERJXG5leHBvcnQgeyBBVExBU19PUFRJT05TLCB0eXBlIEF0bGFzT3B0aW9ucyB9IGZyb20gJy4vbGliL2F0bGFzLmNvbmZpZyc7XG5leHBvcnQgeyBwcm92aWRlQXRsYXMsIEF0bGFzTW9kdWxlIH0gZnJvbSAnLi9saWIvcHJvdmlkZS1hdGxhcyc7XG5cbi8vIENvcmUgc2VydmljZSAodGhlIEF0bGFzUHJvdmlkZXIgKyBob29rcyBlcXVpdmFsZW50KVxuZXhwb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi9saWIvYXRsYXMuc2VydmljZSc7XG5cbi8vIFN0cnVjdHVyYWwgZGlyZWN0aXZlcyArIHRoZSB0aGVtaW5nIGhvc3QgZGlyZWN0aXZlXG5leHBvcnQgeyBBdGxhc1NpZ25lZEluRGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9zaWduZWQtaW4uZGlyZWN0aXZlJztcbmV4cG9ydCB7IEF0bGFzU2lnbmVkT3V0RGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9zaWduZWQtb3V0LmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBBdGxhc0xvYWRpbmdEaXJlY3RpdmUgfSBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL2xvYWRpbmcuZGlyZWN0aXZlJztcbmV4cG9ydCB7IEF0bGFzTG9hZGVkRGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9sb2FkZWQuZGlyZWN0aXZlJztcbmV4cG9ydCB7IEF0bGFzUHJvdGVjdERpcmVjdGl2ZSB9IGZyb20gJy4vbGliL2RpcmVjdGl2ZXMvcHJvdGVjdC5kaXJlY3RpdmUnO1xuZXhwb3J0IHsgQXRsYXNSb290RGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9hdGxhcy1yb290LmRpcmVjdGl2ZSc7XG5cbi8vIENvbXBvbmVudHNcbmV4cG9ydCB7IFNpZ25JbkNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvc2lnbi1pbi5jb21wb25lbnQnO1xuZXhwb3J0IHsgU2lnblVwQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9zaWduLXVwLmNvbXBvbmVudCc7XG5leHBvcnQgeyBVc2VyQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy91c2VyLWJ1dHRvbi5jb21wb25lbnQnO1xuZXhwb3J0IHsgT3JnYW5pemF0aW9uU3dpdGNoZXJDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL29yZ2FuaXphdGlvbi1zd2l0Y2hlci5jb21wb25lbnQnO1xuZXhwb3J0IHsgVXNlclByb2ZpbGVDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL3VzZXItcHJvZmlsZS5jb21wb25lbnQnO1xuZXhwb3J0IHsgT3JnYW5pemF0aW9uUHJvZmlsZUNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvb3JnYW5pemF0aW9uLXByb2ZpbGUuY29tcG9uZW50JztcbmV4cG9ydCB7IE9yZ2FuaXphdGlvbkF1ZGl0TG9nQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9vcmdhbml6YXRpb24tYXVkaXQtbG9nLmNvbXBvbmVudCc7XG5leHBvcnQgeyBBdGxhc09yZ2FuaXphdGlvbkF1ZGl0TG9nIH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9vcmdhbml6YXRpb24tYXVkaXQtbG9nJztcbmV4cG9ydCB0eXBlIHsgT3JnYW5pemF0aW9uQXVkaXRMb2dFbnRyeSwgT3JnYW5pemF0aW9uQXVkaXRMb2dTdGF0ZSwgT3JnYW5pemF0aW9uQXVkaXRMb2dPcHRpb25zIH0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5leHBvcnQgeyBJbXBlcnNvbmF0aW9uQmFubmVyQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9pbXBlcnNvbmF0aW9uLWJhbm5lci5jb21wb25lbnQnO1xuZXhwb3J0IHsgQXR0ZW1wdEZsb3dDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL2F0dGVtcHQtZmxvdy5jb21wb25lbnQnO1xuZXhwb3J0IHtcbiAgU2lnblVwRm9ybUNvbXBvbmVudCxcbiAgdHlwZSBTaWduVXBGb3JtU3VibWl0LFxufSBmcm9tICcuL2xpYi9jb21wb25lbnRzL3NpZ24tdXAtZm9ybS5jb21wb25lbnQnO1xuZXhwb3J0IHsgQXRsYXNDYXB0Y2hhU2xvdERpcmVjdGl2ZSB9IGZyb20gJy4vbGliL2RpcmVjdGl2ZXMvY2FwdGNoYS1zbG90LmRpcmVjdGl2ZSc7XG4vLyBQb2xpY3kgYWNjZXB0YW5jZSAodGVybXMsIHByaXZhY3ksIGFueSBwb2xpY3kpOiBjb25zZW50IGJsb2NrIC8gY2xpY2t3cmFwIGhvc3QsIHNpZ24taW4gc3RlcCwgaW4tYXBwIGdhdGUuXG5leHBvcnQgeyBBdGxhc1BvbGljaWVzRGlyZWN0aXZlLCBQb2xpY3lBY2NlcHRTdGVwQ29tcG9uZW50LCBQb2xpY3lHYXRlQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9wb2xpY3ktaG9zdCc7XG5leHBvcnQgeyBBdGxhc0Zsb3dDb250cm9sbGVyIH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9mbG93LWNvbnRyb2xsZXInO1xuZXhwb3J0IHsgQVRMQVNfVUkgfSBmcm9tICcuL2xpYi9hdGxhcy51aSc7XG5cbi8vIFJvdXRlIGd1YXJkc1xuZXhwb3J0IHtcbiAgYXRsYXNHdWFyZCxcbiAgYXRsYXNDaGlsZEd1YXJkLFxuICB0eXBlIEF0bGFzR3VhcmRPcHRpb25zLFxufSBmcm9tICcuL2xpYi9ndWFyZHMvYXRsYXMuZ3VhcmQnO1xuXG4vLyBUaGVtaW5nLCBpMThuLCBhdXRob3JpemF0aW9uLCBkYXRhIHNoYXBlcywgRkFQSSByZS1leHBvcnRzXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hcHBlYXJhbmNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2kxOG4nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcHJvdGVjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9mYXBpJztcblxuLy8gVGhlIGluc3RhbmNlJ3MgcHVibGljIHNpZ24taW4gLyBzaWduLXVwIHNldHRpbmdzIHRoZSBwcmVidWlsdCBmb3JtcyByZWFkXG4vLyAoYEF0bGFzRmxvd0NvbnRyb2xsZXIuc2V0dGluZ3NgKSwgYW5kIHRoZSBjYXB0Y2hhIHR5cGVzIHRoZXkgcmVuZGVyLlxuZXhwb3J0IHR5cGUge1xuICBJbnN0YW5jZVNldHRpbmdzLFxuICBQdWJsaWNTaWduVXBGaWVsZCxcbiAgQ2FwdGNoYUNvbnRyb2xsZXIsXG4gIENhcHRjaGFGbG93S2V5LFxuICBDYXB0Y2hhV2lkZ2V0TW9kZSxcbiAgRmxvd0NhcHRjaGEsXG4gIEVtYWlsRGVsaXZlcnksXG4gIFNpZ25PdXRPcHRpb25zLFxuICBTaWduT3V0UmVzdWx0LFxufSBmcm9tICdAYXRsYXNhdXRoL2pzJztcblxuLy8gYEF0bGFzU2VydmljZS5zaWduT3V0KClgIHJlc29sdmVzIGEgYFNpZ25PdXRSZXN1bHRgOyBgeyBzdHJpY3Q6IHRydWUgfWBcbi8vIHJlamVjdHMgd2l0aCBhIGBTaWduT3V0RXJyb3JgIHdoZW4gdGhlIHJldm9rZSB3YXMgbmV2ZXIgY29uZmlybWVkLlxuZXhwb3J0IHsgU2lnbk91dEVycm9yIH0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5cbi8vIGBvblNpZ25PdXQoeyByZWFzb24gfSlgIGV2ZW50IHR5cGVzICsgdGhlIGBhdGxhczpzaWdub3V0YCB3aW5kb3cgZXZlbnQ7IHRoaXMgU0RLJ3MgdmVyc2lvbi5cbmV4cG9ydCB7IFNJR05fT1VUX0VWRU5ULCBvbkF0bGFzU2lnbk91dCB9IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuZXhwb3J0IHR5cGUgeyBTaWduT3V0RXZlbnQsIFNpZ25PdXRSZWFzb24gfSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmV4cG9ydCB7IEFUTEFTX0FOR1VMQVJfU0RLLCBBVExBU19BTkdVTEFSX1ZFUlNJT04gfSBmcm9tICcuL2xpYi92ZXJzaW9uJztcbiJdfQ==
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILHFCQUFxQjtBQUNyQixPQUFPLEVBQUUsYUFBYSxFQUFxQixNQUFNLG9CQUFvQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFaEUsc0RBQXNEO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVuRCxxREFBcUQ7QUFDckQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFM0UsYUFBYTtBQUNiLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDN0UsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDakcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0UsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDL0YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDN0UsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDbEcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFcEYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDL0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0UsT0FBTyxFQUNMLG1CQUFtQixHQUVwQixNQUFNLHlDQUF5QyxDQUFDO0FBQ2pELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3BGLDZHQUE2RztBQUM3RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN0SCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUMsZUFBZTtBQUNmLE9BQU8sRUFDTCxVQUFVLEVBQ1YsZUFBZSxHQUVoQixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLDZEQUE2RDtBQUM3RCxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsWUFBWSxDQUFDO0FBZ0IzQiwwRUFBMEU7QUFDMUUscUVBQXFFO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0MsOEZBQThGO0FBQzlGLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYEBhdGxhc2F1dGgvYW5ndWxhcmAg4oCUIHRoZSBvZmZpY2lhbCBBbmd1bGFyIFNESyBmb3IgQXRsYXMsIHRoZSBBbmd1bGFyIHBlZXIgb2ZcbiAqIGBAYXRsYXNhdXRoL3JlYWN0YC4gUHVibGljIHN1cmZhY2UuXG4gKi9cblxuLy8gQ29uZmlndXJhdGlvbiArIERJXG5leHBvcnQgeyBBVExBU19PUFRJT05TLCB0eXBlIEF0bGFzT3B0aW9ucyB9IGZyb20gJy4vbGliL2F0bGFzLmNvbmZpZyc7XG5leHBvcnQgeyBwcm92aWRlQXRsYXMsIEF0bGFzTW9kdWxlIH0gZnJvbSAnLi9saWIvcHJvdmlkZS1hdGxhcyc7XG5cbi8vIENvcmUgc2VydmljZSAodGhlIEF0bGFzUHJvdmlkZXIgKyBob29rcyBlcXVpdmFsZW50KVxuZXhwb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi9saWIvYXRsYXMuc2VydmljZSc7XG5cbi8vIFN0cnVjdHVyYWwgZGlyZWN0aXZlcyArIHRoZSB0aGVtaW5nIGhvc3QgZGlyZWN0aXZlXG5leHBvcnQgeyBBdGxhc1NpZ25lZEluRGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9zaWduZWQtaW4uZGlyZWN0aXZlJztcbmV4cG9ydCB7IEF0bGFzU2lnbmVkT3V0RGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9zaWduZWQtb3V0LmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBBdGxhc0xvYWRpbmdEaXJlY3RpdmUgfSBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL2xvYWRpbmcuZGlyZWN0aXZlJztcbmV4cG9ydCB7IEF0bGFzTG9hZGVkRGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9sb2FkZWQuZGlyZWN0aXZlJztcbmV4cG9ydCB7IEF0bGFzUHJvdGVjdERpcmVjdGl2ZSB9IGZyb20gJy4vbGliL2RpcmVjdGl2ZXMvcHJvdGVjdC5kaXJlY3RpdmUnO1xuZXhwb3J0IHsgQXRsYXNSb290RGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9hdGxhcy1yb290LmRpcmVjdGl2ZSc7XG5cbi8vIENvbXBvbmVudHNcbmV4cG9ydCB7IFNpZ25JbkNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvc2lnbi1pbi5jb21wb25lbnQnO1xuZXhwb3J0IHsgU2lnblVwQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9zaWduLXVwLmNvbXBvbmVudCc7XG5leHBvcnQgeyBVc2VyQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy91c2VyLWJ1dHRvbi5jb21wb25lbnQnO1xuZXhwb3J0IHsgT3JnYW5pemF0aW9uU3dpdGNoZXJDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL29yZ2FuaXphdGlvbi1zd2l0Y2hlci5jb21wb25lbnQnO1xuZXhwb3J0IHsgVXNlclByb2ZpbGVDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL3VzZXItcHJvZmlsZS5jb21wb25lbnQnO1xuZXhwb3J0IHsgT3JnYW5pemF0aW9uUHJvZmlsZUNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvb3JnYW5pemF0aW9uLXByb2ZpbGUuY29tcG9uZW50JztcbmV4cG9ydCB7IE1hbmFnZUNpYmFDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL21hbmFnZS1jaWJhLmNvbXBvbmVudCc7XG5leHBvcnQgeyBPcmdhbml6YXRpb25BdWRpdExvZ0NvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvb3JnYW5pemF0aW9uLWF1ZGl0LWxvZy5jb21wb25lbnQnO1xuZXhwb3J0IHsgQXRsYXNPcmdhbml6YXRpb25BdWRpdExvZyB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvb3JnYW5pemF0aW9uLWF1ZGl0LWxvZyc7XG5leHBvcnQgdHlwZSB7IE9yZ2FuaXphdGlvbkF1ZGl0TG9nRW50cnksIE9yZ2FuaXphdGlvbkF1ZGl0TG9nU3RhdGUsIE9yZ2FuaXphdGlvbkF1ZGl0TG9nT3B0aW9ucyB9IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuZXhwb3J0IHsgSW1wZXJzb25hdGlvbkJhbm5lckNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvaW1wZXJzb25hdGlvbi1iYW5uZXIuY29tcG9uZW50JztcbmV4cG9ydCB7IEF0dGVtcHRGbG93Q29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9hdHRlbXB0LWZsb3cuY29tcG9uZW50JztcbmV4cG9ydCB7XG4gIFNpZ25VcEZvcm1Db21wb25lbnQsXG4gIHR5cGUgU2lnblVwRm9ybVN1Ym1pdCxcbn0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9zaWduLXVwLWZvcm0uY29tcG9uZW50JztcbmV4cG9ydCB7IEF0bGFzQ2FwdGNoYVNsb3REaXJlY3RpdmUgfSBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL2NhcHRjaGEtc2xvdC5kaXJlY3RpdmUnO1xuLy8gUG9saWN5IGFjY2VwdGFuY2UgKHRlcm1zLCBwcml2YWN5LCBhbnkgcG9saWN5KTogY29uc2VudCBibG9jayAvIGNsaWNrd3JhcCBob3N0LCBzaWduLWluIHN0ZXAsIGluLWFwcCBnYXRlLlxuZXhwb3J0IHsgQXRsYXNQb2xpY2llc0RpcmVjdGl2ZSwgUG9saWN5QWNjZXB0U3RlcENvbXBvbmVudCwgUG9saWN5R2F0ZUNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvcG9saWN5LWhvc3QnO1xuZXhwb3J0IHsgQXRsYXNGbG93Q29udHJvbGxlciB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvZmxvdy1jb250cm9sbGVyJztcbmV4cG9ydCB7IEFUTEFTX1VJIH0gZnJvbSAnLi9saWIvYXRsYXMudWknO1xuXG4vLyBSb3V0ZSBndWFyZHNcbmV4cG9ydCB7XG4gIGF0bGFzR3VhcmQsXG4gIGF0bGFzQ2hpbGRHdWFyZCxcbiAgdHlwZSBBdGxhc0d1YXJkT3B0aW9ucyxcbn0gZnJvbSAnLi9saWIvZ3VhcmRzL2F0bGFzLmd1YXJkJztcblxuLy8gVGhlbWluZywgaTE4biwgYXV0aG9yaXphdGlvbiwgZGF0YSBzaGFwZXMsIEZBUEkgcmUtZXhwb3J0c1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYXBwZWFyYW5jZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9pMThuJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3Byb3RlY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmFwaSc7XG5cbi8vIFRoZSBpbnN0YW5jZSdzIHB1YmxpYyBzaWduLWluIC8gc2lnbi11cCBzZXR0aW5ncyB0aGUgcHJlYnVpbHQgZm9ybXMgcmVhZFxuLy8gKGBBdGxhc0Zsb3dDb250cm9sbGVyLnNldHRpbmdzYCksIGFuZCB0aGUgY2FwdGNoYSB0eXBlcyB0aGV5IHJlbmRlci5cbmV4cG9ydCB0eXBlIHtcbiAgSW5zdGFuY2VTZXR0aW5ncyxcbiAgUHVibGljU2lnblVwRmllbGQsXG4gIENhcHRjaGFDb250cm9sbGVyLFxuICBDYXB0Y2hhRmxvd0tleSxcbiAgQ2FwdGNoYVdpZGdldE1vZGUsXG4gIEZsb3dDYXB0Y2hhLFxuICBFbWFpbERlbGl2ZXJ5LFxuICBTaWduT3V0T3B0aW9ucyxcbiAgU2lnbk91dFJlc3VsdCxcbn0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5cbi8vIGBBdGxhc1NlcnZpY2Uuc2lnbk91dCgpYCByZXNvbHZlcyBhIGBTaWduT3V0UmVzdWx0YDsgYHsgc3RyaWN0OiB0cnVlIH1gXG4vLyByZWplY3RzIHdpdGggYSBgU2lnbk91dEVycm9yYCB3aGVuIHRoZSByZXZva2Ugd2FzIG5ldmVyIGNvbmZpcm1lZC5cbmV4cG9ydCB7IFNpZ25PdXRFcnJvciB9IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuXG4vLyBgb25TaWduT3V0KHsgcmVhc29uIH0pYCBldmVudCB0eXBlcyArIHRoZSBgYXRsYXM6c2lnbm91dGAgd2luZG93IGV2ZW50OyB0aGlzIFNESydzIHZlcnNpb24uXG5leHBvcnQgeyBTSUdOX09VVF9FVkVOVCwgb25BdGxhc1NpZ25PdXQgfSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmV4cG9ydCB0eXBlIHsgU2lnbk91dEV2ZW50LCBTaWduT3V0UmVhc29uIH0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5leHBvcnQgeyBBVExBU19BTkdVTEFSX1NESywgQVRMQVNfQU5HVUxBUl9WRVJTSU9OIH0gZnJvbSAnLi9saWIvdmVyc2lvbic7XG4iXX0=
@@ -4,7 +4,7 @@ import { isPlatformBrowser, DOCUMENT } from '@angular/common';
4
4
  import { toSignal } from '@angular/core/rxjs-interop';
5
5
  import { BehaviorSubject, Subject, combineLatest, firstValueFrom } from 'rxjs';
6
6
  import { map, distinctUntilChanged, filter, take } from 'rxjs/operators';
7
- import { createOrganizationAuditLog, POLICY_STRINGS, TokenCache, SignOutNotifier, resolveFrontendApi, withDevBrowser, catalogLocale, configureReferralCapture, FapiClient, SignOutGuard, localizedErrorMessage, reauthenticate, getTemplateToken, getProviderToken, signOutReasonFromClient, readRedirectResult, completeOAuthPopupLanding, mapOAuthPopupPayload, stripRedirectParams, closeOAuthPopupAfterSignIn, SDK_HEADER, sdkHeaderValue, reportSdkAdvisory, readExpiry, msUntilRefresh, policyTranslator, injectPolicyStyles, mountPolicyClickwrap, mountPolicyConsent, controllerForPending, mountPolicyAcceptStep, joinTitles, formatPolicyDate, PolicyGateController, groupSetupKey, enrollmentSubmitKey, nextStep, awaitingSignUpLink, canDownloadRecoveryCodes, copyRecoveryCodes, downloadRecoveryCodes, createCaptchaController, atlasCaptchaLabels, PolicyAcceptanceController, flowFromPending, initialFlow, createMfaEnrollment, mfaChoicesFrom, fetchInstanceSettings, fetchLastSignInMethod, offeredFirstFactors, prepareFactor, signInCaptchaOptions, flowNeedsCaptcha, planFirstFactor, advanceWithCaptcha, loadPolicies, createSignUp, prepareSecondFactorCode, resendSignUpVerification, createPasskeySignUp, finishPasskeySignUp, pendingRecoveryCodes, acknowledgeRecoveryCodes, shouldKeepPolling, pollAttempt, lastUsedMethodLabel, signUp, confirmPolicies, passkeysSupported, awaitingPasskey, OrganizationProfileController, describeAuditAction, actorFromClaims } from '@atlasauth/js';
7
+ import { createOrganizationAuditLog, POLICY_STRINGS, TokenCache, SignOutNotifier, resolveFrontendApi, withDevBrowser, catalogLocale, configureReferralCapture, FapiClient, SignOutGuard, localizedErrorMessage, reauthenticate, getTemplateToken, getProviderToken, signOutReasonFromClient, readRedirectResult, completeOAuthPopupLanding, mapOAuthPopupPayload, stripRedirectParams, closeOAuthPopupAfterSignIn, SDK_HEADER, sdkHeaderValue, reportSdkAdvisory, readExpiry, msUntilRefresh, policyTranslator, injectPolicyStyles, mountPolicyClickwrap, mountPolicyConsent, controllerForPending, mountPolicyAcceptStep, joinTitles, formatPolicyDate, PolicyGateController, groupSetupKey, enrollmentSubmitKey, nextStep, awaitingSignUpLink, canDownloadRecoveryCodes, copyRecoveryCodes, downloadRecoveryCodes, createCaptchaController, atlasCaptchaLabels, PolicyAcceptanceController, flowFromPending, initialFlow, createMfaEnrollment, createPasskeySignInController, startSignInWithAtlas, mfaChoicesFrom, fetchInstanceSettings, fetchLastSignInMethod, offeredFirstFactors, prepareFactor, signInCaptchaOptions, flowNeedsCaptcha, planFirstFactor, advanceWithCaptcha, loadPolicies, createSignUp, prepareSecondFactorCode, resendSignUpVerification, createPasskeySignUp, finishPasskeySignUp, pendingRecoveryCodes, acknowledgeRecoveryCodes, shouldKeepPolling, pollAttempt, lastUsedMethodLabel, signUp, passkeysSupported, confirmPolicies, awaitingPasskey, listCibaRequests, getCibaPin, decideCibaRequest, setCibaPin, clearCibaPin, OrganizationProfileController, describeAuditAction, actorFromClaims } from '@atlasauth/js';
8
8
  export { FapiClient, SIGN_OUT_EVENT, SignOutError, advance, flowFromPending, getProviderToken, initialFlow, onAtlasSignOut, pollAttempt, prepareFactor, requestForStep, shouldKeepPolling } from '@atlasauth/js';
9
9
  import { evaluate } from '@atlasauth/authz';
10
10
  export { evaluate, hasFromClaims } from '@atlasauth/authz';
@@ -204,12 +204,15 @@ const EN_US = {
204
204
  'signIn.signUpLink': 'Sign up',
205
205
  'signIn.orDivider': 'or',
206
206
  'signIn.socialButton': 'Continue with {provider}',
207
+ 'signIn.continueWithAtlas': 'Continue with Atlas',
207
208
  'signIn.emailCodeLabel': 'Verification code',
208
209
  'signIn.useEmailCode': 'Email me a code',
209
210
  'signIn.codeSentTo': 'We sent a code to {email}. Enter it below.',
210
211
  'signIn.resendCode': 'Resend code',
211
212
  'signIn.sending': 'Sending…',
212
213
  'signIn.emailCodeOption': 'Email me a code instead',
214
+ 'signIn.passkeyButton': 'Sign in with a passkey',
215
+ 'signIn.passkeyCancelled': "Passkey sign-in didn't finish. Try again, or use another way to sign in.",
213
216
  'signIn.magicLinkSent': 'Check your email for a sign-in link.',
214
217
  'signIn.signedIn': 'You\'re signed in.',
215
218
  'signIn.sessionNotKept': 'You signed in, but this browser didn\'t keep the session. If it blocks third-party cookies, allow cookies for this site and try again.',
@@ -389,7 +392,7 @@ function withFallback(locale) {
389
392
  }
390
393
 
391
394
  /** This package's version, sent as `X-Atlas-SDK` (kept in step with package.json by a test). */
392
- const ATLAS_ANGULAR_VERSION = '0.9.0';
395
+ const ATLAS_ANGULAR_VERSION = '0.13.0';
393
396
  const ATLAS_ANGULAR_SDK = { name: '@atlasauth/angular', version: ATLAS_ANGULAR_VERSION };
394
397
 
395
398
  /**
@@ -1639,7 +1642,8 @@ class AttemptFlowComponent {
1639
1642
  const step = this.step();
1640
1643
  switch (step.kind) {
1641
1644
  case 'collect_identifier':
1642
- return [{ kind: 'input', name: 'identifier', labelKey: 'signIn.identifierLabel', type: 'email' }];
1645
+ // `webauthn`: saved passkeys appear in this field's autofill while <atlas-sign-in> holds a conditional request.
1646
+ return [{ kind: 'input', name: 'identifier', labelKey: 'signIn.identifierLabel', type: 'email', autocomplete: 'username webauthn' }];
1643
1647
  case 'collect_first_factor': {
1644
1648
  if (this.preparedFactor === 'email_code') {
1645
1649
  return [{ kind: 'input', name: 'code', labelKey: 'signIn.emailCodeLabel', type: 'text' }];
@@ -1805,6 +1809,7 @@ class AttemptFlowComponent {
1805
1809
  [class]="cls('formFieldInput', 'atlas-input')"
1806
1810
  [type]="f.type"
1807
1811
  [attr.name]="f.name"
1812
+ [attr.autocomplete]="f.autocomplete ?? null"
1808
1813
  [value]="values[f.name] ?? ''"
1809
1814
  (input)="setValue(f.name, $any($event.target).value)"
1810
1815
  />
@@ -2016,6 +2021,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2016
2021
  [class]="cls('formFieldInput', 'atlas-input')"
2017
2022
  [type]="f.type"
2018
2023
  [attr.name]="f.name"
2024
+ [attr.autocomplete]="f.autocomplete ?? null"
2019
2025
  [value]="values[f.name] ?? ''"
2020
2026
  (input)="setValue(f.name, $any($event.target).value)"
2021
2027
  />
@@ -2341,6 +2347,13 @@ class AtlasFlowController {
2341
2347
  * {@link create} sends their acceptances and reloads them after a refusal.
2342
2348
  */
2343
2349
  policies = new PolicyAcceptanceController([]);
2350
+ /**
2351
+ * Passkey sign-in (the "Sign in with a passkey" button and passkey autofill on
2352
+ * the identifier field). The outcome goes through the same completion as every sign-in.
2353
+ */
2354
+ passkey;
2355
+ /** Whether this browser can run WebAuthn; `<atlas-sign-in>` sets it after it is created in a browser. */
2356
+ passkeySupported = signal(false);
2344
2357
  pollTimer = null;
2345
2358
  identifier = '';
2346
2359
  constructor(client, reload, pending,
@@ -2355,9 +2368,36 @@ class AtlasFlowController {
2355
2368
  this.enrollment = createMfaEnrollment(this.client, () => this.mfaChoices());
2356
2369
  this.enrollmentState = signal(this.enrollment.state);
2357
2370
  this.enrollment.subscribe((next) => this.enrollmentState.set(next));
2371
+ this.passkey = createPasskeySignInController({
2372
+ client: this.client,
2373
+ onStart: () => this.state.update((current) => ({ ...current, busy: true, errors: [] })),
2374
+ onResult: (next) => this.finish(next),
2375
+ captcha: () => this.captcha,
2376
+ cancelledMessage: () => this.t('signIn.passkeyCancelled'),
2377
+ });
2358
2378
  this.syncCaptcha();
2359
2379
  this.syncEnrollment();
2360
2380
  }
2381
+ /** Why "Continue with Atlas" could not start (the server's message); null otherwise. */
2382
+ signInWithAtlasError = signal(null);
2383
+ /**
2384
+ * "Continue with Atlas" (when `settings().signInWithAtlas` is set): starts the
2385
+ * SSO sign-in and sends the browser to Atlas.
2386
+ */
2387
+ async signInWithAtlas(connectionId) {
2388
+ if (typeof window === 'undefined')
2389
+ return;
2390
+ this.signInWithAtlasError.set(null);
2391
+ const started = await startSignInWithAtlas(this.client, connectionId, window.location.href);
2392
+ if ('url' in started)
2393
+ window.location.assign(started.url);
2394
+ else
2395
+ this.signInWithAtlasError.set(started.error);
2396
+ }
2397
+ /** "Sign in with a passkey" is offered: the first step, the instance turned passkey sign-in on, and the browser can. */
2398
+ passkeyOffered() {
2399
+ return this.passkeySupported() && !this.state().attempt && this.settings()?.passkeySignIn === true;
2400
+ }
2361
2401
  /** What the app lets the MFA steps offer (from {@link settings}). */
2362
2402
  mfaChoices() {
2363
2403
  return mfaChoicesFrom(this.settings()?.account);
@@ -2632,6 +2672,7 @@ class AtlasFlowController {
2632
2672
  }
2633
2673
  /** Release the poll timer and the captcha widgets — call from the component's `ngOnDestroy`. */
2634
2674
  destroy() {
2675
+ this.passkey.stopAutofill();
2635
2676
  this.stopPolling();
2636
2677
  this.captcha.destroy();
2637
2678
  this.signUpCaptcha.destroy();
@@ -2667,6 +2708,12 @@ class SignInComponent {
2667
2708
  return null;
2668
2709
  return lastUsedMethodLabel(this.flow.lastMethod(), (key) => this.t(key));
2669
2710
  }
2711
+ /** The "Sign in with Atlas" connection, on the first step, when the instance has it on. */
2712
+ atlasConnection() {
2713
+ if (this.flow.state().attempt || this.flow.recoveryCodes())
2714
+ return null;
2715
+ return this.flow.settings()?.signInWithAtlas?.connectionId ?? null;
2716
+ }
2670
2717
  signUpHref() {
2671
2718
  if (this.signUpUrl === null)
2672
2719
  return null;
@@ -2686,7 +2733,16 @@ class SignInComponent {
2686
2733
  flow = new AtlasFlowController(this.atlas.createFapiClient(), () => this.atlas.reload(),
2687
2734
  // Resume mid-flow if an OAuth redirect came back owing a second factor.
2688
2735
  this.atlas.pendingAttempt, (key) => translate(this.atlas.localization, key));
2736
+ // Passkey autofill runs while the first step offers passkeys (a computed, so it re-arms only when that changes).
2737
+ passkeyOffered = computed(() => this.flow.passkeyOffered());
2738
+ passkeyAutofill = effect(() => (this.passkeyOffered() ? this.flow.passkey.armAutofill() : this.flow.passkey.stopAutofill()));
2739
+ submitIdentifier(values) {
2740
+ this.flow.passkey.stopAutofill();
2741
+ void this.flow.submit(values);
2742
+ }
2689
2743
  ngOnInit() {
2744
+ if (typeof window !== 'undefined')
2745
+ this.flow.passkeySupported.set(passkeysSupported());
2690
2746
  // If seeded from a pending attempt that is already pollable, start polling.
2691
2747
  this.flow.syncPolling();
2692
2748
  // §5 the instance's captcha settings (switching captcha on in the dashboard
@@ -2705,6 +2761,14 @@ class SignInComponent {
2705
2761
  {{ t('signIn.lastUsed') }}: {{ label }}
2706
2762
  </p>
2707
2763
  }
2764
+ @if (atlasConnection(); as connectionId) {
2765
+ <button type="button" class="atlas-social-button" data-atlas-provider="atlas" (click)="flow.signInWithAtlas(connectionId)">
2766
+ {{ t('signIn.continueWithAtlas') }}
2767
+ </button>
2768
+ @if (flow.signInWithAtlasError(); as message) {
2769
+ <p class="atlas-error" role="alert">{{ message }}</p>
2770
+ }
2771
+ }
2708
2772
  @if (flow.recoveryCodes(); as codes) {
2709
2773
  <atlas-recovery-codes [codes]="codes" [busy]="flow.state().busy" (saved)="flow.saveRecoveryCodes()"></atlas-recovery-codes>
2710
2774
  } @else {
@@ -2719,7 +2783,7 @@ class SignInComponent {
2719
2783
  [preparedFactor]="flow.preparedFactor()"
2720
2784
  [offerEmailSecondFactor]="flow.settings()?.account?.emailSecondFactor === true"
2721
2785
  [emailedSecondFactor]="flow.emailSecondFactor()"
2722
- (submitFlow)="flow.submit($event)"
2786
+ (submitFlow)="submitIdentifier($event)"
2723
2787
  (chooseFactor)="flow.prepare($event)"
2724
2788
  [offerSmsSecondFactor]="flow.settings() !== null && flow.mfaChoices().sms"
2725
2789
  [textedSecondFactor]="flow.smsSecondFactor()"
@@ -2730,6 +2794,17 @@ class SignInComponent {
2730
2794
  (policyDeclined)="flow.declinePolicy($event)"
2731
2795
  ></atlas-attempt-flow>
2732
2796
  }
2797
+ @if (flow.passkeyOffered() && !flow.recoveryCodes()) {
2798
+ <button
2799
+ type="button"
2800
+ class="atlas-social-button atlas-passkey-button"
2801
+ data-atlas-passkey-sign-in=""
2802
+ [disabled]="flow.state().busy"
2803
+ (click)="flow.passkey.signIn()"
2804
+ >
2805
+ {{ t('signIn.passkeyButton') }}
2806
+ </button>
2807
+ }
2733
2808
  @if (flow.state().attempt?.status !== 'complete' && signUpHref(); as href) {
2734
2809
  <p class="atlas-footer" data-atlas-sign-up-prompt="">
2735
2810
  {{ t('signIn.noAccount') }} <a class="atlas-link" [href]="href">{{ t('signIn.signUpLink') }}</a>
@@ -2750,6 +2825,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2750
2825
  {{ t('signIn.lastUsed') }}: {{ label }}
2751
2826
  </p>
2752
2827
  }
2828
+ @if (atlasConnection(); as connectionId) {
2829
+ <button type="button" class="atlas-social-button" data-atlas-provider="atlas" (click)="flow.signInWithAtlas(connectionId)">
2830
+ {{ t('signIn.continueWithAtlas') }}
2831
+ </button>
2832
+ @if (flow.signInWithAtlasError(); as message) {
2833
+ <p class="atlas-error" role="alert">{{ message }}</p>
2834
+ }
2835
+ }
2753
2836
  @if (flow.recoveryCodes(); as codes) {
2754
2837
  <atlas-recovery-codes [codes]="codes" [busy]="flow.state().busy" (saved)="flow.saveRecoveryCodes()"></atlas-recovery-codes>
2755
2838
  } @else {
@@ -2764,7 +2847,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2764
2847
  [preparedFactor]="flow.preparedFactor()"
2765
2848
  [offerEmailSecondFactor]="flow.settings()?.account?.emailSecondFactor === true"
2766
2849
  [emailedSecondFactor]="flow.emailSecondFactor()"
2767
- (submitFlow)="flow.submit($event)"
2850
+ (submitFlow)="submitIdentifier($event)"
2768
2851
  (chooseFactor)="flow.prepare($event)"
2769
2852
  [offerSmsSecondFactor]="flow.settings() !== null && flow.mfaChoices().sms"
2770
2853
  [textedSecondFactor]="flow.smsSecondFactor()"
@@ -2775,6 +2858,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2775
2858
  (policyDeclined)="flow.declinePolicy($event)"
2776
2859
  ></atlas-attempt-flow>
2777
2860
  }
2861
+ @if (flow.passkeyOffered() && !flow.recoveryCodes()) {
2862
+ <button
2863
+ type="button"
2864
+ class="atlas-social-button atlas-passkey-button"
2865
+ data-atlas-passkey-sign-in=""
2866
+ [disabled]="flow.state().busy"
2867
+ (click)="flow.passkey.signIn()"
2868
+ >
2869
+ {{ t('signIn.passkeyButton') }}
2870
+ </button>
2871
+ }
2778
2872
  @if (flow.state().attempt?.status !== 'complete' && signUpHref(); as href) {
2779
2873
  <p class="atlas-footer" data-atlas-sign-up-prompt="">
2780
2874
  {{ t('signIn.noAccount') }} <a class="atlas-link" [href]="href">{{ t('signIn.signUpLink') }}</a>
@@ -3647,6 +3741,151 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3647
3741
  }]
3648
3742
  }] });
3649
3743
 
3744
+ /**
3745
+ * `<atlas-manage-ciba>` — sign-in requests apps start on the user's behalf (CIBA), with approve and deny, and
3746
+ * the optional CIBA PIN apps must send as the user code. The Angular peer of React's `<ManageCiba/>`. Renders
3747
+ * nothing when there is no request, no PIN and no app that could ask.
3748
+ */
3749
+ class ManageCibaComponent {
3750
+ atlas = inject(AtlasService);
3751
+ requests = signal([]);
3752
+ pin = signal(null);
3753
+ newPin = signal('');
3754
+ password = signal('');
3755
+ message = signal(null);
3756
+ client = this.atlas.createFapiClient();
3757
+ ngOnInit() {
3758
+ void this.load();
3759
+ }
3760
+ async load() {
3761
+ const [r, p] = await Promise.all([listCibaRequests(this.client).catch(() => []), getCibaPin(this.client).catch(() => null)]);
3762
+ this.requests.set(r);
3763
+ this.pin.set(p);
3764
+ }
3765
+ async run(fn, fallback) {
3766
+ this.message.set(null);
3767
+ try {
3768
+ await fn();
3769
+ this.newPin.set('');
3770
+ this.password.set('');
3771
+ await this.load();
3772
+ }
3773
+ catch (e) {
3774
+ this.message.set(e instanceof Error && e.message ? e.message : fallback);
3775
+ }
3776
+ }
3777
+ decide(id, decision) {
3778
+ return this.run(() => decideCibaRequest(this.client, id, decision), decision === 'approve' ? 'Could not approve.' : 'Could not deny.');
3779
+ }
3780
+ save(event) {
3781
+ event.preventDefault();
3782
+ return this.run(() => setCibaPin(this.client, { pin: this.newPin(), currentPassword: this.password() }), 'Could not save the PIN.');
3783
+ }
3784
+ remove() {
3785
+ return this.run(() => clearCibaPin(this.client, { currentPassword: this.password() }), 'Could not remove the PIN.');
3786
+ }
3787
+ cls(key, base) {
3788
+ return classFor(key, this.atlas.appearance, base);
3789
+ }
3790
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ManageCibaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3791
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ManageCibaComponent, isStandalone: true, selector: "atlas-manage-ciba", ngImport: i0, template: `
3792
+ @if (requests().length || (pin() && (pin()!.set || pin()!.available))) {
3793
+ <section [class]="cls('card', 'atlas-card')" data-atlas="manage-ciba">
3794
+ @if (requests().length) {
3795
+ <h2>Sign-in requests from apps</h2>
3796
+ <ul>
3797
+ @for (r of requests(); track r.id) {
3798
+ <li>
3799
+ <strong>{{ r.client_name }}</strong>
3800
+ @if (r.binding_message) {
3801
+ <div>{{ r.binding_message }}</div>
3802
+ }
3803
+ <small>{{ r.scope.join(', ') }}</small>
3804
+ <button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" (click)="decide(r.id, 'approve')">Approve</button>
3805
+ <button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" (click)="decide(r.id, 'deny')">Deny</button>
3806
+ </li>
3807
+ }
3808
+ </ul>
3809
+ }
3810
+ @if (pin(); as p) {
3811
+ @if (p.set || p.available) {
3812
+ <form (submit)="save($event)">
3813
+ <h2>CIBA PIN</h2>
3814
+ <p>{{ p.set ? 'You have a CIBA PIN.' : 'You have not set a CIBA PIN.' }} Apps that start a sign-in request for you must send it.</p>
3815
+ <input type="password" autocomplete="current-password" placeholder="Current password" aria-label="Current password" [value]="password()" (input)="password.set($any($event.target).value)" />
3816
+ <input type="password" inputmode="numeric" autocomplete="off" placeholder="6 to 12 digits" aria-label="New CIBA PIN" [value]="newPin()" (input)="newPin.set($any($event.target).value)" />
3817
+ <button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="submit">{{ p.set ? 'Change PIN' : 'Set PIN' }}</button>
3818
+ @if (p.set) {
3819
+ <button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" (click)="remove()">Remove PIN</button>
3820
+ }
3821
+ @if (message(); as m) {
3822
+ <small role="status">{{ m }}</small>
3823
+ }
3824
+ </form>
3825
+ }
3826
+ }
3827
+ @if (message(); as m) {
3828
+ @if (!pin() || !(pin()!.set || pin()!.available)) {
3829
+ <small role="status">{{ m }}</small>
3830
+ }
3831
+ }
3832
+ </section>
3833
+ }
3834
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
3835
+ }
3836
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ManageCibaComponent, decorators: [{
3837
+ type: Component,
3838
+ args: [{
3839
+ selector: 'atlas-manage-ciba',
3840
+ standalone: true,
3841
+ changeDetection: ChangeDetectionStrategy.OnPush,
3842
+ template: `
3843
+ @if (requests().length || (pin() && (pin()!.set || pin()!.available))) {
3844
+ <section [class]="cls('card', 'atlas-card')" data-atlas="manage-ciba">
3845
+ @if (requests().length) {
3846
+ <h2>Sign-in requests from apps</h2>
3847
+ <ul>
3848
+ @for (r of requests(); track r.id) {
3849
+ <li>
3850
+ <strong>{{ r.client_name }}</strong>
3851
+ @if (r.binding_message) {
3852
+ <div>{{ r.binding_message }}</div>
3853
+ }
3854
+ <small>{{ r.scope.join(', ') }}</small>
3855
+ <button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" (click)="decide(r.id, 'approve')">Approve</button>
3856
+ <button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" (click)="decide(r.id, 'deny')">Deny</button>
3857
+ </li>
3858
+ }
3859
+ </ul>
3860
+ }
3861
+ @if (pin(); as p) {
3862
+ @if (p.set || p.available) {
3863
+ <form (submit)="save($event)">
3864
+ <h2>CIBA PIN</h2>
3865
+ <p>{{ p.set ? 'You have a CIBA PIN.' : 'You have not set a CIBA PIN.' }} Apps that start a sign-in request for you must send it.</p>
3866
+ <input type="password" autocomplete="current-password" placeholder="Current password" aria-label="Current password" [value]="password()" (input)="password.set($any($event.target).value)" />
3867
+ <input type="password" inputmode="numeric" autocomplete="off" placeholder="6 to 12 digits" aria-label="New CIBA PIN" [value]="newPin()" (input)="newPin.set($any($event.target).value)" />
3868
+ <button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="submit">{{ p.set ? 'Change PIN' : 'Set PIN' }}</button>
3869
+ @if (p.set) {
3870
+ <button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" (click)="remove()">Remove PIN</button>
3871
+ }
3872
+ @if (message(); as m) {
3873
+ <small role="status">{{ m }}</small>
3874
+ }
3875
+ </form>
3876
+ }
3877
+ }
3878
+ @if (message(); as m) {
3879
+ @if (!pin() || !(pin()!.set || pin()!.available)) {
3880
+ <small role="status">{{ m }}</small>
3881
+ }
3882
+ }
3883
+ </section>
3884
+ }
3885
+ `,
3886
+ }]
3887
+ }] });
3888
+
3650
3889
  /**
3651
3890
  * `<atlas-user-profile>` — the signed-in user's account surface (emails,
3652
3891
  * security). The Angular peer of React's `<UserProfile/>`. Renders nothing when
@@ -3753,15 +3992,18 @@ class UserProfileComponent {
3753
3992
  <h2>{{ t('userProfile.securitySection') }}</h2>
3754
3993
  <p>{{ user.mfa_enabled ? '2FA on' : '2FA off' }}</p>
3755
3994
  </section>
3995
+
3996
+ <atlas-manage-ciba />
3756
3997
  </div>
3757
3998
  }
3758
- `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
3999
+ `, isInline: true, dependencies: [{ kind: "component", type: ManageCibaComponent, selector: "atlas-manage-ciba" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3759
4000
  }
3760
4001
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UserProfileComponent, decorators: [{
3761
4002
  type: Component,
3762
4003
  args: [{
3763
4004
  selector: 'atlas-user-profile',
3764
4005
  standalone: true,
4006
+ imports: [ManageCibaComponent],
3765
4007
  changeDetection: ChangeDetectionStrategy.OnPush,
3766
4008
  template: `
3767
4009
  @if (atlas.user(); as user) {
@@ -3818,6 +4060,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3818
4060
  <h2>{{ t('userProfile.securitySection') }}</h2>
3819
4061
  <p>{{ user.mfa_enabled ? '2FA on' : '2FA off' }}</p>
3820
4062
  </section>
4063
+
4064
+ <atlas-manage-ciba />
3821
4065
  </div>
3822
4066
  }
3823
4067
  `,
@@ -4582,6 +4826,7 @@ const ATLAS_UI = [
4582
4826
  UserProfileComponent,
4583
4827
  OrganizationProfileComponent,
4584
4828
  OrganizationAuditLogComponent,
4829
+ ManageCibaComponent,
4585
4830
  AtlasPoliciesDirective,
4586
4831
  PolicyAcceptStepComponent,
4587
4832
  PolicyGateComponent,
@@ -4642,7 +4887,7 @@ class AtlasModule {
4642
4887
  return { ngModule: AtlasModule, providers };
4643
4888
  }
4644
4889
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AtlasModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
4645
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: AtlasModule, imports: [AtlasSignedInDirective, AtlasSignedOutDirective, AtlasLoadingDirective, AtlasLoadedDirective, AtlasProtectDirective, AtlasRootDirective, SignInComponent, SignUpComponent, UserButtonComponent, OrganizationSwitcherComponent, UserProfileComponent, OrganizationProfileComponent, OrganizationAuditLogComponent, AtlasPoliciesDirective, PolicyAcceptStepComponent, PolicyGateComponent], exports: [AtlasSignedInDirective, AtlasSignedOutDirective, AtlasLoadingDirective, AtlasLoadedDirective, AtlasProtectDirective, AtlasRootDirective, SignInComponent, SignUpComponent, UserButtonComponent, OrganizationSwitcherComponent, UserProfileComponent, OrganizationProfileComponent, OrganizationAuditLogComponent, AtlasPoliciesDirective, PolicyAcceptStepComponent, PolicyGateComponent] });
4890
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: AtlasModule, imports: [AtlasSignedInDirective, AtlasSignedOutDirective, AtlasLoadingDirective, AtlasLoadedDirective, AtlasProtectDirective, AtlasRootDirective, SignInComponent, SignUpComponent, UserButtonComponent, OrganizationSwitcherComponent, UserProfileComponent, OrganizationProfileComponent, OrganizationAuditLogComponent, ManageCibaComponent, AtlasPoliciesDirective, PolicyAcceptStepComponent, PolicyGateComponent], exports: [AtlasSignedInDirective, AtlasSignedOutDirective, AtlasLoadingDirective, AtlasLoadedDirective, AtlasProtectDirective, AtlasRootDirective, SignInComponent, SignUpComponent, UserButtonComponent, OrganizationSwitcherComponent, UserProfileComponent, OrganizationProfileComponent, OrganizationAuditLogComponent, ManageCibaComponent, AtlasPoliciesDirective, PolicyAcceptStepComponent, PolicyGateComponent] });
4646
4891
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AtlasModule });
4647
4892
  }
4648
4893
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AtlasModule, decorators: [{
@@ -4803,5 +5048,5 @@ function atlasChildGuard(options = {}) {
4803
5048
  * Generated bundle index. Do not edit.
4804
5049
  */
4805
5050
 
4806
- export { ATLAS_ANGULAR_SDK, ATLAS_ANGULAR_VERSION, ATLAS_OPTIONS, ATLAS_UI, AtlasCaptchaSlotDirective, AtlasFlowController, AtlasLoadedDirective, AtlasLoadingDirective, AtlasModule, AtlasOrganizationAuditLog, AtlasPoliciesDirective, AtlasProtectDirective, AtlasRootDirective, AtlasService, AtlasSignedInDirective, AtlasSignedOutDirective, AttemptFlowComponent, DEFAULT_TOKENS, EN_US, ImpersonationBannerComponent, OrganizationAuditLogComponent, OrganizationProfileComponent, OrganizationSwitcherComponent, PolicyAcceptStepComponent, PolicyGateComponent, SignInComponent, SignUpComponent, SignUpFormComponent, THEMES, UserButtonComponent, UserProfileComponent, atlasChildGuard, atlasGuard, classFor, cssVariables, explicitTokens, provideAtlas, renderAppearance, resolveTokens, translate, withFallback };
5051
+ export { ATLAS_ANGULAR_SDK, ATLAS_ANGULAR_VERSION, ATLAS_OPTIONS, ATLAS_UI, AtlasCaptchaSlotDirective, AtlasFlowController, AtlasLoadedDirective, AtlasLoadingDirective, AtlasModule, AtlasOrganizationAuditLog, AtlasPoliciesDirective, AtlasProtectDirective, AtlasRootDirective, AtlasService, AtlasSignedInDirective, AtlasSignedOutDirective, AttemptFlowComponent, DEFAULT_TOKENS, EN_US, ImpersonationBannerComponent, ManageCibaComponent, OrganizationAuditLogComponent, OrganizationProfileComponent, OrganizationSwitcherComponent, PolicyAcceptStepComponent, PolicyGateComponent, SignInComponent, SignUpComponent, SignUpFormComponent, THEMES, UserButtonComponent, UserProfileComponent, atlasChildGuard, atlasGuard, classFor, cssVariables, explicitTokens, provideAtlas, renderAppearance, resolveTokens, translate, withFallback };
4807
5052
  //# sourceMappingURL=atlasauth-angular.mjs.map