@owlmeans/web-panel 0.1.18-rc.70 → 0.1.18-rc.71
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 +9 -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/notify.js +4 -4
- package/build/components/login/notify.js.map +1 -1
- package/build/components/login/screen.d.ts.map +1 -1
- package/build/components/login/screen.js +2 -2
- 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/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/notify.ts +4 -4
- package/src/components/login/screen.tsx +2 -2
- package/src/components/login/terms.tsx +6 -15
- 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/lazy.spec.ts +2 -2
- package/tests/login.spec.ts +2 -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.71
|
|
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.49
|
|
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.71",
|
|
5
|
+
"generatedAt": "2026-10-05T21:03:06.415Z",
|
|
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.71"` in `dependencies`
|
|
12
12
|
|
|
13
13
|
## Key Exports
|
|
14
14
|
|
|
@@ -33,8 +33,8 @@ user-invocable: false
|
|
|
33
33
|
| `useBreakPoint()` | The current Tailwind breakpoint name, tracked on `resize` (`lg` when there is no `window`) |
|
|
34
34
|
| `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
35
|
| 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` |
|
|
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), `clientRequestHelper` (`provideRequest`), `stab`, `route`, `croute`, `frontend`, `useNavigate`, `useEntrypoint`, `useValue` |
|
|
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`, `i18nHelper` (`addI18nApp` / `addI18nLib`) / `SUPPORTED_LNGS` |
|
|
38
38
|
|
|
39
39
|
## Subpath Exports
|
|
40
40
|
|
|
@@ -44,7 +44,7 @@ user-invocable: false
|
|
|
44
44
|
widget and a presence service so a host's own collapsed menu can take over the floating button's
|
|
45
45
|
job
|
|
46
46
|
- `./scheme` — the React-free colour-scheme half: `COLOR_SCHEME_KEY`, `COLOR_SCHEME_EVENT`,
|
|
47
|
-
`ColorSchemeChoice`, `readColorScheme`, `applyColorScheme`, `colorSchemeBootstrapScript` — safe
|
|
47
|
+
`ColorSchemeChoice`, `colorSchemeHelper` (`readColorScheme`, `applyColorScheme`, `colorSchemeBootstrapScript`) — safe
|
|
48
48
|
to import from a Node build script
|
|
49
49
|
|
|
50
50
|
## Usage
|
|
@@ -277,7 +277,7 @@ that paints dark under `prefers-color-scheme: dark`. So a consumer's CSS must re
|
|
|
277
277
|
A theme with dark tokens under `.dark` alone never follows the OS; one with them under the media
|
|
278
278
|
query alone ignores an explicit light choice.
|
|
279
279
|
|
|
280
|
-
**The head bootstrap goes before any stylesheet paints.** `colorSchemeBootstrapScript()` returns a
|
|
280
|
+
**The head bootstrap goes before any stylesheet paints.** `colorSchemeHelper.colorSchemeBootstrapScript()` returns a
|
|
281
281
|
self-contained inline script that puts the stored choice's class on `<html>` before first paint —
|
|
282
282
|
the only moment it can; a component doing it after mount shows a visitor who chose dark one frame
|
|
283
283
|
of the light page. A build step inlines it into `index.html` (import it from
|
|
@@ -292,7 +292,7 @@ Rules the pieces own:
|
|
|
292
292
|
is in (sun while light, moon while dark), chosen in script, not by a `dark:` variant.
|
|
293
293
|
- **The accessible name says what pressing does** — `labels.toLight` / `labels.toDark`, English
|
|
294
294
|
defaults; `NavLayout` resolves them through `translate` (`shell.toLight`, `shell.toDark`).
|
|
295
|
-
- **One choice per document.** `applyColorScheme(choice | null)` sets the class, stores or clears
|
|
295
|
+
- **One choice per document.** `colorSchemeHelper.applyColorScheme(choice | null)` sets the class, stores or clears
|
|
296
296
|
the key and dispatches `COLOR_SCHEME_EVENT`, so every mounted `useColorScheme` agrees at once;
|
|
297
297
|
another tab's change arrives through `storage`, and an OS switch through `matchMedia` while
|
|
298
298
|
nothing is stored. `setChoice(null)` hands the page back to the OS.
|
|
@@ -346,7 +346,7 @@ on every navigation. Neither does anything unless an app opts in:
|
|
|
346
346
|
cfg.socket = { reloadDialog: true }
|
|
347
347
|
```
|
|
348
348
|
|
|
349
|
-
Once any `ws()`/`useWs()` connection in the app has exhausted its own retry budget
|
|
349
|
+
Once any `socketClientHelper.ws()`/`useWs()` connection in the app has exhausted its own retry budget
|
|
350
350
|
(`useSocketStatus() === 'lost'`), a global, blocking `AlertDialog` covers the screen — no Escape,
|
|
351
351
|
no outside click, two actions:
|
|
352
352
|
|
|
@@ -429,7 +429,7 @@ import { Form, TextInput, SubmitButton, Button } from '@owlmeans/web-panel'
|
|
|
429
429
|
### The terms confirmation — `LoginTerms`, `LoginPrivacyNotice`
|
|
430
430
|
|
|
431
431
|
`components/login/terms.tsx` renders `LoginTermsModel` (`@owlmeans/client-panel/auth`) via
|
|
432
|
-
`termsSentence` +
|
|
432
|
+
`loginTermsHelper.termsSentence` + `.termsLabelResolver` (`@owlmeans/client-auth/login`) rather than re-deriving
|
|
433
433
|
link/label pairs itself. **`[data-login-terms]` marks exactly one checkbox — or NONE, once
|
|
434
434
|
`model.terms.deferred` is true** (`LoginScreen` renders `LoginTerms` when not deferred,
|
|
435
435
|
`LoginPrivacyNotice` when it is): an e2e suite elsewhere in the platform treats the checkbox as a
|
|
@@ -504,7 +504,7 @@ menu has already mounted) and because React 18 StrictMode double-invokes mount/c
|
|
|
504
504
|
| Job | Import from `@owlmeans/web-panel/consent` | Where it goes |
|
|
505
505
|
|---|---|---|
|
|
506
506
|
| 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 `
|
|
507
|
+
| 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
508
|
| 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
509
|
| Registering the presence service | `appendConsentWidgetService(context)` | The app's `context.ts` |
|
|
510
510
|
|
|
@@ -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
|
+
}, unknown>>)[];
|
|
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;;;;;;;;eAAuC,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"}
|
|
@@ -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"}
|
|
@@ -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;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAgG5C,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,gBAAgB,CASrD,CAAA"}
|
|
@@ -6,7 +6,7 @@ import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '../..
|
|
|
6
6
|
import { cn } from '../../@/lib/utils.js';
|
|
7
7
|
import { useI18nLib, useLanguage } from '@owlmeans/client-i18n';
|
|
8
8
|
import { useLoginMethods } from '@owlmeans/client-panel/auth';
|
|
9
|
-
import {
|
|
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';
|
|
@@ -30,7 +30,7 @@ export const LoginScreen = props => {
|
|
|
30
30
|
...(props.methods != null ? { methods: props.methods } : {}),
|
|
31
31
|
});
|
|
32
32
|
const Logo = props.Logo;
|
|
33
|
-
const attemptError = model.busy == null ? loginAttemptError(model.outcome) : null;
|
|
33
|
+
const attemptError = model.busy == null ? loginResumeHelper.loginAttemptError(model.outcome) : null;
|
|
34
34
|
// The viewport height is set INLINE, and deliberately.
|
|
35
35
|
//
|
|
36
36
|
// A percentage minimum (`min-h-full`) resolves against a parent that has a height, and this
|
|
@@ -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;AAC7D,OAAO,
|
|
1
|
+
{"version":3,"file":"screen.js","sourceRoot":"","sources":["../../../src/components/login/screen.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terms.d.ts","sourceRoot":"","sources":["../../../src/components/login/terms.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAa,MAAM,OAAO,CAAA;AAG1C,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAS1E;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,
|
|
1
|
+
{"version":3,"file":"terms.d.ts","sourceRoot":"","sources":["../../../src/components/login/terms.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAa,MAAM,OAAO,CAAA;AAG1C,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAS1E;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CAM1D,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAwC1C,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { cn } from '../../@/lib/utils.js';
|
|
3
|
-
import {
|
|
3
|
+
import { loginTermsHelper } from '@owlmeans/client-auth/login';
|
|
4
4
|
const renderParts = (parts) => parts.map((part, index) => part.href != null
|
|
5
5
|
? _jsx("a", { href: part.href, target: "_blank", rel: "noreferrer noopener", "data-login-document": part.documentKey, className: "underline underline-offset-2 hover:text-foreground", children: part.text }, index)
|
|
6
6
|
: _jsx("span", { children: part.text }, index));
|
|
@@ -13,8 +13,8 @@ const renderParts = (parts) => parts.map((part, index) => part.href != null
|
|
|
13
13
|
* own — the disclosure does not move just because the confirmation did.
|
|
14
14
|
*/
|
|
15
15
|
export const LoginPrivacyNotice = ({ model, translate, locale, className }) => {
|
|
16
|
-
const resolveLabel = termsLabelResolver(translate, locale);
|
|
17
|
-
return _jsx("p", { "data-login-privacy": true, className: cn('text-xs text-muted-foreground', className), children: renderParts(termsSentence(translate('login.terms.notice', 'How we handle your personal data: {{notices}}.'), model, locale, resolveLabel)) });
|
|
16
|
+
const resolveLabel = loginTermsHelper.termsLabelResolver(translate, locale);
|
|
17
|
+
return _jsx("p", { "data-login-privacy": true, className: cn('text-xs text-muted-foreground', className), children: renderParts(loginTermsHelper.termsSentence(translate('login.terms.notice', 'How we handle your personal data: {{notices}}.'), model, locale, resolveLabel)) });
|
|
18
18
|
};
|
|
19
19
|
/**
|
|
20
20
|
* The sign-in screen's terms confirmation: one consented checkbox for `documents` (terms, plus
|
|
@@ -23,10 +23,10 @@ export const LoginPrivacyNotice = ({ model, translate, locale, className }) => {
|
|
|
23
23
|
* because nothing is being agreed to there.
|
|
24
24
|
*/
|
|
25
25
|
export const LoginTerms = ({ model, translate, locale, className }) => {
|
|
26
|
-
const resolveLabel = termsLabelResolver(translate, locale);
|
|
26
|
+
const resolveLabel = loginTermsHelper.termsLabelResolver(translate, locale);
|
|
27
27
|
// Centred, like every other row in the card. The checkbox stays at the start of the sentence
|
|
28
28
|
// rather than above it, so `justify-center` centres the pair and `text-center` centres the
|
|
29
29
|
// wrapped lines within it.
|
|
30
|
-
return _jsxs("div", { className: cn('flex flex-col items-center gap-1.5 text-center', className), children: [_jsxs("label", { className: "flex items-start justify-center gap-2 text-sm text-muted-foreground cursor-pointer", children: [_jsx("input", { type: "checkbox", "data-login-terms": true, className: "mt-0.5 size-4 shrink-0 accent-primary", checked: model.accepted, "aria-invalid": model.attempted && !model.accepted, onChange: event => model.accept(event.target.checked) }), _jsx("span", { children: renderParts(termsSentence(translate('login.terms.accept', 'I have read and agree to the {{documents}}.'), model, locale, resolveLabel)) })] }), model.revisedAt != null && _jsx("p", { "data-login-revised": true, className: "text-xs text-muted-foreground", children: translate('login.terms.revised', 'Last updated: {{date}}').split('{{date}}').join(model.revisedAt) }), _jsx(LoginPrivacyNotice, { model: model, translate: translate, locale: locale }), model.attempted && !model.accepted && _jsx("p", { role: "alert", className: "text-sm text-destructive", children: renderParts(termsSentence(translate('login.terms.required', 'Please confirm the {{documents}} to continue.'), model, locale, resolveLabel)) })] });
|
|
30
|
+
return _jsxs("div", { className: cn('flex flex-col items-center gap-1.5 text-center', className), children: [_jsxs("label", { className: "flex items-start justify-center gap-2 text-sm text-muted-foreground cursor-pointer", children: [_jsx("input", { type: "checkbox", "data-login-terms": true, className: "mt-0.5 size-4 shrink-0 accent-primary", checked: model.accepted, "aria-invalid": model.attempted && !model.accepted, onChange: event => model.accept(event.target.checked) }), _jsx("span", { children: renderParts(loginTermsHelper.termsSentence(translate('login.terms.accept', 'I have read and agree to the {{documents}}.'), model, locale, resolveLabel)) })] }), model.revisedAt != null && _jsx("p", { "data-login-revised": true, className: "text-xs text-muted-foreground", children: translate('login.terms.revised', 'Last updated: {{date}}').split('{{date}}').join(model.revisedAt) }), _jsx(LoginPrivacyNotice, { model: model, translate: translate, locale: locale }), model.attempted && !model.accepted && _jsx("p", { role: "alert", className: "text-sm text-destructive", children: renderParts(loginTermsHelper.termsSentence(translate('login.terms.required', 'Please confirm the {{documents}} to continue.'), model, locale, resolveLabel)) })] });
|
|
31
31
|
};
|
|
32
32
|
//# sourceMappingURL=terms.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terms.js","sourceRoot":"","sources":["../../../src/components/login/terms.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAA;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"terms.js","sourceRoot":"","sources":["../../../src/components/login/terms.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAA;AACzC,OAAO,EAA0B,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAGtF,MAAM,WAAW,GAAG,CAAC,KAA0B,EAAa,EAAE,CAC5D,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI;IAC1C,CAAC,CAAC,YAAe,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,yBACpD,IAAI,CAAC,WAAW,EACrC,SAAS,EAAC,oDAAoD,YAAE,IAAI,CAAC,IAAI,IAFjE,KAAK,CAEiE;IAChF,CAAC,CAAC,yBAAmB,IAAI,CAAC,IAAI,IAAjB,KAAK,CAAoB,CAAC,CAAA;AAE3C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAgC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE;IACzG,MAAM,YAAY,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAE3E,OAAO,wCAAsB,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,YACnF,WAAW,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS,CAAC,oBAAoB,EAAE,gDAAgD,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,GAC1J,CAAA;AACN,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAwB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE;IACzF,MAAM,YAAY,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAE3E,6FAA6F;IAC7F,2FAA2F;IAC3F,2BAA2B;IAC3B,OAAO,eAAK,SAAS,EAAE,EAAE,CAAC,gDAAgD,EAAE,SAAS,CAAC,aAKpF,iBAAO,SAAS,EAAC,oFAAoF,aAOnG,gBACE,IAAI,EAAC,UAAU,4BACf,SAAS,EAAC,uCAAuC,EACjD,OAAO,EAAE,KAAK,CAAC,QAAQ,kBACT,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,QAAQ,EAChD,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GACrD,EACF,yBACG,WAAW,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS,CAAC,oBAAoB,EAAE,6CAA6C,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,GACpJ,IACD,EAEP,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,wCAAsB,SAAS,EAAC,+BAA+B,YACxF,SAAS,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GACjG,EAEJ,KAAC,kBAAkB,IAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAI,EAEzE,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,YAAG,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,0BAA0B,YACxF,WAAW,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS,CAAC,sBAAsB,EAAE,+CAA+C,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,GAC3J,IACA,CAAA;AACR,CAAC,CAAA"}
|
|
@@ -15,4 +15,27 @@ export declare const CONTAINER = "mx-auto w-full max-w-6xl px-4";
|
|
|
15
15
|
*/
|
|
16
16
|
export declare const TARGET = "size-11 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background";
|
|
17
17
|
export declare const ENTRY_ACTIVE = "bg-accent text-accent-foreground";
|
|
18
|
+
/**
|
|
19
|
+
* Section entries are LINKS, not buttons.
|
|
20
|
+
*
|
|
21
|
+
* The shadcn primitive styles its links as menu tiles — a filled hover/active background, a
|
|
22
|
+
* radius and tile padding — which reads as a row of buttons across the top of an application.
|
|
23
|
+
* These classes land after the primitive's, so `cn`'s tailwind-merge drops the conflicting
|
|
24
|
+
* ones; every neutralised utility here has a counterpart in the primitive, and removing one
|
|
25
|
+
* brings the tile back.
|
|
26
|
+
*/
|
|
27
|
+
export declare const SECTION_LINK: string;
|
|
28
|
+
/**
|
|
29
|
+
* Invisible until it takes focus, then a pill in the top-left corner above everything — the
|
|
30
|
+
* inverse of the page's own surface (`bg-foreground text-background`), so it reads on any theme.
|
|
31
|
+
*
|
|
32
|
+
* The padding is focus-only: `sr-only` zeroes padding, but a plain `px-4` sorts after it and wins,
|
|
33
|
+
* which leaves a 32px box behind the clip instead of the 1px one assistive tech expects.
|
|
34
|
+
*/
|
|
35
|
+
export declare const SKIP_LINK: string;
|
|
36
|
+
/**
|
|
37
|
+
* Sheet entries are LINKS, exactly as the section menu's are — a real `href` keeps each one
|
|
38
|
+
* focusable, openable in a new tab and announced as a link — and each row is a 44px touch target.
|
|
39
|
+
*/
|
|
40
|
+
export declare const ENTRY: string;
|
|
18
41
|
//# sourceMappingURL=consts.local.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.local.d.ts","sourceRoot":"","sources":["../../../src/components/nav/consts.local.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,kCAAkC,CAAA;AAExD;;;;GAIG;AACH,eAAO,MAAM,MAAM,qGAAqG,CAAA;AAExH,eAAO,MAAM,YAAY,qCAAqC,CAAA"}
|
|
1
|
+
{"version":3,"file":"consts.local.d.ts","sourceRoot":"","sources":["../../../src/components/nav/consts.local.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,kCAAkC,CAAA;AAExD;;;;GAIG;AACH,eAAO,MAAM,MAAM,qGAAqG,CAAA;AAExH,eAAO,MAAM,YAAY,qCAAqC,CAAA;AAE9D;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,QAUd,CAAA;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,QAKX,CAAA;AAEX;;;GAGG;AACH,eAAO,MAAM,KAAK,QAIP,CAAA"}
|
|
@@ -15,4 +15,46 @@ export const CONTAINER = 'mx-auto w-full max-w-6xl px-4';
|
|
|
15
15
|
*/
|
|
16
16
|
export const TARGET = 'size-11 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background';
|
|
17
17
|
export const ENTRY_ACTIVE = 'bg-accent text-accent-foreground';
|
|
18
|
+
/**
|
|
19
|
+
* Section entries are LINKS, not buttons.
|
|
20
|
+
*
|
|
21
|
+
* The shadcn primitive styles its links as menu tiles — a filled hover/active background, a
|
|
22
|
+
* radius and tile padding — which reads as a row of buttons across the top of an application.
|
|
23
|
+
* These classes land after the primitive's, so `cn`'s tailwind-merge drops the conflicting
|
|
24
|
+
* ones; every neutralised utility here has a counterpart in the primitive, and removing one
|
|
25
|
+
* brings the tile back.
|
|
26
|
+
*/
|
|
27
|
+
export const SECTION_LINK = [
|
|
28
|
+
'bg-transparent hover:bg-transparent focus:bg-transparent',
|
|
29
|
+
'rounded-none px-0 py-1',
|
|
30
|
+
'text-sm font-medium text-muted-foreground',
|
|
31
|
+
'hover:text-foreground hover:underline underline-offset-4',
|
|
32
|
+
// Radix marks the active link with a VALUELESS `data-active`, so the state has to be matched
|
|
33
|
+
// on the attribute's presence. `data-[active=true]` — which the shadcn primitive itself uses —
|
|
34
|
+
// matches nothing here, which is why its own active styling never showed either.
|
|
35
|
+
'data-[active]:text-foreground data-[active]:underline data-[active]:bg-transparent',
|
|
36
|
+
'cursor-pointer',
|
|
37
|
+
].join(' ');
|
|
38
|
+
/**
|
|
39
|
+
* Invisible until it takes focus, then a pill in the top-left corner above everything — the
|
|
40
|
+
* inverse of the page's own surface (`bg-foreground text-background`), so it reads on any theme.
|
|
41
|
+
*
|
|
42
|
+
* The padding is focus-only: `sr-only` zeroes padding, but a plain `px-4` sorts after it and wins,
|
|
43
|
+
* which leaves a 32px box behind the clip instead of the 1px one assistive tech expects.
|
|
44
|
+
*/
|
|
45
|
+
export const SKIP_LINK = [
|
|
46
|
+
'sr-only focus:not-sr-only focus:fixed focus:top-4 focus:left-4 focus:z-50 focus:px-4 focus:py-3',
|
|
47
|
+
'rounded-full bg-foreground text-sm font-semibold text-background',
|
|
48
|
+
'outline-none focus-visible:ring-[3px] focus-visible:ring-ring focus-visible:ring-offset-2',
|
|
49
|
+
'focus-visible:ring-offset-background',
|
|
50
|
+
].join(' ');
|
|
51
|
+
/**
|
|
52
|
+
* Sheet entries are LINKS, exactly as the section menu's are — a real `href` keeps each one
|
|
53
|
+
* focusable, openable in a new tab and announced as a link — and each row is a 44px touch target.
|
|
54
|
+
*/
|
|
55
|
+
export const ENTRY = [
|
|
56
|
+
'flex min-h-11 items-center gap-2 rounded-md px-3 text-sm font-medium text-foreground',
|
|
57
|
+
'hover:bg-accent hover:text-accent-foreground',
|
|
58
|
+
'outline-none focus-visible:ring-[3px] focus-visible:ring-ring',
|
|
59
|
+
].join(' ');
|
|
18
60
|
//# sourceMappingURL=consts.local.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.local.js","sourceRoot":"","sources":["../../../src/components/nav/consts.local.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,+BAA+B,CAAA;AAExD;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,kGAAkG,CAAA;AAExH,MAAM,CAAC,MAAM,YAAY,GAAG,kCAAkC,CAAA"}
|
|
1
|
+
{"version":3,"file":"consts.local.js","sourceRoot":"","sources":["../../../src/components/nav/consts.local.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,+BAA+B,CAAA;AAExD;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,kGAAkG,CAAA;AAExH,MAAM,CAAC,MAAM,YAAY,GAAG,kCAAkC,CAAA;AAE9D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,0DAA0D;IAC1D,wBAAwB;IACxB,2CAA2C;IAC3C,0DAA0D;IAC1D,6FAA6F;IAC7F,+FAA+F;IAC/F,iFAAiF;IACjF,oFAAoF;IACpF,gBAAgB;CACjB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,iGAAiG;IACjG,kEAAkE;IAClE,2FAA2F;IAC3F,sCAAsC;CACvC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,sFAAsF;IACtF,8CAA8C;IAC9C,+DAA+D;CAChE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/components/nav/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,EAAmB,MAAM,OAAO,CAAA;AASxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/components/nav/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,EAAmB,MAAM,OAAO,CAAA;AASxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAGhD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAsIxC,CAAA"}
|
|
@@ -1,26 +1,13 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useRef } from 'react';
|
|
3
3
|
import { useNavigate } from '@owlmeans/client';
|
|
4
|
-
import {
|
|
4
|
+
import { navLabelHelper } from '@owlmeans/client-panel';
|
|
5
5
|
import { cn } from '../../@/lib/utils.js';
|
|
6
6
|
import { Footer } from '../footer/component.js';
|
|
7
7
|
import { MobileNav } from './mobile.js';
|
|
8
8
|
import { SideNav } from './side.js';
|
|
9
9
|
import { TopNav } from './top.js';
|
|
10
|
-
import { CONTAINER } from './consts.local.js';
|
|
11
|
-
/**
|
|
12
|
-
* Invisible until it takes focus, then a pill in the top-left corner above everything — the
|
|
13
|
-
* inverse of the page's own surface (`bg-foreground text-background`), so it reads on any theme.
|
|
14
|
-
*
|
|
15
|
-
* The padding is focus-only: `sr-only` zeroes padding, but a plain `px-4` sorts after it and wins,
|
|
16
|
-
* which leaves a 32px box behind the clip instead of the 1px one assistive tech expects.
|
|
17
|
-
*/
|
|
18
|
-
const SKIP_LINK = [
|
|
19
|
-
'sr-only focus:not-sr-only focus:fixed focus:top-4 focus:left-4 focus:z-50 focus:px-4 focus:py-3',
|
|
20
|
-
'rounded-full bg-foreground text-sm font-semibold text-background',
|
|
21
|
-
'outline-none focus-visible:ring-[3px] focus-visible:ring-ring focus-visible:ring-offset-2',
|
|
22
|
-
'focus-visible:ring-offset-background',
|
|
23
|
-
].join(' ');
|
|
10
|
+
import { CONTAINER, SKIP_LINK } from './consts.local.js';
|
|
24
11
|
/**
|
|
25
12
|
* The standard two-layer application shell.
|
|
26
13
|
*
|
|
@@ -36,7 +23,7 @@ const SKIP_LINK = [
|
|
|
36
23
|
* The skip link comes FIRST in the root, ahead of the header — the first thing a keyboard reaches
|
|
37
24
|
* — and moves focus to `<main id="main">`, past the brand, the menus and the actions.
|
|
38
25
|
*/
|
|
39
|
-
export const NavLayout = ({ nav, translate = defaultNavTranslate, title, home, actions, footer, children, className, style, headerClassName, contentClassName, containerClassName, mobileMenu = false, skipLinkLabel, themeToggle }) => {
|
|
26
|
+
export const NavLayout = ({ nav, translate = navLabelHelper.defaultNavTranslate, title, home, actions, footer, children, className, style, headerClassName, contentClassName, containerClassName, mobileMenu = false, skipLinkLabel, themeToggle }) => {
|
|
40
27
|
const navigator = useNavigate();
|
|
41
28
|
// The switcher's names go through `translate` like every other shell string, with the caller's
|
|
42
29
|
// own labels winning; `false`/absent stays absent, so the footer renders exactly as it did.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/components/nav/layout.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAA4B,MAAM,OAAO,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/components/nav/layout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mobile.d.ts","sourceRoot":"","sources":["../../../src/components/nav/mobile.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,EAAE,EAAmB,MAAM,OAAO,CAAA;AAOjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"mobile.d.ts","sourceRoot":"","sources":["../../../src/components/nav/mobile.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,EAAE,EAAmB,MAAM,OAAO,CAAA;AAOjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAGhD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAoGxC,CAAA"}
|
|
@@ -1,20 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useId, useState } from 'react';
|
|
3
3
|
import { MenuIcon, XIcon } from 'lucide-react';
|
|
4
|
-
import {
|
|
4
|
+
import { usePanelNav, navLabelHelper } from '@owlmeans/client-panel';
|
|
5
5
|
import { cn } from '../../@/lib/utils.js';
|
|
6
6
|
import { Button } from '../../@/components/ui/button.js';
|
|
7
7
|
import { Sheet, SheetClose, SheetContent, SheetTitle, SheetTrigger } from '../../@/components/ui/sheet.js';
|
|
8
|
-
import { ENTRY_ACTIVE, TARGET } from './consts.local.js';
|
|
9
|
-
/**
|
|
10
|
-
* Sheet entries are LINKS, exactly as the section menu's are — a real `href` keeps each one
|
|
11
|
-
* focusable, openable in a new tab and announced as a link — and each row is a 44px touch target.
|
|
12
|
-
*/
|
|
13
|
-
const ENTRY = [
|
|
14
|
-
'flex min-h-11 items-center gap-2 rounded-md px-3 text-sm font-medium text-foreground',
|
|
15
|
-
'hover:bg-accent hover:text-accent-foreground',
|
|
16
|
-
'outline-none focus-visible:ring-[3px] focus-visible:ring-ring',
|
|
17
|
-
].join(' ');
|
|
8
|
+
import { ENTRY_ACTIVE, TARGET, ENTRY } from './consts.local.js';
|
|
18
9
|
/**
|
|
19
10
|
* Both navigation levels behind one menu button — what a narrow viewport gets instead of the
|
|
20
11
|
* section menu.
|
|
@@ -32,7 +23,7 @@ const ENTRY = [
|
|
|
32
23
|
* `className` and `style` land on the TRIGGER — the only element the sheet places in the host's
|
|
33
24
|
* flow; the sheet itself is portalled to the document body.
|
|
34
25
|
*/
|
|
35
|
-
export const MobileNav = ({ config, translate = defaultNavTranslate, ariaLabel, className, style }) => {
|
|
26
|
+
export const MobileNav = ({ config, translate = navLabelHelper.defaultNavTranslate, ariaLabel, className, style }) => {
|
|
36
27
|
const model = usePanelNav(config);
|
|
37
28
|
const [open, setOpen] = useState(false);
|
|
38
29
|
const id = useId();
|
|
@@ -49,12 +40,12 @@ export const MobileNav = ({ config, translate = defaultNavTranslate, ariaLabel,
|
|
|
49
40
|
go();
|
|
50
41
|
};
|
|
51
42
|
return _jsxs(Sheet, { open: open, onOpenChange: setOpen, children: [_jsx(SheetTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", "aria-label": label, "data-nav-menu-trigger": true, className: cn(TARGET, className), style: style, children: _jsx(MenuIcon, { className: "size-6", "aria-hidden": "true" }) }) }), _jsxs(SheetContent, { side: "right", showCloseButton: false, "aria-describedby": undefined, "data-nav-sheet": true, className: "gap-0 p-0 text-foreground", children: [_jsxs("div", { className: "flex h-14 shrink-0 items-center justify-between border-b pl-4 pr-2", children: [_jsx(SheetTitle, { className: "text-base", children: label }), _jsx(SheetClose, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", "aria-label": closeLabel, className: TARGET, children: _jsx(XIcon, { className: "size-5", "aria-hidden": "true" }) }) })] }), _jsx("nav", { "aria-label": ariaLabel, className: "flex-1 overflow-y-auto p-2", children: _jsx("ul", { className: "flex flex-col gap-1", children: model.sections.map(section => {
|
|
52
|
-
const sectionLabel = resolveNavLabel(translate, section.label, `nav.${section.name}`, section.name);
|
|
43
|
+
const sectionLabel = navLabelHelper.resolveNavLabel(translate, section.label, `nav.${section.name}`, section.name);
|
|
53
44
|
if (section.items.length > 1) {
|
|
54
45
|
const heading = `${id}-${section.name}`;
|
|
55
46
|
return _jsxs("li", { className: "pt-2", children: [_jsx("p", { id: heading, className: cn('px-3 pb-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground', model.isSectionActive(section) && 'text-foreground'), children: sectionLabel }), _jsx("ul", { "aria-labelledby": heading, className: "flex flex-col gap-1", children: section.items.map(item => {
|
|
56
47
|
const active = model.isItemActive(item);
|
|
57
|
-
return _jsx("li", { children: _jsxs("a", { href: model.hrefOf(item), onClick: follow(model.goItem(item)), "aria-current": active ? 'page' : undefined, className: cn(ENTRY, active && ENTRY_ACTIVE), children: [item.Icon != null ? _jsx(item.Icon, { className: "size-4" }) : null, resolveNavLabel(translate, item.label, `modules.${item.alias}`, item.alias)] }) }, item.alias);
|
|
48
|
+
return _jsx("li", { children: _jsxs("a", { href: model.hrefOf(item), onClick: follow(model.goItem(item)), "aria-current": active ? 'page' : undefined, className: cn(ENTRY, active && ENTRY_ACTIVE), children: [item.Icon != null ? _jsx(item.Icon, { className: "size-4" }) : null, navLabelHelper.resolveNavLabel(translate, item.label, `modules.${item.alias}`, item.alias)] }) }, item.alias);
|
|
58
49
|
}) })] }, section.name);
|
|
59
50
|
}
|
|
60
51
|
const active = model.isSectionActive(section);
|