@freeappstore/sdk 0.14.28 → 0.14.30

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/dist/logger.d.ts CHANGED
@@ -35,7 +35,7 @@ export interface BuildMeta {
35
35
  viewport: string;
36
36
  theme?: string | undefined;
37
37
  }
38
- export declare const SDK_VERSION = "0.14.27";
38
+ export declare const SDK_VERSION = "0.14.29";
39
39
  export declare class Logger {
40
40
  private readonly appId;
41
41
  private readonly apiBase;
@@ -62,6 +62,12 @@ export declare class Logger {
62
62
  getBuildMeta(): BuildMeta;
63
63
  /** @internal Log an SDK API call result. */
64
64
  _api(method: string, path: string, status: number, durationMs: number, error?: string): void;
65
+ /** @internal Log a render error caught by Shell's error boundary. */
66
+ _renderError(message: string, data: {
67
+ stack?: string | undefined;
68
+ componentStack?: string | undefined;
69
+ path?: string | undefined;
70
+ }): void;
65
71
  private add;
66
72
  private installGlobalHandlers;
67
73
  private saveToStorage;
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8DAA8D;IAC9D,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAID,eAAO,MAAM,WAAW,YAAY,CAAC;AAOrC,qBAAa,MAAM;IAYf,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAbvB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,WAAW,CAA+C;IAClE,OAAO,CAAC,aAAa,CAAS;IAK9B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,OAAO,CAAK;gBAGD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI;IAW7B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAGrC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAGpC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAGpC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAIrC,oDAAoD;IACpD,OAAO,IAAI,QAAQ,EAAE;IAIrB,sEAAsE;IACtE,IAAI,IAAI,MAAM;IAUd,8CAA8C;IAC9C,KAAK;IASL,+CAA+C;IACzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,kDAAkD;IAClD,YAAY,IAAI,SAAS;IAiBzB,4CAA4C;IAC5C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAWrF,OAAO,CAAC,GAAG;IAmBX,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,gBAAgB;YAMV,WAAW;IAYzB,OAAO,CAAC,SAAS,CAA8B;YAEjC,aAAa;IA0B3B,OAAO;CAGR"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8DAA8D;IAC9D,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAID,eAAO,MAAM,WAAW,YAAY,CAAC;AAOrC,qBAAa,MAAM;IAYf,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAbvB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,WAAW,CAA+C;IAClE,OAAO,CAAC,aAAa,CAAS;IAK9B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,OAAO,CAAK;gBAGD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI;IAW7B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAGrC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAGpC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAGpC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAIrC,oDAAoD;IACpD,OAAO,IAAI,QAAQ,EAAE;IAIrB,sEAAsE;IACtE,IAAI,IAAI,MAAM;IAUd,8CAA8C;IAC9C,KAAK;IASL,+CAA+C;IACzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,kDAAkD;IAClD,YAAY,IAAI,SAAS;IAiBzB,4CAA4C;IAC5C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IASrF,qEAAqE;IACrE,YAAY,CACV,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;QACJ,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC3B;IAOH,OAAO,CAAC,GAAG;IAmBX,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,gBAAgB;YAMV,WAAW;IAYzB,OAAO,CAAC,SAAS,CAA8B;YAEjC,aAAa;IA0B3B,OAAO;CAGR"}
package/dist/logger.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // Must track package.json version — bumped on release. Guarded by version.test.ts
2
2
  // so a forgotten bump fails CI instead of silently misattributing telemetry.
3
- export const SDK_VERSION = '0.14.27';
3
+ export const SDK_VERSION = '0.14.29';
4
4
  const MEMORY_LIMIT = 200;
5
5
  const STORAGE_LIMIT = 500;
6
6
  const STORAGE_KEY_PREFIX = 'fas_logs:';
@@ -88,6 +88,10 @@ export class Logger {
88
88
  _api(method, path, status, durationMs, error) {
89
89
  this.add(error ? 'error' : 'info', 'sdk', `${method} ${path} ${status} (${durationMs}ms)`, error ? { error } : undefined);
90
90
  }
91
+ /** @internal Log a render error caught by Shell's error boundary. */
92
+ _renderError(message, data) {
93
+ this.add('error', 'react.error-boundary', message, data);
94
+ }
91
95
  // ── Private ───────────────────────────────────────────────────
92
96
  add(level, category, message, data) {
93
97
  const entry = { ts: Date.now(), level, category, message, data };
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -4,8 +4,14 @@ export type { AvatarProps, SignInButtonProps } from './core.js';
4
4
  export { Avatar, SignInButton, TextSizeToggle, ThemeToggle, useTextSize } from './core.js';
5
5
  export type { AddFriendButtonProps, FriendRequestBadgeProps, FriendsListProps } from './friends.js';
6
6
  export { AddFriendButton, FriendRequestBadge, FriendsList } from './friends.js';
7
- export type { ProfileMenuProps, ProfilePageProps, ShellProps, ShellProps as FasShellProps, } from './layout.js';
7
+ export type { ProfileMenuProps, ProfilePageProps, ShellNavContext, ShellProps, ShellProps as FasShellProps, } from './layout.js';
8
8
  export { ProfileMenu, ProfilePage, Shell, Shell as FasShell } from './layout.js';
9
+ export type { NavBarProps, NavItem } from './navbar.js';
10
+ export { activeHref, NavBar, useCurrentPath } from './navbar.js';
11
+ export type { PageHeaderProps } from './page.js';
12
+ export { PageHeader, useDocumentTitle } from './page.js';
13
+ export type { ShellErrorContext, ToastApi, ToastOptions, ToastVariant, } from './shell-resilience.js';
14
+ export { OfflineBanner, useOnline, useToast } from './shell-resilience.js';
9
15
  export type { VoiceButtonProps, VoiceTextAreaProps } from './voice.js';
10
16
  export { VoiceButton, VoiceTextArea } from './voice.js';
11
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,SAAS,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,EACL,SAAS,EACT,IAAI,EACJ,aAAa,EACb,UAAU,EACV,aAAa,EACb,MAAM,EACN,SAAS,EACT,OAAO,EACP,KAAK,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,IAAI,EACJ,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC3F,YAAY,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChF,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,UAAU,IAAI,aAAa,GAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjF,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,SAAS,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,EACL,SAAS,EACT,IAAI,EACJ,aAAa,EACb,UAAU,EACV,aAAa,EACb,MAAM,EACN,SAAS,EACT,OAAO,EACP,KAAK,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,IAAI,EACJ,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC3F,YAAY,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChF,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,UAAU,IAAI,aAAa,GAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjF,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACzD,YAAY,EACV,iBAAiB,EACjB,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
package/dist/ui/index.js CHANGED
@@ -2,5 +2,8 @@ export { Badge, BuildInfo, Card, ConfirmDialog, EmptyState, ErrorBoundary, Foote
2
2
  export { Avatar, SignInButton, TextSizeToggle, ThemeToggle, useTextSize } from './core.js';
3
3
  export { AddFriendButton, FriendRequestBadge, FriendsList } from './friends.js';
4
4
  export { ProfileMenu, ProfilePage, Shell, Shell as FasShell } from './layout.js';
5
+ export { activeHref, NavBar, useCurrentPath } from './navbar.js';
6
+ export { PageHeader, useDocumentTitle } from './page.js';
7
+ export { OfflineBanner, useOnline, useToast } from './shell-resilience.js';
5
8
  export { VoiceButton, VoiceTextArea } from './voice.js';
6
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,KAAK,EACL,SAAS,EACT,IAAI,EACJ,aAAa,EACb,UAAU,EACV,aAAa,EACb,MAAM,EACN,SAAS,EACT,OAAO,EACP,KAAK,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,IAAI,EACJ,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE3F,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAOhF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEjF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,KAAK,EACL,SAAS,EACT,IAAI,EACJ,aAAa,EACb,UAAU,EACV,aAAa,EACb,MAAM,EACN,SAAS,EACT,OAAO,EACP,KAAK,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,IAAI,EACJ,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE3F,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAQhF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAOzD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE3E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import type { FreeAppStore } from '../index.js';
3
+ import { type NavItem } from './navbar.js';
4
+ import { type ShellErrorContext } from './shell-resilience.js';
3
5
  export interface ProfileMenuProps {
4
6
  app: FreeAppStore;
5
7
  showThemeToggle?: boolean;
@@ -13,13 +15,49 @@ export interface ProfilePageProps {
13
15
  }
14
16
  /** Full-page profile & preferences: avatar, theme, text size, friends, sign out, delete. */
15
17
  export declare function ProfilePage({ app, showThemeToggle }: ProfilePageProps): import("react").JSX.Element;
18
+ export interface ShellNavContext {
19
+ items: NavItem[];
20
+ /** The path the shell considers current (`location.pathname`, following back/forward). */
21
+ currentPath: string;
22
+ /** Navigate to `href`: the shell's `onNavigate`, else a full page load. */
23
+ onNavigate: (href: string) => void;
24
+ }
16
25
  export interface ShellProps {
17
26
  app: FreeAppStore;
18
27
  children: ReactNode;
19
28
  appName?: string;
29
+ /**
30
+ * The app's screens — the standard way to give an app navigation. Shell
31
+ * renders them as a `<nav aria-label="Main">` in its topbar, marks the current
32
+ * route, and collapses to a menu button on small screens.
33
+ *
34
+ * ```tsx
35
+ * <Shell app={fas} appName="Notes" nav={[{ label: 'Notes', href: '/' }, { label: 'Tags', href: '/tags' }]}>
36
+ * ```
37
+ */
38
+ nav?: NavItem[];
39
+ /** Replace the built-in NavBar (still placed in the topbar) with your own. */
40
+ renderNav?: (ctx: ShellNavContext) => ReactNode;
41
+ /**
42
+ * Client-side navigation for nav clicks (e.g. your router's `navigate`).
43
+ * Without it, nav items are ordinary links (full page load).
44
+ */
45
+ onNavigate?: (href: string) => void;
46
+ /**
47
+ * Replace the fallback shown when a screen throws while rendering. The error
48
+ * is already recorded via `app.log`; call `reset` to retry.
49
+ */
50
+ renderError?: (ctx: ShellErrorContext) => ReactNode;
51
+ /** Replace the spinner shown while a lazy-loaded screen loads. */
52
+ renderLoading?: () => ReactNode;
20
53
  requireAuth?: boolean;
21
54
  showThemeToggle?: boolean;
22
55
  }
23
- /** Full wrapper: sticky topbar, main content, footer. Optional auth gate. */
24
- export declare function Shell({ app, children, appName, requireAuth, showThemeToggle, }: ShellProps): import("react").JSX.Element;
56
+ /**
57
+ * Full wrapper: skip link, sticky topbar with main navigation, offline banner,
58
+ * main content (error boundary + Suspense), toast region, footer. Optional auth
59
+ * gate. On client-side navigation (`onNavigate`) it scrolls to the top (or back
60
+ * to where the route was left) and moves focus to the new screen's heading.
61
+ */
62
+ export declare function Shell({ app, children, appName, nav, renderNav, onNavigate, renderError, renderLoading, requireAuth, showThemeToggle, }: ShellProps): import("react").JSX.Element;
25
63
  //# sourceMappingURL=layout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/ui/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAExF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,YAAY,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,2FAA2F;AAC3F,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,eAAsB,EAAE,QAAQ,EAAE,EAAE,gBAAgB,sCAwItF;AAmBD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,YAAY,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,eAAsB,EAAE,EAAE,gBAAgB,+BAgL5E;AA0FD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,YAAY,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAMD,6EAA6E;AAC7E,wBAAgB,KAAK,CAAC,EACpB,GAAG,EACH,QAAQ,EACR,OAAO,EACP,WAAmB,EACnB,eAAsB,GACvB,EAAE,UAAU,+BAsGZ"}
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/ui/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAOf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,OAAO,EAAsB,KAAK,OAAO,EAAkB,MAAM,aAAa,CAAC;AAC/E,OAAO,EAIL,KAAK,iBAAiB,EAIvB,MAAM,uBAAuB,CAAC;AAM/B,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,YAAY,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,2FAA2F;AAC3F,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,eAAsB,EAAE,QAAQ,EAAE,EAAE,gBAAgB,sCAwItF;AAmBD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,YAAY,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,eAAsB,EAAE,EAAE,gBAAgB,+BAgL5E;AA0FD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,0FAA0F;IAC1F,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,YAAY,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;OAQG;IACH,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;IAChB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,SAAS,CAAC;IAChD;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,SAAS,CAAC;IACpD,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAMD;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,EACpB,GAAG,EACH,QAAQ,EACR,OAAO,EACP,GAAG,EACH,SAAS,EACT,UAAU,EACV,WAAW,EACX,aAAa,EACb,WAAmB,EACnB,eAAsB,GACvB,EAAE,UAAU,+BAqKZ"}
package/dist/ui/layout.js CHANGED
@@ -1,9 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useEffect, useRef, useState } from 'react';
2
+ import { Suspense, useEffect, useInsertionEffect, useLayoutEffect, useRef, useState, } from 'react';
3
3
  import { useAuth, useTheme } from '../hooks.js';
4
- import { ErrorBoundary, Footer, Modal } from './components.js';
4
+ import { Footer, Modal, Spinner } from './components.js';
5
5
  import { Avatar, SignInButton, TextSizeToggle, ThemeToggle, useTextSize } from './core.js';
6
6
  import { FriendRequestBadge, FriendsList } from './friends.js';
7
+ import { activeHref, NavBar, useCurrentPath } from './navbar.js';
8
+ import { OfflineBanner, SHELL_CSS, ShellErrorBoundary, SkipLink, ToastProvider, useRouteChangeEffects, } from './shell-resilience.js';
7
9
  /** Avatar button that opens dropdown: username, theme toggle, sign out, delete account. */
8
10
  export function ProfileMenu({ app, showThemeToggle = true, children }) {
9
11
  const { user, signOut, deleteAccount } = useAuth(app);
@@ -205,10 +207,35 @@ const profileBtnStyle = {
205
207
  function normalizeShellAppName(appName) {
206
208
  return appName === 'AppStore' ? 'FreeAppStore' : appName;
207
209
  }
208
- /** Full wrapper: sticky topbar, main content, footer. Optional auth gate. */
209
- export function Shell({ app, children, appName, requireAuth = false, showThemeToggle = true, }) {
210
+ /**
211
+ * Full wrapper: skip link, sticky topbar with main navigation, offline banner,
212
+ * main content (error boundary + Suspense), toast region, footer. Optional auth
213
+ * gate. On client-side navigation (`onNavigate`) it scrolls to the top (or back
214
+ * to where the route was left) and moves focus to the new screen's heading.
215
+ */
216
+ export function Shell({ app, children, appName, nav, renderNav, onNavigate, renderError, renderLoading, requireAuth = false, showThemeToggle = true, }) {
210
217
  const { user, loading } = useAuth(app);
218
+ const [currentPath, setCurrentPath] = useCurrentPath();
219
+ const mainRef = useRef(null);
220
+ const beforeNavigate = useRouteChangeEffects(currentPath, mainRef, onNavigate !== undefined);
211
221
  const displayAppName = normalizeShellAppName(appName);
222
+ useInsertionEffect(() => {
223
+ if (document.getElementById('fas-shell-css'))
224
+ return;
225
+ const style = document.createElement('style');
226
+ style.id = 'fas-shell-css';
227
+ style.textContent = SHELL_CSS;
228
+ document.head.appendChild(style);
229
+ }, []);
230
+ // A nav item's `title` becomes the tab title on its route. A layout effect
231
+ // runs before every passive effect, so a screen's own useDocumentTitle wins.
232
+ const navItems = nav ?? [];
233
+ const navTitle = navItems.find((item) => item.href === activeHref(navItems, currentPath))?.title;
234
+ // biome-ignore lint/correctness/useExhaustiveDependencies: re-apply on every route change, even when two routes share a title.
235
+ useLayoutEffect(() => {
236
+ if (navTitle)
237
+ document.title = navTitle;
238
+ }, [navTitle, currentPath]);
212
239
  if (loading) {
213
240
  return (_jsx("div", { style: {
214
241
  minHeight: '100dvh',
@@ -231,21 +258,36 @@ export function Shell({ app, children, appName, requireAuth = false, showThemeTo
231
258
  color: 'var(--ink)',
232
259
  }, children: displayAppName || 'FreeAppStore' }), _jsx("p", { style: { color: 'var(--muted)', fontSize: '0.9rem', marginBottom: '1rem' }, children: "Sign in to continue." }), _jsx(SignInButton, { app: app }), _jsx("p", { style: { color: 'var(--muted)', fontSize: '0.75rem', marginTop: '0.75rem' }, children: "One account for all Free apps." })] }) }));
233
260
  }
234
- return (_jsxs("div", { style: { minHeight: '100dvh', display: 'flex', flexDirection: 'column' }, children: [_jsxs("header", { style: {
235
- display: 'flex',
236
- alignItems: 'center',
237
- justifyContent: 'space-between',
238
- padding: '0.5rem 1rem',
239
- borderBottom: '1px solid var(--line)',
240
- background: 'var(--panel)',
241
- position: 'sticky',
242
- top: 0,
243
- zIndex: 50,
244
- }, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '0.75rem' }, children: [_jsx("a", { href: "https://freeappstore.online", style: {
245
- fontWeight: 800,
246
- fontSize: '1rem',
247
- color: 'var(--accent)',
248
- textDecoration: 'none',
249
- }, children: "Free" }), displayAppName && displayAppName !== 'FreeAppStore' && (_jsx("span", { style: { fontSize: '0.85rem', fontWeight: 600, color: 'var(--muted)' }, children: displayAppName }))] }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '0.5rem' }, children: [_jsx(TextSizeToggle, {}), showThemeToggle && !user && _jsx(ThemeToggle, {}), user ? (_jsx(ProfileMenu, { app: app, showThemeToggle: showThemeToggle })) : (_jsx(SignInButton, { app: app, label: "Sign in" }))] })] }), _jsx("main", { style: { flex: 1, display: 'flex', flexDirection: 'column' }, children: _jsx(ErrorBoundary, { children: children }) }), _jsx(Footer, {})] }));
261
+ // Client-side navigation goes through the shell so it knows the route changed.
262
+ // Without onNavigate, items are plain links.
263
+ const navigate = onNavigate
264
+ ? (href) => {
265
+ beforeNavigate();
266
+ onNavigate(href);
267
+ setCurrentPath(href);
268
+ }
269
+ : undefined;
270
+ const navNode = navItems.length === 0 ? null : renderNav ? (renderNav({
271
+ items: navItems,
272
+ currentPath,
273
+ onNavigate: navigate ?? ((href) => window.location.assign(href)),
274
+ })) : navigate ? (_jsx(NavBar, { items: navItems, currentPath: currentPath, onNavigate: navigate })) : (_jsx(NavBar, { items: navItems }));
275
+ const loadingNode = renderLoading ? (renderLoading()) : (_jsx("div", { className: "fas-shell-loading", children: _jsx(Spinner, { size: 28 }) }));
276
+ return (_jsx(ToastProvider, { children: _jsxs("div", { style: { minHeight: '100dvh', display: 'flex', flexDirection: 'column' }, children: [_jsx(SkipLink, { mainRef: mainRef }), _jsxs("header", { style: {
277
+ display: 'flex',
278
+ alignItems: 'center',
279
+ justifyContent: 'space-between',
280
+ padding: '0.5rem 1rem',
281
+ borderBottom: '1px solid var(--line)',
282
+ background: 'var(--panel)',
283
+ position: 'sticky',
284
+ top: 0,
285
+ zIndex: 50,
286
+ }, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '0.75rem' }, children: [_jsx("a", { href: "https://freeappstore.online", style: {
287
+ fontWeight: 800,
288
+ fontSize: '1rem',
289
+ color: 'var(--accent)',
290
+ textDecoration: 'none',
291
+ }, children: "Free" }), displayAppName && displayAppName !== 'FreeAppStore' && (_jsx("span", { style: { fontSize: '0.85rem', fontWeight: 600, color: 'var(--muted)' }, children: displayAppName }))] }), navNode, _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '0.5rem' }, children: [_jsx(TextSizeToggle, {}), showThemeToggle && !user && _jsx(ThemeToggle, {}), user ? (_jsx(ProfileMenu, { app: app, showThemeToggle: showThemeToggle })) : (_jsx(SignInButton, { app: app, label: "Sign in" }))] })] }), _jsx(OfflineBanner, {}), _jsx("main", { id: "main", ref: mainRef, tabIndex: -1, className: "fas-main", style: { flex: 1, display: 'flex', flexDirection: 'column' }, children: _jsx(ShellErrorBoundary, { app: app, renderError: renderError, resetKey: currentPath, children: _jsx(Suspense, { fallback: loadingNode, children: children }) }) }), _jsx(Footer, {})] }) }));
250
292
  }
251
293
  //# sourceMappingURL=layout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/ui/layout.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAsC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAY/D,2FAA2F;AAC3F,MAAM,UAAU,WAAW,CAAC,EAAE,GAAG,EAAE,eAAe,GAAG,IAAI,EAAE,QAAQ,EAAoB;IACrF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEzC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,OAAO,GAAG,CAAC,CAAa,EAAE,EAAE;YAChC,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC;gBAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7E,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;QAC9B,IACE,CAAC,OAAO,CACN,qGAAqG,CACtG;YAED,OAAO;QACT,IAAI,CAAC,OAAO,CAAC,uCAAuC,CAAC;YAAE,OAAO;QAC9D,MAAM,aAAa,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,aAC5C,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAC7B,KAAK,EAAE;oBACL,UAAU,EAAE,MAAM;oBAClB,MAAM,EAAE,uBAAuB;oBAC/B,YAAY,EAAE,KAAK;oBACnB,OAAO,EAAE,CAAC;oBACV,MAAM,EAAE,SAAS;oBACjB,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,EAAE;oBACV,QAAQ,EAAE,QAAQ;oBAClB,OAAO,EAAE,OAAO;iBACjB,YAED,KAAC,MAAM,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAI,GACzB,EACR,IAAI,IAAI,CACP,eACE,KAAK,EAAE;oBACL,QAAQ,EAAE,UAAU;oBACpB,GAAG,EAAE,EAAE;oBACP,KAAK,EAAE,CAAC;oBACR,UAAU,EAAE,cAAc;oBAC1B,MAAM,EAAE,uBAAuB;oBAC/B,YAAY,EAAE,wBAAwB;oBACtC,SAAS,EAAE,4BAA4B;oBACvC,QAAQ,EAAE,GAAG;oBACb,OAAO,EAAE,UAAU;oBACnB,MAAM,EAAE,GAAG;iBACZ,aAED,cACE,KAAK,EAAE;4BACL,OAAO,EAAE,aAAa;4BACtB,YAAY,EAAE,uBAAuB;4BACrC,QAAQ,EAAE,SAAS;4BACnB,UAAU,EAAE,GAAG;4BACf,KAAK,EAAE,YAAY;yBACpB,YAEA,IAAI,CAAC,KAAK,GACP,EACL,eAAe,IAAI,CAClB,eACE,KAAK,EAAE;4BACL,OAAO,EAAE,aAAa;4BACtB,YAAY,EAAE,uBAAuB;4BACrC,OAAO,EAAE,MAAM;4BACf,UAAU,EAAE,QAAQ;4BACpB,cAAc,EAAE,eAAe;yBAChC,aAED,eAAM,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,sBAAc,EACzE,KAAC,WAAW,KAAG,IACX,CACP,EACD,iBACE,OAAO,EAAE,GAAG,EAAE;4BACZ,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;4BAClB,OAAO,CAAC,KAAK,CAAC,CAAC;wBACjB,CAAC,EACD,KAAK,EAAE,aAAa,yBAGb,EACT,kBACE,OAAO,EAAE,GAAG,EAAE;4BACZ,cAAc,CAAC,IAAI,CAAC,CAAC;4BACrB,OAAO,CAAC,KAAK,CAAC,CAAC;wBACjB,CAAC,EACD,KAAK,EAAE;4BACL,GAAG,aAAa;4BAChB,OAAO,EAAE,MAAM;4BACf,UAAU,EAAE,QAAQ;4BACpB,cAAc,EAAE,eAAe;yBAChC,yBAEO,KAAC,kBAAkB,IAAC,GAAG,EAAE,GAAG,GAAI,IACjC,EACR,QAAQ,EACT,iBAAQ,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,yBAE3C,EACT,iBACE,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,EAAE,GAAG,aAAa,EAAE,KAAK,EAAE,wBAAwB,EAAE,+BAGrD,IACL,CACP,EACD,KAAC,KAAK,IACJ,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EACpC,KAAK,EAAC,SAAS,EACf,QAAQ,EAAE,GAAG,YAEb,KAAC,WAAW,IAAC,GAAG,EAAE,GAAG,GAAI,GACnB,IACJ,CACP,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAkB;IACnC,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,aAAa;IACtB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE,MAAM;IACd,SAAS,EAAE,MAAM;IACjB,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,YAAY;IACnB,UAAU,EAAE,SAAS;CACtB,CAAC;AAWF,4FAA4F;AAC5F,MAAM,UAAU,WAAW,CAAC,EAAE,GAAG,EAAE,eAAe,GAAG,IAAI,EAAoB;IAC3E,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/D,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,QAAQ,EAAE,CAAC;IACjD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,cAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,2BAAkB,CAC9F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CACL,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,aAClD,YAAG,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,8CAAmC,EAC5F,KAAC,YAAY,IAAC,GAAG,EAAE,GAAG,GAAI,IACtB,CACP,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;QAC9B,IACE,CAAC,OAAO,CACN,qGAAqG,CACtG;YAED,OAAO;QACT,IAAI,CAAC,OAAO,CAAC,uCAAuC,CAAC;YAAE,OAAO;QAC9D,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAiE;QACjF,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;QACpC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;QAClC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;KACjC,CAAC;IAEF,MAAM,eAAe,GAA6D;QAChF,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;QAC/B,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;QACtC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;KAChC,CAAC;IAEF,OAAO,CACL,eAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,aAEnE,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aACtF,KAAC,MAAM,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAI,EAChC,0BACE,cACE,KAAK,EAAE;oCACL,QAAQ,EAAE,SAAS;oCACnB,UAAU,EAAE,GAAG;oCACf,KAAK,EAAE,mBAAmB;iCAC3B,YAEA,IAAI,CAAC,KAAK,GACP,EACN,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,qCAA4B,IAClF,IACF,EAGN,MAAC,cAAc,IAAC,KAAK,EAAC,YAAY,aAC/B,eAAe,IAAI,CAClB,8BACE,KAAC,YAAY,wBAAqB,EAClC,cAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,YACjE,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACzB,KAAC,YAAY,IAEX,MAAM,EAAE,UAAU,KAAK,GAAG,CAAC,KAAK,EAChC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,YAEtC,GAAG,CAAC,KAAK,IAJL,GAAG,CAAC,KAAK,CAKD,CAChB,CAAC,GACE,IACL,CACJ,EACD,KAAC,YAAY,4BAAyB,EACtC,cAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,YAC3C,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAC5B,KAAC,YAAY,IAEX,MAAM,EAAE,QAAQ,KAAK,GAAG,CAAC,KAAK,EAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,YAEpC,GAAG,CAAC,KAAK,IAJL,GAAG,CAAC,KAAK,CAKD,CAChB,CAAC,GACE,IACS,EAGjB,KAAC,cAAc,IAAC,KAAK,EAAC,SAAS,YAC7B,kBACE,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EACnC,KAAK,EAAE;wBACL,GAAG,eAAe;wBAClB,OAAO,EAAE,MAAM;wBACf,UAAU,EAAE,QAAQ;wBACpB,cAAc,EAAE,eAAe;qBAChC,gCAEc,KAAC,kBAAkB,IAAC,GAAG,EAAE,GAAG,GAAI,IACxC,GACM,EAGjB,KAAC,cAAc,IAAC,KAAK,EAAC,UAAU,YAC9B,iBAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,eAAe,gCAEvD,GACM,EAGjB,iBACE,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE;oBACL,GAAG,eAAe;oBAClB,YAAY,EAAE,QAAQ;iBACvB,yBAGM,EAET,eACE,KAAK,EAAE;oBACL,MAAM,EAAE,mBAAmB;oBAC3B,YAAY,EAAE,wBAAwB;oBACtC,OAAO,EAAE,SAAS;iBACnB,aAED,cACE,KAAK,EAAE;4BACL,QAAQ,EAAE,QAAQ;4BAClB,UAAU,EAAE,GAAG;4BACf,KAAK,EAAE,wBAAwB;4BAC/B,YAAY,EAAE,QAAQ;yBACvB,4BAGG,EACN,YAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,8EAE7E,EACJ,iBACE,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE;4BACL,OAAO,EAAE,aAAa;4BACtB,YAAY,EAAE,0BAA0B;4BACxC,MAAM,EAAE,kCAAkC;4BAC1C,UAAU,EAAE,aAAa;4BACzB,KAAK,EAAE,wBAAwB;4BAC/B,QAAQ,EAAE,SAAS;4BACnB,UAAU,EAAE,GAAG;4BACf,MAAM,EAAE,SAAS;4BACjB,UAAU,EAAE,SAAS;yBACtB,+BAGM,IACL,EAEN,KAAC,KAAK,IACJ,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EACpC,KAAK,EAAC,SAAS,EACf,QAAQ,EAAE,GAAG,YAEb,KAAC,WAAW,IAAC,GAAG,EAAE,GAAG,GAAI,GACnB,IACJ,CACP,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAA0C;IACjF,OAAO,CACL,eACE,KAAK,EAAE;YACL,UAAU,EAAE,cAAc;YAC1B,MAAM,EAAE,uBAAuB;YAC/B,YAAY,EAAE,wBAAwB;YACtC,OAAO,EAAE,SAAS;YAClB,YAAY,EAAE,MAAM;SACrB,aAED,cACE,KAAK,EAAE;oBACL,QAAQ,EAAE,QAAQ;oBAClB,UAAU,EAAE,GAAG;oBACf,YAAY,EAAE,SAAS;oBACvB,KAAK,EAAE,YAAY;iBACpB,YAEA,KAAK,GACF,EACL,QAAQ,IACL,CACP,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,QAAQ,EAA2B;IACzD,OAAO,CACL,cACE,KAAK,EAAE;YACL,QAAQ,EAAE,SAAS;YACnB,UAAU,EAAE,GAAG;YACf,KAAK,EAAE,cAAc;YACrB,YAAY,EAAE,SAAS;SACxB,YAEA,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EACpB,MAAM,EACN,OAAO,EACP,QAAQ,GAKT;IACC,OAAO,CACL,iBACE,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE;YACL,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,QAAQ;YACjB,YAAY,EAAE,0BAA0B;YACxC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,uBAAuB;YACpE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,aAAa;YACzD,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc;YAChD,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;YAC9B,QAAQ,EAAE,SAAS;YACnB,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,SAAS;SACtB,YAEA,QAAQ,GACF,CACV,CAAC;AACJ,CAAC;AAED,MAAM,eAAe,GAAkB;IACrC,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,wBAAwB;IACtC,MAAM,EAAE,uBAAuB;IAC/B,UAAU,EAAE,cAAc;IAC1B,KAAK,EAAE,YAAY;IACnB,QAAQ,EAAE,QAAQ;IAClB,UAAU,EAAE,GAAG;IACf,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,SAAS;CACtB,CAAC;AAcF,SAAS,qBAAqB,CAAC,OAAgB;IAC7C,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;AAC3D,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,KAAK,CAAC,EACpB,GAAG,EACH,QAAQ,EACR,OAAO,EACP,WAAW,GAAG,KAAK,EACnB,eAAe,GAAG,IAAI,GACX;IACX,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAEtD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,cACE,KAAK,EAAE;gBACL,SAAS,EAAE,QAAQ;gBACnB,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,QAAQ;aACzB,YAED,YAAG,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,2BAAgB,GAC/C,CACP,CAAC;IACJ,CAAC;IAED,IAAI,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,OAAO,CACL,cACE,KAAK,EAAE;gBACL,SAAS,EAAE,QAAQ;gBACnB,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,QAAQ;gBACxB,OAAO,EAAE,MAAM;aAChB,YAED,eAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,aAChD,aACE,KAAK,EAAE;4BACL,QAAQ,EAAE,QAAQ;4BAClB,UAAU,EAAE,GAAG;4BACf,YAAY,EAAE,QAAQ;4BACtB,KAAK,EAAE,YAAY;yBACpB,YAEA,cAAc,IAAI,cAAc,GAC9B,EACL,YAAG,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,qCAEzE,EACJ,KAAC,YAAY,IAAC,GAAG,EAAE,GAAG,GAAI,EAC1B,YAAG,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,+CAE1E,IACA,GACF,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,aAC3E,kBACE,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,eAAe;oBAC/B,OAAO,EAAE,aAAa;oBACtB,YAAY,EAAE,uBAAuB;oBACrC,UAAU,EAAE,cAAc;oBAC1B,QAAQ,EAAE,QAAQ;oBAClB,GAAG,EAAE,CAAC;oBACN,MAAM,EAAE,EAAE;iBACX,aAED,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,aACnE,YACE,IAAI,EAAC,6BAA6B,EAClC,KAAK,EAAE;oCACL,UAAU,EAAE,GAAG;oCACf,QAAQ,EAAE,MAAM;oCAChB,KAAK,EAAE,eAAe;oCACtB,cAAc,EAAE,MAAM;iCACvB,qBAGC,EACH,cAAc,IAAI,cAAc,KAAK,cAAc,IAAI,CACtD,eAAM,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,YACzE,cAAc,GACV,CACR,IACG,EACN,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,aAClE,KAAC,cAAc,KAAG,EACjB,eAAe,IAAI,CAAC,IAAI,IAAI,KAAC,WAAW,KAAG,EAC3C,IAAI,CAAC,CAAC,CAAC,CACN,KAAC,WAAW,IAAC,GAAG,EAAE,GAAG,EAAE,eAAe,EAAE,eAAe,GAAI,CAC5D,CAAC,CAAC,CAAC,CACF,KAAC,YAAY,IAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAC,SAAS,GAAG,CAC3C,IACG,IACC,EACT,eAAM,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,YAChE,KAAC,aAAa,cAAE,QAAQ,GAAiB,GACpC,EACP,KAAC,MAAM,KAAG,IACN,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/ui/layout.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type ReactNode } from 'react';
2
+ /** One screen in the app's main navigation. */
3
+ export interface NavItem {
4
+ label: string;
5
+ /** Same-origin path, e.g. `/` or `/notes`. */
6
+ href: string;
7
+ /** Optional icon, rendered before the label (mark it `aria-hidden`). */
8
+ icon?: ReactNode;
9
+ /**
10
+ * Tab title while this item's route is current. Shell applies it; a screen's
11
+ * own `useDocumentTitle` overrides it.
12
+ */
13
+ title?: string;
14
+ }
15
+ export interface NavBarProps {
16
+ items: NavItem[];
17
+ /**
18
+ * The route to mark as current. Defaults to `location.pathname`, kept in step
19
+ * with back/forward (`popstate`). Pass your router's location when you use one.
20
+ */
21
+ currentPath?: string;
22
+ /**
23
+ * Client-side navigation: called instead of a full page load on a plain left
24
+ * click. Without it the items are ordinary links.
25
+ */
26
+ onNavigate?: (href: string) => void;
27
+ }
28
+ /** The browser's current path, following back/forward. `initial` wins when given. */
29
+ export declare function useCurrentPath(initial?: string): [string, (path: string) => void];
30
+ /** The item to mark current: an exact match, else the longest prefix (`/notes` for `/notes/42`). */
31
+ export declare function activeHref(items: NavItem[], path: string): string | null;
32
+ export declare const NAVBAR_CSS = ".fas-nav{position:relative;display:flex;align-items:center;flex:1 1 auto;min-width:0;margin:0 .5rem}\n.fas-nav__toggle{display:none;align-items:center;justify-content:center;min-width:44px;min-height:44px;padding:0;border:1px solid var(--line);border-radius:var(--radius-sm,10px);background:transparent;color:var(--ink);font:inherit;cursor:pointer}\n.fas-nav__list{display:flex;align-items:center;gap:.25rem;margin:0;padding:0;list-style:none;overflow-x:auto}\n.fas-nav__link{display:inline-flex;align-items:center;gap:.4rem;min-height:44px;padding:0 .75rem;border-radius:var(--radius-sm,10px);color:var(--muted);font-size:.9rem;font-weight:600;text-decoration:none;white-space:nowrap}\n.fas-nav__link:hover{color:var(--ink);background:var(--line)}\n.fas-nav__link[aria-current=\"page\"]{color:var(--accent);background:var(--accent-soft,var(--line))}\n.fas-nav__toggle:focus-visible,.fas-nav__link:focus-visible{outline:2px solid var(--accent);outline-offset:2px}\n@media (max-width:639px){.fas-nav{flex:0 0 auto;margin:0}.fas-nav__toggle{display:inline-flex}.fas-nav__list{display:none;position:absolute;top:calc(100% + .5rem);left:0;z-index:60;flex-direction:column;align-items:stretch;min-width:12rem;padding:.5rem;overflow:visible;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius,12px);box-shadow:0 8px 24px rgba(0,0,0,.12)}.fas-nav[data-open=\"true\"] .fas-nav__list{display:flex}}\n";
33
+ /**
34
+ * NavBar — the app's main navigation. Shell renders it in its topbar from the
35
+ * `nav` prop; it also works on its own in a custom layout.
36
+ *
37
+ * `<nav aria-label="Main">` landmark, `aria-current="page"` on the current item,
38
+ * 44px targets, visible focus, and below 640px a menu button (`aria-expanded` /
39
+ * `aria-controls`; Escape or a click outside closes it, Escape returns focus).
40
+ * Renders nothing when there are no items.
41
+ */
42
+ export declare function NavBar({ items, currentPath, onNavigate }: NavBarProps): import("react").JSX.Element | null;
43
+ //# sourceMappingURL=navbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navbar.d.ts","sourceRoot":"","sources":["../../src/ui/navbar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAEf,+CAA+C;AAC/C,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,CAcjF;AAED,oGAAoG;AACpG,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxE;AAID,eAAO,MAAM,UAAU,g5CAQtB,CAAC;AAYF;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,WAAW,sCAyFrE"}
@@ -0,0 +1,107 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useId, useInsertionEffect, useRef, useState, } from 'react';
3
+ /** The browser's current path, following back/forward. `initial` wins when given. */
4
+ export function useCurrentPath(initial) {
5
+ const [path, setPath] = useState(() => initial ?? (typeof window === 'undefined' ? '/' : window.location.pathname));
6
+ useEffect(() => {
7
+ if (initial !== undefined) {
8
+ setPath(initial);
9
+ return;
10
+ }
11
+ const sync = () => setPath(window.location.pathname);
12
+ window.addEventListener('popstate', sync);
13
+ return () => window.removeEventListener('popstate', sync);
14
+ }, [initial]);
15
+ return [path, setPath];
16
+ }
17
+ /** The item to mark current: an exact match, else the longest prefix (`/notes` for `/notes/42`). */
18
+ export function activeHref(items, path) {
19
+ let best = null;
20
+ for (const { href } of items) {
21
+ const matches = href === path || (href !== '/' && path.startsWith(`${href.replace(/\/+$/, '')}/`));
22
+ if (matches && (best === null || href.length > best.length))
23
+ best = href;
24
+ }
25
+ return best;
26
+ }
27
+ // Hover, focus and the small-screen collapse need real CSS, so it's injected
28
+ // once like the SDK's keyframes. Tokens only, so it follows light/dark theme.
29
+ export const NAVBAR_CSS = `.fas-nav{position:relative;display:flex;align-items:center;flex:1 1 auto;min-width:0;margin:0 .5rem}
30
+ .fas-nav__toggle{display:none;align-items:center;justify-content:center;min-width:44px;min-height:44px;padding:0;border:1px solid var(--line);border-radius:var(--radius-sm,10px);background:transparent;color:var(--ink);font:inherit;cursor:pointer}
31
+ .fas-nav__list{display:flex;align-items:center;gap:.25rem;margin:0;padding:0;list-style:none;overflow-x:auto}
32
+ .fas-nav__link{display:inline-flex;align-items:center;gap:.4rem;min-height:44px;padding:0 .75rem;border-radius:var(--radius-sm,10px);color:var(--muted);font-size:.9rem;font-weight:600;text-decoration:none;white-space:nowrap}
33
+ .fas-nav__link:hover{color:var(--ink);background:var(--line)}
34
+ .fas-nav__link[aria-current="page"]{color:var(--accent);background:var(--accent-soft,var(--line))}
35
+ .fas-nav__toggle:focus-visible,.fas-nav__link:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
36
+ @media (max-width:639px){.fas-nav{flex:0 0 auto;margin:0}.fas-nav__toggle{display:inline-flex}.fas-nav__list{display:none;position:absolute;top:calc(100% + .5rem);left:0;z-index:60;flex-direction:column;align-items:stretch;min-width:12rem;padding:.5rem;overflow:visible;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius,12px);box-shadow:0 8px 24px rgba(0,0,0,.12)}.fas-nav[data-open="true"] .fas-nav__list{display:flex}}
37
+ `;
38
+ function useNavbarStyles() {
39
+ useInsertionEffect(() => {
40
+ if (document.getElementById('fas-nav-css'))
41
+ return;
42
+ const style = document.createElement('style');
43
+ style.id = 'fas-nav-css';
44
+ style.textContent = NAVBAR_CSS;
45
+ document.head.appendChild(style);
46
+ }, []);
47
+ }
48
+ /**
49
+ * NavBar — the app's main navigation. Shell renders it in its topbar from the
50
+ * `nav` prop; it also works on its own in a custom layout.
51
+ *
52
+ * `<nav aria-label="Main">` landmark, `aria-current="page"` on the current item,
53
+ * 44px targets, visible focus, and below 640px a menu button (`aria-expanded` /
54
+ * `aria-controls`; Escape or a click outside closes it, Escape returns focus).
55
+ * Renders nothing when there are no items.
56
+ */
57
+ export function NavBar({ items, currentPath, onNavigate }) {
58
+ useNavbarStyles();
59
+ const [path, setPath] = useCurrentPath(currentPath);
60
+ const [open, setOpen] = useState(false);
61
+ const listId = useId();
62
+ const navRef = useRef(null);
63
+ const toggleRef = useRef(null);
64
+ useEffect(() => {
65
+ if (!open)
66
+ return;
67
+ const close = (returnFocus) => {
68
+ setOpen(false);
69
+ if (returnFocus)
70
+ toggleRef.current?.focus();
71
+ };
72
+ const onKey = (e) => {
73
+ if (e.key === 'Escape')
74
+ close(true);
75
+ };
76
+ const onPointer = (e) => {
77
+ if (!navRef.current?.contains(e.target))
78
+ close(false);
79
+ };
80
+ document.addEventListener('keydown', onKey);
81
+ document.addEventListener('pointerdown', onPointer);
82
+ return () => {
83
+ document.removeEventListener('keydown', onKey);
84
+ document.removeEventListener('pointerdown', onPointer);
85
+ };
86
+ }, [open]);
87
+ if (items.length === 0)
88
+ return null;
89
+ const current = activeHref(items, path);
90
+ const follow = (e, href) => {
91
+ setOpen(false);
92
+ if (!onNavigate ||
93
+ e.defaultPrevented ||
94
+ e.button !== 0 ||
95
+ e.metaKey ||
96
+ e.ctrlKey ||
97
+ e.shiftKey ||
98
+ e.altKey)
99
+ return;
100
+ e.preventDefault();
101
+ onNavigate(href);
102
+ if (currentPath === undefined)
103
+ setPath(href);
104
+ };
105
+ return (_jsxs("nav", { ref: navRef, "aria-label": "Main", className: "fas-nav", "data-open": open ? 'true' : 'false', children: [_jsx("button", { ref: toggleRef, type: "button", className: "fas-nav__toggle", "aria-expanded": open, "aria-controls": listId, "aria-label": "Menu", onClick: () => setOpen((o) => !o), children: _jsx("svg", { "aria-hidden": "true", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", children: _jsx("path", { d: open ? 'M6 6l12 12M18 6L6 18' : 'M4 7h16M4 12h16M4 17h16' }) }) }), _jsx("ul", { id: listId, className: "fas-nav__list", children: items.map((item) => (_jsx("li", { children: _jsxs("a", { href: item.href, "aria-current": item.href === current ? 'page' : undefined, className: "fas-nav__link", onClick: (e) => follow(e, item.href), children: [item.icon, item.label] }) }, item.href))) })] }));
106
+ }
107
+ //# sourceMappingURL=navbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navbar.js","sourceRoot":"","sources":["../../src/ui/navbar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * Set the tab title for the current screen. Call it once in each routed screen;
4
+ * the title follows the value while the screen is mounted. Runs after Shell
5
+ * applies a nav item's `title`, so the screen's own title wins on that route.
6
+ *
7
+ * ```tsx
8
+ * useDocumentTitle(`${note.title} — Notes`)
9
+ * ```
10
+ */
11
+ export declare function useDocumentTitle(title: string | null | undefined): void;
12
+ export interface PageHeaderProps {
13
+ /** The screen's heading, rendered as its single `<h1>`. */
14
+ title: ReactNode;
15
+ /** Optional line under the heading. */
16
+ description?: ReactNode;
17
+ /** Optional controls aligned with the heading (e.g. a primary button). */
18
+ actions?: ReactNode;
19
+ }
20
+ /**
21
+ * The screen's heading: renders the page's one `<h1>` the same way on every
22
+ * screen. Shell moves focus to it after a client-side navigation, so keyboard
23
+ * and screen-reader users land on the new page.
24
+ */
25
+ export declare function PageHeader({ title, description, actions }: PageHeaderProps): import("react").JSX.Element;
26
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/ui/page.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,OAAO,CAAC;AAElD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAIvE;AAED,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,KAAK,EAAE,SAAS,CAAC;IACjB,uCAAuC;IACvC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,eAAe,+BAc1E"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect } from 'react';
3
+ /**
4
+ * Set the tab title for the current screen. Call it once in each routed screen;
5
+ * the title follows the value while the screen is mounted. Runs after Shell
6
+ * applies a nav item's `title`, so the screen's own title wins on that route.
7
+ *
8
+ * ```tsx
9
+ * useDocumentTitle(`${note.title} — Notes`)
10
+ * ```
11
+ */
12
+ export function useDocumentTitle(title) {
13
+ useEffect(() => {
14
+ if (title)
15
+ document.title = title;
16
+ }, [title]);
17
+ }
18
+ /**
19
+ * The screen's heading: renders the page's one `<h1>` the same way on every
20
+ * screen. Shell moves focus to it after a client-side navigation, so keyboard
21
+ * and screen-reader users land on the new page.
22
+ */
23
+ export function PageHeader({ title, description, actions }) {
24
+ return (_jsxs("div", { className: "fas-page-header", children: [_jsxs("div", { children: [_jsx("h1", { className: "fas-page-header__title", tabIndex: -1, "data-fas-page-heading": "", children: title }), description && _jsx("p", { className: "fas-page-header__description", children: description })] }), actions && (_jsx("div", { style: { display: 'flex', alignItems: 'center', gap: '0.5rem' }, children: actions }))] }));
25
+ }
26
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/ui/page.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,OAAO,CAAC;AAElD;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAgC;IAC/D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;IACpC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACd,CAAC;AAWD;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAmB;IACzE,OAAO,CACL,eAAK,SAAS,EAAC,iBAAiB,aAC9B,0BACE,aAAI,SAAS,EAAC,wBAAwB,EAAC,QAAQ,EAAE,CAAC,CAAC,2BAAwB,EAAE,YAC1E,KAAK,GACH,EACJ,WAAW,IAAI,YAAG,SAAS,EAAC,8BAA8B,YAAE,WAAW,GAAK,IACzE,EACL,OAAO,IAAI,CACV,cAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAG,OAAO,GAAO,CACtF,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { Component, type ErrorInfo, type ReactNode, type RefObject } from 'react';
2
+ import type { FreeAppStore } from '../index.js';
3
+ export declare const SHELL_CSS = ".fas-skip-link:not(:focus){position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}\n.fas-skip-link:focus{position:fixed;top:.5rem;left:.5rem;z-index:1200;padding:.7rem 1rem;border:2px solid var(--accent);border-radius:var(--radius-sm,10px);background:var(--panel);color:var(--ink);font-weight:600;text-decoration:none;outline:2px solid var(--accent);outline-offset:2px}\n.fas-main:focus{outline:none}\n.fas-offline{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.25rem .5rem .25rem 1rem;background:var(--panel);color:var(--ink);border-bottom:1px solid var(--line);border-left:3px solid var(--warning);font-size:.875rem}\n.fas-toast-region{position:fixed;bottom:1.25rem;left:50%;z-index:1100;display:flex;flex-direction:column;align-items:center;gap:.5rem;max-width:calc(100vw - 2rem);transform:translateX(-50%);pointer-events:none}\n.fas-toast{display:flex;align-items:center;gap:.75rem;padding:.25rem .25rem .25rem 1rem;background:var(--ink);color:var(--panel);border-left:3px solid var(--accent);border-radius:var(--radius,.75rem);box-shadow:0 8px 24px rgba(0,0,0,.3);font-size:.875rem;pointer-events:auto}\n.fas-toast[data-variant=\"success\"]{border-left-color:var(--success)}\n.fas-toast[data-variant=\"error\"]{border-left-color:var(--danger,var(--error))}\n.fas-dismiss{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;padding:0;border:0;border-radius:var(--radius-sm,10px);background:transparent;color:inherit;font:inherit;font-size:1.1rem;line-height:1;cursor:pointer;opacity:.75}\n.fas-dismiss:hover{opacity:1}\n.fas-shell-loading{display:flex;flex:1;align-items:center;justify-content:center;padding:3rem 1rem}\n.fas-shell-error{display:flex;flex:1;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;padding:3rem 1rem;text-align:center;color:var(--ink)}\n.fas-shell-error h1{margin:0;font-size:1.25rem}\n.fas-shell-error p{margin:0;max-width:32rem;color:var(--muted);font-size:.9rem}\n.fas-shell-error__retry{min-height:44px;padding:0 1.25rem;border:0;border-radius:var(--radius-sm,10px);background:var(--accent);color:#fff;font:inherit;font-weight:600;cursor:pointer}\n.fas-page-header{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:.75rem;margin:0 0 1.25rem}\n.fas-page-header__title{margin:0;color:var(--ink);font-size:1.5rem;font-weight:700;line-height:1.2}\n.fas-page-header__title:focus{outline:none}\n.fas-page-header__description{margin:.25rem 0 0;color:var(--muted);font-size:.9rem}\n.fas-dismiss:focus-visible,.fas-shell-error__retry:focus-visible{outline:2px solid var(--accent);outline-offset:2px}\n";
4
+ export interface ShellErrorContext {
5
+ error: Error;
6
+ /** Clear the error and render the screen again. */
7
+ reset: () => void;
8
+ }
9
+ interface BoundaryProps {
10
+ app: FreeAppStore;
11
+ renderError: ((ctx: ShellErrorContext) => ReactNode) | undefined;
12
+ /** A change (the current route) clears a caught error, so navigating away recovers. */
13
+ resetKey: string;
14
+ children: ReactNode;
15
+ }
16
+ interface BoundaryState {
17
+ error: Error | null;
18
+ resetKey: string;
19
+ }
20
+ /**
21
+ * Catches a render error in the app's content so one broken screen shows a
22
+ * fallback instead of a white screen, and records it through `app.log`: an
23
+ * error React catches never reaches `window.onerror`, so the logger's automatic
24
+ * capture would miss it.
25
+ */
26
+ export declare class ShellErrorBoundary extends Component<BoundaryProps, BoundaryState> {
27
+ state: BoundaryState;
28
+ static getDerivedStateFromError(error: unknown): Partial<BoundaryState>;
29
+ static getDerivedStateFromProps(props: BoundaryProps, state: BoundaryState): Partial<BoundaryState> | null;
30
+ componentDidCatch(error: unknown, info: ErrorInfo): void;
31
+ reset: () => void;
32
+ render(): ReactNode;
33
+ }
34
+ export type ToastVariant = 'info' | 'success' | 'error';
35
+ export interface ToastOptions {
36
+ variant?: ToastVariant;
37
+ /** Milliseconds before it dismisses itself; 0 keeps it until dismissed. Default 4000. */
38
+ duration?: number;
39
+ }
40
+ export interface ToastApi {
41
+ /** Show a message; returns its id. */
42
+ show: (message: string, options?: ToastOptions) => number;
43
+ dismiss: (id: number) => void;
44
+ }
45
+ /**
46
+ * Raise a message from any screen inside Shell. Messages appear in the shell's
47
+ * single polite live region.
48
+ *
49
+ * ```tsx
50
+ * const toast = useToast()
51
+ * toast.show('Saved', { variant: 'success' })
52
+ * ```
53
+ */
54
+ export declare function useToast(): ToastApi;
55
+ /**
56
+ * The shell's toast queue. The region is always rendered, so it's already in
57
+ * the accessibility tree when a message arrives (a live region created together
58
+ * with its first message is often not announced). Items have no live role.
59
+ */
60
+ export declare function ToastProvider({ children }: {
61
+ children: ReactNode;
62
+ }): import("react").JSX.Element;
63
+ /** `navigator.onLine`, kept current by the browser's online/offline events. */
64
+ export declare function useOnline(): boolean;
65
+ /**
66
+ * A banner under the topbar while the connection is down. Its polite live
67
+ * region is always present, so the change is announced. Dismissible; clears
68
+ * itself on reconnect, and a later drop shows it again.
69
+ */
70
+ export declare function OfflineBanner(): import("react").JSX.Element;
71
+ /** The first focusable element: hidden until focused, moves focus to the shell's `<main id="main">`. */
72
+ export declare function SkipLink({ mainRef }: {
73
+ mainRef: RefObject<HTMLElement | null>;
74
+ }): import("react").JSX.Element;
75
+ /**
76
+ * Scroll and focus on client-side route changes. Forward navigation lands at the
77
+ * top; back/forward returns to where that route was left. After either, focus
78
+ * moves to the new screen's PageHeader `<h1>`, else to `<main>`.
79
+ *
80
+ * Only for client-side navigation (`enabled` = the app passed `onNavigate`):
81
+ * with ordinary links every navigation is a page load, and the browser already
82
+ * restores scroll and resets focus.
83
+ *
84
+ * Returns the function to call just before a forward navigation.
85
+ */
86
+ export declare function useRouteChangeEffects(path: string, mainRef: RefObject<HTMLElement | null>, enabled: boolean): () => void;
87
+ export {};
88
+ //# sourceMappingURL=shell-resilience.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-resilience.d.ts","sourceRoot":"","sources":["../../src/ui/shell-resilience.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAET,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,SAAS,EAOf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhD,eAAO,MAAM,SAAS,msFAoBrB,CAAC;AAIF,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,KAAK,CAAC;IACb,mDAAmD;IACnD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,GAAG,EAAE,YAAY,CAAC;IAClB,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE,iBAAiB,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IACjE,uFAAuF;IACvF,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,UAAU,aAAa;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC;IACpE,KAAK,EAAE,aAAa,CAAkD;IAE/E,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAIvE,MAAM,CAAC,wBAAwB,CAC7B,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAIvB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IASjE,KAAK,QAAO,IAAI,CAAmC;IAE1C,MAAM,IAAI,SAAS;CAiB7B;AAID,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,sCAAsC;IACtC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,MAAM,CAAC;IAC1D,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAcD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,IAAI,QAAQ,CAInC;AAuBD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BA+BlE;AAID,+EAA+E;AAC/E,wBAAgB,SAAS,IAAI,OAAO,CAgBnC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,gCAuB5B;AAID,wGAAwG;AACxG,wBAAgB,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;CAAE,+BAgB/E;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACtC,OAAO,EAAE,OAAO,GACf,MAAM,IAAI,CA0CZ"}
@@ -0,0 +1,207 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Component, createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from 'react';
3
+ // Shell's resilience and feedback layer (#89): error boundary, toasts, offline
4
+ // banner, skip link, and scroll/focus on client-side route changes.
5
+ // Skip link, offline banner, toasts, error/loading fallbacks and PageHeader.
6
+ // Tokens only, injected once by Shell like the navbar's stylesheet.
7
+ export const SHELL_CSS = `.fas-skip-link:not(:focus){position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
8
+ .fas-skip-link:focus{position:fixed;top:.5rem;left:.5rem;z-index:1200;padding:.7rem 1rem;border:2px solid var(--accent);border-radius:var(--radius-sm,10px);background:var(--panel);color:var(--ink);font-weight:600;text-decoration:none;outline:2px solid var(--accent);outline-offset:2px}
9
+ .fas-main:focus{outline:none}
10
+ .fas-offline{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.25rem .5rem .25rem 1rem;background:var(--panel);color:var(--ink);border-bottom:1px solid var(--line);border-left:3px solid var(--warning);font-size:.875rem}
11
+ .fas-toast-region{position:fixed;bottom:1.25rem;left:50%;z-index:1100;display:flex;flex-direction:column;align-items:center;gap:.5rem;max-width:calc(100vw - 2rem);transform:translateX(-50%);pointer-events:none}
12
+ .fas-toast{display:flex;align-items:center;gap:.75rem;padding:.25rem .25rem .25rem 1rem;background:var(--ink);color:var(--panel);border-left:3px solid var(--accent);border-radius:var(--radius,.75rem);box-shadow:0 8px 24px rgba(0,0,0,.3);font-size:.875rem;pointer-events:auto}
13
+ .fas-toast[data-variant="success"]{border-left-color:var(--success)}
14
+ .fas-toast[data-variant="error"]{border-left-color:var(--danger,var(--error))}
15
+ .fas-dismiss{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;padding:0;border:0;border-radius:var(--radius-sm,10px);background:transparent;color:inherit;font:inherit;font-size:1.1rem;line-height:1;cursor:pointer;opacity:.75}
16
+ .fas-dismiss:hover{opacity:1}
17
+ .fas-shell-loading{display:flex;flex:1;align-items:center;justify-content:center;padding:3rem 1rem}
18
+ .fas-shell-error{display:flex;flex:1;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;padding:3rem 1rem;text-align:center;color:var(--ink)}
19
+ .fas-shell-error h1{margin:0;font-size:1.25rem}
20
+ .fas-shell-error p{margin:0;max-width:32rem;color:var(--muted);font-size:.9rem}
21
+ .fas-shell-error__retry{min-height:44px;padding:0 1.25rem;border:0;border-radius:var(--radius-sm,10px);background:var(--accent);color:#fff;font:inherit;font-weight:600;cursor:pointer}
22
+ .fas-page-header{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:.75rem;margin:0 0 1.25rem}
23
+ .fas-page-header__title{margin:0;color:var(--ink);font-size:1.5rem;font-weight:700;line-height:1.2}
24
+ .fas-page-header__title:focus{outline:none}
25
+ .fas-page-header__description{margin:.25rem 0 0;color:var(--muted);font-size:.9rem}
26
+ .fas-dismiss:focus-visible,.fas-shell-error__retry:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
27
+ `;
28
+ /**
29
+ * Catches a render error in the app's content so one broken screen shows a
30
+ * fallback instead of a white screen, and records it through `app.log`: an
31
+ * error React catches never reaches `window.onerror`, so the logger's automatic
32
+ * capture would miss it.
33
+ */
34
+ export class ShellErrorBoundary extends Component {
35
+ state = { error: null, resetKey: this.props.resetKey };
36
+ static getDerivedStateFromError(error) {
37
+ return { error: error instanceof Error ? error : new Error(String(error)) };
38
+ }
39
+ static getDerivedStateFromProps(props, state) {
40
+ return props.resetKey !== state.resetKey ? { error: null, resetKey: props.resetKey } : null;
41
+ }
42
+ componentDidCatch(error, info) {
43
+ const err = error instanceof Error ? error : new Error(String(error));
44
+ this.props.app.log._renderError(err.message, {
45
+ stack: err.stack,
46
+ componentStack: info.componentStack ?? undefined,
47
+ path: typeof window === 'undefined' ? undefined : window.location.pathname,
48
+ });
49
+ }
50
+ reset = () => this.setState({ error: null });
51
+ render() {
52
+ const { error } = this.state;
53
+ if (!error)
54
+ return this.props.children;
55
+ if (this.props.renderError)
56
+ return this.props.renderError({ error, reset: this.reset });
57
+ return (_jsxs("div", { role: "alert", className: "fas-shell-error", children: [_jsx("h1", { children: "Something went wrong" }), _jsx("p", { children: "This screen hit an error and could not be shown. It has been reported. Try again, or use the navigation to go elsewhere." }), _jsx("button", { type: "button", className: "fas-shell-error__retry", onClick: this.reset, children: "Try again" })] }));
58
+ }
59
+ }
60
+ /** At most this many messages at once; the oldest goes first. */
61
+ const MAX_TOASTS = 4;
62
+ const ToastContext = createContext(null);
63
+ /**
64
+ * Raise a message from any screen inside Shell. Messages appear in the shell's
65
+ * single polite live region.
66
+ *
67
+ * ```tsx
68
+ * const toast = useToast()
69
+ * toast.show('Saved', { variant: 'success' })
70
+ * ```
71
+ */
72
+ export function useToast() {
73
+ const api = useContext(ToastContext);
74
+ if (!api)
75
+ throw new Error('useToast must be used inside <Shell>');
76
+ return api;
77
+ }
78
+ function ToastItem({ toast, onDismiss }) {
79
+ useEffect(() => {
80
+ if (toast.duration <= 0)
81
+ return;
82
+ const timer = setTimeout(() => onDismiss(toast.id), toast.duration);
83
+ return () => clearTimeout(timer);
84
+ }, [toast.id, toast.duration, onDismiss]);
85
+ return (_jsxs("div", { className: "fas-toast", "data-variant": toast.variant, children: [_jsx("span", { children: toast.message }), _jsx("button", { type: "button", className: "fas-dismiss", "aria-label": "Dismiss", onClick: () => onDismiss(toast.id), children: "\u00D7" })] }));
86
+ }
87
+ /**
88
+ * The shell's toast queue. The region is always rendered, so it's already in
89
+ * the accessibility tree when a message arrives (a live region created together
90
+ * with its first message is often not announced). Items have no live role.
91
+ */
92
+ export function ToastProvider({ children }) {
93
+ const [toasts, setToasts] = useState([]);
94
+ const nextId = useRef(1);
95
+ const dismiss = useCallback((id) => setToasts((all) => all.filter((t) => t.id !== id)), []);
96
+ const show = useCallback((message, options = {}) => {
97
+ const id = nextId.current++;
98
+ const toast = {
99
+ id,
100
+ message,
101
+ variant: options.variant ?? 'info',
102
+ duration: options.duration ?? 4000,
103
+ };
104
+ setToasts((all) => [...all, toast].slice(-MAX_TOASTS));
105
+ return id;
106
+ }, []);
107
+ const api = useMemo(() => ({ show, dismiss }), [show, dismiss]);
108
+ return (_jsxs(ToastContext.Provider, { value: api, children: [children, _jsx("div", { role: "status", "aria-live": "polite", className: "fas-toast-region", children: toasts.map((toast) => (_jsx(ToastItem, { toast: toast, onDismiss: dismiss }, toast.id))) })] }));
109
+ }
110
+ // ── Offline ─────────────────────────────────────────────────────
111
+ /** `navigator.onLine`, kept current by the browser's online/offline events. */
112
+ export function useOnline() {
113
+ const [online, setOnline] = useState(() => typeof navigator === 'undefined' ? true : navigator.onLine);
114
+ useEffect(() => {
115
+ const up = () => setOnline(true);
116
+ const down = () => setOnline(false);
117
+ window.addEventListener('online', up);
118
+ window.addEventListener('offline', down);
119
+ setOnline(navigator.onLine);
120
+ return () => {
121
+ window.removeEventListener('online', up);
122
+ window.removeEventListener('offline', down);
123
+ };
124
+ }, []);
125
+ return online;
126
+ }
127
+ /**
128
+ * A banner under the topbar while the connection is down. Its polite live
129
+ * region is always present, so the change is announced. Dismissible; clears
130
+ * itself on reconnect, and a later drop shows it again.
131
+ */
132
+ export function OfflineBanner() {
133
+ const online = useOnline();
134
+ const [dismissed, setDismissed] = useState(false);
135
+ useEffect(() => {
136
+ if (online)
137
+ setDismissed(false);
138
+ }, [online]);
139
+ return (_jsx("div", { role: "status", "aria-live": "polite", children: !online && !dismissed && (_jsxs("div", { className: "fas-offline", children: [_jsx("span", { children: "You're offline. Changes can't be saved until the connection is back." }), _jsx("button", { type: "button", className: "fas-dismiss", "aria-label": "Dismiss offline notice", onClick: () => setDismissed(true), children: "\u00D7" })] })) }));
140
+ }
141
+ // ── Skip link ───────────────────────────────────────────────────
142
+ /** The first focusable element: hidden until focused, moves focus to the shell's `<main id="main">`. */
143
+ export function SkipLink({ mainRef }) {
144
+ return (
145
+ // biome-ignore lint/a11y/useValidAnchor: a real link to #main (works without JS); the click handler only avoids a hash change.
146
+ _jsx("a", { href: "#main", className: "fas-skip-link", onClick: (e) => {
147
+ // Focus directly rather than following the fragment: a hash change is a
148
+ // history navigation, which a router would see as a route change.
149
+ e.preventDefault();
150
+ mainRef.current?.focus();
151
+ }, children: "Skip to content" }));
152
+ }
153
+ // ── Route changes: scroll and focus ─────────────────────────────
154
+ /**
155
+ * Scroll and focus on client-side route changes. Forward navigation lands at the
156
+ * top; back/forward returns to where that route was left. After either, focus
157
+ * moves to the new screen's PageHeader `<h1>`, else to `<main>`.
158
+ *
159
+ * Only for client-side navigation (`enabled` = the app passed `onNavigate`):
160
+ * with ordinary links every navigation is a page load, and the browser already
161
+ * restores scroll and resets focus.
162
+ *
163
+ * Returns the function to call just before a forward navigation.
164
+ */
165
+ export function useRouteChangeEffects(path, mainRef, enabled) {
166
+ const positions = useRef(new Map());
167
+ const lastPath = useRef(path);
168
+ const kind = useRef('push');
169
+ useEffect(() => {
170
+ if (!enabled)
171
+ return;
172
+ const previous = window.history.scrollRestoration;
173
+ window.history.scrollRestoration = 'manual';
174
+ // Runs before the re-render the same popstate causes, while the page still
175
+ // shows the route being left.
176
+ const onPop = () => {
177
+ positions.current.set(lastPath.current, window.scrollY);
178
+ kind.current = 'pop';
179
+ };
180
+ window.addEventListener('popstate', onPop);
181
+ return () => {
182
+ window.removeEventListener('popstate', onPop);
183
+ window.history.scrollRestoration = previous;
184
+ };
185
+ }, [enabled]);
186
+ useEffect(() => {
187
+ if (!enabled || path === lastPath.current)
188
+ return;
189
+ lastPath.current = path;
190
+ const back = kind.current === 'pop';
191
+ kind.current = 'push';
192
+ // A frame later, so a router that renders the new screen in its own update
193
+ // has committed it before we scroll to it and look for its heading.
194
+ const frame = requestAnimationFrame(() => {
195
+ window.scrollTo(0, back ? (positions.current.get(path) ?? 0) : 0);
196
+ const main = mainRef.current;
197
+ const target = main?.querySelector('[data-fas-page-heading]') ?? main;
198
+ target?.focus({ preventScroll: true });
199
+ });
200
+ return () => cancelAnimationFrame(frame);
201
+ }, [path, enabled, mainRef]);
202
+ return useCallback(() => {
203
+ positions.current.set(lastPath.current, window.scrollY);
204
+ kind.current = 'push';
205
+ }, []);
206
+ }
207
+ //# sourceMappingURL=shell-resilience.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-resilience.js","sourceRoot":"","sources":["../../src/ui/shell-resilience.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,SAAS,EACT,aAAa,EAIb,WAAW,EACX,UAAU,EACV,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AAGf,+EAA+E;AAC/E,oEAAoE;AAEpE,6EAA6E;AAC7E,oEAAoE;AACpE,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;CAoBxB,CAAC;AAuBF;;;;;GAKG;AACH,MAAM,OAAO,kBAAmB,SAAQ,SAAuC;IACpE,KAAK,GAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAE/E,MAAM,CAAC,wBAAwB,CAAC,KAAc;QAC5C,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAC9E,CAAC;IAED,MAAM,CAAC,wBAAwB,CAC7B,KAAoB,EACpB,KAAoB;QAEpB,OAAO,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,CAAC;IAEQ,iBAAiB,CAAC,KAAc,EAAE,IAAe;QACxD,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE;YAC3C,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;YAChD,IAAI,EAAE,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ;SAC3E,CAAC,CAAC;IACL,CAAC;IAED,KAAK,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM;QACb,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACvC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACxF,OAAO,CACL,eAAK,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,iBAAiB,aAC3C,gDAA6B,EAC7B,mJAGI,EACJ,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,wBAAwB,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,0BAEnE,IACL,CACP,CAAC;IACJ,CAAC;CACF;AAyBD,iEAAiE;AACjE,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB,MAAM,YAAY,GAAG,aAAa,CAAkB,IAAI,CAAC,CAAC;AAE1D;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ;IACtB,MAAM,GAAG,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAClE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAA2D;IAC9F,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC;YAAE,OAAO;QAChC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1C,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,kBAAe,KAAK,CAAC,OAAO,aACpD,yBAAO,KAAK,CAAC,OAAO,GAAQ,EAC5B,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,aAAa,gBACZ,SAAS,EACpB,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,uBAG3B,IACL,CACP,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAA2B;IACjE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,EAAE,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,WAAW,CACzB,CAAC,EAAU,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAClE,EAAE,CACH,CAAC;IACF,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,OAAe,EAAE,UAAwB,EAAE,EAAE,EAAE;QACvE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAgB;YACzB,EAAE;YACF,OAAO;YACP,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM;YAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;SACnC,CAAC;QACF,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QACvD,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAEhE,OAAO,CACL,MAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,GAAG,aAC9B,QAAQ,EACT,cAAK,IAAI,EAAC,QAAQ,eAAW,QAAQ,EAAC,SAAS,EAAC,kBAAkB,YAC/D,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,KAAC,SAAS,IAAgB,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,IAA1C,KAAK,CAAC,EAAE,CAAsC,CAC/D,CAAC,GACE,IACgB,CACzB,CAAC;AACJ,CAAC;AAED,mEAAmE;AAEnE,+EAA+E;AAC/E,MAAM,UAAU,SAAS;IACvB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CACxC,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAC3D,CAAC;IACF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACzC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACb,OAAO,CACL,cAAK,IAAI,EAAC,QAAQ,eAAW,QAAQ,YAClC,CAAC,MAAM,IAAI,CAAC,SAAS,IAAI,CACxB,eAAK,SAAS,EAAC,aAAa,aAC1B,kGAAiF,EACjF,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,aAAa,gBACZ,wBAAwB,EACnC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,uBAG1B,IACL,CACP,GACG,CACP,CAAC;AACJ,CAAC;AAED,mEAAmE;AAEnE,wGAAwG;AACxG,MAAM,UAAU,QAAQ,CAAC,EAAE,OAAO,EAA8C;IAC9E,OAAO;IACL,+HAA+H;IAC/H,YACE,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,eAAe,EACzB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACb,wEAAwE;YACxE,kEAAkE;YAClE,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC,gCAGC,CACL,CAAC;AACJ,CAAC;AAED,mEAAmE;AAEnE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,OAAsC,EACtC,OAAgB;IAEhB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG,EAAkB,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAiB,MAAM,CAAC,CAAC;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,iBAAiB,GAAG,QAAQ,CAAC;QAC5C,2EAA2E;QAC3E,8BAA8B;QAC9B,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,iBAAiB,GAAG,QAAQ,CAAC;QAC9C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC,OAAO;YAAE,OAAO;QAClD,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,2EAA2E;QAC3E,oEAAoE;QACpE,MAAM,KAAK,GAAG,qBAAqB,CAAC,GAAG,EAAE;YACvC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,EAAE,aAAa,CAAc,yBAAyB,CAAC,IAAI,IAAI,CAAC;YACnF,MAAM,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAE7B,OAAO,WAAW,CAAC,GAAG,EAAE;QACtB,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@freeappstore/sdk",
3
- "version": "0.14.28",
3
+ "version": "0.14.30",
4
4
  "description": "Browser SDK for apps on freeappstore.online — auth, per-user KV, shared counters, document collections, real-time rooms, API proxy, user API key vault, RBAC roles, React hooks, and 18 UI components.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -55,7 +55,10 @@
55
55
  },
56
56
  "devDependencies": {
57
57
  "@types/react": "^19.3.0",
58
+ "@types/react-dom": "^19.3.0",
59
+ "happy-dom": "^20.14.5",
58
60
  "react": "^19.3.0",
61
+ "react-dom": "^19.3.0",
59
62
  "typescript": "^5.9.3"
60
63
  },
61
64
  "sideEffects": false,