@arbidocs/blocks 0.5.20 → 0.5.21
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-KUDFJ3GG.js → ConnectedNativeDocxComparison-4X7H57LE.js} +9 -9
- package/dist/{ConnectedStreamedWordArtifact-JD2XZCYP.js.map → ConnectedNativeDocxComparison-4X7H57LE.js.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-FUNR66KP.cjs → ConnectedNativeDocxComparison-7WTVHEKI.cjs} +10 -10
- package/dist/{ConnectedNativeDocxComparison-FUNR66KP.cjs.map → ConnectedNativeDocxComparison-7WTVHEKI.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-G6R3SFZ3.js → ConnectedNativeDocxEditor-I6RQUSR3.js} +7 -7
- package/dist/{ConnectedNativeDocxEditor-G6R3SFZ3.js.map → ConnectedNativeDocxEditor-I6RQUSR3.js.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-XVCAXAAU.cjs → ConnectedNativeDocxEditor-PZ2ASQO3.cjs} +9 -9
- package/dist/{ConnectedNativeDocxEditor-XVCAXAAU.cjs.map → ConnectedNativeDocxEditor-PZ2ASQO3.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-JD2XZCYP.js → ConnectedStreamedWordArtifact-KCYSJ3B2.js} +9 -9
- package/dist/{ConnectedNativeDocxComparison-KUDFJ3GG.js.map → ConnectedStreamedWordArtifact-KCYSJ3B2.js.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-P55WP3MC.cjs → ConnectedStreamedWordArtifact-Q5KC4W7O.cjs} +10 -10
- package/dist/ConnectedStreamedWordArtifact-Q5KC4W7O.cjs.map +1 -0
- package/dist/{NativeDocxEditor-6O7UMP7Y.cjs → NativeDocxEditor-JUTTA46L.cjs} +8 -8
- package/dist/{NativeDocxEditor-6O7UMP7Y.cjs.map → NativeDocxEditor-JUTTA46L.cjs.map} +1 -1
- package/dist/{NativeDocxEditor-MHO7LF4E.js → NativeDocxEditor-PSC3JWWA.js} +4 -4
- package/dist/{NativeDocxEditor-MHO7LF4E.js.map → NativeDocxEditor-PSC3JWWA.js.map} +1 -1
- package/dist/{WorkspaceTableView-UR3WLSJG.cjs → WorkspaceTableView-6JVHGDUB.cjs} +8 -8
- package/dist/{WorkspaceTableView-UR3WLSJG.cjs.map → WorkspaceTableView-6JVHGDUB.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-TNUEU6OO.js → WorkspaceTableView-ECPHGWHF.js} +6 -6
- package/dist/{WorkspaceTableView-TNUEU6OO.js.map → WorkspaceTableView-ECPHGWHF.js.map} +1 -1
- package/dist/agents/index.cjs +326 -326
- package/dist/agents/index.js +4 -4
- package/dist/auth/index.cjs +44 -44
- package/dist/auth/index.js +2 -2
- package/dist/auth0/index.cjs +4 -3
- package/dist/auth0/index.cjs.map +1 -1
- package/dist/auth0/index.js +4 -3
- package/dist/auth0/index.js.map +1 -1
- package/dist/{chunk-BQNDBWLB.js → chunk-4ML5AMMO.js} +3 -3
- package/dist/{chunk-BQNDBWLB.js.map → chunk-4ML5AMMO.js.map} +1 -1
- package/dist/{chunk-ODFDMORE.cjs → chunk-4S34OHJX.cjs} +4 -4
- package/dist/{chunk-ODFDMORE.cjs.map → chunk-4S34OHJX.cjs.map} +1 -1
- package/dist/{chunk-QS3AJ3FT.cjs → chunk-5H37UWWS.cjs} +5 -5
- package/dist/{chunk-QS3AJ3FT.cjs.map → chunk-5H37UWWS.cjs.map} +1 -1
- package/dist/{chunk-2FQ4CMRY.cjs → chunk-5ZU2XYXO.cjs} +278 -4
- package/dist/chunk-5ZU2XYXO.cjs.map +1 -0
- package/dist/{chunk-JS7KJRKG.js → chunk-75Z5AUMM.js} +3 -3
- package/dist/{chunk-JS7KJRKG.js.map → chunk-75Z5AUMM.js.map} +1 -1
- package/dist/chunk-BITGO5LI.cjs +18 -0
- package/dist/{chunk-WDCD3OZH.cjs.map → chunk-BITGO5LI.cjs.map} +1 -1
- package/dist/{chunk-E2SKI6VO.js → chunk-D3BHUDOU.js} +3 -3
- package/dist/{chunk-E2SKI6VO.js.map → chunk-D3BHUDOU.js.map} +1 -1
- package/dist/{chunk-WJZK5GAV.js → chunk-DTENNALR.js} +3 -3
- package/dist/{chunk-WJZK5GAV.js.map → chunk-DTENNALR.js.map} +1 -1
- package/dist/{chunk-P5RZPEHW.cjs → chunk-F2BYURQZ.cjs} +5 -5
- package/dist/{chunk-P5RZPEHW.cjs.map → chunk-F2BYURQZ.cjs.map} +1 -1
- package/dist/{chunk-HNGGKANF.js → chunk-F6LC2CRB.js} +5 -5
- package/dist/{chunk-HNGGKANF.js.map → chunk-F6LC2CRB.js.map} +1 -1
- package/dist/{chunk-MBRUUST5.js → chunk-F7IQGPZH.js} +4 -4
- package/dist/{chunk-MBRUUST5.js.map → chunk-F7IQGPZH.js.map} +1 -1
- package/dist/{chunk-X2SQZY7U.js → chunk-FERNQVSH.js} +274 -8
- package/dist/chunk-FERNQVSH.js.map +1 -0
- package/dist/{chunk-KBSKN3NF.cjs → chunk-FQIJICZE.cjs} +9 -9
- package/dist/{chunk-KBSKN3NF.cjs.map → chunk-FQIJICZE.cjs.map} +1 -1
- package/dist/{chunk-SSJLYCX7.cjs → chunk-FV32BTXV.cjs} +84 -56
- package/dist/chunk-FV32BTXV.cjs.map +1 -0
- package/dist/{chunk-2YZ35KKK.cjs → chunk-FZVAJFRH.cjs} +80 -84
- package/dist/chunk-FZVAJFRH.cjs.map +1 -0
- package/dist/{chunk-HHJALHRS.js → chunk-H5XHCIWY.js} +83 -55
- package/dist/chunk-H5XHCIWY.js.map +1 -0
- package/dist/{chunk-TBNXJHTP.js → chunk-IA5BYEO7.js} +7 -5
- package/dist/chunk-IA5BYEO7.js.map +1 -0
- package/dist/{chunk-NFTANEP6.cjs → chunk-IJQ5DIZT.cjs} +5 -5
- package/dist/{chunk-NFTANEP6.cjs.map → chunk-IJQ5DIZT.cjs.map} +1 -1
- package/dist/{chunk-NMZI3K6R.cjs → chunk-IRY63R4L.cjs} +16 -2
- package/dist/chunk-IRY63R4L.cjs.map +1 -0
- package/dist/{chunk-MVP7METT.js → chunk-IXBJEQH5.js} +4 -80
- package/dist/chunk-IXBJEQH5.js.map +1 -0
- package/dist/{chunk-PAKPD3LB.js → chunk-JKJI5SRF.js} +3 -3
- package/dist/{chunk-PAKPD3LB.js.map → chunk-JKJI5SRF.js.map} +1 -1
- package/dist/{chunk-EWRRV37Z.cjs → chunk-K237IYOD.cjs} +2 -80
- package/dist/chunk-K237IYOD.cjs.map +1 -0
- package/dist/chunk-KL6XOSEN.js +156 -0
- package/dist/chunk-KL6XOSEN.js.map +1 -0
- package/dist/{chunk-TRDY3ZT7.js → chunk-LU23I2HS.js} +3 -3
- package/dist/{chunk-TRDY3ZT7.js.map → chunk-LU23I2HS.js.map} +1 -1
- package/dist/{chunk-SAYEQE5R.cjs → chunk-MJT7KHHT.cjs} +48 -48
- package/dist/{chunk-SAYEQE5R.cjs.map → chunk-MJT7KHHT.cjs.map} +1 -1
- package/dist/chunk-MSCDYRSA.cjs +18 -0
- package/dist/{chunk-JPNFVDH4.cjs.map → chunk-MSCDYRSA.cjs.map} +1 -1
- package/dist/chunk-MSPNYW6Z.cjs +165 -0
- package/dist/chunk-MSPNYW6Z.cjs.map +1 -0
- package/dist/{chunk-2R3GGNPA.js → chunk-MZA7GMOH.js} +16 -3
- package/dist/chunk-MZA7GMOH.js.map +1 -0
- package/dist/{chunk-4UGVMOTK.cjs → chunk-NML42O7Q.cjs} +4 -4
- package/dist/{chunk-4UGVMOTK.cjs.map → chunk-NML42O7Q.cjs.map} +1 -1
- package/dist/{chunk-YKGZG353.js → chunk-NVRJ6WTR.js} +3 -3
- package/dist/{chunk-YKGZG353.js.map → chunk-NVRJ6WTR.js.map} +1 -1
- package/dist/{chunk-ZW4QFL3Y.cjs → chunk-PFVCOUU6.cjs} +13 -13
- package/dist/{chunk-ZW4QFL3Y.cjs.map → chunk-PFVCOUU6.cjs.map} +1 -1
- package/dist/{chunk-QLLV5UUI.cjs → chunk-PSIKUQYM.cjs} +5 -5
- package/dist/{chunk-QLLV5UUI.cjs.map → chunk-PSIKUQYM.cjs.map} +1 -1
- package/dist/{chunk-R53JJZNW.js → chunk-RVKVGS72.js} +76 -79
- package/dist/chunk-RVKVGS72.js.map +1 -0
- package/dist/{chunk-H32DV7XS.cjs → chunk-UAEYU2NN.cjs} +136 -2
- package/dist/chunk-UAEYU2NN.cjs.map +1 -0
- package/dist/{chunk-USZ32EKR.js → chunk-VFZLZSJ3.js} +4 -4
- package/dist/{chunk-USZ32EKR.js.map → chunk-VFZLZSJ3.js.map} +1 -1
- package/dist/{chunk-XRL4R2TT.js → chunk-WZ63HE2C.js} +136 -4
- package/dist/chunk-WZ63HE2C.js.map +1 -0
- package/dist/{chunk-F72ZD5Q2.cjs → chunk-YD3RN2FY.cjs} +3 -3
- package/dist/{chunk-F72ZD5Q2.cjs.map → chunk-YD3RN2FY.cjs.map} +1 -1
- package/dist/{chunk-VYFRW6NN.cjs → chunk-YRHQ7OLG.cjs} +3 -3
- package/dist/{chunk-VYFRW6NN.cjs.map → chunk-YRHQ7OLG.cjs.map} +1 -1
- package/dist/{chunk-PYJUIEYV.js → chunk-YT5OOFK3.js} +3 -3
- package/dist/{chunk-PYJUIEYV.js.map → chunk-YT5OOFK3.js.map} +1 -1
- package/dist/{chunk-XCL6ZCI5.js → chunk-Z6CAKLA5.js} +3 -3
- package/dist/{chunk-XCL6ZCI5.js.map → chunk-Z6CAKLA5.js.map} +1 -1
- package/dist/{chunk-RAYCOBF7.cjs → chunk-ZESMRGDV.cjs} +7 -5
- package/dist/chunk-ZESMRGDV.cjs.map +1 -0
- package/dist/{chunk-6FWUZGPF.js → chunk-ZMYK7XTS.js} +4 -4
- package/dist/{chunk-6FWUZGPF.js.map → chunk-ZMYK7XTS.js.map} +1 -1
- package/dist/connect/docx.cjs +13 -13
- package/dist/connect/docx.js +9 -9
- package/dist/connect/index.cjs +1138 -906
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +1 -0
- package/dist/connect/index.js +480 -249
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +17 -17
- package/dist/connect/viewer.js +6 -6
- package/dist/connection/ConnectedAccountAccessBadge.d.ts +1 -0
- package/dist/connection/ConnectedSettings.d.ts +6 -2
- package/dist/connection/ConnectedSsoDisconnect.d.ts +2 -0
- package/dist/connection/auth/support.d.ts +1 -0
- package/dist/connection/auth/useLoginActions.d.ts +1 -1
- package/dist/connection/settings-page/ConnectedAccountSettings.d.ts +5 -1
- package/dist/document-tools/AdoptSignatureDialog.d.ts +3 -1
- package/dist/document-tools/index.cjs +20 -20
- package/dist/document-tools/index.js +3 -3
- package/dist/document-tools/viewer/index.cjs +10 -10
- package/dist/document-tools/viewer/index.js +3 -3
- package/dist/docx/index.cjs +51 -51
- package/dist/docx/index.js +4 -4
- package/dist/facts/index.cjs +55 -55
- package/dist/facts/index.js +3 -3
- package/dist/home/index.cjs +15 -16
- package/dist/home/index.cjs.map +1 -1
- package/dist/home/index.js +1 -2
- package/dist/home/index.js.map +1 -1
- package/dist/index.cjs +425 -425
- package/dist/index.js +7 -7
- package/dist/settings/IdentityVerification.d.ts +3 -1
- package/dist/settings/ProfileCard.d.ts +3 -1
- package/dist/settings/SettingsPanel.d.ts +6 -0
- package/dist/settings/SubscriptionParts.d.ts +0 -11
- package/dist/settings/index.cjs +162 -166
- package/dist/settings/index.d.ts +1 -1
- package/dist/settings/index.js +3 -3
- package/dist/workflow-canvas/index.cjs +17 -17
- package/dist/workflow-canvas/index.js +4 -4
- package/dist/workspaces/WorkspaceFormParts.d.ts +10 -2
- package/dist/workspaces/index.cjs +52 -287
- package/dist/workspaces/index.cjs.map +1 -1
- package/dist/workspaces/index.js +9 -268
- package/dist/workspaces/index.js.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ConnectedStreamedWordArtifact-P55WP3MC.cjs.map +0 -1
- package/dist/chunk-2FQ4CMRY.cjs.map +0 -1
- package/dist/chunk-2R3GGNPA.js.map +0 -1
- package/dist/chunk-2YZ35KKK.cjs.map +0 -1
- package/dist/chunk-5TDGVOR5.js +0 -142
- package/dist/chunk-5TDGVOR5.js.map +0 -1
- package/dist/chunk-6AXJBTHM.js +0 -77
- package/dist/chunk-6AXJBTHM.js.map +0 -1
- package/dist/chunk-EWRRV37Z.cjs.map +0 -1
- package/dist/chunk-H32DV7XS.cjs.map +0 -1
- package/dist/chunk-HHJALHRS.js.map +0 -1
- package/dist/chunk-JPNFVDH4.cjs +0 -18
- package/dist/chunk-MKNSIZWR.cjs +0 -84
- package/dist/chunk-MKNSIZWR.cjs.map +0 -1
- package/dist/chunk-MVP7METT.js.map +0 -1
- package/dist/chunk-NMZI3K6R.cjs.map +0 -1
- package/dist/chunk-R53JJZNW.js.map +0 -1
- package/dist/chunk-RAYCOBF7.cjs.map +0 -1
- package/dist/chunk-REH7PX3N.cjs +0 -145
- package/dist/chunk-REH7PX3N.cjs.map +0 -1
- package/dist/chunk-SSJLYCX7.cjs.map +0 -1
- package/dist/chunk-TBNXJHTP.js.map +0 -1
- package/dist/chunk-WDCD3OZH.cjs +0 -18
- package/dist/chunk-X2SQZY7U.js.map +0 -1
- package/dist/chunk-XRL4R2TT.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/document-tools/DocumentToolButtons.tsx","../src/document-tools/MarkupNotices.tsx","../src/document-tools/MarkupViewNote.tsx","../src/document-tools/VersionSnapshotBar.tsx","../src/document-tools/PlaceMySignatureButton.tsx","../src/document-tools/SavedSignatureSettings.tsx","../src/document-tools/SignatureRequestBanner.tsx","../src/document-tools/FileShareDialog.tsx"],"names":["jsxs","jsx","LINK","Fragment","Button","useDocumentTools","useState","INFORMAL_SIGNATURE_NOTE","PenLine"],"mappings":"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","file":"chunk-HHJALHRS.js","sourcesContent":["/**\n * The viewer-header buttons of the PDF document tools: Annotate, Show original, Download with\n * markup and Sign. Separate parts so a host can place them among its own header actions. On a\n * narrow (`compact`) header each is icon-only; its accessible name stays.\n */\n\nimport type { ReactElement } from 'react'\nimport { Download, FileText, PenLine, PencilLine, Users } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\n\nconst TOUCH = 'pointer-coarse:min-h-11'\n\ninterface ToggleProps {\n /** On (pressed). */\n active: boolean\n onClick: () => void\n compact?: boolean\n}\n\n/** Annotate mode: highlight, comment, stamp, redact. */\nexport function AnnotateButton({ active, onClick, compact }: ToggleProps): ReactElement {\n return (\n <Button\n type=\"button\"\n variant={active ? 'default' : 'outline'}\n size={compact ? 'icon' : 'sm'}\n aria-pressed={active}\n title=\"Annotate: highlight, comment, stamp, redact\"\n aria-label=\"Annotate\"\n data-testid=\"annotate-toggle\"\n className={TOUCH}\n onClick={onClick}\n >\n <PencilLine className=\"size-4\" />\n {!compact && <span className=\"ml-1\">Annotate</span>}\n </Button>\n )\n}\n\n/** The markup is the default view of a marked-up PDF; this shows the untouched file. */\nexport function ShowOriginalButton({ active, onClick, compact }: ToggleProps): ReactElement {\n return (\n <Button\n type=\"button\"\n variant={active ? 'default' : 'outline'}\n size={compact ? 'icon' : 'sm'}\n aria-pressed={active}\n title={active ? 'Show the markup again' : 'Show the original, without markup'}\n aria-label=\"Show original\"\n data-testid=\"markup-show-original\"\n className={TOUCH}\n onClick={onClick}\n >\n <FileText className=\"size-4\" />\n {!compact && <span className=\"ml-1\">Show original</span>}\n </Button>\n )\n}\n\n/**\n * \"Download with markup\": the PDF with its annotations, which Acrobat and Preview show. With a\n * `disabledReason` (a signed, locked version) it is off and says why.\n */\nexport function DownloadMarkupButton({\n onClick,\n disabledReason,\n}: {\n onClick: () => void\n disabledReason?: string\n}): ReactElement {\n const button = (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n title={\n disabledReason ??\n 'Download with markup: the PDF with its annotations (opens in Acrobat or Preview)'\n }\n aria-label=\"Download with markup\"\n aria-description={disabledReason}\n disabled={!!disabledReason}\n data-testid=\"markup-download\"\n className={TOUCH}\n onClick={onClick}\n >\n <Download className=\"size-4\" />\n </Button>\n )\n // A disabled button gets no pointer events, so the reason sits on a wrapper too.\n return disabledReason ? (\n <span title={disabledReason} className=\"inline-flex\" data-testid=\"markup-download-locked\">\n {button}\n </span>\n ) : (\n button\n )\n}\n\n/** One line where a signed version's content can be edited: an edit is a new, unsigned version. */\nexport function SignedEditNote(): ReactElement {\n return (\n <p\n className=\"border-b px-3 py-1.5 text-xs text-muted-foreground\"\n data-testid=\"signed-edit-note\"\n >\n Editing creates a new unsigned version\n </p>\n )\n}\n\n/** Sign: choose where the signature goes, then sign. */\nexport function SignButton({ active, onClick, compact }: ToggleProps): ReactElement {\n return (\n <Button\n type=\"button\"\n variant={active ? 'default' : 'outline'}\n size={compact ? 'icon' : 'sm'}\n aria-pressed={active}\n title=\"Sign document\"\n aria-label=\"Sign\"\n data-testid=\"sign-document-button\"\n className={TOUCH}\n onClick={onClick}\n >\n <PenLine className=\"size-4\" />\n {!compact && <span className=\"ml-1\">Sign</span>}\n </Button>\n )\n}\n\n/** Prepare the document for others to sign: place their fields and send it. */\nexport function RequestSignaturesButton({ active, onClick, compact }: ToggleProps): ReactElement {\n return (\n <Button\n type=\"button\"\n variant={active ? 'default' : 'outline'}\n size={compact ? 'icon' : 'sm'}\n aria-pressed={active}\n title=\"Request signatures\"\n aria-label=\"Request signatures\"\n data-testid=\"request-signatures-button\"\n className={TOUCH}\n onClick={onClick}\n >\n <Users className=\"size-4\" />\n {!compact && <span className=\"ml-1\">Request signatures</span>}\n </Button>\n )\n}\n","/**\n * The one-line notices above the PDF about its markup: annotations found in this browser from\n * before markup was saved on the server (for a shared document: add them to the shared markup, or\n * discard), and markup that sits on an older version (open it, or copy its open comments here).\n */\n\nimport type { LegacyPrompt, OlderMarkupNote } from '@arbidocs/react/document-tools'\n\nconst BAR = 'flex flex-wrap items-center justify-between gap-2 border-b px-3 py-2 text-xs'\nconst LINK =\n 'font-medium text-primary hover:underline disabled:opacity-50 disabled:no-underline pointer-coarse:min-h-11'\n\nexport interface MarkupNoticesProps {\n legacyPrompt: LegacyPrompt | null\n olderNote: OlderMarkupNote | null\n onOpenVersion: (version: number) => void\n}\n\nexport function MarkupNotices({ legacyPrompt, olderNote, onOpenVersion }: MarkupNoticesProps) {\n return (\n <>\n {legacyPrompt && (\n <div className={BAR} role=\"status\" data-testid=\"markup-migration-prompt\">\n <span>\n {legacyPrompt.count} annotation{legacyPrompt.count === 1 ? '' : 's'} on this document\n {legacyPrompt.count === 1 ? ' is' : ' are'} saved only in this browser. Add{' '}\n {legacyPrompt.count === 1 ? 'it' : 'them'} to the shared markup, where everyone with\n access sees {legacyPrompt.count === 1 ? 'it' : 'them'}?\n </span>\n <span className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n className={LINK}\n disabled={legacyPrompt.busy}\n data-testid=\"markup-migration-add\"\n onClick={legacyPrompt.add}\n >\n {legacyPrompt.busy ? 'Adding…' : 'Add to shared markup'}\n </button>\n <button\n type=\"button\"\n className={LINK}\n disabled={legacyPrompt.busy}\n data-testid=\"markup-migration-discard\"\n onClick={legacyPrompt.discard}\n >\n Discard\n </button>\n </span>\n </div>\n )}\n {olderNote && (\n <div className={BAR} data-testid=\"markup-older-version-note\">\n <span>\n The markup is on version {olderNote.version}. This version started without it.\n {olderNote.signed && (\n <span data-testid=\"markup-older-version-signed\">\n {' '}\n It is signed: comments copied here are kept beside it, and the signed PDF does not\n change.\n </span>\n )}\n </span>\n <span className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n className={LINK}\n data-testid=\"markup-open-older-version\"\n onClick={() => onOpenVersion(olderNote.version)}\n >\n Open version {olderNote.version}\n </button>\n <button\n type=\"button\"\n className={LINK}\n disabled={olderNote.busy}\n data-testid=\"markup-copy-open-threads\"\n title=\"Copy the unresolved comment threads onto this version (redactions never carry over)\"\n onClick={olderNote.copy}\n >\n {olderNote.busy ? 'Copying…' : 'Copy open comments here'}\n </button>\n </span>\n </div>\n )}\n </>\n )\n}\n","/**\n * Which view of a marked-up PDF is on screen, spelled out beside the title, with the switch to the\n * other one. The narrow header's \"Show original\" is an unlabelled page icon, so on its own it read\n * as no control at all, and nothing said whether the page showed the markup or the original.\n */\n\nimport type { ReactElement } from 'react'\nimport { ViewerStatusNote } from '../files/ViewerLayout'\n\nexport interface MarkupViewNoteProps {\n showOriginal: boolean\n onToggle: () => void\n}\n\nexport function MarkupViewNote({ showOriginal, onToggle }: MarkupViewNoteProps): ReactElement {\n return (\n <ViewerStatusNote testId=\"markup-view-note\">\n {showOriginal ? 'Original, without markup' : 'With markup'}\n {' · '}\n <button\n type=\"button\"\n className=\"font-medium text-primary hover:underline pointer-coarse:min-h-11\"\n data-testid=\"markup-view-note-toggle\"\n onClick={onToggle}\n >\n {showOriginal ? 'Show markup' : 'Show original'}\n </button>\n </ViewerStatusNote>\n )\n}\n","/**\n * The bar above an older version opened read-only: which version it is, \"Ask about this version\"\n * (when the host has an assistant) and the way back to the current version. Put it in the viewer's\n * sticky header, not the content area: a PDF view scrolls its first page into view, which would\n * scroll a bar above it out of sight.\n */\n\nimport type { ReactElement } from 'react'\n\nconst LINK = 'font-medium text-primary hover:underline pointer-coarse:min-h-11'\n\nexport interface VersionSnapshotBarLabels {\n /** `Version 2 · read only`; `number` is undefined when the version is not known. */\n title: (number: number | undefined) => string\n ask: string\n returnToCurrent: string\n /** For documents edited live (Word, artifacts), where \"current\" is the live document. */\n returnToLive: string\n}\n\nexport const DEFAULT_VERSION_SNAPSHOT_BAR_LABELS: VersionSnapshotBarLabels = {\n title: (number) => `${number ? `Version ${number}` : 'Saved version'} · read only`,\n ask: 'Ask about this version',\n returnToCurrent: 'Return to current version',\n returnToLive: 'Return to live document',\n}\n\nexport interface VersionSnapshotBarProps {\n /** The version's number, when known. */\n versionNumber?: number\n /** The document is edited live: the way back says \"live document\". */\n live?: boolean\n /** Ask the assistant about this version. Omitted: no ask action. */\n onAsk?: () => void\n onReturn: () => void\n labels?: Partial<VersionSnapshotBarLabels>\n}\n\nexport function VersionSnapshotBar({\n versionNumber,\n live = false,\n onAsk,\n onReturn,\n labels: overrides,\n}: VersionSnapshotBarProps): ReactElement {\n const labels = { ...DEFAULT_VERSION_SNAPSHOT_BAR_LABELS, ...overrides }\n return (\n <div\n className=\"flex items-center justify-between border-b px-3 py-2 text-xs\"\n data-testid=\"version-snapshot-bar\"\n >\n <span>{labels.title(versionNumber)}</span>\n <span className=\"flex items-center gap-3\">\n {onAsk && (\n <button type=\"button\" className={LINK} data-testid=\"version-snapshot-ask\" onClick={onAsk}>\n {labels.ask}\n </button>\n )}\n <button\n type=\"button\"\n className={LINK}\n data-testid=\"version-snapshot-return\"\n onClick={onReturn}\n >\n {live ? labels.returnToLive : labels.returnToCurrent}\n </button>\n </span>\n </div>\n )\n}\n","/**\n * PDF tab › My signature: place one's own saved signature or initials on the page as a picture stamp\n * in the markup layer (then drag and resize it like any stamp). Nothing saved yet: the adopt dialog\n * opens first and saves it. Needs a `<DocumentToolsProvider>` inside a React Query\n * `QueryClientProvider`.\n */\n\nimport { useState, type ReactElement } from 'react'\nimport { Signature } from 'lucide-react'\nimport {\n INFORMAL_SIGNATURE_NOTE,\n fetchSavedSignature,\n storeSavedSignature,\n useDocumentTools,\n type SavedSignature,\n} from '@arbidocs/react/document-tools'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { AdoptSignatureDialog } from './AdoptSignatureDialog'\n\nexport type PlacedMark = { image: string; label: string }\n\ntype Mark = 'signature' | 'initials'\n\nconst picked = (saved: SavedSignature, mark: Mark): PlacedMark =>\n mark === 'signature'\n ? { image: saved.signature_png, label: 'Signature' }\n : { image: saved.initials_png, label: 'Initials' }\n\nexport function PlaceMySignatureButton({\n onPlace,\n compact = false,\n menuItems = false,\n}: {\n /** Arm the stamp tool with this picture: the next click on a page places it. */\n onPlace: (mark: PlacedMark) => void\n compact?: boolean\n /** Render the actions inside a shared signing menu. */\n menuItems?: boolean\n}): ReactElement {\n const { client, user, notify } = useDocumentTools()\n const [adoptFor, setAdoptFor] = useState<Mark | null>(null)\n\n // Read when asked for (sealed with one's own key: opened here, in the browser).\n const place = async (mark: Mark) => {\n try {\n const saved = await fetchSavedSignature(client)\n if (saved) return onPlace(picked(saved, mark))\n setAdoptFor(mark)\n } catch (err) {\n notify(err instanceof Error ? err.message : 'Your saved signature could not be read', 'error')\n }\n }\n\n return (\n <>\n {menuItems ? (\n <>\n <DropdownMenuItem\n onSelect={() => void place('signature')}\n data-testid=\"place-my-signature\"\n >\n Place my signature\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => void place('initials')} data-testid=\"place-my-initials\">\n Place my initials\n </DropdownMenuItem>\n </>\n ) : (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size={compact ? 'icon' : 'sm'}\n title=\"Place my signature\"\n aria-label=\"Place my signature\"\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"place-my-signature-button\"\n >\n <Signature className=\"size-4\" />\n {!compact && <span className=\"ml-1\">My signature</span>}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"max-w-72\">\n <DropdownMenuItem\n onSelect={() => void place('signature')}\n data-testid=\"place-my-signature\"\n >\n Place my signature\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => void place('initials')}\n data-testid=\"place-my-initials\"\n >\n Place my initials\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"text-xs font-normal text-muted-foreground\">\n {INFORMAL_SIGNATURE_NOTE}\n </DropdownMenuLabel>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n <AdoptSignatureDialog\n open={!!adoptFor}\n onOpenChange={(open) => !open && setAdoptFor(null)}\n mode=\"save\"\n defaultName={user?.name ?? ''}\n onSave={async (signature) => {\n await storeSavedSignature(client, signature)\n const mark = adoptFor\n setAdoptFor(null)\n if (mark) onPlace(picked(signature, mark))\n }}\n onAdopt={\n menuItems\n ? () => {}\n : () => notify('Your signature is saved. Click where it goes.', 'success')\n }\n />\n </>\n )\n}\n","/**\n * Account settings › Your signature: the signature and initials saved to the account (sealed with\n * the user's own key), with Replace (the adopt dialog, saving over it) and Delete (removed from the\n * account completely; what was already placed in documents or sealed in signed PDFs stays as it\n * is). Needs a `<DocumentToolsProvider>` inside a React Query `QueryClientProvider`.\n */\n\nimport { useState, type ReactElement } from 'react'\nimport { PenLine, Trash2 } from 'lucide-react'\nimport {\n INFORMAL_SIGNATURE_NOTE,\n useDeleteSavedSignature,\n useDocumentTools,\n useSavedSignature,\n useStoreSavedSignature,\n} from '@arbidocs/react/document-tools'\nimport { Button } from '@arbidocs/react/ui'\nimport { ConfirmDialog } from '../provider/dialogs'\nimport { SettingsCard } from '../settings/SettingsPanel'\nimport { AdoptSignatureDialog } from './AdoptSignatureDialog'\n\nexport const DELETE_SAVED_SIGNATURE_TEXT =\n 'Your saved signature and initials are removed from your account completely. Signatures you ' +\n 'already inserted into documents, and those sealed in signed PDFs, are not affected.'\n\nexport function SavedSignatureSettings(): ReactElement {\n const { user, notify } = useDocumentTools()\n const saved = useSavedSignature()\n const store = useStoreSavedSignature()\n const remove = useDeleteSavedSignature()\n const [editing, setEditing] = useState(false)\n const [confirming, setConfirming] = useState(false)\n const signature = saved.data\n\n return (\n <SettingsCard data-testid=\"saved-signature-settings\">\n <div className=\"space-y-1\">\n <h3 className=\"text-sm font-medium\">Your signature</h3>\n <p className=\"text-sm text-muted-foreground\">\n Saved to your account, sealed with your own key, to insert into Word documents and place\n on PDFs. {INFORMAL_SIGNATURE_NOTE}\n </p>\n </div>\n {signature ? (\n <div className=\"flex flex-wrap items-center gap-4\" data-testid=\"saved-signature-preview\">\n <img\n src={`data:image/png;base64,${signature.signature_png}`}\n alt=\"Your saved signature\"\n className=\"h-16 max-w-xs rounded-md border bg-white object-contain p-1\"\n />\n <img\n src={`data:image/png;base64,${signature.initials_png}`}\n alt=\"Your saved initials\"\n className=\"h-16 max-w-[8rem] rounded-md border bg-white object-contain p-1\"\n />\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"saved-signature-none\">\n {saved.isLoading ? 'Loading…' : 'No signature saved.'}\n </p>\n )}\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setEditing(true)}\n data-testid=\"saved-signature-replace\"\n >\n <PenLine className=\"mr-1 size-4\" aria-hidden />\n {signature ? 'Replace' : 'Add a signature'}\n </Button>\n {signature && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => setConfirming(true)}\n data-testid=\"saved-signature-delete\"\n >\n <Trash2 className=\"mr-1 size-4\" aria-hidden />\n Delete\n </Button>\n )}\n </div>\n <AdoptSignatureDialog\n open={editing}\n onOpenChange={setEditing}\n mode=\"save\"\n defaultName={user?.name ?? ''}\n saved={signature ?? null}\n onSave={async (next) => void (await store.mutateAsync(next))}\n onAdopt={() => {\n setEditing(false)\n notify('Your signature is saved.', 'success')\n }}\n />\n <ConfirmDialog\n isOpen={confirming}\n onClose={() => setConfirming(false)}\n onConfirm={async () => {\n try {\n await remove.mutateAsync()\n notify('Your saved signature is deleted.', 'success')\n } catch (err) {\n notify(err instanceof Error ? err.message : 'Could not delete it', 'error')\n } finally {\n setConfirming(false)\n }\n }}\n title=\"Delete your saved signature?\"\n description={DELETE_SAVED_SIGNATURE_TEXT}\n confirmText=\"Delete\"\n variant=\"destructive\"\n isLoading={remove.isPending}\n testId=\"saved-signature-delete-confirm\"\n />\n </SettingsCard>\n )\n}\n","/**\n * Where a document's signature requests stand, above the document: a request waiting for the\n * viewer's signature (with \"Review and sign\"), one the viewer sent and is waiting on others (who\n * has signed; void it), and the viewer's own draft (go on editing it). Nothing when there is none.\n * Needs a `<DocumentToolsProvider>` whose `user` has an `externalId`.\n */\n\nimport type { ReactElement } from 'react'\nimport { FilePenLine, PenLine, Send } from 'lucide-react'\nimport {\n SIGNER_PROGRESS_LABELS,\n useDocumentSignatureRequests,\n useDocumentTools,\n useInviteSigners,\n useSignerCandidates,\n useVoidSignatureRequest,\n type SignatureRequest,\n} from '@arbidocs/react/document-tools'\nimport { Button } from '@arbidocs/react/ui'\n\nexport interface SignatureRequestBannerProps {\n documentId: string\n /** Open the guided signing of a request waiting for the viewer. */\n onSign: (request: SignatureRequest) => void\n /** Go on editing the viewer's draft. */\n onEditDraft: (request: SignatureRequest) => void\n /** Hide it (e.g. while the editor or the guided signing is open). */\n hidden?: boolean\n}\n\n/** Who is still to sign, and how far each has got (\"Dana Day (invited)\"). */\nfunction waitingFor(request: SignatureRequest): string[] {\n return request.signers\n .filter((s) => s.status === 'pending')\n .map((s) => `${s.name || s.email || ''} (${SIGNER_PROGRESS_LABELS[s.progress].toLowerCase()})`)\n}\n\nexport function SignatureRequestBanner({\n documentId,\n onSign,\n onEditDraft,\n hidden = false,\n}: SignatureRequestBannerProps): ReactElement | null {\n const { user, notify } = useDocumentTools()\n const requests = useDocumentSignatureRequests(documentId, !hidden)\n const voidRequest = useVoidSignatureRequest()\n const invite = useInviteSigners()\n const me = user?.externalId ?? null\n const candidates = useSignerCandidates(!hidden && !!me)\n const isOwner = candidates.data?.some((c) => c.externalId === me && c.role === 'owner') ?? false\n if (hidden || !me || !requests.data) return null\n const open = requests.data.filter((r) => r.status === 'sent' || r.status === 'draft')\n const awaitingMe = open.filter(\n (r) =>\n r.status === 'sent' && r.signers.some((s) => s.user_ext_id === me && s.status === 'pending')\n )\n const sentByMe = open.filter(\n (r) => r.status === 'sent' && r.created_by === me && !awaitingMe.includes(r)\n )\n const drafts = open.filter((r) => r.status === 'draft' && r.created_by === me)\n if (awaitingMe.length + sentByMe.length + drafts.length === 0) return null\n\n const doVoid = async (request: SignatureRequest) => {\n try {\n await voidRequest.mutateAsync(request.external_id)\n notify(request.status === 'draft' ? 'Draft discarded.' : 'Signature request voided.', 'info')\n } catch (err) {\n notify(err instanceof Error ? err.message : 'Could not void it', 'error')\n }\n }\n\n return (\n <div\n className=\"space-y-1.5 border-b border-border px-3 py-2 text-sm\"\n data-testid=\"signature-request-banner\"\n >\n {awaitingMe.map((r) => {\n const count = r.fields.filter((f) => f.signer === me).length\n const author = r.signers.find((s) => s.user_ext_id === r.created_by)?.name\n return (\n <div\n key={r.external_id}\n className=\"flex flex-wrap items-center gap-2 rounded-md bg-blue-50 px-2 py-1.5 text-blue-950 dark:bg-blue-950/40 dark:text-blue-100\"\n data-testid=\"signature-request-awaiting-me\"\n >\n <PenLine className=\"size-4 shrink-0\" aria-hidden />\n <span className=\"mr-auto\">\n {author && r.created_by !== me\n ? `${author} asked you to sign`\n : 'You are asked to sign'}{' '}\n {count} field{count === 1 ? '' : 's'} in this document.\n {r.stale && ' It has changed since it was sent: ask for it again.'}\n </span>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => onSign(r)}\n disabled={r.stale}\n data-testid=\"signature-request-start\"\n >\n Review and sign\n </Button>\n </div>\n )\n })}\n {sentByMe.map((r) => {\n const pending = waitingFor(r)\n const signed = r.signers.length - pending.length\n const invited = r.signers.filter((s) => s.progress === 'invited' && s.email)\n return (\n <div\n key={r.external_id}\n className=\"flex flex-wrap items-center gap-2\"\n data-testid=\"signature-request-sent\"\n >\n <Send className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"mr-auto\">\n Out for signature: {signed} of {r.signers.length} signed\n {pending.length > 0 && (\n <span className=\"text-muted-foreground\"> · waiting for {pending.join(', ')}</span>\n )}\n {r.stale && (\n <span className=\"text-red-text\"> · the document has changed since it was sent</span>\n )}\n </span>\n {isOwner && invited.length > 0 && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={invite.isPending}\n onClick={async () => {\n try {\n await invite.mutateAsync({\n documentId,\n emails: invited.map((s) => s.email!),\n })\n notify(\n 'Invited again: anyone already registered is added now and asked to sign.',\n 'success'\n )\n } catch (err) {\n notify(err instanceof Error ? err.message : 'Could not invite', 'error')\n }\n }}\n data-testid=\"signature-request-reinvite\"\n >\n Invite again\n </Button>\n )}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => doVoid(r)}\n disabled={voidRequest.isPending}\n >\n Void\n </Button>\n </div>\n )\n })}\n {drafts.map((r) => (\n <div\n key={r.external_id}\n className=\"flex flex-wrap items-center gap-2\"\n data-testid=\"signature-request-draft\"\n >\n <FilePenLine className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"mr-auto\">\n Draft signature request: {r.fields.length} field{r.fields.length === 1 ? '' : 's'}, not\n sent yet.\n </span>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => onEditDraft(r)}>\n Continue\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => doVoid(r)}\n disabled={voidRequest.isPending}\n >\n Discard\n </Button>\n </div>\n ))}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { createFileShare, useDocumentTools } from '@arbidocs/react/document-tools'\nimport { Button, Label, Textarea } from '@arbidocs/react/ui'\nimport { ModalScaffold } from '../settings/ModalScaffold'\n\nexport function FileShareDialog({\n open,\n onOpenChange,\n documentId,\n version,\n}: {\n open: boolean\n onOpenChange: (open: boolean) => void\n documentId: string\n version: number\n}) {\n const { client, prepareFileShare } = useDocumentTools()\n const [emails, setEmails] = useState('')\n const [message, setMessage] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n return (\n <ModalScaffold\n open={open}\n onOpenChange={(next) => !busy && onOpenChange(next)}\n title={`Share file · version ${version}`}\n description=\"Recipients can view and download only this version. They get no workspace access or other versions.\"\n showDescription\n testId=\"file-share-dialog\"\n >\n <form\n onSubmit={async (event) => {\n event.preventDefault()\n setBusy(true)\n setError('')\n try {\n const recipients = [\n ...new Set(\n emails\n .split(/[,;\\n]+/)\n .map((e) => e.trim().toLowerCase())\n .filter(Boolean)\n ),\n ]\n if (!recipients.length) throw new Error('Add at least one recipient email')\n await prepareFileShare(documentId)\n const share = await createFileShare(client, documentId, {\n version,\n recipients: recipients.map((email) => ({ email, permission: 'view' })),\n message,\n })\n window.location.assign(`/shared-files/${share.external_id}`)\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not share the file')\n } finally {\n setBusy(false)\n }\n }}\n >\n <ModalScaffold.Body>\n <Label htmlFor=\"file-share-emails\">Recipient emails</Label>\n <Textarea\n id=\"file-share-emails\"\n data-testid=\"file-share-emails\"\n value={emails}\n onChange={(e) => setEmails(e.target.value)}\n placeholder=\"One email per line, or separated by commas\"\n required\n />\n <Label htmlFor=\"file-share-message\">Message (optional)</Label>\n <Textarea\n id=\"file-share-message\"\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n maxLength={2000}\n />\n <p className=\"text-sm text-muted-foreground\">\n Each recipient receives an email with an account-specific link. External users on a Box\n receive up to 24 hours of access.\n </p>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </ModalScaffold.Body>\n <ModalScaffold.Footer>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => onOpenChange(false)}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={busy} data-testid=\"file-share-send\">\n {busy ? 'Sharing…' : 'Share this version'}\n </Button>\n </ModalScaffold.Footer>\n </form>\n </ModalScaffold>\n )\n}\n"]}
|
package/dist/chunk-JPNFVDH4.cjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
var chunkZW4QFL3Y_cjs = require('./chunk-ZW4QFL3Y.cjs');
|
|
5
|
-
var chunkQS3AJ3FT_cjs = require('./chunk-QS3AJ3FT.cjs');
|
|
6
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
-
|
|
8
|
-
function ConnectedStreamedWordArtifact({
|
|
9
|
-
fontBaseUrl,
|
|
10
|
-
...props
|
|
11
|
-
}) {
|
|
12
|
-
const adapter = chunkZW4QFL3Y_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
|
|
13
|
-
return /* @__PURE__ */ jsxRuntime.jsx(chunkQS3AJ3FT_cjs.StreamedWordArtifact, { ...props, adapter });
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
exports.ConnectedStreamedWordArtifact = ConnectedStreamedWordArtifact;
|
|
17
|
-
//# sourceMappingURL=chunk-JPNFVDH4.cjs.map
|
|
18
|
-
//# sourceMappingURL=chunk-JPNFVDH4.cjs.map
|
package/dist/chunk-MKNSIZWR.cjs
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
var chunkEWRRV37Z_cjs = require('./chunk-EWRRV37Z.cjs');
|
|
5
|
-
var react = require('react');
|
|
6
|
-
|
|
7
|
-
var KEYS = ["email", "password", "next"];
|
|
8
|
-
function safeNext(next) {
|
|
9
|
-
if (!next || !next.startsWith("/") || next.startsWith("//") || next.startsWith("/\\")) return null;
|
|
10
|
-
return next;
|
|
11
|
-
}
|
|
12
|
-
function parseFragmentCredentials(hash) {
|
|
13
|
-
const { params, trailingFragment } = chunkEWRRV37Z_cjs.splitAuthHash(hash);
|
|
14
|
-
const email = params.get("email")?.trim();
|
|
15
|
-
const password = params.get("password");
|
|
16
|
-
if (!email || !password) return null;
|
|
17
|
-
const next = safeNext(params.get("next"));
|
|
18
|
-
return { email, password, next: next && chunkEWRRV37Z_cjs.withTrailingFragment(next, trailingFragment) };
|
|
19
|
-
}
|
|
20
|
-
function consumeFragmentCredentials() {
|
|
21
|
-
if (typeof window === "undefined") return null;
|
|
22
|
-
const { hash, pathname, search } = window.location;
|
|
23
|
-
const { params, trailingFragment } = chunkEWRRV37Z_cjs.splitAuthHash(hash);
|
|
24
|
-
if (!KEYS.some((k) => k !== "next" && params.has(k))) return null;
|
|
25
|
-
const credentials = parseFragmentCredentials(hash);
|
|
26
|
-
for (const k of KEYS) params.delete(k);
|
|
27
|
-
const rest = params.toString();
|
|
28
|
-
const kept = rest ? `#${rest}${trailingFragment}` : trailingFragment;
|
|
29
|
-
window.history.replaceState(window.history.state, "", `${pathname}${search}${kept}`);
|
|
30
|
-
return credentials;
|
|
31
|
-
}
|
|
32
|
-
var taken = null;
|
|
33
|
-
function take() {
|
|
34
|
-
const fresh = consumeFragmentCredentials();
|
|
35
|
-
if (fresh) taken = fresh;
|
|
36
|
-
return taken;
|
|
37
|
-
}
|
|
38
|
-
function useFragmentCredentials({
|
|
39
|
-
enabled = false,
|
|
40
|
-
onCredentials
|
|
41
|
-
}) {
|
|
42
|
-
const [credentials] = react.useState(() => enabled ? take() : null);
|
|
43
|
-
const handedOver = react.useRef(false);
|
|
44
|
-
const callback = react.useRef(onCredentials);
|
|
45
|
-
callback.current = onCredentials;
|
|
46
|
-
react.useEffect(() => {
|
|
47
|
-
if (!credentials || handedOver.current) return;
|
|
48
|
-
handedOver.current = true;
|
|
49
|
-
taken = null;
|
|
50
|
-
callback.current(credentials);
|
|
51
|
-
}, [credentials]);
|
|
52
|
-
return credentials && { email: credentials.email, next: credentials.next };
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// src/auth/return-url.ts
|
|
56
|
-
var RETURN_URL_KEY = "arbi_return_url";
|
|
57
|
-
function normalizeAuthPath(pathname) {
|
|
58
|
-
return pathname.replace(/\/+$/, "") || "/";
|
|
59
|
-
}
|
|
60
|
-
function isAuthRoutePath(pathname) {
|
|
61
|
-
const p = normalizeAuthPath(pathname);
|
|
62
|
-
return p === "/login" || p === "/sso";
|
|
63
|
-
}
|
|
64
|
-
function preserveAuthReturnUrl(url) {
|
|
65
|
-
const { pathname, search, hash } = window.location;
|
|
66
|
-
const urlToSave = url || `${pathname}${search}${hash}`;
|
|
67
|
-
const guard = url ? new URL(url, "http://dummy-base.invalid") : { pathname, search, hash };
|
|
68
|
-
const path = normalizeAuthPath(guard.pathname);
|
|
69
|
-
const isAuthPage = isAuthRoutePath(guard.pathname);
|
|
70
|
-
const isBareHome = path === "/" && !guard.search && !guard.hash;
|
|
71
|
-
const isEmbedded = path.startsWith("/word/") || path.startsWith("/chrome/");
|
|
72
|
-
if (!isAuthPage && !isBareHome && !isEmbedded) {
|
|
73
|
-
sessionStorage.setItem(RETURN_URL_KEY, urlToSave);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
exports.consumeFragmentCredentials = consumeFragmentCredentials;
|
|
78
|
-
exports.isAuthRoutePath = isAuthRoutePath;
|
|
79
|
-
exports.normalizeAuthPath = normalizeAuthPath;
|
|
80
|
-
exports.parseFragmentCredentials = parseFragmentCredentials;
|
|
81
|
-
exports.preserveAuthReturnUrl = preserveAuthReturnUrl;
|
|
82
|
-
exports.useFragmentCredentials = useFragmentCredentials;
|
|
83
|
-
//# sourceMappingURL=chunk-MKNSIZWR.cjs.map
|
|
84
|
-
//# sourceMappingURL=chunk-MKNSIZWR.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/auth/fragment-credentials.ts","../src/auth/return-url.ts"],"names":["splitAuthHash","withTrailingFragment","useState","useRef","useEffect"],"mappings":"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","file":"chunk-MKNSIZWR.cjs","sourcesContent":["/**\n * Sign-in from the URL fragment, for mock and demo deployments only:\n *\n * <login page>#email=<urlencoded>&password=<urlencoded>[&next=/path]\n *\n * OFF by default: nothing is read unless the page opts in (`enabled`). A password in a link is\n * visible to whoever holds the link, so a real deployment never turns this on. When on, the\n * fragment is read once and scrubbed from the address bar (`history.replaceState`) before the\n * first render commits, so it does not linger in history or get copied along with the URL. The\n * fragment never reaches the server; the credentials are never logged nor stored.\n *\n * Values are form-urlencoded (`URLSearchParams`): encode a `+` in a password as `%2B`. Other\n * auth-page parameters (`#verify=…`) and a trailing fragment after a second `#` (a call key) are\n * left in place.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport { splitAuthHash, withTrailingFragment } from './auth-hash'\n\nexport interface FragmentCredentials {\n email: string\n password: string\n /** Where to go once signed in: a same-origin path, or `null`. */\n next: string | null\n}\n\nconst KEYS = ['email', 'password', 'next'] as const\n\n/** A same-origin absolute path (`/app/…`), never a scheme or a protocol-relative URL. */\nfunction safeNext(next: string | null): string | null {\n if (!next || !next.startsWith('/') || next.startsWith('//') || next.startsWith('/\\\\')) return null\n return next\n}\n\n/** The credentials in an auth page's hash, or `null` without both an email and a password. */\nexport function parseFragmentCredentials(hash: string): FragmentCredentials | null {\n const { params, trailingFragment } = splitAuthHash(hash)\n const email = params.get('email')?.trim()\n const password = params.get('password')\n if (!email || !password) return null\n const next = safeNext(params.get('next'))\n return { email, password, next: next && withTrailingFragment(next, trailingFragment) }\n}\n\n/**\n * Read the credentials from the current URL's fragment and scrub them (with `next`) from the\n * address bar, keeping any other fragment parameters. `null` when there are none; a fragment with\n * only one of email/password is scrubbed all the same.\n */\nexport function consumeFragmentCredentials(): FragmentCredentials | null {\n if (typeof window === 'undefined') return null\n const { hash, pathname, search } = window.location\n const { params, trailingFragment } = splitAuthHash(hash)\n if (!KEYS.some((k) => k !== 'next' && params.has(k))) return null\n const credentials = parseFragmentCredentials(hash)\n for (const k of KEYS) params.delete(k)\n const rest = params.toString()\n const kept = rest ? `#${rest}${trailingFragment}` : trailingFragment\n window.history.replaceState(window.history.state, '', `${pathname}${search}${kept}`)\n return credentials\n}\n\n// Read once per page load and held only until the sign-in is handed over (a strict-mode double\n// render reads the already-scrubbed URL, so it takes these instead).\nlet taken: FragmentCredentials | null = null\n\nfunction take(): FragmentCredentials | null {\n const fresh = consumeFragmentCredentials()\n if (fresh) taken = fresh\n return taken\n}\n\nexport interface UseFragmentCredentialsOptions {\n /** Opt in. Off by default: only a mock/demo deployment turns this on. */\n enabled?: boolean\n /** Sign in with them (the same path as the form). Called once. */\n onCredentials: (credentials: FragmentCredentials) => void\n}\n\n/**\n * Opt-in sign-in from `#email=…&password=…[&next=…]` (see the top of this file). Returns the\n * email and `next` from the link (to prefill the form should the sign-in fail), or `null`.\n */\nexport function useFragmentCredentials({\n enabled = false,\n onCredentials,\n}: UseFragmentCredentialsOptions): Omit<FragmentCredentials, 'password'> | null {\n // Read (and scrub) during the first render, before any effect or await.\n const [credentials] = useState(() => (enabled ? take() : null))\n const handedOver = useRef(false)\n const callback = useRef(onCredentials)\n callback.current = onCredentials\n\n useEffect(() => {\n if (!credentials || handedOver.current) return\n handedOver.current = true\n taken = null\n callback.current(credentials)\n }, [credentials])\n\n return credentials && { email: credentials.email, next: credentials.next }\n}\n","const RETURN_URL_KEY = 'arbi_return_url'\n\n/**\n * Strip trailing slashes so `/login/` compares equal to `/login` (bare `/`\n * stays `/`). External / typed / marketing links commonly arrive with a\n * trailing slash; without normalizing, `/login/` slips past the auth-page\n * guard below, gets saved as the return URL, and the post-auth effect\n * `window.location.href`-reloads straight back into the login shell —\n * racing session persistence and wedging the user on /login.\n */\nexport function normalizeAuthPath(pathname: string): string {\n return pathname.replace(/\\/+$/, '') || '/'\n}\n\n/**\n * Auth shells we must never save as a return URL nor hard-reload into\n * (trailing-slash tolerant).\n */\nexport function isAuthRoutePath(pathname: string): boolean {\n const p = normalizeAuthPath(pathname)\n return p === '/login' || p === '/sso'\n}\n\n/**\n * Saves the current URL for post-authentication redirect\n * Preserves pathname, search params, and hash\n */\nexport function preserveAuthReturnUrl(url?: string): void {\n const { pathname, search, hash } = window.location\n const urlToSave = url || `${pathname}${search}${hash}`\n // Guard against the URL being saved, not the current page — a caller can be\n // on /login itself and still pass an explicit destination to save for after\n // auth (e.g. a resource-share invite link's `&next=` param), which must not\n // be silently dropped just because /login is where it's being parsed. A\n // fixed dummy base (rather than window.location.origin) resolves a bare\n // path like `/wrk-.../doc-...` without depending on window.location being\n // in a valid state — an absolute `url` (e.g. McpConnect's window.location.href)\n // ignores the base entirely, per the URL spec.\n const guard = url ? new URL(url, 'http://dummy-base.invalid') : { pathname, search, hash }\n const path = normalizeAuthPath(guard.pathname)\n\n // Don't save the auth pages themselves, or the bare home with nothing to\n // return to. Deep links are path-based (e.g. `/wrk-…/con-…/msg-…`), so they\n // carry a non-`/` pathname and are preserved naturally. We still save `/`\n // when it carries a query (e.g. `?review_access=…`) so those flows survive\n // the login round-trip.\n const isAuthPage = isAuthRoutePath(guard.pathname)\n const isBareHome = path === '/' && !guard.search && !guard.hash\n // Embedded add-in panels (Word/Chrome) own their own post-auth state and must\n // never become a saved return URL — otherwise the main-app post-auth effect\n // would `window.location.href` into the panel (a full reload that breaks the\n // just-established session inside the Office iframe → bounce back to login).\n const isEmbedded = path.startsWith('/word/') || path.startsWith('/chrome/')\n\n if (!isAuthPage && !isBareHome && !isEmbedded) {\n sessionStorage.setItem(RETURN_URL_KEY, urlToSave)\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth/AuthLayout.tsx","../src/auth/AuthForm.tsx","../src/auth/SsoLoginButton.tsx","../src/auth/AuthFooter.tsx","../src/auth/auth-error.ts","../src/auth/password-rules.ts","../src/auth/credential-storage.ts","../src/auth/RecoveryDialogs.tsx","../src/connection/auth/auth-hash.ts"],"names":["jsxs","jsx","cn","useMemo","Button","AlertCircle","useId","Input","Fragment","Loader2","useState"],"mappings":"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","file":"chunk-MVP7METT.js","sourcesContent":["import type { LucideIcon } from 'lucide-react'\nimport { ArrowRight } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface AuthLayoutProps {\n /** The form column content. */\n children: ReactNode\n /** Sits above the form: the Login / Register tabs, or an offline badge. */\n headerRight?: ReactNode\n /** Hero panel: the right half on desktop, hidden on mobile. Omit for a single centred column. */\n aside?: ReactNode\n /** Brand mark shown top-left of the form column (logo + name). */\n brand?: ReactNode\n /** Pinned bottom-right over the hero on desktop (e.g. a deployment indicator). */\n corner?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * Full-bleed split: a calm form column on the left, the hero (`aside`) on the right. On mobile the\n * hero is hidden and the form fills the screen. With no `aside` it is a single centred column.\n */\nexport function AuthLayout({\n children,\n headerRight,\n aside,\n brand,\n corner,\n className,\n testId = 'auth-layout',\n}: AuthLayoutProps) {\n return (\n <div\n data-slot=\"auth-layout\"\n className={cn(\n 'min-h-screen bg-background text-foreground',\n // The hero needs height: a phone held sideways (under 32rem tall) gets the form alone.\n aside && 'md:grid [@media(min-height:32rem)]:md:grid-cols-2',\n className\n )}\n data-testid={testId}\n >\n {corner}\n <section className=\"flex min-h-screen flex-col px-4 py-5 sm:px-8 md:px-12 md:py-6\">\n {brand && (\n <div className=\"flex items-center gap-3 font-semibold text-foreground\">{brand}</div>\n )}\n {/* Top-aligned at a fixed offset (not vertically centred) so switching tabs never moves the tabs. */}\n <div className=\"mx-auto mt-10 flex w-full max-w-sm flex-col gap-5 py-8 md:mt-[14vh]\">\n {headerRight && <div className=\"flex items-center\">{headerRight}</div>}\n {children}\n </div>\n </section>\n {/* Exactly one screen tall and pinned, so the hero is centred in the window rather than in\n the row: a form that overflows the screen (Login, with its SSO buttons, on a laptop)\n would otherwise stretch the row and move the hero text when switching tabs. */}\n {aside && (\n <div className=\"hidden [@media(min-height:32rem)]:md:sticky [@media(min-height:32rem)]:md:top-0 [@media(min-height:32rem)]:md:flex [@media(min-height:32rem)]:md:h-screen\">\n {aside}\n </div>\n )}\n </div>\n )\n}\n\nexport interface AuthHeroPillar {\n icon: LucideIcon\n title: string\n body: string\n}\n\nexport interface AuthHeroProps {\n /** First line of the headline. */\n headline?: ReactNode\n /** Second headline line, set in italic accent. */\n emphasis?: string\n lead?: ReactNode\n pillars?: AuthHeroPillar[]\n link?: { href: string; label: string }\n /** Cover image behind the content (any CSS `url(...)` source). A tint keeps text legible. */\n backgroundImage?: string\n /** Extra content under the pillars (a quote, a logo row, a screenshot). */\n children?: ReactNode\n className?: string\n testId?: string\n}\n\n/** The value-proposition panel for {@link AuthLayout}'s `aside`: headline, lead, pillars, link. */\nexport function AuthHero({\n headline,\n emphasis,\n lead,\n pillars = [],\n link,\n backgroundImage,\n children,\n className,\n testId = 'product-pillars',\n}: AuthHeroProps) {\n return (\n <div\n data-slot=\"auth-hero\"\n className={cn(\n 'relative flex w-full flex-col justify-center gap-6 overflow-hidden bg-hero px-12 py-16 text-white',\n className\n )}\n data-testid={testId}\n >\n {backgroundImage && (\n <>\n <div\n aria-hidden=\"true\"\n data-slot=\"auth-hero-image\"\n className=\"absolute inset-0 bg-cover bg-center\"\n style={{ backgroundImage: `url(${backgroundImage})` }}\n />\n <div aria-hidden=\"true\" className=\"absolute inset-0 bg-hero/70\" />\n </>\n )}\n {headline && (\n <h2 className=\"relative max-w-[18ch] text-3xl font-semibold leading-tight text-white\">\n {headline}\n {emphasis && (\n <>\n <br />\n <span className=\"italic text-theme-cyan-bright\">{emphasis}</span>\n </>\n )}\n </h2>\n )}\n {lead && <p className=\"relative max-w-[44ch] text-base text-white/70\">{lead}</p>}\n\n <ul className=\"relative flex max-w-[46ch] flex-col gap-5\">\n {pillars.map(({ icon: Icon, title, body }) => (\n <li key={title} className=\"flex gap-3\">\n <Icon className=\"mt-0.5 h-5 w-5 shrink-0 text-theme-cyan-bright\" aria-hidden=\"true\" />\n <div>\n <h3 className=\"text-base font-semibold leading-snug text-white\">{title}</h3>\n <p className=\"text-sm leading-relaxed text-white/70\">{body}</p>\n </div>\n </li>\n ))}\n </ul>\n\n {children && <div className=\"relative\">{children}</div>}\n\n {link && (\n <a\n href={link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"relative inline-flex items-center gap-1 text-sm font-medium text-theme-cyan-bright transition-colors hover:text-white\"\n >\n {link.label}\n <ArrowRight className=\"h-4 w-4\" />\n </a>\n )}\n </div>\n )\n}\n","import { AlertCircle, Eye, EyeOff, Loader2, WifiOff } from 'lucide-react'\nimport {\n createContext,\n useContext,\n useId,\n useMemo,\n useState,\n type ComponentProps,\n type ReactNode,\n} from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { Button, cn, Input } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Title + one-line description above an auth form. */\nexport function AuthHeading({ title, description }: { title: ReactNode; description?: ReactNode }) {\n return (\n <div data-slot=\"auth-heading\">\n <h1 className=\"text-2xl font-semibold tracking-tight text-foreground\">{title}</h1>\n {description && <p className=\"mt-2 text-sm text-muted-foreground\">{description}</p>}\n </div>\n )\n}\n\n/** A text-style action under or beside a field (\"Forgot your password?\", \"Clear form\"). */\nexport function AuthLink({ className, type = 'button', ...props }: ComponentProps<'button'>) {\n return (\n <button\n type={type}\n data-slot=\"auth-link\"\n className={cn(\n 'text-sm text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n className\n )}\n {...props}\n />\n )\n}\n\ninterface AuthFieldContextValue {\n id: string\n errorId?: string\n}\n\n/** What an `AuthField` hands to the control inside: its id and the id of its error message. */\nconst AuthFieldContext = createContext<AuthFieldContextValue | null>(null)\n\n/** Merge space-separated id lists for `aria-describedby`. */\nfunction joinIds(...ids: Array<string | undefined>): string | undefined {\n const joined = ids.filter(Boolean).join(' ')\n return joined || undefined\n}\n\nexport interface AuthFieldProps {\n /** Id of the control inside, for the label. Omit it to use a generated (`useId`) id that the\n * `AuthInput` / `RevealablePasswordInput` inside picks up automatically. */\n htmlFor?: string\n /** Field-level error: shown under the control, linked with `aria-describedby`, and marks the\n * control `aria-invalid`. */\n error?: ReactNode\n errorTestId?: string\n label: ReactNode\n required?: boolean\n /** Right-aligned action in the label row (e.g. \"Clear form\"). */\n labelAction?: ReactNode\n /** Overlaid at the right edge of the control (e.g. a \"Verified\" badge). */\n trailing?: ReactNode\n className?: string\n children: ReactNode\n}\n\n/** Label (with required marker) above a control. */\nexport function AuthField({\n htmlFor,\n error,\n errorTestId,\n label,\n required,\n labelAction,\n trailing,\n className,\n children,\n}: AuthFieldProps) {\n const generatedId = useId()\n const id = htmlFor ?? generatedId\n const errorId = error ? `${id}-error` : undefined\n const context = useMemo(() => ({ id, errorId }), [id, errorId])\n return (\n <AuthFieldContext.Provider value={context}>\n <div data-slot=\"auth-field\" className={className}>\n <div className=\"mb-1 flex items-center justify-between\">\n <label htmlFor={id} className=\"block text-sm font-medium text-foreground\">\n {label} {required && <span className=\"text-red-text\">*</span>}\n </label>\n {labelAction}\n </div>\n {trailing ? (\n <div className=\"relative\">\n {children}\n {trailing}\n </div>\n ) : (\n children\n )}\n {error && (\n <p\n id={errorId}\n role=\"alert\"\n className=\"mt-1 text-sm text-red-text\"\n data-testid={errorTestId}\n >\n {error}\n </p>\n )}\n </div>\n </AuthFieldContext.Provider>\n )\n}\n\n/** Input styled for auth forms (faint placeholder). */\nexport function AuthInput({\n className,\n id,\n 'aria-describedby': describedBy,\n 'aria-invalid': invalid,\n ...props\n}: ComponentProps<typeof Input>) {\n const field = useContext(AuthFieldContext)\n return (\n <Input\n id={id ?? field?.id}\n aria-describedby={joinIds(describedBy, field?.errorId)}\n aria-invalid={invalid ?? (field?.errorId ? true : undefined)}\n className={cn('placeholder:text-muted-foreground', className)}\n {...props}\n />\n )\n}\n\n/** Every fixed string of the revealable password input. */\nexport interface RevealablePasswordInputLabels {\n hidePassword: string\n showPassword: string\n}\n\nexport const DEFAULT_REVEALABLE_PASSWORD_INPUT_LABELS: RevealablePasswordInputLabels = {\n hidePassword: 'Hide password',\n showPassword: 'Show password',\n}\n\n/** Every fixed string of the offline badge. */\nexport interface AuthOfflineBadgeLabels {\n offline: string\n}\n\nexport const DEFAULT_AUTH_OFFLINE_BADGE_LABELS: AuthOfflineBadgeLabels = {\n offline: 'Offline',\n}\n\nexport interface RevealablePasswordInputProps extends Omit<ComponentProps<typeof Input>, 'type'> {\n /** Controlled reveal state. Omit it and the input manages its own (see `defaultRevealed`). */\n isRevealed?: boolean\n /** Initial state when uncontrolled. */\n defaultRevealed?: boolean\n /** Called on every toggle press, controlled or not. */\n onToggleReveal?: () => void\n labels?: Partial<RevealablePasswordInputLabels>\n /** Show/hide button id (default `toggle-password-visibility`); `data-testid` goes to the input. */\n toggleTestId?: string\n}\n\n/** Password input with a show/hide button inside the field. */\nexport function RevealablePasswordInput({\n isRevealed: controlledRevealed,\n defaultRevealed = false,\n onToggleReveal,\n className,\n labels,\n toggleTestId,\n ...props\n}: RevealablePasswordInputProps) {\n const [innerRevealed, setInnerRevealed] = useState(defaultRevealed)\n const isControlled = controlledRevealed !== undefined\n const isRevealed = isControlled ? controlledRevealed : innerRevealed\n const l = useMemo(() => ({ ...DEFAULT_REVEALABLE_PASSWORD_INPUT_LABELS, ...labels }), [labels])\n return (\n <div className=\"relative\">\n <AuthInput\n type={isRevealed ? 'text' : 'password'}\n className={cn('pr-10', className)}\n {...props}\n />\n <button\n type=\"button\"\n onClick={() => {\n if (!isControlled) setInnerRevealed((prev) => !prev)\n onToggleReveal?.()\n }}\n aria-label={isRevealed ? l.hidePassword : l.showPassword}\n aria-pressed={isRevealed}\n className=\"absolute inset-y-0 right-0 flex w-10 items-center justify-center rounded-r-md text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring pointer-coarse:w-11\"\n data-testid={testIdOr(toggleTestId, { testId: 'toggle-password-visibility' })}\n >\n {isRevealed ? (\n <EyeOff className=\"h-4 w-4\" aria-hidden=\"true\" />\n ) : (\n <Eye className=\"h-4 w-4\" aria-hidden=\"true\" />\n )}\n </button>\n </div>\n )\n}\n\n/** Small pill on a locked field, e.g. \"Verified\". */\nexport function AuthFieldBadge({\n icon,\n children,\n testId,\n}: {\n icon?: ReactNode\n children: ReactNode\n testId?: string\n}) {\n return (\n <span\n className=\"pointer-events-none absolute inset-y-0 right-3 flex items-center gap-1 text-xs font-medium text-green-text\"\n data-testid={testId}\n >\n {icon}\n {children}\n </span>\n )\n}\n\n/** Centred muted sentence under a step's primary action. */\nexport function AuthNote({ className, ...props }: ComponentProps<'p'>) {\n return <p className={cn('text-center text-sm text-muted-foreground', className)} {...props} />\n}\n\n/** Error / status message box for a form. */\nexport function AuthAlert({\n children,\n withIcon = false,\n testId,\n id,\n}: {\n children: ReactNode\n withIcon?: boolean\n testId?: string\n /** Lets a field point at this message with `aria-describedby`. */\n id?: string\n}) {\n return (\n <div\n id={id}\n role=\"alert\"\n data-testid={testId}\n className=\"flex gap-2 rounded-md bg-red-bg p-3 text-sm text-red-text\"\n >\n {withIcon && <AlertCircle className=\"h-5 w-5 flex-shrink-0\" aria-hidden=\"true\" />}\n <div>{children}</div>\n </div>\n )\n}\n\nexport interface AuthSubmitButtonProps extends ComponentProps<typeof Button> {\n /** Shows a spinner and sets `aria-busy`. */\n isBusy?: boolean\n /** Shorthand for `data-testid`. */\n testId?: string\n}\n\n/** Full-width primary submit with a spinner while busy. */\nexport function AuthSubmitButton({\n isBusy,\n testId,\n children,\n className,\n ...props\n}: AuthSubmitButtonProps) {\n return (\n <Button\n type=\"submit\"\n className={cn('w-full', className)}\n aria-busy={isBusy || undefined}\n data-testid={testId}\n {...props}\n >\n {isBusy && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n {children}\n </Button>\n )\n}\n\n/** \"or continue with\" separator between the form and the SSO button. */\nexport function AuthDivider({ label, testId }: { label: string; testId?: string }) {\n return (\n <div\n data-slot=\"auth-divider\"\n data-testid={testIdOr(testId, { testId: 'login-divider' })}\n className=\"relative\"\n >\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-border\" />\n </div>\n <div className=\"relative flex justify-center text-xs\">\n <span className=\"bg-background px-2 text-muted-foreground\">{label}</span>\n </div>\n </div>\n )\n}\n\nexport interface AuthTabOption<T extends string> {\n value: T\n label: string\n testId?: string\n}\n\n/**\n * Underline tab pair (Login / Register) above the form. Radix Tabs: one tab stop, arrow keys,\n * Home and End move between tabs and select them (the form below swaps with the selection).\n */\nexport function AuthTabs<T extends string>({\n value,\n onChange,\n tabs,\n ariaLabel,\n}: {\n value: T\n onChange: (value: T) => void\n tabs: AuthTabOption<T>[]\n ariaLabel: string\n}) {\n return (\n <TabsPrimitive.Root value={value} onValueChange={(next) => onChange(next as T)}>\n <TabsPrimitive.List aria-label={ariaLabel} className=\"inline-flex items-center gap-6\">\n {tabs.map((tab) => (\n <TabsPrimitive.Trigger\n key={tab.value}\n value={tab.value}\n data-testid={tab.testId}\n className={cn(\n '-mb-px border-b-2 py-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-w-11 pointer-coarse:py-3',\n tab.value === value\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n )}\n >\n {tab.label}\n </TabsPrimitive.Trigger>\n ))}\n </TabsPrimitive.List>\n {/* The form the tabs switch lives outside this component; these empty, hidden panels only\n give each tab's `aria-controls` a valid target. */}\n {tabs.map((tab) => (\n <TabsPrimitive.Content\n key={tab.value}\n value={tab.value}\n tabIndex={-1}\n aria-hidden=\"true\"\n className=\"hidden\"\n />\n ))}\n </TabsPrimitive.Root>\n )\n}\n\n/** Pill shown instead of the tabs when the device is offline. */\nexport function AuthOfflineBadge({\n label,\n title,\n testId,\n labels,\n}: {\n label?: string\n title?: string\n testId?: string\n labels?: Partial<AuthOfflineBadgeLabels>\n}) {\n const text = label ?? labels?.offline ?? DEFAULT_AUTH_OFFLINE_BADGE_LABELS.offline\n return (\n <span\n data-testid={testIdOr(testId, { testId: 'login-offline-indicator' })}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-yellow-bg px-2.5 py-1.5 text-sm font-medium text-yellow-text\"\n title={title}\n >\n <WifiOff className=\"h-4 w-4 shrink-0\" />\n {text}\n </span>\n )\n}\n","import { useMemo } from 'react'\nimport { ARBI_MARK_SRC, Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the SSO button. `brandIconAlt` prop wins over `brandIconAlt` label. */\nexport interface SsoLoginButtonLabels {\n loginWith: string\n brandIconAlt: string\n}\n\nexport const DEFAULT_SSO_LOGIN_BUTTON_LABELS: SsoLoginButtonLabels = {\n loginWith: 'Login with',\n brandIconAlt: 'ARBI Docs',\n}\n\nexport interface SsoLoginButtonProps {\n labels?: Partial<SsoLoginButtonLabels>\n onClick: () => void\n /** Source of the brand mark shown first. */\n brandIconSrc?: string\n brandIconAlt?: string\n /** Button test id (default `login-with-arbi-button`). */\n testId?: string\n /** Wrapper test id (default `sso-login-button-container`). */\n containerTestId?: string\n}\n\n/** \"Login with\" button showing the ARBI mark and the supported identity providers. */\nexport function SsoLoginButton({\n onClick,\n brandIconSrc = ARBI_MARK_SRC,\n brandIconAlt,\n testId,\n containerTestId,\n labels,\n}: SsoLoginButtonProps) {\n const l = useMemo(() => ({ ...DEFAULT_SSO_LOGIN_BUTTON_LABELS, ...labels }), [labels])\n return (\n <div\n data-slot=\"sso-login\"\n data-testid={testIdOr(containerTestId, { testId: 'sso-login-button-container' })}\n className=\"text-center\"\n >\n <Button\n onClick={onClick}\n className=\"flex w-full items-center justify-center gap-3\"\n variant=\"outline\"\n data-testid={testIdOr(testId, { testId: 'login-with-arbi-button' })}\n >\n <span>{l.loginWith}</span>\n <div className=\"flex items-center gap-3 pr-1\">\n <img\n src={brandIconSrc}\n alt={brandIconAlt ?? l.brandIconAlt}\n className=\"h-5 w-5 rounded object-contain\"\n />\n\n {/* LinkedIn */}\n <svg className=\"h-5 w-5\" viewBox=\"0 0 24 24\" fill=\"#0A66C2\" aria-hidden=\"true\">\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n </svg>\n\n {/* Google */}\n <svg className=\"h-5 w-5\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n\n {/* Apple */}\n <svg className=\"h-5 w-5\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\" />\n </svg>\n </div>\n </Button>\n </div>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport { MoreVertical } from 'lucide-react'\nimport {\n Checkbox,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface AuthLegalLink {\n href: string\n label: string\n}\n\nexport interface AuthConsentProps {\n termsAccepted: boolean\n onTermsAcceptedChange: (accepted: boolean) => void\n /** Whether to download a recovery key on signup (opt-out; unchecking shows the warning). */\n saveRecoveryKey: boolean\n onSaveRecoveryKeyChange: (save: boolean) => void\n termsLink: AuthLegalLink\n privacyLink: AuthLegalLink\n /** Shown (role=\"alert\") only when the recovery-key box is unchecked. */\n noRecoveryKeyWarning: string\n labels?: Partial<AuthConsentLabels>\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<\n Record<'termsCheckbox' | 'recoveryKeyCheckbox' | 'noRecoveryKeyWarning', string>\n >\n}\n\n/** Every fixed string of the sign-up consent block. */\nexport interface AuthConsentLabels {\n /** Text before the terms link. */\n acknowledge: string\n /** Text between the terms and privacy links. */\n and: string\n downloadRecoveryKey: string\n}\n\nexport const DEFAULT_AUTH_CONSENT_LABELS: AuthConsentLabels = {\n acknowledge: 'I acknowledge the',\n and: 'and',\n downloadRecoveryKey: 'Download my recovery key',\n}\n\n/** Every fixed string of the sign-in footer. */\nexport interface AuthFooterLinksLabels {\n installOptions: string\n install: string\n}\n\nexport const DEFAULT_AUTH_FOOTER_LINKS_LABELS: AuthFooterLinksLabels = {\n installOptions: 'Install options',\n install: 'Install',\n}\n\nconst LEGAL_LINK_CLASS = 'underline transition-colors hover:text-primary'\n\n/** Sign-up consent: required terms checkbox and the opt-out \"download recovery key\" checkbox. */\nexport function AuthConsent({\n termsAccepted,\n onTermsAcceptedChange,\n saveRecoveryKey,\n onSaveRecoveryKeyChange,\n termsLink,\n privacyLink,\n noRecoveryKeyWarning,\n labels,\n testIds,\n}: AuthConsentProps) {\n const l = useMemo(() => ({ ...DEFAULT_AUTH_CONSENT_LABELS, ...labels }), [labels])\n return (\n <div data-slot=\"auth-consent\" className=\"space-y-2\">\n <div className=\"flex items-start gap-2\">\n <Checkbox\n id=\"accept-terms\"\n checked={termsAccepted}\n onCheckedChange={(checked) => onTermsAcceptedChange(checked === true)}\n data-testid={testIdOr(testIds?.termsCheckbox, { testId: 'accept-terms-checkbox' })}\n />\n <label\n htmlFor=\"accept-terms\"\n className=\"cursor-pointer text-sm leading-relaxed text-muted-foreground\"\n >\n {l.acknowledge}{' '}\n <a\n href={termsLink.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={LEGAL_LINK_CLASS}\n >\n {termsLink.label}\n </a>{' '}\n {l.and}{' '}\n <a\n href={privacyLink.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={LEGAL_LINK_CLASS}\n >\n {privacyLink.label}\n </a>\n </label>\n </div>\n <div className=\"flex items-start gap-2\">\n <Checkbox\n id=\"save-recovery-key\"\n checked={saveRecoveryKey}\n onCheckedChange={(checked) => onSaveRecoveryKeyChange(checked === true)}\n data-testid={testIdOr(testIds?.recoveryKeyCheckbox, {\n testId: 'save-recovery-key-checkbox',\n })}\n />\n <label\n htmlFor=\"save-recovery-key\"\n className=\"cursor-pointer text-sm leading-relaxed text-muted-foreground\"\n >\n {l.downloadRecoveryKey}\n </label>\n </div>\n {/* Only shown on opt-out: the default path stays free of warnings. */}\n {!saveRecoveryKey && (\n <p\n className=\"text-sm text-red-text\"\n role=\"alert\"\n data-testid={testIdOr(testIds?.noRecoveryKeyWarning, {\n testId: 'no-recovery-key-warning',\n })}\n >\n {noRecoveryKeyWarning}\n </p>\n )}\n </div>\n )\n}\n\nexport interface AuthInstallOption {\n id: string\n label: ReactNode\n icon?: ReactNode\n onSelect: () => void\n disabled?: boolean\n testId?: string\n}\n\nexport interface AuthFooterLinksProps {\n privacyLink: AuthLegalLink\n /** Entries of the \"Install\" kebab menu. Omit/empty to hide the menu. */\n installOptions?: AuthInstallOption[]\n /** Dialog or other overlay owned by the host, rendered inside the footer. */\n children?: ReactNode\n labels?: Partial<AuthFooterLinksLabels>\n /** Install menu trigger id (default `install-options-trigger`). */\n installTriggerTestId?: string\n}\n\n/** Sign-in footer: privacy link on the left, an \"Install\" kebab menu on the right. */\nexport function AuthFooterLinks({\n privacyLink,\n installOptions = [],\n children,\n labels,\n installTriggerTestId,\n}: AuthFooterLinksProps) {\n const l = useMemo(() => ({ ...DEFAULT_AUTH_FOOTER_LINKS_LABELS, ...labels }), [labels])\n return (\n <div\n data-slot=\"auth-footer-links\"\n className=\"flex items-center justify-between pt-2 text-sm text-muted-foreground\"\n >\n <a\n href={privacyLink.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center transition-colors hover:text-primary pointer-coarse:min-h-11\"\n >\n {privacyLink.label}\n </a>\n\n {installOptions.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger\n className=\"flex items-center gap-1 rounded-md px-1.5 py-1 transition-colors hover:text-primary focus:outline-none focus-visible:ring-1 focus-visible:ring-ring pointer-coarse:min-h-11\"\n aria-label={l.installOptions}\n data-testid={testIdOr(installTriggerTestId, { testId: 'install-options-trigger' })}\n >\n {l.install}\n <MoreVertical size={14} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {installOptions.map((option) => (\n <DropdownMenuItem\n key={option.id}\n onClick={option.onSelect}\n disabled={option.disabled}\n className=\"gap-2\"\n data-testid={option.testId}\n >\n {option.icon}\n {option.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n {children}\n </div>\n )\n}\n","/**\n * Auth Error Parsing Utility\n *\n * Parses API error responses into user-friendly messages.\n * Handles FastAPI/Pydantic error formats (detail field) and standard Error objects.\n */\n\nexport interface ParseAuthErrorOptions {\n /** Default message if error cannot be parsed */\n defaultMessage?: string\n /** Check for 429 rate limit errors */\n checkRateLimit?: boolean\n /** Map specific error messages to custom messages */\n messageMap?: Record<string, string>\n}\n\n/**\n * Parse an API error into a user-friendly message\n */\nexport function parseAuthError(error: unknown, options: ParseAuthErrorOptions = {}): string {\n const {\n defaultMessage = 'Unable to communicate with the server',\n checkRateLimit = false,\n messageMap = {},\n } = options\n\n if (!error) return defaultMessage\n\n // An Error carrying the server's answer (`detail`, `status`: what the SDK's auth calls throw) is\n // read like the answer itself.\n if (error instanceof Error && !('detail' in error) && !('status' in error)) {\n return isNetworkError(error.message)\n ? defaultMessage\n : applyMessageMap(error.message, messageMap)\n }\n\n if (typeof error !== 'object') return defaultMessage\n\n const errorObj = error as {\n detail?: string | Array<{ msg: string }>\n message?: string\n status?: number\n }\n // The server's answer wins over a wrapping message (\"Login failed: …\").\n const message = errorObj.detail === undefined ? errorObj.message : undefined\n\n // Check for rate limiting (429)\n if (checkRateLimit) {\n if (\n errorObj.status === 429 ||\n errorObj.message?.includes('429') ||\n (typeof errorObj.detail === 'string' && errorObj.detail.includes('429'))\n ) {\n return 'Error: duplicate request'\n }\n }\n\n // Handle detail field (FastAPI/Pydantic style)\n if (errorObj.detail) {\n if (Array.isArray(errorObj.detail)) {\n return errorObj.detail[0]?.msg || 'Validation error occurred'\n }\n if (typeof errorObj.detail === 'string') {\n return applyMessageMap(errorObj.detail, messageMap)\n }\n }\n\n // Handle message field\n if (message) {\n return isNetworkError(message) ? defaultMessage : applyMessageMap(message, messageMap)\n }\n\n return defaultMessage\n}\n\nfunction isNetworkError(message: string): boolean {\n const lower = message.toLowerCase()\n return lower.includes('fetch') || lower.includes('network')\n}\n\nfunction applyMessageMap(message: string, messageMap: Record<string, string>): string {\n return messageMap[message] ?? message\n}\n","/**\n * Password rules: the requirements a new password must meet (registration, a new SSO account's\n * master password, a password change), as one value a site configures once (`createPasswordRules`)\n * and every form reads: the one-line hint of `PasswordStrengthInput`, the submit gate, the error.\n */\n\nexport interface PasswordRequirements {\n minLength: boolean\n hasUpperOrSpecial: boolean\n hasNumber: boolean\n}\n\nexport interface PasswordRules {\n minLength: number\n /** Which requirements the password meets. */\n check(password: string): PasswordRequirements\n /** The first unmet requirement as a short hint, or `null` when the password is acceptable. */\n unmet(password: string): string | null\n isValid(password: string): boolean\n /** The first unmet requirement as a sentence (an error to show), or `null`. */\n error(password: string): string | null\n}\n\n/** The rules with a minimum length (default 8): one uppercase or special character, one number. */\nexport function createPasswordRules(minLength = 8): PasswordRules {\n const check = (password: string): PasswordRequirements => ({\n minLength: password.length >= minLength,\n hasUpperOrSpecial: /[A-Z!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password),\n hasNumber: /[0-9]/.test(password),\n })\n return {\n minLength,\n check,\n unmet(password) {\n const met = check(password)\n if (!met.minLength) return `Minimum ${minLength} characters`\n if (!met.hasUpperOrSpecial) return 'At least one uppercase letter or special character'\n if (!met.hasNumber) return 'At least one number'\n return null\n },\n isValid(password) {\n const met = check(password)\n return met.minLength && met.hasUpperOrSpecial && met.hasNumber\n },\n error(password) {\n const met = check(password)\n if (!met.minLength) return `Password must be at least ${minLength} characters long.`\n if (!met.hasUpperOrSpecial) {\n return 'Password must contain at least one uppercase letter or special character.'\n }\n if (!met.hasNumber) return 'Password must contain at least one number.'\n return null\n },\n }\n}\n\n/** The default rules (8 characters). */\nexport const DEFAULT_PASSWORD_RULES = createPasswordRules()\n","/**\n * Credential Storage Utilities\n *\n * Uses the Credential Management API to prompt browsers to save passwords.\n * This helps users store passwords in their browser's built-in password manager.\n */\n\n/**\n * Prompt the browser to save credentials to its password manager.\n *\n * This uses the Credential Management API which is supported by:\n * - Chrome/Edge (full support, syncs to Google/Microsoft account)\n * - Firefox (limited support)\n * - Safari (uses Keychain instead)\n *\n * @param email - User's email address\n * @param password - User's password\n * @returns true if credential was stored, false otherwise\n */\nexport async function promptSaveCredential(email: string, password: string): Promise<boolean> {\n // Check if Credential Management API is supported\n if (!('credentials' in navigator) || !('PasswordCredential' in window)) {\n console.info('[CREDENTIAL] Credential Management API not supported')\n return false\n }\n\n try {\n // Create a PasswordCredential object\n const credential = new (\n window as unknown as {\n PasswordCredential: new (data: {\n id: string\n password: string\n name?: string\n }) => Credential\n }\n ).PasswordCredential({\n id: email,\n password: password,\n name: 'ARBI Account',\n })\n\n // Prompt the browser to store the credential\n await navigator.credentials.store(credential)\n console.info('[CREDENTIAL] Credential stored successfully')\n return true\n } catch (error) {\n // User may have declined or browser doesn't support\n console.info('[CREDENTIAL] Failed to store credential:', error)\n return false\n }\n}\n","import {\n useMemo,\n useRef,\n useState,\n type DragEvent,\n type FormEvent,\n type ReactNode,\n useId,\n} from 'react'\nimport { AlertCircle, Key, Loader2, Shield, Upload } from 'lucide-react'\nimport {\n Button,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nfunction ErrorBox({ message, id }: { message: string; id?: string }) {\n return (\n <div id={id} role=\"alert\" className=\"rounded-md bg-red-bg p-3\">\n <div className=\"flex gap-2\">\n <AlertCircle className=\"h-5 w-5 flex-shrink-0 text-red-text\" aria-hidden=\"true\" />\n <p className=\"text-sm text-red-text\">{message}</p>\n </div>\n </div>\n )\n}\n\n/** Every fixed string of the recovery-key dialog. `title` / description props win. */\nexport interface RecoveryKeyDialogLabels {\n title: string\n verifiedDescription: string\n unverifiedDescription: string\n done: string\n currentPassword: string\n passwordPlaceholder: string\n cancel: string\n verifying: string\n verify: string\n}\n\nexport const DEFAULT_RECOVERY_KEY_DIALOG_LABELS: RecoveryKeyDialogLabels = {\n title: 'Save your recovery key',\n verifiedDescription:\n \"If you forget your password, this is the only way to get back into your account. Save it to your password manager so it's there when you need it.\",\n unverifiedDescription: 'Confirm your password to continue.',\n done: 'Done',\n currentPassword: 'Current Password',\n passwordPlaceholder: 'Enter your password',\n cancel: 'Cancel',\n verifying: 'Verifying...',\n verify: 'Verify',\n}\n\n/** Every fixed string of the account-recovery dialog. */\nexport interface AccountRecoveryDialogLabels {\n title: string\n description: string\n emailAddress: string\n emailPlaceholder: string\n keyLoadedFromLink: string\n ssoProtectedKeyNotice: string\n recoveryKey: string\n ssoProtectedKey: string\n dropKeyHere: string\n uploadKeyPrompt: string\n ssoSignInNotice: string\n ssoSignIn: string\n afterRecoveryNotice: string\n cancel: string\n recovering: string\n recoverAccount: string\n}\n\nexport const DEFAULT_ACCOUNT_RECOVERY_DIALOG_LABELS: AccountRecoveryDialogLabels = {\n title: 'Recover Your Account',\n description: 'Upload your recovery key to regain access to your account',\n emailAddress: 'Email Address',\n emailPlaceholder: 'Enter your email',\n keyLoadedFromLink: 'Recovery key loaded from link',\n ssoProtectedKeyNotice: 'SSO-protected key — you must be signed into the matching SSO account.',\n recoveryKey: 'Recovery Key',\n ssoProtectedKey: 'SSO Protected Key',\n dropKeyHere: 'Drop your recovery key here',\n uploadKeyPrompt: 'Click or drag to upload your recovery key (.key file)',\n ssoSignInNotice:\n 'This account signs in with single sign-on. Sign in with your identity provider to continue — you won\\u2019t need your forgotten master password for that step.',\n ssoSignIn: 'Sign in with Auth0 to continue',\n afterRecoveryNotice:\n 'After successful recovery, you will be prompted to set a new password to secure your account.',\n cancel: 'Cancel',\n recovering: 'Recovering...',\n recoverAccount: 'Recover Account',\n}\n\nexport interface RecoveryKeyDialogProps {\n labels?: Partial<RecoveryKeyDialogLabels>\n open: boolean\n onClose: () => void\n /** Content shown once the password is verified (the key download). `null` while verifying. */\n verified: ReactNode | null\n password: string\n onPasswordChange: (password: string) => void\n onVerify: () => void\n isVerifying: boolean\n error: string | null\n title?: string\n verifiedDescription?: string\n unverifiedDescription?: string\n /** Dialog test id (default `download-recovery-key-dialog`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<Record<'passwordInput', string>>\n}\n\n/**\n * \"Save your recovery key\": confirm the account password first, then reveal the key download\n * (`verified`) with a Done button.\n */\nexport function RecoveryKeyDialog({\n open,\n onClose,\n verified,\n password,\n onPasswordChange,\n onVerify,\n isVerifying,\n error,\n title,\n verifiedDescription,\n unverifiedDescription,\n labels,\n testId,\n testIds,\n}: RecoveryKeyDialogProps) {\n const verifyPasswordId = useId()\n const l = useMemo(() => ({ ...DEFAULT_RECOVERY_KEY_DIALOG_LABELS, ...labels }), [labels])\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault()\n onVerify()\n }\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'download-recovery-key-dialog' })}\n >\n <DialogHeader>\n <DialogTitle className=\"font-heading\">{title ?? l.title}</DialogTitle>\n <DialogDescription>\n {verified\n ? (verifiedDescription ?? l.verifiedDescription)\n : (unverifiedDescription ?? l.unverifiedDescription)}\n </DialogDescription>\n </DialogHeader>\n\n {verified ? (\n <div className=\"space-y-4\">\n {verified}\n <div className=\"flex justify-end\">\n <Button onClick={onClose}>{l.done}</Button>\n </div>\n </div>\n ) : (\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label htmlFor={verifyPasswordId} className=\"text-sm font-medium\">\n {l.currentPassword}\n </label>\n <Input\n id={verifyPasswordId}\n type=\"password\"\n value={password}\n onChange={(e) => onPasswordChange(e.target.value)}\n placeholder={l.passwordPlaceholder}\n disabled={isVerifying}\n autoComplete=\"current-password\"\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? `${verifyPasswordId}-error` : undefined}\n data-testid={testIdOr(testIds?.passwordInput, { testId: 'verify-password-input' })}\n />\n </div>\n\n {error && <ErrorBox message={error} id={`${verifyPasswordId}-error`} />}\n\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-3\">\n <Button type=\"button\" variant=\"outline\" onClick={onClose} disabled={isVerifying}>\n {l.cancel}\n </Button>\n <Button type=\"submit\" disabled={isVerifying || !password}>\n {isVerifying ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {l.verifying}\n </>\n ) : (\n l.verify\n )}\n </Button>\n </div>\n </form>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface AccountRecoveryDialogProps {\n labels?: Partial<AccountRecoveryDialogLabels>\n open: boolean\n onClose: () => void\n email: string\n onEmailChange: (email: string) => void\n /** The key arrived in the page URL (the /recover link): show a \"loaded\" notice, no file picker. */\n isKeyFromLink: boolean\n /** Name of the chosen key file, once one is loaded. */\n keyFileName: string | null\n /** The loaded key is wrapped with the user's SSO identity. */\n isKeyEncrypted: boolean\n /** A file was picked or dropped. */\n onKeyFile: (file: File) => void\n error: string | null\n /** SSO sign-in is the next required step (SSO-wrapped key or SSO-linked account). */\n needsSsoSignIn: boolean\n onSsoSignIn: () => void\n isProcessing: boolean\n /** Enables the submit button (email and key present). */\n canSubmit: boolean\n onSubmit: () => void\n /** Dialog test id (default `forgot-password-modal`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<\n Record<'emailInput' | 'keyDropzone' | 'keyInput' | 'ssoSignIn' | 'cancel' | 'submit', string>\n >\n}\n\n/**\n * Account recovery: email + recovery key (file or link) -> sign in with the key. When the account\n * is SSO-linked, the SSO prompt replaces the submit button.\n */\nexport function AccountRecoveryDialog({\n open,\n onClose,\n email,\n onEmailChange,\n isKeyFromLink,\n keyFileName,\n isKeyEncrypted,\n onKeyFile,\n error,\n needsSsoSignIn,\n onSsoSignIn,\n isProcessing,\n canSubmit,\n onSubmit,\n labels,\n testId,\n testIds,\n}: AccountRecoveryDialogProps) {\n const recoveryEmailId = useId()\n const l = useMemo(() => ({ ...DEFAULT_ACCOUNT_RECOVERY_DIALOG_LABELS, ...labels }), [labels])\n const fileInputRef = useRef<HTMLInputElement>(null)\n const [isDragActive, setIsDragActive] = useState(false)\n\n const handleDragOver = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragActive(true)\n }\n const handleDragLeave = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragActive(false)\n }\n const handleDrop = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragActive(false)\n const file = e.dataTransfer.files?.[0]\n if (file) onKeyFile(file)\n }\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'forgot-password-modal' })}\n >\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Key className=\"h-5 w-5 text-primary\" />\n {l.title}\n </DialogTitle>\n <DialogDescription>{l.description}</DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label htmlFor={recoveryEmailId} className=\"text-sm font-medium\">\n {l.emailAddress}\n </label>\n <Input\n id={recoveryEmailId}\n type=\"email\"\n value={email}\n onChange={(e) => onEmailChange(e.target.value)}\n placeholder={l.emailPlaceholder}\n disabled={isProcessing}\n data-testid={testIdOr(testIds?.emailInput, { testId: 'recovery-email-input' })}\n />\n </div>\n\n {isKeyFromLink ? (\n <div className=\"rounded-md bg-green-bg p-3\">\n <div className=\"flex items-center gap-2 text-sm\">\n <Key className=\"h-4 w-4 text-green-text\" />\n <span className=\"font-medium text-green-text\">{l.keyLoadedFromLink}</span>\n </div>\n {isKeyEncrypted && (\n <p className=\"mt-1 inline-flex items-center gap-1 text-sm text-primary\">\n <Shield className=\"h-3 w-3\" />\n {l.ssoProtectedKeyNotice}\n </p>\n )}\n </div>\n ) : (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{l.recoveryKey}</label>\n <div\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'cursor-pointer rounded-lg p-4 text-center transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n isDragActive ? 'bg-accent' : 'bg-muted hover:bg-muted/70'\n )}\n onClick={() => fileInputRef.current?.click()}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n fileInputRef.current?.click()\n }\n }}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n data-testid={testIdOr(testIds?.keyDropzone, { testId: 'recovery-key-dropzone' })}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".key\"\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) onKeyFile(file)\n }}\n className=\"hidden\"\n data-testid={testIdOr(testIds?.keyInput, { testId: 'recovery-key-input' })}\n />\n {keyFileName ? (\n <div className=\"flex flex-col items-center gap-1\">\n <div className=\"flex items-center justify-center gap-2 text-sm\">\n <Key className=\"h-4 w-4 text-green-text\" />\n <span className=\"font-medium text-green-text\">{keyFileName}</span>\n </div>\n {isKeyEncrypted && (\n <span className=\"inline-flex items-center gap-1 text-sm text-primary\">\n <Shield className=\"h-3 w-3\" />\n {l.ssoProtectedKey}\n </span>\n )}\n </div>\n ) : (\n <div className=\"space-y-2\">\n <Upload className=\"mx-auto h-8 w-8 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n {isDragActive ? l.dropKeyHere : l.uploadKeyPrompt}\n </p>\n </div>\n )}\n </div>\n </div>\n )}\n\n {error && <ErrorBox message={error} />}\n\n {needsSsoSignIn ? (\n <div className=\"space-y-2 rounded-lg bg-muted p-3\">\n <div className=\"flex gap-2\">\n <Shield className=\"h-5 w-5 flex-shrink-0 text-primary\" />\n <p className=\"text-sm\">{l.ssoSignInNotice}</p>\n </div>\n <Button\n onClick={onSsoSignIn}\n className=\"w-full\"\n data-testid={testIdOr(testIds?.ssoSignIn, { testId: 'recovery-sso-signin-button' })}\n >\n {l.ssoSignIn}\n </Button>\n </div>\n ) : (\n <div className=\"rounded-md bg-muted p-3\">\n <p className=\"text-sm text-muted-foreground\">{l.afterRecoveryNotice}</p>\n </div>\n )}\n </div>\n\n <DialogFooter className=\"gap-2\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n disabled={isProcessing}\n data-testid={testIdOr(testIds?.cancel, { testId: 'forgot-password-cancel' })}\n >\n {l.cancel}\n </Button>\n {/* Hidden when SSO sign-in is the next step, to avoid two competing options. */}\n {!needsSsoSignIn && (\n <Button\n onClick={onSubmit}\n disabled={isProcessing || !canSubmit}\n data-testid={testIdOr(testIds?.submit, { testId: 'forgot-password-submit' })}\n >\n {isProcessing ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {l.recovering}\n </>\n ) : (\n l.recoverAccount\n )}\n </Button>\n )}\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","/** The auth pages' URL fragment: `#verify=…&code=…&next=…`, and a fragment carried after it. */\n\n/**\n * Split an auth page's hash (`#verify=…&code=…&next=…`) from a second fragment appended after it.\n * A call invitation's registration link ends with the call key fragment (`…#k=…&v=…`) — a URL has\n * one fragment, so it arrives inside ours, after a second `#`.\n */\nexport function splitAuthHash(hash: string): {\n params: URLSearchParams\n /** `#k=…&v=…` (with its `#`), or '' when there is none. */\n trailingFragment: string\n} {\n const raw = hash.replace(/^#/, '')\n const cut = raw.indexOf('#')\n return {\n params: new URLSearchParams(cut >= 0 ? raw.slice(0, cut) : raw),\n trailingFragment: cut >= 0 ? raw.slice(cut) : '',\n }\n}\n\n/** `next` with the trailing fragment appended, unless `next` already carries a fragment. */\nexport function withTrailingFragment(next: string, trailingFragment: string): string {\n if (!trailingFragment || trailingFragment === '#' || next.includes('#')) return next\n return `${next}${trailingFragment}`\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/settings/SettingsPanel.tsx"],"names":["jsx","cn","jsxs","ChevronRight","useMemo","ChevronDown"],"mappings":"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","file":"chunk-NMZI3K6R.cjs","sourcesContent":["import { useMemo, type ComponentProps, type ReactNode } from 'react'\nimport { ChevronDown, ChevronRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the danger zone. `label` prop wins. */\nexport interface SettingsDangerZoneLabels {\n dangerZone: string\n}\n\nexport const DEFAULT_SETTINGS_DANGER_ZONE_LABELS: SettingsDangerZoneLabels = {\n dangerZone: 'Danger Zone',\n}\n\nexport interface SettingsPanelProps extends ComponentProps<'div'> {\n /** Stable test id of the panel. */\n testId?: string\n}\n\n/** Centred column of {@link SettingsSection}s with a readable measure. */\nexport function SettingsPanel({ className, testId, ...props }: SettingsPanelProps) {\n return (\n <div\n data-slot=\"settings-panel\"\n data-testid={testId}\n className={cn('mx-auto w-full max-w-xl space-y-6', className)}\n {...props}\n />\n )\n}\n\nexport interface SettingsSectionProps extends Omit<ComponentProps<'section'>, 'title'> {\n /** Small muted icon before the title. */\n icon?: ReactNode\n title?: ReactNode\n description?: ReactNode\n /** Right-aligned control in the heading row (e.g. a Reset button). */\n action?: ReactNode\n testId?: string\n}\n\n/** Titled group of settings: heading row, optional description, then the controls. */\nexport function SettingsSection({\n icon,\n title,\n description,\n action,\n testId,\n className,\n children,\n ...props\n}: SettingsSectionProps) {\n return (\n <section\n data-slot=\"settings-section\"\n data-testid={testId}\n className={cn('space-y-3', className)}\n {...props}\n >\n {(title || action) && (\n <div className=\"flex items-center justify-between gap-3\">\n {title && (\n <div className=\"flex items-center gap-2\">\n {icon && (\n <span className=\"text-muted-foreground [&_svg]:h-4 [&_svg]:w-4\">{icon}</span>\n )}\n <h2 className=\"text-base font-semibold text-foreground\">{title}</h2>\n </div>\n )}\n {action}\n </div>\n )}\n {description && <p className=\"text-sm text-muted-foreground\">{description}</p>}\n {children}\n </section>\n )\n}\n\nexport interface SettingsRowProps extends Omit<ComponentProps<'div'>, 'title'> {\n label: ReactNode\n /** Id of the control: renders the label as a `<label htmlFor>` so it toggles the control. */\n labelFor?: string\n description?: ReactNode\n /** The control: switch, select, button. Sits at the end of the row. */\n children?: ReactNode\n testId?: string\n}\n\n/** One setting: label + help text on the left, its control on the right (stacks on phones). */\nexport function SettingsRow({\n label,\n labelFor,\n description,\n children,\n testId,\n className,\n ...props\n}: SettingsRowProps) {\n return (\n <div\n data-slot=\"settings-row\"\n data-testid={testId}\n className={cn(\n 'flex flex-col gap-2 py-2 @xl:flex-row @xl:items-center @xl:justify-between @xl:gap-6',\n className\n )}\n {...props}\n >\n <div className=\"min-w-0\">\n {labelFor ? (\n <label htmlFor={labelFor} className=\"text-sm font-medium text-foreground\">\n {label}\n </label>\n ) : (\n <div className=\"text-sm font-medium text-foreground\">{label}</div>\n )}\n {description && <div className=\"text-sm text-muted-foreground\">{description}</div>}\n </div>\n {children && <div className=\"flex shrink-0 items-center gap-2\">{children}</div>}\n </div>\n )\n}\n\nexport interface SettingsCardProps extends ComponentProps<'div'> {\n /** `md` for form-like content, `sm` when the card holds a list of full-bleed action rows. */\n padding?: 'md' | 'sm'\n}\n\n/** Bordered card that groups related settings, the same surface as the dashboard cards. */\nexport function SettingsCard({ padding = 'md', className, ...props }: SettingsCardProps) {\n return (\n <div\n data-slot=\"settings-card\"\n className={cn(\n 'rounded-lg border border-border bg-card shadow-xs',\n padding === 'md' ? 'space-y-5 p-5' : 'divide-y divide-border p-2',\n className\n )}\n {...props}\n />\n )\n}\n\nexport interface SettingsActionRowProps {\n title: ReactNode\n description?: ReactNode\n onClick: () => void\n testId?: string\n}\n\n/** Full-width row that opens a dialog or sub-page: title, help text and a chevron. */\nexport function SettingsActionRow({ title, description, onClick, testId }: SettingsActionRowProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n data-slot=\"settings-action-row\"\n data-testid={testId}\n className=\"flex w-full items-center gap-3 rounded-md px-3 py-3 text-left transition-colors hover:bg-background/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold text-foreground\">{title}</div>\n {description && (\n <div className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">{description}</div>\n )}\n </div>\n <ChevronRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n )\n}\n\nexport interface SettingsDangerZoneProps {\n isOpen: boolean\n onToggle: () => void\n /** Heading of the collapsed zone. */\n label?: string\n title: ReactNode\n description: ReactNode\n /** The destructive control (a Button). */\n action: ReactNode\n labels?: Partial<SettingsDangerZoneLabels>\n}\n\n/** Collapsed-by-default zone for irreversible actions. */\nexport function SettingsDangerZone({\n isOpen,\n onToggle,\n label,\n title,\n description,\n action,\n labels,\n}: SettingsDangerZoneProps) {\n const l = useMemo(() => ({ ...DEFAULT_SETTINGS_DANGER_ZONE_LABELS, ...labels }), [labels])\n return (\n <div data-slot=\"settings-danger-zone\" className=\"mt-8 pt-2\">\n <button\n type=\"button\"\n onClick={onToggle}\n aria-expanded={isOpen}\n className=\"flex w-full items-center gap-1.5 text-left pointer-coarse:min-h-11\"\n >\n {isOpen ? (\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n <p className=\"text-sm font-medium text-muted-foreground\">{label ?? l.dangerZone}</p>\n </button>\n {isOpen && (\n <div className=\"mt-3 flex items-center justify-between gap-4 rounded-lg bg-destructive/5 p-4\">\n <div>\n <p className=\"font-medium\">{title}</p>\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n </div>\n <div className=\"shrink-0\">{action}</div>\n </div>\n )}\n </div>\n )\n}\n"]}
|