@brightspot/ui 3.0.1-cms-ui-migration.0 → 3.0.1-cms-ui-migration.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 (719) hide show
  1. package/dist/custom-elements.json +1508 -1508
  2. package/dist/storybook/assets/{ActionBar.stories-CXEvFUN5.js → ActionBar.stories-BhdqLyzJ.js} +1 -1
  3. package/dist/storybook/assets/{ActionItem.stories-8-qQmVGz.js → ActionItem.stories-17zjMCkO.js} +1 -1
  4. package/dist/storybook/assets/{Avatar.stories-LOTCiTgV.js → Avatar.stories-C5m3-zOH.js} +1 -1
  5. package/dist/storybook/assets/{AvatarGroup.stories-N17TVn4O.js → AvatarGroup.stories-DE88PJ6w.js} +1 -1
  6. package/dist/storybook/assets/{Badge.stories-2IRfk8Ri.js → Badge.stories-D905HmvO.js} +1 -1
  7. package/dist/storybook/assets/{Button-CQ2CjiFm.js → Button-ANyLESGb.js} +1 -1
  8. package/dist/storybook/assets/{Button.stories-DwyviUHj.js → Button.stories-DbH6q5L3.js} +1 -1
  9. package/dist/storybook/assets/{ButtonGroup.stories-D6nkkXxD.js → ButtonGroup.stories-loqgAB7p.js} +1 -1
  10. package/dist/storybook/assets/{Celebrate.stories-DtKNptXA.js → Celebrate.stories-CRO3rSgp.js} +1 -1
  11. package/dist/storybook/assets/{Checkbox.stories--fetKLgV.js → Checkbox.stories-SZtgfbFe.js} +1 -1
  12. package/dist/storybook/assets/{CircularProgress.stories-vK3MWdEg.js → CircularProgress.stories-VayPxO4M.js} +1 -1
  13. package/dist/storybook/assets/{ClipboardMixin.stories-BXOX2e9A.js → ClipboardMixin.stories-0EB2O2zT.js} +1 -1
  14. package/dist/storybook/assets/{Color-6BZIO3FS-DIO6ExZa.js → Color-6BZIO3FS-CFpcD80i.js} +1 -1
  15. package/dist/storybook/assets/{Colors.stories-Z-o0Dmyi.js → Colors.stories-BJGM6xnp.js} +1 -1
  16. package/dist/storybook/assets/{CombinedEffects.stories-BIvRmEL2.js → CombinedEffects.stories-DUwocYcn.js} +1 -1
  17. package/dist/storybook/assets/{ComponentStatesMixin-BeLIKOsg.js → ComponentStatesMixin-MUqdPCf7.js} +1 -1
  18. package/dist/storybook/assets/{ComponentStatesMixin.stories-u03jgLUU.js → ComponentStatesMixin.stories-DjrxNwE7.js} +1 -1
  19. package/dist/storybook/assets/{CopyToClipboard.stories-D23guAYu.js → CopyToClipboard.stories-DptOcPq6.js} +1 -1
  20. package/dist/storybook/assets/{Debounce.stories-Bz3JaQJY.js → Debounce.stories-BbcIWmhD.js} +1 -1
  21. package/dist/storybook/assets/{DocsRenderer-LL677BLK-CaEKjMeC.js → DocsRenderer-LL677BLK-Yy8fjeNG.js} +3 -3
  22. package/dist/storybook/assets/{Dropdown.stories-CNxtx8UX.js → Dropdown.stories-Du3LrBR6.js} +1 -1
  23. package/dist/storybook/assets/{EmptyState.stories-Ck5T6q1T.js → EmptyState.stories-Dy9P8aOY.js} +1 -1
  24. package/dist/storybook/assets/{Events.stories-Cx10pvVB.js → Events.stories-DvdVQxDf.js} +1 -1
  25. package/dist/storybook/assets/{Heading.stories-mbkSoA5r.js → Heading.stories-BQ1jFOKn.js} +1 -1
  26. package/dist/storybook/assets/{HueRipple.stories-B-DDviMh.js → HueRipple.stories-CrZFjnRl.js} +1 -1
  27. package/dist/storybook/assets/{Icon.stories-Dodo1jjZ.js → Icon.stories-C2Tj8Lx1.js} +1 -1
  28. package/dist/storybook/assets/{IconButton.stories-eAU6vNiX.js → IconButton.stories-DFqouOJb.js} +1 -1
  29. package/dist/storybook/assets/{LinearProgress.stories-BqAUCgwy.js → LinearProgress.stories-DtNw3QX3.js} +1 -1
  30. package/dist/storybook/assets/{Pagination.stories-CVK8mlEU.js → Pagination.stories-CFiZ9APs.js} +1 -1
  31. package/dist/storybook/assets/{Popover.stories-CC2R-jiv.js → Popover.stories-DkkTuYag.js} +1 -1
  32. package/dist/storybook/assets/{ReadyMixin-CAkCCAOH.js → ReadyMixin-BA01Vm_B.js} +1 -1
  33. package/dist/storybook/assets/{RovingTabindexMixin.stories-Dgm5izU_.js → RovingTabindexMixin.stories-BesAqt48.js} +1 -1
  34. package/dist/storybook/assets/{Rtc.stories-D9uVCq71.js → Rtc.stories-iTw43rjp.js} +1 -1
  35. package/dist/storybook/assets/{ScrollShadow.stories-D5GJ6Zes.js → ScrollShadow.stories-QYqQCcAo.js} +1 -1
  36. package/dist/storybook/assets/{Switch.stories-D7HV0v6i.js → Switch.stories-BKArq9Mk.js} +1 -1
  37. package/dist/storybook/assets/{Tab.stories-CwHBngmO.js → Tab.stories-8UdDPvE5.js} +1 -1
  38. package/dist/storybook/assets/{Tabs.stories-D87ILflp.js → Tabs.stories-BPGMZ552.js} +1 -1
  39. package/dist/storybook/assets/{Throttle.stories-C13Vl7yt.js → Throttle.stories-CYl5d0r6.js} +1 -1
  40. package/dist/storybook/assets/{Tooltip.stories-BRmAKppC.js → Tooltip.stories-cZ0zSlwX.js} +1 -1
  41. package/dist/storybook/assets/{Upload.stories-CvceXasD.js → Upload.stories-CPC7N0Ed.js} +1 -1
  42. package/dist/storybook/assets/{UploadItem.stories-BF6c7tVM.js → UploadItem.stories-D0LClT0a.js} +1 -1
  43. package/dist/storybook/assets/{Welcome.stories-Ciht_H8A.js → Welcome.stories-C8JUaRas.js} +1 -1
  44. package/dist/storybook/assets/{Widget.stories-30UYw1gn.js → Widget.stories-C1FxF24-.js} +1 -1
  45. package/dist/storybook/assets/{WithTooltip-65CFNBJE-Q8AG_oZS.js → WithTooltip-65CFNBJE-BMBo-fie.js} +1 -1
  46. package/dist/storybook/assets/{blocks-DIrsUt2U.js → blocks-BTsuXRXZ.js} +5 -5
  47. package/dist/storybook/assets/{formatter-EIJCOSYU-BcNb3EA1.js → formatter-EIJCOSYU-BJ1Cwrpx.js} +1 -1
  48. package/dist/storybook/assets/if-defined-BPCd2NXs.js +1 -0
  49. package/dist/storybook/assets/{iframe-D5Uwm8Zd.js → iframe-B3YWTqkR.js} +4 -4
  50. package/dist/storybook/assets/{index-BOlx3-q7.js → index-BBUTVEdP.js} +1 -1
  51. package/dist/storybook/assets/{onFind-Cp2DO8R2.js → onFind-NC0lGo-r.js} +1 -1
  52. package/dist/storybook/assets/{onFind.stories-BDK06xaW.js → onFind.stories-CqbwQgQF.js} +1 -1
  53. package/dist/storybook/assets/{onRemove.stories-TSKvqih3.js → onRemove.stories-Y8Ycs77o.js} +1 -1
  54. package/dist/storybook/assets/{onVisible.stories-DiOPobn8.js → onVisible.stories-CcLUE35q.js} +1 -1
  55. package/dist/storybook/assets/{style-map-Cy6U2K_U.js → style-map-MSB_ngx3.js} +1 -1
  56. package/dist/storybook/assets/{syntaxhighlighter-ED5Y7EFY-NNCQVsSv.js → syntaxhighlighter-ED5Y7EFY-BjkjEDMG.js} +1 -1
  57. package/dist/storybook/iframe.html +1 -1
  58. package/dist/storybook/project.json +1 -1
  59. package/package.json +2 -2
  60. package/src/legacy/tool-ui/src/AIInline.css +123 -0
  61. package/src/legacy/tool-ui/src/ActionBar.css +41 -0
  62. package/src/legacy/tool-ui/src/Admin.css +258 -0
  63. package/src/legacy/tool-ui/src/AdobeStock.css +3 -0
  64. package/src/legacy/tool-ui/src/AnalyticsWidget.css +34 -0
  65. package/src/legacy/tool-ui/src/AnalyticsWidget.ts +158 -0
  66. package/src/legacy/tool-ui/src/Apis.css +31 -0
  67. package/src/legacy/tool-ui/src/AppetizeioEmbedded.css +58 -0
  68. package/src/legacy/tool-ui/src/AssociatedContentWidget.css +68 -0
  69. package/src/legacy/tool-ui/src/AutoExpand.css +33 -0
  70. package/src/legacy/tool-ui/src/Avatar.css +31 -0
  71. package/src/legacy/tool-ui/src/BackgroundTasks.css +29 -0
  72. package/src/legacy/tool-ui/src/Base.css +80 -0
  73. package/src/legacy/tool-ui/src/Board.css +160 -0
  74. package/src/legacy/tool-ui/src/Board.ts +515 -0
  75. package/src/legacy/tool-ui/src/BroadcastAlertBanner.ts +93 -0
  76. package/src/legacy/tool-ui/src/BulkUpload.css +51 -0
  77. package/src/legacy/tool-ui/src/BulkWorkflow.css +47 -0
  78. package/src/legacy/tool-ui/src/BulkWorkflow.ts +110 -0
  79. package/src/legacy/tool-ui/src/BulletedList.css +11 -0
  80. package/src/legacy/tool-ui/src/CIGCluster/README.md +32 -0
  81. package/src/legacy/tool-ui/src/CIGCluster/index.ts +144 -0
  82. package/src/legacy/tool-ui/src/CIGCluster.css +60 -0
  83. package/src/legacy/tool-ui/src/Calendar.css +110 -0
  84. package/src/legacy/tool-ui/src/Card.css +28 -0
  85. package/src/legacy/tool-ui/src/Celebrate.ts +87 -0
  86. package/src/legacy/tool-ui/src/Chart.ts +53 -0
  87. package/src/legacy/tool-ui/src/ChartCompat.ts +413 -0
  88. package/src/legacy/tool-ui/src/ChartTable.ts +22 -0
  89. package/src/legacy/tool-ui/src/Checkbox.css +22 -0
  90. package/src/legacy/tool-ui/src/CodeMirror.css +161 -0
  91. package/src/legacy/tool-ui/src/Collections.css +74 -0
  92. package/src/legacy/tool-ui/src/ColorInputSpectrum.css +140 -0
  93. package/src/legacy/tool-ui/src/ComboInput.css +253 -0
  94. package/src/legacy/tool-ui/src/Compat.css +383 -0
  95. package/src/legacy/tool-ui/src/ComponentStatesMixin.ts +27 -0
  96. package/src/legacy/tool-ui/src/ContentColors.css +19 -0
  97. package/src/legacy/tool-ui/src/ContentEdit.css +1065 -0
  98. package/src/legacy/tool-ui/src/ContentEditDrawer.css +274 -0
  99. package/src/legacy/tool-ui/src/ContentEditDrawer.ts +217 -0
  100. package/src/legacy/tool-ui/src/ContentEditPanel.ts +188 -0
  101. package/src/legacy/tool-ui/src/ContentEditSites.ts +101 -0
  102. package/src/legacy/tool-ui/src/ContentForm.css +87 -0
  103. package/src/legacy/tool-ui/src/ContentForm.ts +104 -0
  104. package/src/legacy/tool-ui/src/ContentInputGroup.css +678 -0
  105. package/src/legacy/tool-ui/src/ContentInputGroup.ts +86 -0
  106. package/src/legacy/tool-ui/src/ContentReporting.css +54 -0
  107. package/src/legacy/tool-ui/src/ContentSelector.css +215 -0
  108. package/src/legacy/tool-ui/src/ContentSelectorActions.ts +428 -0
  109. package/src/legacy/tool-ui/src/ContentSummary.css +176 -0
  110. package/src/legacy/tool-ui/src/ContentSummary.ts +223 -0
  111. package/src/legacy/tool-ui/src/ContentTemplatesWidget.css +54 -0
  112. package/src/legacy/tool-ui/src/ContentTools.css +109 -0
  113. package/src/legacy/tool-ui/src/ContentType.css +27 -0
  114. package/src/legacy/tool-ui/src/Conversation.css +325 -0
  115. package/src/legacy/tool-ui/src/Conversation.ts +836 -0
  116. package/src/legacy/tool-ui/src/CopySiteWidget.css +8 -0
  117. package/src/legacy/tool-ui/src/CopyToClipboard/README.md +23 -0
  118. package/src/legacy/tool-ui/src/CopyToClipboard/index.ts +54 -0
  119. package/src/legacy/tool-ui/src/CopyToClipboard.css +10 -0
  120. package/src/legacy/tool-ui/src/Crosslinker.css +486 -0
  121. package/src/legacy/tool-ui/src/Crosslinker.ts +46 -0
  122. package/src/legacy/tool-ui/src/CustomKeyboard.css +25 -0
  123. package/src/legacy/tool-ui/src/DashboardRow.css +54 -0
  124. package/src/legacy/tool-ui/src/DashboardWidget.css +444 -0
  125. package/src/legacy/tool-ui/src/DateStringField.css +78 -0
  126. package/src/legacy/tool-ui/src/DateTimeInput.css +11 -0
  127. package/src/legacy/tool-ui/src/Dialog.css +441 -0
  128. package/src/legacy/tool-ui/src/Diff.css +280 -0
  129. package/src/legacy/tool-ui/src/Diff.ts +89 -0
  130. package/src/legacy/tool-ui/src/Downloads.css +7 -0
  131. package/src/legacy/tool-ui/src/Dropdown.css +63 -0
  132. package/src/legacy/tool-ui/src/EditFieldUpdateCache.ts +129 -0
  133. package/src/legacy/tool-ui/src/EmbeddedInputGroup/README.md +3 -0
  134. package/src/legacy/tool-ui/src/EmbeddedInputGroup/index.ts +189 -0
  135. package/src/legacy/tool-ui/src/EmbeddedInputGroup.css +75 -0
  136. package/src/legacy/tool-ui/src/Enhancement.css +135 -0
  137. package/src/legacy/tool-ui/src/Entry.ts +875 -0
  138. package/src/legacy/tool-ui/src/EventEmitterMixin.ts +71 -0
  139. package/src/legacy/tool-ui/src/ExternalCalendars.ts +34 -0
  140. package/src/legacy/tool-ui/src/ExternalItemObjects.ts +36 -0
  141. package/src/legacy/tool-ui/src/FileInput.css +150 -0
  142. package/src/legacy/tool-ui/src/FocusRegions.ts +530 -0
  143. package/src/legacy/tool-ui/src/FormFilter.css +93 -0
  144. package/src/legacy/tool-ui/src/FullscreenView.css +152 -0
  145. package/src/legacy/tool-ui/src/GCA.css +9 -0
  146. package/src/legacy/tool-ui/src/Global.d.ts +219 -0
  147. package/src/legacy/tool-ui/src/GraphQL.css +74 -0
  148. package/src/legacy/tool-ui/src/GraphQLApis.css +4 -0
  149. package/src/legacy/tool-ui/src/Guide.css +193 -0
  150. package/src/legacy/tool-ui/src/GuideField.css +25 -0
  151. package/src/legacy/tool-ui/src/Hierarchy.css +68 -0
  152. package/src/legacy/tool-ui/src/Icon/index.css +11 -0
  153. package/src/legacy/tool-ui/src/Icon/index.ts +69 -0
  154. package/src/legacy/tool-ui/src/ImageEditor.css +522 -0
  155. package/src/legacy/tool-ui/src/ImageRecognition.css +11 -0
  156. package/src/legacy/tool-ui/src/Incompatible.css +42 -0
  157. package/src/legacy/tool-ui/src/InputRow.css +26 -0
  158. package/src/legacy/tool-ui/src/Label.css +33 -0
  159. package/src/legacy/tool-ui/src/LabeledCheckbox.css +13 -0
  160. package/src/legacy/tool-ui/src/Link.css +4 -0
  161. package/src/legacy/tool-ui/src/LinkCarousel.css +77 -0
  162. package/src/legacy/tool-ui/src/LinkList.css +53 -0
  163. package/src/legacy/tool-ui/src/LinkTable.css +105 -0
  164. package/src/legacy/tool-ui/src/ListManager.css +27 -0
  165. package/src/legacy/tool-ui/src/LiveBlog.css +290 -0
  166. package/src/legacy/tool-ui/src/LiveBlog.ts +47 -0
  167. package/src/legacy/tool-ui/src/Loader.svg +16 -0
  168. package/src/legacy/tool-ui/src/LocationMap.css +25 -0
  169. package/src/legacy/tool-ui/src/LookingGlass.css +31 -0
  170. package/src/legacy/tool-ui/src/LucideDynamicLoader.ts +31 -0
  171. package/src/legacy/tool-ui/src/MailPublishing.css +32 -0
  172. package/src/legacy/tool-ui/src/Mention.css +34 -0
  173. package/src/legacy/tool-ui/src/MenuView.css +659 -0
  174. package/src/legacy/tool-ui/src/Message.css +239 -0
  175. package/src/legacy/tool-ui/src/Month.css +65 -0
  176. package/src/legacy/tool-ui/src/NavRail/index.css +47 -0
  177. package/src/legacy/tool-ui/src/NavRail/index.ts +40 -0
  178. package/src/legacy/tool-ui/src/Notification.css +197 -0
  179. package/src/legacy/tool-ui/src/Notifications.ts +139 -0
  180. package/src/legacy/tool-ui/src/Page.css +884 -0
  181. package/src/legacy/tool-ui/src/PageNav.ts +108 -0
  182. package/src/legacy/tool-ui/src/PaginatedResult.css +20 -0
  183. package/src/legacy/tool-ui/src/Pagination.css +119 -0
  184. package/src/legacy/tool-ui/src/PastePopup.css +11 -0
  185. package/src/legacy/tool-ui/src/PlaceholderEditableMixin.ts +86 -0
  186. package/src/legacy/tool-ui/src/Popup.css +413 -0
  187. package/src/legacy/tool-ui/src/PostPublish.ts +12 -0
  188. package/src/legacy/tool-ui/src/PrePublish.ts +63 -0
  189. package/src/legacy/tool-ui/src/Preview.css +134 -0
  190. package/src/legacy/tool-ui/src/PrivilegeAccessWidget.css +27 -0
  191. package/src/legacy/tool-ui/src/ProfileDropdown.css +95 -0
  192. package/src/legacy/tool-ui/src/ProseMirror-table.css +159 -0
  193. package/src/legacy/tool-ui/src/ProseMirror.css +180 -0
  194. package/src/legacy/tool-ui/src/ProseMirrorContainer.css +40 -0
  195. package/src/legacy/tool-ui/src/ProseMirrorEnhancementMenu.css +68 -0
  196. package/src/legacy/tool-ui/src/ProseMirrorFindReplace.css +132 -0
  197. package/src/legacy/tool-ui/src/QueryField.css +77 -0
  198. package/src/legacy/tool-ui/src/README.md +235 -0
  199. package/src/legacy/tool-ui/src/RadialProgressBar.css +11 -0
  200. package/src/legacy/tool-ui/src/RadialProgressBar.ts +73 -0
  201. package/src/legacy/tool-ui/src/Radio.css +22 -0
  202. package/src/legacy/tool-ui/src/RepeatableContentInputGroup.css +470 -0
  203. package/src/legacy/tool-ui/src/RepeatableContentSelector.css +177 -0
  204. package/src/legacy/tool-ui/src/RepeatableTextInput.css +71 -0
  205. package/src/legacy/tool-ui/src/Revision.css +70 -0
  206. package/src/legacy/tool-ui/src/Revisions.css +292 -0
  207. package/src/legacy/tool-ui/src/RichText.css +15 -0
  208. package/src/legacy/tool-ui/src/SearchControlsToggle.ts +90 -0
  209. package/src/legacy/tool-ui/src/SearchFields.css +109 -0
  210. package/src/legacy/tool-ui/src/SearchInput.css +27 -0
  211. package/src/legacy/tool-ui/src/SearchResult.css +523 -0
  212. package/src/legacy/tool-ui/src/SearchWidget.css +441 -0
  213. package/src/legacy/tool-ui/src/SearchWidget.ts +154 -0
  214. package/src/legacy/tool-ui/src/SearchWidgetAdvanced.css +109 -0
  215. package/src/legacy/tool-ui/src/SharePreview.css +71 -0
  216. package/src/legacy/tool-ui/src/SkipLinks.css +23 -0
  217. package/src/legacy/tool-ui/src/SkipLinks.ts +112 -0
  218. package/src/legacy/tool-ui/src/SlackAuthentication.css +9 -0
  219. package/src/legacy/tool-ui/src/Sortable.css +50 -0
  220. package/src/legacy/tool-ui/src/Spellcheck.css +34 -0
  221. package/src/legacy/tool-ui/src/StyleEmbeddedContent.css +62 -0
  222. package/src/legacy/tool-ui/src/Suggestions.css +53 -0
  223. package/src/legacy/tool-ui/src/Suggestions.ts +209 -0
  224. package/src/legacy/tool-ui/src/TabBar.css +174 -0
  225. package/src/legacy/tool-ui/src/TabContainer.css +40 -0
  226. package/src/legacy/tool-ui/src/Table.css +107 -0
  227. package/src/legacy/tool-ui/src/TableSizerPopup.css +42 -0
  228. package/src/legacy/tool-ui/src/Taxonomy.css +60 -0
  229. package/src/legacy/tool-ui/src/TextInput.css +40 -0
  230. package/src/legacy/tool-ui/src/Theme.css +64 -0
  231. package/src/legacy/tool-ui/src/ThemeBundleEditor.css +93 -0
  232. package/src/legacy/tool-ui/src/TimedContent.css +74 -0
  233. package/src/legacy/tool-ui/src/Toggleable/README.md +90 -0
  234. package/src/legacy/tool-ui/src/Toggleable/index.ts +230 -0
  235. package/src/legacy/tool-ui/src/Translation.css +115 -0
  236. package/src/legacy/tool-ui/src/Translation.ts +20 -0
  237. package/src/legacy/tool-ui/src/TreeList.css +45 -0
  238. package/src/legacy/tool-ui/src/Types.ts +44 -0
  239. package/src/legacy/tool-ui/src/Utilities.css +7 -0
  240. package/src/legacy/tool-ui/src/ViewMirror.css +7 -0
  241. package/src/legacy/tool-ui/src/ViewPreview.css +59 -0
  242. package/src/legacy/tool-ui/src/ViewWatchers.css +69 -0
  243. package/src/legacy/tool-ui/src/Viewers.css +21 -0
  244. package/src/legacy/tool-ui/src/Week.css +23 -0
  245. package/src/legacy/tool-ui/src/Widget.css +622 -0
  246. package/src/legacy/tool-ui/src/WorkStreams.css +97 -0
  247. package/src/legacy/tool-ui/src/Workflow.css +100 -0
  248. package/src/legacy/tool-ui/src/Workstreams.ts +52 -0
  249. package/src/legacy/tool-ui/src/WrappingMixin.ts +77 -0
  250. package/src/legacy/tool-ui/src/additional-tailwind-classes.txt +205 -0
  251. package/src/legacy/tool-ui/src/bsp-tracking.d.ts +27 -0
  252. package/src/legacy/tool-ui/src/dialog/README.md +83 -0
  253. package/src/legacy/tool-ui/src/dialog/index.ts +465 -0
  254. package/src/legacy/tool-ui/src/dom/README.md +63 -0
  255. package/src/legacy/tool-ui/src/dom/Tether.ts +135 -0
  256. package/src/legacy/tool-ui/src/dom/TetherLayout.ts +149 -0
  257. package/src/legacy/tool-ui/src/dom/aria.ts +123 -0
  258. package/src/legacy/tool-ui/src/dom/closest.ts +5 -0
  259. package/src/legacy/tool-ui/src/dom/create.ts +46 -0
  260. package/src/legacy/tool-ui/src/dom/find.ts +5 -0
  261. package/src/legacy/tool-ui/src/dom/findAll.ts +5 -0
  262. package/src/legacy/tool-ui/src/dom/focusable.ts +29 -0
  263. package/src/legacy/tool-ui/src/dom/ifClick.ts +18 -0
  264. package/src/legacy/tool-ui/src/dom/ifMatches.ts +17 -0
  265. package/src/legacy/tool-ui/src/dom/ifUnmodified.ts +16 -0
  266. package/src/legacy/tool-ui/src/dom/insertBefore.ts +4 -0
  267. package/src/legacy/tool-ui/src/dom/insertFirst.ts +4 -0
  268. package/src/legacy/tool-ui/src/dom/insertLast.ts +4 -0
  269. package/src/legacy/tool-ui/src/dom/keyboard.ts +176 -0
  270. package/src/legacy/tool-ui/src/dom/onFind.ts +277 -0
  271. package/src/legacy/tool-ui/src/dom/onFindOnce.ts +31 -0
  272. package/src/legacy/tool-ui/src/dom/onRTEReady.ts +105 -0
  273. package/src/legacy/tool-ui/src/dom/onRemove.ts +27 -0
  274. package/src/legacy/tool-ui/src/dom/onVisible.ts +29 -0
  275. package/src/legacy/tool-ui/src/dom/popupMenu.d.ts +6 -0
  276. package/src/legacy/tool-ui/src/dom/popupMenu.js +282 -0
  277. package/src/legacy/tool-ui/src/dom/previousUntil.ts +22 -0
  278. package/src/legacy/tool-ui/src/dropdown/README.md +9 -0
  279. package/src/legacy/tool-ui/src/dropdown/index.ts +105 -0
  280. package/src/legacy/tool-ui/src/form/CodeInput/CodeMirror.less +168 -0
  281. package/src/legacy/tool-ui/src/form/CodeInput/CodeMirror.ts +15 -0
  282. package/src/legacy/tool-ui/src/form/CodeInput/index.ts +86 -0
  283. package/src/legacy/tool-ui/src/form/FormFilter/README.md +31 -0
  284. package/src/legacy/tool-ui/src/form/FormFilter/index.ts +340 -0
  285. package/src/legacy/tool-ui/src/form/Input/index.less +43 -0
  286. package/src/legacy/tool-ui/src/form/Input/index.ts +92 -0
  287. package/src/legacy/tool-ui/src/form/SearchInput/README.md +23 -0
  288. package/src/legacy/tool-ui/src/form/SearchInput/index.ts +89 -0
  289. package/src/legacy/tool-ui/src/form/TextAreaInput/index.less +11 -0
  290. package/src/legacy/tool-ui/src/form/TextAreaInput/index.ts +36 -0
  291. package/src/legacy/tool-ui/src/graphql/GraphQL.ts +49 -0
  292. package/src/legacy/tool-ui/src/graphql/GraphQLPreview.ts +23 -0
  293. package/src/legacy/tool-ui/src/main/resources/settings.properties +1 -0
  294. package/src/legacy/tool-ui/src/main/webapp/WEB-INF/web.xml +81 -0
  295. package/src/legacy/tool-ui/src/main/webapp/script/bsp-uploader.js +170 -0
  296. package/src/legacy/tool-ui/src/main/webapp/script/bsp-utils.js +393 -0
  297. package/src/legacy/tool-ui/src/main/webapp/script/content/layout-element.js +141 -0
  298. package/src/legacy/tool-ui/src/main/webapp/script/input/query.js +78 -0
  299. package/src/legacy/tool-ui/src/main/webapp/script/input/workflow.js +718 -0
  300. package/src/legacy/tool-ui/src/main/webapp/script/jquery.extra.js +633 -0
  301. package/src/legacy/tool-ui/src/main/webapp/script/v3/Dropbox.js +18 -0
  302. package/src/legacy/tool-ui/src/main/webapp/script/v3/EditFieldUpdate.js +406 -0
  303. package/src/legacy/tool-ui/src/main/webapp/script/v3/EditFieldUpdateCache.js +1 -0
  304. package/src/legacy/tool-ui/src/main/webapp/script/v3/Notification.js +151 -0
  305. package/src/legacy/tool-ui/src/main/webapp/script/v3/content/edit.js +194 -0
  306. package/src/legacy/tool-ui/src/main/webapp/script/v3/content/state.js +785 -0
  307. package/src/legacy/tool-ui/src/main/webapp/script/v3/csrf.js +35 -0
  308. package/src/legacy/tool-ui/src/main/webapp/script/v3/dashboard.js +65 -0
  309. package/src/legacy/tool-ui/src/main/webapp/script/v3/input/dataTransfer.js +129 -0
  310. package/src/legacy/tool-ui/src/main/webapp/script/v3/input/file.js +433 -0
  311. package/src/legacy/tool-ui/src/main/webapp/script/v3/input/object.js +743 -0
  312. package/src/legacy/tool-ui/src/main/webapp/script/v3/input/read-only.js +17 -0
  313. package/src/legacy/tool-ui/src/main/webapp/script/v3/jquery.frame.js +478 -0
  314. package/src/legacy/tool-ui/src/main/webapp/script/v3/jquery.repeatable.js +2406 -0
  315. package/src/legacy/tool-ui/src/main/webapp/script/v3/plugin/popup.d.ts +2 -0
  316. package/src/legacy/tool-ui/src/main/webapp/script/v3/plugin/popup.js +446 -0
  317. package/src/legacy/tool-ui/src/main/webapp/script/v3/search-filters.js +62 -0
  318. package/src/legacy/tool-ui/src/main/webapp/script/v3/search.js +53 -0
  319. package/src/legacy/tool-ui/src/main/webapp/script/v3.js +1049 -0
  320. package/src/legacy/tool-ui/src/main/webapp/style/v3/ExternalPreviewFrame.less +6 -0
  321. package/src/legacy/tool-ui/src/main/webapp/style/v3/WidgetSearchAdvancedQuery.less +24 -0
  322. package/src/legacy/tool-ui/src/main/webapp/style/v3/element.less +11 -0
  323. package/src/legacy/tool-ui/src/main/webapp/style/v3/icon/ajax-loader.gif +0 -0
  324. package/src/legacy/tool-ui/src/main/webapp/style/v3/index.less +98 -0
  325. package/src/legacy/tool-ui/src/main/webapp/style/v3/repeatable.less +89 -0
  326. package/src/legacy/tool-ui/src/main/webapp/style/v3/variables.less +53 -0
  327. package/src/legacy/tool-ui/src/main/webapp/v4/ActionBar.less +44 -0
  328. package/src/legacy/tool-ui/src/main/webapp/v4/Admin.js +16 -0
  329. package/src/legacy/tool-ui/src/main/webapp/v4/Admin.less +253 -0
  330. package/src/legacy/tool-ui/src/main/webapp/v4/AdobeStock.less +20 -0
  331. package/src/legacy/tool-ui/src/main/webapp/v4/Apis.less +43 -0
  332. package/src/legacy/tool-ui/src/main/webapp/v4/AutoExpand.js +84 -0
  333. package/src/legacy/tool-ui/src/main/webapp/v4/AutoExpand.less +36 -0
  334. package/src/legacy/tool-ui/src/main/webapp/v4/AutoSubmit.js +68 -0
  335. package/src/legacy/tool-ui/src/main/webapp/v4/Avatar.less +30 -0
  336. package/src/legacy/tool-ui/src/main/webapp/v4/BackgroundTasks.less +52 -0
  337. package/src/legacy/tool-ui/src/main/webapp/v4/Badge.less +10 -0
  338. package/src/legacy/tool-ui/src/main/webapp/v4/Board.less +311 -0
  339. package/src/legacy/tool-ui/src/main/webapp/v4/Bridge.js +536 -0
  340. package/src/legacy/tool-ui/src/main/webapp/v4/BulletedList.less +17 -0
  341. package/src/legacy/tool-ui/src/main/webapp/v4/Button.less +105 -0
  342. package/src/legacy/tool-ui/src/main/webapp/v4/CIGCluster.less +55 -0
  343. package/src/legacy/tool-ui/src/main/webapp/v4/Card.less +53 -0
  344. package/src/legacy/tool-ui/src/main/webapp/v4/Checkbox.less +99 -0
  345. package/src/legacy/tool-ui/src/main/webapp/v4/CheckboxInput.js +22 -0
  346. package/src/legacy/tool-ui/src/main/webapp/v4/Collections.less +49 -0
  347. package/src/legacy/tool-ui/src/main/webapp/v4/ColorInput.js +5 -0
  348. package/src/legacy/tool-ui/src/main/webapp/v4/ColorInputSpectrum.js +107 -0
  349. package/src/legacy/tool-ui/src/main/webapp/v4/ColorInputSpectrum.less +319 -0
  350. package/src/legacy/tool-ui/src/main/webapp/v4/ComboInput.js +1491 -0
  351. package/src/legacy/tool-ui/src/main/webapp/v4/ComboInput.less +403 -0
  352. package/src/legacy/tool-ui/src/main/webapp/v4/CommunityWidget.js +29 -0
  353. package/src/legacy/tool-ui/src/main/webapp/v4/CommunityWidget.less +73 -0
  354. package/src/legacy/tool-ui/src/main/webapp/v4/Compat.less +7 -0
  355. package/src/legacy/tool-ui/src/main/webapp/v4/ContentEdit.js +2427 -0
  356. package/src/legacy/tool-ui/src/main/webapp/v4/ContentEdit.less +1512 -0
  357. package/src/legacy/tool-ui/src/main/webapp/v4/ContentEditDrawer.less +329 -0
  358. package/src/legacy/tool-ui/src/main/webapp/v4/ContentEditSites.less +5 -0
  359. package/src/legacy/tool-ui/src/main/webapp/v4/ContentForm.less +174 -0
  360. package/src/legacy/tool-ui/src/main/webapp/v4/ContentInputGroup.less +669 -0
  361. package/src/legacy/tool-ui/src/main/webapp/v4/ContentLock.js +470 -0
  362. package/src/legacy/tool-ui/src/main/webapp/v4/ContentReporting.js +32 -0
  363. package/src/legacy/tool-ui/src/main/webapp/v4/ContentReporting.less +39 -0
  364. package/src/legacy/tool-ui/src/main/webapp/v4/ContentSelector.less +268 -0
  365. package/src/legacy/tool-ui/src/main/webapp/v4/ContentSummary.less +238 -0
  366. package/src/legacy/tool-ui/src/main/webapp/v4/ContentTools.less +73 -0
  367. package/src/legacy/tool-ui/src/main/webapp/v4/ContentType.less +24 -0
  368. package/src/legacy/tool-ui/src/main/webapp/v4/CopyToClipboard.less +20 -0
  369. package/src/legacy/tool-ui/src/main/webapp/v4/DashboardRow.less +40 -0
  370. package/src/legacy/tool-ui/src/main/webapp/v4/DashboardWidget.less +193 -0
  371. package/src/legacy/tool-ui/src/main/webapp/v4/DataTable.js +31 -0
  372. package/src/legacy/tool-ui/src/main/webapp/v4/DataTable.less +52 -0
  373. package/src/legacy/tool-ui/src/main/webapp/v4/DateStringField.js +485 -0
  374. package/src/legacy/tool-ui/src/main/webapp/v4/DateStringField.less +148 -0
  375. package/src/legacy/tool-ui/src/main/webapp/v4/DateTimeInput.less +58 -0
  376. package/src/legacy/tool-ui/src/main/webapp/v4/Diff.less +322 -0
  377. package/src/legacy/tool-ui/src/main/webapp/v4/Downloads.css +11 -0
  378. package/src/legacy/tool-ui/src/main/webapp/v4/Draggable.less +42 -0
  379. package/src/legacy/tool-ui/src/main/webapp/v4/Dropdown.less +76 -0
  380. package/src/legacy/tool-ui/src/main/webapp/v4/EmbeddedInputGroup.less +141 -0
  381. package/src/legacy/tool-ui/src/main/webapp/v4/Entry.js +264 -0
  382. package/src/legacy/tool-ui/src/main/webapp/v4/Entry.less +157 -0
  383. package/src/legacy/tool-ui/src/main/webapp/v4/ExternalItemAuth.js +16 -0
  384. package/src/legacy/tool-ui/src/main/webapp/v4/ExternalItemImport.less +3 -0
  385. package/src/legacy/tool-ui/src/main/webapp/v4/FileInput.less +194 -0
  386. package/src/legacy/tool-ui/src/main/webapp/v4/Form.js +31 -0
  387. package/src/legacy/tool-ui/src/main/webapp/v4/FormFilter.less +189 -0
  388. package/src/legacy/tool-ui/src/main/webapp/v4/Frame.less +26 -0
  389. package/src/legacy/tool-ui/src/main/webapp/v4/GraphQLApis.less +4 -0
  390. package/src/legacy/tool-ui/src/main/webapp/v4/Grid.less +48 -0
  391. package/src/legacy/tool-ui/src/main/webapp/v4/Guide.less +209 -0
  392. package/src/legacy/tool-ui/src/main/webapp/v4/GuideField.less +108 -0
  393. package/src/legacy/tool-ui/src/main/webapp/v4/Hierarchy.js +100 -0
  394. package/src/legacy/tool-ui/src/main/webapp/v4/Hierarchy.less +89 -0
  395. package/src/legacy/tool-ui/src/main/webapp/v4/Highlight.less +5 -0
  396. package/src/legacy/tool-ui/src/main/webapp/v4/Icon.less +53 -0
  397. package/src/legacy/tool-ui/src/main/webapp/v4/Icon.ts +49 -0
  398. package/src/legacy/tool-ui/src/main/webapp/v4/IconButton.less +111 -0
  399. package/src/legacy/tool-ui/src/main/webapp/v4/ImageEditor.js +2403 -0
  400. package/src/legacy/tool-ui/src/main/webapp/v4/ImageEditor.less +922 -0
  401. package/src/legacy/tool-ui/src/main/webapp/v4/ImageEditorBundle.js +5 -0
  402. package/src/legacy/tool-ui/src/main/webapp/v4/Input.less +15 -0
  403. package/src/legacy/tool-ui/src/main/webapp/v4/InputRow.less +35 -0
  404. package/src/legacy/tool-ui/src/main/webapp/v4/Label.less +12 -0
  405. package/src/legacy/tool-ui/src/main/webapp/v4/LabeledCheckbox.less +35 -0
  406. package/src/legacy/tool-ui/src/main/webapp/v4/Link.less +93 -0
  407. package/src/legacy/tool-ui/src/main/webapp/v4/LinkCarousel.js +40 -0
  408. package/src/legacy/tool-ui/src/main/webapp/v4/LinkCarousel.less +143 -0
  409. package/src/legacy/tool-ui/src/main/webapp/v4/LinkList.js +14 -0
  410. package/src/legacy/tool-ui/src/main/webapp/v4/LinkList.less +150 -0
  411. package/src/legacy/tool-ui/src/main/webapp/v4/LinkTable.js +123 -0
  412. package/src/legacy/tool-ui/src/main/webapp/v4/LinkTable.less +112 -0
  413. package/src/legacy/tool-ui/src/main/webapp/v4/Location.js +19 -0
  414. package/src/legacy/tool-ui/src/main/webapp/v4/LocationMap.js +148 -0
  415. package/src/legacy/tool-ui/src/main/webapp/v4/LocationMap.less +62 -0
  416. package/src/legacy/tool-ui/src/main/webapp/v4/LookingGlass.js +24 -0
  417. package/src/legacy/tool-ui/src/main/webapp/v4/LookingGlass.less +30 -0
  418. package/src/legacy/tool-ui/src/main/webapp/v4/Message.js +14 -0
  419. package/src/legacy/tool-ui/src/main/webapp/v4/Message.less +189 -0
  420. package/src/legacy/tool-ui/src/main/webapp/v4/Month.less +102 -0
  421. package/src/legacy/tool-ui/src/main/webapp/v4/Notification.less +278 -0
  422. package/src/legacy/tool-ui/src/main/webapp/v4/NumberBar.js +32 -0
  423. package/src/legacy/tool-ui/src/main/webapp/v4/NumberBar.less +21 -0
  424. package/src/legacy/tool-ui/src/main/webapp/v4/NumberedList.less +17 -0
  425. package/src/legacy/tool-ui/src/main/webapp/v4/Page.js +890 -0
  426. package/src/legacy/tool-ui/src/main/webapp/v4/Page.less +922 -0
  427. package/src/legacy/tool-ui/src/main/webapp/v4/PaginatedResult.less +89 -0
  428. package/src/legacy/tool-ui/src/main/webapp/v4/Pagination.less +80 -0
  429. package/src/legacy/tool-ui/src/main/webapp/v4/Popup.less +415 -0
  430. package/src/legacy/tool-ui/src/main/webapp/v4/PrePublish.less +5 -0
  431. package/src/legacy/tool-ui/src/main/webapp/v4/Preview.js +758 -0
  432. package/src/legacy/tool-ui/src/main/webapp/v4/Preview.less +495 -0
  433. package/src/legacy/tool-ui/src/main/webapp/v4/PreviewEditor.js +86 -0
  434. package/src/legacy/tool-ui/src/main/webapp/v4/PreviewOverlay.js +1005 -0
  435. package/src/legacy/tool-ui/src/main/webapp/v4/ProfileDropdown.less +66 -0
  436. package/src/legacy/tool-ui/src/main/webapp/v4/PubSub.js +47 -0
  437. package/src/legacy/tool-ui/src/main/webapp/v4/QueryField.js +211 -0
  438. package/src/legacy/tool-ui/src/main/webapp/v4/QueryField.less +147 -0
  439. package/src/legacy/tool-ui/src/main/webapp/v4/RadialProgressBar.less +20 -0
  440. package/src/legacy/tool-ui/src/main/webapp/v4/RegionMap.js +215 -0
  441. package/src/legacy/tool-ui/src/main/webapp/v4/Repeatable.less +102 -0
  442. package/src/legacy/tool-ui/src/main/webapp/v4/RepeatableContentInputGroup.js +160 -0
  443. package/src/legacy/tool-ui/src/main/webapp/v4/RepeatableContentInputGroup.less +731 -0
  444. package/src/legacy/tool-ui/src/main/webapp/v4/RepeatableContentSelector.less +296 -0
  445. package/src/legacy/tool-ui/src/main/webapp/v4/RepeatableTextInput.less +156 -0
  446. package/src/legacy/tool-ui/src/main/webapp/v4/Reset.less +373 -0
  447. package/src/legacy/tool-ui/src/main/webapp/v4/Revision.less +50 -0
  448. package/src/legacy/tool-ui/src/main/webapp/v4/RichText.less +32 -0
  449. package/src/legacy/tool-ui/src/main/webapp/v4/RichTextEditor.js +154 -0
  450. package/src/legacy/tool-ui/src/main/webapp/v4/RichTextEditor.less +197 -0
  451. package/src/legacy/tool-ui/src/main/webapp/v4/SearchFields.js +281 -0
  452. package/src/legacy/tool-ui/src/main/webapp/v4/SearchFields.less +403 -0
  453. package/src/legacy/tool-ui/src/main/webapp/v4/SearchInput.less +65 -0
  454. package/src/legacy/tool-ui/src/main/webapp/v4/SearchResult.js +255 -0
  455. package/src/legacy/tool-ui/src/main/webapp/v4/SearchResult.less +479 -0
  456. package/src/legacy/tool-ui/src/main/webapp/v4/SearchWidget.less +697 -0
  457. package/src/legacy/tool-ui/src/main/webapp/v4/SearchWidgetAdvanced.less +115 -0
  458. package/src/legacy/tool-ui/src/main/webapp/v4/SharePreview.js +56 -0
  459. package/src/legacy/tool-ui/src/main/webapp/v4/SharePreview.less +95 -0
  460. package/src/legacy/tool-ui/src/main/webapp/v4/Sortable.js +874 -0
  461. package/src/legacy/tool-ui/src/main/webapp/v4/Sortable.less +242 -0
  462. package/src/legacy/tool-ui/src/main/webapp/v4/StandardForm.less +12 -0
  463. package/src/legacy/tool-ui/src/main/webapp/v4/StyleEmbeddedContent.js +100 -0
  464. package/src/legacy/tool-ui/src/main/webapp/v4/StyleEmbeddedContent.less +131 -0
  465. package/src/legacy/tool-ui/src/main/webapp/v4/StyleguidePresets.js +357 -0
  466. package/src/legacy/tool-ui/src/main/webapp/v4/Suggestions.less +121 -0
  467. package/src/legacy/tool-ui/src/main/webapp/v4/TabBar.less +258 -0
  468. package/src/legacy/tool-ui/src/main/webapp/v4/TabContainer.js +360 -0
  469. package/src/legacy/tool-ui/src/main/webapp/v4/TabContainer.less +26 -0
  470. package/src/legacy/tool-ui/src/main/webapp/v4/Taxonomy.js +27 -0
  471. package/src/legacy/tool-ui/src/main/webapp/v4/Taxonomy.less +84 -0
  472. package/src/legacy/tool-ui/src/main/webapp/v4/Text.less +41 -0
  473. package/src/legacy/tool-ui/src/main/webapp/v4/TextInput.less +32 -0
  474. package/src/legacy/tool-ui/src/main/webapp/v4/ThemeBundleEditor.js +224 -0
  475. package/src/legacy/tool-ui/src/main/webapp/v4/ThemeBundleEditor.less +106 -0
  476. package/src/legacy/tool-ui/src/main/webapp/v4/TimedContent.js +147 -0
  477. package/src/legacy/tool-ui/src/main/webapp/v4/TimedContent.less +202 -0
  478. package/src/legacy/tool-ui/src/main/webapp/v4/TimedContentBundle.js +8 -0
  479. package/src/legacy/tool-ui/src/main/webapp/v4/TreeList.less +93 -0
  480. package/src/legacy/tool-ui/src/main/webapp/v4/Utils.css +14 -0
  481. package/src/legacy/tool-ui/src/main/webapp/v4/VideoEditor.js +2417 -0
  482. package/src/legacy/tool-ui/src/main/webapp/v4/VideoEditor.less +737 -0
  483. package/src/legacy/tool-ui/src/main/webapp/v4/VideoEditorBundle.js +8 -0
  484. package/src/legacy/tool-ui/src/main/webapp/v4/ViewMirror.js +52 -0
  485. package/src/legacy/tool-ui/src/main/webapp/v4/ViewMirror.less +42 -0
  486. package/src/legacy/tool-ui/src/main/webapp/v4/ViewPreview.d.ts +13 -0
  487. package/src/legacy/tool-ui/src/main/webapp/v4/ViewPreview.js +177 -0
  488. package/src/legacy/tool-ui/src/main/webapp/v4/ViewPreview.less +147 -0
  489. package/src/legacy/tool-ui/src/main/webapp/v4/Viewers.less +70 -0
  490. package/src/legacy/tool-ui/src/main/webapp/v4/Week.less +32 -0
  491. package/src/legacy/tool-ui/src/main/webapp/v4/Widget.js +90 -0
  492. package/src/legacy/tool-ui/src/main/webapp/v4/Widget.less +224 -0
  493. package/src/legacy/tool-ui/src/main/webapp/v4/Workflow.less +153 -0
  494. package/src/legacy/tool-ui/src/main/webapp/v4/__mocks__/fileMock.js +1 -0
  495. package/src/legacy/tool-ui/src/main/webapp/v4/__mocks__/styleMock.js +1 -0
  496. package/src/legacy/tool-ui/src/main/webapp/v4/__mocks__/textArea.mock.js +20 -0
  497. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/globals.js +770 -0
  498. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/ProseMirror.test.js +16 -0
  499. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/index.html +54 -0
  500. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/comment_manager/CommentManager.test.js +29 -0
  501. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/comment_manager/index.html +35 -0
  502. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/custom_keyboard/CustomKeyboard.js +42 -0
  503. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/custom_keyboard/index.html +37 -0
  504. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/enhancement_manager/EnhancementManager.test.js +288 -0
  505. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/enhancement_manager/block.html +38 -0
  506. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/enhancement_manager/inline.html +38 -0
  507. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/enhancement_manager/no-popups.html +38 -0
  508. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/list_manager/ListManager.js +257 -0
  509. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/list_manager/index.html +38 -0
  510. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/menubar/hierarchal.html +33 -0
  511. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/menubar/index.html +33 -0
  512. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/menubar/menubar.test.js +195 -0
  513. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/menubar/small.html +34 -0
  514. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/menubar/tags.html +34 -0
  515. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/placeholder_manager/PlaceholderManager.test.js +134 -0
  516. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/placeholder_manager/has-editable-placeholder.html +32 -0
  517. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/placeholder_manager/has-text.html +34 -0
  518. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/placeholder_manager/index.html +31 -0
  519. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/table_manager/TableManager.test.js +63 -0
  520. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/table_manager/existing.html +48 -0
  521. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/track_manager/TrackManager.test.js +291 -0
  522. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/track_manager/existing.html +39 -0
  523. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/integration/rte/plugins/track_manager/insert.html +37 -0
  524. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/unit/Sortable.test.js +105 -0
  525. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/unit/rte/ProseMirror.test.js +41 -0
  526. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/unit/rte/codemirror-shim.test.js +72 -0
  527. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/unit/rte/plugins/collab_manager/CollabManager.test.js +46 -0
  528. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/unit/rte/plugins/enhancement_manager/EnhancementManager.test.js +84 -0
  529. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/unit/rte/plugins/list_manager/ListManager.test.js +54 -0
  530. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/unit/rte/plugins/menubar/menubar.test.js +183 -0
  531. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/unit/rte/plugins/spellcheck/SpellCheck.test.js +45 -0
  532. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/unit/rte/settings/BSSerializer.test.js +346 -0
  533. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/unit/rte/settings/menuItemsBuilder.test.js +226 -0
  534. package/src/legacy/tool-ui/src/main/webapp/v4/__tests__/unit/rte/utilities.test.js +118 -0
  535. package/src/legacy/tool-ui/src/main/webapp/v4/appetizeio/Appetizeio.js +5 -0
  536. package/src/legacy/tool-ui/src/main/webapp/v4/appetizeio/AppetizeioEmbedded.js +113 -0
  537. package/src/legacy/tool-ui/src/main/webapp/v4/appetizeio/AppetizeioEmbedded.less +77 -0
  538. package/src/legacy/tool-ui/src/main/webapp/v4/bsp-rings-bg.svg +9 -0
  539. package/src/legacy/tool-ui/src/main/webapp/v4/compat/Fetch.js +16 -0
  540. package/src/legacy/tool-ui/src/main/webapp/v4/compat/jquery.js +32 -0
  541. package/src/legacy/tool-ui/src/main/webapp/v4/compat/requirejs.js +13 -0
  542. package/src/legacy/tool-ui/src/main/webapp/v4/dom/Tether.js +1 -0
  543. package/src/legacy/tool-ui/src/main/webapp/v4/dom/TetherLayout.js +1 -0
  544. package/src/legacy/tool-ui/src/main/webapp/v4/dom/closest.js +1 -0
  545. package/src/legacy/tool-ui/src/main/webapp/v4/dom/create.js +1 -0
  546. package/src/legacy/tool-ui/src/main/webapp/v4/dom/find.js +1 -0
  547. package/src/legacy/tool-ui/src/main/webapp/v4/dom/findAll.js +1 -0
  548. package/src/legacy/tool-ui/src/main/webapp/v4/dom/ifClick.js +1 -0
  549. package/src/legacy/tool-ui/src/main/webapp/v4/dom/ifMatches.js +1 -0
  550. package/src/legacy/tool-ui/src/main/webapp/v4/dom/ifUnmodified.js +1 -0
  551. package/src/legacy/tool-ui/src/main/webapp/v4/dom/index.js +5 -0
  552. package/src/legacy/tool-ui/src/main/webapp/v4/dom/insertBefore.js +1 -0
  553. package/src/legacy/tool-ui/src/main/webapp/v4/dom/insertFirst.js +1 -0
  554. package/src/legacy/tool-ui/src/main/webapp/v4/dom/insertLast.js +1 -0
  555. package/src/legacy/tool-ui/src/main/webapp/v4/dom/onFind.js +1 -0
  556. package/src/legacy/tool-ui/src/main/webapp/v4/dom/onFindOnce.js +1 -0
  557. package/src/legacy/tool-ui/src/main/webapp/v4/dom/onRTEReady.js +1 -0
  558. package/src/legacy/tool-ui/src/main/webapp/v4/dom/onRemove.js +1 -0
  559. package/src/legacy/tool-ui/src/main/webapp/v4/dom/onVisible.js +1 -0
  560. package/src/legacy/tool-ui/src/main/webapp/v4/dom/previousUntil.js +1 -0
  561. package/src/legacy/tool-ui/src/main/webapp/v4/dom/resolveIconCompat.js +40 -0
  562. package/src/legacy/tool-ui/src/main/webapp/v4/graphql/GraphQL.less +171 -0
  563. package/src/legacy/tool-ui/src/main/webapp/v4/mail-publishing/MailPublishing.less +38 -0
  564. package/src/legacy/tool-ui/src/main/webapp/v4/rtc/Socket.js +1 -0
  565. package/src/legacy/tool-ui/src/main/webapp/v4/rtc/index.js +1 -0
  566. package/src/legacy/tool-ui/src/main/webapp/v4/rte/Mention.less +35 -0
  567. package/src/legacy/tool-ui/src/main/webapp/v4/rte/ProseMirror.js +909 -0
  568. package/src/legacy/tool-ui/src/main/webapp/v4/rte/ProseMirror.less +759 -0
  569. package/src/legacy/tool-ui/src/main/webapp/v4/rte/ProseMirrorContainer.less +29 -0
  570. package/src/legacy/tool-ui/src/main/webapp/v4/rte/README.md +68 -0
  571. package/src/legacy/tool-ui/src/main/webapp/v4/rte/codemirror-shim.d.ts +8 -0
  572. package/src/legacy/tool-ui/src/main/webapp/v4/rte/codemirror-shim.js +274 -0
  573. package/src/legacy/tool-ui/src/main/webapp/v4/rte/collab-workflow.jpeg +0 -0
  574. package/src/legacy/tool-ui/src/main/webapp/v4/rte/interchangeable.ts +250 -0
  575. package/src/legacy/tool-ui/src/main/webapp/v4/rte/mention.js +90 -0
  576. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/PluginProvider.js +124 -0
  577. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/README.md +46 -0
  578. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/ai_inline_manager/AIInlineManager.ts +124 -0
  579. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/ai_inline_manager/views/AIInline.less +244 -0
  580. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/ai_inline_manager/views/AIInlineView.ts +1019 -0
  581. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/ai_manager/AiManager.ts +199 -0
  582. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/collab_manager/CollabManager.js +339 -0
  583. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/collab_manager/views/AvatarView.js +96 -0
  584. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/collab_manager/views/AvatarView.less +11 -0
  585. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/collab_manager/views/CollabEditing.less +18 -0
  586. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/comment_manager/CommentManager.js +348 -0
  587. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/custom_keyboard/CustomKeyboard.js +110 -0
  588. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/custom_keyboard/CustomKeyboard.less +21 -0
  589. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/custom_keyboard/README.md +29 -0
  590. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/EnhancementManager.js +428 -0
  591. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/README.md +63 -0
  592. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/commands.js +690 -0
  593. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/constants.js +12 -0
  594. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/enhancement-creation.jpeg +0 -0
  595. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/index.js +15 -0
  596. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/rte-flow.jpeg +0 -0
  597. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/views/ActionButtonView.js +86 -0
  598. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/views/BlockSubmenuView.js +60 -0
  599. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/views/Enhancement.less +67 -0
  600. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/views/EnhancementView.js +208 -0
  601. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/views/PreviewView.js +102 -0
  602. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/views/PreviewView.less +45 -0
  603. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/views/ProsemirrorEnhancementMenu.less +113 -0
  604. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/enhancement_manager/views/SubmenuView.js +365 -0
  605. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/find_replace_manager/FindReplaceManager.js +239 -0
  606. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/find_replace_manager/views/FindView.js +604 -0
  607. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/find_replace_manager/views/ProseMirrorFindReplace.less +174 -0
  608. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/fullscreen_manager/FullscreenManager.js +57 -0
  609. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/fullscreen_manager/README.md +26 -0
  610. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/fullscreen_manager/commands.js +16 -0
  611. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/fullscreen_manager/index.js +4 -0
  612. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/fullscreen_manager/views/FullscreenView.js +474 -0
  613. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/fullscreen_manager/views/FullscreenView.less +383 -0
  614. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/html_editor_manager/htmlEditorManager.js +66 -0
  615. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/html_editor_manager/views/HtmlEditorView.js +97 -0
  616. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/list_manager/ListManager.js +342 -0
  617. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/list_manager/ListManager.less +42 -0
  618. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/list_manager/README.md +50 -0
  619. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/list_manager/commands.js +207 -0
  620. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/list_manager/constants.js +26 -0
  621. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/list_manager/index.js +4 -0
  622. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/menubar/Menubar.js +485 -0
  623. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/menubar/README.md +40 -0
  624. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/menubar/views/MenuView.js +842 -0
  625. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/menubar/views/MenuView.less +821 -0
  626. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/paste_manager/PasteManager.js +368 -0
  627. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/paste_manager/views/PastePopup.less +5 -0
  628. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/placeholder_manager/PlaceHolderManager.js +128 -0
  629. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/raw_text_manager/README.md +13 -0
  630. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/raw_text_manager/RawTextManager.js +96 -0
  631. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/spellcheck/index.js +3 -0
  632. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/spellcheck/spellcheck-plugin.js +280 -0
  633. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/spellcheck/spellcheck-service.js +94 -0
  634. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/spellcheck/spellcheck.less +73 -0
  635. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/table_manager/TableManager.js +57 -0
  636. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/table_manager/commands.js +97 -0
  637. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/table_manager/views/ProseMirror-table.less +137 -0
  638. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/table_manager/views/TableSizerPopup.less +19 -0
  639. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/table_manager/views/TableSizerView.js +88 -0
  640. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/table_manager/views/TableView.js +613 -0
  641. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/track_manager/README.md +13 -0
  642. package/src/legacy/tool-ui/src/main/webapp/v4/rte/plugins/track_manager/TrackManager.js +905 -0
  643. package/src/legacy/tool-ui/src/main/webapp/v4/rte/settings/BSSerializer.js +819 -0
  644. package/src/legacy/tool-ui/src/main/webapp/v4/rte/settings/README.md +80 -0
  645. package/src/legacy/tool-ui/src/main/webapp/v4/rte/settings/commands.js +98 -0
  646. package/src/legacy/tool-ui/src/main/webapp/v4/rte/settings/constants.d.ts +84 -0
  647. package/src/legacy/tool-ui/src/main/webapp/v4/rte/settings/constants.js +87 -0
  648. package/src/legacy/tool-ui/src/main/webapp/v4/rte/settings/index.js +13 -0
  649. package/src/legacy/tool-ui/src/main/webapp/v4/rte/settings/keymapBuilder.js +223 -0
  650. package/src/legacy/tool-ui/src/main/webapp/v4/rte/settings/menuItemsBuilder.js +559 -0
  651. package/src/legacy/tool-ui/src/main/webapp/v4/rte/settings/schemaBuilder.js +1281 -0
  652. package/src/legacy/tool-ui/src/main/webapp/v4/rte/utilities.d.ts +4 -0
  653. package/src/legacy/tool-ui/src/main/webapp/v4/rte/utilities.js +359 -0
  654. package/src/legacy/tool-ui/src/main/webapp/v4/theme/ColorRotator.js +1 -0
  655. package/src/legacy/tool-ui/src/main/webapp/v4/theme/Theme.less +224 -0
  656. package/src/legacy/tool-ui/src/main/webapp/v4/translation/Translation.less +114 -0
  657. package/src/legacy/tool-ui/src/main/webapp/v4/util/debounce.js +1 -0
  658. package/src/legacy/tool-ui/src/main/webapp/v4/util/getComponentKey.js +1 -0
  659. package/src/legacy/tool-ui/src/main/webapp/v4/util/noise.js +1 -0
  660. package/src/legacy/tool-ui/src/main/webapp/v4/util/repaint.js +1 -0
  661. package/src/legacy/tool-ui/src/main/webapp/v4/util/storage.js +1 -0
  662. package/src/legacy/tool-ui/src/main/webapp/v4/util/throttle.js +1 -0
  663. package/src/legacy/tool-ui/src/main/webapp/v4/widget/AnalyticsWidget.less +18 -0
  664. package/src/legacy/tool-ui/src/main/webapp/v4/widget/AssignmentContent.js +33 -0
  665. package/src/legacy/tool-ui/src/main/webapp/v4/widget/AssignmentContent.less +19 -0
  666. package/src/legacy/tool-ui/src/main/webapp/v4/widget/AssignmentDeskDashboard.js +217 -0
  667. package/src/legacy/tool-ui/src/main/webapp/v4/widget/AssignmentDeskDashboard.less +410 -0
  668. package/src/legacy/tool-ui/src/main/webapp/v4/widget/AssignmentDeskRelatedWidget.less +3 -0
  669. package/src/legacy/tool-ui/src/main/webapp/v4/widget/AssignmentFilters.less +23 -0
  670. package/src/legacy/tool-ui/src/main/webapp/v4/widget/AssociatedContentWidget.js +7 -0
  671. package/src/legacy/tool-ui/src/main/webapp/v4/widget/AssociatedContentWidget.less +92 -0
  672. package/src/legacy/tool-ui/src/main/webapp/v4/widget/BulkUpload.js +19 -0
  673. package/src/legacy/tool-ui/src/main/webapp/v4/widget/BulkUpload.less +65 -0
  674. package/src/legacy/tool-ui/src/main/webapp/v4/widget/BulkWorkflow.less +103 -0
  675. package/src/legacy/tool-ui/src/main/webapp/v4/widget/Calendar.js +7 -0
  676. package/src/legacy/tool-ui/src/main/webapp/v4/widget/Calendar.less +109 -0
  677. package/src/legacy/tool-ui/src/main/webapp/v4/widget/CalendarAccessOverview.less +26 -0
  678. package/src/legacy/tool-ui/src/main/webapp/v4/widget/CalendarEventSummary.less +15 -0
  679. package/src/legacy/tool-ui/src/main/webapp/v4/widget/ClosableWindow.js +13 -0
  680. package/src/legacy/tool-ui/src/main/webapp/v4/widget/ClosableWindow.less +3 -0
  681. package/src/legacy/tool-ui/src/main/webapp/v4/widget/ContentColors.less +17 -0
  682. package/src/legacy/tool-ui/src/main/webapp/v4/widget/ContentTemplatesWidget.less +123 -0
  683. package/src/legacy/tool-ui/src/main/webapp/v4/widget/Conversation.less +537 -0
  684. package/src/legacy/tool-ui/src/main/webapp/v4/widget/CopySiteWidget.less +13 -0
  685. package/src/legacy/tool-ui/src/main/webapp/v4/widget/FormSubmission.less +3 -0
  686. package/src/legacy/tool-ui/src/main/webapp/v4/widget/LiveBlog.less +158 -0
  687. package/src/legacy/tool-ui/src/main/webapp/v4/widget/PitchAssignments.js +25 -0
  688. package/src/legacy/tool-ui/src/main/webapp/v4/widget/PitchAssignments.less +16 -0
  689. package/src/legacy/tool-ui/src/main/webapp/v4/widget/PitchContent.js +33 -0
  690. package/src/legacy/tool-ui/src/main/webapp/v4/widget/PitchContent.less +10 -0
  691. package/src/legacy/tool-ui/src/main/webapp/v4/widget/Revisions.js +61 -0
  692. package/src/legacy/tool-ui/src/main/webapp/v4/widget/Revisions.less +280 -0
  693. package/src/legacy/tool-ui/src/main/webapp/v4/widget/SavedSearch.less +13 -0
  694. package/src/legacy/tool-ui/src/main/webapp/v4/widget/SemRushDashboardWidget.less +6 -0
  695. package/src/legacy/tool-ui/src/main/webapp/v4/widget/SlackAuthentication.less +13 -0
  696. package/src/legacy/tool-ui/src/main/webapp/v4/widget/WorkStreams.less +39 -0
  697. package/src/legacy/tool-ui/src/platform.ts +25 -0
  698. package/src/legacy/tool-ui/src/rtc/Socket.ts +205 -0
  699. package/src/legacy/tool-ui/src/rtc/index.ts +276 -0
  700. package/src/legacy/tool-ui/src/table/README.md +3 -0
  701. package/src/legacy/tool-ui/src/table/index.ts +107 -0
  702. package/src/legacy/tool-ui/src/theme/ColorRotator.ts +32 -0
  703. package/src/legacy/tool-ui/src/theme/Theme.ts +516 -0
  704. package/src/legacy/tool-ui/src/theme/index.ts +7 -0
  705. package/src/legacy/tool-ui/src/util/README.md +42 -0
  706. package/src/legacy/tool-ui/src/util/debounce.ts +22 -0
  707. package/src/legacy/tool-ui/src/util/getComponentKey.ts +25 -0
  708. package/src/legacy/tool-ui/src/util/noise.ts +51 -0
  709. package/src/legacy/tool-ui/src/util/repaint.ts +17 -0
  710. package/src/legacy/tool-ui/src/util/storage.ts +21 -0
  711. package/src/legacy/tool-ui/src/util/string.ts +15 -0
  712. package/src/legacy/tool-ui/src/util/svg.ts +46 -0
  713. package/src/legacy/tool-ui/src/util/throttle.ts +37 -0
  714. package/src/legacy/tool-ui/src/util/transition.ts +5 -0
  715. package/src/legacy/tool-ui/src/v5.css +149 -0
  716. package/src/legacy/tool-ui/src/v5.ts +2059 -0
  717. package/src/legacy/tool-ui/src/widget/README.md +27 -0
  718. package/src/legacy/tool-ui/src/widget/index.ts +160 -0
  719. package/dist/storybook/assets/if-defined-C1_PRAyA.js +0 -1
@@ -0,0 +1,2427 @@
1
+ import { announce } from '../../../dom/aria.ts'
2
+ import scrollIntoView from 'scroll-into-view'
3
+ import { v1 as uuidv1 } from 'uuid'
4
+ import create from './dom/create'
5
+ import find from './dom/find'
6
+ import findAll from './dom/findAll'
7
+ import insertBefore from './dom/insertBefore'
8
+ import insertFirst from './dom/insertFirst'
9
+ import insertLast from './dom/insertLast'
10
+ import onFind from './dom/onFind'
11
+ import onRemove from './dom/onRemove'
12
+ import Tether from './dom/Tether'
13
+ import debounce from './util/debounce'
14
+ import repaint from './util/repaint'
15
+ import Preview from './ViewPreview'
16
+ import PreviewOverlay from './PreviewOverlay'
17
+ import { toggleMenu, setupMenuForAria } from '../../../dom/popupMenu'
18
+ import onRTEReady from './dom/onRTEReady'
19
+
20
+ const tooltips = window.BRIGHTSPOT?.ui.tooltips
21
+
22
+ // Focus on the first input.
23
+ function focusByLabel(cig, selector) {
24
+ const id = cig.querySelector(selector)?.htmlFor
25
+
26
+ if (id) {
27
+ document.getElementById(id)?.focus()
28
+ }
29
+ }
30
+
31
+ const previewOverlays = new Map()
32
+ let selectedViewport = 0
33
+
34
+ // Minimum container width (px) to show both preview and widget panels simultaneously
35
+ const DUAL_PANEL_MIN_WIDTH = 900
36
+
37
+ onFind(['.ContentEdit.is-new', '.StandardForm.is-new'], (form) => {
38
+ if (document.querySelector('.Admin-nav')) return
39
+
40
+ const cig = form.querySelector('.CIG:not(:empty)')
41
+ if (!cig) return
42
+
43
+ let prevTab
44
+
45
+ for (const row of cig.querySelectorAll(':scope > [data-tab]')) {
46
+ const tab = row.dataset.tab
47
+
48
+ if (!prevTab) {
49
+ prevTab = tab
50
+ } else if (prevTab !== tab) {
51
+ // If there are multiple tabs, focus on the first input of the first tab.
52
+ onFind(cig, ':scope > .TabBar', (tb) => {
53
+ focusByLabel(
54
+ cig,
55
+ `:scope > .CIG-row:not(.inputContainer-readOnly)[data-tab="${
56
+ Array.prototype.filter.call(
57
+ tb.querySelectorAll('button[data-tab]'),
58
+ (i) => !i.hidden,
59
+ )[0]?.dataset.tab
60
+ }"] > .CIG-label > label`,
61
+ )
62
+ })
63
+ return
64
+ }
65
+ }
66
+
67
+ focusByLabel(
68
+ cig,
69
+ ':scope > .CIG-row:not(.inputContainer-readOnly) > .CIG-label > label',
70
+ )
71
+ })
72
+
73
+ // When editing existing content in popup, send focus to ContentEdit popup
74
+ onFind(
75
+ '.Popup[data-popup-source-class*="ContentSelector-edit"] button.Popup-heading',
76
+ (backButton) => {
77
+ backButton.focus()
78
+ },
79
+ )
80
+
81
+ // Move messages in top to main.
82
+ onFind('.ContentEdit-top .Message', (message) => {
83
+ const title = message
84
+ .closest('.ContentEdit')
85
+ .querySelector('.ContentEdit-main > .ContentEdit-title')
86
+ title.parentNode.insertBefore(message, title.nextSibling)
87
+ })
88
+
89
+ // Controls.
90
+ function appendControls(newList, oldList, tag) {
91
+ if (oldList) {
92
+ for (const item of findAll(oldList, tag)) {
93
+ newList.appendChild(tag === 'li' ? item : create('li', {}, item))
94
+ }
95
+
96
+ oldList.remove()
97
+ }
98
+ }
99
+
100
+ onFind('.ContentEdit', (edit) => {
101
+ const popup = edit.closest('.Popup-content')
102
+ if (popup) {
103
+ popup.classList.add('is-editing')
104
+ } else {
105
+ document.body.classList.add('is-editing')
106
+ }
107
+
108
+ const top = find(edit, '.widget-publishing')
109
+ if (!top) return
110
+
111
+ const list = create('ul', {
112
+ className: 'ContentEdit-controlsList',
113
+ role: 'menu',
114
+ 'aria-label': tooltips.actions?.contentEdit,
115
+ })
116
+ const onClassChange = (mutations) => {
117
+ mutations.forEach((mutation) => {
118
+ const target = mutation.target
119
+ const isLocked = target.classList.contains('is-locked')
120
+ target.querySelectorAll('[accesskey]').forEach((el) => {
121
+ isLocked
122
+ ? el.setAttribute('disabled', '')
123
+ : el.removeAttribute('disabled')
124
+ })
125
+ })
126
+ }
127
+ const observer = new MutationObserver(onClassChange)
128
+ observer.observe(edit, { attributeFilter: ['class'] })
129
+
130
+ const contentEditBar = find(edit, '.ContentEdit-bar')
131
+ const publishingExtraLeft = find(edit, '.widget-publishingExtra-left')
132
+ const saveElement = find(publishingExtraLeft, [
133
+ '[name="action-draft"]',
134
+ '[name="action-newDraft"]',
135
+ ])
136
+
137
+ const referenceNode =
138
+ find(contentEditBar, '.ContentEdit-workflow') ||
139
+ find(contentEditBar, '.ContentEdit-publish')
140
+
141
+ if (saveElement !== null) {
142
+ const saveClone = saveElement.cloneNode(true)
143
+
144
+ // If user sets a schedule but clicks Save then clear schedule date.
145
+ if (saveClone.name === 'action-draft') {
146
+ saveClone.addEventListener('click', () => {
147
+ const publishDateInput = edit.querySelector('input[name="publishDate"]')
148
+ if (publishDateInput) {
149
+ publishDateInput.value = ''
150
+ }
151
+ })
152
+ }
153
+
154
+ if (referenceNode) {
155
+ contentEditBar.insertBefore(saveClone, referenceNode)
156
+ } else {
157
+ contentEditBar.appendChild(saveClone)
158
+ }
159
+
160
+ if (
161
+ saveElement.closest('.ContentEdit').classList.contains('is-new') ||
162
+ saveElement.getAttribute('name') === 'action-draft'
163
+ ) {
164
+ saveElement.parentNode.remove()
165
+ } else {
166
+ saveClone.style.display = 'none'
167
+ }
168
+ }
169
+ appendControls(list, find(edit, '.widget-contentCreate'), 'li')
170
+ appendControls(list, publishingExtraLeft, 'li')
171
+ appendControls(list, find(edit, '.widgetControls'), 'a')
172
+ appendControls(list, find(edit, '.widget-publishingExtra-right'), 'li')
173
+ appendControls(list, find(edit, '.widget-publishing > .widget-controls'), 'a')
174
+
175
+ const full = find(list, '.widgetControlsEditInFull')
176
+ if (full && !edit.closest('.Popup')) full.closest('li').remove()
177
+
178
+ const controls = create('div', {
179
+ className: 'ContentEdit-controls',
180
+ })
181
+
182
+ const toggle = create('button', {
183
+ className: 'ContentEdit-controlsToggle',
184
+ type: 'button',
185
+ title: tooltips.actions?.actions,
186
+ 'aria-haspopup': 'menu',
187
+ 'aria-expanded': 'false',
188
+ 'aria-label': tooltips.actions?.contentEdit,
189
+ onclick: () => {
190
+ toggleMenu(list, toggle, controls)
191
+ },
192
+ })
193
+
194
+ setupMenuForAria(list, toggle)
195
+
196
+ controls.appendChild(toggle)
197
+ controls.appendChild(list)
198
+ controls.setAttribute('data-tether-anchor', '')
199
+ top.appendChild(controls)
200
+ })
201
+
202
+ onFind('.ContentEdit-controlsList .DraftAndReturnAction', (hiddenMenuItem) =>
203
+ hiddenMenuItem.setAttribute('aria-hidden', 'true'),
204
+ )
205
+
206
+ onFind('.ContentEdit-controlsList .NewDraftAndReturnAction', (hiddenMenuItem) =>
207
+ hiddenMenuItem.setAttribute('aria-hidden', 'true'),
208
+ )
209
+
210
+ // Restore.
211
+ onFind('.ContentEdit-restore', (restore) => {
212
+ const controls = restore.closest('.ContentEdit-controls')
213
+ controls.parentNode.insertBefore(restore, controls)
214
+
215
+ const toggle = create(
216
+ 'div',
217
+ {
218
+ className: 'ContentEdit-restoreToggle',
219
+ onclick: () => {
220
+ Tether.toggle(toggle, restore, () =>
221
+ restore.classList.toggle(
222
+ 'is-open',
223
+ toggle.classList.toggle('is-open'),
224
+ ),
225
+ )
226
+ },
227
+ },
228
+ restore.getAttribute('data-restore-label') || 'restore',
229
+ )
230
+ restore.parentNode.insertBefore(toggle, restore)
231
+ })
232
+
233
+ // Workflow.
234
+ onFind('.ContentEdit-workflow', (workflow) => {
235
+ const dialogContainer = workflow.closest('btu-dialog')
236
+
237
+ workflow.setAttribute('hidden', '')
238
+
239
+ const triggerCloseMenu = (event) => {
240
+ if (event.key === 'Escape') {
241
+ // When hosted by <dialog>, explicity call close().
242
+ // We can't rely on the jQuery popup close logic since workflow doesn't use it.
243
+ dialogContainer?.close(event)
244
+
245
+ toggle.click()
246
+ toggle.focus()
247
+ } else if (
248
+ event.key === 'Tab' &&
249
+ !document.activeElement.closest('.ContentEdit-workflow.is-open') &&
250
+ !document.activeElement.closest('.Popup.is-calendar') &&
251
+ !document.activeElement.matches('.Page') &&
252
+ document.activeElement !== toggle
253
+ ) {
254
+ toggle.click()
255
+ }
256
+ }
257
+
258
+ const popupClose = (event) => {
259
+ // in v5, the workflow popup logic is handled in dialog.ts
260
+ if (window.BRIGHTSPOT?.ui.cms.enableV5UI) return
261
+
262
+ const popup = event.target.closest('.Popup')
263
+ const proseMirror = find(
264
+ document,
265
+ '.ProseMirror-fullscreen-container:not(.hide)',
266
+ )
267
+
268
+ if (
269
+ (popup && !event.target.matches('.Popup-close')) ||
270
+ (proseMirror && event.target.closest('.ProseMirrorToolbar-action')) ||
271
+ event.target.closest('.ProseMirror-fullscreen-container') ||
272
+ event.target.matches('.rte2-toolbar-fullscreen')
273
+ ) {
274
+ toggle.click()
275
+ }
276
+ }
277
+
278
+ const first = find(
279
+ workflow,
280
+ '.ContentEdit-workflowWrapper > .ContentEdit-workflowBody',
281
+ )
282
+ let height = 0
283
+ const publish = find(workflow.parentNode, '.ContentEdit-publish')
284
+ const toggle = create(
285
+ 'button',
286
+ {
287
+ 'aria-expanded': false,
288
+ 'aria-haspopup': true,
289
+ className: 'ContentEdit-workflowToggle',
290
+ onclick: () => {
291
+ Tether.toggle(toggle, workflow, () => {
292
+ const isOpen = toggle.classList.toggle('is-open')
293
+ const popup = find(document, '.Popup')
294
+ const proseMirror = find(
295
+ document,
296
+ '.ProseMirror-fullscreen-container:not(.hide)',
297
+ )
298
+
299
+ if (isOpen) {
300
+ workflow.removeAttribute('hidden')
301
+ window.addEventListener('keyup', triggerCloseMenu)
302
+ window.addEventListener('click', popupClose)
303
+ } else {
304
+ window.removeEventListener('keyup', triggerCloseMenu)
305
+ if (!popup && !proseMirror) {
306
+ window.removeEventListener('click', popupClose)
307
+ }
308
+ }
309
+
310
+ toggle.setAttribute('aria-expanded', isOpen ? 'true' : 'false')
311
+ return workflow.classList.toggle('is-open', isOpen)
312
+ })
313
+
314
+ if (publish) {
315
+ for (const child of findAll(
316
+ workflow,
317
+ '.ContentEdit-workflowWrapper',
318
+ )) {
319
+ child.classList.toggle(
320
+ 'is-active',
321
+ child.getAttribute('data-name') === 'workflow',
322
+ )
323
+ }
324
+ }
325
+ },
326
+ type: 'button',
327
+ },
328
+ workflow.getAttribute('data-workflow-label') || 'Workflow',
329
+ )
330
+ workflow.parentNode.insertBefore(toggle, workflow)
331
+ workflow.closest('.ContentEdit').classList.add('is-workflow')
332
+
333
+ const buttons = workflow.querySelectorAll(
334
+ '.ContentEdit-workflowActions button[name="action-workflow"]',
335
+ )
336
+ const commentRequiredAttr = workflow.querySelector(
337
+ '.ContentEdit-workflowActions button[data-workflow-comment-required]',
338
+ )
339
+
340
+ if (commentRequiredAttr) {
341
+ onFind(
342
+ '.CIG-row[data-field-name="comment"] > .AutoExpand > textarea',
343
+ (textarea) => {
344
+ textarea.addEventListener('input', () => {
345
+ buttons.forEach((button) => {
346
+ if (button.disabled) {
347
+ if (textarea.value.trim() !== '') {
348
+ button.removeAttribute('disabled')
349
+ } else {
350
+ button.setAttribute('disabled', 'true')
351
+ }
352
+ } else if (textarea.value.trim() === '') {
353
+ button.setAttribute('disabled', 'true')
354
+ }
355
+ })
356
+ })
357
+ },
358
+ )
359
+ }
360
+
361
+ if (publish) {
362
+ find(
363
+ workflow,
364
+ '.ContentEdit-workflowWrapper[data-name="publishOverride"] > .ContentEdit-workflowBody',
365
+ ).appendChild(publish)
366
+ workflow.classList.add('is-publishOverride')
367
+
368
+ for (const link of findAll(
369
+ workflow,
370
+ '.ContentEdit-workflowWrapper > .ContentEdit-workflowLink',
371
+ )) {
372
+ link.addEventListener('click', (event) => {
373
+ event.preventDefault()
374
+ event.stopPropagation()
375
+ if (link.parentNode.getAttribute('data-name') === 'workflow') {
376
+ height = first.offsetHeight + '%'
377
+ }
378
+ for (const child of findAll(workflow, '.ContentEdit-workflowWrapper')) {
379
+ child.classList.toggle(
380
+ 'is-active',
381
+ child.getAttribute('data-name') ===
382
+ link.getAttribute('data-action'),
383
+ )
384
+ if (child.classList.contains('is-active')) {
385
+ child.querySelector('.DateTimeInput, .AutoExpand textarea')?.focus()
386
+ }
387
+ }
388
+ find(
389
+ workflow,
390
+ '.ContentEdit-workflowWrapper:not([data-name="workflow"]) > .ContentEdit-workflowBody',
391
+ ).style.height = height
392
+ })
393
+ }
394
+ }
395
+ })
396
+
397
+ // Change publish button state when scheduling.
398
+ onFind('.ContentEdit-publish .ContentEdit-publishButton', (button) => {
399
+ const publish = button.closest('.ContentEdit-publish')
400
+ const pdd = publish.querySelector('input[name="publishDate.date"]')
401
+ const pdt = publish.querySelector('input[name="publishDate.time"]')
402
+
403
+ if (!pdd || !pdt) {
404
+ return
405
+ }
406
+
407
+ const pdAnchor = publish.querySelector('.DateTimeInput')
408
+ const overrideMessage = find(
409
+ button.parentNode.parentNode,
410
+ '.ContentEdit-overrideMessage',
411
+ )
412
+
413
+ const oldButtonText = button.textContent
414
+
415
+ function onChange() {
416
+ if (pdd.value && pdt.value) {
417
+ publish.classList.add('is-scheduling')
418
+ button.innerText = button.getAttribute('data-schedule-label')
419
+ pdAnchor.classList.remove('is-empty')
420
+ } else {
421
+ publish.classList.remove('is-scheduling')
422
+ button.innerText = oldButtonText
423
+ pdAnchor.classList.add('is-empty')
424
+ }
425
+
426
+ if (overrideMessage) {
427
+ overrideMessage.innerHTML = publish.classList.contains('is-scheduling')
428
+ ? overrideMessage.getAttribute('data-schedule-message')
429
+ : overrideMessage.getAttribute('data-publish-message')
430
+ }
431
+ }
432
+
433
+ onChange()
434
+ pdd.addEventListener('change', onChange)
435
+ pdt.addEventListener('change', onChange)
436
+
437
+ const ns = publish.querySelector('select[name="newSchedule"]')
438
+
439
+ if (ns) {
440
+ ns.addEventListener('change', onChange)
441
+ }
442
+ })
443
+
444
+ // Change workflow transition button state when scheduling.
445
+ onFind('.ContentEdit-workflowActions .ContentEdit-publishButton', (button) => {
446
+ const workflowActions = button.closest('.ContentEdit-workflowActions')
447
+ const pdd = workflowActions.querySelector(
448
+ 'input.ContentEdit-workflowScheduleDate',
449
+ )
450
+ const pdt = workflowActions.querySelector(
451
+ 'input.ContentEdit-workflowScheduleTime',
452
+ )
453
+
454
+ if (!pdd || !pdt) {
455
+ return
456
+ }
457
+
458
+ const pdAnchor = workflowActions.querySelector(
459
+ '.ContentEdit-workflowScheduleLink',
460
+ )
461
+ const oldButtonText = button.textContent
462
+
463
+ function onChange() {
464
+ if (pdd.value && pdt.value) {
465
+ workflowActions.classList.add('is-scheduling')
466
+ button.innerText = button.getAttribute('data-schedule-label')
467
+ if (pdAnchor) {
468
+ pdAnchor.classList.remove('is-empty')
469
+ }
470
+ } else {
471
+ workflowActions.classList.remove('is-scheduling')
472
+ button.innerText = oldButtonText
473
+ if (pdAnchor) {
474
+ pdAnchor.classList.add('is-empty')
475
+ }
476
+ }
477
+ }
478
+
479
+ onChange()
480
+ pdd.addEventListener('change', onChange)
481
+ pdt.addEventListener('change', onChange)
482
+ })
483
+
484
+ const ls = window.localStorage
485
+
486
+ // Preview.
487
+ let previewFrameIndex = 0
488
+
489
+ //New Preview System
490
+ onFind('.ContentEdit', (edit) => {
491
+ const top = edit.querySelector('.ContentEdit-top')
492
+ if (!top) return
493
+ const contentId = edit.getAttribute('data-object-id')
494
+ const container = edit.closest('.Page-content, .Popup')
495
+ if (!container) return
496
+ const contentEditPreview = container.querySelector('.ContentEdit-preview')
497
+ if (!contentEditPreview) return
498
+ contentEditPreview.setAttribute('inert', '')
499
+ const previewFrame = contentEditPreview.querySelector('.PreviewFrame')
500
+ if (!previewFrame) return
501
+ const previewTypeFrame = contentEditPreview.querySelector(
502
+ '.PreviewFrame-typeFrame',
503
+ )
504
+ if (!previewTypeFrame) return
505
+
506
+ window.addEventListener('viewport-device-changed', (evt) => {
507
+ window.requestAnimationFrame(() => {
508
+ getPreviewFrame(contentId)?.contentWindow?.postMessage(
509
+ {
510
+ type: 'BSP.ContentEdit.ViewportDeviceChanged',
511
+ },
512
+ '*',
513
+ )
514
+ })
515
+ })
516
+
517
+ const page = edit.closest('.Page.is-previewToEdit')
518
+ if (page) {
519
+ container.setAttribute('data-preview-menu', false)
520
+ }
521
+
522
+ // ViewPreview.
523
+ const resizePreview = repaint(() => {
524
+ const previewTypeDisplay = previewTypeFrame.querySelector(
525
+ '.PreviewFrame-typeDisplay',
526
+ )
527
+ if (previewTypeDisplay) {
528
+ const frames = previewTypeDisplay.querySelectorAll('iframe')
529
+
530
+ if (frames.length < 1) {
531
+ return
532
+ }
533
+
534
+ const frame = frames[0]
535
+ const widthSelect = previewFrame.querySelector('.deviceWidthSelect')
536
+ let frameWidth = frame.getBoundingClientRect().width
537
+
538
+ frame.style.transform = ''
539
+ frame.style.width = ''
540
+
541
+ if (widthSelect) {
542
+ if (container) {
543
+ container.style.removeProperty('--ContentEdit-previewWidth')
544
+
545
+ const option = widthSelect.options[widthSelect.selectedIndex]
546
+
547
+ if (option) {
548
+ frameWidth = parseInt(option.getAttribute('data-device-width'), 10)
549
+ frame.style.width = `${frameWidth}px`
550
+
551
+ if (frameWidth < previewFrame.getBoundingClientRect().width) {
552
+ container.style.setProperty(
553
+ '--ContentEdit-previewWidth',
554
+ `${frameWidth}px`,
555
+ )
556
+ }
557
+ }
558
+ }
559
+ } else {
560
+ if (container) {
561
+ //No width control, so reset back to the default
562
+ container.style.removeProperty('--ContentEdit-previewWidth')
563
+ frame.style.width = ``
564
+ frameWidth = 1920
565
+ }
566
+ }
567
+ selectedViewport = frameWidth
568
+ // Do calculations after styles have been set to get accurate measurement.
569
+ const scale = previewTypeDisplay.clientWidth / frameWidth
570
+ frame.style.transform = `scale(${scale})`
571
+ frame.setAttribute('previewScale', scale)
572
+ frame.style.setProperty('--PreviewFrame-scale', scale)
573
+
574
+ PreviewOverlay.getOverlayWindow(
575
+ previewTypeFrame
576
+ .querySelector(':scope iframe:first-of-type')
577
+ .getAttribute('data-container-id'),
578
+ )?.dispatchEvent(new Event('resize'))
579
+ }
580
+ })
581
+ let preview = new Preview(previewFrame, resizePreview)
582
+
583
+ const deletePreview = function () {
584
+ setTimeout(function () {
585
+ preview.deletePreview()
586
+ }, 500)
587
+ }
588
+
589
+ const addDefaultEvents = function () {
590
+ window.addEventListener('resize', resizePreview)
591
+ edit.addEventListener('brightspot-content-state-change', () =>
592
+ preview.updatePreview(),
593
+ )
594
+ }
595
+
596
+ const removeDefaultEvents = function () {
597
+ window.removeEventListener('resize', resizePreview)
598
+ edit.removeEventListener('brightspot-content-state-change', () =>
599
+ preview.updatePreview(),
600
+ )
601
+ }
602
+
603
+ window.ContentEditFields = new Map()
604
+
605
+ const rootContentEdit = container.querySelector(
606
+ '.content-edit > .ContentEdit .ContentEdit-left',
607
+ )
608
+ // Find all the form inputs that may be used in Preview.
609
+ if (rootContentEdit) {
610
+ onFind(
611
+ rootContentEdit,
612
+ `.inputContainer[data-tab="Main"]:not([type="hidden"])`,
613
+ (inputElement) => {
614
+ const id = inputElement.dataset.name
615
+ const removeInvisible =
616
+ inputElement.closest('.TC-unselected') &&
617
+ window.ContentEditFields.has(id)
618
+ if (removeInvisible) {
619
+ window.ContentEditFields.delete(id)
620
+ } else {
621
+ window.ContentEditFields.set(id, inputElement)
622
+ }
623
+ },
624
+ )
625
+ }
626
+
627
+ onFind(edit, ':scope .ContentEdit-previewButton', (previewButton) => {
628
+ previewButton.type = 'button'
629
+ previewButton.ariaLabel = container.classList.contains('is-previewing')
630
+ ? tooltips.preview.close
631
+ : tooltips.preview.open
632
+ previewButton.title = previewButton.ariaLabel
633
+ const toolbar = previewButton.closest('.ContentEdit-toolbar')
634
+ previewButton.onclick = function () {
635
+ if (container.classList.toggle('is-previewing')) {
636
+ if (container.classList.contains('Popup')) {
637
+ container
638
+ .querySelector(':scope > .Popup-content')
639
+ ?.classList.add('is-previewing')
640
+ }
641
+ preview.isVisible = true
642
+ contentEditPreview.removeAttribute('inert')
643
+ previewButton.title = tooltips.preview.close
644
+ previewButton.ariaLabel = tooltips.preview.close
645
+ announce(tooltips.preview.opened)
646
+ ls.removeItem('BSP.ContentEdit.previewClosed')
647
+ preview.reloadPreview()
648
+ addDefaultEvents()
649
+ const activeTab = toolbar.querySelector(
650
+ 'button.is-active[data-right-tab]',
651
+ )
652
+ const shouldClosePanel = window.BRIGHTSPOT?.ui?.cms?.enableV5UI
653
+ ? container.offsetWidth < DUAL_PANEL_MIN_WIDTH
654
+ : true
655
+ if (shouldClosePanel && activeTab) {
656
+ const panel = edit.querySelector(
657
+ `.ContentEdit-right[data-right-tab="${activeTab.dataset.iconButtonName}"]`,
658
+ )
659
+ togglePanel(activeTab, panel, {
660
+ container: container,
661
+ updateStorage: true,
662
+ })
663
+ }
664
+ } else {
665
+ if (container.classList.contains('Popup')) {
666
+ container
667
+ .querySelector(':scope > .Popup-content')
668
+ ?.classList.remove('is-previewing')
669
+ }
670
+ preview.isVisible = false
671
+ contentEditPreview.setAttribute('inert', '')
672
+ previewButton.title = tooltips.preview.open
673
+ previewButton.ariaLabel = tooltips.preview.open
674
+ announce(tooltips.preview.closed)
675
+ ls.setItem('BSP.ContentEdit.previewClosed', 1)
676
+ deletePreview()
677
+ removeDefaultEvents()
678
+ }
679
+ }
680
+
681
+ if (
682
+ window.innerWidth >= 768 &&
683
+ !contentEditPreview.classList.contains('is-previewClosedByDefault') &&
684
+ !ls.getItem('BSP.ContentEdit.previewClosed') &&
685
+ !container.classList.contains('is-previewing')
686
+ ) {
687
+ previewButton.title = tooltips.preview.close
688
+ previewButton.onclick()
689
+ } else if (container.classList.contains('is-previewing')) {
690
+ /* Occasionally the local storage setting for previewClosed is out of sync with actual state.
691
+ In this case don't click the preview button but still update the preview and add the default events.
692
+ */
693
+ if (!preview.isVisible) preview.isVisible = true // ensure visibility flag is set for preview
694
+ preview.updatePreview()
695
+ addDefaultEvents()
696
+ contentEditPreview.removeAttribute('inert')
697
+ }
698
+ })
699
+ })
700
+
701
+ //Old Preview System
702
+ onFind('.ContentEdit', (edit) => {
703
+ const top = edit.querySelector('.ContentEdit-top')
704
+ if (!top) return
705
+ const container = edit.closest('.Page-content, .Popup')
706
+ if (!container) return
707
+ const preview = container.querySelector('.ContentEdit-preview')
708
+ if (!preview) return
709
+ let previewControls = preview.querySelector('.ContentEdit-previewControls')
710
+ if (!previewControls) return
711
+ let previewForm = previewControls.querySelector('form[id]')
712
+ if (!previewForm) return
713
+ let previewInput = previewForm.querySelector('input[name="_previewObject"]')
714
+ const display = preview.querySelector('.ContentEdit-previewDisplay')
715
+ if (!display) return
716
+ const previewTypes = preview.querySelector('.ContentEdit-previewTypes')
717
+ let shouldRefresh = true
718
+ const mainObjectId = edit.getAttribute('data-object-id')
719
+
720
+ const page = edit.closest('.Page.is-previewToEdit')
721
+ if (page) {
722
+ container.setAttribute('data-preview-menu', false)
723
+ }
724
+
725
+ // Move the ComboInputs that make up the secondary form UI into a new row container.
726
+ onFind('.ContentEdit-preview', (frame) => {
727
+ // Query for two different selectors since the preview controls could be loaded initially, or async when previewTypes are present.
728
+ onFind(
729
+ frame,
730
+ [
731
+ '.widget-preview > .ContentEdit-previewControls',
732
+ '.frame.loaded[name^="previewControls"] .ContentEdit-previewControls',
733
+ ],
734
+ (container) => {
735
+ const target = container.querySelector('form:last-of-type')
736
+ if (target) {
737
+ const secondary = create('div', {
738
+ class: 'ContentEdit-secondaryPreviewControls',
739
+ })
740
+ onFind(
741
+ target,
742
+ ':scope select:not(.deviceWidthSelect) + .ComboInput',
743
+ (combo) => {
744
+ secondary.appendChild(combo)
745
+ },
746
+ )
747
+ target.appendChild(secondary)
748
+ }
749
+ },
750
+ )
751
+ })
752
+
753
+ // Make sure that the preview form data is always up to date.
754
+ edit.addEventListener('brightspot-content-state-change', (event) => {
755
+ for (const input of findAll(
756
+ previewControls,
757
+ 'input[name="_previewObject"]',
758
+ )) {
759
+ input.value = event.detail
760
+ }
761
+ })
762
+
763
+ // Add the preview link.
764
+ const previewButton = document.createElement('A')
765
+ previewButton.className = 'ContentEdit-previewButton'
766
+ previewButton.href = '#'
767
+
768
+ const previewButtonWrapper = create(
769
+ 'div',
770
+ { className: 'ContentEdit-previewButtonWrapper' },
771
+ [
772
+ create('div', { className: 'ContentEdit-previewButtonCircle' }),
773
+ previewButton,
774
+ ],
775
+ )
776
+
777
+ const resizePreview = repaint(() => {
778
+ const frames = display.querySelectorAll('iframe')
779
+
780
+ if (frames.length < 1) {
781
+ return
782
+ }
783
+
784
+ const frame = frames[0]
785
+ const widthSelect = document.querySelector('.deviceWidthSelect')
786
+ let frameWidth = frame.getBoundingClientRect().width
787
+
788
+ frame.style.transform = ''
789
+ frame.style.width = ''
790
+ container.style.removeProperty('--ContentEdit-previewWidth')
791
+
792
+ if (widthSelect) {
793
+ const option = widthSelect.options[widthSelect.selectedIndex]
794
+
795
+ if (option) {
796
+ frameWidth = parseInt(option.getAttribute('data-device-width'), 10)
797
+ frame.style.width = `${frameWidth}px`
798
+
799
+ if (frameWidth < preview.getBoundingClientRect().width) {
800
+ container.style.setProperty(
801
+ '--ContentEdit-previewWidth',
802
+ `${frameWidth}px`,
803
+ )
804
+ }
805
+ }
806
+ }
807
+ selectedViewport = frameWidth
808
+
809
+ // Do calculations after styles have been set to get accurate measurement.
810
+ frame.style.transform = `scale(${display.clientWidth / frameWidth})`
811
+ })
812
+
813
+ window.ContentEditFields = new Map()
814
+
815
+ const rootContentEdit = container.querySelector(
816
+ '.content-edit > .ContentEdit .ContentEdit-left',
817
+ )
818
+ // Find all the form inputs that may be used in Preview.
819
+ if (rootContentEdit) {
820
+ onFind(
821
+ rootContentEdit,
822
+ `.inputContainer[data-tab="Main"]:not([type="hidden"])`,
823
+ (inputElement) => {
824
+ const id = inputElement.dataset.name
825
+ const removeInvisible =
826
+ inputElement.closest('.TC-unselected') &&
827
+ window.ContentEditFields.has(id)
828
+ if (removeInvisible) {
829
+ window.ContentEditFields.delete(id)
830
+ } else {
831
+ window.ContentEditFields.set(id, inputElement)
832
+ }
833
+ },
834
+ )
835
+ }
836
+
837
+ const updatePreview = debounce(1000, () => {
838
+ if (previewInput && previewInput.value === '') {
839
+ return
840
+ }
841
+
842
+ const frame = document.createElement('IFRAME')
843
+
844
+ frame.name = 'ContentEdit-previewFrame' + previewFrameIndex++
845
+ display.insertBefore(frame, display.firstChild)
846
+ frame.setAttribute('data-container-id', mainObjectId)
847
+
848
+ const popup = frame.closest('.Popup')
849
+ const toggleAnimation = (force = null) => {
850
+ const root = popup ?? document
851
+ root
852
+ .querySelector('.ContentEdit-previewButtonWrapper')
853
+ ?.classList.toggle('is-animating', force)
854
+ }
855
+
856
+ toggleAnimation(true)
857
+
858
+ resizePreview()
859
+
860
+ frame.onload = function () {
861
+ const nextFrames = []
862
+
863
+ for (let f = frame; (f = f.nextElementSibling); ) {
864
+ if (
865
+ f.tagName === 'IFRAME' &&
866
+ !f.classList.contains('Preview-overlayFrame')
867
+ ) {
868
+ nextFrames.push(f)
869
+ }
870
+ }
871
+
872
+ const p = frame.parentNode
873
+ nextFrames.forEach((f) => p.removeChild(f))
874
+
875
+ toggleAnimation(false)
876
+ }
877
+
878
+ onRemove(frame, () => toggleAnimation(false))
879
+
880
+ previewForm.target = frame.name
881
+ previewForm.submit()
882
+ })
883
+
884
+ const deletePreview = function () {
885
+ setTimeout(function () {
886
+ let previewIframes = display.querySelectorAll(':scope > iframe')
887
+ previewIframes.forEach((iframe) => iframe.remove())
888
+ }, 500)
889
+ }
890
+
891
+ const addDefaultEvents = function () {
892
+ window.addEventListener('resize', resizePreview)
893
+ edit.addEventListener('brightspot-content-state-change', updatePreview)
894
+ }
895
+
896
+ const removeDefaultEvents = function () {
897
+ window.removeEventListener('resize', resizePreview)
898
+ edit.removeEventListener('brightspot-content-state-change', updatePreview)
899
+ }
900
+
901
+ if (previewTypes) {
902
+ onFind('.ContentEdit-previewTypesForm', (previewTypesForm) => {
903
+ const selection = previewTypesForm.querySelector(
904
+ 'select[name="previewType"]',
905
+ )
906
+ shouldRefresh =
907
+ selection.selectedOptions[0].getAttribute('data-refresh') === 'true'
908
+
909
+ selection.onchange = function () {
910
+ display.innerHTML = ''
911
+ shouldRefresh =
912
+ selection.selectedOptions[0].getAttribute('data-refresh') === 'true'
913
+ updatePreview()
914
+ }
915
+
916
+ const previewTypeFrame = previewTypes.querySelector(
917
+ 'div[name^="previewControls"]',
918
+ )
919
+ previewTypeFrame.onload = function () {
920
+ const previousInputValue = previewInput?.value
921
+
922
+ // Override local variable values
923
+ previewControls = previewTypeFrame.querySelector(
924
+ '.ContentEdit-previewControls',
925
+ )
926
+ previewForm = previewControls.querySelector('form[id]')
927
+ previewInput = previewForm.querySelector('input[name="_previewObject"]')
928
+
929
+ if (previewInput && previewInput.value === '') {
930
+ previewInput.value = previousInputValue
931
+ }
932
+
933
+ if (
934
+ container.classList.contains('is-previewing') &&
935
+ (shouldRefresh ||
936
+ selection.options[selection.selectedIndex].getAttribute(
937
+ 'data-refresh',
938
+ ) === 'true')
939
+ ) {
940
+ updatePreview()
941
+ addDefaultEvents()
942
+ } else {
943
+ removeDefaultEvents()
944
+ }
945
+ }
946
+ })
947
+ }
948
+
949
+ previewButton.onclick = function () {
950
+ if (container.classList.toggle('is-previewing')) {
951
+ ls.removeItem('BSP.ContentEdit.previewClosed')
952
+ ls.removeItem('BSP.ContentEdit.rightPanel')
953
+ if (!window.BRIGHTSPOT?.ui?.cms?.enableV5UI) {
954
+ container.style.setProperty('--ContentEdit-rightWidth', '0px')
955
+ }
956
+ preview.removeAttribute('inert')
957
+ if (shouldRefresh) {
958
+ updatePreview()
959
+ addDefaultEvents()
960
+ }
961
+ } else {
962
+ ls.setItem('BSP.ContentEdit.previewClosed', 1)
963
+ preview.setAttribute('inert', '')
964
+ if (shouldRefresh) {
965
+ removeDefaultEvents()
966
+ deletePreview()
967
+ }
968
+ }
969
+
970
+ return false
971
+ }
972
+
973
+ top.insertBefore(previewButtonWrapper, top.firstChild)
974
+
975
+ if (
976
+ window.innerWidth >= 768 &&
977
+ !preview.classList.contains('is-previewClosedByDefault') &&
978
+ !ls.getItem('BSP.ContentEdit.previewClosed')
979
+ ) {
980
+ previewButton.onclick()
981
+ }
982
+ })
983
+
984
+ // Display the current overlay in the title and allow it to be changed.
985
+ onFind('.ContentEdit-title', (title) => {
986
+ const form = title.closest('form')
987
+
988
+ if (!form) return
989
+
990
+ // The title is reparented because it needs to stay put when the "leftSide" animates when opening/closing live preview.
991
+ form.insertAdjacentElement('afterbegin', title)
992
+
993
+ const list = find(title.closest('.content-edit'), '.ContentEdit-overlayList')
994
+ if (!list) return
995
+
996
+ title.insertBefore(
997
+ create(
998
+ 'button',
999
+ {
1000
+ className: 'ContentEdit-overlay',
1001
+ type: 'button',
1002
+ 'aria-haspopup': 'true',
1003
+ 'aria-expanded': 'false',
1004
+ 'aria-label': find(list, 'li.selected').textContent,
1005
+ onclick: (e) => {
1006
+ toggleMenu(list, e.target)
1007
+ },
1008
+ },
1009
+ find(list, 'li.selected').textContent,
1010
+ ),
1011
+ title.firstChild,
1012
+ )
1013
+
1014
+ const button = title.querySelector('.ContentEdit-overlay')
1015
+ setupMenuForAria(list, button)
1016
+ })
1017
+
1018
+ const getPreviewFrame = (mainObjectId) => {
1019
+ let frame
1020
+ if (!mainObjectId) {
1021
+ frame = document.querySelector(
1022
+ '.ContentEdit-previewDisplay iframe:first-of-type',
1023
+ )
1024
+ if (!frame) {
1025
+ frame = document.querySelector(
1026
+ '.PreviewFrame-typeDisplay iframe:first-of-type',
1027
+ )
1028
+ }
1029
+ } else {
1030
+ frame = document.querySelector(
1031
+ `iframe[data-container-id="${mainObjectId}"]`,
1032
+ )
1033
+ }
1034
+ return frame
1035
+ }
1036
+
1037
+ // TODO: delete, `is-overlaid` no longer used
1038
+ // Add overlaid field count to the tabs.
1039
+ onFind('.CIG > .TabBar', (bar) => {
1040
+ const cig = bar.closest('.CIG')
1041
+
1042
+ onFind(cig, '.CIG-row.is-overlaid', (row) => {
1043
+ const tab = row.dataset.tab
1044
+ const item = find(bar, `:scope > .TabBar-item[data-tab="${tab}"]`)
1045
+ if (!item) return
1046
+
1047
+ let count = 0
1048
+
1049
+ for (const row of findAll(cig, `:scope > [data-tab="${tab}"]`)) {
1050
+ count += row.classList.contains('is-overlaid')
1051
+ ? 1
1052
+ : findAll(row, '.is-overlaid').length
1053
+ }
1054
+
1055
+ const badge = find(item, ':scope > .Badge')
1056
+
1057
+ if (count > 0) {
1058
+ if (badge) {
1059
+ badge.textContent = count
1060
+ } else {
1061
+ insertLast(create('div', { className: 'Badge' }, count), item)
1062
+ }
1063
+ } else {
1064
+ badge.remove()
1065
+ }
1066
+ })
1067
+ })
1068
+
1069
+ // Move workstream to the top.
1070
+ onFind(
1071
+ ['.Page-content .publishing-workflow', '.Popup .publishing-workflow'],
1072
+ (message) => {
1073
+ const progressText = find(message, ':scope > .progress')
1074
+ const actions = find(message, ':scope > ul')
1075
+ const skip = find(actions, '.icon-step-forward')
1076
+ const stop = find(actions, '.icon-stop')
1077
+
1078
+ message.closest('.Page-content, .Popup').classList.add('is-workstream')
1079
+ message.classList.add('ContentEdit-workstreamMessage')
1080
+ message.removeAttribute('style')
1081
+ progressText.classList.add('ContentEdit-workstreamProgressText')
1082
+ progressText.removeAttribute('style')
1083
+ actions.classList.add('ContentEdit-workstreamActions')
1084
+ skip.classList.add('ContentEdit-workstreamSkip')
1085
+ stop.classList.add('ContentEdit-workstreamStop')
1086
+
1087
+ insertFirst(
1088
+ message,
1089
+ insertBefore(
1090
+ create(
1091
+ 'div',
1092
+ { className: 'ContentEdit-workstream' },
1093
+ create(
1094
+ 'div',
1095
+ { className: 'ContentEdit-workstreamProgress' },
1096
+ find(progressText, ':scope > .progressBar'),
1097
+ progressText,
1098
+ ),
1099
+ actions,
1100
+ ),
1101
+ message,
1102
+ ),
1103
+ )
1104
+ },
1105
+ )
1106
+
1107
+ // Finds the TabBar trigger element given a descendant element.
1108
+ const findTabs = (el) => {
1109
+ if (!el) return
1110
+
1111
+ let elem = el
1112
+ let tab = null
1113
+
1114
+ let selectedTabs = []
1115
+
1116
+ const queryForTab = function (el) {
1117
+ return !el ? null : el.closest('[data-tab]')
1118
+ }
1119
+
1120
+ for (;;) {
1121
+ tab = queryForTab(elem)
1122
+ if (tab) {
1123
+ const tbName = tab.getAttribute('data-tab')
1124
+ const tbBar = tab.parentNode.querySelector(':scope > .TabBar')
1125
+ if (tbBar) {
1126
+ selectedTabs.push(tbBar.querySelector(`[data-tab="${tbName}"]`))
1127
+ }
1128
+ elem = tab.parentNode
1129
+ } else {
1130
+ break
1131
+ }
1132
+ }
1133
+
1134
+ return selectedTabs
1135
+ }
1136
+
1137
+ // Triggers Tab selection given a descendant element.
1138
+ const selectTab = (descendantEl) => {
1139
+ const tabs = findTabs(descendantEl)
1140
+
1141
+ tabs.forEach((tab) => {
1142
+ if (tab && !tab.classList.contains('is-selected')) {
1143
+ tab.click()
1144
+ }
1145
+ })
1146
+ }
1147
+
1148
+ const findEditUIByOverlay = (id, name) => {
1149
+ const cig = find(document, `.CIG-row[data-name='${id}/${name}']`)
1150
+ const eig = find(document, `.EIG-title[data-object-id='${id}']`)
1151
+ const option = find(
1152
+ document,
1153
+ `option[value='${id}'], input.objectId[value='${id}']`,
1154
+ )
1155
+ const rteEnhancement = find(
1156
+ document,
1157
+ `[data-rte-container] .Enhancement[data-state*="${id}"]`,
1158
+ )
1159
+ const repeatableCig = find(document, `.RCIG-title[data-object-id="${id}"]`)
1160
+ if (cig) {
1161
+ // Try to find a more specific RCS...
1162
+ const rcs = cig.querySelector(
1163
+ `:scope .RCS ol[data-sortable-input-name='${id}/${name}']`,
1164
+ )
1165
+ if (rcs) {
1166
+ return { type: 'RCS', element: rcs }
1167
+ } else {
1168
+ return { type: 'CIG', element: cig }
1169
+ }
1170
+ } else if (option) {
1171
+ return { type: 'OPTION', element: option }
1172
+ } else if (rteEnhancement) {
1173
+ return { type: 'ENHANCEMENT', element: rteEnhancement }
1174
+ } else if (eig) {
1175
+ return { type: 'EIG', element: eig }
1176
+ } else if (repeatableCig) {
1177
+ return { type: 'RCIG', element: repeatableCig }
1178
+ } else {
1179
+ console.debug('Form element does not exist for the preview overlay')
1180
+ return null
1181
+ }
1182
+ }
1183
+
1184
+ const openFormFieldPopup = (element, modal, edit, label) => {
1185
+ if (element.classList.contains('is-new-item')) {
1186
+ element.classList.remove('is-new-item')
1187
+ }
1188
+ const container = element.closest('.is-preview-menu')
1189
+ if (!container) {
1190
+ return
1191
+ }
1192
+ const parent = element.parentNode
1193
+ let popupContainer
1194
+ const nextSibling = element.nextElementSibling
1195
+ const closeField = () => {
1196
+ modal.classList.remove('is-visible')
1197
+ popupContainer.removeChild(actions)
1198
+ if (popupHeading) {
1199
+ popupContainer.removeChild(popupHeading)
1200
+ }
1201
+ const clear =
1202
+ element.classList.contains('RCS-item') &&
1203
+ element.querySelector(':scope > .ContentSelector-clear')
1204
+ if (clear) {
1205
+ clear.classList.remove('is-visible')
1206
+ }
1207
+ parent.insertBefore(element, nextSibling)
1208
+ popupContainer.remove()
1209
+ }
1210
+ const cancelButton = create('div', {
1211
+ className: 'Preview-popupCancel',
1212
+ onclick: (event) => {
1213
+ closeField()
1214
+ },
1215
+ })
1216
+ const saveButton = document.createElement('button')
1217
+ saveButton.classList.add('is-save')
1218
+ saveButton.classList.add('is-dominant')
1219
+ saveButton.textContent = 'Save & Close'
1220
+ const actions = create('div', { className: 'ActionBar' })
1221
+ actions.appendChild(saveButton)
1222
+ let popupHeading
1223
+ if (label) {
1224
+ popupHeading = create('div', { className: 'Preview-popupHeading' }, label)
1225
+ }
1226
+ popupContainer = create(
1227
+ 'div',
1228
+ {
1229
+ className: 'Preview-popup is-previewEditing',
1230
+ },
1231
+ popupHeading,
1232
+ element,
1233
+ cancelButton,
1234
+ actions,
1235
+ )
1236
+ edit.appendChild(popupContainer)
1237
+ saveButton.addEventListener('click', (event) => {
1238
+ closeField()
1239
+ })
1240
+ modal.classList.add('is-visible')
1241
+ }
1242
+
1243
+ window.addEventListener('message', async ({ data }) => {
1244
+ if (typeof data !== 'object') return
1245
+
1246
+ const id = data.id
1247
+ const type = data.type
1248
+ const name = data.name
1249
+
1250
+ if (type === 'BSP.Preview.onChangedHeight') {
1251
+ const edit = document.querySelector(
1252
+ `.ContentEdit[data-object-id="${data.previewContainerId}"]`,
1253
+ )
1254
+ if (edit) {
1255
+ const container = edit.closest('.Page-content, .Popup')
1256
+ const contentEditPreview = container?.querySelector(
1257
+ '.ContentEdit-preview',
1258
+ )
1259
+ contentEditPreview?.style.setProperty(
1260
+ '--PreviewFrame-height',
1261
+ `${data.height}px`,
1262
+ )
1263
+ }
1264
+ } else if (type === 'BSP.Preview.OverlayClick') {
1265
+ const parentFields = data.parentFields
1266
+ const hasFormField = data.hasFormField
1267
+
1268
+ const scrollToEditUI = () => {
1269
+ const ui = findEditUIByOverlay(id, name)
1270
+ if (!ui) return
1271
+ findAll(document.body, '.RCIG-item').forEach((item) => {
1272
+ const title = find(item, ':scope > .RCIG-title')
1273
+ if (!title) return
1274
+ if (item.contains(ui.element) || item.isEqualNode(ui.element)) {
1275
+ // expand collapsed RCIG-items that contain the clicked element or are the element
1276
+ if (item.classList.contains('is-collapsed')) {
1277
+ title.click()
1278
+ }
1279
+ } else if (!item.classList.contains('is-collapsed')) {
1280
+ // collapse all the other expandable items that do not contain the clicked element
1281
+ // or are not the element itself
1282
+ title.click()
1283
+ }
1284
+ })
1285
+ const cigRow = ui.element.closest('.CIG-row')
1286
+ if (cigRow && cigRow.classList.contains('is-inHiddenCluster')) {
1287
+ for (let n = cigRow; (n = n.previousElementSibling); ) {
1288
+ if (n.classList.contains('CIG-title')) {
1289
+ n.click()
1290
+ break
1291
+ }
1292
+ }
1293
+ }
1294
+ selectTab(ui.element)
1295
+ const evt = new MouseEvent('click', {
1296
+ bubbles: true,
1297
+ cancelable: true,
1298
+ view: window,
1299
+ })
1300
+ if (ui.type === 'CIG' || ui.type === 'EIG') {
1301
+ // Refine the match if we can identify the item that this CIG is within.
1302
+ scrollIntoView(ui.element, { align: { top: 0, topOffset: 10 } })
1303
+ const elmFocus = ui.element.querySelector('.CIG-small')
1304
+ if (elmFocus) {
1305
+ onFind(
1306
+ elmFocus,
1307
+ [
1308
+ ':scope > btu-input input',
1309
+ ':scope > textarea',
1310
+ ':scope > btu-textarea-input > textarea',
1311
+ ':scope > .ComboInput',
1312
+ ':scope > input',
1313
+ ],
1314
+ (inputField) => {
1315
+ const proseMirror = elmFocus.querySelector(
1316
+ '.ProseMirrorContainer > .ProseMirror',
1317
+ )
1318
+ if (proseMirror) {
1319
+ proseMirror.focus()
1320
+ } else {
1321
+ inputField.focus()
1322
+ }
1323
+ },
1324
+ )
1325
+ }
1326
+ } else if (ui.type === 'RCS') {
1327
+ const targetEl = ui.element.closest('.CIG-small')
1328
+ if (targetEl.classList.contains('RCS')) {
1329
+ let rcsTarget = ui.element.closest('.RCS-item') ?? targetEl
1330
+ scrollIntoView(rcsTarget, {
1331
+ align: { top: 0, topOffset: 10 },
1332
+ })
1333
+ rcsTarget.dispatchEvent(evt)
1334
+ } else {
1335
+ if (targetEl) {
1336
+ onFind(targetEl, ':scope > .ComboInput', (inputField) => {
1337
+ inputField.focus()
1338
+ })
1339
+ }
1340
+ scrollIntoView(ui.element.closest('.CIG-row'), {
1341
+ align: { top: 0, topOffset: 10 },
1342
+ })
1343
+ }
1344
+ ui.element.dispatchEvent(evt)
1345
+ } else if (ui.type === 'OPTION') {
1346
+ const targetEl = ui.element.closest('.CIG-small')
1347
+ if (targetEl.classList.contains('RCS')) {
1348
+ let rcsTarget = ui.element.closest('.RCS-item') ?? targetEl
1349
+ scrollIntoView(rcsTarget, {
1350
+ align: { top: 0, topOffset: 0 },
1351
+ })
1352
+ rcsTarget.dispatchEvent(evt)
1353
+ } else {
1354
+ if (targetEl) {
1355
+ onFind(targetEl, ':scope > .ComboInput', (inputField) => {
1356
+ inputField.focus()
1357
+ })
1358
+ }
1359
+ scrollIntoView(ui.element.closest('.CIG-row'), {
1360
+ align: { top: 0, topOffset: 10 },
1361
+ })
1362
+ }
1363
+ ui.element.dispatchEvent(evt)
1364
+ } else if (ui.type === 'RCIG') {
1365
+ scrollIntoView(ui.element, {
1366
+ align: { top: 0, topOffset: 10 },
1367
+ })
1368
+ } else if (ui.type === 'ENHANCEMENT') {
1369
+ let topOffset,
1370
+ toolbarHeight = 0
1371
+ const rteContainer = ui.element.closest('.ProseMirrorContainer')
1372
+ if (rteContainer) {
1373
+ toolbarHeight = rteContainer.querySelector(
1374
+ '.ProseMirrorToolbar',
1375
+ )?.offsetHeight
1376
+ }
1377
+ let marginTop = parseInt(window.getComputedStyle(ui.element).marginTop)
1378
+ if (!isNaN(marginTop)) {
1379
+ topOffset = Math.abs(toolbarHeight - marginTop)
1380
+ }
1381
+ scrollIntoView(ui.element, {
1382
+ align: { top: 0, topOffset: topOffset },
1383
+ })
1384
+ }
1385
+
1386
+ if (data.behavior) {
1387
+ let parentEl = ui.element
1388
+ if (ui.type === 'OPTION' && parentEl.closest('.RCS-item')) {
1389
+ parentEl = parentEl.closest('.RCS-item')
1390
+ }
1391
+ const sharedElement = parentEl.querySelector('.ContentSelector-edit')
1392
+ sharedElement?.click()
1393
+ }
1394
+ if (!hasFormField) {
1395
+ parentFields.push({
1396
+ id: data.id,
1397
+ name: data.name,
1398
+ })
1399
+ const overlayWindow = PreviewOverlay.getOverlayWindow(
1400
+ data.previewContainerId,
1401
+ )
1402
+ overlayWindow.postMessage(
1403
+ {
1404
+ type: 'BSP.Preview.UpdateOverlays',
1405
+ overlays: parentFields,
1406
+ },
1407
+ '*',
1408
+ )
1409
+ }
1410
+ }
1411
+
1412
+ const loadEditUI = (parentData) => {
1413
+ const parentKey = parentData.key
1414
+ const { id, name, overlayType, isEnhancement } = data
1415
+ let selector
1416
+ if (isEnhancement) {
1417
+ selector = `.CIG-row[data-name='${parentKey}'] .ProseMirrorContainer`
1418
+ } else if (overlayType === 'bspField') {
1419
+ selector = `.CIG-row[data-name='${id}/${name}']`
1420
+ } else if (overlayType === 'bspModule') {
1421
+ if (parentData.ui.type === 'RCS') {
1422
+ selector = `input.objectId[value="${id}"]`
1423
+ } else {
1424
+ selector = `.repeatableLabel[data-object-id="${id}"]`
1425
+ }
1426
+ }
1427
+
1428
+ onFind(selector, () => {
1429
+ scrollToEditUI()
1430
+ })
1431
+ }
1432
+
1433
+ if (!hasFormField) {
1434
+ // if there is no field yet expand all the collapsed parent fields
1435
+ let promises = []
1436
+ parentFields.forEach((field, index) => {
1437
+ const { id, name, type } = field
1438
+ let selector = ''
1439
+ if (type === 'bspField') {
1440
+ selector = `.CIG-row[data-name='${id}/${name}']`
1441
+ } else if (type === 'bspModule') {
1442
+ selector = `.repeatableLabel[data-object-id="${id}"]`
1443
+ }
1444
+ const expandItem = (resolve, reject) => {
1445
+ onFind(selector, () => {
1446
+ let ui = findEditUIByOverlay(id, name)
1447
+ if (!ui) {
1448
+ reject(
1449
+ 'Could not load edit ui: fields for one or more parent overlay(s) are missing in the form',
1450
+ )
1451
+ return
1452
+ }
1453
+ const editElement = ui.element
1454
+ scrollIntoView(editElement, { align: { top: 0, topOffset: 10 } })
1455
+
1456
+ if (data.isEnhancement) {
1457
+ /* Find RTE enhancement and scroll it into view */
1458
+ onRTEReady((rte) => {
1459
+ const enhancementElement = rte.view.dom.querySelector(
1460
+ `[data-state*='_id":"${data.id}']`,
1461
+ )
1462
+
1463
+ if (enhancementElement) {
1464
+ scrollIntoView(enhancementElement)
1465
+ enhancementElement.click()
1466
+ }
1467
+ }, editElement.querySelector('textarea.richtext'))
1468
+ }
1469
+
1470
+ if (ui.type === 'RCIG' && editElement?.closest('.is-collapsed')) {
1471
+ editElement.click()
1472
+ }
1473
+ const cigRow = editElement.closest('.CIG-row')
1474
+ if (cigRow && cigRow.classList.contains('is-inHiddenCluster')) {
1475
+ for (let n = cigRow; (n = n.previousElementSibling); ) {
1476
+ if (n.classList.contains('CIG-title')) {
1477
+ n.click()
1478
+ break
1479
+ }
1480
+ }
1481
+ }
1482
+
1483
+ if (resolve) {
1484
+ resolve({ ui: ui, key: id + '/' + name })
1485
+ }
1486
+ })
1487
+ }
1488
+ promises.push(
1489
+ new Promise((resolve, reject) => {
1490
+ expandItem(resolve, reject)
1491
+ }),
1492
+ )
1493
+ })
1494
+
1495
+ Promise.all(promises)
1496
+ .then((parents) => {
1497
+ const immediateParent = parents[parents.length - 1]
1498
+ loadEditUI(immediateParent)
1499
+ })
1500
+ .catch((error) => {
1501
+ console.debug(error)
1502
+ })
1503
+ } else {
1504
+ // scroll to the edit element
1505
+ scrollToEditUI()
1506
+ }
1507
+ } else if (type === 'BSP.Preview.ContentLoad') {
1508
+ const edit = document.querySelector(
1509
+ `.ContentEdit[data-object-id="${data.previewContainerId}"]`,
1510
+ )
1511
+ const isPreviewOpen =
1512
+ edit?.closest('.Page-content.is-previewing') ||
1513
+ edit?.closest('.Popup.is-previewing')
1514
+ const activeElement = document.activeElement
1515
+ let isPreviewFocused =
1516
+ activeElement.closest('.Preview-overlayFrame') ||
1517
+ activeElement.closest(
1518
+ `iframe[data-container-id="${data.previewContainerId}"]`,
1519
+ )
1520
+ // check to see if the preview pane is open and user is hovering over it
1521
+ let deferPreviewInit = !isPreviewOpen || !isPreviewFocused ? true : false
1522
+ const previewFrame = getPreviewFrame(data.previewContainerId)
1523
+ // update data-defer-init attribute for preview & preview overlay frame everytime preview refreshes
1524
+ // to check if the dom parsing and overlay rendering should run
1525
+ previewFrame?.contentWindow.postMessage(
1526
+ {
1527
+ type: 'BSP.Preview.UpdateInitToggle',
1528
+ deferPreviewInit,
1529
+ },
1530
+ '*',
1531
+ )
1532
+ let overlayWindow = PreviewOverlay.getOverlayWindow(data.previewContainerId)
1533
+ overlayWindow?.postMessage(
1534
+ {
1535
+ type: 'BSP.Preview.UpdateInitToggle',
1536
+ deferPreviewInit,
1537
+ },
1538
+ '*',
1539
+ )
1540
+ } else if (type === 'BSP.Preview.DOMParsed') {
1541
+ // Check if the preview is open before rendering the overlays
1542
+ const edit = document.querySelector(
1543
+ `.ContentEdit[data-object-id="${data.previewContainerId}"]`,
1544
+ )
1545
+ const isPreviewToEditParticipating =
1546
+ edit?.closest('.Page-content.is-previewing') ||
1547
+ edit?.closest('.Popup.is-previewing')
1548
+
1549
+ if (!isPreviewToEditParticipating) return
1550
+
1551
+ // Determine which markers should result in Overlays being rendered.
1552
+ let filteredOverlays = new Map()
1553
+
1554
+ const updateOverlays = (key, overlay, parent) => {
1555
+ filteredOverlays.set(key, overlay)
1556
+ if (!parent) return
1557
+ if (parent.type === 'bspModule' && !parent.dimensions) {
1558
+ if (parent.childKeys) {
1559
+ parent.childKeys.push(key)
1560
+ } else {
1561
+ parent.childKeys = [key]
1562
+ }
1563
+ }
1564
+ }
1565
+
1566
+ // Recursive method to find all the form fields and connect them to p2e overlays
1567
+ const getEditElements = (
1568
+ fieldId,
1569
+ parentContainer,
1570
+ parentObj,
1571
+ parentKey,
1572
+ overlayKey,
1573
+ ) => {
1574
+ const isRoot = fieldId === data.previewContainerId
1575
+ const overlay = filteredOverlays.get(overlayKey)
1576
+
1577
+ const rcig = parentContainer.querySelector(
1578
+ `.RCIG-title[data-object-id="${fieldId}"]`,
1579
+ )
1580
+ const eig = parentContainer.querySelector(
1581
+ `.EIG-title[data-object-id="${fieldId}"]`,
1582
+ )
1583
+
1584
+ let contentEditElements
1585
+ let elm
1586
+
1587
+ const objectInput = parentContainer.querySelector(
1588
+ `.objectInputs[data-object-id="${fieldId}"]`,
1589
+ )
1590
+ // For form fields inside a collapsible cluster/widget that are not yet loaded
1591
+ // Will be using data state object to setup overlays map and their hierarchy
1592
+ if ((rcig || eig) && !objectInput) {
1593
+ let childDataKeys = []
1594
+ const immediateParent = parentContainer.querySelector(
1595
+ `input[name="${parentKey}.id"][value="${fieldId}"]`,
1596
+ )?.parentNode
1597
+ const val = immediateParent?.querySelector(
1598
+ `input[name="${parentKey}.data"]`,
1599
+ ).value
1600
+ if (val) {
1601
+ const childData = JSON.parse(val)
1602
+ const recursiveSearch = (obj, keys, parentObj, isEnhancement) => {
1603
+ let moduleKey = parentObj.children?.find((chKey) => {
1604
+ return chKey.split('/')[0] === obj._id
1605
+ })
1606
+ let realParent = parentObj
1607
+ if (moduleKey) {
1608
+ const pOb = data.overlays.get(moduleKey)
1609
+ let overlayData = {
1610
+ id: moduleKey.split('/')[0],
1611
+ hasFormField: false,
1612
+ parentKey: parentObj.id + '/' + parentObj.name,
1613
+ parentRoot: parentObj.parentRoot,
1614
+ depth: parentObj.depth + 1,
1615
+ type: 'bspModule',
1616
+ name: moduleKey.split('/')[1],
1617
+ }
1618
+ if (pOb) {
1619
+ overlayData = Object.assign(overlayData, pOb)
1620
+ }
1621
+ updateOverlays(moduleKey, overlayData, parentObj)
1622
+ realParent = overlayData
1623
+ }
1624
+ keys.forEach((k) => {
1625
+ if (!/^_|^theme./.test(k)) {
1626
+ let o
1627
+ let isCigSelect
1628
+ let isDropdown
1629
+ const val = obj[k]
1630
+ if (obj._id) {
1631
+ const cKey = obj._id + '/' + k
1632
+ childDataKeys.push(cKey)
1633
+ const extn = data.overlays.get(cKey)
1634
+ if (extn) {
1635
+ if (val && typeof val === 'object') {
1636
+ isCigSelect = Object.keys(val).includes(extn.name)
1637
+ const relevantKey = Object.keys(val).find((rk) => {
1638
+ return !/^_|^theme./.test(rk)
1639
+ })
1640
+ if (!relevantKey) {
1641
+ isDropdown = true
1642
+ }
1643
+ }
1644
+ if (!isCigSelect || isEnhancement) {
1645
+ o = Object.assign(
1646
+ {
1647
+ parentKey: realParent.id + '/' + realParent.name,
1648
+ parentRoot: realParent.parentRoot,
1649
+ depth: realParent.depth + 1,
1650
+ isInitialized: true,
1651
+ hasFormField: false,
1652
+ isShared: obj[k]._ref ? cKey + '_acEdit' : null,
1653
+ isEnhancement: !!isEnhancement,
1654
+ isDropdown,
1655
+ },
1656
+ extn,
1657
+ )
1658
+ updateOverlays(cKey, o, realParent)
1659
+ }
1660
+ }
1661
+ }
1662
+ if (!isEnhancement) {
1663
+ if (isCigSelect) {
1664
+ o = realParent
1665
+ } else if (!o) {
1666
+ o = parentObj
1667
+ }
1668
+ if (val) {
1669
+ if (typeof val === 'object') {
1670
+ if (Array.isArray(val)) {
1671
+ val.forEach((child) => {
1672
+ if (child._ref) {
1673
+ const rcsKey = o.children?.find((chKey) => {
1674
+ return child._ref === chKey.split('/')[0]
1675
+ })
1676
+ const rcsExtn = data.overlays.get(rcsKey)
1677
+ if (rcsExtn) {
1678
+ const rcsOvr = Object.assign({
1679
+ parentKey: o.id + '/' + o.name,
1680
+ parentRoot: o.parentRoot,
1681
+ depth: realParent.depth + 1,
1682
+ isInitialized: true,
1683
+ hasFormField: false,
1684
+ isShared:
1685
+ o.id +
1686
+ '/' +
1687
+ o.name +
1688
+ '_' +
1689
+ rcsExtn.id +
1690
+ '_acEdit',
1691
+ })
1692
+ updateOverlays(rcsKey, rcsOvr, o)
1693
+ }
1694
+ } else {
1695
+ recursiveSearch(child, Object.keys(child), o)
1696
+ }
1697
+ })
1698
+ } else {
1699
+ recursiveSearch(val, Object.keys(val), o)
1700
+ }
1701
+ } else if (typeof val === 'string') {
1702
+ const parser = new DOMParser(),
1703
+ doc = parser.parseFromString(val, 'text/html'),
1704
+ elementsWithState = doc.querySelectorAll('[data-state]')
1705
+
1706
+ elementsWithState.forEach((element) => {
1707
+ const dataState = element.getAttribute('data-state'),
1708
+ enhancementState = JSON.parse(dataState)
1709
+
1710
+ if (enhancementState) {
1711
+ recursiveSearch(
1712
+ enhancementState,
1713
+ Object.keys(enhancementState),
1714
+ o,
1715
+ true,
1716
+ )
1717
+ }
1718
+ })
1719
+ }
1720
+ }
1721
+ }
1722
+ }
1723
+ })
1724
+ }
1725
+ recursiveSearch(childData, Object.keys(childData), overlay)
1726
+ }
1727
+ } else {
1728
+ // All form fields that are already loaded in the DOM
1729
+ let realParent = parentObj
1730
+ let realParentKey = parentKey
1731
+ elm = objectInput || parentContainer
1732
+ contentEditElements = [
1733
+ ...elm.querySelectorAll(
1734
+ `div.inputContainer[data-name^="${fieldId}"]:not([hidden])`,
1735
+ ),
1736
+ ].filter((inputElement) => {
1737
+ return !inputElement.closest('.TC-unselected')
1738
+ })
1739
+ if (rcig || eig) {
1740
+ // these are the collapsible containers
1741
+ const pOb = data.overlays.get(overlayKey)
1742
+ realParentKey = overlayKey
1743
+ let overlayData = {
1744
+ id: overlayKey.split('/')[0],
1745
+ hasFormField: true,
1746
+ parentKey: parentKey,
1747
+ parentRoot: parentObj.parentRoot,
1748
+ depth: parentObj.depth + 1,
1749
+ type: 'bspModule',
1750
+ name: overlayKey.split('/')[1],
1751
+ }
1752
+ if (pOb) {
1753
+ overlayData = Object.assign(overlayData, pOb)
1754
+ }
1755
+ updateOverlays(overlayKey, overlayData, realParent)
1756
+ realParent = overlayData
1757
+ }
1758
+ contentEditElements.forEach((contentEditElement) => {
1759
+ const key = contentEditElement.dataset.name
1760
+ let ovr
1761
+ const extn = data.overlays.get(key)
1762
+ let isCigSelect
1763
+ let isDropdown
1764
+ if (!extn || extn.isEmpty) return
1765
+ if (extn.type === 'bspField') {
1766
+ isCigSelect =
1767
+ !isRoot &&
1768
+ contentEditElement.querySelector(`select[name="${key}.id"]`)
1769
+ isDropdown = contentEditElement.querySelector(
1770
+ `select[name="${key}.id"]`,
1771
+ )
1772
+ const sharedElement = isShared(
1773
+ key,
1774
+ contentEditElement,
1775
+ extn.fieldValue?.split('/')[0],
1776
+ )
1777
+ const previewElement = extn.hasElement
1778
+ if (sharedElement && !previewElement) {
1779
+ return
1780
+ }
1781
+ let editAction = `${key}_acEdit`
1782
+ if (sharedElement) {
1783
+ sharedElement.dataset.previewAction = editAction
1784
+ }
1785
+ ovr = Object.assign(
1786
+ {
1787
+ isShared: sharedElement ? editAction : false,
1788
+ isLocked: isLocked(contentEditElement),
1789
+ isInitialized: true,
1790
+ depth: isRoot ? 1 : realParent.depth + 1,
1791
+ parentRoot: isRoot ? key : realParent.parentRoot,
1792
+ parentKey: isRoot ? null : realParentKey,
1793
+ hasFormField: true,
1794
+ isDropdown,
1795
+ },
1796
+ extn,
1797
+ )
1798
+ if (!isCigSelect) {
1799
+ updateOverlays(key, ovr, realParent)
1800
+ }
1801
+ } else if (extn.type === 'bspModule') {
1802
+ if (extn.referencesRichText) {
1803
+ const enhancements =
1804
+ parentContainer.querySelectorAll('.Enhancement')
1805
+ enhancements.forEach((enhancement) => {
1806
+ if (enhancement.dataset.state) {
1807
+ const state = JSON.parse(enhancement.dataset.state)
1808
+ const id = state._id
1809
+ if (id === extn.id) {
1810
+ ovr = Object.assign(
1811
+ {
1812
+ isShared: false,
1813
+ isInitialized: true,
1814
+ depth: isRoot ? 1 : realParent.depth + 1,
1815
+ parentRoot: realParent.parentRoot,
1816
+ parentKey: realParentKey,
1817
+ hasFormField: true,
1818
+ },
1819
+ extn,
1820
+ )
1821
+ updateOverlays(key, ovr, realParent)
1822
+ }
1823
+ }
1824
+ })
1825
+ } else {
1826
+ // currently a no-op for bspModules which are not associated with rich text.
1827
+ }
1828
+ }
1829
+ let children = []
1830
+ if (ovr.children) {
1831
+ children = [...ovr.children]
1832
+ } else if (!ovr.isShared && ovr.fieldValue) {
1833
+ children.push(ovr.fieldValue)
1834
+ }
1835
+ const rcs = contentEditElement.querySelector(
1836
+ `.RCS ol[data-sortable-input-name='${key}']`,
1837
+ )
1838
+ // Check if this is a rich text field with enhancements
1839
+ if (ovr.internalType === 'text') {
1840
+ const updateEnhancements = function (source) {
1841
+ const parser = new DOMParser(),
1842
+ doc = parser.parseFromString(source, 'text/html'),
1843
+ elementsWithState = doc.querySelectorAll('[data-state]')
1844
+
1845
+ elementsWithState.forEach((element) => {
1846
+ const dataState = element.getAttribute('data-state'),
1847
+ enhancementState = JSON.parse(dataState)
1848
+
1849
+ if (enhancementState) {
1850
+ Object.keys(enhancementState).forEach((k) => {
1851
+ if (!/^_|^theme./.test(k)) {
1852
+ const enhancementKey = enhancementState._id + '/' + k
1853
+ const extn = data.overlays.get(enhancementKey)
1854
+ if (extn && !extn.isInitialized) {
1855
+ updateOverlays(
1856
+ enhancementKey,
1857
+ Object.assign(
1858
+ {
1859
+ behaviors: false,
1860
+ isLocked: false,
1861
+ isInitialized: true,
1862
+ isRoot: false,
1863
+ parentKey: key,
1864
+ depth: ovr.depth + 1,
1865
+ hasFormField: false,
1866
+ isEnhancement: true,
1867
+ parentRoot: ovr.parentRoot,
1868
+ },
1869
+ extn,
1870
+ ),
1871
+ ovr,
1872
+ )
1873
+ }
1874
+ }
1875
+ })
1876
+ }
1877
+ })
1878
+ }
1879
+
1880
+ const rteContainer = contentEditElement.querySelector(
1881
+ '[data-rte-container="true"]',
1882
+ ),
1883
+ textarea = contentEditElement.querySelector('textarea')
1884
+
1885
+ if (rteContainer && textarea) {
1886
+ if (rteContainer.dataset.value) {
1887
+ updateEnhancements(rteContainer.dataset.value)
1888
+ } else if (textarea.value) {
1889
+ // Fallback on textarea value if the rteContainer is not scrolled into
1890
+ updateEnhancements(textarea.value)
1891
+ }
1892
+ }
1893
+ }
1894
+ const rcsItems = rcs?.querySelectorAll(`input[name="${key}"]`)
1895
+ children?.forEach((childKey, idx) => {
1896
+ const existing = data.overlays.get(childKey)
1897
+ let childId = childKey.split('/')[0]
1898
+ let rcsItem
1899
+ let isSharedItem
1900
+ let editAction = `${key}_${childId}_acEdit`
1901
+ if (rcs) {
1902
+ rcsItem = [...rcsItems].find((rItem) => {
1903
+ return rItem.value === childId
1904
+ })
1905
+ isSharedItem = isShared(childId, rcsItem, undefined, key)
1906
+ if (isSharedItem) {
1907
+ isSharedItem.dataset.previewAction = editAction
1908
+ }
1909
+ }
1910
+ const overlayData = {
1911
+ id: childId,
1912
+ isInitialized: true,
1913
+ parentKey: key,
1914
+ parentRoot: ovr.parentRoot,
1915
+ depth: ovr.depth + 1,
1916
+ type: 'bspModule',
1917
+ name: childKey.split('/')[1],
1918
+ isShared: rcsItem && isSharedItem ? editAction : false,
1919
+ hasFormField: true,
1920
+ }
1921
+ if (rcsItem && rcsItem.dataset.label) {
1922
+ overlayData.label = rcsItem.dataset.label
1923
+ }
1924
+ if (!isCigSelect) {
1925
+ if (existing) {
1926
+ updateOverlays(
1927
+ childKey,
1928
+ Object.assign(overlayData, existing),
1929
+ ovr,
1930
+ )
1931
+ } else {
1932
+ updateOverlays(childKey, overlayData, ovr)
1933
+ data.overlays.set(childKey, Object.assign({}, overlayData))
1934
+ }
1935
+ getEditElements(
1936
+ childKey.split('/')[0],
1937
+ contentEditElement,
1938
+ ovr,
1939
+ key,
1940
+ childKey,
1941
+ )
1942
+ } else {
1943
+ getEditElements(
1944
+ childKey.split('/')[0],
1945
+ contentEditElement,
1946
+ realParent,
1947
+ realParentKey,
1948
+ childKey,
1949
+ )
1950
+ }
1951
+ })
1952
+ })
1953
+ }
1954
+ }
1955
+ getEditElements(data.previewContainerId, document)
1956
+ // filters out dropdown fields that do not have children preview elements
1957
+ const dropdownOverlays = [...filteredOverlays.values()].filter((t) => {
1958
+ return t.isDropdown && !t.linked && !t.isShared
1959
+ })
1960
+
1961
+ dropdownOverlays.forEach((s) => {
1962
+ const k = s.id + '/' + s.name
1963
+ const hasAChild = [...filteredOverlays.values()].find((t) => {
1964
+ return t.parentKey === k && t.dimensions
1965
+ })
1966
+ if (!hasAChild) {
1967
+ filteredOverlays.delete(k)
1968
+ } else {
1969
+ delete s.isDropdown
1970
+ }
1971
+ })
1972
+
1973
+ if (previewOverlays.get(data.previewContainerId)) {
1974
+ // reload preview overlay frame for every preview refresh
1975
+ let prevFrame = getPreviewFrame(data.previewContainerId)
1976
+ previewOverlays
1977
+ .get(data.previewContainerId)
1978
+ ?._overlayFrame.contentDocument.getElementsByTagName('html')[0]
1979
+ .style.setProperty(
1980
+ '--PreviewScale',
1981
+ prevFrame.getAttribute('previewScale'),
1982
+ )
1983
+
1984
+ previewOverlays
1985
+ .get(data.previewContainerId)
1986
+ .reload(filteredOverlays, data, selectedViewport)
1987
+ } else {
1988
+ // initialize preview overlay frame when preview is loaded the first time
1989
+ const overlay = await PreviewOverlay.create(data)
1990
+ previewOverlays.set(data.previewContainerId, overlay)
1991
+ previewOverlays
1992
+ .get(data.previewContainerId)
1993
+ .reload(filteredOverlays, data, selectedViewport)
1994
+ onRemove(
1995
+ previewOverlays.get(data.previewContainerId)._overlayFrame,
1996
+ () => {
1997
+ previewOverlays.get(data.previewContainerId).destroy()
1998
+ delete previewOverlays.get(data.previewContainerId)
1999
+ previewOverlays.delete(data.previewContainerId)
2000
+ },
2001
+ )
2002
+ }
2003
+ } else if (type === 'BSP.Preview.OverlayActionClick') {
2004
+ const key = data.key
2005
+ const cig = document.querySelector(`.CIG-row[data-name="${key}"]`)
2006
+ const modal = document.querySelector('.ContentEdit-previewModal')
2007
+ const edit = document.querySelector(
2008
+ `.ContentEdit[data-object-id="${data.previewContainerId}"]`,
2009
+ )
2010
+
2011
+ if (data.handler) {
2012
+ const element = data.elementId
2013
+ ? document.querySelector(
2014
+ `.repeatableLabel[data-object-id="${data.elementId}"]`,
2015
+ )
2016
+ : null
2017
+ const li = element.parentElement
2018
+
2019
+ if (data.handler === 'moveUp') {
2020
+ li.parentElement.insertBefore(li, li.previousElementSibling)
2021
+ } else if (data.handler === 'moveDown') {
2022
+ li.parentElement.insertBefore(
2023
+ li,
2024
+ li.nextElementSibling?.nextElementSibling,
2025
+ )
2026
+ }
2027
+
2028
+ edit.dispatchEvent(new Event('change', { bubbles: true }))
2029
+ return
2030
+ }
2031
+
2032
+ if (data.internalType === 'text') {
2033
+ openFormFieldPopup(cig, modal, edit)
2034
+ } else {
2035
+ const element = data.elementId
2036
+ ? document.querySelector(
2037
+ `.repeatableLabel[data-object-id="${data.elementId}"]`,
2038
+ )
2039
+ : null
2040
+ const parent = element ? element.parentNode : document
2041
+ const behaviorEl = parent.querySelector(
2042
+ `[data-preview-action="${data.actionId}"]`,
2043
+ )
2044
+ if (behaviorEl.classList.contains('RCIG-addSelect')) {
2045
+ onFind(behaviorEl, ':scope > .ComboInput', (combo) => {
2046
+ combo.click()
2047
+ })
2048
+ } else {
2049
+ behaviorEl.click()
2050
+ }
2051
+ if (element && behaviorEl.classList.contains('removeButton')) {
2052
+ element.click()
2053
+ scrollIntoView(element)
2054
+ }
2055
+ if (behaviorEl.classList.contains('RCIG-add')) {
2056
+ const rcig = behaviorEl.closest('.RCIG')
2057
+ onFind(
2058
+ rcig,
2059
+ ':scope > .RCIG-list > li.RCIG-item.is-new-item',
2060
+ (item) => {
2061
+ openFormFieldPopup(item, modal, edit)
2062
+ },
2063
+ )
2064
+ } else if (behaviorEl.classList.contains('RCS-add')) {
2065
+ const rcs = behaviorEl.closest('.RCS')
2066
+ const label = data.label
2067
+ onFind(rcs, ':scope > .RCS-list > li.RCS-item.is-new-item', (item) => {
2068
+ openFormFieldPopup(item, modal, edit, label)
2069
+ })
2070
+ } else if (behaviorEl.classList.contains('EIG-add')) {
2071
+ const eig = behaviorEl.closest('.EIG')
2072
+ onFind(eig, ':scope > .EIG-item', (item) => {
2073
+ openFormFieldPopup(item, modal, edit)
2074
+ })
2075
+ } else {
2076
+ const item = behaviorEl.closest('.RCIG-item, .EIG-item')
2077
+ openFormFieldPopup(item, modal, edit)
2078
+ }
2079
+ }
2080
+ }
2081
+ })
2082
+
2083
+ // ContentEdit Utils:
2084
+ // Check if this element is a shared / non-embedded element.
2085
+ const isShared = (id, element, fieldValue, parentId) => {
2086
+ if (element === null) return
2087
+ let sharedElement
2088
+ let input = element.querySelector(`input[name="${id}"]`)
2089
+
2090
+ if (input && !parentId) {
2091
+ // Try to find an associated input via the fieldValue.
2092
+ // Otherwise, fallback on the found input.
2093
+ if (fieldValue) {
2094
+ input =
2095
+ element.querySelector(
2096
+ `input[name="${fieldValue}/` + `${id.split('/')[1]}"]`,
2097
+ ) ?? input
2098
+ }
2099
+
2100
+ // Keep looking for the edit element.
2101
+ if (input) {
2102
+ sharedElement =
2103
+ !(
2104
+ input.parentNode.classList.contains('RCIG-item') ||
2105
+ input.parentNode.classList.contains('RCS-item')
2106
+ ) && input.parentNode.querySelector(':scope > .ContentSelector-edit')
2107
+ }
2108
+ } else {
2109
+ // We may have started with an input element
2110
+ // in the case of a child overlay.
2111
+ // This happens with RCS items.
2112
+ if (element.getAttribute('name') === parentId) {
2113
+ // try to find the edit element from the parent
2114
+ sharedElement = element.parentNode.querySelector(
2115
+ ':scope > .ContentSelector-edit',
2116
+ )
2117
+ }
2118
+ }
2119
+
2120
+ return sharedElement
2121
+ }
2122
+
2123
+ //Check if there is field-level/content level locking
2124
+ const isLocked = (element) => {
2125
+ return element.closest('.is-readOnly')
2126
+ ? true
2127
+ : null ||
2128
+ element.classList.contains('is-readOnly') ||
2129
+ element.classList.contains('is-pending') ||
2130
+ element.closest('.is-pending')
2131
+ ? true
2132
+ : null || element.closest('.is-locked')
2133
+ ? true
2134
+ : null
2135
+ }
2136
+
2137
+ // Updates the guide based on the input.
2138
+ function updateGuide(input, value) {
2139
+ if (!input.closest('.Page.is-guideOpen')) {
2140
+ return
2141
+ }
2142
+
2143
+ // Figure out the path to the input.
2144
+ const focuses = []
2145
+
2146
+ for (let group = input, row; (row = group.closest('.CIG-row')); ) {
2147
+ group = row.closest('.CIG')
2148
+
2149
+ focuses.unshift({
2150
+ typeId: group.dataset.typeId,
2151
+ field: row.dataset.fieldName,
2152
+ })
2153
+ }
2154
+
2155
+ if (focuses.length < 1) {
2156
+ return
2157
+ }
2158
+
2159
+ let selector = ''
2160
+
2161
+ for (let i = 0, l = focuses.length; i < l; ++i) {
2162
+ const { typeId, field } = focuses[i]
2163
+ selector += `.Guide-content[data-type-id="${typeId}"] > .Guide-field[data-field="${field}"] `
2164
+
2165
+ if (i + 1 === l) {
2166
+ const select = document.querySelector(`${selector} > form > select`)
2167
+
2168
+ if (select) {
2169
+ select.value = value(focuses[i])
2170
+ select.dispatchEvent(new Event('change', { bubbles: true }))
2171
+ }
2172
+ }
2173
+ }
2174
+
2175
+ // Focus and scroll to the corresponding section in the guide.
2176
+ const observer = new MutationObserver(async () => {
2177
+ const field = document.querySelector(selector)
2178
+
2179
+ if (field) {
2180
+ observer.disconnect()
2181
+ field.scrollIntoView()
2182
+ field.classList.add('is-focus')
2183
+ }
2184
+ })
2185
+
2186
+ observer.observe(document, {
2187
+ attributes: true,
2188
+ childList: true,
2189
+ subtree: true,
2190
+ })
2191
+ }
2192
+
2193
+ // Update the guide when the user focuses into an input.
2194
+ onFind(['.ContentEdit', '.enhancementForm', '.standardForm'], (edit) => {
2195
+ edit.addEventListener('focusin', ({ target }) => {
2196
+ updateGuide(target, (focus) => focus.typeId)
2197
+ })
2198
+
2199
+ edit.addEventListener('focusout', () => {
2200
+ for (const field of document.querySelectorAll('.Guide-field')) {
2201
+ field.classList.remove('is-focus')
2202
+ }
2203
+ })
2204
+ })
2205
+
2206
+ // Update the guide when the user selects a different embedded form.
2207
+ onFind(
2208
+ '.CIG-row[data-type="record"] > .CIG-small > select, .CIG-row[data-type="record"] > .CIG-small > btu-toggleable > select',
2209
+ (select) => {
2210
+ select.addEventListener('change', () => {
2211
+ updateGuide(select, () => {
2212
+ const i = select.selectedIndex
2213
+ return i >= 0 ? select.options[i].dataset.type : null
2214
+ })
2215
+ })
2216
+ },
2217
+ )
2218
+
2219
+ // Update the guide based on the initial form state.
2220
+ onFind('.Guide-field.is-embedded', (field) => {
2221
+ const select = field.querySelector('select')
2222
+ if (!select) return
2223
+
2224
+ const typeId = field.closest('.Guide-content[data-type-id]')?.dataset?.typeId
2225
+ if (!typeId) return
2226
+
2227
+ const value = document.querySelector(
2228
+ `.CIG[data-type-id='${typeId}'] > .CIG-row[data-field-name='${field.dataset.field}'] .CIG`,
2229
+ )?.dataset?.typeId
2230
+
2231
+ if (value) {
2232
+ select.value = value
2233
+ select.dispatchEvent(new Event('change', { bubbles: true }))
2234
+ select.form.requestSubmit()
2235
+ }
2236
+ })
2237
+
2238
+ // track which right panel is open
2239
+ const panelKey = 'BSP.ContentEdit.rightPanel'
2240
+
2241
+ const togglePanel = (tab, panel, options) => {
2242
+ const show = tab.classList.toggle('is-active')
2243
+ tab.ariaExpanded = show
2244
+ panel.classList.toggle('is-visible', show)
2245
+ const label = panel.querySelector('.ContentEdit-right-title')?.textContent
2246
+ tab.ariaLabel = `${show ? tooltips.close : tooltips.open} ${label}`
2247
+ tab.title = tab.ariaLabel
2248
+
2249
+ // Manage has-widget-panel-open class for performance (replaces expensive :has() selectors)
2250
+ // Only manage for widget panels, not for manage_search (shelf)
2251
+ if (tab.dataset.iconButtonName !== 'manage_search') {
2252
+ const toolbar = tab.closest('.ContentEdit-toolbar')
2253
+ const containerEl =
2254
+ options?.container ||
2255
+ toolbar?.closest('.Page-content, .Popup-content, .Popup')
2256
+
2257
+ if (containerEl) {
2258
+ if (show) {
2259
+ // Opening a widget panel - add the class
2260
+ containerEl.classList.add('has-widget-panel-open')
2261
+ } else {
2262
+ // Closing a widget panel - only remove class if no other widget panels are active
2263
+ const hasOtherActivePanel = toolbar?.querySelector(
2264
+ 'button.is-active:not([data-icon-button-name="manage_search"])',
2265
+ )
2266
+ if (!hasOtherActivePanel) {
2267
+ containerEl.classList.remove('has-widget-panel-open')
2268
+ }
2269
+ }
2270
+ }
2271
+ }
2272
+
2273
+ if (!options) return
2274
+ const { container, updateStorage } = options
2275
+ let contentRightWidth
2276
+ if (container) {
2277
+ if (show) {
2278
+ contentRightWidth = panel.dataset.width
2279
+ } else {
2280
+ contentRightWidth = '0px'
2281
+ }
2282
+ container.style.setProperty('--ContentEdit-rightWidth', contentRightWidth)
2283
+ }
2284
+ if (!container.classList.contains('Popup') && updateStorage) {
2285
+ if (show) {
2286
+ ls.setItem(panelKey, tab.dataset.iconButtonName)
2287
+ } else {
2288
+ ls.removeItem(panelKey)
2289
+ }
2290
+ }
2291
+ }
2292
+
2293
+ // Content edit side toolbar functionality
2294
+ onFind('.ContentEdit-toolbar', (toolbar) => {
2295
+ // by default only toolbar is visible
2296
+ const container = toolbar.closest('.Page-content, .Popup-content, .Popup')
2297
+ // This variable will be updated with panel width
2298
+ container.style.setProperty('--ContentEdit-rightWidth', '0px')
2299
+ const editForm = toolbar.closest('.ContentEdit')
2300
+ if (!editForm) return
2301
+ const formId = editForm.dataset.objectId
2302
+ const selectedPanel = ls.getItem(panelKey)
2303
+ const tabButtons = [...toolbar.querySelectorAll('button[data-right-tab]')]
2304
+
2305
+ tabButtons.forEach((tab) => {
2306
+ // Shelf is handled by ContentEditDrawer.ts
2307
+ if (tab.dataset.iconButtonName === 'manage_search') {
2308
+ return
2309
+ }
2310
+
2311
+ const iconName = tab.dataset.iconButtonName
2312
+ const panel = editForm.querySelector(
2313
+ `.ContentEdit-right[data-right-tab="${iconName}"]`,
2314
+ )
2315
+ if (!panel) return
2316
+ const panelId = formId + '/' + iconName
2317
+ panel.id = panelId
2318
+
2319
+ if (!panel.dataset.width) {
2320
+ const computedWidth = getComputedStyle(panel).getPropertyValue(
2321
+ '--contentRight-width',
2322
+ )
2323
+
2324
+ panel.dataset.width = parseFloat(computedWidth) ? computedWidth : '320px'
2325
+ }
2326
+
2327
+ tab.setAttribute('aria-controls', panel.id)
2328
+ const labelOpen = `${tooltips.open} ${tab.ariaLabel}`
2329
+ tab.ariaLabel = labelOpen
2330
+ tab.title = labelOpen
2331
+ tab.ariaExpanded = false
2332
+
2333
+ onFind('.ContentEdit-right .Widget.is-error', (widget) => {
2334
+ const panel = widget.closest('.ContentEdit-right')
2335
+ if (!panel) return
2336
+ const tab = document.querySelector(`button[aria-controls="${panel.id}"]`)
2337
+ if (!tab) return
2338
+ tab.classList.add('is-error')
2339
+ })
2340
+
2341
+ const panelClose = panel.querySelector('.ContentEdit-right-close')
2342
+ panelClose.ariaLabel = tooltips.close
2343
+ panelClose.title = tooltips.close
2344
+ panelClose.onclick = () => {
2345
+ togglePanel(tab, panel, { container: container, updateStorage: true })
2346
+ // Return focus to the toolbar button when panel is closed
2347
+ tab.focus()
2348
+ }
2349
+
2350
+ tab.onclick = (event) => {
2351
+ const prevSelected = toolbar.querySelector(
2352
+ 'button.is-active:not([data-icon-button-name="manage_search"])',
2353
+ )
2354
+ const wasOpen = tab.classList.contains('is-active')
2355
+
2356
+ // V5 UI: close preview if space is limited and we're opening a widget panel
2357
+ if (
2358
+ window.BRIGHTSPOT?.ui?.cms?.enableV5UI &&
2359
+ !wasOpen &&
2360
+ container.classList.contains('is-previewing')
2361
+ ) {
2362
+ if (container.offsetWidth < DUAL_PANEL_MIN_WIDTH) {
2363
+ const previewButton = toolbar.querySelector(
2364
+ '.ContentEdit-previewButton',
2365
+ )
2366
+ previewButton?.click()
2367
+ }
2368
+ }
2369
+
2370
+ togglePanel(tab, panel, { container: container, updateStorage: true })
2371
+
2372
+ if (!prevSelected) {
2373
+ if (!window.BRIGHTSPOT?.ui.cms.enableV5UI) {
2374
+ if (container.classList.contains('is-previewing')) {
2375
+ const previewButton = toolbar.querySelector(
2376
+ '.ContentEdit-previewButton',
2377
+ )
2378
+ previewButton.click()
2379
+ }
2380
+ }
2381
+ } else if (prevSelected.dataset.iconButtonName !== iconName) {
2382
+ const prevPanel = editForm.querySelector(
2383
+ `.ContentEdit-right.is-visible[data-right-tab=${prevSelected.dataset.iconButtonName}]`,
2384
+ )
2385
+ togglePanel(prevSelected, prevPanel)
2386
+ }
2387
+ // Move focus to the close button when panel is opened by user interaction.
2388
+ // We wait for `transitionend` instead of using setTimeout because the
2389
+ // duration may be near-zero under prefers-reduced-motion (see Page.css).
2390
+ if (!wasOpen && tab.classList.contains('is-active') && event.isTrusted) {
2391
+ container.addEventListener(
2392
+ 'transitionend',
2393
+ function handleTransitionEnd(e) {
2394
+ // The grid opens via grid-template-columns; ignore other property firings
2395
+ // to avoid calling focus() multiple times in a single transition sequence.
2396
+ if (e.propertyName !== 'grid-template-columns') return
2397
+ // Always remove unconditionally — prevents leak if panel closes mid-transition.
2398
+ container.removeEventListener('transitionend', handleTransitionEnd)
2399
+ if (tab.classList.contains('is-active')) {
2400
+ panelClose.focus()
2401
+ }
2402
+ },
2403
+ )
2404
+ }
2405
+ }
2406
+
2407
+ if (selectedPanel === iconName) {
2408
+ tab.click()
2409
+ }
2410
+ })
2411
+
2412
+ // V5 UI: Close preview when container becomes too narrow for both panels
2413
+ if (window.BRIGHTSPOT?.ui?.cms?.enableV5UI) {
2414
+ new ResizeObserver(() => {
2415
+ if (
2416
+ container.offsetWidth < DUAL_PANEL_MIN_WIDTH &&
2417
+ container.classList.contains('is-previewing') &&
2418
+ container.querySelector('.ContentEdit-right.is-visible')
2419
+ ) {
2420
+ const previewButton = toolbar.querySelector(
2421
+ '.ContentEdit-previewButton',
2422
+ )
2423
+ previewButton?.click()
2424
+ }
2425
+ }).observe(container)
2426
+ }
2427
+ })