@arbidocs/blocks 0.4.157 → 0.4.159

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 (127) hide show
  1. package/dist/{ConnectedNativeDocxComparison-S25BPUH5.cjs → ConnectedNativeDocxComparison-R6RU5TZE.cjs} +8 -7
  2. package/dist/{ConnectedNativeDocxComparison-S25BPUH5.cjs.map → ConnectedNativeDocxComparison-R6RU5TZE.cjs.map} +1 -1
  3. package/dist/{ConnectedNativeDocxComparison-2PLOOXSH.js → ConnectedNativeDocxComparison-XMZ5KLD4.js} +7 -6
  4. package/dist/{ConnectedNativeDocxComparison-2PLOOXSH.js.map → ConnectedNativeDocxComparison-XMZ5KLD4.js.map} +1 -1
  5. package/dist/{ConnectedNativeDocxEditor-YA4HWLY4.cjs → ConnectedNativeDocxEditor-LBATSM3M.cjs} +7 -6
  6. package/dist/{ConnectedNativeDocxEditor-YA4HWLY4.cjs.map → ConnectedNativeDocxEditor-LBATSM3M.cjs.map} +1 -1
  7. package/dist/{ConnectedNativeDocxEditor-JJAGMHZC.js → ConnectedNativeDocxEditor-NGUK2AX6.js} +5 -4
  8. package/dist/{ConnectedNativeDocxEditor-JJAGMHZC.js.map → ConnectedNativeDocxEditor-NGUK2AX6.js.map} +1 -1
  9. package/dist/{ConnectedStreamedWordArtifact-EXYZAU4Y.cjs → ConnectedStreamedWordArtifact-CWFR6A37.cjs} +8 -7
  10. package/dist/ConnectedStreamedWordArtifact-CWFR6A37.cjs.map +1 -0
  11. package/dist/{ConnectedStreamedWordArtifact-YAAXY5KY.js → ConnectedStreamedWordArtifact-IXRJ7MUE.js} +7 -6
  12. package/dist/{ConnectedStreamedWordArtifact-YAAXY5KY.js.map → ConnectedStreamedWordArtifact-IXRJ7MUE.js.map} +1 -1
  13. package/dist/{NativeDocxEditor-M3I776GD.cjs → NativeDocxEditor-T2PJIZMU.cjs} +9 -7
  14. package/dist/{NativeDocxEditor-M3I776GD.cjs.map → NativeDocxEditor-T2PJIZMU.cjs.map} +1 -1
  15. package/dist/{NativeDocxEditor-JBQMH3MP.js → NativeDocxEditor-TBTBD6TC.js} +5 -3
  16. package/dist/{NativeDocxEditor-JBQMH3MP.js.map → NativeDocxEditor-TBTBD6TC.js.map} +1 -1
  17. package/dist/{WorkspaceTableView-5OWX53R5.js → WorkspaceTableView-DWUE4VQF.js} +19 -9
  18. package/dist/WorkspaceTableView-DWUE4VQF.js.map +1 -0
  19. package/dist/{WorkspaceTableView-ZFMAYHUD.cjs → WorkspaceTableView-EYLEUZZT.cjs} +21 -11
  20. package/dist/WorkspaceTableView-EYLEUZZT.cjs.map +1 -0
  21. package/dist/{chunk-IJEISII2.cjs → chunk-2BHDRVVL.cjs} +17 -7
  22. package/dist/chunk-2BHDRVVL.cjs.map +1 -0
  23. package/dist/chunk-2R3GGNPA.js +151 -0
  24. package/dist/chunk-2R3GGNPA.js.map +1 -0
  25. package/dist/{chunk-F3EZDBDJ.js → chunk-3OCNUKGX.js} +4 -4
  26. package/dist/{chunk-F3EZDBDJ.js.map → chunk-3OCNUKGX.js.map} +1 -1
  27. package/dist/{chunk-D3WFIFRY.cjs → chunk-3VW7ZXQ6.cjs} +211 -5
  28. package/dist/chunk-3VW7ZXQ6.cjs.map +1 -0
  29. package/dist/{chunk-JSQEAPTC.cjs → chunk-4GITK3Q5.cjs} +398 -75
  30. package/dist/chunk-4GITK3Q5.cjs.map +1 -0
  31. package/dist/{chunk-2CWM2CFZ.js → chunk-7UENVUA6.js} +4 -4
  32. package/dist/{chunk-2CWM2CFZ.js.map → chunk-7UENVUA6.js.map} +1 -1
  33. package/dist/{chunk-EWCJXUBP.js → chunk-AVXRXPII.js} +3 -3
  34. package/dist/{chunk-EWCJXUBP.js.map → chunk-AVXRXPII.js.map} +1 -1
  35. package/dist/{chunk-7IRSCMNK.js → chunk-BGXWPVHR.js} +3 -3
  36. package/dist/{chunk-7IRSCMNK.js.map → chunk-BGXWPVHR.js.map} +1 -1
  37. package/dist/chunk-DAN7EJ4O.js +482 -0
  38. package/dist/chunk-DAN7EJ4O.js.map +1 -0
  39. package/dist/chunk-E4H5H2C3.cjs +18 -0
  40. package/dist/{chunk-OTU5KGQ6.cjs.map → chunk-E4H5H2C3.cjs.map} +1 -1
  41. package/dist/{chunk-VY4UFXTM.cjs → chunk-ETJFC6MO.cjs} +4 -4
  42. package/dist/{chunk-VY4UFXTM.cjs.map → chunk-ETJFC6MO.cjs.map} +1 -1
  43. package/dist/{chunk-TQIY2SVY.cjs → chunk-GFVIFXWT.cjs} +5 -5
  44. package/dist/{chunk-TQIY2SVY.cjs.map → chunk-GFVIFXWT.cjs.map} +1 -1
  45. package/dist/chunk-JPWPR6QU.cjs +485 -0
  46. package/dist/chunk-JPWPR6QU.cjs.map +1 -0
  47. package/dist/{chunk-KQYPP72K.js → chunk-JTJCCL2E.js} +212 -9
  48. package/dist/chunk-JTJCCL2E.js.map +1 -0
  49. package/dist/{chunk-PGOSIJ2I.js → chunk-KFMRBZQK.js} +15 -5
  50. package/dist/chunk-KFMRBZQK.js.map +1 -0
  51. package/dist/chunk-NMZI3K6R.cjs +159 -0
  52. package/dist/chunk-NMZI3K6R.cjs.map +1 -0
  53. package/dist/{chunk-53RCZPMR.cjs → chunk-P2YM67Y5.cjs} +5 -5
  54. package/dist/{chunk-53RCZPMR.cjs.map → chunk-P2YM67Y5.cjs.map} +1 -1
  55. package/dist/chunk-Q2XGM372.cjs +18 -0
  56. package/dist/{chunk-S74QMZVZ.cjs.map → chunk-Q2XGM372.cjs.map} +1 -1
  57. package/dist/{chunk-7HHYMDPE.js → chunk-RATEAOKT.js} +3 -3
  58. package/dist/{chunk-7HHYMDPE.js.map → chunk-RATEAOKT.js.map} +1 -1
  59. package/dist/{chunk-SN2GZ4ZM.cjs → chunk-TQUYWUEE.cjs} +10 -156
  60. package/dist/chunk-TQUYWUEE.cjs.map +1 -0
  61. package/dist/{chunk-ONTUMV74.js → chunk-XER3JLC7.js} +398 -78
  62. package/dist/chunk-XER3JLC7.js.map +1 -0
  63. package/dist/{chunk-HP2C4MD3.js → chunk-ZDOKJD44.js} +4 -143
  64. package/dist/chunk-ZDOKJD44.js.map +1 -0
  65. package/dist/connect/docx.cjs +11 -10
  66. package/dist/connect/docx.js +7 -6
  67. package/dist/connect/index.cjs +406 -384
  68. package/dist/connect/index.cjs.map +1 -1
  69. package/dist/connect/index.js +69 -47
  70. package/dist/connect/index.js.map +1 -1
  71. package/dist/connect/viewer.cjs +41 -20
  72. package/dist/connect/viewer.cjs.map +1 -1
  73. package/dist/connect/viewer.js +29 -8
  74. package/dist/connect/viewer.js.map +1 -1
  75. package/dist/connection/viewer/ViewerPdfPane.d.ts +7 -1
  76. package/dist/connection/workspace-list/ConnectedWorkspaceList.d.ts +4 -2
  77. package/dist/connection/workspace-list/WorkspaceCardsView.d.ts +3 -2
  78. package/dist/connection/workspace-list/WorkspaceTableView.d.ts +3 -2
  79. package/dist/connection/workspace-list/index.d.ts +1 -1
  80. package/dist/connection/workspace-list/useConnectedWorkspaceList.d.ts +19 -0
  81. package/dist/connection/workspace-list/workspaceTable.d.ts +3 -1
  82. package/dist/connection/workspace-settings/ConnectedWorkspaceSettings.d.ts +3 -1
  83. package/dist/document-tools/AdoptSignatureDialog.d.ts +39 -4
  84. package/dist/document-tools/PlaceMySignatureButton.d.ts +16 -0
  85. package/dist/document-tools/SavedSignatureSettings.d.ts +10 -0
  86. package/dist/document-tools/index.cjs +37 -22
  87. package/dist/document-tools/index.d.ts +2 -0
  88. package/dist/document-tools/index.js +5 -2
  89. package/dist/document-tools/viewer/AnnotatedPdfViewer.d.ts +10 -1
  90. package/dist/document-tools/viewer/SignatureRequestEditor.d.ts +7 -4
  91. package/dist/document-tools/viewer/index.cjs +184 -18
  92. package/dist/document-tools/viewer/index.cjs.map +1 -1
  93. package/dist/document-tools/viewer/index.js +184 -18
  94. package/dist/document-tools/viewer/index.js.map +1 -1
  95. package/dist/docx/NativeDocxEditor.d.ts +5 -0
  96. package/dist/docx/index.cjs +61 -47
  97. package/dist/docx/index.d.ts +1 -0
  98. package/dist/docx/index.js +5 -3
  99. package/dist/docx/signatures/SignatureFields.d.ts +50 -0
  100. package/dist/settings/index.cjs +183 -182
  101. package/dist/settings/index.js +2 -1
  102. package/node_modules/@arbidocs/coedit/dist/commands.cjs +109 -16
  103. package/node_modules/@arbidocs/coedit/dist/commands.cjs.map +1 -1
  104. package/node_modules/@arbidocs/coedit/dist/commands.d.cts +84 -1
  105. package/node_modules/@arbidocs/coedit/dist/commands.d.ts +84 -1
  106. package/node_modules/@arbidocs/coedit/dist/commands.js +99 -17
  107. package/node_modules/@arbidocs/coedit/dist/commands.js.map +1 -1
  108. package/node_modules/@arbidocs/coedit/package.json +1 -1
  109. package/package.json +5 -5
  110. package/src/docx/styles.css +50 -0
  111. package/dist/ConnectedStreamedWordArtifact-EXYZAU4Y.cjs.map +0 -1
  112. package/dist/WorkspaceTableView-5OWX53R5.js.map +0 -1
  113. package/dist/WorkspaceTableView-ZFMAYHUD.cjs.map +0 -1
  114. package/dist/chunk-6MG62I5B.cjs +0 -272
  115. package/dist/chunk-6MG62I5B.cjs.map +0 -1
  116. package/dist/chunk-D3WFIFRY.cjs.map +0 -1
  117. package/dist/chunk-EQB3WELX.js +0 -269
  118. package/dist/chunk-EQB3WELX.js.map +0 -1
  119. package/dist/chunk-HP2C4MD3.js.map +0 -1
  120. package/dist/chunk-IJEISII2.cjs.map +0 -1
  121. package/dist/chunk-JSQEAPTC.cjs.map +0 -1
  122. package/dist/chunk-KQYPP72K.js.map +0 -1
  123. package/dist/chunk-ONTUMV74.js.map +0 -1
  124. package/dist/chunk-OTU5KGQ6.cjs +0 -18
  125. package/dist/chunk-PGOSIJ2I.js.map +0 -1
  126. package/dist/chunk-S74QMZVZ.cjs +0 -18
  127. package/dist/chunk-SN2GZ4ZM.cjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunk6MG62I5B_cjs = require('../../chunk-6MG62I5B.cjs');
4
+ var chunkJPWPR6QU_cjs = require('../../chunk-JPWPR6QU.cjs');
5
5
  var chunkULWRNGGE_cjs = require('../../chunk-ULWRNGGE.cjs');
6
6
  require('../../chunk-DES3K4SD.cjs');
7
7
  var react = require('react');
@@ -32,6 +32,7 @@ function AnnotatedPdfViewer({
32
32
  store: storeOverride,
33
33
  viewer: PdfViewer = viewers.PdfViewer,
34
34
  signed = false,
35
+ placeStamp = null,
35
36
  ...viewerProps
36
37
  }) {
37
38
  const { client, user, notify, saveFile, uploadDocument, openDocument, onDocumentsChanged } = documentTools.useDocumentTools();
@@ -63,6 +64,12 @@ function AnnotatedPdfViewer({
63
64
  () => editing && !controller.readOnly ? controller : viewOnly(controller),
64
65
  [editing, controller]
65
66
  );
67
+ const { setSettings, setTool } = controller;
68
+ react.useEffect(() => {
69
+ if (!placeStamp) return;
70
+ setSettings({ stampImage: { image: placeStamp.image, label: placeStamp.label } });
71
+ setTool("stamp");
72
+ }, [placeStamp?.key]);
66
73
  const { flush } = controller;
67
74
  react.useEffect(() => {
68
75
  if (!editing) void flush();
@@ -493,6 +500,8 @@ function GuidedSigningViewer({
493
500
  }) {
494
501
  const { user, notify } = documentTools.useDocumentTools();
495
502
  const sign = documentTools.useSignSignatureRequest();
503
+ const savedSignature = documentTools.useSavedSignature();
504
+ const storeSignature = documentTools.useStoreSavedSignature();
496
505
  const decline = documentTools.useDeclineSignatureRequest();
497
506
  const mine = react.useMemo(() => documentTools.fieldsInSigningOrder(request.fields, signer), [request.fields, signer]);
498
507
  const [mark, setMark] = react.useState(null);
@@ -572,9 +581,17 @@ function GuidedSigningViewer({
572
581
  const renderContent = react.useCallback(
573
582
  (field) => {
574
583
  if (!applied.has(field.id) || !mark) return null;
575
- const { adopted, signatureUrl } = mark;
576
- if (field.type === "signature" && signatureUrl) {
577
- return /* @__PURE__ */ jsxRuntime.jsx("img", { src: signatureUrl, alt: "Your signature", className: "h-full w-full object-contain" });
584
+ const { adopted, signatureUrl, initialsUrl } = mark;
585
+ const image = field.type === "signature" ? signatureUrl : field.type === "initials" ? initialsUrl : null;
586
+ if (image) {
587
+ return /* @__PURE__ */ jsxRuntime.jsx(
588
+ "img",
589
+ {
590
+ src: image,
591
+ alt: field.type === "signature" ? "Your signature" : "Your initials",
592
+ className: "h-full w-full object-contain"
593
+ }
594
+ );
578
595
  }
579
596
  const text = field.type === "signature" ? adopted.name : field.type === "initials" ? adopted.initials : field.type === "date" ? signingDate() : adopted.name;
580
597
  const typed = documentTools.MARK_FIELD_TYPES.includes(field.type);
@@ -582,7 +599,7 @@ function GuidedSigningViewer({
582
599
  "span",
583
600
  {
584
601
  className: "flex h-full w-full items-center px-1 whitespace-nowrap [container-type:size]",
585
- style: typed ? chunk6MG62I5B_cjs.TYPED_SIGNATURE_STYLE : { color: "#1a1a26" },
602
+ style: typed ? chunkJPWPR6QU_cjs.TYPED_SIGNATURE_STYLE : { color: "#1a1a26" },
586
603
  children: /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: typed ? "70cqh" : "62cqh", lineHeight: 1 }, children: text })
587
604
  }
588
605
  );
@@ -772,12 +789,14 @@ function GuidedSigningViewer({
772
789
  }
773
790
  ) }),
774
791
  /* @__PURE__ */ jsxRuntime.jsx(
775
- chunk6MG62I5B_cjs.AdoptSignatureDialog,
792
+ chunkJPWPR6QU_cjs.AdoptSignatureDialog,
776
793
  {
777
794
  open: !!adoptFor,
778
795
  onOpenChange: (open) => !open && setAdoptFor(null),
779
796
  defaultName: user?.name ?? "",
780
- onAdopt
797
+ onAdopt,
798
+ saved: savedSignature.data ?? null,
799
+ onSave: async (signature) => void await storeSignature.mutateAsync(signature)
781
800
  }
782
801
  ),
783
802
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -875,9 +894,10 @@ function SignatureRequestEditor({
875
894
  viewer: PdfViewer = viewers.PdfViewer,
876
895
  ...viewerProps
877
896
  }) {
878
- const { client, notify } = documentTools.useDocumentTools();
897
+ const { client, notify, user } = documentTools.useDocumentTools();
879
898
  const candidates = documentTools.useSignerCandidates();
880
899
  const save = documentTools.useSaveSignatureRequest();
900
+ const invite = documentTools.useInviteSigners();
881
901
  const [fields, setFields] = react.useState(() => draft?.fields ?? []);
882
902
  const [signers, setSigners] = react.useState(() => [
883
903
  ...new Set((draft?.fields ?? []).map((f) => f.signer))
@@ -890,11 +910,31 @@ function SignatureRequestEditor({
890
910
  const [assign, setAssign] = react.useState({});
891
911
  const [finding, setFinding] = react.useState(false);
892
912
  const [error, setError] = react.useState(null);
913
+ const [newEmail, setNewEmail] = react.useState("");
914
+ const [givenNames, setGivenNames] = react.useState({});
915
+ const [confirmInvite, setConfirmInvite] = react.useState(null);
893
916
  const people = react.useMemo(() => candidates.data ?? [], [candidates.data]);
894
- const nameOf = react.useCallback(
895
- (ext) => people.find((p) => p.externalId === ext)?.name ?? ext,
917
+ const members = react.useMemo(
918
+ () => new Map(people.map((p) => [p.email.toLowerCase(), p.externalId])),
896
919
  [people]
897
920
  );
921
+ const me = people.find((p) => p.email.toLowerCase() === user?.email?.toLowerCase());
922
+ const nameOf = react.useCallback(
923
+ (token) => {
924
+ const person = people.find((p) => p.externalId === token);
925
+ if (person) return person.name;
926
+ const invited = draft?.signers.find((s) => s.external_id === token);
927
+ if (invited) return invited.name || invited.email || token;
928
+ const email = token.toLowerCase();
929
+ const member = people.find((p) => p.email.toLowerCase() === email);
930
+ return member?.name ?? givenNames[email] ?? token;
931
+ },
932
+ [people, draft, givenNames]
933
+ );
934
+ const isInvitee = react.useCallback(
935
+ (token) => documentTools.isEmailSigner(token) && !members.has(token.toLowerCase()) || draft?.signers.find((s) => s.external_id === token)?.progress === "invited",
936
+ [members, draft]
937
+ );
898
938
  const colorOf = react.useCallback(
899
939
  (ext) => {
900
940
  const i = signers.indexOf(ext);
@@ -904,8 +944,10 @@ function SignatureRequestEditor({
904
944
  );
905
945
  const selected = fields.find((f) => f.id === selectedId) ?? null;
906
946
  const blocker = signers.length === 0 ? "Add a signer." : documentTools.sendBlocker(fields);
907
- const addSigner = (ext) => {
908
- if (!ext || signers.includes(ext)) return;
947
+ const addSigner = (token) => {
948
+ if (!token) return;
949
+ const ext = documentTools.isEmailSigner(token) ? members.get(token.trim().toLowerCase()) ?? token.trim().toLowerCase() : token;
950
+ if (signers.includes(ext)) return;
909
951
  setSigners((s) => [...s, ext]);
910
952
  setCurrent(ext);
911
953
  setPlacing((p) => p ?? "signature");
@@ -916,6 +958,41 @@ function SignatureRequestEditor({
916
958
  if (current === ext) setCurrent(signers.find((x) => x !== ext) ?? null);
917
959
  };
918
960
  const updateField = (id, patch) => setFields((fs) => fs.map((f) => f.id === id ? { ...f, ...patch } : f));
961
+ const placedOnce = react.useRef(false);
962
+ react.useEffect(() => {
963
+ if (draft || placedOnce.current || candidates.isLoading) return;
964
+ placedOnce.current = true;
965
+ let live = true;
966
+ void documentTools.suggestSignatureFields(client, documentId, version).then((found) => {
967
+ if (!live) return;
968
+ const { placed, extras } = documentTools.splitSuggestions(found ?? []);
969
+ if (!placed.length) return;
970
+ const named = Object.fromEntries(
971
+ placed.flatMap(
972
+ (s) => s.signer_email && s.signer_name ? [[s.signer_email.toLowerCase(), s.signer_name]] : []
973
+ )
974
+ );
975
+ setGivenNames((n) => ({ ...n, ...named }));
976
+ const added = documentTools.fieldsFromSuggestions(placed, {}, members);
977
+ setFields((fs) => [...fs, ...added]);
978
+ const assigned = [...new Set(added.map((f) => f.signer))];
979
+ setSigners((s) => [...s, ...assigned.filter((t) => !s.includes(t))]);
980
+ setCurrent((c) => c ?? assigned[0] ?? null);
981
+ const open = placed.filter((s) => !s.signer_email);
982
+ if (open.length || extras.length) {
983
+ setSuggestions([...open, ...extras]);
984
+ setAssign({});
985
+ }
986
+ notify(
987
+ `${added.length} field${added.length === 1 ? "" : "s"} placed from the document.`,
988
+ "success"
989
+ );
990
+ }).catch(() => {
991
+ });
992
+ return () => {
993
+ live = false;
994
+ };
995
+ }, [draft, candidates.isLoading, client, documentId, version, members, notify]);
919
996
  const findBlocks = async () => {
920
997
  setFinding(true);
921
998
  setError(null);
@@ -933,7 +1010,7 @@ function SignatureRequestEditor({
933
1010
  };
934
1011
  const applySuggestions = () => {
935
1012
  if (!suggestions) return;
936
- const added = documentTools.fieldsFromSuggestions(suggestions, assign);
1013
+ const added = documentTools.fieldsFromSuggestions(suggestions, assign, members);
937
1014
  setFields((fs) => [...fs, ...added]);
938
1015
  const assigned = [...new Set(added.map((f) => f.signer))];
939
1016
  setSigners((s) => [...s, ...assigned.filter((ext) => !s.includes(ext))]);
@@ -941,9 +1018,17 @@ function SignatureRequestEditor({
941
1018
  setSuggestions(null);
942
1019
  notify(`${added.length} field${added.length === 1 ? "" : "s"} added.`, "success");
943
1020
  };
944
- const submit = async (send) => {
1021
+ const submit = async (send, invited = false) => {
945
1022
  setError(null);
1023
+ const invitees = signers.filter((t) => documentTools.isEmailSigner(t) && !members.has(t.toLowerCase()));
1024
+ if (send && invitees.length && !invited) {
1025
+ setConfirmInvite(invitees);
1026
+ return;
1027
+ }
946
1028
  try {
1029
+ if (send && invitees.length && me?.role === "owner") {
1030
+ await invite.mutateAsync({ documentId, emails: invitees });
1031
+ }
947
1032
  const request = await save.mutateAsync({
948
1033
  documentId,
949
1034
  version,
@@ -952,10 +1037,12 @@ function SignatureRequestEditor({
952
1037
  requestId: draft?.status === "draft" ? draft.external_id : void 0,
953
1038
  send
954
1039
  });
1040
+ const waiting = request.signers.filter((s) => s.progress === "invited").length;
955
1041
  notify(
956
- send ? `Sent for signature to ${request.signers.length} signer${request.signers.length === 1 ? "" : "s"}.` : "Draft saved.",
1042
+ send ? `Sent for signature to ${request.signers.length} signer${request.signers.length === 1 ? "" : "s"}.` + (waiting ? ` ${waiting} ${waiting === 1 ? "is" : "are"} asked once they join the workspace.` : "") : "Draft saved.",
957
1043
  "success"
958
1044
  );
1045
+ setConfirmInvite(null);
959
1046
  onSaved(request);
960
1047
  } catch (err) {
961
1048
  setError(err instanceof Error ? err.message : "The request could not be saved");
@@ -1019,7 +1106,8 @@ function SignatureRequestEditor({
1019
1106
  "data-testid": `signer-chip-${ext}`,
1020
1107
  children: [
1021
1108
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-2.5 rounded-full", style: { background: colorOf(ext) } }),
1022
- nameOf(ext)
1109
+ nameOf(ext),
1110
+ isInvitee(ext) && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", "data-testid": "signer-invited", children: "(to invite)" })
1023
1111
  ]
1024
1112
  }
1025
1113
  ),
@@ -1059,7 +1147,45 @@ function SignatureRequestEditor({
1059
1147
  ]
1060
1148
  }
1061
1149
  )
1062
- ] })
1150
+ ] }),
1151
+ /* @__PURE__ */ jsxRuntime.jsxs(
1152
+ "form",
1153
+ {
1154
+ className: "inline-flex items-center gap-1",
1155
+ onSubmit: (e) => {
1156
+ e.preventDefault();
1157
+ if (!documentTools.isEmailSigner(newEmail)) return;
1158
+ addSigner(newEmail);
1159
+ setNewEmail("");
1160
+ },
1161
+ children: [
1162
+ /* @__PURE__ */ jsxRuntime.jsx(
1163
+ ui.Input,
1164
+ {
1165
+ type: "email",
1166
+ value: newEmail,
1167
+ onChange: (e) => setNewEmail(e.target.value),
1168
+ placeholder: "Or anyone, by email",
1169
+ "aria-label": "Signer's email",
1170
+ className: "h-8 w-52",
1171
+ "data-testid": "signature-add-email"
1172
+ }
1173
+ ),
1174
+ /* @__PURE__ */ jsxRuntime.jsx(
1175
+ ui.Button,
1176
+ {
1177
+ type: "submit",
1178
+ size: "sm",
1179
+ variant: "ghost",
1180
+ disabled: !documentTools.isEmailSigner(newEmail),
1181
+ "aria-label": "Add this signer",
1182
+ "data-testid": "signature-add-email-submit",
1183
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MailPlus, { className: "size-4", "aria-hidden": true })
1184
+ }
1185
+ )
1186
+ ]
1187
+ }
1188
+ )
1063
1189
  ] }),
1064
1190
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
1065
1191
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: current ? `Place for ${nameOf(current)}:` : "Add a signer, then place their fields." }),
@@ -1216,7 +1342,8 @@ function SignatureRequestEditor({
1216
1342
  "data-testid": `signature-suggestion-signer-${g}`,
1217
1343
  children: [
1218
1344
  /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: "Skip" }),
1219
- people.map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p.externalId, children: p.name }, p.externalId))
1345
+ people.map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p.externalId, children: p.name }, p.externalId)),
1346
+ signers.filter((t) => !people.some((p) => p.externalId === t)).map((t) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: t, children: nameOf(t) }, t))
1220
1347
  ]
1221
1348
  }
1222
1349
  )
@@ -1237,6 +1364,45 @@ function SignatureRequestEditor({
1237
1364
  /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { type: "button", size: "sm", variant: "ghost", onClick: () => setSuggestions(null), children: "Dismiss" })
1238
1365
  ] })
1239
1366
  ] }),
1367
+ confirmInvite && /* @__PURE__ */ jsxRuntime.jsxs(
1368
+ "div",
1369
+ {
1370
+ className: "space-y-1.5 rounded-md border border-amber-300 bg-amber-50 p-2 text-amber-950 dark:border-amber-800 dark:bg-amber-950/40 dark:text-amber-100",
1371
+ "data-testid": "signature-invite-confirm",
1372
+ children: [
1373
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
1374
+ "Not in this workspace yet: ",
1375
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: confirmInvite.map(nameOf).join(", ") }),
1376
+ ".",
1377
+ " ",
1378
+ me?.role === "owner" ? "They are invited as guests and asked to sign when they join." : "Ask a workspace owner to invite them: they are asked to sign when they join."
1379
+ ] }),
1380
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2", children: [
1381
+ /* @__PURE__ */ jsxRuntime.jsx(
1382
+ ui.Button,
1383
+ {
1384
+ type: "button",
1385
+ size: "sm",
1386
+ onClick: () => submit(true, true),
1387
+ disabled: save.isPending || invite.isPending,
1388
+ "data-testid": "signature-invite-send",
1389
+ children: me?.role === "owner" ? "Invite and send" : "Send"
1390
+ }
1391
+ ),
1392
+ /* @__PURE__ */ jsxRuntime.jsx(
1393
+ ui.Button,
1394
+ {
1395
+ type: "button",
1396
+ size: "sm",
1397
+ variant: "ghost",
1398
+ onClick: () => setConfirmInvite(null),
1399
+ children: "Cancel"
1400
+ }
1401
+ )
1402
+ ] })
1403
+ ]
1404
+ }
1405
+ ),
1240
1406
  error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-red-text", role: "alert", "data-testid": "signature-editor-error", children: error })
1241
1407
  ] }),
1242
1408
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(PdfViewer, { ...viewerProps, file, renderPageOverlay }) })