@owlmeans/client-auth 0.1.18-rc.13 → 0.1.18-rc.14

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 (40) hide show
  1. package/agent-meta/manifest.json +2 -2
  2. package/agent-meta/skills/client-auth/SKILL.md +7 -1
  3. package/build/login/credit.d.ts +5 -0
  4. package/build/login/credit.d.ts.map +1 -1
  5. package/build/login/credit.js +43 -9
  6. package/build/login/credit.js.map +1 -1
  7. package/build/login/screen.d.ts +13 -0
  8. package/build/login/screen.d.ts.map +1 -1
  9. package/build/login/screen.js +27 -14
  10. package/build/login/screen.js.map +1 -1
  11. package/build/login/types.d.ts +9 -1
  12. package/build/login/types.d.ts.map +1 -1
  13. package/build/manager/modules.d.ts +1 -1
  14. package/build/manager/modules.d.ts.map +1 -1
  15. package/build/manager/plugins/basic-ed25519.d.ts.map +1 -1
  16. package/build/manager/plugins/basic-ed25519.js +4 -0
  17. package/build/manager/plugins/basic-ed25519.js.map +1 -1
  18. package/build/manager/plugins/methods.d.ts +0 -4
  19. package/build/manager/plugins/methods.d.ts.map +1 -1
  20. package/build/manager/plugins/methods.js +25 -6
  21. package/build/manager/plugins/methods.js.map +1 -1
  22. package/build/manager/plugins/re-captcha.d.ts.map +1 -1
  23. package/build/manager/plugins/re-captcha.js +3 -0
  24. package/build/manager/plugins/re-captcha.js.map +1 -1
  25. package/build/manager/plugins/tunnel-consumer.d.ts.map +1 -1
  26. package/build/manager/plugins/tunnel-consumer.js +3 -0
  27. package/build/manager/plugins/tunnel-consumer.js.map +1 -1
  28. package/build/manager/plugins/types.d.ts +22 -0
  29. package/build/manager/plugins/types.d.ts.map +1 -1
  30. package/package.json +4 -4
  31. package/src/login/credit.ts +47 -9
  32. package/src/login/screen.tsx +27 -13
  33. package/src/login/types.ts +9 -1
  34. package/src/manager/plugins/basic-ed25519.tsx +5 -0
  35. package/src/manager/plugins/methods.ts +29 -7
  36. package/src/manager/plugins/re-captcha.tsx +4 -0
  37. package/src/manager/plugins/tunnel-consumer.tsx +4 -0
  38. package/src/manager/plugins/types.ts +22 -0
  39. package/tests/login.spec.ts +96 -3
  40. package/build/.gitkeep +0 -0
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "package": "@owlmeans/client-auth",
4
- "version": "0.1.18-rc.12",
5
- "generatedAt": "2026-08-27T21:18:31.379Z",
4
+ "version": "0.1.18-rc.14",
5
+ "generatedAt": "2026-09-01T12:04:42.696Z",
6
6
  "canonicalRepo": "https://github.com/owlmeans/common",
7
7
  "entries": [
8
8
  {
@@ -8,7 +8,7 @@ user-invocable: false
8
8
  # @owlmeans/client-auth
9
9
 
10
10
  **Layer:** Client
11
- **Install:** `"@owlmeans/client-auth": "^0.1.18-rc.12"` in `dependencies`
11
+ **Install:** `"@owlmeans/client-auth": "^0.1.18-rc.14"` in `dependencies`
12
12
 
13
13
  ## Key Exports
14
14
 
@@ -44,6 +44,12 @@ can complete at all. Do not conflate them.
44
44
  | Export | Description |
45
45
  |--------|-------------|
46
46
  | `appendLogin(ctx)` | Register the host and expose it as `context.login()` |
47
+ | `registerMethodSource`, `resolveLoginMethods`, `primaryLoginMethod` | Which sign-in methods are offered — see `login-methods` |
48
+ | `resolveTerms`, `termsAccepted`, `acceptTerms`, `resolveCredit` | The confirmation and the credit line |
49
+ | `FallbackLoginScreen` | The plain sign-in screen a relying party renders when no UI family registered one |
50
+ | `surrogatePath(ctx, target)` | Where a surrogate login window opens; `null` on an older entrypoint list |
51
+ | `resumeAction(outcome)` | The one reading of a `resume` outcome, shared by three dispatchers |
52
+ | `revokeToken(ctx)` | The single de-adoption path, mirroring `adoptToken` |
47
53
  | `ensureLoginService(ctx)` | Idempotently obtain the host — what a plugin package calls before `registerPlugin` |
48
54
  | `makeLoginService(alias?)` | The host itself: a **lazy** service, so `makeContext` can reach it at the Loading stage |
49
55
  | `LoginPlugin`, `LoginEnv`, `LoginRequest`, `LoginOutcome`, `LoginService` | The contract |
@@ -8,6 +8,11 @@ export interface ResolvedCredit {
8
8
  /**
9
9
  * What the bottom of the sign-in screen says.
10
10
  *
11
+ * It is a copyright notice, so it is composed as one: `© <year> <holder>`. That is the whole
12
+ * reason `copyright` defaults to on — the name on its own reads as a caption, and an application
13
+ * that means to assert a copyright would have had to write the mark and the year into a literal
14
+ * `line` to get one.
15
+ *
11
16
  * The organization falls back to its slug because an organization record carries no readable name
12
17
  * — so "no name" is the ordinary case, not an error, and a screen that rendered an empty line for
13
18
  * it would be worse than one that renders the slug.
@@ -1 +1 @@
1
- {"version":3,"file":"credit.d.ts","sourceRoot":"","sources":["../../src/login/credit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAExE,MAAM,WAAW,cAAc;IAC7B,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAA;IAClB,8FAA8F;IAC9F,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,SAClB,iBAAiB,UAAU,aAAa,YAAY,MAAM,KAC/D,cAeF,CAAA"}
1
+ {"version":3,"file":"credit.d.ts","sourceRoot":"","sources":["../../src/login/credit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAExE,MAAM,WAAW,cAAc;IAC7B,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAA;IAClB,8FAA8F;IAC9F,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAuBD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,aAAa,SAClB,iBAAiB,UAAU,aAAa,YAAY,MAAM,KAC/D,cA2BF,CAAA"}
@@ -1,6 +1,28 @@
1
+ /**
2
+ * The years one notice covers.
3
+ *
4
+ * A range only while the first year is genuinely in the past — an app configured with the current
5
+ * year, or with a year a skewed clock puts in the future, still gets a well-formed notice rather
6
+ * than `© 2026–2026` or a range that runs backwards.
7
+ */
8
+ const years = (since, now) => since != null && since > 0 && since < now ? `${since}–${now}` : `${now}`;
9
+ /**
10
+ * A configured value that was actually SET.
11
+ *
12
+ * Empty is how a build-time default spells "unset", and this config is filled from environment
13
+ * variables a platform delivers — `BRANDING_ORGANIZATION: meta.brandingOrganization ?? ''` is the
14
+ * shape of every one of them. `??` does not fall through an empty string, so an undelivered
15
+ * organization used to win the fallback chain and compose a line ending in a bare dash.
16
+ */
17
+ const set = (value) => value != null && value.trim() !== '' ? value : null;
1
18
  /**
2
19
  * What the bottom of the sign-in screen says.
3
20
  *
21
+ * It is a copyright notice, so it is composed as one: `© <year> <holder>`. That is the whole
22
+ * reason `copyright` defaults to on — the name on its own reads as a caption, and an application
23
+ * that means to assert a copyright would have had to write the mark and the year into a literal
24
+ * `line` to get one.
25
+ *
4
26
  * The organization falls back to its slug because an organization record carries no readable name
5
27
  * — so "no name" is the ordinary case, not an error, and a screen that rendered an empty line for
6
28
  * it would be worse than one that renders the slug.
@@ -10,15 +32,27 @@
10
32
  */
11
33
  export const resolveCredit = (cfg, brand, service) => {
12
34
  const poweredBy = cfg?.poweredBy ?? true;
13
- if (cfg?.line != null && cfg.line !== '') {
14
- return { poweredBy, line: cfg.line };
35
+ const literal = set(cfg?.line);
36
+ if (literal != null) {
37
+ return { poweredBy, line: literal };
15
38
  }
16
- const product = cfg?.product ?? brand?.name ?? service ?? null;
17
- const organization = cfg?.organization ?? brand?.organization
18
- ?? cfg?.entity ?? brand?.entity ?? null;
19
- const line = product != null && organization != null && product !== organization
20
- ? `${product} ${organization}`
21
- : product ?? organization;
22
- return { poweredBy, line: line != null && line !== '' ? line : null };
39
+ const product = set(cfg?.product) ?? set(brand?.name) ?? set(service);
40
+ const organization = set(cfg?.organization) ?? set(brand?.organization)
41
+ ?? set(cfg?.entity) ?? set(brand?.entity);
42
+ // Whoever the notice names. A product with no organization behind it holds its own copyright,
43
+ // which is why this falls through to the product rather than dropping the notice.
44
+ const holder = set(cfg?.holder) ?? organization ?? product;
45
+ const wording = typeof cfg?.copyright === 'string' ? set(cfg.copyright) : null;
46
+ const notice = cfg?.copyright === false || holder == null
47
+ ? organization
48
+ : wording ?? `© ${years(cfg?.since, new Date().getFullYear())} ${holder}`;
49
+ // The product is named beside the notice only when it is not already the thing being claimed —
50
+ // "OwlMeans — © 2026 OwlMeans" says the name twice and neither time usefully.
51
+ return {
52
+ poweredBy,
53
+ line: product != null && notice != null && product !== holder
54
+ ? `${product} — ${notice}`
55
+ : notice ?? product,
56
+ };
23
57
  };
24
58
  //# sourceMappingURL=credit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"credit.js","sourceRoot":"","sources":["../../src/login/credit.ts"],"names":[],"mappings":"AASA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,GAAuB,EAAE,KAAqB,EAAE,OAAgB,EAChD,EAAE;IAClB,MAAM,SAAS,GAAG,GAAG,EAAE,SAAS,IAAI,IAAI,CAAA;IACxC,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QACzC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAA;IACtC,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,IAAI,KAAK,EAAE,IAAI,IAAI,OAAO,IAAI,IAAI,CAAA;IAC9D,MAAM,YAAY,GAAG,GAAG,EAAE,YAAY,IAAI,KAAK,EAAE,YAAY;WACxD,GAAG,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,CAAA;IAEzC,MAAM,IAAI,GAAG,OAAO,IAAI,IAAI,IAAI,YAAY,IAAI,IAAI,IAAI,OAAO,KAAK,YAAY;QAC9E,CAAC,CAAC,GAAG,OAAO,MAAM,YAAY,EAAE;QAChC,CAAC,CAAC,OAAO,IAAI,YAAY,CAAA;IAE3B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;AACvE,CAAC,CAAA"}
1
+ {"version":3,"file":"credit.js","sourceRoot":"","sources":["../../src/login/credit.ts"],"names":[],"mappings":"AASA;;;;;;GAMG;AACH,MAAM,KAAK,GAAG,CAAC,KAAyB,EAAE,GAAW,EAAU,EAAE,CAC/D,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAA;AAE1E;;;;;;;GAOG;AACH,MAAM,GAAG,GAAG,CAAC,KAAqB,EAAiB,EAAE,CACnD,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;AAErD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,GAAuB,EAAE,KAAqB,EAAE,OAAgB,EAChD,EAAE;IAClB,MAAM,SAAS,GAAG,GAAG,EAAE,SAAS,IAAI,IAAI,CAAA;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAC9B,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IACrC,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;IACrE,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC;WAClE,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAE3C,8FAA8F;IAC9F,kFAAkF;IAClF,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,YAAY,IAAI,OAAO,CAAA;IAC1D,MAAM,OAAO,GAAG,OAAO,GAAG,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC9E,MAAM,MAAM,GAAG,GAAG,EAAE,SAAS,KAAK,KAAK,IAAI,MAAM,IAAI,IAAI;QACvD,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,OAAO,IAAI,KAAK,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,MAAM,EAAE,CAAA;IAE3E,+FAA+F;IAC/F,8EAA8E;IAC9E,OAAO;QACL,SAAS;QACT,IAAI,EAAE,OAAO,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,MAAM;YAC3D,CAAC,CAAC,GAAG,OAAO,MAAM,MAAM,EAAE;YAC1B,CAAC,CAAC,MAAM,IAAI,OAAO;KACtB,CAAA;AACH,CAAC,CAAA"}
@@ -1,4 +1,17 @@
1
1
  import type { FC } from 'react';
2
2
  import type { LoginScreenProps } from './types.js';
3
+ /**
4
+ * The sign-in screen every application gets, whether or not it registered a styled one.
5
+ *
6
+ * It exists because a relying party must render SOMETHING rather than start a flow on its own, and
7
+ * a relying party may not depend on a UI family. So this is deliberately plain: raw elements and
8
+ * inline styles, no Tailwind class that a consumer's stylesheet would have to scan for, no shadcn
9
+ * primitive a consumer would have to vendor. An application that registers a real screen through
10
+ * `login().registerScreen(...)` never sees it.
11
+ *
12
+ * Because it is the floor rather than the design, it still has to be correct: it offers the same
13
+ * methods, enforces the same terms confirmation, centres the same way, and renders the same
14
+ * credit line.
15
+ */
3
16
  export declare const FallbackLoginScreen: FC<LoginScreenProps>;
4
17
  //# sourceMappingURL=screen.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/login/screen.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,EAAE,EAAE,MAAM,OAAO,CAAA;AAG9C,OAAO,KAAK,EAA6B,gBAAgB,EAAgB,MAAM,YAAY,CAAA;AA8B3F,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,gBAAgB,CAuFpD,CAAA"}
1
+ {"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/login/screen.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,EAAE,EAAE,MAAM,OAAO,CAAA;AAG9C,OAAO,KAAK,EAA6B,gBAAgB,EAAgB,MAAM,YAAY,CAAA;AA+B3F;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,gBAAgB,CAuFpD,CAAA"}
@@ -6,27 +6,40 @@ import { primaryLoginMethod } from './methods.js';
6
6
  import { acceptTerms, resolveTerms, termsAccepted } from './terms.js';
7
7
  import { resolveCredit } from './credit.js';
8
8
  /**
9
- * The sign-in screen every application gets, whether or not it registered a styled one.
9
+ * The page the card sits in.
10
10
  *
11
- * It exists because a relying party must render SOMETHING rather than start a flow on its own, and
12
- * a relying party may not depend on a UI family. So this is deliberately plain: raw elements and
13
- * inline styles, no Tailwind class that a consumer's stylesheet would have to scan for, no shadcn
14
- * primitive a consumer would have to vendor. An application that registers a real screen through
15
- * `login().registerScreen(...)` never sees it.
16
- *
17
- * Because it is the floor rather than the design, it still has to be correct: it offers the same
18
- * methods, enforces the same terms confirmation, and renders the same credit line.
11
+ * It carries its own viewport height because this screen is rendered straight out of the
12
+ * dispatcher, into whatever the application happens to have around it which is usually nothing
13
+ * with a height, so a percentage minimum would resolve to zero and leave the card at the top.
19
14
  */
20
- const box = {
21
- maxWidth: '24rem', margin: '10vh auto', padding: '1.5rem',
15
+ const page = {
16
+ display: 'flex', alignItems: 'center', justifyContent: 'center',
17
+ minHeight: '100dvh', padding: '1rem',
22
18
  fontFamily: 'system-ui, sans-serif', lineHeight: 1.5,
23
19
  };
20
+ // Centred throughout, so the plain screen and the styled one read the same way.
21
+ const box = {
22
+ width: '100%', maxWidth: '24rem', padding: '1.5rem', textAlign: 'center',
23
+ };
24
24
  const button = (emphasis) => ({
25
25
  display: 'block', width: '100%', marginTop: '.5rem', padding: '.625rem 1rem',
26
26
  fontSize: '1rem', cursor: 'pointer', borderRadius: '.375rem',
27
27
  border: '1px solid currentColor',
28
28
  ...(emphasis === 'primary' ? { fontWeight: 600 } : {}),
29
29
  });
30
+ /**
31
+ * The sign-in screen every application gets, whether or not it registered a styled one.
32
+ *
33
+ * It exists because a relying party must render SOMETHING rather than start a flow on its own, and
34
+ * a relying party may not depend on a UI family. So this is deliberately plain: raw elements and
35
+ * inline styles, no Tailwind class that a consumer's stylesheet would have to scan for, no shadcn
36
+ * primitive a consumer would have to vendor. An application that registers a real screen through
37
+ * `login().registerScreen(...)` never sees it.
38
+ *
39
+ * Because it is the floor rather than the design, it still has to be correct: it offers the same
40
+ * methods, enforces the same terms confirmation, centres the same way, and renders the same
41
+ * credit line.
42
+ */
30
43
  export const FallbackLoginScreen = props => {
31
44
  const context = useContext();
32
45
  const t = props.translate ?? ((_key, defaultValue) => defaultValue);
@@ -56,8 +69,8 @@ export const FallbackLoginScreen = props => {
56
69
  setAttempted(false);
57
70
  acceptTerms(resolved, value);
58
71
  }, [resolved]);
59
- return _jsxs("div", { style: box, children: [_jsx("h1", { style: { fontSize: '1.25rem', marginBottom: '.25rem' }, children: props.title ?? t('login.title', 'Sign in') }), _jsx("p", { style: { opacity: .75, marginTop: 0 }, children: props.subtitle ?? t('login.subtitle', 'Choose how you would like to continue.') }), methods.length < 1
60
- ? _jsx("p", { role: "status", children: t('login.empty', 'No sign-in method is configured for this application.') })
61
- : methods.map(method => _jsx("button", { type: "button", "data-login-method": method.id, "aria-disabled": blocked, "data-blocked": blocked ? 'true' : undefined, style: { ...button(method.emphasis), opacity: blocked ? .6 : 1 }, autoFocus: method.id === primary?.id, onClick: () => select(method), children: method.label ?? t(`login.method.${method.i18nKey ?? method.id}`, method.id) }, method.id)), resolved != null && _jsxs("p", { style: { marginTop: '1rem', fontSize: '.875rem' }, children: [_jsxs("label", { children: [_jsx("input", { type: "checkbox", checked: accepted, "data-login-terms": true, onChange: event => onAccept(event.target.checked) }), ' ', t('login.terms.agreement', 'I have read and agree to the Terms & Conditions and the Privacy Policy.')] }), ' ', _jsx("a", { href: resolved.terms, target: "_blank", rel: "noreferrer noopener", children: t('login.terms.terms', 'Terms & Conditions') }), ' · ', _jsx("a", { href: resolved.privacy, target: "_blank", rel: "noreferrer noopener", children: t('login.terms.privacy', 'Privacy Policy') })] }), attempted && blocked && _jsx("p", { role: "alert", style: { color: '#b00', fontSize: '.875rem' }, children: t('login.terms.required', 'Please confirm the Terms & Conditions and the Privacy Policy to continue.') }), props.footer ?? _jsxs("p", { style: { marginTop: '2rem', fontSize: '.75rem', opacity: .7 }, children: [credit.poweredBy && _jsx("span", { children: t('login.credit.powered', 'Powered by OwlMeans') }), credit.poweredBy && credit.line != null && ' · ', credit.line] })] });
72
+ return _jsx("div", { "data-login-screen": true, style: page, children: _jsxs("div", { style: box, children: [_jsx("h1", { style: { fontSize: '1.25rem', marginBottom: '.25rem' }, children: props.title ?? t('login.title', 'Sign in') }), _jsx("p", { style: { opacity: .75, marginTop: 0 }, children: props.subtitle ?? t('login.subtitle', 'Choose how you would like to continue.') }), methods.length < 1
73
+ ? _jsx("p", { role: "status", children: t('login.empty', 'No sign-in method is configured for this application.') })
74
+ : methods.map(method => _jsx("button", { type: "button", "data-login-method": method.id, "aria-disabled": blocked, "data-blocked": blocked ? 'true' : undefined, style: { ...button(method.emphasis), opacity: blocked ? .6 : 1 }, autoFocus: method.id === primary?.id, onClick: () => select(method), children: method.label ?? t(`login.method.${method.i18nKey ?? method.id}`, method.id) }, method.id)), resolved != null && _jsxs("p", { style: { marginTop: '1rem', fontSize: '.875rem' }, children: [_jsxs("label", { children: [_jsx("input", { type: "checkbox", checked: accepted, "data-login-terms": true, onChange: event => onAccept(event.target.checked) }), ' ', t('login.terms.agreement', 'I have read and agree to the Terms & Conditions and the Privacy Policy.')] }), ' ', _jsx("a", { href: resolved.terms, target: "_blank", rel: "noreferrer noopener", children: t('login.terms.terms', 'Terms & Conditions') }), ' · ', _jsx("a", { href: resolved.privacy, target: "_blank", rel: "noreferrer noopener", children: t('login.terms.privacy', 'Privacy Policy') })] }), attempted && blocked && _jsx("p", { role: "alert", style: { color: '#b00', fontSize: '.875rem' }, children: t('login.terms.required', 'Please confirm the Terms & Conditions and the Privacy Policy to continue.') }), props.footer ?? _jsxs("p", { style: { marginTop: '2rem', fontSize: '.75rem', opacity: .7 }, children: [credit.poweredBy && _jsx("span", { children: t('login.credit.powered', 'Powered by OwlMeans') }), credit.poweredBy && credit.line != null && ' · ', credit.line] })] }) });
62
75
  };
63
76
  //# sourceMappingURL=screen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/login/screen.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/login/screen.tsx"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ComponentType, ReactNode } from 'react';
1
+ import type { ComponentType, CSSProperties, ReactNode } from 'react';
2
2
  import type { LazyService, BasicContext } from '@owlmeans/context';
3
3
  import type { LoginMethodEmphasis, LoginScreenConfig, LoginTermsConfig } from '@owlmeans/config';
4
4
  /**
@@ -189,6 +189,14 @@ export interface LoginScreenProps {
189
189
  footer?: ReactNode;
190
190
  className?: string;
191
191
  containerClassName?: string;
192
+ /**
193
+ * Inline overrides for the screen's outer box.
194
+ *
195
+ * It exists because the outer box carries its viewport height inline rather than as a utility
196
+ * class, and an escape hatch that a class can no longer provide has to be provided some other
197
+ * way. See the note on the screen itself.
198
+ */
199
+ style?: CSSProperties;
192
200
  }
193
201
  export type LoginScreenComponent = ComponentType<LoginScreenProps>;
194
202
  export interface LoginService extends LazyService {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/login/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/login/types.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const modules: import("@owlmeans/entrypoint").CommonEntrypoint[];
1
+ export declare const modules: any[];
2
2
  //# sourceMappingURL=modules.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"modules.d.ts","sourceRoot":"","sources":["../../src/manager/modules.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,OAAO,mDAAO,CAAA"}
1
+ {"version":3,"file":"modules.d.ts","sourceRoot":"","sources":["../../src/manager/modules.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,OAAO,OAAO,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"basic-ed25519.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/basic-ed25519.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAKtD,eAAO,MAAM,oBAAoB,EAAE,oBAqClC,CAAA"}
1
+ {"version":3,"file":"basic-ed25519.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/basic-ed25519.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAKtD,eAAO,MAAM,oBAAoB,EAAE,oBA0ClC,CAAA"}
@@ -6,6 +6,10 @@ import { AuthenCredError } from '../errors.js';
6
6
  export const ed25519BasicUIPlugin = {
7
7
  type: AuthenticationType.BasicEd25519,
8
8
  method: { order: 300, icon: 'key', emphasis: 'secondary' },
9
+ // This package ships no UI family, so the form below is a `Renderer` a panel package assigns
10
+ // (`@owlmeans/web-panel/auth/plugins`, `@owlmeans/mui-panel/auth/plugins`). Until one does, the
11
+ // Implementation throws on mount — so the sign-in screen must not offer the method.
12
+ requiresRenderer: true,
9
13
  Implementation: Renderer => ({ type, stage, control, params }) => {
10
14
  type = type ?? AuthenticationType.BasicEd25519;
11
15
  Renderer = Renderer ?? ed25519BasicUIPlugin.Renderer;
@@ -1 +1 @@
1
- {"version":3,"file":"basic-ed25519.js","sourceRoot":"","sources":["../../../src/manager/plugins/basic-ed25519.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAyB;IACxD,IAAI,EAAE,kBAAkB,CAAC,YAAY;IAErC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE;IAE1D,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QAE/D,IAAI,GAAG,IAAI,IAAI,kBAAkB,CAAC,YAAY,CAAA;QAC9C,QAAQ,GAAG,QAAQ,IAAI,oBAAoB,CAAC,QAAQ,CAAA;QAEpD,iEAAiE;QACjE,+CAA+C;QAC/C,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,OAAO,CAAC,KAAK,KAAK,mBAAmB,CAAC,IAAI,EAAE,CAAC;gBAC/C,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAA;YACjC,CAAC;QACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;QAEV,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,WAAW,CAAC,iDAAiD,CAAC,CAAA;QAC1E,CAAC;QAED,OAAO,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAI,CAAA;IACjF,CAAC;IAED,YAAY,EAAE,KAAK,EAAC,WAAW,EAAC,EAAE;QAChC,MAAM,GAAG,GAAG,gBAAgB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;QAEpD,IAAI,WAAW,CAAC,MAAM,KAAK,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;YAC/C,MAAM,IAAI,eAAe,CAAC,uBAAuB,CAAC,CAAA;QACpD,CAAC;QAED,WAAW,CAAC,UAAU,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;QAE9D,4CAA4C;QAC5C,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACtB,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"basic-ed25519.js","sourceRoot":"","sources":["../../../src/manager/plugins/basic-ed25519.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAyB;IACxD,IAAI,EAAE,kBAAkB,CAAC,YAAY;IAErC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE;IAE1D,6FAA6F;IAC7F,gGAAgG;IAChG,oFAAoF;IACpF,gBAAgB,EAAE,IAAI;IAEtB,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QAE/D,IAAI,GAAG,IAAI,IAAI,kBAAkB,CAAC,YAAY,CAAA;QAC9C,QAAQ,GAAG,QAAQ,IAAI,oBAAoB,CAAC,QAAQ,CAAA;QAEpD,iEAAiE;QACjE,+CAA+C;QAC/C,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,OAAO,CAAC,KAAK,KAAK,mBAAmB,CAAC,IAAI,EAAE,CAAC;gBAC/C,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAA;YACjC,CAAC;QACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;QAEV,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,WAAW,CAAC,iDAAiD,CAAC,CAAA;QAC1E,CAAC;QAED,OAAO,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAI,CAAA;IACjF,CAAC;IAED,YAAY,EAAE,KAAK,EAAC,WAAW,EAAC,EAAE;QAChC,MAAM,GAAG,GAAG,gBAAgB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;QAEpD,IAAI,WAAW,CAAC,MAAM,KAAK,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;YAC/C,MAAM,IAAI,eAAe,CAAC,uBAAuB,CAAC,CAAA;QACpD,CAAC;QAED,WAAW,CAAC,UAAU,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;QAE9D,4CAA4C;QAC5C,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACtB,CAAC;CACF,CAAA"}
@@ -1,10 +1,6 @@
1
1
  import type { LoginMethodSource } from '../../login/types.js';
2
2
  /**
3
3
  * Every registered authentication plugin that declares itself offerable, as a sign-in method.
4
- *
5
- * A plugin without `method` is deliberately invisible here: `re-captcha` is a STEP inside another
6
- * flow, not a way to sign in, and a registry that offered everything registered would put it on
7
- * the screen as a choice.
8
4
  */
9
5
  export declare const pluginMethodSource: LoginMethodSource;
10
6
  //# sourceMappingURL=methods.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"methods.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/methods.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,iBAAiB,EAAgB,MAAM,sBAAsB,CAAA;AAGxF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,iBAsChC,CAAA"}
1
+ {"version":3,"file":"methods.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/methods.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAmC,iBAAiB,EAAgB,MAAM,sBAAsB,CAAA;AA6B5G;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,iBAsChC,CAAA"}
@@ -2,16 +2,35 @@ import { CAUTHEN_AUTHEN_TYPED } from '@owlmeans/auth';
2
2
  import { DEFAULT_METHOD_ORDER, LOGIN_SERVICE } from '../../login/consts.js';
3
3
  import { listAuthPlugins } from './registry.js';
4
4
  /**
5
- * Every registered authentication plugin that declares itself offerable, as a sign-in method.
5
+ * Whether a registered plugin may be put on the sign-in screen of THIS application.
6
+ *
7
+ * The registry is global and is filled by side-effect imports, so "registered" means only that
8
+ * some module was pulled into the bundle — three separate reasons why that is not enough:
6
9
  *
7
- * A plugin without `method` is deliberately invisible here: `re-captcha` is a STEP inside another
8
- * flow, not a way to sign in, and a registry that offered everything registered would put it on
9
- * the screen as a choice.
10
+ * 1. No `method`: `re-captcha` is a STEP inside another flow, not a way to sign in.
11
+ * 2. No renderer: a plugin that declares `requiresRenderer` throws the moment its screen mounts
12
+ * unless a UI package (`web-panel`, `mui-panel`) assigned one. An app that imported the plugin
13
+ * host without that package would be offering buttons whose only outcome is a broken page.
14
+ * 3. Not wired: a plugin whose flow needs a service its context never appended fails on the
15
+ * lookup instead. Packages register their plugins in groups, so an app that wanted one of them
16
+ * gets the rest too, and the rest have to be able to say they do not apply here.
17
+ */
18
+ const offerable = (plugin, ctx) => {
19
+ if (plugin.method == null || plugin.method.hidden === true) {
20
+ return false;
21
+ }
22
+ if (plugin.requiresRenderer === true && plugin.Renderer == null) {
23
+ return false;
24
+ }
25
+ return plugin.method.available?.(ctx) !== false;
26
+ };
27
+ /**
28
+ * Every registered authentication plugin that declares itself offerable, as a sign-in method.
10
29
  */
11
30
  export const pluginMethodSource = {
12
31
  alias: 'authentication-plugins',
13
- list: () => listAuthPlugins()
14
- .filter(plugin => plugin.method != null && plugin.method.hidden !== true)
32
+ list: ctx => listAuthPlugins()
33
+ .filter(plugin => offerable(plugin, ctx))
15
34
  .map((plugin) => {
16
35
  const meta = plugin.method;
17
36
  const type = plugin.type;
@@ -1 +1 @@
1
- {"version":3,"file":"methods.js","sourceRoot":"","sources":["../../../src/manager/plugins/methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAErD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAE3E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE/C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAsB;IACnD,KAAK,EAAE,wBAAwB;IAE/B,IAAI,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE;SAC1B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;SACxE,GAAG,CAAC,CAAC,MAAM,EAAe,EAAE;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAO,CAAA;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAA;QAE1B,OAAO;YACL,EAAE,EAAE,IAAI;YACR,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;YAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,oBAAoB;YACzC,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,MAAM,EAAE,EAAE,IAAI,EAAE;YAEhB,2FAA2F;YAC3F,gFAAgF;YAChF,KAAK,EAAE,SAAS,CAAC,EAAE;gBACjB,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAe,aAAa,CAAC,CAAA;gBACpE,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAmB,oBAAoB,CAAC,CAAA;gBACvF,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAA;gBAE3E,OAAO,KAAK,CAAC,KAAK,CAAC;oBACjB,GAAG;oBACH,oFAAoF;oBACpF,8EAA8E;oBAC9E,GAAG,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI;wBAC5B,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;wBAC1E,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC,CAAA;YACJ,CAAC;SACF,CAAA;IACH,CAAC,CAAC;CACL,CAAA"}
1
+ {"version":3,"file":"methods.js","sourceRoot":"","sources":["../../../src/manager/plugins/methods.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"re-captcha.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/re-captcha.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAGtD,eAAO,MAAM,eAAe,EAAE,oBA6B7B,CAAA"}
1
+ {"version":3,"file":"re-captcha.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/re-captcha.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAGtD,eAAO,MAAM,eAAe,EAAE,oBAiC7B,CAAA"}
@@ -5,6 +5,9 @@ export const reCaptchaPlugin = {
5
5
  type: AuthenticationType.ReCaptcha,
6
6
  // A STEP inside another flow, never a way to sign in — so it is registered and never offered.
7
7
  method: { hidden: true },
8
+ // Its widget is a `Renderer` a panel package assigns. `hidden` already keeps it off the sign-in
9
+ // screen; this is what the flow that DOES drive it can check before handing it a stage.
10
+ requiresRenderer: true,
8
11
  Implementation: Renderer => ({ type, stage, control, params }) => {
9
12
  Renderer = Renderer ?? reCaptchaPlugin.Renderer;
10
13
  // ReCaptcha authentication requests allowance unconditionally
@@ -1 +1 @@
1
- {"version":3,"file":"re-captcha.js","sourceRoot":"","sources":["../../../src/manager/plugins/re-captcha.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,MAAM,CAAC,MAAM,eAAe,GAAyB;IACnD,IAAI,EAAE,kBAAkB,CAAC,SAAS;IAElC,8FAA8F;IAC9F,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IAExB,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QAC/D,QAAQ,GAAG,QAAQ,IAAI,eAAe,CAAC,QAAQ,CAAA;QAE/C,+DAA+D;QAC/D,+CAA+C;QAC/C,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,OAAO,CAAC,KAAK,KAAK,mBAAmB,CAAC,IAAI,EAAE,CAAC;gBAC/C,KAAK,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;YACjE,CAAC;QACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;QAEV,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,WAAW,CAAC,8CAA8C,CAAC,CAAA;QACvE,CAAC;QAED,OAAO,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAI,CAAA;IACjF,CAAC;IAED;;;OAGG;IACH,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;CAC1C,CAAA"}
1
+ {"version":3,"file":"re-captcha.js","sourceRoot":"","sources":["../../../src/manager/plugins/re-captcha.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,MAAM,CAAC,MAAM,eAAe,GAAyB;IACnD,IAAI,EAAE,kBAAkB,CAAC,SAAS;IAElC,8FAA8F;IAC9F,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IAExB,gGAAgG;IAChG,wFAAwF;IACxF,gBAAgB,EAAE,IAAI;IAEtB,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QAC/D,QAAQ,GAAG,QAAQ,IAAI,eAAe,CAAC,QAAQ,CAAA;QAE/C,+DAA+D;QAC/D,+CAA+C;QAC/C,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,OAAO,CAAC,KAAK,KAAK,mBAAmB,CAAC,IAAI,EAAE,CAAC;gBAC/C,KAAK,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;YACjE,CAAC;QACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;QAEV,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,WAAW,CAAC,8CAA8C,CAAC,CAAA;QACvE,CAAC;QAED,OAAO,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAI,CAAA;IACjF,CAAC;IAED;;;OAGG;IACH,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;CAC1C,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel-consumer.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/tunnel-consumer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAStD,eAAO,MAAM,sBAAsB,EAAE,oBAgEpC,CAAA"}
1
+ {"version":3,"file":"tunnel-consumer.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/tunnel-consumer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAStD,eAAO,MAAM,sBAAsB,EAAE,oBAoEpC,CAAA"}
@@ -8,6 +8,9 @@ import { createWalletFacade } from './tunnel/wallet.js';
8
8
  export const tunnelConsumerUIPlugin = {
9
9
  type: AuthenticationType.WalletConsumer,
10
10
  method: { order: 400, icon: 'wallet' },
11
+ // The PIN form is a `Renderer` a panel package assigns; without one the Implementation throws on
12
+ // mount, so the method must not be offered.
13
+ requiresRenderer: true,
11
14
  Implementation: renderer => ({ type, stage, control, params }) => {
12
15
  type = type ?? AuthenticationType.WalletConsumer;
13
16
  const Renderer = renderer
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel-consumer.js","sourceRoot":"","sources":["../../../src/manager/plugins/tunnel-consumer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tunnel-consumer.js","sourceRoot":"","sources":["../../../src/manager/plugins/tunnel-consumer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAI3G,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE9C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEvD,MAAM,CAAC,MAAM,sBAAsB,GAAyB;IAC1D,IAAI,EAAE,kBAAkB,CAAC,cAAc;IAEvC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;IAEtC,iGAAiG;IACjG,4CAA4C;IAC5C,gBAAgB,EAAE,IAAI;IAEtB,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QAC/D,IAAI,GAAG,IAAI,IAAI,kBAAkB,CAAC,cAAc,CAAA;QAChD,MAAM,QAAQ,GAA6C,QAAQ;eAC9D,sBAAsB,CAAC,QAAQ,CAAA;QAEpC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,CAAA;QAErC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,WAAW,CAAC,mDAAmD,CAAC,CAAA;QAC5E,CAAC;QAED,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;gBACvB,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;gBAClD,UAAU,CAAC,IAAI,CACb,mBAAmB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,kBAAkB,CAAC,aAAa,EAAE,CACrE,CAAC,IAAI,CAAC,KAAK,EAAE,SAA4B,EAAE,EAAE;oBAC5C,OAAO,CAAC,SAAS,GAAG,SAAS,CAAA;oBAC7B,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAA;oBAErD,UAAU,CAAC,kBAAkB,GAAG,mBAAmB,GAAG,IAAI,CAAA;gBAC5D,CAAC,CAAC,CAAA;gBAEF,UAAU,CAAC,YAAY,GAAG,KAAK,EAAE,KAA0B,EAAE,OAAY,EAAE,EAAE;oBAC3E,IAAI,KAAK,KAAK,mBAAmB,CAAC,aAAa,EAAE,CAAC;wBAChD,IAAI,CAAC;4BACH,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;gCAC7B,MAAM,IAAI,WAAW,CAAC,kEAAkE,CAAC,CAAA;4BAC3F,CAAC;4BACD,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAA;4BAC/D,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAA;wBACzD,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;4BACxB,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;wBAC3B,CAAC;oBACH,CAAC;oBACD,OAAO,CAAC,IAAI,EAAE,IAAW,CAAC,CAAA;gBAC5B,CAAC,CAAA;gBAED,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,EAAC,OAAO,EAAC,EAAE;oBACvC,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;wBACzD,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;oBACnD,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;QAEhB,MAAM,MAAM,GAAG,WAAW,CACxB,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,EACvE,CAAC,UAAU,IAAI,IAAI,CAAC,CACvB,CAAA;QAED,OAAO,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAI,CAAA;IACnH,CAAC;IAED,YAAY,EAAE,KAAK,EAAC,YAAY,EAAC,EAAE;QACjC,4CAA4C;QAC5C,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACtB,CAAC;CACF,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,IAAgB,EAAE,OAA8B,EAAE,EAAE,CAAC,KAAK,EAAE,IAAa,EAAE,EAAE;IAC/F,MAAM,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAA;IAC7D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAwB,mBAAmB,CAAC,YAAY,EAAE;YACpF,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE;YAC7C,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC,GAAG;YACtC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,QAAQ,CAAC,KAAK;YACpB,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,CAAC,UAAU,CAAC;SACrB,CAAC,CAAA;QAEF,IAAI,IAAI,CAAC,KAAK,KAAK,mBAAmB,CAAC,aAAa,EAAE,CAAC;YACrD,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;gBAC7B,MAAM,IAAI,WAAW,CAAC,kEAAkE,CAAC,CAAA;YAC3F,CAAC;YACD,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAA;QACxD,CAAC;QACD,SAAS;IACX,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;QAClB,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC;AACH,CAAC,CAAA"}
@@ -1,10 +1,20 @@
1
1
  import type { FC } from 'react';
2
2
  import type { LoginMethodEmphasis } from '@owlmeans/config';
3
+ import type { LoginMethodContext } from '../../login/types.js';
3
4
  import type { AuthenticationControl, AuthenticationRenderer, AuthenticationRendererProps } from '../components/authentication/types.js';
4
5
  export interface AuthenticationPlugin extends Pick<AuthenticationControl, "beforeAuthenticate" | "afterAuthenticate">, Pick<Partial<AuthenticationControl>, "authenticate"> {
5
6
  type: string;
6
7
  Implementation: PluginImplemnetation;
7
8
  Renderer?: AuthenticationRenderer;
9
+ /**
10
+ * This plugin's `Implementation` cannot render without a `Renderer` a UI package supplies.
11
+ *
12
+ * It is declared rather than inferred because there is nothing to infer it from: a plugin that
13
+ * renders its own form and one that throws `Renderer is not defined` are the same object until
14
+ * the screen mounts. Declaring it is what lets the sign-in screen leave out a method whose
15
+ * renderer nobody registered, instead of offering a button that crashes the page it opens.
16
+ */
17
+ requiresRenderer?: boolean;
8
18
  /**
9
19
  * How this method presents itself on the sign-in screen.
10
20
  *
@@ -35,6 +45,18 @@ export interface AuthMethodMeta {
35
45
  restricted?: boolean;
36
46
  /** Registered, but never a choice. */
37
47
  hidden?: boolean;
48
+ /**
49
+ * Whether the application this method is about to be offered in actually wired it.
50
+ *
51
+ * The plugin registry is global and is written to by side-effect imports, so being registered
52
+ * says only that some bundle pulled the module in — and modules arrive in groups. An app that
53
+ * wanted one method out of a package gets every method that package registers, including ones
54
+ * whose first act is to look up a service its context never appended. This is where a plugin
55
+ * says so, per context, at render time; `false` leaves it off the screen.
56
+ *
57
+ * Absent means "always", which is right for a plugin that needs nothing but itself.
58
+ */
59
+ available?: (ctx: LoginMethodContext) => boolean;
38
60
  }
39
61
  export interface PluginImplemnetation {
40
62
  (Renderer?: AuthenticationRenderer): FC<AuthenticationRendererProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,2BAA2B,EAAG,MAAM,uCAAuC,CAAA;AAExI,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAChD,qBAAqB,EAAE,oBAAoB,GAAG,mBAAmB,CAClE,EAAE,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,cAAc,CAAC;IACrD,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,oBAAoB,CAAA;IACpC,QAAQ,CAAC,EAAE,sBAAsB,CAAA;IACjC;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,cAAc,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yFAAyF;IACzF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,mBAAmB,CAAA;IAC9B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,sCAAsC;IACtC,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,CAAC,QAAQ,CAAC,EAAE,sBAAsB,GAAG,EAAE,CAAC,2BAA2B,CAAC,CAAA;CACrE"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,2BAA2B,EAAG,MAAM,uCAAuC,CAAA;AAExI,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAChD,qBAAqB,EAAE,oBAAoB,GAAG,mBAAmB,CAClE,EAAE,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,cAAc,CAAC;IACrD,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,oBAAoB,CAAA;IACpC,QAAQ,CAAC,EAAE,sBAAsB,CAAA;IACjC;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,cAAc,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yFAAyF;IACzF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,mBAAmB,CAAA;IAC9B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,sCAAsC;IACtC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAA;CACjD;AAED,MAAM,WAAW,oBAAoB;IACnC,CAAC,QAAQ,CAAC,EAAE,sBAAsB,GAAG,EAAE,CAAC,2BAA2B,CAAC,CAAA;CACrE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/client-auth",
3
- "version": "0.1.18-rc.13",
3
+ "version": "0.1.18-rc.14",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -54,10 +54,10 @@
54
54
  "@owlmeans/auth-common": "^0.1.18-rc.9",
55
55
  "@owlmeans/basic-envelope": "^0.1.18-rc.9",
56
56
  "@owlmeans/basic-keys": "^0.1.18-rc.9",
57
- "@owlmeans/client": "^0.1.18-rc.10",
57
+ "@owlmeans/client": "^0.1.18-rc.11",
58
58
  "@owlmeans/client-context": "^0.1.18-rc.9",
59
59
  "@owlmeans/client-entrypoint": "^0.1.18-rc.9",
60
- "@owlmeans/client-flow": "^0.1.18-rc.11",
60
+ "@owlmeans/client-flow": "^0.1.18-rc.12",
61
61
  "@owlmeans/client-resource": "^0.1.18-rc.9",
62
62
  "@owlmeans/client-socket": "^0.1.18-rc.9",
63
63
  "@owlmeans/config": "^0.1.18-rc.8",
@@ -69,7 +69,7 @@
69
69
  "@owlmeans/i18n": "^0.1.18-rc.6",
70
70
  "@owlmeans/resource": "^0.1.18-rc.7",
71
71
  "@owlmeans/socket": "^0.1.18-rc.7",
72
- "@owlmeans/web-flow": "^0.1.18-rc.11",
72
+ "@owlmeans/web-flow": "^0.1.18-rc.12",
73
73
  "@scure/base": "^2.3.0"
74
74
  },
75
75
  "peerDependencies": {
@@ -7,9 +7,35 @@ export interface ResolvedCredit {
7
7
  line: string | null
8
8
  }
9
9
 
10
+ /**
11
+ * The years one notice covers.
12
+ *
13
+ * A range only while the first year is genuinely in the past — an app configured with the current
14
+ * year, or with a year a skewed clock puts in the future, still gets a well-formed notice rather
15
+ * than `© 2026–2026` or a range that runs backwards.
16
+ */
17
+ const years = (since: number | undefined, now: number): string =>
18
+ since != null && since > 0 && since < now ? `${since}–${now}` : `${now}`
19
+
20
+ /**
21
+ * A configured value that was actually SET.
22
+ *
23
+ * Empty is how a build-time default spells "unset", and this config is filled from environment
24
+ * variables a platform delivers — `BRANDING_ORGANIZATION: meta.brandingOrganization ?? ''` is the
25
+ * shape of every one of them. `??` does not fall through an empty string, so an undelivered
26
+ * organization used to win the fallback chain and compose a line ending in a bare dash.
27
+ */
28
+ const set = (value?: string | null): string | null =>
29
+ value != null && value.trim() !== '' ? value : null
30
+
10
31
  /**
11
32
  * What the bottom of the sign-in screen says.
12
33
  *
34
+ * It is a copyright notice, so it is composed as one: `© <year> <holder>`. That is the whole
35
+ * reason `copyright` defaults to on — the name on its own reads as a caption, and an application
36
+ * that means to assert a copyright would have had to write the mark and the year into a literal
37
+ * `line` to get one.
38
+ *
13
39
  * The organization falls back to its slug because an organization record carries no readable name
14
40
  * — so "no name" is the ordinary case, not an error, and a screen that rendered an empty line for
15
41
  * it would be worse than one that renders the slug.
@@ -21,17 +47,29 @@ export const resolveCredit = (
21
47
  cfg?: LoginCreditConfig, brand?: BrandSettings, service?: string
22
48
  ): ResolvedCredit => {
23
49
  const poweredBy = cfg?.poweredBy ?? true
24
- if (cfg?.line != null && cfg.line !== '') {
25
- return { poweredBy, line: cfg.line }
50
+ const literal = set(cfg?.line)
51
+ if (literal != null) {
52
+ return { poweredBy, line: literal }
26
53
  }
27
54
 
28
- const product = cfg?.product ?? brand?.name ?? service ?? null
29
- const organization = cfg?.organization ?? brand?.organization
30
- ?? cfg?.entity ?? brand?.entity ?? null
55
+ const product = set(cfg?.product) ?? set(brand?.name) ?? set(service)
56
+ const organization = set(cfg?.organization) ?? set(brand?.organization)
57
+ ?? set(cfg?.entity) ?? set(brand?.entity)
31
58
 
32
- const line = product != null && organization != null && product !== organization
33
- ? `${product} ${organization}`
34
- : product ?? organization
59
+ // Whoever the notice names. A product with no organization behind it holds its own copyright,
60
+ // which is why this falls through to the product rather than dropping the notice.
61
+ const holder = set(cfg?.holder) ?? organization ?? product
62
+ const wording = typeof cfg?.copyright === 'string' ? set(cfg.copyright) : null
63
+ const notice = cfg?.copyright === false || holder == null
64
+ ? organization
65
+ : wording ?? `© ${years(cfg?.since, new Date().getFullYear())} ${holder}`
35
66
 
36
- return { poweredBy, line: line != null && line !== '' ? line : null }
67
+ // The product is named beside the notice only when it is not already the thing being claimed —
68
+ // "OwlMeans — © 2026 OwlMeans" says the name twice and neither time usefully.
69
+ return {
70
+ poweredBy,
71
+ line: product != null && notice != null && product !== holder
72
+ ? `${product} — ${notice}`
73
+ : notice ?? product,
74
+ }
37
75
  }
@@ -9,22 +9,23 @@ import { acceptTerms, resolveTerms, termsAccepted } from './terms.js'
9
9
  import { resolveCredit } from './credit.js'
10
10
 
11
11
  /**
12
- * The sign-in screen every application gets, whether or not it registered a styled one.
13
- *
14
- * It exists because a relying party must render SOMETHING rather than start a flow on its own, and
15
- * a relying party may not depend on a UI family. So this is deliberately plain: raw elements and
16
- * inline styles, no Tailwind class that a consumer's stylesheet would have to scan for, no shadcn
17
- * primitive a consumer would have to vendor. An application that registers a real screen through
18
- * `login().registerScreen(...)` never sees it.
12
+ * The page the card sits in.
19
13
  *
20
- * Because it is the floor rather than the design, it still has to be correct: it offers the same
21
- * methods, enforces the same terms confirmation, and renders the same credit line.
14
+ * It carries its own viewport height because this screen is rendered straight out of the
15
+ * dispatcher, into whatever the application happens to have around it which is usually nothing
16
+ * with a height, so a percentage minimum would resolve to zero and leave the card at the top.
22
17
  */
23
- const box: CSSProperties = {
24
- maxWidth: '24rem', margin: '10vh auto', padding: '1.5rem',
18
+ const page: CSSProperties = {
19
+ display: 'flex', alignItems: 'center', justifyContent: 'center',
20
+ minHeight: '100dvh', padding: '1rem',
25
21
  fontFamily: 'system-ui, sans-serif', lineHeight: 1.5,
26
22
  }
27
23
 
24
+ // Centred throughout, so the plain screen and the styled one read the same way.
25
+ const box: CSSProperties = {
26
+ width: '100%', maxWidth: '24rem', padding: '1.5rem', textAlign: 'center',
27
+ }
28
+
28
29
  const button = (emphasis?: string): CSSProperties => ({
29
30
  display: 'block', width: '100%', marginTop: '.5rem', padding: '.625rem 1rem',
30
31
  fontSize: '1rem', cursor: 'pointer', borderRadius: '.375rem',
@@ -32,6 +33,19 @@ const button = (emphasis?: string): CSSProperties => ({
32
33
  ...(emphasis === 'primary' ? { fontWeight: 600 } : {}),
33
34
  })
34
35
 
36
+ /**
37
+ * The sign-in screen every application gets, whether or not it registered a styled one.
38
+ *
39
+ * It exists because a relying party must render SOMETHING rather than start a flow on its own, and
40
+ * a relying party may not depend on a UI family. So this is deliberately plain: raw elements and
41
+ * inline styles, no Tailwind class that a consumer's stylesheet would have to scan for, no shadcn
42
+ * primitive a consumer would have to vendor. An application that registers a real screen through
43
+ * `login().registerScreen(...)` never sees it.
44
+ *
45
+ * Because it is the floor rather than the design, it still has to be correct: it offers the same
46
+ * methods, enforces the same terms confirmation, centres the same way, and renders the same
47
+ * credit line.
48
+ */
35
49
  export const FallbackLoginScreen: FC<LoginScreenProps> = props => {
36
50
  const context = useContext() as unknown as LoginContext
37
51
  const t = props.translate ?? ((_key: string, defaultValue: string) => defaultValue)
@@ -68,7 +82,7 @@ export const FallbackLoginScreen: FC<LoginScreenProps> = props => {
68
82
  acceptTerms(resolved, value)
69
83
  }, [resolved])
70
84
 
71
- return <div style={box}>
85
+ return <div data-login-screen style={page}><div style={box}>
72
86
  <h1 style={{ fontSize: '1.25rem', marginBottom: '.25rem' }}>
73
87
  {props.title ?? t('login.title', 'Sign in')}
74
88
  </h1>
@@ -118,5 +132,5 @@ export const FallbackLoginScreen: FC<LoginScreenProps> = props => {
118
132
  {credit.poweredBy && credit.line != null && ' · '}
119
133
  {credit.line}
120
134
  </p>}
121
- </div>
135
+ </div></div>
122
136
  }
@@ -1,4 +1,4 @@
1
- import type { ComponentType, ReactNode } from 'react'
1
+ import type { ComponentType, CSSProperties, ReactNode } from 'react'
2
2
  import type { LazyService, BasicContext } from '@owlmeans/context'
3
3
  import type { LoginMethodEmphasis, LoginScreenConfig, LoginTermsConfig } from '@owlmeans/config'
4
4
 
@@ -206,6 +206,14 @@ export interface LoginScreenProps {
206
206
  footer?: ReactNode
207
207
  className?: string
208
208
  containerClassName?: string
209
+ /**
210
+ * Inline overrides for the screen's outer box.
211
+ *
212
+ * It exists because the outer box carries its viewport height inline rather than as a utility
213
+ * class, and an escape hatch that a class can no longer provide has to be provided some other
214
+ * way. See the note on the screen itself.
215
+ */
216
+ style?: CSSProperties
209
217
  }
210
218
 
211
219
  export type LoginScreenComponent = ComponentType<LoginScreenProps>
@@ -9,6 +9,11 @@ export const ed25519BasicUIPlugin: AuthenticationPlugin = {
9
9
 
10
10
  method: { order: 300, icon: 'key', emphasis: 'secondary' },
11
11
 
12
+ // This package ships no UI family, so the form below is a `Renderer` a panel package assigns
13
+ // (`@owlmeans/web-panel/auth/plugins`, `@owlmeans/mui-panel/auth/plugins`). Until one does, the
14
+ // Implementation throws on mount — so the sign-in screen must not offer the method.
15
+ requiresRenderer: true,
16
+
12
17
  Implementation: Renderer => ({ type, stage, control, params }) => {
13
18
 
14
19
  type = type ?? AuthenticationType.BasicEd25519
@@ -1,21 +1,43 @@
1
1
  import { CAUTHEN_AUTHEN_TYPED } from '@owlmeans/auth'
2
2
  import type { ClientEntrypoint } from '@owlmeans/client-entrypoint'
3
3
  import { DEFAULT_METHOD_ORDER, LOGIN_SERVICE } from '../../login/consts.js'
4
- import type { LoginMethod, LoginMethodSource, LoginService } from '../../login/types.js'
4
+ import type { LoginMethod, LoginMethodContext, LoginMethodSource, LoginService } from '../../login/types.js'
5
+ import type { AuthenticationPlugin } from './types.js'
5
6
  import { listAuthPlugins } from './registry.js'
6
7
 
7
8
  /**
8
- * Every registered authentication plugin that declares itself offerable, as a sign-in method.
9
+ * Whether a registered plugin may be put on the sign-in screen of THIS application.
10
+ *
11
+ * The registry is global and is filled by side-effect imports, so "registered" means only that
12
+ * some module was pulled into the bundle — three separate reasons why that is not enough:
9
13
  *
10
- * A plugin without `method` is deliberately invisible here: `re-captcha` is a STEP inside another
11
- * flow, not a way to sign in, and a registry that offered everything registered would put it on
12
- * the screen as a choice.
14
+ * 1. No `method`: `re-captcha` is a STEP inside another flow, not a way to sign in.
15
+ * 2. No renderer: a plugin that declares `requiresRenderer` throws the moment its screen mounts
16
+ * unless a UI package (`web-panel`, `mui-panel`) assigned one. An app that imported the plugin
17
+ * host without that package would be offering buttons whose only outcome is a broken page.
18
+ * 3. Not wired: a plugin whose flow needs a service its context never appended fails on the
19
+ * lookup instead. Packages register their plugins in groups, so an app that wanted one of them
20
+ * gets the rest too, and the rest have to be able to say they do not apply here.
21
+ */
22
+ const offerable = (plugin: AuthenticationPlugin, ctx: LoginMethodContext): boolean => {
23
+ if (plugin.method == null || plugin.method.hidden === true) {
24
+ return false
25
+ }
26
+ if (plugin.requiresRenderer === true && plugin.Renderer == null) {
27
+ return false
28
+ }
29
+
30
+ return plugin.method.available?.(ctx) !== false
31
+ }
32
+
33
+ /**
34
+ * Every registered authentication plugin that declares itself offerable, as a sign-in method.
13
35
  */
14
36
  export const pluginMethodSource: LoginMethodSource = {
15
37
  alias: 'authentication-plugins',
16
38
 
17
- list: () => listAuthPlugins()
18
- .filter(plugin => plugin.method != null && plugin.method.hidden !== true)
39
+ list: ctx => listAuthPlugins()
40
+ .filter(plugin => offerable(plugin, ctx))
19
41
  .map((plugin): LoginMethod => {
20
42
  const meta = plugin.method!
21
43
  const type = plugin.type
@@ -8,6 +8,10 @@ export const reCaptchaPlugin: AuthenticationPlugin = {
8
8
  // A STEP inside another flow, never a way to sign in — so it is registered and never offered.
9
9
  method: { hidden: true },
10
10
 
11
+ // Its widget is a `Renderer` a panel package assigns. `hidden` already keeps it off the sign-in
12
+ // screen; this is what the flow that DOES drive it can check before handing it a stage.
13
+ requiresRenderer: true,
14
+
11
15
  Implementation: Renderer => ({ type, stage, control, params }) => {
12
16
  Renderer = Renderer ?? reCaptchaPlugin.Renderer
13
17
 
@@ -15,6 +15,10 @@ export const tunnelConsumerUIPlugin: AuthenticationPlugin = {
15
15
 
16
16
  method: { order: 400, icon: 'wallet' },
17
17
 
18
+ // The PIN form is a `Renderer` a panel package assigns; without one the Implementation throws on
19
+ // mount, so the method must not be offered.
20
+ requiresRenderer: true,
21
+
18
22
  Implementation: renderer => ({ type, stage, control, params }) => {
19
23
  type = type ?? AuthenticationType.WalletConsumer
20
24
  const Renderer: TunnelAuthenticationRenderer | undefined = renderer
@@ -1,5 +1,6 @@
1
1
  import type { FC } from 'react'
2
2
  import type { LoginMethodEmphasis } from '@owlmeans/config'
3
+ import type { LoginMethodContext } from '../../login/types.js'
3
4
  import type { AuthenticationControl, AuthenticationRenderer, AuthenticationRendererProps, } from '../components/authentication/types.js'
4
5
 
5
6
  export interface AuthenticationPlugin extends Pick<
@@ -8,6 +9,15 @@ export interface AuthenticationPlugin extends Pick<
8
9
  type: string
9
10
  Implementation: PluginImplemnetation
10
11
  Renderer?: AuthenticationRenderer
12
+ /**
13
+ * This plugin's `Implementation` cannot render without a `Renderer` a UI package supplies.
14
+ *
15
+ * It is declared rather than inferred because there is nothing to infer it from: a plugin that
16
+ * renders its own form and one that throws `Renderer is not defined` are the same object until
17
+ * the screen mounts. Declaring it is what lets the sign-in screen leave out a method whose
18
+ * renderer nobody registered, instead of offering a button that crashes the page it opens.
19
+ */
20
+ requiresRenderer?: boolean
11
21
  /**
12
22
  * How this method presents itself on the sign-in screen.
13
23
  *
@@ -39,6 +49,18 @@ export interface AuthMethodMeta {
39
49
  restricted?: boolean
40
50
  /** Registered, but never a choice. */
41
51
  hidden?: boolean
52
+ /**
53
+ * Whether the application this method is about to be offered in actually wired it.
54
+ *
55
+ * The plugin registry is global and is written to by side-effect imports, so being registered
56
+ * says only that some bundle pulled the module in — and modules arrive in groups. An app that
57
+ * wanted one method out of a package gets every method that package registers, including ones
58
+ * whose first act is to look up a service its context never appended. This is where a plugin
59
+ * says so, per context, at render time; `false` leaves it off the screen.
60
+ *
61
+ * Absent means "always", which is right for a plugin that needs nothing but itself.
62
+ */
63
+ available?: (ctx: LoginMethodContext) => boolean
42
64
  }
43
65
 
44
66
  export interface PluginImplemnetation {
@@ -3,6 +3,9 @@ import { makeTestContext } from './context.js'
3
3
  import { appendLogin, makeLoginService } from '../src/login/service.js'
4
4
  import { resolveLoginMethods, primaryLoginMethod, registerMethodSource } from '../src/login/methods.js'
5
5
  import { resolveCredit } from '../src/login/credit.js'
6
+ import { pluginMethodSource } from '../src/manager/plugins/methods.js'
7
+ import { registerAuthPlugin } from '../src/manager/plugins/registry.js'
8
+ import type { AuthenticationPlugin } from '../src/manager/plugins/types.js'
6
9
  import { resumeAction, ResumeAction } from '../src/login/resume.js'
7
10
  import { LoginOutcome } from '../src/login/types.js'
8
11
  import type {
@@ -170,12 +173,44 @@ describe('login method resolution', () => {
170
173
  })
171
174
 
172
175
  describe('the credit line', () => {
173
- test('pairs the product with the organization', () => {
174
- expect(resolveCredit({ product: 'Taskly', organization: 'Acme' }).line).toBe('Taskly — Acme')
176
+ const year = new Date().getFullYear()
177
+
178
+ test('is a copyright NOTICE — the mark and the year, not a bare name', () => {
179
+ expect(resolveCredit({ product: 'OwlMeans', organization: 'OwlMeans' }).line)
180
+ .toBe(`© ${year} OwlMeans`)
181
+ })
182
+
183
+ test('pairs the product with the notice when the product is not the holder', () => {
184
+ expect(resolveCredit({ product: 'Taskly', organization: 'Acme' }).line)
185
+ .toBe(`Taskly — © ${year} Acme`)
175
186
  })
176
187
 
177
188
  test('falls back to the entity slug when the organization has no name', () => {
178
- expect(resolveCredit({ product: 'Taskly', entity: 'acme-7f2' }).line).toBe('Taskly — acme-7f2')
189
+ expect(resolveCredit({ product: 'Taskly', entity: 'acme-7f2' }).line)
190
+ .toBe(`Taskly — © ${year} acme-7f2`)
191
+ })
192
+
193
+ test('a first year in the past makes the notice a range', () => {
194
+ expect(resolveCredit({ organization: 'Acme', since: 2019 }).line).toBe(`© 2019–${year} Acme`)
195
+ // The current year is not a range, and neither is one a skewed clock puts ahead of it.
196
+ expect(resolveCredit({ organization: 'Acme', since: year }).line).toBe(`© ${year} Acme`)
197
+ expect(resolveCredit({ organization: 'Acme', since: year + 5 }).line).toBe(`© ${year} Acme`)
198
+ })
199
+
200
+ test('an explicit holder is who the notice names', () => {
201
+ expect(resolveCredit({ product: 'Taskly', organization: 'Taskly', holder: 'Acme Inc.' }).line)
202
+ .toBe(`Taskly — © ${year} Acme Inc.`)
203
+ })
204
+
205
+ test('an owner\'s own wording is used verbatim', () => {
206
+ expect(resolveCredit({ organization: 'Acme', copyright: '© Acme. All rights reserved.' }).line)
207
+ .toBe('© Acme. All rights reserved.')
208
+ })
209
+
210
+ test('switching the notice off leaves the bare pairing it used to be', () => {
211
+ expect(resolveCredit({ product: 'Taskly', organization: 'Acme', copyright: false }).line)
212
+ .toBe('Taskly — Acme')
213
+ expect(resolveCredit({ product: 'Taskly', copyright: false }).line).toBe('Taskly')
179
214
  })
180
215
 
181
216
  test('a literal line replaces the composition entirely', () => {
@@ -183,12 +218,70 @@ describe('the credit line', () => {
183
218
  .toBe('© Acme')
184
219
  })
185
220
 
221
+ test('nobody to name is nothing to render', () => {
222
+ expect(resolveCredit().line).toBeNull()
223
+ })
224
+
225
+ test('an EMPTY value is unset, not a value', () => {
226
+ // Exactly what a platform delivers for branding it does not have: every key present, the
227
+ // undelivered ones empty. `??` does not fall through an empty string, so the organization
228
+ // used to win the chain and compose "pisteva — " with nothing after the dash.
229
+ expect(resolveCredit({}, { name: 'pisteva', organization: '', entity: '' }).line)
230
+ .toBe(`© ${year} pisteva`)
231
+ expect(resolveCredit({ line: '', product: '', organization: '' }, { name: 'Taskly' }).line)
232
+ .toBe(`© ${year} Taskly`)
233
+ expect(resolveCredit({ copyright: ' ' }, { name: 'Taskly' }).line).toBe(`© ${year} Taskly`)
234
+ expect(resolveCredit({}, {}, '').line).toBeNull()
235
+ })
236
+
186
237
  test('the platform credit is on unless it is switched off', () => {
187
238
  expect(resolveCredit().poweredBy).toBe(true)
188
239
  expect(resolveCredit({ poweredBy: false }).poweredBy).toBe(false)
189
240
  })
190
241
  })
191
242
 
243
+ describe('the authentication-plugin method source', () => {
244
+ const plugin = (
245
+ over: Partial<AuthenticationPlugin> & { type: string }
246
+ ): AuthenticationPlugin => ({ Implementation: () => () => null, ...over })
247
+
248
+ const offered = (context: BasicContext<BasicConfig>): string[] =>
249
+ pluginMethodSource.list(methodCtx(context)).map(item => item.id)
250
+
251
+ test('a plugin that declares no method is not a way to sign in', () => {
252
+ const context = makeTestContext()
253
+ registerAuthPlugin(plugin({ type: 'step-in-a-flow' }))
254
+ registerAuthPlugin(plugin({ type: 'offerable', method: {} }))
255
+
256
+ expect(offered(context)).toContain('offerable')
257
+ expect(offered(context)).not.toContain('step-in-a-flow')
258
+ })
259
+
260
+ test('a plugin that needs a renderer nobody assigned is left off the screen', () => {
261
+ const context = makeTestContext()
262
+ // Exactly the state an app is in when it imported the plugin host but not a panel package:
263
+ // the plugin is registered, and mounting its screen throws.
264
+ registerAuthPlugin(plugin({ type: 'needs-ui', method: {}, requiresRenderer: true }))
265
+
266
+ expect(offered(context)).not.toContain('needs-ui')
267
+
268
+ registerAuthPlugin(plugin({
269
+ type: 'needs-ui', method: {}, requiresRenderer: true, Renderer: () => null,
270
+ }))
271
+
272
+ expect(offered(context)).toContain('needs-ui')
273
+ })
274
+
275
+ test('a plugin whose own wiring is absent says so and is left off', () => {
276
+ const context = makeTestContext()
277
+ registerAuthPlugin(plugin({
278
+ type: 'needs-wiring', method: { available: ctx => ctx.context.hasService('never-appended') },
279
+ }))
280
+
281
+ expect(offered(context)).not.toContain('needs-wiring')
282
+ })
283
+ })
284
+
192
285
  describe('resume outcomes', () => {
193
286
  test('map to exactly one action each', () => {
194
287
  expect(resumeAction(LoginOutcome.Handled)).toBe(ResumeAction.Stop)
package/build/.gitkeep DELETED
File without changes