@petrarca/sonnet-shell 0.1.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.
@@ -0,0 +1,597 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { RouteObject } from 'react-router-dom';
3
+ import { LucideIcon } from 'lucide-react';
4
+ import * as React from 'react';
5
+ import React__default, { ReactNode } from 'react';
6
+
7
+ interface SidePaneOptions {
8
+ /** Content to render inside the side pane. */
9
+ content: ReactNode;
10
+ /**
11
+ * Stable key identifying which module/tool owns this pane instance.
12
+ * Used by IconRail to highlight the active pane module and by toggle()
13
+ * to detect whether the same content is already open.
14
+ */
15
+ moduleId: string;
16
+ /** Initial width in pixels. Defaults to 320. */
17
+ defaultWidth?: number;
18
+ /** Minimum draggable width in pixels. Defaults to 240. */
19
+ minWidth?: number;
20
+ /**
21
+ * Maximum draggable width in pixels.
22
+ * Omit or pass Infinity for unlimited (fills remaining space up to viewport).
23
+ */
24
+ maxWidth?: number;
25
+ }
26
+ interface SidePaneState {
27
+ /** Currently open pane options, or null when closed. */
28
+ pane: SidePaneOptions | null;
29
+ open: (opts: SidePaneOptions) => void;
30
+ close: () => void;
31
+ toggle: (opts: SidePaneOptions) => void;
32
+ }
33
+ declare const SidePaneContext: React.Context<SidePaneState | null>;
34
+ /**
35
+ * Read the side pane state from context.
36
+ * Must be called within an AppShell (which provides the context).
37
+ */
38
+ declare function useSidePaneState(): SidePaneState;
39
+
40
+ /**
41
+ * Shell type definitions.
42
+ *
43
+ * These types define the contract between the shell and modules.
44
+ * Modules implement ServiceModule; the shell consumes it.
45
+ */
46
+
47
+ interface NavLink {
48
+ /**
49
+ * Stable feature identifier in the form "<module>.<feature>".
50
+ * Used by navigation.goToFeature() for path-independent navigation.
51
+ * Example: "auditing.audit-events"
52
+ */
53
+ id?: string;
54
+ label: string;
55
+ path: string;
56
+ }
57
+ interface NavGroup {
58
+ /** Stable identifier used as React key. Defaults to heading if omitted. */
59
+ id: string;
60
+ heading?: string;
61
+ links: NavLink[];
62
+ }
63
+ /**
64
+ * An action contributed by a module to the CommandMenu.
65
+ *
66
+ * Modules declare commands in ServiceModule.commands[]. The CommandMenu
67
+ * renders them in a dedicated group so users can trigger module actions
68
+ * (open side pane, trigger a workflow, etc.) directly from Cmd+K without
69
+ * navigating to a route first.
70
+ */
71
+ interface ModuleCommand {
72
+ /** Stable identifier — used as React key. */
73
+ id: string;
74
+ /** Label shown in the CommandMenu item. */
75
+ label: string;
76
+ /** Optional sub-group heading shown above this command's group. */
77
+ group?: string;
78
+ /** Optional icon shown beside the label. */
79
+ icon?: LucideIcon;
80
+ /** Called when the user selects this command. */
81
+ action: () => void;
82
+ }
83
+ interface Contribution {
84
+ /** Target extension point name (e.g. "organization-detail") */
85
+ extensionPoint: string;
86
+ /** Display label for the contributed item */
87
+ label: string;
88
+ /** Route path (can include params like :orgId) */
89
+ path: string;
90
+ /** Sort order within the extension point (lower = earlier) */
91
+ order: number;
92
+ /** Optional icon */
93
+ icon?: LucideIcon;
94
+ }
95
+ /**
96
+ * Map of known shell event keys to their payload types.
97
+ *
98
+ * Modules augment this interface via TypeScript declaration merging to
99
+ * register their events. The bus API constrains generics to
100
+ * `keyof ShellEventMap`, giving autocomplete and payload type-checking
101
+ * across emit/subscribe boundaries.
102
+ *
103
+ * The string index signature allows ad-hoc events that are not yet in
104
+ * the map -- they fall back to `unknown`, nudging developers to register.
105
+ *
106
+ * Example (in a module's events.ts):
107
+ *
108
+ * declare module "@/shell/types" {
109
+ * interface ShellEventMap {
110
+ * "my-domain:something-happened": { id: string };
111
+ * }
112
+ * }
113
+ */
114
+ interface ShellEventMap {
115
+ [custom: string]: unknown;
116
+ }
117
+ interface ServiceModule {
118
+ /** Unique identifier for this module */
119
+ id: string;
120
+ /** Display name (icon rail tooltip, sub-nav header, command menu) */
121
+ label: string;
122
+ /** Short description of this module's domain */
123
+ description?: string;
124
+ /** Lucide icon for the icon rail */
125
+ icon: LucideIcon;
126
+ /** URL prefix used to match this module to the current route */
127
+ basePath: string;
128
+ /** Navigation groups for the sub-nav panel */
129
+ navigation: NavGroup[];
130
+ /** React Router route definitions owned by this module */
131
+ routes: RouteObject[];
132
+ /** Pin to bottom of icon rail (e.g. Settings, Playground) */
133
+ pinBottom?: boolean;
134
+ /** Hide from icon rail and command menu (e.g. Home) */
135
+ hidden?: boolean;
136
+ /** Items this module contributes to other modules' extension points */
137
+ contributions?: Contribution[];
138
+ /**
139
+ * Actions this module contributes to the CommandMenu (Cmd+K).
140
+ *
141
+ * Rendered as a separate CommandGroup below navigation links so users
142
+ * can trigger module actions without navigating to a route first.
143
+ * Typical uses: open the side pane, start a workflow, focus a search field.
144
+ */
145
+ commands?: ModuleCommand[];
146
+ /**
147
+ * Side pane sizing constraints for modules that render a persistent inline
148
+ * panel via sidePane.open(). Declared here so the module definition is
149
+ * self-documenting; passed through to sidePane.open() at call time.
150
+ *
151
+ * When a module has no SubNavPanel links (navigation: []) and declares
152
+ * sidePane, the shell treats icon-rail clicks as toggle actions on the
153
+ * pane rather than route navigations.
154
+ */
155
+ sidePane?: Pick<SidePaneOptions, "defaultWidth" | "minWidth" | "maxWidth">;
156
+ }
157
+
158
+ /**
159
+ * Module registry factory.
160
+ *
161
+ * Accepts a list of ServiceModules and returns derived data structures
162
+ * consumed by the shell (icon rail groups, flattened routes, extension
163
+ * point lookup). This is the reusable core; the app-specific module
164
+ * list lives in the consumer (e.g. modules/registry.ts).
165
+ */
166
+
167
+ interface ModuleRegistry {
168
+ /** All modules in registration order. */
169
+ modules: ServiceModule[];
170
+ /** Visible modules shown in the main area of the icon rail. */
171
+ mainModules: ServiceModule[];
172
+ /** Modules pinned to the bottom of the icon rail. */
173
+ bottomModules: ServiceModule[];
174
+ /** All routes from all modules, flattened. */
175
+ allRoutes: RouteObject[];
176
+ /** Get contributions for a named extension point, sorted by order. */
177
+ getExtensionPoint: (name: string) => Contribution[];
178
+ }
179
+ declare function createModuleRegistry(modules: ServiceModule[]): ModuleRegistry;
180
+
181
+ interface AppShellProps {
182
+ registry: ModuleRegistry;
183
+ }
184
+ declare function AppShell({ registry }: AppShellProps): react_jsx_runtime.JSX.Element;
185
+
186
+ interface ShellConfig {
187
+ /**
188
+ * Content rendered inside the TopBar header. The shell provides the
189
+ * `<header>` element with its sizing and border; the consumer owns
190
+ * everything inside it.
191
+ *
192
+ * Compose this using building blocks like `SearchTrigger` and
193
+ * `UserMenu` (exported from the shell) alongside any app-specific
194
+ * components.
195
+ */
196
+ topBar?: ReactNode;
197
+ }
198
+ /**
199
+ * Read the shell configuration from context.
200
+ * Must be called within a ShellConfigProvider.
201
+ */
202
+ declare function useShellConfig(): ShellConfig;
203
+
204
+ /**
205
+ * RootLayout -- top-level layout that wraps the entire authenticated app.
206
+ * Renders the Toaster for notifications and the AppShell (icon rail + sub-nav + content).
207
+ */
208
+ interface RootLayoutProps {
209
+ config: ShellConfig;
210
+ registry: ModuleRegistry;
211
+ }
212
+ declare function RootLayout({ config, registry }: RootLayoutProps): react_jsx_runtime.JSX.Element;
213
+
214
+ /**
215
+ * TopBar -- persistent header across the entire application.
216
+ *
217
+ * A pure layout container. The shell provides the `<header>` element with
218
+ * its sizing, background, and border. The consumer owns all content via
219
+ * the `children` prop (composed through `ShellConfig.topBar`).
220
+ */
221
+ interface TopBarProps {
222
+ children?: ReactNode;
223
+ }
224
+ declare function TopBar({ children }: TopBarProps): react_jsx_runtime.JSX.Element;
225
+
226
+ interface IconRailProps {
227
+ activeServiceId: string | null;
228
+ /** moduleId of the module whose side pane is currently open, or null. */
229
+ activeSidePaneModuleId: string | null;
230
+ onServiceSelect: (serviceId: string) => void;
231
+ }
232
+ /**
233
+ * IconRail -- narrow vertical bar with service domain icons.
234
+ *
235
+ * Main services scroll in the center, settings/playground pinned at bottom.
236
+ * Tooltips show service labels on hover.
237
+ */
238
+ declare function IconRail({ activeServiceId, activeSidePaneModuleId, onServiceSelect, }: IconRailProps): react_jsx_runtime.JSX.Element;
239
+
240
+ interface SubNavPanelProps {
241
+ service: ServiceModule;
242
+ collapsed: boolean;
243
+ onToggleCollapse: () => void;
244
+ }
245
+ /**
246
+ * SubNavPanel -- contextual secondary navigation for the selected service domain.
247
+ *
248
+ * Shows the service label at top, then grouped nav links. If other modules
249
+ * contribute links via the "<moduleId>.nav" extension point, they are
250
+ * appended as an additional group.
251
+ */
252
+ declare function SubNavPanel({ service, collapsed, onToggleCollapse, }: SubNavPanelProps): react_jsx_runtime.JSX.Element;
253
+
254
+ /**
255
+ * SidePane renders nothing when no pane is open.
256
+ * When open it renders a bordered panel with a drag handle on its right edge.
257
+ * Double-clicking the handle resets to defaultWidth.
258
+ */
259
+ declare function SidePane(): react_jsx_runtime.JSX.Element | null;
260
+
261
+ interface CommandMenuProps {
262
+ open: boolean;
263
+ onOpenChange: (open: boolean) => void;
264
+ }
265
+ /**
266
+ * CommandMenu -- Cmd+K command menu.
267
+ *
268
+ * Indexes all navigation items from the service domains so users can
269
+ * quickly jump to any page by typing.
270
+ */
271
+ declare function CommandMenu({ open, onOpenChange }: CommandMenuProps): react_jsx_runtime.JSX.Element;
272
+
273
+ /**
274
+ * PlaceholderPage — generic wireframe page for routes not yet implemented.
275
+ * Shows the current path and a placeholder content area.
276
+ */
277
+ declare function PlaceholderPage(): react_jsx_runtime.JSX.Element;
278
+
279
+ /**
280
+ * Confirm Dialog
281
+ *
282
+ * Reusable confirmation dialog for actions that require user confirmation.
283
+ * Used for discard changes, delete actions, etc.
284
+ *
285
+ * Wired into the shell via `initDialog` in `shell/api.ts` so modules can
286
+ * trigger it imperatively with `dialog.confirm(opts)`.
287
+ *
288
+ * @module components/Common/ConfirmDialog
289
+ */
290
+
291
+ interface ConfirmDialogProps {
292
+ /** Whether the dialog is open */
293
+ open: boolean;
294
+ /** Dialog title */
295
+ title: string;
296
+ /** Description shown below the title */
297
+ description?: string;
298
+ /** Confirm button label (default: "Confirm") */
299
+ confirmLabel?: string;
300
+ /** Cancel button label (default: "Cancel") */
301
+ cancelLabel?: string;
302
+ /**
303
+ * Controls confirm button appearance.
304
+ * "destructive" for irreversible actions (delete, revoke, etc.)
305
+ */
306
+ variant?: "default" | "destructive";
307
+ /** Callback when user confirms */
308
+ onConfirm: () => void;
309
+ /** Callback when user cancels or closes dialog */
310
+ onCancel: () => void;
311
+ }
312
+ /**
313
+ * ConfirmDialog Component
314
+ *
315
+ * A reusable confirmation dialog backed by shadcn Dialog primitives.
316
+ */
317
+ declare function ConfirmDialog({ open, title, description, confirmLabel, cancelLabel, variant, onConfirm, onCancel, }: ConfirmDialogProps): React__default.ReactElement;
318
+
319
+ interface ShellConfigProviderProps {
320
+ config: ShellConfig;
321
+ children: ReactNode;
322
+ }
323
+ declare function ShellConfigProvider({ config, children, }: ShellConfigProviderProps): react_jsx_runtime.JSX.Element;
324
+
325
+ /**
326
+ * SearchTrigger -- Cmd+K search button for the TopBar.
327
+ *
328
+ * Opens the shell CommandMenu via the imperative navigation API.
329
+ * Generic building block, no app-specific dependencies.
330
+ */
331
+ declare function SearchTrigger(): react_jsx_runtime.JSX.Element;
332
+
333
+ /**
334
+ * UserMenu -- avatar dropdown for the TopBar.
335
+ *
336
+ * Shows the user's initials in an avatar. The dropdown displays name,
337
+ * email, a profile link, and a sign-out action. Generic building block,
338
+ * no app-specific dependencies.
339
+ */
340
+ interface UserMenuUser {
341
+ name: string;
342
+ email: string;
343
+ initials: string;
344
+ }
345
+ interface UserMenuProps {
346
+ user: UserMenuUser;
347
+ onSignOut?: () => void;
348
+ }
349
+ declare function UserMenu({ user, onSignOut }: UserMenuProps): react_jsx_runtime.JSX.Element;
350
+
351
+ /**
352
+ * Shell API -- imperative domain capabilities for modules.
353
+ *
354
+ * Import path: @/shell/api
355
+ *
356
+ * Grouped by domain: notification, dialog, navigation, panel, events.
357
+ */
358
+
359
+ interface PromiseOptions<T> {
360
+ loading: string;
361
+ success: string | ((data: T) => string);
362
+ error: string | ((err: unknown) => string);
363
+ }
364
+ declare const notification: {
365
+ success(message: string): void;
366
+ error(message: string): void;
367
+ warning(message: string): void;
368
+ info(message: string): void;
369
+ promise<T>(promise: Promise<T>, opts: PromiseOptions<T>): (string & {
370
+ unwrap: () => Promise<T>;
371
+ }) | (number & {
372
+ unwrap: () => Promise<T>;
373
+ }) | {
374
+ unwrap: () => Promise<T>;
375
+ };
376
+ dismiss(id?: string | number): void;
377
+ };
378
+ interface ConfirmOptions {
379
+ title: string;
380
+ description?: string;
381
+ confirmLabel?: string;
382
+ cancelLabel?: string;
383
+ variant?: "default" | "destructive";
384
+ }
385
+ type DialogConfirmFn = (opts: ConfirmOptions) => Promise<boolean>;
386
+ /**
387
+ * Called by the shell during initialization to inject the confirm dialog.
388
+ * Not part of the public module API -- only the shell calls this.
389
+ */
390
+ declare function initDialog(confirmFn: DialogConfirmFn): void;
391
+ declare const dialog: {
392
+ /**
393
+ * Show a confirmation dialog. Returns true if confirmed, false if cancelled.
394
+ */
395
+ confirm(opts: ConfirmOptions): Promise<boolean>;
396
+ };
397
+ type NavigateFn = (path: string) => void;
398
+ type CommandMenuFn = () => void;
399
+ /**
400
+ * Called by the shell during initialization to inject router + command menu.
401
+ * Not part of the public module API -- only the shell calls this.
402
+ */
403
+ declare function initNavigation(navigateFn: NavigateFn, openCommandMenuFn: CommandMenuFn): void;
404
+ declare const navigation: {
405
+ /** Navigate to a path within the shell. */
406
+ goTo(path: string): void;
407
+ /**
408
+ * Navigate to a feature by its stable identifier (e.g. "auditing.audit-events").
409
+ * The path is resolved from the module registry at call time, so it stays
410
+ * correct even if routes are reorganised.
411
+ */
412
+ goToFeature(featureId: string): void;
413
+ /** Open the Cmd+K command menu. */
414
+ openCommandMenu(): void;
415
+ /** Go back in browser history. */
416
+ back(): void;
417
+ };
418
+ interface PanelOptions {
419
+ /**
420
+ * Title shown in the panel header. When omitted the header is visually
421
+ * hidden (the content owns its own header) but a screen-reader-only
422
+ * title is still rendered for accessibility.
423
+ */
424
+ title?: string;
425
+ /** React content to render inside the panel */
426
+ content: ReactNode;
427
+ /** Optional description below the title */
428
+ description?: string;
429
+ /**
430
+ * Panel width token.
431
+ *
432
+ * - "narrow" -- 480px -- quick actions, simple single-field forms
433
+ * - "default" -- 640px -- standard entity forms (default when omitted)
434
+ * - "wide" -- 800px -- forms with embedded tables or complex layouts
435
+ * - "half" -- 50vw -- split-screen inspection, side-by-side context
436
+ * - "full" -- 100vw -- immersive editing, full-width canvases
437
+ *
438
+ * Legacy values "lg", "1/3", "1/2" are kept for backward compatibility
439
+ * and map to "default" (640px), 33vw, and "half" (50vw) respectively.
440
+ */
441
+ width?: "narrow" | "default" | "wide" | "half" | "full" | "lg" | "1/3" | "1/2";
442
+ /**
443
+ * Vertical coverage of the panel.
444
+ * - "below-header" (default): panel starts below the TopBar, keeping it visible.
445
+ * - "full": panel covers the full viewport height including the TopBar.
446
+ */
447
+ coverage?: "below-header" | "full";
448
+ /** Called after the panel finishes closing. Use to restore focus to the triggering element. */
449
+ onClose?: () => void;
450
+ }
451
+ type PanelOpenFn = (opts: PanelOptions) => void;
452
+ type PanelCloseFn = () => void;
453
+ /**
454
+ * Called by the shell during initialization to inject panel controls.
455
+ * Not part of the public module API -- only the shell calls this.
456
+ */
457
+ declare function initPanel(openFn: PanelOpenFn, closeFn: PanelCloseFn): void;
458
+ declare const panel: {
459
+ /** Open the shell panel with content rendered inside. */
460
+ open(opts: PanelOptions): void;
461
+ /** Close the panel. */
462
+ close(): void;
463
+ };
464
+
465
+ type SidePaneOpenFn = (opts: SidePaneOptions) => void;
466
+ type SidePaneCloseFn = () => void;
467
+ type SidePaneIsOpenFn = () => boolean;
468
+ type SidePaneActiveModuleIdFn = () => string | null;
469
+ /**
470
+ * Called by the shell during initialization to inject side pane controls.
471
+ * Not part of the public module API -- only the shell calls this.
472
+ */
473
+ declare function initSidePane(openFn: SidePaneOpenFn, closeFn: SidePaneCloseFn, isOpenFn: SidePaneIsOpenFn, activeModuleIdFn: SidePaneActiveModuleIdFn): void;
474
+ declare const sidePane: {
475
+ /** Open the side pane with the given content and sizing options. */
476
+ open(opts: SidePaneOptions): void;
477
+ /** Close the side pane. */
478
+ close(): void;
479
+ /**
480
+ * Toggle the side pane.
481
+ *
482
+ * If the pane is closed, opens it with opts.
483
+ * If the pane is open with the same moduleId, closes it.
484
+ * If the pane is open with a different moduleId, replaces it with opts.
485
+ */
486
+ toggle(opts: SidePaneOptions): void;
487
+ /** Returns true when the pane is currently open. */
488
+ isOpen(): boolean;
489
+ /** Returns the moduleId of the currently open pane, or null. */
490
+ activeModuleId(): string | null;
491
+ };
492
+ interface FullscreenOptions {
493
+ /** React content to render inside the fullscreen overlay. */
494
+ content: ReactNode;
495
+ }
496
+ declare const fullscreen: {
497
+ /** Enter fullscreen mode, rendering content over all shell chrome. */
498
+ enter(opts: FullscreenOptions): void;
499
+ /** Exit fullscreen mode, restoring the normal shell layout. */
500
+ exit(): void;
501
+ };
502
+ type Unsubscribe = () => void;
503
+ declare const events: {
504
+ /** Subscribe to an event. Returns an unsubscribe function. */
505
+ on<K extends keyof ShellEventMap>(key: K, handler: (payload: ShellEventMap[K]) => void): Unsubscribe;
506
+ /** Subscribe, auto-unsubscribing after the first emission. */
507
+ once<K extends keyof ShellEventMap>(key: K, handler: (payload: ShellEventMap[K]) => void): Unsubscribe;
508
+ /** Emit an event. Handlers run asynchronously (microtask). */
509
+ emit<K extends keyof ShellEventMap>(key: K, payload: ShellEventMap[K]): void;
510
+ };
511
+
512
+ /**
513
+ * Read the module registry from context.
514
+ * Must be called within an AppShell (which provides the context).
515
+ */
516
+ declare function useShellModules(): ModuleRegistry;
517
+
518
+ /**
519
+ * OverviewCard and FeatureLink -- building blocks for module overview pages.
520
+ *
521
+ * OverviewCard presents a feature with icon, title, description, and optional
522
+ * navigation via a stable feature id.
523
+ *
524
+ * FeatureLink is an inline text link for use in descriptions or prose,
525
+ * also navigating via stable feature id.
526
+ *
527
+ * Part of the shell -- extracts to @petrarca/sonnet-shell.
528
+ */
529
+
530
+ interface OverviewCardProps {
531
+ /** Lucide icon component. */
532
+ icon: React__default.ComponentType<{
533
+ className?: string;
534
+ }>;
535
+ /** Card title. */
536
+ title: string;
537
+ /** Description -- plain string or React nodes (e.g. with FeatureLink). */
538
+ description: React__default.ReactNode;
539
+ /**
540
+ * Stable feature identifier (e.g. "auditing.audit-events").
541
+ * Resolved to a path via the shell registry at click time.
542
+ * Omit for non-navigable cards.
543
+ */
544
+ feature?: string;
545
+ /** Additional CSS class names. */
546
+ className?: string;
547
+ }
548
+ /**
549
+ * FeatureLink -- inline text link navigating to a feature by stable id.
550
+ *
551
+ * Use inside OverviewCard descriptions or overview page prose to link
552
+ * to a feature without hardcoding paths.
553
+ *
554
+ * @example
555
+ * <FeatureLink feature="auditing.audit-log">Audit Log</FeatureLink>
556
+ */
557
+ declare function FeatureLink({ feature, children, }: {
558
+ feature: string;
559
+ children: React__default.ReactNode;
560
+ }): React__default.ReactElement;
561
+ /** Feature card for module overview pages. Navigates via the shell API. */
562
+ declare function OverviewCard({ icon: Icon, title, description, feature, className, }: OverviewCardProps): React__default.ReactElement;
563
+
564
+ /**
565
+ * Get sorted contributions for a named extension point.
566
+ *
567
+ * Returns all contributions registered by any module for the given
568
+ * extension point, sorted by `order` (ascending).
569
+ *
570
+ * @example
571
+ * ```tsx
572
+ * const tabs = useExtensionPoint("organization-detail");
573
+ * ```
574
+ */
575
+ declare function useExtensionPoint(name: string): Contribution[];
576
+ /**
577
+ * Get the list of visible service modules (excludes hidden and bottom-pinned).
578
+ *
579
+ * Useful for building overviews like the home page.
580
+ */
581
+ declare function useMainModules(): ServiceModule[];
582
+ /**
583
+ * Subscribe to a shell event, auto-unsubscribing on unmount.
584
+ *
585
+ * The handler reference is stabilized via useRef so that the
586
+ * subscription is not torn down and recreated on every render.
587
+ *
588
+ * @example
589
+ * ```tsx
590
+ * useShellEvent("schema-definition:changed", (payload) => {
591
+ * queryClient.invalidateQueries({ queryKey: ["my-key"] });
592
+ * });
593
+ * ```
594
+ */
595
+ declare function useShellEvent<K extends keyof ShellEventMap>(key: K, handler: (payload: ShellEventMap[K]) => void): void;
596
+
597
+ export { AppShell, CommandMenu, ConfirmDialog, type ConfirmDialogProps, type ConfirmOptions, type Contribution, FeatureLink, type FullscreenOptions, IconRail, type ModuleCommand, type ModuleRegistry, type NavGroup, type NavLink, OverviewCard, type PanelOptions, PlaceholderPage, RootLayout, SearchTrigger, type ServiceModule, type ShellConfig, ShellConfigProvider, type ShellEventMap, SidePane, type SidePaneOptions as SidePaneApiOptions, SidePaneContext, type SidePaneOptions, type SidePaneState, SubNavPanel, TopBar, UserMenu, type UserMenuUser, createModuleRegistry, dialog, events, fullscreen, initDialog, initNavigation, initPanel, initSidePane, navigation, notification, panel, sidePane, useExtensionPoint, useMainModules, useShellConfig, useShellEvent, useShellModules, useSidePaneState };