@arbidocs/blocks 0.3.154 → 0.3.155

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -532,6 +532,119 @@ declare function Toolbar({ search, onSearch, searchPlaceholder, filters, actions
532
532
  testId?: string;
533
533
  }): react.JSX.Element;
534
534
 
535
+ /** Longest a name may be. Exported so a form editing the same field agrees. */
536
+ declare const IDENTITY_NAME_MAX_LENGTH = 50;
537
+ interface EntityIdentityField {
538
+ /** Row caption. Rendered with a trailing colon. */
539
+ label: string;
540
+ value: string;
541
+ /** Stands in for an empty value, in italics — never a blank row. */
542
+ placeholder: string;
543
+ /** Commits the edit. Not called when the value is unchanged. */
544
+ onSave: (next: string) => void;
545
+ /** A description needs line breaks; a name does not. */
546
+ multiline?: boolean;
547
+ /** Caps the input and shows a counter as it fills. Names only, by default. */
548
+ maxLength?: number;
549
+ /** Classes for the read-mode value, e.g. a larger weight for the name. */
550
+ valueClassName?: string;
551
+ /**
552
+ * Content pinned to the RIGHT END of this row — e.g. the owning project
553
+ * beside a name, a member stack beside a status. Rows without one let their
554
+ * value run the full width, which is what a description wants.
555
+ */
556
+ trailing?: ReactNode;
557
+ /** Row test id; the pencil and input derive `-edit` and `-input`. */
558
+ testId?: string;
559
+ }
560
+ interface EntityIdentityBarProps {
561
+ /** The editable text fields, in order. Usually name then description. */
562
+ fields: EntityIdentityField[];
563
+ /**
564
+ * Read-only rows shown after the editable ones — anything whose control the
565
+ * consumer owns (a project picker, an owner avatar, a status). Rendered with
566
+ * the same caption column so every row lines up.
567
+ */
568
+ extraRows?: {
569
+ label: string;
570
+ content: ReactNode;
571
+ trailing?: ReactNode;
572
+ testId?: string;
573
+ }[];
574
+ /** Hides every pencil. A viewer without permission sees values, not controls. */
575
+ canEdit?: boolean;
576
+ /** Trailing controls, pinned right — e.g. a member stack, a status. */
577
+ actions?: ReactNode;
578
+ /**
579
+ * Controls that act on the ENTITY rather than on any one field — typically an
580
+ * overflow menu holding delete or leave. Sits under the field list, where a
581
+ * destructive action is findable but not in the path of everyday reading.
582
+ */
583
+ footer?: ReactNode;
584
+ className?: string;
585
+ testId?: string;
586
+ }
587
+ /**
588
+ * The "what am I looking at" bar for an entity's own page.
589
+ *
590
+ * A caption column (`Name:`, `Description:`, `Project:`) and a value column. The
591
+ * captions are the point: a bare bold string at the top of a page reads equally
592
+ * as a workspace, a project, a matter or a folder, and people read it as
593
+ * whichever they expected. Saying which field is which costs one column and
594
+ * removes the ambiguity entirely.
595
+ *
596
+ * Editing happens in place. The pencil is always visible to someone who can use
597
+ * it rather than revealed on hover — a control you have to go hunting for is one
598
+ * most people never find, and hover doesn't exist on touch. Commit is on blur
599
+ * and on Enter (single-line fields only, so a description can hold line
600
+ * breaks); Escape abandons the edit.
601
+ *
602
+ * Deliberately NOT a form: no submit, no dirty state, no field-level errors.
603
+ * When a consumer needs visibility toggles, destructive actions or validation
604
+ * messages, those belong in its settings form — this bar is the identity of the
605
+ * thing, shown where you are working on it.
606
+ *
607
+ * Styled with SEMANTIC tokens only, so every firm gets it in its own colours.
608
+ */
609
+ declare function EntityIdentityBar({ fields, extraRows, canEdit, actions, footer, className, testId, }: EntityIdentityBarProps): react.JSX.Element;
610
+
611
+ /** One face in the stack — source-agnostic, not a raw SDK user. */
612
+ interface StackedMember {
613
+ name: string;
614
+ picture?: string | null;
615
+ }
616
+ interface MemberAvatarStackProps {
617
+ members: StackedMember[];
618
+ /** Total, when it exceeds what's shown. Defaults to `members.length`. */
619
+ total?: number;
620
+ /** Faces before the rest collapse into a `+N`. */
621
+ max?: number;
622
+ /**
623
+ * The viewer isn't allowed to see who is here (e.g. row-level security hides
624
+ * the members of a public workspace you haven't joined). Renders an em dash
625
+ * rather than lying with an empty stack.
626
+ */
627
+ hidden?: boolean;
628
+ /** Makes the stack a button — e.g. to expand the member list below it. */
629
+ onClick?: () => void;
630
+ /** Rotates the chevron and drives `aria-expanded` when it is a toggle. */
631
+ expanded?: boolean;
632
+ /** Ring colour behind each face; match the surface it sits on. */
633
+ ringClassName?: string;
634
+ className?: string;
635
+ testId?: string;
636
+ }
637
+ /**
638
+ * An overlapping stack of member faces, with the overflow collapsed to `+N`.
639
+ *
640
+ * Lives here rather than inside a card because "who is in this thing" is shown
641
+ * in more than one place — a workspace card, a workspace's own header — and
642
+ * those had drawn it twice. Given `onClick` it becomes the control that expands
643
+ * the full list, which is a better affordance than a button labelled "Members"
644
+ * beside the very faces it would reveal.
645
+ */
646
+ declare function MemberAvatarStack({ members, total, max, hidden, onClick, expanded, ringClassName, className, testId, }: MemberAvatarStackProps): react.JSX.Element;
647
+
535
648
  interface MetricCardProps {
536
649
  label: string;
537
650
  value: string | number;
@@ -553,6 +666,86 @@ interface MetricCardProps {
553
666
  /** The one true KPI tile. Used across every dashboard and module header. */
554
667
  declare function MetricCard({ label, value, icon: Icon, hint, delta, accent, testId, }: MetricCardProps): react.JSX.Element;
555
668
 
669
+ /** One listed item. Source-agnostic: a chat, a file, a matter, a person. */
670
+ interface RecentActivityRow {
671
+ id: string;
672
+ /**
673
+ * The row's avatar/logo — a person's face, a file-type mark, a tinted glyph.
674
+ * Supplied by the consumer, because only it knows what these things look
675
+ * like.
676
+ */
677
+ leading?: ReactNode;
678
+ title: string;
679
+ /** Second line: what this row is, in a few words. */
680
+ subtitle?: string;
681
+ /** Pinned right on the second line, like a message time. */
682
+ meta?: string;
683
+ onClick?: () => void;
684
+ /**
685
+ * A control rendered beside the row, OUTSIDE its button — e.g. a role
686
+ * dropdown. It cannot live inside the button: nested interactives are invalid
687
+ * and the button would eat the click. Supplying this hides `meta`, since they
688
+ * compete for the same edge.
689
+ */
690
+ trailing?: ReactNode;
691
+ }
692
+ interface RecentActivityCardProps {
693
+ /** Glyph beside the title, in the header. */
694
+ icon?: LucideIcon;
695
+ /** The section this card is about — "Chats", "Matters", "Members". */
696
+ title: string;
697
+ /** Total across everything, not just what's listed. Omit to hide. */
698
+ count?: number;
699
+ /** Header click — go to this section's full page. */
700
+ onOpen?: () => void;
701
+ /** Secondary action that CREATES one. Omit the label to hide the button. */
702
+ actionLabel?: string;
703
+ actionIcon?: LucideIcon;
704
+ onAction?: () => void;
705
+ rows: RecentActivityRow[];
706
+ /** Says what the list is — "Recent", "Recently joined". */
707
+ caption?: string;
708
+ /** Shown instead of the list when there is nothing yet. */
709
+ emptyText?: ReactNode;
710
+ /**
711
+ * Verb for the empty card's call to action, e.g. "New chat" rather than the
712
+ * header button's terse "New". An empty card is mostly whitespace, and that
713
+ * whitespace is the best invitation the card will ever get — so it becomes
714
+ * the action, at full size. Defaults to `actionLabel`; the CTA only appears
715
+ * when there is an `onAction` to run.
716
+ */
717
+ emptyActionLabel?: string;
718
+ /** Extra classes on the card root. */
719
+ className?: string;
720
+ /** Root test id; children derive `-open`, `-action`, `-caption`, `-row`. */
721
+ testId?: string;
722
+ }
723
+ /**
724
+ * A section's recent items, as a card you can get back INTO the work through.
725
+ *
726
+ * Three parts, and the split is the point:
727
+ *
728
+ * - the HEADER links to that section's full page. Clicking the thing's name
729
+ * should take you to the thing.
730
+ * - the BODY lists what changed most recently, each row jumping straight to
731
+ * that item.
732
+ * - the ACTION creates a new one, kept visually distinct from the header link
733
+ * so "go there" and "make one" are never the same click.
734
+ *
735
+ * Deliberately NOT a KPI tile — that's {@link MetricCard}. A count tells a
736
+ * returning professional nothing they need: "128 documents" doesn't help you
737
+ * resume work, whereas the name of the file you touched an hour ago does. The
738
+ * count rides along as a caption beside the title, not as the content.
739
+ *
740
+ * The row anatomy is the DM conversation chip's (leading avatar, bold name
741
+ * line, muted second line with the time pinned right), because a list of
742
+ * recognisable things reads the same way whoever owns it.
743
+ *
744
+ * Styled with SEMANTIC tokens only (card, border, foreground, muted-foreground,
745
+ * primary, accent), so every firm gets it in its own colours.
746
+ */
747
+ declare function RecentActivityCard({ icon: Icon, title, count, onOpen, actionLabel, actionIcon: ActionIcon, onAction, rows, caption, emptyText, emptyActionLabel, className, testId, }: RecentActivityCardProps): react.JSX.Element;
748
+
556
749
  /** One member shown in the avatar stack — source-agnostic, not the raw SDK shape. */
557
750
  interface WorkspaceCardMember {
558
751
  name: string;
@@ -1298,4 +1491,4 @@ interface AgentsPanelProps {
1298
1491
  }
1299
1492
  declare function AgentsPanel({ store, testIdPrefix }: AgentsPanelProps): react.JSX.Element;
1300
1493
 
1301
- export { ASSET_REF_PREFIX, type AgentSelectionStore, AgentsPanel, type AgentsPanelProps, type AiFields, type AiFieldsConfig, AppHeader, type AppHeaderProps, type AppHeaderUser, type AppNavItem, type AppNavSection, AppShell, type AppShellProps, type ArbiBlocksConfigOptions, type ArbiMode, type ArbiUser, type AssetMaterializer, type AssetRenderProps, type AssetRenderer, AssetResolverProvider, AssetThumb, type AssistantCitation, type AssistantMessage, type AssistantStep, type BlockKit, type BuildPrompt, type BuilderModule, CitationEditor, type CitationEditorProps, type Column, ConnectionProvider, type ConnectionStatus, DataTable, DataTableBlock, type DataTableBlockColumn, type DataTableBlockProps, EmptyState, type ExportedModule, type FirmArbiConfig, GridView, type GridViewEmptyState, type GridViewProps, type GridViewSelection, type ImageFieldConfig, type ImageFieldFactory, LegalArbiProvider, LiveDataProvider, type LoadResult, type MaterializeOptions, type MatterContext, MetricCard, type MetricCardProps, ModuleManager, type ModuleManagerProps, type ModuleRegistry, type ModuleStoreBundle, PageHeader, PageRenderer, type PageRendererProps, type PersistVia, type PromptConfig, type PromptLibrary, type Prompts, type ResolvedModule, Section, type SectionProps, StatGroup, type StatGroupProps, type StatItem, StudioEditor, type StudioEditorProps, type StudioPageMeta, type StudioPersistence, type StudioPersistenceConfig, ThemeBundle, ThemeState, ThemeTokens, Toolbar, UploadDropzone, type UploadDropzoneProps, type UseImageGen, VerticalBuilder, type VerticalBuilderProps, type VerticalConfig, type VerticalExport, type VerticalExportConfig, WidgetPlaceholder, WorkspaceCard, type WorkspaceCardMember, type WorkspaceCardProps, asAssetRef, assetRefId, createAgentSelectionStore, createAiFields, createArbiBlocksConfig, createArbiMaterializer, createBlockKit, createImageField, createLiveWidgets, createModuleRegistry, createModuleStore, createPromptLibrary, createSiteBlocks, createStudioPersistence, createVerticalExport, createWebsiteBlocks, iconMap, isAssetRef, isAuthenticated, materializePageData, matterToContext, useAssetImage, useAssetRenderer, useAssetResolverActive, useConnection, useFirmAiTask, useImageGen, useLiveDataActive, useSemanticSearch, useWorkspaceDocs };
1494
+ export { ASSET_REF_PREFIX, type AgentSelectionStore, AgentsPanel, type AgentsPanelProps, type AiFields, type AiFieldsConfig, AppHeader, type AppHeaderProps, type AppHeaderUser, type AppNavItem, type AppNavSection, AppShell, type AppShellProps, type ArbiBlocksConfigOptions, type ArbiMode, type ArbiUser, type AssetMaterializer, type AssetRenderProps, type AssetRenderer, AssetResolverProvider, AssetThumb, type AssistantCitation, type AssistantMessage, type AssistantStep, type BlockKit, type BuildPrompt, type BuilderModule, CitationEditor, type CitationEditorProps, type Column, ConnectionProvider, type ConnectionStatus, DataTable, DataTableBlock, type DataTableBlockColumn, type DataTableBlockProps, EmptyState, EntityIdentityBar, type EntityIdentityBarProps, type EntityIdentityField, type ExportedModule, type FirmArbiConfig, GridView, type GridViewEmptyState, type GridViewProps, type GridViewSelection, IDENTITY_NAME_MAX_LENGTH, type ImageFieldConfig, type ImageFieldFactory, LegalArbiProvider, LiveDataProvider, type LoadResult, type MaterializeOptions, type MatterContext, MemberAvatarStack, type MemberAvatarStackProps, MetricCard, type MetricCardProps, ModuleManager, type ModuleManagerProps, type ModuleRegistry, type ModuleStoreBundle, PageHeader, PageRenderer, type PageRendererProps, type PersistVia, type PromptConfig, type PromptLibrary, type Prompts, RecentActivityCard, type RecentActivityCardProps, type RecentActivityRow, type ResolvedModule, Section, type SectionProps, type StackedMember, StatGroup, type StatGroupProps, type StatItem, StudioEditor, type StudioEditorProps, type StudioPageMeta, type StudioPersistence, type StudioPersistenceConfig, ThemeBundle, ThemeState, ThemeTokens, Toolbar, UploadDropzone, type UploadDropzoneProps, type UseImageGen, VerticalBuilder, type VerticalBuilderProps, type VerticalConfig, type VerticalExport, type VerticalExportConfig, WidgetPlaceholder, WorkspaceCard, type WorkspaceCardMember, type WorkspaceCardProps, asAssetRef, assetRefId, createAgentSelectionStore, createAiFields, createArbiBlocksConfig, createArbiMaterializer, createBlockKit, createImageField, createLiveWidgets, createModuleRegistry, createModuleStore, createPromptLibrary, createSiteBlocks, createStudioPersistence, createVerticalExport, createWebsiteBlocks, iconMap, isAssetRef, isAuthenticated, materializePageData, matterToContext, useAssetImage, useAssetRenderer, useAssetResolverActive, useConnection, useFirmAiTask, useImageGen, useLiveDataActive, useSemanticSearch, useWorkspaceDocs };
package/dist/index.d.ts CHANGED
@@ -532,6 +532,119 @@ declare function Toolbar({ search, onSearch, searchPlaceholder, filters, actions
532
532
  testId?: string;
533
533
  }): react.JSX.Element;
534
534
 
535
+ /** Longest a name may be. Exported so a form editing the same field agrees. */
536
+ declare const IDENTITY_NAME_MAX_LENGTH = 50;
537
+ interface EntityIdentityField {
538
+ /** Row caption. Rendered with a trailing colon. */
539
+ label: string;
540
+ value: string;
541
+ /** Stands in for an empty value, in italics — never a blank row. */
542
+ placeholder: string;
543
+ /** Commits the edit. Not called when the value is unchanged. */
544
+ onSave: (next: string) => void;
545
+ /** A description needs line breaks; a name does not. */
546
+ multiline?: boolean;
547
+ /** Caps the input and shows a counter as it fills. Names only, by default. */
548
+ maxLength?: number;
549
+ /** Classes for the read-mode value, e.g. a larger weight for the name. */
550
+ valueClassName?: string;
551
+ /**
552
+ * Content pinned to the RIGHT END of this row — e.g. the owning project
553
+ * beside a name, a member stack beside a status. Rows without one let their
554
+ * value run the full width, which is what a description wants.
555
+ */
556
+ trailing?: ReactNode;
557
+ /** Row test id; the pencil and input derive `-edit` and `-input`. */
558
+ testId?: string;
559
+ }
560
+ interface EntityIdentityBarProps {
561
+ /** The editable text fields, in order. Usually name then description. */
562
+ fields: EntityIdentityField[];
563
+ /**
564
+ * Read-only rows shown after the editable ones — anything whose control the
565
+ * consumer owns (a project picker, an owner avatar, a status). Rendered with
566
+ * the same caption column so every row lines up.
567
+ */
568
+ extraRows?: {
569
+ label: string;
570
+ content: ReactNode;
571
+ trailing?: ReactNode;
572
+ testId?: string;
573
+ }[];
574
+ /** Hides every pencil. A viewer without permission sees values, not controls. */
575
+ canEdit?: boolean;
576
+ /** Trailing controls, pinned right — e.g. a member stack, a status. */
577
+ actions?: ReactNode;
578
+ /**
579
+ * Controls that act on the ENTITY rather than on any one field — typically an
580
+ * overflow menu holding delete or leave. Sits under the field list, where a
581
+ * destructive action is findable but not in the path of everyday reading.
582
+ */
583
+ footer?: ReactNode;
584
+ className?: string;
585
+ testId?: string;
586
+ }
587
+ /**
588
+ * The "what am I looking at" bar for an entity's own page.
589
+ *
590
+ * A caption column (`Name:`, `Description:`, `Project:`) and a value column. The
591
+ * captions are the point: a bare bold string at the top of a page reads equally
592
+ * as a workspace, a project, a matter or a folder, and people read it as
593
+ * whichever they expected. Saying which field is which costs one column and
594
+ * removes the ambiguity entirely.
595
+ *
596
+ * Editing happens in place. The pencil is always visible to someone who can use
597
+ * it rather than revealed on hover — a control you have to go hunting for is one
598
+ * most people never find, and hover doesn't exist on touch. Commit is on blur
599
+ * and on Enter (single-line fields only, so a description can hold line
600
+ * breaks); Escape abandons the edit.
601
+ *
602
+ * Deliberately NOT a form: no submit, no dirty state, no field-level errors.
603
+ * When a consumer needs visibility toggles, destructive actions or validation
604
+ * messages, those belong in its settings form — this bar is the identity of the
605
+ * thing, shown where you are working on it.
606
+ *
607
+ * Styled with SEMANTIC tokens only, so every firm gets it in its own colours.
608
+ */
609
+ declare function EntityIdentityBar({ fields, extraRows, canEdit, actions, footer, className, testId, }: EntityIdentityBarProps): react.JSX.Element;
610
+
611
+ /** One face in the stack — source-agnostic, not a raw SDK user. */
612
+ interface StackedMember {
613
+ name: string;
614
+ picture?: string | null;
615
+ }
616
+ interface MemberAvatarStackProps {
617
+ members: StackedMember[];
618
+ /** Total, when it exceeds what's shown. Defaults to `members.length`. */
619
+ total?: number;
620
+ /** Faces before the rest collapse into a `+N`. */
621
+ max?: number;
622
+ /**
623
+ * The viewer isn't allowed to see who is here (e.g. row-level security hides
624
+ * the members of a public workspace you haven't joined). Renders an em dash
625
+ * rather than lying with an empty stack.
626
+ */
627
+ hidden?: boolean;
628
+ /** Makes the stack a button — e.g. to expand the member list below it. */
629
+ onClick?: () => void;
630
+ /** Rotates the chevron and drives `aria-expanded` when it is a toggle. */
631
+ expanded?: boolean;
632
+ /** Ring colour behind each face; match the surface it sits on. */
633
+ ringClassName?: string;
634
+ className?: string;
635
+ testId?: string;
636
+ }
637
+ /**
638
+ * An overlapping stack of member faces, with the overflow collapsed to `+N`.
639
+ *
640
+ * Lives here rather than inside a card because "who is in this thing" is shown
641
+ * in more than one place — a workspace card, a workspace's own header — and
642
+ * those had drawn it twice. Given `onClick` it becomes the control that expands
643
+ * the full list, which is a better affordance than a button labelled "Members"
644
+ * beside the very faces it would reveal.
645
+ */
646
+ declare function MemberAvatarStack({ members, total, max, hidden, onClick, expanded, ringClassName, className, testId, }: MemberAvatarStackProps): react.JSX.Element;
647
+
535
648
  interface MetricCardProps {
536
649
  label: string;
537
650
  value: string | number;
@@ -553,6 +666,86 @@ interface MetricCardProps {
553
666
  /** The one true KPI tile. Used across every dashboard and module header. */
554
667
  declare function MetricCard({ label, value, icon: Icon, hint, delta, accent, testId, }: MetricCardProps): react.JSX.Element;
555
668
 
669
+ /** One listed item. Source-agnostic: a chat, a file, a matter, a person. */
670
+ interface RecentActivityRow {
671
+ id: string;
672
+ /**
673
+ * The row's avatar/logo — a person's face, a file-type mark, a tinted glyph.
674
+ * Supplied by the consumer, because only it knows what these things look
675
+ * like.
676
+ */
677
+ leading?: ReactNode;
678
+ title: string;
679
+ /** Second line: what this row is, in a few words. */
680
+ subtitle?: string;
681
+ /** Pinned right on the second line, like a message time. */
682
+ meta?: string;
683
+ onClick?: () => void;
684
+ /**
685
+ * A control rendered beside the row, OUTSIDE its button — e.g. a role
686
+ * dropdown. It cannot live inside the button: nested interactives are invalid
687
+ * and the button would eat the click. Supplying this hides `meta`, since they
688
+ * compete for the same edge.
689
+ */
690
+ trailing?: ReactNode;
691
+ }
692
+ interface RecentActivityCardProps {
693
+ /** Glyph beside the title, in the header. */
694
+ icon?: LucideIcon;
695
+ /** The section this card is about — "Chats", "Matters", "Members". */
696
+ title: string;
697
+ /** Total across everything, not just what's listed. Omit to hide. */
698
+ count?: number;
699
+ /** Header click — go to this section's full page. */
700
+ onOpen?: () => void;
701
+ /** Secondary action that CREATES one. Omit the label to hide the button. */
702
+ actionLabel?: string;
703
+ actionIcon?: LucideIcon;
704
+ onAction?: () => void;
705
+ rows: RecentActivityRow[];
706
+ /** Says what the list is — "Recent", "Recently joined". */
707
+ caption?: string;
708
+ /** Shown instead of the list when there is nothing yet. */
709
+ emptyText?: ReactNode;
710
+ /**
711
+ * Verb for the empty card's call to action, e.g. "New chat" rather than the
712
+ * header button's terse "New". An empty card is mostly whitespace, and that
713
+ * whitespace is the best invitation the card will ever get — so it becomes
714
+ * the action, at full size. Defaults to `actionLabel`; the CTA only appears
715
+ * when there is an `onAction` to run.
716
+ */
717
+ emptyActionLabel?: string;
718
+ /** Extra classes on the card root. */
719
+ className?: string;
720
+ /** Root test id; children derive `-open`, `-action`, `-caption`, `-row`. */
721
+ testId?: string;
722
+ }
723
+ /**
724
+ * A section's recent items, as a card you can get back INTO the work through.
725
+ *
726
+ * Three parts, and the split is the point:
727
+ *
728
+ * - the HEADER links to that section's full page. Clicking the thing's name
729
+ * should take you to the thing.
730
+ * - the BODY lists what changed most recently, each row jumping straight to
731
+ * that item.
732
+ * - the ACTION creates a new one, kept visually distinct from the header link
733
+ * so "go there" and "make one" are never the same click.
734
+ *
735
+ * Deliberately NOT a KPI tile — that's {@link MetricCard}. A count tells a
736
+ * returning professional nothing they need: "128 documents" doesn't help you
737
+ * resume work, whereas the name of the file you touched an hour ago does. The
738
+ * count rides along as a caption beside the title, not as the content.
739
+ *
740
+ * The row anatomy is the DM conversation chip's (leading avatar, bold name
741
+ * line, muted second line with the time pinned right), because a list of
742
+ * recognisable things reads the same way whoever owns it.
743
+ *
744
+ * Styled with SEMANTIC tokens only (card, border, foreground, muted-foreground,
745
+ * primary, accent), so every firm gets it in its own colours.
746
+ */
747
+ declare function RecentActivityCard({ icon: Icon, title, count, onOpen, actionLabel, actionIcon: ActionIcon, onAction, rows, caption, emptyText, emptyActionLabel, className, testId, }: RecentActivityCardProps): react.JSX.Element;
748
+
556
749
  /** One member shown in the avatar stack — source-agnostic, not the raw SDK shape. */
557
750
  interface WorkspaceCardMember {
558
751
  name: string;
@@ -1298,4 +1491,4 @@ interface AgentsPanelProps {
1298
1491
  }
1299
1492
  declare function AgentsPanel({ store, testIdPrefix }: AgentsPanelProps): react.JSX.Element;
1300
1493
 
1301
- export { ASSET_REF_PREFIX, type AgentSelectionStore, AgentsPanel, type AgentsPanelProps, type AiFields, type AiFieldsConfig, AppHeader, type AppHeaderProps, type AppHeaderUser, type AppNavItem, type AppNavSection, AppShell, type AppShellProps, type ArbiBlocksConfigOptions, type ArbiMode, type ArbiUser, type AssetMaterializer, type AssetRenderProps, type AssetRenderer, AssetResolverProvider, AssetThumb, type AssistantCitation, type AssistantMessage, type AssistantStep, type BlockKit, type BuildPrompt, type BuilderModule, CitationEditor, type CitationEditorProps, type Column, ConnectionProvider, type ConnectionStatus, DataTable, DataTableBlock, type DataTableBlockColumn, type DataTableBlockProps, EmptyState, type ExportedModule, type FirmArbiConfig, GridView, type GridViewEmptyState, type GridViewProps, type GridViewSelection, type ImageFieldConfig, type ImageFieldFactory, LegalArbiProvider, LiveDataProvider, type LoadResult, type MaterializeOptions, type MatterContext, MetricCard, type MetricCardProps, ModuleManager, type ModuleManagerProps, type ModuleRegistry, type ModuleStoreBundle, PageHeader, PageRenderer, type PageRendererProps, type PersistVia, type PromptConfig, type PromptLibrary, type Prompts, type ResolvedModule, Section, type SectionProps, StatGroup, type StatGroupProps, type StatItem, StudioEditor, type StudioEditorProps, type StudioPageMeta, type StudioPersistence, type StudioPersistenceConfig, ThemeBundle, ThemeState, ThemeTokens, Toolbar, UploadDropzone, type UploadDropzoneProps, type UseImageGen, VerticalBuilder, type VerticalBuilderProps, type VerticalConfig, type VerticalExport, type VerticalExportConfig, WidgetPlaceholder, WorkspaceCard, type WorkspaceCardMember, type WorkspaceCardProps, asAssetRef, assetRefId, createAgentSelectionStore, createAiFields, createArbiBlocksConfig, createArbiMaterializer, createBlockKit, createImageField, createLiveWidgets, createModuleRegistry, createModuleStore, createPromptLibrary, createSiteBlocks, createStudioPersistence, createVerticalExport, createWebsiteBlocks, iconMap, isAssetRef, isAuthenticated, materializePageData, matterToContext, useAssetImage, useAssetRenderer, useAssetResolverActive, useConnection, useFirmAiTask, useImageGen, useLiveDataActive, useSemanticSearch, useWorkspaceDocs };
1494
+ export { ASSET_REF_PREFIX, type AgentSelectionStore, AgentsPanel, type AgentsPanelProps, type AiFields, type AiFieldsConfig, AppHeader, type AppHeaderProps, type AppHeaderUser, type AppNavItem, type AppNavSection, AppShell, type AppShellProps, type ArbiBlocksConfigOptions, type ArbiMode, type ArbiUser, type AssetMaterializer, type AssetRenderProps, type AssetRenderer, AssetResolverProvider, AssetThumb, type AssistantCitation, type AssistantMessage, type AssistantStep, type BlockKit, type BuildPrompt, type BuilderModule, CitationEditor, type CitationEditorProps, type Column, ConnectionProvider, type ConnectionStatus, DataTable, DataTableBlock, type DataTableBlockColumn, type DataTableBlockProps, EmptyState, EntityIdentityBar, type EntityIdentityBarProps, type EntityIdentityField, type ExportedModule, type FirmArbiConfig, GridView, type GridViewEmptyState, type GridViewProps, type GridViewSelection, IDENTITY_NAME_MAX_LENGTH, type ImageFieldConfig, type ImageFieldFactory, LegalArbiProvider, LiveDataProvider, type LoadResult, type MaterializeOptions, type MatterContext, MemberAvatarStack, type MemberAvatarStackProps, MetricCard, type MetricCardProps, ModuleManager, type ModuleManagerProps, type ModuleRegistry, type ModuleStoreBundle, PageHeader, PageRenderer, type PageRendererProps, type PersistVia, type PromptConfig, type PromptLibrary, type Prompts, RecentActivityCard, type RecentActivityCardProps, type RecentActivityRow, type ResolvedModule, Section, type SectionProps, type StackedMember, StatGroup, type StatGroupProps, type StatItem, StudioEditor, type StudioEditorProps, type StudioPageMeta, type StudioPersistence, type StudioPersistenceConfig, ThemeBundle, ThemeState, ThemeTokens, Toolbar, UploadDropzone, type UploadDropzoneProps, type UseImageGen, VerticalBuilder, type VerticalBuilderProps, type VerticalConfig, type VerticalExport, type VerticalExportConfig, WidgetPlaceholder, WorkspaceCard, type WorkspaceCardMember, type WorkspaceCardProps, asAssetRef, assetRefId, createAgentSelectionStore, createAiFields, createArbiBlocksConfig, createArbiMaterializer, createBlockKit, createImageField, createLiveWidgets, createModuleRegistry, createModuleStore, createPromptLibrary, createSiteBlocks, createStudioPersistence, createVerticalExport, createWebsiteBlocks, iconMap, isAssetRef, isAuthenticated, materializePageData, matterToContext, useAssetImage, useAssetRenderer, useAssetResolverActive, useConnection, useFirmAiTask, useImageGen, useLiveDataActive, useSemanticSearch, useWorkspaceDocs };