@owlmeans/web-panel 0.1.18-rc.71 → 0.1.18-rc.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/web-panel/SKILL.md +30 -1
- package/build/auth/entrypoints.d.ts +1 -1
- package/build/auth/entrypoints.d.ts.map +1 -1
- package/build/components/login/i18n/be.json +10 -0
- package/build/components/login/i18n/de.json +10 -0
- package/build/components/login/i18n/en.json +10 -0
- package/build/components/login/i18n/es.json +10 -0
- package/build/components/login/i18n/fr.json +10 -0
- package/build/components/login/i18n/pl.json +10 -0
- package/build/components/login/i18n/ru.json +10 -0
- package/build/components/login/i18n/uk.json +10 -0
- package/build/components/login/i18n.d.ts +2 -0
- package/build/components/login/i18n.d.ts.map +1 -0
- package/build/components/login/i18n.js +28 -0
- package/build/components/login/i18n.js.map +1 -0
- package/build/components/login/index.d.ts +2 -0
- package/build/components/login/index.d.ts.map +1 -1
- package/build/components/login/index.js +2 -0
- package/build/components/login/index.js.map +1 -1
- package/build/components/login/provider.d.ts +20 -0
- package/build/components/login/provider.d.ts.map +1 -0
- package/build/components/login/provider.js +31 -0
- package/build/components/login/provider.js.map +1 -0
- package/build/components/login/screen.d.ts +1 -0
- package/build/components/login/screen.d.ts.map +1 -1
- package/build/components/login/screen.js +34 -14
- package/build/components/login/screen.js.map +1 -1
- package/build/components/login/types.d.ts +6 -1
- package/build/components/login/types.d.ts.map +1 -1
- package/package.json +20 -20
- package/src/components/login/i18n/be.json +10 -0
- package/src/components/login/i18n/de.json +10 -0
- package/src/components/login/i18n/en.json +10 -0
- package/src/components/login/i18n/es.json +10 -0
- package/src/components/login/i18n/fr.json +10 -0
- package/src/components/login/i18n/pl.json +10 -0
- package/src/components/login/i18n/ru.json +10 -0
- package/src/components/login/i18n/uk.json +10 -0
- package/src/components/login/i18n.ts +29 -0
- package/src/components/login/index.ts +3 -0
- package/src/components/login/provider.tsx +57 -0
- package/src/components/login/screen.tsx +107 -68
- package/src/components/login/types.ts +7 -1
- package/tests/harness/mount.tsx +12 -0
- package/tests/login-provider.spec.ts +114 -0
- package/tests/login.spec.ts +115 -0
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ but never started.
|
|
|
11
11
|
## Installation
|
|
12
12
|
|
|
13
13
|
```sh
|
|
14
|
-
bun add @owlmeans/web-panel@^0.1.18-rc.
|
|
14
|
+
bun add @owlmeans/web-panel@^0.1.18-rc.72
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
Peer requirements (the consuming app provides these): `react`, `react-dom`,
|
|
@@ -496,7 +496,7 @@ This package ships embedded agent skills under `agent-meta/`. After installing y
|
|
|
496
496
|
your project's skill store (`.agents/skills/`):
|
|
497
497
|
|
|
498
498
|
```sh
|
|
499
|
-
npx @owlmeans/agent-skills@^0.1.18-rc.
|
|
499
|
+
npx @owlmeans/agent-skills@^0.1.18-rc.51
|
|
500
500
|
```
|
|
501
501
|
|
|
502
502
|
The embedded files are version-matched to this package release. Do not edit them
|
package/agent-meta/manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"package": "@owlmeans/web-panel",
|
|
4
|
-
"version": "0.1.18-rc.
|
|
5
|
-
"generatedAt": "2026-10-
|
|
4
|
+
"version": "0.1.18-rc.72",
|
|
5
|
+
"generatedAt": "2026-10-06T11:45:57.685Z",
|
|
6
6
|
"canonicalRepo": "https://github.com/owlmeans/common",
|
|
7
7
|
"entries": [
|
|
8
8
|
{
|
|
@@ -8,7 +8,7 @@ user-invocable: false
|
|
|
8
8
|
# @owlmeans/web-panel
|
|
9
9
|
|
|
10
10
|
**Layer:** Web (React)
|
|
11
|
-
**Install:** `"@owlmeans/web-panel": "^0.1.18-rc.
|
|
11
|
+
**Install:** `"@owlmeans/web-panel": "^0.1.18-rc.72"` in `dependencies`
|
|
12
12
|
|
|
13
13
|
## Key Exports
|
|
14
14
|
|
|
@@ -21,6 +21,7 @@ user-invocable: false
|
|
|
21
21
|
| `ThemeToggle` / `useColorScheme` | The light/dark switcher (`ThemeToggleProps`, `ThemeToggleLabels`) and the hook behind it (`ColorSchemeModel`) — see *Light and dark* below |
|
|
22
22
|
| `SocketReloadDialog` | The global "connection lost — try again / reload" prompt (opt in via `cfg.socket.reloadDialog`) `PanelApp` mounts automatically — see below. The hooks it reads, `useSocketStatus` and `useSocketRetry`, are imported from `@owlmeans/client-socket`, not from this package |
|
|
23
23
|
| `Link` | An `<a>` addressing an entrypoint alias (or a literal `src`), with the label taken from i18n |
|
|
24
|
+
| `LoginProviderNote` | The provider disclosure (`LoginProviderNoteProps`) — see *The provider disclosure* below |
|
|
24
25
|
| `LoginScreen` / `LocalizedLoginScreen` / `appendLoginScreen` | The identity-provider choice screen — see `login-methods`. `LoginScreen` is pure w.r.t. `locale` too, exactly like `translate`: it is a prop, defaulting to nothing, never an implicit `useLanguage()` read, because a component that reaches for i18n context directly crashes an app mounted without one. `LocalizedLoginScreen` supplies `useLanguage()`'s value when the caller does not pass its own |
|
|
25
26
|
| `render(context, opts?)` | Mounts the tree inside `PanelApp`, with the browser language detector installed on the i18n instance. `opts` is `RenderOptions` plus `rootClassName` |
|
|
26
27
|
| `PanelApp` | That wrapper on its own — the themed root `div` plus the i18n provider — for a host that mounts the tree itself |
|
|
@@ -449,6 +450,34 @@ prop, never read from context directly — for `Intl.ListFormat` and a custom do
|
|
|
449
450
|
ordinary one, with no special case. Pinned by `tests/login.spec.ts` → the "with billing, product and
|
|
450
451
|
custom documents configured" and "the Terms confirmation deferred to a step" blocks.
|
|
451
452
|
|
|
453
|
+
### The provider disclosure — `LoginProviderNote`
|
|
454
|
+
|
|
455
|
+
`LoginScreen` renders `useLoginMethods().provider` (`@owlmeans/client-panel/auth`, resolution rules
|
|
456
|
+
there) through `components/login/provider.tsx`:
|
|
457
|
+
`<div role="note" data-login-provider data-placement="top|inline">` — a `ShieldCheck` icon, the
|
|
458
|
+
sentence, and, when `info` resolved, `<a data-login-provider-info target="_blank"
|
|
459
|
+
rel="noopener noreferrer">More information</a>`. Never a `header`/`nav`: it is a disclosure, not a
|
|
460
|
+
landmark.
|
|
461
|
+
|
|
462
|
+
- **No provider → the DOM is exactly the pre-provider screen** (no note, no stage, title
|
|
463
|
+
`login.title`).
|
|
464
|
+
- **`top`** (the platform's own hosts) — the strip is the FIRST child of `[data-login-screen]`,
|
|
465
|
+
full width, at the screen's top edge; the card sits in `<div data-login-stage>`, which takes the
|
|
466
|
+
remaining height and centres it. The screen's column layout, its zero padding, the stage's flex
|
|
467
|
+
centring/padding and the strip's width are INLINE styles (same reason as the screen height —
|
|
468
|
+
`login-methods` → Layout); classes there are cosmetic only.
|
|
469
|
+
- **`inline`** (an owner's own domain) — the note is one line inside `CardContent`, directly under
|
|
470
|
+
the methods and above the terms; the screen keeps its ordinary shape.
|
|
471
|
+
- The card title becomes `login.provider.title` ("Sign in to {{product}}") whenever a provider
|
|
472
|
+
resolves; `props.title` still wins.
|
|
473
|
+
- Copy: `login.provider.{title,top,inline,more}` in all eight languages
|
|
474
|
+
(`components/login/i18n/*.json`), registered by `components/login/i18n.ts` into the SAME `auth`
|
|
475
|
+
library resource as `client-auth`'s login copy (deep-merged; this package owns only the
|
|
476
|
+
`login.provider` subtree). Names are filled after translation by `loginProviderHelper.fill`.
|
|
477
|
+
- Still exactly one `[data-login-terms]` in either placement. Pinned by `tests/login.spec.ts` →
|
|
478
|
+
"the provider disclosure" (`?provider=top|inline` in the harness) and
|
|
479
|
+
`tests/login-provider.spec.ts` (resolver, `fill`, eight-language key/placeholder parity).
|
|
480
|
+
|
|
452
481
|
## Subpath: `./consent`
|
|
453
482
|
|
|
454
483
|
`PanelCookieConsent` and `PanelCookiePolicy` — `@owlmeans/web-consent`'s components bound to this
|
|
@@ -6,5 +6,5 @@ export declare const entrypoints: (import("@owlmeans/client-entrypoint").ClientP
|
|
|
6
6
|
query: Partial<import("@owlmeans/auth").AuthToken>;
|
|
7
7
|
}, undefined>> | import("@owlmeans/client-entrypoint").ClientProtocolEntrypoint<import("@owlmeans/entrypoint").EntrypointProtocol<{
|
|
8
8
|
query: import("@owlmeans/auth").AuthToken;
|
|
9
|
-
},
|
|
9
|
+
}, undefined>>)[];
|
|
10
10
|
//# sourceMappingURL=entrypoints.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entrypoints.d.ts","sourceRoot":"","sources":["../../src/auth/entrypoints.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW;;;;;;;;
|
|
1
|
+
{"version":3,"file":"entrypoints.d.ts","sourceRoot":"","sources":["../../src/auth/entrypoints.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW;;;;;;;;iBAAuC,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"login": {
|
|
3
|
+
"provider": {
|
|
4
|
+
"title": "Уваход у {{product}}",
|
|
5
|
+
"top": "Гэтую праграму размяшчае {{operator}} ад імя {{product}}. Для ўваходу выкарыстоўваецца {{provider}}.",
|
|
6
|
+
"inline": "Уваход забяспечвае {{provider}} ад імя {{product}}.",
|
|
7
|
+
"more": "Падрабязней"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"login": {
|
|
3
|
+
"provider": {
|
|
4
|
+
"title": "Bei {{product}} anmelden",
|
|
5
|
+
"top": "Diese App wird von {{operator}} im Auftrag von {{product}} gehostet. Sie melden sich mit {{provider}} an.",
|
|
6
|
+
"inline": "Die Anmeldung stellt {{provider}} im Auftrag von {{product}} bereit.",
|
|
7
|
+
"more": "Weitere Informationen"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"login": {
|
|
3
|
+
"provider": {
|
|
4
|
+
"title": "Sign in to {{product}}",
|
|
5
|
+
"top": "This app is hosted by {{operator}} on behalf of {{product}}. You sign in with {{provider}}.",
|
|
6
|
+
"inline": "Sign-in is provided by {{provider}} on behalf of {{product}}.",
|
|
7
|
+
"more": "More information"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"login": {
|
|
3
|
+
"provider": {
|
|
4
|
+
"title": "Iniciar sesión en {{product}}",
|
|
5
|
+
"top": "Esta aplicación está alojada por {{operator}} en nombre de {{product}}. Inicias sesión con {{provider}}.",
|
|
6
|
+
"inline": "El inicio de sesión lo proporciona {{provider}} en nombre de {{product}}.",
|
|
7
|
+
"more": "Más información"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"login": {
|
|
3
|
+
"provider": {
|
|
4
|
+
"title": "Connexion à {{product}}",
|
|
5
|
+
"top": "Cette application est hébergée par {{operator}} pour le compte de {{product}}. Vous vous connectez avec {{provider}}.",
|
|
6
|
+
"inline": "La connexion est assurée par {{provider}} pour le compte de {{product}}.",
|
|
7
|
+
"more": "En savoir plus"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"login": {
|
|
3
|
+
"provider": {
|
|
4
|
+
"title": "Zaloguj się do {{product}}",
|
|
5
|
+
"top": "Ta aplikacja jest hostowana przez {{operator}} w imieniu {{product}}. Logujesz się przez {{provider}}.",
|
|
6
|
+
"inline": "Logowanie zapewnia {{provider}} w imieniu {{product}}.",
|
|
7
|
+
"more": "Więcej informacji"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"login": {
|
|
3
|
+
"provider": {
|
|
4
|
+
"title": "Вход в {{product}}",
|
|
5
|
+
"top": "Это приложение размещает {{operator}} от имени {{product}}. Для входа используется {{provider}}.",
|
|
6
|
+
"inline": "Вход обеспечивает {{provider}} от имени {{product}}.",
|
|
7
|
+
"more": "Подробнее"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"login": {
|
|
3
|
+
"provider": {
|
|
4
|
+
"title": "Вхід до {{product}}",
|
|
5
|
+
"top": "Цей застосунок розміщує {{operator}} від імені {{product}}. Для входу використовується {{provider}}.",
|
|
6
|
+
"inline": "Вхід забезпечує {{provider}} від імені {{product}}.",
|
|
7
|
+
"more": "Докладніше"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../src/components/login/i18n.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { i18nHelper } from '@owlmeans/i18n';
|
|
2
|
+
import en from './i18n/en.json' with { type: 'json' };
|
|
3
|
+
import pl from './i18n/pl.json' with { type: 'json' };
|
|
4
|
+
import ru from './i18n/ru.json' with { type: 'json' };
|
|
5
|
+
import be from './i18n/be.json' with { type: 'json' };
|
|
6
|
+
import uk from './i18n/uk.json' with { type: 'json' };
|
|
7
|
+
import es from './i18n/es.json' with { type: 'json' };
|
|
8
|
+
import de from './i18n/de.json' with { type: 'json' };
|
|
9
|
+
import fr from './i18n/fr.json' with { type: 'json' };
|
|
10
|
+
import { AUTH_RESOURCE } from './consts.local.js';
|
|
11
|
+
/**
|
|
12
|
+
* The provider disclosure's copy (`login.provider.*`), registered into the SAME `auth` library
|
|
13
|
+
* resource `@owlmeans/client-auth/login` fills with the rest of the sign-in screen.
|
|
14
|
+
*
|
|
15
|
+
* `_addI18n` pushes and the bundles are merged deeply by tier and priority, so this chunk lands
|
|
16
|
+
* beside `login.title`/`login.terms.*` rather than replacing the `login` subtree. It lives here, not
|
|
17
|
+
* in `client-auth`, because only this package renders the disclosure — and `client-auth` is pinned
|
|
18
|
+
* exactly by applications that must not be pulled into a release for it.
|
|
19
|
+
*/
|
|
20
|
+
i18nHelper.addI18nLib('en', AUTH_RESOURCE, en);
|
|
21
|
+
i18nHelper.addI18nLib('pl', AUTH_RESOURCE, pl);
|
|
22
|
+
i18nHelper.addI18nLib('ru', AUTH_RESOURCE, ru);
|
|
23
|
+
i18nHelper.addI18nLib('be', AUTH_RESOURCE, be);
|
|
24
|
+
i18nHelper.addI18nLib('uk', AUTH_RESOURCE, uk);
|
|
25
|
+
i18nHelper.addI18nLib('es', AUTH_RESOURCE, es);
|
|
26
|
+
i18nHelper.addI18nLib('de', AUTH_RESOURCE, de);
|
|
27
|
+
i18nHelper.addI18nLib('fr', AUTH_RESOURCE, fr);
|
|
28
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../../src/components/login/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD;;;;;;;;GAQG;AACH,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;AAC9C,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;AAC9C,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;AAC9C,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;AAC9C,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;AAC9C,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;AAC9C,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;AAC9C,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import './i18n.js';
|
|
1
2
|
export * from './screen.js';
|
|
2
3
|
export * from './terms.js';
|
|
3
4
|
export type * from './types.js';
|
|
4
5
|
export * from './credit.js';
|
|
6
|
+
export * from './provider.js';
|
|
5
7
|
export * from './consts.js';
|
|
6
8
|
export * from './icons.js';
|
|
7
9
|
export * from './append.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/login/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,mBAAmB,YAAY,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/login/index.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,CAAA;AAElB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,mBAAmB,YAAY,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/login/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAE1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/login/index.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,CAAA;AAElB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAE1B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { FC } from 'react';
|
|
2
|
+
import type { LoginProviderNoteProps } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Who signs the person in, and on whose behalf.
|
|
5
|
+
*
|
|
6
|
+
* A sign-in page that a third party runs for an application has to say so wherever the
|
|
7
|
+
* application's own name appears: the relationship in a sentence, and a "More information" link.
|
|
8
|
+
* Without it the page is a stranger's form wearing someone else's name — which is precisely what a
|
|
9
|
+
* browser's impersonation heuristics look for.
|
|
10
|
+
*
|
|
11
|
+
* `top` is a full-width strip the screen renders as its FIRST child, above the card (the platform's
|
|
12
|
+
* own hosts); `inline` is one line inside the card, under the methods (an owner's own domain).
|
|
13
|
+
* A `role="note"` block, never `header`/`nav`: it is a disclosure, not page chrome, and a screen
|
|
14
|
+
* that grew a landmark here would be read as a second banner.
|
|
15
|
+
*
|
|
16
|
+
* The names are put in after translation (`loginProviderHelper.fill`), so word order stays the
|
|
17
|
+
* translator's and nothing but plain text ever reaches the markup.
|
|
18
|
+
*/
|
|
19
|
+
export declare const LoginProviderNote: FC<LoginProviderNoteProps>;
|
|
20
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/components/login/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAI/B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAExD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAkCxD,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ShieldCheck } from 'lucide-react';
|
|
3
|
+
import { cn } from '../../@/lib/utils.js';
|
|
4
|
+
import { loginProviderHelper } from '@owlmeans/client-panel/auth';
|
|
5
|
+
/**
|
|
6
|
+
* Who signs the person in, and on whose behalf.
|
|
7
|
+
*
|
|
8
|
+
* A sign-in page that a third party runs for an application has to say so wherever the
|
|
9
|
+
* application's own name appears: the relationship in a sentence, and a "More information" link.
|
|
10
|
+
* Without it the page is a stranger's form wearing someone else's name — which is precisely what a
|
|
11
|
+
* browser's impersonation heuristics look for.
|
|
12
|
+
*
|
|
13
|
+
* `top` is a full-width strip the screen renders as its FIRST child, above the card (the platform's
|
|
14
|
+
* own hosts); `inline` is one line inside the card, under the methods (an owner's own domain).
|
|
15
|
+
* A `role="note"` block, never `header`/`nav`: it is a disclosure, not page chrome, and a screen
|
|
16
|
+
* that grew a landmark here would be read as a second banner.
|
|
17
|
+
*
|
|
18
|
+
* The names are put in after translation (`loginProviderHelper.fill`), so word order stays the
|
|
19
|
+
* translator's and nothing but plain text ever reaches the markup.
|
|
20
|
+
*/
|
|
21
|
+
export const LoginProviderNote = ({ model, translate, className }) => {
|
|
22
|
+
const top = model.placement === 'top';
|
|
23
|
+
const sentence = top
|
|
24
|
+
? translate('login.provider.top', 'This app is hosted by {{operator}} on behalf of {{product}}. You sign in with {{provider}}.')
|
|
25
|
+
: translate('login.provider.inline', 'Sign-in is provided by {{provider}} on behalf of {{product}}.');
|
|
26
|
+
return _jsxs("div", { role: "note", "data-login-provider": true, "data-placement": model.placement,
|
|
27
|
+
// The strip's full width is inline for the same reason the screen's height is: it is the part
|
|
28
|
+
// of the layout a stale `@source` scan must never be able to drop.
|
|
29
|
+
style: top ? { width: '100%', boxSizing: 'border-box' } : undefined, className: cn('flex items-start justify-center gap-2 text-center text-xs text-muted-foreground', top && 'border-b bg-muted px-4 py-2', className), children: [_jsx(ShieldCheck, { "aria-hidden": "true", className: "size-4 shrink-0" }), _jsxs("span", { children: [loginProviderHelper.fill(sentence, model), model.info != null && _jsxs(_Fragment, { children: [' ', _jsx("a", { "data-login-provider-info": true, href: model.info, target: "_blank", rel: "noopener noreferrer", className: "underline underline-offset-2 hover:text-foreground", children: translate('login.provider.more', 'More information') })] })] })] });
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/components/login/provider.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAA;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAGjE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA+B,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;IAC/F,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAA;IACrC,MAAM,QAAQ,GAAG,GAAG;QAClB,CAAC,CAAC,SAAS,CAAC,oBAAoB,EAAE,6FAA6F,CAAC;QAChI,CAAC,CAAC,SAAS,CAAC,uBAAuB,EAAE,+DAA+D,CAAC,CAAA;IAEvG,OAAO,eACL,IAAI,EAAC,MAAM,iDAEK,KAAK,CAAC,SAAS;QAC/B,8FAA8F;QAC9F,mEAAmE;QACnE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,EACnE,SAAS,EAAE,EAAE,CACX,iFAAiF,EACjF,GAAG,IAAI,6BAA6B,EACpC,SAAS,CACV,aAED,KAAC,WAAW,mBAAa,MAAM,EAAC,SAAS,EAAC,iBAAiB,GAAG,EAC9D,2BACG,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EACzC,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,8BACpB,GAAG,EACJ,8CAEE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAC3D,SAAS,EAAC,oDAAoD,YAE7D,SAAS,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,GACnD,IACH,IACE,IACH,CAAA;AACR,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../../src/components/login/screen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAA;AAO/C,OAAO,EAAoB,KAAK,gBAAgB,EAAqB,MAAM,6BAA6B,CAAA;AAMxG;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../../src/components/login/screen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAA;AAO/C,OAAO,EAAoB,KAAK,gBAAgB,EAAqB,MAAM,6BAA6B,CAAA;AAMxG,OAAO,WAAW,CAAA;AAElB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAqI5C,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,gBAAgB,CASrD,CAAA"}
|
|
@@ -5,12 +5,14 @@ import { Button } from '../../@/components/ui/button.js';
|
|
|
5
5
|
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '../../@/components/ui/card.js';
|
|
6
6
|
import { cn } from '../../@/lib/utils.js';
|
|
7
7
|
import { useI18nLib, useLanguage } from '@owlmeans/client-i18n';
|
|
8
|
-
import { useLoginMethods } from '@owlmeans/client-panel/auth';
|
|
8
|
+
import { loginProviderHelper, useLoginMethods } from '@owlmeans/client-panel/auth';
|
|
9
9
|
import { loginResumeHelper } from '@owlmeans/client-auth/login';
|
|
10
10
|
import { LoginMethodIcon } from './icons.js';
|
|
11
11
|
import { LoginPrivacyNotice, LoginTerms } from './terms.js';
|
|
12
12
|
import { LoginCredit } from './credit.js';
|
|
13
|
+
import { LoginProviderNote } from './provider.js';
|
|
13
14
|
import { VARIANT } from './consts.local.js';
|
|
15
|
+
import './i18n.js';
|
|
14
16
|
/**
|
|
15
17
|
* The sign-in screen: which identity provider, confirmed against which documents.
|
|
16
18
|
*
|
|
@@ -31,6 +33,23 @@ export const LoginScreen = props => {
|
|
|
31
33
|
});
|
|
32
34
|
const Logo = props.Logo;
|
|
33
35
|
const attemptError = model.busy == null ? loginResumeHelper.loginAttemptError(model.outcome) : null;
|
|
36
|
+
const provider = model.provider;
|
|
37
|
+
const title = props.title ?? (provider != null
|
|
38
|
+
? loginProviderHelper.fill(t('login.provider.title', 'Sign in to {{product}}'), provider)
|
|
39
|
+
: t('login.title', 'Sign in'));
|
|
40
|
+
const card = _jsxs(Card, { className: cn('w-full max-w-sm', props.containerClassName), children: [_jsxs(CardHeader, { className: "items-center gap-2 text-center", children: [Logo != null && _jsx("div", { className: "flex justify-center pb-2", children: isValidElement(Logo) ? Logo : typeof Logo === 'function'
|
|
41
|
+
? _jsx(Logo, { className: "h-10 w-auto" }) : Logo }), _jsx(CardTitle, { className: "text-xl", children: title }), _jsx(CardDescription, { children: props.subtitle ?? t('login.subtitle', 'Choose how you would like to continue.') })] }), _jsxs(CardContent, { className: "flex flex-col gap-4", children: [model.methods.length < 1
|
|
42
|
+
? _jsx("p", { role: "status", className: "text-sm text-muted-foreground text-center", children: t('login.empty', 'No sign-in method is configured for this application.') })
|
|
43
|
+
: _jsx("div", { className: "flex flex-col gap-2", children: model.methods.map((method) => _jsxs(Button, { type: "button", "data-login-method": method.id, variant: VARIANT[method.emphasis ?? 'secondary'] ?? 'outline', "aria-disabled": model.blocked || undefined, "data-blocked": model.blocked ? 'true' : undefined,
|
|
44
|
+
// `cursor-pointer` explicitly: the package's private shadcn button stays compatible
|
|
45
|
+
// with the older primitive style too. Stating it here keeps the sign-in control
|
|
46
|
+
// visibly actionable independently of a consumer's shadcn setup.
|
|
47
|
+
className: cn('w-full justify-center gap-2 cursor-pointer', model.blocked && 'opacity-60'), autoFocus: method.id === model.primary?.id, onClick: () => model.select(method), children: [model.busy === method.id
|
|
48
|
+
? _jsx(Loader2, { className: "size-4 animate-spin" })
|
|
49
|
+
: _jsx(LoginMethodIcon, { name: method.icon, className: "size-4" }), method.label ?? t(`login.method.${method.i18nKey ?? method.id}`, method.id)] }, method.id)) }), provider?.placement === 'inline' && _jsx(LoginProviderNote, { model: provider, translate: t }), model.terms.required && (model.terms.deferred
|
|
50
|
+
? _jsx(LoginPrivacyNotice, { model: model.terms, translate: t, locale: props.locale })
|
|
51
|
+
: _jsx(LoginTerms, { model: model.terms, translate: t, locale: props.locale })), (model.error ?? attemptError) != null
|
|
52
|
+
&& _jsx("p", { role: "alert", "data-login-error": true, className: "text-sm text-destructive text-center", children: model.error ?? t(attemptError, 'Sign-in did not complete. Please try again.') })] }), _jsx("div", { className: "px-6", children: props.footer ?? _jsx(LoginCredit, { model: model.credit, translate: t }) })] });
|
|
34
53
|
// The viewport height is set INLINE, and deliberately.
|
|
35
54
|
//
|
|
36
55
|
// A percentage minimum (`min-h-full`) resolves against a parent that has a height, and this
|
|
@@ -43,19 +62,20 @@ export const LoginScreen = props => {
|
|
|
43
62
|
// rule, by contrast, is invisible — the screen looks nearly right and is silently uncentred.
|
|
44
63
|
//
|
|
45
64
|
// `props.style` still wins, because a class-based override no longer can.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
65
|
+
//
|
|
66
|
+
// The platform's own hosts put the provider disclosure in a strip across the top of the page —
|
|
67
|
+
// the FIRST child of the screen — and centre the card in a stage that takes the rest of the
|
|
68
|
+
// height. Every layout-bearing property of that variant is inline too, for the same reason.
|
|
69
|
+
if (provider?.placement === 'top') {
|
|
70
|
+
return _jsxs("div", { "data-login-screen": true, style: {
|
|
71
|
+
minHeight: '100dvh', display: 'flex', flexDirection: 'column', alignItems: 'stretch',
|
|
72
|
+
justifyContent: 'flex-start', padding: 0, ...props.style,
|
|
73
|
+
}, className: cn('w-full', props.className), children: [_jsx(LoginProviderNote, { model: provider, translate: t }), _jsx("div", { "data-login-stage": true, style: {
|
|
74
|
+
display: 'flex', flex: '1 1 auto', alignItems: 'center', justifyContent: 'center',
|
|
75
|
+
width: '100%', padding: '1rem', boxSizing: 'border-box',
|
|
76
|
+
}, children: card })] });
|
|
77
|
+
}
|
|
78
|
+
return _jsx("div", { "data-login-screen": true, style: { minHeight: '100dvh', ...props.style }, className: cn('flex w-full items-center justify-center p-4', props.className), children: card });
|
|
59
79
|
};
|
|
60
80
|
/**
|
|
61
81
|
* {@link LoginScreen} bound to the application's own translations.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen.js","sourceRoot":"","sources":["../../../src/components/login/screen.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAW,MAAM,OAAO,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AACzG,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"screen.js","sourceRoot":"","sources":["../../../src/components/login/screen.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { LoginScreenProps } from '@owlmeans/client-auth/login';
|
|
2
2
|
import type { ComponentType, ReactNode } from 'react';
|
|
3
|
-
import type { LoginCreditModel, LoginTermsModel } from '@owlmeans/client-panel/auth';
|
|
3
|
+
import type { LoginCreditModel, LoginProviderModel, LoginTermsModel } from '@owlmeans/client-panel/auth';
|
|
4
4
|
export interface LoginScreenSetup extends Omit<LoginScreenProps, 'translate'> {
|
|
5
5
|
/** The one thing an application is expected to supply. */
|
|
6
6
|
Logo?: ComponentType<{
|
|
@@ -20,4 +20,9 @@ export interface LoginTermsProps {
|
|
|
20
20
|
className?: string;
|
|
21
21
|
}
|
|
22
22
|
export type LoginPrivacyNoticeProps = LoginTermsProps;
|
|
23
|
+
export interface LoginProviderNoteProps {
|
|
24
|
+
model: LoginProviderModel;
|
|
25
|
+
translate: (key: string, defaultValue: string) => string;
|
|
26
|
+
className?: string;
|
|
27
|
+
}
|
|
23
28
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/login/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/login/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAExG,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC;IAC3E,0DAA0D;IAC1D,IAAI,CAAC,EAAE,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CAAA;CACzD;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,gBAAgB,CAAA;IACvB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,CAAA;IACxD,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,eAAe,CAAA;IACtB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,CAAA;IACxD,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,MAAM,uBAAuB,GAAG,eAAe,CAAA;AAErD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,kBAAkB,CAAA;IACzB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,CAAA;IACxD,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@owlmeans/web-panel",
|
|
3
|
-
"version": "0.1.18-rc.
|
|
3
|
+
"version": "0.1.18-rc.72",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -51,21 +51,21 @@
|
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"@hookform/resolvers": "^5.9.1",
|
|
54
|
-
"@owlmeans/api-config-client": "^0.1.18-rc.
|
|
54
|
+
"@owlmeans/api-config-client": "^0.1.18-rc.46",
|
|
55
55
|
"@owlmeans/auth": "^0.1.18-rc.40",
|
|
56
|
-
"@owlmeans/auth-common": "^0.1.18-rc.
|
|
57
|
-
"@owlmeans/basic-envelope": "^0.1.18-rc.
|
|
58
|
-
"@owlmeans/client": "^0.1.18-rc.
|
|
59
|
-
"@owlmeans/client-auth": "^0.1.18-rc.
|
|
56
|
+
"@owlmeans/auth-common": "^0.1.18-rc.48",
|
|
57
|
+
"@owlmeans/basic-envelope": "^0.1.18-rc.47",
|
|
58
|
+
"@owlmeans/client": "^0.1.18-rc.52",
|
|
59
|
+
"@owlmeans/client-auth": "^0.1.18-rc.59",
|
|
60
60
|
"@owlmeans/client-config": "^0.1.18-rc.44",
|
|
61
|
-
"@owlmeans/client-context": "^0.1.18-rc.
|
|
62
|
-
"@owlmeans/client-entrypoint": "^0.1.18-rc.
|
|
63
|
-
"@owlmeans/api": "^0.1.18-rc.
|
|
64
|
-
"@owlmeans/client-flow": "^0.1.18-rc.
|
|
65
|
-
"@owlmeans/client-i18n": "^0.1.18-rc.
|
|
66
|
-
"@owlmeans/client-panel": "^0.1.18-rc.
|
|
67
|
-
"@owlmeans/client-route": "^0.1.18-rc.
|
|
68
|
-
"@owlmeans/client-socket": "^0.1.18-rc.
|
|
61
|
+
"@owlmeans/client-context": "^0.1.18-rc.49",
|
|
62
|
+
"@owlmeans/client-entrypoint": "^0.1.18-rc.48",
|
|
63
|
+
"@owlmeans/api": "^0.1.18-rc.48",
|
|
64
|
+
"@owlmeans/client-flow": "^0.1.18-rc.55",
|
|
65
|
+
"@owlmeans/client-i18n": "^0.1.18-rc.51",
|
|
66
|
+
"@owlmeans/client-panel": "^0.1.18-rc.59",
|
|
67
|
+
"@owlmeans/client-route": "^0.1.18-rc.49",
|
|
68
|
+
"@owlmeans/client-socket": "^0.1.18-rc.50",
|
|
69
69
|
"@owlmeans/config": "^0.1.18-rc.44",
|
|
70
70
|
"@owlmeans/context": "^0.1.18-rc.34",
|
|
71
71
|
"@owlmeans/entrypoint": "^0.1.18-rc.41",
|
|
@@ -75,11 +75,11 @@
|
|
|
75
75
|
"@owlmeans/log": "^0.1.18-rc.2",
|
|
76
76
|
"@owlmeans/route": "^0.1.18-rc.35",
|
|
77
77
|
"@owlmeans/state": "^0.1.18-rc.39",
|
|
78
|
-
"@owlmeans/web-client": "^0.1.18-rc.
|
|
79
|
-
"@owlmeans/web-consent": "^0.1.18-rc.
|
|
80
|
-
"@owlmeans/web-db": "^0.1.18-rc.
|
|
81
|
-
"@owlmeans/web-flow": "^0.1.18-rc.
|
|
82
|
-
"@owlmeans/web-router": "^0.1.18-rc.
|
|
78
|
+
"@owlmeans/web-client": "^0.1.18-rc.62",
|
|
79
|
+
"@owlmeans/web-consent": "^0.1.18-rc.43",
|
|
80
|
+
"@owlmeans/web-db": "^0.1.18-rc.49",
|
|
81
|
+
"@owlmeans/web-flow": "^0.1.18-rc.54",
|
|
82
|
+
"@owlmeans/web-router": "^0.1.18-rc.50",
|
|
83
83
|
"i18next-browser-languagedetector": "^8.2.1",
|
|
84
84
|
"qrcode.react": "^4.2.0",
|
|
85
85
|
"react-google-recaptcha": "^3.1.0",
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
},
|
|
106
106
|
"devDependencies": {
|
|
107
107
|
"@owlmeans/dep-config": "workspace:*",
|
|
108
|
-
"@owlmeans/test-ui": "^0.1.18-rc.
|
|
108
|
+
"@owlmeans/test-ui": "^0.1.18-rc.50",
|
|
109
109
|
"@radix-ui/react-alert-dialog": "^1.1.23",
|
|
110
110
|
"@radix-ui/react-dialog": "^1.1.23",
|
|
111
111
|
"@radix-ui/react-label": "^2.1.15",
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"login": {
|
|
3
|
+
"provider": {
|
|
4
|
+
"title": "Уваход у {{product}}",
|
|
5
|
+
"top": "Гэтую праграму размяшчае {{operator}} ад імя {{product}}. Для ўваходу выкарыстоўваецца {{provider}}.",
|
|
6
|
+
"inline": "Уваход забяспечвае {{provider}} ад імя {{product}}.",
|
|
7
|
+
"more": "Падрабязней"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"login": {
|
|
3
|
+
"provider": {
|
|
4
|
+
"title": "Bei {{product}} anmelden",
|
|
5
|
+
"top": "Diese App wird von {{operator}} im Auftrag von {{product}} gehostet. Sie melden sich mit {{provider}} an.",
|
|
6
|
+
"inline": "Die Anmeldung stellt {{provider}} im Auftrag von {{product}} bereit.",
|
|
7
|
+
"more": "Weitere Informationen"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"login": {
|
|
3
|
+
"provider": {
|
|
4
|
+
"title": "Sign in to {{product}}",
|
|
5
|
+
"top": "This app is hosted by {{operator}} on behalf of {{product}}. You sign in with {{provider}}.",
|
|
6
|
+
"inline": "Sign-in is provided by {{provider}} on behalf of {{product}}.",
|
|
7
|
+
"more": "More information"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"login": {
|
|
3
|
+
"provider": {
|
|
4
|
+
"title": "Iniciar sesión en {{product}}",
|
|
5
|
+
"top": "Esta aplicación está alojada por {{operator}} en nombre de {{product}}. Inicias sesión con {{provider}}.",
|
|
6
|
+
"inline": "El inicio de sesión lo proporciona {{provider}} en nombre de {{product}}.",
|
|
7
|
+
"more": "Más información"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|