@arbidocs/blocks 0.4.147 → 0.4.151
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ConnectedNativeDocxComparison-OFPIXNJB.js +35 -0
- package/dist/ConnectedNativeDocxComparison-OFPIXNJB.js.map +1 -0
- package/dist/ConnectedNativeDocxComparison-Y5BNLNH6.cjs +44 -0
- package/dist/ConnectedNativeDocxComparison-Y5BNLNH6.cjs.map +1 -0
- package/dist/ConnectedNativeDocxEditor-HTEW5JAH.cjs +46 -0
- package/dist/ConnectedNativeDocxEditor-HTEW5JAH.cjs.map +1 -0
- package/dist/ConnectedNativeDocxEditor-LRYU5HPA.js +33 -0
- package/dist/ConnectedNativeDocxEditor-LRYU5HPA.js.map +1 -0
- package/dist/ConnectedStreamedWordArtifact-QAUVUCSX.js +35 -0
- package/dist/ConnectedStreamedWordArtifact-QAUVUCSX.js.map +1 -0
- package/dist/ConnectedStreamedWordArtifact-QW74LKHN.cjs +44 -0
- package/dist/ConnectedStreamedWordArtifact-QW74LKHN.cjs.map +1 -0
- package/dist/FactTextEditor-YESAU2IJ.js +25 -0
- package/dist/FactTextEditor-YESAU2IJ.js.map +1 -0
- package/dist/FactTextEditor-YUPBCTXK.cjs +27 -0
- package/dist/FactTextEditor-YUPBCTXK.cjs.map +1 -0
- package/dist/{NativeDocxEditor-BE2OEOTJ.cjs → NativeDocxEditor-5VBNM5I7.cjs} +8 -8
- package/dist/{NativeDocxEditor-BE2OEOTJ.cjs.map → NativeDocxEditor-5VBNM5I7.cjs.map} +1 -1
- package/dist/{NativeDocxEditor-KOPFMRYW.js → NativeDocxEditor-XT5ZLFGU.js} +4 -4
- package/dist/{NativeDocxEditor-KOPFMRYW.js.map → NativeDocxEditor-XT5ZLFGU.js.map} +1 -1
- package/dist/agents/index.cjs +263 -264
- package/dist/agents/index.js +6 -7
- package/dist/calendar/index.cjs +117 -125
- package/dist/calendar/index.d.ts +0 -1
- package/dist/calendar/index.js +1 -1
- package/dist/chat/index.cjs +78 -78
- package/dist/chat/index.js +3 -3
- package/dist/{chunk-2FL7QJKJ.js → chunk-265GOG4W.js} +3 -3
- package/dist/{chunk-2FL7QJKJ.js.map → chunk-265GOG4W.js.map} +1 -1
- package/dist/{chunk-LTU35TQN.cjs → chunk-2FLWPM3B.cjs} +636 -31
- package/dist/chunk-2FLWPM3B.cjs.map +1 -0
- package/dist/{chunk-SUUPR735.js → chunk-3PCBYOIZ.js} +4 -4
- package/dist/{chunk-SUUPR735.js.map → chunk-3PCBYOIZ.js.map} +1 -1
- package/dist/{chunk-WIZ7Z7FN.js → chunk-4236BRZK.js} +46 -221
- package/dist/chunk-4236BRZK.js.map +1 -0
- package/dist/{chunk-IL3WB3YX.cjs → chunk-4JNKXOFZ.cjs} +3 -3
- package/dist/{chunk-IL3WB3YX.cjs.map → chunk-4JNKXOFZ.cjs.map} +1 -1
- package/dist/{chunk-ODRHHWHY.cjs → chunk-4KMLM3GY.cjs} +4 -4
- package/dist/chunk-4KMLM3GY.cjs.map +1 -0
- package/dist/chunk-6I6CVX5G.cjs +22 -0
- package/dist/chunk-6I6CVX5G.cjs.map +1 -0
- package/dist/{chunk-MHFF5N65.cjs → chunk-757OYF6G.cjs} +4 -38
- package/dist/chunk-757OYF6G.cjs.map +1 -0
- package/dist/chunk-B3FMUFAW.cjs +1956 -0
- package/dist/chunk-B3FMUFAW.cjs.map +1 -0
- package/dist/{chunk-B3AHCIV5.js → chunk-BJ24VPOA.js} +4 -55
- package/dist/chunk-BJ24VPOA.js.map +1 -0
- package/dist/chunk-C7PTF6BQ.cjs +172 -0
- package/dist/chunk-C7PTF6BQ.cjs.map +1 -0
- package/dist/{chunk-LZRMXJIE.js → chunk-COA3S3CZ.js} +3 -3
- package/dist/{chunk-LZRMXJIE.js.map → chunk-COA3S3CZ.js.map} +1 -1
- package/dist/{chunk-VUR63NMQ.js → chunk-CROTH2BS.js} +6 -6
- package/dist/{chunk-VUR63NMQ.js.map → chunk-CROTH2BS.js.map} +1 -1
- package/dist/{chunk-AO7SK6WP.cjs → chunk-CU2O32Z4.cjs} +31 -31
- package/dist/{chunk-AO7SK6WP.cjs.map → chunk-CU2O32Z4.cjs.map} +1 -1
- package/dist/chunk-D3WFIFRY.cjs +659 -0
- package/dist/chunk-D3WFIFRY.cjs.map +1 -0
- package/dist/{chunk-DAHCRVPM.js → chunk-DB2OXRQC.js} +84 -82
- package/dist/chunk-DB2OXRQC.js.map +1 -0
- package/dist/{chunk-QXMR5YHC.js → chunk-DIB4JYUY.js} +19 -3
- package/dist/chunk-DIB4JYUY.js.map +1 -0
- package/dist/chunk-DVB5ZKOF.js +22 -0
- package/dist/chunk-DVB5ZKOF.js.map +1 -0
- package/dist/chunk-EYJMMGXF.js +19 -0
- package/dist/chunk-EYJMMGXF.js.map +1 -0
- package/dist/chunk-FAXXN7KI.cjs +213 -0
- package/dist/chunk-FAXXN7KI.cjs.map +1 -0
- package/dist/{chunk-2MJWWPHY.js → chunk-G4IYES7G.js} +140 -15
- package/dist/chunk-G4IYES7G.js.map +1 -0
- package/dist/{chunk-T5I4NRFP.cjs → chunk-GFOEWPAP.cjs} +8 -8
- package/dist/{chunk-T5I4NRFP.cjs.map → chunk-GFOEWPAP.cjs.map} +1 -1
- package/dist/{chunk-QI6AIHWP.cjs → chunk-GOWXP5KT.cjs} +145 -14
- package/dist/chunk-GOWXP5KT.cjs.map +1 -0
- package/dist/chunk-HALD6ZB5.cjs +18 -0
- package/dist/chunk-HALD6ZB5.cjs.map +1 -0
- package/dist/chunk-HUJF2XM2.js +6584 -0
- package/dist/chunk-HUJF2XM2.js.map +1 -0
- package/dist/{chunk-NRFAWUVD.js → chunk-JAANWQGB.js} +157 -157
- package/dist/chunk-JAANWQGB.js.map +1 -0
- package/dist/{chunk-7RJTEWYM.js → chunk-JGOST4IL.js} +350 -64
- package/dist/chunk-JGOST4IL.js.map +1 -0
- package/dist/chunk-KHXEIEXN.js +41 -0
- package/dist/chunk-KHXEIEXN.js.map +1 -0
- package/dist/chunk-KQYPP72K.js +644 -0
- package/dist/chunk-KQYPP72K.js.map +1 -0
- package/dist/chunk-KUT2Y7JF.cjs +43 -0
- package/dist/chunk-KUT2Y7JF.cjs.map +1 -0
- package/dist/{chunk-6YTHQ73P.cjs → chunk-LLYZGH3L.cjs} +3 -56
- package/dist/chunk-LLYZGH3L.cjs.map +1 -0
- package/dist/{chunk-YSHIC4NJ.cjs → chunk-LXTOOUEN.cjs} +159 -154
- package/dist/chunk-LXTOOUEN.cjs.map +1 -0
- package/dist/{chunk-EVUEIBNU.js → chunk-M4S75AEJ.js} +44 -5
- package/dist/chunk-M4S75AEJ.js.map +1 -0
- package/dist/{chunk-V5OAXIBN.cjs → chunk-NPR5BGFF.cjs} +11 -11
- package/dist/{chunk-V5OAXIBN.cjs.map → chunk-NPR5BGFF.cjs.map} +1 -1
- package/dist/{chunk-PLJ7PHWU.cjs → chunk-NS7NVX4E.cjs} +3 -3
- package/dist/{chunk-PLJ7PHWU.cjs.map → chunk-NS7NVX4E.cjs.map} +1 -1
- package/dist/{chunk-AINU3EJ6.cjs → chunk-Q4BY2CQQ.cjs} +92 -90
- package/dist/chunk-Q4BY2CQQ.cjs.map +1 -0
- package/dist/chunk-QN47Q4N7.js +16 -0
- package/dist/chunk-QN47Q4N7.js.map +1 -0
- package/dist/{chunk-I2QSDQQV.cjs → chunk-QT3A4PFC.cjs} +21 -2
- package/dist/chunk-QT3A4PFC.cjs.map +1 -0
- package/dist/{chunk-ZM26YEOT.js → chunk-RY2SODRN.js} +3 -3
- package/dist/{chunk-ZM26YEOT.js.map → chunk-RY2SODRN.js.map} +1 -1
- package/dist/chunk-SDOEHEJP.js +208 -0
- package/dist/chunk-SDOEHEJP.js.map +1 -0
- package/dist/{chunk-DETZZBG2.cjs → chunk-SIB6C7P7.cjs} +43 -2
- package/dist/chunk-SIB6C7P7.cjs.map +1 -0
- package/dist/{chunk-MFY2ZNP6.cjs → chunk-SMN32BQ3.cjs} +4 -4
- package/dist/chunk-SMN32BQ3.cjs.map +1 -0
- package/dist/chunk-T74Q3MCZ.cjs +6751 -0
- package/dist/chunk-T74Q3MCZ.cjs.map +1 -0
- package/dist/{chunk-AOSUHWIL.js → chunk-TZOQKV64.js} +4 -37
- package/dist/chunk-TZOQKV64.js.map +1 -0
- package/dist/{chunk-U37AYUPI.cjs → chunk-U6JQ4KMX.cjs} +46 -233
- package/dist/chunk-U6JQ4KMX.cjs.map +1 -0
- package/dist/chunk-WFA2GVZJ.js +16 -0
- package/dist/chunk-WFA2GVZJ.js.map +1 -0
- package/dist/chunk-WU34CHU5.js +1907 -0
- package/dist/chunk-WU34CHU5.js.map +1 -0
- package/dist/{chunk-O4YPVYPO.cjs → chunk-YAEXSCUW.cjs} +364 -60
- package/dist/chunk-YAEXSCUW.cjs.map +1 -0
- package/dist/{chunk-H74HEPKT.js → chunk-YXNNNP57.js} +598 -13
- package/dist/chunk-YXNNNP57.js.map +1 -0
- package/dist/chunk-Z27QMJ6S.cjs +25 -0
- package/dist/chunk-Z27QMJ6S.cjs.map +1 -0
- package/dist/{chunk-CSI2B2H5.js → chunk-Z4NQ3TED.js} +4 -4
- package/dist/chunk-Z4NQ3TED.js.map +1 -0
- package/dist/{chunk-DGV7HQA7.js → chunk-ZLEYLCE4.js} +4 -4
- package/dist/chunk-ZLEYLCE4.js.map +1 -0
- package/dist/chunk-ZNLTEZEF.js +170 -0
- package/dist/chunk-ZNLTEZEF.js.map +1 -0
- package/dist/chunk-ZP6Q3KXU.cjs +18 -0
- package/dist/chunk-ZP6Q3KXU.cjs.map +1 -0
- package/dist/citations/index.cjs +14 -14
- package/dist/citations/index.js +2 -2
- package/dist/collaboration/index.cjs +35 -35
- package/dist/collaboration/index.js +1 -1
- package/dist/connect/docx.cjs +21 -26
- package/dist/connect/docx.cjs.map +1 -1
- package/dist/connect/docx.js +10 -26
- package/dist/connect/docx.js.map +1 -1
- package/dist/connect/index.cjs +8662 -2824
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +10 -2
- package/dist/connect/index.js +8467 -2670
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +2357 -0
- package/dist/connect/viewer.cjs.map +1 -0
- package/dist/connect/viewer.d.ts +8 -0
- package/dist/connect/viewer.js +2350 -0
- package/dist/connect/viewer.js.map +1 -0
- package/dist/connection/ConnectedWorkflowsTable.d.ts +2 -12
- package/dist/connection/ai.d.ts +2 -9
- package/dist/connection/billing/AddAddonDialog.d.ts +24 -0
- package/dist/connection/billing/BillingCard.d.ts +18 -0
- package/dist/connection/billing/BillingProjectEntity.d.ts +9 -0
- package/dist/connection/billing/ChangePlanDialog.d.ts +20 -0
- package/dist/connection/billing/ChangeProPlan.d.ts +20 -0
- package/dist/connection/billing/CheckoutTotal.d.ts +12 -0
- package/dist/connection/billing/DailyCapEditor.d.ts +4 -0
- package/dist/connection/billing/InvoicesModal.d.ts +6 -0
- package/dist/connection/billing/NewProjectFlow.d.ts +14 -0
- package/dist/connection/billing/PlanChangeLines.d.ts +13 -0
- package/dist/connection/billing/PlanSelector.d.ts +50 -0
- package/dist/connection/billing/ProjectBilling.d.ts +24 -0
- package/dist/connection/billing/ProjectDetail.d.ts +16 -0
- package/dist/connection/billing/ProjectUsageCard.d.ts +21 -0
- package/dist/connection/billing/ProjectUsageContent.d.ts +18 -0
- package/dist/connection/billing/ProjectsTable.d.ts +13 -0
- package/dist/connection/billing/ReduceAddonDialog.d.ts +18 -0
- package/dist/connection/billing/ReferralReward.d.ts +32 -0
- package/dist/connection/billing/SharedProjects.d.ts +13 -0
- package/dist/connection/billing/StripeCheckoutModal.d.ts +32 -0
- package/dist/connection/billing/SubscriptionPlans.d.ts +15 -0
- package/dist/connection/billing/SubscriptionStatus.d.ts +10 -0
- package/dist/connection/billing/addon-pricing.d.ts +97 -0
- package/dist/connection/billing/api-error.d.ts +6 -0
- package/dist/connection/billing/billing-country.d.ts +14 -0
- package/dist/connection/billing/billing-focus.d.ts +11 -0
- package/dist/connection/billing/index.d.ts +22 -0
- package/dist/connection/billing/plan-badge.d.ts +15 -0
- package/dist/connection/billing/plan-change-outcome.d.ts +15 -0
- package/dist/connection/billing/plan-constants.d.ts +29 -0
- package/dist/connection/billing/plan-pricing.d.ts +67 -0
- package/dist/connection/billing/quota-items.d.ts +33 -0
- package/dist/connection/billing/referral-reward.d.ts +28 -0
- package/dist/connection/billing/refusal-copy.d.ts +5 -0
- package/dist/connection/billing/reward-balance.d.ts +19 -0
- package/dist/connection/billing/support.d.ts +35 -0
- package/dist/connection/billing/tax-quote.d.ts +36 -0
- package/dist/connection/billing/useAddonPurchase.d.ts +32 -0
- package/dist/connection/billing/useAutoRefreshPendingProjects.d.ts +11 -0
- package/dist/connection/billing/useCheckoutQuote.d.ts +30 -0
- package/dist/connection/billing/useOpenBillingPortal.d.ts +12 -0
- package/dist/connection/calendar/CalendarSettingsDialog.d.ts +1 -1
- package/dist/connection/facts/ConnectedFactsPage.d.ts +50 -0
- package/dist/connection/facts/FactMarkdownEditor.d.ts +57 -0
- package/dist/connection/facts/FactSourcesPopover.d.ts +38 -0
- package/dist/connection/facts/FactTextEditor.d.ts +2 -0
- package/dist/connection/facts/factNouns.d.ts +4 -0
- package/dist/connection/facts/factPageColumns.d.ts +37 -0
- package/dist/connection/facts/types.d.ts +127 -0
- package/dist/connection/facts/useFactActions.d.ts +10 -0
- package/dist/connection/facts/useFactComposer.d.ts +54 -0
- package/dist/connection/facts/useFactFilters.d.ts +101 -0
- package/dist/connection/facts/useFactSelection.d.ts +82 -0
- package/dist/connection/facts/useFactsGrid.d.ts +87 -0
- package/dist/connection/facts/useFactsPageView.d.ts +4 -0
- package/dist/connection/mail/ConnectedMailComposer.d.ts +3 -1
- package/dist/connection/mail/ConnectedMailbox.d.ts +4 -2
- package/dist/connection/mail/MailComposerForm.d.ts +4 -2
- package/dist/connection/mail/MailRecipientInput.d.ts +14 -0
- package/dist/connection/mail/index.d.ts +1 -1
- package/dist/connection/mail/types.d.ts +10 -0
- package/dist/connection/search/ConnectedSearchPage.d.ts +64 -0
- package/dist/connection/search/SearchResultRows.d.ts +38 -0
- package/dist/connection/search/index.d.ts +2 -0
- package/dist/connection/tags/ConnectedTagTable.d.ts +108 -0
- package/dist/connection/tags/ConnectedTagsPage.d.ts +55 -0
- package/dist/connection/tags/DocTagPassages.d.ts +25 -0
- package/dist/connection/tags/GlossaryExport.d.ts +7 -0
- package/dist/connection/tags/TagCombineFilter.d.ts +14 -0
- package/dist/connection/tags/TagPlacement.d.ts +16 -0
- package/dist/connection/tags/TagsPageSections.d.ts +36 -0
- package/dist/connection/tags/tagCombine.d.ts +55 -0
- package/dist/connection/useConnectedWorkNotifications.d.ts +7 -24
- package/dist/connection/viewer/ConnectedDocumentToolsProvider.d.ts +11 -0
- package/dist/connection/viewer/ConnectedDocumentViewer.d.ts +21 -0
- package/dist/connection/viewer/FinaliseTranslationButton.d.ts +15 -0
- package/dist/connection/viewer/ViewerPdfPane.d.ts +46 -0
- package/dist/connection/viewer/parsed/ParsedPassage.d.ts +48 -0
- package/dist/connection/viewer/parsed/ParsedTextView.d.ts +17 -0
- package/dist/connection/viewer/parsed/PassageTagPanel.d.ts +18 -0
- package/dist/connection/viewer/parsed/citation-line.d.ts +17 -0
- package/dist/connection/viewer/parsed/document-tags.d.ts +8 -0
- package/dist/connection/viewer/parsed/useChunkTagging.d.ts +46 -0
- package/dist/connection/viewer/parsed/useCitationSelection.d.ts +27 -0
- package/dist/connection/viewer/parsed/useDocumentLabels.d.ts +38 -0
- package/dist/connection/viewer/parsed/useLazyPages.d.ts +18 -0
- package/dist/connection/viewer/parsed/usePageScrollSync.d.ts +17 -0
- package/dist/connection/viewer/parsed/usePassageCopy.d.ts +25 -0
- package/dist/connection/viewer/support.d.ts +97 -0
- package/dist/connection/viewer/useImageCrop.d.ts +13 -0
- package/dist/connection/viewer/useViewedDocument.d.ts +70 -0
- package/dist/connection/viewer/useViewerBlobs.d.ts +15 -0
- package/dist/connection/viewer/useViewerTabs.d.ts +18 -0
- package/dist/connection/viewer/useViewerVersions.d.ts +11 -0
- package/dist/connection/workspace-settings/useConnectedWorkspaceSettings.d.ts +6 -0
- package/dist/document-tools/index.cjs +59 -652
- package/dist/document-tools/index.cjs.map +1 -1
- package/dist/document-tools/index.js +2 -641
- package/dist/document-tools/index.js.map +1 -1
- package/dist/docx/index.cjs +48 -47
- package/dist/docx/index.js +4 -3
- package/dist/facts/FactsBulkBar.d.ts +6 -3
- package/dist/facts/cited-version-ref.d.ts +1 -0
- package/dist/facts/index.cjs +204 -1940
- package/dist/facts/index.cjs.map +1 -1
- package/dist/facts/index.d.ts +1 -0
- package/dist/facts/index.js +13 -1895
- package/dist/facts/index.js.map +1 -1
- package/dist/files/TagPassagePanel.d.ts +2 -1
- package/dist/files/ViewerChrome.d.ts +5 -4
- package/dist/files/ViewerControlBar.d.ts +12 -0
- package/dist/files/doc-labels.d.ts +35 -0
- package/dist/files/grid/FilterButton.d.ts +12 -0
- package/dist/files/grid/RowDensityControl.d.ts +18 -0
- package/dist/files/grid/row-density.d.ts +27 -0
- package/dist/files/index.cjs +778 -7099
- package/dist/files/index.cjs.map +1 -1
- package/dist/files/index.d.ts +5 -0
- package/dist/files/index.js +13 -6918
- package/dist/files/index.js.map +1 -1
- package/dist/index.cjs +993 -1209
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +22 -355
- package/dist/index.js.map +1 -1
- package/dist/retrieval/SearchSnippet.d.ts +6 -0
- package/dist/retrieval/index.cjs +74 -41
- package/dist/retrieval/index.d.ts +2 -0
- package/dist/retrieval/index.js +2 -1
- package/dist/retrieval/search-results.d.ts +46 -0
- package/dist/settings/Billing.d.ts +0 -66
- package/dist/settings/SubscriptionParts.d.ts +1 -50
- package/dist/settings/index.cjs +166 -214
- package/dist/settings/index.d.ts +3 -2
- package/dist/settings/index.js +1 -1
- package/dist/settings/inverted-index-filter.d.ts +26 -0
- package/dist/studio/index.cjs +3 -3
- package/dist/studio/index.js +2 -2
- package/dist/tags/definitions.d.ts +10 -0
- package/dist/tags/index.d.ts +4 -1
- package/dist/tags/page/ExtractEntitiesDialog.d.ts +24 -0
- package/dist/tags/page/TagPicker.d.ts +16 -0
- package/dist/tags/page/tagsPageLabels.d.ts +36 -0
- package/dist/workflow-canvas/index.cjs +19 -20
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/dist/workflow-canvas/index.js +6 -7
- package/dist/workflow-canvas/index.js.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +13 -4
- package/dist/calendar/access-setup.d.ts +0 -8
- package/dist/chunk-2MJWWPHY.js.map +0 -1
- package/dist/chunk-3AFWGEDJ.cjs +0 -53
- package/dist/chunk-3AFWGEDJ.cjs.map +0 -1
- package/dist/chunk-6YTHQ73P.cjs.map +0 -1
- package/dist/chunk-7RJTEWYM.js.map +0 -1
- package/dist/chunk-AINU3EJ6.cjs.map +0 -1
- package/dist/chunk-AOSUHWIL.js.map +0 -1
- package/dist/chunk-B3AHCIV5.js.map +0 -1
- package/dist/chunk-CSI2B2H5.js.map +0 -1
- package/dist/chunk-DAHCRVPM.js.map +0 -1
- package/dist/chunk-DETZZBG2.cjs.map +0 -1
- package/dist/chunk-DGV7HQA7.js.map +0 -1
- package/dist/chunk-EVUEIBNU.js.map +0 -1
- package/dist/chunk-H74HEPKT.js.map +0 -1
- package/dist/chunk-I2QSDQQV.cjs.map +0 -1
- package/dist/chunk-J5CWKFSC.js +0 -170
- package/dist/chunk-J5CWKFSC.js.map +0 -1
- package/dist/chunk-LTU35TQN.cjs.map +0 -1
- package/dist/chunk-MFY2ZNP6.cjs.map +0 -1
- package/dist/chunk-MHFF5N65.cjs.map +0 -1
- package/dist/chunk-NRFAWUVD.js.map +0 -1
- package/dist/chunk-O4YPVYPO.cjs.map +0 -1
- package/dist/chunk-ODRHHWHY.cjs.map +0 -1
- package/dist/chunk-QI6AIHWP.cjs.map +0 -1
- package/dist/chunk-QXMR5YHC.js.map +0 -1
- package/dist/chunk-RFXJYIDV.js +0 -50
- package/dist/chunk-RFXJYIDV.js.map +0 -1
- package/dist/chunk-U37AYUPI.cjs.map +0 -1
- package/dist/chunk-WIZ7Z7FN.js.map +0 -1
- package/dist/chunk-XVUOMWMD.cjs +0 -177
- package/dist/chunk-XVUOMWMD.cjs.map +0 -1
- package/dist/chunk-YSHIC4NJ.cjs.map +0 -1
- package/dist/connection/ConnectedTagTable.d.ts +0 -32
- package/dist/connection/calendar/CopyField.d.ts +0 -9
- package/dist/connection/calendar/OpenAccessPanel.d.ts +0 -7
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/citations/PassagePill.tsx","../src/citations/CitationEditor.tsx"],"names":["useState","useRef","useEffect","jsx","jsxs","cn"],"mappings":"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","file":"chunk-NRFAWUVD.js","sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { Check, Copy } from 'lucide-react'\nimport { Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\n/** Every fixed string of the passage pill. */\nexport interface PassagePillLabels {\n copyLink: string\n /** Announced and notified after the link was copied. */\n copied: string\n /** Notified when the clipboard refused the write. */\n copyFailed: string\n viewPassage: string\n page: string\n pages: string\n passage: string\n passages: string\n /** Visible abbreviation of \"page\" in the pill (\"p.3\"). */\n pageAbbreviation: string\n}\n\nexport const DEFAULT_PASSAGE_PILL_LABELS: PassagePillLabels = {\n copyLink: 'Copy passage link',\n copied: 'Passage link copied',\n copyFailed: 'Could not copy the passage link',\n viewPassage: 'View passage',\n page: 'Page',\n pages: 'Pages',\n passage: 'Passage',\n passages: 'Passages',\n pageAbbreviation: 'p.',\n}\n\n/** Overridable `data-testid`s of the pill (defaults keep the app's existing ids). */\nexport interface PassagePillTestIds {\n root: string\n copy: string\n}\n\nexport interface PassagePillProps {\n /** Glyph of the cited document (host-supplied: file-type icon). */\n icon: ReactNode\n documentTitle: string\n /** `pill`: title + page; `icon`: glyph only; `compact`: page/passage ref + copy link. */\n variant?: 'icon' | 'pill' | 'compact'\n pageNumber?: number\n passageIndex?: number\n /** End of a contiguous passage run: the label collapses to \"4–9\" instead of a pill each. */\n passageIndexEnd?: number\n /** End page of a range: \"p.3–5(4–9)\". */\n pageNumberEnd?: number\n /** Makes the element a link. */\n href?: string\n /** Makes the element a button (ignored for the element role when `href` is set). */\n onClick?: (e: MouseEvent) => void\n showTooltip?: boolean\n labelMaxWidth?: string\n size?: 'sm' | 'base'\n className?: string\n labels?: Partial<PassagePillLabels>\n testIds?: Partial<PassagePillTestIds>\n /** Root test id (default `passage-entity`); the copy button gets `<id>-copy`. */\n testId?: string\n}\n\nconst COPIED_RESET_MS = 2000\n\n/** Plain-language name of a passage reference: \"Title, Page 3, Passage 4\". */\nfunction describePassage(\n documentTitle: string,\n l: PassagePillLabels,\n page: { text?: string; isRange: boolean },\n passage: { text?: string; isRange: boolean }\n): string {\n return [\n documentTitle,\n page.text !== undefined ? `${page.isRange ? l.pages : l.page} ${page.text}` : null,\n passage.text !== undefined\n ? `${passage.isRange ? l.passages : l.passage} ${passage.text}`\n : null,\n ]\n .filter(Boolean)\n .join(', ')\n}\n\ninterface PillSurfaceProps {\n href?: string\n onClick?: (e: MouseEvent) => void\n className: string\n testId: string\n /** What assistive tech reads; the visible content is hidden from it. */\n accessibleName: string\n children: ReactNode\n tooltip?: ReactNode\n tooltipSide?: 'top' | 'bottom'\n}\n\n/**\n * The ONE interactive element of a pill: a link, a button or (when there is no action) plain text.\n * Never nests another interactive element, so it is valid inside any host container.\n */\nfunction PillSurface({\n href,\n onClick,\n className,\n testId,\n accessibleName,\n children,\n tooltip,\n tooltipSide = 'bottom',\n}: PillSurfaceProps) {\n const content = (\n <>\n <span aria-hidden=\"true\" className=\"inline-flex min-w-0 items-center gap-1\">\n {children}\n </span>\n <span className=\"sr-only\">{accessibleName}</span>\n </>\n )\n const interactive = cn(\n 'relative cursor-pointer hover:bg-muted/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n \"pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:-inset-y-3 pointer-coarse:after:content-['']\"\n )\n\n let surface: ReactNode\n if (href) {\n surface = (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(className, interactive)}\n onClick={onClick}\n data-testid={testId}\n >\n {content}\n </a>\n )\n } else if (onClick) {\n surface = (\n <button\n type=\"button\"\n className={cn(className, interactive)}\n onClick={onClick}\n data-testid={testId}\n >\n {content}\n </button>\n )\n } else {\n surface = (\n <span className={className} data-testid={testId}>\n {content}\n </span>\n )\n }\n\n if (!tooltip) return surface\n return (\n <Tooltip>\n <TooltipTrigger asChild>{surface as ReactElement}</TooltipTrigger>\n <TooltipContent side={tooltipSide}>{tooltip}</TooltipContent>\n </Tooltip>\n )\n}\n\nfunction CopyLinkButton({\n href,\n labels,\n testId,\n}: {\n href: string\n labels: PassagePillLabels\n testId: string\n}) {\n const { notify } = useBlocksEnvironment()\n const [copied, setCopied] = useState(false)\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(\n () => () => {\n if (timer.current) clearTimeout(timer.current)\n },\n []\n )\n\n const handleCopy = async (e: MouseEvent) => {\n e.stopPropagation()\n try {\n await navigator.clipboard.writeText(href)\n } catch {\n // Say so instead of pretending: the host's notify surfaces the failure.\n notify(labels.copyFailed, 'error')\n return\n }\n setCopied(true)\n notify(labels.copied, 'success')\n if (timer.current) clearTimeout(timer.current)\n timer.current = setTimeout(() => setCopied(false), COPIED_RESET_MS)\n }\n\n return (\n <>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"relative inline-flex items-center text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-fine:min-h-6 pointer-fine:min-w-6 pointer-fine:justify-center pointer-coarse:min-h-11 pointer-coarse:min-w-11 pointer-coarse:justify-center\"\n title={labels.copyLink}\n aria-label={labels.copyLink}\n data-testid={testId}\n >\n {copied ? (\n <Check className=\"size-3\" aria-hidden=\"true\" />\n ) : (\n <Copy className=\"size-3\" aria-hidden=\"true\" />\n )}\n </button>\n <span role=\"status\" className=\"sr-only\">\n {copied ? labels.copied : ''}\n </span>\n </>\n )\n}\n\n/** A citation to a passage of a document, as a pill, a bare icon or a compact page reference. */\nexport function PassagePill({\n icon,\n documentTitle,\n variant = 'pill',\n pageNumber,\n passageIndex,\n passageIndexEnd,\n pageNumberEnd,\n href,\n className,\n onClick,\n showTooltip = true,\n labelMaxWidth,\n size = 'sm',\n labels,\n testIds,\n testId = 'passage-entity',\n}: PassagePillProps) {\n const l = { ...DEFAULT_PASSAGE_PILL_LABELS, ...labels }\n const ids: PassagePillTestIds = {\n root: testIds?.root ?? testId,\n copy: testIds?.copy ?? `${testIds?.root ?? testId}-copy`,\n }\n // Ranges collapse to \"4–9\"; a range of one renders as a plain \"4\".\n const isPassageRange = passageIndexEnd !== undefined && passageIndexEnd > (passageIndex ?? 0)\n const isPageRange = pageNumberEnd !== undefined && pageNumberEnd > (pageNumber ?? 0)\n const passageText = isPassageRange ? `${passageIndex}–${passageIndexEnd}` : `${passageIndex}`\n const pageText = isPageRange ? `${pageNumber}–${pageNumberEnd}` : `${pageNumber}`\n const accessibleName = describePassage(\n documentTitle,\n l,\n { text: pageNumber !== undefined ? pageText : undefined, isRange: isPageRange },\n { text: passageIndex !== undefined ? passageText : undefined, isRange: isPassageRange }\n )\n const hasAction = Boolean(href || onClick)\n\n if (variant === 'icon') {\n return (\n <PillSurface\n href={href}\n onClick={onClick}\n className={cn('inline-flex items-center rounded-sm', className)}\n testId={ids.root}\n accessibleName={accessibleName}\n tooltip={\n showTooltip ? (\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"font-medium\">{documentTitle}</span>\n {(pageNumber !== undefined || passageIndex !== undefined) && (\n <span className=\"text-xs text-muted-foreground\">\n {pageNumber !== undefined && `${isPageRange ? l.pages : l.page} ${pageText}`}\n {pageNumber !== undefined && passageIndex !== undefined && ', '}\n {passageIndex !== undefined &&\n `${isPassageRange ? l.passages : l.passage} ${passageText}`}\n </span>\n )}\n </div>\n ) : undefined\n }\n >\n {icon}\n </PillSurface>\n )\n }\n\n if (variant === 'compact') {\n const label =\n [\n pageNumber !== undefined ? `${l.pageAbbreviation}${pageText}` : null,\n passageIndex !== undefined ? `(${passageText})` : null,\n ]\n .filter(Boolean)\n .join('') || '—'\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-md border border-transparent bg-muted px-1 text-sm font-medium',\n className\n )}\n >\n <PillSurface\n href={href}\n onClick={onClick}\n className=\"inline-flex items-center gap-1 rounded-sm\"\n testId={ids.root}\n accessibleName={accessibleName}\n tooltip={showTooltip ? documentTitle : undefined}\n >\n {icon}\n <span className=\"leading-tight\">{label}</span>\n </PillSurface>\n {href && <CopyLinkButton href={href} labels={l} testId={ids.copy} />}\n </span>\n )\n }\n\n return (\n <PillSurface\n href={href}\n onClick={onClick}\n className={cn(\n 'group/pill inline-flex items-center rounded-md border border-border bg-muted transition-all',\n size === 'base' ? 'gap-1.5 px-1.5 py-0.5 text-base' : 'gap-1 px-1 text-sm',\n className\n )}\n testId={ids.root}\n accessibleName={accessibleName}\n tooltip={showTooltip && hasAction ? l.viewPassage : undefined}\n >\n {icon}\n <span\n className={cn(\n 'min-w-0 truncate font-medium leading-tight',\n labelMaxWidth ?? 'max-w-[320px]'\n )}\n >\n {documentTitle}\n </span>\n {pageNumber ? (\n <span className=\"flex-shrink-0 text-xs leading-none text-muted-foreground\">\n {l.pageAbbreviation}\n {pageText}\n </span>\n ) : null}\n </PillSurface>\n )\n}\n","/**\n * CitationEditor Component\n *\n * Note input plus the source passages backing it.\n * - Pick related documents; each opens so its passages can be chosen by reading\n * - Click a passage to add it, shift-click for a range; repeat across documents\n *\n * A note answers ONE question, so it has ONE set of sources. It used to carry a\n * map of citations, each with its own statement and character offsets, rendered\n * as inline highlighted spans with [n] badges — but the statements were copies\n * of the note text and the offsets spanned all of it, so the highlight was the\n * whole field. That machinery is gone; the note renders as plain text.\n *\n * ``activeCitationKey``/``onActiveCitationChange`` are kept because the viewer\n * and store thread them through to decide which field is receiving passages.\n * With a single citation the key is just a sentinel — see ONLY_CITATION_KEY.\n */\n\nimport { useCallback, useState, useRef, useEffect, useMemo } from 'react'\nimport { X } from 'lucide-react'\nimport { cn, DocumentEntity, Textarea, type DocumentLike } from '@arbidocs/react/ui'\nimport { formatPageRefs } from '../lib/format'\n\nimport type { components } from '@arbidocs/client'\n\ntype CitationSources = components['schemas']['CitationSources']\n\ntype Citations = CitationSources | null\n\nexport interface CitationEditorProps {\n value: string\n citations: Citations | null\n onChange: (note: string, citations: Citations | null) => void\n /** Currently active citation key (controlled from parent) */\n activeCitationKey?: string | null\n /**\n * Open a document in the viewer, armed to collect passages for this field —\n * and tag its first passage, so a chosen document is immediately a usable\n * citation. Passages are picked by reading, so citing means opening.\n *\n * The caller owns this because resolving \"first passage\" needs the parsed\n * document, and keeping that fetch out here is what lets this component stay\n * store- and API-free (and therefore hoistable to @arbidocs/blocks).\n */\n onCiteDocument?: (docExtId: string) => void\n /** Cited documents, already resolved by the caller — keyed by external id. */\n citedDocs?: Record<string, DocumentLike>\n /**\n * The app's document picker, injected as a slot. It is store-coupled, so it\n * is passed in rather than imported, and receives the chosen document id.\n */\n renderDocumentPicker?: (\n onSelect: (docExtId: string) => void,\n selectedIds: string[]\n ) => React.ReactNode\n placeholder?: string\n readOnly?: boolean\n className?: string\n /** Start in edit mode with the caret in the field (composer behaviour). */\n autoFocus?: boolean\n /** Applied to the text field itself, so callers can target it directly. */\n 'data-testid'?: string\n /** Persisted textarea height in pixels */\n defaultHeight?: number\n /** Called after user resizes the textarea */\n onHeightChange?: (height: number) => void\n}\n\nexport function CitationEditor({\n value,\n citations,\n onChange,\n activeCitationKey,\n onCiteDocument,\n citedDocs,\n renderDocumentPicker,\n autoFocus = false,\n 'data-testid': dataTestId,\n placeholder = 'Add a note...',\n readOnly = false,\n className,\n defaultHeight,\n onHeightChange,\n}: CitationEditorProps) {\n const [localValue, setLocalValue] = useState(value)\n const [isEditing, setIsEditing] = useState(autoFocus)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Sync from parent only when not editing\n useEffect(() => {\n if (!isEditing) {\n setLocalValue(value)\n }\n }, [value, isEditing])\n\n const sources = useMemo(() => citations ?? [], [citations])\n const hasCitations = sources.length > 0\n\n // A citation is doc-first: each entry is a document with the pages cited\n // from it (none = the whole document).\n const byDoc = useMemo(() => {\n const groups = new Map<string, { pages: number[]; count: number }>()\n for (const doc of sources) {\n const chunks = doc.chunks ?? []\n const pages: number[] = []\n for (const c of chunks) if (c.page != null && !pages.includes(c.page)) pages.push(c.page)\n groups.set(doc.doc_ext_id, { pages, count: chunks.length })\n }\n return groups\n }, [sources])\n\n const docIds = Array.from(byDoc.keys())\n\n const handleRemoveDocument = useCallback(\n (docExtId: string) => {\n const remaining = sources.filter((d) => d.doc_ext_id !== docExtId)\n onChange(localValue, remaining.length ? remaining : null)\n },\n [sources, localValue, onChange]\n )\n\n const handleToggleDocument = useCallback(\n (docExtId: string) => {\n if (!docExtId) return\n // Selecting one already in the list removes it (and its passages) — the\n // tick in the picker has to mean something you can undo from there.\n if (docIds.includes(docExtId)) {\n handleRemoveDocument(docExtId)\n return\n }\n onCiteDocument?.(docExtId)\n },\n [docIds, onCiteDocument, handleRemoveDocument]\n )\n\n // The note is plain text. Nothing to slice: with one citation per note there\n // are no per-statement spans to highlight.\n const renderedContent = useMemo(\n () => (localValue ? <span>{localValue}</span> : null),\n [localValue]\n )\n\n // Debounced text change. Editing the note no longer has to re-anchor\n // anything — the sources are attached to the note as a whole.\n const handleChange = useCallback(\n (newValue: string) => {\n setLocalValue(newValue)\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => onChange(newValue, citations ?? null), 400)\n },\n [citations, onChange]\n )\n\n /**\n * Publish any debounced edit immediately.\n *\n * Without this, typing and then clicking Save within the debounce window\n * silently drops the last keystrokes: the parent still holds the previous\n * value when it reads state to submit.\n */\n const flushPendingChange = useCallback(() => {\n if (!debounceRef.current) return\n clearTimeout(debounceRef.current)\n debounceRef.current = null\n onChange(localValue, citations ?? null)\n }, [localValue, citations, onChange])\n\n return (\n <div className={cn('space-y-1', className)}>\n {/* Text area with highlighted citations preview when not editing */}\n <div className=\"relative\">\n {isEditing ? (\n <Textarea\n ref={textareaRef}\n dictate\n value={localValue}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={() => {\n flushPendingChange()\n setIsEditing(false)\n }}\n onMouseUp={() => {\n if (textareaRef.current && onHeightChange) {\n onHeightChange(textareaRef.current.offsetHeight)\n }\n }}\n placeholder={placeholder}\n readOnly={readOnly}\n rows={2}\n data-testid={dataTestId}\n autoFocus\n style={defaultHeight ? { height: defaultHeight } : undefined}\n className=\"w-full text-sm p-2 pr-14 border border-border rounded-md resize-y bg-background focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n ) : (\n <div\n onClick={() => !readOnly && setIsEditing(true)}\n style={defaultHeight ? { minHeight: defaultHeight } : undefined}\n data-testid={dataTestId}\n className={cn(\n 'w-full text-sm p-2 pr-14 border border-border rounded-md min-h-[4rem] whitespace-pre-wrap bg-background',\n !readOnly && 'cursor-text hover:border-ring',\n !localValue && 'text-muted-foreground'\n )}\n >\n {renderedContent || placeholder}\n </div>\n )}\n </div>\n\n {/* Sources — one row per cited document, each showing how many passages\n were tagged in it. Clicking a document reopens it in the viewer so more\n passages can be tagged; the passages themselves are chosen by reading,\n which is why citing is inseparable from opening. */}\n {(hasCitations || !readOnly) && (\n <div className=\"flex flex-col gap-1\">\n {docIds.map((docId) => {\n const doc = citedDocs?.[docId]\n const group = byDoc.get(docId)\n const pages = (group?.pages ?? []).slice().sort((a, b) => a - b)\n return (\n <div\n key={docId}\n className=\"flex items-center gap-1.5 text-sm\"\n data-testid={`citation-doc-${docId}`}\n >\n {doc ? (\n <button\n type=\"button\"\n onClick={() => !readOnly && onCiteDocument?.(docId)}\n // flex-1 so the title gets the row's spare width — the count\n // and remove control are shrink-0 and sit at the end.\n className=\"flex-1 min-w-0 text-left\"\n title=\"Open to tag more passages\"\n >\n <DocumentEntity doc={doc} fullWidth labelMaxWidth=\"max-w-full\" />\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{docId}</span>\n )}\n <span className=\"text-muted-foreground shrink-0\">{formatPageRefs(pages)}</span>\n {!readOnly && (\n <button\n type=\"button\"\n onClick={() => handleRemoveDocument(docId)}\n aria-label=\"Remove this document\"\n className=\"p-0.5 hover:bg-destructive/20 hover:text-destructive rounded shrink-0\"\n >\n <X size={12} />\n </button>\n )}\n </div>\n )\n })}\n\n {!readOnly && (\n <div className=\"flex items-center gap-1\">\n {/* The picker is rendered inline rather than behind a button: adding\n a source is the primary action here, and hiding it behind\n \"+ Document\" cost a click for no benefit. Once a document is\n cited, this row becomes \"add another\". */}\n <div className=\"flex-1 min-w-0\" data-testid=\"citation-document-picker\">\n {renderDocumentPicker?.(handleToggleDocument, docIds)}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Hint when citation is active */}\n {activeCitationKey && (\n <p className=\"text-sm text-blue-text\">\n Click a passage in the document to add it — <strong>shift-click</strong> to take a whole\n range. Add as many as you like, from as many documents as you like.\n </p>\n )}\n </div>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/files/FolderPicker.tsx","../src/files/bulk/FolderFilterButton.tsx","../src/files/page/FilesPageParts.tsx"],"names":["jsxs","cn","jsx","Minus","Check","Fragment","useState","useCallback","Command","CommandInput","CommandList","CommandEmpty","testIdOr","Plus","CommandGroup","CommandItem","FolderOpen","X","Popover","PopoverTrigger","Button","ChevronDown","PopoverContent","FolderPlus","BookMarked"],"mappings":"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","file":"chunk-O4YPVYPO.cjs","sourcesContent":["import { useCallback, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { Check, FolderOpen, Minus, Plus, X } from 'lucide-react'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the folder pickers. Pass a partial `labels` to translate or reword. */\nexport interface FolderPickerLabels {\n none: string\n removeFromFolder: string\n searchOrCreate: string\n noFolders: string\n create: (name: string) => string\n}\n\nexport const DEFAULT_FOLDER_PICKER_LABELS: FolderPickerLabels = {\n none: 'None',\n removeFromFolder: 'Remove from folder',\n searchOrCreate: 'Search or create...',\n noFolders: 'No folders yet',\n create: (name) => `Create \\u201c${name}\\u201d`,\n}\n\nexport interface FolderCommandListTestIds {\n create: string\n createOption: string\n remove: string\n /** Replaces the whole `folder-picker-option-<folder>` id. */\n option: (folder: string) => string\n}\n\n// ── Tree row ────────────────────────────────────────────────────────────────────────────────\n\nexport interface FolderPickerRowProps {\n label: string\n /** Optional leading glyph (e.g. a connector brand mark for provider roots). */\n icon?: ReactNode\n /** Shown at the right edge; omit for rows with nothing to count (e.g. an empty unread count). */\n count?: number\n depth: number\n isActive: boolean\n muted?: boolean\n /** Test id of the row button (none by default). */\n testId?: string\n /**\n * Draw a checkbox in the leading slot instead of the single-select tick. A list you can pick\n * SEVERAL rows from should look like one: a lone tick reads \"this is the current one\", a box\n * reads \"tick the ones you want\".\n */\n checkbox?: boolean\n /** Checkbox only: some descendants are selected, so show a dash, not a tick. */\n indeterminate?: boolean\n onClick: () => void\n}\n\n/** One folder row: indented by depth, with a count. Whole row is the target (44px on touch). */\nexport function FolderPickerRow({\n label,\n icon,\n count,\n depth,\n isActive,\n muted,\n checkbox,\n indeterminate,\n testId,\n onClick,\n}: FolderPickerRowProps) {\n return (\n <button\n type=\"button\"\n data-testid={testId}\n onClick={onClick}\n // The row IS the checkbox: a real <Checkbox> inside this button would nest one interactive\n // element in another and swallow the click. role + aria-checked carry the same meaning.\n role={checkbox ? 'checkbox' : undefined}\n aria-checked={checkbox ? (indeterminate ? 'mixed' : isActive) : undefined}\n style={{ paddingLeft: `${4 + depth * 14}px` }}\n className={cn(\n // `[&:hover]:`, not `hover:`: the latter compiles behind `@media (hover: hover)`, so on a\n // touchscreen whose PRIMARY pointer reports `hover: none` the row would never highlight\n // even with a real mouse attached. The arbitrary selector has no media gate.\n 'flex w-full items-center gap-1 rounded-sm py-1 pr-2 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&:hover]:bg-accent pointer-coarse:min-h-11',\n isActive && 'bg-primary/10',\n muted && !isActive && 'text-muted-foreground'\n )}\n >\n <span className=\"flex w-4 shrink-0 items-center justify-center\">\n {checkbox ? (\n <span\n className={cn(\n 'flex size-3.5 items-center justify-center rounded-[3px] border transition-colors',\n isActive || indeterminate\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-muted-foreground/40'\n )}\n >\n {indeterminate ? (\n <Minus className=\"size-2.5\" />\n ) : (\n isActive && <Check className=\"size-2.5\" />\n )}\n </span>\n ) : (\n isActive && <Check className=\"size-3.5 text-primary\" />\n )}\n </span>\n {icon}\n {label !== '' && (\n <span className={cn('min-w-0 truncate', isActive && 'font-semibold text-primary')}>\n {label}\n </span>\n )}\n {count !== undefined && (\n <span className=\"ml-auto pl-2 text-sm font-semibold text-muted-foreground\">{count}</span>\n )}\n </button>\n )\n}\n\n// ── Tree ────────────────────────────────────────────────────────────────────────────────────\n\nexport interface FolderTreeNode {\n path: string\n label: string\n depth: number\n count: number\n /** Replaces the label's default look (provider roots show a brand mark). */\n icon?: ReactNode\n}\n\nexport interface FolderTreeProps {\n nodes: FolderTreeNode[]\n unfiledCount: number\n /** string = folder path selected, null = Unfiled selected, undefined = nothing selected. */\n value: string | null | undefined\n onChange: (folder: string | null) => void\n /** Show the Unfiled (\"None\") row even when it is empty. */\n showUnfiledAlways?: boolean\n labels?: Partial<FolderPickerLabels>\n}\n\n/** Folder hierarchy with an Unfiled option at the bottom. No \"All\" row: callers add their own. */\nexport function FolderTree({\n nodes,\n unfiledCount,\n value,\n onChange,\n showUnfiledAlways,\n labels,\n}: FolderTreeProps) {\n const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels }\n return (\n <div className=\"max-h-[240px] overflow-y-auto\">\n {nodes.map((node) => (\n <FolderPickerRow\n key={node.path}\n label={node.label}\n icon={node.icon}\n count={node.count}\n depth={node.depth}\n isActive={value === node.path}\n onClick={() => onChange(node.path)}\n />\n ))}\n {(unfiledCount > 0 || showUnfiledAlways) && (\n <>\n {nodes.length > 0 && <div className=\"my-1 border-t border-border\" />}\n <FolderPickerRow\n label={l.none}\n count={unfiledCount}\n depth={0}\n isActive={value === null}\n muted\n onClick={() => onChange(null)}\n />\n </>\n )}\n </div>\n )\n}\n\n// ── Searchable list ─────────────────────────────────────────────────────────────────────────\n\nfunction FolderBreadcrumb({ folder }: { folder: string }) {\n const parts = folder.split('/')\n return (\n <span className=\"whitespace-nowrap\">\n {parts.map((part, i) => (\n <span key={i} className=\"inline-flex items-center gap-0.5\">\n {i > 0 && <span className=\"mx-0.5 text-sm text-muted-foreground/50\">/</span>}\n <span className={i < parts.length - 1 ? 'text-sm text-muted-foreground' : ''}>\n {part}\n </span>\n </span>\n ))}\n </span>\n )\n}\n\nexport interface FolderCommandListProps {\n /** Existing folder paths (the host derives them from its documents). */\n folders: string[]\n /** Selected folder (null = unfiled, undefined = no selection). */\n value?: string | null\n /** A folder was picked or a new one created. */\n onSelect: (folder: string | null) => void\n /** Show the remove / move-to-root option. */\n showRemove?: boolean\n /** Wins over `labels.removeFromFolder`. */\n removeLabel?: string\n /** Wins over `labels.searchOrCreate`. */\n placeholder?: string\n autoFocus?: boolean\n labels?: Partial<FolderPickerLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<FolderCommandListTestIds>\n}\n\n/**\n * Searchable folder picker: filter existing folders, create one by typing a new name, optional\n * \"Remove from folder\". Shows hierarchy as breadcrumbs.\n */\nexport function FolderCommandList({\n folders,\n value,\n onSelect,\n showRemove = false,\n removeLabel,\n placeholder,\n autoFocus = true,\n labels,\n testIds,\n}: FolderCommandListProps) {\n const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels }\n const [search, setSearch] = useState('')\n const trimmed = search.trim()\n const matchesExisting = folders.some((f) => f.toLowerCase() === trimmed.toLowerCase())\n\n const handleCreate = useCallback(\n (name: string) => {\n const next = name.trim()\n if (!next) return\n onSelect(next)\n setSearch('')\n },\n [onSelect]\n )\n\n return (\n <Command shouldFilter={true}>\n <CommandInput\n placeholder={placeholder ?? l.searchOrCreate}\n value={search}\n onValueChange={setSearch}\n autoFocus={autoFocus}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && trimmed && !matchesExisting) {\n e.preventDefault()\n handleCreate(search)\n }\n }}\n />\n <CommandList>\n <CommandEmpty>\n {trimmed ? (\n <button\n type=\"button\"\n data-testid={testIdOr(testIds?.create, { testId: 'folder-picker-create' })}\n onClick={() => handleCreate(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"flex w-full cursor-pointer items-center gap-1.5 rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n >\n <Plus className=\"size-3.5 shrink-0\" />\n {l.create(trimmed)}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{l.noFolders}</span>\n )}\n </CommandEmpty>\n <CommandGroup>\n {folders.map((folder) => (\n <CommandItem\n key={folder}\n value={folder}\n data-testid={testIdOr(testIds?.option?.(folder), {\n testId: `folder-picker-option-${folder}`,\n })}\n onSelect={() => onSelect(folder)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm\"\n >\n <FolderOpen className=\"mr-1.5 size-3.5 flex-none shrink-0 text-yellow-text\" />\n <FolderBreadcrumb folder={folder} />\n {value === folder && (\n <span className=\"ml-auto flex-none text-sm text-primary\">✓</span>\n )}\n </CommandItem>\n ))}\n </CommandGroup>\n\n {trimmed && !matchesExisting && folders.length > 0 && (\n <CommandGroup>\n <CommandItem\n value={`__create__${trimmed}`}\n data-testid={testIdOr(testIds?.createOption, {\n testId: 'folder-picker-create-option',\n })}\n onSelect={() => handleCreate(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm text-primary\"\n >\n <Plus className=\"mr-1.5 size-3.5 shrink-0\" />\n <span>{l.create(trimmed)}</span>\n </CommandItem>\n </CommandGroup>\n )}\n\n {showRemove && (\n <CommandGroup>\n <CommandItem\n value=\"__none__\"\n data-testid={testIdOr(testIds?.remove, { testId: 'folder-picker-remove' })}\n onSelect={() => onSelect(null)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm text-muted-foreground\"\n >\n <X className=\"mr-1 size-3.5 shrink-0\" />\n <span>{removeLabel ?? l.removeFromFolder}</span>\n {value === null && <span className=\"ml-auto flex-none text-sm text-primary\">✓</span>}\n </CommandItem>\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ChevronDown, FolderOpen, FolderPlus } from 'lucide-react'\nimport { Button, Popover, PopoverContent, PopoverTrigger, cn } from '@arbidocs/react/ui'\nimport { FolderPickerRow } from '../FolderPicker'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the folder filter. Pass a partial `labels` to translate or reword. */\nexport interface FolderFilterLabels {\n all: string\n newFolder: string\n}\n\nexport const DEFAULT_FOLDER_FILTER_LABELS: FolderFilterLabels = {\n all: 'All',\n newFolder: 'New folder',\n}\n\nexport interface FolderFilterButtonProps {\n /** Text of the active folder (\"All\", \"None\", or the display path). */\n label: string\n /** Leading glyph for connector folders; falls back to a folder icon. */\n icon?: ReactNode\n /** A folder filter is active: the trigger takes the selection tint. */\n isActive: boolean\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Total documents, shown on the \"All\" row. */\n allCount?: number\n /** When set, the popover starts with an \"All\" row; omit it for lists that have no \"All\". */\n onSelectAll?: () => void\n /** When set, the popover offers a \"New folder\" action. */\n onNewFolder?: () => void\n /** Slot: the folder tree picker. */\n children: ReactNode\n className?: string\n labels?: Partial<FolderFilterLabels>\n /** Test id of the trigger button (none by default). */\n testId?: string\n /** Overrides the \"New folder\" test id (default `explorer-new-folder`). */\n newFolderTestId?: string\n}\n\n/**\n * The folder filter control: a ghost button naming the active folder that opens a popover with\n * an \"All\" row, the folder tree (slot) and an optional \"New folder\" action.\n */\nexport function FolderFilterButton({\n label,\n icon,\n isActive,\n open,\n onOpenChange,\n allCount,\n onSelectAll,\n onNewFolder,\n children,\n className,\n labels,\n testId,\n newFolderTestId,\n}: FolderFilterButtonProps) {\n const l = { ...DEFAULT_FOLDER_FILTER_LABELS, ...labels }\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n data-slot=\"folder-filter-button\"\n data-testid={testId}\n className={cn(\n 'h-7 shrink-0 gap-1.5 px-2 text-sm font-normal pointer-coarse:h-10',\n isActive && 'bg-accent font-medium text-accent-foreground',\n className\n )}\n >\n {icon ?? (\n <FolderOpen\n className={cn(\n 'h-3.5 w-3.5 shrink-0 text-muted-foreground',\n isActive && 'fill-muted-foreground/30'\n )}\n />\n )}\n <span className=\"max-w-[280px] truncate\">{label}</span>\n <ChevronDown className=\"h-4 w-4 text-foreground\" strokeWidth={2.5} />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-max min-w-56 max-w-[480px] p-1 shadow-lg\"\n align=\"start\"\n sideOffset={4}\n >\n {onSelectAll && (\n <>\n <FolderPickerRow\n label={l.all}\n count={allCount}\n depth={0}\n isActive={!isActive}\n onClick={onSelectAll}\n />\n <div className=\"my-1 border-t border-border\" />\n </>\n )}\n {children}\n {onNewFolder && (\n <>\n <div className=\"my-1 border-t border-border\" />\n <button\n type=\"button\"\n onClick={onNewFolder}\n data-testid={testIdOr(newFolderTestId, { testId: 'explorer-new-folder' })}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground pointer-coarse:min-h-11\"\n >\n <FolderPlus className=\"h-3.5 w-3.5\" />\n {l.newFolder}\n </button>\n </>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","import type { ComponentProps, ReactNode } from 'react'\nimport { BookMarked } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Row of controls that follows the tab: filter field, folder picker, tags button. */\nexport function FilesFilterBar({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"files-filter-bar\"\n className={cn('flex min-w-0 flex-1 flex-nowrap items-center gap-2', className)}\n {...props}\n />\n )\n}\n\nexport interface FilesTagsButtonProps {\n onClick: () => void\n /** Button text (default \"Tags\"). */\n label?: string\n className?: string\n /** Overrides the test id (default `filter-bar-tags-button`). */\n testId?: string\n}\n\n/** Opens the labels / annotations vocabulary editor. The label collapses to sr-only on phones. */\nexport function FilesTagsButton({\n onClick,\n label = 'Tags',\n className,\n testId,\n}: FilesTagsButtonProps) {\n return (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn('h-8 shrink-0 gap-1.5 px-2 font-normal pointer-coarse:h-11', className)}\n onClick={onClick}\n data-testid={testIdOr(testId, { testId: 'filter-bar-tags-button' })}\n >\n <BookMarked className=\"h-3.5 w-3.5\" />\n <span className=\"text-sm max-[480px]:sr-only\">{label}</span>\n </Button>\n )\n}\n\n/**\n * The view switch beside the page title. Marks a size container so the switch collapses its labels\n * to icons by the room it is given (not the viewport), and shrinks with the row.\n */\nexport function FilesViewCenter({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"files-view-center\"\n className={cn('@container flex min-w-[9.5rem] flex-1 items-center gap-2', className)}\n {...props}\n />\n )\n}\n\nexport interface FilesModalFooterProps {\n children?: ReactNode\n className?: string\n}\n\n/** Footer row used when the page is hosted in a modal. */\nexport function FilesModalFooter({ children, className }: FilesModalFooterProps) {\n return (\n <div\n data-slot=\"files-modal-footer\"\n className={cn(\n // Sticks to the bottom of the modal's scrolling body so Close is always reachable.\n 'sticky bottom-0 z-40 flex justify-end gap-2 border-t border-border bg-background px-4 py-3 sm:px-6',\n className\n )}\n >\n {children}\n </div>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/ai.tsx"],"names":["useConnection","useKitAiTask","useCallback","useKitWorkspaceDocs","useKitSemanticSearch","useWorkspaceUsers","useArbiChat","takeOpenDocumentForTurn","jsx","AssistantDock"],"mappings":"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","file":"chunk-ODRHHWHY.cjs","sourcesContent":["/**\n * The connected agent hooks — thin adapters over the reusable AI kit in\n * `@arbidocs/react`. The streaming/accumulation/search plumbing lives once in\n * the SDK; these hooks only bind the *workspace source* (from the connection\n * context, falling back to the configured workspace) and inject the host's\n * default assistant *configuration* so call sites needn't know the config\n * ext_id. An explicit `opts.model` still wins.\n */\nimport { useCallback } from 'react'\nimport {\n useAiTask as useKitAiTask,\n useWorkspaceDocs as useKitWorkspaceDocs,\n useSemanticSearch as useKitSemanticSearch,\n useArbiChat,\n useWorkspaceUsers,\n type ArbiChat,\n type UseArbiChatOptions,\n type AiRunOptions,\n} from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\nimport { AssistantDock, type AssistantDockProps } from '../chat/AssistantDock'\nimport type { MentionCandidate } from '../chat/mentions'\nimport { takeOpenDocumentForTurn } from '../chat/open-document'\n\nexport type { AiTaskStatus, AiRunOptions, SearchChunk, ArtifactEvent } from '@arbidocs/react'\n\n/** Client-side redlining, re-exported so a host app has one import surface. */\nexport { toRedlineMarkdown, redlineStats, textToArtifact } from '@arbidocs/react'\n\n/**\n * The kit's `useAiTask` with the host's default assistant configuration\n * injected, so call sites needn't know the config ext_id.\n */\nexport function useConnectedAiTask() {\n const { assistantConfig } = useConnection()\n const task = useKitAiTask()\n const kitRun = task.run\n const run = useCallback(\n (question: string, docIds: string[], opts?: AiRunOptions) =>\n kitRun(question, docIds, { ...opts, model: opts?.model ?? assistantConfig }),\n [kitRun, assistantConfig]\n )\n return { ...task, run }\n}\n\n/** Resolve the active workspace + its document ids (what we ground the agent on). */\nexport function useWorkspaceDocs() {\n const { workspaceId, fallbackWorkspaceId } = useConnection()\n return useKitWorkspaceDocs(workspaceId ?? fallbackWorkspaceId)\n}\n\n/** Search the active workspace's documents and return the top matching passages. */\nexport function useSemanticSearch() {\n const { docIds } = useWorkspaceDocs()\n return useKitSemanticSearch(docIds)\n}\n\n/**\n * The chat controller for `ChatPage` bound to the connection: the active workspace and the host's\n * default assistant configuration are injected, so a host writes\n * `<ChatPage chat={useConnectedChat()} />`.\n */\nexport function useConnectedChat(\n options?: Omit<UseArbiChatOptions, 'workspaceId'>\n): ArbiChat & { mentionCandidates: MentionCandidate[] } {\n const { workspaceId, fallbackWorkspaceId, assistantConfig, user, status, ensureWorkspaceOpen } =\n useConnection()\n const wsId = workspaceId ?? fallbackWorkspaceId\n const { data: members = [] } = useWorkspaceUsers(wsId, {\n enabled: status === 'authenticated' && !!wsId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const mentionCandidates: MentionCandidate[] = [\n { id: 'assistant', kind: 'assistant', label: 'Assistant' },\n ...(status === 'authenticated' ? members : [])\n .filter(\n (member) =>\n !member.agent_ext_id &&\n member.user.external_id !== user?.externalId &&\n !member.user.external_id.startsWith('agt-')\n )\n .map((member) => ({\n id: member.user.external_id,\n kind: 'user' as const,\n label:\n [member.user.given_name, member.user.family_name].filter(Boolean).join(' ') ||\n member.user.email,\n description: member.user.email,\n }))\n .sort((a, b) => a.label.localeCompare(b.label)),\n ]\n const chat = useArbiChat({\n // Drafting mode: each question names the document open beside the chat.\n activeArtifact: () => takeOpenDocumentForTurn({ workspaceId: wsId }),\n ...options,\n workspaceId: wsId,\n model: options?.model ?? assistantConfig,\n })\n return {\n ...chat,\n mentionCandidates,\n messages: chat.messages.map((message) => ({\n ...message,\n ...(message.authorId\n ? {\n senderName:\n message.authorId === user?.externalId\n ? user?.name || user?.email\n : mentionCandidates.find((candidate) => candidate.id === message.authorId)?.label,\n }\n : {}),\n })),\n }\n}\n\n/**\n * The assistant dock bound to the connection: mount it once in the layout (`Shell.Root`'s `aside`)\n * and put `AssistantDockToggle` in the topbar. Chat state lives here, so it survives closing the dock.\n */\nexport function ConnectedAssistantDock(props: Omit<AssistantDockProps, 'chat'>) {\n const chat = useConnectedChat()\n return <AssistantDock {...props} chat={chat} />\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/retrieval/highlight.ts","../src/retrieval/SearchPagination.tsx","../src/retrieval/SearchGroupHeader.tsx","../src/retrieval/SearchEmptyState.tsx","../src/retrieval/SearchPage.tsx","../src/retrieval/HighlightText.tsx"],"names":["memo","SearchPagination","jsxs","cn","testIdOr","jsx","Button","ChevronLeft","ChevronRight","SearchGroupHeader","Fragment","FileUp","Plus","Search","Blend","Quote","useMemo","useRef","useCallback","useLayoutEffect","X","Loader2","prefixedTestId","AlertCircle","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","DialogFooter","TagIcon"],"mappings":"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","file":"chunk-QI6AIHWP.cjs","sourcesContent":["/**\n * Flatten inline markdown links to their visible label: `[label](url)` -> `label`\n * (and image `` -> `alt`).\n *\n * Search snippets must not navigate away when clicked, and highlighting wraps matches in\n * `<mark>`: doing that over raw markdown would inject `<mark>` inside link URLs that contain a\n * query word, corrupting both the href and the text. Removing the URLs first makes it safe.\n */\nexport function stripMarkdownLinks(text: string): string {\n return text.replace(/!?\\[([^\\]]+)\\]\\([^)]*\\)/g, '$1')\n}\n\n/**\n * Prepare a snippet for markdown rendering: links flattened, and every (case-insensitive)\n * occurrence of a query term wrapped in `<mark>`. The renderer must allow `mark` through its\n * sanitizer.\n */\nexport function highlightTerms(content: string, terms: string[]): string {\n const plain = stripMarkdownLinks(content)\n if (terms.length === 0) return plain\n const escaped = terms.map((t) => t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n return plain.replace(new RegExp(`(${escaped.join('|')})`, 'gi'), '<mark>$1</mark>')\n}\n\n/**\n * Page numbers for a pagination control: first + last + a window around the current page.\n * getPageNumbers(1, 3) -> [1, 2, 3]\n * getPageNumbers(7, 50) -> [1, 'ellipsis', 6, 7, 8, 'ellipsis', 50]\n */\nexport function getPageNumbers(current: number, total: number): (number | 'ellipsis')[] {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1)\n\n const pages: (number | 'ellipsis')[] = [1]\n const windowStart = Math.max(2, current - 1)\n const windowEnd = Math.min(total - 1, current + 1)\n\n if (windowStart > 2) pages.push('ellipsis')\n for (let p = windowStart; p <= windowEnd; p++) pages.push(p)\n if (windowEnd < total - 1) pages.push('ellipsis')\n\n pages.push(total)\n return pages\n}\n","import { memo } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { getPageNumbers } from './highlight'\n\nexport interface SearchPaginationLabels {\n navigation: string\n previous: string\n next: string\n page: (page: number) => string\n}\n\nexport const DEFAULT_SEARCH_PAGINATION_LABELS: SearchPaginationLabels = {\n navigation: 'Search results pagination',\n previous: 'Previous page',\n next: 'Next page',\n page: (page) => `Page ${page}`,\n}\n\nexport interface SearchPaginationTestIds {\n root: string\n /** Builds the id of a page button from its number. */\n page: (page: number) => string\n}\n\nexport interface SearchPaginationProps {\n currentPage: number\n totalPages: number\n onPageChange: (page: number) => void\n labels?: Partial<SearchPaginationLabels>\n testIds?: Partial<SearchPaginationTestIds>\n className?: string\n}\n\nexport const SearchPagination = memo(function SearchPagination({\n currentPage,\n totalPages,\n onPageChange,\n labels,\n testIds,\n className,\n}: SearchPaginationProps) {\n const l = { ...DEFAULT_SEARCH_PAGINATION_LABELS, ...labels }\n if (totalPages <= 1) return null\n const pages = getPageNumbers(currentPage, totalPages)\n return (\n <nav\n className={cn('mt-6 mb-2 flex items-center justify-center gap-1', className)}\n aria-label={l.navigation}\n data-testid={testIdOr(testIds?.root, { testId: 'smart-search-pagination' })}\n data-slot=\"search-pagination\"\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 px-2 pointer-coarse:h-11 pointer-coarse:min-w-11\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage <= 1}\n aria-label={l.previous}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n {pages.map((p, i) =>\n p === 'ellipsis' ? (\n <span\n key={`ellipsis-${i}`}\n className=\"select-none px-2 text-sm text-muted-foreground\"\n aria-hidden\n >\n …\n </span>\n ) : (\n <Button\n key={p}\n variant={p === currentPage ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"h-8 min-w-8 px-2 pointer-coarse:h-11 pointer-coarse:min-w-11\"\n onClick={() => onPageChange(p)}\n aria-current={p === currentPage ? 'page' : undefined}\n aria-label={l.page(p)}\n data-testid={testIdOr(testIds?.page?.(p), { testId: `smart-search-page-${p}` })}\n >\n {p}\n </Button>\n )\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 px-2 pointer-coarse:h-11 pointer-coarse:min-w-11\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages}\n aria-label={l.next}\n >\n <ChevronRight className=\"size-4\" />\n </Button>\n </nav>\n )\n})\n","import { memo, type ReactNode } from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface SearchGroupHeaderLabels {\n hit: string\n hits: string\n}\n\nexport const DEFAULT_SEARCH_GROUP_HEADER_LABELS: SearchGroupHeaderLabels = {\n hit: 'hit',\n hits: 'hits',\n}\n\nexport interface SearchGroupHeaderProps {\n /** Group key, handed back to `onToggle`. */\n groupId: string\n hitCount: number\n isExpanded: boolean\n onToggle: (groupId: string) => void\n /** The source pill; clicks on it do not toggle the group. */\n source: ReactNode\n labels?: Partial<SearchGroupHeaderLabels>\n /** Defaults to `search-result-group-toggle-${groupId}`. */\n testId?: string\n className?: string\n}\n\n/** Collapsible group row: chevron + source + hit count. The whole row toggles. */\nexport const SearchGroupHeader = memo(function SearchGroupHeader({\n groupId,\n hitCount,\n isExpanded,\n onToggle,\n source,\n labels,\n testId,\n className,\n}: SearchGroupHeaderProps) {\n const l = { ...DEFAULT_SEARCH_GROUP_HEADER_LABELS, ...labels }\n const toggle = () => onToggle(groupId)\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={toggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n toggle()\n }\n }}\n aria-expanded={isExpanded}\n className={cn(\n 'flex cursor-pointer items-center gap-2 px-3 py-1.5 pointer-coarse:min-h-11 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n isExpanded && 'border-b border-border',\n className\n )}\n data-testid={testIdOr(testId, { testId: `search-result-group-toggle-${groupId}` })}\n data-slot=\"search-group-header\"\n >\n <ChevronRight\n className={cn(\n 'size-4 shrink-0 text-muted-foreground transition-transform',\n isExpanded && 'rotate-90'\n )}\n />\n <span className=\"min-w-0\" onClick={(e) => e.stopPropagation()}>\n {source}\n </span>\n <span className=\"shrink-0 text-sm text-muted-foreground\">\n {hitCount} {hitCount === 1 ? l.hit : l.hits}\n </span>\n </div>\n )\n})\n","import type { ReactNode } from 'react'\nimport { Blend, FileUp, Plus, Quote, Search, type LucideIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface SearchEmptyNouns {\n singular: string\n plural: string\n /** The unit a hit returns (passage / fact). */\n hit: string\n hits: string\n emptyTitle: string\n emptyHint: ReactNode\n EmptyIcon: LucideIcon\n}\n\nexport const DOCUMENT_SEARCH_NOUNS: SearchEmptyNouns = {\n singular: 'document',\n plural: 'documents',\n hit: 'passage',\n hits: 'passages',\n emptyTitle: 'No documents to search yet',\n emptyHint: (\n <>\n Add files under <span className=\"font-medium text-foreground/80\">“Files”</span>, then come\n back to search their full text by keyword or meaning.\n </>\n ),\n EmptyIcon: FileUp,\n}\n\n/** Nouns for searching a custom collection (e.g. facts). `singular`/`plural` are lower case. */\nexport function searchNouns(\n singular: string,\n plural: string,\n addHint: ReactNode,\n EmptyIcon: LucideIcon = Plus\n): SearchEmptyNouns {\n return {\n singular,\n plural,\n hit: singular,\n hits: plural,\n emptyTitle: `No ${plural} to search yet`,\n emptyHint: addHint,\n EmptyIcon,\n }\n}\n\nexport interface SearchEmptyStateLabels {\n /** Title when there are items. */\n title: (nouns: SearchEmptyNouns) => string\n /** Intro sentence; receives the count and the nouns. */\n intro: (count: number, nouns: SearchEmptyNouns) => ReactNode\n hybridTitle: string\n hybridBody: (nouns: SearchEmptyNouns) => string\n phraseTitle: string\n phraseBefore: string\n phraseExample: string\n phraseAfter: (nouns: SearchEmptyNouns) => string\n}\n\nexport const DEFAULT_SEARCH_EMPTY_STATE_LABELS: SearchEmptyStateLabels = {\n title: (n) => `Search across your ${n.plural}`,\n intro: (count, n) => (\n <>\n Find any {n.hit} across{' '}\n <span className=\"font-medium text-foreground/80\">\n {count.toLocaleString()} {count === 1 ? n.singular : n.plural}\n </span>{' '}\n — by keyword, by meaning, or both.\n </>\n ),\n hybridTitle: 'Words and meaning, together',\n hybridBody: (n) =>\n `Every search matches exact words and meaning, so ${n.hits} worded differently are still found.`,\n phraseTitle: 'Quote an exact phrase',\n phraseBefore: 'Wrap a phrase in double quotes, like ',\n phraseExample: '\"force majeure\"',\n phraseAfter: (n) => `, to return only ${n.hits} containing it.`,\n}\n\nexport interface SearchEmptyStateProps {\n /** Number of searchable items in the workspace. */\n count: number\n /** Defaults to documents. */\n nouns?: SearchEmptyNouns\n labels?: Partial<SearchEmptyStateLabels>\n testId?: string\n className?: string\n}\n\n/** Shown before the first search: explains hybrid matching and quoted phrases. */\nexport function SearchEmptyState({\n count,\n nouns = DOCUMENT_SEARCH_NOUNS,\n labels,\n testId,\n className,\n}: SearchEmptyStateProps) {\n const l = { ...DEFAULT_SEARCH_EMPTY_STATE_LABELS, ...labels }\n const hasItems = count > 0\n const Icon = hasItems ? Search : nouns.EmptyIcon\n\n return (\n <div\n className={cn('flex justify-center px-10 pb-10 pt-6', className)}\n data-testid={testIdOr(testId, { testId: 'smart-search-empty-state' })}\n data-slot=\"search-empty-state\"\n >\n <div className=\"w-full max-w-xl text-center\">\n <div\n className={cn(\n 'mx-auto mb-4 flex size-12 items-center justify-center rounded-lg',\n hasItems ? 'bg-ai-soft text-ai-ink' : 'bg-muted text-muted-foreground'\n )}\n >\n <Icon className=\"size-6\" />\n </div>\n\n {hasItems ? (\n <>\n <h2 className=\"mt-2 text-xl font-semibold text-foreground\">{l.title(nouns)}</h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">{l.intro(count, nouns)}</p>\n\n <div className=\"mt-7 grid gap-3 text-left @xl:grid-cols-2\">\n <div className=\"rounded-lg bg-muted p-3\">\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-foreground\">\n <Blend className=\"size-4 text-ai-ink\" />\n {l.hybridTitle}\n </div>\n <p className=\"mt-1 text-sm leading-snug text-muted-foreground\">\n {l.hybridBody(nouns)}\n </p>\n </div>\n <div className=\"rounded-lg bg-muted p-3\">\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-foreground\">\n <Quote className=\"size-4 text-ai-ink\" />\n {l.phraseTitle}\n </div>\n <p className=\"mt-1 text-sm leading-snug text-muted-foreground\">\n {l.phraseBefore}\n <code className=\"rounded bg-background px-1 py-0.5 font-mono text-sm text-foreground/90\">\n {l.phraseExample}\n </code>\n {l.phraseAfter(nouns)}\n </p>\n </div>\n </div>\n </>\n ) : (\n <>\n <h2 className=\"text-xl font-semibold text-foreground\">{nouns.emptyTitle}</h2>\n <p className=\"mx-auto mt-1.5 max-w-sm text-sm text-muted-foreground\">\n {nouns.emptyHint}\n </p>\n </>\n )}\n </div>\n </div>\n )\n}\n","import { useCallback, useLayoutEffect, useMemo, useRef, type ReactNode, type Ref } from 'react'\nimport { AlertCircle, Loader2, Search, TagIcon, X } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n cn,\n} from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\n\n/* -------------------------------------------------------------------------- */\n/* Page frame */\n/* -------------------------------------------------------------------------- */\n\n/** Column that fills the Smart Search page (padded when standalone, flush when embedded). */\nexport function SearchPageFrame({\n isEmbedded,\n testId = 'smart-search',\n children,\n}: {\n isEmbedded?: boolean\n testId?: string\n children: ReactNode\n}) {\n return (\n <div\n data-slot=\"search-page\"\n data-testid={testId}\n className={cn('flex h-full flex-col', !isEmbedded && 'px-4')}\n >\n {children}\n </div>\n )\n}\n\n/** Sticky header slot; `-mx-4` cancels the frame's padding so the tab sits at the page inset. */\nexport function SearchPageHeader({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"search-page-header\" className=\"sticky top-0 z-10 -mx-4 bg-background\">\n {children}\n </div>\n )\n}\n\n/** Everything under the header. */\nexport function SearchPageBody({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"search-page-body\" className=\"flex min-h-0 flex-1 flex-col\">\n {children}\n </div>\n )\n}\n\n/** Thin row above the search bar (the embedded view puts the grouping toggle here). */\nexport function SearchToolbarRow({ children }: { children: ReactNode }) {\n return (\n <div\n data-slot=\"search-toolbar-row\"\n className=\"group flex h-8 items-center gap-2 border-b border-border/60 bg-background pl-5 pr-3\"\n >\n <div className=\"ml-auto flex shrink-0 items-center\">{children}</div>\n </div>\n )\n}\n\n/** Scrolling results area with its inner padding. */\nexport function SearchResultsMain({ children }: { children: ReactNode }) {\n return (\n <main data-slot=\"search-results-main\" className=\"flex-1 overflow-auto\">\n {children}\n </main>\n )\n}\n\n/** Padded wrapper of the hits. */\nexport function SearchResultsInner({ children }: { children: ReactNode }) {\n return <div className=\"w-full px-6 pb-6 pt-1\">{children}</div>\n}\n\n/** Vertical list of result rows or group cards. */\nexport function SearchResultList({ testId, children }: { testId?: string; children: ReactNode }) {\n return (\n <div className=\"space-y-3\" data-testid={testId}>\n {children}\n </div>\n )\n}\n\n/** One document's collapsible group: header (the toggle) plus the expanded hits. */\nexport function SearchGroupCard({\n testId,\n header,\n isExpanded,\n children,\n}: {\n testId?: string\n header: ReactNode\n isExpanded: boolean\n children: ReactNode\n}) {\n return (\n <div\n data-slot=\"search-group-card\"\n className=\"rounded border border-border transition-colors\"\n data-testid={testId}\n >\n {header}\n {isExpanded && <div className=\"space-y-3 p-3\">{children}</div>}\n </div>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* Search bar */\n/* -------------------------------------------------------------------------- */\n\nexport interface SearchBarLabels {\n search: string\n clear: string\n submit: string\n}\n\nexport const DEFAULT_SEARCH_BAR_LABELS: SearchBarLabels = {\n search: 'Search:',\n clear: 'Clear search',\n submit: 'Search',\n}\n\nexport interface SearchBarProps {\n query: string\n onQueryChange: (query: string) => void\n /** Enter (without Shift) or the submit button. */\n onSubmit: () => void\n onClear: () => void\n canSubmit: boolean\n isSearching: boolean\n placeholder?: string\n /** Tooltip of the submit button (e.g. why it is disabled). */\n submitTitle?: string\n /** Message under the box (e.g. \"too many documents selected\"). */\n notice?: ReactNode\n noticeTestId?: string\n inputId?: string\n testIds?: { input?: string; clear?: string; submit?: string }\n /** Lets the host refocus the box and reset its height after a clear. */\n inputRef?: Ref<HTMLTextAreaElement>\n isEmbedded?: boolean\n labels?: Partial<SearchBarLabels>\n}\n\n/** The bordered, auto-growing query box with an inline clear and submit. */\nexport function SearchBar({\n query,\n onQueryChange,\n onSubmit,\n onClear,\n canSubmit,\n isSearching,\n placeholder,\n submitTitle,\n notice,\n noticeTestId,\n inputId = 'smart-search-input',\n testIds,\n inputRef,\n isEmbedded,\n labels,\n}: SearchBarProps) {\n const l = useMemo(() => ({ ...DEFAULT_SEARCH_BAR_LABELS, ...labels }), [labels])\n // The field grows with its content, and an empty field with its (possibly wrapping) placeholder:\n // a fixed single row cut the second line of a long placeholder on phones.\n const fieldRef = useRef<HTMLTextAreaElement | null>(null)\n const setRefs = useCallback(\n (el: HTMLTextAreaElement | null) => {\n fieldRef.current = el\n if (typeof inputRef === 'function') inputRef(el)\n else if (inputRef) (inputRef as { current: HTMLTextAreaElement | null }).current = el\n },\n [inputRef]\n )\n useLayoutEffect(() => {\n const el = fieldRef.current\n if (!el) return\n const resize = () => {\n el.style.height = 'auto'\n el.style.height = `${el.scrollHeight}px`\n }\n resize()\n if (typeof ResizeObserver === 'undefined') return\n let lastWidth = el.clientWidth\n const observer = new ResizeObserver(() => {\n if (el.clientWidth === lastWidth) return\n lastWidth = el.clientWidth\n resize()\n })\n observer.observe(el)\n return () => observer.disconnect()\n }, [query, placeholder])\n return (\n <div data-slot=\"search-bar\" className={cn('pl-6 pr-4', isEmbedded ? 'pb-4 pt-6' : 'py-4')}>\n <form\n onSubmit={(e) => {\n e.preventDefault()\n onSubmit()\n }}\n className=\"mx-auto flex w-full max-w-2xl items-center gap-3\"\n >\n <label htmlFor={inputId} className=\"sr-only\">\n {l.search}\n </label>\n <div className=\"flex min-w-0 flex-1 items-start gap-2 rounded-lg border border-border bg-background px-3.5 py-2.5 transition-colors focus-within:border-ring focus-within:ring-2 focus-within:ring-ring\">\n <textarea\n id={inputId}\n ref={setRefs}\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={placeholder}\n className=\"flex-1 resize-none overflow-hidden border-0 bg-transparent p-0 pointer-coarse:min-h-11 pointer-coarse:py-2.5 text-base leading-relaxed text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={testIdOr(testIds?.input, { testId: 'smart-search-input' })}\n />\n <div className=\"flex shrink-0 items-center gap-1\">\n {query && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n onClick={onClear}\n aria-label={l.clear}\n title={l.clear}\n data-testid={testIdOr(testIds?.clear, { testId: 'smart-search-clear-button' })}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={!canSubmit}\n className=\"h-8 gap-1.5 px-3 text-sm pointer-coarse:h-11\"\n data-testid={testIdOr(testIds?.submit, { testId: 'smart-search-submit-button' })}\n title={submitTitle ?? l.submit}\n aria-label={l.submit}\n >\n {isSearching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Search className=\"size-4\" />\n )}\n {l.submit}\n </Button>\n </div>\n {notice && (\n <p\n className=\"mt-2 text-sm text-destructive\"\n data-testid={testIdOr(noticeTestId, { testId: 'smart-search-selection-too-large' })}\n >\n {notice}\n </p>\n )}\n </div>\n </form>\n </div>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* Controls: grouping toggle, relevance threshold, totals */\n/* -------------------------------------------------------------------------- */\n\nexport interface SearchPillOption {\n value: string\n /** Visible content (icon + text). */\n content: ReactNode\n /** Tooltip. */\n title: string\n}\n\nexport interface SearchPillToggleProps {\n options: SearchPillOption[]\n value: string\n onChange: (value: string) => void\n ariaLabel: string\n /** Prefix of the option buttons' test ids (`<prefix>-<value>-button`); default `smart-search-view`. */\n testIdPrefix?: string\n}\n\n/** Pill-shaped segmented toggle of `aria-pressed` buttons. */\nexport function SearchPillToggle({\n options,\n value,\n onChange,\n ariaLabel,\n testIdPrefix,\n}: SearchPillToggleProps) {\n return (\n <div\n className=\"inline-flex items-center rounded-full bg-muted p-0.5\"\n role=\"group\"\n aria-label={ariaLabel}\n data-slot=\"search-pill-toggle\"\n >\n {options.map((o) => {\n const active = o.value === value\n return (\n <button\n key={o.value}\n type=\"button\"\n onClick={() => onChange(o.value)}\n aria-pressed={active}\n title={o.title}\n data-testid={prefixedTestId(\n testIdPrefix,\n o.value,\n { testId: `smart-search-view-${o.value}-button` },\n '-button'\n )}\n className={cn(\n 'flex min-h-8 items-center gap-1.5 rounded-full px-3 py-1 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n active\n ? 'bg-background text-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {o.content}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport interface RelevanceStep {\n /** Minimum score kept at this step. */\n value: number\n label: string\n}\n\nexport const DEFAULT_RELEVANCE_STEPS: RelevanceStep[] = [\n { value: 0, label: 'Low' },\n { value: 0.7, label: 'High' },\n]\n\n// Accents match the relevance colours used for chunk borders and score pills elsewhere.\nconst STEP_DOT_CLASS = ['bg-muted-foreground/40', 'bg-primary']\nconst STEP_LABEL_CLASS = ['text-foreground', 'text-primary']\n\nexport interface RelevanceThresholdProps {\n value: number\n onChange: (value: number) => void\n steps?: RelevanceStep[]\n title?: string\n ariaLabel?: string\n}\n\n/** Compact segmented control (Low / High) with a colour-coded dot on the active step. */\nexport function RelevanceThreshold({\n value,\n onChange,\n steps = DEFAULT_RELEVANCE_STEPS,\n title = 'Relevance Threshold',\n ariaLabel = 'Search relevance threshold',\n}: RelevanceThresholdProps) {\n const active = steps.reduce((best, s, i) => (value >= s.value ? i : best), 0)\n return (\n <div className=\"flex items-center gap-1.5\" data-slot=\"relevance-threshold\">\n <span className=\"whitespace-nowrap text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {title}\n </span>\n <div\n className=\"inline-flex items-center rounded-full bg-muted p-0.5\"\n role=\"group\"\n aria-label={ariaLabel}\n >\n {steps.map((step, i) => {\n const isActive = i === active\n return (\n <button\n key={step.label}\n type=\"button\"\n onClick={() => onChange(step.value)}\n aria-pressed={isActive}\n data-testid={`smart-search-threshold-${step.label.toLowerCase()}`}\n className={cn(\n 'flex items-center gap-1 rounded-full 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 pointer-coarse:px-3',\n isActive\n ? cn('bg-background', STEP_LABEL_CLASS[i] ?? STEP_LABEL_CLASS[0])\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n <span\n className={cn(\n 'size-1.5 rounded-full transition-colors',\n isActive ? (STEP_DOT_CLASS[i] ?? STEP_DOT_CLASS[0]) : 'bg-muted-foreground/30'\n )}\n />\n {step.label}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n\n/** Result controls pinned between the search bar and the scrolling results. */\nexport function SearchControlsBar({\n start,\n end,\n children,\n}: {\n /** Left side: the totals headline. */\n start: ReactNode\n /** Right side: threshold and toggle. */\n end: ReactNode\n children?: ReactNode\n}) {\n return (\n <div\n data-slot=\"search-controls-bar\"\n className=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-2 pb-3 pl-6 pr-4\"\n >\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-2\">{start}</div>\n <div className=\"flex items-center gap-3\">{end}</div>\n {children}\n </div>\n )\n}\n\nexport interface SearchTotalsHeadlineLabels {\n hit: string\n hits: string\n document: string\n documents: string\n passages: string\n}\n\nexport const DEFAULT_SEARCH_TOTALS_LABELS: SearchTotalsHeadlineLabels = {\n hit: 'hit',\n hits: 'hits',\n document: 'document',\n documents: 'documents',\n passages: 'passages',\n}\n\nexport interface SearchTotalsHeadlineProps {\n /** Hits passing the relevance threshold. */\n shownHits: number\n totalHits: number\n /** Documents among the shown hits. */\n shownDocuments: number\n totalDocuments: number\n /** Shown hits whose passage contains none of the query words (matched by meaning). */\n meaningHits?: number\n /** Paging range, shown when there is more than one page. */\n range?: { start: number; end: number; total: number; unit: 'passages' | 'documents' } | null\n /** Inline action after the sentence (e.g. Apply label). */\n action?: ReactNode\n testId?: string\n labels?: Partial<SearchTotalsHeadlineLabels>\n}\n\nconst fmt = (n: number) => n.toLocaleString()\n\n/** \"N hits (M total) across K documents\", plus optional keyword/meaning split, action and range. */\nexport function SearchTotalsHeadline({\n shownHits,\n totalHits,\n shownDocuments,\n totalDocuments,\n meaningHits = 0,\n range,\n action,\n testId = 'smart-search-totals',\n labels,\n}: SearchTotalsHeadlineProps) {\n const l = useMemo(() => ({ ...DEFAULT_SEARCH_TOTALS_LABELS, ...labels }), [labels])\n const hitWord = (n: number) => (n === 1 ? l.hit : l.hits)\n const docWord = (n: number) => (n === 1 ? l.document : l.documents)\n return (\n <p\n className=\"flex flex-wrap items-baseline gap-x-2 font-sans text-base font-semibold tabular-nums text-foreground\"\n data-testid={testId}\n >\n <span>\n {shownHits < totalHits ? (\n <>\n {fmt(shownHits)} {hitWord(shownHits)}{' '}\n <span className=\"font-normal text-muted-foreground\">({fmt(totalHits)} total)</span>{' '}\n across {fmt(shownDocuments)} {docWord(shownDocuments)}\n </>\n ) : (\n <>\n {fmt(totalHits)} {hitWord(totalHits)} across {fmt(totalDocuments)}{' '}\n {docWord(totalDocuments)}\n </>\n )}\n </span>\n {meaningHits > 0 && (\n <>\n {' '}\n <span className=\"text-sm font-normal text-muted-foreground\">\n · {fmt(shownHits - meaningHits)} contain your words, {fmt(meaningHits)} matched by\n meaning\n </span>\n </>\n )}\n {action && (\n <span className=\"inline-flex items-center gap-2 text-sm font-normal text-muted-foreground\">\n –{action}\n </span>\n )}\n {range && range.total > 0 && (\n <span className=\"text-sm font-normal text-muted-foreground\">\n · showing {fmt(range.start)}–{fmt(range.end)} of {fmt(range.total)}{' '}\n {range.unit === 'passages' ? l.passages : l.documents}\n </span>\n )}\n </p>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* States */\n/* -------------------------------------------------------------------------- */\n\n/** Inline error of a failed search. */\nexport function SearchErrorBanner({ message }: { message: string }) {\n return (\n <div\n role=\"alert\"\n className=\"flex items-center gap-2 rounded-md bg-destructive/10 p-4 text-destructive\"\n >\n <AlertCircle className=\"size-5 flex-shrink-0\" />\n <p>{message}</p>\n </div>\n )\n}\n\nexport interface SearchNoResultsProps {\n /** Hits that exist but fall below the threshold; 0 when the search found nothing. */\n hiddenHits: number\n onLowerThreshold: () => void\n labels?: Partial<SearchNoResultsLabels>\n testId?: string\n}\n\nexport interface SearchNoResultsLabels {\n none: string\n hidden: (count: number) => string\n lower: string\n}\n\nexport const DEFAULT_SEARCH_NO_RESULTS_LABELS: SearchNoResultsLabels = {\n none: 'No results found for your search query.',\n hidden: (n) =>\n `All ${fmt(n)} ${n === 1 ? 'hit is' : 'hits are'} below the current relevance threshold.`,\n lower: 'Lower threshold to Low',\n}\n\n/** Nothing to list: either no hits, or all hits are under the relevance threshold. */\nexport function SearchNoResults({\n hiddenHits,\n onLowerThreshold,\n labels,\n testId = 'smart-search-no-results',\n}: SearchNoResultsProps) {\n const l = useMemo(() => ({ ...DEFAULT_SEARCH_NO_RESULTS_LABELS, ...labels }), [labels])\n return (\n <div className=\"py-12 text-center\" data-testid={testId}>\n <Search className=\"mx-auto mb-4 size-12 text-muted-foreground\" />\n {hiddenHits > 0 ? (\n <>\n <p className=\"text-muted-foreground\">{l.hidden(hiddenHits)}</p>\n <Button variant=\"link\" size=\"sm\" className=\"mt-2\" onClick={onLowerThreshold}>\n {l.lower}\n </Button>\n </>\n ) : (\n <p className=\"text-muted-foreground\">{l.none}</p>\n )}\n </div>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* Apply label dialog */\n/* -------------------------------------------------------------------------- */\n\nexport interface ApplyLabelDialogLabels {\n title: string\n description: (documents: number, passages: number) => string\n placeholder: string\n cancel: string\n apply: string\n}\n\nexport const DEFAULT_APPLY_LABEL_DIALOG_LABELS: ApplyLabelDialogLabels = {\n title: 'Apply label',\n description: (documents, passages) =>\n `Labels ${documents} ${documents === 1 ? 'document' : 'documents'} with ${passages} passage ${passages === 1 ? 'reference' : 'references'}.`,\n placeholder: 'Label name',\n cancel: 'Cancel',\n apply: 'Apply label',\n}\n\nexport interface ApplyLabelDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n name: string\n onNameChange: (name: string) => void\n onApply: (name: string) => void\n isApplying: boolean\n documentCount: number\n passageCount: number\n labels?: Partial<ApplyLabelDialogLabels>\n}\n\n/** Name a label and apply it to every document in the results. */\nexport function ApplyLabelDialog({\n open,\n onOpenChange,\n name,\n onNameChange,\n onApply,\n isApplying,\n documentCount,\n passageCount,\n labels,\n}: ApplyLabelDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_APPLY_LABEL_DIALOG_LABELS, ...labels }), [labels])\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{l.title}</DialogTitle>\n <DialogDescription>{l.description(documentCount, passageCount)}</DialogDescription>\n </DialogHeader>\n <div className=\"py-2\">\n <Input\n value={name}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder={l.placeholder}\n aria-label={l.placeholder}\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter' && name.trim()) onApply(name)\n }}\n />\n </div>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n {l.cancel}\n </Button>\n <Button onClick={() => onApply(name)} disabled={isApplying || !name.trim()}>\n {isApplying && <Loader2 className=\"mr-2 size-4 animate-spin\" />}\n {l.apply}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\n/** Small outlined \"Apply label\" button used inside the totals sentence. */\nexport function ApplyLabelButton({\n onClick,\n label = 'Apply label',\n testId = 'smart-search-apply-label-button',\n}: {\n onClick: () => void\n label?: string\n testId?: string\n}) {\n return (\n <Button\n onClick={onClick}\n size=\"sm\"\n variant=\"outline\"\n className=\"h-6 px-2 text-sm font-normal pointer-coarse:h-11\"\n data-testid={testId}\n >\n <TagIcon className=\"mr-1 size-3\" />\n {label}\n </Button>\n )\n}\n","import { Fragment, type ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { stripMarkdownLinks } from './highlight'\n\nexport interface HighlightProps {\n /** Text to render; markdown links are flattened to their label first. */\n text: string\n /** Terms to mark (case-insensitive, matched literally). Blank terms are ignored. */\n terms: string[]\n /** Class for each `<mark>`. */\n markClassName?: string\n className?: string\n}\n\n/** Split `text` into plain and matching runs. Exported for hosts that render their own marks. */\nexport function splitByTerms(text: string, terms: string[]): { text: string; match: boolean }[] {\n const escaped = terms\n .map((t) => t.trim())\n .filter(Boolean)\n .map((t) => t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n if (escaped.length === 0) return [{ text, match: false }]\n const re = new RegExp(`(${escaped.join('|')})`, 'gi')\n // split() with one capture group alternates plain, match, plain, ...\n return text\n .split(re)\n .map((part, i) => ({ text: part, match: i % 2 === 1 }))\n .filter((run) => run.text !== '')\n}\n\n/**\n * Plain-text snippet with the query terms wrapped in `<mark>`. Built from React nodes (no\n * `dangerouslySetInnerHTML`, no markdown pipeline), so it is safe for untrusted text: a use for\n * `SearchHit.renderSnippet` when the host does not render markdown.\n */\nexport function Highlight({ text, terms, markClassName, className }: HighlightProps): ReactNode {\n const runs = splitByTerms(stripMarkdownLinks(text), terms)\n return (\n <span className={className} data-slot=\"highlight\">\n {runs.map((run, i) =>\n run.match ? (\n <mark key={i} className={cn('rounded-sm bg-yellow-bg text-inherit', markClassName)}>\n {run.text}\n </mark>\n ) : (\n <Fragment key={i}>{run.text}</Fragment>\n )\n )}\n </span>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tags/definitions.ts","../src/tags/ooxml.ts"],"names":["sharedTermKey","sharedParseDefinition"],"mappings":"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","file":"chunk-QXMR5YHC.js","sourcesContent":["/**\n * Defined terms. A definition is an ordinary fact carrying the workspace's \"Definitions\" label; its\n * TERM is read from the start of its text — `\"Shares\" means …`, `**Business Day** shall mean …`,\n * `Completion: the date …` — and facts defining the same term (one per agreement, say) are grouped,\n * a confirmed one preferred over the rest, then the most recent. Pure helpers, no React: the Word\n * editor inserts terms with them and the Tags page prints the glossary with them.\n */\n\nimport {\n compareTerms,\n parseDefinition as sharedParseDefinition,\n termKey as sharedTermKey,\n type ParsedDefinition,\n} from '@arbidocs/coedit/commands'\nimport { decodeWhitespaceEntities } from '../facts/fact-text'\n\n// Shared with the Word-editor commands (and the collaboration service).\nexport {\n DEFINITION_BOOKMARK_PREFIX,\n compareTerms,\n definitionBookmark,\n definitionIdOfBookmark,\n type ParsedDefinition,\n} from '@arbidocs/coedit/commands'\n\n/** The label that marks a fact as a definition. */\nexport const DEFINITIONS_LABEL = 'Definitions'\n\n/** A label on a definition other than {@link DEFINITIONS_LABEL} (e.g. the agreement it is from). */\nexport interface DefinitionLabel {\n id: string\n name: string\n}\n\n/** A definition fact, as the host reads it. */\nexport interface DefinitionSource {\n /** The fact's id (`fct-…`). */\n id: string\n /** The fact text, as written (it may be Markdown). */\n text: string\n /** A human vouched for it: preferred over unconfirmed definitions of the same term. */\n confirmed?: boolean\n /** ISO time it was last written; the most recent wins between equals. */\n updatedAt?: string\n /** Where it comes from: the cited document's name. */\n source?: string\n /** Its other labels, e.g. the agreement (\"SPA\") it defines a term of. */\n labels?: DefinitionLabel[]\n}\n\n/** A parsed definition fact. */\nexport interface Definition extends DefinitionSource, ParsedDefinition {\n /** The term's matching key (case and whitespace folded). */\n key: string\n}\n\n/** Every definition of one term, the preferred one first. */\nexport interface DefinedTermGroup {\n key: string\n /** The term as the preferred definition writes it. */\n term: string\n /** The preferred definition (first of {@link DefinedTermGroup.definitions}). */\n preferred: Definition\n definitions: Definition[]\n}\n\n/** The matching key of a term: case and whitespace folded, quotes and emphasis dropped. */\nexport function termKey(term: string): string {\n return sharedTermKey(decodeWhitespaceEntities(term))\n}\n\n/**\n * Read a definition's term from the start of its text, or `null` when it does not start with one\n * (see `parseDefinition` in `@arbidocs/coedit/commands`); entity-encoded whitespace is decoded first.\n */\nexport function parseDefinition(text: string): ParsedDefinition | null {\n return sharedParseDefinition(decodeWhitespaceEntities(text))\n}\n\n/** A definition parsed, or `null` when its text names no term. */\nexport function toDefinition(source: DefinitionSource): Definition | null {\n const parsed = parseDefinition(source.text)\n return parsed ? { ...source, ...parsed, key: termKey(parsed.term) } : null\n}\n\nconst time = (iso?: string) => (iso ? Date.parse(iso) || 0 : 0)\n\n/** Preferred first: confirmed, then most recently written, then by id (stable). */\nexport function compareDefinitions(a: DefinitionSource, b: DefinitionSource): number {\n return (\n Number(!!b.confirmed) - Number(!!a.confirmed) ||\n time(b.updatedAt) - time(a.updatedAt) ||\n a.id.localeCompare(b.id)\n )\n}\n\n/**\n * Definitions grouped by term, alphabetically, each group's preferred definition first. Facts whose\n * text names no term are returned apart (`unparsed`), so a host can say how many it could not read.\n * With `labelId`, only definitions carrying that label (one agreement's, say) are kept.\n */\nexport function groupDefinitions(\n sources: readonly DefinitionSource[],\n options: { labelId?: string | null } = {}\n): { groups: DefinedTermGroup[]; unparsed: DefinitionSource[] } {\n const byKey = new Map<string, Definition[]>()\n const unparsed: DefinitionSource[] = []\n for (const source of sources) {\n if (options.labelId && !source.labels?.some((l) => l.id === options.labelId)) continue\n const definition = toDefinition(source)\n if (!definition) {\n unparsed.push(source)\n continue\n }\n const list = byKey.get(definition.key) ?? []\n list.push(definition)\n byKey.set(definition.key, list)\n }\n const groups = [...byKey.entries()].map(([key, list]) => {\n const definitions = [...list].sort(compareDefinitions)\n return { key, term: definitions[0].term, preferred: definitions[0], definitions }\n })\n groups.sort((a, b) => compareTerms(a.term, b.term))\n return { groups, unparsed }\n}\n\n/** The labels (agreements) definitions carry besides the Definitions label, by name. */\nexport function definitionLabels(sources: readonly DefinitionSource[]): DefinitionLabel[] {\n const byId = new Map<string, DefinitionLabel>()\n for (const s of sources) for (const l of s.labels ?? []) byId.set(l.id, l)\n return [...byId.values()].sort((a, b) => compareTerms(a.name, b.name))\n}\n\n/** Groups whose term matches a typed query: prefix matches first, then any word, then anywhere. */\nexport function filterTermGroups(\n groups: readonly DefinedTermGroup[],\n query: string\n): DefinedTermGroup[] {\n const q = termKey(query)\n if (!q) return [...groups]\n const rank = (g: DefinedTermGroup) =>\n g.key.startsWith(q) ? 0 : g.key.split(' ').some((w) => w.startsWith(q)) ? 1 : 2\n return groups\n .filter((g) => g.key.includes(q))\n .map((g) => ({ g, r: rank(g) }))\n .sort((a, b) => a.r - b.r || compareTerms(a.g.term, b.g.term))\n .map(({ g }) => g)\n}\n","/**\n * The small WordprocessingML vocabulary the tags exports write: escaped runs, paragraphs, table\n * cells, an A4 page, and the minimal package around a `word/document.xml`. Zipped with `fflate`, so\n * the result opens in the native Word editor and in Word without pulling the editor engine in.\n */\n\nimport { esc, stylesXml } from '@arbidocs/coedit/commands'\n\n// Shared with the Word-editor commands (and the collaboration service).\nexport {\n W_NAMESPACES,\n docxPackage,\n documentXml,\n esc,\n hyperlinkRelationship,\n stylesXml,\n} from '@arbidocs/coedit/commands'\n\nexport const DOCX_MIME_TYPE =\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n\nexport interface Run {\n text: string\n bold?: boolean\n italic?: boolean\n muted?: boolean\n}\n\nexport const run = ({ text, bold, italic, muted }: Run) => {\n const props = [bold && '<w:b/>', italic && '<w:i/>', muted && '<w:color w:val=\"595959\"/>']\n .filter(Boolean)\n .join('')\n // Line breaks inside a value become Word line breaks rather than being lost.\n const body = text\n .split(/\\r?\\n/)\n .map((line) => `<w:t xml:space=\"preserve\">${esc(line)}</w:t>`)\n .join('<w:br/>')\n return `<w:r>${props ? `<w:rPr>${props}</w:rPr>` : ''}${body}</w:r>`\n}\n\nexport const paragraph = (runs: Run[], style?: string) =>\n `<w:p>${style ? `<w:pPr><w:pStyle w:val=\"${style}\"/></w:pPr>` : ''}${runs.map(run).join('')}</w:p>`\n\n/** A table cell: its paragraphs (a cell must hold at least one), shaded when given a fill. */\nexport const cell = (paragraphs: string[], width: number, fill?: string) =>\n `<w:tc><w:tcPr><w:tcW w:w=\"${width}\" w:type=\"dxa\"/>${\n fill ? `<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${fill}\"/>` : ''\n }</w:tcPr>${paragraphs.length ? paragraphs.join('') : '<w:p/>'}</w:tc>`\n\n/** Page geometry in twips (A4), turned for landscape. */\nexport function page(landscape: boolean) {\n const [short, long] = [11906, 16838]\n const margin = landscape ? 1080 : 1440\n const width = landscape ? long : short\n return {\n margin,\n textWidth: width - 2 * margin,\n sectPr: `<w:sectPr><w:pgSz w:w=\"${landscape ? long : short}\" w:h=\"${landscape ? short : long}\"${\n landscape ? ' w:orient=\"landscape\"' : ''\n }/><w:pgMar w:top=\"${margin}\" w:right=\"${margin}\" w:bottom=\"${margin}\" w:left=\"${margin}\" w:header=\"708\" w:footer=\"708\" w:gutter=\"0\"/></w:sectPr>`,\n }\n}\n\n/** `YYYY-MM-DD HH:MM` (UTC) of an ISO time, for a \"taken at\" line. */\nexport const minuteUtc = (at: string) => new Date(at).toISOString().slice(0, 16).replace('T', ' ')\n\n/** Calibri 11pt (en-GB), 8pt after each paragraph: the document defaults the exports share. */\nexport const DOC_DEFAULTS = `<w:docDefaults><w:rPrDefault><w:rPr><w:rFonts w:ascii=\"Calibri\" w:hAnsi=\"Calibri\" w:eastAsia=\"Calibri\" w:cs=\"Calibri\"/><w:sz w:val=\"22\"/><w:szCs w:val=\"22\"/><w:lang w:val=\"en-GB\"/></w:rPr></w:rPrDefault><w:pPrDefault><w:pPr><w:spacing w:after=\"160\" w:line=\"259\" w:lineRule=\"auto\"/></w:pPr></w:pPrDefault></w:docDefaults>`\n\n/**\n * Styles of a document that is a title and a table: `Title`, the compact `TagTableCell` paragraph\n * and the bordered `TagTableGrid` table.\n */\nexport const TABLE_DOCUMENT_STYLES = stylesXml(\n DOC_DEFAULTS,\n `<w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\"><w:name w:val=\"Normal\"/><w:qFormat/></w:style><w:style w:type=\"paragraph\" w:styleId=\"Title\"><w:name w:val=\"Title\"/><w:basedOn w:val=\"Normal\"/><w:next w:val=\"Normal\"/><w:qFormat/><w:pPr><w:spacing w:after=\"80\" w:line=\"240\" w:lineRule=\"auto\"/></w:pPr><w:rPr><w:sz w:val=\"48\"/><w:szCs w:val=\"48\"/></w:rPr></w:style><w:style w:type=\"paragraph\" w:customStyle=\"1\" w:styleId=\"TagTableCell\"><w:name w:val=\"Tag Table Cell\"/><w:basedOn w:val=\"Normal\"/><w:qFormat/><w:pPr><w:spacing w:after=\"40\" w:line=\"240\" w:lineRule=\"auto\"/></w:pPr><w:rPr><w:sz w:val=\"18\"/><w:szCs w:val=\"18\"/></w:rPr></w:style><w:style w:type=\"table\" w:default=\"1\" w:styleId=\"TableNormal\"><w:name w:val=\"Normal Table\"/><w:tblPr><w:tblInd w:w=\"0\" w:type=\"dxa\"/><w:tblCellMar><w:top w:w=\"0\" w:type=\"dxa\"/><w:left w:w=\"108\" w:type=\"dxa\"/><w:bottom w:w=\"0\" w:type=\"dxa\"/><w:right w:w=\"108\" w:type=\"dxa\"/></w:tblCellMar></w:tblPr></w:style><w:style w:type=\"table\" w:customStyle=\"1\" w:styleId=\"TagTableGrid\"><w:name w:val=\"Tag Table\"/><w:basedOn w:val=\"TableNormal\"/><w:tblPr><w:tblBorders><w:top w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"BFBFBF\"/><w:left w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"BFBFBF\"/><w:bottom w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"BFBFBF\"/><w:right w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"BFBFBF\"/><w:insideH w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"BFBFBF\"/><w:insideV w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"BFBFBF\"/></w:tblBorders><w:tblCellMar><w:top w:w=\"60\" w:type=\"dxa\"/><w:left w:w=\"100\" w:type=\"dxa\"/><w:bottom w:w=\"60\" w:type=\"dxa\"/><w:right w:w=\"100\" w:type=\"dxa\"/></w:tblCellMar></w:tblPr></w:style>`\n)\n"]}
|
package/dist/chunk-RFXJYIDV.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { memo } from 'react';
|
|
3
|
-
import { Ban, Plus, Pencil } from 'lucide-react';
|
|
4
|
-
import { cn } from '@arbidocs/react/ui';
|
|
5
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
-
|
|
7
|
-
// src/files/cells/HoverIconCell.tsx
|
|
8
|
-
var ICONS = { pencil: Pencil, plus: Plus, blocked: Ban };
|
|
9
|
-
function CellHoverIcon({
|
|
10
|
-
kind = "pencil",
|
|
11
|
-
className
|
|
12
|
-
}) {
|
|
13
|
-
const Icon = ICONS[kind];
|
|
14
|
-
return /* @__PURE__ */ jsx(
|
|
15
|
-
"span",
|
|
16
|
-
{
|
|
17
|
-
"data-slot": "cell-hover-icon",
|
|
18
|
-
"data-kind": kind,
|
|
19
|
-
"aria-hidden": true,
|
|
20
|
-
className: cn(
|
|
21
|
-
"inline-flex shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-70 group-focus-within:opacity-70 pointer-coarse:opacity-70",
|
|
22
|
-
className
|
|
23
|
-
),
|
|
24
|
-
children: /* @__PURE__ */ jsx(Icon, { className: "size-3.5" })
|
|
25
|
-
}
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
var HoverIconCell = memo(function HoverIconCell2({
|
|
29
|
-
content,
|
|
30
|
-
isEditable,
|
|
31
|
-
showIcon = true,
|
|
32
|
-
icon = "pencil",
|
|
33
|
-
className
|
|
34
|
-
}) {
|
|
35
|
-
return /* @__PURE__ */ jsxs(
|
|
36
|
-
"div",
|
|
37
|
-
{
|
|
38
|
-
"data-slot": "hover-icon-cell",
|
|
39
|
-
className: cn("group flex h-full w-full items-center gap-2 pr-2", className),
|
|
40
|
-
children: [
|
|
41
|
-
content,
|
|
42
|
-
showIcon && /* @__PURE__ */ jsx(CellHoverIcon, { kind: isEditable ? icon : "blocked" })
|
|
43
|
-
]
|
|
44
|
-
}
|
|
45
|
-
);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
export { CellHoverIcon, HoverIconCell };
|
|
49
|
-
//# sourceMappingURL=chunk-RFXJYIDV.js.map
|
|
50
|
-
//# sourceMappingURL=chunk-RFXJYIDV.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/files/cells/HoverIconCell.tsx"],"names":["HoverIconCell"],"mappings":";;;;;;AAMA,IAAM,QAAQ,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,IAAA,EAAM,SAAS,GAAA,EAAI;AAOlD,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA,GAAO,QAAA;AAAA,EACP;AACF,CAAA,EAGG;AACD,EAAA,MAAM,IAAA,GAAO,MAAM,IAAI,CAAA;AACvB,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,EAAA;AAAA,QACT,wJAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,GAC7B;AAEJ;AAYO,IAAM,aAAA,GAAgB,IAAA,CAAK,SAASA,cAAAA,CAAc;AAAA,EACvD,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,IAAA,GAAO,QAAA;AAAA,EACP;AACF,CAAA,EAAuB;AACrB,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,kDAAA,EAAoD,SAAS,CAAA;AAAA,MAE1E,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QACA,4BAAY,GAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAM,UAAA,GAAa,OAAO,SAAA,EAAW;AAAA;AAAA;AAAA,GACnE;AAEJ,CAAC","file":"chunk-RFXJYIDV.js","sourcesContent":["import { memo, type ReactNode } from 'react'\nimport { Ban, Pencil, Plus } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport type CellHoverIconKind = 'pencil' | 'plus' | 'blocked'\n\nconst ICONS = { pencil: Pencil, plus: Plus, blocked: Ban } as const\n\n/**\n * Edit hint of a grid cell. It appears on pointer hover, on keyboard focus anywhere inside the\n * cell and always on touch devices (coarse pointer), where there is no hover to reveal it.\n * Place it inside an element carrying the `group` class.\n */\nexport function CellHoverIcon({\n kind = 'pencil',\n className,\n}: {\n kind?: CellHoverIconKind\n className?: string\n}) {\n const Icon = ICONS[kind]\n return (\n <span\n data-slot=\"cell-hover-icon\"\n data-kind={kind}\n aria-hidden\n className={cn(\n 'inline-flex shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-70 group-focus-within:opacity-70 pointer-coarse:opacity-70',\n className\n )}\n >\n <Icon className=\"size-3.5\" />\n </span>\n )\n}\n\nexport interface HoverIconCellProps {\n content: ReactNode\n /** Non-members get a \"blocked\" hint instead of the edit hint. */\n isEditable: boolean\n showIcon?: boolean\n icon?: Exclude<CellHoverIconKind, 'blocked'>\n className?: string\n}\n\n/** A cell's content with the edit hint after it (pure CSS reveal: no re-render on mouse move). */\nexport const HoverIconCell = memo(function HoverIconCell({\n content,\n isEditable,\n showIcon = true,\n icon = 'pencil',\n className,\n}: HoverIconCellProps) {\n return (\n <div\n data-slot=\"hover-icon-cell\"\n className={cn('group flex h-full w-full items-center gap-2 pr-2', className)}\n >\n {content}\n {showIcon && <CellHoverIcon kind={isEditable ? icon : 'blocked'} />}\n </div>\n )\n})\n"]}
|