@arbidocs/blocks 0.5.125 → 0.5.126

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 (174) hide show
  1. package/dist/{ClippingMediaViewer-ZFEX5A3U.cjs → ClippingMediaViewer-47BAXNLO.cjs} +10 -11
  2. package/dist/ClippingMediaViewer-47BAXNLO.cjs.map +1 -0
  3. package/dist/{ClippingPdfViewer-3LRTEPHV.cjs → ClippingPdfViewer-D5BYHEAH.cjs} +16 -14
  4. package/dist/ClippingPdfViewer-D5BYHEAH.cjs.map +1 -0
  5. package/dist/{ConnectedCallDock-XJOYVVAH.cjs → ConnectedCallDock-733O5M36.cjs} +11 -11
  6. package/dist/{ConnectedCallDock-XJOYVVAH.cjs.map → ConnectedCallDock-733O5M36.cjs.map} +1 -1
  7. package/dist/{ConnectedCallRoom-CUDYAPQK.cjs → ConnectedCallRoom-TAUGSRGV.cjs} +11 -11
  8. package/dist/{ConnectedCallRoom-CUDYAPQK.cjs.map → ConnectedCallRoom-TAUGSRGV.cjs.map} +1 -1
  9. package/dist/{ConnectedNativeDocxComparison-7QQ55JIO.cjs → ConnectedNativeDocxComparison-HDE522YC.cjs} +12 -12
  10. package/dist/{ConnectedNativeDocxComparison-7QQ55JIO.cjs.map → ConnectedNativeDocxComparison-HDE522YC.cjs.map} +1 -1
  11. package/dist/{ConnectedPresentation-L32JPRFI.cjs → ConnectedPresentation-SI3L77J4.cjs} +36 -37
  12. package/dist/ConnectedPresentation-SI3L77J4.cjs.map +1 -0
  13. package/dist/{ConnectedProductionSetDialog-4EAY6KAZ.cjs → ConnectedProductionSetDialog-LHB4VQWC.cjs} +3 -3
  14. package/dist/{ConnectedProductionSetDialog-4EAY6KAZ.cjs.map → ConnectedProductionSetDialog-LHB4VQWC.cjs.map} +1 -1
  15. package/dist/{ConnectedSlidesTab-P7GGNUTO.cjs → ConnectedSlidesTab-JSPU6EY5.cjs} +39 -45
  16. package/dist/ConnectedSlidesTab-JSPU6EY5.cjs.map +1 -0
  17. package/dist/{ConnectedStreamedWordArtifact-7NJ3N52V.cjs → ConnectedStreamedWordArtifact-4FHPOAFZ.cjs} +12 -12
  18. package/dist/{ConnectedStreamedWordArtifact-7NJ3N52V.cjs.map → ConnectedStreamedWordArtifact-4FHPOAFZ.cjs.map} +1 -1
  19. package/dist/{DocumentReviewCard-BFPOFQXI.cjs → DocumentReviewCard-BDNXP3D4.cjs} +16 -16
  20. package/dist/{DocumentReviewCard-BFPOFQXI.cjs.map → DocumentReviewCard-BDNXP3D4.cjs.map} +1 -1
  21. package/dist/{FilesViewerDialog-MHUVEZ7M.cjs → FilesViewerDialog-WQRNSKWM.cjs} +32 -33
  22. package/dist/FilesViewerDialog-WQRNSKWM.cjs.map +1 -0
  23. package/dist/{NativeDocxEditor-SIRYPMBN.cjs → NativeDocxEditor-SUDULUN3.cjs} +6 -6
  24. package/dist/{NativeDocxEditor-SIRYPMBN.cjs.map → NativeDocxEditor-SUDULUN3.cjs.map} +1 -1
  25. package/dist/{SpotlightStrip-ED22UYTM.cjs → SpotlightStrip-QQ2WUI32.cjs} +28 -29
  26. package/dist/SpotlightStrip-QQ2WUI32.cjs.map +1 -0
  27. package/dist/{WorkspaceTableView-MIFYXV3G.cjs → WorkspaceTableView-3XYAV4BV.cjs} +8 -8
  28. package/dist/{WorkspaceTableView-MIFYXV3G.cjs.map → WorkspaceTableView-3XYAV4BV.cjs.map} +1 -1
  29. package/dist/agents/index.cjs +215 -215
  30. package/dist/ai-IEIR7SC2.cjs +4 -4
  31. package/dist/auth/index.cjs +1 -1
  32. package/dist/calls/index.cjs +4 -4
  33. package/dist/chat/index.cjs +6 -6
  34. package/dist/{chunk-ZZZITHGK.cjs → chunk-26SFI2BH.cjs} +16 -3
  35. package/dist/chunk-26SFI2BH.cjs.map +1 -0
  36. package/dist/{chunk-CQ2RJYE2.cjs → chunk-3IH55CDE.cjs} +3 -3
  37. package/dist/{chunk-CQ2RJYE2.cjs.map → chunk-3IH55CDE.cjs.map} +1 -1
  38. package/dist/{chunk-NG2EE7HR.cjs → chunk-463QM764.cjs} +3 -3
  39. package/dist/{chunk-NG2EE7HR.cjs.map → chunk-463QM764.cjs.map} +1 -1
  40. package/dist/{chunk-7RJZIPLE.cjs → chunk-4KEQ62SL.cjs} +33 -33
  41. package/dist/{chunk-7RJZIPLE.cjs.map → chunk-4KEQ62SL.cjs.map} +1 -1
  42. package/dist/{chunk-AS6QZETU.cjs → chunk-5QERK4PK.cjs} +35 -35
  43. package/dist/{chunk-AS6QZETU.cjs.map → chunk-5QERK4PK.cjs.map} +1 -1
  44. package/dist/{chunk-UA7HOLAZ.cjs → chunk-6B4CCDDB.cjs} +5 -5
  45. package/dist/{chunk-UA7HOLAZ.cjs.map → chunk-6B4CCDDB.cjs.map} +1 -1
  46. package/dist/{chunk-AISYXX4M.cjs → chunk-7NLO7ASW.cjs} +4 -4
  47. package/dist/{chunk-AISYXX4M.cjs.map → chunk-7NLO7ASW.cjs.map} +1 -1
  48. package/dist/{chunk-QIK7E6VF.cjs → chunk-7PN3YENO.cjs} +4 -4
  49. package/dist/{chunk-QIK7E6VF.cjs.map → chunk-7PN3YENO.cjs.map} +1 -1
  50. package/dist/{chunk-JY7UUZQG.cjs → chunk-7Q46YAX4.cjs} +74 -71
  51. package/dist/chunk-7Q46YAX4.cjs.map +1 -0
  52. package/dist/{chunk-J3FFSEKO.cjs → chunk-ADDQKZ5I.cjs} +4 -4
  53. package/dist/{chunk-J3FFSEKO.cjs.map → chunk-ADDQKZ5I.cjs.map} +1 -1
  54. package/dist/{chunk-L6HTZIBD.cjs → chunk-ALK3PUUB.cjs} +3 -3
  55. package/dist/{chunk-L6HTZIBD.cjs.map → chunk-ALK3PUUB.cjs.map} +1 -1
  56. package/dist/{chunk-3ZZZO4F7.cjs → chunk-BY3QA3S5.cjs} +9 -9
  57. package/dist/{chunk-3ZZZO4F7.cjs.map → chunk-BY3QA3S5.cjs.map} +1 -1
  58. package/dist/{chunk-BLIO3B7Z.cjs → chunk-CMPHJRVV.cjs} +3 -3
  59. package/dist/{chunk-BLIO3B7Z.cjs.map → chunk-CMPHJRVV.cjs.map} +1 -1
  60. package/dist/{chunk-3UP32FM3.cjs → chunk-CQQQIZU4.cjs} +5 -5
  61. package/dist/{chunk-3UP32FM3.cjs.map → chunk-CQQQIZU4.cjs.map} +1 -1
  62. package/dist/{chunk-YOEP3I4V.cjs → chunk-E3L5DB5F.cjs} +5 -5
  63. package/dist/{chunk-YOEP3I4V.cjs.map → chunk-E3L5DB5F.cjs.map} +1 -1
  64. package/dist/{chunk-6JMW3IJ2.cjs → chunk-FB3JXSQT.cjs} +103 -100
  65. package/dist/chunk-FB3JXSQT.cjs.map +1 -0
  66. package/dist/{chunk-YVO6Z5BS.cjs → chunk-FGOJBOZX.cjs} +10 -10
  67. package/dist/{chunk-YVO6Z5BS.cjs.map → chunk-FGOJBOZX.cjs.map} +1 -1
  68. package/dist/{chunk-2K6IMIVL.cjs → chunk-GNZAH6UI.cjs} +3 -3
  69. package/dist/{chunk-2K6IMIVL.cjs.map → chunk-GNZAH6UI.cjs.map} +1 -1
  70. package/dist/{chunk-B3R62764.cjs → chunk-I4X72WUT.cjs} +6 -6
  71. package/dist/{chunk-B3R62764.cjs.map → chunk-I4X72WUT.cjs.map} +1 -1
  72. package/dist/{chunk-ORNLCBNE.cjs → chunk-JVEDKKNO.cjs} +43 -4
  73. package/dist/chunk-JVEDKKNO.cjs.map +1 -0
  74. package/dist/{chunk-UUENH4BJ.cjs → chunk-KXIRVKCJ.cjs} +3 -3
  75. package/dist/{chunk-UUENH4BJ.cjs.map → chunk-KXIRVKCJ.cjs.map} +1 -1
  76. package/dist/{chunk-PWBRE7JA.cjs → chunk-LOB2ATS5.cjs} +24 -11
  77. package/dist/chunk-LOB2ATS5.cjs.map +1 -0
  78. package/dist/{chunk-ENOPKX7E.cjs → chunk-LXM5QXII.cjs} +3 -3
  79. package/dist/{chunk-ENOPKX7E.cjs.map → chunk-LXM5QXII.cjs.map} +1 -1
  80. package/dist/{chunk-PSB64T43.cjs → chunk-MLA2BJ2Y.cjs} +28 -28
  81. package/dist/{chunk-PSB64T43.cjs.map → chunk-MLA2BJ2Y.cjs.map} +1 -1
  82. package/dist/chunk-OALQGO5C.cjs +18 -0
  83. package/dist/{chunk-IRGRMJPP.cjs.map → chunk-OALQGO5C.cjs.map} +1 -1
  84. package/dist/{chunk-OGK377NL.cjs → chunk-OHHKBURG.cjs} +33 -33
  85. package/dist/{chunk-OGK377NL.cjs.map → chunk-OHHKBURG.cjs.map} +1 -1
  86. package/dist/{chunk-GAMRVB3I.cjs → chunk-Q6N5D3R5.cjs} +32 -7
  87. package/dist/chunk-Q6N5D3R5.cjs.map +1 -0
  88. package/dist/{chunk-4LP5MJGQ.cjs → chunk-QG2U2JGX.cjs} +4 -4
  89. package/dist/{chunk-4LP5MJGQ.cjs.map → chunk-QG2U2JGX.cjs.map} +1 -1
  90. package/dist/{chunk-MVXHTAJ4.cjs → chunk-QWVUBTW3.cjs} +9 -9
  91. package/dist/{chunk-MVXHTAJ4.cjs.map → chunk-QWVUBTW3.cjs.map} +1 -1
  92. package/dist/{chunk-OHWHYVKG.cjs → chunk-T73BHNQX.cjs} +3 -3
  93. package/dist/{chunk-OHWHYVKG.cjs.map → chunk-T73BHNQX.cjs.map} +1 -1
  94. package/dist/{chunk-ADPRIBSH.cjs → chunk-X7ALF4MP.cjs} +7 -7
  95. package/dist/{chunk-ADPRIBSH.cjs.map → chunk-X7ALF4MP.cjs.map} +1 -1
  96. package/dist/{chunk-PVJ5ODDB.cjs → chunk-XNB27POJ.cjs} +4 -4
  97. package/dist/{chunk-PVJ5ODDB.cjs.map → chunk-XNB27POJ.cjs.map} +1 -1
  98. package/dist/{chunk-TSFNLY3K.cjs → chunk-ZCU72Q76.cjs} +192 -166
  99. package/dist/chunk-ZCU72Q76.cjs.map +1 -0
  100. package/dist/connect/docx.cjs +16 -16
  101. package/dist/connect/index.cjs +1062 -1027
  102. package/dist/connect/index.cjs.map +1 -1
  103. package/dist/connect/viewer.cjs +25 -26
  104. package/dist/connection/ai.d.ts +1 -0
  105. package/dist/connection/docx/ConnectedNativeDocxEditor.js +4 -5
  106. package/dist/connection/docx/ConnectedNativeDocxEditor.js.map +2 -2
  107. package/dist/connection/docx/save-native-version.d.ts +3 -0
  108. package/dist/connection/docx/save-native-version.js +19 -0
  109. package/dist/connection/docx/save-native-version.js.map +7 -0
  110. package/dist/connection/presentation/ClippingPdfViewer.js +8 -5
  111. package/dist/connection/presentation/ClippingPdfViewer.js.map +2 -2
  112. package/dist/connection/presentation/ConnectedSlidesTab.js +8 -13
  113. package/dist/connection/presentation/ConnectedSlidesTab.js.map +2 -2
  114. package/dist/connection/presentation/usePresentationController.js +24 -15
  115. package/dist/connection/presentation/usePresentationController.js.map +2 -2
  116. package/dist/connection/presentation/usePresentationFiles.d.ts +2 -1
  117. package/dist/connection/presentation/usePresentationFiles.js +15 -6
  118. package/dist/connection/presentation/usePresentationFiles.js.map +2 -2
  119. package/dist/connection/search/ConnectedSearchPage.d.ts +0 -11
  120. package/dist/connection/search/ConnectedSearchPage.js +3 -0
  121. package/dist/connection/search/ConnectedSearchPage.js.map +2 -2
  122. package/dist/connection/search/SearchResultRows.js +75 -43
  123. package/dist/connection/search/SearchResultRows.js.map +2 -2
  124. package/dist/connection/viewer/CleanViewControl.d.ts +3 -1
  125. package/dist/connection/viewer/CleanViewControl.js +5 -1
  126. package/dist/connection/viewer/CleanViewControl.js.map +2 -2
  127. package/dist/connection/viewer/ConnectedDocumentViewer.js +1 -1
  128. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  129. package/dist/connection/viewer/useCleanView.d.ts +1 -1
  130. package/dist/connection/viewer/useCleanView.js +2 -2
  131. package/dist/connection/viewer/useCleanView.js.map +2 -2
  132. package/dist/connection/viewer/useViewedDocument.d.ts +1 -0
  133. package/dist/document-tools/index.cjs +20 -20
  134. package/dist/docx/NativeDocxEditor.d.ts +2 -1
  135. package/dist/docx/NativeDocxEditor.js +30 -5
  136. package/dist/docx/NativeDocxEditor.js.map +2 -2
  137. package/dist/docx/index.cjs +38 -38
  138. package/dist/embed/index.cjs +19 -19
  139. package/dist/facts/index.cjs +64 -64
  140. package/dist/files/index.cjs +223 -223
  141. package/dist/index.cjs +523 -523
  142. package/dist/presentation/ClipCaptureOverlay.js +14 -1
  143. package/dist/presentation/ClipCaptureOverlay.js.map +2 -2
  144. package/dist/presentation/ClipImage.js +7 -4
  145. package/dist/presentation/ClipImage.js.map +2 -2
  146. package/dist/presentation/ClipTray.js +11 -7
  147. package/dist/presentation/ClipTray.js.map +2 -2
  148. package/dist/presentation/SlidesEditor.js +6 -2
  149. package/dist/presentation/SlidesEditor.js.map +2 -2
  150. package/dist/presentation/store.d.ts +2 -0
  151. package/dist/presentation/store.js +15 -0
  152. package/dist/presentation/store.js.map +3 -3
  153. package/dist/settings/index.cjs +146 -146
  154. package/dist/site/index.cjs +6 -6
  155. package/dist/studio/index.cjs +10 -10
  156. package/dist/workflow-canvas/index.cjs +33 -33
  157. package/node_modules/@arbidocs/coedit/package.json +1 -1
  158. package/package.json +5 -5
  159. package/dist/ClippingMediaViewer-ZFEX5A3U.cjs.map +0 -1
  160. package/dist/ClippingPdfViewer-3LRTEPHV.cjs.map +0 -1
  161. package/dist/ConnectedPresentation-L32JPRFI.cjs.map +0 -1
  162. package/dist/ConnectedSlidesTab-P7GGNUTO.cjs.map +0 -1
  163. package/dist/FilesViewerDialog-MHUVEZ7M.cjs.map +0 -1
  164. package/dist/SpotlightStrip-ED22UYTM.cjs.map +0 -1
  165. package/dist/chunk-6JMW3IJ2.cjs.map +0 -1
  166. package/dist/chunk-GAMRVB3I.cjs.map +0 -1
  167. package/dist/chunk-GFUOCGY6.cjs +0 -32
  168. package/dist/chunk-GFUOCGY6.cjs.map +0 -1
  169. package/dist/chunk-IRGRMJPP.cjs +0 -18
  170. package/dist/chunk-JY7UUZQG.cjs.map +0 -1
  171. package/dist/chunk-ORNLCBNE.cjs.map +0 -1
  172. package/dist/chunk-PWBRE7JA.cjs.map +0 -1
  173. package/dist/chunk-TSFNLY3K.cjs.map +0 -1
  174. package/dist/chunk-ZZZITHGK.cjs.map +0 -1
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkZESMRGDV_cjs = require('./chunk-ZESMRGDV.cjs');
5
4
  var chunkQQMMCXBP_cjs = require('./chunk-QQMMCXBP.cjs');
5
+ var chunkZESMRGDV_cjs = require('./chunk-ZESMRGDV.cjs');
6
6
  var chunkJDFBEGQO_cjs = require('./chunk-JDFBEGQO.cjs');
7
7
  var documentTools = require('@arbidocs/react/document-tools');
8
8
  var ui = require('@arbidocs/react/ui');
@@ -385,5 +385,5 @@ exports.SavedSignatureSettings = SavedSignatureSettings;
385
385
  exports.SignatureCertificate = SignatureCertificate;
386
386
  exports.SignatureStatus = SignatureStatus;
387
387
  exports.formatSignedAt = formatSignedAt;
388
- //# sourceMappingURL=chunk-2K6IMIVL.cjs.map
389
- //# sourceMappingURL=chunk-2K6IMIVL.cjs.map
388
+ //# sourceMappingURL=chunk-GNZAH6UI.cjs.map
389
+ //# sourceMappingURL=chunk-GNZAH6UI.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/document-tools/SignatureStatus.tsx","../src/document-tools/SignatureCertificate.tsx","../src/document-tools/SavedSignatureSettings.tsx"],"names":["jsxs","jsx","useOptionalDocumentTools","Popover","PopoverTrigger","PopoverContent","certificateLink","useState","useRef","matchSignedCopy","cn","useDocumentTools","useSavedSignature","useStoreSavedSignature","useDeleteSavedSignature","Fragment","SettingsDisclosure","SettingsCard","INFORMAL_SIGNATURE_NOTE","Button","PenLine","Upload","Trash2","AdoptSignatureDialog","ConfirmDialog"],"mappings":"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","file":"chunk-2K6IMIVL.cjs","sourcesContent":["/**\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}\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}: 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 <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') || 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 {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 * Account settings › Your signature: the signature and initials saved to the account (sealed with\n * the user's own key), with Replace (the adopt dialog, saving over it) and Delete (removed from the\n * account completely; what was already placed in documents or sealed in signed PDFs stays as it\n * is). Needs a `<DocumentToolsProvider>` inside a React Query `QueryClientProvider`.\n */\n\nimport { useState, type ReactElement } from 'react'\nimport { PenLine, Trash2, Upload } from 'lucide-react'\nimport {\n INFORMAL_SIGNATURE_NOTE,\n useDeleteSavedSignature,\n useDocumentTools,\n useSavedSignature,\n useStoreSavedSignature,\n} from '@arbidocs/react/document-tools'\nimport { Button } from '@arbidocs/react/ui'\nimport { ConfirmDialog } from '../provider/dialogs'\nimport { SettingsCard, SettingsDisclosure } from '../settings/SettingsPanel'\nimport { AdoptSignatureDialog } from './AdoptSignatureDialog'\n\nexport const DELETE_SAVED_SIGNATURE_TEXT =\n 'Your saved signature and initials are removed from your account completely. Signatures you ' +\n 'already inserted into documents, and those sealed in signed PDFs, are not affected.'\n\nexport function SavedSignatureSettings(): ReactElement {\n const { user, notify } = useDocumentTools()\n const saved = useSavedSignature()\n const store = useStoreSavedSignature()\n const remove = useDeleteSavedSignature()\n const [editing, setEditing] = useState(false)\n const [uploading, setUploading] = useState(false)\n const [confirming, setConfirming] = useState(false)\n const signature = saved.data\n\n return (\n <>\n <SettingsDisclosure title=\"Saved signature\" testId=\"saved-signature-settings\">\n <SettingsCard>\n <div className=\"space-y-1\">\n <p className=\"text-sm text-muted-foreground\">\n Saved to your account, sealed with your own key, to insert into Word documents and\n place on PDFs. {INFORMAL_SIGNATURE_NOTE}\n </p>\n </div>\n {signature ? (\n <div\n className=\"flex flex-wrap items-center gap-4\"\n data-testid=\"saved-signature-preview\"\n >\n <img\n src={`data:image/png;base64,${signature.signature_png}`}\n alt=\"Your saved signature\"\n className=\"h-16 max-w-xs rounded-md border bg-white object-contain p-1\"\n />\n <img\n src={`data:image/png;base64,${signature.initials_png}`}\n alt=\"Your saved initials\"\n className=\"h-16 max-w-[8rem] rounded-md border bg-white object-contain p-1\"\n />\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"saved-signature-none\">\n {saved.isLoading ? 'Loading…' : 'No signature saved.'}\n </p>\n )}\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n setUploading(false)\n setEditing(true)\n }}\n data-testid=\"saved-signature-replace\"\n >\n <PenLine className=\"mr-1 size-4\" aria-hidden />\n {signature ? 'Replace' : 'Add a signature'}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n setUploading(true)\n setEditing(true)\n }}\n data-testid=\"saved-signature-upload\"\n >\n <Upload className=\"mr-1 size-4\" aria-hidden />\n Upload\n </Button>\n {signature && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => setConfirming(true)}\n data-testid=\"saved-signature-delete\"\n >\n <Trash2 className=\"mr-1 size-4\" aria-hidden />\n Delete\n </Button>\n )}\n </div>\n </SettingsCard>\n </SettingsDisclosure>\n <AdoptSignatureDialog\n initialStyle={uploading ? 'uploaded' : undefined}\n open={editing}\n onOpenChange={setEditing}\n mode=\"save\"\n defaultName={user?.name ?? ''}\n saved={signature ?? null}\n onSave={async (next) => void (await store.mutateAsync(next))}\n onAdopt={() => {\n setEditing(false)\n notify('Your signature is saved.', 'success')\n }}\n />\n <ConfirmDialog\n isOpen={confirming}\n onClose={() => setConfirming(false)}\n onConfirm={async () => {\n try {\n await remove.mutateAsync()\n notify('Your saved signature is deleted.', 'success')\n } catch (err) {\n notify(err instanceof Error ? err.message : 'Could not delete it', 'error')\n } finally {\n setConfirming(false)\n }\n }}\n title=\"Delete your saved signature?\"\n description={DELETE_SAVED_SIGNATURE_TEXT}\n confirmText=\"Delete\"\n variant=\"destructive\"\n isLoading={remove.isPending}\n testId=\"saved-signature-delete-confirm\"\n />\n </>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/document-tools/SignatureStatus.tsx","../src/document-tools/SignatureCertificate.tsx","../src/document-tools/SavedSignatureSettings.tsx"],"names":["jsxs","jsx","useOptionalDocumentTools","Popover","PopoverTrigger","PopoverContent","certificateLink","useState","useRef","matchSignedCopy","cn","useDocumentTools","useSavedSignature","useStoreSavedSignature","useDeleteSavedSignature","Fragment","SettingsDisclosure","SettingsCard","INFORMAL_SIGNATURE_NOTE","Button","PenLine","Upload","Trash2","AdoptSignatureDialog","ConfirmDialog"],"mappings":"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","file":"chunk-GNZAH6UI.cjs","sourcesContent":["/**\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}\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}: 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 <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') || 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 {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 * Account settings › Your signature: the signature and initials saved to the account (sealed with\n * the user's own key), with Replace (the adopt dialog, saving over it) and Delete (removed from the\n * account completely; what was already placed in documents or sealed in signed PDFs stays as it\n * is). Needs a `<DocumentToolsProvider>` inside a React Query `QueryClientProvider`.\n */\n\nimport { useState, type ReactElement } from 'react'\nimport { PenLine, Trash2, Upload } from 'lucide-react'\nimport {\n INFORMAL_SIGNATURE_NOTE,\n useDeleteSavedSignature,\n useDocumentTools,\n useSavedSignature,\n useStoreSavedSignature,\n} from '@arbidocs/react/document-tools'\nimport { Button } from '@arbidocs/react/ui'\nimport { ConfirmDialog } from '../provider/dialogs'\nimport { SettingsCard, SettingsDisclosure } from '../settings/SettingsPanel'\nimport { AdoptSignatureDialog } from './AdoptSignatureDialog'\n\nexport const DELETE_SAVED_SIGNATURE_TEXT =\n 'Your saved signature and initials are removed from your account completely. Signatures you ' +\n 'already inserted into documents, and those sealed in signed PDFs, are not affected.'\n\nexport function SavedSignatureSettings(): ReactElement {\n const { user, notify } = useDocumentTools()\n const saved = useSavedSignature()\n const store = useStoreSavedSignature()\n const remove = useDeleteSavedSignature()\n const [editing, setEditing] = useState(false)\n const [uploading, setUploading] = useState(false)\n const [confirming, setConfirming] = useState(false)\n const signature = saved.data\n\n return (\n <>\n <SettingsDisclosure title=\"Saved signature\" testId=\"saved-signature-settings\">\n <SettingsCard>\n <div className=\"space-y-1\">\n <p className=\"text-sm text-muted-foreground\">\n Saved to your account, sealed with your own key, to insert into Word documents and\n place on PDFs. {INFORMAL_SIGNATURE_NOTE}\n </p>\n </div>\n {signature ? (\n <div\n className=\"flex flex-wrap items-center gap-4\"\n data-testid=\"saved-signature-preview\"\n >\n <img\n src={`data:image/png;base64,${signature.signature_png}`}\n alt=\"Your saved signature\"\n className=\"h-16 max-w-xs rounded-md border bg-white object-contain p-1\"\n />\n <img\n src={`data:image/png;base64,${signature.initials_png}`}\n alt=\"Your saved initials\"\n className=\"h-16 max-w-[8rem] rounded-md border bg-white object-contain p-1\"\n />\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"saved-signature-none\">\n {saved.isLoading ? 'Loading…' : 'No signature saved.'}\n </p>\n )}\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n setUploading(false)\n setEditing(true)\n }}\n data-testid=\"saved-signature-replace\"\n >\n <PenLine className=\"mr-1 size-4\" aria-hidden />\n {signature ? 'Replace' : 'Add a signature'}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n setUploading(true)\n setEditing(true)\n }}\n data-testid=\"saved-signature-upload\"\n >\n <Upload className=\"mr-1 size-4\" aria-hidden />\n Upload\n </Button>\n {signature && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => setConfirming(true)}\n data-testid=\"saved-signature-delete\"\n >\n <Trash2 className=\"mr-1 size-4\" aria-hidden />\n Delete\n </Button>\n )}\n </div>\n </SettingsCard>\n </SettingsDisclosure>\n <AdoptSignatureDialog\n initialStyle={uploading ? 'uploaded' : undefined}\n open={editing}\n onOpenChange={setEditing}\n mode=\"save\"\n defaultName={user?.name ?? ''}\n saved={signature ?? null}\n onSave={async (next) => void (await store.mutateAsync(next))}\n onAdopt={() => {\n setEditing(false)\n notify('Your signature is saved.', 'success')\n }}\n />\n <ConfirmDialog\n isOpen={confirming}\n onClose={() => setConfirming(false)}\n onConfirm={async () => {\n try {\n await remove.mutateAsync()\n notify('Your saved signature is deleted.', 'success')\n } catch (err) {\n notify(err instanceof Error ? err.message : 'Could not delete it', 'error')\n } finally {\n setConfirming(false)\n }\n }}\n title=\"Delete your saved signature?\"\n description={DELETE_SAVED_SIGNATURE_TEXT}\n confirmText=\"Delete\"\n variant=\"destructive\"\n isLoading={remove.isPending}\n testId=\"saved-signature-delete-confirm\"\n />\n </>\n )\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkPVJ5ODDB_cjs = require('./chunk-PVJ5ODDB.cjs');
5
- var chunkPWBRE7JA_cjs = require('./chunk-PWBRE7JA.cjs');
4
+ var chunkXNB27POJ_cjs = require('./chunk-XNB27POJ.cjs');
5
+ var chunkLOB2ATS5_cjs = require('./chunk-LOB2ATS5.cjs');
6
6
  var react = require('@arbidocs/react');
7
7
  var jsxRuntime = require('react/jsx-runtime');
8
8
 
@@ -10,13 +10,13 @@ function ConnectedNativeDocxComparison({
10
10
  fontBaseUrl,
11
11
  ...props
12
12
  }) {
13
- const adapter = chunkPWBRE7JA_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
13
+ const adapter = chunkLOB2ATS5_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
14
14
  const { data: documents, isLoading } = react.useDocuments();
15
15
  const morePages = react.useDocumentsLoading();
16
16
  if (isLoading || morePages)
17
17
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "native-docx-error", role: "status", children: "Comparing Word documents\u2026" });
18
18
  return /* @__PURE__ */ jsxRuntime.jsx(
19
- chunkPVJ5ODDB_cjs.NativeDocxComparison,
19
+ chunkXNB27POJ_cjs.NativeDocxComparison,
20
20
  {
21
21
  ...props,
22
22
  adapter,
@@ -27,5 +27,5 @@ function ConnectedNativeDocxComparison({
27
27
  }
28
28
 
29
29
  exports.ConnectedNativeDocxComparison = ConnectedNativeDocxComparison;
30
- //# sourceMappingURL=chunk-B3R62764.cjs.map
31
- //# sourceMappingURL=chunk-B3R62764.cjs.map
30
+ //# sourceMappingURL=chunk-I4X72WUT.cjs.map
31
+ //# sourceMappingURL=chunk-I4X72WUT.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/docx/ConnectedNativeDocxComparison.tsx"],"names":["useConnectedNativeDocxAdapter","useDocuments","useDocumentsLoading","jsx","NativeDocxComparison"],"mappings":";;;;;;;AAYO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,KAAcC,kBAAA,EAAa;AAEpD,EAAA,MAAM,YAAYC,yBAAA,EAAoB;AAEtC,EAAA,IAAI,SAAA,IAAa,SAAA;AACf,IAAA,sCACG,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,IAAA,EAAK,UAAS,QAAA,EAAA,gCAAA,EAEjD,CAAA;AAEJ,EAAA,uBACEC,cAAA;AAAA,IAACC,sCAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAY,OAAA,CAAQ;AAAA;AAAA,GACtB;AAEJ","file":"chunk-B3R62764.cjs","sourcesContent":["import { useDocuments, useDocumentsLoading } from '@arbidocs/react'\nimport {\n NativeDocxComparison,\n type NativeDocxComparisonProps,\n} from '../../docx/NativeDocxComparison'\nimport { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\n\n/**\n * The Word redline of two documents or versions, on the signed-in session. The unedited redline\n * saved earlier from the same versions is opened again (found in the workspace's documents, once\n * all their pages are read), so opening a comparison saves at most one.\n */\nexport function ConnectedNativeDocxComparison({\n fontBaseUrl,\n ...props\n}: Omit<NativeDocxComparisonProps, 'adapter' | 'onCompared' | 'documents'> & {\n fontBaseUrl?: string\n}) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n const { data: documents, isLoading } = useDocuments()\n // Every page: the first holds only the oldest documents, and a redline is often newer.\n const morePages = useDocumentsLoading()\n // Until the documents are read, a saved redline can't be found: wait rather than save another.\n if (isLoading || morePages)\n return (\n <div className=\"native-docx-error\" role=\"status\">\n Comparing Word documents…\n </div>\n )\n return (\n <NativeDocxComparison\n {...props}\n adapter={adapter}\n documents={documents}\n onCompared={adapter.onVersionSaved}\n />\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/docx/ConnectedNativeDocxComparison.tsx"],"names":["useConnectedNativeDocxAdapter","useDocuments","useDocumentsLoading","jsx","NativeDocxComparison"],"mappings":";;;;;;;AAYO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAEG;AACD,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,KAAcC,kBAAA,EAAa;AAEpD,EAAA,MAAM,YAAYC,yBAAA,EAAoB;AAEtC,EAAA,IAAI,SAAA,IAAa,SAAA;AACf,IAAA,sCACG,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,IAAA,EAAK,UAAS,QAAA,EAAA,gCAAA,EAEjD,CAAA;AAEJ,EAAA,uBACEC,cAAA;AAAA,IAACC,sCAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAY,OAAA,CAAQ;AAAA;AAAA,GACtB;AAEJ","file":"chunk-I4X72WUT.cjs","sourcesContent":["import { useDocuments, useDocumentsLoading } from '@arbidocs/react'\nimport {\n NativeDocxComparison,\n type NativeDocxComparisonProps,\n} from '../../docx/NativeDocxComparison'\nimport { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\n\n/**\n * The Word redline of two documents or versions, on the signed-in session. The unedited redline\n * saved earlier from the same versions is opened again (found in the workspace's documents, once\n * all their pages are read), so opening a comparison saves at most one.\n */\nexport function ConnectedNativeDocxComparison({\n fontBaseUrl,\n ...props\n}: Omit<NativeDocxComparisonProps, 'adapter' | 'onCompared' | 'documents'> & {\n fontBaseUrl?: string\n}) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n const { data: documents, isLoading } = useDocuments()\n // Every page: the first holds only the oldest documents, and a redline is often newer.\n const morePages = useDocumentsLoading()\n // Until the documents are read, a saved redline can't be found: wait rather than save another.\n if (isLoading || morePages)\n return (\n <div className=\"native-docx-error\" role=\"status\">\n Comparing Word documents…\n </div>\n )\n return (\n <NativeDocxComparison\n {...props}\n adapter={adapter}\n documents={documents}\n onCompared={adapter.onVersionSaved}\n />\n )\n}\n"]}
@@ -1,7 +1,6 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkGFUOCGY6_cjs = require('./chunk-GFUOCGY6.cjs');
5
4
  var zustand = require('zustand');
6
5
  var viewers = require('@arbidocs/react/viewers');
7
6
 
@@ -250,6 +249,26 @@ function mediaCaption(fileName, start) {
250
249
  return start === void 0 ? name : `${name} \xB7 ${formatTime(start)}`;
251
250
  }
252
251
 
252
+ // src/presentation/panel-id.ts
253
+ var PRESENTATION_PANEL = "presentation-panel";
254
+ var PRESENTATION_FILE_SUFFIX = ".presentation.pdf";
255
+ var LEGACY_PRESENTATION_SUFFIX = ".presentation.json";
256
+ var isLegacyPresentationFile = (fileName) => !!fileName && fileName.endsWith(LEGACY_PRESENTATION_SUFFIX);
257
+ var openedInThisPage = false;
258
+ var presentOnly = false;
259
+ function openPresentation(session, {
260
+ present = false,
261
+ windows,
262
+ title = "Presentation"
263
+ } = {}) {
264
+ openedInThisPage = true;
265
+ presentOnly = present;
266
+ windows?.createPopupWindow(`panel-${PRESENTATION_PANEL}`, void 0, title);
267
+ session.openPanel(PRESENTATION_PANEL, "popout");
268
+ }
269
+ var presentationOpenedInThisPage = () => openedInThisPage;
270
+ var presentationWindowOnlyPresents = () => presentOnly;
271
+
253
272
  // src/presentation/slide-layout.ts
254
273
  var TEXT_INSET = 0.06;
255
274
  var LAYOUT_INFO = {
@@ -823,7 +842,7 @@ function presentationFileName(title) {
823
842
  return `${safeFileStem(title)}.pptx`;
824
843
  }
825
844
  function presentationTitle(fileName) {
826
- for (const suffix of [chunkGFUOCGY6_cjs.PRESENTATION_FILE_SUFFIX, chunkGFUOCGY6_cjs.LEGACY_PRESENTATION_SUFFIX, ".pptx", ".pdf"]) {
845
+ for (const suffix of [PRESENTATION_FILE_SUFFIX, LEGACY_PRESENTATION_SUFFIX, ".pptx", ".pdf"]) {
827
846
  if (fileName.endsWith(suffix)) return fileName.slice(0, -suffix.length);
828
847
  }
829
848
  return fileName;
@@ -946,6 +965,7 @@ var initialState = () => ({
946
965
  notice: null,
947
966
  title: "Untitled presentation",
948
967
  savedId: null,
968
+ autosave: false,
949
969
  version: null,
950
970
  boundTo: null,
951
971
  clean: null,
@@ -954,6 +974,19 @@ var initialState = () => ({
954
974
  function arranged(slide, clips, look) {
955
975
  const aspects = slide.items.map((item) => aspectOf(clips, item.clipId));
956
976
  const frames = autoLayout(aspects, reserveOf(slide, look));
977
+ const pdfScales = slide.items.flatMap((item, i) => {
978
+ const clip = clips.find((clip2) => clip2.id === item.clipId);
979
+ return clip?.kind === "pdf" ? [frames[i].w / clip.rect.w] : [];
980
+ });
981
+ const pageScale = pdfScales.length ? Math.min(...pdfScales) : null;
982
+ if (pageScale !== null)
983
+ slide.items.forEach((item, i) => {
984
+ const clip = clips.find((clip2) => clip2.id === item.clipId);
985
+ if (clip?.kind !== "pdf") return;
986
+ const old = frames[i];
987
+ const w = clip.rect.w * pageScale;
988
+ frames[i] = { ...old, x: old.x + (old.w - w) / 2, w };
989
+ });
957
990
  return {
958
991
  ...slide,
959
992
  auto: true,
@@ -1310,6 +1343,7 @@ var usePresentation = zustand.create()((set, get) => {
1310
1343
  title: opened.title,
1311
1344
  savedId: opened.savedId,
1312
1345
  version: opened.version ?? null,
1346
+ autosave: opened.autosave ?? false,
1313
1347
  boundTo: opened.boundTo ?? opened.savedId,
1314
1348
  captions: opened.captions,
1315
1349
  labelColumn: opened.labelColumn ?? null,
@@ -1350,6 +1384,7 @@ exports.FONTS = FONTS;
1350
1384
  exports.LAYOUT_INFO = LAYOUT_INFO;
1351
1385
  exports.PRESENTATIONS_FOLDER = PRESENTATIONS_FOLDER;
1352
1386
  exports.PRESENTATION_ATTACHMENT = PRESENTATION_ATTACHMENT;
1387
+ exports.PRESENTATION_PANEL = PRESENTATION_PANEL;
1353
1388
  exports.SLIDE_LAYOUTS = SLIDE_LAYOUTS;
1354
1389
  exports.SLIDE_POINTS = SLIDE_POINTS;
1355
1390
  exports.STAGE_ASPECT = STAGE_ASPECT;
@@ -1369,18 +1404,22 @@ exports.formatTime = formatTime;
1369
1404
  exports.frameHeight = frameHeight;
1370
1405
  exports.hasUnsavedChanges = hasUnsavedChanges;
1371
1406
  exports.isHexColor = isHexColor;
1407
+ exports.isLegacyPresentationFile = isLegacyPresentationFile;
1372
1408
  exports.isLightBackground = isLightBackground;
1373
1409
  exports.mediaCaption = mediaCaption;
1374
1410
  exports.moveBox = moveBox;
1375
1411
  exports.moveFrame = moveFrame;
1376
1412
  exports.newBox = newBox;
1413
+ exports.openPresentation = openPresentation;
1377
1414
  exports.paintBackground = paintBackground;
1378
1415
  exports.paintClipEdge = paintClipEdge;
1379
1416
  exports.paintSlideBackground = paintSlideBackground;
1380
1417
  exports.parsePresentation = parsePresentation;
1381
1418
  exports.pointsToStage = pointsToStage;
1382
1419
  exports.presentationFileName = presentationFileName;
1420
+ exports.presentationOpenedInThisPage = presentationOpenedInThisPage;
1383
1421
  exports.presentationTitle = presentationTitle;
1422
+ exports.presentationWindowOnlyPresents = presentationWindowOnlyPresents;
1384
1423
  exports.reserveOf = reserveOf;
1385
1424
  exports.reshapeFrame = reshapeFrame;
1386
1425
  exports.resizeFrame = resizeFrame;
@@ -1392,5 +1431,5 @@ exports.stretchBox = stretchBox;
1392
1431
  exports.styleRuns = styleRuns;
1393
1432
  exports.textLines = textLines;
1394
1433
  exports.usePresentation = usePresentation;
1395
- //# sourceMappingURL=chunk-ORNLCBNE.cjs.map
1396
- //# sourceMappingURL=chunk-ORNLCBNE.cjs.map
1434
+ //# sourceMappingURL=chunk-JVEDKKNO.cjs.map
1435
+ //# sourceMappingURL=chunk-JVEDKKNO.cjs.map