@assure-one/design-system 1.39.0 → 1.40.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 (54) hide show
  1. package/README.md +48 -28
  2. package/codemods/README.md +24 -7
  3. package/codemods/lib/registry.mjs +27 -0
  4. package/codemods/lib/runner.mjs +8 -3
  5. package/codemods/run.mjs +27 -5
  6. package/codemods/transforms/cm-15-dom-selectors.mjs +16 -9
  7. package/dist/brand-scope-BOHId6BY.d.ts +58 -0
  8. package/dist/{brand-theme-B6rem2II.d.ts → brand-theme-ZYM867Jz.d.ts} +1 -1
  9. package/dist/chunk-2MKLYYIY.js +3754 -0
  10. package/dist/chunk-2MKLYYIY.js.map +1 -0
  11. package/dist/chunk-6S2R2VWN.js +5527 -0
  12. package/dist/chunk-6S2R2VWN.js.map +1 -0
  13. package/dist/chunk-7U3ADR2Q.js +4336 -0
  14. package/dist/chunk-7U3ADR2Q.js.map +1 -0
  15. package/dist/chunk-CPOGSNXS.js +389 -0
  16. package/dist/chunk-CPOGSNXS.js.map +1 -0
  17. package/dist/chunk-EUHGZA6Q.js +313 -0
  18. package/dist/chunk-EUHGZA6Q.js.map +1 -0
  19. package/dist/chunk-KQBYTTAN.js +1829 -0
  20. package/dist/chunk-KQBYTTAN.js.map +1 -0
  21. package/dist/chunk-X76J4QSJ.js +164 -0
  22. package/dist/chunk-X76J4QSJ.js.map +1 -0
  23. package/dist/css/components.css +1 -1
  24. package/dist/css/legacy-aliases.css +2 -0
  25. package/dist/css/tailwind.css +2 -0
  26. package/dist/css/tokens.css +2 -0
  27. package/dist/data-table-view-ep8al7P9.d.ts +1132 -0
  28. package/dist/{design-system-provider-BM_F1C13.d.ts → design-system-provider-CfD2g2lY.d.ts} +11 -12
  29. package/dist/icons/index.d.ts +1 -1
  30. package/dist/icons/index.js +2 -1835
  31. package/dist/icons/index.js.map +1 -1
  32. package/dist/index.d.ts +373 -388
  33. package/dist/index.js +8688 -24271
  34. package/dist/index.js.map +1 -1
  35. package/dist/legacy/index.d.ts +1462 -7
  36. package/dist/legacy/index.js +5 -1
  37. package/dist/legacy/index.js.map +1 -1
  38. package/dist/next/index.d.ts +2 -2
  39. package/dist/styles.css +2 -1
  40. package/dist/suite/index.d.ts +989 -4
  41. package/dist/suite/index.js +6 -1
  42. package/dist/suite/index.js.map +1 -1
  43. package/dist/testing/index.cjs +3 -2
  44. package/dist/testing/index.js +3 -2
  45. package/dist/tokens/index.d.ts +1 -1
  46. package/dist/tokens/index.js +3 -856
  47. package/dist/tokens/index.js.map +1 -1
  48. package/dist/{types-k_kjwipx.d.ts → types-Coqw8iaS.d.ts} +28 -1
  49. package/docs/components.md +54 -54
  50. package/docs/components.registry.json +6 -6
  51. package/docs/for-ai-agents.md +12 -6
  52. package/package.json +5 -3
  53. package/dist/index-BAAuIQqP.d.ts +0 -2579
  54. package/dist/index-DxBjmBBp.d.ts +0 -1038
@@ -1,9 +1,1464 @@
1
- export { d as AIReceiptPanel, e as AIReceiptPanelProps, f as AIReceiptResult, g as AiDraftCard, h as AiDraftCardProps, i as AiDraftState, k as Assignee, l as AttentionItem, m as AttentionItemProps, n as AttentionUrgency, w as Blockquote, x as BottomNav, y as BottomNavProps, z as BottomNavTab, G as CategoryDivider, H as CategoryDividerProps, J as CategoryTag, K as CategoryTagProps, L as CategoryTone, M as ChannelTabItem, O as ChannelTabs, Q as ChannelTabsProps, R as ChannelTone, W as ClientRailGroupHeader, X as ClientRailGroupHeaderProps, Y as ClientRailItem, Z as ClientRailItemProps, a2 as Dash, a3 as DashGrid, a4 as DashGridProps, a5 as DashWidget, aE as DocumentChecklist, aF as DocumentChecklistFile, aG as DocumentChecklistItem, aH as DocumentChecklistProps, aI as DocumentChecklistStatus, aJ as DocumentFileCard, aK as DocumentFileCardProps, aL as DocumentFileLine, aM as DocumentFileLineProps, aN as DocumentFileRow, aO as DocumentFileRowProps, aP as DocumentItemState, aQ as DocumentRequestActivityKind, aR as DocumentRequestAssigneeOption, aS as DocumentRequestCard, aT as DocumentRequestCardProps, aU as DocumentRequestDetail, aV as DocumentRequestDetailActivityEvent, aW as DocumentRequestDetailComment, aX as DocumentRequestDetailDoc, aY as DocumentRequestDetailProps, aZ as DocumentRequestDetailTab, a_ as DocumentRequestField, a$ as DocumentRequestFieldProps, b0 as DocumentRequestItemSummary, b1 as DocumentRequestRequestedItem, b2 as DocumentRequestReviewStatusOption, b3 as DocumentRequestTone, b4 as DocumentRequestUpload, b5 as DocumentRequestUploadFile, b6 as DocumentRequestUploadProps, b7 as DocumentSource, b8 as DocumentSourceFilter, b9 as DocumentSourceFilterProps, ba as DocumentSourceFilterValue, bb as DocumentSourceTag, bc as DocumentSourceTagProps, bd as DocumentsWorkspaceLayout, be as DocumentsWorkspaceLayoutProps, bg as EmailMessageCard, bh as EmailMessageCardProps, bj as EngagementCard, bk as EngagementCardProps, bl as EngagementTimeline, bm as EngagementTimelineProps, bn as EngagementTimelineStep, bo as EngagementTimelineStepProps, bx as IntentBadge, by as IntentBadgeProps, bz as IntentTone, bD as MissingDocumentItem, bE as MissingDocumentsPanel, bF as MissingDocumentsPanelProps, bG as MoneyCell, bH as NewMenu, bI as NewMenuAction, bJ as NewMenuGroup, bK as NewMenuProps, bM as PillStatus, bR as Section, bS as SectionHead, bT as SectionHeader, b_ as SignatureEditor, b$ as SignatureEditorProps, c2 as StagePill, c3 as Stat, c5 as StatusPill, c6 as StatusPillProps, c7 as SuggestionPills, c8 as SuggestionPillsProps, cy as TagsCell, cz as TeamMemberSelect, cI as TimeLogger, cJ as TimeLoggerActions, cK as TimeLoggerActionsProps, cL as TimeLoggerBillable, cM as TimeLoggerBillableProps, cN as TimeLoggerContextRow, cO as TimeLoggerContextRowProps, cP as TimeLoggerEntry, cQ as TimeLoggerEntryList, cR as TimeLoggerEntryListProps, cS as TimeLoggerEntryProps, cT as TimeLoggerField, cU as TimeLoggerFieldProps, cV as TimeLoggerFooter, cW as TimeLoggerFooterProps, cX as TimeLoggerHeader, cY as TimeLoggerHeaderProps, cZ as TimeLoggerNotes, c_ as TimeLoggerNotesProps, c$ as TimeLoggerPhase, d0 as TimeLoggerProps, d1 as TimeLoggerTier, d2 as TimeLoggerTimer, d3 as TimeLoggerTimerProps, d4 as TimelineState, d7 as UseStopwatchReturn, d9 as formatClock, da as formatCurrency, db as formatDuration, dc as parseDuration, dg as useStopwatch } from '../index-BAAuIQqP.js';
2
- import 'react/jsx-runtime';
3
- import 'react';
4
- import 'class-variance-authority/types';
5
- import 'class-variance-authority';
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React$1 from 'react';
3
+ import { ReactNode } from 'react';
4
+ import { B as BadgeProps, F as FileKind, S as ServiceTone } from '../data-table-view-ep8al7P9.js';
5
+ export { A as Assignee, D as Dash, M as MoneyCell, a as StagePill, T as TagsCell } from '../data-table-view-ep8al7P9.js';
6
+ import * as class_variance_authority_types from 'class-variance-authority/types';
7
+ import { VariantProps } from 'class-variance-authority';
6
8
  import '../vocab-DornLJbW.js';
7
9
  import '../system-DfJIVBlJ.js';
8
- import '../types-k_kjwipx.js';
9
- import '../brand-theme-B6rem2II.js';
10
+ import '../types-Coqw8iaS.js';
11
+ import '../brand-theme-ZYM867Jz.js';
12
+
13
+ /**
14
+ * Blockquote — semantic quote with optional attribution. Uses `font-display`
15
+ * (Inter) at a comfortable reading scale; smart quotes are wrapped automatically.
16
+ */
17
+ interface BlockquoteProps extends React.BlockquoteHTMLAttributes<HTMLQuoteElement> {
18
+ author?: string;
19
+ role?: string;
20
+ }
21
+ declare const Blockquote: React$1.ForwardRefExoticComponent<BlockquoteProps & React$1.RefAttributes<HTMLQuoteElement>>;
22
+
23
+ /**
24
+ * CategoryDivider — THE category separator: a tone-tinted category pill, a
25
+ * flex-1 hairline rule, and an optional trailing count chip. Used to group a
26
+ * run of feed items / cards by service line. Per the ONE-brand rule, this tag
27
+ * is the *only* place per-service color is allowed — everything else stays on
28
+ * the single brand. Pure presentational.
29
+ *
30
+ * Tones map to the suite tints:
31
+ * brand → --color-brand-pro · audit → --color-brand-audit ·
32
+ * books → --color-brand-books · tax → --color-brand-tax ·
33
+ * neutral → --color-fg-3
34
+ */
35
+ declare const categoryTagVariants: (props?: ({
36
+ tone?: "brand" | "neutral" | "audit" | "books" | "tax" | null | undefined;
37
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
38
+ type CategoryTone = NonNullable<VariantProps<typeof categoryTagVariants>["tone"]>;
39
+ interface CategoryTagProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof categoryTagVariants> {
40
+ /** Tag label text. */
41
+ label: string;
42
+ /** Optional leading icon rendered inside the pill. */
43
+ icon?: React.ReactNode;
44
+ }
45
+ /**
46
+ * CategoryTag — the standalone tone-tinted category pill, reusable in card
47
+ * headers and feed-item rows. Same atom CategoryDivider renders on its left.
48
+ */
49
+ declare const CategoryTag: React$1.ForwardRefExoticComponent<CategoryTagProps & React$1.RefAttributes<HTMLSpanElement>>;
50
+ interface CategoryDividerProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof categoryTagVariants> {
51
+ /** Category label shown in the tone-tinted tag. */
52
+ label: string;
53
+ /** Optional leading icon rendered inside the tag. */
54
+ icon?: React.ReactNode;
55
+ /** Optional item count → trailing neutral count chip. */
56
+ count?: number;
57
+ }
58
+ /**
59
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
60
+ * Owner: PORTAL client portal, which decides to adopt, contribute or release
61
+ * the name. Never removed before 3.0.
62
+ */
63
+ declare const CategoryDivider: React$1.ForwardRefExoticComponent<CategoryDividerProps & React$1.RefAttributes<HTMLDivElement>>;
64
+
65
+ /**
66
+ * DocumentSourceTag — provenance atom for a document row/card: how the file
67
+ * arrived. Mirrors StatusPill's shape (a `source` enum maps to label + icon +
68
+ * tone), so call sites read as `<DocumentSourceTag source="requested" />`
69
+ * instead of repeating the label/icon/colour triple.
70
+ *
71
+ * requested → brand tint · send glyph (client fulfilled a firm request)
72
+ * direct → outline · upload glyph (client uploaded unprompted)
73
+ * internal → neutral · shield glyph (firm-prepared, not client-visible)
74
+ *
75
+ * Pass `children` to override the label while keeping the mapped tone/icon,
76
+ * `icon` to swap the glyph, or `hideIcon` for a label-only tag.
77
+ */
78
+ type DocumentSource = "requested" | "direct" | "internal";
79
+ interface DocumentSourceTagProps extends React.HTMLAttributes<HTMLSpanElement> {
80
+ source: DocumentSource;
81
+ /** Override the leading glyph for the mapped source. */
82
+ icon?: React.ReactNode;
83
+ /** Render label-only, with no leading glyph. */
84
+ hideIcon?: boolean;
85
+ }
86
+ /**
87
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
88
+ * Owner: PRO documents, which decides to adopt, contribute or release
89
+ * the name. Never removed before 3.0.
90
+ */
91
+ declare const DocumentSourceTag: React$1.ForwardRefExoticComponent<DocumentSourceTagProps & React$1.RefAttributes<HTMLSpanElement>>;
92
+
93
+ /**
94
+ * DocumentsWorkspaceLayout — 3-pane CSS-grid shell for a firm Documents workspace.
95
+ *
96
+ * Renders three independently-scrolling columns: a clients rail, a folder tree,
97
+ * and a files area. The root fills its parent height and does not scroll itself.
98
+ * Each pane is a flex column container; consumers are responsible for placing
99
+ * their own scroll regions inside the slots.
100
+ *
101
+ * Responsive grid:
102
+ * Base (<lg): 2 visible columns — clientsRail + filesArea. The folderTree
103
+ * pane is hidden so it does not occupy the 2-column base template.
104
+ * lg (>=1024px): All 3 columns — 248px rail | 220px folders | remaining files.
105
+ * xl (>=1280px): Wider columns — 280px rail | 244px folders | remaining files.
106
+ *
107
+ * No padding is imposed on any pane; the consumer owns spacing inside each slot.
108
+ */
109
+ interface DocumentsWorkspaceLayoutProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
110
+ /** Left column — client list rail (always visible). */
111
+ clientsRail: React.ReactNode;
112
+ /** Middle column — folder/category tree (hidden below lg breakpoint). */
113
+ folderTree: React.ReactNode;
114
+ /** Right column — file list and preview area (always visible). */
115
+ filesArea: React.ReactNode;
116
+ }
117
+ /**
118
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
119
+ * Owner: PRO documents, which decides to adopt, contribute or release
120
+ * the name. Never removed before 3.0.
121
+ */
122
+ declare const DocumentsWorkspaceLayout: React$1.ForwardRefExoticComponent<DocumentsWorkspaceLayoutProps & React$1.RefAttributes<HTMLDivElement>>;
123
+
124
+ /**
125
+ * SectionHeader — title + description block for marketing-style sections.
126
+ * Uses Inter (`font-display`) with the spec's `-0.022em` letterspacing.
127
+ */
128
+ interface SectionHeaderProps {
129
+ title: string;
130
+ description?: string;
131
+ align?: "left" | "center";
132
+ className?: string;
133
+ }
134
+ declare function SectionHeader({ title, description, align, className, }: SectionHeaderProps): react_jsx_runtime.JSX.Element;
135
+
136
+ /**
137
+ * Section — max-width centered wrapper for marketing/section content.
138
+ * The `--content-pad` token (32px) is the canonical app-content gutter,
139
+ * but Section keeps its 24px (`px-6`) gutter for narrower marketing pages.
140
+ */
141
+ declare const maxWidthStyles: {
142
+ readonly sm: "ds:max-w-3xl";
143
+ readonly md: "ds:max-w-4xl";
144
+ readonly lg: "ds:max-w-5xl";
145
+ readonly xl: "ds:max-w-6xl";
146
+ };
147
+ interface SectionProps extends React.HTMLAttributes<HTMLElement> {
148
+ maxWidth?: keyof typeof maxWidthStyles;
149
+ as?: "section" | "div";
150
+ }
151
+ declare const Section: React$1.ForwardRefExoticComponent<SectionProps & React$1.RefAttributes<HTMLElement>>;
152
+ interface SectionHeadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
153
+ eyebrow?: React.ReactNode;
154
+ title?: React.ReactNode;
155
+ meta?: React.ReactNode;
156
+ }
157
+ declare const SectionHead: React$1.ForwardRefExoticComponent<SectionHeadProps & React$1.RefAttributes<HTMLDivElement>>;
158
+
159
+ /**
160
+ * Stat — paired numeric display + caption (the StatNum primitive).
161
+ * Numerals are set in `font-display` (Inter) at a fluid clamp size with
162
+ * `font-variant-numeric: tabular-nums` for vertical alignment.
163
+ */
164
+ interface StatProps extends React.HTMLAttributes<HTMLDivElement> {
165
+ value: string;
166
+ label: string;
167
+ }
168
+ declare const Stat: React$1.ForwardRefExoticComponent<StatProps & React$1.RefAttributes<HTMLDivElement>>;
169
+
170
+ /**
171
+ * StatusPill — semantic status atom for engagement / document / signature
172
+ * lifecycles. It is a thin mapping over <Badge>: each known `status` picks
173
+ * the right variant + default label + dot, so call sites read as
174
+ * `<StatusPill status="needs-revision" />` instead of repeating the
175
+ * variant/label pairing everywhere.
176
+ *
177
+ * Mapping (per the portal spec):
178
+ * requested → warning "Requested"
179
+ * in-review → info "In review"
180
+ * needs-revision → danger "Needs revision"
181
+ * accepted/signed/
182
+ * approved/paid/
183
+ * received → success "Accepted" / "Signed" / "Received" / …
184
+ * draft/pending → secondary
185
+ * overdue → danger
186
+ *
187
+ * Pass `children` to override the label while keeping the mapped variant.
188
+ */
189
+ type PillStatus = "requested" | "in-review" | "needs-revision" | "accepted" | "signed" | "approved" | "paid" | "complete" | "received" | "draft" | "pending" | "overdue" | "declined" | "internal" | "shared";
190
+ interface StatusPillProps extends Omit<BadgeProps, "variant"> {
191
+ status: PillStatus;
192
+ /** Show a leading dot. Default `true` (status atoms read better with one). */
193
+ dot?: boolean;
194
+ }
195
+ declare const StatusPill: React$1.ForwardRefExoticComponent<StatusPillProps & React$1.RefAttributes<HTMLSpanElement>>;
196
+
197
+ interface TeamMember {
198
+ id: string;
199
+ fullName: string;
200
+ }
201
+ interface TeamMemberSelectProps {
202
+ teamMembers: TeamMember[];
203
+ currentUserId?: string | null;
204
+ value: string;
205
+ onValueChange: (value: string) => void;
206
+ includeUnassigned?: boolean;
207
+ placeholder?: string;
208
+ className?: string;
209
+ }
210
+ /**
211
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
212
+ * Owner: TAX, which keeps a local `TeamMemberPicker`; new code uses
213
+ * `PeoplePicker` (W7-10). Never removed before 3.0.
214
+ */
215
+ declare function TeamMemberSelect({ teamMembers, currentUserId, value, onValueChange, includeUnassigned, placeholder, className, }: TeamMemberSelectProps): react_jsx_runtime.JSX.Element;
216
+ declare namespace TeamMemberSelect {
217
+ var displayName: string;
218
+ }
219
+
220
+ /**
221
+ * ChannelTabs — a controlled, pill-style tab strip for switching between
222
+ * communication channels (Chat / Email / SMS / Internal) on a thread surface.
223
+ *
224
+ * Each tab carries a colored status dot (toned per channel) and an optional
225
+ * unread count. The active tab gets the accent ring treatment; inactive tabs
226
+ * are quiet until hovered. The component is presentational and fully
227
+ * controlled — the consumer owns the active value and maps it to whatever
228
+ * backend channel group / compose channel the tab represents.
229
+ *
230
+ * <ChannelTabs
231
+ * value={tab}
232
+ * onChange={setTab}
233
+ * tabs={[
234
+ * { value: "chat", label: "Chat", tone: "success", count: 2 },
235
+ * { value: "email", label: "Email", tone: "info" },
236
+ * { value: "sms", label: "SMS", tone: "accent" },
237
+ * ]}
238
+ * />
239
+ *
240
+ * @since 1.5.0
241
+ */
242
+ /** Status-dot tone for a channel tab. Maps to a semantic color token. */
243
+ type ChannelTone = "brand" | "info" | "success" | "warning" | "muted" | "danger";
244
+ interface ChannelTabItem {
245
+ /** Stable identifier passed back to `onChange`. */
246
+ value: string;
247
+ /** Visible label. */
248
+ label: string;
249
+ /** Status-dot tone. Defaults to `muted`. */
250
+ tone?: ChannelTone;
251
+ /** Optional unread count — hidden when `0` or `undefined`. */
252
+ count?: number;
253
+ }
254
+ interface ChannelTabsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
255
+ /** The tabs to render. */
256
+ tabs: ChannelTabItem[];
257
+ /** Currently active tab `value`. */
258
+ value: string;
259
+ /** Fired with the picked tab's `value`. */
260
+ onChange: (value: string) => void;
261
+ }
262
+ /**
263
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
264
+ * Owner: PRO communications, which decides to adopt, contribute or release
265
+ * the name. Never removed before 3.0.
266
+ */
267
+ declare function ChannelTabs({ tabs, value, onChange, className, ...props }: ChannelTabsProps): react_jsx_runtime.JSX.Element;
268
+ declare namespace ChannelTabs {
269
+ var displayName: string;
270
+ }
271
+
272
+ /**
273
+ * IntentBadge — a small dashed-outline badge for an AI-classified intent
274
+ * (Document, Question, Payment, Scheduling, Urgent, FYI, Follow-up…).
275
+ *
276
+ * The dashed border is the signature: it reads as "machine-suggested, not
277
+ * yet confirmed", distinguishing it from the solid `StatusPill` used for
278
+ * authoritative state. Presentational and generic — the consumer owns the
279
+ * intent→tone→icon→label mapping in their own domain config and passes the
280
+ * resolved pieces in.
281
+ *
282
+ * <IntentBadge tone="info" icon={<FileIcon size={12} />}>Document</IntentBadge>
283
+ *
284
+ * @since 1.5.0
285
+ */
286
+ /** Color tone for an intent badge. */
287
+ type IntentTone = "brand" | "info" | "primary" | "success" | "warning" | "danger" | "muted";
288
+ interface IntentBadgeProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "children"> {
289
+ /** Color tone. Defaults to `muted`. */
290
+ tone?: IntentTone;
291
+ /** Optional leading glyph — pass a 12px icon. */
292
+ icon?: ReactNode;
293
+ /** Badge label. */
294
+ children: ReactNode;
295
+ }
296
+ /**
297
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
298
+ * Owner: PRO communications, which decides to adopt, contribute or release
299
+ * the name. Never removed before 3.0.
300
+ */
301
+ declare function IntentBadge({ tone, icon, children, className, ...props }: IntentBadgeProps): react_jsx_runtime.JSX.Element;
302
+ declare namespace IntentBadge {
303
+ var displayName: string;
304
+ }
305
+
306
+ /**
307
+ * DocumentRequestUpload — one self-contained "please upload this document" row
308
+ * for an organizer or a document-request list: a label (with optional help +
309
+ * required flag), a drag-drop dropzone, and the list of already-uploaded files
310
+ * rendered as removable chips.
311
+ *
312
+ * It packages the `FileUpload` + `FileChip` primitives into the exact shape a
313
+ * document-request row needs — including the file **remove** affordance that
314
+ * the `Questions` `file-upload` type only exposes via its `onFileRemove` prop.
315
+ * Reach for `Questions type="file-upload"` when the upload is one field inside a
316
+ * larger question list; reach for this when a document request is the whole unit
317
+ * (its own card, its own awaiting/locked state).
318
+ *
319
+ * Fully presentational and controlled: the caller owns the file list and every
320
+ * handler.
321
+ */
322
+ interface DocumentRequestUploadFile {
323
+ /** Stable key. Falls back to `name` + `size` when omitted. */
324
+ id?: string;
325
+ /** File name shown on the chip. */
326
+ name: string;
327
+ /** Size in bytes; rendered as a human meta line when `meta` is not given. */
328
+ size?: number;
329
+ /** File-type tone for the chip tile. Defaults to `"doc"`. */
330
+ kind?: FileKind;
331
+ /** Overrides the derived "size" meta line (e.g. "2.1 MB · uploaded just now"). */
332
+ meta?: React.ReactNode;
333
+ }
334
+ interface DocumentRequestUploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
335
+ /** Row headline, e.g. "W-2 from each employer". */
336
+ label: string;
337
+ /** Optional supporting line under the label. */
338
+ description?: string;
339
+ /** Renders a "Required" pill next to the label. */
340
+ required?: boolean;
341
+ /** Optional help tooltip beside the label. */
342
+ help?: {
343
+ title?: string;
344
+ body: string;
345
+ };
346
+ /** Already-uploaded files, rendered as removable chips. */
347
+ files?: DocumentRequestUploadFile[];
348
+ /** New files chosen via the dropzone / picker. */
349
+ onFilesSelected?: (files: File[]) => void;
350
+ /** Remove an uploaded file. When omitted, chips have no remove button. */
351
+ onRemoveFile?: (file: DocumentRequestUploadFile, index: number) => void;
352
+ /** Dropzone `accept` list, e.g. ".pdf,.jpg,.png". */
353
+ accept?: string;
354
+ /** Max per-file size in bytes. */
355
+ maxSize?: number;
356
+ /** Allow selecting multiple files. Defaults to `true`. */
357
+ multiple?: boolean;
358
+ /** Locks the row: hides the dropzone and the remove buttons. */
359
+ disabled?: boolean;
360
+ /** Message shown in place of the dropzone when `disabled`. Defaults to a lock note. */
361
+ disabledHint?: string;
362
+ /** Card chrome or bare layout. Defaults to `"card"`. */
363
+ chrome?: "card" | "plain";
364
+ }
365
+ /**
366
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
367
+ * Owner: PORTAL client portal, which decides to adopt, contribute or release
368
+ * the name. Never removed before 3.0.
369
+ */
370
+ declare const DocumentRequestUpload: React$1.ForwardRefExoticComponent<DocumentRequestUploadProps & React$1.RefAttributes<HTMLDivElement>>;
371
+
372
+ /**
373
+ * AIReceiptPanel — the portal "attach a receipt, auto-fill with AI" panel.
374
+ * Three states drive the whole surface:
375
+ *
376
+ * idle → dashed "Attach receipt" button
377
+ * reading → pulsing sparkle + "Reading your receipt…"
378
+ * done → "Auto-filled from receipt" badge, the file chip, and the
379
+ * extracted vendor / amount / date grid (each confirmed ✓)
380
+ *
381
+ * It is **controlled**: the consumer owns `state` and supplies `result`
382
+ * when done. The simulated extraction in the reference is just one driver;
383
+ * swap in real OCR/AI and the contract is unchanged — flip `state` to
384
+ * "reading", then to "done" with a `result`.
385
+ */
386
+ interface AIReceiptResult {
387
+ vendor: string;
388
+ amount: string;
389
+ date: string;
390
+ file: {
391
+ name: string;
392
+ meta?: React.ReactNode;
393
+ };
394
+ }
395
+ interface AIReceiptPanelProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "results"> {
396
+ state?: "idle" | "reading" | "done";
397
+ /** Extracted fields, shown in the `done` state. */
398
+ result?: AIReceiptResult;
399
+ /** Fired when the idle attach button is pressed. */
400
+ onAttach?: () => void;
401
+ /** Fired when the done-state "Remove" link is pressed. */
402
+ onRemove?: () => void;
403
+ /** View action for the file chip (e.g. open the receipt). */
404
+ onViewFile?: () => void;
405
+ }
406
+ /**
407
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
408
+ * Owner: PRO, which decides to adopt, contribute or release
409
+ * the name. Never removed before 3.0.
410
+ */
411
+ declare const AIReceiptPanel: React$1.ForwardRefExoticComponent<AIReceiptPanelProps & React$1.RefAttributes<HTMLDivElement>>;
412
+
413
+ /**
414
+ * AttentionItem — one row in the portal "Needs your attention" feed:
415
+ * a toned icon tile, a title + supporting line, and a trailing action
416
+ * (custom node or a default chevron). Group these by service at the call
417
+ * site; the row itself just renders one item.
418
+ *
419
+ * Set `tone` to color the icon tile per service (or use a status tone via
420
+ * `urgency`). The whole row is a `<button>` when `onClick` is supplied.
421
+ */
422
+ type AttentionUrgency = "default" | "warning" | "danger";
423
+ interface AttentionItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
424
+ icon: React.ReactNode;
425
+ title: React.ReactNode;
426
+ description?: React.ReactNode;
427
+ /** Service tone for the icon tile (used when `urgency` is "default"). */
428
+ tone?: ServiceTone;
429
+ /** Status urgency — overrides the service tone for the tile. */
430
+ urgency?: AttentionUrgency;
431
+ /** Trailing slot; defaults to a chevron when the row is interactive. */
432
+ action?: React.ReactNode;
433
+ onClick?: () => void;
434
+ }
435
+ /**
436
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
437
+ * Owner: PRO, which decides to adopt, contribute or release
438
+ * the name. Never removed before 3.0.
439
+ */
440
+ declare const AttentionItem: React$1.ForwardRefExoticComponent<AttentionItemProps & React$1.RefAttributes<HTMLDivElement>>;
441
+
442
+ /**
443
+ * BottomNav — mobile tab bar for the client portal (desktop uses the
444
+ * sidebar instead). Fixed to the viewport bottom with safe-area padding;
445
+ * each tab is an icon + short label with an optional count/dot badge.
446
+ *
447
+ * Controlled via `value` + `onChange`. Keep it to 3–5 tabs — beyond that,
448
+ * labels truncate and the row gets cramped on a 390px screen.
449
+ */
450
+ interface BottomNavTab {
451
+ id: string;
452
+ label: string;
453
+ icon: React.ReactNode;
454
+ /** Numeric badge; `true` renders a dot. */
455
+ badge?: number | boolean;
456
+ }
457
+ interface BottomNavProps extends Omit<React.HTMLAttributes<HTMLElement>, "onChange"> {
458
+ tabs: BottomNavTab[];
459
+ value: string;
460
+ onChange: (id: string) => void;
461
+ }
462
+ /**
463
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
464
+ * Owner: DS — name released (docs/ownership/investigate.md, row 8); Portal's
465
+ * mobile nav moves to the Sidebar mobile mode (W7-04). Never removed before 3.0.
466
+ */
467
+ declare const BottomNav: React$1.ForwardRefExoticComponent<BottomNavProps & React$1.RefAttributes<HTMLElement>>;
468
+
469
+ /**
470
+ * DashGrid — drag-to-reorder widget grid for the firm dashboard. Each
471
+ * widget gets a 6-dot grab handle; dragging it over another widget moves
472
+ * it to that slot. The flat order is the source of truth; widgets flow
473
+ * row-major into a responsive CSS grid.
474
+ *
475
+ * Order is uncontrolled by default. Pass `storageKey` to persist it to
476
+ * `localStorage` — the initial order is read **once** in a lazy
477
+ * `useState` initializer (SSR-safe: no read on the server), and the grid
478
+ * carries `suppressHydrationWarning` because a persisted client order will
479
+ * legitimately differ from the server's default order on first paint.
480
+ * `onReorder` fires with the new id order on every move.
481
+ */
482
+ interface DashWidget {
483
+ id: string;
484
+ content: React.ReactNode;
485
+ /** Column span on the lg grid (1–3). Default 1. */
486
+ span?: 1 | 2 | 3;
487
+ }
488
+ interface DashGridProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onReorder"> {
489
+ widgets: DashWidget[];
490
+ /** Persist order under this `localStorage` key. Omit to disable persistence. */
491
+ storageKey?: string;
492
+ onReorder?: (orderedIds: string[]) => void;
493
+ /** Max columns on large screens. Default 3. */
494
+ columns?: 2 | 3 | 4;
495
+ }
496
+ /**
497
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
498
+ * Owner: PRO, which decides to adopt, contribute or release
499
+ * the name. Never removed before 3.0.
500
+ */
501
+ declare const DashGrid: React$1.ForwardRefExoticComponent<DashGridProps & React$1.RefAttributes<HTMLDivElement>>;
502
+
503
+ interface EngagementCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
504
+ /** Service name, e.g. "Tax". */
505
+ service: string;
506
+ /** Service glyph (an icon node). */
507
+ serviceIcon?: React.ReactNode;
508
+ tone?: ServiceTone;
509
+ title: string;
510
+ /** Status node (typically a <StatusPill> or plain label). */
511
+ status?: React.ReactNode;
512
+ /** Current step index (1-based) and total. */
513
+ current: number;
514
+ steps: number;
515
+ /** Name of the current step, shown in the caption. */
516
+ stepLabel?: string;
517
+ /** Footer ETA content, e.g. "Est. completion Mar 14" or "Recurring engagement". */
518
+ eta?: React.ReactNode;
519
+ /** Show a ProgressRing instead of segments + percent. */
520
+ ring?: boolean;
521
+ onOpen?: () => void;
522
+ }
523
+ /**
524
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
525
+ * Owner: PORTAL client portal (PRO workflow keeps one too), which decides to
526
+ * adopt, contribute or release the name. Never removed before 3.0.
527
+ */
528
+ declare const EngagementCard: React$1.ForwardRefExoticComponent<EngagementCardProps & React$1.RefAttributes<HTMLDivElement>>;
529
+
530
+ /**
531
+ * EngagementTimeline — vertical stepper for an engagement's lifecycle.
532
+ * Each step is a node + connector rail on the left and a body on the right.
533
+ *
534
+ * done → filled success node with a check + "Completed {date}" line
535
+ * active → toned ring node + "In progress" badge + inline actions
536
+ * todo → muted node + "Upcoming" badge
537
+ *
538
+ * The active node + badge read the service `--tone` set once on the
539
+ * container (see `serviceToneStyle`). Compose with `<EngagementTimelineStep>`
540
+ * children, mirroring the `<ActivityList>` / `<ActivityItem>` split.
541
+ */
542
+ type TimelineState = "done" | "active" | "todo";
543
+ interface EngagementTimelineProps extends React.HTMLAttributes<HTMLOListElement> {
544
+ /** Service tone for active nodes. */
545
+ tone?: ServiceTone;
546
+ }
547
+ /**
548
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
549
+ * Owner: PORTAL client portal (PRO documents keeps one too), which decides to
550
+ * adopt, contribute or release the name. Never removed before 3.0.
551
+ */
552
+ declare const EngagementTimeline: React$1.ForwardRefExoticComponent<EngagementTimelineProps & React$1.RefAttributes<HTMLOListElement>>;
553
+ interface EngagementTimelineStepProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, "title"> {
554
+ state: TimelineState;
555
+ /** Step name. */
556
+ name: React.ReactNode;
557
+ /** 1-based index shown inside todo/active nodes. */
558
+ index: number;
559
+ /** Supporting copy under the name. */
560
+ note?: React.ReactNode;
561
+ /** Completion date, shown for `done` steps. */
562
+ date?: React.ReactNode;
563
+ /** Inline action row, shown for `active` steps. */
564
+ actions?: React.ReactNode;
565
+ /** Hide the connector below the node (last step). */
566
+ last?: boolean;
567
+ }
568
+ declare const EngagementTimelineStep: React$1.ForwardRefExoticComponent<EngagementTimelineStepProps & React$1.RefAttributes<HTMLLIElement>>;
569
+
570
+ /**
571
+ * ClientRailItem — a client row in the firm Documents left rail.
572
+ *
573
+ * Renders as a full-width, left-aligned `<button>`. Displays the client
574
+ * avatar, name, an optional pending-documents indicator (purple dot +
575
+ * "N pending" label), a file-count chip, and a meta suffix (e.g. a relative
576
+ * timestamp).
577
+ *
578
+ * Active state highlights the row with `bg-brand-bg` and a 3 px left accent
579
+ * bar in the active brand colour. Hover (when not active) applies `bg-surface-2`.
580
+ *
581
+ * Spread standard `<button>` attributes (including `onClick`) directly.
582
+ */
583
+ interface ClientRailItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
584
+ /** Client or entity display name. */
585
+ name: string;
586
+ /** Optional avatar image URL — forwarded to the DS Avatar `src` prop. */
587
+ avatarSrc?: string;
588
+ /** Entity kind label, e.g. "Individual" or "Business". */
589
+ entityType: string;
590
+ /** Number of pending document requests; 0 / undefined → no pending badge. */
591
+ pendingCount?: number | undefined;
592
+ /** Total file count shown in the name-row chip. Omit to hide the chip. */
593
+ fileCount?: number | undefined;
594
+ /** Trailing meta node — typically a relative-time string like "2h ago". */
595
+ metaSuffix?: React.ReactNode;
596
+ /** Whether this row is the currently-selected client in the rail. */
597
+ active?: boolean;
598
+ }
599
+ declare const ClientRailItem: React$1.ForwardRefExoticComponent<ClientRailItemProps & React$1.RefAttributes<HTMLButtonElement>>;
600
+ /**
601
+ * ClientRailGroupHeader — section label row for the Documents left rail.
602
+ *
603
+ * When `accent` is true a 7 px pro-tone dot precedes the label and the text
604
+ * is coloured in the active brand colour — signals that the group contains clients with
605
+ * pending document requests. An optional `count` is appended as " · N".
606
+ */
607
+ interface ClientRailGroupHeaderProps extends React.HTMLAttributes<HTMLDivElement> {
608
+ /** Group label text, e.g. "Awaiting documents" or "All clients". */
609
+ label: string;
610
+ /** Optional count appended as " · N" after the label. */
611
+ count?: number;
612
+ /**
613
+ * When true, renders a purple StatusDot before the label and colours the
614
+ * label in `text-brand` (the active brand colour). Use for "Awaiting documents" groups.
615
+ */
616
+ accent?: boolean;
617
+ }
618
+ declare const ClientRailGroupHeader: React$1.ForwardRefExoticComponent<ClientRailGroupHeaderProps & React$1.RefAttributes<HTMLDivElement>>;
619
+
620
+ interface DocumentFileRowProps extends React$1.HTMLAttributes<HTMLDivElement> {
621
+ name: string;
622
+ fileType: string;
623
+ size?: string;
624
+ date?: string;
625
+ by?: string | undefined;
626
+ status?: React$1.ReactNode;
627
+ nameAdornment?: React$1.ReactNode;
628
+ menu?: React$1.ReactNode;
629
+ selected?: boolean | undefined;
630
+ showCheckbox?: boolean;
631
+ onSelectedChange?: (checked: boolean) => void;
632
+ onOpen?: () => void;
633
+ }
634
+ type DocumentFileCardProps = DocumentFileRowProps;
635
+ declare const DocumentFileRow: React$1.ForwardRefExoticComponent<DocumentFileRowProps & React$1.RefAttributes<HTMLDivElement>>;
636
+ declare const DocumentFileCard: React$1.ForwardRefExoticComponent<DocumentFileRowProps & React$1.RefAttributes<HTMLDivElement>>;
637
+ declare const lineCaptionToneClass: {
638
+ readonly muted: "ds:text-fg-4";
639
+ readonly warning: "ds:text-warning-fg";
640
+ readonly danger: "ds:text-danger-fg";
641
+ };
642
+ interface DocumentFileLineProps extends React$1.HTMLAttributes<HTMLDivElement> {
643
+ /** The file's own name. */
644
+ name: string;
645
+ /** Drives the leading glyph colour ("pdf", "image/png", "xlsx", …). */
646
+ fileType?: string | undefined;
647
+ /** Small chip at the trailing edge — e.g. the classified document type. */
648
+ typeLabel?: React$1.ReactNode | undefined;
649
+ /** One muted status line under the name — e.g. "Categorizing…". */
650
+ caption?: React$1.ReactNode | undefined;
651
+ /** Colour tone for the caption. */
652
+ captionTone?: keyof typeof lineCaptionToneClass | undefined;
653
+ /** When set, a preview (eye) button is shown that calls this. */
654
+ onOpen?: (() => void) | undefined;
655
+ /** Accessible label for the preview button (defaults to `Preview {name}`). */
656
+ previewLabel?: string | undefined;
657
+ }
658
+ /**
659
+ * DocumentFileLine — a compact single-line file row for DENSE inline lists:
660
+ * the files collected under a checklist item, a "still sorting" group, or an
661
+ * "also received" list. Unlike {@link DocumentFileRow} it carries no checkbox,
662
+ * kebab menu, or size/date/by meta — just a file glyph, name, an optional type
663
+ * chip + caption, and an optional preview (eye) action. Purpose-built for
664
+ * {@link DocumentChecklist}; reach for `DocumentFileRow` when you need
665
+ * selection, a menu, or file metadata.
666
+ */
667
+ declare const DocumentFileLine: React$1.ForwardRefExoticComponent<DocumentFileLineProps & React$1.RefAttributes<HTMLDivElement>>;
668
+
669
+ /**
670
+ * A checklist item's lifecycle, from the client's point of view:
671
+ * awaiting — expected, nothing uploaded yet
672
+ * in-review — a file arrived and is being categorized / verified
673
+ * received — the document is in
674
+ * complete — in and finalized
675
+ * not-applicable — the client marked it as not-needed
676
+ */
677
+ type DocumentChecklistStatus = "awaiting" | "in-review" | "received" | "complete" | "not-applicable";
678
+ /** A single collected file rendered under an item (or in the sorting/extra lists). */
679
+ interface DocumentChecklistFile extends Pick<DocumentFileLineProps, "name" | "fileType" | "typeLabel" | "caption" | "captionTone" | "onOpen"> {
680
+ id: string;
681
+ }
682
+ /** One expected document type on the checklist. */
683
+ interface DocumentChecklistItem {
684
+ id: string;
685
+ /** Plain-English label the client reads (e.g. "W-2"). */
686
+ label: string;
687
+ status: DocumentChecklistStatus;
688
+ /** Files classified into this slot (0..N). */
689
+ files?: DocumentChecklistFile[] | undefined;
690
+ /**
691
+ * Rendered under an awaiting row — the "I can't provide this" control (a
692
+ * caller-owned Select of missing-reason options). Kept as a slot so the
693
+ * composite stays presentational and product-agnostic.
694
+ */
695
+ action?: React$1.ReactNode;
696
+ }
697
+ interface DocumentChecklistProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
698
+ items: DocumentChecklistItem[];
699
+ /** Section heading. */
700
+ title?: string;
701
+ /** Roll-up shown as a count + bar. Omit to hide the progress header. */
702
+ progress?: {
703
+ received: number;
704
+ total: number;
705
+ percent: number;
706
+ };
707
+ /** The upload dropzone, rendered at the very top of the single column. */
708
+ upload?: React$1.ReactNode;
709
+ /** Files still being sorted (not yet placed on a slot). */
710
+ reviewing?: DocumentChecklistFile[];
711
+ /** Recognized files that aren't on the checklist. */
712
+ extra?: DocumentChecklistFile[];
713
+ reviewingLabel?: string;
714
+ extraLabel?: string;
715
+ /** Rendered when there are no items at all. */
716
+ emptyState?: React$1.ReactNode;
717
+ }
718
+ /**
719
+ * DocumentChecklist — the client's single-column "your documents" experience.
720
+ *
721
+ * One scannable list: an upload dropzone on top, a progress roll-up, then every
722
+ * expected document as a row that moves through Awaiting → Reviewing → Received
723
+ * in place (state lives on the row, never in a separate bucket). Files still
724
+ * being sorted surface in a compact "we're sorting these" group, and recognized
725
+ * files that aren't on the checklist fall under an "also received" divider — so
726
+ * nothing an upload produced is ever hidden, and there is exactly one place to
727
+ * look.
728
+ *
729
+ * Fully controlled and presentational: the caller supplies `items`, `progress`,
730
+ * and slots (`upload`, per-row `action`, per-file `onOpen`). It consumes only
731
+ * semantic tokens, so `data-brand` retints it per product automatically.
732
+ *
733
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
734
+ * Owner: PORTAL client portal, which decides to adopt, contribute or release
735
+ * the name. Never removed before 3.0.
736
+ */
737
+ declare const DocumentChecklist: React$1.ForwardRefExoticComponent<DocumentChecklistProps & React$1.RefAttributes<HTMLDivElement>>;
738
+
739
+ /**
740
+ * DocumentRequestField — one numbered "document N" card inside the Request
741
+ * Documents modal. Renders a header badge, an optional remove button, and a
742
+ * three-field grid: document-type slot (caller-supplied), a required label
743
+ * input, and an optional note input.
744
+ *
745
+ * Props:
746
+ * - `index` — zero-based position; badge shows `index + 1`.
747
+ * - `typeControl` — ReactNode rendered in the Type field slot (pass a
748
+ * select, combobox, or disabled placeholder).
749
+ * - `label` — controlled value for the Label input.
750
+ * - `onLabelChange` — called with the new string on every keystroke.
751
+ * - `note` — controlled value for the Note input.
752
+ * - `onNoteChange` — called with the new string on every keystroke.
753
+ * - `onRemove` — when provided (and `canRemove` is true) a remove
754
+ * button appears in the header row.
755
+ * - `canRemove` — guards `onRemove`; set false when only one field
756
+ * remains so the user cannot delete the last entry.
757
+ */
758
+ interface DocumentRequestFieldProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
759
+ /** Zero-based index; displayed as `index + 1` in the badge and aria-labels. */
760
+ index: number;
761
+ /** Slot for the document-type control (select, combobox, disabled input, etc.). */
762
+ typeControl: React.ReactNode;
763
+ /** Controlled value for the Label field. */
764
+ label: string;
765
+ /** Called with the updated string whenever the Label input changes. */
766
+ onLabelChange: (value: string) => void;
767
+ /** Controlled value for the Note field. */
768
+ note: string;
769
+ /** Called with the updated string whenever the Note input changes. */
770
+ onNoteChange: (value: string) => void;
771
+ /** Callback to remove this card from the list. Only rendered when `canRemove` is also true. */
772
+ onRemove?: () => void;
773
+ /** Whether removal is permitted (e.g. false when this is the last card). */
774
+ canRemove?: boolean;
775
+ }
776
+ /**
777
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
778
+ * Owner: PRO documents, which decides to adopt, contribute or release
779
+ * the name. Never removed before 3.0.
780
+ */
781
+ declare const DocumentRequestField: React$1.ForwardRefExoticComponent<DocumentRequestFieldProps & React$1.RefAttributes<HTMLDivElement>>;
782
+
783
+ /**
784
+ * MissingDocumentsPanel — an AI insight card that surfaces documents still
785
+ * expected from a client within an engagement.
786
+ *
787
+ * Items carry one of three states that map to a `<StatusPill>` semantic:
788
+ * missing → "Requested" (warning)
789
+ * pending → "Pending" (secondary)
790
+ * received → "Received" (success)
791
+ *
792
+ * When no items remain, the panel renders a compact "All documents received"
793
+ * success line instead of an empty list.
794
+ *
795
+ * Pass `onRequest` to show a "Request missing" footer button. The panel is
796
+ * fully controlled — it renders whatever `items` you supply.
797
+ */
798
+ type DocumentItemState = "missing" | "pending" | "received";
799
+ interface MissingDocumentItem {
800
+ /** Document label shown in the row. */
801
+ label: string;
802
+ /** Optional due / expected date string (e.g. "Due Jun 20"). */
803
+ dueDate?: string;
804
+ /** Current fulfilment state for this document. */
805
+ state: DocumentItemState;
806
+ }
807
+ interface MissingDocumentsPanelProps extends React.HTMLAttributes<HTMLDivElement> {
808
+ /** List of expected documents and their current states. */
809
+ items: MissingDocumentItem[];
810
+ /** Subtitle below the panel title. */
811
+ subtitle?: string;
812
+ /** When provided a "Request missing" button is rendered in the footer. */
813
+ onRequest?: () => void;
814
+ }
815
+ /**
816
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
817
+ * Owner: PRO documents, which decides to adopt, contribute or release
818
+ * the name. Never removed before 3.0.
819
+ */
820
+ declare const MissingDocumentsPanel: React$1.ForwardRefExoticComponent<MissingDocumentsPanelProps & React$1.RefAttributes<HTMLDivElement>>;
821
+
822
+ /**
823
+ * NewMenu — the TopBar "+ New" create dropdown. A primary button opens a
824
+ * menu of create actions, optionally split into labelled groups (e.g.
825
+ * "Work" vs "People"). Thin composition over the DropdownMenu primitive;
826
+ * the surface, focus, and portal behavior all come from there.
827
+ */
828
+ interface NewMenuAction {
829
+ id: string;
830
+ label: React.ReactNode;
831
+ /** Supporting line under the label. */
832
+ description?: React.ReactNode;
833
+ icon?: React.ReactNode;
834
+ /** Keyboard hint, right-aligned (display only). */
835
+ shortcut?: string;
836
+ onSelect?: () => void;
837
+ }
838
+ interface NewMenuGroup {
839
+ label?: React.ReactNode;
840
+ actions: NewMenuAction[];
841
+ }
842
+ interface NewMenuProps {
843
+ /** Flat action list. Use `groups` instead for labelled sections. */
844
+ actions?: NewMenuAction[];
845
+ groups?: NewMenuGroup[];
846
+ /** Trigger label. Default "New". */
847
+ triggerLabel?: React.ReactNode;
848
+ /** Override the trigger entirely (still opens the menu). */
849
+ trigger?: React.ReactNode;
850
+ align?: "start" | "center" | "end";
851
+ }
852
+ /**
853
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
854
+ * Owner: PRO, which decides to adopt, contribute or release
855
+ * the name. Never removed before 3.0.
856
+ */
857
+ declare const NewMenu: React$1.ForwardRefExoticComponent<NewMenuProps & React$1.RefAttributes<HTMLButtonElement>>;
858
+
859
+ /**
860
+ * DocumentRequestCard + DocumentRequestDetail — the firm "Requests" surface.
861
+ *
862
+ * Both are presentational: the app owns data fetching, tab/preview state, and
863
+ * every action handler, and passes plain data + callbacks. They wrap the
864
+ * `DocumentDetail*` kit, the icon set, the tab primitives, and the assignee
865
+ * dropdown so a consuming app imports two components instead of ~40 parts.
866
+ */
867
+ type DocumentRequestTone = "warning" | "success" | "danger" | "muted";
868
+ interface DocumentRequestItemSummary {
869
+ /** Stable id for the row key. */
870
+ id: string;
871
+ /** Requested-document label, e.g. "AR aging (12/31/2025)". */
872
+ label: string;
873
+ /** Short type chip, e.g. "Schedule". */
874
+ docType?: string;
875
+ /** Status text, e.g. "Received". */
876
+ statusLabel: string;
877
+ /** Status colour. */
878
+ statusTone: DocumentRequestTone;
879
+ }
880
+ interface DocumentRequestCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onClick" | "title"> {
881
+ /** Request headline. */
882
+ title: string;
883
+ /** Free-form category chip. */
884
+ category?: string;
885
+ /** Renders the urgent triangle when true. */
886
+ highPriority?: boolean;
887
+ /** Relative due chip + tone, e.g. `{ text: "Due in 6d", tone: "warning" }`. */
888
+ due?: {
889
+ text: string;
890
+ tone: DocumentRequestTone;
891
+ };
892
+ /** Optional request description rendered as a quote. */
893
+ comment?: string;
894
+ /** Fulfilled item count (numerator of the progress pill). */
895
+ fulfilledCount: number;
896
+ /** Total item count (denominator of the progress pill). */
897
+ totalCount: number;
898
+ /** Requested items rendered as rows. */
899
+ items: DocumentRequestItemSummary[];
900
+ /** Assignee display names for the footer avatar stack. */
901
+ assignees?: string[];
902
+ /** Open the request detail. */
903
+ onOpen: () => void;
904
+ }
905
+ declare const DocumentRequestCard: React$1.ForwardRefExoticComponent<DocumentRequestCardProps & React$1.RefAttributes<HTMLDivElement>>;
906
+ type DocumentRequestDetailTab = "documents" | "comments" | "activity";
907
+ type DocumentRequestActivityKind = "assigned" | "unassigned" | "added" | "uploaded" | "priority" | "created" | "reminded" | "updated" | "commented" | "cancelled" | "received" | "approved" | "needs_revision" | "locked" | "unlocked" | "status";
908
+ interface DocumentRequestDetailDoc {
909
+ /** Stable id for the row key. */
910
+ id: string;
911
+ /** File name shown as the row's primary line. */
912
+ fileName: string;
913
+ /** Secondary meta line (size · date · uploader). */
914
+ meta?: React.ReactNode;
915
+ /** Highlight the row (e.g. its preview is open). */
916
+ active?: boolean;
917
+ /** Firm review verdict — `true` renders the row in its approved state
918
+ * (green icon + "Approved" tag) and hides the approve action. */
919
+ approved?: boolean;
920
+ /** Firm review verdict — `true` renders the row in its rejected state
921
+ * (red icon + "Rejected" tag). Ignored when `approved` is set. */
922
+ rejected?: boolean;
923
+ /** Approve this document. Renders a tick action before Preview while the
924
+ * doc is not yet approved; omit to hide the affordance. */
925
+ onApprove?: () => void;
926
+ onPreview?: () => void;
927
+ onDownload?: () => void;
928
+ onDelete?: () => void;
929
+ }
930
+ interface DocumentRequestRequestedItem {
931
+ /** Stable id for the row key. */
932
+ id: string;
933
+ /** Requested-document label, e.g. "AR aging (12/31/2025)". */
934
+ label: string;
935
+ /** Short type chip, e.g. "Schedule". */
936
+ docType?: string;
937
+ /** Status text, e.g. "Received". */
938
+ statusLabel: string;
939
+ /** Status colour (drives the dot + label). */
940
+ statusTone: DocumentRequestTone;
941
+ /** Client upload(s) fulfilling this item; empty means still awaiting. */
942
+ documents: DocumentRequestDetailDoc[];
943
+ }
944
+ interface DocumentRequestDetailComment {
945
+ /** Stable id for the row key. */
946
+ id: string;
947
+ /** Author display name. */
948
+ author: string;
949
+ /** True for a firm author (vs a client contact) — drives the badge. */
950
+ isFirm: boolean;
951
+ /** Render a "(You)" suffix for the current user. */
952
+ you?: boolean;
953
+ /** Relative time. */
954
+ time: string;
955
+ /** Comment body. */
956
+ body: string;
957
+ }
958
+ interface DocumentRequestDetailActivityEvent {
959
+ /** Stable id for the row key. */
960
+ id: string;
961
+ /** Event kind — selects the leading icon. */
962
+ kind: DocumentRequestActivityKind;
963
+ /** Rendered event text (may include bolded names). */
964
+ text: React.ReactNode;
965
+ /** Relative time. */
966
+ time: string;
967
+ }
968
+ interface DocumentRequestAssigneeOption {
969
+ /** Firm-user id. */
970
+ id: string;
971
+ /** Display name. */
972
+ name: string;
973
+ /** Whether currently assigned. */
974
+ selected: boolean;
975
+ }
976
+ interface DocumentRequestReviewStatusOption {
977
+ /** Stored value (e.g. "provided"). */
978
+ value: string;
979
+ /** Human label (e.g. "Provided"). */
980
+ label: string;
981
+ /** Tailwind background class for the leading status dot (e.g. "bg-info-fg"). */
982
+ color?: string;
983
+ }
984
+ interface DocumentRequestDetailProps {
985
+ /** Request headline. */
986
+ title: string;
987
+ /** Category chip (left of the header bar). */
988
+ category?: string;
989
+ /** Renders a "High priority" chip. */
990
+ highPriority?: boolean;
991
+ /** Status pill text, right-aligned. */
992
+ statusLabel?: string;
993
+ /** Status pill colour. */
994
+ statusVariant?: BadgeProps["variant"];
995
+ /** Requester block. */
996
+ requester: {
997
+ org: string;
998
+ avatar?: string;
999
+ requestedBy: string;
1000
+ time: string;
1001
+ };
1002
+ /** Due chip text + absolute date. */
1003
+ due?: {
1004
+ text: string;
1005
+ dateLabel?: string;
1006
+ };
1007
+ /** Assignee options for the picker; `selected` marks the current set. */
1008
+ assignees: DocumentRequestAssigneeOption[];
1009
+ /** Toggle one assignee (omit to render the avatar stack read-only). */
1010
+ onToggleAssignee?: (id: string) => void;
1011
+ /** Show the Edit / Lock / Status / Delete action row (firm only). */
1012
+ canEdit?: boolean;
1013
+ onEdit?: () => void;
1014
+ onDelete?: () => void;
1015
+ onClose?: () => void;
1016
+ /** Whether the request is frozen (drives the Lock/Unlock button label + icon). */
1017
+ isLocked?: boolean;
1018
+ /** Toggle the lock (omit to hide the Lock button). */
1019
+ onToggleLock?: () => void;
1020
+ /** The firm's current review verdict (radio-selected in the Status menu). */
1021
+ reviewStatus?: string | null;
1022
+ /** Selectable review-status options for the Status menu. */
1023
+ reviewStatusOptions?: DocumentRequestReviewStatusOption[];
1024
+ /** Set the review verdict, or `null` to clear it (omit to hide the Status button). */
1025
+ onSetReviewStatus?: (value: string | null) => void;
1026
+ /** Controlled active tab. */
1027
+ tab?: DocumentRequestDetailTab;
1028
+ /** Uncontrolled initial tab (defaults to "documents"). */
1029
+ defaultTab?: DocumentRequestDetailTab;
1030
+ onTabChange?: (tab: DocumentRequestDetailTab) => void;
1031
+ /** Documents tab — flat client-uploaded vault docs. Used only as a fallback
1032
+ * when `requestedItems` is omitted. */
1033
+ clientUploads?: DocumentRequestDetailDoc[];
1034
+ /** Documents tab — firm reference documents. */
1035
+ firmDocuments: DocumentRequestDetailDoc[];
1036
+ /** Documents tab — requested items with the client upload(s) fulfilling each.
1037
+ * When provided, the tab renders a per-item grouped view (each requested
1038
+ * document, its status, and the uploads against it) instead of the flat
1039
+ * client-uploads list. */
1040
+ requestedItems?: DocumentRequestRequestedItem[];
1041
+ /** Client uploads not tied to any current item — rendered as a trailing
1042
+ * "Other uploads" group in the grouped view. */
1043
+ otherUploads?: DocumentRequestDetailDoc[];
1044
+ /** Upload affordance for the firm-documents section (omit to hide). */
1045
+ onUploadFirmDocument?: () => void;
1046
+ /** Comments tab thread. */
1047
+ comments: DocumentRequestDetailComment[];
1048
+ /** Controlled composer value. */
1049
+ commentDraft: string;
1050
+ onCommentDraftChange: (value: string) => void;
1051
+ onSubmitComment: () => void;
1052
+ /** Disable the composer (e.g. lacking permission). */
1053
+ commentDisabled?: boolean;
1054
+ /** In-flight comment submit. */
1055
+ commentPending?: boolean;
1056
+ /** Activity tab events, newest-first as desired by the caller. */
1057
+ activity: DocumentRequestDetailActivityEvent[];
1058
+ className?: string;
1059
+ }
1060
+ declare const DocumentRequestDetail: React$1.ForwardRefExoticComponent<DocumentRequestDetailProps & React$1.RefAttributes<HTMLElement>>;
1061
+
1062
+ /**
1063
+ * DocumentSourceFilter — segmented single-select for a files toolbar: scope the
1064
+ * list to a provenance bucket. Wraps ToggleGroup (so it inherits roving-focus
1065
+ * keyboard nav + the pro-tint active state) and reuses the same `source` →
1066
+ * glyph mapping as DocumentSourceTag, plus an "all" aggregate segment.
1067
+ *
1068
+ * all → (no glyph) every document
1069
+ * requested → send glyph client fulfilled a firm request
1070
+ * direct → upload glyph client uploaded unprompted
1071
+ * internal → shield glyph firm-prepared, not client-visible
1072
+ *
1073
+ * Controlled: pass `value` + `onValueChange`. `counts` adds a trailing badge per
1074
+ * segment; `hideIcons` renders label-only segments.
1075
+ */
1076
+ type DocumentSourceFilterValue = "all" | DocumentSource;
1077
+ interface DocumentSourceFilterProps {
1078
+ /** Currently active segment. */
1079
+ value: DocumentSourceFilterValue;
1080
+ /** Fired when a segment is chosen (re-selecting the active one is ignored). */
1081
+ onValueChange: (value: DocumentSourceFilterValue) => void;
1082
+ /** Per-segment item counts, rendered as a trailing badge. */
1083
+ counts?: Partial<Record<DocumentSourceFilterValue, number>>;
1084
+ /** Render label-only segments, with no leading glyph. */
1085
+ hideIcons?: boolean;
1086
+ className?: string;
1087
+ /** Accessible name for the group. */
1088
+ "aria-label"?: string;
1089
+ }
1090
+ /**
1091
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
1092
+ * Owner: PRO documents, which decides to adopt, contribute or release
1093
+ * the name. Never removed before 3.0.
1094
+ */
1095
+ declare const DocumentSourceFilter: React$1.ForwardRefExoticComponent<DocumentSourceFilterProps & React$1.RefAttributes<HTMLDivElement>>;
1096
+
1097
+ /** Running-clock format from milliseconds → `H:MM:SS`. */
1098
+ declare function formatClock(ms: number): string;
1099
+ /** Compact duration from seconds → `Xh Ym` (e.g. `2h 10m`, `45m`, `3h`). */
1100
+ declare function formatDuration(totalSeconds: number): string;
1101
+ /** Parse human input (`3h 20m`, `1:30`, `45m`, bare `90` → minutes) → seconds, or `null`. */
1102
+ declare function parseDuration(input: string): number | null;
1103
+ /** Currency format used by the billing rows; falls back to `$0.00` for bad ISO codes. */
1104
+ declare function formatCurrency(amount: number, currency?: string): string;
1105
+ type TimeLoggerPhase = "idle" | "running" | "paused" | "stopped";
1106
+ interface UseStopwatchReturn {
1107
+ phase: TimeLoggerPhase;
1108
+ elapsedMs: number;
1109
+ isRunning: boolean;
1110
+ /** Begin running, optionally seeded with an offset (e.g. a parsed manual entry). */
1111
+ start: (fromMs?: number) => void;
1112
+ pause: () => void;
1113
+ resume: () => void;
1114
+ /** Freeze and mark complete; elapsed is preserved for saving. */
1115
+ stop: () => void;
1116
+ /** Return to idle at zero. */
1117
+ reset: () => void;
1118
+ }
1119
+ declare function useStopwatch(): UseStopwatchReturn;
1120
+ interface TimeLoggerProps extends React$1.HTMLAttributes<HTMLDivElement> {
1121
+ /**
1122
+ * Layout direction.
1123
+ * - `"vertical"` (default) — the stacked panel; rows separated by top
1124
+ * rules. For popovers and side panels.
1125
+ * - `"horizontal"` — a single compact bar; segments sit side by side,
1126
+ * separated by left rules. For an app top/bottom bar. Exposed as
1127
+ * `data-orientation` so segment atoms flip their divider via
1128
+ * `group-data-[orientation=horizontal]/timelogger`.
1129
+ */
1130
+ orientation?: "vertical" | "horizontal";
1131
+ }
1132
+ declare const TimeLogger: React$1.ForwardRefExoticComponent<TimeLoggerProps & React$1.RefAttributes<HTMLDivElement>>;
1133
+ interface TimeLoggerHeaderProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
1134
+ title?: React$1.ReactNode;
1135
+ icon?: React$1.ReactNode;
1136
+ /** Minutes logged today. With `goalMinutes`, renders the `Xh / Yh` figure + seam. */
1137
+ loggedMinutes?: number;
1138
+ /** Daily goal in minutes. Omit to hide the goal figure and the progress seam. */
1139
+ goalMinutes?: number;
1140
+ }
1141
+ declare const TimeLoggerHeader: React$1.ForwardRefExoticComponent<TimeLoggerHeaderProps & React$1.RefAttributes<HTMLDivElement>>;
1142
+ interface TimeLoggerContextRowProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
1143
+ client: React$1.ReactNode;
1144
+ engagement?: React$1.ReactNode;
1145
+ /** Leading slot, e.g. an `<Avatar variant="branded" />`. */
1146
+ avatar?: React$1.ReactNode;
1147
+ onClientSelect?: () => void;
1148
+ /** Right-aligned slot — an assignee avatar + menu, or a `<TeamMemberSelect>`. */
1149
+ member?: React$1.ReactNode;
1150
+ }
1151
+ declare const TimeLoggerContextRow: React$1.ForwardRefExoticComponent<TimeLoggerContextRowProps & React$1.RefAttributes<HTMLDivElement>>;
1152
+ interface TimeLoggerTimerProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "onChange"> {
1153
+ phase: TimeLoggerPhase;
1154
+ elapsedMs: number;
1155
+ /** Manual-entry text, shown only while idle. Controlled. */
1156
+ value?: string;
1157
+ onValueChange?: (value: string) => void;
1158
+ placeholder?: string;
1159
+ onStart?: () => void;
1160
+ onPause?: () => void;
1161
+ onResume?: () => void;
1162
+ onStop?: () => void;
1163
+ }
1164
+ declare const TimeLoggerTimer: React$1.ForwardRefExoticComponent<TimeLoggerTimerProps & React$1.RefAttributes<HTMLDivElement>>;
1165
+ interface TimeLoggerFieldProps extends Omit<React$1.HTMLAttributes<HTMLElement>, "onSelect"> {
1166
+ icon?: React$1.ReactNode;
1167
+ /** Small caption above the value. */
1168
+ label?: React$1.ReactNode;
1169
+ onSelect?: () => void;
1170
+ /** Trailing node; defaults to a chevron when interactive. Pass `null` to suppress. */
1171
+ trailing?: React$1.ReactNode;
1172
+ /** Render the value in the muted placeholder colour. */
1173
+ muted?: boolean;
1174
+ }
1175
+ declare const TimeLoggerField: React$1.ForwardRefExoticComponent<TimeLoggerFieldProps & React$1.RefAttributes<HTMLElement>>;
1176
+ interface TimeLoggerNotesProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "value" | "onChange"> {
1177
+ value?: string;
1178
+ onValueChange?: (value: string) => void;
1179
+ icon?: React$1.ReactNode;
1180
+ }
1181
+ declare const TimeLoggerNotes: React$1.ForwardRefExoticComponent<TimeLoggerNotesProps & React$1.RefAttributes<HTMLInputElement>>;
1182
+ interface TimeLoggerTier {
1183
+ id: string;
1184
+ name: React$1.ReactNode;
1185
+ /** Hourly rate in the panel currency; shown in the tier menu's right column. */
1186
+ rate: number;
1187
+ }
1188
+ interface TimeLoggerBillableProps extends React$1.HTMLAttributes<HTMLDivElement> {
1189
+ billable: boolean;
1190
+ onBillableChange?: (billable: boolean) => void;
1191
+ /** Defaults to "Billable" / "Non-billable" derived from `billable`. */
1192
+ label?: React$1.ReactNode;
1193
+ /** Pricing tiers shown in the settings pop-view. Omit to hide the gear. */
1194
+ tiers?: TimeLoggerTier[];
1195
+ tierId?: string;
1196
+ onTierChange?: (id: string) => void;
1197
+ /** ISO currency for tier-rate formatting. Default `"USD"`. */
1198
+ currency?: string;
1199
+ /** Computed amount readout (rate × time). Pass a formatted node, or omit. */
1200
+ amount?: React$1.ReactNode;
1201
+ }
1202
+ declare const TimeLoggerBillable: React$1.ForwardRefExoticComponent<TimeLoggerBillableProps & React$1.RefAttributes<HTMLDivElement>>;
1203
+ type TimeLoggerActionsProps = React$1.HTMLAttributes<HTMLDivElement>;
1204
+ declare const TimeLoggerActions: React$1.ForwardRefExoticComponent<TimeLoggerActionsProps & React$1.RefAttributes<HTMLDivElement>>;
1205
+ interface TimeLoggerEntryListProps extends React$1.HTMLAttributes<HTMLDivElement> {
1206
+ /** Day group caption, e.g. "Fri, May 29". */
1207
+ dayLabel?: React$1.ReactNode;
1208
+ /** Right-aligned day subtotal, e.g. "2h 10m". */
1209
+ total?: React$1.ReactNode;
1210
+ }
1211
+ declare const TimeLoggerEntryList: React$1.ForwardRefExoticComponent<TimeLoggerEntryListProps & React$1.RefAttributes<HTMLDivElement>>;
1212
+ interface TimeLoggerEntryProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
1213
+ title: React$1.ReactNode;
1214
+ /** Secondary line — time range, billable amount, etc. */
1215
+ meta?: React$1.ReactNode;
1216
+ duration: React$1.ReactNode;
1217
+ onResume?: () => void;
1218
+ onDelete?: () => void;
1219
+ }
1220
+ declare const TimeLoggerEntry: React$1.ForwardRefExoticComponent<TimeLoggerEntryProps & React$1.RefAttributes<HTMLDivElement>>;
1221
+ type TimeLoggerFooterProps = React$1.HTMLAttributes<HTMLDivElement>;
1222
+ declare const TimeLoggerFooter: React$1.ForwardRefExoticComponent<TimeLoggerFooterProps & React$1.RefAttributes<HTMLDivElement>>;
1223
+
1224
+ /**
1225
+ * SuggestionPills — a horizontal strip of AI quick-reply pills, typically
1226
+ * floated above a message composer when the last inbound message warrants a
1227
+ * fast response.
1228
+ *
1229
+ * The pills materialise with a staggered "magic smoke" entrance (the bar
1230
+ * rises, the sparkle pulses, each pill puffs in) driven by the shipped
1231
+ * `.ds-suggestion-*` classes — motion is suppressed under
1232
+ * `prefers-reduced-motion`. Presentational and controlled: the consumer
1233
+ * supplies the suggestion strings and a pick handler.
1234
+ *
1235
+ * <SuggestionPills
1236
+ * suggestions={["Sounds good — thanks!", "Could you send the W-2?"]}
1237
+ * onPick={(text) => editor.insert(text)}
1238
+ * loading={generating}
1239
+ * />
1240
+ *
1241
+ * Returns `null` when not loading and there are no suggestions, so it can be
1242
+ * rendered unconditionally.
1243
+ *
1244
+ * @since 1.5.0
1245
+ */
1246
+ interface SuggestionPillsProps {
1247
+ /** Suggestion strings to render as pills. */
1248
+ suggestions: string[];
1249
+ /** Fired with the picked suggestion text. */
1250
+ onPick: (text: string) => void;
1251
+ /** Show skeleton pills while suggestions are being generated. */
1252
+ loading?: boolean;
1253
+ /** Strip label. Default: `"Smart replies"`. */
1254
+ label?: string;
1255
+ /** Extra classes on the bar. */
1256
+ className?: string;
1257
+ }
1258
+ /**
1259
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
1260
+ * Owner: PRO communications, which decides to adopt, contribute or release
1261
+ * the name. Never removed before 3.0.
1262
+ */
1263
+ declare function SuggestionPills({ suggestions, onPick, loading, label, className, }: SuggestionPillsProps): react_jsx_runtime.JSX.Element | null;
1264
+ declare namespace SuggestionPills {
1265
+ var displayName: string;
1266
+ }
1267
+
1268
+ /**
1269
+ * AiDraftCard — the "lit-from-within" slab that presents an AI-generated
1270
+ * message draft inside a composer.
1271
+ *
1272
+ * It owns four visual states behind one prop:
1273
+ * - `loading` / `refining` — a sparkle + shimmer skeleton over the flowing
1274
+ * neon `.ds-ai-surface`.
1275
+ * - `error` — a quiet destructive panel with an optional Retry and a
1276
+ * Dismiss.
1277
+ * - `ready` — the collapsible draft: header (sparkle, "AI Draft",
1278
+ * optional context line, collapse toggle), an optional subject line, the
1279
+ * draft `children`, and a footer `actions` slot.
1280
+ *
1281
+ * Presentational only — the consumer supplies the draft text as `children`
1282
+ * and the action buttons (Insert / Regenerate / Shorter / …) as `actions`.
1283
+ * The card re-expands automatically whenever fresh `children` arrive (keyed
1284
+ * off `resetCollapseKey`) so a refined draft is never hidden behind a stale
1285
+ * collapsed state.
1286
+ *
1287
+ * <AiDraftCard
1288
+ * state="ready"
1289
+ * contextLine="Replying to Jane"
1290
+ * subject="Re: Your 2024 return"
1291
+ * resetCollapseKey={draftText}
1292
+ * actions={<><Button size="sm">Insert</Button>…</>}
1293
+ * >
1294
+ * <p className="whitespace-pre-wrap">{draftText}</p>
1295
+ * </AiDraftCard>
1296
+ *
1297
+ * @since 1.5.0
1298
+ */
1299
+ type AiDraftState = "loading" | "refining" | "error" | "ready";
1300
+ interface AiDraftCardProps {
1301
+ /** Which visual state to render. */
1302
+ state: AiDraftState;
1303
+ /** Header title. Default: `"AI Draft"`. */
1304
+ title?: string;
1305
+ /** Optional muted context line in the header (e.g. "Replying to Jane"). */
1306
+ contextLine?: ReactNode;
1307
+ /** Optional bold subject line shown above the body (email drafts). */
1308
+ subject?: ReactNode;
1309
+ /** The draft body — typically a `<p className="whitespace-pre-wrap">`. */
1310
+ children?: ReactNode;
1311
+ /** Footer action buttons (Insert / Regenerate / Discard …). */
1312
+ actions?: ReactNode;
1313
+ /** Error message — shown when `state="error"`. */
1314
+ error?: ReactNode;
1315
+ /** Retry handler — adds a Retry button to the error panel. */
1316
+ onRetry?: () => void;
1317
+ /** Dismiss handler for the error panel. */
1318
+ onDismiss?: () => void;
1319
+ /** Re-expands the card whenever this value changes (pass the draft text so
1320
+ * a freshly generated/refined draft is always revealed). */
1321
+ resetCollapseKey?: unknown;
1322
+ className?: string;
1323
+ }
1324
+ /**
1325
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
1326
+ * Owner: PRO communications, which decides to adopt, contribute or release
1327
+ * the name. Never removed before 3.0.
1328
+ */
1329
+ declare function AiDraftCard({ state, title, contextLine, subject, children, actions, error, onRetry, onDismiss, resetCollapseKey, className, }: AiDraftCardProps): react_jsx_runtime.JSX.Element;
1330
+ declare namespace AiDraftCard {
1331
+ var displayName: string;
1332
+ }
1333
+
1334
+ /**
1335
+ * EmailMessageCard — renders an email message as an envelope-style card
1336
+ * (header strip / readable body / footer) inside a conversation thread,
1337
+ * replacing the "rich HTML stuffed into a chat bubble" anti-pattern.
1338
+ *
1339
+ * Anatomy:
1340
+ * - a meta line ("Name via Email · 3:42 PM") above the card,
1341
+ * - a tinted header strip with a mail glyph, the "EMAIL" eyebrow, the
1342
+ * subject, a "From …" / optional "Cc N" sub-line, and the time,
1343
+ * - a readable body (`children`) that auto-clamps past `clampHeight` with a
1344
+ * gradient fade and a "Show full email" toggle,
1345
+ * - an optional footer carrying `attachments`, a `status` slot, and
1346
+ * `actions` (e.g. a Reply button).
1347
+ *
1348
+ * Presentational only. The consumer sanitises and renders the email HTML as
1349
+ * `children`, supplies the avatar, and brings its own attachment chips /
1350
+ * status indicator / Reply control via slots. Direction flips the layout:
1351
+ * outbound aligns right with a brand-tinted border; inbound aligns left.
1352
+ *
1353
+ * <EmailMessageCard
1354
+ * direction="inbound"
1355
+ * senderName="Jane Cooper"
1356
+ * subject="Question about my W-2"
1357
+ * time="3:42 PM"
1358
+ * avatar={<Avatar name="Jane Cooper" size="xs" />}
1359
+ * ccCount={2}
1360
+ * attachments={<AttachmentChip … />}
1361
+ * actions={<Button size="sm" variant="outline">Reply</Button>}
1362
+ * >
1363
+ * <div dangerouslySetInnerHTML={{ __html: safeHtml }} />
1364
+ * </EmailMessageCard>
1365
+ *
1366
+ * @since 1.5.0
1367
+ */
1368
+ interface EmailMessageCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
1369
+ /** Message direction — flips alignment and border treatment. */
1370
+ direction: "inbound" | "outbound";
1371
+ /** Sender display name. */
1372
+ senderName: string;
1373
+ /** Email subject — omitted for replies without one. */
1374
+ subject?: string;
1375
+ /** Pre-formatted send time (e.g. "3:42 PM"). */
1376
+ time: string;
1377
+ /** Channel label in the meta line. Default: `"Email"`. */
1378
+ via?: string;
1379
+ /** Avatar node — rendered for inbound messages only. */
1380
+ avatar?: ReactNode;
1381
+ /** Cc recipient count — shows a "Cc N" indicator when > 0. */
1382
+ ccCount?: number;
1383
+ /** Sanitised email body (HTML node or plain text). */
1384
+ children: ReactNode;
1385
+ /** Footer attachment chips. */
1386
+ attachments?: ReactNode;
1387
+ /** Footer status slot (delivery state). */
1388
+ status?: ReactNode;
1389
+ /** Footer actions (e.g. Reply). */
1390
+ actions?: ReactNode;
1391
+ /** Body height (px) above which the clamp/expand toggle appears. Default 240. */
1392
+ clampHeight?: number;
1393
+ }
1394
+ /**
1395
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
1396
+ * Owner: PRO communications, which decides to adopt, contribute or release
1397
+ * the name. Never removed before 3.0.
1398
+ */
1399
+ declare function EmailMessageCard({ direction, senderName, subject, time, via, avatar, ccCount, children, attachments, status, actions, clampHeight, className, ...props }: EmailMessageCardProps): react_jsx_runtime.JSX.Element;
1400
+ declare namespace EmailMessageCard {
1401
+ var displayName: string;
1402
+ }
1403
+
1404
+ /**
1405
+ * SignatureEditor — the panel chrome for editing a personal email signature
1406
+ * (rich text, links, and an inline banner image). Designed to live inside a
1407
+ * Popover anchored to a "Pen" affordance in the email composer, but it's just
1408
+ * a self-contained card so it works in a Dialog or settings page too.
1409
+ *
1410
+ * Like `MessageComposer`, DS owns the CHROME and the consumer owns the
1411
+ * EDITOR: pass your rich-text editor (Tiptap, contenteditable, etc.) as
1412
+ * `children`. The panel supplies the titled header with an "Add image"
1413
+ * action, a body region (with a loading skeleton), and a Save / Insert
1414
+ * footer. All actions are slots/handlers — persistence, image upload, and
1415
+ * insertion logic stay with the consumer.
1416
+ *
1417
+ * <Popover>
1418
+ * <PopoverContent className="w-96 p-0">
1419
+ * <SignatureEditor
1420
+ * loading={loading}
1421
+ * addingImage={uploading}
1422
+ * onAddImage={pickImage}
1423
+ * saving={saving}
1424
+ * onSave={save}
1425
+ * onInsert={insert}
1426
+ * >
1427
+ * <RichTextEditor ref={editorRef} />
1428
+ * </SignatureEditor>
1429
+ * </PopoverContent>
1430
+ * </Popover>
1431
+ *
1432
+ * @since 1.5.0
1433
+ */
1434
+ interface SignatureEditorProps {
1435
+ /** Panel title. Default: `"Email signature"`. */
1436
+ title?: string;
1437
+ /** The editor — a rich-text input the consumer owns. */
1438
+ children: ReactNode;
1439
+ /** Show a loading skeleton in place of the editor (while the saved
1440
+ * signature is being fetched). */
1441
+ loading?: boolean;
1442
+ /** "Add image" handler — hides the button when omitted. */
1443
+ onAddImage?: () => void;
1444
+ /** Spinner + disabled state on the "Add image" button while uploading. */
1445
+ addingImage?: boolean;
1446
+ /** Save handler — hides the Save button when omitted. */
1447
+ onSave?: () => void;
1448
+ /** Spinner + disabled state on Save. */
1449
+ saving?: boolean;
1450
+ /** Insert handler — hides the Insert button when omitted. */
1451
+ onInsert?: () => void;
1452
+ className?: string;
1453
+ }
1454
+ /**
1455
+ * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.
1456
+ * Owner: PRO communications, which decides to adopt, contribute or release
1457
+ * the name. Never removed before 3.0.
1458
+ */
1459
+ declare function SignatureEditor({ title, children, loading, onAddImage, addingImage, onSave, saving, onInsert, className, }: SignatureEditorProps): react_jsx_runtime.JSX.Element;
1460
+ declare namespace SignatureEditor {
1461
+ var displayName: string;
1462
+ }
1463
+
1464
+ export { AIReceiptPanel, type AIReceiptPanelProps, type AIReceiptResult, AiDraftCard, type AiDraftCardProps, type AiDraftState, AttentionItem, type AttentionItemProps, type AttentionUrgency, Blockquote, BottomNav, type BottomNavProps, type BottomNavTab, CategoryDivider, type CategoryDividerProps, CategoryTag, type CategoryTagProps, type CategoryTone, type ChannelTabItem, ChannelTabs, type ChannelTabsProps, type ChannelTone, ClientRailGroupHeader, type ClientRailGroupHeaderProps, ClientRailItem, type ClientRailItemProps, DashGrid, type DashGridProps, type DashWidget, DocumentChecklist, type DocumentChecklistFile, type DocumentChecklistItem, type DocumentChecklistProps, type DocumentChecklistStatus, DocumentFileCard, type DocumentFileCardProps, DocumentFileLine, type DocumentFileLineProps, DocumentFileRow, type DocumentFileRowProps, type DocumentItemState, type DocumentRequestActivityKind, type DocumentRequestAssigneeOption, DocumentRequestCard, type DocumentRequestCardProps, DocumentRequestDetail, type DocumentRequestDetailActivityEvent, type DocumentRequestDetailComment, type DocumentRequestDetailDoc, type DocumentRequestDetailProps, type DocumentRequestDetailTab, DocumentRequestField, type DocumentRequestFieldProps, type DocumentRequestItemSummary, type DocumentRequestRequestedItem, type DocumentRequestReviewStatusOption, type DocumentRequestTone, DocumentRequestUpload, type DocumentRequestUploadFile, type DocumentRequestUploadProps, type DocumentSource, DocumentSourceFilter, type DocumentSourceFilterProps, type DocumentSourceFilterValue, DocumentSourceTag, type DocumentSourceTagProps, DocumentsWorkspaceLayout, type DocumentsWorkspaceLayoutProps, EmailMessageCard, type EmailMessageCardProps, EngagementCard, type EngagementCardProps, EngagementTimeline, type EngagementTimelineProps, EngagementTimelineStep, type EngagementTimelineStepProps, IntentBadge, type IntentBadgeProps, type IntentTone, type MissingDocumentItem, MissingDocumentsPanel, type MissingDocumentsPanelProps, NewMenu, type NewMenuAction, type NewMenuGroup, type NewMenuProps, type PillStatus, Section, SectionHead, SectionHeader, SignatureEditor, type SignatureEditorProps, Stat, StatusPill, type StatusPillProps, SuggestionPills, type SuggestionPillsProps, TeamMemberSelect, TimeLogger, TimeLoggerActions, type TimeLoggerActionsProps, TimeLoggerBillable, type TimeLoggerBillableProps, TimeLoggerContextRow, type TimeLoggerContextRowProps, TimeLoggerEntry, TimeLoggerEntryList, type TimeLoggerEntryListProps, type TimeLoggerEntryProps, TimeLoggerField, type TimeLoggerFieldProps, TimeLoggerFooter, type TimeLoggerFooterProps, TimeLoggerHeader, type TimeLoggerHeaderProps, TimeLoggerNotes, type TimeLoggerNotesProps, type TimeLoggerPhase, type TimeLoggerProps, type TimeLoggerTier, TimeLoggerTimer, type TimeLoggerTimerProps, type TimelineState, type UseStopwatchReturn, formatClock, formatCurrency, formatDuration, parseDuration, useStopwatch };