@arbidocs/blocks 0.4.70 → 0.4.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +90 -14
  2. package/bin/arbidocs-copy-pdf-assets.mjs +112 -0
  3. package/dist/{StreamedArtifactEditor-OPL4KXOT.js → StreamedArtifactEditor-HTNPG4NB.js} +3 -2
  4. package/dist/StreamedArtifactEditor-HTNPG4NB.js.map +1 -0
  5. package/dist/{StreamedArtifactEditor-RIKG6CJQ.cjs → StreamedArtifactEditor-IZWYNFMM.cjs} +3 -2
  6. package/dist/StreamedArtifactEditor-IZWYNFMM.cjs.map +1 -0
  7. package/dist/agents/index.cjs +1 -0
  8. package/dist/agents/index.js +1 -0
  9. package/dist/artifacts/editor/index.cjs +1 -0
  10. package/dist/artifacts/editor/index.js +1 -0
  11. package/dist/artifacts/index.cjs +1 -0
  12. package/dist/artifacts/index.js +1 -0
  13. package/dist/auth/index.cjs +1 -0
  14. package/dist/auth/index.js +1 -0
  15. package/dist/chat/index.cjs +1 -0
  16. package/dist/chat/index.js +1 -0
  17. package/dist/{chunk-CW4WXGEN.js → chunk-3TVTG7FK.js} +3 -3
  18. package/dist/{chunk-CW4WXGEN.js.map → chunk-3TVTG7FK.js.map} +1 -1
  19. package/dist/{chunk-EHXSBH6U.js → chunk-5HOAOKZL.js} +4 -2
  20. package/dist/chunk-5HOAOKZL.js.map +1 -0
  21. package/dist/chunk-DES3K4SD.cjs +18 -0
  22. package/dist/chunk-DES3K4SD.cjs.map +1 -0
  23. package/dist/{chunk-BR2CPKFU.cjs → chunk-LTA2IAQB.cjs} +6 -6
  24. package/dist/{chunk-BR2CPKFU.cjs.map → chunk-LTA2IAQB.cjs.map} +1 -1
  25. package/dist/{chunk-TLQQV7WW.cjs → chunk-THO7DZNN.cjs} +4 -2
  26. package/dist/chunk-THO7DZNN.cjs.map +1 -0
  27. package/dist/chunk-VUNV25KB.js +15 -0
  28. package/dist/chunk-VUNV25KB.js.map +1 -0
  29. package/dist/citations/index.cjs +1 -0
  30. package/dist/citations/index.js +1 -0
  31. package/dist/collaboration/index.cjs +1 -0
  32. package/dist/collaboration/index.js +1 -0
  33. package/dist/connect/docx.cjs +3 -2
  34. package/dist/connect/docx.cjs.map +1 -1
  35. package/dist/connect/docx.js +2 -1
  36. package/dist/connect/docx.js.map +1 -1
  37. package/dist/connect/index.cjs +25 -24
  38. package/dist/connect/index.cjs.map +1 -1
  39. package/dist/connect/index.js +6 -5
  40. package/dist/connect/index.js.map +1 -1
  41. package/dist/connection/ConnectionProvider.d.ts +5 -0
  42. package/dist/connection/types.d.ts +6 -0
  43. package/dist/document-tools/SignatureStatus.d.ts +4 -2
  44. package/dist/document-tools/index.cjs +10 -6
  45. package/dist/document-tools/index.cjs.map +1 -1
  46. package/dist/document-tools/index.js +11 -7
  47. package/dist/document-tools/index.js.map +1 -1
  48. package/dist/document-tools/production/ProductionSetDialog.d.ts +23 -0
  49. package/dist/document-tools/production/index.cjs +102 -0
  50. package/dist/document-tools/production/index.cjs.map +1 -0
  51. package/dist/document-tools/production/index.d.ts +1 -0
  52. package/dist/document-tools/production/index.js +100 -0
  53. package/dist/document-tools/production/index.js.map +1 -0
  54. package/dist/document-tools/viewer/index.cjs +1 -1
  55. package/dist/document-tools/viewer/index.js +1 -1
  56. package/dist/docx/index.cjs +1 -0
  57. package/dist/docx/index.cjs.map +1 -1
  58. package/dist/docx/index.js +1 -0
  59. package/dist/docx/index.js.map +1 -1
  60. package/dist/facts/index.cjs +1 -0
  61. package/dist/facts/index.cjs.map +1 -1
  62. package/dist/facts/index.js +1 -0
  63. package/dist/facts/index.js.map +1 -1
  64. package/dist/files/index.cjs +1 -0
  65. package/dist/files/index.cjs.map +1 -1
  66. package/dist/files/index.js +1 -0
  67. package/dist/files/index.js.map +1 -1
  68. package/dist/home/index.cjs +1 -0
  69. package/dist/home/index.cjs.map +1 -1
  70. package/dist/home/index.js +1 -0
  71. package/dist/home/index.js.map +1 -1
  72. package/dist/index.cjs +1 -0
  73. package/dist/index.cjs.map +1 -1
  74. package/dist/index.js +1 -0
  75. package/dist/index.js.map +1 -1
  76. package/dist/lib-6QPUXAQS.cjs +9674 -0
  77. package/dist/lib-6QPUXAQS.cjs.map +1 -0
  78. package/dist/lib-NRGL2JGF.js +9672 -0
  79. package/dist/lib-NRGL2JGF.js.map +1 -0
  80. package/dist/retrieval/index.cjs +1 -0
  81. package/dist/retrieval/index.js +1 -0
  82. package/dist/settings/index.cjs +1 -0
  83. package/dist/settings/index.cjs.map +1 -1
  84. package/dist/settings/index.js +1 -0
  85. package/dist/settings/index.js.map +1 -1
  86. package/dist/shell/index.cjs +1 -0
  87. package/dist/shell/index.js +1 -0
  88. package/dist/site/index.cjs +1 -0
  89. package/dist/site/index.js +1 -0
  90. package/dist/studio/index.cjs +5 -4
  91. package/dist/studio/index.cjs.map +1 -1
  92. package/dist/studio/index.js +3 -2
  93. package/dist/studio/index.js.map +1 -1
  94. package/dist/timeline/index.cjs +1 -0
  95. package/dist/timeline/index.js +1 -0
  96. package/dist/workspaces/index.cjs +1 -0
  97. package/dist/workspaces/index.cjs.map +1 -1
  98. package/dist/workspaces/index.js +1 -0
  99. package/dist/workspaces/index.js.map +1 -1
  100. package/package.json +16 -4
  101. package/dist/StreamedArtifactEditor-OPL4KXOT.js.map +0 -1
  102. package/dist/StreamedArtifactEditor-RIKG6CJQ.cjs.map +0 -1
  103. package/dist/chunk-EHXSBH6U.js.map +0 -1
  104. package/dist/chunk-TLQQV7WW.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/document-tools/DocumentToolButtons.tsx","../../src/document-tools/MarkupNotices.tsx","../../src/document-tools/MarkupViewNote.tsx","../../src/document-tools/SignDocumentDialog.tsx","../../src/document-tools/SignatureStatus.tsx","../../src/document-tools/SignatureCertificate.tsx","../../src/document-tools/VersionSnapshotBar.tsx"],"names":["jsxs","Button","jsx","PencilLine","FileText","Download","PenLine","Fragment","ViewerStatusNote","useDocumentTools","useState","useSignDocument","ModalScaffold","Label","Input","Checkbox","defaultCertificateUrl","Popover","PopoverTrigger","PopoverContent","useRef","matchSignedCopy","cn","LINK"],"mappings":"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","file":"index.cjs","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, PencilLine, PenLine } 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 * 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 * Sign a document electronically: confirm the name, choose whether the date is shown, read the\n * statement of intent, re-enter the password. Only the signature (and the date, if ticked) is drawn\n * on the page; a role, a firm or a place go on as ordinary annotation text. Anyone can click the\n * signature to check it. The signed copy is saved as a new version and opened, with an offer to\n * email it when the host gives the tools an `emailDocument`. Needs a `<DocumentToolsProvider>` with\n * a `user` (its email) and a `deploymentDomain`, inside a React Query `QueryClientProvider`.\n */\n\nimport { useState, type FormEvent, type ReactElement } from 'react'\nimport {\n intentText,\n useDocumentTools,\n useSignDocument,\n type SignatureAppearance,\n} from '@arbidocs/react/document-tools'\nimport { Button, Checkbox, Input, Label } from '@arbidocs/react/ui'\nimport { ModalScaffold } from '../settings/ModalScaffold'\n\nexport interface SignDocumentDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n documentId: string\n /** The PDF the viewer is showing. */\n pdfBlob: Blob\n /** Where the signature goes; omitted = bottom of the last page. */\n appearance?: SignatureAppearance\n}\n\nexport function SignDocumentDialog({\n open,\n onOpenChange,\n documentId,\n pdfBlob,\n appearance,\n}: SignDocumentDialogProps): ReactElement {\n const { user, notify, openDocument, emailDocument } = useDocumentTools()\n const [name, setName] = useState(() => user?.name ?? '')\n const [includeDate, setIncludeDate] = useState(false)\n const [password, setPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const sign = useSignDocument()\n\n const signer = { name }\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault()\n if (!user?.email) return\n setError(null)\n try {\n const result = await sign.mutateAsync({\n documentId,\n pdfBlob,\n email: user.email,\n password,\n signer,\n appearance,\n includeDate,\n })\n const signedId = result.doc_ext_id\n notify(\n `Signed. The signed copy is saved as version ${result.version}.`,\n 'success',\n emailDocument\n ? { action: { label: 'Email it', onClick: () => emailDocument(signedId) } }\n : result.signature.certificate_url\n ? {\n action: {\n label: 'View certificate',\n onClick: () => {\n window.open(result.signature.certificate_url, '_blank', 'noopener,noreferrer')\n },\n },\n }\n : undefined\n )\n setPassword('')\n onOpenChange(false)\n openDocument?.(signedId)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Signing failed')\n }\n }\n\n return (\n <ModalScaffold\n open={open}\n onOpenChange={(next) => !sign.isPending && onOpenChange(next)}\n title=\"Sign document\"\n description=\"Sign this document electronically. The signed copy is saved as a new version.\"\n showDescription\n testId=\"sign-document-dialog\"\n >\n <form onSubmit={handleSubmit}>\n <ModalScaffold.Body>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"sign-name\">Name</Label>\n <Input\n id=\"sign-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n data-testid=\"sign-document-name-input\"\n required\n />\n </div>\n <div className=\"flex items-center gap-2 pointer-coarse:min-h-11\">\n <Checkbox\n id=\"sign-include-date\"\n checked={includeDate}\n onCheckedChange={(checked) => setIncludeDate(checked === true)}\n data-testid=\"sign-document-include-date\"\n />\n <Label htmlFor=\"sign-include-date\" className=\"font-normal\">\n Include date\n </Label>\n </div>\n <p className=\"text-sm text-muted-foreground\" data-testid=\"sign-document-appearance-note\">\n Only your signature{includeDate ? ' and the date appear' : ' appears'} on the page.\n Anyone can click it to check it.\n </p>\n {name.trim() && (\n <blockquote\n className=\"border-l-2 border-border pl-3 text-sm text-muted-foreground\"\n data-testid=\"sign-document-intent\"\n >\n {intentText(signer)}\n </blockquote>\n )}\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"sign-password\">Password</Label>\n <Input\n id=\"sign-password\"\n type=\"password\"\n autoComplete=\"current-password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n data-testid=\"sign-document-password-input\"\n required\n />\n </div>\n {error && (\n <p className=\"text-sm text-red-text\" role=\"alert\" data-testid=\"sign-document-error\">\n {error}\n </p>\n )}\n </ModalScaffold.Body>\n <ModalScaffold.Footer>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={sign.isPending}\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={sign.isPending || !name.trim() || !password}\n data-testid=\"sign-document-submit-button\"\n >\n {sign.isPending ? 'Signing...' : 'Sign'}\n </Button>\n </ModalScaffold.Footer>\n </form>\n </ModalScaffold>\n )\n}\n","/**\n * The \"Signed — locked\" note in the viewer header (a signed version changes only by a further\n * signature), which opens the signature details: who signed and when,\n * whether the document is unchanged since, and \"View certificate\", the public page anyone can\n * check the signature on (the same page the signature on the PDF links to). Read from the PDF\n * itself (GET .../signatures). A counter-signed copy lists every signature, oldest first.\n */\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { defaultCertificateUrl, type SignatureStatusResponse } from '@arbidocs/react/document-tools'\nimport { Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\n\n/** \"14 Oct 2026, 12:00\" in the reader's locale and time zone. */\nexport function formatSignedAt(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso\n return date.toLocaleString([], { dateStyle: 'medium', timeStyle: 'short' })\n}\n\nexport interface SignatureStatusProps {\n status: SignatureStatusResponse\n /** How the signing time is shown. Default: {@link formatSignedAt}. */\n formatDate?: (iso: string) => string\n /**\n * The certificate page of a signature, only for a record without the `certificate_url` the API\n * returns. Default: `/verify/{reference}` on this origin.\n */\n certificateUrl?: (reference: string) => string\n}\n\nfunction Row({ label, field, children }: { label: string; field: string; children: ReactNode }) {\n return (\n <div className=\"grid grid-cols-[5.5rem_1fr] gap-2\">\n <dt className=\"text-muted-foreground\">{label}</dt>\n <dd className=\"min-w-0 break-words\" data-testid={`signature-detail-${field}`}>\n {children}\n </dd>\n </div>\n )\n}\n\nexport function SignatureStatus({\n status,\n formatDate = formatSignedAt,\n certificateUrl = defaultCertificateUrl,\n}: SignatureStatusProps): ReactElement {\n const signatures = status.signatures ?? []\n // A signed copy can be counter-signed: each signature is listed, oldest first.\n const isCounterSigned = signatures.length > 1\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"flex-shrink-0 text-sm text-muted-foreground underline decoration-dotted underline-offset-4 hover:text-foreground pointer-coarse:min-h-11\"\n data-testid=\"document-signature-status\"\n aria-label={`${status.intact ? 'Signed, locked' : 'Modified after signing'}: show signature details`}\n >\n {status.intact ? 'Signed — locked' : 'Modified after signing'}\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"max-h-[70vh] w-80 overflow-y-auto p-3 text-sm\"\n align=\"start\"\n data-testid=\"signature-details\"\n >\n <p className=\"mb-2 font-medium\" data-testid=\"signature-details-title\">\n {isCounterSigned\n ? `Electronic signatures (${signatures.length})`\n : 'Electronic signature'}\n </p>\n {signatures.map((signature, index) => (\n <dl\n key={signature.reference}\n className={`mb-3 space-y-1 ${index > 0 ? 'border-t border-border pt-2' : ''}`}\n data-testid={`signature-item-${index}`}\n >\n <Row label=\"Signed by\" field=\"signer\">\n {signature.signer_name || signature.signer_email}\n </Row>\n <Row label=\"On\" field=\"time\">\n {formatDate(signature.signed_at)}\n </Row>\n <dd>\n <a\n href={signature.certificate_url || certificateUrl(signature.reference)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center font-medium text-primary hover:underline pointer-coarse:min-h-11\"\n data-testid={`signature-certificate-link-${index}`}\n >\n View certificate\n </a>\n </dd>\n </dl>\n ))}\n <p\n className={`border-t border-border pt-2 ${status.intact ? '' : 'text-red-text'}`}\n data-testid=\"signature-detail-intact\"\n >\n {status.intact\n ? isCounterSigned\n ? '✓ Unchanged since the last signature'\n : '✓ Unchanged since signing'\n : '✗ Changed after it was signed'}\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\" data-testid=\"signature-detail-locked\">\n Locked: only further signatures can be added.\n </p>\n </PopoverContent>\n </Popover>\n )\n}\n","/**\n * The certificate of an ARBI signature: the page the link on a signed PDF's signature opens, for\n * anyone, signed in or not. Plain English and short: who signed and when, what ARBI checks, the\n * result, any counter-signatures, and \"Check your copy\", which hashes a PDF in the browser and\n * compares it with the signed document and each signed revision (the file never leaves the\n * device). No email addresses and no\n * document content. Presentational: `verification` comes from `useSignatureVerification` in\n * `@arbidocs/react/document-tools`.\n */\n\nimport { useRef, useState, type DragEvent, type ReactElement, type ReactNode } from 'react'\nimport {\n matchSignedCopy,\n type CopyMatch,\n type SignatureVerification,\n} from '@arbidocs/react/document-tools'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatSignedAt } from './SignatureStatus'\n\nexport interface SignatureCertificateProps {\n /** The signature reference (`sig-…`), shown at the foot of the page. */\n reference?: string\n verification?: SignatureVerification\n isLoading?: boolean\n /** Why the signature could not be checked. */\n error?: string | null\n /** The error is a passing one (too many checks): say it calmly, not as a failure. */\n isErrorTransient?: boolean\n /** How signing times are shown. Default: {@link formatSignedAt}. */\n formatDate?: (iso: string) => string\n /** Offer \"Check your copy\". Default on. */\n allowCopyCheck?: boolean\n}\n\ntype CopyCheck =\n | { state: 'idle' }\n | { state: 'checking'; name: string }\n | { state: 'done'; name: string; match: CopyMatch }\n | { state: 'failed'; name: string }\n\nfunction Frame({ children }: { children: ReactNode }) {\n return (\n <main\n className=\"mx-auto w-full max-w-xl px-4 py-10 text-foreground\"\n data-testid=\"signature-certificate\"\n >\n <h1 className=\"mb-6 text-xl font-semibold\">Signature certificate</h1>\n {children}\n </main>\n )\n}\n\nfunction copyResult(name: string, match: CopyMatch): string {\n if (match.kind === 'current') return `✓ ${name} is the signed document, unchanged.`\n if (match.kind === 'earlier') {\n // A counter-signed PDF: the copy is an earlier signed revision, which is still genuine.\n return `✓ ${name}: this is the version signed by ${match.signature.signer_name || 'an ARBI user'}.`\n }\n return `✗ ${name} is not the signed document: it differs from what was signed.`\n}\n\nexport function SignatureCertificate({\n reference,\n verification,\n isLoading = false,\n error,\n isErrorTransient = false,\n formatDate = formatSignedAt,\n allowCopyCheck = true,\n}: SignatureCertificateProps): ReactElement {\n const [copy, setCopy] = useState<CopyCheck>({ state: 'idle' })\n const [dragging, setDragging] = useState(false)\n const input = useRef<HTMLInputElement>(null)\n\n if (isLoading) {\n return (\n <Frame>\n <p className=\"text-muted-foreground\" data-testid=\"signature-certificate-loading\">\n Checking the signature…\n </p>\n </Frame>\n )\n }\n if (error || !verification) {\n return (\n <Frame>\n <p\n className={isErrorTransient ? 'text-muted-foreground' : 'text-red-text'}\n role={isErrorTransient ? 'status' : 'alert'}\n data-testid=\"signature-certificate-error\"\n >\n {error || 'The signature could not be checked.'}\n </p>\n </Frame>\n )\n }\n\n const [first, ...counter] = verification.signatures\n const check = async (file: File | undefined) => {\n if (!file) return\n setCopy({ state: 'checking', name: file.name })\n try {\n setCopy({ state: 'done', name: file.name, match: await matchSignedCopy(file, verification) })\n } catch {\n setCopy({ state: 'failed', name: file.name })\n }\n }\n const onDrop = (e: DragEvent) => {\n e.preventDefault()\n setDragging(false)\n void check(e.dataTransfer.files[0])\n }\n\n return (\n <Frame>\n <section className=\"space-y-3\">\n {first && (\n <p className=\"text-base\" data-testid=\"signature-certificate-signer\">\n Signed by <strong>{first.signer_name || 'an ARBI user'}</strong> on{' '}\n {formatDate(first.signed_at)}\n </p>\n )}\n {counter.length > 0 && (\n <ul className=\"space-y-1 text-sm\" data-testid=\"signature-certificate-counter\">\n {counter.map((s, i) => (\n <li key={`${s.sha256}-${i}`}>\n Also signed by <strong>{s.signer_name || 'an ARBI user'}</strong> on{' '}\n {formatDate(s.signed_at)}\n </li>\n ))}\n </ul>\n )}\n <p className=\"text-sm text-muted-foreground\">\n ARBI checks that this document hasn’t changed since it was signed. If anything changed,\n this check fails.\n </p>\n <p\n className={cn(\n 'rounded-md border px-3 py-2 font-medium',\n verification.intact\n ? 'border-green-border bg-green-bg text-green-text'\n : 'border-red-text text-red-text'\n )}\n role=\"status\"\n data-testid=\"signature-certificate-result\"\n data-intact={verification.intact}\n >\n {verification.intact\n ? '✓ Unchanged since signing'\n : '✗ Changed since signing: this is not the document that was signed'}\n </p>\n </section>\n\n {allowCopyCheck && (\n <section className=\"mt-8 space-y-2\">\n <h2 className=\"text-sm font-medium\">Check your copy</h2>\n <div\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'flex min-h-24 cursor-pointer flex-col items-center justify-center rounded-md border border-dashed px-4 py-6 text-center text-sm text-muted-foreground pointer-coarse:min-h-32',\n dragging && 'border-primary bg-muted'\n )}\n data-testid=\"signature-certificate-dropzone\"\n onClick={() => input.current?.click()}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n input.current?.click()\n }\n }}\n onDragOver={(e) => {\n e.preventDefault()\n setDragging(true)\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={onDrop}\n >\n Drop the PDF you were sent here, or choose it\n <span className=\"mt-1 text-xs\">It is checked in this browser and never uploaded.</span>\n <input\n ref={input}\n type=\"file\"\n accept=\"application/pdf,.pdf\"\n className=\"sr-only\"\n data-testid=\"signature-certificate-file-input\"\n onChange={(e) => void check(e.target.files?.[0])}\n />\n </div>\n {copy.state !== 'idle' && (\n <p\n className={cn(\n 'text-sm',\n copy.state === 'done' && copy.match.kind !== 'none' && 'text-green-text',\n ((copy.state === 'done' && copy.match.kind === 'none') ||\n copy.state === 'failed') &&\n 'text-red-text'\n )}\n role=\"status\"\n data-testid=\"signature-certificate-copy-result\"\n >\n {copy.state === 'checking'\n ? `Checking ${copy.name}…`\n : copy.state === 'failed'\n ? `${copy.name} could not be read.`\n : copyResult(copy.name, copy.match)}\n </p>\n )}\n </section>\n )}\n\n {reference && (\n <p\n className=\"mt-8 text-xs text-muted-foreground\"\n data-testid=\"signature-certificate-reference\"\n >\n Reference {reference}\n </p>\n )}\n </Frame>\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"]}
1
+ {"version":3,"sources":["../../src/document-tools/DocumentToolButtons.tsx","../../src/document-tools/MarkupNotices.tsx","../../src/document-tools/MarkupViewNote.tsx","../../src/document-tools/SignDocumentDialog.tsx","../../src/document-tools/SignatureStatus.tsx","../../src/document-tools/SignatureCertificate.tsx","../../src/document-tools/VersionSnapshotBar.tsx"],"names":["jsxs","Button","jsx","PencilLine","FileText","Download","PenLine","Fragment","ViewerStatusNote","useDocumentTools","useState","useSignDocument","certificateLink","ModalScaffold","Label","Input","Checkbox","useOptionalDocumentTools","Popover","PopoverTrigger","PopoverContent","useRef","matchSignedCopy","cn","LINK"],"mappings":"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","file":"index.cjs","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, PencilLine, PenLine } 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 * 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 * Sign a document electronically: confirm the name, choose whether the date is shown, read the\n * statement of intent, re-enter the password. Only the signature (and the date, if ticked) is drawn\n * on the page; a role, a firm or a place go on as ordinary annotation text. Anyone can click the\n * signature to check it. The signed copy is saved as a new version and opened, with an offer to\n * email it when the host gives the tools an `emailDocument`. Needs a `<DocumentToolsProvider>` with\n * a `user` (its email) and a `deploymentDomain`, inside a React Query `QueryClientProvider`.\n */\n\nimport { useState, type FormEvent, type ReactElement } from 'react'\nimport {\n certificateLink,\n intentText,\n useDocumentTools,\n useSignDocument,\n type SignatureAppearance,\n} from '@arbidocs/react/document-tools'\nimport { Button, Checkbox, Input, Label } from '@arbidocs/react/ui'\nimport { ModalScaffold } from '../settings/ModalScaffold'\n\nexport interface SignDocumentDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n documentId: string\n /** The PDF the viewer is showing. */\n pdfBlob: Blob\n /** Where the signature goes; omitted = bottom of the last page. */\n appearance?: SignatureAppearance\n}\n\nexport function SignDocumentDialog({\n open,\n onOpenChange,\n documentId,\n pdfBlob,\n appearance,\n}: SignDocumentDialogProps): ReactElement {\n const { user, notify, openDocument, emailDocument, certificateUrl } = useDocumentTools()\n const [name, setName] = useState(() => user?.name ?? '')\n const [includeDate, setIncludeDate] = useState(false)\n const [password, setPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const sign = useSignDocument()\n\n const signer = { name }\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault()\n if (!user?.email) return\n setError(null)\n try {\n const result = await sign.mutateAsync({\n documentId,\n pdfBlob,\n email: user.email,\n password,\n signer,\n appearance,\n includeDate,\n })\n const signedId = result.doc_ext_id\n const certificate = certificateLink(result.signature, certificateUrl)\n notify(\n `Signed. The signed copy is saved as version ${result.version}.`,\n 'success',\n emailDocument\n ? { action: { label: 'Email it', onClick: () => emailDocument(signedId) } }\n : {\n action: {\n label: 'View certificate',\n onClick: () => {\n window.open(certificate, '_blank', 'noopener,noreferrer')\n },\n },\n }\n )\n setPassword('')\n onOpenChange(false)\n openDocument?.(signedId)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Signing failed')\n }\n }\n\n return (\n <ModalScaffold\n open={open}\n onOpenChange={(next) => !sign.isPending && onOpenChange(next)}\n title=\"Sign document\"\n description=\"Sign this document electronically. The signed copy is saved as a new version.\"\n showDescription\n testId=\"sign-document-dialog\"\n >\n <form onSubmit={handleSubmit}>\n <ModalScaffold.Body>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"sign-name\">Name</Label>\n <Input\n id=\"sign-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n data-testid=\"sign-document-name-input\"\n required\n />\n </div>\n <div className=\"flex items-center gap-2 pointer-coarse:min-h-11\">\n <Checkbox\n id=\"sign-include-date\"\n checked={includeDate}\n onCheckedChange={(checked) => setIncludeDate(checked === true)}\n data-testid=\"sign-document-include-date\"\n />\n <Label htmlFor=\"sign-include-date\" className=\"font-normal\">\n Include date\n </Label>\n </div>\n <p className=\"text-sm text-muted-foreground\" data-testid=\"sign-document-appearance-note\">\n Only your signature{includeDate ? ' and the date appear' : ' appears'} on the page.\n Anyone can click it to check it.\n </p>\n {name.trim() && (\n <blockquote\n className=\"border-l-2 border-border pl-3 text-sm text-muted-foreground\"\n data-testid=\"sign-document-intent\"\n >\n {intentText(signer)}\n </blockquote>\n )}\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"sign-password\">Password</Label>\n <Input\n id=\"sign-password\"\n type=\"password\"\n autoComplete=\"current-password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n data-testid=\"sign-document-password-input\"\n required\n />\n </div>\n {error && (\n <p className=\"text-sm text-red-text\" role=\"alert\" data-testid=\"sign-document-error\">\n {error}\n </p>\n )}\n </ModalScaffold.Body>\n <ModalScaffold.Footer>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={sign.isPending}\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={sign.isPending || !name.trim() || !password}\n data-testid=\"sign-document-submit-button\"\n >\n {sign.isPending ? 'Signing...' : 'Sign'}\n </Button>\n </ModalScaffold.Footer>\n </form>\n </ModalScaffold>\n )\n}\n","/**\n * The \"Signed — locked\" note in the viewer header (a signed version changes only by a further\n * signature), which opens the signature details: who signed and when,\n * whether the document is unchanged since, and \"View certificate\", the public page anyone can\n * check the signature on (the same page the signature on the PDF links to). Read from the PDF\n * itself (GET .../signatures). A counter-signed copy lists every signature, oldest first.\n */\n\nimport type { ReactElement, ReactNode } from 'react'\nimport {\n certificateLink,\n useOptionalDocumentTools,\n type SignatureStatusResponse,\n} from '@arbidocs/react/document-tools'\nimport { Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\n\n/** \"14 Oct 2026, 12:00\" in the reader's locale and time zone. */\nexport function formatSignedAt(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso\n return date.toLocaleString([], { dateStyle: 'medium', timeStyle: 'short' })\n}\n\nexport interface SignatureStatusProps {\n status: SignatureStatusResponse\n /** How the signing time is shown. Default: {@link formatSignedAt}. */\n formatDate?: (iso: string) => string\n /**\n * The certificate page of a signature in this app. Preferred over the `certificate_url` the API\n * returns (which is on the deployment domain). Default: the enclosing `<DocumentToolsProvider>`'s\n * `certificateUrl`, if any; without either, the API's `certificate_url`, else\n * `/verify/{reference}` on this origin.\n */\n certificateUrl?: (reference: string) => string\n}\n\nfunction Row({ label, field, children }: { label: string; field: string; children: ReactNode }) {\n return (\n <div className=\"grid grid-cols-[5.5rem_1fr] gap-2\">\n <dt className=\"text-muted-foreground\">{label}</dt>\n <dd className=\"min-w-0 break-words\" data-testid={`signature-detail-${field}`}>\n {children}\n </dd>\n </div>\n )\n}\n\nexport function SignatureStatus({\n status,\n formatDate = formatSignedAt,\n certificateUrl,\n}: SignatureStatusProps): ReactElement {\n const tools = useOptionalDocumentTools()\n const hostCertificateUrl = certificateUrl ?? tools?.certificateUrl\n const signatures = status.signatures ?? []\n // A signed copy can be counter-signed: each signature is listed, oldest first.\n const isCounterSigned = signatures.length > 1\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"flex-shrink-0 text-sm text-muted-foreground underline decoration-dotted underline-offset-4 hover:text-foreground pointer-coarse:min-h-11\"\n data-testid=\"document-signature-status\"\n aria-label={`${status.intact ? 'Signed, locked' : 'Modified after signing'}: show signature details`}\n >\n {status.intact ? 'Signed — locked' : 'Modified after signing'}\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"max-h-[70vh] w-80 overflow-y-auto p-3 text-sm\"\n align=\"start\"\n data-testid=\"signature-details\"\n >\n <p className=\"mb-2 font-medium\" data-testid=\"signature-details-title\">\n {isCounterSigned\n ? `Electronic signatures (${signatures.length})`\n : 'Electronic signature'}\n </p>\n {signatures.map((signature, index) => (\n <dl\n key={signature.reference}\n className={`mb-3 space-y-1 ${index > 0 ? 'border-t border-border pt-2' : ''}`}\n data-testid={`signature-item-${index}`}\n >\n <Row label=\"Signed by\" field=\"signer\">\n {signature.signer_name || signature.signer_email}\n </Row>\n <Row label=\"On\" field=\"time\">\n {formatDate(signature.signed_at)}\n </Row>\n <dd>\n <a\n href={certificateLink(signature, hostCertificateUrl)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center font-medium text-primary hover:underline pointer-coarse:min-h-11\"\n data-testid={`signature-certificate-link-${index}`}\n >\n View certificate\n </a>\n </dd>\n </dl>\n ))}\n <p\n className={`border-t border-border pt-2 ${status.intact ? '' : 'text-red-text'}`}\n data-testid=\"signature-detail-intact\"\n >\n {status.intact\n ? isCounterSigned\n ? '✓ Unchanged since the last signature'\n : '✓ Unchanged since signing'\n : '✗ Changed after it was signed'}\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\" data-testid=\"signature-detail-locked\">\n Locked: only further signatures can be added.\n </p>\n </PopoverContent>\n </Popover>\n )\n}\n","/**\n * The certificate of an ARBI signature: the page the link on a signed PDF's signature opens, for\n * anyone, signed in or not. Plain English and short: who signed and when, what ARBI checks, the\n * result, any counter-signatures, and \"Check your copy\", which hashes a PDF in the browser and\n * compares it with the signed document and each signed revision (the file never leaves the\n * device). No email addresses and no\n * document content. Presentational: `verification` comes from `useSignatureVerification` in\n * `@arbidocs/react/document-tools`.\n */\n\nimport { useRef, useState, type DragEvent, type ReactElement, type ReactNode } from 'react'\nimport {\n matchSignedCopy,\n type CopyMatch,\n type SignatureVerification,\n} from '@arbidocs/react/document-tools'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatSignedAt } from './SignatureStatus'\n\nexport interface SignatureCertificateProps {\n /** The signature reference (`sig-…`), shown at the foot of the page. */\n reference?: string\n verification?: SignatureVerification\n isLoading?: boolean\n /** Why the signature could not be checked. */\n error?: string | null\n /** The error is a passing one (too many checks): say it calmly, not as a failure. */\n isErrorTransient?: boolean\n /** How signing times are shown. Default: {@link formatSignedAt}. */\n formatDate?: (iso: string) => string\n /** Offer \"Check your copy\". Default on. */\n allowCopyCheck?: boolean\n}\n\ntype CopyCheck =\n | { state: 'idle' }\n | { state: 'checking'; name: string }\n | { state: 'done'; name: string; match: CopyMatch }\n | { state: 'failed'; name: string }\n\nfunction Frame({ children }: { children: ReactNode }) {\n return (\n <main\n className=\"mx-auto w-full max-w-xl px-4 py-10 text-foreground\"\n data-testid=\"signature-certificate\"\n >\n <h1 className=\"mb-6 text-xl font-semibold\">Signature certificate</h1>\n {children}\n </main>\n )\n}\n\nfunction copyResult(name: string, match: CopyMatch): string {\n if (match.kind === 'current') return `✓ ${name} is the signed document, unchanged.`\n if (match.kind === 'earlier') {\n // A counter-signed PDF: the copy is an earlier signed revision, which is still genuine.\n return `✓ ${name}: this is the version signed by ${match.signature.signer_name || 'an ARBI user'}.`\n }\n return `✗ ${name} is not the signed document: it differs from what was signed.`\n}\n\nexport function SignatureCertificate({\n reference,\n verification,\n isLoading = false,\n error,\n isErrorTransient = false,\n formatDate = formatSignedAt,\n allowCopyCheck = true,\n}: SignatureCertificateProps): ReactElement {\n const [copy, setCopy] = useState<CopyCheck>({ state: 'idle' })\n const [dragging, setDragging] = useState(false)\n const input = useRef<HTMLInputElement>(null)\n\n if (isLoading) {\n return (\n <Frame>\n <p className=\"text-muted-foreground\" data-testid=\"signature-certificate-loading\">\n Checking the signature…\n </p>\n </Frame>\n )\n }\n if (error || !verification) {\n return (\n <Frame>\n <p\n className={isErrorTransient ? 'text-muted-foreground' : 'text-red-text'}\n role={isErrorTransient ? 'status' : 'alert'}\n data-testid=\"signature-certificate-error\"\n >\n {error || 'The signature could not be checked.'}\n </p>\n </Frame>\n )\n }\n\n const [first, ...counter] = verification.signatures\n const check = async (file: File | undefined) => {\n if (!file) return\n setCopy({ state: 'checking', name: file.name })\n try {\n setCopy({ state: 'done', name: file.name, match: await matchSignedCopy(file, verification) })\n } catch {\n setCopy({ state: 'failed', name: file.name })\n }\n }\n const onDrop = (e: DragEvent) => {\n e.preventDefault()\n setDragging(false)\n void check(e.dataTransfer.files[0])\n }\n\n return (\n <Frame>\n <section className=\"space-y-3\">\n {first && (\n <p className=\"text-base\" data-testid=\"signature-certificate-signer\">\n Signed by <strong>{first.signer_name || 'an ARBI user'}</strong> on{' '}\n {formatDate(first.signed_at)}\n </p>\n )}\n {counter.length > 0 && (\n <ul className=\"space-y-1 text-sm\" data-testid=\"signature-certificate-counter\">\n {counter.map((s, i) => (\n <li key={`${s.sha256}-${i}`}>\n Also signed by <strong>{s.signer_name || 'an ARBI user'}</strong> on{' '}\n {formatDate(s.signed_at)}\n </li>\n ))}\n </ul>\n )}\n <p className=\"text-sm text-muted-foreground\">\n ARBI checks that this document hasn’t changed since it was signed. If anything changed,\n this check fails.\n </p>\n <p\n className={cn(\n 'rounded-md border px-3 py-2 font-medium',\n verification.intact\n ? 'border-green-border bg-green-bg text-green-text'\n : 'border-red-text text-red-text'\n )}\n role=\"status\"\n data-testid=\"signature-certificate-result\"\n data-intact={verification.intact}\n >\n {verification.intact\n ? '✓ Unchanged since signing'\n : '✗ Changed since signing: this is not the document that was signed'}\n </p>\n </section>\n\n {allowCopyCheck && (\n <section className=\"mt-8 space-y-2\">\n <h2 className=\"text-sm font-medium\">Check your copy</h2>\n <div\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'flex min-h-24 cursor-pointer flex-col items-center justify-center rounded-md border border-dashed px-4 py-6 text-center text-sm text-muted-foreground pointer-coarse:min-h-32',\n dragging && 'border-primary bg-muted'\n )}\n data-testid=\"signature-certificate-dropzone\"\n onClick={() => input.current?.click()}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n input.current?.click()\n }\n }}\n onDragOver={(e) => {\n e.preventDefault()\n setDragging(true)\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={onDrop}\n >\n Drop the PDF you were sent here, or choose it\n <span className=\"mt-1 text-xs\">It is checked in this browser and never uploaded.</span>\n <input\n ref={input}\n type=\"file\"\n accept=\"application/pdf,.pdf\"\n className=\"sr-only\"\n data-testid=\"signature-certificate-file-input\"\n onChange={(e) => void check(e.target.files?.[0])}\n />\n </div>\n {copy.state !== 'idle' && (\n <p\n className={cn(\n 'text-sm',\n copy.state === 'done' && copy.match.kind !== 'none' && 'text-green-text',\n ((copy.state === 'done' && copy.match.kind === 'none') ||\n copy.state === 'failed') &&\n 'text-red-text'\n )}\n role=\"status\"\n data-testid=\"signature-certificate-copy-result\"\n >\n {copy.state === 'checking'\n ? `Checking ${copy.name}…`\n : copy.state === 'failed'\n ? `${copy.name} could not be read.`\n : copyResult(copy.name, copy.match)}\n </p>\n )}\n </section>\n )}\n\n {reference && (\n <p\n className=\"mt-8 text-xs text-muted-foreground\"\n data-testid=\"signature-certificate-reference\"\n >\n Reference {reference}\n </p>\n )}\n </Frame>\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"]}
@@ -2,11 +2,12 @@
2
2
  import { ViewerStatusNote } from '../chunk-ODWCTAH7.js';
3
3
  import { ModalScaffold } from '../chunk-CPMNAJLF.js';
4
4
  import '../chunk-TJMKFY5P.js';
5
+ import '../chunk-VUNV25KB.js';
5
6
  import { PencilLine, FileText, PenLine, Download } from 'lucide-react';
6
7
  import { Button, Label, Input, Checkbox, Popover, PopoverTrigger, PopoverContent, cn } from '@arbidocs/react/ui';
7
8
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
8
9
  import { useState, useRef } from 'react';
9
- import { useDocumentTools, useSignDocument, intentText, defaultCertificateUrl, matchSignedCopy } from '@arbidocs/react/document-tools';
10
+ import { useDocumentTools, useSignDocument, intentText, useOptionalDocumentTools, certificateLink, matchSignedCopy } from '@arbidocs/react/document-tools';
10
11
 
11
12
  var TOUCH = "pointer-coarse:min-h-11";
12
13
  function AnnotateButton({ active, onClick, compact }) {
@@ -207,7 +208,7 @@ function SignDocumentDialog({
207
208
  pdfBlob,
208
209
  appearance
209
210
  }) {
210
- const { user, notify, openDocument, emailDocument } = useDocumentTools();
211
+ const { user, notify, openDocument, emailDocument, certificateUrl } = useDocumentTools();
211
212
  const [name, setName] = useState(() => user?.name ?? "");
212
213
  const [includeDate, setIncludeDate] = useState(false);
213
214
  const [password, setPassword] = useState("");
@@ -229,17 +230,18 @@ function SignDocumentDialog({
229
230
  includeDate
230
231
  });
231
232
  const signedId = result.doc_ext_id;
233
+ const certificate = certificateLink(result.signature, certificateUrl);
232
234
  notify(
233
235
  `Signed. The signed copy is saved as version ${result.version}.`,
234
236
  "success",
235
- emailDocument ? { action: { label: "Email it", onClick: () => emailDocument(signedId) } } : result.signature.certificate_url ? {
237
+ emailDocument ? { action: { label: "Email it", onClick: () => emailDocument(signedId) } } : {
236
238
  action: {
237
239
  label: "View certificate",
238
240
  onClick: () => {
239
- window.open(result.signature.certificate_url, "_blank", "noopener,noreferrer");
241
+ window.open(certificate, "_blank", "noopener,noreferrer");
240
242
  }
241
243
  }
242
- } : void 0
244
+ }
243
245
  );
244
246
  setPassword("");
245
247
  onOpenChange(false);
@@ -353,8 +355,10 @@ function Row({ label, field, children }) {
353
355
  function SignatureStatus({
354
356
  status,
355
357
  formatDate = formatSignedAt,
356
- certificateUrl = defaultCertificateUrl
358
+ certificateUrl
357
359
  }) {
360
+ const tools = useOptionalDocumentTools();
361
+ const hostCertificateUrl = certificateUrl ?? tools?.certificateUrl;
358
362
  const signatures = status.signatures ?? [];
359
363
  const isCounterSigned = signatures.length > 1;
360
364
  return /* @__PURE__ */ jsxs(Popover, { children: [
@@ -387,7 +391,7 @@ function SignatureStatus({
387
391
  /* @__PURE__ */ jsx("dd", { children: /* @__PURE__ */ jsx(
388
392
  "a",
389
393
  {
390
- href: signature.certificate_url || certificateUrl(signature.reference),
394
+ href: certificateLink(signature, hostCertificateUrl),
391
395
  target: "_blank",
392
396
  rel: "noopener noreferrer",
393
397
  className: "inline-flex items-center font-medium text-primary hover:underline pointer-coarse:min-h-11",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/document-tools/DocumentToolButtons.tsx","../../src/document-tools/MarkupNotices.tsx","../../src/document-tools/MarkupViewNote.tsx","../../src/document-tools/SignDocumentDialog.tsx","../../src/document-tools/SignatureStatus.tsx","../../src/document-tools/SignatureCertificate.tsx","../../src/document-tools/VersionSnapshotBar.tsx"],"names":["jsxs","jsx","Button","useState","LINK"],"mappings":"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","file":"index.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, PencilLine, PenLine } 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 * 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 * Sign a document electronically: confirm the name, choose whether the date is shown, read the\n * statement of intent, re-enter the password. Only the signature (and the date, if ticked) is drawn\n * on the page; a role, a firm or a place go on as ordinary annotation text. Anyone can click the\n * signature to check it. The signed copy is saved as a new version and opened, with an offer to\n * email it when the host gives the tools an `emailDocument`. Needs a `<DocumentToolsProvider>` with\n * a `user` (its email) and a `deploymentDomain`, inside a React Query `QueryClientProvider`.\n */\n\nimport { useState, type FormEvent, type ReactElement } from 'react'\nimport {\n intentText,\n useDocumentTools,\n useSignDocument,\n type SignatureAppearance,\n} from '@arbidocs/react/document-tools'\nimport { Button, Checkbox, Input, Label } from '@arbidocs/react/ui'\nimport { ModalScaffold } from '../settings/ModalScaffold'\n\nexport interface SignDocumentDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n documentId: string\n /** The PDF the viewer is showing. */\n pdfBlob: Blob\n /** Where the signature goes; omitted = bottom of the last page. */\n appearance?: SignatureAppearance\n}\n\nexport function SignDocumentDialog({\n open,\n onOpenChange,\n documentId,\n pdfBlob,\n appearance,\n}: SignDocumentDialogProps): ReactElement {\n const { user, notify, openDocument, emailDocument } = useDocumentTools()\n const [name, setName] = useState(() => user?.name ?? '')\n const [includeDate, setIncludeDate] = useState(false)\n const [password, setPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const sign = useSignDocument()\n\n const signer = { name }\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault()\n if (!user?.email) return\n setError(null)\n try {\n const result = await sign.mutateAsync({\n documentId,\n pdfBlob,\n email: user.email,\n password,\n signer,\n appearance,\n includeDate,\n })\n const signedId = result.doc_ext_id\n notify(\n `Signed. The signed copy is saved as version ${result.version}.`,\n 'success',\n emailDocument\n ? { action: { label: 'Email it', onClick: () => emailDocument(signedId) } }\n : result.signature.certificate_url\n ? {\n action: {\n label: 'View certificate',\n onClick: () => {\n window.open(result.signature.certificate_url, '_blank', 'noopener,noreferrer')\n },\n },\n }\n : undefined\n )\n setPassword('')\n onOpenChange(false)\n openDocument?.(signedId)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Signing failed')\n }\n }\n\n return (\n <ModalScaffold\n open={open}\n onOpenChange={(next) => !sign.isPending && onOpenChange(next)}\n title=\"Sign document\"\n description=\"Sign this document electronically. The signed copy is saved as a new version.\"\n showDescription\n testId=\"sign-document-dialog\"\n >\n <form onSubmit={handleSubmit}>\n <ModalScaffold.Body>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"sign-name\">Name</Label>\n <Input\n id=\"sign-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n data-testid=\"sign-document-name-input\"\n required\n />\n </div>\n <div className=\"flex items-center gap-2 pointer-coarse:min-h-11\">\n <Checkbox\n id=\"sign-include-date\"\n checked={includeDate}\n onCheckedChange={(checked) => setIncludeDate(checked === true)}\n data-testid=\"sign-document-include-date\"\n />\n <Label htmlFor=\"sign-include-date\" className=\"font-normal\">\n Include date\n </Label>\n </div>\n <p className=\"text-sm text-muted-foreground\" data-testid=\"sign-document-appearance-note\">\n Only your signature{includeDate ? ' and the date appear' : ' appears'} on the page.\n Anyone can click it to check it.\n </p>\n {name.trim() && (\n <blockquote\n className=\"border-l-2 border-border pl-3 text-sm text-muted-foreground\"\n data-testid=\"sign-document-intent\"\n >\n {intentText(signer)}\n </blockquote>\n )}\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"sign-password\">Password</Label>\n <Input\n id=\"sign-password\"\n type=\"password\"\n autoComplete=\"current-password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n data-testid=\"sign-document-password-input\"\n required\n />\n </div>\n {error && (\n <p className=\"text-sm text-red-text\" role=\"alert\" data-testid=\"sign-document-error\">\n {error}\n </p>\n )}\n </ModalScaffold.Body>\n <ModalScaffold.Footer>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={sign.isPending}\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={sign.isPending || !name.trim() || !password}\n data-testid=\"sign-document-submit-button\"\n >\n {sign.isPending ? 'Signing...' : 'Sign'}\n </Button>\n </ModalScaffold.Footer>\n </form>\n </ModalScaffold>\n )\n}\n","/**\n * The \"Signed — locked\" note in the viewer header (a signed version changes only by a further\n * signature), which opens the signature details: who signed and when,\n * whether the document is unchanged since, and \"View certificate\", the public page anyone can\n * check the signature on (the same page the signature on the PDF links to). Read from the PDF\n * itself (GET .../signatures). A counter-signed copy lists every signature, oldest first.\n */\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { defaultCertificateUrl, type SignatureStatusResponse } from '@arbidocs/react/document-tools'\nimport { Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\n\n/** \"14 Oct 2026, 12:00\" in the reader's locale and time zone. */\nexport function formatSignedAt(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso\n return date.toLocaleString([], { dateStyle: 'medium', timeStyle: 'short' })\n}\n\nexport interface SignatureStatusProps {\n status: SignatureStatusResponse\n /** How the signing time is shown. Default: {@link formatSignedAt}. */\n formatDate?: (iso: string) => string\n /**\n * The certificate page of a signature, only for a record without the `certificate_url` the API\n * returns. Default: `/verify/{reference}` on this origin.\n */\n certificateUrl?: (reference: string) => string\n}\n\nfunction Row({ label, field, children }: { label: string; field: string; children: ReactNode }) {\n return (\n <div className=\"grid grid-cols-[5.5rem_1fr] gap-2\">\n <dt className=\"text-muted-foreground\">{label}</dt>\n <dd className=\"min-w-0 break-words\" data-testid={`signature-detail-${field}`}>\n {children}\n </dd>\n </div>\n )\n}\n\nexport function SignatureStatus({\n status,\n formatDate = formatSignedAt,\n certificateUrl = defaultCertificateUrl,\n}: SignatureStatusProps): ReactElement {\n const signatures = status.signatures ?? []\n // A signed copy can be counter-signed: each signature is listed, oldest first.\n const isCounterSigned = signatures.length > 1\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"flex-shrink-0 text-sm text-muted-foreground underline decoration-dotted underline-offset-4 hover:text-foreground pointer-coarse:min-h-11\"\n data-testid=\"document-signature-status\"\n aria-label={`${status.intact ? 'Signed, locked' : 'Modified after signing'}: show signature details`}\n >\n {status.intact ? 'Signed — locked' : 'Modified after signing'}\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"max-h-[70vh] w-80 overflow-y-auto p-3 text-sm\"\n align=\"start\"\n data-testid=\"signature-details\"\n >\n <p className=\"mb-2 font-medium\" data-testid=\"signature-details-title\">\n {isCounterSigned\n ? `Electronic signatures (${signatures.length})`\n : 'Electronic signature'}\n </p>\n {signatures.map((signature, index) => (\n <dl\n key={signature.reference}\n className={`mb-3 space-y-1 ${index > 0 ? 'border-t border-border pt-2' : ''}`}\n data-testid={`signature-item-${index}`}\n >\n <Row label=\"Signed by\" field=\"signer\">\n {signature.signer_name || signature.signer_email}\n </Row>\n <Row label=\"On\" field=\"time\">\n {formatDate(signature.signed_at)}\n </Row>\n <dd>\n <a\n href={signature.certificate_url || certificateUrl(signature.reference)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center font-medium text-primary hover:underline pointer-coarse:min-h-11\"\n data-testid={`signature-certificate-link-${index}`}\n >\n View certificate\n </a>\n </dd>\n </dl>\n ))}\n <p\n className={`border-t border-border pt-2 ${status.intact ? '' : 'text-red-text'}`}\n data-testid=\"signature-detail-intact\"\n >\n {status.intact\n ? isCounterSigned\n ? '✓ Unchanged since the last signature'\n : '✓ Unchanged since signing'\n : '✗ Changed after it was signed'}\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\" data-testid=\"signature-detail-locked\">\n Locked: only further signatures can be added.\n </p>\n </PopoverContent>\n </Popover>\n )\n}\n","/**\n * The certificate of an ARBI signature: the page the link on a signed PDF's signature opens, for\n * anyone, signed in or not. Plain English and short: who signed and when, what ARBI checks, the\n * result, any counter-signatures, and \"Check your copy\", which hashes a PDF in the browser and\n * compares it with the signed document and each signed revision (the file never leaves the\n * device). No email addresses and no\n * document content. Presentational: `verification` comes from `useSignatureVerification` in\n * `@arbidocs/react/document-tools`.\n */\n\nimport { useRef, useState, type DragEvent, type ReactElement, type ReactNode } from 'react'\nimport {\n matchSignedCopy,\n type CopyMatch,\n type SignatureVerification,\n} from '@arbidocs/react/document-tools'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatSignedAt } from './SignatureStatus'\n\nexport interface SignatureCertificateProps {\n /** The signature reference (`sig-…`), shown at the foot of the page. */\n reference?: string\n verification?: SignatureVerification\n isLoading?: boolean\n /** Why the signature could not be checked. */\n error?: string | null\n /** The error is a passing one (too many checks): say it calmly, not as a failure. */\n isErrorTransient?: boolean\n /** How signing times are shown. Default: {@link formatSignedAt}. */\n formatDate?: (iso: string) => string\n /** Offer \"Check your copy\". Default on. */\n allowCopyCheck?: boolean\n}\n\ntype CopyCheck =\n | { state: 'idle' }\n | { state: 'checking'; name: string }\n | { state: 'done'; name: string; match: CopyMatch }\n | { state: 'failed'; name: string }\n\nfunction Frame({ children }: { children: ReactNode }) {\n return (\n <main\n className=\"mx-auto w-full max-w-xl px-4 py-10 text-foreground\"\n data-testid=\"signature-certificate\"\n >\n <h1 className=\"mb-6 text-xl font-semibold\">Signature certificate</h1>\n {children}\n </main>\n )\n}\n\nfunction copyResult(name: string, match: CopyMatch): string {\n if (match.kind === 'current') return `✓ ${name} is the signed document, unchanged.`\n if (match.kind === 'earlier') {\n // A counter-signed PDF: the copy is an earlier signed revision, which is still genuine.\n return `✓ ${name}: this is the version signed by ${match.signature.signer_name || 'an ARBI user'}.`\n }\n return `✗ ${name} is not the signed document: it differs from what was signed.`\n}\n\nexport function SignatureCertificate({\n reference,\n verification,\n isLoading = false,\n error,\n isErrorTransient = false,\n formatDate = formatSignedAt,\n allowCopyCheck = true,\n}: SignatureCertificateProps): ReactElement {\n const [copy, setCopy] = useState<CopyCheck>({ state: 'idle' })\n const [dragging, setDragging] = useState(false)\n const input = useRef<HTMLInputElement>(null)\n\n if (isLoading) {\n return (\n <Frame>\n <p className=\"text-muted-foreground\" data-testid=\"signature-certificate-loading\">\n Checking the signature…\n </p>\n </Frame>\n )\n }\n if (error || !verification) {\n return (\n <Frame>\n <p\n className={isErrorTransient ? 'text-muted-foreground' : 'text-red-text'}\n role={isErrorTransient ? 'status' : 'alert'}\n data-testid=\"signature-certificate-error\"\n >\n {error || 'The signature could not be checked.'}\n </p>\n </Frame>\n )\n }\n\n const [first, ...counter] = verification.signatures\n const check = async (file: File | undefined) => {\n if (!file) return\n setCopy({ state: 'checking', name: file.name })\n try {\n setCopy({ state: 'done', name: file.name, match: await matchSignedCopy(file, verification) })\n } catch {\n setCopy({ state: 'failed', name: file.name })\n }\n }\n const onDrop = (e: DragEvent) => {\n e.preventDefault()\n setDragging(false)\n void check(e.dataTransfer.files[0])\n }\n\n return (\n <Frame>\n <section className=\"space-y-3\">\n {first && (\n <p className=\"text-base\" data-testid=\"signature-certificate-signer\">\n Signed by <strong>{first.signer_name || 'an ARBI user'}</strong> on{' '}\n {formatDate(first.signed_at)}\n </p>\n )}\n {counter.length > 0 && (\n <ul className=\"space-y-1 text-sm\" data-testid=\"signature-certificate-counter\">\n {counter.map((s, i) => (\n <li key={`${s.sha256}-${i}`}>\n Also signed by <strong>{s.signer_name || 'an ARBI user'}</strong> on{' '}\n {formatDate(s.signed_at)}\n </li>\n ))}\n </ul>\n )}\n <p className=\"text-sm text-muted-foreground\">\n ARBI checks that this document hasn’t changed since it was signed. If anything changed,\n this check fails.\n </p>\n <p\n className={cn(\n 'rounded-md border px-3 py-2 font-medium',\n verification.intact\n ? 'border-green-border bg-green-bg text-green-text'\n : 'border-red-text text-red-text'\n )}\n role=\"status\"\n data-testid=\"signature-certificate-result\"\n data-intact={verification.intact}\n >\n {verification.intact\n ? '✓ Unchanged since signing'\n : '✗ Changed since signing: this is not the document that was signed'}\n </p>\n </section>\n\n {allowCopyCheck && (\n <section className=\"mt-8 space-y-2\">\n <h2 className=\"text-sm font-medium\">Check your copy</h2>\n <div\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'flex min-h-24 cursor-pointer flex-col items-center justify-center rounded-md border border-dashed px-4 py-6 text-center text-sm text-muted-foreground pointer-coarse:min-h-32',\n dragging && 'border-primary bg-muted'\n )}\n data-testid=\"signature-certificate-dropzone\"\n onClick={() => input.current?.click()}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n input.current?.click()\n }\n }}\n onDragOver={(e) => {\n e.preventDefault()\n setDragging(true)\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={onDrop}\n >\n Drop the PDF you were sent here, or choose it\n <span className=\"mt-1 text-xs\">It is checked in this browser and never uploaded.</span>\n <input\n ref={input}\n type=\"file\"\n accept=\"application/pdf,.pdf\"\n className=\"sr-only\"\n data-testid=\"signature-certificate-file-input\"\n onChange={(e) => void check(e.target.files?.[0])}\n />\n </div>\n {copy.state !== 'idle' && (\n <p\n className={cn(\n 'text-sm',\n copy.state === 'done' && copy.match.kind !== 'none' && 'text-green-text',\n ((copy.state === 'done' && copy.match.kind === 'none') ||\n copy.state === 'failed') &&\n 'text-red-text'\n )}\n role=\"status\"\n data-testid=\"signature-certificate-copy-result\"\n >\n {copy.state === 'checking'\n ? `Checking ${copy.name}…`\n : copy.state === 'failed'\n ? `${copy.name} could not be read.`\n : copyResult(copy.name, copy.match)}\n </p>\n )}\n </section>\n )}\n\n {reference && (\n <p\n className=\"mt-8 text-xs text-muted-foreground\"\n data-testid=\"signature-certificate-reference\"\n >\n Reference {reference}\n </p>\n )}\n </Frame>\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"]}
1
+ {"version":3,"sources":["../../src/document-tools/DocumentToolButtons.tsx","../../src/document-tools/MarkupNotices.tsx","../../src/document-tools/MarkupViewNote.tsx","../../src/document-tools/SignDocumentDialog.tsx","../../src/document-tools/SignatureStatus.tsx","../../src/document-tools/SignatureCertificate.tsx","../../src/document-tools/VersionSnapshotBar.tsx"],"names":["jsxs","jsx","Button","certificateLink","useState","LINK"],"mappings":"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","file":"index.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, PencilLine, PenLine } 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 * 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 * Sign a document electronically: confirm the name, choose whether the date is shown, read the\n * statement of intent, re-enter the password. Only the signature (and the date, if ticked) is drawn\n * on the page; a role, a firm or a place go on as ordinary annotation text. Anyone can click the\n * signature to check it. The signed copy is saved as a new version and opened, with an offer to\n * email it when the host gives the tools an `emailDocument`. Needs a `<DocumentToolsProvider>` with\n * a `user` (its email) and a `deploymentDomain`, inside a React Query `QueryClientProvider`.\n */\n\nimport { useState, type FormEvent, type ReactElement } from 'react'\nimport {\n certificateLink,\n intentText,\n useDocumentTools,\n useSignDocument,\n type SignatureAppearance,\n} from '@arbidocs/react/document-tools'\nimport { Button, Checkbox, Input, Label } from '@arbidocs/react/ui'\nimport { ModalScaffold } from '../settings/ModalScaffold'\n\nexport interface SignDocumentDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n documentId: string\n /** The PDF the viewer is showing. */\n pdfBlob: Blob\n /** Where the signature goes; omitted = bottom of the last page. */\n appearance?: SignatureAppearance\n}\n\nexport function SignDocumentDialog({\n open,\n onOpenChange,\n documentId,\n pdfBlob,\n appearance,\n}: SignDocumentDialogProps): ReactElement {\n const { user, notify, openDocument, emailDocument, certificateUrl } = useDocumentTools()\n const [name, setName] = useState(() => user?.name ?? '')\n const [includeDate, setIncludeDate] = useState(false)\n const [password, setPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const sign = useSignDocument()\n\n const signer = { name }\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault()\n if (!user?.email) return\n setError(null)\n try {\n const result = await sign.mutateAsync({\n documentId,\n pdfBlob,\n email: user.email,\n password,\n signer,\n appearance,\n includeDate,\n })\n const signedId = result.doc_ext_id\n const certificate = certificateLink(result.signature, certificateUrl)\n notify(\n `Signed. The signed copy is saved as version ${result.version}.`,\n 'success',\n emailDocument\n ? { action: { label: 'Email it', onClick: () => emailDocument(signedId) } }\n : {\n action: {\n label: 'View certificate',\n onClick: () => {\n window.open(certificate, '_blank', 'noopener,noreferrer')\n },\n },\n }\n )\n setPassword('')\n onOpenChange(false)\n openDocument?.(signedId)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Signing failed')\n }\n }\n\n return (\n <ModalScaffold\n open={open}\n onOpenChange={(next) => !sign.isPending && onOpenChange(next)}\n title=\"Sign document\"\n description=\"Sign this document electronically. The signed copy is saved as a new version.\"\n showDescription\n testId=\"sign-document-dialog\"\n >\n <form onSubmit={handleSubmit}>\n <ModalScaffold.Body>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"sign-name\">Name</Label>\n <Input\n id=\"sign-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n data-testid=\"sign-document-name-input\"\n required\n />\n </div>\n <div className=\"flex items-center gap-2 pointer-coarse:min-h-11\">\n <Checkbox\n id=\"sign-include-date\"\n checked={includeDate}\n onCheckedChange={(checked) => setIncludeDate(checked === true)}\n data-testid=\"sign-document-include-date\"\n />\n <Label htmlFor=\"sign-include-date\" className=\"font-normal\">\n Include date\n </Label>\n </div>\n <p className=\"text-sm text-muted-foreground\" data-testid=\"sign-document-appearance-note\">\n Only your signature{includeDate ? ' and the date appear' : ' appears'} on the page.\n Anyone can click it to check it.\n </p>\n {name.trim() && (\n <blockquote\n className=\"border-l-2 border-border pl-3 text-sm text-muted-foreground\"\n data-testid=\"sign-document-intent\"\n >\n {intentText(signer)}\n </blockquote>\n )}\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"sign-password\">Password</Label>\n <Input\n id=\"sign-password\"\n type=\"password\"\n autoComplete=\"current-password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n data-testid=\"sign-document-password-input\"\n required\n />\n </div>\n {error && (\n <p className=\"text-sm text-red-text\" role=\"alert\" data-testid=\"sign-document-error\">\n {error}\n </p>\n )}\n </ModalScaffold.Body>\n <ModalScaffold.Footer>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={sign.isPending}\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={sign.isPending || !name.trim() || !password}\n data-testid=\"sign-document-submit-button\"\n >\n {sign.isPending ? 'Signing...' : 'Sign'}\n </Button>\n </ModalScaffold.Footer>\n </form>\n </ModalScaffold>\n )\n}\n","/**\n * The \"Signed — locked\" note in the viewer header (a signed version changes only by a further\n * signature), which opens the signature details: who signed and when,\n * whether the document is unchanged since, and \"View certificate\", the public page anyone can\n * check the signature on (the same page the signature on the PDF links to). Read from the PDF\n * itself (GET .../signatures). A counter-signed copy lists every signature, oldest first.\n */\n\nimport type { ReactElement, ReactNode } from 'react'\nimport {\n certificateLink,\n useOptionalDocumentTools,\n type SignatureStatusResponse,\n} from '@arbidocs/react/document-tools'\nimport { Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\n\n/** \"14 Oct 2026, 12:00\" in the reader's locale and time zone. */\nexport function formatSignedAt(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso\n return date.toLocaleString([], { dateStyle: 'medium', timeStyle: 'short' })\n}\n\nexport interface SignatureStatusProps {\n status: SignatureStatusResponse\n /** How the signing time is shown. Default: {@link formatSignedAt}. */\n formatDate?: (iso: string) => string\n /**\n * The certificate page of a signature in this app. Preferred over the `certificate_url` the API\n * returns (which is on the deployment domain). Default: the enclosing `<DocumentToolsProvider>`'s\n * `certificateUrl`, if any; without either, the API's `certificate_url`, else\n * `/verify/{reference}` on this origin.\n */\n certificateUrl?: (reference: string) => string\n}\n\nfunction Row({ label, field, children }: { label: string; field: string; children: ReactNode }) {\n return (\n <div className=\"grid grid-cols-[5.5rem_1fr] gap-2\">\n <dt className=\"text-muted-foreground\">{label}</dt>\n <dd className=\"min-w-0 break-words\" data-testid={`signature-detail-${field}`}>\n {children}\n </dd>\n </div>\n )\n}\n\nexport function SignatureStatus({\n status,\n formatDate = formatSignedAt,\n certificateUrl,\n}: SignatureStatusProps): ReactElement {\n const tools = useOptionalDocumentTools()\n const hostCertificateUrl = certificateUrl ?? tools?.certificateUrl\n const signatures = status.signatures ?? []\n // A signed copy can be counter-signed: each signature is listed, oldest first.\n const isCounterSigned = signatures.length > 1\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"flex-shrink-0 text-sm text-muted-foreground underline decoration-dotted underline-offset-4 hover:text-foreground pointer-coarse:min-h-11\"\n data-testid=\"document-signature-status\"\n aria-label={`${status.intact ? 'Signed, locked' : 'Modified after signing'}: show signature details`}\n >\n {status.intact ? 'Signed — locked' : 'Modified after signing'}\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"max-h-[70vh] w-80 overflow-y-auto p-3 text-sm\"\n align=\"start\"\n data-testid=\"signature-details\"\n >\n <p className=\"mb-2 font-medium\" data-testid=\"signature-details-title\">\n {isCounterSigned\n ? `Electronic signatures (${signatures.length})`\n : 'Electronic signature'}\n </p>\n {signatures.map((signature, index) => (\n <dl\n key={signature.reference}\n className={`mb-3 space-y-1 ${index > 0 ? 'border-t border-border pt-2' : ''}`}\n data-testid={`signature-item-${index}`}\n >\n <Row label=\"Signed by\" field=\"signer\">\n {signature.signer_name || signature.signer_email}\n </Row>\n <Row label=\"On\" field=\"time\">\n {formatDate(signature.signed_at)}\n </Row>\n <dd>\n <a\n href={certificateLink(signature, hostCertificateUrl)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center font-medium text-primary hover:underline pointer-coarse:min-h-11\"\n data-testid={`signature-certificate-link-${index}`}\n >\n View certificate\n </a>\n </dd>\n </dl>\n ))}\n <p\n className={`border-t border-border pt-2 ${status.intact ? '' : 'text-red-text'}`}\n data-testid=\"signature-detail-intact\"\n >\n {status.intact\n ? isCounterSigned\n ? '✓ Unchanged since the last signature'\n : '✓ Unchanged since signing'\n : '✗ Changed after it was signed'}\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\" data-testid=\"signature-detail-locked\">\n Locked: only further signatures can be added.\n </p>\n </PopoverContent>\n </Popover>\n )\n}\n","/**\n * The certificate of an ARBI signature: the page the link on a signed PDF's signature opens, for\n * anyone, signed in or not. Plain English and short: who signed and when, what ARBI checks, the\n * result, any counter-signatures, and \"Check your copy\", which hashes a PDF in the browser and\n * compares it with the signed document and each signed revision (the file never leaves the\n * device). No email addresses and no\n * document content. Presentational: `verification` comes from `useSignatureVerification` in\n * `@arbidocs/react/document-tools`.\n */\n\nimport { useRef, useState, type DragEvent, type ReactElement, type ReactNode } from 'react'\nimport {\n matchSignedCopy,\n type CopyMatch,\n type SignatureVerification,\n} from '@arbidocs/react/document-tools'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatSignedAt } from './SignatureStatus'\n\nexport interface SignatureCertificateProps {\n /** The signature reference (`sig-…`), shown at the foot of the page. */\n reference?: string\n verification?: SignatureVerification\n isLoading?: boolean\n /** Why the signature could not be checked. */\n error?: string | null\n /** The error is a passing one (too many checks): say it calmly, not as a failure. */\n isErrorTransient?: boolean\n /** How signing times are shown. Default: {@link formatSignedAt}. */\n formatDate?: (iso: string) => string\n /** Offer \"Check your copy\". Default on. */\n allowCopyCheck?: boolean\n}\n\ntype CopyCheck =\n | { state: 'idle' }\n | { state: 'checking'; name: string }\n | { state: 'done'; name: string; match: CopyMatch }\n | { state: 'failed'; name: string }\n\nfunction Frame({ children }: { children: ReactNode }) {\n return (\n <main\n className=\"mx-auto w-full max-w-xl px-4 py-10 text-foreground\"\n data-testid=\"signature-certificate\"\n >\n <h1 className=\"mb-6 text-xl font-semibold\">Signature certificate</h1>\n {children}\n </main>\n )\n}\n\nfunction copyResult(name: string, match: CopyMatch): string {\n if (match.kind === 'current') return `✓ ${name} is the signed document, unchanged.`\n if (match.kind === 'earlier') {\n // A counter-signed PDF: the copy is an earlier signed revision, which is still genuine.\n return `✓ ${name}: this is the version signed by ${match.signature.signer_name || 'an ARBI user'}.`\n }\n return `✗ ${name} is not the signed document: it differs from what was signed.`\n}\n\nexport function SignatureCertificate({\n reference,\n verification,\n isLoading = false,\n error,\n isErrorTransient = false,\n formatDate = formatSignedAt,\n allowCopyCheck = true,\n}: SignatureCertificateProps): ReactElement {\n const [copy, setCopy] = useState<CopyCheck>({ state: 'idle' })\n const [dragging, setDragging] = useState(false)\n const input = useRef<HTMLInputElement>(null)\n\n if (isLoading) {\n return (\n <Frame>\n <p className=\"text-muted-foreground\" data-testid=\"signature-certificate-loading\">\n Checking the signature…\n </p>\n </Frame>\n )\n }\n if (error || !verification) {\n return (\n <Frame>\n <p\n className={isErrorTransient ? 'text-muted-foreground' : 'text-red-text'}\n role={isErrorTransient ? 'status' : 'alert'}\n data-testid=\"signature-certificate-error\"\n >\n {error || 'The signature could not be checked.'}\n </p>\n </Frame>\n )\n }\n\n const [first, ...counter] = verification.signatures\n const check = async (file: File | undefined) => {\n if (!file) return\n setCopy({ state: 'checking', name: file.name })\n try {\n setCopy({ state: 'done', name: file.name, match: await matchSignedCopy(file, verification) })\n } catch {\n setCopy({ state: 'failed', name: file.name })\n }\n }\n const onDrop = (e: DragEvent) => {\n e.preventDefault()\n setDragging(false)\n void check(e.dataTransfer.files[0])\n }\n\n return (\n <Frame>\n <section className=\"space-y-3\">\n {first && (\n <p className=\"text-base\" data-testid=\"signature-certificate-signer\">\n Signed by <strong>{first.signer_name || 'an ARBI user'}</strong> on{' '}\n {formatDate(first.signed_at)}\n </p>\n )}\n {counter.length > 0 && (\n <ul className=\"space-y-1 text-sm\" data-testid=\"signature-certificate-counter\">\n {counter.map((s, i) => (\n <li key={`${s.sha256}-${i}`}>\n Also signed by <strong>{s.signer_name || 'an ARBI user'}</strong> on{' '}\n {formatDate(s.signed_at)}\n </li>\n ))}\n </ul>\n )}\n <p className=\"text-sm text-muted-foreground\">\n ARBI checks that this document hasn’t changed since it was signed. If anything changed,\n this check fails.\n </p>\n <p\n className={cn(\n 'rounded-md border px-3 py-2 font-medium',\n verification.intact\n ? 'border-green-border bg-green-bg text-green-text'\n : 'border-red-text text-red-text'\n )}\n role=\"status\"\n data-testid=\"signature-certificate-result\"\n data-intact={verification.intact}\n >\n {verification.intact\n ? '✓ Unchanged since signing'\n : '✗ Changed since signing: this is not the document that was signed'}\n </p>\n </section>\n\n {allowCopyCheck && (\n <section className=\"mt-8 space-y-2\">\n <h2 className=\"text-sm font-medium\">Check your copy</h2>\n <div\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'flex min-h-24 cursor-pointer flex-col items-center justify-center rounded-md border border-dashed px-4 py-6 text-center text-sm text-muted-foreground pointer-coarse:min-h-32',\n dragging && 'border-primary bg-muted'\n )}\n data-testid=\"signature-certificate-dropzone\"\n onClick={() => input.current?.click()}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n input.current?.click()\n }\n }}\n onDragOver={(e) => {\n e.preventDefault()\n setDragging(true)\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={onDrop}\n >\n Drop the PDF you were sent here, or choose it\n <span className=\"mt-1 text-xs\">It is checked in this browser and never uploaded.</span>\n <input\n ref={input}\n type=\"file\"\n accept=\"application/pdf,.pdf\"\n className=\"sr-only\"\n data-testid=\"signature-certificate-file-input\"\n onChange={(e) => void check(e.target.files?.[0])}\n />\n </div>\n {copy.state !== 'idle' && (\n <p\n className={cn(\n 'text-sm',\n copy.state === 'done' && copy.match.kind !== 'none' && 'text-green-text',\n ((copy.state === 'done' && copy.match.kind === 'none') ||\n copy.state === 'failed') &&\n 'text-red-text'\n )}\n role=\"status\"\n data-testid=\"signature-certificate-copy-result\"\n >\n {copy.state === 'checking'\n ? `Checking ${copy.name}…`\n : copy.state === 'failed'\n ? `${copy.name} could not be read.`\n : copyResult(copy.name, copy.match)}\n </p>\n )}\n </section>\n )}\n\n {reference && (\n <p\n className=\"mt-8 text-xs text-muted-foreground\"\n data-testid=\"signature-certificate-reference\"\n >\n Reference {reference}\n </p>\n )}\n </Frame>\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"]}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Number the selected documents as a production set: Bates labels, optional QR codes back to each
3
+ * document, an optional index page. The result is downloaded (one PDF, or a ZIP with each file and
4
+ * an `index.csv`) and, unless turned off, saved to the workspace as new documents derived from
5
+ * their sources (role `production`) in the Productions folder. The originals never change.
6
+ *
7
+ * Needs a `<DocumentToolsProvider>`: the API client fetches each PDF, `uploadDocument` saves the
8
+ * result, `saveFile` downloads it, `notify` reports, `onDocumentsChanged(ids, 'copy')` refreshes the
9
+ * host's lists and `openDocument` backs the "Open" action. The selected documents are used as
10
+ * they are (select a frozen or redacted copy to produce that copy); a non-PDF is numbered through
11
+ * its PDF version and one without a PDF version is left out. pdf-lib and JSZip load on confirm.
12
+ */
13
+ import { type ReactElement } from 'react';
14
+ import { type ProductionSource } from '@arbidocs/react/document-tools';
15
+ export interface ProductionSetDialogProps {
16
+ open: boolean;
17
+ onOpenChange: (open: boolean) => void;
18
+ /** The selected documents, in list order (the dialog lets the user reorder them). */
19
+ documents: readonly ProductionSource[];
20
+ /** The link a document's QR code opens: the document in this app. */
21
+ documentUrl: (documentId: string) => string;
22
+ }
23
+ export declare function ProductionSetDialog({ open, onOpenChange, documents, documentUrl, }: ProductionSetDialogProps): ReactElement;