sanity 6.14.0 → 6.14.1

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 (163) hide show
  1. package/lib/{AddonDatasetProvider-0aiLWkZg.js → AddonDatasetProvider-C9tdum2G.js} +2 -2
  2. package/lib/{AddonDatasetProvider-0aiLWkZg.js.map → AddonDatasetProvider-C9tdum2G.js.map} +1 -1
  3. package/lib/{CalendarFilter-DVz369RP.js → CalendarFilter-C80uOkw-.js} +3 -3
  4. package/lib/{CalendarFilter-DVz369RP.js.map → CalendarFilter-C80uOkw-.js.map} +1 -1
  5. package/lib/{CommandList-CTDV_QZY.js → CommandList-duj-LVnd.js} +2 -2
  6. package/lib/{CommandList-CTDV_QZY.js.map → CommandList-duj-LVnd.js.map} +1 -1
  7. package/lib/{CommentInput-B5T1Iwnt.js → CommentInput-BXYQnGhq.js} +5 -5
  8. package/lib/{CommentInput-B5T1Iwnt.js.map → CommentInput-BXYQnGhq.js.map} +1 -1
  9. package/lib/{CommentsDocumentLayout-ByFwej_y.js → CommentsDocumentLayout-DAwAhx7q.js} +2 -2
  10. package/lib/{CommentsDocumentLayout-ByFwej_y.js.map → CommentsDocumentLayout-DAwAhx7q.js.map} +1 -1
  11. package/lib/{CommentsDocumentLayout-Czb6fC0_.js → CommentsDocumentLayout-pfM29WSy.js} +2 -2
  12. package/lib/{CommentsDocumentLayout-Czb6fC0_.js.map → CommentsDocumentLayout-pfM29WSy.js.map} +1 -1
  13. package/lib/{CommentsEnabledProvider-D2gutvsb.js → CommentsEnabledProvider-DN_oXwXM.js} +3 -3
  14. package/lib/{CommentsEnabledProvider-D2gutvsb.js.map → CommentsEnabledProvider-DN_oXwXM.js.map} +1 -1
  15. package/lib/{CommentsField-D2Fum0Jx.js → CommentsField-B7wTBRMB.js} +5 -5
  16. package/lib/{CommentsField-D2Fum0Jx.js.map → CommentsField-B7wTBRMB.js.map} +1 -1
  17. package/lib/{CommentsField-YM3cp3fA.js → CommentsField-BxoVuJOl.js} +4 -4
  18. package/lib/{CommentsField-YM3cp3fA.js.map → CommentsField-BxoVuJOl.js.map} +1 -1
  19. package/lib/{CommentsInput-Bx2t5AW_.js → CommentsInput-C3rEb5L8.js} +6 -6
  20. package/lib/{CommentsInput-Bx2t5AW_.js.map → CommentsInput-C3rEb5L8.js.map} +1 -1
  21. package/lib/{CommentsInput-BBBng3CJ.js → CommentsInput-CU-PFXmu.js} +7 -7
  22. package/lib/{CommentsInput-BBBng3CJ.js.map → CommentsInput-CU-PFXmu.js.map} +1 -1
  23. package/lib/{CommentsInspector-BnSG5Mq0.js → CommentsInspector-BJ1qwj6P.js} +6 -6
  24. package/lib/{CommentsInspector-BnSG5Mq0.js.map → CommentsInspector-BJ1qwj6P.js.map} +1 -1
  25. package/lib/{CommentsInspector-B5V_Bpz5.js → CommentsInspector-BQiMPjvm.js} +6 -6
  26. package/lib/{CommentsInspector-B5V_Bpz5.js.map → CommentsInspector-BQiMPjvm.js.map} +1 -1
  27. package/lib/{CommentsListItem-DnqAlN4p.js → CommentsListItem-QyYan1DB.js} +5 -5
  28. package/lib/{CommentsListItem-DnqAlN4p.js.map → CommentsListItem-QyYan1DB.js.map} +1 -1
  29. package/lib/{CommentsListItem-DVE4IMls.js → CommentsListItem-dvKmANi3.js} +4 -4
  30. package/lib/{CommentsListItem-DVE4IMls.js.map → CommentsListItem-dvKmANi3.js.map} +1 -1
  31. package/lib/{CommentsSelectedPathProvider-DRJ3Xqs4.js → CommentsSelectedPathProvider-COcPb3W3.js} +3 -3
  32. package/lib/{CommentsSelectedPathProvider-DRJ3Xqs4.js.map → CommentsSelectedPathProvider-COcPb3W3.js.map} +1 -1
  33. package/lib/{CommentsStudioLayout-Di510XhD.js → CommentsStudioLayout-BkX6o14w.js} +3 -3
  34. package/lib/{CommentsStudioLayout-Di510XhD.js.map → CommentsStudioLayout-BkX6o14w.js.map} +1 -1
  35. package/lib/{CommentsStudioLayout-Z09s50bM.js → CommentsStudioLayout-dIXEz52s.js} +3 -3
  36. package/lib/{CommentsStudioLayout-Z09s50bM.js.map → CommentsStudioLayout-dIXEz52s.js.map} +1 -1
  37. package/lib/{GlobalPerspectiveMenu-Cwur4_iD.js → GlobalPerspectiveMenu-0Hs276Z-.js} +15 -15
  38. package/lib/{GlobalPerspectiveMenu-Cwur4_iD.js.map → GlobalPerspectiveMenu-0Hs276Z-.js.map} +1 -1
  39. package/lib/{LoadingBlock-Ch_dBXfn.js → LoadingBlock-CElIdb7F.js} +3 -3
  40. package/lib/{LoadingBlock-Ch_dBXfn.js.map → LoadingBlock-CElIdb7F.js.map} +1 -1
  41. package/lib/{PerspectiveProvider-Yk7lgugx.js → PerspectiveProvider-D-6sweQH.js} +130 -97
  42. package/lib/PerspectiveProvider-D-6sweQH.js.map +1 -0
  43. package/lib/{ReleaseAvatar-C68bGuVQ.js → ReleaseAvatar-Bqp_Ci7r.js} +4 -4
  44. package/lib/{ReleaseAvatar-C68bGuVQ.js.map → ReleaseAvatar-Bqp_Ci7r.js.map} +1 -1
  45. package/lib/{ReleasesMetadataProvider-DabLuMD8.js → ReleasesMetadataProvider-BD6XRcpT.js} +2 -2
  46. package/lib/{ReleasesMetadataProvider-DabLuMD8.js.map → ReleasesMetadataProvider-BD6XRcpT.js.map} +1 -1
  47. package/lib/{ReleasesStudioLayout-DsygG30q.js → ReleasesStudioLayout-C6mmxoaY.js} +7 -7
  48. package/lib/{ReleasesStudioLayout-DsygG30q.js.map → ReleasesStudioLayout-C6mmxoaY.js.map} +1 -1
  49. package/lib/{ReleasesTool-CNXNODI_.js → ReleasesTool-DIDmkzic.js} +23 -23
  50. package/lib/{ReleasesTool-CNXNODI_.js.map → ReleasesTool-DIDmkzic.js.map} +1 -1
  51. package/lib/{SchedulePublishingStudioLayout-EsgEGZ7F.js → SchedulePublishingStudioLayout-DrZO-qbI.js} +3 -3
  52. package/lib/{SchedulePublishingStudioLayout-EsgEGZ7F.js.map → SchedulePublishingStudioLayout-DrZO-qbI.js.map} +1 -1
  53. package/lib/{SchedulePublishingUpsellProvider-CWxgqzFp.js → SchedulePublishingUpsellProvider-DeZ_jZIX.js} +2 -2
  54. package/lib/{SchedulePublishingUpsellProvider-CWxgqzFp.js.map → SchedulePublishingUpsellProvider-DeZ_jZIX.js.map} +1 -1
  55. package/lib/{ScheduledPublishingEnabledProvider-CQ-T1Y96.js → ScheduledPublishingEnabledProvider-B8C0_tc5.js} +3 -3
  56. package/lib/{ScheduledPublishingEnabledProvider-CQ-T1Y96.js.map → ScheduledPublishingEnabledProvider-B8C0_tc5.js.map} +1 -1
  57. package/lib/{SearchProvider-CEXmRg1N.js → SearchProvider-T8fsDJV5.js} +8 -8
  58. package/lib/{SearchProvider-CEXmRg1N.js.map → SearchProvider-T8fsDJV5.js.map} +1 -1
  59. package/lib/{SingleDocReleaseLayout-ByDXFS8N.js → SingleDocReleaseLayout-BpMXU9KY.js} +2 -2
  60. package/lib/{SingleDocReleaseLayout-ByDXFS8N.js.map → SingleDocReleaseLayout-BpMXU9KY.js.map} +1 -1
  61. package/lib/{SingleDocReleaseUpsellProvider-ByuDpBIG.js → SingleDocReleaseUpsellProvider-7_OXHySY.js} +3 -3
  62. package/lib/{SingleDocReleaseUpsellProvider-ByuDpBIG.js.map → SingleDocReleaseUpsellProvider-7_OXHySY.js.map} +1 -1
  63. package/lib/{TasksFooterOpenTasks-BSO8TgVF.js → TasksFooterOpenTasks-IFtOEGnB.js} +2 -2
  64. package/lib/{TasksFooterOpenTasks-BSO8TgVF.js.map → TasksFooterOpenTasks-IFtOEGnB.js.map} +1 -1
  65. package/lib/{TasksStudioActiveToolLayout-BXktrH08.js → TasksStudioActiveToolLayout-C99LQz4S.js} +20 -20
  66. package/lib/{TasksStudioActiveToolLayout-BXktrH08.js.map → TasksStudioActiveToolLayout-C99LQz4S.js.map} +1 -1
  67. package/lib/{TasksStudioLayout-BfN-M93c.js → TasksStudioLayout-CmFbUpnB.js} +4 -4
  68. package/lib/{TasksStudioLayout-BfN-M93c.js.map → TasksStudioLayout-CmFbUpnB.js.map} +1 -1
  69. package/lib/{TasksStudioNavbar-CfqloSfP.js → TasksStudioNavbar-DB7DJC4e.js} +2 -2
  70. package/lib/{TasksStudioNavbar-CfqloSfP.js.map → TasksStudioNavbar-DB7DJC4e.js.map} +1 -1
  71. package/lib/{TimeZoneButton-FCwCyJ1J.js → TimeZoneButton-B_ki5v8q.js} +7 -7
  72. package/lib/{TimeZoneButton-FCwCyJ1J.js.map → TimeZoneButton-B_ki5v8q.js.map} +1 -1
  73. package/lib/{Tool-PzN5dskE.js → Tool-DlkZrcrD.js} +15 -15
  74. package/lib/{Tool-PzN5dskE.js.map → Tool-DlkZrcrD.js.map} +1 -1
  75. package/lib/{UpsellPanel-T-5ZD_7k.js → UpsellPanel-ITWwjktp.js} +2 -2
  76. package/lib/{UpsellPanel-T-5ZD_7k.js.map → UpsellPanel-ITWwjktp.js.map} +1 -1
  77. package/lib/{VariantsStudioNavbar-D0XbvL1D.js → VariantsStudioNavbar-DwEV1roH.js} +9 -9
  78. package/lib/{VariantsStudioNavbar-D0XbvL1D.js.map → VariantsStudioNavbar-DwEV1roH.js.map} +1 -1
  79. package/lib/{VariantsTool-B3EEDrQT.js → VariantsTool-Dzhy3PST.js} +12 -12
  80. package/lib/{VariantsTool-B3EEDrQT.js.map → VariantsTool-Dzhy3PST.js.map} +1 -1
  81. package/lib/{WorkspaceLoader-BH_VDaY4.js → WorkspaceLoader-Ck4TMoR5.js} +31 -31
  82. package/lib/{WorkspaceLoader-BH_VDaY4.js.map → WorkspaceLoader-Ck4TMoR5.js.map} +1 -1
  83. package/lib/_createContext.js +1 -1
  84. package/lib/_unstable-embedded.js +5 -5
  85. package/lib/{buildRangeDecorationSelectionsFromComments-B1-tJPvG.js → buildRangeDecorationSelectionsFromComments-BnlhrvDK.js} +3 -3
  86. package/lib/{buildRangeDecorationSelectionsFromComments-B1-tJPvG.js.map → buildRangeDecorationSelectionsFromComments-BnlhrvDK.js.map} +1 -1
  87. package/lib/{buildTextSelectionFromFragment-BiLg851R.js → buildTextSelectionFromFragment-BXrYd9lr.js} +3 -3
  88. package/lib/{buildTextSelectionFromFragment-BiLg851R.js.map → buildTextSelectionFromFragment-BXrYd9lr.js.map} +1 -1
  89. package/lib/{constants-DdgHySkY.js → constants-BQItnHll.js} +2 -2
  90. package/lib/{constants-DdgHySkY.js.map → constants-BQItnHll.js.map} +1 -1
  91. package/lib/{datastores-D1tF4HQA.js → datastores-DNOJm1LF.js} +2 -2
  92. package/lib/{datastores-D1tF4HQA.js.map → datastores-DNOJm1LF.js.map} +1 -1
  93. package/lib/{i18n-Cl_y4bbR.js → i18n-JUYUb7y_.js} +2 -2
  94. package/lib/{i18n-Cl_y4bbR.js.map → i18n-JUYUb7y_.js.map} +1 -1
  95. package/lib/index.js +38 -38
  96. package/lib/{inputResolver-CUWPjdGU.js → inputResolver-Ce1lTBE-.js} +4 -4
  97. package/lib/{inputResolver-CUWPjdGU.js.map → inputResolver-Ce1lTBE-.js.map} +1 -1
  98. package/lib/{navigation.telemetry-rXclq03x.js → navigation.telemetry-BPxX2IEN.js} +10 -10
  99. package/lib/{navigation.telemetry-rXclq03x.js.map → navigation.telemetry-BPxX2IEN.js.map} +1 -1
  100. package/lib/{plugin-CSp8hwQE.js → plugin-Bvxhb5ko.js} +8 -8
  101. package/lib/{plugin-CSp8hwQE.js.map → plugin-Bvxhb5ko.js.map} +1 -1
  102. package/lib/{plugin-Daxe5hwG.js → plugin-Cv6TLYbE.js} +6 -6
  103. package/lib/{plugin-Daxe5hwG.js.map → plugin-Cv6TLYbE.js.map} +1 -1
  104. package/lib/{plugin-BFTpdKKH.js → plugin-D6-7jrXf.js} +3 -3
  105. package/lib/{plugin-BFTpdKKH.js.map → plugin-D6-7jrXf.js.map} +1 -1
  106. package/lib/{plugin-dtgDcBsL.js → plugin-D_GVPwTR.js} +6 -6
  107. package/lib/{plugin-dtgDcBsL.js.map → plugin-D_GVPwTR.js.map} +1 -1
  108. package/lib/{releases.telemetry-B6tRA9U2.js → releases.telemetry-BAO7xaO7.js} +6 -6
  109. package/lib/{releases.telemetry-B6tRA9U2.js.map → releases.telemetry-BAO7xaO7.js.map} +1 -1
  110. package/lib/{resources-BjljYbUa.js → resources-Bw1bpPhG.js} +2 -2
  111. package/lib/{resources-BjljYbUa.js.map → resources-Bw1bpPhG.js.map} +1 -1
  112. package/lib/{resources-DYxnNjS8.js → resources-CC1qBsSO.js} +2 -2
  113. package/lib/{resources-DYxnNjS8.js.map → resources-CC1qBsSO.js.map} +1 -1
  114. package/lib/{resources-D7Mp6N-8.js → resources-CH42UqhC.js} +2 -2
  115. package/lib/{resources-D7Mp6N-8.js.map → resources-CH42UqhC.js.map} +1 -1
  116. package/lib/{resources-GpX0LblP.js → resources-Cq1lXH8T.js} +2 -2
  117. package/lib/{resources-GpX0LblP.js.map → resources-Cq1lXH8T.js.map} +1 -1
  118. package/lib/{resources-B7mfG9Km.js → resources-D7XsFe7y.js} +2 -2
  119. package/lib/{resources-B7mfG9Km.js.map → resources-D7XsFe7y.js.map} +1 -1
  120. package/lib/{resources-CmmAynkL.js → resources-DYn0yzEW.js} +2 -2
  121. package/lib/{resources-CmmAynkL.js.map → resources-DYn0yzEW.js.map} +1 -1
  122. package/lib/{resources-C79qQva3.js → resources-TsgtFPi7.js} +2 -2
  123. package/lib/{resources-C79qQva3.js.map → resources-TsgtFPi7.js.map} +1 -1
  124. package/lib/{scheduleItem-Bdvl81Kb.js → scheduleItem-5fXCZgfo.js} +13 -13
  125. package/lib/{scheduleItem-Bdvl81Kb.js.map → scheduleItem-5fXCZgfo.js.map} +1 -1
  126. package/lib/{schedules-D7bPbTPm.js → schedules-BsE0_g47.js} +3 -3
  127. package/lib/{schedules-D7bPbTPm.js.map → schedules-BsE0_g47.js.map} +1 -1
  128. package/lib/{searchDocumentRelease-v1o9dMnE.js → searchDocumentRelease-Bang3A8l.js} +5 -5
  129. package/lib/{searchDocumentRelease-v1o9dMnE.js.map → searchDocumentRelease-Bang3A8l.js.map} +1 -1
  130. package/lib/{studioClient-EJDu6kOb.js → studioClient-C7B6Aobi.js} +2 -2
  131. package/lib/{studioClient-EJDu6kOb.js.map → studioClient-C7B6Aobi.js.map} +1 -1
  132. package/lib/{useActiveReleases-Bh_Q6f7G.js → useActiveReleases-DxYjyTB1.js} +5 -5
  133. package/lib/{useActiveReleases-Bh_Q6f7G.js.map → useActiveReleases-DxYjyTB1.js.map} +1 -1
  134. package/lib/{useBundleDocuments-zP6JiTzz.js → useBundleDocuments-2YaaN-2l.js} +3 -3
  135. package/lib/{useBundleDocuments-zP6JiTzz.js.map → useBundleDocuments-2YaaN-2l.js.map} +1 -1
  136. package/lib/{useComments-BGOJwUe0.js → useComments-DWh1k0kS.js} +5 -5
  137. package/lib/{useComments-BGOJwUe0.js.map → useComments-DWh1k0kS.js.map} +1 -1
  138. package/lib/{useCommentsTelemetry-BMkf6MTO.js → useCommentsTelemetry-BbJ8lTKN.js} +4 -4
  139. package/lib/{useCommentsTelemetry-BMkf6MTO.js.map → useCommentsTelemetry-BbJ8lTKN.js.map} +1 -1
  140. package/lib/{useDocumentPreviewValues-CryTvfKc.js → useDocumentPreviewValues-CK5VteK3.js} +4 -4
  141. package/lib/{useDocumentPreviewValues-CryTvfKc.js.map → useDocumentPreviewValues-CK5VteK3.js.map} +1 -1
  142. package/lib/{useFieldActions-BTj7VsW5.js → useFieldActions-BmY1Kh3s.js} +2 -2
  143. package/lib/{useFieldActions-BTj7VsW5.js.map → useFieldActions-BmY1Kh3s.js.map} +1 -1
  144. package/lib/{useProjectId-BN6GCdwS.js → useProjectId-C8pZxybz.js} +2 -2
  145. package/lib/{useProjectId-BN6GCdwS.js.map → useProjectId-C8pZxybz.js.map} +1 -1
  146. package/lib/{useReleasesToolAvailable-CQ9-I8Tt.js → useReleasesToolAvailable-DjaSujLo.js} +3 -3
  147. package/lib/{useReleasesToolAvailable-CQ9-I8Tt.js.map → useReleasesToolAvailable-DjaSujLo.js.map} +1 -1
  148. package/lib/{useScheduledDraftMenuActions-OSkdxONo.js → useScheduledDraftMenuActions-DSJU6xQa.js} +9 -9
  149. package/lib/{useScheduledDraftMenuActions-OSkdxONo.js.map → useScheduledDraftMenuActions-DSJU6xQa.js.map} +1 -1
  150. package/lib/{useStudioUrl-DUBI_S4K.js → useStudioUrl-DcTGV00c.js} +5 -5
  151. package/lib/{useStudioUrl-DUBI_S4K.js.map → useStudioUrl-DcTGV00c.js.map} +1 -1
  152. package/lib/{useTasksNavigation-fohCXW6l.js → useTasksNavigation-tAXFJd2V.js} +2 -2
  153. package/lib/{useTasksNavigation-fohCXW6l.js.map → useTasksNavigation-tAXFJd2V.js.map} +1 -1
  154. package/lib/{useTimeZone-DM8ZmUO2.js → useTimeZone-Dj7C8tfZ.js} +2 -2
  155. package/lib/{useTimeZone-DM8ZmUO2.js.map → useTimeZone-Dj7C8tfZ.js.map} +1 -1
  156. package/lib/{utils-D-4rueJZ.js → utils-CT034e4q.js} +3 -3
  157. package/lib/{utils-D-4rueJZ.js.map → utils-CT034e4q.js.map} +1 -1
  158. package/lib/{validationUtils-jTd1rxfY.js → validationUtils-BZPoHEYN.js} +4 -4
  159. package/lib/{validationUtils-jTd1rxfY.js.map → validationUtils-BZPoHEYN.js.map} +1 -1
  160. package/lib/{version-D0Vx4cX1.js → version-BDSMcNU7.js} +2 -2
  161. package/lib/{version-D0Vx4cX1.js.map → version-BDSMcNU7.js.map} +1 -1
  162. package/package.json +17 -17
  163. package/lib/PerspectiveProvider-Yk7lgugx.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { n as CommentsEnabledProvider, r as CommentsAuthoringPathProvider, t as CommentsSelectedPathProvider } from "./CommentsSelectedPathProvider-DRJ3Xqs4.js";
1
+ import { n as CommentsEnabledProvider, r as CommentsAuthoringPathProvider, t as CommentsSelectedPathProvider } from "./CommentsSelectedPathProvider-COcPb3W3.js";
2
2
  import { t as useCommentsEnabled } from "./useCommentsEnabled-BPc3788v.js";
3
3
  import { c } from "react/compiler-runtime";
4
4
  import { jsx } from "react/jsx-runtime";
@@ -30,4 +30,4 @@ function CommentsDocumentLayoutInner(props) {
30
30
  }
31
31
  export { CommentsDocumentLayout };
32
32
 
33
- //# sourceMappingURL=CommentsDocumentLayout-ByFwej_y.js.map
33
+ //# sourceMappingURL=CommentsDocumentLayout-DAwAhx7q.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommentsDocumentLayout-ByFwej_y.js","names":["<CommentsDocumentLayoutInner {...props} />","<CommentsEnabledProvider documentId={documentId} documentType={documentType}>\n <CommentsDocumentLayoutInner {...props} />\n </CommentsEnabledProvider>","props.renderDefault(props)","props.renderDefault","<CommentsSelectedPathProvider>\n <CommentsAuthoringPathProvider>{props.renderDefault(props)}</CommentsAuthoringPathProvider>\n </CommentsSelectedPathProvider>"],"sources":["../src/core/comments/plugin/document-layout/CommentsDocumentLayout.tsx"],"sourcesContent":["import {type DocumentLayoutProps} from '../../../config/types'\nimport {CommentsAuthoringPathProvider} from '../../context/authoring-path/CommentsAuthoringPathProvider'\nimport {CommentsEnabledProvider} from '../../context/enabled/CommentsEnabledProvider'\nimport {CommentsSelectedPathProvider} from '../../context/selected-path/CommentsSelectedPathProvider'\nimport {useCommentsEnabled} from '../../hooks/useCommentsEnabled'\n\nexport function CommentsDocumentLayout(props: DocumentLayoutProps) {\n const {documentId, documentType} = props\n const parentContext = useCommentsEnabled()\n\n // If there is a parent context and the mode is not null, a parent provider is\n // already checking if comments are enabled. In such cases, additional wrapping\n // of the document layout in the `CommentsEnabledProvider` is unnecessary.\n // The `DocumentPane` component within the `structureTool` handles this wrapping.\n // However, as this plugin may be used in contexts outside of the `structureTool`,\n // we must check for a parent context that checks if comments are enabled and\n // conditionally apply the `CommentsEnabledProvider` wrapping if it is not present.\n if (parentContext.mode !== null) {\n return <CommentsDocumentLayoutInner {...props} />\n }\n\n return (\n <CommentsEnabledProvider documentId={documentId} documentType={documentType}>\n <CommentsDocumentLayoutInner {...props} />\n </CommentsEnabledProvider>\n )\n}\n\nfunction CommentsDocumentLayoutInner(props: DocumentLayoutProps) {\n const commentsEnabled = useCommentsEnabled()\n\n // If comments are not enabled, render the default document layout\n if (!commentsEnabled.enabled) {\n return props.renderDefault(props)\n }\n\n return (\n <CommentsSelectedPathProvider>\n <CommentsAuthoringPathProvider>{props.renderDefault(props)}</CommentsAuthoringPathProvider>\n </CommentsSelectedPathProvider>\n )\n}\n"],"mappings":";;;;AAMA,SAAgB,uBAAuB,OAA4B;eAC3D,EAAC,YAAY,iBAAgB;CAUnC,IATsB,mBASlB,CAAA,CAAc,SAAS,MAAM;EACxBA,IAAAA;EAAP,OAAwC,EAAA,OAAA,qBAAjC,KAAA,oBAAC,6BAAD,EAA6B,GAAI,MAAQ,CAAA,GAAR,EAAA,KAAA,mBAAjCA;CACT;CAIIA,IAAAA;CAAiC,AAAA,EAAA,OAAA,qBAAjC,KAAA,oBAAC,6BAAD,EAA6B,GAAI,MAAQ,CAAA,GAAR,EAAA,KAAA;CADnCC,IAAAA;CADF,OACuC,EAAA,OAAA,cAAA,EAAA,OAA0B,gBAAA,EAAA,OAC7DD,MADF,KAAA,oBAAC,yBAAD;EAAqC;EAA0B;EAC7DA,UAAAA;CACuB,CAAA,GAFY,EAAA,KAAA,YAA0B,EAAA,KAAA,cAC7DA,EAAAA,KAAAA,4BADFC;AAIJ;AAEA,SAAS,4BAA4B,OAA4B;;CAI/D,IAAI,CAHoB,mBAGnB,CAAA,CAAgB,SAAS;EACrBC,IAAAA;EAAP,qCAAa,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA,mBAAAD;CACT;CAIoCA,IAAAA;+BAAM,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA;CADlCC,IAAAA;CADF,OAEoCF,EAAAA,OAAAA,kBADlC,KAAA,oBAAC,8BAAD,EAAA,UACE,oBAAC,+BAAD,EAAA,UAAgCA,GAA0D,CAAA,EAC9D,CAAA,GADIA,EAAAA,KAAAA,gBADlCE;AAIJ"}
1
+ {"version":3,"file":"CommentsDocumentLayout-DAwAhx7q.js","names":["<CommentsDocumentLayoutInner {...props} />","<CommentsEnabledProvider documentId={documentId} documentType={documentType}>\n <CommentsDocumentLayoutInner {...props} />\n </CommentsEnabledProvider>","props.renderDefault(props)","props.renderDefault","<CommentsSelectedPathProvider>\n <CommentsAuthoringPathProvider>{props.renderDefault(props)}</CommentsAuthoringPathProvider>\n </CommentsSelectedPathProvider>"],"sources":["../src/core/comments/plugin/document-layout/CommentsDocumentLayout.tsx"],"sourcesContent":["import {type DocumentLayoutProps} from '../../../config/types'\nimport {CommentsAuthoringPathProvider} from '../../context/authoring-path/CommentsAuthoringPathProvider'\nimport {CommentsEnabledProvider} from '../../context/enabled/CommentsEnabledProvider'\nimport {CommentsSelectedPathProvider} from '../../context/selected-path/CommentsSelectedPathProvider'\nimport {useCommentsEnabled} from '../../hooks/useCommentsEnabled'\n\nexport function CommentsDocumentLayout(props: DocumentLayoutProps) {\n const {documentId, documentType} = props\n const parentContext = useCommentsEnabled()\n\n // If there is a parent context and the mode is not null, a parent provider is\n // already checking if comments are enabled. In such cases, additional wrapping\n // of the document layout in the `CommentsEnabledProvider` is unnecessary.\n // The `DocumentPane` component within the `structureTool` handles this wrapping.\n // However, as this plugin may be used in contexts outside of the `structureTool`,\n // we must check for a parent context that checks if comments are enabled and\n // conditionally apply the `CommentsEnabledProvider` wrapping if it is not present.\n if (parentContext.mode !== null) {\n return <CommentsDocumentLayoutInner {...props} />\n }\n\n return (\n <CommentsEnabledProvider documentId={documentId} documentType={documentType}>\n <CommentsDocumentLayoutInner {...props} />\n </CommentsEnabledProvider>\n )\n}\n\nfunction CommentsDocumentLayoutInner(props: DocumentLayoutProps) {\n const commentsEnabled = useCommentsEnabled()\n\n // If comments are not enabled, render the default document layout\n if (!commentsEnabled.enabled) {\n return props.renderDefault(props)\n }\n\n return (\n <CommentsSelectedPathProvider>\n <CommentsAuthoringPathProvider>{props.renderDefault(props)}</CommentsAuthoringPathProvider>\n </CommentsSelectedPathProvider>\n )\n}\n"],"mappings":";;;;AAMA,SAAgB,uBAAuB,OAA4B;eAC3D,EAAC,YAAY,iBAAgB;CAUnC,IATsB,mBASlB,CAAA,CAAc,SAAS,MAAM;EACxBA,IAAAA;EAAP,OAAwC,EAAA,OAAA,qBAAjC,KAAA,oBAAC,6BAAD,EAA6B,GAAI,MAAQ,CAAA,GAAR,EAAA,KAAA,mBAAjCA;CACT;CAIIA,IAAAA;CAAiC,AAAA,EAAA,OAAA,qBAAjC,KAAA,oBAAC,6BAAD,EAA6B,GAAI,MAAQ,CAAA,GAAR,EAAA,KAAA;CADnCC,IAAAA;CADF,OACuC,EAAA,OAAA,cAAA,EAAA,OAA0B,gBAAA,EAAA,OAC7DD,MADF,KAAA,oBAAC,yBAAD;EAAqC;EAA0B;EAC7DA,UAAAA;CACuB,CAAA,GAFY,EAAA,KAAA,YAA0B,EAAA,KAAA,cAC7DA,EAAAA,KAAAA,4BADFC;AAIJ;AAEA,SAAS,4BAA4B,OAA4B;;CAI/D,IAAI,CAHoB,mBAGnB,CAAA,CAAgB,SAAS;EACrBC,IAAAA;EAAP,qCAAa,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA,mBAAAD;CACT;CAIoCA,IAAAA;+BAAM,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA;CADlCC,IAAAA;CADF,OAEoCF,EAAAA,OAAAA,kBADlC,KAAA,oBAAC,8BAAD,EAAA,UACE,oBAAC,+BAAD,EAAA,UAAgCA,GAA0D,CAAA,EAC9D,CAAA,GADIA,EAAAA,KAAAA,gBADlCE;AAIJ"}
@@ -1,5 +1,5 @@
1
1
  import { t as useCommentsEnabled } from "./useCommentsEnabled-B44hWtng.js";
2
- import { t as CommentsEnabledProvider } from "./CommentsEnabledProvider-D2gutvsb.js";
2
+ import { t as CommentsEnabledProvider } from "./CommentsEnabledProvider-DN_oXwXM.js";
3
3
  import { memo, useState } from "react";
4
4
  import { c } from "react/compiler-runtime";
5
5
  import { jsx } from "react/jsx-runtime";
@@ -78,4 +78,4 @@ function CommentsDocumentLayoutInner(props) {
78
78
  }
79
79
  export { CommentsDocumentLayout };
80
80
 
81
- //# sourceMappingURL=CommentsDocumentLayout-Czb6fC0_.js.map
81
+ //# sourceMappingURL=CommentsDocumentLayout-pfM29WSy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommentsDocumentLayout-Czb6fC0_.js","names":["(nextAuthoringPath: string | null) => {\n setAuthoringPath(nextAuthoringPath)\n }","useCallback((nextAuthoringPath: string | null) => {\n setAuthoringPath(nextAuthoringPath)\n }, [])","{\n authoringPath,\n setAuthoringPath: handleSetAuthoringPath,\n }","useMemo(\n (): CommentsAuthoringPathContextValue => ({\n authoringPath,\n setAuthoringPath: handleSetAuthoringPath,\n }),\n [authoringPath, handleSetAuthoringPath],\n )","<CommentsAuthoringPathContextV2.Provider value={value}>\n {children}\n </CommentsAuthoringPathContextV2.Provider>","CommentsAuthoringPathContextV2.Provider","(nextPath: CommentsSelectedPath | null) => {\n if (isEqual(selectedPath, nextPath)) return\n\n setSelectedPath(nextPath)\n }","useCallback(\n (nextPath: CommentsSelectedPath | null) => {\n if (isEqual(selectedPath, nextPath)) return\n\n setSelectedPath(nextPath)\n },\n [selectedPath],\n )","{\n selectedPath,\n setSelectedPath: handleSelectPath,\n }","useMemo(\n (): CommentsSelectedPathContextValue => ({\n selectedPath,\n setSelectedPath: handleSelectPath,\n }),\n [selectedPath, handleSelectPath],\n )","<CommentsSelectedPathContextV2.Provider value={ctxValue}>\n {children}\n </CommentsSelectedPathContextV2.Provider>","CommentsSelectedPathContextV2.Provider","<CommentsDocumentLayoutInner {...props} />","<CommentsEnabledProvider groupId={documentId} documentType={documentType}>\n <CommentsDocumentLayoutInner {...props} />\n </CommentsEnabledProvider>","props.renderDefault(props)","props.renderDefault","<CommentsSelectedPathProvider>\n <CommentsAuthoringPathProvider>{props.renderDefault(props)}</CommentsAuthoringPathProvider>\n </CommentsSelectedPathProvider>"],"sources":["../src/core/comments-v2/context/authoring-path/CommentsAuthoringPathProvider.tsx","../src/core/comments-v2/context/selected-path/CommentsSelectedPathProvider.tsx","../src/core/comments-v2/plugin/document-layout/CommentsDocumentLayout.tsx"],"sourcesContent":["import {type ReactNode, useCallback, useMemo, useState} from 'react'\nimport {CommentsAuthoringPathContextV2} from 'sanity/_singletons'\n\nimport {type CommentsAuthoringPathContextValue} from './types'\n\ninterface CommentsAuthoringPathProviderProps {\n children: ReactNode\n}\n\n/**\n * @beta\n * @hidden\n * This provider keeps track of the path that the user is currently authoring a comment for.\n * This is needed to make sure that we consistently keep the editor open when the user is\n * authoring a comment. The state is kept in a context to make sure that it is preserved\n * across re-renders. If this state was kept in a component, it would be reset every time\n * the component re-renders, for example, when the form is temporarily set to `readOnly`\n * while reconnecting.\n */\nexport function CommentsAuthoringPathProvider(props: CommentsAuthoringPathProviderProps) {\n const {children} = props\n const [authoringPath, setAuthoringPath] = useState<string | null>(null)\n\n const handleSetAuthoringPath = useCallback((nextAuthoringPath: string | null) => {\n setAuthoringPath(nextAuthoringPath)\n }, [])\n\n const value = useMemo(\n (): CommentsAuthoringPathContextValue => ({\n authoringPath,\n setAuthoringPath: handleSetAuthoringPath,\n }),\n [authoringPath, handleSetAuthoringPath],\n )\n\n return (\n <CommentsAuthoringPathContextV2.Provider value={value}>\n {children}\n </CommentsAuthoringPathContextV2.Provider>\n )\n}\n","import {dequal as isEqual} from 'dequal/lite'\nimport {memo, useCallback, useMemo, useState} from 'react'\nimport {CommentsSelectedPathContextV2} from 'sanity/_singletons'\n\nimport {type CommentsSelectedPath, type CommentsSelectedPathContextValue} from './types'\n\ninterface CommentsSelectedPathProviderProps {\n children: React.ReactNode\n}\n\n/**\n * @internal\n */\nexport const CommentsSelectedPathProvider = memo(function CommentsSelectedPathProvider(\n props: CommentsSelectedPathProviderProps,\n) {\n const {children} = props\n const [selectedPath, setSelectedPath] = useState<CommentsSelectedPath | null>(null)\n\n const handleSelectPath = useCallback(\n (nextPath: CommentsSelectedPath | null) => {\n if (isEqual(selectedPath, nextPath)) return\n\n setSelectedPath(nextPath)\n },\n [selectedPath],\n )\n\n const ctxValue = useMemo(\n (): CommentsSelectedPathContextValue => ({\n selectedPath,\n setSelectedPath: handleSelectPath,\n }),\n [selectedPath, handleSelectPath],\n )\n\n return (\n <CommentsSelectedPathContextV2.Provider value={ctxValue}>\n {children}\n </CommentsSelectedPathContextV2.Provider>\n )\n})\n","import {type DocumentLayoutProps} from '../../../config/types'\nimport {CommentsAuthoringPathProvider} from '../../context/authoring-path/CommentsAuthoringPathProvider'\nimport {CommentsEnabledProvider} from '../../context/enabled/CommentsEnabledProvider'\nimport {CommentsSelectedPathProvider} from '../../context/selected-path/CommentsSelectedPathProvider'\nimport {useCommentsEnabled} from '../../hooks/useCommentsEnabled'\n\nexport function CommentsDocumentLayout(props: DocumentLayoutProps) {\n const {documentId, documentType} = props\n const parentContext = useCommentsEnabled()\n\n // If there is a parent context and the mode is not null, a parent provider is\n // already checking if comments are enabled. In such cases, additional wrapping\n // of the document layout in the `CommentsEnabledProvider` is unnecessary.\n // The `DocumentPane` component within the `structureTool` handles this wrapping.\n // However, as this plugin may be used in contexts outside of the `structureTool`,\n // we must check for a parent context that checks if comments are enabled and\n // conditionally apply the `CommentsEnabledProvider` wrapping if it is not present.\n if (parentContext.mode !== null) {\n return <CommentsDocumentLayoutInner {...props} />\n }\n\n return (\n <CommentsEnabledProvider groupId={documentId} documentType={documentType}>\n <CommentsDocumentLayoutInner {...props} />\n </CommentsEnabledProvider>\n )\n}\n\nfunction CommentsDocumentLayoutInner(props: DocumentLayoutProps) {\n const commentsEnabled = useCommentsEnabled()\n\n // If comments are not enabled, render the default document layout\n if (!commentsEnabled.enabled) {\n return props.renderDefault(props)\n }\n\n return (\n <CommentsSelectedPathProvider>\n <CommentsAuthoringPathProvider>{props.renderDefault(props)}</CommentsAuthoringPathProvider>\n </CommentsSelectedPathProvider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,SAAgB,8BAA8B,OAA2C;eACjF,EAAC,aAAY,OACb,CAAC,eAAe,oBAAoB,SAAwB,IAAI,GAE3BA;qDAAC,MAAA,sBAAqC;EAC/E,iBAAiB,iBAAiB;CACpC;CAFA,IAAM,yBAAyBC,IAKaC;CACxC,AAAA,EAAA,OAAA,6BADwC,KAAA;EACxC;EACA,kBAAkB;CACpB,GAFE,EAAA,KAAA;CAFJ,IAAM,QAAQC,IASZC;CADF,OAEK,EAAA,OAAA,YAAA,EAAA,OAD6C,SAAhD,KAAA,oBAACC,+BAAAA,UAAD;EAAgD;EAC7C;CACsC,CAAA,GADtC,EAAA,KAAA,UAD6C,EAAA,KAAA,+BAAhDD;AAIJ;;;;AC3BA,MAAa,+BAA+B,KAAK,SAAS,6BACxD,OACA;eACM,EAAC,aAAY,OACb,CAAC,cAAc,mBAAmB,SAAsC,IAAI,GAGhFE;CACc,AAAA,EAAA,OAAA,4BADd,MAAC,aAA0C;EACrC,OAAQ,cAAc,QAAQ,KAElC,gBAAgB,QAAQ;CAC1B,GAHc,EAAA,KAAA;CAFhB,IAAM,mBAAmBC,IAUkBC;CAEtB,AAAA,EAAA,OAAA,oBAAA,EAAA,OADjB,gBADuC,KAAA;EACvC;EACA,iBAAiB;CACnB,GADmB,EAAA,KAAA,kBADjB,EAAA,KAAA;CAFJ,IAAM,WAAWC,IASfC;CADF,OAEK,EAAA,OAAA,YAAA,EAAA,OAD4C,YAA/C,KAAA,oBAACC,8BAAAA,UAAD;EAAwC,OAAO;EAC5C;CACqC,CAAA,GADrC,EAAA,KAAA,UAD4C,EAAA,KAAA,kCAA/CD;AAIJ,CAAC;ACnCD,SAAgB,uBAAuB,OAA4B;eAC3D,EAAC,YAAY,iBAAgB;CAUnC,IATsB,mBASlB,CAAA,CAAc,SAAS,MAAM;EACxBE,IAAAA;EAAP,OAAwC,EAAA,OAAA,qBAAjC,KAAA,oBAAC,6BAAD,EAA6B,GAAI,MAAQ,CAAA,GAAR,EAAA,KAAA,mBAAjCA;CACT;CAIIA,IAAAA;CAAiC,AAAA,EAAA,OAAA,qBAAjC,KAAA,oBAAC,6BAAD,EAA6B,GAAI,MAAQ,CAAA,GAAR,EAAA,KAAA;CADnCC,IAAAA;CADF,OACoC,EAAA,OAAA,cAAA,EAAA,OAA0B,gBAAA,EAAA,OAC1DD,MADF,KAAA,oBAAC,yBAAD;EAAyB,SAAS;EAA0B;EAC1DA,UAAAA;CACuB,CAAA,GAFS,EAAA,KAAA,YAA0B,EAAA,KAAA,cAC1DA,EAAAA,KAAAA,4BADFC;AAIJ;AAEA,SAAS,4BAA4B,OAA4B;;CAI/D,IAAI,CAHoB,mBAGnB,CAAA,CAAgB,SAAS;EACrBC,IAAAA;EAAP,qCAAa,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA,mBAAAD;CACT;CAIoCA,IAAAA;+BAAM,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA;CADlCC,IAAAA;CADF,OAEoCF,EAAAA,OAAAA,kBADlC,KAAA,oBAAC,8BAAD,EAAA,UACE,oBAAC,+BAAD,EAAA,UAAgCA,GAA0D,CAAA,EAC9D,CAAA,GADIA,EAAAA,KAAAA,gBADlCE;AAIJ"}
1
+ {"version":3,"file":"CommentsDocumentLayout-pfM29WSy.js","names":["(nextAuthoringPath: string | null) => {\n setAuthoringPath(nextAuthoringPath)\n }","useCallback((nextAuthoringPath: string | null) => {\n setAuthoringPath(nextAuthoringPath)\n }, [])","{\n authoringPath,\n setAuthoringPath: handleSetAuthoringPath,\n }","useMemo(\n (): CommentsAuthoringPathContextValue => ({\n authoringPath,\n setAuthoringPath: handleSetAuthoringPath,\n }),\n [authoringPath, handleSetAuthoringPath],\n )","<CommentsAuthoringPathContextV2.Provider value={value}>\n {children}\n </CommentsAuthoringPathContextV2.Provider>","CommentsAuthoringPathContextV2.Provider","(nextPath: CommentsSelectedPath | null) => {\n if (isEqual(selectedPath, nextPath)) return\n\n setSelectedPath(nextPath)\n }","useCallback(\n (nextPath: CommentsSelectedPath | null) => {\n if (isEqual(selectedPath, nextPath)) return\n\n setSelectedPath(nextPath)\n },\n [selectedPath],\n )","{\n selectedPath,\n setSelectedPath: handleSelectPath,\n }","useMemo(\n (): CommentsSelectedPathContextValue => ({\n selectedPath,\n setSelectedPath: handleSelectPath,\n }),\n [selectedPath, handleSelectPath],\n )","<CommentsSelectedPathContextV2.Provider value={ctxValue}>\n {children}\n </CommentsSelectedPathContextV2.Provider>","CommentsSelectedPathContextV2.Provider","<CommentsDocumentLayoutInner {...props} />","<CommentsEnabledProvider groupId={documentId} documentType={documentType}>\n <CommentsDocumentLayoutInner {...props} />\n </CommentsEnabledProvider>","props.renderDefault(props)","props.renderDefault","<CommentsSelectedPathProvider>\n <CommentsAuthoringPathProvider>{props.renderDefault(props)}</CommentsAuthoringPathProvider>\n </CommentsSelectedPathProvider>"],"sources":["../src/core/comments-v2/context/authoring-path/CommentsAuthoringPathProvider.tsx","../src/core/comments-v2/context/selected-path/CommentsSelectedPathProvider.tsx","../src/core/comments-v2/plugin/document-layout/CommentsDocumentLayout.tsx"],"sourcesContent":["import {type ReactNode, useCallback, useMemo, useState} from 'react'\nimport {CommentsAuthoringPathContextV2} from 'sanity/_singletons'\n\nimport {type CommentsAuthoringPathContextValue} from './types'\n\ninterface CommentsAuthoringPathProviderProps {\n children: ReactNode\n}\n\n/**\n * @beta\n * @hidden\n * This provider keeps track of the path that the user is currently authoring a comment for.\n * This is needed to make sure that we consistently keep the editor open when the user is\n * authoring a comment. The state is kept in a context to make sure that it is preserved\n * across re-renders. If this state was kept in a component, it would be reset every time\n * the component re-renders, for example, when the form is temporarily set to `readOnly`\n * while reconnecting.\n */\nexport function CommentsAuthoringPathProvider(props: CommentsAuthoringPathProviderProps) {\n const {children} = props\n const [authoringPath, setAuthoringPath] = useState<string | null>(null)\n\n const handleSetAuthoringPath = useCallback((nextAuthoringPath: string | null) => {\n setAuthoringPath(nextAuthoringPath)\n }, [])\n\n const value = useMemo(\n (): CommentsAuthoringPathContextValue => ({\n authoringPath,\n setAuthoringPath: handleSetAuthoringPath,\n }),\n [authoringPath, handleSetAuthoringPath],\n )\n\n return (\n <CommentsAuthoringPathContextV2.Provider value={value}>\n {children}\n </CommentsAuthoringPathContextV2.Provider>\n )\n}\n","import {dequal as isEqual} from 'dequal/lite'\nimport {memo, useCallback, useMemo, useState} from 'react'\nimport {CommentsSelectedPathContextV2} from 'sanity/_singletons'\n\nimport {type CommentsSelectedPath, type CommentsSelectedPathContextValue} from './types'\n\ninterface CommentsSelectedPathProviderProps {\n children: React.ReactNode\n}\n\n/**\n * @internal\n */\nexport const CommentsSelectedPathProvider = memo(function CommentsSelectedPathProvider(\n props: CommentsSelectedPathProviderProps,\n) {\n const {children} = props\n const [selectedPath, setSelectedPath] = useState<CommentsSelectedPath | null>(null)\n\n const handleSelectPath = useCallback(\n (nextPath: CommentsSelectedPath | null) => {\n if (isEqual(selectedPath, nextPath)) return\n\n setSelectedPath(nextPath)\n },\n [selectedPath],\n )\n\n const ctxValue = useMemo(\n (): CommentsSelectedPathContextValue => ({\n selectedPath,\n setSelectedPath: handleSelectPath,\n }),\n [selectedPath, handleSelectPath],\n )\n\n return (\n <CommentsSelectedPathContextV2.Provider value={ctxValue}>\n {children}\n </CommentsSelectedPathContextV2.Provider>\n )\n})\n","import {type DocumentLayoutProps} from '../../../config/types'\nimport {CommentsAuthoringPathProvider} from '../../context/authoring-path/CommentsAuthoringPathProvider'\nimport {CommentsEnabledProvider} from '../../context/enabled/CommentsEnabledProvider'\nimport {CommentsSelectedPathProvider} from '../../context/selected-path/CommentsSelectedPathProvider'\nimport {useCommentsEnabled} from '../../hooks/useCommentsEnabled'\n\nexport function CommentsDocumentLayout(props: DocumentLayoutProps) {\n const {documentId, documentType} = props\n const parentContext = useCommentsEnabled()\n\n // If there is a parent context and the mode is not null, a parent provider is\n // already checking if comments are enabled. In such cases, additional wrapping\n // of the document layout in the `CommentsEnabledProvider` is unnecessary.\n // The `DocumentPane` component within the `structureTool` handles this wrapping.\n // However, as this plugin may be used in contexts outside of the `structureTool`,\n // we must check for a parent context that checks if comments are enabled and\n // conditionally apply the `CommentsEnabledProvider` wrapping if it is not present.\n if (parentContext.mode !== null) {\n return <CommentsDocumentLayoutInner {...props} />\n }\n\n return (\n <CommentsEnabledProvider groupId={documentId} documentType={documentType}>\n <CommentsDocumentLayoutInner {...props} />\n </CommentsEnabledProvider>\n )\n}\n\nfunction CommentsDocumentLayoutInner(props: DocumentLayoutProps) {\n const commentsEnabled = useCommentsEnabled()\n\n // If comments are not enabled, render the default document layout\n if (!commentsEnabled.enabled) {\n return props.renderDefault(props)\n }\n\n return (\n <CommentsSelectedPathProvider>\n <CommentsAuthoringPathProvider>{props.renderDefault(props)}</CommentsAuthoringPathProvider>\n </CommentsSelectedPathProvider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,SAAgB,8BAA8B,OAA2C;eACjF,EAAC,aAAY,OACb,CAAC,eAAe,oBAAoB,SAAwB,IAAI,GAE3BA;qDAAC,MAAA,sBAAqC;EAC/E,iBAAiB,iBAAiB;CACpC;CAFA,IAAM,yBAAyBC,IAKaC;CACxC,AAAA,EAAA,OAAA,6BADwC,KAAA;EACxC;EACA,kBAAkB;CACpB,GAFE,EAAA,KAAA;CAFJ,IAAM,QAAQC,IASZC;CADF,OAEK,EAAA,OAAA,YAAA,EAAA,OAD6C,SAAhD,KAAA,oBAACC,+BAAAA,UAAD;EAAgD;EAC7C;CACsC,CAAA,GADtC,EAAA,KAAA,UAD6C,EAAA,KAAA,+BAAhDD;AAIJ;;;;AC3BA,MAAa,+BAA+B,KAAK,SAAS,6BACxD,OACA;eACM,EAAC,aAAY,OACb,CAAC,cAAc,mBAAmB,SAAsC,IAAI,GAGhFE;CACc,AAAA,EAAA,OAAA,4BADd,MAAC,aAA0C;EACrC,OAAQ,cAAc,QAAQ,KAElC,gBAAgB,QAAQ;CAC1B,GAHc,EAAA,KAAA;CAFhB,IAAM,mBAAmBC,IAUkBC;CAEtB,AAAA,EAAA,OAAA,oBAAA,EAAA,OADjB,gBADuC,KAAA;EACvC;EACA,iBAAiB;CACnB,GADmB,EAAA,KAAA,kBADjB,EAAA,KAAA;CAFJ,IAAM,WAAWC,IASfC;CADF,OAEK,EAAA,OAAA,YAAA,EAAA,OAD4C,YAA/C,KAAA,oBAACC,8BAAAA,UAAD;EAAwC,OAAO;EAC5C;CACqC,CAAA,GADrC,EAAA,KAAA,UAD4C,EAAA,KAAA,kCAA/CD;AAIJ,CAAC;ACnCD,SAAgB,uBAAuB,OAA4B;eAC3D,EAAC,YAAY,iBAAgB;CAUnC,IATsB,mBASlB,CAAA,CAAc,SAAS,MAAM;EACxBE,IAAAA;EAAP,OAAwC,EAAA,OAAA,qBAAjC,KAAA,oBAAC,6BAAD,EAA6B,GAAI,MAAQ,CAAA,GAAR,EAAA,KAAA,mBAAjCA;CACT;CAIIA,IAAAA;CAAiC,AAAA,EAAA,OAAA,qBAAjC,KAAA,oBAAC,6BAAD,EAA6B,GAAI,MAAQ,CAAA,GAAR,EAAA,KAAA;CADnCC,IAAAA;CADF,OACoC,EAAA,OAAA,cAAA,EAAA,OAA0B,gBAAA,EAAA,OAC1DD,MADF,KAAA,oBAAC,yBAAD;EAAyB,SAAS;EAA0B;EAC1DA,UAAAA;CACuB,CAAA,GAFS,EAAA,KAAA,YAA0B,EAAA,KAAA,cAC1DA,EAAAA,KAAAA,4BADFC;AAIJ;AAEA,SAAS,4BAA4B,OAA4B;;CAI/D,IAAI,CAHoB,mBAGnB,CAAA,CAAgB,SAAS;EACrBC,IAAAA;EAAP,qCAAa,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA,mBAAAD;CACT;CAIoCA,IAAAA;+BAAM,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA;CADlCC,IAAAA;CADF,OAEoCF,EAAAA,OAAAA,kBADlC,KAAA,oBAAC,8BAAD,EAAA,UACE,oBAAC,+BAAD,EAAA,UAAgCA,GAA0D,CAAA,EAC9D,CAAA,GADIA,EAAAA,KAAAA,gBADlCE;AAIJ"}
@@ -1,5 +1,5 @@
1
- import { $ as FEATURES, et as useFeatureEnabled } from "./PerspectiveProvider-Yk7lgugx.js";
2
- import { o as useSource } from "./studioClient-EJDu6kOb.js";
1
+ import { $ as FEATURES, et as useFeatureEnabled } from "./PerspectiveProvider-D-6sweQH.js";
2
+ import { o as useSource } from "./studioClient-C7B6Aobi.js";
3
3
  import { l as getPublishedId } from "./draftUtils-D3HJGQaW.js";
4
4
  import { memo } from "react";
5
5
  import { c } from "react/compiler-runtime";
@@ -45,4 +45,4 @@ const CommentsEnabledProvider = memo(function CommentsEnabledProvider(props) {
45
45
  });
46
46
  export { CommentsEnabledProvider as t };
47
47
 
48
- //# sourceMappingURL=CommentsEnabledProvider-D2gutvsb.js.map
48
+ //# sourceMappingURL=CommentsEnabledProvider-DN_oXwXM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommentsEnabledProvider-D2gutvsb.js","names":["useMemo(() => {\n // The feature is not enabled if:\n // - the feature is loading (`isLoading` is true)\n // - the feature is not enabled in the project (`enabledFromConfig` is false)\n // - there's an error when fetching the list of enabled features (`error` is set)\n if (isLoading || !enabledFromConfig || error) {\n return {enabled: false, mode: null}\n }\n\n return {\n enabled: true,\n mode: featureEnabled ? 'default' : 'upsell',\n }\n }, [isLoading, enabledFromConfig, error, featureEnabled])","{enabled: false, mode: null}","{\n enabled: true,\n mode: featureEnabled ? 'default' : 'upsell',\n }","featureEnabled ? 'default' : 'upsell'","<CommentsEnabledContextV2.Provider value={value}>{children}</CommentsEnabledContextV2.Provider>","CommentsEnabledContextV2.Provider"],"sources":["../src/core/comments-v2/hooks/useResolveCommentsEnabled.ts","../src/core/comments-v2/context/enabled/CommentsEnabledProvider.tsx"],"sourcesContent":["import {useMemo} from 'react'\n\nimport {useFeatureEnabled, FEATURES} from '../../hooks/useFeatureEnabled'\nimport {useSource} from '../../studio/source'\nimport {getPublishedId} from '../../util/draftUtils'\nimport {type CommentsUIMode} from '../types'\n\ntype ResolveCommentsEnabled =\n | {\n enabled: false\n mode: null\n }\n | {\n enabled: true\n mode: CommentsUIMode\n }\n\n/**\n * @internal\n * A hook that resolves if comments are enabled for the current document and document type\n * and if the feature is enabled for the current project.\n */\nexport function useResolveCommentsEnabled(\n groupId: string,\n documentType: string,\n): ResolveCommentsEnabled {\n // Check if the projects plan has the feature enabled\n const {enabled: featureEnabled, isLoading, error} = useFeatureEnabled(FEATURES.studioComments)\n\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n const {enabled} = useSource().document.comments\n // Check if the feature is enabled for the current document in the config\n const enabledFromConfig = useMemo(\n () => enabled({documentType, documentId: getPublishedId(groupId)}),\n [groupId, documentType, enabled],\n )\n\n const value: ResolveCommentsEnabled = useMemo(() => {\n // The feature is not enabled if:\n // - the feature is loading (`isLoading` is true)\n // - the feature is not enabled in the project (`enabledFromConfig` is false)\n // - there's an error when fetching the list of enabled features (`error` is set)\n if (isLoading || !enabledFromConfig || error) {\n return {enabled: false, mode: null}\n }\n\n return {\n enabled: true,\n mode: featureEnabled ? 'default' : 'upsell',\n }\n }, [isLoading, enabledFromConfig, error, featureEnabled])\n\n return value\n}\n","import {memo, type ReactNode} from 'react'\nimport {CommentsEnabledContextV2} from 'sanity/_singletons'\n\nimport {useResolveCommentsEnabled} from '../../hooks/useResolveCommentsEnabled'\n\ninterface CommentsEnabledProviderProps {\n children: ReactNode\n groupId: string\n documentType: string\n}\n\n/**\n * @beta\n * @hidden\n */\nexport const CommentsEnabledProvider = memo(function CommentsEnabledProvider(\n props: CommentsEnabledProviderProps,\n) {\n const {children, groupId, documentType} = props\n\n const value = useResolveCommentsEnabled(groupId, documentType)\n\n return (\n <CommentsEnabledContextV2.Provider value={value}>{children}</CommentsEnabledContextV2.Provider>\n )\n})\n"],"mappings":";;;;;;;;;;;;AAsBA,SAAgB,0BACd,SACA,cACwB;eAElB,EAAC,SAAS,gBAAgB,WAAW,UAAS,kBAAkB,SAAS,cAAc,GAGvF,EAAC,YAAW,UAAU,CAAC,CAAC,SAAS,UAEjC,oBACE,QAAQ;EAAC;EAAc,YAAY,eAAe,OAAO;CAAC,CAElE,GAEsCA;;EAKpC,IAAI,aAAa,CAAC,qBAAqB,OAAO;GACrCC,IAAAA;GAAP;IAAQ,SAAS;IAAO,MAAM;GAAI,2BAAlC,KAAOA;GAAP,MAAA;EACF;EAIQ,IAAA,KAAA,iBAAiB,YAAY,UAF9BC;EAAP,AAEQC,EAAAA,OAAAA,kBAFD,KAAA;GACL,SAAS;GACT,MAAMA;EACR,GADQA,EAAAA,KAAAA,gBAFR,KAAOD;;CAMT,OAAO;AACT;;;;;ACtCA,MAAa,0BAA0B,KAAK,SAAS,wBACnD,OACA;eACM,EAAC,UAAU,SAAS,iBAAgB,OAEpC,QAAQ,0BAA0B,SAAS,YAAY,GAG3DE;CADF,OACoD,EAAA,OAAA,YAAA,EAAA,OAAR,SAA1C,KAAA,oBAACC,yBAAAA,UAAD;EAA0C;EAAQ;CAA4C,CAAA,GAA5C,EAAA,KAAA,UAAR,EAAA,KAAA,+BAA1CD;AAEJ,CAAC"}
1
+ {"version":3,"file":"CommentsEnabledProvider-DN_oXwXM.js","names":["useMemo(() => {\n // The feature is not enabled if:\n // - the feature is loading (`isLoading` is true)\n // - the feature is not enabled in the project (`enabledFromConfig` is false)\n // - there's an error when fetching the list of enabled features (`error` is set)\n if (isLoading || !enabledFromConfig || error) {\n return {enabled: false, mode: null}\n }\n\n return {\n enabled: true,\n mode: featureEnabled ? 'default' : 'upsell',\n }\n }, [isLoading, enabledFromConfig, error, featureEnabled])","{enabled: false, mode: null}","{\n enabled: true,\n mode: featureEnabled ? 'default' : 'upsell',\n }","featureEnabled ? 'default' : 'upsell'","<CommentsEnabledContextV2.Provider value={value}>{children}</CommentsEnabledContextV2.Provider>","CommentsEnabledContextV2.Provider"],"sources":["../src/core/comments-v2/hooks/useResolveCommentsEnabled.ts","../src/core/comments-v2/context/enabled/CommentsEnabledProvider.tsx"],"sourcesContent":["import {useMemo} from 'react'\n\nimport {useFeatureEnabled, FEATURES} from '../../hooks/useFeatureEnabled'\nimport {useSource} from '../../studio/source'\nimport {getPublishedId} from '../../util/draftUtils'\nimport {type CommentsUIMode} from '../types'\n\ntype ResolveCommentsEnabled =\n | {\n enabled: false\n mode: null\n }\n | {\n enabled: true\n mode: CommentsUIMode\n }\n\n/**\n * @internal\n * A hook that resolves if comments are enabled for the current document and document type\n * and if the feature is enabled for the current project.\n */\nexport function useResolveCommentsEnabled(\n groupId: string,\n documentType: string,\n): ResolveCommentsEnabled {\n // Check if the projects plan has the feature enabled\n const {enabled: featureEnabled, isLoading, error} = useFeatureEnabled(FEATURES.studioComments)\n\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n const {enabled} = useSource().document.comments\n // Check if the feature is enabled for the current document in the config\n const enabledFromConfig = useMemo(\n () => enabled({documentType, documentId: getPublishedId(groupId)}),\n [groupId, documentType, enabled],\n )\n\n const value: ResolveCommentsEnabled = useMemo(() => {\n // The feature is not enabled if:\n // - the feature is loading (`isLoading` is true)\n // - the feature is not enabled in the project (`enabledFromConfig` is false)\n // - there's an error when fetching the list of enabled features (`error` is set)\n if (isLoading || !enabledFromConfig || error) {\n return {enabled: false, mode: null}\n }\n\n return {\n enabled: true,\n mode: featureEnabled ? 'default' : 'upsell',\n }\n }, [isLoading, enabledFromConfig, error, featureEnabled])\n\n return value\n}\n","import {memo, type ReactNode} from 'react'\nimport {CommentsEnabledContextV2} from 'sanity/_singletons'\n\nimport {useResolveCommentsEnabled} from '../../hooks/useResolveCommentsEnabled'\n\ninterface CommentsEnabledProviderProps {\n children: ReactNode\n groupId: string\n documentType: string\n}\n\n/**\n * @beta\n * @hidden\n */\nexport const CommentsEnabledProvider = memo(function CommentsEnabledProvider(\n props: CommentsEnabledProviderProps,\n) {\n const {children, groupId, documentType} = props\n\n const value = useResolveCommentsEnabled(groupId, documentType)\n\n return (\n <CommentsEnabledContextV2.Provider value={value}>{children}</CommentsEnabledContextV2.Provider>\n )\n})\n"],"mappings":";;;;;;;;;;;;AAsBA,SAAgB,0BACd,SACA,cACwB;eAElB,EAAC,SAAS,gBAAgB,WAAW,UAAS,kBAAkB,SAAS,cAAc,GAGvF,EAAC,YAAW,UAAU,CAAC,CAAC,SAAS,UAEjC,oBACE,QAAQ;EAAC;EAAc,YAAY,eAAe,OAAO;CAAC,CAElE,GAEsCA;;EAKpC,IAAI,aAAa,CAAC,qBAAqB,OAAO;GACrCC,IAAAA;GAAP;IAAQ,SAAS;IAAO,MAAM;GAAI,2BAAlC,KAAOA;GAAP,MAAA;EACF;EAIQ,IAAA,KAAA,iBAAiB,YAAY,UAF9BC;EAAP,AAEQC,EAAAA,OAAAA,kBAFD,KAAA;GACL,SAAS;GACT,MAAMA;EACR,GADQA,EAAAA,KAAAA,gBAFR,KAAOD;;CAMT,OAAO;AACT;;;;;ACtCA,MAAa,0BAA0B,KAAK,SAAS,wBACnD,OACA;eACM,EAAC,UAAU,SAAS,iBAAgB,OAEpC,QAAQ,0BAA0B,SAAS,YAAY,GAG3DE;CADF,OACoD,EAAA,OAAA,YAAA,EAAA,OAAR,SAA1C,KAAA,oBAACC,yBAAAA,UAAD;EAA0C;EAAQ;CAA4C,CAAA,GAA5C,EAAA,KAAA,UAAR,EAAA,KAAA,+BAA1CD;AAEJ,CAAC"}
@@ -1,12 +1,12 @@
1
- import { Yt as getSchemaTypeTitle } from "./PerspectiveProvider-Yk7lgugx.js";
1
+ import { Yt as getSchemaTypeTitle } from "./PerspectiveProvider-D-6sweQH.js";
2
2
  import { t as useTranslation } from "./useTranslation-Cqs6Itwv.js";
3
3
  import { o as Button$1, s as Tooltip } from "./Tab-Dx6d0Ug4.js";
4
4
  import { t as Translate } from "./Translate-YUHPpk6j.js";
5
- import { n as useCurrentUser } from "./LoadingBlock-Ch_dBXfn.js";
5
+ import { n as useCurrentUser } from "./LoadingBlock-CElIdb7F.js";
6
6
  import { r as Popover } from "./MenuGroup-DwiYr9LF.js";
7
7
  import { t as useCommentsEnabled } from "./useCommentsEnabled-B44hWtng.js";
8
- import { a as commentsLocaleNamespace, c as hasCommentMessageValue, l as isTextSelectionComment, t as COMMENTS_HIGHLIGHT_HUE_KEY, u as parseCommentFieldPath } from "./constants-DdgHySkY.js";
9
- import { l as useCommentsScroll, o as applyCommentsFieldAttr, t as CommentInput, u as useComments } from "./CommentInput-B5T1Iwnt.js";
8
+ import { a as commentsLocaleNamespace, c as hasCommentMessageValue, l as isTextSelectionComment, t as COMMENTS_HIGHLIGHT_HUE_KEY, u as parseCommentFieldPath } from "./constants-BQItnHll.js";
9
+ import { l as useCommentsScroll, o as applyCommentsFieldAttr, t as CommentInput, u as useComments } from "./CommentInput-BXYQnGhq.js";
10
10
  import { n as useCommentsSelectedPath, t as useCommentsUpsell } from "./useCommentsUpsell-dtlhkiSW.js";
11
11
  import { useContext, useRef, useState } from "react";
12
12
  import { c } from "react/compiler-runtime";
@@ -332,4 +332,4 @@ function belongsToField(fieldPath, path) {
332
332
  }
333
333
  export { CommentsField };
334
334
 
335
- //# sourceMappingURL=CommentsField-D2Fum0Jx.js.map
335
+ //# sourceMappingURL=CommentsField-B7wTBRMB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommentsField-D2Fum0Jx.js","names":["() => {\n if (!open) return\n onClose()\n addCommentButtonElement?.focus()\n }","addCommentButtonElement?.focus","useCallback(() => {\n if (!open) return\n onClose()\n addCommentButtonElement?.focus()\n }, [addCommentButtonElement, open, onClose])","(nextValue: PortableTextBlock[]) => {\n onCommentAdd(nextValue)\n closePopover()\n }","useCallback(\n (nextValue: PortableTextBlock[]) => {\n onCommentAdd(nextValue)\n closePopover()\n },\n [closePopover, onCommentAdd],\n )","hasCommentMessageValue(value)","useMemo(() => hasCommentMessageValue(value), [value])","() => {\n if (!hasValue) {\n closePopover()\n return\n }\n\n commentInputHandle.current?.discardDialogController.open()\n }","useCallback(() => {\n if (!hasValue) {\n closePopover()\n return\n }\n\n commentInputHandle.current?.discardDialogController.open()\n }, [closePopover, hasValue])","(event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n\n // Call parent handler\n if (onInputKeyDown) onInputKeyDown(event)\n }","useCallback(\n (event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n\n // Call parent handler\n if (onInputKeyDown) onInputKeyDown(event)\n },\n [onInputKeyDown],\n )","() => {\n commentInputHandle.current?.discardDialogController.close()\n }","useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n }, [])","() => {\n commentInputHandle.current?.discardDialogController.close()\n closePopover()\n onDiscard()\n }","useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n closePopover()\n onDiscard()\n }, [closePopover, onDiscard])","(event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n }","event","useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n },\n [startDiscard],\n )","() => [popoverRef.current]","{field: fieldTitle}","<Translate\n t={t}\n i18nKey=\"compose.add-comment-input-placeholder\"\n values={{field: fieldTitle}}\n />","<ContentStack padding={2} gap={4} flexDirection=\"column\">\n <CommentInput\n currentUser={currentUser}\n focusLock\n focusOnMount\n mentionOptions={mentionOptions}\n onChange={onChange}\n onDiscardCancel={handleDiscardCancel}\n onDiscardConfirm={handleDiscardConfirm}\n onKeyDown={handleInputKeyDown}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n readOnly={readOnly}\n ref={commentInputHandle}\n value={value}\n />\n </ContentStack>","['bottom-end']","t('field-button.aria-label-add')","t('field-button.title')","{\n content: t('field-button.title'),\n placement: 'top',\n }","<div>\n <Button\n aria-label={t('field-button.aria-label-add')}\n disabled={readOnly}\n icon={AddCommentIcon}\n mode=\"bleed\"\n onClick={onClick}\n ref={setAddCommentButtonElement}\n selected={open}\n tooltipProps={{\n content: t('field-button.title'),\n placement: 'top',\n }}\n />\n </div>","<Popover\n constrainSize\n content={content}\n fallbackPlacements={['bottom-end']}\n open={open}\n placement=\"right-start\"\n portal\n ref={popoverRef}\n onKeyDown={handlePopoverKeyDown}\n >\n <div>\n <Button\n aria-label={t('field-button.aria-label-add')}\n disabled={readOnly}\n icon={AddCommentIcon}\n mode=\"bleed\"\n onClick={onClick}\n ref={setAddCommentButtonElement}\n selected={open}\n tooltipProps={{\n content: t('field-button.title'),\n placement: 'top',\n }}\n />\n </div>\n </Popover>","t('field-button.content', {count})","t('field-button.aria-label-open')","<Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />","<Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>","count > 9 ? '9+' : count","<SanityUIButton\n aria-label={t('field-button.aria-label-open')}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n gap={2}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>\n </SanityUIButton>","<Tooltip portal placement=\"top\" content={t('field-button.content', {count})}>\n <SanityUIButton\n aria-label={t('field-button.aria-label-open')}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n gap={2}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>\n </SanityUIButton>\n </Tooltip>","props.renderDefault(props)","props.renderDefault","<CommentFieldInner {...props} mode={mode} />","{\n boundaryElement,\n }","getSchemaTypeTitle(props.schemaType)","schemaType","useMemo(() => getSchemaTypeTitle(props.schemaType), [props.schemaType])","PathUtils.toString(props.path)","path","useMemo(() => PathUtils.toString(props.path), [props.path])","messageCache.get(stringPath) || null","() => {\n if (!isCommentsOpen) return false\n if (selectedPath?.origin === 'form' || selectedPath?.origin === 'url') return false\n return belongsToField(selectedPath?.fieldPath, props.path)\n }","fieldPath","origin","useMemo(() => {\n if (!isCommentsOpen) return false\n if (selectedPath?.origin === 'form' || selectedPath?.origin === 'url') return false\n return belongsToField(selectedPath?.fieldPath, props.path)\n }, [isCommentsOpen, selectedPath?.fieldPath, selectedPath?.origin, props.path])","comments.data.open\n .filter((c) => c.threadId === selectedPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))","open","threadId","(c) => c.threadId === selectedPath?.threadId","(x) => isTextSelectionComment(x.parentComment)","useMemo(() => {\n return comments.data.open\n .filter((c) => c.threadId === selectedPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))\n }, [comments.data.open, selectedPath?.threadId])","comments.data.open\n .map((c) => (belongsToField(c.fieldPath, props.path) ? c.commentsCount : 0))\n .reduce((acc, val) => acc + val, 0)","(c) => (belongsToField(c.fieldPath, props.path) ? c.commentsCount : 0)","c","(acc, val) => acc + val","() => {\n // Reset the value and remove the message from the cache\n setValue(null)\n messageCache.delete(stringPath)\n }","useCallback(() => {\n // Reset the value and remove the message from the cache\n setValue(null)\n messageCache.delete(stringPath)\n }, [stringPath])","() => {\n // When clicking a comment button when the field has comments, we want to:\n if (hasComments) {\n // 1. Change the status to 'open' if it's 'resolved'\n if (status === 'resolved') {\n setStatus('open')\n }\n\n // 2. Ensure that the authoring path is reset when clicking\n // the comment button when the field has comments.\n setAuthoringPath(null)\n\n // 3. Open the comments inspector\n onCommentsOpen?.()\n\n // 4. Find the latest comment thread for the current field\n const latestThread = comments.data.open.find((c) => belongsToField(c.fieldPath, props.path))\n\n // 5. Set the latest thread ID as the selected thread ID\n // and scroll to the it. The selected path carries the thread's own\n // `fieldPath`: the inspector marks a thread selected by comparing\n // against the stored path, which for nested threads is deeper than\n // this field's path.\n if (latestThread) {\n setSelectedPath({\n threadId: latestThread.threadId,\n origin: 'form',\n fieldPath: latestThread.fieldPath,\n })\n\n scrollToGroup(latestThread.threadId)\n }\n\n return\n }\n\n if (mode === 'upsell') {\n if (upsellData) {\n handleOpenDialog('field_action')\n } else {\n // Open the comments inspector\n onCommentsOpen?.()\n }\n return\n }\n\n // If the field is open (i.e. the authoring path is set to the current field)\n // we close the field by resetting the authoring path. If the field is not open,\n // we set the authoring path to the current field so that the comment form is opened.\n setAuthoringPath(isOpen ? null : stringPath)\n }","useCallback(() => {\n // When clicking a comment button when the field has comments, we want to:\n if (hasComments) {\n // 1. Change the status to 'open' if it's 'resolved'\n if (status === 'resolved') {\n setStatus('open')\n }\n\n // 2. Ensure that the authoring path is reset when clicking\n // the comment button when the field has comments.\n setAuthoringPath(null)\n\n // 3. Open the comments inspector\n onCommentsOpen?.()\n\n // 4. Find the latest comment thread for the current field\n const latestThread = comments.data.open.find((c) => belongsToField(c.fieldPath, props.path))\n\n // 5. Set the latest thread ID as the selected thread ID\n // and scroll to the it. The selected path carries the thread's own\n // `fieldPath`: the inspector marks a thread selected by comparing\n // against the stored path, which for nested threads is deeper than\n // this field's path.\n if (latestThread) {\n setSelectedPath({\n threadId: latestThread.threadId,\n origin: 'form',\n fieldPath: latestThread.fieldPath,\n })\n\n scrollToGroup(latestThread.threadId)\n }\n\n return\n }\n\n if (mode === 'upsell') {\n if (upsellData) {\n handleOpenDialog('field_action')\n } else {\n // Open the comments inspector\n onCommentsOpen?.()\n }\n return\n }\n\n // If the field is open (i.e. the authoring path is set to the current field)\n // we close the field by resetting the authoring path. If the field is not open,\n // we set the authoring path to the current field so that the comment form is opened.\n setAuthoringPath(isOpen ? null : stringPath)\n }, [\n comments.data.open,\n handleOpenDialog,\n hasComments,\n isOpen,\n mode,\n onCommentsOpen,\n props.path,\n scrollToGroup,\n setAuthoringPath,\n setSelectedPath,\n setStatus,\n status,\n stringPath,\n upsellData,\n ])","(nextValue: PortableTextBlock[]) => {\n if (nextValue) {\n // Since this is a new comment, we generate a new thread ID\n const newThreadId = uuid()\n\n // Construct the comment payload\n const nextComment: CommentCreatePayload = {\n type: 'field',\n fieldPath: PathUtils.toString(props.path),\n message: nextValue,\n parentCommentId: undefined,\n status: 'open',\n threadId: newThreadId,\n // New comments have no reactions\n reactions: EMPTY_ARRAY,\n }\n\n // Execute the create mutation\n void operation.create(nextComment)\n\n // If a comment is added to a field when viewing resolved comments, we switch\n // to open comments and scroll to the comment that was just added\n // Open the inspector when a new comment is added\n onCommentsOpen?.()\n\n if (status === 'resolved') {\n // Set the status to 'open' so that the comment is visible\n setStatus('open')\n }\n\n resetMessageValue()\n\n // Scroll to the thread\n setSelectedPath({\n threadId: newThreadId,\n origin: 'form',\n fieldPath: PathUtils.toString(props.path),\n })\n\n scrollToGroup(newThreadId)\n }\n }","useCallback(\n (nextValue: PortableTextBlock[]) => {\n if (nextValue) {\n // Since this is a new comment, we generate a new thread ID\n const newThreadId = uuid()\n\n // Construct the comment payload\n const nextComment: CommentCreatePayload = {\n type: 'field',\n fieldPath: PathUtils.toString(props.path),\n message: nextValue,\n parentCommentId: undefined,\n status: 'open',\n threadId: newThreadId,\n // New comments have no reactions\n reactions: EMPTY_ARRAY,\n }\n\n // Execute the create mutation\n void operation.create(nextComment)\n\n // If a comment is added to a field when viewing resolved comments, we switch\n // to open comments and scroll to the comment that was just added\n // Open the inspector when a new comment is added\n onCommentsOpen?.()\n\n if (status === 'resolved') {\n // Set the status to 'open' so that the comment is visible\n setStatus('open')\n }\n\n resetMessageValue()\n\n // Scroll to the thread\n setSelectedPath({\n threadId: newThreadId,\n origin: 'form',\n fieldPath: PathUtils.toString(props.path),\n })\n\n scrollToGroup(newThreadId)\n }\n },\n [\n onCommentsOpen,\n operation,\n props.path,\n resetMessageValue,\n scrollToGroup,\n setSelectedPath,\n setStatus,\n status,\n ],\n )","() => setAuthoringPath(null)","useCallback(() => setAuthoringPath(null), [setAuthoringPath])","(nextValue: CommentMessage) => {\n setValue(nextValue)\n messageCache.set(stringPath, nextValue)\n }","nextValue","useCallback(\n (nextValue: CommentMessage) => {\n setValue(nextValue)\n messageCache.set(stringPath, nextValue)\n },\n [stringPath],\n )","currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n readOnly={readOnly}\n value={value}\n />\n )","{\n button: currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n readOnly={readOnly}\n value={value}\n />\n ),\n hasComments,\n isAddingComment: isOpen,\n }","useMemo(\n () => ({\n button: currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n readOnly={readOnly}\n value={value}\n />\n ),\n hasComments,\n isAddingComment: isOpen,\n }),\n [\n currentUser,\n count,\n fieldTitle,\n mentionOptions,\n handleOnChange,\n handleClick,\n handleClose,\n handleCommentAdd,\n resetMessageValue,\n isOpen,\n readOnly,\n value,\n hasComments,\n ],\n )","applyCommentsFieldAttr(PathUtils.toString(props.path))","props.renderDefault({\n ...props,\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n __internal_comments: internalComments,\n })","isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )","<AnimatePresence>\n {isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )}\n </AnimatePresence>","<FieldStack {...applyCommentsFieldAttr(PathUtils.toString(props.path))} ref={rootRef}>\n {props.renderDefault({\n ...props,\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n __internal_comments: internalComments,\n })}\n\n <AnimatePresence>\n {isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )}\n </AnimatePresence>\n </FieldStack>"],"sources":["../src/core/comments-v2/hooks/useCommentsAuthoringPath.ts","../src/core/comments-v2/plugin/field/CommentsFieldButton.tsx","../src/core/comments-v2/plugin/field/CommentsField.tsx"],"sourcesContent":["import {useContext} from 'react'\nimport {CommentsAuthoringPathContextV2} from 'sanity/_singletons'\n\nimport {type CommentsAuthoringPathContextValue} from '../context/authoring-path/types'\n\n/**\n * @beta\n * @hidden\n */\nexport function useCommentsAuthoringPath(): CommentsAuthoringPathContextValue {\n const value = useContext(CommentsAuthoringPathContextV2)\n\n if (!value) {\n throw new Error('useCommentsAuthoringPath: missing context value')\n }\n\n return value\n}\n","import {AddCommentIcon} from '@sanity/icons/AddComment'\nimport {CommentIcon} from '@sanity/icons/Comment'\nimport {type CurrentUser, type PortableTextBlock} from '@sanity/types'\nimport {\n // oxlint-disable-next-line no-restricted-imports\n Button as SanityUIButton,\n useClickOutsideEvent,\n} from '@sanity/ui'\nimport {useCallback, useMemo, useRef, useState} from 'react'\nimport {styled} from 'styled-components'\nimport {Text, Flex, Icon} from 'ui5'\n\nimport {Button} from '../../../../ui-components/button/Button'\nimport {Popover} from '../../../../ui-components/popover/Popover'\nimport {Tooltip} from '../../../../ui-components/tooltip/Tooltip'\nimport {type UserListWithPermissionsHookValue} from '../../../hooks/useUserListWithPermissions'\nimport {useTranslation} from '../../../i18n/hooks/useTranslation'\nimport {Translate} from '../../../i18n/Translate'\nimport {\n CommentInput,\n type CommentInputHandle,\n} from '../../components/pte/comment-input/CommentInput'\nimport {hasCommentMessageValue} from '../../helpers'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {type CommentMessage} from '../../types'\n\nconst ContentStack = styled(Flex)`\n width: 320px;\n`\n\ninterface CommentsFieldButtonProps {\n count: number\n currentUser: CurrentUser\n fieldTitle: string\n mentionOptions: UserListWithPermissionsHookValue\n onChange: (value: PortableTextBlock[]) => void\n onClick?: () => void\n onClose: () => void\n onCommentAdd: (value: PortableTextBlock[]) => void\n onDiscard: () => void\n onInputKeyDown?: (event: React.KeyboardEvent) => void\n open: boolean\n readOnly: boolean\n value: CommentMessage\n}\n\nexport function CommentsFieldButton(props: CommentsFieldButtonProps) {\n const {\n count,\n currentUser,\n fieldTitle,\n mentionOptions,\n onChange,\n onClick,\n onClose,\n onCommentAdd,\n onDiscard,\n onInputKeyDown,\n open,\n readOnly,\n value,\n } = props\n const {t} = useTranslation(commentsLocaleNamespace)\n const popoverRef = useRef<HTMLDivElement | null>(null)\n const [addCommentButtonElement, setAddCommentButtonElement] = useState<HTMLButtonElement | null>(\n null,\n )\n const commentInputHandle = useRef<CommentInputHandle | null>(null)\n const hasComments = Boolean(count > 0)\n\n const closePopover = useCallback(() => {\n if (!open) return\n onClose()\n addCommentButtonElement?.focus()\n }, [addCommentButtonElement, open, onClose])\n\n const handleSubmit = useCallback(\n (nextValue: PortableTextBlock[]) => {\n onCommentAdd(nextValue)\n closePopover()\n },\n [closePopover, onCommentAdd],\n )\n\n const hasValue = useMemo(() => hasCommentMessageValue(value), [value])\n\n const startDiscard = useCallback(() => {\n if (!hasValue) {\n closePopover()\n return\n }\n\n commentInputHandle.current?.discardDialogController.open()\n }, [closePopover, hasValue])\n\n const handleInputKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n\n // Call parent handler\n if (onInputKeyDown) onInputKeyDown(event)\n },\n [onInputKeyDown],\n )\n\n const handleDiscardCancel = useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n }, [])\n\n const handleDiscardConfirm = useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n closePopover()\n onDiscard()\n }, [closePopover, onDiscard])\n\n const handlePopoverKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n },\n [startDiscard],\n )\n\n useClickOutsideEvent(open && startDiscard, () => [popoverRef.current])\n\n if (!hasComments) {\n const placeholder = (\n <Translate\n t={t}\n i18nKey=\"compose.add-comment-input-placeholder\"\n values={{field: fieldTitle}}\n />\n )\n\n const content = (\n <ContentStack padding={2} gap={4} flexDirection=\"column\">\n <CommentInput\n currentUser={currentUser}\n focusLock\n focusOnMount\n mentionOptions={mentionOptions}\n onChange={onChange}\n onDiscardCancel={handleDiscardCancel}\n onDiscardConfirm={handleDiscardConfirm}\n onKeyDown={handleInputKeyDown}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n readOnly={readOnly}\n ref={commentInputHandle}\n value={value}\n />\n </ContentStack>\n )\n\n return (\n <Popover\n constrainSize\n content={content}\n fallbackPlacements={['bottom-end']}\n open={open}\n placement=\"right-start\"\n portal\n ref={popoverRef}\n onKeyDown={handlePopoverKeyDown}\n >\n <div>\n <Button\n aria-label={t('field-button.aria-label-add')}\n disabled={readOnly}\n icon={AddCommentIcon}\n mode=\"bleed\"\n onClick={onClick}\n ref={setAddCommentButtonElement}\n selected={open}\n tooltipProps={{\n content: t('field-button.title'),\n placement: 'top',\n }}\n />\n </div>\n </Popover>\n )\n }\n\n return (\n <Tooltip portal placement=\"top\" content={t('field-button.content', {count})}>\n <SanityUIButton\n aria-label={t('field-button.aria-label-open')}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n gap={2}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>\n </SanityUIButton>\n </Tooltip>\n )\n}\n","import {hues} from '@sanity/color'\nimport {type Path, type PortableTextBlock} from '@sanity/types'\nimport {useBoundaryElement} from '@sanity/ui'\nimport * as PathUtils from '@sanity/util/paths'\nimport {uuid} from '@sanity/uuid'\nimport {AnimatePresence, motion, type Variants} from 'motion/react'\nimport {useCallback, useMemo, useRef, useState} from 'react'\nimport {css, styled} from 'styled-components'\nimport {VStack} from 'ui5'\n\nimport {type FieldProps} from '../../../form/types/fieldProps'\nimport {getSchemaTypeTitle} from '../../../schema/helpers'\nimport {useCurrentUser} from '../../../store/user/hooks'\nimport {COMMENTS_HIGHLIGHT_HUE_KEY} from '../../constants'\nimport {isTextSelectionComment, parseCommentFieldPath} from '../../helpers'\nimport {useComments} from '../../hooks/useComments'\nimport {useCommentsAuthoringPath} from '../../hooks/useCommentsAuthoringPath'\nimport {useCommentsEnabled} from '../../hooks/useCommentsEnabled'\nimport {applyCommentsFieldAttr, useCommentsScroll} from '../../hooks/useCommentsScroll'\nimport {useCommentsSelectedPath} from '../../hooks/useCommentsSelectedPath'\nimport {useCommentsUpsell} from '../../hooks/useCommentsUpsell'\nimport {type CommentCreatePayload, type CommentMessage, type CommentsUIMode} from '../../types'\nimport {CommentsFieldButton} from './CommentsFieldButton'\n\n// When the form is temporarily set to `readOnly` while reconnecting, the form\n// will be re-rendered and any comment that is being authored will be lost.\n// To avoid this, we cache the comment message in a map and restore it when the\n// field is re-rendered.\nconst messageCache = new Map<string, CommentMessage>()\n\nconst EMPTY_ARRAY: [] = []\n\nconst HIGHLIGHT_BLOCK_VARIANTS: Variants = {\n initial: {\n opacity: 0,\n },\n animate: {\n opacity: 1,\n },\n exit: {\n opacity: 0,\n },\n}\n\nexport function CommentsField(props: FieldProps) {\n const {enabled, mode} = useCommentsEnabled()\n\n if (!enabled) {\n return props.renderDefault(props)\n }\n\n return <CommentFieldInner {...props} mode={mode} />\n}\n\nconst HighlightDiv = styled(motion.div)(({theme}) => {\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n const {radius, space, color} = theme.sanity\n const bg = hues[COMMENTS_HIGHLIGHT_HUE_KEY][color.dark ? 900 : 50].hex\n\n return css`\n mix-blend-mode: ${color.dark ? 'screen' : 'multiply'};\n border-radius: ${radius[3]}px;\n top: -${space[2]}px;\n left: -${space[2]}px;\n bottom: -${space[2]}px;\n right: -${space[2]}px;\n pointer-events: none;\n position: absolute;\n z-index: 1;\n width: calc(100% + ${space[2] * 2}px);\n height: calc(100% + ${space[2] * 2}px);\n background-color: ${bg};\n `\n})\n\nconst FieldStack = styled(VStack)`\n position: relative;\n\n // Hide when the field component renders nothing (e.g. a custom\n // field component that returns null) to avoid an empty wrapper\n // taking up space in the form.\n &:empty:not([hidden]) {\n display: none;\n }\n`\n\nfunction CommentFieldInner(\n props: FieldProps & {\n mode: CommentsUIMode\n },\n) {\n const {mode} = props\n\n const currentUser = useCurrentUser()\n const {element: boundaryElement} = useBoundaryElement()\n\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const {\n comments,\n isCommentsOpen,\n mentionOptions,\n onCommentsOpen,\n operation,\n readOnly,\n setStatus,\n status,\n } = useComments()\n const {upsellData, handleOpenDialog} = useCommentsUpsell()\n const {selectedPath, setSelectedPath} = useCommentsSelectedPath()\n const {authoringPath, setAuthoringPath} = useCommentsAuthoringPath()\n const {scrollToGroup} = useCommentsScroll({\n boundaryElement,\n })\n\n const fieldTitle = useMemo(() => getSchemaTypeTitle(props.schemaType), [props.schemaType])\n const stringPath = useMemo(() => PathUtils.toString(props.path), [props.path])\n\n // Use the cached value if it exists as the initial value\n const cachedValue = messageCache.get(stringPath) || null\n\n const [value, setValue] = useState<PortableTextBlock[] | null>(cachedValue)\n\n // If the path of the field matches the authoring path, the comment input should be open.\n const isOpen = useMemo(() => authoringPath === stringPath, [authoringPath, stringPath])\n\n // Determine if the current field is selected\n const isSelected = useMemo(() => {\n if (!isCommentsOpen) return false\n if (selectedPath?.origin === 'form' || selectedPath?.origin === 'url') return false\n return belongsToField(selectedPath?.fieldPath, props.path)\n }, [isCommentsOpen, selectedPath?.fieldPath, selectedPath?.origin, props.path])\n\n const isInlineCommentThread = useMemo(() => {\n return comments.data.open\n .filter((c) => c.threadId === selectedPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))\n }, [comments.data.open, selectedPath?.threadId])\n\n // Total number of comments for the current field, including comments on\n // blocks nested below it (container-nested and dialog-authored comments\n // store the block's data path as their `fieldPath`).\n const count = useMemo(() => {\n const commentsCount = comments.data.open\n .map((c) => (belongsToField(c.fieldPath, props.path) ? c.commentsCount : 0))\n .reduce((acc, val) => acc + val, 0)\n\n return commentsCount || 0\n }, [comments.data.open, props.path])\n\n const hasComments = Boolean(count > 0)\n\n const resetMessageValue = useCallback(() => {\n // Reset the value and remove the message from the cache\n setValue(null)\n messageCache.delete(stringPath)\n }, [stringPath])\n\n const handleClick = useCallback(() => {\n // When clicking a comment button when the field has comments, we want to:\n if (hasComments) {\n // 1. Change the status to 'open' if it's 'resolved'\n if (status === 'resolved') {\n setStatus('open')\n }\n\n // 2. Ensure that the authoring path is reset when clicking\n // the comment button when the field has comments.\n setAuthoringPath(null)\n\n // 3. Open the comments inspector\n onCommentsOpen?.()\n\n // 4. Find the latest comment thread for the current field\n const latestThread = comments.data.open.find((c) => belongsToField(c.fieldPath, props.path))\n\n // 5. Set the latest thread ID as the selected thread ID\n // and scroll to the it. The selected path carries the thread's own\n // `fieldPath`: the inspector marks a thread selected by comparing\n // against the stored path, which for nested threads is deeper than\n // this field's path.\n if (latestThread) {\n setSelectedPath({\n threadId: latestThread.threadId,\n origin: 'form',\n fieldPath: latestThread.fieldPath,\n })\n\n scrollToGroup(latestThread.threadId)\n }\n\n return\n }\n\n if (mode === 'upsell') {\n if (upsellData) {\n handleOpenDialog('field_action')\n } else {\n // Open the comments inspector\n onCommentsOpen?.()\n }\n return\n }\n\n // If the field is open (i.e. the authoring path is set to the current field)\n // we close the field by resetting the authoring path. If the field is not open,\n // we set the authoring path to the current field so that the comment form is opened.\n setAuthoringPath(isOpen ? null : stringPath)\n }, [\n comments.data.open,\n handleOpenDialog,\n hasComments,\n isOpen,\n mode,\n onCommentsOpen,\n props.path,\n scrollToGroup,\n setAuthoringPath,\n setSelectedPath,\n setStatus,\n status,\n stringPath,\n upsellData,\n ])\n\n const handleCommentAdd = useCallback(\n (nextValue: PortableTextBlock[]) => {\n if (nextValue) {\n // Since this is a new comment, we generate a new thread ID\n const newThreadId = uuid()\n\n // Construct the comment payload\n const nextComment: CommentCreatePayload = {\n type: 'field',\n fieldPath: PathUtils.toString(props.path),\n message: nextValue,\n parentCommentId: undefined,\n status: 'open',\n threadId: newThreadId,\n // New comments have no reactions\n reactions: EMPTY_ARRAY,\n }\n\n // Execute the create mutation\n void operation.create(nextComment)\n\n // If a comment is added to a field when viewing resolved comments, we switch\n // to open comments and scroll to the comment that was just added\n // Open the inspector when a new comment is added\n onCommentsOpen?.()\n\n if (status === 'resolved') {\n // Set the status to 'open' so that the comment is visible\n setStatus('open')\n }\n\n resetMessageValue()\n\n // Scroll to the thread\n setSelectedPath({\n threadId: newThreadId,\n origin: 'form',\n fieldPath: PathUtils.toString(props.path),\n })\n\n scrollToGroup(newThreadId)\n }\n },\n [\n onCommentsOpen,\n operation,\n props.path,\n resetMessageValue,\n scrollToGroup,\n setSelectedPath,\n setStatus,\n status,\n ],\n )\n\n const handleClose = useCallback(() => setAuthoringPath(null), [setAuthoringPath])\n\n const handleOnChange = useCallback(\n (nextValue: CommentMessage) => {\n setValue(nextValue)\n messageCache.set(stringPath, nextValue)\n },\n [stringPath],\n )\n\n const internalComments: FieldProps['__internal_comments'] = useMemo(\n () => ({\n button: currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n readOnly={readOnly}\n value={value}\n />\n ),\n hasComments,\n isAddingComment: isOpen,\n }),\n [\n currentUser,\n count,\n fieldTitle,\n mentionOptions,\n handleOnChange,\n handleClick,\n handleClose,\n handleCommentAdd,\n resetMessageValue,\n isOpen,\n readOnly,\n value,\n hasComments,\n ],\n )\n\n return (\n <FieldStack {...applyCommentsFieldAttr(PathUtils.toString(props.path))} ref={rootRef}>\n {props.renderDefault({\n ...props,\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n __internal_comments: internalComments,\n })}\n\n <AnimatePresence>\n {isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )}\n </AnimatePresence>\n </FieldStack>\n )\n}\n\n/**\n * Whether a comment's stored `fieldPath` sits at or below the field's path.\n */\nfunction belongsToField(fieldPath: string | null | undefined, path: Path): boolean {\n const commentFieldPath = parseCommentFieldPath(fieldPath)\n return commentFieldPath ? PathUtils.startsWith(path, commentFieldPath) : false\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CommentsField-B7wTBRMB.js","names":["() => {\n if (!open) return\n onClose()\n addCommentButtonElement?.focus()\n }","addCommentButtonElement?.focus","useCallback(() => {\n if (!open) return\n onClose()\n addCommentButtonElement?.focus()\n }, [addCommentButtonElement, open, onClose])","(nextValue: PortableTextBlock[]) => {\n onCommentAdd(nextValue)\n closePopover()\n }","useCallback(\n (nextValue: PortableTextBlock[]) => {\n onCommentAdd(nextValue)\n closePopover()\n },\n [closePopover, onCommentAdd],\n )","hasCommentMessageValue(value)","useMemo(() => hasCommentMessageValue(value), [value])","() => {\n if (!hasValue) {\n closePopover()\n return\n }\n\n commentInputHandle.current?.discardDialogController.open()\n }","useCallback(() => {\n if (!hasValue) {\n closePopover()\n return\n }\n\n commentInputHandle.current?.discardDialogController.open()\n }, [closePopover, hasValue])","(event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n\n // Call parent handler\n if (onInputKeyDown) onInputKeyDown(event)\n }","useCallback(\n (event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n\n // Call parent handler\n if (onInputKeyDown) onInputKeyDown(event)\n },\n [onInputKeyDown],\n )","() => {\n commentInputHandle.current?.discardDialogController.close()\n }","useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n }, [])","() => {\n commentInputHandle.current?.discardDialogController.close()\n closePopover()\n onDiscard()\n }","useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n closePopover()\n onDiscard()\n }, [closePopover, onDiscard])","(event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n }","event","useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n },\n [startDiscard],\n )","() => [popoverRef.current]","{field: fieldTitle}","<Translate\n t={t}\n i18nKey=\"compose.add-comment-input-placeholder\"\n values={{field: fieldTitle}}\n />","<ContentStack padding={2} gap={4} flexDirection=\"column\">\n <CommentInput\n currentUser={currentUser}\n focusLock\n focusOnMount\n mentionOptions={mentionOptions}\n onChange={onChange}\n onDiscardCancel={handleDiscardCancel}\n onDiscardConfirm={handleDiscardConfirm}\n onKeyDown={handleInputKeyDown}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n readOnly={readOnly}\n ref={commentInputHandle}\n value={value}\n />\n </ContentStack>","['bottom-end']","t('field-button.aria-label-add')","t('field-button.title')","{\n content: t('field-button.title'),\n placement: 'top',\n }","<div>\n <Button\n aria-label={t('field-button.aria-label-add')}\n disabled={readOnly}\n icon={AddCommentIcon}\n mode=\"bleed\"\n onClick={onClick}\n ref={setAddCommentButtonElement}\n selected={open}\n tooltipProps={{\n content: t('field-button.title'),\n placement: 'top',\n }}\n />\n </div>","<Popover\n constrainSize\n content={content}\n fallbackPlacements={['bottom-end']}\n open={open}\n placement=\"right-start\"\n portal\n ref={popoverRef}\n onKeyDown={handlePopoverKeyDown}\n >\n <div>\n <Button\n aria-label={t('field-button.aria-label-add')}\n disabled={readOnly}\n icon={AddCommentIcon}\n mode=\"bleed\"\n onClick={onClick}\n ref={setAddCommentButtonElement}\n selected={open}\n tooltipProps={{\n content: t('field-button.title'),\n placement: 'top',\n }}\n />\n </div>\n </Popover>","t('field-button.content', {count})","t('field-button.aria-label-open')","<Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />","<Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>","count > 9 ? '9+' : count","<SanityUIButton\n aria-label={t('field-button.aria-label-open')}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n gap={2}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>\n </SanityUIButton>","<Tooltip portal placement=\"top\" content={t('field-button.content', {count})}>\n <SanityUIButton\n aria-label={t('field-button.aria-label-open')}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n gap={2}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>\n </SanityUIButton>\n </Tooltip>","props.renderDefault(props)","props.renderDefault","<CommentFieldInner {...props} mode={mode} />","{\n boundaryElement,\n }","getSchemaTypeTitle(props.schemaType)","schemaType","useMemo(() => getSchemaTypeTitle(props.schemaType), [props.schemaType])","PathUtils.toString(props.path)","path","useMemo(() => PathUtils.toString(props.path), [props.path])","messageCache.get(stringPath) || null","() => {\n if (!isCommentsOpen) return false\n if (selectedPath?.origin === 'form' || selectedPath?.origin === 'url') return false\n return belongsToField(selectedPath?.fieldPath, props.path)\n }","fieldPath","origin","useMemo(() => {\n if (!isCommentsOpen) return false\n if (selectedPath?.origin === 'form' || selectedPath?.origin === 'url') return false\n return belongsToField(selectedPath?.fieldPath, props.path)\n }, [isCommentsOpen, selectedPath?.fieldPath, selectedPath?.origin, props.path])","comments.data.open\n .filter((c) => c.threadId === selectedPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))","open","threadId","(c) => c.threadId === selectedPath?.threadId","(x) => isTextSelectionComment(x.parentComment)","useMemo(() => {\n return comments.data.open\n .filter((c) => c.threadId === selectedPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))\n }, [comments.data.open, selectedPath?.threadId])","comments.data.open\n .map((c) => (belongsToField(c.fieldPath, props.path) ? c.commentsCount : 0))\n .reduce((acc, val) => acc + val, 0)","(c) => (belongsToField(c.fieldPath, props.path) ? c.commentsCount : 0)","c","(acc, val) => acc + val","() => {\n // Reset the value and remove the message from the cache\n setValue(null)\n messageCache.delete(stringPath)\n }","useCallback(() => {\n // Reset the value and remove the message from the cache\n setValue(null)\n messageCache.delete(stringPath)\n }, [stringPath])","() => {\n // When clicking a comment button when the field has comments, we want to:\n if (hasComments) {\n // 1. Change the status to 'open' if it's 'resolved'\n if (status === 'resolved') {\n setStatus('open')\n }\n\n // 2. Ensure that the authoring path is reset when clicking\n // the comment button when the field has comments.\n setAuthoringPath(null)\n\n // 3. Open the comments inspector\n onCommentsOpen?.()\n\n // 4. Find the latest comment thread for the current field\n const latestThread = comments.data.open.find((c) => belongsToField(c.fieldPath, props.path))\n\n // 5. Set the latest thread ID as the selected thread ID\n // and scroll to the it. The selected path carries the thread's own\n // `fieldPath`: the inspector marks a thread selected by comparing\n // against the stored path, which for nested threads is deeper than\n // this field's path.\n if (latestThread) {\n setSelectedPath({\n threadId: latestThread.threadId,\n origin: 'form',\n fieldPath: latestThread.fieldPath,\n })\n\n scrollToGroup(latestThread.threadId)\n }\n\n return\n }\n\n if (mode === 'upsell') {\n if (upsellData) {\n handleOpenDialog('field_action')\n } else {\n // Open the comments inspector\n onCommentsOpen?.()\n }\n return\n }\n\n // If the field is open (i.e. the authoring path is set to the current field)\n // we close the field by resetting the authoring path. If the field is not open,\n // we set the authoring path to the current field so that the comment form is opened.\n setAuthoringPath(isOpen ? null : stringPath)\n }","useCallback(() => {\n // When clicking a comment button when the field has comments, we want to:\n if (hasComments) {\n // 1. Change the status to 'open' if it's 'resolved'\n if (status === 'resolved') {\n setStatus('open')\n }\n\n // 2. Ensure that the authoring path is reset when clicking\n // the comment button when the field has comments.\n setAuthoringPath(null)\n\n // 3. Open the comments inspector\n onCommentsOpen?.()\n\n // 4. Find the latest comment thread for the current field\n const latestThread = comments.data.open.find((c) => belongsToField(c.fieldPath, props.path))\n\n // 5. Set the latest thread ID as the selected thread ID\n // and scroll to the it. The selected path carries the thread's own\n // `fieldPath`: the inspector marks a thread selected by comparing\n // against the stored path, which for nested threads is deeper than\n // this field's path.\n if (latestThread) {\n setSelectedPath({\n threadId: latestThread.threadId,\n origin: 'form',\n fieldPath: latestThread.fieldPath,\n })\n\n scrollToGroup(latestThread.threadId)\n }\n\n return\n }\n\n if (mode === 'upsell') {\n if (upsellData) {\n handleOpenDialog('field_action')\n } else {\n // Open the comments inspector\n onCommentsOpen?.()\n }\n return\n }\n\n // If the field is open (i.e. the authoring path is set to the current field)\n // we close the field by resetting the authoring path. If the field is not open,\n // we set the authoring path to the current field so that the comment form is opened.\n setAuthoringPath(isOpen ? null : stringPath)\n }, [\n comments.data.open,\n handleOpenDialog,\n hasComments,\n isOpen,\n mode,\n onCommentsOpen,\n props.path,\n scrollToGroup,\n setAuthoringPath,\n setSelectedPath,\n setStatus,\n status,\n stringPath,\n upsellData,\n ])","(nextValue: PortableTextBlock[]) => {\n if (nextValue) {\n // Since this is a new comment, we generate a new thread ID\n const newThreadId = uuid()\n\n // Construct the comment payload\n const nextComment: CommentCreatePayload = {\n type: 'field',\n fieldPath: PathUtils.toString(props.path),\n message: nextValue,\n parentCommentId: undefined,\n status: 'open',\n threadId: newThreadId,\n // New comments have no reactions\n reactions: EMPTY_ARRAY,\n }\n\n // Execute the create mutation\n void operation.create(nextComment)\n\n // If a comment is added to a field when viewing resolved comments, we switch\n // to open comments and scroll to the comment that was just added\n // Open the inspector when a new comment is added\n onCommentsOpen?.()\n\n if (status === 'resolved') {\n // Set the status to 'open' so that the comment is visible\n setStatus('open')\n }\n\n resetMessageValue()\n\n // Scroll to the thread\n setSelectedPath({\n threadId: newThreadId,\n origin: 'form',\n fieldPath: PathUtils.toString(props.path),\n })\n\n scrollToGroup(newThreadId)\n }\n }","useCallback(\n (nextValue: PortableTextBlock[]) => {\n if (nextValue) {\n // Since this is a new comment, we generate a new thread ID\n const newThreadId = uuid()\n\n // Construct the comment payload\n const nextComment: CommentCreatePayload = {\n type: 'field',\n fieldPath: PathUtils.toString(props.path),\n message: nextValue,\n parentCommentId: undefined,\n status: 'open',\n threadId: newThreadId,\n // New comments have no reactions\n reactions: EMPTY_ARRAY,\n }\n\n // Execute the create mutation\n void operation.create(nextComment)\n\n // If a comment is added to a field when viewing resolved comments, we switch\n // to open comments and scroll to the comment that was just added\n // Open the inspector when a new comment is added\n onCommentsOpen?.()\n\n if (status === 'resolved') {\n // Set the status to 'open' so that the comment is visible\n setStatus('open')\n }\n\n resetMessageValue()\n\n // Scroll to the thread\n setSelectedPath({\n threadId: newThreadId,\n origin: 'form',\n fieldPath: PathUtils.toString(props.path),\n })\n\n scrollToGroup(newThreadId)\n }\n },\n [\n onCommentsOpen,\n operation,\n props.path,\n resetMessageValue,\n scrollToGroup,\n setSelectedPath,\n setStatus,\n status,\n ],\n )","() => setAuthoringPath(null)","useCallback(() => setAuthoringPath(null), [setAuthoringPath])","(nextValue: CommentMessage) => {\n setValue(nextValue)\n messageCache.set(stringPath, nextValue)\n }","nextValue","useCallback(\n (nextValue: CommentMessage) => {\n setValue(nextValue)\n messageCache.set(stringPath, nextValue)\n },\n [stringPath],\n )","currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n readOnly={readOnly}\n value={value}\n />\n )","{\n button: currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n readOnly={readOnly}\n value={value}\n />\n ),\n hasComments,\n isAddingComment: isOpen,\n }","useMemo(\n () => ({\n button: currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n readOnly={readOnly}\n value={value}\n />\n ),\n hasComments,\n isAddingComment: isOpen,\n }),\n [\n currentUser,\n count,\n fieldTitle,\n mentionOptions,\n handleOnChange,\n handleClick,\n handleClose,\n handleCommentAdd,\n resetMessageValue,\n isOpen,\n readOnly,\n value,\n hasComments,\n ],\n )","applyCommentsFieldAttr(PathUtils.toString(props.path))","props.renderDefault({\n ...props,\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n __internal_comments: internalComments,\n })","isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )","<AnimatePresence>\n {isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )}\n </AnimatePresence>","<FieldStack {...applyCommentsFieldAttr(PathUtils.toString(props.path))} ref={rootRef}>\n {props.renderDefault({\n ...props,\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n __internal_comments: internalComments,\n })}\n\n <AnimatePresence>\n {isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )}\n </AnimatePresence>\n </FieldStack>"],"sources":["../src/core/comments-v2/hooks/useCommentsAuthoringPath.ts","../src/core/comments-v2/plugin/field/CommentsFieldButton.tsx","../src/core/comments-v2/plugin/field/CommentsField.tsx"],"sourcesContent":["import {useContext} from 'react'\nimport {CommentsAuthoringPathContextV2} from 'sanity/_singletons'\n\nimport {type CommentsAuthoringPathContextValue} from '../context/authoring-path/types'\n\n/**\n * @beta\n * @hidden\n */\nexport function useCommentsAuthoringPath(): CommentsAuthoringPathContextValue {\n const value = useContext(CommentsAuthoringPathContextV2)\n\n if (!value) {\n throw new Error('useCommentsAuthoringPath: missing context value')\n }\n\n return value\n}\n","import {AddCommentIcon} from '@sanity/icons/AddComment'\nimport {CommentIcon} from '@sanity/icons/Comment'\nimport {type CurrentUser, type PortableTextBlock} from '@sanity/types'\nimport {\n // oxlint-disable-next-line no-restricted-imports\n Button as SanityUIButton,\n useClickOutsideEvent,\n} from '@sanity/ui'\nimport {useCallback, useMemo, useRef, useState} from 'react'\nimport {styled} from 'styled-components'\nimport {Text, Flex, Icon} from 'ui5'\n\nimport {Button} from '../../../../ui-components/button/Button'\nimport {Popover} from '../../../../ui-components/popover/Popover'\nimport {Tooltip} from '../../../../ui-components/tooltip/Tooltip'\nimport {type UserListWithPermissionsHookValue} from '../../../hooks/useUserListWithPermissions'\nimport {useTranslation} from '../../../i18n/hooks/useTranslation'\nimport {Translate} from '../../../i18n/Translate'\nimport {\n CommentInput,\n type CommentInputHandle,\n} from '../../components/pte/comment-input/CommentInput'\nimport {hasCommentMessageValue} from '../../helpers'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {type CommentMessage} from '../../types'\n\nconst ContentStack = styled(Flex)`\n width: 320px;\n`\n\ninterface CommentsFieldButtonProps {\n count: number\n currentUser: CurrentUser\n fieldTitle: string\n mentionOptions: UserListWithPermissionsHookValue\n onChange: (value: PortableTextBlock[]) => void\n onClick?: () => void\n onClose: () => void\n onCommentAdd: (value: PortableTextBlock[]) => void\n onDiscard: () => void\n onInputKeyDown?: (event: React.KeyboardEvent) => void\n open: boolean\n readOnly: boolean\n value: CommentMessage\n}\n\nexport function CommentsFieldButton(props: CommentsFieldButtonProps) {\n const {\n count,\n currentUser,\n fieldTitle,\n mentionOptions,\n onChange,\n onClick,\n onClose,\n onCommentAdd,\n onDiscard,\n onInputKeyDown,\n open,\n readOnly,\n value,\n } = props\n const {t} = useTranslation(commentsLocaleNamespace)\n const popoverRef = useRef<HTMLDivElement | null>(null)\n const [addCommentButtonElement, setAddCommentButtonElement] = useState<HTMLButtonElement | null>(\n null,\n )\n const commentInputHandle = useRef<CommentInputHandle | null>(null)\n const hasComments = Boolean(count > 0)\n\n const closePopover = useCallback(() => {\n if (!open) return\n onClose()\n addCommentButtonElement?.focus()\n }, [addCommentButtonElement, open, onClose])\n\n const handleSubmit = useCallback(\n (nextValue: PortableTextBlock[]) => {\n onCommentAdd(nextValue)\n closePopover()\n },\n [closePopover, onCommentAdd],\n )\n\n const hasValue = useMemo(() => hasCommentMessageValue(value), [value])\n\n const startDiscard = useCallback(() => {\n if (!hasValue) {\n closePopover()\n return\n }\n\n commentInputHandle.current?.discardDialogController.open()\n }, [closePopover, hasValue])\n\n const handleInputKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n\n // Call parent handler\n if (onInputKeyDown) onInputKeyDown(event)\n },\n [onInputKeyDown],\n )\n\n const handleDiscardCancel = useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n }, [])\n\n const handleDiscardConfirm = useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n closePopover()\n onDiscard()\n }, [closePopover, onDiscard])\n\n const handlePopoverKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n },\n [startDiscard],\n )\n\n useClickOutsideEvent(open && startDiscard, () => [popoverRef.current])\n\n if (!hasComments) {\n const placeholder = (\n <Translate\n t={t}\n i18nKey=\"compose.add-comment-input-placeholder\"\n values={{field: fieldTitle}}\n />\n )\n\n const content = (\n <ContentStack padding={2} gap={4} flexDirection=\"column\">\n <CommentInput\n currentUser={currentUser}\n focusLock\n focusOnMount\n mentionOptions={mentionOptions}\n onChange={onChange}\n onDiscardCancel={handleDiscardCancel}\n onDiscardConfirm={handleDiscardConfirm}\n onKeyDown={handleInputKeyDown}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n readOnly={readOnly}\n ref={commentInputHandle}\n value={value}\n />\n </ContentStack>\n )\n\n return (\n <Popover\n constrainSize\n content={content}\n fallbackPlacements={['bottom-end']}\n open={open}\n placement=\"right-start\"\n portal\n ref={popoverRef}\n onKeyDown={handlePopoverKeyDown}\n >\n <div>\n <Button\n aria-label={t('field-button.aria-label-add')}\n disabled={readOnly}\n icon={AddCommentIcon}\n mode=\"bleed\"\n onClick={onClick}\n ref={setAddCommentButtonElement}\n selected={open}\n tooltipProps={{\n content: t('field-button.title'),\n placement: 'top',\n }}\n />\n </div>\n </Popover>\n )\n }\n\n return (\n <Tooltip portal placement=\"top\" content={t('field-button.content', {count})}>\n <SanityUIButton\n aria-label={t('field-button.aria-label-open')}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n gap={2}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>\n </SanityUIButton>\n </Tooltip>\n )\n}\n","import {hues} from '@sanity/color'\nimport {type Path, type PortableTextBlock} from '@sanity/types'\nimport {useBoundaryElement} from '@sanity/ui'\nimport * as PathUtils from '@sanity/util/paths'\nimport {uuid} from '@sanity/uuid'\nimport {AnimatePresence, motion, type Variants} from 'motion/react'\nimport {useCallback, useMemo, useRef, useState} from 'react'\nimport {css, styled} from 'styled-components'\nimport {VStack} from 'ui5'\n\nimport {type FieldProps} from '../../../form/types/fieldProps'\nimport {getSchemaTypeTitle} from '../../../schema/helpers'\nimport {useCurrentUser} from '../../../store/user/hooks'\nimport {COMMENTS_HIGHLIGHT_HUE_KEY} from '../../constants'\nimport {isTextSelectionComment, parseCommentFieldPath} from '../../helpers'\nimport {useComments} from '../../hooks/useComments'\nimport {useCommentsAuthoringPath} from '../../hooks/useCommentsAuthoringPath'\nimport {useCommentsEnabled} from '../../hooks/useCommentsEnabled'\nimport {applyCommentsFieldAttr, useCommentsScroll} from '../../hooks/useCommentsScroll'\nimport {useCommentsSelectedPath} from '../../hooks/useCommentsSelectedPath'\nimport {useCommentsUpsell} from '../../hooks/useCommentsUpsell'\nimport {type CommentCreatePayload, type CommentMessage, type CommentsUIMode} from '../../types'\nimport {CommentsFieldButton} from './CommentsFieldButton'\n\n// When the form is temporarily set to `readOnly` while reconnecting, the form\n// will be re-rendered and any comment that is being authored will be lost.\n// To avoid this, we cache the comment message in a map and restore it when the\n// field is re-rendered.\nconst messageCache = new Map<string, CommentMessage>()\n\nconst EMPTY_ARRAY: [] = []\n\nconst HIGHLIGHT_BLOCK_VARIANTS: Variants = {\n initial: {\n opacity: 0,\n },\n animate: {\n opacity: 1,\n },\n exit: {\n opacity: 0,\n },\n}\n\nexport function CommentsField(props: FieldProps) {\n const {enabled, mode} = useCommentsEnabled()\n\n if (!enabled) {\n return props.renderDefault(props)\n }\n\n return <CommentFieldInner {...props} mode={mode} />\n}\n\nconst HighlightDiv = styled(motion.div)(({theme}) => {\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n const {radius, space, color} = theme.sanity\n const bg = hues[COMMENTS_HIGHLIGHT_HUE_KEY][color.dark ? 900 : 50].hex\n\n return css`\n mix-blend-mode: ${color.dark ? 'screen' : 'multiply'};\n border-radius: ${radius[3]}px;\n top: -${space[2]}px;\n left: -${space[2]}px;\n bottom: -${space[2]}px;\n right: -${space[2]}px;\n pointer-events: none;\n position: absolute;\n z-index: 1;\n width: calc(100% + ${space[2] * 2}px);\n height: calc(100% + ${space[2] * 2}px);\n background-color: ${bg};\n `\n})\n\nconst FieldStack = styled(VStack)`\n position: relative;\n\n // Hide when the field component renders nothing (e.g. a custom\n // field component that returns null) to avoid an empty wrapper\n // taking up space in the form.\n &:empty:not([hidden]) {\n display: none;\n }\n`\n\nfunction CommentFieldInner(\n props: FieldProps & {\n mode: CommentsUIMode\n },\n) {\n const {mode} = props\n\n const currentUser = useCurrentUser()\n const {element: boundaryElement} = useBoundaryElement()\n\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const {\n comments,\n isCommentsOpen,\n mentionOptions,\n onCommentsOpen,\n operation,\n readOnly,\n setStatus,\n status,\n } = useComments()\n const {upsellData, handleOpenDialog} = useCommentsUpsell()\n const {selectedPath, setSelectedPath} = useCommentsSelectedPath()\n const {authoringPath, setAuthoringPath} = useCommentsAuthoringPath()\n const {scrollToGroup} = useCommentsScroll({\n boundaryElement,\n })\n\n const fieldTitle = useMemo(() => getSchemaTypeTitle(props.schemaType), [props.schemaType])\n const stringPath = useMemo(() => PathUtils.toString(props.path), [props.path])\n\n // Use the cached value if it exists as the initial value\n const cachedValue = messageCache.get(stringPath) || null\n\n const [value, setValue] = useState<PortableTextBlock[] | null>(cachedValue)\n\n // If the path of the field matches the authoring path, the comment input should be open.\n const isOpen = useMemo(() => authoringPath === stringPath, [authoringPath, stringPath])\n\n // Determine if the current field is selected\n const isSelected = useMemo(() => {\n if (!isCommentsOpen) return false\n if (selectedPath?.origin === 'form' || selectedPath?.origin === 'url') return false\n return belongsToField(selectedPath?.fieldPath, props.path)\n }, [isCommentsOpen, selectedPath?.fieldPath, selectedPath?.origin, props.path])\n\n const isInlineCommentThread = useMemo(() => {\n return comments.data.open\n .filter((c) => c.threadId === selectedPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))\n }, [comments.data.open, selectedPath?.threadId])\n\n // Total number of comments for the current field, including comments on\n // blocks nested below it (container-nested and dialog-authored comments\n // store the block's data path as their `fieldPath`).\n const count = useMemo(() => {\n const commentsCount = comments.data.open\n .map((c) => (belongsToField(c.fieldPath, props.path) ? c.commentsCount : 0))\n .reduce((acc, val) => acc + val, 0)\n\n return commentsCount || 0\n }, [comments.data.open, props.path])\n\n const hasComments = Boolean(count > 0)\n\n const resetMessageValue = useCallback(() => {\n // Reset the value and remove the message from the cache\n setValue(null)\n messageCache.delete(stringPath)\n }, [stringPath])\n\n const handleClick = useCallback(() => {\n // When clicking a comment button when the field has comments, we want to:\n if (hasComments) {\n // 1. Change the status to 'open' if it's 'resolved'\n if (status === 'resolved') {\n setStatus('open')\n }\n\n // 2. Ensure that the authoring path is reset when clicking\n // the comment button when the field has comments.\n setAuthoringPath(null)\n\n // 3. Open the comments inspector\n onCommentsOpen?.()\n\n // 4. Find the latest comment thread for the current field\n const latestThread = comments.data.open.find((c) => belongsToField(c.fieldPath, props.path))\n\n // 5. Set the latest thread ID as the selected thread ID\n // and scroll to the it. The selected path carries the thread's own\n // `fieldPath`: the inspector marks a thread selected by comparing\n // against the stored path, which for nested threads is deeper than\n // this field's path.\n if (latestThread) {\n setSelectedPath({\n threadId: latestThread.threadId,\n origin: 'form',\n fieldPath: latestThread.fieldPath,\n })\n\n scrollToGroup(latestThread.threadId)\n }\n\n return\n }\n\n if (mode === 'upsell') {\n if (upsellData) {\n handleOpenDialog('field_action')\n } else {\n // Open the comments inspector\n onCommentsOpen?.()\n }\n return\n }\n\n // If the field is open (i.e. the authoring path is set to the current field)\n // we close the field by resetting the authoring path. If the field is not open,\n // we set the authoring path to the current field so that the comment form is opened.\n setAuthoringPath(isOpen ? null : stringPath)\n }, [\n comments.data.open,\n handleOpenDialog,\n hasComments,\n isOpen,\n mode,\n onCommentsOpen,\n props.path,\n scrollToGroup,\n setAuthoringPath,\n setSelectedPath,\n setStatus,\n status,\n stringPath,\n upsellData,\n ])\n\n const handleCommentAdd = useCallback(\n (nextValue: PortableTextBlock[]) => {\n if (nextValue) {\n // Since this is a new comment, we generate a new thread ID\n const newThreadId = uuid()\n\n // Construct the comment payload\n const nextComment: CommentCreatePayload = {\n type: 'field',\n fieldPath: PathUtils.toString(props.path),\n message: nextValue,\n parentCommentId: undefined,\n status: 'open',\n threadId: newThreadId,\n // New comments have no reactions\n reactions: EMPTY_ARRAY,\n }\n\n // Execute the create mutation\n void operation.create(nextComment)\n\n // If a comment is added to a field when viewing resolved comments, we switch\n // to open comments and scroll to the comment that was just added\n // Open the inspector when a new comment is added\n onCommentsOpen?.()\n\n if (status === 'resolved') {\n // Set the status to 'open' so that the comment is visible\n setStatus('open')\n }\n\n resetMessageValue()\n\n // Scroll to the thread\n setSelectedPath({\n threadId: newThreadId,\n origin: 'form',\n fieldPath: PathUtils.toString(props.path),\n })\n\n scrollToGroup(newThreadId)\n }\n },\n [\n onCommentsOpen,\n operation,\n props.path,\n resetMessageValue,\n scrollToGroup,\n setSelectedPath,\n setStatus,\n status,\n ],\n )\n\n const handleClose = useCallback(() => setAuthoringPath(null), [setAuthoringPath])\n\n const handleOnChange = useCallback(\n (nextValue: CommentMessage) => {\n setValue(nextValue)\n messageCache.set(stringPath, nextValue)\n },\n [stringPath],\n )\n\n const internalComments: FieldProps['__internal_comments'] = useMemo(\n () => ({\n button: currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n readOnly={readOnly}\n value={value}\n />\n ),\n hasComments,\n isAddingComment: isOpen,\n }),\n [\n currentUser,\n count,\n fieldTitle,\n mentionOptions,\n handleOnChange,\n handleClick,\n handleClose,\n handleCommentAdd,\n resetMessageValue,\n isOpen,\n readOnly,\n value,\n hasComments,\n ],\n )\n\n return (\n <FieldStack {...applyCommentsFieldAttr(PathUtils.toString(props.path))} ref={rootRef}>\n {props.renderDefault({\n ...props,\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n __internal_comments: internalComments,\n })}\n\n <AnimatePresence>\n {isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )}\n </AnimatePresence>\n </FieldStack>\n )\n}\n\n/**\n * Whether a comment's stored `fieldPath` sits at or below the field's path.\n */\nfunction belongsToField(fieldPath: string | null | undefined, path: Path): boolean {\n const commentFieldPath = parseCommentFieldPath(fieldPath)\n return commentFieldPath ? PathUtils.startsWith(path, commentFieldPath) : false\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import { Yt as getSchemaTypeTitle } from "./PerspectiveProvider-Yk7lgugx.js";
1
+ import { Yt as getSchemaTypeTitle } from "./PerspectiveProvider-D-6sweQH.js";
2
2
  import { t as useTranslation } from "./useTranslation-Cqs6Itwv.js";
3
3
  import { o as Button$1, s as Tooltip } from "./Tab-Dx6d0Ug4.js";
4
4
  import { t as Translate } from "./Translate-YUHPpk6j.js";
5
- import { n as useCurrentUser } from "./LoadingBlock-Ch_dBXfn.js";
5
+ import { n as useCurrentUser } from "./LoadingBlock-CElIdb7F.js";
6
6
  import { r as Popover } from "./MenuGroup-DwiYr9LF.js";
7
- import { b as commentsLocaleNamespace, d as hasCommentMessageValue, f as isTextSelectionComment, g as applyCommentsFieldAttr, n as COMMENTS_HIGHLIGHT_HUE_KEY, o as CommentInput, p as parseCommentFieldPath, t as useComments, y as useCommentsScroll } from "./useComments-BGOJwUe0.js";
7
+ import { b as commentsLocaleNamespace, d as hasCommentMessageValue, f as isTextSelectionComment, g as applyCommentsFieldAttr, n as COMMENTS_HIGHLIGHT_HUE_KEY, o as CommentInput, p as parseCommentFieldPath, t as useComments, y as useCommentsScroll } from "./useComments-DWh1k0kS.js";
8
8
  import { t as useAddonDataset } from "./useAddonDataset-BvCgByG6.js";
9
9
  import { t as useCommentsEnabled } from "./useCommentsEnabled-BPc3788v.js";
10
10
  import { t as useCommentsSelectedPath } from "./useCommentsSelectedPath-D5HXM3NF.js";
@@ -333,4 +333,4 @@ function belongsToField(fieldPath, path) {
333
333
  }
334
334
  export { CommentsField };
335
335
 
336
- //# sourceMappingURL=CommentsField-YM3cp3fA.js.map
336
+ //# sourceMappingURL=CommentsField-BxoVuJOl.js.map