@owlmeans/web-panel 0.1.18-rc.70 → 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 +8 -8
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/web-panel/SKILL.md +38 -9
- package/build/auth/entrypoints.d.ts +9 -1
- package/build/auth/entrypoints.d.ts.map +1 -1
- package/build/auth/exports.d.ts +1 -1
- package/build/auth/exports.d.ts.map +1 -1
- package/build/auth/exports.js +1 -1
- package/build/auth/exports.js.map +1 -1
- package/build/components/footer/component.js +3 -3
- package/build/components/footer/component.js.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/notify.js +4 -4
- package/build/components/login/notify.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 +36 -16
- package/build/components/login/screen.js.map +1 -1
- package/build/components/login/terms.d.ts.map +1 -1
- package/build/components/login/terms.js +5 -5
- package/build/components/login/terms.js.map +1 -1
- package/build/components/login/types.d.ts +6 -1
- package/build/components/login/types.d.ts.map +1 -1
- package/build/components/nav/consts.local.d.ts +23 -0
- package/build/components/nav/consts.local.d.ts.map +1 -1
- package/build/components/nav/consts.local.js +42 -0
- package/build/components/nav/consts.local.js.map +1 -1
- package/build/components/nav/layout.d.ts.map +1 -1
- package/build/components/nav/layout.js +3 -16
- package/build/components/nav/layout.js.map +1 -1
- package/build/components/nav/mobile.d.ts.map +1 -1
- package/build/components/nav/mobile.js +5 -14
- package/build/components/nav/mobile.js.map +1 -1
- package/build/components/nav/side.js +3 -3
- package/build/components/nav/side.js.map +1 -1
- package/build/components/nav/top.d.ts.map +1 -1
- package/build/components/nav/top.js +4 -23
- package/build/components/nav/top.js.map +1 -1
- package/build/components/scheme/consts.local.d.ts +6 -0
- package/build/components/scheme/consts.local.d.ts.map +1 -1
- package/build/components/scheme/consts.local.js +11 -0
- package/build/components/scheme/consts.local.js.map +1 -1
- package/build/components/scheme/hook.js +8 -8
- package/build/components/scheme/hook.js.map +1 -1
- package/build/components/scheme/toggle.d.ts.map +1 -1
- package/build/components/scheme/toggle.js +1 -11
- package/build/components/scheme/toggle.js.map +1 -1
- package/build/components/socket/i18n.js +9 -9
- package/build/components/socket/i18n.js.map +1 -1
- package/build/consent/translate.js +2 -2
- package/build/consent/translate.js.map +1 -1
- package/build/entrypoints.d.ts +7 -1
- package/build/entrypoints.d.ts.map +1 -1
- package/build/exports.d.ts +2 -2
- package/build/exports.d.ts.map +1 -1
- package/build/exports.js +2 -2
- package/build/exports.js.map +1 -1
- package/build/permission/i18n.js +2 -2
- package/build/permission/i18n.js.map +1 -1
- package/build/permission/index.js +3 -3
- package/build/permission/index.js.map +1 -1
- package/build/scheme/index.d.ts +2 -2
- package/build/scheme/index.d.ts.map +1 -1
- package/build/scheme/index.js +1 -1
- package/build/scheme/index.js.map +1 -1
- package/build/scheme/scheme.d.ts +4 -24
- package/build/scheme/scheme.d.ts.map +1 -1
- package/build/scheme/scheme.js +43 -57
- package/build/scheme/scheme.js.map +1 -1
- package/build/scheme/types.d.ts +27 -0
- package/build/scheme/types.d.ts.map +1 -1
- package/package.json +31 -31
- package/src/auth/exports.ts +1 -1
- package/src/components/footer/component.tsx +3 -3
- 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/notify.ts +4 -4
- package/src/components/login/provider.tsx +57 -0
- package/src/components/login/screen.tsx +109 -70
- package/src/components/login/terms.tsx +6 -15
- package/src/components/login/types.ts +7 -1
- package/src/components/nav/consts.local.ts +45 -0
- package/src/components/nav/layout.tsx +3 -17
- package/src/components/nav/mobile.tsx +5 -15
- package/src/components/nav/side.tsx +3 -3
- package/src/components/nav/top.tsx +4 -24
- package/src/components/scheme/consts.local.ts +12 -0
- package/src/components/scheme/hook.ts +8 -8
- package/src/components/scheme/toggle.tsx +1 -12
- package/src/components/socket/i18n.ts +9 -9
- package/src/consent/translate.ts +2 -2
- package/src/exports.ts +2 -2
- package/src/permission/i18n.ts +2 -2
- package/src/permission/index.ts +3 -3
- package/src/scheme/index.ts +2 -2
- package/src/scheme/scheme.ts +43 -54
- package/src/scheme/types.ts +28 -0
- package/tests/consent-language.spec.ts +2 -2
- package/tests/consent.spec.ts +2 -2
- package/tests/harness/mount.tsx +12 -0
- package/tests/lazy.spec.ts +2 -2
- package/tests/login-provider.spec.ts +114 -0
- package/tests/login.spec.ts +117 -2
- package/tests/nav.spec.ts +2 -2
- package/tests/scheme.spec.ts +4 -4
- package/tests/smoke.spec.ts +2 -2
- package/tests/socket-dialog.spec.ts +2 -2
- package/tests/toaster.spec.ts +2 -2
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`,
|
|
@@ -363,7 +363,7 @@ The dialog's strings are the lib-tier `socket` namespace (`reload.title`, `reloa
|
|
|
363
363
|
|---|---|
|
|
364
364
|
| everything (`usePanelNav`, `PanelNavConfig` / `PanelNavItem` / `PanelNavSection` / `PanelNavLink` / `NavTranslate`, `PanelContext`, `BlockScaling`, `useFormRef`, `FormContext`, ...) | `@owlmeans/client-panel` |
|
|
365
365
|
| `handler`, `useNavigate`, `useValue`, `useEntrypoint` | `@owlmeans/client` |
|
|
366
|
-
| `bind`, `bindAll`, `bindScreen`, `
|
|
366
|
+
| `bind`, `bindAll`, `bindScreen`, `clientRequestHelper`, `provideRequest` (deprecated, use `clientRequestHelper.provideRequest`), `stab`; type `Module` | `@owlmeans/client-entrypoint` |
|
|
367
367
|
| `route`, `frontend` / `croute` | `@owlmeans/route` / `@owlmeans/client-route` |
|
|
368
368
|
| `config` / `service` / `addWebService` | `@owlmeans/client-context` / `@owlmeans/config` / `@owlmeans/client-config` |
|
|
369
369
|
| `AppType`, `HOME`, `ROOT`, `BASE`, `GUEST` | `@owlmeans/context` |
|
|
@@ -371,7 +371,7 @@ The dialog's strings are the lib-tier `socket` namespace (`reload.title`, `reloa
|
|
|
371
371
|
| `DAUTH_GUARD` (`DEFAULT_ALIAS`), `bindExternalAuthentication` | `@owlmeans/client-auth` |
|
|
372
372
|
| `Dispatcher`, `appendWebAuthService` | `@owlmeans/web-client` |
|
|
373
373
|
| `composePrefix`, `useI18n`, `useI18nApp`, `useI18nLib`, `useLanguage` | `@owlmeans/client-i18n` |
|
|
374
|
-
| `
|
|
374
|
+
| `i18nHelper`, `addI18nApp` / `addI18nLib` (deprecated, use `i18nHelper.*`), `SUPPORTED_LNGS` | `@owlmeans/i18n` |
|
|
375
375
|
| `flow`, `configureFlows` / `FLOW_PARAM`, `SERVICE_PARAM`, `useFlow` | `@owlmeans/flow` / `@owlmeans/web-flow` |
|
|
376
376
|
|
|
377
377
|
### `@owlmeans/web-panel/auth`
|
|
@@ -400,14 +400,14 @@ React-free — it imports nothing, so a Node build script can load it.
|
|
|
400
400
|
| `COLOR_SCHEME_KEY` | const | `'owlmeans:color-scheme'`, the `localStorage` key |
|
|
401
401
|
| `COLOR_SCHEME_EVENT` | const | The `window` event every change dispatches |
|
|
402
402
|
| `ColorSchemeChoice` | type | `'light' \| 'dark'` |
|
|
403
|
-
| `readColorScheme()` |
|
|
404
|
-
| `applyColorScheme(choice \| null)` |
|
|
405
|
-
| `colorSchemeBootstrapScript()` |
|
|
403
|
+
| `colorSchemeHelper.readColorScheme()` | helper member | The stored choice or `null` (storage errors swallowed) |
|
|
404
|
+
| `colorSchemeHelper.applyColorScheme(choice \| null)` | helper member | Sets the `light`/`dark` class on `<html>`, stores or clears the key, dispatches the event |
|
|
405
|
+
| `colorSchemeHelper.colorSchemeBootstrapScript()` | helper member | The inline head script that applies a stored choice before first paint |
|
|
406
406
|
|
|
407
407
|
The class contract: `.dark` = chosen dark, `.light` = chosen light, neither = follow the OS. A
|
|
408
408
|
consumer's CSS puts dark tokens under `.dark` AND under
|
|
409
409
|
`@media (prefers-color-scheme: dark) { :root:not(.light) { … } }`, and inlines
|
|
410
|
-
`colorSchemeBootstrapScript()` in the document head.
|
|
410
|
+
`colorSchemeHelper.colorSchemeBootstrapScript()` in the document head.
|
|
411
411
|
|
|
412
412
|
### `@owlmeans/web-panel/consent`
|
|
413
413
|
|
|
@@ -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 |
|
|
@@ -33,8 +34,8 @@ user-invocable: false
|
|
|
33
34
|
| `useBreakPoint()` | The current Tailwind breakpoint name, tracked on `resize` (`lg` when there is no `window`) |
|
|
34
35
|
| `useMapBreakpoint(map, def?, breakpoint?)` | The `map` entry for the current breakpoint (or for the `breakpoint` passed), falling back to `def`. It **throws a `SyntaxError`** when neither yields a value, so give it a `def` or cover every breakpoint |
|
|
35
36
|
| Re-exports from `@owlmeans/client-panel` | Cross-platform panel primitives, incl. `usePanelNav` and the `PanelNav*` types |
|
|
36
|
-
| Re-exports from `@owlmeans/client` / `@owlmeans/client-entrypoint` / `@owlmeans/route` | `bind`, `bindAll`, `bindScreen`, `handler`, `lazyHandler` / `lazyComponent` (+ `LazyHandler` / `LazyComponent` / `LazyComponentOptions` types — see the `client` skill), `provideRequest
|
|
37
|
-
| Re-exports from the surrounding layers | `config`, `service`, `addWebService`, `AppType` / `HOME` / `ROOT` / `BASE` / `GUEST`, `DISPATCHER`, `CAUTHEN_FLOW_ENTER`, `DAUTH_GUARD`, `bindExternalAuthentication`, `Dispatcher`, `appendWebAuthService`, `flow` / `configureFlows` / `useFlow` / `FLOW_PARAM` / `SERVICE_PARAM`, `useI18n*` / `useLanguage` / `composePrefix`, `addI18nApp` / `addI18nLib` / `SUPPORTED_LNGS` |
|
|
37
|
+
| Re-exports from `@owlmeans/client` / `@owlmeans/client-entrypoint` / `@owlmeans/route` | `bind`, `bindAll`, `bindScreen`, `handler`, `lazyHandler` / `lazyComponent` (+ `LazyHandler` / `LazyComponent` / `LazyComponentOptions` types — see the `client` skill), `clientRequestHelper` (`provideRequest`), `stab`, `route`, `croute`, `frontend`, `useNavigate`, `useEntrypoint`, `useValue` |
|
|
38
|
+
| Re-exports from the surrounding layers | `config`, `service`, `addWebService`, `AppType` / `HOME` / `ROOT` / `BASE` / `GUEST`, `DISPATCHER`, `CAUTHEN_FLOW_ENTER`, `DAUTH_GUARD`, `bindExternalAuthentication`, `Dispatcher`, `appendWebAuthService`, `flow` / `configureFlows` / `useFlow` / `FLOW_PARAM` / `SERVICE_PARAM`, `useI18n*` / `useLanguage` / `composePrefix`, `i18nHelper` (`addI18nApp` / `addI18nLib`) / `SUPPORTED_LNGS` |
|
|
38
39
|
|
|
39
40
|
## Subpath Exports
|
|
40
41
|
|
|
@@ -44,7 +45,7 @@ user-invocable: false
|
|
|
44
45
|
widget and a presence service so a host's own collapsed menu can take over the floating button's
|
|
45
46
|
job
|
|
46
47
|
- `./scheme` — the React-free colour-scheme half: `COLOR_SCHEME_KEY`, `COLOR_SCHEME_EVENT`,
|
|
47
|
-
`ColorSchemeChoice`, `readColorScheme`, `applyColorScheme`, `colorSchemeBootstrapScript` — safe
|
|
48
|
+
`ColorSchemeChoice`, `colorSchemeHelper` (`readColorScheme`, `applyColorScheme`, `colorSchemeBootstrapScript`) — safe
|
|
48
49
|
to import from a Node build script
|
|
49
50
|
|
|
50
51
|
## Usage
|
|
@@ -277,7 +278,7 @@ that paints dark under `prefers-color-scheme: dark`. So a consumer's CSS must re
|
|
|
277
278
|
A theme with dark tokens under `.dark` alone never follows the OS; one with them under the media
|
|
278
279
|
query alone ignores an explicit light choice.
|
|
279
280
|
|
|
280
|
-
**The head bootstrap goes before any stylesheet paints.** `colorSchemeBootstrapScript()` returns a
|
|
281
|
+
**The head bootstrap goes before any stylesheet paints.** `colorSchemeHelper.colorSchemeBootstrapScript()` returns a
|
|
281
282
|
self-contained inline script that puts the stored choice's class on `<html>` before first paint —
|
|
282
283
|
the only moment it can; a component doing it after mount shows a visitor who chose dark one frame
|
|
283
284
|
of the light page. A build step inlines it into `index.html` (import it from
|
|
@@ -292,7 +293,7 @@ Rules the pieces own:
|
|
|
292
293
|
is in (sun while light, moon while dark), chosen in script, not by a `dark:` variant.
|
|
293
294
|
- **The accessible name says what pressing does** — `labels.toLight` / `labels.toDark`, English
|
|
294
295
|
defaults; `NavLayout` resolves them through `translate` (`shell.toLight`, `shell.toDark`).
|
|
295
|
-
- **One choice per document.** `applyColorScheme(choice | null)` sets the class, stores or clears
|
|
296
|
+
- **One choice per document.** `colorSchemeHelper.applyColorScheme(choice | null)` sets the class, stores or clears
|
|
296
297
|
the key and dispatches `COLOR_SCHEME_EVENT`, so every mounted `useColorScheme` agrees at once;
|
|
297
298
|
another tab's change arrives through `storage`, and an OS switch through `matchMedia` while
|
|
298
299
|
nothing is stored. `setChoice(null)` hands the page back to the OS.
|
|
@@ -346,7 +347,7 @@ on every navigation. Neither does anything unless an app opts in:
|
|
|
346
347
|
cfg.socket = { reloadDialog: true }
|
|
347
348
|
```
|
|
348
349
|
|
|
349
|
-
Once any `ws()`/`useWs()` connection in the app has exhausted its own retry budget
|
|
350
|
+
Once any `socketClientHelper.ws()`/`useWs()` connection in the app has exhausted its own retry budget
|
|
350
351
|
(`useSocketStatus() === 'lost'`), a global, blocking `AlertDialog` covers the screen — no Escape,
|
|
351
352
|
no outside click, two actions:
|
|
352
353
|
|
|
@@ -429,7 +430,7 @@ import { Form, TextInput, SubmitButton, Button } from '@owlmeans/web-panel'
|
|
|
429
430
|
### The terms confirmation — `LoginTerms`, `LoginPrivacyNotice`
|
|
430
431
|
|
|
431
432
|
`components/login/terms.tsx` renders `LoginTermsModel` (`@owlmeans/client-panel/auth`) via
|
|
432
|
-
`termsSentence` +
|
|
433
|
+
`loginTermsHelper.termsSentence` + `.termsLabelResolver` (`@owlmeans/client-auth/login`) rather than re-deriving
|
|
433
434
|
link/label pairs itself. **`[data-login-terms]` marks exactly one checkbox — or NONE, once
|
|
434
435
|
`model.terms.deferred` is true** (`LoginScreen` renders `LoginTerms` when not deferred,
|
|
435
436
|
`LoginPrivacyNotice` when it is): an e2e suite elsewhere in the platform treats the checkbox as a
|
|
@@ -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
|
|
@@ -504,7 +533,7 @@ menu has already mounted) and because React 18 StrictMode double-invokes mount/c
|
|
|
504
533
|
| Job | Import from `@owlmeans/web-panel/consent` | Where it goes |
|
|
505
534
|
|---|---|---|
|
|
506
535
|
| The consent dialog (and its floating re-open button) | `PanelCookieConsent` | Beside the router — a `PanelApp` child — once |
|
|
507
|
-
| The "Cookie settings" control in a footer or menu | `PanelConsentMenuWidget` (`label`, `className`, `onSelect?` — defaults to `
|
|
536
|
+
| The "Cookie settings" control in a footer or menu | `PanelConsentMenuWidget` (`label`, `className`, `onSelect?` — defaults to `consentStore.open('reopen')`) | Inside the host's own footer/menu |
|
|
508
537
|
| Hiding the floating button while that control is reachable | `useConsentMenuPresence()` | Called by the always-mounted component that renders the control — mounted ONLY while the control can actually be reached: a component that is merely hidden by CSS (`xl:hidden`) is still mounted and still claims presence, so the floating button vanishes with nothing else to open the dialog; render it conditionally instead (viable's header mounts its hamburger menu only below the full-row breakpoint) |
|
|
509
538
|
| Registering the presence service | `appendConsentWidgetService(context)` | The app's `context.ts` |
|
|
510
539
|
|
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
export declare const entrypoints: (import("@owlmeans/client-entrypoint").ClientProtocolEntrypoint<
|
|
1
|
+
export declare const entrypoints: (import("@owlmeans/client-entrypoint").ClientProtocolEntrypoint<import("@owlmeans/entrypoint").EntrypointProtocol<import("@owlmeans/entrypoint").OpenRequest, import("@owlmeans/entrypoint").OpenValue>> | import("@owlmeans/client-entrypoint").ClientProtocolEntrypoint<import("@owlmeans/entrypoint").EntrypointProtocol<{
|
|
2
|
+
body: import("@owlmeans/auth").AllowanceRequest;
|
|
3
|
+
}, import("@owlmeans/auth").AllowanceResponse>> | import("@owlmeans/client-entrypoint").ClientProtocolEntrypoint<import("@owlmeans/entrypoint").EntrypointProtocol<{
|
|
4
|
+
body: import("@owlmeans/auth").AuthCredentials;
|
|
5
|
+
}, import("@owlmeans/auth").AuthToken>> | import("@owlmeans/client-entrypoint").ClientProtocolEntrypoint<import("@owlmeans/entrypoint").EntrypointProtocol<{
|
|
6
|
+
query: Partial<import("@owlmeans/auth").AuthToken>;
|
|
7
|
+
}, undefined>> | import("@owlmeans/client-entrypoint").ClientProtocolEntrypoint<import("@owlmeans/entrypoint").EntrypointProtocol<{
|
|
8
|
+
query: import("@owlmeans/auth").AuthToken;
|
|
9
|
+
}, undefined>>)[];
|
|
2
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"}
|
package/build/auth/exports.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export { service } from '@owlmeans/config';
|
|
|
5
5
|
export { EntrypointOutcome } from '@owlmeans/entrypoint';
|
|
6
6
|
export type { AbstractRequest } from '@owlmeans/entrypoint';
|
|
7
7
|
export { addWebService } from '@owlmeans/client-config';
|
|
8
|
-
export { bind, bindAll, bindScreen, provideRequest, stab } from '@owlmeans/client-entrypoint';
|
|
8
|
+
export { bind, bindAll, bindScreen, clientRequestHelper, provideRequest, stab } from '@owlmeans/client-entrypoint';
|
|
9
9
|
export type { ClientEntrypoint as Module, ClientRequest as Request } from '@owlmeans/client-entrypoint';
|
|
10
10
|
export { route as croute } from '@owlmeans/client-route';
|
|
11
11
|
export { route, frontend, RouteMethod } from '@owlmeans/route';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../../src/auth/exports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC5G,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../../src/auth/exports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC5G,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAClH,YAAY,EAAE,gBAAgB,IAAI,MAAM,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACvG,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC9D,YAAY,EAAE,oBAAoB,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC3E,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAExC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEpE,cAAc,6BAA6B,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEnC,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAC/D,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACnE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,IAAI,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC7E,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA"}
|
package/build/auth/exports.js
CHANGED
|
@@ -3,7 +3,7 @@ export { config } from '@owlmeans/client-context';
|
|
|
3
3
|
export { service } from '@owlmeans/config';
|
|
4
4
|
export { EntrypointOutcome } from '@owlmeans/entrypoint';
|
|
5
5
|
export { addWebService } from '@owlmeans/client-config';
|
|
6
|
-
export { bind, bindAll, bindScreen, provideRequest, stab } from '@owlmeans/client-entrypoint';
|
|
6
|
+
export { bind, bindAll, bindScreen, clientRequestHelper, provideRequest, stab } from '@owlmeans/client-entrypoint';
|
|
7
7
|
export { route as croute } from '@owlmeans/client-route';
|
|
8
8
|
export { route, frontend, RouteMethod } from '@owlmeans/route';
|
|
9
9
|
export { DEFAULT_ALIAS as DAUTH_GUARD } from '@owlmeans/client-auth';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.js","sourceRoot":"","sources":["../../src/auth/exports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE5G,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"exports.js","sourceRoot":"","sources":["../../src/auth/exports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE5G,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAElH,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE9D,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAExC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEpE,cAAc,6BAA6B,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEnC,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAG/D,OAAO,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEnE,OAAO,EAAE,WAAW,IAAI,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC7E,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { navLabelHelper } from '@owlmeans/client-panel';
|
|
3
3
|
import { cn } from '../../@/lib/utils.js';
|
|
4
4
|
import { Link } from '../link.js';
|
|
5
5
|
import { ThemeToggle } from '../scheme/toggle.js';
|
|
@@ -30,7 +30,7 @@ import { ShellCredit, useShellCredit } from './credit.js';
|
|
|
30
30
|
* an application offers it in the same place and the credit keeps its position whatever the
|
|
31
31
|
* application's own footer layout does.
|
|
32
32
|
*/
|
|
33
|
-
export const Footer = ({ links, translate = defaultNavTranslate, children, content, className, style, containerClassName, themeToggle }) => {
|
|
33
|
+
export const Footer = ({ links, translate = navLabelHelper.defaultNavTranslate, children, content, className, style, containerClassName, themeToggle }) => {
|
|
34
34
|
const credit = useShellCredit();
|
|
35
35
|
const hasLinks = (links != null && links.length > 0) || children != null;
|
|
36
36
|
const toggle = themeToggle == null || themeToggle === false
|
|
@@ -40,7 +40,7 @@ export const Footer = ({ links, translate = defaultNavTranslate, children, conte
|
|
|
40
40
|
return null;
|
|
41
41
|
}
|
|
42
42
|
return _jsx("footer", { className: cn('border-t py-6', className), style: style, children: _jsxs("div", { className: cn('flex flex-col items-center gap-3 text-center', containerClassName), children: [content != null && _jsx("div", { "data-footer-content": true, className: "w-full self-stretch text-start", children: content }), hasLinks && _jsxs("div", { className: "flex flex-wrap items-center justify-center gap-4 text-sm", children: [links?.map((link, idx) => {
|
|
43
|
-
const label = resolveNavLabel(translate, link.label, `modules.${link.alias ?? link.href ?? ''}`, link.alias ?? link.href);
|
|
43
|
+
const label = navLabelHelper.resolveNavLabel(translate, link.label, `modules.${link.alias ?? link.href ?? ''}`, link.alias ?? link.href);
|
|
44
44
|
return link.href != null
|
|
45
45
|
? _jsx(Link, { src: link.href, open: link.open, children: label }, `${link.href}:${idx}`)
|
|
46
46
|
: _jsx(Link, { module: link.alias, open: link.open, children: label }, `${link.alias}:${idx}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../../src/components/footer/component.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../../src/components/footer/component.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAIzD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,MAAM,MAAM,GAAoB,CAAC,EACtC,KAAK,EAAE,SAAS,GAAG,cAAc,CAAC,mBAAmB,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,kBAAkB,EAC9G,WAAW,EACZ,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAC/B,MAAM,QAAQ,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,QAAQ,IAAI,IAAI,CAAA;IACxE,MAAM,MAAM,GAAG,WAAW,IAAI,IAAI,IAAI,WAAW,KAAK,KAAK;QACzD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAA;IAC3C,IAAI,OAAO,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;QAC/F,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,iBAAQ,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,YACpE,eAAK,SAAS,EAAE,EAAE,CAAC,8CAA8C,EAAE,kBAAkB,CAAC,aACnF,OAAO,IAAI,IAAI,IAAI,2CAAyB,SAAS,EAAC,gCAAgC,YAAE,OAAO,GAAO,EACtG,QAAQ,IAAI,eAAK,SAAS,EAAC,0DAA0D,aACnF,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;4BACxB,MAAM,KAAK,GAAG,cAAc,CAAC,eAAe,CAC1C,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAC3F,CAAA;4BAED,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI;gCACtB,CAAC,CAAC,KAAC,IAAI,IAA6B,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,YAAG,KAAK,IAA9D,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAiD;gCACnF,CAAC,CAAC,KAAC,IAAI,IAA8B,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,YAAG,KAAK,IAAnE,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,CAAqD,CAAA;wBAC5F,CAAC,CAAC,EACD,QAAQ,IACL,EAML,MAAM,IAAI,IAAI;oBACb,CAAC,CAAC,2CAAwB,SAAS,EAAC,kDAAkD,aACpF,KAAC,WAAW,KAAG,EACf,KAAC,WAAW,OAAK,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAI,IACzE;oBACN,CAAC,CAAC,KAAC,WAAW,KAAG,IACf,GACC,CAAA;AACX,CAAC,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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { LIB_NAMESPACE, i18nHelper } from '@owlmeans/i18n';
|
|
2
|
+
import { i18nInstanceHelper } from '@owlmeans/client-i18n/utils';
|
|
3
3
|
import { toast } from 'sonner';
|
|
4
4
|
import { LoginOutcome } from '@owlmeans/client-auth/login';
|
|
5
5
|
import { AUTH_RESOURCE, POPUP_BLOCKED_FALLBACK } from './consts.local.js';
|
|
@@ -13,8 +13,8 @@ import { AUTH_RESOURCE, POPUP_BLOCKED_FALLBACK } from './consts.local.js';
|
|
|
13
13
|
* memoized), and the other later gets `null` back and no-ops with the bundle already there.
|
|
14
14
|
*/
|
|
15
15
|
const translateAuth = (cfg, key, fallback) => {
|
|
16
|
-
const i18n = getI18nInstance(cfg);
|
|
17
|
-
const resources = initI18nResource(i18n.language, AUTH_RESOURCE, LIB_NAMESPACE);
|
|
16
|
+
const i18n = i18nInstanceHelper.getI18nInstance(cfg);
|
|
17
|
+
const resources = i18nHelper.initI18nResource(i18n.language, AUTH_RESOURCE, LIB_NAMESPACE);
|
|
18
18
|
resources?.forEach(resource => i18n.addResourceBundle(i18n.language, LIB_NAMESPACE, { [AUTH_RESOURCE]: resource.data }, true, true));
|
|
19
19
|
return i18n.t(`${AUTH_RESOURCE}.${key}`, { ns: LIB_NAMESPACE, defaultValue: fallback });
|
|
20
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../src/components/login/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../src/components/login/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAEhE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9B,OAAO,EAAE,YAAY,EAAsB,MAAM,6BAA6B,CAAA;AAC9E,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAEzE;;;;;;;;GAQG;AACH,MAAM,aAAa,GAAG,CAAC,GAAiB,EAAE,GAAW,EAAE,QAAgB,EAAU,EAAE;IACjF,MAAM,IAAI,GAAG,kBAAkB,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IACpD,MAAM,SAAS,GAAG,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,CAAA;IAC1F,SAAS,EAAE,OAAO,CAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAChC,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAC7E,CACF,CAAA;IAED,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,aAAa,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAA;AACzF,CAAC,CAAA;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAiB,EAAiB,EAAE,CAAC,OAAO,CAAC,EAAE;IAChF,IAAI,OAAO,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;QACrC,OAAM;IACR,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,qBAAqB,EAAE,sBAAsB,CAAC,CAAC,CAAA;AAClF,CAAC,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,
|
|
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"}
|