@flytedan/flytebot-design-system 0.18.0 → 0.20.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.
package/dist/index.d.cts CHANGED
@@ -437,38 +437,6 @@ interface SidebarNavProps {
437
437
  }
438
438
  declare const SidebarNav: React.ForwardRefExoticComponent<SidebarNavProps & React.RefAttributes<HTMLElement>>;
439
439
 
440
- interface FlytedeskMarkProps {
441
- size?: "sm" | "md" | "lg";
442
- className?: string;
443
- }
444
- /** Just the flytedesk logo, no label — for contexts too small for a stacked brand
445
- * (a collapsed rail, a favicon-sized corner mark). */
446
- declare function FlytedeskMark({ size, className, ...rest }: FlytedeskMarkProps): React.JSX.Element;
447
- interface FlytedeskBrandProps {
448
- /** The consuming app's name, shown under the logo — e.g. "Media Planner", "Admin". */
449
- appName: string;
450
- size?: "sm" | "md" | "lg";
451
- className?: string;
452
- }
453
- /** The flytedesk logo stacked over the app's name — meant to drop straight into
454
- * SidebarNav's `brand` slot in every flytedesk app. */
455
- declare function FlytedeskBrand({ appName, size, className, ...rest }: FlytedeskBrandProps): React.JSX.Element;
456
-
457
- /**
458
- * Places within one screen. Underline only — no pill tabs in the product.
459
- */
460
- interface TabsProps {
461
- tabs: Array<string | {
462
- value: string;
463
- label: string;
464
- count?: number;
465
- }>;
466
- value?: string;
467
- onChange?: (value: string) => void;
468
- className?: string;
469
- }
470
- declare function Tabs({ tabs, value, onChange, className, ...rest }: TabsProps): React.JSX.Element;
471
-
472
440
  /** 60px app header: breadcrumb left, actions right, and a 2px route loader along its top edge. */
473
441
  interface TopbarProps {
474
442
  /** A non-last crumb with `onClick` calls it (via `preventDefault`) instead of following
@@ -502,6 +470,139 @@ interface TopbarProps {
502
470
  }
503
471
  declare function Topbar({ crumbs, actions, overflowActions, overflowBreakpoint, loading, onMenu, className, ...rest }: TopbarProps): React.JSX.Element;
504
472
 
473
+ /**
474
+ * MP-221: the Topbar + SidebarNav + useResponsiveRail composition every flytedesk app
475
+ * shell hand-assembled — the full-height flex column, the rail/content flex row, the
476
+ * scrim, the overlay-close-on-navigate wiring and the centered, max-width content
477
+ * column — lived three times over (media-planner's PlannerShell, sms-app's Shell, and
478
+ * this package's own SidebarNav docs demo, which told every new app to copy it). The
479
+ * design of this API reads BOTH real compositions (PlannerShell.tsx, Shell.tsx): a
480
+ * plain "app passes nav items + identity + actions" shape covers everything the two
481
+ * shared, and each of PlannerShell's app-specific extras (the command palette,
482
+ * TestModeBar/RolePreviewBar, the assistant panel, Dev tools) stays out of it, reached
483
+ * instead through `banner` and `trailingPanel`, or rendered around AppShell entirely.
484
+ *
485
+ * `useResponsiveRail` itself (overlay-vs-docked detection, Escape, focus trap/return,
486
+ * body scroll lock) is unchanged and still exported on its own — AppShell only owns
487
+ * wiring it to a real SidebarNav/Topbar/scrim so no app has to re-wire it by hand.
488
+ */
489
+ interface AppShellProps {
490
+ /** Rendered in SidebarNav's fixed-height brand row (e.g. FlytedeskBrand/FlytedeskMark,
491
+ * optionally wrapped in a "go home" button — that wrapping is app behaviour, not
492
+ * something AppShell can supply generically). */
493
+ brand?: React.ReactNode;
494
+ /** SidebarNav's groups. */
495
+ navGroups: Array<{
496
+ label?: string;
497
+ items: SidebarNavItem[];
498
+ }>;
499
+ /** The active item's value, matched against each item's own `value`. */
500
+ currentNav?: string;
501
+ /** Called with an item's value when it's clicked. AppShell closes the rail itself
502
+ * first when it's an overlay — an app never has to remember that half of the wiring. */
503
+ onNavigate: (value: string) => void;
504
+ /** SidebarNav's footer slot (e.g. media-planner's "Jump to… ⌘K" trigger). */
505
+ navFooter?: React.ReactNode;
506
+ /** The rail's open state on first render while docked — the seam for an app's own
507
+ * persisted desktop preference (e.g. a `usePref`-backed value). Ignored while the
508
+ * initial viewport is already in overlay range, which always starts closed. */
509
+ initialNavOpen?: boolean;
510
+ /** Called with the new open state whenever it changes while docked — an app's hook
511
+ * into persisting `initialNavOpen`. Never called for a transient overlay open/close. */
512
+ onNavOpenChange?: (open: boolean) => void;
513
+ /** Max-width (px) at which the rail becomes a scrimmed overlay instead of a docked
514
+ * column. Must match the design system's own `.fd-side` breakpoint (default 1024)
515
+ * unless an app's own CSS overrides that breakpoint too. */
516
+ railBreakpoint?: number;
517
+ /** Topbar's breadcrumbs. */
518
+ crumbs?: TopbarProps["crumbs"];
519
+ /** Shows Topbar's route-loading indicator along its top edge. */
520
+ loading?: boolean;
521
+ /** Topbar's never-collapsing slot — the one control every screen needs to keep
522
+ * directly reachable, typically the AccountMenu. */
523
+ actions: React.ReactNode;
524
+ /** Topbar's slot that collapses into a "More actions" menu under `overflowBreakpoint`
525
+ * (an assistant launcher, AppearanceMenu, a version badge, Dev tools, undo, …). */
526
+ overflowActions?: React.ReactNode;
527
+ overflowBreakpoint?: number;
528
+ /** A full-width band rendered above the rail/content row, outside the scrollable
529
+ * content column — e.g. a test-mode or role-preview banner. Omit for none. */
530
+ banner?: React.ReactNode;
531
+ /** A third flex sibling rendered after the main content column (e.g. an assistant
532
+ * side panel that goes full-screen below the same breakpoint the rail does). Called
533
+ * with the rail's own `overlay` flag so a panel that needs its own scrim/stacking at
534
+ * that width can key off the same breakpoint AppShell already computed, rather than
535
+ * re-deriving it. */
536
+ trailingPanel?: (ctx: {
537
+ overlay: boolean;
538
+ }) => React.ReactNode;
539
+ /** Max width (px) of the centered content column. Default 1440 — every current
540
+ * flytedesk app shell's own value. */
541
+ contentMaxWidth?: number;
542
+ /** The shell's own height. Default `"100vh"`, correct for the real, top-level use
543
+ * every app mounts this at. A demo or preview embedding AppShell inside a bounded
544
+ * container (this package's own docs site) passes e.g. `"100%"` instead. */
545
+ height?: string | number;
546
+ /** Extra class name on the content column (e.g. media-planner's container-query
547
+ * class for its own responsive grids). */
548
+ contentClassName?: string;
549
+ className?: string;
550
+ /** The routed screen content, rendered inside the padded, centered content column. */
551
+ children: React.ReactNode;
552
+ }
553
+ declare function AppShell({ brand, navGroups, currentNav, onNavigate, navFooter, initialNavOpen, onNavOpenChange, railBreakpoint, crumbs, loading, actions, overflowActions, overflowBreakpoint, banner, trailingPanel, contentMaxWidth, height, contentClassName, className, children, }: AppShellProps): React.JSX.Element;
554
+
555
+ interface FlytedeskMarkProps {
556
+ size?: "sm" | "md" | "lg";
557
+ className?: string;
558
+ }
559
+ /** Just the flytedesk logo, no label — for contexts too small for a stacked brand
560
+ * (a collapsed rail, a favicon-sized corner mark). */
561
+ declare function FlytedeskMark({ size, className, ...rest }: FlytedeskMarkProps): React.JSX.Element;
562
+ interface FlytedeskBrandProps {
563
+ /** The consuming app's name, shown under the logo — e.g. "Media Planner", "Admin". */
564
+ appName: string;
565
+ size?: "sm" | "md" | "lg";
566
+ className?: string;
567
+ }
568
+ /** The flytedesk logo stacked over the app's name — meant to drop straight into
569
+ * SidebarNav's `brand` slot in every flytedesk app. */
570
+ declare function FlytedeskBrand({ appName, size, className, ...rest }: FlytedeskBrandProps): React.JSX.Element;
571
+ /**
572
+ * MP-221: the Flytedesk favicon — the exact `.ico` media-planner and sms-app both
573
+ * shipped as a byte-identical copy in `apps/web/public/favicon.ico` (SMS-5 gate
574
+ * review) — now ships as a real file in this package, at `assets/favicon.ico`
575
+ * (`"./assets/*"` in package.json's `exports`). A Vite app resolves it with the same
576
+ * `?url` suffix it already uses for any other imported asset, then installs it with
577
+ * this helper instead of hand-writing the `<link rel="icon">` DOM code per app:
578
+ *
579
+ * import favicon from "@flytedan/flytebot-design-system/assets/favicon.ico?url";
580
+ * import { installFlytedeskFavicon } from "@flytedan/flytebot-design-system";
581
+ *
582
+ * installFlytedeskFavicon(favicon); // once, e.g. at the top of main.tsx
583
+ *
584
+ * Takes the resolved URL rather than resolving it itself: asset URL resolution is the
585
+ * consuming app's own bundler's job (Vite rewrites the import at build time to a
586
+ * hashed, content-addressed path), not something this package can do on an app's
587
+ * behalf without bundling a copy of every app's Vite config.
588
+ */
589
+ declare function installFlytedeskFavicon(url: string): void;
590
+
591
+ /**
592
+ * Places within one screen. Underline only — no pill tabs in the product.
593
+ */
594
+ interface TabsProps {
595
+ tabs: Array<string | {
596
+ value: string;
597
+ label: string;
598
+ count?: number;
599
+ }>;
600
+ value?: string;
601
+ onChange?: (value: string) => void;
602
+ className?: string;
603
+ }
604
+ declare function Tabs({ tabs, value, onChange, className, ...rest }: TabsProps): React.JSX.Element;
605
+
505
606
  /** A person or organisation mark. Initials on a soft brand tint when no image exists. */
506
607
  interface AvatarProps {
507
608
  name?: string;
@@ -2145,7 +2246,10 @@ interface AccountMenuProps {
2145
2246
  /** Preferred over href navigation — lets an SPA route without a page load. */
2146
2247
  onNavigate?: (href: string | undefined, item: AccountMenuLink) => void;
2147
2248
  /** May return a Promise — the sign-out item shows a spinner and disables itself until it
2148
- * settles, then closes the menu. Falls back to the injected session's own `signOut`. */
2249
+ * settles. On success the menu closes; on rejection the menu stays open with an inline,
2250
+ * announced error and a Retry (MP-221) — the session is unchanged, so closing here would
2251
+ * tell the user they signed out when they didn't. Falls back to the injected session's
2252
+ * own `signOut`. */
2149
2253
  onSignOut?: () => void | Promise<void>;
2150
2254
  showRoles?: boolean;
2151
2255
  /** Demo affordance: impersonate another member to see their UI. Default true. */
@@ -2483,6 +2587,59 @@ interface ProfilePageProps {
2483
2587
  */
2484
2588
  declare function ProfilePage({ user: userProp, fields, notifications, extra, onChangePhoto, onSave, onNavigate, sessions, onSignOutEverywhere, className, }: ProfilePageProps): React.JSX.Element;
2485
2589
 
2590
+ /**
2591
+ * MP-224: the one flytedesk sign-in screen, moved here from media-planner's
2592
+ * hand-built `LoginPage` so every app (media-planner now, sms-app in SMS-5)
2593
+ * renders the same branded screen instead of drifting copies — sms-app's own
2594
+ * copy had regressed to showing its raw app id ("sms-app") as the heading.
2595
+ *
2596
+ * Purely presentational: this component knows nothing about any app's session
2597
+ * library. The app supplies `productName` for the heading and `onSignIn()`,
2598
+ * called on click — the app then does its own full-page navigation to its
2599
+ * API's `/auth/login` (a real browser navigation, not a fetch, since the
2600
+ * subsequent hop through flytedesk-id and back is a redirect chain the
2601
+ * browser has to actually follow). This component only drives the button's
2602
+ * own loading state from that click until the page unloads; it never
2603
+ * initiates the navigation itself.
2604
+ *
2605
+ * `continueAs` is optional and purely additive: when present, it shows a
2606
+ * "Continue as {name}" primary action (with its own "Resuming…" loading
2607
+ * state) plus a "Not you? Sign in with flytedesk ID" link that falls back to
2608
+ * the ordinary sign-in button via `onDecline`. The actual silent-resume
2609
+ * mechanism (prompt=none) is out of scope here — it lives in app-kit (AK-14)
2610
+ * and the app supplies it as `onContinue`.
2611
+ *
2612
+ * Visual design carried over unchanged from media-planner's LoginPage: navy
2613
+ * gradient background, faint grid overlay, the flytedesk wordmark, and the
2614
+ * card's gradient top stripe. The wordmark reuses `FlytedeskMark` (this
2615
+ * package's existing brand asset) rather than a second inline SVG — its
2616
+ * artwork is fixed dark-navy ink with dark-theme handled by a CSS filter (see
2617
+ * FlytedeskBrand.tsx), so it is wrapped in its own `data-theme="dark"` scope
2618
+ * here to force the white variant against this page's permanently-dark
2619
+ * background, without affecting the (light) Card beneath it.
2620
+ */
2621
+ interface SignInContinueAs {
2622
+ /** The previously-signed-in user's display name, e.g. "Dana Reyes". */
2623
+ name: string;
2624
+ /** One more silent sign-in attempt. Resolve on success (the app then
2625
+ * re-renders signed in) or on failure (the app falls back by no longer
2626
+ * passing `continueAs`, or the user clicks "Not you?"). */
2627
+ onContinue: () => Promise<void>;
2628
+ /** "Not you? Sign in with flytedesk ID" was clicked — show the ordinary
2629
+ * sign-in button instead. */
2630
+ onDecline: () => void;
2631
+ }
2632
+ interface SignInPageProps {
2633
+ /** The heading, e.g. "Media Planner" or "SMS". */
2634
+ productName: string;
2635
+ /** Starts the app's own full-page navigation to its API's /auth/login.
2636
+ * This component shows the button's loading state from the click until
2637
+ * the page unloads. */
2638
+ onSignIn: () => void;
2639
+ continueAs?: SignInContinueAs;
2640
+ }
2641
+ declare function SignInPage({ productName, onSignIn, continueAs }: SignInPageProps): React.JSX.Element;
2642
+
2486
2643
  interface RoadmapTimelineProps {
2487
2644
  /** Called with a flag key when the reader clicks one — route it to your flag admin. */
2488
2645
  onOpenFlag?: (flagKey: string) => void;
@@ -4133,4 +4290,22 @@ declare function useResponsiveRail(options?: UseResponsiveRailOptions): UseRespo
4133
4290
 
4134
4291
  declare function useFocusTrap(containerRef: React.RefObject<HTMLElement | null>, active: boolean): void;
4135
4292
 
4136
- export { AccountMenu, type AccountMenuLink, type AccountMenuProps, AgentChatPanel, type AgentChatPanelProps, AnchoredPopover, type AnchoredPopoverProps, AnimNum, type AnimNumProps, ApiSpecBrowser, type ApiSpecBrowserProps, type AppEntry, AppSwitcher, type AppSwitcherProps, AppearanceMenu, type AppearanceMenuProps, type AppearancePrefs, type AppearanceStore, type AppearanceStoreOptions, type Attachment, Avatar, type AvatarProps, AvatarStack, type AvatarStackProps, Badge, type BadgeProps, Banner, type BannerProps, type BannerTone, BudgetReallocator, type BudgetReallocatorProps, Button, type ButtonProps, CHANNELS, CHANNEL_WEIGHTS, CHAT_UNAVAILABLE, Calendar, type CalendarProps, Card, type CardProps, CardRow, type CardRowProps, ChannelContribution, type ChannelContributionChannel, type ChannelContributionProps, ChannelMeta, type ChannelMetaRecord, ChannelTag, type ChannelTagProps, ChannelWeightOf, type ChatAdapter, ChatComposer, type ChatComposerProps, type ChatEngine, type ChatEngineOptions, ChatKit, type ChatMessage, type ChatRenderContext, ChatSessionBar, type ChatSessionBarProps, ChatTranscript, type ChatTranscriptProps, ChatTurn, type ChatTurnProps, Checkbox, type CheckboxProps, type Citation, Citations, type CitationsProps, Clamp, type ClampProps, ClockFace, type ClockFaceProps, CodeBlock, type CodeBlockProps, Collapsible, type CollapsibleProps, ComingSoon, type ComingSoonProps, type ContextUsage, type CreateVersionStoreOptions, CsiBadge, type CsiBadgeProps, CsiHero, type CsiHeroProps, CsiMeter, type CsiMeterProps, DEFAULT_PREFS, DEFAULT_STORAGE_KEY, DataTable, type DataTableColumn, type DataTableProps, DatePicker, type DatePickerProps, type DemoSessionControls, DemoSessionProvider, type DeviceSession, DiffBlock, type DiffBlockProps, Drawer, type DrawerProps, Dropzone, DropzoneKit, type DropzoneProps, ENTITY_ROW_METRIC_WIDTH, type EditorTrigger, EmptyState, type EmptyStateProps, type EndpointSpec, EntityRow, type EntityRowAction, type EntityRowContent, type EntityRowMetric, EntityRowMetrics, type EntityRowMetricsProps, type EntityRowProps, FILE_VIEWER_CSV_ROW_LIMIT, FILE_VIEWER_TEXT_LIMIT, FeatureGate, type FeatureGateProps, type FeatureStatus, FileBrowser, type FileBrowserFile, type FileBrowserFolder, type FileBrowserPermissions, type FileBrowserProps, FileChip, type FileChipProps, FileGrid, type FileGridProps, FileKit, FilePickButton, type FilePickButtonProps, type FileRejection, FileStrip, type FileStripProps, FileTile, type FileTileProps, type FileUploadHandler, FileViewer, type FileViewerProps, FilterBar, type FilterBarProps, type FilterField, type FilterFieldOption, type FilterFieldSelect, type FilterFieldText, Flag$1 as Flag, type FlagExplanation, type FlagProps, FlytedeskBrand, type FlytedeskBrandProps, FlytedeskMark, type FlytedeskMarkProps, FormatEta, Gate, type GateProps, IMPORTANCE_LEVELS, IconButton, type IconButtonProps, type ImportanceLevel, type ImportanceLevelId, ImportanceTag, type ImportanceTagProps, type ImportanceTokens, Input, type InputProps, type JobStatus, Json, KeyHint, type KeyHintProps, type ListEnvelope, LoadingRegion, type LoadingRegionProps, Markdown, MarkdownEditor, type MarkdownEditorHandle, type MarkdownEditorProps, MarkdownInline, type MarkdownProps, type MentionSource, Menu, MenuButton, type MenuButtonProps, type MenuItem, type MenuProps, MessageBody, type MessageBodyProps, type MessageGroup, Meter, type MeterProps, type MeterSegment, type MeterSegmentInput, MixGap, type MixGapProps, type MixGapRow, MockJobKit, type MockJobStatus, Modal, type ModalProps, ModeSwitch, type ModeSwitchProps, type Model, ModelControls, type ModelControlsProps, NumberInput, type NumberInputProps, POPOVER_BODY_MIN, type Packet, PacketCard, type PacketCardProps, type PacketSchema, type Pager, Pagination, type PaginationProps, PermissionDenied, type PermissionDeniedProps, type PermissionGroup, PermissionHint, type PermissionItem, type Placement, type PollOptions, Popover, type PopoverProps, type PreferenceCriterion, PreferenceMeter, type PreferenceMeterProps, type ProfileFieldDef, type ProfileFieldType, type ProfileNotificationDef, ProfilePage, type ProfilePageProps, ProgressBar, type ProgressBarProps, QueryKit, type QueuedTurn, QuotaRow, type QuotaRowProps, Radio, type RadioProps, RangeSlider, type RangeSliderProps, RelativeTime, type RelativeTimeProps, type RoadmapItem, type RoadmapResult, RoadmapTimeline, type RoadmapTimelineProps, type Role, RunActions, type RunActionsProps, type RunConfig, RuntimeKit, type RuntimeSummary, SaturationDistribution, type SaturationDistributionCampus, type SaturationDistributionProps, ScoreMeter, type ScoreMeterProps, ScreenHead, type ScreenHeadProps, SearchField, type SearchFieldProps, SegmentedControl, type SegmentedControlProps, SegmentedMeter, type SegmentedMeterProps, Select, type SelectOption, type SelectProps, type SendMessageResult, type ServerTable, type Session, type SessionContextValue, type Flag as SessionFlag, SessionKit, SessionProvider, type SessionProviderProps, type SessionRole, type SessionStats, type SessionUser, SidebarNav, type SidebarNavItem, type SidebarNavProps, Skeleton, type SkeletonProps, SkeletonText, type SkeletonTextProps, type SlashCommand, Slider, type SliderProps, SortMenu, type SortMenuField, type SortMenuProps, type SpecModule, Spinner, type SpinnerProps, StatTile, type StatTileProps, type Step, StepList, type StepListProps, type StreamHandlers, type Suggestion, SurroundSound, type SurroundSoundProps, Switch, type SwitchProps, type TableQuery, Tabs, type TabsProps, Tag, type TagProps, TestModeBar, type TestModeBarProps, type TextScale, Textarea, type TextareaProps, type ThemeMode, ThinkingBlock, type ThinkingBlockProps, type ThreadSummary, TimePicker, type TimePickerProps, Toast, type ToastProps, Tooltip, type TooltipProps, Topbar, type TopbarProps, TranscriptKit, TransferList, type TransferListProps, type TransferListSide, type TransferListSideProps, type UsageLimit, UseFeatureStatus, type UseResponsiveRailOptions, type UseResponsiveRailResult, UseRuntimeMode, type UseServerTableOptions, type User, VIRTUAL_LIST_BUFFER_ROWS, VIRTUAL_LIST_ROW_GAP, type VersionRecord, type VersionStore, VirtualList, type VirtualListProps, type VirtualLoadedBand, type VirtualWindow, type VoiceHandler, acceptMatches, anyOfFilter, applyPrefs, channelWeightOf, computeNeedMore, computeVirtualWindow, createLocalStorageAppearanceStore, createVersionStore, eqFilter, extensionOf, extractClipboardFiles, filterFiles, formatAbsolute, formatBytes, formatClock, formatDuration, formatEta, formatRelative, groupMessages, hasModifier, iconForMime, importanceLevel, importanceTokens, isImage, isSystemMessage, jobBucket, languageLabel, loadPrefs, markdownToText, meterFormats, modifierLabel, parseDelimited, pastedTextName, pluralizeUnit, preferenceScore, preferenceSegments, rangeFilter, resolveTheme, revokeAttachment, savePrefs, toAttachment, tokenize, useAppearancePrefs, useChatEngine, useFeatureStatus, useFocusTrap, usePopoverPosition, useResponsiveRail, useRuntimeMode, useServerTable, useSessionContext, useStagedFiles, visibleMessages };
4293
+ /**
4294
+ * MP-221: the "<route> · <app> · Flytedesk" title convention every flytedesk app shell
4295
+ * hand-typed per route (sms-app's CampaignAnalytics.tsx, QueryTool.tsx, NotFound.tsx,
4296
+ * SignIn.tsx and index.html each spelled " · SMS · Flytedesk" separately — SMS-5
4297
+ * code-quality review item 5). One place composes it now.
4298
+ *
4299
+ * `routeTitle` is optional so a route with no title of its own (e.g. a bare loading
4300
+ * state) still gets a correct "<app> · Flytedesk" title instead of a dangling separator.
4301
+ */
4302
+ declare function formatDocumentTitle(routeTitle: string | undefined | null, appName: string): string;
4303
+ /**
4304
+ * Sets `document.title` to `formatDocumentTitle(routeTitle, appName)` for as long as the
4305
+ * calling component is mounted, and re-applies it whenever either argument changes —
4306
+ * e.g. call it once per route component with that route's own title. Does nothing
4307
+ * outside a DOM environment (SSR/tests with no `document`).
4308
+ */
4309
+ declare function useDocumentTitle(routeTitle: string | undefined | null, appName: string): void;
4310
+
4311
+ export { AccountMenu, type AccountMenuLink, type AccountMenuProps, AgentChatPanel, type AgentChatPanelProps, AnchoredPopover, type AnchoredPopoverProps, AnimNum, type AnimNumProps, ApiSpecBrowser, type ApiSpecBrowserProps, type AppEntry, AppShell, type AppShellProps, AppSwitcher, type AppSwitcherProps, AppearanceMenu, type AppearanceMenuProps, type AppearancePrefs, type AppearanceStore, type AppearanceStoreOptions, type Attachment, Avatar, type AvatarProps, AvatarStack, type AvatarStackProps, Badge, type BadgeProps, Banner, type BannerProps, type BannerTone, BudgetReallocator, type BudgetReallocatorProps, Button, type ButtonProps, CHANNELS, CHANNEL_WEIGHTS, CHAT_UNAVAILABLE, Calendar, type CalendarProps, Card, type CardProps, CardRow, type CardRowProps, ChannelContribution, type ChannelContributionChannel, type ChannelContributionProps, ChannelMeta, type ChannelMetaRecord, ChannelTag, type ChannelTagProps, ChannelWeightOf, type ChatAdapter, ChatComposer, type ChatComposerProps, type ChatEngine, type ChatEngineOptions, ChatKit, type ChatMessage, type ChatRenderContext, ChatSessionBar, type ChatSessionBarProps, ChatTranscript, type ChatTranscriptProps, ChatTurn, type ChatTurnProps, Checkbox, type CheckboxProps, type Citation, Citations, type CitationsProps, Clamp, type ClampProps, ClockFace, type ClockFaceProps, CodeBlock, type CodeBlockProps, Collapsible, type CollapsibleProps, ComingSoon, type ComingSoonProps, type ContextUsage, type CreateVersionStoreOptions, CsiBadge, type CsiBadgeProps, CsiHero, type CsiHeroProps, CsiMeter, type CsiMeterProps, DEFAULT_PREFS, DEFAULT_STORAGE_KEY, DataTable, type DataTableColumn, type DataTableProps, DatePicker, type DatePickerProps, type DemoSessionControls, DemoSessionProvider, type DeviceSession, DiffBlock, type DiffBlockProps, Drawer, type DrawerProps, Dropzone, DropzoneKit, type DropzoneProps, ENTITY_ROW_METRIC_WIDTH, type EditorTrigger, EmptyState, type EmptyStateProps, type EndpointSpec, EntityRow, type EntityRowAction, type EntityRowContent, type EntityRowMetric, EntityRowMetrics, type EntityRowMetricsProps, type EntityRowProps, FILE_VIEWER_CSV_ROW_LIMIT, FILE_VIEWER_TEXT_LIMIT, FeatureGate, type FeatureGateProps, type FeatureStatus, FileBrowser, type FileBrowserFile, type FileBrowserFolder, type FileBrowserPermissions, type FileBrowserProps, FileChip, type FileChipProps, FileGrid, type FileGridProps, FileKit, FilePickButton, type FilePickButtonProps, type FileRejection, FileStrip, type FileStripProps, FileTile, type FileTileProps, type FileUploadHandler, FileViewer, type FileViewerProps, FilterBar, type FilterBarProps, type FilterField, type FilterFieldOption, type FilterFieldSelect, type FilterFieldText, Flag$1 as Flag, type FlagExplanation, type FlagProps, FlytedeskBrand, type FlytedeskBrandProps, FlytedeskMark, type FlytedeskMarkProps, FormatEta, Gate, type GateProps, IMPORTANCE_LEVELS, IconButton, type IconButtonProps, type ImportanceLevel, type ImportanceLevelId, ImportanceTag, type ImportanceTagProps, type ImportanceTokens, Input, type InputProps, type JobStatus, Json, KeyHint, type KeyHintProps, type ListEnvelope, LoadingRegion, type LoadingRegionProps, Markdown, MarkdownEditor, type MarkdownEditorHandle, type MarkdownEditorProps, MarkdownInline, type MarkdownProps, type MentionSource, Menu, MenuButton, type MenuButtonProps, type MenuItem, type MenuProps, MessageBody, type MessageBodyProps, type MessageGroup, Meter, type MeterProps, type MeterSegment, type MeterSegmentInput, MixGap, type MixGapProps, type MixGapRow, MockJobKit, type MockJobStatus, Modal, type ModalProps, ModeSwitch, type ModeSwitchProps, type Model, ModelControls, type ModelControlsProps, NumberInput, type NumberInputProps, POPOVER_BODY_MIN, type Packet, PacketCard, type PacketCardProps, type PacketSchema, type Pager, Pagination, type PaginationProps, PermissionDenied, type PermissionDeniedProps, type PermissionGroup, PermissionHint, type PermissionItem, type Placement, type PollOptions, Popover, type PopoverProps, type PreferenceCriterion, PreferenceMeter, type PreferenceMeterProps, type ProfileFieldDef, type ProfileFieldType, type ProfileNotificationDef, ProfilePage, type ProfilePageProps, ProgressBar, type ProgressBarProps, QueryKit, type QueuedTurn, QuotaRow, type QuotaRowProps, Radio, type RadioProps, RangeSlider, type RangeSliderProps, RelativeTime, type RelativeTimeProps, type RoadmapItem, type RoadmapResult, RoadmapTimeline, type RoadmapTimelineProps, type Role, RunActions, type RunActionsProps, type RunConfig, RuntimeKit, type RuntimeSummary, SaturationDistribution, type SaturationDistributionCampus, type SaturationDistributionProps, ScoreMeter, type ScoreMeterProps, ScreenHead, type ScreenHeadProps, SearchField, type SearchFieldProps, SegmentedControl, type SegmentedControlProps, SegmentedMeter, type SegmentedMeterProps, Select, type SelectOption, type SelectProps, type SendMessageResult, type ServerTable, type Session, type SessionContextValue, type Flag as SessionFlag, SessionKit, SessionProvider, type SessionProviderProps, type SessionRole, type SessionStats, type SessionUser, SidebarNav, type SidebarNavItem, type SidebarNavProps, type SignInContinueAs, SignInPage, type SignInPageProps, Skeleton, type SkeletonProps, SkeletonText, type SkeletonTextProps, type SlashCommand, Slider, type SliderProps, SortMenu, type SortMenuField, type SortMenuProps, type SpecModule, Spinner, type SpinnerProps, StatTile, type StatTileProps, type Step, StepList, type StepListProps, type StreamHandlers, type Suggestion, SurroundSound, type SurroundSoundProps, Switch, type SwitchProps, type TableQuery, Tabs, type TabsProps, Tag, type TagProps, TestModeBar, type TestModeBarProps, type TextScale, Textarea, type TextareaProps, type ThemeMode, ThinkingBlock, type ThinkingBlockProps, type ThreadSummary, TimePicker, type TimePickerProps, Toast, type ToastProps, Tooltip, type TooltipProps, Topbar, type TopbarProps, TranscriptKit, TransferList, type TransferListProps, type TransferListSide, type TransferListSideProps, type UsageLimit, UseFeatureStatus, type UseResponsiveRailOptions, type UseResponsiveRailResult, UseRuntimeMode, type UseServerTableOptions, type User, VIRTUAL_LIST_BUFFER_ROWS, VIRTUAL_LIST_ROW_GAP, type VersionRecord, type VersionStore, VirtualList, type VirtualListProps, type VirtualLoadedBand, type VirtualWindow, type VoiceHandler, acceptMatches, anyOfFilter, applyPrefs, channelWeightOf, computeNeedMore, computeVirtualWindow, createLocalStorageAppearanceStore, createVersionStore, eqFilter, extensionOf, extractClipboardFiles, filterFiles, formatAbsolute, formatBytes, formatClock, formatDocumentTitle, formatDuration, formatEta, formatRelative, groupMessages, hasModifier, iconForMime, importanceLevel, importanceTokens, installFlytedeskFavicon, isImage, isSystemMessage, jobBucket, languageLabel, loadPrefs, markdownToText, meterFormats, modifierLabel, parseDelimited, pastedTextName, pluralizeUnit, preferenceScore, preferenceSegments, rangeFilter, resolveTheme, revokeAttachment, savePrefs, toAttachment, tokenize, useAppearancePrefs, useChatEngine, useDocumentTitle, useFeatureStatus, useFocusTrap, usePopoverPosition, useResponsiveRail, useRuntimeMode, useServerTable, useSessionContext, useStagedFiles, visibleMessages };
package/dist/index.d.ts CHANGED
@@ -437,38 +437,6 @@ interface SidebarNavProps {
437
437
  }
438
438
  declare const SidebarNav: React.ForwardRefExoticComponent<SidebarNavProps & React.RefAttributes<HTMLElement>>;
439
439
 
440
- interface FlytedeskMarkProps {
441
- size?: "sm" | "md" | "lg";
442
- className?: string;
443
- }
444
- /** Just the flytedesk logo, no label — for contexts too small for a stacked brand
445
- * (a collapsed rail, a favicon-sized corner mark). */
446
- declare function FlytedeskMark({ size, className, ...rest }: FlytedeskMarkProps): React.JSX.Element;
447
- interface FlytedeskBrandProps {
448
- /** The consuming app's name, shown under the logo — e.g. "Media Planner", "Admin". */
449
- appName: string;
450
- size?: "sm" | "md" | "lg";
451
- className?: string;
452
- }
453
- /** The flytedesk logo stacked over the app's name — meant to drop straight into
454
- * SidebarNav's `brand` slot in every flytedesk app. */
455
- declare function FlytedeskBrand({ appName, size, className, ...rest }: FlytedeskBrandProps): React.JSX.Element;
456
-
457
- /**
458
- * Places within one screen. Underline only — no pill tabs in the product.
459
- */
460
- interface TabsProps {
461
- tabs: Array<string | {
462
- value: string;
463
- label: string;
464
- count?: number;
465
- }>;
466
- value?: string;
467
- onChange?: (value: string) => void;
468
- className?: string;
469
- }
470
- declare function Tabs({ tabs, value, onChange, className, ...rest }: TabsProps): React.JSX.Element;
471
-
472
440
  /** 60px app header: breadcrumb left, actions right, and a 2px route loader along its top edge. */
473
441
  interface TopbarProps {
474
442
  /** A non-last crumb with `onClick` calls it (via `preventDefault`) instead of following
@@ -502,6 +470,139 @@ interface TopbarProps {
502
470
  }
503
471
  declare function Topbar({ crumbs, actions, overflowActions, overflowBreakpoint, loading, onMenu, className, ...rest }: TopbarProps): React.JSX.Element;
504
472
 
473
+ /**
474
+ * MP-221: the Topbar + SidebarNav + useResponsiveRail composition every flytedesk app
475
+ * shell hand-assembled — the full-height flex column, the rail/content flex row, the
476
+ * scrim, the overlay-close-on-navigate wiring and the centered, max-width content
477
+ * column — lived three times over (media-planner's PlannerShell, sms-app's Shell, and
478
+ * this package's own SidebarNav docs demo, which told every new app to copy it). The
479
+ * design of this API reads BOTH real compositions (PlannerShell.tsx, Shell.tsx): a
480
+ * plain "app passes nav items + identity + actions" shape covers everything the two
481
+ * shared, and each of PlannerShell's app-specific extras (the command palette,
482
+ * TestModeBar/RolePreviewBar, the assistant panel, Dev tools) stays out of it, reached
483
+ * instead through `banner` and `trailingPanel`, or rendered around AppShell entirely.
484
+ *
485
+ * `useResponsiveRail` itself (overlay-vs-docked detection, Escape, focus trap/return,
486
+ * body scroll lock) is unchanged and still exported on its own — AppShell only owns
487
+ * wiring it to a real SidebarNav/Topbar/scrim so no app has to re-wire it by hand.
488
+ */
489
+ interface AppShellProps {
490
+ /** Rendered in SidebarNav's fixed-height brand row (e.g. FlytedeskBrand/FlytedeskMark,
491
+ * optionally wrapped in a "go home" button — that wrapping is app behaviour, not
492
+ * something AppShell can supply generically). */
493
+ brand?: React.ReactNode;
494
+ /** SidebarNav's groups. */
495
+ navGroups: Array<{
496
+ label?: string;
497
+ items: SidebarNavItem[];
498
+ }>;
499
+ /** The active item's value, matched against each item's own `value`. */
500
+ currentNav?: string;
501
+ /** Called with an item's value when it's clicked. AppShell closes the rail itself
502
+ * first when it's an overlay — an app never has to remember that half of the wiring. */
503
+ onNavigate: (value: string) => void;
504
+ /** SidebarNav's footer slot (e.g. media-planner's "Jump to… ⌘K" trigger). */
505
+ navFooter?: React.ReactNode;
506
+ /** The rail's open state on first render while docked — the seam for an app's own
507
+ * persisted desktop preference (e.g. a `usePref`-backed value). Ignored while the
508
+ * initial viewport is already in overlay range, which always starts closed. */
509
+ initialNavOpen?: boolean;
510
+ /** Called with the new open state whenever it changes while docked — an app's hook
511
+ * into persisting `initialNavOpen`. Never called for a transient overlay open/close. */
512
+ onNavOpenChange?: (open: boolean) => void;
513
+ /** Max-width (px) at which the rail becomes a scrimmed overlay instead of a docked
514
+ * column. Must match the design system's own `.fd-side` breakpoint (default 1024)
515
+ * unless an app's own CSS overrides that breakpoint too. */
516
+ railBreakpoint?: number;
517
+ /** Topbar's breadcrumbs. */
518
+ crumbs?: TopbarProps["crumbs"];
519
+ /** Shows Topbar's route-loading indicator along its top edge. */
520
+ loading?: boolean;
521
+ /** Topbar's never-collapsing slot — the one control every screen needs to keep
522
+ * directly reachable, typically the AccountMenu. */
523
+ actions: React.ReactNode;
524
+ /** Topbar's slot that collapses into a "More actions" menu under `overflowBreakpoint`
525
+ * (an assistant launcher, AppearanceMenu, a version badge, Dev tools, undo, …). */
526
+ overflowActions?: React.ReactNode;
527
+ overflowBreakpoint?: number;
528
+ /** A full-width band rendered above the rail/content row, outside the scrollable
529
+ * content column — e.g. a test-mode or role-preview banner. Omit for none. */
530
+ banner?: React.ReactNode;
531
+ /** A third flex sibling rendered after the main content column (e.g. an assistant
532
+ * side panel that goes full-screen below the same breakpoint the rail does). Called
533
+ * with the rail's own `overlay` flag so a panel that needs its own scrim/stacking at
534
+ * that width can key off the same breakpoint AppShell already computed, rather than
535
+ * re-deriving it. */
536
+ trailingPanel?: (ctx: {
537
+ overlay: boolean;
538
+ }) => React.ReactNode;
539
+ /** Max width (px) of the centered content column. Default 1440 — every current
540
+ * flytedesk app shell's own value. */
541
+ contentMaxWidth?: number;
542
+ /** The shell's own height. Default `"100vh"`, correct for the real, top-level use
543
+ * every app mounts this at. A demo or preview embedding AppShell inside a bounded
544
+ * container (this package's own docs site) passes e.g. `"100%"` instead. */
545
+ height?: string | number;
546
+ /** Extra class name on the content column (e.g. media-planner's container-query
547
+ * class for its own responsive grids). */
548
+ contentClassName?: string;
549
+ className?: string;
550
+ /** The routed screen content, rendered inside the padded, centered content column. */
551
+ children: React.ReactNode;
552
+ }
553
+ declare function AppShell({ brand, navGroups, currentNav, onNavigate, navFooter, initialNavOpen, onNavOpenChange, railBreakpoint, crumbs, loading, actions, overflowActions, overflowBreakpoint, banner, trailingPanel, contentMaxWidth, height, contentClassName, className, children, }: AppShellProps): React.JSX.Element;
554
+
555
+ interface FlytedeskMarkProps {
556
+ size?: "sm" | "md" | "lg";
557
+ className?: string;
558
+ }
559
+ /** Just the flytedesk logo, no label — for contexts too small for a stacked brand
560
+ * (a collapsed rail, a favicon-sized corner mark). */
561
+ declare function FlytedeskMark({ size, className, ...rest }: FlytedeskMarkProps): React.JSX.Element;
562
+ interface FlytedeskBrandProps {
563
+ /** The consuming app's name, shown under the logo — e.g. "Media Planner", "Admin". */
564
+ appName: string;
565
+ size?: "sm" | "md" | "lg";
566
+ className?: string;
567
+ }
568
+ /** The flytedesk logo stacked over the app's name — meant to drop straight into
569
+ * SidebarNav's `brand` slot in every flytedesk app. */
570
+ declare function FlytedeskBrand({ appName, size, className, ...rest }: FlytedeskBrandProps): React.JSX.Element;
571
+ /**
572
+ * MP-221: the Flytedesk favicon — the exact `.ico` media-planner and sms-app both
573
+ * shipped as a byte-identical copy in `apps/web/public/favicon.ico` (SMS-5 gate
574
+ * review) — now ships as a real file in this package, at `assets/favicon.ico`
575
+ * (`"./assets/*"` in package.json's `exports`). A Vite app resolves it with the same
576
+ * `?url` suffix it already uses for any other imported asset, then installs it with
577
+ * this helper instead of hand-writing the `<link rel="icon">` DOM code per app:
578
+ *
579
+ * import favicon from "@flytedan/flytebot-design-system/assets/favicon.ico?url";
580
+ * import { installFlytedeskFavicon } from "@flytedan/flytebot-design-system";
581
+ *
582
+ * installFlytedeskFavicon(favicon); // once, e.g. at the top of main.tsx
583
+ *
584
+ * Takes the resolved URL rather than resolving it itself: asset URL resolution is the
585
+ * consuming app's own bundler's job (Vite rewrites the import at build time to a
586
+ * hashed, content-addressed path), not something this package can do on an app's
587
+ * behalf without bundling a copy of every app's Vite config.
588
+ */
589
+ declare function installFlytedeskFavicon(url: string): void;
590
+
591
+ /**
592
+ * Places within one screen. Underline only — no pill tabs in the product.
593
+ */
594
+ interface TabsProps {
595
+ tabs: Array<string | {
596
+ value: string;
597
+ label: string;
598
+ count?: number;
599
+ }>;
600
+ value?: string;
601
+ onChange?: (value: string) => void;
602
+ className?: string;
603
+ }
604
+ declare function Tabs({ tabs, value, onChange, className, ...rest }: TabsProps): React.JSX.Element;
605
+
505
606
  /** A person or organisation mark. Initials on a soft brand tint when no image exists. */
506
607
  interface AvatarProps {
507
608
  name?: string;
@@ -2145,7 +2246,10 @@ interface AccountMenuProps {
2145
2246
  /** Preferred over href navigation — lets an SPA route without a page load. */
2146
2247
  onNavigate?: (href: string | undefined, item: AccountMenuLink) => void;
2147
2248
  /** May return a Promise — the sign-out item shows a spinner and disables itself until it
2148
- * settles, then closes the menu. Falls back to the injected session's own `signOut`. */
2249
+ * settles. On success the menu closes; on rejection the menu stays open with an inline,
2250
+ * announced error and a Retry (MP-221) — the session is unchanged, so closing here would
2251
+ * tell the user they signed out when they didn't. Falls back to the injected session's
2252
+ * own `signOut`. */
2149
2253
  onSignOut?: () => void | Promise<void>;
2150
2254
  showRoles?: boolean;
2151
2255
  /** Demo affordance: impersonate another member to see their UI. Default true. */
@@ -2483,6 +2587,59 @@ interface ProfilePageProps {
2483
2587
  */
2484
2588
  declare function ProfilePage({ user: userProp, fields, notifications, extra, onChangePhoto, onSave, onNavigate, sessions, onSignOutEverywhere, className, }: ProfilePageProps): React.JSX.Element;
2485
2589
 
2590
+ /**
2591
+ * MP-224: the one flytedesk sign-in screen, moved here from media-planner's
2592
+ * hand-built `LoginPage` so every app (media-planner now, sms-app in SMS-5)
2593
+ * renders the same branded screen instead of drifting copies — sms-app's own
2594
+ * copy had regressed to showing its raw app id ("sms-app") as the heading.
2595
+ *
2596
+ * Purely presentational: this component knows nothing about any app's session
2597
+ * library. The app supplies `productName` for the heading and `onSignIn()`,
2598
+ * called on click — the app then does its own full-page navigation to its
2599
+ * API's `/auth/login` (a real browser navigation, not a fetch, since the
2600
+ * subsequent hop through flytedesk-id and back is a redirect chain the
2601
+ * browser has to actually follow). This component only drives the button's
2602
+ * own loading state from that click until the page unloads; it never
2603
+ * initiates the navigation itself.
2604
+ *
2605
+ * `continueAs` is optional and purely additive: when present, it shows a
2606
+ * "Continue as {name}" primary action (with its own "Resuming…" loading
2607
+ * state) plus a "Not you? Sign in with flytedesk ID" link that falls back to
2608
+ * the ordinary sign-in button via `onDecline`. The actual silent-resume
2609
+ * mechanism (prompt=none) is out of scope here — it lives in app-kit (AK-14)
2610
+ * and the app supplies it as `onContinue`.
2611
+ *
2612
+ * Visual design carried over unchanged from media-planner's LoginPage: navy
2613
+ * gradient background, faint grid overlay, the flytedesk wordmark, and the
2614
+ * card's gradient top stripe. The wordmark reuses `FlytedeskMark` (this
2615
+ * package's existing brand asset) rather than a second inline SVG — its
2616
+ * artwork is fixed dark-navy ink with dark-theme handled by a CSS filter (see
2617
+ * FlytedeskBrand.tsx), so it is wrapped in its own `data-theme="dark"` scope
2618
+ * here to force the white variant against this page's permanently-dark
2619
+ * background, without affecting the (light) Card beneath it.
2620
+ */
2621
+ interface SignInContinueAs {
2622
+ /** The previously-signed-in user's display name, e.g. "Dana Reyes". */
2623
+ name: string;
2624
+ /** One more silent sign-in attempt. Resolve on success (the app then
2625
+ * re-renders signed in) or on failure (the app falls back by no longer
2626
+ * passing `continueAs`, or the user clicks "Not you?"). */
2627
+ onContinue: () => Promise<void>;
2628
+ /** "Not you? Sign in with flytedesk ID" was clicked — show the ordinary
2629
+ * sign-in button instead. */
2630
+ onDecline: () => void;
2631
+ }
2632
+ interface SignInPageProps {
2633
+ /** The heading, e.g. "Media Planner" or "SMS". */
2634
+ productName: string;
2635
+ /** Starts the app's own full-page navigation to its API's /auth/login.
2636
+ * This component shows the button's loading state from the click until
2637
+ * the page unloads. */
2638
+ onSignIn: () => void;
2639
+ continueAs?: SignInContinueAs;
2640
+ }
2641
+ declare function SignInPage({ productName, onSignIn, continueAs }: SignInPageProps): React.JSX.Element;
2642
+
2486
2643
  interface RoadmapTimelineProps {
2487
2644
  /** Called with a flag key when the reader clicks one — route it to your flag admin. */
2488
2645
  onOpenFlag?: (flagKey: string) => void;
@@ -4133,4 +4290,22 @@ declare function useResponsiveRail(options?: UseResponsiveRailOptions): UseRespo
4133
4290
 
4134
4291
  declare function useFocusTrap(containerRef: React.RefObject<HTMLElement | null>, active: boolean): void;
4135
4292
 
4136
- export { AccountMenu, type AccountMenuLink, type AccountMenuProps, AgentChatPanel, type AgentChatPanelProps, AnchoredPopover, type AnchoredPopoverProps, AnimNum, type AnimNumProps, ApiSpecBrowser, type ApiSpecBrowserProps, type AppEntry, AppSwitcher, type AppSwitcherProps, AppearanceMenu, type AppearanceMenuProps, type AppearancePrefs, type AppearanceStore, type AppearanceStoreOptions, type Attachment, Avatar, type AvatarProps, AvatarStack, type AvatarStackProps, Badge, type BadgeProps, Banner, type BannerProps, type BannerTone, BudgetReallocator, type BudgetReallocatorProps, Button, type ButtonProps, CHANNELS, CHANNEL_WEIGHTS, CHAT_UNAVAILABLE, Calendar, type CalendarProps, Card, type CardProps, CardRow, type CardRowProps, ChannelContribution, type ChannelContributionChannel, type ChannelContributionProps, ChannelMeta, type ChannelMetaRecord, ChannelTag, type ChannelTagProps, ChannelWeightOf, type ChatAdapter, ChatComposer, type ChatComposerProps, type ChatEngine, type ChatEngineOptions, ChatKit, type ChatMessage, type ChatRenderContext, ChatSessionBar, type ChatSessionBarProps, ChatTranscript, type ChatTranscriptProps, ChatTurn, type ChatTurnProps, Checkbox, type CheckboxProps, type Citation, Citations, type CitationsProps, Clamp, type ClampProps, ClockFace, type ClockFaceProps, CodeBlock, type CodeBlockProps, Collapsible, type CollapsibleProps, ComingSoon, type ComingSoonProps, type ContextUsage, type CreateVersionStoreOptions, CsiBadge, type CsiBadgeProps, CsiHero, type CsiHeroProps, CsiMeter, type CsiMeterProps, DEFAULT_PREFS, DEFAULT_STORAGE_KEY, DataTable, type DataTableColumn, type DataTableProps, DatePicker, type DatePickerProps, type DemoSessionControls, DemoSessionProvider, type DeviceSession, DiffBlock, type DiffBlockProps, Drawer, type DrawerProps, Dropzone, DropzoneKit, type DropzoneProps, ENTITY_ROW_METRIC_WIDTH, type EditorTrigger, EmptyState, type EmptyStateProps, type EndpointSpec, EntityRow, type EntityRowAction, type EntityRowContent, type EntityRowMetric, EntityRowMetrics, type EntityRowMetricsProps, type EntityRowProps, FILE_VIEWER_CSV_ROW_LIMIT, FILE_VIEWER_TEXT_LIMIT, FeatureGate, type FeatureGateProps, type FeatureStatus, FileBrowser, type FileBrowserFile, type FileBrowserFolder, type FileBrowserPermissions, type FileBrowserProps, FileChip, type FileChipProps, FileGrid, type FileGridProps, FileKit, FilePickButton, type FilePickButtonProps, type FileRejection, FileStrip, type FileStripProps, FileTile, type FileTileProps, type FileUploadHandler, FileViewer, type FileViewerProps, FilterBar, type FilterBarProps, type FilterField, type FilterFieldOption, type FilterFieldSelect, type FilterFieldText, Flag$1 as Flag, type FlagExplanation, type FlagProps, FlytedeskBrand, type FlytedeskBrandProps, FlytedeskMark, type FlytedeskMarkProps, FormatEta, Gate, type GateProps, IMPORTANCE_LEVELS, IconButton, type IconButtonProps, type ImportanceLevel, type ImportanceLevelId, ImportanceTag, type ImportanceTagProps, type ImportanceTokens, Input, type InputProps, type JobStatus, Json, KeyHint, type KeyHintProps, type ListEnvelope, LoadingRegion, type LoadingRegionProps, Markdown, MarkdownEditor, type MarkdownEditorHandle, type MarkdownEditorProps, MarkdownInline, type MarkdownProps, type MentionSource, Menu, MenuButton, type MenuButtonProps, type MenuItem, type MenuProps, MessageBody, type MessageBodyProps, type MessageGroup, Meter, type MeterProps, type MeterSegment, type MeterSegmentInput, MixGap, type MixGapProps, type MixGapRow, MockJobKit, type MockJobStatus, Modal, type ModalProps, ModeSwitch, type ModeSwitchProps, type Model, ModelControls, type ModelControlsProps, NumberInput, type NumberInputProps, POPOVER_BODY_MIN, type Packet, PacketCard, type PacketCardProps, type PacketSchema, type Pager, Pagination, type PaginationProps, PermissionDenied, type PermissionDeniedProps, type PermissionGroup, PermissionHint, type PermissionItem, type Placement, type PollOptions, Popover, type PopoverProps, type PreferenceCriterion, PreferenceMeter, type PreferenceMeterProps, type ProfileFieldDef, type ProfileFieldType, type ProfileNotificationDef, ProfilePage, type ProfilePageProps, ProgressBar, type ProgressBarProps, QueryKit, type QueuedTurn, QuotaRow, type QuotaRowProps, Radio, type RadioProps, RangeSlider, type RangeSliderProps, RelativeTime, type RelativeTimeProps, type RoadmapItem, type RoadmapResult, RoadmapTimeline, type RoadmapTimelineProps, type Role, RunActions, type RunActionsProps, type RunConfig, RuntimeKit, type RuntimeSummary, SaturationDistribution, type SaturationDistributionCampus, type SaturationDistributionProps, ScoreMeter, type ScoreMeterProps, ScreenHead, type ScreenHeadProps, SearchField, type SearchFieldProps, SegmentedControl, type SegmentedControlProps, SegmentedMeter, type SegmentedMeterProps, Select, type SelectOption, type SelectProps, type SendMessageResult, type ServerTable, type Session, type SessionContextValue, type Flag as SessionFlag, SessionKit, SessionProvider, type SessionProviderProps, type SessionRole, type SessionStats, type SessionUser, SidebarNav, type SidebarNavItem, type SidebarNavProps, Skeleton, type SkeletonProps, SkeletonText, type SkeletonTextProps, type SlashCommand, Slider, type SliderProps, SortMenu, type SortMenuField, type SortMenuProps, type SpecModule, Spinner, type SpinnerProps, StatTile, type StatTileProps, type Step, StepList, type StepListProps, type StreamHandlers, type Suggestion, SurroundSound, type SurroundSoundProps, Switch, type SwitchProps, type TableQuery, Tabs, type TabsProps, Tag, type TagProps, TestModeBar, type TestModeBarProps, type TextScale, Textarea, type TextareaProps, type ThemeMode, ThinkingBlock, type ThinkingBlockProps, type ThreadSummary, TimePicker, type TimePickerProps, Toast, type ToastProps, Tooltip, type TooltipProps, Topbar, type TopbarProps, TranscriptKit, TransferList, type TransferListProps, type TransferListSide, type TransferListSideProps, type UsageLimit, UseFeatureStatus, type UseResponsiveRailOptions, type UseResponsiveRailResult, UseRuntimeMode, type UseServerTableOptions, type User, VIRTUAL_LIST_BUFFER_ROWS, VIRTUAL_LIST_ROW_GAP, type VersionRecord, type VersionStore, VirtualList, type VirtualListProps, type VirtualLoadedBand, type VirtualWindow, type VoiceHandler, acceptMatches, anyOfFilter, applyPrefs, channelWeightOf, computeNeedMore, computeVirtualWindow, createLocalStorageAppearanceStore, createVersionStore, eqFilter, extensionOf, extractClipboardFiles, filterFiles, formatAbsolute, formatBytes, formatClock, formatDuration, formatEta, formatRelative, groupMessages, hasModifier, iconForMime, importanceLevel, importanceTokens, isImage, isSystemMessage, jobBucket, languageLabel, loadPrefs, markdownToText, meterFormats, modifierLabel, parseDelimited, pastedTextName, pluralizeUnit, preferenceScore, preferenceSegments, rangeFilter, resolveTheme, revokeAttachment, savePrefs, toAttachment, tokenize, useAppearancePrefs, useChatEngine, useFeatureStatus, useFocusTrap, usePopoverPosition, useResponsiveRail, useRuntimeMode, useServerTable, useSessionContext, useStagedFiles, visibleMessages };
4293
+ /**
4294
+ * MP-221: the "<route> · <app> · Flytedesk" title convention every flytedesk app shell
4295
+ * hand-typed per route (sms-app's CampaignAnalytics.tsx, QueryTool.tsx, NotFound.tsx,
4296
+ * SignIn.tsx and index.html each spelled " · SMS · Flytedesk" separately — SMS-5
4297
+ * code-quality review item 5). One place composes it now.
4298
+ *
4299
+ * `routeTitle` is optional so a route with no title of its own (e.g. a bare loading
4300
+ * state) still gets a correct "<app> · Flytedesk" title instead of a dangling separator.
4301
+ */
4302
+ declare function formatDocumentTitle(routeTitle: string | undefined | null, appName: string): string;
4303
+ /**
4304
+ * Sets `document.title` to `formatDocumentTitle(routeTitle, appName)` for as long as the
4305
+ * calling component is mounted, and re-applies it whenever either argument changes —
4306
+ * e.g. call it once per route component with that route's own title. Does nothing
4307
+ * outside a DOM environment (SSR/tests with no `document`).
4308
+ */
4309
+ declare function useDocumentTitle(routeTitle: string | undefined | null, appName: string): void;
4310
+
4311
+ export { AccountMenu, type AccountMenuLink, type AccountMenuProps, AgentChatPanel, type AgentChatPanelProps, AnchoredPopover, type AnchoredPopoverProps, AnimNum, type AnimNumProps, ApiSpecBrowser, type ApiSpecBrowserProps, type AppEntry, AppShell, type AppShellProps, AppSwitcher, type AppSwitcherProps, AppearanceMenu, type AppearanceMenuProps, type AppearancePrefs, type AppearanceStore, type AppearanceStoreOptions, type Attachment, Avatar, type AvatarProps, AvatarStack, type AvatarStackProps, Badge, type BadgeProps, Banner, type BannerProps, type BannerTone, BudgetReallocator, type BudgetReallocatorProps, Button, type ButtonProps, CHANNELS, CHANNEL_WEIGHTS, CHAT_UNAVAILABLE, Calendar, type CalendarProps, Card, type CardProps, CardRow, type CardRowProps, ChannelContribution, type ChannelContributionChannel, type ChannelContributionProps, ChannelMeta, type ChannelMetaRecord, ChannelTag, type ChannelTagProps, ChannelWeightOf, type ChatAdapter, ChatComposer, type ChatComposerProps, type ChatEngine, type ChatEngineOptions, ChatKit, type ChatMessage, type ChatRenderContext, ChatSessionBar, type ChatSessionBarProps, ChatTranscript, type ChatTranscriptProps, ChatTurn, type ChatTurnProps, Checkbox, type CheckboxProps, type Citation, Citations, type CitationsProps, Clamp, type ClampProps, ClockFace, type ClockFaceProps, CodeBlock, type CodeBlockProps, Collapsible, type CollapsibleProps, ComingSoon, type ComingSoonProps, type ContextUsage, type CreateVersionStoreOptions, CsiBadge, type CsiBadgeProps, CsiHero, type CsiHeroProps, CsiMeter, type CsiMeterProps, DEFAULT_PREFS, DEFAULT_STORAGE_KEY, DataTable, type DataTableColumn, type DataTableProps, DatePicker, type DatePickerProps, type DemoSessionControls, DemoSessionProvider, type DeviceSession, DiffBlock, type DiffBlockProps, Drawer, type DrawerProps, Dropzone, DropzoneKit, type DropzoneProps, ENTITY_ROW_METRIC_WIDTH, type EditorTrigger, EmptyState, type EmptyStateProps, type EndpointSpec, EntityRow, type EntityRowAction, type EntityRowContent, type EntityRowMetric, EntityRowMetrics, type EntityRowMetricsProps, type EntityRowProps, FILE_VIEWER_CSV_ROW_LIMIT, FILE_VIEWER_TEXT_LIMIT, FeatureGate, type FeatureGateProps, type FeatureStatus, FileBrowser, type FileBrowserFile, type FileBrowserFolder, type FileBrowserPermissions, type FileBrowserProps, FileChip, type FileChipProps, FileGrid, type FileGridProps, FileKit, FilePickButton, type FilePickButtonProps, type FileRejection, FileStrip, type FileStripProps, FileTile, type FileTileProps, type FileUploadHandler, FileViewer, type FileViewerProps, FilterBar, type FilterBarProps, type FilterField, type FilterFieldOption, type FilterFieldSelect, type FilterFieldText, Flag$1 as Flag, type FlagExplanation, type FlagProps, FlytedeskBrand, type FlytedeskBrandProps, FlytedeskMark, type FlytedeskMarkProps, FormatEta, Gate, type GateProps, IMPORTANCE_LEVELS, IconButton, type IconButtonProps, type ImportanceLevel, type ImportanceLevelId, ImportanceTag, type ImportanceTagProps, type ImportanceTokens, Input, type InputProps, type JobStatus, Json, KeyHint, type KeyHintProps, type ListEnvelope, LoadingRegion, type LoadingRegionProps, Markdown, MarkdownEditor, type MarkdownEditorHandle, type MarkdownEditorProps, MarkdownInline, type MarkdownProps, type MentionSource, Menu, MenuButton, type MenuButtonProps, type MenuItem, type MenuProps, MessageBody, type MessageBodyProps, type MessageGroup, Meter, type MeterProps, type MeterSegment, type MeterSegmentInput, MixGap, type MixGapProps, type MixGapRow, MockJobKit, type MockJobStatus, Modal, type ModalProps, ModeSwitch, type ModeSwitchProps, type Model, ModelControls, type ModelControlsProps, NumberInput, type NumberInputProps, POPOVER_BODY_MIN, type Packet, PacketCard, type PacketCardProps, type PacketSchema, type Pager, Pagination, type PaginationProps, PermissionDenied, type PermissionDeniedProps, type PermissionGroup, PermissionHint, type PermissionItem, type Placement, type PollOptions, Popover, type PopoverProps, type PreferenceCriterion, PreferenceMeter, type PreferenceMeterProps, type ProfileFieldDef, type ProfileFieldType, type ProfileNotificationDef, ProfilePage, type ProfilePageProps, ProgressBar, type ProgressBarProps, QueryKit, type QueuedTurn, QuotaRow, type QuotaRowProps, Radio, type RadioProps, RangeSlider, type RangeSliderProps, RelativeTime, type RelativeTimeProps, type RoadmapItem, type RoadmapResult, RoadmapTimeline, type RoadmapTimelineProps, type Role, RunActions, type RunActionsProps, type RunConfig, RuntimeKit, type RuntimeSummary, SaturationDistribution, type SaturationDistributionCampus, type SaturationDistributionProps, ScoreMeter, type ScoreMeterProps, ScreenHead, type ScreenHeadProps, SearchField, type SearchFieldProps, SegmentedControl, type SegmentedControlProps, SegmentedMeter, type SegmentedMeterProps, Select, type SelectOption, type SelectProps, type SendMessageResult, type ServerTable, type Session, type SessionContextValue, type Flag as SessionFlag, SessionKit, SessionProvider, type SessionProviderProps, type SessionRole, type SessionStats, type SessionUser, SidebarNav, type SidebarNavItem, type SidebarNavProps, type SignInContinueAs, SignInPage, type SignInPageProps, Skeleton, type SkeletonProps, SkeletonText, type SkeletonTextProps, type SlashCommand, Slider, type SliderProps, SortMenu, type SortMenuField, type SortMenuProps, type SpecModule, Spinner, type SpinnerProps, StatTile, type StatTileProps, type Step, StepList, type StepListProps, type StreamHandlers, type Suggestion, SurroundSound, type SurroundSoundProps, Switch, type SwitchProps, type TableQuery, Tabs, type TabsProps, Tag, type TagProps, TestModeBar, type TestModeBarProps, type TextScale, Textarea, type TextareaProps, type ThemeMode, ThinkingBlock, type ThinkingBlockProps, type ThreadSummary, TimePicker, type TimePickerProps, Toast, type ToastProps, Tooltip, type TooltipProps, Topbar, type TopbarProps, TranscriptKit, TransferList, type TransferListProps, type TransferListSide, type TransferListSideProps, type UsageLimit, UseFeatureStatus, type UseResponsiveRailOptions, type UseResponsiveRailResult, UseRuntimeMode, type UseServerTableOptions, type User, VIRTUAL_LIST_BUFFER_ROWS, VIRTUAL_LIST_ROW_GAP, type VersionRecord, type VersionStore, VirtualList, type VirtualListProps, type VirtualLoadedBand, type VirtualWindow, type VoiceHandler, acceptMatches, anyOfFilter, applyPrefs, channelWeightOf, computeNeedMore, computeVirtualWindow, createLocalStorageAppearanceStore, createVersionStore, eqFilter, extensionOf, extractClipboardFiles, filterFiles, formatAbsolute, formatBytes, formatClock, formatDocumentTitle, formatDuration, formatEta, formatRelative, groupMessages, hasModifier, iconForMime, importanceLevel, importanceTokens, installFlytedeskFavicon, isImage, isSystemMessage, jobBucket, languageLabel, loadPrefs, markdownToText, meterFormats, modifierLabel, parseDelimited, pastedTextName, pluralizeUnit, preferenceScore, preferenceSegments, rangeFilter, resolveTheme, revokeAttachment, savePrefs, toAttachment, tokenize, useAppearancePrefs, useChatEngine, useDocumentTitle, useFeatureStatus, useFocusTrap, usePopoverPosition, useResponsiveRail, useRuntimeMode, useServerTable, useSessionContext, useStagedFiles, visibleMessages };