@mithrl/design-system 0.2.0 → 0.4.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 (40) hide show
  1. package/dist/components/approval-card/ApprovalCard.d.ts +70 -0
  2. package/dist/components/button/Button.d.ts +4 -0
  3. package/dist/components/code-block/CodeBlock.d.ts +64 -0
  4. package/dist/components/command-search/CommandSearch.d.ts +57 -0
  5. package/dist/components/composer/ComposerAttachmentView.d.ts +48 -0
  6. package/dist/components/context-cards/ContextCards.d.ts +53 -0
  7. package/dist/components/disclosure/Disclosure.d.ts +38 -0
  8. package/dist/components/explorer/Explorer.d.ts +99 -0
  9. package/dist/components/field-message/FieldMessage.d.ts +12 -0
  10. package/dist/components/filter-table/FilterTable.d.ts +61 -0
  11. package/dist/components/flap-text/FlapText.d.ts +68 -0
  12. package/dist/components/flowchart/Flowchart.d.ts +140 -0
  13. package/dist/components/global-app-bar/GlobalAppBar.d.ts +14 -4
  14. package/dist/components/icon-swap/IconSwap.d.ts +30 -0
  15. package/dist/components/insight-cards/InsightCards.d.ts +97 -0
  16. package/dist/components/navigation-item/NavigationItem.d.ts +2 -0
  17. package/dist/components/number-flow/NumberFlow.d.ts +93 -0
  18. package/dist/components/panel-tabs/PanelTabs.d.ts +2 -0
  19. package/dist/components/progress-indicator/ProgressIndicator.d.ts +9 -1
  20. package/dist/components/prompt-bar/PromptBar.d.ts +103 -0
  21. package/dist/components/recommendation-card/RecommendationCard.d.ts +77 -0
  22. package/dist/components/records-table/RecordsTable.d.ts +87 -0
  23. package/dist/components/resizable-panels/ResizablePanels.d.ts +38 -0
  24. package/dist/components/secondary-panel/SecondaryPanel.d.ts +69 -0
  25. package/dist/components/selection-actions/SelectionActions.d.ts +72 -0
  26. package/dist/components/skeleton-reveal/SkeletonReveal.d.ts +33 -0
  27. package/dist/components/status-orb/StatusOrb.d.ts +51 -0
  28. package/dist/components/streaming-text/StreamingText.d.ts +85 -0
  29. package/dist/components/task-rows/TaskRows.d.ts +77 -0
  30. package/dist/components/upload-queue/UploadQueue.d.ts +10 -0
  31. package/dist/components/workspace-navigation/WorkspaceNavigation.d.ts +22 -1
  32. package/dist/index.d.ts +52 -2
  33. package/dist/index.js +5693 -1787
  34. package/dist/internal/useStaggerBatch.d.ts +22 -0
  35. package/dist/patterns/notifications/Notifications.d.ts +159 -0
  36. package/dist/patterns/workspace-app-shell/WorkspaceAppShell.d.ts +93 -4
  37. package/dist/patterns/workspace-app-shell/WorkspaceNewQuestionDialog.d.ts +24 -0
  38. package/dist/patterns/workspace-app-shell/WorkspaceQuestionSurface.d.ts +49 -0
  39. package/dist/styles.css +1 -1
  40. package/package.json +4 -2
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Highest stagger step any one batch may reach.
3
+ *
4
+ * A stagger only helps while the eye can still count the arrivals. Past a
5
+ * handful of steps it stops reading as "several things arrived" and starts
6
+ * reading as "this list is slow", so every item beyond the cap shares the last
7
+ * delay instead of extending the tail. Twelve rows land within
8
+ * `--motion-stagger-tight * 5` of each other, not half a second apart.
9
+ */
10
+ export declare const STAGGER_BATCH_MAX_STEPS = 5;
11
+ /**
12
+ * Returns the stagger step for each id that arrived in *this* batch.
13
+ *
14
+ * Only items that appeared together are staggered. An item added on its own
15
+ * later gets step 0 and enters immediately, because a lone arrival has no
16
+ * group for the eye to order — delaying it would be latency with nothing to
17
+ * show for it.
18
+ *
19
+ * The first render counts as a batch, so a list that mounts already populated
20
+ * still staggers.
21
+ */
22
+ export declare function useStaggerBatch(ids: readonly string[], maxSteps?: number): ReadonlyMap<string, number>;
@@ -0,0 +1,159 @@
1
+ import { Toast } from "@base-ui/react/toast";
2
+ import { type LucideIcon } from "lucide-react";
3
+ import { type ComponentPropsWithoutRef, type HTMLAttributes, type ReactNode } from "react";
4
+ import { DialogPortal } from "../../components/dialog/Dialog";
5
+ import { type IconButtonProps } from "../../components/icon-button/IconButton";
6
+
7
+ export type NotificationTone = "success" | "failure" | "information" | "neutral" | "needs-you";
8
+ export type NotificationFilter = "all" | "needs-you";
9
+ export type NotificationItemPreviewState = "default" | "hover" | "focus";
10
+ export type NotificationRecord = {
11
+ id: string;
12
+ title: string;
13
+ metadata: string;
14
+ tone: NotificationTone;
15
+ glyph?: LucideIcon;
16
+ unread: boolean;
17
+ };
18
+ export type NotificationStatusIconProps = Omit<HTMLAttributes<HTMLSpanElement>, "children"> & {
19
+ tone: NotificationTone;
20
+ glyph?: LucideIcon;
21
+ };
22
+ /** Decorative semantic signal. The notification title carries the meaning. */
23
+ export declare const NotificationStatusIcon: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLSpanElement>, "children"> & {
24
+ tone: NotificationTone;
25
+ glyph?: LucideIcon;
26
+ } & import("react").RefAttributes<HTMLSpanElement>>;
27
+ export type NotificationItemProps = Omit<HTMLAttributes<HTMLLIElement>, "children" | "onSelect"> & {
28
+ notification: NotificationRecord;
29
+ onSelect?: (notification: NotificationRecord) => void;
30
+ onMarkRead?: (notification: NotificationRecord) => void;
31
+ onArchive?: (notification: NotificationRecord) => void;
32
+ previewState?: NotificationItemPreviewState;
33
+ };
34
+ /** Controlled inbox row. It never mutates read or archive state internally. */
35
+ export declare const NotificationItem: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLLIElement>, "children" | "onSelect"> & {
36
+ notification: NotificationRecord;
37
+ onSelect?: (notification: NotificationRecord) => void;
38
+ onMarkRead?: (notification: NotificationRecord) => void;
39
+ onArchive?: (notification: NotificationRecord) => void;
40
+ previewState?: NotificationItemPreviewState;
41
+ } & import("react").RefAttributes<HTMLLIElement>>;
42
+ export type NotificationTriggerProps = Omit<IconButtonProps, "icon" | "aria-label" | "children"> & {
43
+ unreadCount?: number;
44
+ label?: string;
45
+ };
46
+ /** Bell trigger with an accessible unread count and DS Tooltip. */
47
+ export declare const NotificationTrigger: import("react").ForwardRefExoticComponent<Omit<IconButtonProps, "aria-label" | "children" | "icon"> & {
48
+ unreadCount?: number;
49
+ label?: string;
50
+ } & import("react").RefAttributes<HTMLButtonElement>>;
51
+ export type NotificationCenterProps = Omit<HTMLAttributes<HTMLDivElement>, "children" | "onSelect"> & {
52
+ notifications: readonly NotificationRecord[];
53
+ filter?: NotificationFilter;
54
+ defaultFilter?: NotificationFilter;
55
+ onFilterChange?: (filter: NotificationFilter) => void;
56
+ onItemSelect?: (notification: NotificationRecord) => void;
57
+ onMarkRead?: (notification: NotificationRecord) => void;
58
+ onArchive?: (notification: NotificationRecord) => void;
59
+ onMarkAllRead?: () => void;
60
+ onClearRead?: () => void;
61
+ onOpenSettings?: () => void;
62
+ onClose?: () => void;
63
+ closeAction?: ReactNode;
64
+ emptyContent?: ReactNode;
65
+ titleId?: string;
66
+ };
67
+ /** Global, controlled inbox surface. */
68
+ export declare const NotificationCenter: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLDivElement>, "children" | "onSelect"> & {
69
+ notifications: readonly NotificationRecord[];
70
+ filter?: NotificationFilter;
71
+ defaultFilter?: NotificationFilter;
72
+ onFilterChange?: (filter: NotificationFilter) => void;
73
+ onItemSelect?: (notification: NotificationRecord) => void;
74
+ onMarkRead?: (notification: NotificationRecord) => void;
75
+ onArchive?: (notification: NotificationRecord) => void;
76
+ onMarkAllRead?: () => void;
77
+ onClearRead?: () => void;
78
+ onOpenSettings?: () => void;
79
+ onClose?: () => void;
80
+ closeAction?: ReactNode;
81
+ emptyContent?: ReactNode;
82
+ titleId?: string;
83
+ } & import("react").RefAttributes<HTMLDivElement>>;
84
+ export type NotificationsDrawerProps = {
85
+ notifications: readonly NotificationRecord[];
86
+ unreadCount?: number;
87
+ open?: boolean;
88
+ defaultOpen?: boolean;
89
+ onOpenChange?: (open: boolean) => void;
90
+ dir?: "ltr" | "rtl";
91
+ portalContainer?: ComponentPropsWithoutRef<typeof DialogPortal>["container"];
92
+ triggerProps?: Omit<NotificationTriggerProps, "unreadCount">;
93
+ centerProps?: Omit<NotificationCenterProps, "notifications" | "closeAction" | "titleId">;
94
+ };
95
+ /** Trigger + modal floating drawer behavior for the global inbox. */
96
+ export declare function NotificationsDrawer({ notifications, unreadCount, open, defaultOpen, onOpenChange, dir, portalContainer, triggerProps, centerProps, }: NotificationsDrawerProps): import("react/jsx-runtime").JSX.Element;
97
+ export type NotificationToastProps = Omit<HTMLAttributes<HTMLDivElement>, "title" | "children"> & {
98
+ tone: NotificationTone;
99
+ glyph?: LucideIcon;
100
+ heading: ReactNode;
101
+ description?: ReactNode;
102
+ action?: ReactNode;
103
+ onDismiss?: () => void;
104
+ dismissLabel?: string;
105
+ closeAction?: ReactNode;
106
+ };
107
+ /** Visual toast surface. Lifecycle and announcements belong to the provider. */
108
+ export declare const NotificationToast: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLDivElement>, "children" | "title"> & {
109
+ tone: NotificationTone;
110
+ glyph?: LucideIcon;
111
+ heading: ReactNode;
112
+ description?: ReactNode;
113
+ action?: ReactNode;
114
+ onDismiss?: () => void;
115
+ dismissLabel?: string;
116
+ closeAction?: ReactNode;
117
+ } & import("react").RefAttributes<HTMLDivElement>>;
118
+ export type NotificationToastData = {
119
+ tone: NotificationTone;
120
+ glyph?: LucideIcon;
121
+ dismissLabel?: string;
122
+ actionAriaLabel?: string;
123
+ };
124
+ export type NotificationToastOptions = {
125
+ id?: string;
126
+ tone: NotificationTone;
127
+ glyph?: LucideIcon;
128
+ dismissLabel?: string;
129
+ actionAriaLabel?: string;
130
+ title: ReactNode;
131
+ description?: ReactNode;
132
+ actionLabel?: ReactNode;
133
+ onAction?: () => void;
134
+ timeout?: number;
135
+ priority?: "low" | "high";
136
+ onClose?: () => void;
137
+ onRemove?: () => void;
138
+ };
139
+ export type NotificationToastProviderProps = {
140
+ children: ReactNode;
141
+ timeout?: number;
142
+ limit?: number;
143
+ toastManager?: ComponentPropsWithoutRef<typeof Toast.Provider>["toastManager"];
144
+ };
145
+ export declare function NotificationToastProvider({ children, timeout, limit, toastManager, }: NotificationToastProviderProps): import("react/jsx-runtime").JSX.Element;
146
+ export declare function useNotificationToast(): {
147
+ add: ({ tone, glyph, dismissLabel, actionAriaLabel, title, description, actionLabel, onAction, timeout, priority, ...options }: NotificationToastOptions) => string;
148
+ close: (toastId?: string) => void;
149
+ update: <T extends NotificationToastData = NotificationToastData>(toastId: string, options: import("@base-ui/react").ToastManagerUpdateOptions<T>) => void;
150
+ toasts: import("@base-ui/react").ToastObject<NotificationToastData>[];
151
+ };
152
+ export type NotificationToastViewportProps = Omit<ComponentPropsWithoutRef<typeof Toast.Viewport>, "children" | "className"> & {
153
+ portalContainer?: ComponentPropsWithoutRef<typeof Toast.Portal>["container"];
154
+ className?: string;
155
+ };
156
+ export declare const NotificationToastViewport: import("react").ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react").ToastViewportProps, "ref"> & import("react").RefAttributes<HTMLDivElement>, "ref">, "children" | "className"> & {
157
+ portalContainer?: ComponentPropsWithoutRef<typeof Toast.Portal>["container"];
158
+ className?: string;
159
+ } & import("react").RefAttributes<HTMLDivElement>>;
@@ -1,21 +1,39 @@
1
1
  import { type HTMLAttributes, type ReactNode } from "react";
2
2
  import { type GlobalAppBarProjectSelector, type GlobalAppBarProps } from "../../components/global-app-bar/GlobalAppBar";
3
3
  import { type ResizablePanelGroupProps, type ResizablePanelMinimum } from "../../components/resizable-panels/ResizablePanels";
4
- import { type WorkspaceNavigationProps } from "../../components/workspace-navigation/WorkspaceNavigation";
4
+ import { type WorkspaceNavigationPresentation, type WorkspaceNavigationProps } from "../../components/workspace-navigation/WorkspaceNavigation";
5
5
  import type { ThemeMode } from "../../components/switch/Switch";
6
6
 
7
7
  export type WorkspaceAppShellLayout = "expanded" | "condensed" | "single";
8
8
  type NativeWorkspaceAppShellProps = Omit<HTMLAttributes<HTMLDivElement>, "children">;
9
9
  type WorkspaceAppBarConfiguration = Omit<GlobalAppBarProps, "defaultTheme" | "onThemeChange" | "theme" | "workspaceControls">;
10
- type WorkspaceNavigationConfiguration = Omit<WorkspaceNavigationProps, "presentation">;
10
+ export type WorkspaceNavigationConfiguration = Omit<WorkspaceNavigationProps, "presentation">;
11
11
  type WorkspaceProjectSelectorConfiguration = Omit<GlobalAppBarProjectSelector, "presentation">;
12
+ export type WorkspaceAppShellNavigationRenderContext = {
13
+ /** Active structural layout selected from the shell's rendered width. */
14
+ layout: WorkspaceAppShellLayout;
15
+ /** Inline on persistent layouts and Overlay in the single-region layout. */
16
+ presentation: WorkspaceNavigationPresentation;
17
+ /** Current controlled or uncontrolled Navigation visibility. */
18
+ open: boolean;
19
+ /** Stable App Bar toggle identity for focus return from compact overlays. */
20
+ navigationToggleId: string;
21
+ /** Requests dismissal after safely relocating focus through the shell. */
22
+ requestClose: () => void;
23
+ };
24
+ export type WorkspaceAppShellNavigationRenderer = (context: WorkspaceAppShellNavigationRenderContext) => ReactNode;
12
25
  export type WorkspaceAppShellProps = NativeWorkspaceAppShellProps & {
13
26
  /** Global App Bar account, brand, and native attributes. */
14
27
  appBar: WorkspaceAppBarConfiguration;
15
28
  /** Project context rendered by the approved Global App Bar selector. */
16
29
  projectSelector: WorkspaceProjectSelectorConfiguration;
17
30
  /** Workspace Navigation content; App Shell selects Inline or Overlay. */
18
- navigation: WorkspaceNavigationConfiguration;
31
+ navigation?: WorkspaceNavigationConfiguration;
32
+ /**
33
+ * Product-navigation adapter for domain-specific status and nested artifacts.
34
+ * Use instead of `navigation`; the shell still owns visibility and focus.
35
+ */
36
+ renderNavigation?: WorkspaceAppShellNavigationRenderer;
19
37
  /** Product-owned Primary Panel content. */
20
38
  primary: ReactNode;
21
39
  /** Product-owned Secondary Panel content. */
@@ -46,12 +64,45 @@ export type WorkspaceAppShellProps = NativeWorkspaceAppShellProps & {
46
64
  onSplitChange?: ResizablePanelGroupProps["onValueChange"];
47
65
  /** Reports the final pointer value or each committed keyboard step. */
48
66
  onSplitCommit?: ResizablePanelGroupProps["onValueCommit"];
67
+ /** Controlled Secondary width in pixels. Use for product `rightWidth`. */
68
+ secondaryWidth?: number;
69
+ /** Initial Secondary width for uncontrolled pixel-based persistence. */
70
+ defaultSecondaryWidth?: number;
71
+ /** Reports every resize in Secondary pixels. */
72
+ onSecondaryWidthChange?: ResizablePanelGroupProps["onSecondarySizeChange"];
73
+ /** Reports the final pointer value or each keyboard step in pixels. */
74
+ onSecondaryWidthCommit?: ResizablePanelGroupProps["onSecondarySizeCommit"];
49
75
  /** Primary minimum-size policy. Defaults to Standard. */
50
76
  primaryMinSize?: ResizablePanelMinimum;
51
77
  /** Secondary minimum in pixels. Defaults to 280px. */
52
78
  secondaryMinSize?: number;
53
79
  /** Accessible splitter label when the Primary region has no visible label. */
54
80
  resizeLabel?: string;
81
+ /** Controlled Navigation width in pixels on the expanded layout. */
82
+ navigationWidth?: number;
83
+ /** Initial Navigation width for uncontrolled pixel-based persistence. */
84
+ defaultNavigationWidth?: number;
85
+ /** Reports every pointer or keyboard Navigation resize in pixels. */
86
+ onNavigationWidthChange?: (width: number) => void;
87
+ /** Reports the final pointer width or each committed keyboard step. */
88
+ onNavigationWidthCommit?: (width: number) => void;
89
+ /** Navigation minimum width in pixels. Defaults to 200px. */
90
+ navigationMinWidth?: number;
91
+ /** Navigation maximum width in pixels. Defaults to 320px. */
92
+ navigationMaxWidth?: number;
93
+ /** Accessible label for the Navigation splitter. */
94
+ navigationResizeLabel?: string;
95
+ /**
96
+ * Share of a panel minimum the pointer must cross before a drag dismisses
97
+ * that panel. Defaults to 0.5, i.e. half the minimum width.
98
+ */
99
+ dragDismissThreshold?: number;
100
+ /**
101
+ * Enables the transient left-edge hover peek that reveals Navigation as a
102
+ * floating overlay while it is closed on a persistent layout. The peek never
103
+ * changes `navigationOpen`. Defaults to enabled.
104
+ */
105
+ navigationPeek?: boolean;
55
106
  };
56
107
  /**
57
108
  * Complete Workspace layout pattern. It composes the approved Global App Bar,
@@ -64,7 +115,12 @@ export declare const WorkspaceAppShell: import("react").ForwardRefExoticComponen
64
115
  /** Project context rendered by the approved Global App Bar selector. */
65
116
  projectSelector: WorkspaceProjectSelectorConfiguration;
66
117
  /** Workspace Navigation content; App Shell selects Inline or Overlay. */
67
- navigation: WorkspaceNavigationConfiguration;
118
+ navigation?: WorkspaceNavigationConfiguration;
119
+ /**
120
+ * Product-navigation adapter for domain-specific status and nested artifacts.
121
+ * Use instead of `navigation`; the shell still owns visibility and focus.
122
+ */
123
+ renderNavigation?: WorkspaceAppShellNavigationRenderer;
68
124
  /** Product-owned Primary Panel content. */
69
125
  primary: ReactNode;
70
126
  /** Product-owned Secondary Panel content. */
@@ -95,11 +151,44 @@ export declare const WorkspaceAppShell: import("react").ForwardRefExoticComponen
95
151
  onSplitChange?: ResizablePanelGroupProps["onValueChange"];
96
152
  /** Reports the final pointer value or each committed keyboard step. */
97
153
  onSplitCommit?: ResizablePanelGroupProps["onValueCommit"];
154
+ /** Controlled Secondary width in pixels. Use for product `rightWidth`. */
155
+ secondaryWidth?: number;
156
+ /** Initial Secondary width for uncontrolled pixel-based persistence. */
157
+ defaultSecondaryWidth?: number;
158
+ /** Reports every resize in Secondary pixels. */
159
+ onSecondaryWidthChange?: ResizablePanelGroupProps["onSecondarySizeChange"];
160
+ /** Reports the final pointer value or each keyboard step in pixels. */
161
+ onSecondaryWidthCommit?: ResizablePanelGroupProps["onSecondarySizeCommit"];
98
162
  /** Primary minimum-size policy. Defaults to Standard. */
99
163
  primaryMinSize?: ResizablePanelMinimum;
100
164
  /** Secondary minimum in pixels. Defaults to 280px. */
101
165
  secondaryMinSize?: number;
102
166
  /** Accessible splitter label when the Primary region has no visible label. */
103
167
  resizeLabel?: string;
168
+ /** Controlled Navigation width in pixels on the expanded layout. */
169
+ navigationWidth?: number;
170
+ /** Initial Navigation width for uncontrolled pixel-based persistence. */
171
+ defaultNavigationWidth?: number;
172
+ /** Reports every pointer or keyboard Navigation resize in pixels. */
173
+ onNavigationWidthChange?: (width: number) => void;
174
+ /** Reports the final pointer width or each committed keyboard step. */
175
+ onNavigationWidthCommit?: (width: number) => void;
176
+ /** Navigation minimum width in pixels. Defaults to 200px. */
177
+ navigationMinWidth?: number;
178
+ /** Navigation maximum width in pixels. Defaults to 320px. */
179
+ navigationMaxWidth?: number;
180
+ /** Accessible label for the Navigation splitter. */
181
+ navigationResizeLabel?: string;
182
+ /**
183
+ * Share of a panel minimum the pointer must cross before a drag dismisses
184
+ * that panel. Defaults to 0.5, i.e. half the minimum width.
185
+ */
186
+ dragDismissThreshold?: number;
187
+ /**
188
+ * Enables the transient left-edge hover peek that reveals Navigation as a
189
+ * floating overlay while it is closed on a persistent layout. The peek never
190
+ * changes `navigationOpen`. Defaults to enabled.
191
+ */
192
+ navigationPeek?: boolean;
104
193
  } & import("react").RefAttributes<HTMLDivElement>>;
105
194
  export {};
@@ -0,0 +1,24 @@
1
+ import { type ReactNode } from "react";
2
+ import { type DialogContentProps } from "../../components/dialog/Dialog";
3
+
4
+ export type WorkspaceNewQuestionDraft = {
5
+ question: string;
6
+ };
7
+ export type WorkspaceNewQuestionDialogProps = {
8
+ open?: boolean;
9
+ defaultOpen?: boolean;
10
+ onOpenChange?: (open: boolean) => void;
11
+ /** Associates the controlled Dialog with the Navigation action. */
12
+ triggerId?: string;
13
+ initialQuestion?: string;
14
+ onStart: (draft: WorkspaceNewQuestionDraft) => void | Promise<void>;
15
+ submitting?: boolean;
16
+ submitError?: ReactNode;
17
+ portalContainer?: DialogContentProps["portalContainer"];
18
+ className?: string;
19
+ };
20
+ /**
21
+ * Controlled Workspace entry pattern. Session creation, routing, persistence,
22
+ * authorization, and analytics remain owned by the product.
23
+ */
24
+ export declare function WorkspaceNewQuestionDialog({ open, defaultOpen, onOpenChange, triggerId, initialQuestion, onStart, submitting, submitError, portalContainer, className, }: WorkspaceNewQuestionDialogProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,49 @@
1
+ import { type HTMLAttributes, type ReactNode } from "react";
2
+
3
+ export type WorkspaceQuestionSurfacePanel = "primary" | "secondary";
4
+ export type WorkspaceQuestionSurfaceScroll = "consumer" | "surface";
5
+ type NativeWorkspaceQuestionSurfaceProps = Omit<HTMLAttributes<HTMLElement>, "children" | "title">;
6
+ export type WorkspaceQuestionSurfaceProps = NativeWorkspaceQuestionSurfaceProps & {
7
+ /** Panel that owns this mounted Question. Ownership remains product state. */
8
+ panel: WorkspaceQuestionSurfacePanel;
9
+ /** Full Question name used by the Primary header and region label. */
10
+ questionTitle: string;
11
+ /** Product-owned Question content inside the approved panel containment. */
12
+ children: ReactNode;
13
+ /** Product-owned Composer or ComposerViewTransition for this session. */
14
+ composer: ReactNode;
15
+ /**
16
+ * Scroll owner. Defaults to the consumer so existing Chat viewport logic,
17
+ * streaming follow, and minimaps remain unchanged.
18
+ */
19
+ contentScroll?: WorkspaceQuestionSurfaceScroll;
20
+ /** Product actions shown beside the Primary Question title. */
21
+ headerActions?: ReactNode;
22
+ /** Shows the contextual header. Defaults to true only in Primary. */
23
+ showHeader?: boolean;
24
+ };
25
+ /**
26
+ * Session-bound Question layout for either Workspace owner panel. The product
27
+ * supplies Chat and Composer behavior; this pattern owns the approved header,
28
+ * scroll containment, bottom anchoring, and adaptive fade.
29
+ */
30
+ export declare const WorkspaceQuestionSurface: import("react").ForwardRefExoticComponent<NativeWorkspaceQuestionSurfaceProps & {
31
+ /** Panel that owns this mounted Question. Ownership remains product state. */
32
+ panel: WorkspaceQuestionSurfacePanel;
33
+ /** Full Question name used by the Primary header and region label. */
34
+ questionTitle: string;
35
+ /** Product-owned Question content inside the approved panel containment. */
36
+ children: ReactNode;
37
+ /** Product-owned Composer or ComposerViewTransition for this session. */
38
+ composer: ReactNode;
39
+ /**
40
+ * Scroll owner. Defaults to the consumer so existing Chat viewport logic,
41
+ * streaming follow, and minimaps remain unchanged.
42
+ */
43
+ contentScroll?: WorkspaceQuestionSurfaceScroll;
44
+ /** Product actions shown beside the Primary Question title. */
45
+ headerActions?: ReactNode;
46
+ /** Shows the contextual header. Defaults to true only in Primary. */
47
+ showHeader?: boolean;
48
+ } & import("react").RefAttributes<HTMLElement>>;
49
+ export {};