@happyvertical/smrt-users 0.55.9 → 0.55.11

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 (46) hide show
  1. package/README.md +42 -0
  2. package/agents/permissions.md +3 -0
  3. package/dist/chunks/{TerminalAuthService-DoU-2Dg7.js → TerminalAuthService-C18-gEUt.js} +521 -517
  4. package/dist/chunks/TerminalAuthService-C18-gEUt.js.map +1 -0
  5. package/dist/collections/RolePermissionCollection.d.ts.map +1 -1
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +199 -105
  9. package/dist/index.js.map +1 -1
  10. package/dist/manifest.json +142 -1
  11. package/dist/recipes.d.ts +97 -0
  12. package/dist/recipes.d.ts.map +1 -0
  13. package/dist/smrt-knowledge.json +146 -5
  14. package/dist/svelte/auth.d.ts +69 -0
  15. package/dist/svelte/auth.d.ts.map +1 -0
  16. package/dist/svelte/auth.js +43 -0
  17. package/dist/svelte/components/AccountSecurityPanel.svelte +42 -0
  18. package/dist/svelte/components/AccountSecurityPanel.svelte.d.ts +14 -0
  19. package/dist/svelte/components/AccountSecurityPanel.svelte.d.ts.map +1 -0
  20. package/dist/svelte/components/MagicLinkForm.svelte +43 -0
  21. package/dist/svelte/components/MagicLinkForm.svelte.d.ts +14 -0
  22. package/dist/svelte/components/MagicLinkForm.svelte.d.ts.map +1 -0
  23. package/dist/svelte/components/OidcProviderButtons.svelte +28 -0
  24. package/dist/svelte/components/OidcProviderButtons.svelte.d.ts +12 -0
  25. package/dist/svelte/components/OidcProviderButtons.svelte.d.ts.map +1 -0
  26. package/dist/svelte/components/PasskeySignInButton.svelte +28 -0
  27. package/dist/svelte/components/PasskeySignInButton.svelte.d.ts +12 -0
  28. package/dist/svelte/components/PasskeySignInButton.svelte.d.ts.map +1 -0
  29. package/dist/svelte/components/SignInForm.svelte +43 -0
  30. package/dist/svelte/components/SignInForm.svelte.d.ts +14 -0
  31. package/dist/svelte/components/SignInForm.svelte.d.ts.map +1 -0
  32. package/dist/svelte/components/SignUpForm.svelte +38 -0
  33. package/dist/svelte/components/SignUpForm.svelte.d.ts +12 -0
  34. package/dist/svelte/components/SignUpForm.svelte.d.ts.map +1 -0
  35. package/dist/svelte/i18n.d.ts +33 -0
  36. package/dist/svelte/i18n.d.ts.map +1 -1
  37. package/dist/svelte/i18n.js +33 -0
  38. package/dist/svelte/index.d.ts +15 -1
  39. package/dist/svelte/index.d.ts.map +1 -1
  40. package/dist/svelte/index.js +14 -1
  41. package/dist/sveltekit.js +1 -1
  42. package/dist/ui.d.ts.map +1 -1
  43. package/dist/ui.js +54 -0
  44. package/dist/ui.js.map +1 -1
  45. package/package.json +9 -9
  46. package/dist/chunks/TerminalAuthService-DoU-2Dg7.js.map +0 -1
@@ -0,0 +1,14 @@
1
+ import type { AccountApiKey, AccountSession, UsersAuthAdapter } from '../auth.js';
2
+ import '../auth.js';
3
+ export interface Props {
4
+ /** Authorized server-side revocation callbacks. */
5
+ adapter: UsersAuthAdapter;
6
+ /** Sanitized sessions owned by the current account. */
7
+ sessions?: AccountSession[];
8
+ /** Sanitized API-key metadata owned by the current account. */
9
+ apiKeys?: AccountApiKey[];
10
+ }
11
+ declare const AccountSecurityPanel: import("svelte").Component<Props, {}, "">;
12
+ type AccountSecurityPanel = ReturnType<typeof AccountSecurityPanel>;
13
+ export default AccountSecurityPanel;
14
+ //# sourceMappingURL=AccountSecurityPanel.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccountSecurityPanel.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/AccountSecurityPanel.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,YAAY,CAAC;AAEpB,MAAM,WAAW,KAAK;IACpB,mDAAmD;IACnD,OAAO,EAAE,gBAAgB,CAAC;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,+DAA+D;IAC/D,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B;AAmCD,QAAA,MAAM,oBAAoB,2CAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,43 @@
1
+ <script lang="ts">
2
+ import { Form, Input } from '@happyvertical/smrt-ui/forms';
3
+ import { useI18n } from '@happyvertical/smrt-ui/i18n';
4
+ import { Button } from '@happyvertical/smrt-ui/ui';
5
+ import type { UsersAuthAdapter } from '../auth.js';
6
+ import '../auth.js';
7
+ export interface Props {
8
+ /** Authorized browser-to-server authentication callbacks. */
9
+ adapter: UsersAuthAdapter;
10
+ /** Opaque link token to confirm; omit it to request a link. */
11
+ token?: string;
12
+ /** Blocks controls while the host action is pending. */
13
+ loading?: boolean;
14
+ }
15
+ let { adapter, token = '', loading = false }: Props = $props();
16
+ const { t } = useI18n();
17
+ let email = $state('');
18
+ let error = $state('');
19
+ let notice = $state('');
20
+ let pending = $state(false);
21
+ async function submit() {
22
+ error = '';
23
+ notice = '';
24
+ pending = true;
25
+ try {
26
+ if (token) {
27
+ if (!adapter.confirmMagicLink) return;
28
+ await adapter.confirmMagicLink({ token });
29
+ notice = 'users.auth.link_confirmed';
30
+ } else {
31
+ if (!adapter.requestMagicLink) return;
32
+ await adapter.requestMagicLink({ email });
33
+ notice = 'users.auth.link_sent';
34
+ }
35
+ } catch {
36
+ error = 'users.auth.unable_to_continue_link';
37
+ } finally {
38
+ pending = false;
39
+ }
40
+ }
41
+ </script>
42
+ <Form class="auth-form" onsubmit={submit} aria-busy={loading||pending}><h2>{token ? t('users.auth.confirm_sign_in_link') : t('users.auth.email_sign_in_link')}</h2>{#if error}<p class="error" role="alert">{t(error)}</p>{/if}{#if notice}<p class="notice" role="status">{t(notice)}</p>{/if}{#if !token}<label for="magic-link-email">{t('users.auth.email_address')}</label><Input id="magic-link-email" type="email" bind:value={email} autocomplete="email" required disabled={loading||pending}/>{/if}<Button type="submit" fullWidth disabled={loading || (token ? !adapter.confirmMagicLink : !adapter.requestMagicLink)} loading={pending}>{token ? t('users.auth.confirm_sign_in') : t('users.auth.send_sign_in_link')}</Button></Form>
43
+ <style>:global(.auth-form){display:grid;gap:var(--smrt-spacing-sm,.5rem);color:var(--smrt-color-on-surface)}h2{margin:0;font:var(--smrt-typography-title-large-font)}label{font:var(--smrt-typography-label-large-font)}.error,.notice{margin:0;padding:var(--smrt-spacing-sm,.5rem);border-radius:var(--smrt-radius-sm,.25rem)}.error{background:var(--smrt-color-error-container);color:var(--smrt-color-on-error-container)}.notice{background:var(--smrt-color-primary-container);color:var(--smrt-color-on-primary-container)}</style>
@@ -0,0 +1,14 @@
1
+ import type { UsersAuthAdapter } from '../auth.js';
2
+ import '../auth.js';
3
+ export interface Props {
4
+ /** Authorized browser-to-server authentication callbacks. */
5
+ adapter: UsersAuthAdapter;
6
+ /** Opaque link token to confirm; omit it to request a link. */
7
+ token?: string;
8
+ /** Blocks controls while the host action is pending. */
9
+ loading?: boolean;
10
+ }
11
+ declare const MagicLinkForm: import("svelte").Component<Props, {}, "">;
12
+ type MagicLinkForm = ReturnType<typeof MagicLinkForm>;
13
+ export default MagicLinkForm;
14
+ //# sourceMappingURL=MagicLinkForm.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MagicLinkForm.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/MagicLinkForm.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,YAAY,CAAC;AAEpB,MAAM,WAAW,KAAK;IACpB,6DAA6D;IAC7D,OAAO,EAAE,gBAAgB,CAAC;IAC1B,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAwCD,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -0,0 +1,28 @@
1
+ <script lang="ts">import { useI18n } from '@happyvertical/smrt-ui/i18n';
2
+ import { Button } from '@happyvertical/smrt-ui/ui';
3
+ import type { OidcProviderButton, UsersAuthAdapter } from '../auth.js';
4
+ import '../auth.js';
5
+ export interface Props {
6
+ /** Authorized browser-to-server authentication callbacks. */
7
+ adapter: UsersAuthAdapter;
8
+ /** Providers explicitly configured by the host. */
9
+ providers: OidcProviderButton[];
10
+ }
11
+ let { adapter, providers }: Props = $props();
12
+ const { t } = useI18n();
13
+ let error = $state('');
14
+ let pending = $state<string | null>(null);
15
+ async function signIn(providerId: string) {
16
+ if (!adapter.signInWithOidc) return;
17
+ error = '';
18
+ pending = providerId;
19
+ try {
20
+ await adapter.signInWithOidc({ providerId });
21
+ } catch {
22
+ error = 'users.auth.unable_to_start_sso';
23
+ } finally {
24
+ pending = null;
25
+ }
26
+ }
27
+ </script>
28
+ <section aria-label={t('users.auth.single_sign_on')}><h2>{t('users.auth.or_continue_with')}</h2>{#if error}<p class="error" role="alert">{t(error)}</p>{/if}<div class="providers">{#each providers as provider (provider.id)}<Button variant="secondary" fullWidth onclick={()=>signIn(provider.id)} disabled={provider.disabled||!adapter.signInWithOidc} loading={pending===provider.id}>{provider.label}</Button>{/each}</div></section><style>section{display:grid;gap:var(--smrt-spacing-sm,.5rem)}h2{margin:0;font:var(--smrt-typography-title-small-font)}.providers{display:grid;gap:var(--smrt-spacing-sm,.5rem)}.error{margin:0;color:var(--smrt-color-error)}</style>
@@ -0,0 +1,12 @@
1
+ import type { OidcProviderButton, UsersAuthAdapter } from '../auth.js';
2
+ import '../auth.js';
3
+ export interface Props {
4
+ /** Authorized browser-to-server authentication callbacks. */
5
+ adapter: UsersAuthAdapter;
6
+ /** Providers explicitly configured by the host. */
7
+ providers: OidcProviderButton[];
8
+ }
9
+ declare const OidcProviderButtons: import("svelte").Component<Props, {}, "">;
10
+ type OidcProviderButtons = ReturnType<typeof OidcProviderButtons>;
11
+ export default OidcProviderButtons;
12
+ //# sourceMappingURL=OidcProviderButtons.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OidcProviderButtons.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/OidcProviderButtons.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,YAAY,CAAC;AAEpB,MAAM,WAAW,KAAK;IACpB,6DAA6D;IAC7D,OAAO,EAAE,gBAAgB,CAAC;IAC1B,mDAAmD;IACnD,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AA2BD,QAAA,MAAM,mBAAmB,2CAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,28 @@
1
+ <script lang="ts">import { useI18n } from '@happyvertical/smrt-ui/i18n';
2
+ import { Button } from '@happyvertical/smrt-ui/ui';
3
+ import type { UsersAuthAdapter } from '../auth.js';
4
+ import '../auth.js';
5
+ export interface Props {
6
+ /** Authorized browser-to-server authentication callbacks. */
7
+ adapter: UsersAuthAdapter;
8
+ /** Visible text for the capability-gated control. */
9
+ label?: string;
10
+ }
11
+ let { adapter, label }: Props = $props();
12
+ const { t } = useI18n();
13
+ let error = $state('');
14
+ let pending = $state(false);
15
+ async function signIn() {
16
+ if (!adapter.signInWithPasskey) return;
17
+ error = '';
18
+ pending = true;
19
+ try {
20
+ await adapter.signInWithPasskey();
21
+ } catch {
22
+ error = 'users.auth.passkey_not_completed';
23
+ } finally {
24
+ pending = false;
25
+ }
26
+ }
27
+ </script>
28
+ {#if adapter.signInWithPasskey}<div class="passkey"><Button variant="secondary" fullWidth onclick={signIn} loading={pending}>{label ?? t('users.auth.passkey_sign_in')}</Button>{#if error}<p role="alert">{t(error)}</p>{/if}</div>{/if}<style>.passkey{display:grid;gap:var(--smrt-spacing-sm,.5rem)}p{margin:0;color:var(--smrt-color-error)}</style>
@@ -0,0 +1,12 @@
1
+ import type { UsersAuthAdapter } from '../auth.js';
2
+ import '../auth.js';
3
+ export interface Props {
4
+ /** Authorized browser-to-server authentication callbacks. */
5
+ adapter: UsersAuthAdapter;
6
+ /** Visible text for the capability-gated control. */
7
+ label?: string;
8
+ }
9
+ declare const PasskeySignInButton: import("svelte").Component<Props, {}, "">;
10
+ type PasskeySignInButton = ReturnType<typeof PasskeySignInButton>;
11
+ export default PasskeySignInButton;
12
+ //# sourceMappingURL=PasskeySignInButton.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasskeySignInButton.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/PasskeySignInButton.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,YAAY,CAAC;AAEpB,MAAM,WAAW,KAAK;IACpB,6DAA6D;IAC7D,OAAO,EAAE,gBAAgB,CAAC;IAC1B,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA2BD,QAAA,MAAM,mBAAmB,2CAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,43 @@
1
+ <script lang="ts">
2
+ import { Form, Input } from '@happyvertical/smrt-ui/forms';
3
+ import { useI18n } from '@happyvertical/smrt-ui/i18n';
4
+ import { Button } from '@happyvertical/smrt-ui/ui';
5
+ import type { UsersAuthAdapter } from '../auth.js';
6
+ import '../auth.js';
7
+
8
+ export interface Props {
9
+ /** Authorized browser-to-server authentication callbacks. */
10
+ adapter: UsersAuthAdapter;
11
+ /** Blocks controls while the host action is pending. */
12
+ loading?: boolean;
13
+ /** Optional password recovery destination. */
14
+ forgotPasswordHref?: string;
15
+ }
16
+ let { adapter, loading = false, forgotPasswordHref }: Props = $props();
17
+ const { t } = useI18n();
18
+ let email = $state('');
19
+ let password = $state('');
20
+ let error = $state('');
21
+ let pending = $state(false);
22
+ async function submit() {
23
+ error = '';
24
+ if (!adapter.signInWithPassword) return;
25
+ pending = true;
26
+ try {
27
+ await adapter.signInWithPassword({ email, password });
28
+ } catch {
29
+ error = 'users.auth.unable_to_sign_in';
30
+ } finally {
31
+ pending = false;
32
+ }
33
+ }
34
+ </script>
35
+ <Form class="auth-form" onsubmit={submit} aria-busy={loading || pending}>
36
+ <h2>{t('users.auth.sign_in')}</h2>
37
+ {#if error}<p class="error" role="alert">{t(error)}</p>{/if}
38
+ <label for="sign-in-email">{t('users.auth.email_address')}</label><Input id="sign-in-email" type="email" bind:value={email} autocomplete="email" required disabled={loading || pending} />
39
+ <label for="sign-in-password">{t('users.auth.password')}</label><Input id="sign-in-password" type="password" bind:value={password} autocomplete="current-password" required disabled={loading || pending} />
40
+ {#if forgotPasswordHref}<Button href={forgotPasswordHref} variant="ghost">{t('users.auth.forgot_password')}</Button>{/if}
41
+ <Button type="submit" fullWidth disabled={!adapter.signInWithPassword || loading} loading={pending}>{t('users.auth.sign_in')}</Button>
42
+ </Form>
43
+ <style>:global(.auth-form){display:grid;gap:var(--smrt-spacing-sm,.5rem);color:var(--smrt-color-on-surface)}h2{margin:0;font:var(--smrt-typography-title-large-font)}label{font:var(--smrt-typography-label-large-font)}.error{margin:0;padding:var(--smrt-spacing-sm,.5rem);border-radius:var(--smrt-radius-sm,.25rem);background:var(--smrt-color-error-container);color:var(--smrt-color-on-error-container)}</style>
@@ -0,0 +1,14 @@
1
+ import type { UsersAuthAdapter } from '../auth.js';
2
+ import '../auth.js';
3
+ export interface Props {
4
+ /** Authorized browser-to-server authentication callbacks. */
5
+ adapter: UsersAuthAdapter;
6
+ /** Blocks controls while the host action is pending. */
7
+ loading?: boolean;
8
+ /** Optional password recovery destination. */
9
+ forgotPasswordHref?: string;
10
+ }
11
+ declare const SignInForm: import("svelte").Component<Props, {}, "">;
12
+ type SignInForm = ReturnType<typeof SignInForm>;
13
+ export default SignInForm;
14
+ //# sourceMappingURL=SignInForm.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignInForm.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/SignInForm.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,YAAY,CAAC;AAGpB,MAAM,WAAW,KAAK;IACpB,6DAA6D;IAC7D,OAAO,EAAE,gBAAgB,CAAC;IAC1B,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8CAA8C;IAC9C,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAuCD,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -0,0 +1,38 @@
1
+ <script lang="ts">
2
+ import { Form, Input } from '@happyvertical/smrt-ui/forms';
3
+ import { useI18n } from '@happyvertical/smrt-ui/i18n';
4
+ import { Button } from '@happyvertical/smrt-ui/ui';
5
+ import type { UsersAuthAdapter } from '../auth.js';
6
+ import '../auth.js';
7
+ export interface Props {
8
+ /** Authorized browser-to-server authentication callbacks. */
9
+ adapter: UsersAuthAdapter;
10
+ /** Blocks controls while the host action is pending. */
11
+ loading?: boolean;
12
+ }
13
+ let { adapter, loading = false }: Props = $props();
14
+ const { t } = useI18n();
15
+ let email = $state('');
16
+ let password = $state('');
17
+ let confirm = $state('');
18
+ let error = $state('');
19
+ let pending = $state(false);
20
+ async function submit() {
21
+ error = '';
22
+ if (password !== confirm) {
23
+ error = 'users.auth.passwords_do_not_match';
24
+ return;
25
+ }
26
+ if (!adapter.signUp) return;
27
+ pending = true;
28
+ try {
29
+ await adapter.signUp({ email, password });
30
+ } catch {
31
+ error = 'users.auth.unable_to_create_account';
32
+ } finally {
33
+ pending = false;
34
+ }
35
+ }
36
+ </script>
37
+ <Form class="auth-form" onsubmit={submit} aria-busy={loading||pending}><h2>{t('users.auth.create_account')}</h2>{#if error}<p class="error" role="alert">{t(error)}</p>{/if}<label for="sign-up-email">{t('users.auth.email_address')}</label><Input id="sign-up-email" type="email" bind:value={email} autocomplete="email" required disabled={loading||pending}/><label for="sign-up-password">{t('users.auth.password')}</label><Input id="sign-up-password" type="password" bind:value={password} autocomplete="new-password" required disabled={loading||pending}/><label for="sign-up-confirm">{t('users.auth.confirm_password')}</label><Input id="sign-up-confirm" type="password" bind:value={confirm} autocomplete="new-password" required disabled={loading||pending}/><Button type="submit" fullWidth disabled={!adapter.signUp||loading} loading={pending}>{t('users.auth.create_account')}</Button></Form>
38
+ <style>:global(.auth-form){display:grid;gap:var(--smrt-spacing-sm,.5rem);color:var(--smrt-color-on-surface)}h2{margin:0;font:var(--smrt-typography-title-large-font)}label{font:var(--smrt-typography-label-large-font)}.error{margin:0;padding:var(--smrt-spacing-sm,.5rem);border-radius:var(--smrt-radius-sm,.25rem);background:var(--smrt-color-error-container);color:var(--smrt-color-on-error-container)}</style>
@@ -0,0 +1,12 @@
1
+ import type { UsersAuthAdapter } from '../auth.js';
2
+ import '../auth.js';
3
+ export interface Props {
4
+ /** Authorized browser-to-server authentication callbacks. */
5
+ adapter: UsersAuthAdapter;
6
+ /** Blocks controls while the host action is pending. */
7
+ loading?: boolean;
8
+ }
9
+ declare const SignUpForm: import("svelte").Component<Props, {}, "">;
10
+ type SignUpForm = ReturnType<typeof SignUpForm>;
11
+ export default SignUpForm;
12
+ //# sourceMappingURL=SignUpForm.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignUpForm.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/SignUpForm.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,YAAY,CAAC;AAEpB,MAAM,WAAW,KAAK;IACpB,6DAA6D;IAC7D,OAAO,EAAE,gBAAgB,CAAC;IAC1B,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAqCD,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -1,4 +1,37 @@
1
1
  export declare const M: {
2
+ readonly 'users.auth.account_security': "users.auth.account_security";
3
+ readonly 'users.auth.signed_in_sessions': "users.auth.signed_in_sessions";
4
+ readonly 'users.auth.current_session': "users.auth.current_session";
5
+ readonly 'users.auth.last_active': "users.auth.last_active";
6
+ readonly 'users.auth.sign_out': "users.auth.sign_out";
7
+ readonly 'users.auth.no_active_sessions': "users.auth.no_active_sessions";
8
+ readonly 'users.auth.api_keys': "users.auth.api_keys";
9
+ readonly 'users.auth.last_used': "users.auth.last_used";
10
+ readonly 'users.auth.no_api_keys': "users.auth.no_api_keys";
11
+ readonly 'users.auth.revoke': "users.auth.revoke";
12
+ readonly 'users.auth.unable_to_revoke_session': "users.auth.unable_to_revoke_session";
13
+ readonly 'users.auth.unable_to_revoke_api_key': "users.auth.unable_to_revoke_api_key";
14
+ readonly 'users.auth.email_address': "users.auth.email_address";
15
+ readonly 'users.auth.confirm_sign_in_link': "users.auth.confirm_sign_in_link";
16
+ readonly 'users.auth.email_sign_in_link': "users.auth.email_sign_in_link";
17
+ readonly 'users.auth.confirm_sign_in': "users.auth.confirm_sign_in";
18
+ readonly 'users.auth.send_sign_in_link': "users.auth.send_sign_in_link";
19
+ readonly 'users.auth.single_sign_on': "users.auth.single_sign_on";
20
+ readonly 'users.auth.or_continue_with': "users.auth.or_continue_with";
21
+ readonly 'users.auth.sign_in': "users.auth.sign_in";
22
+ readonly 'users.auth.password': "users.auth.password";
23
+ readonly 'users.auth.forgot_password': "users.auth.forgot_password";
24
+ readonly 'users.auth.create_account': "users.auth.create_account";
25
+ readonly 'users.auth.confirm_password': "users.auth.confirm_password";
26
+ readonly 'users.auth.passwords_do_not_match': "users.auth.passwords_do_not_match";
27
+ readonly 'users.auth.unable_to_create_account': "users.auth.unable_to_create_account";
28
+ readonly 'users.auth.unable_to_sign_in': "users.auth.unable_to_sign_in";
29
+ readonly 'users.auth.link_confirmed': "users.auth.link_confirmed";
30
+ readonly 'users.auth.link_sent': "users.auth.link_sent";
31
+ readonly 'users.auth.unable_to_continue_link': "users.auth.unable_to_continue_link";
32
+ readonly 'users.auth.unable_to_start_sso': "users.auth.unable_to_start_sso";
33
+ readonly 'users.auth.passkey_sign_in': "users.auth.passkey_sign_in";
34
+ readonly 'users.auth.passkey_not_completed': "users.auth.passkey_not_completed";
2
35
  readonly 'users.invite_user_modal.close_invite_dialog': "users.invite_user_modal.close_invite_dialog";
3
36
  readonly 'users.invite_user_modal.title': "users.invite_user_modal.title";
4
37
  readonly 'users.invite_user_modal.close': "users.invite_user_modal.close";
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/svelte/i18n.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,CAAC;;;;;;;;;;;;;CAeZ,CAAC"}
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/svelte/i18n.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDZ,CAAC"}
@@ -1,5 +1,38 @@
1
1
  import { defineMessages } from '@happyvertical/smrt-ui/i18n';
2
2
  export const M = defineMessages({
3
+ 'users.auth.account_security': 'Account security',
4
+ 'users.auth.signed_in_sessions': 'Signed-in sessions',
5
+ 'users.auth.current_session': 'Current session',
6
+ 'users.auth.last_active': 'Last active {value}',
7
+ 'users.auth.sign_out': 'Sign out',
8
+ 'users.auth.no_active_sessions': 'No active sessions.',
9
+ 'users.auth.api_keys': 'API keys',
10
+ 'users.auth.last_used': 'Last used {value}',
11
+ 'users.auth.no_api_keys': 'No API keys.',
12
+ 'users.auth.revoke': 'Revoke',
13
+ 'users.auth.unable_to_revoke_session': 'Unable to revoke session.',
14
+ 'users.auth.unable_to_revoke_api_key': 'Unable to revoke API key.',
15
+ 'users.auth.email_address': 'Email address',
16
+ 'users.auth.confirm_sign_in_link': 'Confirm sign-in link',
17
+ 'users.auth.email_sign_in_link': 'Email me a sign-in link',
18
+ 'users.auth.confirm_sign_in': 'Confirm sign in',
19
+ 'users.auth.send_sign_in_link': 'Send sign-in link',
20
+ 'users.auth.single_sign_on': 'Single sign-on',
21
+ 'users.auth.or_continue_with': 'Or continue with',
22
+ 'users.auth.sign_in': 'Sign in',
23
+ 'users.auth.password': 'Password',
24
+ 'users.auth.forgot_password': 'Forgot password?',
25
+ 'users.auth.create_account': 'Create account',
26
+ 'users.auth.confirm_password': 'Confirm password',
27
+ 'users.auth.passwords_do_not_match': 'Passwords do not match.',
28
+ 'users.auth.unable_to_create_account': 'Unable to create account.',
29
+ 'users.auth.unable_to_sign_in': 'Unable to sign in.',
30
+ 'users.auth.link_confirmed': 'Your sign-in link was confirmed.',
31
+ 'users.auth.link_sent': 'Check your email for a sign-in link.',
32
+ 'users.auth.unable_to_continue_link': 'Unable to continue with the sign-in link.',
33
+ 'users.auth.unable_to_start_sso': 'Unable to start single sign-on.',
34
+ 'users.auth.passkey_sign_in': 'Sign in with a passkey',
35
+ 'users.auth.passkey_not_completed': 'Passkey sign-in was not completed.',
3
36
  'users.invite_user_modal.close_invite_dialog': 'Close invite dialog',
4
37
  'users.invite_user_modal.title': 'Invite User to {tenantName}',
5
38
  'users.invite_user_modal.close': 'Close',
@@ -7,17 +7,31 @@
7
7
  * @packageDocumentation
8
8
  */
9
9
  import type { ComponentProps } from 'svelte';
10
+ import AccountSecurityPanel from './components/AccountSecurityPanel.svelte';
10
11
  import InviteUserModal from './components/InviteUserModal.svelte';
12
+ import MagicLinkForm from './components/MagicLinkForm.svelte';
13
+ import OidcProviderButtons from './components/OidcProviderButtons.svelte';
14
+ import PasskeySignInButton from './components/PasskeySignInButton.svelte';
15
+ import SignInForm from './components/SignInForm.svelte';
16
+ import SignUpForm from './components/SignUpForm.svelte';
11
17
  import UserAvatar from './components/UserAvatar.svelte';
12
18
  import UserCard from './components/UserCard.svelte';
13
19
  import UserForm from './components/UserForm.svelte';
14
20
  import UserList from './components/UserList.svelte';
15
21
  import UserMenu from './components/UserMenu.svelte';
16
- export { InviteUserModal, UserAvatar, UserCard, UserForm, UserList, UserMenu };
22
+ export type { AccountApiKey, AccountSession, OidcProviderButton, UsersAuthAdapter, UsersAuthEndpointOptions, } from './auth.js';
23
+ export { createUsersAuthAdapter } from './auth.js';
24
+ export { AccountSecurityPanel, InviteUserModal, MagicLinkForm, OidcProviderButtons, PasskeySignInButton, SignInForm, SignUpForm, UserAvatar, UserCard, UserForm, UserList, UserMenu, };
17
25
  export type InviteUserModalProps = ComponentProps<typeof InviteUserModal>;
18
26
  export type UserAvatarProps = ComponentProps<typeof UserAvatar>;
19
27
  export type UserCardProps = ComponentProps<typeof UserCard>;
20
28
  export type UserFormProps = ComponentProps<typeof UserForm>;
21
29
  export type UserListProps = ComponentProps<typeof UserList>;
22
30
  export type UserMenuProps = ComponentProps<typeof UserMenu>;
31
+ export type AccountSecurityPanelProps = ComponentProps<typeof AccountSecurityPanel>;
32
+ export type MagicLinkFormProps = ComponentProps<typeof MagicLinkForm>;
33
+ export type OidcProviderButtonsProps = ComponentProps<typeof OidcProviderButtons>;
34
+ export type PasskeySignInButtonProps = ComponentProps<typeof PasskeySignInButton>;
35
+ export type SignInFormProps = ComponentProps<typeof SignInForm>;
36
+ export type SignUpFormProps = ComponentProps<typeof SignUpForm>;
23
37
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svelte/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAI7C,OAAO,eAAe,MAAM,qCAAqC,CAAC;AAClE,OAAO,UAAU,MAAM,gCAAgC,CAAC;AACxD,OAAO,QAAQ,MAAM,8BAA8B,CAAC;AACpD,OAAO,QAAQ,MAAM,8BAA8B,CAAC;AACpD,OAAO,QAAQ,MAAM,8BAA8B,CAAC;AACpD,OAAO,QAAQ,MAAM,8BAA8B,CAAC;AAGpD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAG/E,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1E,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,UAAU,CAAC,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svelte/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE7C,OAAO,oBAAoB,MAAM,0CAA0C,CAAC;AAE5E,OAAO,eAAe,MAAM,qCAAqC,CAAC;AAClE,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,mBAAmB,MAAM,yCAAyC,CAAC;AAC1E,OAAO,mBAAmB,MAAM,yCAAyC,CAAC;AAC1E,OAAO,UAAU,MAAM,gCAAgC,CAAC;AACxD,OAAO,UAAU,MAAM,gCAAgC,CAAC;AACxD,OAAO,UAAU,MAAM,gCAAgC,CAAC;AACxD,OAAO,QAAQ,MAAM,8BAA8B,CAAC;AACpD,OAAO,QAAQ,MAAM,8BAA8B,CAAC;AACpD,OAAO,QAAQ,MAAM,8BAA8B,CAAC;AACpD,OAAO,QAAQ,MAAM,8BAA8B,CAAC;AAEpD,YAAY,EACV,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,GACT,CAAC;AAGF,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1E,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,UAAU,CAAC,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5D,MAAM,MAAM,yBAAyB,GAAG,cAAc,CACpD,OAAO,oBAAoB,CAC5B,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,aAAa,CAAC,CAAC;AACtE,MAAM,MAAM,wBAAwB,GAAG,cAAc,CACnD,OAAO,mBAAmB,CAC3B,CAAC;AACF,MAAM,MAAM,wBAAwB,GAAG,cAAc,CACnD,OAAO,mBAAmB,CAC3B,CAAC;AACF,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,UAAU,CAAC,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,UAAU,CAAC,CAAC"}
@@ -8,15 +8,22 @@
8
8
  */
9
9
  import { ModuleUIRegistry } from '@happyvertical/smrt-ui/registry';
10
10
  import { USERS_MODULE_META } from '../ui.js';
11
+ import AccountSecurityPanel from './components/AccountSecurityPanel.svelte';
11
12
  // Import components
12
13
  import InviteUserModal from './components/InviteUserModal.svelte';
14
+ import MagicLinkForm from './components/MagicLinkForm.svelte';
15
+ import OidcProviderButtons from './components/OidcProviderButtons.svelte';
16
+ import PasskeySignInButton from './components/PasskeySignInButton.svelte';
17
+ import SignInForm from './components/SignInForm.svelte';
18
+ import SignUpForm from './components/SignUpForm.svelte';
13
19
  import UserAvatar from './components/UserAvatar.svelte';
14
20
  import UserCard from './components/UserCard.svelte';
15
21
  import UserForm from './components/UserForm.svelte';
16
22
  import UserList from './components/UserList.svelte';
17
23
  import UserMenu from './components/UserMenu.svelte';
24
+ export { createUsersAuthAdapter } from './auth.js';
18
25
  // Export components
19
- export { InviteUserModal, UserAvatar, UserCard, UserForm, UserList, UserMenu };
26
+ export { AccountSecurityPanel, InviteUserModal, MagicLinkForm, OidcProviderButtons, PasskeySignInButton, SignInForm, SignUpForm, UserAvatar, UserCard, UserForm, UserList, UserMenu, };
20
27
  // Auto-register with ModuleUIRegistry
21
28
  ModuleUIRegistry.registerModule(USERS_MODULE_META);
22
29
  ModuleUIRegistry.register('@happyvertical/smrt-users', 'invite-user-modal', InviteUserModal);
@@ -25,3 +32,9 @@ ModuleUIRegistry.register('@happyvertical/smrt-users', 'user-card', UserCard);
25
32
  ModuleUIRegistry.register('@happyvertical/smrt-users', 'user-form', UserForm);
26
33
  ModuleUIRegistry.register('@happyvertical/smrt-users', 'user-list', UserList);
27
34
  ModuleUIRegistry.register('@happyvertical/smrt-users', 'user-menu', UserMenu);
35
+ ModuleUIRegistry.register('@happyvertical/smrt-users', 'sign-in-form', SignInForm);
36
+ ModuleUIRegistry.register('@happyvertical/smrt-users', 'sign-up-form', SignUpForm);
37
+ ModuleUIRegistry.register('@happyvertical/smrt-users', 'magic-link-form', MagicLinkForm);
38
+ ModuleUIRegistry.register('@happyvertical/smrt-users', 'oidc-provider-buttons', OidcProviderButtons);
39
+ ModuleUIRegistry.register('@happyvertical/smrt-users', 'passkey-sign-in-button', PasskeySignInButton);
40
+ ModuleUIRegistry.register('@happyvertical/smrt-users', 'account-security-panel', AccountSecurityPanel);
package/dist/sveltekit.js CHANGED
@@ -1,4 +1,4 @@
1
- import { A as readMobileBearerToken, D as withSessionPermissionContext, F as encodeOidcTransaction, H as DeviceCredentialForbiddenError, I as getUsersOidcConfig, L as resolveOidcProviderConfig, M as OidcLoginError, N as OidcLoginService, O as MobileAuthError, P as decodeOidcTransaction, U as DeviceCredentialPolicyError, V as DeviceCredentialError, W as DeviceCredentialService, Y as SessionService, _ as PasswordCredentialService, a as TerminalAuthError, at as LoginRateLimitError, b as OperationPermissionError, g as PasswordCredentialForbiddenError, h as PasswordCredentialError, j as validateMobileRedirectUri, k as MobileAuthService, o as TerminalAuthRateLimitError, s as TerminalAuthService, v as PasswordPolicyError } from "./chunks/TerminalAuthService-DoU-2Dg7.js";
1
+ import { A as readMobileBearerToken, D as withSessionPermissionContext, F as encodeOidcTransaction, H as DeviceCredentialForbiddenError, I as getUsersOidcConfig, L as resolveOidcProviderConfig, M as OidcLoginError, N as OidcLoginService, O as MobileAuthError, P as decodeOidcTransaction, U as DeviceCredentialPolicyError, V as DeviceCredentialError, W as DeviceCredentialService, Y as SessionService, _ as PasswordCredentialService, a as TerminalAuthError, at as LoginRateLimitError, b as OperationPermissionError, g as PasswordCredentialForbiddenError, h as PasswordCredentialError, j as validateMobileRedirectUri, k as MobileAuthService, o as TerminalAuthRateLimitError, s as TerminalAuthService, v as PasswordPolicyError } from "./chunks/TerminalAuthService-C18-gEUt.js";
2
2
  import { DiscoveryArtifactValidationError, SMRT_APP_RESULT_CONTRACT, SMRT_APP_RESULT_SCHEMA, SMRT_APP_RESULT_VERSION, SMRT_DISCOVERY_CONFORMANCE_ARTIFACT_SCHEMA, SMRT_DISCOVERY_CONFORMANCE_SCHEMA, SMRT_DISCOVERY_CONFORMANCE_VERSION, SMRT_MCP_RESULT_METADATA_KEY, canonicalizeDiscoveryArtifact, createDiscoveryConformanceArtifact, deriveCommandRequirements, validateDiscoveryConformanceArtifact } from "./app-contract.js";
3
3
  import { ObjectRegistry, createClassNamePredicate, resolveCustomActionMetadata, resolveEffectiveActionMetadata } from "@happyvertical/smrt-core";
4
4
  import { createLogger } from "@happyvertical/logger";
package/dist/ui.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE9E;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAuDvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,cAa/B,CAAC"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE9E;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CA6GvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,cAa/B,CAAC"}
package/dist/ui.js CHANGED
@@ -1,5 +1,59 @@
1
1
  //#region src/ui.ts
2
2
  var USERS_UI_SLOTS = {
3
+ "sign-in-form": {
4
+ id: "sign-in-form",
5
+ label: "Sign In Form",
6
+ description: "Accessible password sign-in form",
7
+ icon: "log-in",
8
+ category: "form",
9
+ order: 0,
10
+ propsInterface: "SignInFormProps"
11
+ },
12
+ "sign-up-form": {
13
+ id: "sign-up-form",
14
+ label: "Sign Up Form",
15
+ description: "Accessible account creation form",
16
+ icon: "user-plus",
17
+ category: "form",
18
+ order: 0,
19
+ propsInterface: "SignUpFormProps"
20
+ },
21
+ "magic-link-form": {
22
+ id: "magic-link-form",
23
+ label: "Magic Link Form",
24
+ description: "Magic-link request and confirmation form",
25
+ icon: "mail",
26
+ category: "form",
27
+ order: 0,
28
+ propsInterface: "MagicLinkFormProps"
29
+ },
30
+ "oidc-provider-buttons": {
31
+ id: "oidc-provider-buttons",
32
+ label: "OIDC Provider Buttons",
33
+ description: "Configured single sign-on providers",
34
+ icon: "key",
35
+ category: "action",
36
+ order: 0,
37
+ propsInterface: "OidcProviderButtonsProps"
38
+ },
39
+ "passkey-sign-in-button": {
40
+ id: "passkey-sign-in-button",
41
+ label: "Passkey Sign In",
42
+ description: "Capability-gated passkey sign-in button",
43
+ icon: "fingerprint",
44
+ category: "action",
45
+ order: 0,
46
+ propsInterface: "PasskeySignInButtonProps"
47
+ },
48
+ "account-security-panel": {
49
+ id: "account-security-panel",
50
+ label: "Account Security Panel",
51
+ description: "Session and API-key revocation controls",
52
+ icon: "shield",
53
+ category: "display",
54
+ order: 0,
55
+ propsInterface: "AccountSecurityPanelProps"
56
+ },
3
57
  "user-card": {
4
58
  id: "user-card",
5
59
  label: "User Card",
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","names":[],"sources":["../src/ui.ts"],"sourcesContent":["/**\n * Users Module UI Slot Declarations\n *\n * This file defines the UI extension points for the users module.\n * UI components are implemented in the ./svelte subpath.\n */\n\nimport type { ModuleUISlot, SmrtModuleMeta } from '@happyvertical/smrt-types';\n\n/**\n * Users module UI slots\n */\nexport const USERS_UI_SLOTS: Record<string, ModuleUISlot> = {\n 'user-card': {\n id: 'user-card',\n label: 'User Card',\n description: 'Compact user information display',\n icon: 'user',\n category: 'display',\n order: 1,\n propsInterface: 'UserCardProps',\n },\n 'user-list': {\n id: 'user-list',\n label: 'User List',\n description: 'List of users with selection support',\n icon: 'users',\n category: 'list',\n order: 2,\n propsInterface: 'UserListProps',\n },\n 'user-form': {\n id: 'user-form',\n label: 'User Form',\n description: 'Form for creating or editing users',\n icon: 'edit',\n category: 'form',\n order: 3,\n propsInterface: 'UserFormProps',\n },\n 'user-avatar': {\n id: 'user-avatar',\n label: 'User Avatar',\n description: 'User profile image or initials display',\n icon: 'image',\n category: 'display',\n order: 4,\n propsInterface: 'UserAvatarProps',\n },\n 'invite-user-modal': {\n id: 'invite-user-modal',\n label: 'Invite User Modal',\n description: 'Modal for inviting new users',\n icon: 'user-plus',\n category: 'form',\n order: 5,\n propsInterface: 'InviteUserModalProps',\n },\n 'user-menu': {\n id: 'user-menu',\n label: 'User Menu',\n description: 'User profile menu dropdown',\n icon: 'menu',\n category: 'action',\n order: 6,\n propsInterface: 'UserMenuProps',\n },\n};\n\n/**\n * Users module metadata\n */\nexport const USERS_MODULE_META: SmrtModuleMeta = {\n name: '@happyvertical/smrt-users',\n displayName: 'Users',\n description: 'Multi-tenant user management with roles and permissions',\n uiSlots: USERS_UI_SLOTS,\n models: ['User', 'Tenant', 'Role', 'Permission', 'Group'],\n collections: [\n 'UserCollection',\n 'TenantCollection',\n 'RoleCollection',\n 'PermissionCollection',\n 'GroupCollection',\n ],\n};\n"],"mappings":";AAYO,IAAM,iBAA+C;CAC1D,aAAa;EACX,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,aAAa;EACX,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,aAAa;EACX,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,eAAe;EACb,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,qBAAqB;EACnB,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,aAAa;EACX,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;AACF;AAKO,IAAM,oBAAoC;CAC/C,MAAM;CACN,aAAa;CACb,aAAa;CACb,SAAS;CACT,QAAQ;EAAC;EAAQ;EAAU;EAAQ;EAAc;CAAO;CACxD,aAAa;EACX;EACA;EACA;EACA;EACA;CACF;AACF"}
1
+ {"version":3,"file":"ui.js","names":[],"sources":["../src/ui.ts"],"sourcesContent":["/**\n * Users Module UI Slot Declarations\n *\n * This file defines the UI extension points for the users module.\n * UI components are implemented in the ./svelte subpath.\n */\n\nimport type { ModuleUISlot, SmrtModuleMeta } from '@happyvertical/smrt-types';\n\n/**\n * Users module UI slots\n */\nexport const USERS_UI_SLOTS: Record<string, ModuleUISlot> = {\n 'sign-in-form': {\n id: 'sign-in-form',\n label: 'Sign In Form',\n description: 'Accessible password sign-in form',\n icon: 'log-in',\n category: 'form',\n order: 0,\n propsInterface: 'SignInFormProps',\n },\n 'sign-up-form': {\n id: 'sign-up-form',\n label: 'Sign Up Form',\n description: 'Accessible account creation form',\n icon: 'user-plus',\n category: 'form',\n order: 0,\n propsInterface: 'SignUpFormProps',\n },\n 'magic-link-form': {\n id: 'magic-link-form',\n label: 'Magic Link Form',\n description: 'Magic-link request and confirmation form',\n icon: 'mail',\n category: 'form',\n order: 0,\n propsInterface: 'MagicLinkFormProps',\n },\n 'oidc-provider-buttons': {\n id: 'oidc-provider-buttons',\n label: 'OIDC Provider Buttons',\n description: 'Configured single sign-on providers',\n icon: 'key',\n category: 'action',\n order: 0,\n propsInterface: 'OidcProviderButtonsProps',\n },\n 'passkey-sign-in-button': {\n id: 'passkey-sign-in-button',\n label: 'Passkey Sign In',\n description: 'Capability-gated passkey sign-in button',\n icon: 'fingerprint',\n category: 'action',\n order: 0,\n propsInterface: 'PasskeySignInButtonProps',\n },\n 'account-security-panel': {\n id: 'account-security-panel',\n label: 'Account Security Panel',\n description: 'Session and API-key revocation controls',\n icon: 'shield',\n category: 'display',\n order: 0,\n propsInterface: 'AccountSecurityPanelProps',\n },\n 'user-card': {\n id: 'user-card',\n label: 'User Card',\n description: 'Compact user information display',\n icon: 'user',\n category: 'display',\n order: 1,\n propsInterface: 'UserCardProps',\n },\n 'user-list': {\n id: 'user-list',\n label: 'User List',\n description: 'List of users with selection support',\n icon: 'users',\n category: 'list',\n order: 2,\n propsInterface: 'UserListProps',\n },\n 'user-form': {\n id: 'user-form',\n label: 'User Form',\n description: 'Form for creating or editing users',\n icon: 'edit',\n category: 'form',\n order: 3,\n propsInterface: 'UserFormProps',\n },\n 'user-avatar': {\n id: 'user-avatar',\n label: 'User Avatar',\n description: 'User profile image or initials display',\n icon: 'image',\n category: 'display',\n order: 4,\n propsInterface: 'UserAvatarProps',\n },\n 'invite-user-modal': {\n id: 'invite-user-modal',\n label: 'Invite User Modal',\n description: 'Modal for inviting new users',\n icon: 'user-plus',\n category: 'form',\n order: 5,\n propsInterface: 'InviteUserModalProps',\n },\n 'user-menu': {\n id: 'user-menu',\n label: 'User Menu',\n description: 'User profile menu dropdown',\n icon: 'menu',\n category: 'action',\n order: 6,\n propsInterface: 'UserMenuProps',\n },\n};\n\n/**\n * Users module metadata\n */\nexport const USERS_MODULE_META: SmrtModuleMeta = {\n name: '@happyvertical/smrt-users',\n displayName: 'Users',\n description: 'Multi-tenant user management with roles and permissions',\n uiSlots: USERS_UI_SLOTS,\n models: ['User', 'Tenant', 'Role', 'Permission', 'Group'],\n collections: [\n 'UserCollection',\n 'TenantCollection',\n 'RoleCollection',\n 'PermissionCollection',\n 'GroupCollection',\n ],\n};\n"],"mappings":";AAYO,IAAM,iBAA+C;CAC1D,gBAAgB;EACd,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,gBAAgB;EACd,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,mBAAmB;EACjB,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,yBAAyB;EACvB,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,0BAA0B;EACxB,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,0BAA0B;EACxB,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,aAAa;EACX,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,aAAa;EACX,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,aAAa;EACX,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,eAAe;EACb,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,qBAAqB;EACnB,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;CACA,aAAa;EACX,IAAI;EACJ,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACP,gBAAgB;CAClB;AACF;AAKO,IAAM,oBAAoC;CAC/C,MAAM;CACN,aAAa;CACb,aAAa;CACb,SAAS;CACT,QAAQ;EAAC;EAAQ;EAAU;EAAQ;EAAc;CAAO;CACxD,aAAa;EACX;EACA;EACA;EACA;EACA;CACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-users",
3
- "version": "0.55.9",
3
+ "version": "0.55.11",
4
4
  "smrtJsdoc": "strict",
5
5
  "description": "Multi-tenant user management for the SMRT framework - users, tenants, roles, permissions, groups",
6
6
  "type": "module",
@@ -48,18 +48,18 @@
48
48
  },
49
49
  "dependencies": {
50
50
  "@happyvertical/logger": "^0.103.1",
51
- "@happyvertical/smrt-config": "0.55.9",
52
- "@happyvertical/smrt-core": "0.55.9",
53
- "@happyvertical/smrt-mobile-contract": "0.55.9",
54
- "@happyvertical/smrt-profiles": "0.55.9",
55
- "@happyvertical/smrt-tenancy": "0.55.9",
56
- "@happyvertical/smrt-types": "0.55.9",
57
- "@happyvertical/smrt-ui": "0.55.9",
51
+ "@happyvertical/smrt-config": "0.55.11",
52
+ "@happyvertical/smrt-core": "0.55.11",
53
+ "@happyvertical/smrt-mobile-contract": "0.55.11",
54
+ "@happyvertical/smrt-profiles": "0.55.11",
55
+ "@happyvertical/smrt-tenancy": "0.55.11",
56
+ "@happyvertical/smrt-types": "0.55.11",
57
+ "@happyvertical/smrt-ui": "0.55.11",
58
58
  "@happyvertical/sql": "^0.103.1",
59
59
  "jose": "^6.2.12"
60
60
  },
61
61
  "devDependencies": {
62
- "@happyvertical/smrt-vitest": "0.55.9",
62
+ "@happyvertical/smrt-vitest": "0.55.11",
63
63
  "@sveltejs/package": "^2.5.8",
64
64
  "@sveltejs/vite-plugin-svelte": "^7.3.0",
65
65
  "@types/node": "24.13.6",