@molecule/app-ui-react 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +521 -1
  2. package/dist/components/ConfirmButton.d.ts +71 -0
  3. package/dist/components/ConfirmButton.d.ts.map +1 -0
  4. package/dist/components/ConfirmButton.js +88 -0
  5. package/dist/components/ConfirmButton.js.map +1 -0
  6. package/dist/components/ConfirmDialog.d.ts +71 -0
  7. package/dist/components/ConfirmDialog.d.ts.map +1 -0
  8. package/dist/components/ConfirmDialog.js +20 -0
  9. package/dist/components/ConfirmDialog.js.map +1 -0
  10. package/dist/components/Icon.d.ts.map +1 -1
  11. package/dist/components/Icon.js +12 -1
  12. package/dist/components/Icon.js.map +1 -1
  13. package/dist/components/LoadErrorBanner.d.ts +71 -0
  14. package/dist/components/LoadErrorBanner.d.ts.map +1 -0
  15. package/dist/components/LoadErrorBanner.js +31 -0
  16. package/dist/components/LoadErrorBanner.js.map +1 -0
  17. package/dist/components/PromptDialog.d.ts +91 -0
  18. package/dist/components/PromptDialog.d.ts.map +1 -0
  19. package/dist/components/PromptDialog.js +90 -0
  20. package/dist/components/PromptDialog.js.map +1 -0
  21. package/dist/components/ResponsiveAppShell.d.ts +327 -0
  22. package/dist/components/ResponsiveAppShell.d.ts.map +1 -0
  23. package/dist/components/ResponsiveAppShell.js +470 -0
  24. package/dist/components/ResponsiveAppShell.js.map +1 -0
  25. package/dist/components/UserMenu.d.ts.map +1 -1
  26. package/dist/components/UserMenu.js +5 -1
  27. package/dist/components/UserMenu.js.map +1 -1
  28. package/dist/components/index.d.ts +5 -0
  29. package/dist/components/index.d.ts.map +1 -1
  30. package/dist/components/index.js +5 -0
  31. package/dist/components/index.js.map +1 -1
  32. package/package.json +2 -2
@@ -0,0 +1,327 @@
1
+ /**
2
+ * ResponsiveAppShell — the shared responsive app shell: a top bar, a desktop
3
+ * sidebar (≥768px) and a mobile nav drawer (<768px) around one content region.
4
+ *
5
+ * Roughly 89 flagship apps hand-roll this shell in ~15 drifting variants
6
+ * (inline-style panels, `max-width: 768px` fenceposts, CSS-hidden duplicate
7
+ * shells, hydration-spinner gates). This family is the fleet standard; it
8
+ * follows the QA-hardened shape the best templates converged on
9
+ * (`time-tracking`'s `useIsDesktop`, `blog`'s drawer, `weather-dashboard`'s
10
+ * one-shell-per-breakpoint doctrine).
11
+ *
12
+ * Compose it:
13
+ *
14
+ * ```tsx
15
+ * import { ResponsiveAppShell } from '@molecule/app-ui-react'
16
+ * import { NavLink, Outlet } from 'react-router'
17
+ *
18
+ * const nav = (
19
+ * <>
20
+ * <NavLink to="/dashboard">Dashboard</NavLink>
21
+ * <NavLink to="/projects">Projects</NavLink>
22
+ * <NavLink to="/reports">Reports</NavLink>
23
+ * </>
24
+ * )
25
+ *
26
+ * export function Shell() {
27
+ * return (
28
+ * <ResponsiveAppShell>
29
+ * <ResponsiveAppShell.TopBar
30
+ * brand={<NavLink to="/dashboard">Timetrack</NavLink>}
31
+ * actions={<UserMenu />}
32
+ * />
33
+ * <ResponsiveAppShell.Sidebar>{nav}</ResponsiveAppShell.Sidebar>
34
+ * <ResponsiveAppShell.Drawer>{nav}</ResponsiveAppShell.Drawer>
35
+ * <ResponsiveAppShell.Content>
36
+ * <Outlet />
37
+ * </ResponsiveAppShell.Content>
38
+ * </ResponsiveAppShell>
39
+ * )
40
+ * }
41
+ * ```
42
+ *
43
+ * @remarks
44
+ * - **Breakpoint: 768px** — the fleet-wide `md` breakpoint. Exactly ONE shell
45
+ * is MOUNTED per breakpoint: `Sidebar` renders only ≥768px, `Drawer` (and
46
+ * the menu trigger) only below. This is deliberate — rendering both and
47
+ * hiding one with CSS (`hidden md:block` style) leaves duplicate `<main>`/
48
+ * `<nav>` landmarks in the accessibility tree, double-mounts route content
49
+ * (double fetches, duplicate text matches for e2e locators). CSS-only
50
+ * responsive pairs remain available for NON-duplicating surface swaps via
51
+ * `hiddenBelow()` / `hiddenFrom()` on the UIClassMap. The `useIsDesktop`
52
+ * hook is exported for apps that need the same signal elsewhere: it reads
53
+ * `matchMedia` synchronously on first client render (no mounted-then-swap
54
+ * flicker in this CSR-only package) and subscribes to `change` events; the
55
+ * initializer is guarded (`typeof window`/`matchMedia`) so SSR and
56
+ * non-browser harnesses render the mobile shell instead of crashing.
57
+ * - **a11y contract.** `TopBar` renders the `<header>` landmark and its menu
58
+ * trigger carries `aria-label` + `aria-expanded` + `aria-controls` (the
59
+ * panel id comes from `useId()`). `Sidebar` renders `<aside>` with a
60
+ * `<nav aria-label>` landmark around its children. `Drawer` implements the
61
+ * WAI-ARIA APG dialog pattern on mobile: `role="dialog"` + `aria-modal`
62
+ * panel, focus moves into the panel on open and returns to the trigger on
63
+ * close, Tab/Shift+Tab are trapped inside, Escape and a backdrop click
64
+ * close, and body scroll is locked (reference-counted, so a `<Modal>`
65
+ * confirm stacked above the drawer never unlocks early). `Content` renders
66
+ * the `<main>` landmark. Marking the CURRENT nav item is the CONSUMER's job
67
+ * — pass `aria-current="page"` from your nav children (the shell renders
68
+ * them pass-through).
69
+ * - **Behavior.** The drawer auto-closes on SPA navigation (react-router
70
+ * location change) so it never sticks over the next page, and when the
71
+ * viewport crosses to desktop while it is open. Apps need an
72
+ * `I18nProvider` (all visible labels go through `t(key, {}, {
73
+ * defaultValue })`) and a react-router context; without the router the
74
+ * shell still renders — it just cannot auto-close on navigation.
75
+ * - **Locators.** Every fixed element carries a `data-mol-id` default,
76
+ * overridable per sub-component: `shell-topbar`, `shell-drawer-open`
77
+ * (trigger), `shell-sidebar`, `shell-drawer` (panel), `shell-drawer-close`,
78
+ * `shell-content`, and `shell-root` on the root `<div>`.
79
+ * - **ClassMap gaps routed around (Rule 5 inline-style exceptions, each
80
+ * commented at the call site).** The UIClassMap `drawer` token is a
81
+ * RIGHT-anchored settings-panel shape (`!right-0 … !max-w-sm`) and cannot
82
+ * serve a left nav drawer; there is no standalone `overflowY: auto`,
83
+ * `z-index`, or `left: 0` token. The shell therefore applies small
84
+ * documented inline styles for the drawer/sidebar geometry (pixel width à
85
+ * la `@molecule/app-sidebar-layout-react`, `max-width: 85vw`,
86
+ * `overflow-y: auto`, stacking `zIndex`) instead of widening UIClassMap —
87
+ * a `navDrawer()`-style token belongs in `@molecule/app-ui` + the ClassMap
88
+ * bond, both outside this package.
89
+ * - **Siblings.** `@molecule/app-sidebar-layout-react` `SidebarLayout` is the
90
+ * router-coupled DESKTOP-only sidebar (no mobile collapse);
91
+ * `@molecule/app-shell-layout-react` `AppShellLayout` is the marketing
92
+ * header/footer frame. THIS family is the responsive authenticated shell.
93
+ * Do not nest `SidebarLayout` inside it — pick one shell per app.
94
+ *
95
+ * @module
96
+ */
97
+ import { type JSX, type ReactNode } from 'react';
98
+ /**
99
+ * Whether the viewport is at least 768px wide (the fleet's `md` breakpoint).
100
+ *
101
+ * Reads `window.matchMedia` synchronously in the state initializer, so the
102
+ * FIRST client render is already correct — no mobile-then-desktop swap frame
103
+ * (this is time-tracking's QA-hardened version; the naive
104
+ * "state starts false, sync in an effect" variant mounts the wrong shell for
105
+ * one frame and double-fetches route data on desktop). Subscribes to
106
+ * `change` events afterwards. Guarded for non-browser environments
107
+ * (SSR/node): returns `false` (the mobile shell) when no `window.matchMedia`
108
+ * exists.
109
+ *
110
+ * @param query - Override the media query. Defaults to `(min-width: 768px)`.
111
+ * @returns Whether the desktop shell should mount.
112
+ */
113
+ export declare function useIsDesktop(query?: string): boolean;
114
+ /**
115
+ * Semantic sidebar width — the same stack-agnostic presets
116
+ * `@molecule/app-sidebar-layout-react` uses, so both shells render the same
117
+ * fleet geometry: `sm` → 208px, `md` → 240px (default), `lg` → 256px. A raw
118
+ * `number` is an exact pixel width. Applied via inline style (a specific
119
+ * pixel width is the documented "value a swappable ClassMap cannot express
120
+ * as a token" case).
121
+ */
122
+ export type ShellSidebarWidth = 'sm' | 'md' | 'lg' | number;
123
+ /**
124
+ * Props for the {@link ResponsiveAppShell} root.
125
+ */
126
+ export interface ResponsiveAppShellProps {
127
+ /**
128
+ * The shell sub-components — `<ResponsiveAppShell.TopBar />`,
129
+ * `<ResponsiveAppShell.Sidebar />`, `<ResponsiveAppShell.Drawer />` and
130
+ * `<ResponsiveAppShell.Content />`.
131
+ */
132
+ children: ReactNode;
133
+ /**
134
+ * Sidebar (and drawer) width: `'sm'` (208px), `'md'` (240px, default),
135
+ * `'lg'` (256px) or an exact pixel number.
136
+ */
137
+ sidebarWidth?: ShellSidebarWidth;
138
+ /** Extra classes on the root flex-row container. */
139
+ className?: string;
140
+ /**
141
+ * `data-mol-id` for the root container. Defaults to `'shell-root'`.
142
+ */
143
+ dataMolId?: string;
144
+ }
145
+ /**
146
+ * Root of the responsive app shell. Owns the breakpoint signal and the
147
+ * drawer open state, closes the drawer on SPA navigation and on
148
+ * desktop-crossing resizes, and provides both to the sub-components via
149
+ * context.
150
+ *
151
+ * Render the four sub-components inside it — see the module example for the
152
+ * canonical composition.
153
+ *
154
+ * @param props - The shell sub-components, sidebar width, and className.
155
+ * @returns The flex-row shell root.
156
+ */
157
+ declare function ResponsiveAppShellBase({ children, sidebarWidth, className, dataMolId, }: ResponsiveAppShellProps): JSX.Element;
158
+ /**
159
+ * Props for the {@link ResponsiveAppShellTopBar} sub-component.
160
+ */
161
+ export interface ResponsiveAppShellTopBarProps {
162
+ /**
163
+ * Brand/title node, rendered after the menu trigger — typically a
164
+ * `<Link to="/…">` with the app name or logo. The shell wraps it in a
165
+ * flex row; style the node itself.
166
+ */
167
+ brand?: ReactNode;
168
+ /** Trailing actions — user menu, theme toggle, search, etc. */
169
+ actions?: ReactNode;
170
+ /**
171
+ * Render the top bar only below the breakpoint (mount-conditioned, not
172
+ * CSS-hidden — no dead DOM on desktop). For apps whose desktop shell has
173
+ * no top bar (e.g. the sidebar carries everything). Default: `false`
174
+ * (top bar on every breakpoint).
175
+ */
176
+ mobileOnly?: boolean;
177
+ /** Extra classes on the `<header>`. */
178
+ className?: string;
179
+ /** `data-mol-id` override. Default: `'shell-topbar'`. */
180
+ dataMolId?: string;
181
+ /** `data-testid` override. */
182
+ testId?: string;
183
+ }
184
+ /**
185
+ * The shell's `<header>` landmark: menu trigger (mobile, when a Drawer is
186
+ * composed), brand, and trailing actions.
187
+ *
188
+ * Sticks to the top of the viewport by default. The menu trigger renders
189
+ * only while a `ResponsiveAppShell.Drawer` is part of the composition AND
190
+ * the viewport is below the breakpoint.
191
+ *
192
+ * @param props - Brand/actions slots, `mobileOnly`, and class/id overrides.
193
+ * @returns The header landmark, or `null` when `mobileOnly` is set on desktop.
194
+ */
195
+ export declare function ResponsiveAppShellTopBar({ brand, actions, mobileOnly, className, dataMolId, testId, }: ResponsiveAppShellTopBarProps): JSX.Element | null;
196
+ /**
197
+ * Props for the {@link ResponsiveAppShellSidebar} sub-component.
198
+ */
199
+ export interface ResponsiveAppShellSidebarProps {
200
+ /**
201
+ * Nav content — the links (they land inside the sidebar's `<nav>` landmark;
202
+ * pass `aria-current="page"` from the active one yourself). Typically the
203
+ * SAME element variable the Drawer receives, so only the mounted
204
+ * breakpoint's copy ever instantiates.
205
+ */
206
+ children: ReactNode;
207
+ /**
208
+ * Accessible name for the sidebar's `<nav>` landmark. Defaults to the
209
+ * `appShell.primaryNav` translation (English fallback `"Primary
210
+ * navigation"`).
211
+ */
212
+ navLabel?: string;
213
+ /**
214
+ * Below-nav content (user card, quick action) — rendered after the `<nav>`
215
+ * in a bordered footer row, so it does not sit inside the nav landmark.
216
+ */
217
+ footer?: ReactNode;
218
+ /** Extra classes on the `<aside>`. */
219
+ className?: string;
220
+ /** `data-mol-id` override. Default: `'shell-sidebar'`. */
221
+ dataMolId?: string;
222
+ /** `data-testid` override. */
223
+ testId?: string;
224
+ }
225
+ /**
226
+ * The desktop sidebar (`<aside>` + `<nav>` landmarks). Renders NOTHING below
227
+ * 768px — the {@link ResponsiveAppShellDrawer} carries the nav there.
228
+ *
229
+ * Full viewport height, sticky at the top edge, scrolls internally when its
230
+ * content outgrows the viewport.
231
+ *
232
+ * @param props - Nav children, nav label, footer slot, class/id overrides.
233
+ * @returns The sidebar landmarks, or `null` below the breakpoint.
234
+ */
235
+ export declare function ResponsiveAppShellSidebar({ children, navLabel, footer, className, dataMolId, testId, }: ResponsiveAppShellSidebarProps): JSX.Element | null;
236
+ /**
237
+ * Props for the {@link ResponsiveAppShellDrawer} sub-component.
238
+ */
239
+ export interface ResponsiveAppShellDrawerProps {
240
+ /**
241
+ * Nav content — the links, same as (or adapted from) the Sidebar's. Only
242
+ * mounted while the drawer is open on a below-breakpoint viewport.
243
+ */
244
+ children: ReactNode;
245
+ /**
246
+ * Header row content (typically the brand), rendered next to the close
247
+ * button.
248
+ */
249
+ header?: ReactNode;
250
+ /**
251
+ * Accessible name for the dialog and its `<nav>` landmark. Defaults to the
252
+ * `appShell.primaryNav` translation (English fallback `"Primary
253
+ * navigation"`).
254
+ */
255
+ navLabel?: string;
256
+ /** Below-nav content (user card, sign-out), after the `<nav>`. */
257
+ footer?: ReactNode;
258
+ /** Whether the panel shows a close (X) button. Default: `true`. */
259
+ showCloseButton?: boolean;
260
+ /** Extra classes on the dialog panel. */
261
+ className?: string;
262
+ /** `data-mol-id` override for the panel. Default: `'shell-drawer'`. */
263
+ dataMolId?: string;
264
+ /** `data-mol-id` override for the close button. Default: `'shell-drawer-close'`. */
265
+ closeDataMolId?: string;
266
+ /** `data-testid` override for the panel. */
267
+ testId?: string;
268
+ }
269
+ /**
270
+ * The mobile nav drawer (<768px): a left-anchored dialog panel over a
271
+ * backdrop, opened by the menu trigger the TopBar renders.
272
+ *
273
+ * Implements the WAI-ARIA APG dialog pattern — focus moves into the panel on
274
+ * open and returns to the previously focused element (the trigger) on close,
275
+ * Tab is trapped inside, Escape and backdrop clicks close, body scroll locks
276
+ * (reference-counted with any stacked `<Modal>`), and the shell closes it on
277
+ * SPA navigation. Renders nothing on desktop or while closed.
278
+ *
279
+ * @param props - Nav children, header/nav-label/footer slots, close-button
280
+ * and class/id overrides.
281
+ * @returns The drawer portal while open on mobile, otherwise `null`.
282
+ */
283
+ export declare function ResponsiveAppShellDrawer({ children, header, navLabel, footer, showCloseButton, className, dataMolId, closeDataMolId, testId, }: ResponsiveAppShellDrawerProps): JSX.Element | null;
284
+ /**
285
+ * Props for the {@link ResponsiveAppShellContent} sub-component.
286
+ */
287
+ export interface ResponsiveAppShellContentProps {
288
+ /** The routed page content — typically an `<Outlet />`. */
289
+ children: ReactNode;
290
+ /** Extra classes on the `<main>`. */
291
+ className?: string;
292
+ /** Inline styles on the `<main>` (rarely needed — layout is owned). */
293
+ style?: React.CSSProperties;
294
+ /** `data-mol-id` override. Default: `'shell-content'`. */
295
+ dataMolId?: string;
296
+ /** `data-testid` override. */
297
+ testId?: string;
298
+ }
299
+ /**
300
+ * The shell's `<main>` landmark. Grows to fill the row and may shrink below
301
+ * its content width, so page-level `overflow-x` strips scroll inside the
302
+ * page instead of widening the whole shell.
303
+ *
304
+ * @param props - The page content and class/id overrides.
305
+ * @returns The main landmark.
306
+ */
307
+ export declare function ResponsiveAppShellContent({ children, className, style, dataMolId, testId, }: ResponsiveAppShellContentProps): JSX.Element;
308
+ /**
309
+ * The responsive app shell family — see the {@link ResponsiveAppShellBase |
310
+ * root component} and the module docs for the full contract.
311
+ *
312
+ * Consumed as `<ResponsiveAppShell.TopBar />`, `.Sidebar`, `.Drawer` and
313
+ * `.Content` inside `<ResponsiveAppShell>`; each is also exported as a named
314
+ * component (`ResponsiveAppShellTopBar`, …) for star-import consumers.
315
+ */
316
+ export declare const ResponsiveAppShell: typeof ResponsiveAppShellBase & {
317
+ /** The `<header>` landmark — brand + actions + the drawer menu trigger. */
318
+ TopBar: typeof ResponsiveAppShellTopBar;
319
+ /** The desktop `<aside>`/`<nav>` landmarks (≥768px only). */
320
+ Sidebar: typeof ResponsiveAppShellSidebar;
321
+ /** The mobile dialog drawer (<768px only). */
322
+ Drawer: typeof ResponsiveAppShellDrawer;
323
+ /** The `<main>` landmark. */
324
+ Content: typeof ResponsiveAppShellContent;
325
+ };
326
+ export {};
327
+ //# sourceMappingURL=ResponsiveAppShell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResponsiveAppShell.d.ts","sourceRoot":"","sources":["../../src/components/ResponsiveAppShell.tsx"],"names":[],"mappings":"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"}