@arbidocs/blocks 0.3.185 → 0.4.1
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/README.md +122 -0
- package/dist/agents/approvals/AuthorizeAgentParts.d.ts +79 -0
- package/dist/agents/approvals/ConsentPage.d.ts +76 -0
- package/dist/agents/approvals/ConsentParts.d.ts +37 -0
- package/dist/agents/approvals/index.d.ts +3 -0
- package/dist/agents/config/ConfigField.d.ts +43 -0
- package/dist/agents/config/ConfigForm.d.ts +35 -0
- package/dist/agents/config/TupleArrayField.d.ts +32 -0
- package/dist/agents/config/index.d.ts +4 -0
- package/dist/agents/config/schema-utils.d.ts +28 -0
- package/dist/agents/definitions/AgentCard.d.ts +63 -0
- package/dist/agents/definitions/AgentCreator.d.ts +118 -0
- package/dist/agents/definitions/AgentEditorParts.d.ts +63 -0
- package/dist/agents/definitions/AgentGallery.d.ts +29 -0
- package/dist/agents/definitions/index.d.ts +4 -0
- package/dist/agents/index.cjs +595 -0
- package/dist/agents/index.cjs.map +1 -0
- package/dist/agents/index.d.ts +7 -0
- package/dist/agents/index.js +14 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/runs/AgentBar.d.ts +103 -0
- package/dist/agents/runs/AgentSteps.d.ts +157 -0
- package/dist/agents/runs/SubagentRoster.d.ts +37 -0
- package/dist/agents/runs/index.d.ts +3 -0
- package/dist/agents/skills/SkillBrowserParts.d.ts +70 -0
- package/dist/agents/skills/SkillCard.d.ts +48 -0
- package/dist/agents/skills/SkillForms.d.ts +64 -0
- package/dist/agents/skills/SkillParts.d.ts +31 -0
- package/dist/agents/skills/SkillRow.d.ts +34 -0
- package/dist/agents/skills/index.d.ts +5 -0
- package/dist/agents/tasks/LiveRunsBanner.d.ts +26 -0
- package/dist/agents/tasks/RecurrenceBuilder.d.ts +36 -0
- package/dist/agents/tasks/TaskComposer.d.ts +108 -0
- package/dist/agents/tasks/TaskPlan.d.ts +78 -0
- package/dist/agents/tasks/TaskRowActions.d.ts +43 -0
- package/dist/agents/tasks/TaskRunsDialog.d.ts +45 -0
- package/dist/agents/tasks/TasksChrome.d.ts +36 -0
- package/dist/agents/tasks/UploadTaskItem.d.ts +39 -0
- package/dist/agents/tasks/UploadTaskList.d.ts +35 -0
- package/dist/agents/tasks/elapsed.d.ts +2 -0
- package/dist/agents/tasks/index.d.ts +13 -0
- package/dist/agents/tasks/rrule.d.ts +36 -0
- package/dist/agents/tasks/taskColumns.d.ts +68 -0
- package/dist/agents/tasks/taskLabels.d.ts +26 -0
- package/dist/agents/workflows/AgentSelect.d.ts +33 -0
- package/dist/agents/workflows/SchemaForm.d.ts +37 -0
- package/dist/agents/workflows/WorkflowConfigDialog.d.ts +73 -0
- package/dist/agents/workflows/WorkflowLauncher.d.ts +38 -0
- package/dist/agents/workflows/index.d.ts +6 -0
- package/dist/agents/workflows/types.d.ts +125 -0
- package/dist/agents/workflows/workflow.d.ts +62 -0
- package/dist/auth/AuthFooter.d.ts +56 -0
- package/dist/auth/AuthForm.d.ts +105 -0
- package/dist/auth/AuthLayout.d.ts +46 -0
- package/dist/auth/PasswordStrengthInput.d.ts +44 -0
- package/dist/auth/RecoveryDialogs.d.ts +90 -0
- package/dist/auth/SsoLoginButton.d.ts +19 -0
- package/dist/auth/index.cjs +123 -0
- package/dist/auth/index.cjs.map +1 -0
- package/dist/auth/index.d.ts +6 -0
- package/dist/auth/index.js +6 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/builder/AgentsPanel.d.ts +9 -0
- package/dist/builder/ModuleManager.d.ts +6 -0
- package/dist/builder/VerticalBuilder.d.ts +32 -0
- package/dist/builder/agents/store.d.ts +21 -0
- package/dist/builder/export.d.ts +30 -0
- package/dist/builder/modules/registry.d.ts +11 -0
- package/dist/builder/modules/store.d.ts +29 -0
- package/dist/builder/modules/types.d.ts +29 -0
- package/dist/builder/types.d.ts +28 -0
- package/dist/chat/BranchControls.d.ts +33 -0
- package/dist/chat/Composer.d.ts +156 -0
- package/dist/chat/ContextChip.d.ts +19 -0
- package/dist/chat/ContextPanel.d.ts +108 -0
- package/dist/chat/ConversationEmpty.d.ts +53 -0
- package/dist/chat/ConversationLayout.d.ts +40 -0
- package/dist/chat/ConversationParts.d.ts +62 -0
- package/dist/chat/ConversationSearchView.d.ts +57 -0
- package/dist/chat/LabelPinRow.d.ts +30 -0
- package/dist/chat/Message.d.ts +189 -0
- package/dist/chat/MessageAlert.d.ts +25 -0
- package/dist/chat/MessageList.d.ts +102 -0
- package/dist/chat/ModelPicker.d.ts +103 -0
- package/dist/chat/PendingAnswerBar.d.ts +36 -0
- package/dist/chat/PinnedDocChip.d.ts +22 -0
- package/dist/chat/SlashMenu.d.ts +57 -0
- package/dist/chat/ThreadMap.d.ts +45 -0
- package/dist/chat/index.cjs +423 -0
- package/dist/chat/index.cjs.map +1 -0
- package/dist/chat/index.d.ts +21 -0
- package/dist/chat/index.js +6 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/test-id.d.ts +16 -0
- package/dist/chat/useStreamAnnouncement.d.ts +19 -0
- package/dist/chunk-223D4727.cjs +50 -0
- package/dist/chunk-223D4727.cjs.map +1 -0
- package/dist/chunk-2K33YGM6.cjs +1846 -0
- package/dist/chunk-2K33YGM6.cjs.map +1 -0
- package/dist/chunk-2ORA62OF.js +266 -0
- package/dist/chunk-2ORA62OF.js.map +1 -0
- package/dist/chunk-4EZVCGRL.js +803 -0
- package/dist/chunk-4EZVCGRL.js.map +1 -0
- package/dist/chunk-54Q3RNJU.cjs +516 -0
- package/dist/chunk-54Q3RNJU.cjs.map +1 -0
- package/dist/chunk-5B4PXAKI.cjs +287 -0
- package/dist/chunk-5B4PXAKI.cjs.map +1 -0
- package/dist/chunk-6HIPFEID.cjs +574 -0
- package/dist/chunk-6HIPFEID.cjs.map +1 -0
- package/dist/{chunk-FZ2S6VAZ.js → chunk-6P6AEQJB.js} +413 -1132
- package/dist/chunk-6P6AEQJB.js.map +1 -0
- package/dist/chunk-76JDDMSP.js +31 -0
- package/dist/chunk-76JDDMSP.js.map +1 -0
- package/dist/chunk-7F6CBP3Z.js +12 -0
- package/dist/chunk-7F6CBP3Z.js.map +1 -0
- package/dist/chunk-7G2LJMUG.cjs +45 -0
- package/dist/chunk-7G2LJMUG.cjs.map +1 -0
- package/dist/chunk-7PEELPMA.js +1799 -0
- package/dist/chunk-7PEELPMA.js.map +1 -0
- package/dist/chunk-A2YAC22G.js +93 -0
- package/dist/chunk-A2YAC22G.js.map +1 -0
- package/dist/chunk-ADOKTJHV.cjs +262 -0
- package/dist/chunk-ADOKTJHV.cjs.map +1 -0
- package/dist/chunk-AE5FHFZ5.cjs +272 -0
- package/dist/chunk-AE5FHFZ5.cjs.map +1 -0
- package/dist/chunk-AXIZ2MDV.js +751 -0
- package/dist/chunk-AXIZ2MDV.js.map +1 -0
- package/dist/chunk-AZQDNYH4.js +2865 -0
- package/dist/chunk-AZQDNYH4.js.map +1 -0
- package/dist/chunk-C54XEN5T.cjs +34 -0
- package/dist/chunk-C54XEN5T.cjs.map +1 -0
- package/dist/chunk-CQCC7LE7.js +210 -0
- package/dist/chunk-CQCC7LE7.js.map +1 -0
- package/dist/chunk-CRIKTUEU.cjs +47 -0
- package/dist/chunk-CRIKTUEU.cjs.map +1 -0
- package/dist/chunk-CTZ5745I.js +564 -0
- package/dist/chunk-CTZ5745I.js.map +1 -0
- package/dist/chunk-DPLRHEJZ.js +78 -0
- package/dist/chunk-DPLRHEJZ.js.map +1 -0
- package/dist/{chunk-DBAUZD7A.cjs → chunk-DREI7EQ2.cjs} +437 -1152
- package/dist/chunk-DREI7EQ2.cjs.map +1 -0
- package/dist/chunk-ELR74ME6.cjs +68 -0
- package/dist/chunk-ELR74ME6.cjs.map +1 -0
- package/dist/chunk-G3G7LZPM.cjs +205 -0
- package/dist/chunk-G3G7LZPM.cjs.map +1 -0
- package/dist/chunk-GDFWJ73C.cjs +2973 -0
- package/dist/chunk-GDFWJ73C.cjs.map +1 -0
- package/dist/chunk-ITGHMJOM.js +5528 -0
- package/dist/chunk-ITGHMJOM.js.map +1 -0
- package/dist/chunk-J2BGSWXM.cjs +990 -0
- package/dist/chunk-J2BGSWXM.cjs.map +1 -0
- package/dist/chunk-K4BGOPGG.js +79 -0
- package/dist/chunk-K4BGOPGG.js.map +1 -0
- package/dist/chunk-LGBAZD37.js +341 -0
- package/dist/chunk-LGBAZD37.js.map +1 -0
- package/dist/chunk-LRUCMZK6.cjs +680 -0
- package/dist/chunk-LRUCMZK6.cjs.map +1 -0
- package/dist/chunk-MHVNT4J3.cjs +15 -0
- package/dist/chunk-MHVNT4J3.cjs.map +1 -0
- package/dist/chunk-NBV56SGU.js +42 -0
- package/dist/chunk-NBV56SGU.js.map +1 -0
- package/dist/chunk-NPLYHR2E.js +13 -0
- package/dist/chunk-NPLYHR2E.js.map +1 -0
- package/dist/chunk-NUNKSZKU.js +203 -0
- package/dist/chunk-NUNKSZKU.js.map +1 -0
- package/dist/chunk-OB5F4577.cjs +40 -0
- package/dist/chunk-OB5F4577.cjs.map +1 -0
- package/dist/chunk-OBLSURHV.js +973 -0
- package/dist/chunk-OBLSURHV.js.map +1 -0
- package/dist/chunk-OUW6G4O2.cjs +96 -0
- package/dist/chunk-OUW6G4O2.cjs.map +1 -0
- package/dist/chunk-OVEQERPO.js +66 -0
- package/dist/chunk-OVEQERPO.js.map +1 -0
- package/dist/chunk-P6GHJSLR.js +34 -0
- package/dist/chunk-P6GHJSLR.js.map +1 -0
- package/dist/chunk-PCB2BPN3.cjs +41 -0
- package/dist/chunk-PCB2BPN3.cjs.map +1 -0
- package/dist/chunk-PPCATBOY.cjs +15 -0
- package/dist/chunk-PPCATBOY.cjs.map +1 -0
- package/dist/chunk-QN42OA5J.js +887 -0
- package/dist/chunk-QN42OA5J.js.map +1 -0
- package/dist/chunk-QXEJXIP4.js +675 -0
- package/dist/chunk-QXEJXIP4.js.map +1 -0
- package/dist/chunk-RC6VTY2H.js +47 -0
- package/dist/chunk-RC6VTY2H.js.map +1 -0
- package/dist/chunk-RFIBUWLF.cjs +232 -0
- package/dist/chunk-RFIBUWLF.cjs.map +1 -0
- package/dist/chunk-S7PSMMRG.js +38 -0
- package/dist/chunk-S7PSMMRG.js.map +1 -0
- package/dist/chunk-SCFYPAG6.cjs +18 -0
- package/dist/chunk-SCFYPAG6.cjs.map +1 -0
- package/dist/chunk-SYDHKKRZ.cjs +818 -0
- package/dist/chunk-SYDHKKRZ.cjs.map +1 -0
- package/dist/chunk-TX2ZICS7.js +139 -0
- package/dist/chunk-TX2ZICS7.js.map +1 -0
- package/dist/chunk-TYZUCAT7.js +787 -0
- package/dist/chunk-TYZUCAT7.js.map +1 -0
- package/dist/chunk-U2E3WT3J.js +45 -0
- package/dist/chunk-U2E3WT3J.js.map +1 -0
- package/dist/chunk-UBNVIIBT.js +284 -0
- package/dist/chunk-UBNVIIBT.js.map +1 -0
- package/dist/chunk-UFHMLHIR.cjs +66 -0
- package/dist/chunk-UFHMLHIR.cjs.map +1 -0
- package/dist/chunk-UJE32SST.js +39 -0
- package/dist/chunk-UJE32SST.js.map +1 -0
- package/dist/chunk-ULWRNGGE.cjs +146 -0
- package/dist/chunk-ULWRNGGE.cjs.map +1 -0
- package/dist/chunk-UWGIB3VQ.js +64 -0
- package/dist/chunk-UWGIB3VQ.js.map +1 -0
- package/dist/chunk-V4ISCZJ7.cjs +207 -0
- package/dist/chunk-V4ISCZJ7.cjs.map +1 -0
- package/dist/chunk-VFUWWH52.cjs +83 -0
- package/dist/chunk-VFUWWH52.cjs.map +1 -0
- package/dist/chunk-VILAPTCB.js +259 -0
- package/dist/chunk-VILAPTCB.js.map +1 -0
- package/dist/chunk-VLCY46K6.cjs +82 -0
- package/dist/chunk-VLCY46K6.cjs.map +1 -0
- package/dist/chunk-VPPX5XUF.cjs +813 -0
- package/dist/chunk-VPPX5XUF.cjs.map +1 -0
- package/dist/chunk-WJMEXTVD.cjs +122 -0
- package/dist/chunk-WJMEXTVD.cjs.map +1 -0
- package/dist/chunk-WTNMWEBC.js +504 -0
- package/dist/chunk-WTNMWEBC.js.map +1 -0
- package/dist/chunk-WW6EOVZA.js +112 -0
- package/dist/chunk-WW6EOVZA.js.map +1 -0
- package/dist/chunk-XNBAXRY7.cjs +5673 -0
- package/dist/chunk-XNBAXRY7.cjs.map +1 -0
- package/dist/chunk-XQ7PKKDY.cjs +787 -0
- package/dist/chunk-XQ7PKKDY.cjs.map +1 -0
- package/dist/chunk-XZIYRKLW.cjs +347 -0
- package/dist/chunk-XZIYRKLW.cjs.map +1 -0
- package/dist/chunk-YBXCZEWS.js +187 -0
- package/dist/chunk-YBXCZEWS.js.map +1 -0
- package/dist/chunk-YDHO4AVL.js +16 -0
- package/dist/chunk-YDHO4AVL.js.map +1 -0
- package/dist/chunk-ZORQ5M3W.cjs +934 -0
- package/dist/chunk-ZORQ5M3W.cjs.map +1 -0
- package/dist/chunk-ZW6FPIFC.cjs +36 -0
- package/dist/chunk-ZW6FPIFC.cjs.map +1 -0
- package/dist/citations/CitationEditor.d.ts +58 -0
- package/dist/citations/PassagePill.d.ts +49 -0
- package/dist/citations/QuietMarks.d.ts +81 -0
- package/dist/citations/index.cjs +47 -0
- package/dist/citations/index.cjs.map +1 -0
- package/dist/citations/index.d.ts +3 -0
- package/dist/citations/index.js +6 -0
- package/dist/citations/index.js.map +1 -0
- package/dist/collaboration/contacts/AddContactsParts.d.ts +46 -0
- package/dist/collaboration/contacts/index.d.ts +1 -0
- package/dist/collaboration/direct-messages/DirectMessages.d.ts +33 -0
- package/dist/collaboration/direct-messages/DmParts.d.ts +139 -0
- package/dist/collaboration/direct-messages/index.d.ts +2 -0
- package/dist/collaboration/index.cjs +141 -0
- package/dist/collaboration/index.cjs.map +1 -0
- package/dist/collaboration/index.d.ts +5 -0
- package/dist/collaboration/index.js +8 -0
- package/dist/collaboration/index.js.map +1 -0
- package/dist/collaboration/mail/MailFolderTree.d.ts +34 -0
- package/dist/collaboration/mail/index.d.ts +2 -0
- package/dist/collaboration/mail/mailFolders.d.ts +25 -0
- package/dist/collaboration/members/WorkspaceMembers.d.ts +74 -0
- package/dist/collaboration/members/index.d.ts +1 -0
- package/dist/collaboration/sharing/ShareControl.d.ts +38 -0
- package/dist/collaboration/sharing/index.d.ts +1 -0
- package/dist/components/Accordion.d.ts +12 -0
- package/dist/components/ActionLink.d.ts +18 -0
- package/dist/components/AskBar.d.ts +48 -0
- package/dist/components/AvatarBlock.d.ts +9 -0
- package/dist/components/Banner.d.ts +12 -0
- package/dist/components/BlockImage.d.ts +18 -0
- package/dist/components/CTABanner.d.ts +17 -0
- package/dist/components/Callout.d.ts +9 -0
- package/dist/components/Chart.d.ts +35 -0
- package/dist/components/CollectionDetail.d.ts +23 -0
- package/dist/components/Columns.d.ts +11 -0
- package/dist/components/ContactForm.d.ts +54 -0
- package/dist/components/Container.d.ts +11 -0
- package/dist/components/DataTable.d.ts +47 -0
- package/dist/components/DataTableBlock.d.ts +26 -0
- package/dist/components/EmptyState.d.ts +11 -0
- package/dist/components/EntityChip.d.ts +24 -0
- package/dist/components/EntityIdentityBar.d.ts +90 -0
- package/dist/components/EntityTooltip.d.ts +43 -0
- package/dist/components/FAQ.d.ts +14 -0
- package/dist/components/FeatureGrid.d.ts +18 -0
- package/dist/components/Footer.d.ts +25 -0
- package/dist/components/Gallery.d.ts +15 -0
- package/dist/components/Hero.d.ts +35 -0
- package/dist/components/ListBlock.d.ts +10 -0
- package/dist/components/LogoCloud.d.ts +12 -0
- package/dist/components/MediaText.d.ts +15 -0
- package/dist/components/MemberAvatarStack.d.ts +36 -0
- package/dist/components/MetricCard.d.ts +28 -0
- package/dist/components/Navbar.d.ts +39 -0
- package/dist/components/PageHeader.d.ts +15 -0
- package/dist/components/PricingTable.d.ts +19 -0
- package/dist/components/RichTextBlock.d.ts +10 -0
- package/dist/components/SectionHeading.d.ts +11 -0
- package/dist/components/Spacer.d.ts +7 -0
- package/dist/components/StatGroup.d.ts +12 -0
- package/dist/components/Steps.d.ts +12 -0
- package/dist/components/Tabs.d.ts +15 -0
- package/dist/components/TeamGrid.d.ts +30 -0
- package/dist/components/Testimonial.d.ts +9 -0
- package/dist/components/TestimonialGrid.d.ts +13 -0
- package/dist/components/ToneBadge.d.ts +18 -0
- package/dist/components/Toolbar.d.ts +11 -0
- package/dist/components/UsageMeter.d.ts +21 -0
- package/dist/components/VideoEmbed.d.ts +16 -0
- package/dist/components/assetImage.d.ts +16 -0
- package/dist/components/assetResolver.d.ts +57 -0
- package/dist/components/blockLink.d.ts +26 -0
- package/dist/components/editorial/ArticleList.d.ts +32 -0
- package/dist/components/editorial/Bands.d.ts +29 -0
- package/dist/components/editorial/EditorialHeading.d.ts +17 -0
- package/dist/components/editorial/EditorialHero.d.ts +46 -0
- package/dist/components/editorial/EditorialSection.d.ts +47 -0
- package/dist/components/editorial/Eyebrow.d.ts +14 -0
- package/dist/components/editorial/PanelGrid.d.ts +45 -0
- package/dist/components/editorial/ProfileCard.d.ts +27 -0
- package/dist/components/editorial/PullQuote.d.ts +17 -0
- package/dist/components/editorial/Reveal.d.ts +15 -0
- package/dist/components/editorial/index.d.ts +12 -0
- package/dist/components/editorial/lists.d.ts +42 -0
- package/dist/components/editorial/tone.d.ts +33 -0
- package/dist/components/tones.d.ts +14 -0
- package/dist/connect/index.cjs +65 -0
- package/dist/connect/index.cjs.map +1 -0
- package/dist/connect/index.d.ts +8 -0
- package/dist/connect/index.js +28 -0
- package/dist/connect/index.js.map +1 -0
- package/dist/connection/ArbiAppProvider.d.ts +16 -0
- package/dist/connection/ConnectionProvider.d.ts +50 -0
- package/dist/connection/ai.d.ts +99 -0
- package/dist/connection/types.d.ts +54 -0
- package/dist/connection/useImageGen.d.ts +22 -0
- package/dist/facts/FactComposer.d.ts +75 -0
- package/dist/facts/FactDateInput.d.ts +34 -0
- package/dist/facts/FactLabelsCell.d.ts +35 -0
- package/dist/facts/FactPassages.d.ts +52 -0
- package/dist/facts/FactRowActions.d.ts +18 -0
- package/dist/facts/FactSearchParts.d.ts +80 -0
- package/dist/facts/FactSourceGroup.d.ts +26 -0
- package/dist/facts/FactTimelineViews.d.ts +37 -0
- package/dist/facts/FactsBulkBar.d.ts +53 -0
- package/dist/facts/FactsEmptyState.d.ts +38 -0
- package/dist/facts/FactsFieldsButton.d.ts +21 -0
- package/dist/facts/FactsFilterInput.d.ts +46 -0
- package/dist/facts/FactsTable.d.ts +28 -0
- package/dist/facts/FactsToolbar.d.ts +53 -0
- package/dist/facts/FactsViewToggle.d.ts +38 -0
- package/dist/facts/fact-date.d.ts +22 -0
- package/dist/facts/fact-row.d.ts +32 -0
- package/dist/facts/fact-text.d.ts +14 -0
- package/dist/facts/factColumns.d.ts +88 -0
- package/dist/facts/index.cjs +2401 -0
- package/dist/facts/index.cjs.map +1 -0
- package/dist/facts/index.d.ts +35 -0
- package/dist/facts/index.js +2343 -0
- package/dist/facts/index.js.map +1 -0
- package/dist/facts/timezone.d.ts +4 -0
- package/dist/files/AiReviewDialog.d.ts +77 -0
- package/dist/files/DocStatusIcon.d.ts +12 -0
- package/dist/files/DocumentGrid.d.ts +27 -0
- package/dist/files/Explorer.d.ts +10 -0
- package/dist/files/ExplorerSurface.d.ts +34 -0
- package/dist/files/ExplorerTile.d.ts +142 -0
- package/dist/files/ExportParts.d.ts +114 -0
- package/dist/files/FieldParts.d.ts +64 -0
- package/dist/files/FilesPage.d.ts +20 -0
- package/dist/files/FilesToolbar.d.ts +59 -0
- package/dist/files/FolderPicker.d.ts +82 -0
- package/dist/files/GridView.d.ts +59 -0
- package/dist/files/HtmlViewerParts.d.ts +183 -0
- package/dist/files/MoveToFolderDialog.d.ts +32 -0
- package/dist/files/RedlineParts.d.ts +72 -0
- package/dist/files/SelectionBar.d.ts +65 -0
- package/dist/files/StatusPill.d.ts +23 -0
- package/dist/files/TagPassagePanel.d.ts +60 -0
- package/dist/files/UploadDropzone.d.ts +33 -0
- package/dist/files/UploadFooter.d.ts +59 -0
- package/dist/files/UploadParts.d.ts +78 -0
- package/dist/files/UploadSources.d.ts +77 -0
- package/dist/files/VersionTimeline.d.ts +60 -0
- package/dist/files/ViewToggle.d.ts +53 -0
- package/dist/files/ViewerChrome.d.ts +152 -0
- package/dist/files/ViewerLayout.d.ts +32 -0
- package/dist/files/ViewerParts.d.ts +62 -0
- package/dist/files/bulk/BulkActionsBar.d.ts +76 -0
- package/dist/files/bulk/FolderFilterButton.d.ts +35 -0
- package/dist/files/bulk/index.d.ts +2 -0
- package/dist/files/cells/DocumentNameCell.d.ts +31 -0
- package/dist/files/cells/FolderCell.d.ts +25 -0
- package/dist/files/cells/HoverIconCell.d.ts +21 -0
- package/dist/files/cells/LabelMultiSelect.d.ts +50 -0
- package/dist/files/cells/RelatedDocsCell.d.ts +22 -0
- package/dist/files/cells/TagColumnParts.d.ts +29 -0
- package/dist/files/cells/index.d.ts +6 -0
- package/dist/files/documentGridLayout.d.ts +31 -0
- package/dist/files/grid-test-ids.d.ts +18 -0
- package/dist/files/import/CalendarImportRow.d.ts +26 -0
- package/dist/files/import/ImportParts.d.ts +114 -0
- package/dist/files/import/TaskSection.d.ts +51 -0
- package/dist/files/import/UrlInputDialogView.d.ts +63 -0
- package/dist/files/import/VendorLogo.d.ts +15 -0
- package/dist/files/import/index.d.ts +5 -0
- package/dist/files/index.cjs +7555 -0
- package/dist/files/index.cjs.map +1 -0
- package/dist/files/index.d.ts +34 -0
- package/dist/files/index.js +7340 -0
- package/dist/files/index.js.map +1 -0
- package/dist/files/page/FilesAddMenu.d.ts +30 -0
- package/dist/files/page/FilesPageParts.d.ts +24 -0
- package/dist/files/page/FilesPageTitle.d.ts +24 -0
- package/dist/files/page/index.d.ts +3 -0
- package/dist/files/tags/BulkTagEditor.d.ts +136 -0
- package/dist/files/tags/DocTagPopover.d.ts +113 -0
- package/dist/files/tags/TagManager.d.ts +54 -0
- package/dist/files/tags/index.d.ts +3 -0
- package/dist/files/views/FieldsEditorParts.d.ts +151 -0
- package/dist/files/views/FieldsManagerParts.d.ts +17 -0
- package/dist/files/views/TagFormParts.d.ts +109 -0
- package/dist/files/views/ViewSelectorMenu.d.ts +66 -0
- package/dist/files/views/fieldsEditorModel.d.ts +43 -0
- package/dist/files/views/index.d.ts +5 -0
- package/dist/home/ActionMenuDialog.d.ts +26 -0
- package/dist/home/AddFilesFirst.d.ts +22 -0
- package/dist/home/CardHeaderBar.d.ts +40 -0
- package/dist/home/CollapsibleSection.d.ts +43 -0
- package/dist/home/CreateTile.d.ts +17 -0
- package/dist/home/DashboardParts.d.ts +32 -0
- package/dist/home/FactsStrip.d.ts +41 -0
- package/dist/home/FoldSection.d.ts +19 -0
- package/dist/home/GettingStartedStrip.d.ts +49 -0
- package/dist/home/Greeting.d.ts +18 -0
- package/dist/home/HomeLayout.d.ts +28 -0
- package/dist/home/KeyValueRow.d.ts +43 -0
- package/dist/home/ProjectBandParts.d.ts +70 -0
- package/dist/home/QuickActionDialogHeader.d.ts +21 -0
- package/dist/home/RecentList.d.ts +48 -0
- package/dist/home/ScopePicker.d.ts +65 -0
- package/dist/home/StartTiles.d.ts +33 -0
- package/dist/home/index.cjs +854 -0
- package/dist/home/index.cjs.map +1 -0
- package/dist/home/index.d.ts +37 -0
- package/dist/home/index.js +763 -0
- package/dist/home/index.js.map +1 -0
- package/dist/home/sections.d.ts +33 -0
- package/dist/index.cjs +1992 -5547
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +72 -1716
- package/dist/index.js +142 -5316
- package/dist/index.js.map +1 -1
- package/dist/lib/balanced-columns.d.ts +8 -0
- package/dist/lib/format.d.ts +37 -0
- package/dist/lib/observe-resize.d.ts +6 -0
- package/dist/lib/password-strength.d.ts +24 -0
- package/dist/lib/sidebar-mode.d.ts +46 -0
- package/dist/lib/testid.d.ts +7 -0
- package/dist/lib/use-drawer.d.ts +11 -0
- package/dist/lib/useControllableState.d.ts +5 -0
- package/dist/lib/useDismissibleCard.d.ts +15 -0
- package/dist/lib/useListKeyNav.d.ts +42 -0
- package/dist/lib/useLongPaste.d.ts +15 -0
- package/dist/lib/useRestoreFocus.d.ts +11 -0
- package/dist/lib/useScopeSelection.d.ts +34 -0
- package/dist/nav/types.d.ts +19 -0
- package/dist/provider/BlocksProvider.d.ts +20 -0
- package/dist/provider/TooltipScope.d.ts +9 -0
- package/dist/record/index.cjs +2 -4
- package/dist/record/index.cjs.map +1 -1
- package/dist/record/index.d.ts +12 -16
- package/dist/record/index.js +2 -4
- package/dist/record/index.js.map +1 -1
- package/dist/retrieval/HighlightText.d.ts +21 -0
- package/dist/retrieval/SearchEmptyState.d.ts +39 -0
- package/dist/retrieval/SearchGroupHeader.d.ts +21 -0
- package/dist/retrieval/SearchHit.d.ts +36 -0
- package/dist/retrieval/SearchPage.d.ts +187 -0
- package/dist/retrieval/SearchPagination.d.ts +21 -0
- package/dist/retrieval/highlight.d.ts +21 -0
- package/dist/retrieval/index.cjs +160 -0
- package/dist/retrieval/index.cjs.map +1 -0
- package/dist/retrieval/index.d.ts +7 -0
- package/dist/retrieval/index.js +7 -0
- package/dist/retrieval/index.js.map +1 -0
- package/dist/settings/AccountDialogs.d.ts +89 -0
- package/dist/settings/AvatarPicker.d.ts +25 -0
- package/dist/settings/Billing.d.ts +113 -0
- package/dist/settings/ConfigSwitcherBar.d.ts +46 -0
- package/dist/settings/ConfirmDialog.d.ts +28 -0
- package/dist/settings/ConnectionCard.d.ts +58 -0
- package/dist/settings/ConversationSettingsParts.d.ts +53 -0
- package/dist/settings/DocumentPicker.d.ts +57 -0
- package/dist/settings/EmailWorkspaceDialogView.d.ts +60 -0
- package/dist/settings/ErrorDialog.d.ts +36 -0
- package/dist/settings/FloatingPanel.d.ts +32 -0
- package/dist/settings/JsonTree.d.ts +24 -0
- package/dist/settings/LogoutDialog.d.ts +51 -0
- package/dist/settings/ModalBreadcrumbHeader.d.ts +32 -0
- package/dist/settings/ModalScaffold.d.ts +60 -0
- package/dist/settings/MultiSelect.d.ts +111 -0
- package/dist/settings/NotificationCategoryList.d.ts +26 -0
- package/dist/settings/PanelFrame.d.ts +47 -0
- package/dist/settings/PasswordChangeDialog.d.ts +64 -0
- package/dist/settings/PlanBadge.d.ts +14 -0
- package/dist/settings/PlanCard.d.ts +97 -0
- package/dist/settings/PremiumModelsFrame.d.ts +17 -0
- package/dist/settings/ProfileCard.d.ts +67 -0
- package/dist/settings/Projects.d.ts +108 -0
- package/dist/settings/QuotaMeter.d.ts +31 -0
- package/dist/settings/ReferralCredit.d.ts +46 -0
- package/dist/settings/SegmentedControl.d.ts +20 -0
- package/dist/settings/ServerConnectionControls.d.ts +31 -0
- package/dist/settings/SettingsPanel.d.ts +61 -0
- package/dist/settings/SettingsSwitchRow.d.ts +21 -0
- package/dist/settings/SubscriptionParts.d.ts +215 -0
- package/dist/settings/SupportPanel.d.ts +32 -0
- package/dist/settings/SyncDialogParts.d.ts +155 -0
- package/dist/settings/ThreadPreviewDialog.d.ts +18 -0
- package/dist/settings/TipsEditorDialog.d.ts +94 -0
- package/dist/settings/TriStateFilterMenu.d.ts +66 -0
- package/dist/settings/Usage.d.ts +102 -0
- package/dist/settings/WelcomeDialog.d.ts +79 -0
- package/dist/settings/index.cjs +5131 -0
- package/dist/settings/index.cjs.map +1 -0
- package/dist/settings/index.d.ts +38 -0
- package/dist/settings/index.js +4922 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/shell/ActionCluster.d.ts +33 -0
- package/dist/shell/AskField.d.ts +76 -0
- package/dist/shell/InfoBar.d.ts +20 -0
- package/dist/shell/MobileBars.d.ts +47 -0
- package/dist/shell/OfflinePill.d.ts +28 -0
- package/dist/shell/RemoteControlPill.d.ts +23 -0
- package/dist/shell/Shell.d.ts +123 -0
- package/dist/shell/Sidebar.d.ts +104 -0
- package/dist/shell/SidebarBadgeRow.d.ts +29 -0
- package/dist/shell/SidebarRowAction.d.ts +24 -0
- package/dist/shell/StatusRow.d.ts +20 -0
- package/dist/shell/TabHeader.d.ts +70 -0
- package/dist/shell/TipCard.d.ts +46 -0
- package/dist/shell/ToolButton.d.ts +12 -0
- package/dist/shell/Workspace.d.ts +90 -0
- package/dist/shell/index.cjs +187 -0
- package/dist/shell/index.cjs.map +1 -0
- package/dist/shell/index.d.ts +20 -0
- package/dist/shell/index.js +10 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/shell/sidebar-context.d.ts +19 -0
- package/dist/shell/types.d.ts +48 -0
- package/dist/site/index.cjs +173 -90
- package/dist/site/index.d.ts +60 -4
- package/dist/site/index.js +8 -1
- package/dist/studio/PageRenderer.d.ts +35 -0
- package/dist/studio/Section.d.ts +24 -0
- package/dist/studio/StudioEditor.d.ts +32 -0
- package/dist/studio/aiFields.d.ts +17 -0
- package/dist/studio/blockKit.d.ts +36 -0
- package/dist/studio/blocksConfig.d.ts +42 -0
- package/dist/studio/imageFields.d.ts +14 -0
- package/dist/studio/index.cjs +3353 -0
- package/dist/studio/index.cjs.map +1 -0
- package/dist/studio/index.d.ts +32 -0
- package/dist/studio/index.js +3297 -0
- package/dist/studio/index.js.map +1 -0
- package/dist/studio/liveData.d.ts +4 -0
- package/dist/studio/liveWidgetRuntime.d.ts +41 -0
- package/dist/studio/persistence.d.ts +38 -0
- package/dist/studio/publish.d.ts +39 -0
- package/dist/studio/siteBlocks.d.ts +14 -0
- package/dist/studio/types.d.ts +46 -0
- package/dist/studio/websiteBlocks.d.ts +4 -0
- package/dist/studio/widgets.d.ts +20 -0
- package/dist/theme/ThemeEditor.d.ts +16 -0
- package/dist/theme/fontPairings.d.ts +48 -0
- package/dist/theme/store.d.ts +53 -0
- package/dist/theme/tokens.d.ts +105 -0
- package/dist/timeline/Timeline.d.ts +27 -0
- package/dist/timeline/TimelineCalendar.d.ts +54 -0
- package/dist/timeline/TimelineGantt.d.ts +71 -0
- package/dist/timeline/TimelineZoomControl.d.ts +17 -0
- package/dist/timeline/index.cjs +50 -0
- package/dist/timeline/index.cjs.map +1 -0
- package/dist/timeline/index.d.ts +13 -0
- package/dist/timeline/index.js +5 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/timeline/span.d.ts +29 -0
- package/dist/timeline/types.d.ts +30 -0
- package/dist/workspaces/WorkspaceBadges.d.ts +27 -0
- package/dist/workspaces/WorkspaceCard.d.ts +142 -0
- package/dist/workspaces/WorkspaceFormParts.d.ts +98 -0
- package/dist/workspaces/WorkspaceGroup.d.ts +31 -0
- package/dist/workspaces/WorkspaceSettingsParts.d.ts +70 -0
- package/dist/workspaces/index.cjs +690 -0
- package/dist/workspaces/index.cjs.map +1 -0
- package/dist/workspaces/index.d.ts +9 -0
- package/dist/workspaces/index.js +661 -0
- package/dist/workspaces/index.js.map +1 -0
- package/package.json +154 -9
- package/src/blocks.css +365 -0
- package/src/components/grid.css +60 -107
- package/src/source.css +20 -0
- package/src/studio/studio.css +3 -3
- package/src/tokens.css +226 -0
- package/dist/chunk-DBAUZD7A.cjs.map +0 -1
- package/dist/chunk-FZ2S6VAZ.js.map +0 -1
- package/dist/index-DduoEosi.d.cts +0 -846
- package/dist/index-DduoEosi.d.ts +0 -846
- package/dist/index.d.cts +0 -1717
- package/dist/record/index.d.cts +0 -96
- package/dist/site/index.d.cts +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/chat/Message.tsx","../src/chat/MessageAlert.tsx","../src/chat/MessageList.tsx","../src/chat/useStreamAnnouncement.ts","../src/chat/Composer.tsx","../src/lib/useListKeyNav.ts","../src/chat/SlashMenu.tsx","../src/chat/PinnedDocChip.tsx","../src/chat/ConversationEmpty.tsx","../src/chat/ConversationLayout.tsx","../src/chat/BranchControls.tsx","../src/chat/ModelPicker.tsx","../src/chat/ConversationParts.tsx","../src/chat/ThreadMap.tsx","../src/lib/useLongPaste.ts","../src/chat/PendingAnswerBar.tsx","../src/chat/ConversationSearchView.tsx","../src/chat/ContextPanel.tsx","../src/chat/ContextChip.tsx","../src/lib/useDismissibleCard.ts","../src/chat/LabelPinRow.tsx"],"names":["jsx","cn","forwardRef","MessageBubble","jsxs","Sparkles","testIdOr","PopoverTrigger","ChevronDown","ChevronUp","Popover","PopoverAnchor","PopoverContent","MessageActionButton","DropdownMenu","DropdownMenuTrigger","MoreHorizontal","DropdownMenuContent","DropdownMenuItem","RotateCw","AlertCircle","Button","ArrowLeft","MessageListRow","useState","useRef","useEffect","Edit3","ComposerInput","FileText","Textarea","Send","Tooltip","TooltipTrigger","Loader2","Square","Mic","TooltipContent","ArrowDown","useId","useCallback","BookOpen","SquareSlash","memo","SlashMenu","prefixedTestId","Globe","Pin","X","FileUp","GanttChartSquare","ArrowUpRight","Network","ArrowRight","Zap","Glasses","Crown","ModelPickerTrigger","ChevronsUpDown","BlocksTooltipProvider","Check","Settings","Plus","Bot","Download","DOMPurify","useMemo","MessageCircleQuestion","Clock","Play","Pause","Fragment","User","Search","MessageSquare","PassageCard","ContextPanelContent","HoverCardContent","CheckCircle","ContextSearchInput","Input","ContextActionButton","Badge","Tabs","TabsList","TabsTrigger","TabsContent","ContextChip","Pencil","TagIcon"],"mappings":"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","file":"chunk-GDFWJ73C.cjs","sourcesContent":["import { forwardRef, type ButtonHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react'\nimport { ChevronDown, ChevronUp, MoreHorizontal, Sparkles } from 'lucide-react'\nimport {\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from './test-id'\n\nexport type MessageRole = 'user' | 'assistant'\nexport type MessageTone = 'default' | 'error' | 'subagent'\n\n/** Every fixed string of the message parts. Pass a partial `labels` to a part to translate or reword. */\nexport interface MessageLabels {\n subagentBadge: string\n hideSteps: string\n showSteps: string\n /** \"3 steps\" / \"1 step\". */\n stepCount: (count: number) => string\n /** Tooltip of a source chip. */\n openSource: (num: string, title: string) => string\n /** Accessible name of a source chip. */\n openSourceAria: (num: string, title: string, page?: number | null) => string\n page: (page: number) => string\n /** Several cited pages of one file: \"pp. 1, 3\". */\n pages: (pages: ReadonlyArray<number>) => string\n moreActionsTitle: string\n moreActionsAria: string\n}\n\nexport const DEFAULT_MESSAGE_LABELS: MessageLabels = {\n subagentBadge: 'sub-agent',\n hideSteps: 'Hide steps',\n showSteps: 'Show steps',\n stepCount: (count) => `${count} step${count !== 1 ? 's' : ''}`,\n openSource: (num, title) => `Open source ${num}: ${title}`,\n openSourceAria: (num, title, page) =>\n `Open source ${num}: ${title}${page != null ? `, page ${page}` : ''}`,\n page: (page) => `p. ${page}`,\n pages: (pages) => `pp. ${pages.join(', ')}`,\n moreActionsTitle: 'More actions',\n moreActionsAria: 'More message actions',\n}\n\n/* ── Root ─────────────────────────────────────────────────────────────────────────────────── */\n\nexport interface MessageRootProps extends HTMLAttributes<HTMLDivElement> {\n role: MessageRole\n /** Drives the default `data-testid` (`message-<id>`). */\n messageId: string\n /** `error` = red wash (failed / orphaned), `subagent` = muted wash (ARBI's own delegate task). */\n tone?: MessageTone\n /** Overrides the default test id. A `data-testid` in the rest props still wins over both. */\n testId?: string\n}\n\n/** One message row: centred column, role + id as data attributes for scroll/deep-link lookups. */\nexport function MessageRoot({\n role,\n messageId,\n tone = 'default',\n testId = `message-${messageId}`,\n className,\n children,\n ...rest\n}: MessageRootProps) {\n return (\n <div\n data-slot=\"message\"\n data-testid={testId}\n data-message-role={role}\n className={cn(\n 'group mx-auto mb-1 flex w-full max-w-[46rem] justify-center',\n tone === 'error'\n ? 'rounded-lg bg-red-bg'\n : tone === 'subagent'\n ? 'rounded-lg bg-muted/40'\n : 'bg-background',\n className\n )}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/* ── Content + bubble ─────────────────────────────────────────────────────────────────────── */\n\nexport interface MessageContentProps extends HTMLAttributes<HTMLDivElement> {\n role: MessageRole\n messageId: string\n /** Overrides the default test id. A `data-testid` in the rest props still wins over both. */\n testId?: string\n}\n\n/** Column that holds the bubble and (for the user) the footer under it, right-aligned. */\nexport function MessageContent({\n role,\n messageId,\n testId = `message-content-${messageId}`,\n className,\n children,\n ...rest\n}: MessageContentProps) {\n return (\n <div\n data-slot=\"message-content\"\n data-testid={testId}\n className={cn(\n 'w-full max-w-full overflow-hidden text-chat',\n role === 'user' && 'flex flex-col items-end',\n className\n )}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport interface MessageBubbleProps extends HTMLAttributes<HTMLDivElement> {\n role: MessageRole\n messageId: string\n /** The message is open in the composer for editing / branching. */\n isEditing?: boolean\n /** The user prompt is accepted by the backend but not yet running. */\n isQueued?: boolean\n /** Overrides the default test id. A `data-testid` in the rest props still wins over both. */\n testId?: string\n}\n\n/**\n * The message surface. The user's prompt is a tonal (`bg-muted`) rounded block that shrinks to\n * its text; the assistant answer is full-width ink on the canvas, indented under its byline.\n */\nexport const MessageBubble = forwardRef<HTMLDivElement, MessageBubbleProps>(function MessageBubble(\n { role, messageId, isEditing, isQueued, testId, className, children, ...rest },\n ref\n) {\n const isUser = role === 'user'\n return (\n <div\n ref={ref}\n data-slot=\"message-bubble\"\n data-testid={\n testId ?? (isUser ? `user-message-${messageId}` : `assistant-message-${messageId}`)\n }\n className={cn(\n 'overflow-hidden transition-colors',\n isUser && 'max-w-[80%] rounded-lg bg-muted',\n isEditing && 'ring-2 ring-inset ring-primary/30',\n className\n )}\n {...rest}\n >\n <div\n className={cn(\n isUser ? 'px-4 py-2.5' : 'px-4 py-3 sm:pl-9 sm:pr-0',\n isQueued && 'opacity-70'\n )}\n >\n {children}\n </div>\n </div>\n )\n})\n\n/* ── Byline (assistant) ───────────────────────────────────────────────────────────────────── */\n\nexport interface MessageBylineProps {\n messageId: string\n /** Who answered: the host's model pill / entity chip. */\n identity?: ReactNode\n /** Already-formatted time. */\n timeLabel: string\n /** False while the answer is still streaming: the status cell is hidden. */\n isSettled: boolean\n isFailed?: boolean\n /** \"Answered in 3.2s\" / \"Complete\" / \"Response failed\". */\n statusLabel: string\n className?: string\n /** Test id of the byline row. */\n testId?: string\n /** Test id of the status cell. */\n statusTestId?: string\n}\n\n/** AI avatar disc, identity, time and settled status above an assistant answer. */\nexport function MessageByline({\n messageId,\n identity,\n timeLabel,\n isSettled,\n isFailed,\n statusLabel,\n className,\n testId = `assistant-byline-${messageId}`,\n statusTestId,\n}: MessageBylineProps) {\n return (\n <div\n data-slot=\"message-byline\"\n data-testid={testId}\n className={cn('mb-2 flex min-w-0 items-center gap-2 text-sm sm:-ml-9', className)}\n >\n <span\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-ai-soft text-ai-ink\"\n aria-hidden=\"true\"\n >\n <Sparkles size={14} />\n </span>\n {identity}\n <span className=\"truncate text-xs text-muted-foreground\">{timeLabel}</span>\n {isSettled && (\n <span className=\"text-xs text-muted-foreground\" aria-hidden=\"true\">\n ·\n </span>\n )}\n {isSettled && (\n <span\n className={cn(\n 'shrink-0 text-xs',\n isFailed ? 'font-medium text-red-text' : 'text-muted-foreground'\n )}\n data-testid={testIdOr(statusTestId, { testId: 'assistant-status' })}\n >\n {statusLabel}\n </span>\n )}\n </div>\n )\n}\n\n/** Marks a `role: user` message that ARBI wrote itself to hand a task to a delegate. */\nexport function MessageSubagentBadge({\n messageId,\n children,\n labels,\n className,\n testId = `subagent-task-badge-${messageId}`,\n}: {\n messageId: string\n /** Badge text; wins over `labels.subagentBadge`. */\n children?: ReactNode\n labels?: Partial<MessageLabels>\n className?: string\n testId?: string\n}) {\n const l = { ...DEFAULT_MESSAGE_LABELS, ...labels }\n return (\n <span\n data-slot=\"message-subagent-badge\"\n className={cn(\n 'mb-2 inline-block rounded bg-muted px-1 py-0.5 text-xs font-semibold uppercase leading-none tracking-wide text-muted-foreground',\n className\n )}\n data-testid={testId}\n >\n {children ?? l.subagentBadge}\n </span>\n )\n}\n\n/* ── Body ─────────────────────────────────────────────────────────────────────────────────── */\n\n/** The rendered text (markdown) of a message. */\nexport function MessageBody({\n messageId,\n className,\n children,\n testId = `message-body-${messageId}`,\n}: {\n messageId: string\n className?: string\n children: ReactNode\n testId?: string\n}) {\n return (\n <div\n data-slot=\"message-body\"\n className={cn('markdown-content m-0 p-0 text-base leading-relaxed', className)}\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n\n/** Prose the model has moved on from while the turn streams: dimmed, never the live answer. */\nexport function MessageNarration({\n messageId,\n children,\n className,\n testId = `message-narration-${messageId}`,\n}: {\n messageId: string\n children: ReactNode\n className?: string\n testId?: string\n}) {\n return (\n <div\n data-slot=\"message-narration\"\n className={cn('opacity-50 transition-opacity duration-300', className)}\n data-provisional=\"true\"\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n\n/* ── Sources ──────────────────────────────────────────────────────────────────────────────── */\n\nexport interface SourceChipProps {\n /** Citation number as the answer shows it. */\n num: string\n title: string\n page?: number | null\n /** Several pages of the same file (merged chip); wins over `page`. */\n pages?: ReadonlyArray<number>\n onOpen: () => void\n className?: string\n labels?: Partial<MessageLabels>\n /** Overrides the default `source-chip-<num>` test id. */\n testId?: string\n}\n\n/** One cited source: AI-tinted number, file name, page. A tap opens the passage. */\nexport function SourceChip({\n num,\n title,\n page,\n pages,\n onOpen,\n className,\n labels,\n testId = `source-chip-${num}`,\n}: SourceChipProps) {\n const l = { ...DEFAULT_MESSAGE_LABELS, ...labels }\n const pageText = pages && pages.length > 1 ? l.pages(pages) : page != null ? l.page(page) : null\n return (\n <button\n type=\"button\"\n data-slot=\"source-chip\"\n onClick={onOpen}\n className={cn(\n 'inline-flex min-h-8 max-w-full items-center gap-2 rounded-md bg-muted px-2 py-1 text-sm text-foreground transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n className\n )}\n title={l.openSource(num, title)}\n aria-label={l.openSourceAria(num, title, page)}\n data-testid={testId}\n >\n <span className=\"inline-flex h-5 min-w-5 items-center justify-center rounded-sm bg-ai-soft px-1 text-xs font-semibold text-ai-ink\">\n {num}\n </span>\n <span className=\"min-w-0 truncate\">{title}</span>\n {pageText && <span className=\"shrink-0 text-xs text-muted-foreground\">{pageText}</span>}\n </button>\n )\n}\n\nexport interface SourceView {\n num: string\n title: string\n page?: number | null\n}\n\ninterface MergedSource {\n nums: string[]\n title: string\n pages: number[]\n}\n\n/** One entry per file: its citation numbers and the distinct pages cited, in order. */\nfunction mergeSourcesByFile(sources: ReadonlyArray<SourceView>): MergedSource[] {\n const byTitle = new Map<string, MergedSource>()\n for (const s of sources) {\n const group = byTitle.get(s.title) ?? { nums: [], title: s.title, pages: [] }\n group.nums.push(s.num)\n if (s.page != null && !group.pages.includes(s.page)) group.pages.push(s.page)\n byTitle.set(s.title, group)\n }\n return [...byTitle.values()]\n}\n\nexport interface MessageSourcesProps {\n messageId: string\n sources: ReadonlyArray<SourceView>\n onOpenSource: (num: string) => void\n className?: string\n labels?: Partial<MessageLabels>\n testId?: string\n}\n\n/** Row of {@link SourceChip}s under an answer; renders nothing when there are none. */\nexport function MessageSources({\n messageId,\n sources,\n onOpenSource,\n className,\n labels,\n testId = `source-chips-${messageId}`,\n}: MessageSourcesProps) {\n if (sources.length === 0) return null\n return (\n <div\n data-slot=\"message-sources\"\n className={cn('mt-3 flex flex-wrap gap-2', className)}\n data-testid={testId}\n >\n {mergeSourcesByFile(sources).map((g) => (\n <SourceChip\n key={g.nums[0]}\n num={g.nums.join(', ')}\n testId={`source-chip-${g.nums[0]}`}\n title={g.title}\n page={g.pages[0]}\n pages={g.pages}\n onOpen={() => onOpenSource(g.nums[0])}\n labels={labels}\n />\n ))}\n </div>\n )\n}\n\n/* ── Footer: leading meta, steps toggle, actions ──────────────────────────────────────────── */\n\nexport interface MessageStepsView {\n count: number\n open: boolean\n onOpenChange: (open: boolean) => void\n /** The steps trace, rendered in a popover that opens upward from the footer. */\n panel: ReactNode\n}\n\nexport interface MessageFooterProps {\n role: MessageRole\n /** Left side: author pill + time for the user. The assistant's steps toggle is added for you. */\n leading?: ReactNode\n /** Right side: branch control and action buttons. */\n actions?: ReactNode\n /** Assistant only: the \"N steps\" disclosure. */\n steps?: MessageStepsView\n className?: string\n labels?: Partial<MessageLabels>\n /** Test id of the steps toggle. */\n stepsToggleTestId?: string\n}\n\n/**\n * Footer row of a settled message. The whole row anchors the steps popover so the trace is as\n * wide as the card.\n */\nexport function MessageFooter({\n role,\n leading,\n actions,\n steps,\n className,\n labels,\n stepsToggleTestId,\n}: MessageFooterProps) {\n const l = { ...DEFAULT_MESSAGE_LABELS, ...labels }\n const isUser = role === 'user'\n const showSteps = !isUser && !!steps && steps.count > 0\n const row = (\n <div\n className={cn(\n 'flex items-center text-sm',\n isUser ? 'justify-end gap-2 text-xs' : 'justify-between'\n )}\n >\n <div className=\"flex items-center gap-2\">\n {leading}\n {showSteps && (\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"flex items-center gap-1 text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n aria-expanded={steps.open}\n aria-label={steps.open ? l.hideSteps : l.showSteps}\n data-testid={testIdOr(stepsToggleTestId, { testId: 'steps-toggle' })}\n >\n {steps.open ? <ChevronDown size={14} /> : <ChevronUp size={14} />}\n <span className=\"tabular-nums\">{l.stepCount(steps.count)}</span>\n </button>\n </PopoverTrigger>\n )}\n </div>\n <div className=\"flex items-center gap-1\">{actions}</div>\n </div>\n )\n\n return (\n <div\n data-slot=\"message-footer\"\n className={cn(\n 'text-muted-foreground',\n isUser ? 'mt-1 max-w-full self-end' : 'mt-3',\n className\n )}\n >\n {steps ? (\n <Popover open={steps.open} onOpenChange={steps.onOpenChange}>\n <PopoverAnchor asChild>{row}</PopoverAnchor>\n {!isUser && steps.count > 0 && (\n <PopoverContent\n side=\"top\"\n align=\"start\"\n sideOffset={8}\n className=\"max-h-[min(60vh,32rem)] w-[var(--radix-popover-trigger-width)] overflow-y-auto rounded-lg border border-border bg-popover p-0 shadow-lg\"\n >\n {steps.panel}\n </PopoverContent>\n )}\n </Popover>\n ) : (\n row\n )}\n </div>\n )\n}\n\nexport interface MessageActionButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Success tint (copied, saved). */\n isDone?: boolean\n}\n\n/** 32px (44px on touch) icon button used in the message footer. */\nexport const MessageActionButton = forwardRef<HTMLButtonElement, MessageActionButtonProps>(\n function MessageActionButton({ isDone, className, type = 'button', ...rest }, ref) {\n return (\n <button\n ref={ref}\n type={type}\n data-slot=\"message-action\"\n className={cn(\n 'inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50 pointer-coarse:h-11 pointer-coarse:w-11',\n isDone && 'text-green-text',\n className\n )}\n {...rest}\n />\n )\n }\n)\n\nexport interface MessageActionMenuItem {\n id: string\n label: string\n icon?: ReactNode\n onSelect: () => void\n testId?: string\n tone?: 'default' | 'danger'\n}\n\nexport interface MessageActionMenuProps {\n items: ReadonlyArray<MessageActionMenuItem>\n testId?: string\n /** Trigger `aria-label`; wins over `labels.moreActionsAria`. */\n label?: string\n labels?: Partial<MessageLabels>\n className?: string\n}\n\n/** Overflow (\"...\") menu: tap-friendly, every secondary action is reachable here. */\nexport function MessageActionMenu({\n items,\n testId,\n label,\n labels,\n className,\n}: MessageActionMenuProps) {\n const l = { ...DEFAULT_MESSAGE_LABELS, ...labels }\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <MessageActionButton\n onClick={(e) => e.stopPropagation()}\n className={className}\n title={l.moreActionsTitle}\n aria-label={label ?? l.moreActionsAria}\n data-testid={testId}\n >\n <MoreHorizontal size={16} />\n </MessageActionButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {items.map((item) => (\n <DropdownMenuItem\n key={item.id}\n onClick={(e) => {\n e.stopPropagation()\n item.onSelect()\n }}\n className={item.tone === 'danger' ? 'text-red-text focus:text-red-text' : undefined}\n data-testid={item.testId}\n >\n {item.icon}\n {item.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/* ── Compound export ──────────────────────────────────────────────────────────────────────── */\n\nexport const Message = {\n Root: MessageRoot,\n Content: MessageContent,\n Bubble: MessageBubble,\n Byline: MessageByline,\n SubagentBadge: MessageSubagentBadge,\n Body: MessageBody,\n Narration: MessageNarration,\n Sources: MessageSources,\n Footer: MessageFooter,\n ActionButton: MessageActionButton,\n ActionMenu: MessageActionMenu,\n}\n","import type { ReactNode } from 'react'\nimport { AlertCircle, RotateCw } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the alert. Pass a partial `labels` to translate or reword. */\nexport interface MessageAlertLabels {\n retrying: string\n /** Name of the retry button rendered for `onActivate`. */\n retry: string\n}\n\nexport const DEFAULT_MESSAGE_ALERT_LABELS: MessageAlertLabels = {\n retrying: 'Retrying...',\n retry: 'Retry',\n}\n\nexport interface MessageAlertProps {\n title: string\n description: string\n /** A retry is in flight: shows a spinner and the busy title. */\n isBusy?: boolean\n /** Title while busy; wins over `labels.retrying`. */\n busyTitle?: string\n labels?: Partial<MessageAlertLabels>\n /** Adds a Retry button (a real, keyboard-operable one) that runs this. */\n onActivate?: () => void\n /** Explicit buttons under the text (e.g. a Retry button). */\n actions?: ReactNode\n className?: string\n testId?: string\n}\n\n/** Tinted alert above the composer: a send that failed, or an answer that never arrived. */\nexport function MessageAlert({\n title,\n description,\n isBusy = false,\n busyTitle,\n labels,\n onActivate,\n actions,\n className,\n testId = 'message-alert',\n}: MessageAlertProps) {\n const l = { ...DEFAULT_MESSAGE_ALERT_LABELS, ...labels }\n return (\n <div\n data-slot=\"message-alert\"\n // A failure interrupts (alert); a retry in flight is only progress (status).\n role={isBusy ? 'status' : 'alert'}\n aria-busy={isBusy}\n className={cn(\n 'mb-3 rounded-lg border border-red-border bg-red-bg px-4 py-2 transition-colors',\n className\n )}\n data-testid={testId}\n >\n <div className=\"flex items-start gap-3\">\n {isBusy ? (\n <RotateCw\n aria-hidden=\"true\"\n className=\"mt-0.5 h-5 w-5 shrink-0 animate-spin text-red-text motion-reduce:animate-none\"\n />\n ) : (\n <AlertCircle aria-hidden=\"true\" className=\"mt-0.5 h-5 w-5 shrink-0 text-red-text\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"mb-1 text-base font-medium text-red-text\">\n {isBusy ? (busyTitle ?? l.retrying) : title}\n </p>\n <p className=\"mb-1 text-sm text-muted-foreground\">{description}</p>\n {(actions || onActivate) && (\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {actions}\n {onActivate && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"pointer-coarse:min-h-11\"\n disabled={isBusy}\n onClick={onActivate}\n data-testid={`${testId}-retry`}\n >\n <RotateCw aria-hidden=\"true\" className=\"mr-2 h-4 w-4\" />\n {l.retry}\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { ArrowLeft } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/**\n * Presentational shell of a (virtualised) message thread. The host owns the virtualiser and the\n * scroll element; these parts only lay the rows out, so any list engine can drive them:\n *\n * <MessageList.Root>\n * <MessageList.Banner onBack=... />\n * <MessageList.Rows totalSize={virtualizer.getTotalSize()}>\n * <MessageList.Row index start messageId measureRef> ... </MessageList.Row>\n * </MessageList.Rows>\n * <MessageList.Tail />\n * </MessageList.Root>\n */\n\n/** Every fixed string of the message list. Pass a partial `labels` to translate or reword. */\nexport interface MessageListLabels {\n messageList: string\n startConversation: string\n backToConversation: string\n conversationMessages: string\n /** Spoken once when a reply starts. */\n responding: string\n /** Spoken when a reply is complete; receives the (truncated) plain text of the answer. */\n responseComplete: (text: string) => string\n}\n\nexport const DEFAULT_MESSAGE_LIST_LABELS: MessageListLabels = {\n messageList: 'Message list',\n startConversation: 'Start a new conversation',\n backToConversation: \"Back to conversation — this is a sub-agent's delegated thread\",\n conversationMessages: 'Conversation messages',\n responding: 'Assistant is responding',\n responseComplete: (text) => (text ? `Response complete: ${text}` : 'Response complete'),\n}\n\nexport interface MessageListRootProps extends HTMLAttributes<HTMLDivElement> {\n /** A reply is streaming: `aria-busy` tells assistive tech to hold back until it settles. */\n isBusy?: boolean\n labels?: Partial<MessageListLabels>\n /** Test id of the list. A `data-testid` in the rest props still wins. */\n testId?: string\n}\n\n/**\n * A `log` landmark (the conversation transcript). Its own live announcements are switched off on\n * purpose: tokens streaming into a live region would be read out one fragment at a time. Pair it\n * with {@link MessageListStatus}, which announces \"responding\" once and the finished answer once.\n * An `aria-label` in the rest props wins over `labels.messageList`.\n */\nexport function MessageListRoot({\n className,\n children,\n isBusy = false,\n labels,\n testId = 'message-list',\n ...rest\n}: MessageListRootProps) {\n const l = { ...DEFAULT_MESSAGE_LIST_LABELS, ...labels }\n return (\n <div\n data-slot=\"message-list\"\n style={{ containerType: 'inline-size' }}\n data-testid={testId}\n role=\"log\"\n aria-live=\"off\"\n aria-busy={isBusy}\n aria-label={l.messageList}\n className={className}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport interface MessageListStatusProps {\n /** What to announce; change it to announce again. Build it with `useStreamAnnouncement`. */\n message: string\n testId?: string\n}\n\n/** Visually hidden polite live region. Mount it before the first announcement. */\nexport function MessageListStatus({\n message,\n testId = 'message-list-status',\n}: MessageListStatusProps) {\n return (\n <div\n data-slot=\"message-list-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"sr-only\"\n data-testid={testId}\n >\n {message}\n </div>\n )\n}\n\n/** Shown while the list has nothing to render. */\nexport function MessageListEmpty({\n children,\n labels,\n className,\n testId = 'message-list-empty',\n}: {\n /** Text; wins over `labels.startConversation`. */\n children?: ReactNode\n labels?: Partial<MessageListLabels>\n className?: string\n testId?: string\n}) {\n const l = { ...DEFAULT_MESSAGE_LIST_LABELS, ...labels }\n return (\n <div className={cn('flex h-64 items-center justify-center', className)} data-testid={testId}>\n <p className=\"text-muted-foreground\">{children ?? l.startConversation}</p>\n </div>\n )\n}\n\nexport interface MessageListBannerProps {\n onBack: () => void\n /** Text; wins over `labels.backToConversation`. */\n children?: ReactNode\n labels?: Partial<MessageListLabels>\n className?: string\n testId?: string\n}\n\n/**\n * Sticky way back out of a delegated (sub-agent) thread: pinned so the only sign you are not in\n * the real conversation does not scroll away.\n */\nexport function MessageListBanner({\n onBack,\n children,\n labels,\n className,\n testId = 'back-to-conversation-button',\n}: MessageListBannerProps) {\n const l = { ...DEFAULT_MESSAGE_LIST_LABELS, ...labels }\n return (\n <div\n data-slot=\"message-list-banner\"\n className={cn(\n 'sticky top-0 z-10 border-b border-border/40 bg-background px-3 py-2 sm:px-6',\n className\n )}\n >\n <button\n type=\"button\"\n onClick={onBack}\n className=\"flex items-center gap-1.5 rounded-md px-2 py-1 text-sm font-medium text-primary transition-colors hover:bg-muted/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n data-testid={testId}\n >\n <ArrowLeft size={14} />\n {children ?? l.backToConversation}\n </button>\n </div>\n )\n}\n\nexport interface MessageListRowsProps extends HTMLAttributes<HTMLDivElement> {\n /** Total scroll height reported by the virtualiser. */\n totalSize: number\n labels?: Partial<MessageListLabels>\n}\n\n/** Height spacer the virtualised rows are absolutely positioned inside. */\nexport function MessageListRows({\n totalSize,\n className,\n children,\n labels,\n ...rest\n}: MessageListRowsProps) {\n const l = { ...DEFAULT_MESSAGE_LIST_LABELS, ...labels }\n return (\n <div\n data-slot=\"message-list-rows\"\n style={{ height: totalSize, position: 'relative' }}\n role=\"list\"\n aria-label={l.conversationMessages}\n className={className}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport interface MessageListRowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {\n index: number\n /** Offset of the row from the top, in px. */\n start: number\n /** Exposed as `data-message-id` for scroll-to-message and deep links. */\n messageId?: string\n /**\n * Total messages in the thread. A virtualised list mounts only a window of rows, so without it\n * a screen reader counts the mounted rows; with it each row says \"n of N\".\n */\n setSize?: number\n}\n\n/** One absolutely positioned row. Pass the virtualiser's `measureElement` as `ref`. */\nexport const MessageListRow = forwardRef<HTMLDivElement, MessageListRowProps>(\n function MessageListRow({ index, start, messageId, setSize, className, children, ...rest }, ref) {\n const style: CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n transform: `translateY(${start}px)`,\n }\n return (\n <div\n ref={ref}\n data-slot=\"message-list-row\"\n data-index={index}\n data-message-id={messageId}\n role=\"listitem\"\n aria-posinset={setSize === undefined ? undefined : index + 1}\n aria-setsize={setSize}\n style={style}\n className={className}\n {...rest}\n >\n <div className={cn('w-full px-3 sm:px-6')}>{children}</div>\n </div>\n )\n }\n)\n\n/**\n * Breathing room so the last message clears the sticky composer. Fixed (not\n * viewport-proportional) so it never balloons into dead space on tall screens; smaller on phones.\n */\nexport function MessageListTail() {\n return (\n <div className=\"h-12 sm:h-32\" aria-hidden=\"true\">\n <div className=\"pointer-events-none h-8 bg-gradient-to-b from-background to-transparent sm:h-20\" />\n </div>\n )\n}\n\nexport const MessageList = {\n Root: MessageListRoot,\n Empty: MessageListEmpty,\n Banner: MessageListBanner,\n Status: MessageListStatus,\n Rows: MessageListRows,\n Row: MessageListRow,\n Tail: MessageListTail,\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { DEFAULT_MESSAGE_LIST_LABELS, type MessageListLabels } from './MessageList'\n\nexport interface UseStreamAnnouncementOptions {\n /** A reply is being generated. */\n isStreaming: boolean\n /** Latest text of the reply (any markup is flattened before it is spoken). */\n text: string\n /** Changing this (the open conversation) resets the announcer so nothing leaks across threads. */\n resetKey?: unknown\n /** Longest answer read out, in characters; the rest is cut at a word boundary. Default 600. */\n maxLength?: number\n labels?: Partial<Pick<MessageListLabels, 'responding' | 'responseComplete'>>\n}\n\n/** Plain, speakable text: no markdown punctuation, links as their label, whitespace collapsed. */\nexport function toSpeakableText(markdown: string, maxLength = 600): string {\n const flat = markdown\n .replace(/```[\\s\\S]*?```/g, ' ')\n .replace(/<[^>]+>/g, ' ')\n .replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/[*_`#>~|]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n if (flat.length <= maxLength) return flat\n const cut = flat.slice(0, maxLength)\n const lastSpace = cut.lastIndexOf(' ')\n return `${(lastSpace > maxLength / 2 ? cut.slice(0, lastSpace) : cut).trimEnd()}…`\n}\n\n/**\n * Message for `MessageList.Status`: \"responding\" once when a reply starts, then the finished\n * answer once when it settles. Tokens in between are never announced.\n */\nexport function useStreamAnnouncement({\n isStreaming,\n text,\n resetKey,\n maxLength,\n labels,\n}: UseStreamAnnouncementOptions): string {\n const l = { ...DEFAULT_MESSAGE_LIST_LABELS, ...labels }\n const [message, setMessage] = useState('')\n const wasStreaming = useRef(isStreaming)\n const textRef = useRef(text)\n textRef.current = text\n const lastKey = useRef(resetKey)\n\n useEffect(() => {\n if (lastKey.current !== resetKey) {\n // A different conversation: adopt its state silently.\n lastKey.current = resetKey\n wasStreaming.current = isStreaming\n setMessage('')\n return\n }\n if (isStreaming === wasStreaming.current) return\n wasStreaming.current = isStreaming\n setMessage(\n isStreaming ? l.responding : l.responseComplete(toSpeakableText(textRef.current, maxLength))\n )\n // Labels are static; only the streaming edge and the thread matter.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isStreaming, resetKey])\n\n return message\n}\n","import {\n forwardRef,\n useRef,\n useState,\n type ClipboardEvent,\n type CSSProperties,\n type FormEvent,\n type FormHTMLAttributes,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n type TextareaHTMLAttributes,\n} from 'react'\nimport {\n ArrowDown,\n ChevronDown,\n Edit3,\n FileText,\n Loader2,\n Mic,\n RotateCw,\n Send,\n Square,\n} from 'lucide-react'\nimport { Button, cn, Textarea, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { testIdOr } from './test-id'\n\n/** Every fixed string of the composer parts. Pass a partial `labels` to a part to translate or reword. */\nexport interface ComposerLabels {\n branchingNotice: string\n cancel: string\n inputAriaLabel: string\n pastedText: string\n /** Line/character summary of a collapsed paste. */\n pasteSummary: (lines: number, characters: string) => string\n expand: string\n retryMessage: string\n sendMessage: string\n voiceButton: string\n jumpToBottom: string\n}\n\nexport const DEFAULT_COMPOSER_LABELS: ComposerLabels = {\n branchingNotice: 'Editing message. Submit to send, or cancel to go back.',\n cancel: 'Cancel',\n inputAriaLabel: 'Write your prompt here',\n pastedText: 'Pasted text',\n pasteSummary: (lines, characters) => `${lines} lines · ${characters} characters`,\n expand: 'Expand',\n retryMessage: 'Retry message',\n sendMessage: 'Send message',\n voiceButton: 'Press and hold to speak',\n jumpToBottom: 'Jump to bottom',\n}\n\n/* ── Root: dock wrapper + form, with an optional notice above the frame ───────────────────── */\n\nexport interface ComposerRootProps extends Omit<FormHTMLAttributes<HTMLFormElement>, 'onSubmit'> {\n onSubmit: (event: FormEvent<HTMLFormElement>) => void\n /** Banner above the frame (e.g. {@link ComposerBranchingNotice}). */\n notice?: ReactNode\n /** Tints the whole composer while a message is being edited into a branch. */\n isBranching?: boolean\n /** Ref to the `<form>` (hosts measure it to anchor popups). */\n formRef?: Ref<HTMLFormElement>\n /** Test id of the outer dock. */\n testId?: string\n /** Test id of the `<form>`. Wins over a `data-testid` passed through the rest props. */\n formTestId?: string\n}\n\nexport function ComposerRoot({\n onSubmit,\n notice,\n isBranching,\n formRef,\n testId = 'message-input',\n formTestId,\n className,\n children,\n ...rest\n}: ComposerRootProps) {\n return (\n <div\n data-slot=\"composer\"\n className={cn('relative z-[20] shrink-0', isBranching && 'bg-muted/30')}\n data-testid={testId}\n >\n {notice}\n <form\n ref={formRef}\n onSubmit={onSubmit}\n {...rest}\n className={cn('relative w-full', className)}\n data-testid={testIdOr(formTestId, { testId: 'message-input-form' })}\n >\n {children}\n </form>\n </div>\n )\n}\n\nexport interface ComposerBranchingNoticeProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n onCancel?: () => void\n /** Notice text; wins over `labels.branchingNotice`. */\n children?: ReactNode\n labels?: Partial<ComposerLabels>\n testId?: string\n cancelTestId?: string\n}\n\nexport function ComposerBranchingNotice({\n onCancel,\n children,\n labels,\n testId = 'message-input-branching-indicator',\n cancelTestId,\n className,\n ...rest\n}: ComposerBranchingNoticeProps) {\n const l = { ...DEFAULT_COMPOSER_LABELS, ...labels }\n return (\n <div\n {...rest}\n data-slot=\"composer-notice\"\n className={cn('mb-2 flex items-center rounded-md bg-muted px-3 py-1.5 text-sm', className)}\n data-testid={testId}\n >\n <Edit3 size={16} className=\"mr-2 text-muted-foreground\" />\n <span className=\"flex-1 text-muted-foreground\">{children ?? l.branchingNotice}</span>\n {onCancel && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"ml-2\"\n onClick={onCancel}\n data-testid={testIdOr(cancelTestId, { testId: 'cancel-branching-button' })}\n >\n {l.cancel}\n </Button>\n )}\n </div>\n )\n}\n\n/* ── Frame: the floating surface; a click anywhere on it focuses the textarea ─────────────── */\n\nconst INTERACTIVE = 'button, a, input, textarea, select, [role=\"button\"], [contenteditable=\"true\"]'\n\nexport function ComposerFrame({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"composer-frame\"\n className={cn(\n 'relative flex w-full flex-col rounded-lg border border-border bg-background px-4 py-3 shadow-lg transition-shadow focus-within:shadow-xl',\n className\n )}\n // The whole frame is the click target, not just the one-line textarea. Interactive\n // children keep their own behaviour.\n onMouseDown={(e) => {\n const target = e.target as HTMLElement\n if (target.closest(INTERACTIVE)) return\n e.preventDefault()\n e.currentTarget.querySelector<HTMLTextAreaElement>('textarea')?.focus()\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/* ── Input ────────────────────────────────────────────────────────────────────────────────── */\n\nexport interface ComposerInputProps {\n value: string\n onValueChange: (next: string) => void\n /** Runs first; call `preventDefault()` to claim a key (slash menu, ghost suggestion, ...). */\n onKeyDown?: (event: KeyboardEvent<HTMLTextAreaElement>) => void\n /**\n * Enter submits the surrounding form and Shift+Enter inserts a newline. Ignored while an IME\n * composition is in progress and when `onKeyDown` already handled the key. Default true.\n */\n submitOnEnter?: boolean\n onPaste?: (event: ClipboardEvent<HTMLTextAreaElement>) => void\n placeholder?: string\n textareaRef?: Ref<HTMLTextAreaElement>\n /** Autocomplete-style suggestion shown in the placeholder slot. */\n isSuggestion?: boolean\n /** Taller, more inviting resting height for a brand-new conversation. */\n isRoomy?: boolean\n /** Show the \"Pasted text\" chip instead of the (huge) textarea. */\n isPasteCollapsed?: boolean\n onExpandPaste?: () => void\n /** Textarea `aria-label`; wins over `labels.inputAriaLabel`. */\n ariaLabel?: string\n /**\n * Extra attributes for the textarea, e.g. the combobox props of `useListKeyNav` when a slash\n * menu hangs off it. The composer's own value, key and focus handling always wins.\n */\n textareaProps?: Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'value' | 'onChange'>\n className?: string\n labels?: Partial<ComposerLabels>\n /** Test id of the textarea. */\n testId?: string\n /** Test id of the collapsed-paste chip. */\n pasteChipTestId?: string\n}\n\n/** Scroll the textarea so its last line with content is visible (the collapsed resting state). */\nfunction scrollToLastContentLine(textarea: HTMLTextAreaElement | null) {\n if (!textarea) return\n const text = textarea.value\n const lines = text.split('\\n')\n const trimmedLines = text.trimEnd().split('\\n')\n if (lines.length - trimmedLines.length > 0 && trimmedLines.length > 0) {\n const lineHeight = parseFloat(getComputedStyle(textarea).lineHeight) || 24\n textarea.scrollTop = (trimmedLines.length - 1) * lineHeight\n } else {\n textarea.scrollTop = textarea.scrollHeight\n }\n}\n\n/**\n * The prompt field. Rests at one line (or a few for a new chat), grows to 40vh when focused or\n * hovered, puts the caret at the end on focus, and folds a long paste behind a chip.\n */\nexport const ComposerInput = forwardRef<HTMLTextAreaElement, ComposerInputProps>(\n function ComposerInput(\n {\n value,\n onValueChange,\n onKeyDown,\n submitOnEnter = true,\n onPaste,\n placeholder,\n textareaRef,\n isSuggestion,\n isRoomy,\n isPasteCollapsed,\n onExpandPaste,\n ariaLabel,\n textareaProps,\n className,\n labels,\n testId = 'message-input-textarea',\n pasteChipTestId,\n },\n forwardedRef\n ) {\n const l = { ...DEFAULT_COMPOSER_LABELS, ...labels }\n const [isFocused, setIsFocused] = useState(false)\n const [isHovered, setIsHovered] = useState(false)\n const innerRef = useRef<HTMLTextAreaElement | null>(null)\n\n const setRefs = (node: HTMLTextAreaElement | null) => {\n innerRef.current = node\n for (const ref of [forwardedRef, textareaRef]) {\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLTextAreaElement | null }).current = node\n }\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented || !submitOnEnter) return\n if (event.key !== 'Enter' || event.shiftKey || event.altKey) return\n // keyCode 229 is how some browsers report the Enter that confirms an IME candidate.\n if (event.nativeEvent.isComposing || event.keyCode === 229) return\n event.preventDefault()\n event.currentTarget.form?.requestSubmit()\n }\n\n if (isPasteCollapsed) {\n const lineCount = value.split('\\n').length\n return (\n <button\n type=\"button\"\n data-slot=\"composer-paste-chip\"\n onClick={onExpandPaste}\n className=\"flex w-full items-center gap-2 rounded-md bg-muted/50 px-3 py-2 text-left transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40\"\n data-testid={testIdOr(pasteChipTestId, { testId: 'long-paste-placeholder' })}\n data-full-length={value.length}\n >\n <FileText className=\"h-4 w-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium text-foreground\">{l.pastedText}</span>\n <span className=\"block text-xs text-muted-foreground\">\n {l.pasteSummary(lineCount, value.length.toLocaleString())}\n </span>\n </span>\n <span className=\"flex shrink-0 items-center gap-1 text-xs font-medium text-muted-foreground\">\n {l.expand}\n <ChevronDown className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n </span>\n </button>\n )\n }\n\n return (\n <Textarea\n {...textareaProps}\n aria-label={ariaLabel ?? l.inputAriaLabel}\n placeholder={placeholder}\n data-suggested-query={isSuggestion ? 'true' : undefined}\n rows={1}\n ref={setRefs}\n value={value}\n onChange={(event) => onValueChange(event.target.value)}\n onPaste={onPaste}\n onKeyDown={handleKeyDown}\n disabled={false}\n className={cn(\n 'scrollbar-subtle !min-h-0 pointer-coarse:!min-h-11 pointer-coarse:py-2.5 w-full resize-none border-0 bg-transparent p-0 !text-base leading-relaxed text-foreground shadow-none placeholder:text-muted-foreground/50 focus-visible:ring-0 focus-visible:ring-offset-0 md:!text-base',\n className\n )}\n style={\n {\n fieldSizing: 'content',\n maxHeight:\n isFocused || isHovered ? '40vh' : value ? '6.5em' : isRoomy ? '4em' : '1.7em',\n overflowY: value ? 'auto' : 'hidden',\n scrollbarGutter: 'stable',\n } as CSSProperties\n }\n onFocus={() => {\n setIsFocused(true)\n requestAnimationFrame(() => {\n const ta = innerRef.current\n if (ta) {\n ta.setSelectionRange(ta.value.length, ta.value.length)\n ta.scrollTop = ta.scrollHeight\n }\n })\n }}\n onBlur={() => {\n setIsFocused(false)\n if (!isHovered) requestAnimationFrame(() => scrollToLastContentLine(innerRef.current))\n }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => {\n setIsHovered(false)\n if (!isFocused) requestAnimationFrame(() => scrollToLastContentLine(innerRef.current))\n }}\n data-testid={testId}\n />\n )\n }\n)\n\n/* ── Toolbar + buttons ────────────────────────────────────────────────────────────────────── */\n\nexport interface ComposerToolbarProps {\n /** Left cluster: attach, facts, mode badge. */\n leading?: ReactNode\n /** Right cluster: model, settings, voice, send. */\n trailing?: ReactNode\n className?: string\n}\n\nexport function ComposerToolbar({ leading, trailing, className }: ComposerToolbarProps) {\n return (\n <div\n data-slot=\"composer-toolbar\"\n className={cn(\n 'mt-2 flex flex-wrap items-center justify-between gap-x-1 gap-y-0.5',\n className\n )}\n >\n {/* Leading keeps its size; when both clusters no longer fit side by side (a 360px phone)\n the trailing one wraps onto its own right-aligned line instead of overlapping. */}\n <div className=\"flex shrink-0 items-center gap-1\">{leading}</div>\n <div className=\"ml-auto flex min-w-0 items-center justify-end gap-1\">{trailing}</div>\n </div>\n )\n}\n\nexport interface ComposerSendProps {\n onSend: () => void\n /** Nothing to send (empty draft) or sending is blocked. */\n disabled?: boolean\n /** Empty draft + a dangling prompt: the button resends it instead. */\n isRetry?: boolean\n labels?: Partial<ComposerLabels>\n className?: string\n /** Test ids per state; defaults are the send / retry ids. */\n testIds?: Partial<{ send: string; retry: string }>\n}\n\n/** The one filled primary of the chat view. */\nexport function ComposerSend({\n onSend,\n disabled,\n isRetry,\n labels,\n className,\n testIds,\n}: ComposerSendProps) {\n const l = { ...DEFAULT_COMPOSER_LABELS, ...labels }\n const sendTestId = testIdOr(testIds?.send, { testId: 'send-message-button' })\n const retryTestId = testIdOr(testIds?.retry, { testId: 'retry-button' })\n return (\n <Button\n type=\"button\"\n size=\"icon\"\n className={cn(\n 'h-9 w-9 shrink-0 pointer-coarse:h-11 pointer-coarse:w-11',\n // A faded primary is unreadable; a flat muted chip reads as \"not available yet\" at 4.5:1.\n 'disabled:bg-muted disabled:text-muted-foreground disabled:opacity-100',\n className\n )}\n aria-label={isRetry ? l.retryMessage : l.sendMessage}\n disabled={disabled}\n onClick={onSend}\n data-testid={isRetry ? retryTestId : sendTestId}\n >\n {isRetry ? <RotateCw className=\"h-3.5 w-3.5\" /> : <Send className=\"h-3.5 w-3.5\" />}\n </Button>\n )\n}\n\nexport interface ComposerVoiceButtonProps {\n isRecording: boolean\n isBusy: boolean\n onPressStart: () => void\n onPressEnd: () => void\n /** Label and tooltip; wins over `labels.voiceButton`. */\n label?: string\n labels?: Partial<ComposerLabels>\n className?: string\n /** Test ids per state; defaults are the start / recording ids. */\n testIds?: Partial<{ start: string; recording: string }>\n}\n\n/** Press-and-hold microphone. Pointer events, so it works the same with a finger. */\nexport function ComposerVoiceButton({\n isRecording,\n isBusy,\n onPressStart,\n onPressEnd,\n label,\n labels,\n className,\n testIds,\n}: ComposerVoiceButtonProps) {\n const text = label ?? { ...DEFAULT_COMPOSER_LABELS, ...labels }.voiceButton\n const startTestId = testIdOr(testIds?.start, { testId: 'start-recording-button' })\n const recordingTestId = testIdOr(testIds?.recording, { testId: 'recording-mic-button' })\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={text}\n onPointerDown={(e) => {\n e.preventDefault()\n onPressStart()\n }}\n onPointerUp={onPressEnd}\n onPointerLeave={onPressEnd}\n onPointerCancel={onPressEnd}\n disabled={isBusy}\n className={cn(\n 'h-8 w-8 shrink-0 p-0 hover:bg-muted pointer-coarse:h-11 pointer-coarse:w-11',\n isRecording && 'bg-red-bg',\n className\n )}\n data-testid={isRecording ? recordingTestId : startTestId}\n >\n {isBusy ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n ) : isRecording ? (\n <Square className=\"h-3 w-3 fill-red-text text-red-text\" />\n ) : (\n <Mic className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{text}</TooltipContent>\n </Tooltip>\n )\n}\n\n/* ── Dock: the sticky bottom region that holds alerts + composer ──────────────────────────── */\n\n/** Plain padded wrapper for composer-area content (alerts, bars, the composer itself). */\nexport function ComposerContainer({\n className,\n children,\n testId = 'message-input-container',\n ...rest\n}: HTMLAttributes<HTMLDivElement> & { testId?: string }) {\n return (\n <div\n {...rest}\n data-slot=\"composer-container\"\n className={cn('w-full bg-background py-1', className)}\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n\nexport interface ComposerDockProps {\n children: ReactNode\n /** Floating control above the dock (jump to latest). */\n floating?: ReactNode\n}\n\n/**\n * Sticky bottom strip: fades scrolling messages out behind the composer. Children are laid out\n * by the host (typically a centred {@link ComposerContainer} followed by optional sections).\n */\nexport function ComposerDock({ children, floating }: ComposerDockProps) {\n return (\n <div\n data-slot=\"composer-dock\"\n className=\"sticky bottom-0 z-40 w-full pb-4 sm:pb-[max(1rem,env(safe-area-inset-bottom))]\"\n >\n <div\n className=\"pointer-events-none absolute bottom-full left-0 right-0 h-16 bg-gradient-to-b from-transparent to-background/70\"\n aria-hidden=\"true\"\n />\n <div\n className=\"pointer-events-none absolute bottom-0 left-0 right-0 h-4 bg-gradient-to-b from-transparent to-background/60 backdrop-blur-sm\"\n aria-hidden=\"true\"\n />\n {floating}\n {children}\n </div>\n )\n}\n\nexport interface ScrollToBottomProps {\n show: boolean\n onClick: () => void\n /** Title and aria-label; wins over `labels.jumpToBottom`. */\n label?: string\n labels?: Partial<ComposerLabels>\n className?: string\n testId?: string\n}\n\n/** Jump-to-latest button that floats above the dock. */\nexport function ScrollToBottom({\n show,\n onClick,\n label,\n labels,\n className,\n testId = 'scroll-to-bottom-button',\n}: ScrollToBottomProps) {\n if (!show) return null\n const text = label ?? { ...DEFAULT_COMPOSER_LABELS, ...labels }.jumpToBottom\n return (\n <Button\n onClick={onClick}\n variant=\"outline\"\n size=\"icon\"\n className={cn(\n 'absolute -top-12 left-1/2 z-[15] h-10 w-10 -translate-x-1/2 shadow-lg pointer-coarse:h-11 pointer-coarse:w-11',\n className\n )}\n title={text}\n aria-label={text}\n data-testid={testId}\n >\n <ArrowDown size={20} />\n </Button>\n )\n}\n\nexport const Composer = {\n Root: ComposerRoot,\n Notice: ComposerBranchingNotice,\n Frame: ComposerFrame,\n Input: ComposerInput,\n Toolbar: ComposerToolbar,\n Send: ComposerSend,\n VoiceButton: ComposerVoiceButton,\n Container: ComposerContainer,\n Dock: ComposerDock,\n}\n","import { useCallback, useEffect, useId, useState, type KeyboardEvent } from 'react'\n\n/** Id of the option at `index` in the listbox `listboxId`. Rows and the combobox agree on it. */\nexport function listOptionId(listboxId: string, index: number): string {\n return `${listboxId}-option-${index}`\n}\n\nexport interface UseListKeyNavOptions<T> {\n /** Whether the list is currently shown. Keys fall through when false. */\n open: boolean\n items: ReadonlyArray<T>\n /** Enter / Tab on the highlighted row. */\n onPick: (item: T) => void\n /** Escape. */\n onDismiss?: () => void\n /** Changing this resets the highlight to the first row (e.g. the filter query). */\n resetKey?: unknown\n}\n\n/** ARIA attributes that make the text field the combobox that owns the list. */\nexport interface ListComboboxProps {\n role: 'combobox'\n 'aria-autocomplete': 'list'\n 'aria-haspopup': 'listbox'\n 'aria-expanded': true\n 'aria-controls': string\n 'aria-activedescendant': string\n}\n\nexport interface UseListKeyNav {\n /** Pass to the list (`listboxId`) so the field's `aria-controls` points at it. */\n listboxId: string\n /**\n * Spread onto the text field (`<input>` or `<textarea>`). Empty while the list is closed, so a\n * prompt that is usually just a text box is not announced as a collapsed combobox; it becomes\n * the combobox (expanded, with its active option) the moment the list opens.\n */\n comboboxProps: ListComboboxProps | Record<string, never>\n selectedIndex: number\n setSelectedIndex: (index: number) => void\n /** Call first in the textarea `onKeyDown`. Returns true when the key was consumed. */\n handleKeyDown: (event: KeyboardEvent<HTMLElement>) => boolean\n}\n\n/**\n * Headless keyboard navigation for an autocomplete list that sits over a text field:\n * ArrowUp/ArrowDown wrap, Enter/Tab pick, Escape dismisses. Only consumes keys while open.\n */\nexport function useListKeyNav<T>({\n open,\n items,\n onPick,\n onDismiss,\n resetKey,\n}: UseListKeyNavOptions<T>): UseListKeyNav {\n const [selectedIndex, setSelectedIndex] = useState(0)\n const listboxId = useId()\n const isExpanded = open && items.length > 0\n\n useEffect(() => {\n setSelectedIndex(0)\n }, [resetKey, items.length])\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>): boolean => {\n if (!open || items.length === 0) return false\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setSelectedIndex((i) => (i + 1) % items.length)\n return true\n case 'ArrowUp':\n event.preventDefault()\n setSelectedIndex((i) => (i - 1 + items.length) % items.length)\n return true\n case 'Enter':\n case 'Tab': {\n event.preventDefault()\n const pick = items[selectedIndex] ?? items[0]\n if (pick !== undefined) onPick(pick)\n return true\n }\n case 'Escape':\n event.preventDefault()\n onDismiss?.()\n return true\n default:\n return false\n }\n },\n [open, items, selectedIndex, onPick, onDismiss]\n )\n\n const comboboxProps: UseListKeyNav['comboboxProps'] = isExpanded\n ? {\n role: 'combobox',\n 'aria-autocomplete': 'list',\n 'aria-haspopup': 'listbox',\n 'aria-expanded': true,\n 'aria-controls': listboxId,\n 'aria-activedescendant': listOptionId(listboxId, selectedIndex),\n }\n : {}\n\n return { listboxId, comboboxProps, selectedIndex, setSelectedIndex, handleKeyDown }\n}\n","import { memo, useEffect, useId, useRef } from 'react'\nimport { BookOpen, Globe, SquareSlash } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { listOptionId } from '../lib/useListKeyNav'\nimport { prefixedTestId, testIdOr } from './test-id'\n\n/** Which list an entry came from: drives the menu's section grouping. */\nexport type SlashItemKind = 'command' | 'skill'\n\nexport interface SlashMenuItem {\n /** Slug used to invoke the entry (`/<slug>`). */\n name: string\n description?: string\n /** `command` = shipped built-in; `skill` = user-authored. */\n kind: SlashItemKind\n /** Args hint, e.g. `<prompt>`. */\n argHint?: string\n /** Marketplace visibility: drives the \"Global\" affordance. Skills only. */\n visibility?: 'mine' | 'global'\n}\n\n/** Every fixed string of the slash menu. Pass a partial `labels` to translate or reword. */\nexport interface SlashMenuLabels {\n hint: string\n commands: string\n skills: string\n global: string\n globalTitle: string\n /** Accessible name of the list. */\n list: string\n /** Polite count announced as the menu opens or the filter narrows it. */\n resultCount: (count: number) => string\n /** Footer action that opens the skills browser. */\n browse: string\n}\n\nexport const DEFAULT_SLASH_MENU_LABELS: SlashMenuLabels = {\n hint: 'Enter or Tab to insert, Esc to dismiss',\n commands: 'Commands',\n skills: 'Skills',\n global: 'Global',\n globalTitle: 'Shared skill from the marketplace',\n list: 'Commands and skills',\n resultCount: (count) => `${count} ${count === 1 ? 'command' : 'commands'} available`,\n browse: 'Browse skills',\n}\n\nexport interface SlashMenuProps {\n open: boolean\n /** The chat composer sits at the bottom (menu above); a top-of-page ask pill opens below. */\n placement?: 'above' | 'below'\n /** Highlighted row, 0-based over the flat list. */\n selectedIndex: number\n setSelectedIndex: (i: number) => void\n /**\n * Id of the listbox. Take it (and `comboboxProps`) from `useListKeyNav` so the text field's\n * `aria-controls` / `aria-activedescendant` point at this menu.\n */\n listboxId?: string\n /** Filtered list, already ordered commands-then-skills. */\n items: SlashMenuItem[]\n /** Adds a \"Browse skills\" footer that calls this (the host opens its skills browser). */\n onBrowse?: () => void\n onSelect: (item: SlashMenuItem) => void\n className?: string\n labels?: Partial<SlashMenuLabels>\n /** Test id of the menu (default `slash-menu`). */\n testId?: string\n /** Row prefixes (`<prefix>-<kind|name>`); defaults `slash-section` / `slash-item`. */\n testIds?: Partial<Record<'section' | 'item' | 'browse', string>>\n}\n\nfunction SectionIcon({ kind }: { kind: SlashItemKind }) {\n return kind === 'skill' ? (\n <BookOpen className=\"h-3 w-3\" aria-hidden=\"true\" />\n ) : (\n <SquareSlash className=\"h-3 w-3\" aria-hidden=\"true\" />\n )\n}\n\n/**\n * Slash-command autocomplete that floats over a text field. Presentational: the host owns the\n * filter, the highlighted index (see `useListKeyNav`) and what selecting an item does.\n */\nexport const SlashMenu = memo(function SlashMenu({\n open,\n placement = 'above',\n selectedIndex,\n setSelectedIndex,\n listboxId: listboxIdProp,\n items,\n onBrowse,\n onSelect,\n className,\n labels,\n testId,\n testIds,\n}: SlashMenuProps) {\n const l = { ...DEFAULT_SLASH_MENU_LABELS, ...labels }\n const ownId = useId()\n const listboxId = listboxIdProp ?? ownId\n // Keep the keyboard-highlighted row visible. Rows are split across per-section lists, so the\n // flat `data-slash-index` is the stable handle.\n const scrollRef = useRef<HTMLDivElement>(null)\n useEffect(() => {\n if (!open) return\n const el = scrollRef.current?.querySelector<HTMLElement>(\n `[data-slash-index=\"${selectedIndex}\"]`\n )\n // jsdom has no scrollIntoView.\n el?.scrollIntoView?.({ block: 'nearest' })\n }, [open, selectedIndex])\n\n if (!open || items.length === 0) return null\n\n let offset = 0\n const SECTIONS: ReadonlyArray<{ kind: SlashItemKind; label: string }> = [\n { kind: 'command', label: l.commands },\n { kind: 'skill', label: l.skills },\n ]\n const sections = SECTIONS.map(({ kind, label }) => {\n const rows = items.filter((i) => i.kind === kind)\n const section = { kind, label, rows, offset }\n offset += rows.length\n return section\n }).filter((s) => s.rows.length > 0)\n\n return (\n <div\n data-slot=\"slash-menu\"\n className={cn(\n 'absolute left-0 right-0 z-30 max-h-64 overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-lg',\n placement === 'above' ? 'bottom-full mb-2' : 'top-full mt-2',\n className\n )}\n // mousedown would blur the textarea (closing the menu before the click lands).\n onMouseDown={(e) => e.preventDefault()}\n data-testid={testIdOr(testId, { testId: 'slash-menu' })}\n >\n <div className=\"border-b border-border/50 px-3 py-1.5 text-xs text-muted-foreground\">\n {l.hint}\n </div>\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {l.resultCount(items.length)}\n </div>\n <div\n ref={scrollRef}\n id={listboxId}\n role=\"listbox\"\n aria-label={l.list}\n className=\"scrollbar-subtle max-h-56 overflow-y-auto py-1\"\n >\n {sections.map((section) => (\n <div\n key={section.kind}\n role=\"group\"\n aria-labelledby={`${listboxId}-section-${section.kind}`}\n >\n <div\n id={`${listboxId}-section-${section.kind}`}\n className=\"flex items-center gap-1.5 px-3 pb-1 pt-1.5 text-xs font-medium text-muted-foreground\"\n data-testid={prefixedTestId(testIds?.section, section.kind, {\n testId: `slash-section-${section.kind}`,\n })}\n >\n <SectionIcon kind={section.kind} />\n <span>{section.label}</span>\n </div>\n {section.rows.map((item, idx) => {\n const flatIndex = section.offset + idx\n const isActive = flatIndex === selectedIndex\n return (\n <div\n key={item.name}\n id={listOptionId(listboxId, flatIndex)}\n role=\"option\"\n aria-selected={isActive}\n data-slash-index={flatIndex}\n className={cn(\n 'flex cursor-pointer items-baseline gap-2 px-3 py-1.5 text-sm pointer-coarse:min-h-11 pointer-coarse:items-center',\n isActive ? 'bg-accent text-accent-foreground' : 'hover:bg-accent/50'\n )}\n onMouseEnter={() => setSelectedIndex(flatIndex)}\n onClick={() => onSelect(item)}\n data-testid={prefixedTestId(testIds?.item, item.name, {\n testId: `slash-item-${item.name}`,\n })}\n >\n <span className=\"shrink-0 font-mono text-foreground\">/{item.name}</span>\n {item.argHint && (\n <span className=\"shrink-0 font-mono text-xs text-muted-foreground\">\n {item.argHint}\n </span>\n )}\n {item.description && (\n <span className=\"truncate text-xs text-muted-foreground\">\n {item.description}\n </span>\n )}\n {item.visibility === 'global' && (\n <span\n className=\"ml-auto inline-flex shrink-0 items-center gap-1 text-xs text-muted-foreground\"\n title={l.globalTitle}\n >\n <Globe className=\"h-3 w-3\" />\n {l.global}\n </span>\n )}\n </div>\n )\n })}\n </div>\n ))}\n </div>\n {onBrowse && (\n <button\n type=\"button\"\n onClick={onBrowse}\n className=\"flex w-full items-center gap-1.5 border-t border-border/50 px-3 py-1.5 text-left text-xs text-muted-foreground hover:bg-accent/50 pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.browse, { testId: 'slash-browse-skills' })}\n >\n <BookOpen className=\"h-3 w-3\" aria-hidden=\"true\" />\n {l.browse}\n </button>\n )}\n </div>\n )\n})\n","import { Pin, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the chip. Pass a partial `labels` to translate or reword. */\nexport interface PinnedDocChipLabels {\n unpin: string\n /** Accessible name; `title` is the pinned document's name. */\n unpinDocument: (title: string) => string\n}\n\nexport const DEFAULT_PINNED_DOC_CHIP_LABELS: PinnedDocChipLabels = {\n unpin: 'Unpin',\n unpinDocument: (title) => `Unpin ${title}`,\n}\n\nexport interface PinnedDocChipProps {\n title: string\n onUnpin: () => void\n className?: string\n labels?: Partial<PinnedDocChipLabels>\n testId?: string\n}\n\n/**\n * The pinned-document chip that lives inside a composer's attach button: shows which document\n * holds the full-context pin and unpins it in ONE tap (the X is always visible, so touch and\n * keyboard reach it). It is a span with button semantics because it sits inside the attach\n * `<button>`, where nested buttons are invalid; `stopPropagation` keeps the tap from also\n * triggering the parent.\n */\nexport function PinnedDocChip({\n title,\n onUnpin,\n className,\n labels,\n testId = 'unpin-document-button',\n}: PinnedDocChipProps) {\n const l = { ...DEFAULT_PINNED_DOC_CHIP_LABELS, ...labels }\n return (\n <span\n role=\"button\"\n tabIndex={0}\n data-slot=\"pinned-doc-chip\"\n onClick={(e) => {\n e.stopPropagation()\n onUnpin()\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.stopPropagation()\n onUnpin()\n }\n }}\n title={l.unpin}\n aria-label={l.unpinDocument(title)}\n className={cn(\n '-mx-0.5 flex min-w-0 items-center gap-1 rounded-sm px-1 text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className\n )}\n data-testid={testId}\n >\n <Pin className=\"h-3 w-3 shrink-0 fill-primary\" />\n <X className=\"order-last h-3 w-3 shrink-0 text-muted-foreground\" />\n <span className=\"truncate text-sm\">{title}</span>\n </span>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ArrowUpRight, FileUp, GanttChartSquare, Sparkles } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from './test-id'\n\nexport interface ConversationShortcut {\n /** Short button label. */\n label: string\n /** Full prompt the host drops into the composer. */\n prompt: string\n}\n\n/** Every fixed string of the empty state. Pass a partial `labels` to translate or reword. */\nexport interface ConversationEmptyLabels {\n title: string\n description: string\n dropDocuments: string\n}\n\nexport const DEFAULT_CONVERSATION_EMPTY_LABELS: ConversationEmptyLabels = {\n title: 'Ask ARBI about your documents',\n description: 'Ask a question and verify every answer against the source.',\n dropDocuments: 'Drop documents here to add them',\n}\n\nexport interface ConversationEmptyProps {\n /** Does the workspace have documents to ask about? Picks the layout. */\n hasDocuments: boolean\n /** Starter questions (has-documents state). */\n prompts: ReadonlyArray<string>\n /** Featured action-shaped shortcut that leads the row. */\n shortcut?: ConversationShortcut\n /** Drop a prompt into the composer. */\n onUsePrompt: (text: string) => void\n /** Add documents: dropped files, or no argument to open the picker. */\n onAddDocuments: (files?: File[]) => void\n /** Rendered instead of the starters when there are no documents (upload box, alt sources). */\n noDocuments: ReactNode\n /**\n * Extra content under the starters (the host's list of things to start). It lives INSIDE the\n * empty state's own scroll area, never in the composer dock: the composer stays anchored at the\n * bottom whatever the length, and a long list scrolls here, above it.\n */\n below?: ReactNode\n /** Heading; wins over `labels.title`. */\n title?: string\n /** Sub-heading; wins over `labels.description`. */\n description?: string\n className?: string\n labels?: Partial<ConversationEmptyLabels>\n /** Per-part test ids; defaults are the current ids. */\n testIds?: Partial<{\n root: string\n upload: string\n shortcut: string\n prompt: string\n }>\n}\n\n/** Quiet \"drop documents here\" row for the has-documents state. */\nfunction AddDocumentsArea({\n onAddDocuments,\n label,\n testId,\n}: {\n onAddDocuments: (files?: File[]) => void\n label: string\n testId: string\n}) {\n return (\n <button\n type=\"button\"\n onClick={() => onAddDocuments()}\n onDragOver={(e) => {\n if (e.dataTransfer.types.includes('Files')) {\n e.preventDefault()\n e.dataTransfer.dropEffect = 'copy'\n }\n }}\n onDrop={(e) => {\n const files = Array.from(e.dataTransfer.files ?? [])\n if (files.length > 0) {\n e.preventDefault()\n onAddDocuments(files)\n }\n }}\n data-testid={testId}\n className=\"mx-auto flex w-full max-w-sm items-center justify-center gap-2 rounded-lg bg-muted px-3 py-2.5 text-sm text-muted-foreground transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <FileUp className=\"h-4 w-4 shrink-0\" />\n <span>{label}</span>\n </button>\n )\n}\n\n/** The host's list under the starters: wider than the starters, centred, text left-aligned. */\nconst BELOW = 'mx-auto w-full max-w-4xl text-left'\n\nconst CHIP =\n 'group inline-flex items-center rounded-full bg-muted px-3.5 py-2 text-left text-sm text-foreground transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11'\n\n/**\n * Empty state of a brand-new conversation. With no documents the first job is adding one, so\n * the host's upload box leads. With documents it is a one-line framing, a few clickable starter\n * prompts that prefill the composer, and a quiet \"add more\" row.\n */\nexport function ConversationEmpty({\n hasDocuments,\n prompts,\n shortcut,\n onUsePrompt,\n onAddDocuments,\n noDocuments,\n below,\n title,\n description,\n className,\n labels,\n testIds,\n}: ConversationEmptyProps) {\n const l = { ...DEFAULT_CONVERSATION_EMPTY_LABELS, ...labels }\n const rootTestId = testIdOr(testIds?.root, { testId: 'conversation-empty-state' })\n const uploadTestId = testIdOr(testIds?.upload, { testId: 'conversation-empty-upload' })\n const shortcutTestId = testIdOr(testIds?.shortcut, {\n testId: 'conversation-shortcut-main-events',\n })\n const promptTestId = testIdOr(testIds?.prompt, { testId: 'conversation-example-prompt' })\n // `pb-28` reserves the composer's height so the content reads as centred above the input;\n // the parent is `position: relative`, so inset-0 fills it.\n if (!hasDocuments) {\n return (\n <div\n data-slot=\"conversation-empty\"\n className={cn(\n 'absolute inset-0 flex flex-col items-center overflow-y-auto px-6 py-8 pb-28',\n className\n )}\n data-testid={rootTestId}\n >\n <div className=\"my-auto flex w-full flex-col items-center gap-8\">\n <div className=\"flex w-full max-w-xl flex-col items-center gap-3\">{noDocuments}</div>\n {below && <div className={BELOW}>{below}</div>}\n </div>\n </div>\n )\n }\n\n return (\n <div\n data-slot=\"conversation-empty\"\n className={cn('absolute inset-0 flex overflow-y-auto p-6 pb-28', className)}\n data-testid={rootTestId}\n >\n <div className=\"m-auto flex w-full flex-col\">\n <div className=\"mx-auto w-full max-w-xl text-center\">\n <div className=\"mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-lg bg-ai-soft text-ai-ink\">\n <Sparkles className=\"h-6 w-6\" />\n </div>\n <h2 className=\"text-lg font-semibold text-foreground\">{title ?? l.title}</h2>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{description ?? l.description}</p>\n </div>\n\n {/* The host's list comes straight after the heading: it is what the user came for, and on\n a phone it must not sit below the fold behind the starters. */}\n {below && <div className={cn(BELOW, 'mt-6')}>{below}</div>}\n\n <div className=\"mx-auto w-full max-w-xl text-center\">\n <div className={cn('flex flex-wrap justify-center gap-2', below ? 'mt-8' : 'mt-5')}>\n {shortcut && (\n <button\n type=\"button\"\n onClick={() => onUsePrompt(shortcut.prompt)}\n title={shortcut.prompt}\n className={cn(CHIP, 'gap-2 font-medium')}\n data-testid={shortcutTestId}\n >\n <GanttChartSquare className=\"h-4 w-4 shrink-0 text-ai-ink\" />\n <span>{shortcut.label}</span>\n <ArrowUpRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n </button>\n )}\n {prompts.map((prompt) => (\n <button\n key={prompt}\n type=\"button\"\n onClick={() => onUsePrompt(prompt)}\n className={cn(CHIP, 'gap-1.5')}\n data-testid={promptTestId}\n >\n {prompt}\n <ArrowUpRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n ))}\n </div>\n\n <div className=\"mt-5\">\n <AddDocumentsArea\n onAddDocuments={onAddDocuments}\n label={l.dropDocuments}\n testId={uploadTestId}\n />\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the conversation layout. Pass a partial `labels` to reword. */\nexport interface ConversationLayoutLabels {\n loadingMessages: string\n}\n\nexport const DEFAULT_CONVERSATION_LAYOUT_LABELS: ConversationLayoutLabels = {\n loadingMessages: 'Loading messages...',\n}\n\n/**\n * Page frame of a conversation. The chat scroll surface belongs to the HOST (the outer\n * `[data-scroll-container]`), so this column must GROW with its content, not stay\n * viewport-capped: the sticky header and the sticky composer dock need a containing block that\n * spans the whole thread, otherwise `position: sticky` is clamped to one screen and both unpin.\n *\n * Do NOT put `overflow: clip/hidden`, `transform`, `filter`, `will-change` or `contain` on\n * {@link ConversationBody}: `overflow: clip` collapses the scrollHeight so the thread cannot\n * scroll, and a transform creates a containing block that breaks the dock's `bottom: 0`.\n */\nexport function ConversationRoot({\n className,\n children,\n testId = 'conversation',\n ...rest\n}: HTMLAttributes<HTMLDivElement> & { testId?: string }) {\n return (\n <div\n data-slot=\"conversation\"\n className={cn('flex min-h-full shrink-0 flex-col', className)}\n data-testid={testId}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/** Sticky strip at the top (tabs and their actions). */\nexport function ConversationHeader({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"conversation-header\"\n className={cn('sticky top-0 z-10 bg-background', className)}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/** Grows (never shrinks) to the thread's full height so the sticky dock spans the scroll range. */\nexport function ConversationBody({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"conversation-body\"\n className={cn('flex flex-[1_0_auto] flex-col', className)}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/** The thread (or its empty / loading state). `relative` so absolutely-filled states fit. */\nexport function ConversationMain({ className, children, ...rest }: HTMLAttributes<HTMLElement>) {\n return (\n <main\n data-slot=\"conversation-main\"\n className={cn('relative flex flex-[1_0_auto] flex-col', className)}\n {...rest}\n >\n {children}\n </main>\n )\n}\n\n/** Centered status while the thread loads. */\nexport function ConversationLoading({\n children,\n labels,\n className,\n testId = 'loading-messages',\n}: {\n /** Text; wins over `labels.loadingMessages`. */\n children?: ReactNode\n labels?: Partial<ConversationLayoutLabels>\n className?: string\n testId?: string\n}) {\n const l = { ...DEFAULT_CONVERSATION_LAYOUT_LABELS, ...labels }\n return (\n <div className={cn('flex h-64 items-center justify-center', className)} data-testid={testId}>\n <p className=\"text-muted-foreground\">{children ?? l.loadingMessages}</p>\n </div>\n )\n}\n\nexport const Conversation = {\n Root: ConversationRoot,\n Header: ConversationHeader,\n Body: ConversationBody,\n Main: ConversationMain,\n Loading: ConversationLoading,\n}\n","import { ArrowLeft, ArrowRight, Network } from 'lucide-react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { testIdOr } from './test-id'\n\n/** Every fixed string of the branch controls. Pass a partial `labels` to translate or reword. */\nexport interface BranchControlsLabels {\n /** \"Branch 2 of 3\" (1-based `current`). */\n branchOf: (current: number, total: number) => string\n previewHint: string\n previousBranch: string\n nextBranch: string\n}\n\nexport const DEFAULT_BRANCH_CONTROLS_LABELS: BranchControlsLabels = {\n branchOf: (current, total) => `Branch ${current} of ${total}`,\n previewHint: 'Click for side-by-side view',\n previousBranch: 'Previous branch',\n nextBranch: 'Next branch',\n}\n\nexport interface BranchControlsProps {\n /** 0-based index of the active branch. */\n index: number\n /** Number of branches at this fork; nothing renders when there is only one. */\n count: number\n onSwitch: (targetIndex: number) => void\n /** Makes the label a button that opens the side-by-side view. */\n onPreview?: () => void\n /** Tooltip of the preview button; wins over `labels.previewHint`. */\n previewHint?: string\n className?: string\n labels?: Partial<BranchControlsLabels>\n /** Per-part test ids; defaults are the current ids. */\n testIds?: Partial<{\n root: string\n preview: string\n icon: string\n indicator: string\n previous: string\n next: string\n }>\n}\n\nconst ARROW =\n 'rounded p-1 hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:p-3'\n\n/** \"Branch 2 of 3\" with previous/next arrows at a fork in the conversation. */\nexport function BranchControls({\n index,\n count,\n onSwitch,\n onPreview,\n previewHint,\n className,\n labels,\n testIds,\n}: BranchControlsProps) {\n if (count <= 1) return null\n const l = { ...DEFAULT_BRANCH_CONTROLS_LABELS, ...labels }\n const label = l.branchOf(index + 1, count)\n const rootTestId = testIdOr(testIds?.root, { testId: 'branch-controls' })\n const previewTestId = testIdOr(testIds?.preview, { testId: 'threads-preview-button' })\n const iconTestId = testIdOr(testIds?.icon, { testId: 'branch-icon' })\n const indicatorTestId = testIdOr(testIds?.indicator, { testId: 'branch-indicator' })\n const previousTestId = testIdOr(testIds?.previous, { testId: 'previous-branch-button' })\n const nextTestId = testIdOr(testIds?.next, { testId: 'next-branch-button' })\n\n return (\n <div\n data-slot=\"branch-controls\"\n className={cn('branch-controls flex items-center gap-1', className)}\n data-testid={rootTestId}\n >\n {onPreview ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onPreview}\n className=\"flex items-center gap-1 rounded-md bg-muted px-2 py-1 transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n data-testid={previewTestId}\n >\n <Network size={12} className=\"text-primary\" data-testid={iconTestId} />\n <span\n className=\"text-sm font-medium text-muted-foreground\"\n data-testid={indicatorTestId}\n >\n {label}\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{previewHint ?? l.previewHint}</p>\n </TooltipContent>\n </Tooltip>\n ) : (\n <span\n className=\"flex items-center gap-1 px-2 py-1 text-sm font-medium text-muted-foreground\"\n data-testid={indicatorTestId}\n >\n <Network size={12} className=\"text-primary\" data-testid={iconTestId} />\n {label}\n </span>\n )}\n\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => onSwitch(index - 1)}\n disabled={index <= 0}\n className={ARROW}\n title={l.previousBranch}\n aria-label={l.previousBranch}\n data-testid={previousTestId}\n >\n <ArrowLeft size={12} />\n </button>\n <button\n type=\"button\"\n onClick={() => onSwitch(index + 1)}\n disabled={index >= count - 1}\n className={ARROW}\n title={l.nextBranch}\n aria-label={l.nextBranch}\n data-testid={nextTestId}\n >\n <ArrowRight size={12} />\n </button>\n </div>\n </div>\n )\n}\n","import { forwardRef } from 'react'\nimport type { ComponentType, ReactNode } from 'react'\nimport { Check, ChevronsUpDown, Crown, Glasses, Settings, Sparkles, Zap } from 'lucide-react'\nimport {\n Button,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { BlocksTooltipProvider } from '../provider/TooltipScope'\n\n// ── Icons ───────────────────────────────────────────────────────────────────────────────────\n\nexport type ModelTierKind = 'standard' | 'wise' | 'premium'\n\nconst TIER_ICON: Record<ModelTierKind, ComponentType<{ className?: string }>> = {\n standard: Zap,\n wise: Glasses,\n premium: Crown,\n}\n\nconst TIER_TONE: Record<ModelTierKind, string> = {\n standard: 'text-secondary fill-secondary',\n wise: 'text-secondary fill-secondary',\n premium: 'text-yellow-text fill-yellow-text',\n}\n\nexport interface ModelTierIconProps {\n tier: ModelTierKind\n /** Agentic mode off: the tier glyph is greyed. */\n isGreyed?: boolean\n className?: string\n}\n\n/** The glyph of a model tier (Fast/Standard bolt, Wise glasses, Premium crown). */\nexport function ModelTierIcon({ tier, isGreyed, className }: ModelTierIconProps) {\n const Icon = TIER_ICON[tier]\n return (\n <Icon\n className={cn(\n 'size-3.5 shrink-0',\n isGreyed ? 'fill-muted-foreground text-muted-foreground' : TIER_TONE[tier],\n className\n )}\n />\n )\n}\n\n/** The Autoselect sparkle. */\nexport function ModelAutoIcon({ className }: { className?: string }) {\n return <Sparkles className={cn('size-3.5 shrink-0 fill-secondary text-secondary', className)} />\n}\n\n/** Neutral status dot for models with no tier glyph. */\nexport function ModelDot({ isGreyed }: { isGreyed?: boolean }) {\n return (\n <div\n className={cn(\n 'size-2 shrink-0 rounded-full',\n isGreyed ? 'bg-muted-foreground' : 'bg-primary'\n )}\n />\n )\n}\n\n/** Label + icon content shared by menu rows and select items. */\nexport function ModelOptionLabel({ icon, label }: { icon: ReactNode; label: ReactNode }) {\n return (\n <div className=\"flex w-full items-center gap-2\">\n {icon}\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n </div>\n )\n}\n\n// ── Trigger ─────────────────────────────────────────────────────────────────────────────────\n\nexport interface ModelTriggerContentProps {\n icon?: ReactNode\n label: ReactNode\n}\n\n/** Icon + truncated label (used inside the compact trigger and the select trigger). */\nexport function ModelTriggerContent({ icon, label }: ModelTriggerContentProps) {\n return (\n <div className=\"flex min-w-0 items-center gap-1.5\">\n {icon}\n <span className=\"truncate\">{label}</span>\n </div>\n )\n}\n\nexport interface ModelPickerTriggerProps extends ModelTriggerContentProps {\n /** Spoken before the current model, so the button reads \"Model: Autoselect\". Default \"Model\". */\n nameLabel?: string\n className?: string\n testId?: string\n}\n\n/** The compact picker button (ghost, with a chevron). Forwards its ref for popover/tooltip triggers. */\nexport const ModelPickerTrigger = forwardRef<HTMLButtonElement, ModelPickerTriggerProps>(\n function ModelPickerTrigger(\n { icon, label, nameLabel = 'Model', className, testId = 'model-selector-compact', ...rest },\n ref\n ) {\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n 'h-8 min-w-0 shrink gap-1 px-2 text-sm text-muted-foreground hover:bg-muted hover:text-foreground pointer-coarse:h-11',\n className\n )}\n aria-label={typeof label === 'string' ? `${nameLabel}: ${label}` : undefined}\n data-slot=\"model-picker-trigger\"\n data-testid={testId}\n {...rest}\n >\n <ModelTriggerContent icon={icon} label={label} />\n <ChevronsUpDown className=\"size-3 shrink-0 text-muted-foreground\" />\n </Button>\n )\n }\n)\n\n// ── Popover + menu ──────────────────────────────────────────────────────────────────────────\n\nexport interface ModelPickerPopoverProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** The trigger (a ModelPickerTrigger). */\n trigger: ReactNode\n /** Hover tooltip on the trigger (hidden while open). */\n tooltip?: ReactNode\n title?: string\n /** The menu rows. */\n children: ReactNode\n}\n\n/** Popover shell: trigger + tooltip + titled, scrolling list. */\nexport function ModelPickerPopover({\n open,\n onOpenChange,\n trigger,\n tooltip,\n title = 'Select AI Model',\n children,\n}: ModelPickerPopoverProps) {\n return (\n <BlocksTooltipProvider>\n <Popover open={open} onOpenChange={onOpenChange}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>{trigger}</PopoverTrigger>\n </TooltipTrigger>\n {tooltip && !open && <TooltipContent side=\"top\">{tooltip}</TooltipContent>}\n </Tooltip>\n <PopoverContent side=\"top\" align=\"start\" className=\"w-[280px] p-1\" sideOffset={8}>\n <div className=\"px-2 py-1.5 text-sm font-medium text-muted-foreground\">{title}</div>\n <div className=\"flex max-h-[280px] flex-col gap-0.5 overflow-y-auto\">{children}</div>\n </PopoverContent>\n </Popover>\n </BlocksTooltipProvider>\n )\n}\n\nexport function ModelMenuDivider() {\n return <div className=\"my-0.5 border-t border-border\" role=\"separator\" />\n}\n\nexport function ModelMenuMessage({ children }: { children: ReactNode }) {\n return <div className=\"px-2 py-1.5 text-sm text-muted-foreground\">{children}</div>\n}\n\nexport interface ModelOptionProps {\n icon: ReactNode\n label: ReactNode\n isSelected: boolean\n onSelect: () => void\n testId: string\n /** Tier rows mark selection with a primary left edge and bold label. */\n emphasis?: 'plain' | 'tier'\n}\n\n/** One selectable model row. */\nexport function ModelOption({\n icon,\n label,\n isSelected,\n onSelect,\n testId,\n emphasis = 'plain',\n}: ModelOptionProps) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n 'flex w-full min-w-0 items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent pointer-coarse:min-h-11',\n emphasis === 'tier' && 'border-l-4',\n emphasis === 'tier' && (isSelected ? 'border-l-primary' : 'border-l-transparent'),\n isSelected && 'bg-accent'\n )}\n aria-pressed={isSelected}\n data-slot=\"model-option\"\n data-testid={testId}\n >\n {icon}\n <span\n className={cn(\n 'min-w-0 flex-1 truncate',\n emphasis === 'tier' &&\n (isSelected ? 'font-semibold text-foreground' : 'font-medium text-muted-foreground')\n )}\n >\n {label}\n </span>\n {isSelected && <Check className=\"size-3 shrink-0 text-primary\" />}\n </button>\n )\n}\n\nexport interface ModelTierOptionProps {\n icon: ReactNode\n label: ReactNode\n isSelected: boolean\n /** The tier is switched off in settings: shown dimmed and not selectable. */\n isDisabled?: boolean\n onSelect: () => void\n /** Trailing control (the configure cog). */\n action?: ReactNode\n testId: string\n}\n\n/** A tier row with a trailing action (Premium + configure cog). */\nexport function ModelTierOption({\n icon,\n label,\n isSelected,\n isDisabled,\n onSelect,\n action,\n testId,\n}: ModelTierOptionProps) {\n return (\n <div\n className={cn(\n 'flex items-center gap-1 rounded-sm border-l-4 pr-1 transition-colors',\n isSelected ? 'border-l-primary bg-accent' : 'border-l-transparent'\n )}\n data-slot=\"model-tier-option\"\n >\n <button\n type=\"button\"\n onClick={() => {\n if (!isDisabled) onSelect()\n }}\n disabled={isDisabled}\n className={cn(\n 'flex min-w-0 flex-1 items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm pointer-coarse:min-h-11',\n isDisabled ? 'cursor-not-allowed opacity-50' : 'hover:bg-accent'\n )}\n data-testid={testId}\n >\n {icon}\n <span\n className={cn(\n 'min-w-0 flex-1 truncate',\n isSelected ? 'font-semibold text-foreground' : 'font-medium text-muted-foreground'\n )}\n >\n {label}\n </span>\n </button>\n {action}\n </div>\n )\n}\n\nexport interface ModelConfigureButtonProps {\n onClick: () => void\n /** Accessible name. */\n label: string\n /** Tooltip text. */\n tooltip: string\n testId?: string\n}\n\n/** Small bordered cog beside a tier row. */\nexport function ModelConfigureButton({\n onClick,\n label,\n tooltip,\n testId,\n}: ModelConfigureButtonProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n className=\"flex size-7 shrink-0 items-center justify-center rounded-md border border-border bg-background text-foreground hover:bg-accent pointer-coarse:size-11\"\n data-testid={testId}\n aria-label={label}\n >\n <Settings className=\"size-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{tooltip}</TooltipContent>\n </Tooltip>\n )\n}\n\n/** Every fixed string of the pricing tip. Pass a partial `labels` to translate or reword. */\nexport interface ModelPricingTipLabels {\n input: (credits: string) => string\n output: (credits: string) => string\n}\n\nexport const DEFAULT_MODEL_PRICING_TIP_LABELS: ModelPricingTipLabels = {\n input: (credits) => `Input: ${credits} credits/M tokens`,\n output: (credits) => `Output: ${credits} credits/M tokens`,\n}\n\nexport interface ModelPricingTipProps {\n modelName: string\n /** Credits per million tokens, formatted. */\n inputCredits?: string | null\n outputCredits?: string | null\n labels?: Partial<ModelPricingTipLabels>\n}\n\n/** Tooltip body: model name and per-million-token credit prices. */\nexport function ModelPricingTip({\n modelName,\n inputCredits,\n outputCredits,\n labels,\n}: ModelPricingTipProps) {\n const l = { ...DEFAULT_MODEL_PRICING_TIP_LABELS, ...labels }\n return (\n <div className=\"space-y-1 text-sm\">\n <div className=\"font-medium\">{modelName}</div>\n {inputCredits && <div>{l.input(inputCredits)}</div>}\n {outputCredits && <div>{l.output(outputCredits)}</div>}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Bot, Plus, Settings } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from './test-id'\n\n// ── Header actions ──────────────────────────────────────────────────────────────────────────\n\n/** Right side of the conversation tab strip. */\nexport function ConversationHeaderActions({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn('flex items-center gap-2', className)}\n data-slot=\"conversation-header-actions\"\n >\n {children}\n </div>\n )\n}\n\n/** Every fixed string of the conversation parts. Pass a partial `labels` to a part to reword. */\nexport interface ConversationPartsLabels {\n /** \"New Chat\": `entityLabel` is the host's noun. */\n newEntity: (entityLabel: string) => string\n newPaChatTitle: string\n newPaChat: string\n paModeTitle: string\n pa: string\n}\n\nexport const DEFAULT_CONVERSATION_PARTS_LABELS: ConversationPartsLabels = {\n newEntity: (entityLabel) => `New ${entityLabel}`,\n newPaChatTitle: 'Start a new Personal Assistant chat',\n newPaChat: 'New PA Chat',\n paModeTitle: 'Personal Assistant mode',\n pa: 'PA',\n}\n\nexport interface NewChatButtonProps {\n /** Entity label, e.g. \"Chat\": names the button (\"New Chat\"). */\n entityLabel: string\n /** Narrow header: icon only. */\n isCompact: boolean\n onClick: () => void\n labels?: Partial<ConversationPartsLabels>\n testId?: string\n}\n\n/** \"+ New Chat\". */\nexport function NewChatButton({\n entityLabel,\n isCompact,\n onClick,\n labels,\n testId = 'new-conversation-button',\n}: NewChatButtonProps) {\n const text = { ...DEFAULT_CONVERSATION_PARTS_LABELS, ...labels }.newEntity(entityLabel)\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex h-8 items-center gap-1.5 rounded-md px-2 text-sm font-medium text-primary transition-colors hover:bg-primary/10 pointer-coarse:h-11! pointer-coarse:min-w-11 pointer-coarse:justify-center\"\n data-testid={testId}\n aria-label={text}\n title={text}\n >\n <Plus className=\"size-4 shrink-0\" />\n {!isCompact && <span>{text}</span>}\n </button>\n )\n}\n\n/** Starts a Personal Assistant conversation (experimental). */\nexport function NewPaChatButton({\n isCompact,\n onClick,\n labels,\n testId = 'new-pa-conversation-button',\n}: {\n isCompact: boolean\n onClick: () => void\n labels?: Partial<ConversationPartsLabels>\n testId?: string\n}) {\n const l = { ...DEFAULT_CONVERSATION_PARTS_LABELS, ...labels }\n return (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={onClick}\n className={cn(\n 'pointer-coarse:min-h-11',\n isCompact ? 'flex items-center' : 'flex w-auto items-center gap-2 px-4'\n )}\n data-testid={testId}\n title={l.newPaChatTitle}\n >\n <Bot className=\"size-4\" />\n {!isCompact && <span>{l.newPaChat}</span>}\n </Button>\n )\n}\n\n// ── Composer slots ──────────────────────────────────────────────────────────────────────────\n\n/** Left of the composer toolbar: borderless, muted buttons (files, facts). */\nexport function ComposerAccessories({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <span\n className={cn(\n 'flex items-center gap-1 [&_button]:border-transparent [&_button]:bg-transparent [&_button]:text-muted-foreground pointer-coarse:[&_button]:h-11',\n className\n )}\n data-slot=\"composer-accessories\"\n >\n {children}\n </span>\n )\n}\n\n/** Right of the composer toolbar: tools (settings, mic) around the send button. */\nexport function ComposerTools({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn(\n 'flex items-center gap-1 [&_button:not([data-testid=send-message-button]):not([data-testid=retry-button])]:border-transparent [&_button:not([data-testid=send-message-button]):not([data-testid=retry-button])]:bg-transparent',\n className\n )}\n data-slot=\"composer-tools\"\n >\n {children}\n </div>\n )\n}\n\n/** Personal Assistant mode marker in place of the accessories. */\nexport function PaModeBadge({\n icon,\n labels,\n testId = 'pa-mode-indicator',\n}: {\n icon: ReactNode\n labels?: Partial<ConversationPartsLabels>\n testId?: string\n}) {\n const l = { ...DEFAULT_CONVERSATION_PARTS_LABELS, ...labels }\n return (\n <div\n className=\"flex h-8 shrink-0 items-center gap-1.5 rounded-md px-2.5 text-yellow-text\"\n title={l.paModeTitle}\n data-testid={testId}\n >\n {icon}\n <span className=\"text-sm font-semibold\">{l.pa}</span>\n </div>\n )\n}\n\n/** Icon-only gear for the conversation's settings (developers). */\nexport function ConversationSettingsButton({\n label,\n onClick,\n testId = 'conversation-settings-button',\n}: {\n /** e.g. \"Chat Settings\". */\n label: string\n onClick: () => void\n testId?: string\n}) {\n return (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 shrink-0 text-muted-foreground pointer-coarse:size-11\"\n onClick={onClick}\n title={label}\n aria-label={label}\n data-testid={testId}\n >\n <Settings className=\"size-4\" />\n </Button>\n )\n}\n\n/** The history (list) view area when no chat tab is active. */\nexport function ConversationHistoryPane({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return <div className={cn('min-h-0 flex-1 overflow-hidden', className)}>{children}</div>\n}\n","import { useMemo, type ReactNode, type Ref } from 'react'\nimport DOMPurify from 'dompurify'\nimport { Download } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the thread map parts. Pass a partial `labels` to a part to reword. */\nexport interface ThreadMapLabels {\n saveSvgTitle: string\n saveSvg: string\n generating: string\n /** \"Error rendering diagram: <message>\". */\n renderError: (message: string) => string\n}\n\nexport const DEFAULT_THREAD_MAP_LABELS: ThreadMapLabels = {\n saveSvgTitle: 'Save SVG as file',\n saveSvg: 'Save SVG',\n generating: 'Generating visualization...',\n renderError: (message) => `Error rendering diagram: ${message}`,\n}\n\nexport interface ThreadMapProps {\n /** Hint line above the map; omit to hide the header. */\n hint?: string\n /** Offer \"Save SVG\" (only once there is a diagram). */\n onSave?: () => void\n /** The map body (ThreadMapLoading / ThreadMapError / ThreadMapDiagram). */\n children: ReactNode\n className?: string\n labels?: Partial<ThreadMapLabels>\n testId?: string\n}\n\n/** The conversation-thread map: hint + save header over a scrolling canvas. */\nexport function ThreadMap({\n hint,\n onSave,\n children,\n className,\n labels,\n testId = 'thread-visualizer',\n}: ThreadMapProps) {\n const l = { ...DEFAULT_THREAD_MAP_LABELS, ...labels }\n return (\n <div\n className={cn('thread-visualizer flex h-full w-full flex-col', className)}\n data-slot=\"thread-map\"\n data-testid={testId}\n >\n {hint !== undefined && (\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-sm italic text-muted-foreground\">{hint}</div>\n {onSave && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={onSave}\n title={l.saveSvgTitle}\n className=\"shrink-0 pointer-coarse:min-h-11\"\n >\n <Download className=\"size-3\" />\n {l.saveSvg}\n </Button>\n )}\n </div>\n )}\n <div\n className=\"mermaid-container w-full flex-1 overflow-auto rounded-lg bg-muted\"\n style={{ scrollBehavior: 'auto', contain: 'layout style' }}\n onScroll={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n </div>\n )\n}\n\nexport function ThreadMapLoading({\n label,\n labels,\n}: {\n /** Text; wins over `labels.generating`. */\n label?: string\n labels?: Partial<ThreadMapLabels>\n}) {\n const text = label ?? { ...DEFAULT_THREAD_MAP_LABELS, ...labels }.generating\n return (\n <div className=\"flex h-24 items-center justify-center text-muted-foreground\" role=\"status\">\n <div className=\"flex flex-col items-center\">\n <svg\n className=\"-ml-1 mr-3 size-5 animate-spin text-primary\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n <span>{text}</span>\n </div>\n </div>\n )\n}\n\nexport function ThreadMapError({\n message,\n labels,\n}: {\n message: string\n labels?: Partial<ThreadMapLabels>\n}) {\n const l = { ...DEFAULT_THREAD_MAP_LABELS, ...labels }\n return (\n <div className=\"p-4 text-red-text\" role=\"alert\">\n {l.renderError(message)}\n </div>\n )\n}\n\nexport interface ThreadMapDiagramProps {\n /**\n * Rendered SVG markup. Sanitised here (DOMPurify, SVG + HTML-label profile) before it is\n * injected: blocks cannot know whether the host's renderer ran in a strict security mode.\n */\n svg: string\n diagramRef?: Ref<HTMLDivElement>\n /** Accessible name of the diagram (default \"Conversation thread map\"). */\n label?: string\n}\n\n/** Strip scripts, event handlers and script URLs while keeping mermaid's `foreignObject` labels. */\nexport function sanitizeDiagramSvg(svg: string): string {\n // Without a DOM (SSR) DOMPurify cannot sanitise and would hand the input back: render nothing.\n if (!DOMPurify.isSupported) return ''\n return DOMPurify.sanitize(svg, {\n USE_PROFILES: { svg: true, svgFilters: true, html: true },\n ADD_TAGS: ['foreignobject'],\n HTML_INTEGRATION_POINTS: { foreignobject: true },\n ADD_ATTR: ['target'],\n })\n}\n\nexport function ThreadMapDiagram({\n svg,\n diagramRef,\n label = 'Conversation thread map',\n}: ThreadMapDiagramProps) {\n const safeSvg = useMemo(() => sanitizeDiagramSvg(svg), [svg])\n return (\n <div\n ref={diagramRef}\n className=\"p-4\"\n role=\"img\"\n aria-label={label}\n data-slot=\"thread-map-diagram\"\n dangerouslySetInnerHTML={{ __html: safeSvg }}\n />\n )\n}\n","import { useCallback, useState, type ClipboardEvent } from 'react'\n\nconst LONG_PASTE_CHARACTER_LIMIT = 1_000\nconst LONG_PASTE_LINE_LIMIT = 12\n\n/** True when the text is big enough that a composer should fold it behind a \"Pasted text\" chip. */\nexport function isLongPastedText(value: string): boolean {\n return (\n value.length >= LONG_PASTE_CHARACTER_LIMIT || value.split('\\n').length >= LONG_PASTE_LINE_LIMIT\n )\n}\n\nexport interface UseLongPaste {\n /** The draft is long AND the user pasted it (typing a long text never folds it). */\n isCollapsed: boolean\n /** Wire to the textarea `onPaste`. Folds when the post-paste draft is long. */\n onPaste: (event: ClipboardEvent<HTMLTextAreaElement>, currentValue: string) => void\n /** Wire to the textarea `onChange`: unfolds once the draft is short again. */\n onValueChange: (nextValue: string) => void\n /** Unfold (the \"Expand\" chip). */\n expand: () => void\n}\n\n/** Headless long-paste folding for a composer draft. */\nexport function useLongPaste(value: string): UseLongPaste {\n const [collapsed, setCollapsed] = useState(false)\n\n const onPaste = useCallback(\n (event: ClipboardEvent<HTMLTextAreaElement>, currentValue: string) => {\n const pasted = event.clipboardData.getData('text')\n const el = event.currentTarget\n const next =\n currentValue.slice(0, el.selectionStart) + pasted + currentValue.slice(el.selectionEnd)\n if (isLongPastedText(next)) setCollapsed(true)\n },\n []\n )\n\n const onValueChange = useCallback((nextValue: string) => {\n if (!isLongPastedText(nextValue)) setCollapsed(false)\n }, [])\n\n const expand = useCallback(() => setCollapsed(false), [])\n\n return { isCollapsed: collapsed && isLongPastedText(value), onPaste, onValueChange, expand }\n}\n","/**\n * PendingAnswerBar\n *\n * When the agent pauses to ask the user a question (ask_user / Human-in-the-loop),\n * this card docks directly above the message composer. It shows the FULL question\n * and lays the answer options out vertically — one full-width row each — so every\n * label is readable in full, however long. A countdown sits in the header.\n *\n * There is intentionally NO text input here: a free-text answer is typed in the\n * real composer below, which interjects the answer while a question is\n * pending. One input, where the user's cursor already is.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport { MessageCircleQuestion, Clock, Pause, Play } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the pending-answer bar. */\nexport interface PendingAnswerBarLabels {\n heading: string\n optionsLabel: string\n hint: string\n /** Pause button while the countdown runs. */\n pauseTimer: string\n /** Pause button while it is paused. */\n resumeTimer: string\n /** Name of the countdown, spoken with its value. */\n timeLeft: string\n /** Announced at 30 and 10 seconds left. */\n secondsWarning: (seconds: number) => string\n}\n\nexport const DEFAULT_PENDING_ANSWER_BAR_LABELS: PendingAnswerBarLabels = {\n heading: 'ARBI is asking',\n optionsLabel: 'Answer options',\n hint: 'Pick an option, or type your own answer below.',\n pauseTimer: 'Pause the countdown',\n resumeTimer: 'Resume the countdown',\n timeLeft: 'Time left to answer',\n secondsWarning: (seconds) => `${seconds} seconds left to answer`,\n}\n\nexport interface PendingAnswerBarProps {\n question: string\n options: string[]\n timeoutSeconds: number\n /** Called with the chosen option, the typed answer, or 'timeout' when it expires. */\n onPick: (answer: string) => void\n labels?: Partial<PendingAnswerBarLabels>\n}\n\nexport function PendingAnswerBar({\n question,\n options,\n timeoutSeconds,\n onPick,\n labels,\n}: PendingAnswerBarProps) {\n const l = { ...DEFAULT_PENDING_ANSWER_BAR_LABELS, ...labels }\n const [secondsLeft, setSecondsLeft] = useState(timeoutSeconds)\n // Once we've answered (or timed out) don't fire again as the bar unmounts.\n const firedRef = useRef(false)\n // WCAG 2.2.1: the countdown is pausable, and holds still while focus is inside the bar so a\n // keyboard or screen-reader user reading the options is never timed out under their hands.\n const [isPausedByUser, setIsPausedByUser] = useState(false)\n const [hasFocusWithin, setHasFocusWithin] = useState(false)\n const isPaused = isPausedByUser || hasFocusWithin\n // Spoken once the bar is mounted (a live region only announces changes made after it exists).\n const [announcement, setAnnouncement] = useState('')\n\n // A bare \"Other\" option is redundant — the composer is the free-text path.\n const choices = options.filter((o) => o.trim().toLowerCase() !== 'other')\n\n useEffect(() => {\n setAnnouncement(`${l.heading}: ${question}`)\n // Once per question: the bar is keyed by it in the host.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n useEffect(() => {\n if (secondsLeft <= 0 || isPaused) return\n const t = setInterval(() => setSecondsLeft((s) => (s <= 1 ? 0 : s - 1)), 1000)\n return () => clearInterval(t)\n }, [secondsLeft, isPaused])\n\n useEffect(() => {\n if (secondsLeft === 30 || secondsLeft === 10) setAnnouncement(l.secondsWarning(secondsLeft))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [secondsLeft])\n\n useEffect(() => {\n if (secondsLeft === 0 && !firedRef.current) {\n firedRef.current = true\n onPick('timeout')\n }\n }, [secondsLeft, onPick])\n\n const pick = (answer: string) => {\n if (firedRef.current) return\n firedRef.current = true\n onPick(answer)\n }\n\n const fmt = (s: number): string => {\n const m = Math.floor(s / 60)\n const r = s % 60\n return m > 0 ? `${m}:${r.toString().padStart(2, '0')}` : `${r}s`\n }\n const low = secondsLeft <= 30\n\n return (\n <div\n role=\"group\"\n aria-label={l.heading}\n className=\"mb-2 rounded-lg border border-theme-cyan/30 bg-theme-cyan/[0.05] px-3 py-2.5\"\n data-slot=\"pending-answer-bar\"\n data-testid=\"pending-answer-bar\"\n onFocus={() => setHasFocusWithin(true)}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n setHasFocusWithin(false)\n }\n }}\n >\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"sr-only\"\n data-testid=\"pending-answer-status\"\n >\n {announcement}\n </div>\n {/* Header: label + countdown */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <MessageCircleQuestion aria-hidden=\"true\" className=\"h-4 w-4 shrink-0 text-theme-cyan\" />\n <span className=\"text-xs font-medium uppercase tracking-wide text-theme-cyan\">\n {l.heading}\n </span>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <span\n role=\"timer\"\n aria-label={l.timeLeft}\n className={cn(\n 'flex items-center gap-1 text-xs tabular-nums',\n low ? 'text-red-text' : 'text-muted-foreground'\n )}\n data-testid=\"pending-answer-timer\"\n >\n <Clock aria-hidden=\"true\" className=\"h-3 w-3\" />\n {fmt(secondsLeft)}\n </span>\n <button\n type=\"button\"\n onClick={() => setIsPausedByUser((p) => !p)}\n aria-pressed={isPausedByUser}\n aria-label={l.pauseTimer}\n title={isPausedByUser ? l.resumeTimer : l.pauseTimer}\n className=\"flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-11\"\n data-testid=\"pending-answer-pause\"\n >\n {isPausedByUser ? (\n <Play aria-hidden=\"true\" className=\"h-3 w-3\" />\n ) : (\n <Pause aria-hidden=\"true\" className=\"h-3 w-3\" />\n )}\n </button>\n </div>\n </div>\n\n {/* The full question — wraps freely, never truncated */}\n <p className=\"mt-1.5 whitespace-pre-line text-sm text-foreground\">{question}</p>\n\n {/* Options, stacked vertically — each row reveals its full label */}\n {choices.length > 0 && (\n <div className=\"mt-2.5 flex flex-col gap-1.5\" role=\"group\" aria-label={l.optionsLabel}>\n {choices.map((option, i) => (\n <button\n key={`${i}-${option}`}\n type=\"button\"\n onClick={() => pick(option)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md border border-border bg-background',\n 'px-3 py-2 text-left text-sm text-foreground transition-colors',\n 'hover:border-theme-cyan/50 hover:bg-theme-cyan/10',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11'\n )}\n data-testid={`pending-answer-option-${option}`}\n >\n <span\n aria-hidden=\"true\"\n className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded-full border border-theme-cyan/40 text-xs font-medium text-theme-cyan\"\n >\n {i + 1}\n </span>\n <span className=\"min-w-0 flex-1\">{option}</span>\n </button>\n ))}\n </div>\n )}\n\n {/* Free-text affordance — points at the composer below */}\n <p className=\"mt-2 text-xs text-muted-foreground\">{l.hint}</p>\n </div>\n )\n}\n","import { useMemo, type ComponentType, type ReactNode } from 'react'\nimport { Bot, Loader2, MessageSquare, Search, User, X } from 'lucide-react'\n\nimport { Button, PassageCard } from '@arbidocs/react/ui'\n\n/** One matching message of a conversation. */\nexport interface ConversationSearchMatch {\n id: string\n role: string\n score: number\n snippet: string\n}\n\n/** A conversation with the messages that matched the query. */\nexport interface ConversationSearchGroup {\n id: string\n title?: string | null\n matches: ConversationSearchMatch[]\n}\n\n/** Every fixed string of the conversation search. */\nexport interface ConversationSearchLabels {\n placeholder: string\n search: string\n searching: string\n matched: (count: number, query: string) => string\n matchCount: (count: number) => string\n untitled: string\n you: string\n assistant: string\n clear: string\n noResults: (query: string) => string\n reindexHint: ReactNode\n backToList: string\n}\n\nexport const DEFAULT_CONVERSATION_SEARCH_LABELS: ConversationSearchLabels = {\n placeholder: 'Search your conversations...',\n search: 'Search',\n searching: 'Searching conversations…',\n matched: (count, query) => `${count} conversation${count === 1 ? '' : 's'} matched “${query}”`,\n matchCount: (count) => `${count} match${count === 1 ? '' : 'es'}`,\n untitled: 'Untitled conversation',\n you: 'You',\n assistant: 'Assistant',\n clear: 'Clear',\n noResults: (query) => `No conversations matched “${query}”.`,\n reindexHint: (\n <>\n Older conversations may need indexing — try <span className=\"font-medium\">Re-index</span>.\n </>\n ),\n backToList: 'Back to list',\n}\n\nexport interface ConversationSearchViewProps {\n query: string\n onQueryChange: (query: string) => void\n /** Enter (without Shift) or the submit button. */\n onSubmit: () => void\n canSubmit: boolean\n isSearching: boolean\n /** The query the shown results answer; empty while no search has run. */\n submittedQuery: string\n /** Results of `submittedQuery`. */\n groups: ConversationSearchGroup[]\n onOpenConversation: (conversationId: string, messageId?: string) => void\n /** Back to the idle body. */\n onClear: () => void\n /** Shown beneath the bar until a search is run (e.g. the history list). */\n children?: ReactNode\n /** Wraps the results area (e.g. an error boundary). */\n ResultsBoundary?: ComponentType<{ children: ReactNode }>\n labels?: Partial<ConversationSearchLabels>\n}\n\nfunction RoleChip({ isUser, labels }: { isUser: boolean; labels: ConversationSearchLabels }) {\n const Icon = isUser ? User : Bot\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground\">\n <Icon className=\"size-3\" />\n {isUser ? labels.you : labels.assistant}\n </span>\n )\n}\n\nconst Passthrough = ({ children }: { children: ReactNode }) => <>{children}</>\n\n/**\n * Search across past conversations: a search bar, then either the idle body (history list) or\n * the matches grouped by conversation. Opening a group or a hit is the host's navigation.\n */\nexport function ConversationSearchView({\n query,\n onQueryChange,\n onSubmit,\n canSubmit,\n isSearching,\n submittedQuery,\n groups,\n onOpenConversation,\n onClear,\n children,\n ResultsBoundary = Passthrough,\n labels,\n}: ConversationSearchViewProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONVERSATION_SEARCH_LABELS, ...labels }), [labels])\n const hasResults = !!submittedQuery && !isSearching && groups.length > 0\n\n return (\n <div\n data-slot=\"conversation-search\"\n className=\"flex h-full flex-col\"\n data-testid=\"conversation-search-page\"\n >\n <div className=\"flex items-start gap-3 px-6 py-4\">\n <form\n onSubmit={(e) => {\n e.preventDefault()\n onSubmit()\n }}\n className=\"flex-1\"\n >\n <div className=\"flex items-start gap-2 rounded-md border border-input bg-muted px-3 py-1.5 focus-within:ring-2 focus-within:ring-ring\">\n <textarea\n rows={1}\n value={query}\n onChange={(e) => {\n onQueryChange(e.target.value)\n e.target.style.height = 'auto'\n e.target.style.height = `${e.target.scrollHeight}px`\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onSubmit()\n }\n }}\n placeholder={l.placeholder}\n aria-label={l.search}\n className=\"flex-1 resize-none overflow-hidden border-0 bg-transparent p-0 text-base leading-relaxed text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid=\"conversation-search-input\"\n />\n <div className=\"flex flex-shrink-0 items-center gap-1\">\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={!canSubmit}\n className=\"size-7 pointer-coarse:size-11\"\n data-testid=\"conversation-search-submit-button\"\n title={l.search}\n aria-label={l.search}\n >\n {isSearching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Search className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n </form>\n </div>\n\n {!submittedQuery ? (\n <div className=\"flex-1 overflow-hidden\">{children}</div>\n ) : (\n <ResultsBoundary>\n <main className=\"flex-1 overflow-auto px-6 pb-6\">\n {isSearching ? (\n <div className=\"flex items-center justify-center gap-2 py-16 text-muted-foreground\">\n <Loader2 className=\"size-5 animate-spin\" />\n {l.searching}\n </div>\n ) : hasResults ? (\n <div className=\"space-y-4\" data-testid=\"conversation-search-results\">\n <div className=\"flex items-center justify-between gap-3\">\n <p className=\"text-sm text-muted-foreground\">\n {l.matched(groups.length, submittedQuery)}\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 gap-1 text-muted-foreground pointer-coarse:h-11\"\n onClick={onClear}\n data-testid=\"conversation-search-clear\"\n >\n <X className=\"size-3.5\" />\n {l.clear}\n </Button>\n </div>\n {groups.map((group) => (\n <div\n key={group.id}\n className=\"rounded-lg border border-border bg-card\"\n data-testid=\"conversation-search-group\"\n >\n <button\n type=\"button\"\n onClick={() => onOpenConversation(group.id)}\n className=\"flex w-full items-center justify-between gap-3 rounded-t-lg px-4 py-2.5 text-left transition-colors hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <MessageSquare className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"truncate font-medium\">{group.title || l.untitled}</span>\n </span>\n <span className=\"flex-shrink-0 text-xs text-muted-foreground\">\n {l.matchCount(group.matches.length)}\n </span>\n </button>\n <div className=\"space-y-2 border-t border-border p-3\">\n {group.matches.map((m) => (\n <PassageCard\n key={m.id}\n header={<RoleChip isUser={m.role === 'user'} labels={l} />}\n score={m.score}\n onClick={() => onOpenConversation(group.id, m.id)}\n data-testid=\"conversation-search-hit\"\n >\n <p className=\"line-clamp-3 text-sm text-foreground/90\">{m.snippet}</p>\n </PassageCard>\n ))}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div\n className=\"py-16 text-center text-muted-foreground\"\n data-testid=\"conversation-search-no-results\"\n >\n <MessageSquare className=\"mx-auto mb-3 size-8 opacity-40\" />\n <p>{l.noResults(submittedQuery)}</p>\n <p className=\"mt-1 text-sm\">{l.reindexHint}</p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"mt-3 gap-1 text-muted-foreground pointer-coarse:h-11\"\n onClick={onClear}\n >\n <X className=\"size-3.5\" />\n {l.backToList}\n </Button>\n </div>\n )}\n </main>\n </ResultsBoundary>\n )}\n </div>\n )\n}\n","import {\n forwardRef,\n Fragment,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type MouseEventHandler,\n type ReactNode,\n} from 'react'\nimport { Check, CheckCircle, Search } from 'lucide-react'\nimport {\n Badge,\n Button,\n HoverCardContent,\n Input,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n cn,\n type ButtonProps,\n} from '@arbidocs/react/ui'\n\n/**\n * Parts of the composer's \"in this chat\" panels (files, facts): a card that opens upward from the\n * composer, a grouped pick list, and below it the labels, search and bulk actions.\n */\n\n/** The card itself: width follows the chat input (`--chat-input-width`), bounded on small screens. */\nexport const ContextPanelContent = forwardRef<\n ElementRef<typeof HoverCardContent>,\n ComponentPropsWithoutRef<typeof HoverCardContent>\n>(function ContextPanelContent({ className, onClick, ...props }, ref) {\n return (\n <HoverCardContent\n ref={ref}\n side=\"top\"\n align=\"start\"\n data-slot=\"context-panel\"\n // Clicks inside must not bubble (via the React portal) to a click-to-toggle wrapper.\n onClick={(e) => {\n e.stopPropagation()\n onClick?.(e)\n }}\n className={cn(\n 'w-[var(--chat-input-width,var(--radix-hover-card-content-available-width))] max-h-[var(--radix-hover-card-content-available-height)] max-w-[95vw] overflow-y-auto overscroll-contain rounded-md border border-border bg-muted p-3 shadow-lg',\n className\n )}\n {...props}\n />\n )\n})\n\nexport interface ContextPickerGroup {\n key: string\n heading: string\n /** Id of the heading element. */\n testId?: string\n /** Shown after the heading as `(n)`. */\n count: number\n children: ReactNode\n}\n\nexport interface ContextPickerListProps {\n groups: ContextPickerGroup[]\n /** Shown instead of the groups when every group is empty. */\n emptyText: string\n testId: string\n className?: string\n}\n\n/**\n * Two (or more) headed groups, e.g. \"In this conversation\" then \"In this workspace\". Each heading\n * pins to the top of the scroller and is pushed out by the next one; the second parks below the\n * first (32px = a heading's own height), so both stay visible however far down you scroll.\n */\nexport function ContextPickerList({\n groups,\n emptyText,\n testId,\n className,\n}: ContextPickerListProps) {\n const isEmpty = groups.every((g) => g.count === 0)\n return (\n <div\n className={cn('max-h-[400px] space-y-1 overflow-y-auto', className)}\n data-slot=\"context-picker-list\"\n data-testid={testId}\n onClick={(e) => e.stopPropagation()}\n >\n {isEmpty ? (\n <p className=\"p-2 text-sm text-muted-foreground\">{emptyText}</p>\n ) : (\n groups.map((g, index) => (\n <Fragment key={g.key}>\n <div\n className={cn(\n 'sticky z-10 bg-muted px-2 py-1.5 text-sm font-medium text-muted-foreground',\n index === 0 ? 'top-0' : 'top-8'\n )}\n data-testid={g.testId}\n >\n {g.heading} ({g.count})\n </div>\n {g.children}\n </Fragment>\n ))\n )}\n </div>\n )\n}\n\nfunction CheckGlyph({ isChecked, className }: { isChecked: boolean; className?: string }) {\n return (\n <span\n className={cn(\n 'flex size-3.5 shrink-0 items-center justify-center rounded-sm border',\n isChecked ? 'border-primary bg-primary text-primary-foreground' : 'border-input',\n className\n )}\n >\n {isChecked && <Check className=\"size-3\" />}\n </span>\n )\n}\n\nexport interface ContextPickerRowProps {\n isSelected: boolean\n onToggle: () => void\n testId?: string\n children: ReactNode\n}\n\n/** A whole-row toggle (e.g. a fact): check glyph then clamped text. */\nexport function ContextPickerRow({\n isSelected,\n onToggle,\n testId,\n children,\n}: ContextPickerRowProps) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onToggle()\n }}\n aria-pressed={isSelected}\n data-testid={testId}\n className={cn(\n 'flex w-full items-start gap-2 rounded p-2 text-left text-sm transition-colors pointer-coarse:min-h-11',\n isSelected ? 'bg-primary/10' : 'bg-card hover:bg-muted'\n )}\n >\n <CheckGlyph isChecked={isSelected} className=\"mt-0.5\" />\n <span className=\"line-clamp-2 min-w-0 text-foreground\">{children}</span>\n </button>\n )\n}\n\nexport interface ContextCheckRowProps {\n isSelected: boolean\n /** The check toggle: accessible name (e.g. \"Add to conversation\"), handler and test id. */\n toggle: { label: string; onToggle: () => void; testId?: string }\n /** Status glyph between the toggle and the content. */\n status?: ReactNode\n testId?: string\n /** The row's content (e.g. a document pill that opens the document). */\n children: ReactNode\n}\n\n/** A row with its own check toggle plus a content slot (e.g. a document, which opens on click). */\nexport function ContextCheckRow({\n isSelected,\n toggle,\n status,\n testId,\n children,\n}: ContextCheckRowProps) {\n return (\n <div\n className=\"flex items-center gap-2 rounded px-1 py-0.5\"\n data-slot=\"context-check-row\"\n data-testid={testId}\n >\n <button\n type=\"button\"\n aria-label={toggle.label}\n aria-pressed={isSelected}\n onClick={toggle.onToggle}\n data-testid={toggle.testId}\n className=\"flex shrink-0 items-center justify-center rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-11\"\n >\n <CheckGlyph isChecked={isSelected} />\n </button>\n {status}\n {children}\n </div>\n )\n}\n\nexport interface ContextSelectListProps {\n children: ReactNode\n}\n\n/** Compact single-select list (e.g. choose the document to pin). */\nexport function ContextSelectList({ children }: ContextSelectListProps) {\n return <div className=\"max-h-[150px] space-y-2 overflow-y-auto\">{children}</div>\n}\n\nexport interface ContextSelectRowProps {\n isSelected: boolean\n onSelect: MouseEventHandler<HTMLButtonElement>\n status?: ReactNode\n title: string\n testId?: string\n}\n\nexport function ContextSelectRow({\n isSelected,\n onSelect,\n status,\n title,\n testId,\n}: ContextSelectRowProps) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onSelect(e)\n }}\n aria-pressed={isSelected}\n data-testid={testId}\n className={cn(\n 'flex w-full items-center gap-2 rounded p-2 text-left text-sm transition-colors pointer-coarse:min-h-11',\n isSelected ? 'border border-primary/30 bg-primary/10' : 'bg-card hover:bg-muted'\n )}\n >\n {status}\n <span className=\"min-w-0 flex-1 truncate text-foreground\" title={title}>\n {title}\n </span>\n {isSelected && <CheckCircle className=\"size-3.5 shrink-0 text-primary\" />}\n </button>\n )\n}\n\nexport interface ContextPanelFooterProps {\n /** Label shortcut chips (host-supplied row). */\n labels?: ReactNode\n /** The search box. */\n search: ReactNode\n /** Icon + title of the panel; omit when tabs already name it. */\n title?: ReactNode\n /** The action buttons, right aligned. */\n actions: ReactNode\n}\n\n/** Everything below the list: the panel opens upward, so its controls sit nearest the button. */\nexport function ContextPanelFooter({ labels, search, title, actions }: ContextPanelFooterProps) {\n return (\n <div className=\"mt-3 space-y-2 border-t border-border pt-3\" data-slot=\"context-panel-footer\">\n {labels}\n {search}\n <div\n className={cn(\n 'flex flex-wrap items-center gap-x-2 gap-y-1.5',\n title ? 'justify-between' : 'justify-end'\n )}\n >\n {title && (\n <div className=\"flex min-w-0 items-center gap-2 text-sm font-medium text-foreground\">\n {title}\n </div>\n )}\n <div className=\"flex flex-wrap items-center gap-1.5\">{actions}</div>\n </div>\n </div>\n )\n}\n\nexport const ContextSearchInput = forwardRef<\n HTMLInputElement,\n ComponentPropsWithoutRef<typeof Input>\n>(function ContextSearchInput({ className, onClick, ...props }, ref) {\n return (\n <div className=\"relative\" onClick={(e) => e.stopPropagation()}>\n <Search className=\"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n ref={ref}\n className={cn('h-7 bg-background pl-7 text-sm', className)}\n onClick={onClick}\n {...props}\n />\n </div>\n )\n})\n\nexport interface ContextActionButtonProps extends Omit<ButtonProps, 'size'> {\n icon?: ReactNode\n /** Badge after the label; hidden at 0 / undefined. */\n count?: number\n /** Put the icon after the label (bulk Add / Remove) rather than before it. */\n isIconTrailing?: boolean\n}\n\n/** Compact action of the panel footer (stops click propagation so the card stays open). */\nexport const ContextActionButton = forwardRef<HTMLButtonElement, ContextActionButtonProps>(\n function ContextActionButton(\n { icon, count, isIconTrailing, onClick, children, className, variant = 'outline', ...props },\n ref\n ) {\n return (\n <Button\n ref={ref}\n variant={variant}\n size=\"sm\"\n className={cn('flex h-6 items-center gap-1 px-2 text-sm pointer-coarse:h-11', className)}\n onClick={(e) => {\n e.stopPropagation()\n onClick?.(e)\n }}\n {...props}\n >\n {!isIconTrailing && icon}\n {children}\n {isIconTrailing && icon}\n {count != null && count > 0 && (\n <Badge variant=\"outline\" className=\"badge-count ml-1\">\n {count}\n </Badge>\n )}\n </Button>\n )\n }\n)\n\nexport interface ContextTab {\n value: string\n /** Visible tab name, e.g. \"Documents\". */\n label: string\n /** Count shown in the tab label. */\n count: number\n testId?: string\n content: ReactNode\n}\n\nexport interface ContextPanelTabsProps {\n tabs: ContextTab[]\n value: string\n onValueChange: (value: string) => void\n testId?: string\n /** Extra classes for the tab strip (e.g. leave room for a sheet's close button). */\n listClassName?: string\n}\n\n/** The panel's tab strip (Radix tabs: roving tabindex, arrow keys) and the active tab's content. */\nexport function ContextPanelTabs({\n tabs,\n value,\n onValueChange,\n testId,\n listClassName,\n}: ContextPanelTabsProps) {\n return (\n <Tabs value={value} onValueChange={onValueChange} data-testid={testId}>\n <TabsList\n className={cn('grid h-auto w-full grid-cols-2 pointer-coarse:h-auto', listClassName)}\n >\n {tabs.map((t) => (\n <TabsTrigger key={t.value} value={t.value} data-testid={t.testId} className=\"gap-1.5\">\n {t.label}\n <Badge variant=\"outline\" className=\"badge-count\">\n {t.count}\n </Badge>\n </TabsTrigger>\n ))}\n </TabsList>\n {tabs.map((t) => (\n <TabsContent key={t.value} value={t.value} className=\"mt-3\">\n {t.content}\n </TabsContent>\n ))}\n </Tabs>\n )\n}\n","import { forwardRef, useState, type FocusEvent, type MouseEvent, type ReactNode } from 'react'\nimport { FileText, Pencil } from 'lucide-react'\nimport { Button, cn, type ButtonProps } from '@arbidocs/react/ui'\n\nexport interface ContextChipProps extends Omit<ButtonProps, 'children'> {\n /** How many documents are attached to this chat. */\n count: number\n /** Accessible name, e.g. \"3 documents in this chat\". */\n label: string\n /** True while the panel the chip opens is showing: the chip stays in its \"edit\" state. */\n isOpen?: boolean\n /** Extra content after the count (e.g. the pinned-document chip). */\n children?: ReactNode\n}\n\n/** True when the primary pointer can hover; touch screens emulate mouseenter on a tap. */\nfunction canHover(): boolean {\n return typeof window !== 'undefined' && !!window.matchMedia?.('(hover: hover)').matches\n}\n\n/** `:focus-visible` is keyboard focus; where unsupported, treat any focus as visible. */\nfunction isFocusVisible(el: HTMLElement): boolean {\n try {\n return el.matches(':focus-visible')\n } catch {\n return true\n }\n}\n\n/**\n * The composer's single compact context chip: a document icon and the number of documents in the\n * chat, nothing else. On hover (mouse) or keyboard focus, and while its panel is open, the icon\n * swaps to a pencil to say \"change what is attached\". Touch devices never hover, so they keep the\n * document icon and a tap opens the panel. Forwards its ref and props so it can be a Radix trigger.\n */\nexport const ContextChip = forwardRef<HTMLButtonElement, ContextChipProps>(function ContextChip(\n {\n count,\n label,\n isOpen = false,\n children,\n className,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n ...props\n },\n ref\n) {\n const [isHovered, setIsHovered] = useState(false)\n const [isFocused, setIsFocused] = useState(false)\n const isEditing = isHovered || isFocused || isOpen\n const Icon = isEditing ? Pencil : FileText\n\n return (\n <Button\n ref={ref}\n type=\"button\"\n variant=\"outline\"\n aria-label={label}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n data-slot=\"context-chip\"\n data-icon={isEditing ? 'edit' : 'document'}\n className={cn(\n 'flex h-8 min-w-0 max-w-[280px] flex-shrink-0 items-center gap-1.5 rounded-md px-2.5',\n className\n )}\n {...props}\n onMouseEnter={(e: MouseEvent<HTMLButtonElement>) => {\n onMouseEnter?.(e)\n if (canHover()) setIsHovered(true)\n }}\n onMouseLeave={(e: MouseEvent<HTMLButtonElement>) => {\n onMouseLeave?.(e)\n setIsHovered(false)\n }}\n onFocus={(e: FocusEvent<HTMLButtonElement>) => {\n onFocus?.(e)\n setIsFocused(isFocusVisible(e.currentTarget))\n }}\n onBlur={(e: FocusEvent<HTMLButtonElement>) => {\n onBlur?.(e)\n setIsFocused(false)\n }}\n >\n <Icon className=\"h-3.5 w-3.5 flex-shrink-0\" aria-hidden=\"true\" />\n <span className=\"flex-shrink-0 text-sm font-medium\" data-testid=\"context-chip-count\">\n {count >= 1000 ? '999+' : count}\n </span>\n {children}\n </Button>\n )\n})\n","import { useEffect, type RefObject } from 'react'\n\nexport interface UseDismissibleCardOptions {\n isOpen: boolean\n onClose: () => void\n /** The card's content: clicks inside never dismiss. */\n contentRef: RefObject<HTMLElement | null>\n /** Focused when the card opens (the panel is opened to find something: typing just works). */\n focusRef?: RefObject<HTMLElement | null>\n}\n\n/**\n * Behaviour of a click-opened card: focus its search box on open, Escape closes it, and a press\n * outside it (or outside any portaled popper that belongs to it, e.g. a dropdown menu opened from\n * inside) closes it too. Bound only while open.\n */\nexport function useDismissibleCard({\n isOpen,\n onClose,\n contentRef,\n focusRef,\n}: UseDismissibleCardOptions): void {\n // rAF lets the portaled content mount before focusing.\n useEffect(() => {\n if (!isOpen) return\n const id = requestAnimationFrame(() => focusRef?.current?.focus())\n return () => cancelAnimationFrame(id)\n }, [isOpen, focusRef])\n\n useEffect(() => {\n if (!isOpen) return\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return\n e.stopPropagation()\n onClose()\n }\n document.addEventListener('keydown', onKeyDown)\n return () => document.removeEventListener('keydown', onKeyDown)\n }, [isOpen, onClose])\n\n useEffect(() => {\n if (!isOpen) return\n const onPointerDown = (e: MouseEvent) => {\n const target = e.target as HTMLElement | null\n if (!target) return\n if (contentRef.current?.contains(target)) return\n if (target.closest('[data-radix-popper-content-wrapper]')) return\n onClose()\n }\n document.addEventListener('mousedown', onPointerDown)\n return () => document.removeEventListener('mousedown', onPointerDown)\n }, [isOpen, onClose, contentRef])\n}\n","import { Tag as TagIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface PinnableLabel {\n id: string\n name: string\n /** The label's own colour (any CSS colour): the same hue everywhere the label appears. */\n color: string\n /** Ids of the items carrying this label. */\n itemIds: string[]\n}\n\nexport interface LabelPinRowLabels {\n remove: (count: number, name: string) => string\n add: (count: number, name: string) => string\n}\n\nexport const DEFAULT_LABEL_PIN_ROW_LABELS: LabelPinRowLabels = {\n remove: (count, name) => `Remove the ${count} “${name}” item(s) from this chat`,\n add: (count, name) => `Add the ${count} “${name}” item(s) to this chat`,\n}\n\nexport interface LabelPinRowProps {\n labels: PinnableLabel[]\n /** Ids currently in the conversation. */\n selectedIds: string[]\n /** Add every id (already de-duplicated against the chat). */\n onAdd: (ids: string[]) => void\n /** Remove every id. */\n onRemove: (ids: string[]) => void\n testId?: string\n copy?: Partial<LabelPinRowLabels>\n}\n\n/**\n * Label shortcuts inside the in-chat panels: one chip per label in use; clicking it pins\n * everything carrying that label. A chip whose items are ALL in the chat reads as active and\n * clicking it takes them back out, so a label is a toggle rather than a one-way add.\n */\nexport function LabelPinRow({\n labels,\n selectedIds,\n onAdd,\n onRemove,\n testId = 'label-pin-row',\n copy,\n}: LabelPinRowProps) {\n const l = { ...DEFAULT_LABEL_PIN_ROW_LABELS, ...copy }\n const usable = labels.filter((label) => label.itemIds.length > 0)\n if (usable.length === 0) return null\n\n const selectedSet = new Set(selectedIds)\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1\"\n data-slot=\"label-pin-row\"\n data-testid={testId}\n >\n <TagIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n {usable.map((label) => {\n const allIn = label.itemIds.every((id) => selectedSet.has(id))\n return (\n <button\n key={label.id}\n type=\"button\"\n aria-pressed={allIn}\n title={\n allIn\n ? l.remove(label.itemIds.length, label.name)\n : l.add(label.itemIds.length, label.name)\n }\n onClick={() =>\n allIn\n ? onRemove(label.itemIds)\n : onAdd(label.itemIds.filter((id) => !selectedSet.has(id)))\n }\n className={cn(\n 'flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n allIn ? 'text-white' : 'bg-muted text-foreground hover:brightness-95'\n )}\n // Pinned reads as the label filled in with its own colour; at rest it's the muted\n // pill with the colour on the dot, matching the label pills on documents and facts.\n style={\n allIn\n ? { backgroundColor: label.color, borderColor: label.color }\n : { borderColor: `${label.color}66` }\n }\n data-testid={`${testId}-${label.id}`}\n >\n {!allIn && (\n <span\n className=\"size-1.5 shrink-0 rounded-full\"\n style={{ backgroundColor: label.color }}\n aria-hidden\n />\n )}\n <span className=\"max-w-[120px] truncate\">{label.name}</span>\n <span className=\"tabular-nums opacity-70\">{label.itemIds.length}</span>\n </button>\n )\n })}\n </div>\n )\n}\n"]}
|