markdown-flow-ui 0.2.14 → 0.2.16-dev.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 (465) hide show
  1. package/README.md +7 -0
  2. package/dist/assets/markdown-flow-ui.css +10 -1
  3. package/dist/components/ContentRender/CodeBlock.cjs +1 -1
  4. package/dist/components/ContentRender/CodeBlock.cjs.map +1 -1
  5. package/dist/components/ContentRender/CodeBlock.d.ts +5 -0
  6. package/dist/components/ContentRender/CodeBlock.es.js +41 -38
  7. package/dist/components/ContentRender/CodeBlock.es.js.map +1 -1
  8. package/dist/components/ContentRender/ContentRender.cjs +2 -2
  9. package/dist/components/ContentRender/ContentRender.cjs.map +1 -1
  10. package/dist/components/ContentRender/ContentRender.d.ts +12 -4
  11. package/dist/components/ContentRender/ContentRender.es.js +436 -306
  12. package/dist/components/ContentRender/ContentRender.es.js.map +1 -1
  13. package/dist/components/ContentRender/IframeSandbox.cjs +7 -7
  14. package/dist/components/ContentRender/IframeSandbox.cjs.map +1 -1
  15. package/dist/components/ContentRender/IframeSandbox.d.ts +5 -1
  16. package/dist/components/ContentRender/IframeSandbox.es.js +311 -266
  17. package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
  18. package/dist/components/ContentRender/MarkdownFlowInput.cjs +1 -1
  19. package/dist/components/ContentRender/MarkdownFlowInput.cjs.map +1 -1
  20. package/dist/components/ContentRender/MarkdownFlowInput.d.ts +5 -1
  21. package/dist/components/ContentRender/MarkdownFlowInput.es.js +37 -32
  22. package/dist/components/ContentRender/MarkdownFlowInput.es.js.map +1 -1
  23. package/dist/components/ContentRender/SandboxApp.cjs +2 -2
  24. package/dist/components/ContentRender/SandboxApp.cjs.map +1 -1
  25. package/dist/components/ContentRender/SandboxApp.d.ts +5 -1
  26. package/dist/components/ContentRender/SandboxApp.es.js +108 -103
  27. package/dist/components/ContentRender/SandboxApp.es.js.map +1 -1
  28. package/dist/components/ContentRender/blackboard-vendor.d.ts +1 -1
  29. package/dist/components/ContentRender/contentRenderI18n.cjs +1 -1
  30. package/dist/components/ContentRender/contentRenderI18n.cjs.map +1 -1
  31. package/dist/components/ContentRender/contentRenderI18n.d.ts +6 -1
  32. package/dist/components/ContentRender/contentRenderI18n.es.js +5 -56
  33. package/dist/components/ContentRender/contentRenderI18n.es.js.map +1 -1
  34. package/dist/components/ContentRender/contentRenderI18n.test.d.ts +1 -0
  35. package/dist/components/ContentRender/index.cjs +1 -1
  36. package/dist/components/ContentRender/index.d.ts +11 -11
  37. package/dist/components/ContentRender/index.es.js +1 -2
  38. package/dist/components/ContentRender/index.es.js.map +1 -1
  39. package/dist/components/ContentRender/locales/contentRender.json.cjs +2 -0
  40. package/dist/components/ContentRender/locales/contentRender.json.cjs.map +1 -0
  41. package/dist/components/ContentRender/locales/contentRender.json.d.ts +90 -0
  42. package/dist/components/ContentRender/locales/contentRender.json.es.js +11 -0
  43. package/dist/components/ContentRender/locales/contentRender.json.es.js.map +1 -0
  44. package/dist/components/ContentRender/plugins/CustomVariable.cjs +1 -1
  45. package/dist/components/ContentRender/plugins/CustomVariable.cjs.map +1 -1
  46. package/dist/components/ContentRender/plugins/CustomVariable.d.ts +7 -3
  47. package/dist/components/ContentRender/plugins/CustomVariable.es.js +165 -151
  48. package/dist/components/ContentRender/plugins/CustomVariable.es.js.map +1 -1
  49. package/dist/components/ContentRender/plugins/MermaidChart.cjs +1 -1
  50. package/dist/components/ContentRender/plugins/MermaidChart.cjs.map +1 -1
  51. package/dist/components/ContentRender/plugins/MermaidChart.d.ts +1 -0
  52. package/dist/components/ContentRender/plugins/MermaidChart.es.js +68 -44
  53. package/dist/components/ContentRender/plugins/MermaidChart.es.js.map +1 -1
  54. package/dist/components/ContentRender/typewriterPacing.fixtures.d.ts +14 -0
  55. package/dist/components/ContentRender/utils/typewriter-pacing.cjs +3 -0
  56. package/dist/components/ContentRender/utils/typewriter-pacing.cjs.map +1 -0
  57. package/dist/components/ContentRender/utils/typewriter-pacing.d.ts +27 -0
  58. package/dist/components/ContentRender/utils/typewriter-pacing.es.js +98 -0
  59. package/dist/components/ContentRender/utils/typewriter-pacing.es.js.map +1 -0
  60. package/dist/components/ContentRender/utils/typewriter-pacing.test.d.ts +1 -0
  61. package/dist/components/MarkdownFlow/MarkdownFlow.cjs +1 -1
  62. package/dist/components/MarkdownFlow/MarkdownFlow.cjs.map +1 -1
  63. package/dist/components/MarkdownFlow/MarkdownFlow.d.ts +12 -4
  64. package/dist/components/MarkdownFlow/MarkdownFlow.es.js +51 -39
  65. package/dist/components/MarkdownFlow/MarkdownFlow.es.js.map +1 -1
  66. package/dist/components/MarkdownFlow/ScrollToBottomButton.cjs +1 -1
  67. package/dist/components/MarkdownFlow/ScrollToBottomButton.cjs.map +1 -1
  68. package/dist/components/MarkdownFlow/ScrollToBottomButton.d.ts +31 -1
  69. package/dist/components/MarkdownFlow/ScrollToBottomButton.es.js +46 -17
  70. package/dist/components/MarkdownFlow/ScrollToBottomButton.es.js.map +1 -1
  71. package/dist/components/MarkdownFlow/ScrollToBottomControl.cjs +2 -0
  72. package/dist/components/MarkdownFlow/ScrollToBottomControl.cjs.map +1 -0
  73. package/dist/components/MarkdownFlow/ScrollToBottomControl.d.ts +18 -0
  74. package/dist/components/MarkdownFlow/ScrollToBottomControl.es.js +47 -0
  75. package/dist/components/MarkdownFlow/ScrollToBottomControl.es.js.map +1 -0
  76. package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.cjs +1 -1
  77. package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.cjs.map +1 -1
  78. package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.d.ts +1 -1
  79. package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.es.js +33 -52
  80. package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.es.js.map +1 -1
  81. package/dist/components/MarkdownFlow/index.cjs +1 -1
  82. package/dist/components/MarkdownFlow/index.d.ts +9 -6
  83. package/dist/components/MarkdownFlow/index.es.js +6 -6
  84. package/dist/components/MarkdownFlow/index.es.js.map +1 -1
  85. package/dist/components/MarkdownFlow/useScrollToBottom.cjs +1 -1
  86. package/dist/components/MarkdownFlow/useScrollToBottom.cjs.map +1 -1
  87. package/dist/components/MarkdownFlow/useScrollToBottom.d.ts +40 -8
  88. package/dist/components/MarkdownFlow/useScrollToBottom.es.js +352 -83
  89. package/dist/components/MarkdownFlow/useScrollToBottom.es.js.map +1 -1
  90. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs +1 -1
  91. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.map +1 -1
  92. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.d.ts +5 -3
  93. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +371 -324
  94. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
  95. package/dist/components/MarkdownFlowEditor/components/CustomDialog.cjs +1 -1
  96. package/dist/components/MarkdownFlowEditor/components/CustomDialog.cjs.map +1 -1
  97. package/dist/components/MarkdownFlowEditor/components/CustomDialog.d.ts +10 -0
  98. package/dist/components/MarkdownFlowEditor/components/CustomDialog.es.js +22 -19
  99. package/dist/components/MarkdownFlowEditor/components/CustomDialog.es.js.map +1 -1
  100. package/dist/components/MarkdownFlowEditor/components/CustomPopover.cjs +1 -1
  101. package/dist/components/MarkdownFlowEditor/components/CustomPopover.cjs.map +1 -1
  102. package/dist/components/MarkdownFlowEditor/components/CustomPopover.d.ts +8 -0
  103. package/dist/components/MarkdownFlowEditor/components/CustomPopover.es.js +19 -15
  104. package/dist/components/MarkdownFlowEditor/components/CustomPopover.es.js.map +1 -1
  105. package/dist/components/MarkdownFlowEditor/components/EditorToolbar.cjs +1 -1
  106. package/dist/components/MarkdownFlowEditor/components/EditorToolbar.cjs.map +1 -1
  107. package/dist/components/MarkdownFlowEditor/components/EditorToolbar.d.ts +4 -1
  108. package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js +99 -93
  109. package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js.map +1 -1
  110. package/dist/components/MarkdownFlowEditor/components/ImageInject.cjs +1 -1
  111. package/dist/components/MarkdownFlowEditor/components/ImageInject.cjs.map +1 -1
  112. package/dist/components/MarkdownFlowEditor/components/ImageInject.d.ts +1 -1
  113. package/dist/components/MarkdownFlowEditor/components/ImageInject.es.js +183 -182
  114. package/dist/components/MarkdownFlowEditor/components/ImageInject.es.js.map +1 -1
  115. package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.cjs +1 -1
  116. package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.cjs.map +1 -1
  117. package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.d.ts +1 -1
  118. package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.es.js +107 -103
  119. package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.es.js.map +1 -1
  120. package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs +1 -1
  121. package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs.map +1 -1
  122. package/dist/components/MarkdownFlowEditor/components/VariableSelect.d.ts +1 -1
  123. package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js +106 -106
  124. package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js.map +1 -1
  125. package/dist/components/MarkdownFlowEditor/components/VideoInject.cjs +1 -1
  126. package/dist/components/MarkdownFlowEditor/components/VideoInject.cjs.map +1 -1
  127. package/dist/components/MarkdownFlowEditor/components/VideoInject.es.js +64 -63
  128. package/dist/components/MarkdownFlowEditor/components/VideoInject.es.js.map +1 -1
  129. package/dist/components/MarkdownFlowEditor/components/icons/ButtonIcon.cjs +1 -1
  130. package/dist/components/MarkdownFlowEditor/components/icons/ButtonIcon.cjs.map +1 -1
  131. package/dist/components/MarkdownFlowEditor/components/icons/ButtonIcon.es.js +13 -13
  132. package/dist/components/MarkdownFlowEditor/components/icons/ButtonIcon.es.js.map +1 -1
  133. package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.cjs +1 -1
  134. package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.cjs.map +1 -1
  135. package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.es.js +12 -12
  136. package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.es.js.map +1 -1
  137. package/dist/components/MarkdownFlowEditor/editor-context.d.ts +1 -1
  138. package/dist/components/MarkdownFlowEditor/editorI18n.cjs +1 -1
  139. package/dist/components/MarkdownFlowEditor/editorI18n.cjs.map +1 -1
  140. package/dist/components/MarkdownFlowEditor/editorI18n.d.ts +290 -0
  141. package/dist/components/MarkdownFlowEditor/editorI18n.es.js +12 -8
  142. package/dist/components/MarkdownFlowEditor/editorI18n.es.js.map +1 -1
  143. package/dist/components/MarkdownFlowEditor/editorI18n.test.d.ts +1 -0
  144. package/dist/components/MarkdownFlowEditor/index.d.ts +6 -6
  145. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs +2 -0
  146. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs.map +1 -0
  147. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.d.ts +72 -0
  148. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js +140 -0
  149. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js.map +1 -0
  150. package/dist/components/MarkdownFlowEditor/locales/en-US.json.cjs +1 -1
  151. package/dist/components/MarkdownFlowEditor/locales/en-US.json.d.ts +2 -0
  152. package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js +118 -114
  153. package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js.map +1 -1
  154. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.cjs +1 -1
  155. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.d.ts +2 -0
  156. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js +118 -114
  157. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js.map +1 -1
  158. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs +2 -0
  159. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs.map +1 -0
  160. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.d.ts +72 -0
  161. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js +140 -0
  162. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js.map +1 -0
  163. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.cjs +1 -1
  164. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.d.ts +2 -0
  165. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js +70 -66
  166. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js.map +1 -1
  167. package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.cjs +1 -1
  168. package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.cjs.map +1 -1
  169. package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js +40 -35
  170. package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js.map +1 -1
  171. package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.d.ts +1 -1
  172. package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.cjs +1 -1
  173. package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.cjs.map +1 -1
  174. package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js +27 -23
  175. package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js.map +1 -1
  176. package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.cjs +2 -0
  177. package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.cjs.map +1 -0
  178. package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.d.ts +7 -0
  179. package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.es.js +12 -0
  180. package/dist/components/MarkdownFlowEditor/plugins/mediaPlaceholderLabels.es.js.map +1 -0
  181. package/dist/components/MarkdownFlowEditor/utils.d.ts +1 -1
  182. package/dist/components/Slide/MarkdownSlideScaling.cjs +1 -1
  183. package/dist/components/Slide/MarkdownSlideScaling.cjs.map +1 -1
  184. package/dist/components/Slide/MarkdownSlideScaling.d.ts +1 -1
  185. package/dist/components/Slide/MarkdownSlideScaling.es.js +20 -20
  186. package/dist/components/Slide/MarkdownSlideScaling.es.js.map +1 -1
  187. package/dist/components/Slide/MobilePlayerSettingsSheet.cjs +1 -1
  188. package/dist/components/Slide/MobilePlayerSettingsSheet.cjs.map +1 -1
  189. package/dist/components/Slide/MobilePlayerSettingsSheet.d.ts +7 -2
  190. package/dist/components/Slide/MobilePlayerSettingsSheet.es.js +61 -57
  191. package/dist/components/Slide/MobilePlayerSettingsSheet.es.js.map +1 -1
  192. package/dist/components/Slide/Player.cjs +1 -1
  193. package/dist/components/Slide/Player.cjs.map +1 -1
  194. package/dist/components/Slide/Player.d.ts +6 -6
  195. package/dist/components/Slide/Player.es.js +547 -541
  196. package/dist/components/Slide/Player.es.js.map +1 -1
  197. package/dist/components/Slide/Slide.cjs +1 -1
  198. package/dist/components/Slide/Slide.cjs.map +1 -1
  199. package/dist/components/Slide/Slide.d.ts +14 -12
  200. package/dist/components/Slide/Slide.es.js +745 -726
  201. package/dist/components/Slide/Slide.es.js.map +1 -1
  202. package/dist/components/Slide/SubtitleOverlay.cjs +1 -1
  203. package/dist/components/Slide/SubtitleOverlay.cjs.map +1 -1
  204. package/dist/components/Slide/SubtitleOverlay.d.ts +2 -2
  205. package/dist/components/Slide/SubtitleOverlay.es.js +17 -17
  206. package/dist/components/Slide/SubtitleOverlay.es.js.map +1 -1
  207. package/dist/components/Slide/diff-utils.d.ts +1 -1
  208. package/dist/components/Slide/index.d.ts +12 -12
  209. package/dist/components/Slide/locales/slide.json.cjs +2 -0
  210. package/dist/components/Slide/locales/slide.json.cjs.map +1 -0
  211. package/dist/components/Slide/locales/slide.json.d.ts +205 -0
  212. package/dist/components/Slide/locales/slide.json.es.js +11 -0
  213. package/dist/components/Slide/locales/slide.json.es.js.map +1 -0
  214. package/dist/components/Slide/slideI18n.cjs +1 -1
  215. package/dist/components/Slide/slideI18n.cjs.map +1 -1
  216. package/dist/components/Slide/slideI18n.d.ts +6 -3
  217. package/dist/components/Slide/slideI18n.es.js +10 -155
  218. package/dist/components/Slide/slideI18n.es.js.map +1 -1
  219. package/dist/components/Slide/useSlide.d.ts +1 -1
  220. package/dist/components/Slide/utils/appendedMarkerAdvance.d.ts +1 -1
  221. package/dist/components/Slide/utils/audioSegments.d.ts +1 -1
  222. package/dist/components/Slide/utils/interactionResolution.d.ts +2 -2
  223. package/dist/components/Slide/utils/listenModeElementList.d.ts +2 -2
  224. package/dist/components/Slide/utils/markdownScaling.d.ts +1 -1
  225. package/dist/components/Slide/utils/playerCustomActions.d.ts +2 -2
  226. package/dist/components/Slide/utils/playerKeyboardShortcuts.cjs +1 -1
  227. package/dist/components/Slide/utils/playerKeyboardShortcuts.cjs.map +1 -1
  228. package/dist/components/Slide/utils/playerKeyboardShortcuts.d.ts +1 -1
  229. package/dist/components/Slide/utils/playerKeyboardShortcuts.es.js +20 -20
  230. package/dist/components/Slide/utils/playerKeyboardShortcuts.es.js.map +1 -1
  231. package/dist/components/Slide/utils/runStreamFixture.d.ts +1 -1
  232. package/dist/components/Slide/utils/segmentSeek.d.ts +1 -1
  233. package/dist/components/Slide/utils/silentStepAutoAdvance.d.ts +1 -1
  234. package/dist/components/Slide/utils/streamingNavigation.d.ts +1 -1
  235. package/dist/components/Slide/utils/subtitleCue.d.ts +1 -1
  236. package/dist/components/Slide/utils/subtitleJumpNavigation.d.ts +1 -1
  237. package/dist/components/index.d.ts +22 -18
  238. package/dist/components/ui/button.cjs +1 -1
  239. package/dist/components/ui/button.cjs.map +1 -1
  240. package/dist/components/ui/button.es.js +12 -13
  241. package/dist/components/ui/button.es.js.map +1 -1
  242. package/dist/components/ui/checkbox.cjs +1 -1
  243. package/dist/components/ui/checkbox.cjs.map +1 -1
  244. package/dist/components/ui/checkbox.es.js +35 -35
  245. package/dist/components/ui/checkbox.es.js.map +1 -1
  246. package/dist/components/ui/dialog.cjs +1 -1
  247. package/dist/components/ui/dialog.cjs.map +1 -1
  248. package/dist/components/ui/dialog.d.ts +5 -1
  249. package/dist/components/ui/dialog.es.js +37 -37
  250. package/dist/components/ui/dialog.es.js.map +1 -1
  251. package/dist/components/ui/input.cjs +1 -1
  252. package/dist/components/ui/input.cjs.map +1 -1
  253. package/dist/components/ui/input.es.js +4 -4
  254. package/dist/components/ui/input.es.js.map +1 -1
  255. package/dist/components/ui/inputGroup/button.cjs +1 -1
  256. package/dist/components/ui/inputGroup/button.cjs.map +1 -1
  257. package/dist/components/ui/inputGroup/button.es.js +9 -10
  258. package/dist/components/ui/inputGroup/button.es.js.map +1 -1
  259. package/dist/components/ui/inputGroup/input-group.cjs +1 -1
  260. package/dist/components/ui/inputGroup/input-group.cjs.map +1 -1
  261. package/dist/components/ui/inputGroup/input-group.d.ts +1 -1
  262. package/dist/components/ui/inputGroup/input-group.es.js +10 -10
  263. package/dist/components/ui/inputGroup/input-group.es.js.map +1 -1
  264. package/dist/components/ui/inputGroup/textarea.cjs +1 -1
  265. package/dist/components/ui/inputGroup/textarea.cjs.map +1 -1
  266. package/dist/components/ui/inputGroup/textarea.es.js +2 -2
  267. package/dist/components/ui/inputGroup/textarea.es.js.map +1 -1
  268. package/dist/components/ui/loading-overlay-card.cjs +2 -2
  269. package/dist/components/ui/loading-overlay-card.cjs.map +1 -1
  270. package/dist/components/ui/loading-overlay-card.es.js +11 -11
  271. package/dist/components/ui/loading-overlay-card.es.js.map +1 -1
  272. package/dist/components/ui/popover.cjs +1 -1
  273. package/dist/components/ui/popover.cjs.map +1 -1
  274. package/dist/components/ui/popover.es.js +6 -6
  275. package/dist/components/ui/popover.es.js.map +1 -1
  276. package/dist/components/ui/tooltip.cjs +1 -1
  277. package/dist/components/ui/tooltip.cjs.map +1 -1
  278. package/dist/components/ui/tooltip.es.js +16 -16
  279. package/dist/components/ui/tooltip.es.js.map +1 -1
  280. package/dist/editor.d.ts +2 -2
  281. package/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
  282. package/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
  283. package/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  284. package/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  285. package/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  286. package/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  287. package/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  288. package/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  289. package/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  290. package/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  291. package/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  292. package/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  293. package/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  294. package/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  295. package/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  296. package/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
  297. package/dist/fonts/KaTeX_Main-Bold.woff +0 -0
  298. package/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
  299. package/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  300. package/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  301. package/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  302. package/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
  303. package/dist/fonts/KaTeX_Main-Italic.woff +0 -0
  304. package/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
  305. package/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
  306. package/dist/fonts/KaTeX_Main-Regular.woff +0 -0
  307. package/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
  308. package/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  309. package/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  310. package/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  311. package/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
  312. package/dist/fonts/KaTeX_Math-Italic.woff +0 -0
  313. package/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
  314. package/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  315. package/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  316. package/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  317. package/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  318. package/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  319. package/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  320. package/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  321. package/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  322. package/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  323. package/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
  324. package/dist/fonts/KaTeX_Script-Regular.woff +0 -0
  325. package/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
  326. package/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
  327. package/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
  328. package/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  329. package/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
  330. package/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
  331. package/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  332. package/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
  333. package/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
  334. package/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  335. package/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
  336. package/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
  337. package/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  338. package/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  339. package/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  340. package/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  341. package/dist/index.cjs +1 -1
  342. package/dist/index.d.ts +2 -2
  343. package/dist/index.es.js +22 -19
  344. package/dist/index.es.js.map +1 -1
  345. package/dist/lib/locale.cjs +1 -1
  346. package/dist/lib/locale.cjs.map +1 -1
  347. package/dist/lib/locale.d.ts +5 -1
  348. package/dist/lib/locale.es.js +26 -13
  349. package/dist/lib/locale.es.js.map +1 -1
  350. package/dist/lib/locale.test.d.ts +1 -0
  351. package/dist/lib/useDetachedLanguage.cjs +2 -0
  352. package/dist/lib/useDetachedLanguage.cjs.map +1 -0
  353. package/dist/lib/useDetachedLanguage.d.ts +3 -0
  354. package/dist/lib/useDetachedLanguage.es.js +25 -0
  355. package/dist/lib/useDetachedLanguage.es.js.map +1 -0
  356. package/dist/lib/useResolvedDirection.cjs +2 -0
  357. package/dist/lib/useResolvedDirection.cjs.map +1 -0
  358. package/dist/lib/useResolvedDirection.d.ts +6 -0
  359. package/dist/lib/useResolvedDirection.es.js +37 -0
  360. package/dist/lib/useResolvedDirection.es.js.map +1 -0
  361. package/dist/markdown-flow-ui-lib.css +1 -1
  362. package/dist/node_modules/@radix-ui/react-arrow/dist/index.cjs +1 -1
  363. package/dist/node_modules/@radix-ui/react-arrow/dist/index.cjs.map +1 -1
  364. package/dist/node_modules/@radix-ui/react-arrow/dist/index.es.js +6 -6
  365. package/dist/node_modules/@radix-ui/react-arrow/dist/index.es.js.map +1 -1
  366. package/dist/node_modules/@radix-ui/react-context/dist/index.cjs +1 -1
  367. package/dist/node_modules/@radix-ui/react-context/dist/index.cjs.map +1 -1
  368. package/dist/node_modules/@radix-ui/react-context/dist/index.es.js +21 -21
  369. package/dist/node_modules/@radix-ui/react-context/dist/index.es.js.map +1 -1
  370. package/dist/node_modules/@radix-ui/react-dialog/dist/index.cjs +2 -2
  371. package/dist/node_modules/@radix-ui/react-dialog/dist/index.cjs.map +1 -1
  372. package/dist/node_modules/@radix-ui/react-dialog/dist/index.es.js +100 -100
  373. package/dist/node_modules/@radix-ui/react-dialog/dist/index.es.js.map +1 -1
  374. package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs +1 -1
  375. package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs.map +1 -1
  376. package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.es.js +38 -38
  377. package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.es.js.map +1 -1
  378. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.cjs +1 -1
  379. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.cjs.map +1 -1
  380. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.es.js +9 -9
  381. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.es.js.map +1 -1
  382. package/dist/node_modules/@radix-ui/react-popover/dist/index.cjs +1 -1
  383. package/dist/node_modules/@radix-ui/react-popover/dist/index.cjs.map +1 -1
  384. package/dist/node_modules/@radix-ui/react-popover/dist/index.es.js +95 -95
  385. package/dist/node_modules/@radix-ui/react-popover/dist/index.es.js.map +1 -1
  386. package/dist/node_modules/@radix-ui/react-popper/dist/index.cjs +1 -1
  387. package/dist/node_modules/@radix-ui/react-popper/dist/index.cjs.map +1 -1
  388. package/dist/node_modules/@radix-ui/react-popper/dist/index.es.js +48 -48
  389. package/dist/node_modules/@radix-ui/react-popper/dist/index.es.js.map +1 -1
  390. package/dist/node_modules/@radix-ui/react-portal/dist/index.cjs +1 -1
  391. package/dist/node_modules/@radix-ui/react-portal/dist/index.cjs.map +1 -1
  392. package/dist/node_modules/@radix-ui/react-portal/dist/index.es.js +6 -6
  393. package/dist/node_modules/@radix-ui/react-portal/dist/index.es.js.map +1 -1
  394. package/dist/node_modules/@radix-ui/react-primitive/dist/index.cjs +1 -1
  395. package/dist/node_modules/@radix-ui/react-primitive/dist/index.cjs.map +1 -1
  396. package/dist/node_modules/@radix-ui/react-primitive/dist/index.es.js +9 -9
  397. package/dist/node_modules/@radix-ui/react-primitive/dist/index.es.js.map +1 -1
  398. package/dist/node_modules/@radix-ui/react-slot/dist/index.cjs +1 -1
  399. package/dist/node_modules/@radix-ui/react-slot/dist/index.cjs.map +1 -1
  400. package/dist/node_modules/@radix-ui/react-slot/dist/index.es.js +17 -17
  401. package/dist/node_modules/@radix-ui/react-slot/dist/index.es.js.map +1 -1
  402. package/dist/node_modules/@radix-ui/react-tooltip/dist/index.cjs +1 -1
  403. package/dist/node_modules/@radix-ui/react-tooltip/dist/index.cjs.map +1 -1
  404. package/dist/node_modules/@radix-ui/react-tooltip/dist/index.es.js +100 -100
  405. package/dist/node_modules/@radix-ui/react-tooltip/dist/index.es.js.map +1 -1
  406. package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.cjs +1 -1
  407. package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.cjs.map +1 -1
  408. package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.es.js +6 -6
  409. package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.es.js.map +1 -1
  410. package/dist/node_modules/@uiw/react-codemirror/esm/index.cjs +1 -1
  411. package/dist/node_modules/@uiw/react-codemirror/esm/index.cjs.map +1 -1
  412. package/dist/node_modules/@uiw/react-codemirror/esm/index.es.js +27 -27
  413. package/dist/node_modules/@uiw/react-codemirror/esm/index.es.js.map +1 -1
  414. package/dist/node_modules/lucide-react/dist/esm/icons/{chevron-down.cjs → chevrons-down.cjs} +2 -2
  415. package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-down.cjs.map +1 -0
  416. package/dist/node_modules/lucide-react/dist/esm/icons/{chevron-down.es.js → chevrons-down.es.js} +6 -3
  417. package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-down.es.js.map +1 -0
  418. package/dist/node_modules/react-markdown/lib/index.cjs +1 -1
  419. package/dist/node_modules/react-markdown/lib/index.cjs.map +1 -1
  420. package/dist/node_modules/react-markdown/lib/index.es.js +39 -39
  421. package/dist/node_modules/react-markdown/lib/index.es.js.map +1 -1
  422. package/dist/renderer.cjs +1 -1
  423. package/dist/renderer.d.ts +18 -17
  424. package/dist/renderer.es.js +20 -17
  425. package/dist/renderer.es.js.map +1 -1
  426. package/dist/scroll.cjs +1 -1
  427. package/dist/scroll.d.ts +6 -3
  428. package/dist/scroll.es.js +4 -2
  429. package/dist/scroll.es.js.map +1 -1
  430. package/dist/slide.d.ts +3 -3
  431. package/package.json +5 -2
  432. package/dist/_virtual/jsx-runtime.cjs +0 -2
  433. package/dist/_virtual/jsx-runtime.cjs.map +0 -1
  434. package/dist/_virtual/jsx-runtime.es.js +0 -6
  435. package/dist/_virtual/jsx-runtime.es.js.map +0 -1
  436. package/dist/_virtual/jsx-runtime.es2.js +0 -5
  437. package/dist/_virtual/jsx-runtime.es2.js.map +0 -1
  438. package/dist/_virtual/jsx-runtime2.cjs +0 -2
  439. package/dist/_virtual/jsx-runtime2.cjs.map +0 -1
  440. package/dist/_virtual/react-jsx-runtime.development.cjs +0 -2
  441. package/dist/_virtual/react-jsx-runtime.development.cjs.map +0 -1
  442. package/dist/_virtual/react-jsx-runtime.development.es.js +0 -5
  443. package/dist/_virtual/react-jsx-runtime.development.es.js.map +0 -1
  444. package/dist/_virtual/react-jsx-runtime.production.cjs +0 -2
  445. package/dist/_virtual/react-jsx-runtime.production.cjs.map +0 -1
  446. package/dist/_virtual/react-jsx-runtime.production.es.js +0 -5
  447. package/dist/_virtual/react-jsx-runtime.production.es.js.map +0 -1
  448. package/dist/lib/localeTextMap.cjs +0 -2
  449. package/dist/lib/localeTextMap.cjs.map +0 -1
  450. package/dist/lib/localeTextMap.es.js +0 -5
  451. package/dist/lib/localeTextMap.es.js.map +0 -1
  452. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.map +0 -1
  453. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.es.js.map +0 -1
  454. package/dist/node_modules/react/cjs/react-jsx-runtime.development.cjs +0 -24
  455. package/dist/node_modules/react/cjs/react-jsx-runtime.development.cjs.map +0 -1
  456. package/dist/node_modules/react/cjs/react-jsx-runtime.development.es.js +0 -409
  457. package/dist/node_modules/react/cjs/react-jsx-runtime.development.es.js.map +0 -1
  458. package/dist/node_modules/react/cjs/react-jsx-runtime.production.cjs +0 -10
  459. package/dist/node_modules/react/cjs/react-jsx-runtime.production.cjs.map +0 -1
  460. package/dist/node_modules/react/cjs/react-jsx-runtime.production.es.js +0 -36
  461. package/dist/node_modules/react/cjs/react-jsx-runtime.production.es.js.map +0 -1
  462. package/dist/node_modules/react/jsx-runtime.cjs +0 -2
  463. package/dist/node_modules/react/jsx-runtime.cjs.map +0 -1
  464. package/dist/node_modules/react/jsx-runtime.es.js +0 -11
  465. package/dist/node_modules/react/jsx-runtime.es.js.map +0 -1
@@ -1,14 +1,14 @@
1
- import { useState as R, useRef as p, useCallback as A, useEffect as v } from "react";
2
- const w = (e) => typeof Window < "u" && e instanceof Window, z = (e) => typeof Document < "u" && e instanceof Document, C = (e) => {
3
- const o = w(e) ? e.document : e;
4
- return o.scrollingElement || o.documentElement;
5
- }, H = (e) => {
6
- if (w(e) || z(e)) {
7
- const o = C(e), t = w(e) ? e.innerHeight : o?.clientHeight || 0;
1
+ import { useRef as i, useEffect as P, useState as Q, useCallback as p, useLayoutEffect as ze } from "react";
2
+ const Re = typeof window > "u" ? P : ze, U = (e) => "window" in e && e.window === e, K = (e) => "nodeType" in e && e.nodeType === 9, Ee = (e) => {
3
+ const t = U(e) ? e.document : e;
4
+ return t.scrollingElement || t.documentElement;
5
+ }, X = (e) => U(e) ? e : K(e) ? e.defaultView : e.ownerDocument.defaultView, d = (e) => {
6
+ if (U(e) || K(e)) {
7
+ const t = Ee(e), c = U(e) ? e.innerHeight : t?.clientHeight || 0;
8
8
  return {
9
- scrollTop: o?.scrollTop || 0,
10
- scrollHeight: o?.scrollHeight || 0,
11
- clientHeight: t
9
+ scrollTop: t?.scrollTop || 0,
10
+ scrollHeight: t?.scrollHeight || 0,
11
+ clientHeight: c
12
12
  };
13
13
  }
14
14
  return {
@@ -16,86 +16,355 @@ const w = (e) => typeof Window < "u" && e instanceof Window, z = (e) => typeof D
16
16
  scrollHeight: e.scrollHeight,
17
17
  clientHeight: e.clientHeight
18
18
  };
19
- }, O = (e) => e ? "current" in e ? e.current : e : null, B = (e) => {
20
- const o = typeof window < "u" ? window.getComputedStyle(e) : null, t = o?.overflowY || o?.overflow;
21
- return e.scrollHeight > e.clientHeight && t !== "visible";
22
- }, T = (e, o) => {
23
- const t = O(o);
24
- if (t) return t;
25
- const l = e?.current;
26
- if (!l) return null;
27
- if (B(l)) return l;
28
- let s = l.parentElement;
29
- for (; s; ) {
30
- if (B(s)) return s;
31
- s = s.parentElement;
32
- }
33
- return typeof window < "u" ? window : null;
34
- }, N = (e, o = {}) => {
35
- const {
36
- contentRef: t = e,
37
- scrollTarget: l,
38
- scrollThreshold: s = 150,
39
- contentVersion: F,
40
- followNewContent: h = !0,
41
- autoScrollOnInit: g = !1,
42
- behavior: b = "smooth"
43
- } = o, [D, S] = R(!1), [L, E] = R(!0), f = p(h), y = p(!1), a = p(null), d = A(() => {
44
- const n = T(t, l);
45
- if (!n) return;
46
- const { scrollTop: r, scrollHeight: u, clientHeight: i } = H(n), c = r + i >= u - s;
47
- E(c), S(!c && u > i), c && (f.current = !0);
48
- }, [t, l, s]), m = A(
49
- (n = b) => {
50
- const r = T(t, l);
51
- if (!r) return;
52
- const u = typeof window < "u" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches, i = n === "smooth" && u ? "auto" : n, c = H(r).scrollHeight;
53
- w(r) ? r.scrollTo({ top: c, behavior: i }) : z(r) ? C(r)?.scrollTo({
54
- top: c,
55
- behavior: i
56
- }) : r.scrollTo({ top: c, behavior: i }), f.current = !0, E(!0), S(!1);
57
- },
58
- [b, t, l]
19
+ }, xe = (e, t = 150) => {
20
+ const c = Math.max(0, t), l = e.scrollHeight > e.clientHeight, f = Math.max(
21
+ 0,
22
+ e.scrollHeight - e.scrollTop - e.clientHeight
23
+ ), h = !l || f === 0 || f < c;
24
+ return {
25
+ distanceFromBottom: f,
26
+ isAtBottom: h,
27
+ isScrollable: l,
28
+ showScrollToBottom: l && !h
29
+ };
30
+ }, be = (e, t = 150) => {
31
+ const c = e.map(
32
+ (l) => xe(l, t)
33
+ );
34
+ return {
35
+ distanceFromBottom: Math.max(
36
+ 0,
37
+ ...c.map((l) => l.distanceFromBottom)
38
+ ),
39
+ isAtBottom: c.every((l) => l.isAtBottom),
40
+ isScrollable: c.some((l) => l.isScrollable),
41
+ showScrollToBottom: c.some((l) => l.showScrollToBottom)
42
+ };
43
+ }, Ie = (e, t) => e === "smooth" && t ? "auto" : e, ke = (e) => e ? typeof e == "function" ? e() : "current" in e ? e.current : e : null, De = (e) => {
44
+ const { scrollHeight: t, clientHeight: c } = d(e);
45
+ return t > c + 1;
46
+ }, Oe = (e) => {
47
+ const t = e.ownerDocument.defaultView?.getComputedStyle(e).overflowY;
48
+ return ["auto", "scroll", "hidden", "overlay"].includes(t ?? "");
49
+ }, We = (e, t, c = "auto") => {
50
+ const l = ke(t);
51
+ if (t !== void 0) return l ? [l] : [];
52
+ const f = e?.current;
53
+ if (!f)
54
+ return c !== "never" && typeof document < "u" ? [document] : [];
55
+ const h = [
56
+ f,
57
+ f.parentElement
58
+ ].filter(
59
+ (Z) => Z !== null && Oe(Z)
59
60
  );
60
- return v(() => {
61
- const n = T(t, l);
62
- if (!n) return;
63
- const r = () => {
64
- a.current !== null && cancelAnimationFrame(a.current), a.current = requestAnimationFrame(() => {
65
- a.current = null;
66
- const c = H(n);
67
- c.scrollTop + c.clientHeight < c.scrollHeight - s && (f.current = !1), d();
61
+ return (c === "always" || c === "auto" && !h.some(De)) && h.push(f.ownerDocument), h;
62
+ }, ce = (e, t) => t?.current ? t.current : e.current, x = (e, t) => e.length === t.length && e.every((c, l) => c === t[l]), le = (e) => new Map(
63
+ e.map((t) => [t, d(t).scrollTop])
64
+ ), Ue = (e) => K(e) && e.defaultView || e, ge = (e, t) => {
65
+ K(e) ? Ee(e)?.scrollTo(t) : e.scrollTo(t);
66
+ }, Ke = (e) => {
67
+ if (e.defaultPrevented) return !1;
68
+ if (e.type === "wheel") return e.deltaY !== 0;
69
+ if (e.type === "pointerdown")
70
+ return !(e.button > 0);
71
+ if (e.type !== "keydown") return !0;
72
+ const t = e;
73
+ if (t.ctrlKey || t.metaKey || t.altKey || ![
74
+ "ArrowUp",
75
+ "ArrowDown",
76
+ "PageUp",
77
+ "PageDown",
78
+ "Home",
79
+ "End",
80
+ " "
81
+ ].includes(t.key))
82
+ return !1;
83
+ const c = e.target;
84
+ return c?.closest?.(
85
+ 'input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="textbox"]'
86
+ ) ? !1 : t.key !== " " || !c?.closest?.('button, a[href], [role="button"]');
87
+ };
88
+ function Ye(e, t, c) {
89
+ const l = i(
90
+ void 0
91
+ ), f = Array.isArray(t) ? t : void 0, h = l.current, N = f ? h?.length === f.length && f.every(
92
+ (n, o) => Object.is(n, h[o])
93
+ ) ? h : [...f] : void 0;
94
+ P(() => {
95
+ l.current = N;
96
+ }, [N]);
97
+ const Ae = Array.isArray(t) || t === void 0 && c !== void 0 ? {
98
+ autoScrollOnInit: !0,
99
+ scrollThreshold: 10,
100
+ ...c,
101
+ contentVersion: N ?? c?.contentVersion
102
+ } : t ?? {}, {
103
+ contentRef: C,
104
+ endRef: _,
105
+ scrollTarget: se,
106
+ pageScrollFallback: ue = "auto",
107
+ scrollThreshold: Y = 150,
108
+ contentVersion: Be,
109
+ followNewContent: L = !0,
110
+ autoScrollOnInit: $ = !1,
111
+ behavior: ie = "smooth"
112
+ } = Ae, [Fe, ee] = Q(!1), [He, Pe] = Q(!0), [Ce, Le] = Q(L), [ae, Ve] = Q(0), I = i(L), k = i(null), V = i(L), q = i(!1), M = i([]), te = i(null), ne = i(null), D = i(!1), fe = i([]), b = i(
113
+ null
114
+ ), A = i(null), B = i(null), z = i(null), j = i(null), T = p((n) => {
115
+ I.current = n, Le((o) => o === n ? o : n);
116
+ }, []), G = p(() => {
117
+ j.current !== null && (clearTimeout(j.current), j.current = null);
118
+ }, []), g = p(() => {
119
+ z.current && (z.current.view.cancelAnimationFrame(
120
+ z.current.id
121
+ ), z.current = null);
122
+ }, []), m = p(() => {
123
+ D.current = !1, G();
124
+ }, [G]), me = i({
125
+ viewportRef: e,
126
+ scrollTarget: se,
127
+ pageScrollFallback: ue
128
+ });
129
+ Re(() => {
130
+ me.current = { viewportRef: e, scrollTarget: se, pageScrollFallback: ue };
131
+ });
132
+ const w = p(() => {
133
+ const n = me.current;
134
+ return We(
135
+ n.viewportRef,
136
+ n.scrollTarget,
137
+ n.pageScrollFallback
138
+ );
139
+ }, []), O = p(
140
+ (n) => {
141
+ D.current && !x(n, fe.current) && (g(), m()), b.current && !x(n, [...b.current.keys()]) && (b.current = null);
142
+ const o = be(
143
+ n.map(d),
144
+ Y
145
+ );
146
+ if (Pe(o.isAtBottom), D.current)
147
+ return ee(
148
+ o.isAtBottom ? o.showScrollToBottom : !1
149
+ ), o.distanceFromBottom <= 1 && (m(), T(V.current), k.current = V.current ? le(n) : null), o;
150
+ ee(o.showScrollToBottom);
151
+ const u = k.current, v = I.current && u !== null && x(n, [...u.keys()]) && n.every(
152
+ (F) => d(F).scrollTop === u.get(F)
153
+ ), S = !b.current && (o.isAtBottom || v) && V.current;
154
+ return k.current = S ? le(n) : null, T(S), o;
155
+ },
156
+ [
157
+ g,
158
+ m,
159
+ Y,
160
+ T
161
+ ]
162
+ ), s = p(() => {
163
+ O(w());
164
+ }, [O, w]), E = p(
165
+ (n = ie) => {
166
+ const o = w();
167
+ if (o.length === 0) return;
168
+ const u = X(o[0]), v = u?.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? !1, S = Ie(
169
+ n,
170
+ v
171
+ ), F = S === "auto" ? "instant" : S;
172
+ if (b.current = null, k.current = null, D.current = !0, fe.current = o, T(V.current), ee(!1), g(), G(), _?.current ? _.current.scrollIntoView({
173
+ behavior: F,
174
+ block: "end"
175
+ }) : o.forEach((H) => {
176
+ const J = d(H).scrollHeight;
177
+ ge(H, { top: J, behavior: F });
178
+ }), S === "auto") {
179
+ if (V.current && be(
180
+ o.map(d),
181
+ Y
182
+ ).isAtBottom && (k.current = le(o)), u) {
183
+ const H = u.requestAnimationFrame(() => {
184
+ z.current = null, m(), s();
185
+ });
186
+ z.current = { view: u, id: H };
187
+ } else
188
+ m(), s();
189
+ return;
190
+ }
191
+ j.current = setTimeout(() => {
192
+ m(), s();
193
+ }, 1200);
194
+ },
195
+ [
196
+ ie,
197
+ g,
198
+ G,
199
+ _,
200
+ m,
201
+ w,
202
+ s,
203
+ Y,
204
+ T
205
+ ]
206
+ ), W = p(() => {
207
+ const n = w(), o = e.current, u = ce(e, C);
208
+ return x(n, M.current) && o === te.current && u === ne.current ? !1 : (x(n, M.current) || O(n), M.current = n, te.current = o, ne.current = u, Ve((v) => v + 1), !0);
209
+ }, [O, C, w, e]);
210
+ P(() => {
211
+ const n = w(), o = n[0] ? X(n[0]) : e.current?.ownerDocument.defaultView ?? null;
212
+ if (n.length === 0 && !o) return;
213
+ M.current = n, te.current = e.current, ne.current = ce(e, C);
214
+ const u = new Set(n.map(Ue)), v = new Set(
215
+ [...n.map(X), o].filter(
216
+ (r) => r !== null
217
+ )
218
+ ), S = new Set(
219
+ Array.from(v).map((r) => r.visualViewport).filter((r) => !!r)
220
+ ), F = (r) => {
221
+ if (A.current !== null && o && o.cancelAnimationFrame(A.current), !o) {
222
+ r();
223
+ return;
224
+ }
225
+ A.current = o.requestAnimationFrame(() => {
226
+ A.current = null, r();
68
227
  });
69
- }, u = () => r();
70
- n.addEventListener("scroll", r, { passive: !0 }), window.addEventListener("resize", u);
71
- const i = typeof ResizeObserver < "u" ? new ResizeObserver(u) : null;
72
- return t.current && i?.observe(t.current), typeof Element < "u" && n instanceof Element && n !== t.current && i?.observe(n), d(), () => {
73
- n.removeEventListener("scroll", r), window.removeEventListener("resize", u), i?.disconnect(), a.current !== null && cancelAnimationFrame(a.current);
228
+ }, H = new Map(
229
+ n.map((r) => [r, d(r).scrollTop])
230
+ ), J = () => {
231
+ D.current && (b.current = new Map(
232
+ n.map((r) => [r, d(r).scrollTop])
233
+ ), g(), m(), T(!1), n.forEach((r) => {
234
+ ge(r, {
235
+ top: d(r).scrollTop,
236
+ behavior: "instant"
237
+ });
238
+ }), s());
239
+ }, de = (r) => {
240
+ Ke(r) && J();
241
+ }, he = () => {
242
+ const r = b.current;
243
+ r && n.some(
244
+ (a) => d(a).scrollTop !== r.get(a)
245
+ ) && (b.current = null);
246
+ let y = !1;
247
+ n.forEach((a) => {
248
+ const oe = d(a).scrollTop;
249
+ oe < (H.get(a) ?? oe) - 1 && (y = !0), H.set(a, oe);
250
+ }), y && J(), s();
251
+ }, R = () => {
252
+ F(() => {
253
+ W(), q.current && I.current ? E("auto") : s();
254
+ });
255
+ }, we = ["wheel", "touchstart", "pointerdown", "keydown"];
256
+ u.forEach((r) => {
257
+ r.addEventListener("scroll", he, { passive: !0 }), we.forEach(
258
+ (y) => r.addEventListener(y, de, {
259
+ passive: !0,
260
+ capture: !0
261
+ })
262
+ );
263
+ }), v.forEach(
264
+ (r) => r.addEventListener("resize", R)
265
+ ), S.forEach(
266
+ (r) => r.addEventListener("resize", R)
267
+ );
268
+ const pe = o, Te = pe?.ResizeObserver, re = Te ? new Te(R) : null, ve = () => {
269
+ re?.disconnect();
270
+ const r = /* @__PURE__ */ new Set();
271
+ e.current && r.add(e.current);
272
+ const y = ce(e, C);
273
+ y && r.add(y), !C?.current && e.current && Array.from(e.current.children).forEach(
274
+ (a) => r.add(a)
275
+ ), n.forEach((a) => {
276
+ !U(a) && !K(a) && r.add(a);
277
+ }), r.forEach((a) => re?.observe(a));
278
+ };
279
+ ve();
280
+ const Se = pe?.MutationObserver, ye = Se ? new Se(() => {
281
+ ve(), R();
282
+ }) : null;
283
+ return e.current && ye?.observe(e.current, {
284
+ childList: !0,
285
+ characterData: !0,
286
+ subtree: !0
287
+ }), s(), () => {
288
+ u.forEach((r) => {
289
+ r.removeEventListener("scroll", he), we.forEach(
290
+ (y) => r.removeEventListener(y, de, !0)
291
+ );
292
+ }), v.forEach(
293
+ (r) => r.removeEventListener("resize", R)
294
+ ), S.forEach(
295
+ (r) => r.removeEventListener("resize", R)
296
+ ), re?.disconnect(), ye?.disconnect(), A.current !== null && o && (o.cancelAnimationFrame(A.current), A.current = null), x(M.current, n) && (M.current = []);
74
297
  };
75
- }, [t, d, l, s]), v(() => {
76
- if (!y.current) {
77
- y.current = !0, g && m("auto");
298
+ }, [
299
+ O,
300
+ ae,
301
+ g,
302
+ C,
303
+ W,
304
+ m,
305
+ w,
306
+ s,
307
+ E,
308
+ T,
309
+ e
310
+ ]), P(() => {
311
+ W();
312
+ }), P(() => {
313
+ const n = w(), o = n[0] ? X(n[0]) : null;
314
+ if (W(), n.length === 0) return;
315
+ const u = !q.current && $;
316
+ if (!q.current && (q.current = !0, !$)) {
317
+ s();
78
318
  return;
79
319
  }
80
- if (f.current) {
81
- const n = requestAnimationFrame(() => m("auto"));
82
- return () => cancelAnimationFrame(n);
320
+ if (B.current !== null && o && o.cancelAnimationFrame(B.current), !o) {
321
+ I.current ? E("auto") : s();
322
+ return;
323
+ }
324
+ return B.current = o.requestAnimationFrame(() => {
325
+ B.current = null, I.current || u ? E("auto") : s();
326
+ }), () => {
327
+ B.current !== null && (o.cancelAnimationFrame(B.current), B.current = null);
328
+ };
329
+ }, [
330
+ $,
331
+ ae,
332
+ Be,
333
+ W,
334
+ w,
335
+ s,
336
+ E
337
+ ]), P(() => {
338
+ if (V.current = L, !L) {
339
+ T(!1);
340
+ return;
83
341
  }
84
- d();
85
- }, [g, F, d, m]), v(() => {
86
- f.current = h;
87
- }, [h]), {
88
- showScrollToBottom: D,
89
- isAtBottom: L,
90
- followNewContent: f.current,
91
- scrollToBottom: m,
92
- refresh: d
342
+ s();
343
+ }, [L, s, T]), P(
344
+ () => () => {
345
+ g(), m();
346
+ },
347
+ [g, m]
348
+ );
349
+ const Me = p(() => {
350
+ E();
351
+ }, [E]);
352
+ return {
353
+ showScrollToBottom: Fe,
354
+ isAtBottom: He,
355
+ followNewContent: Ce,
356
+ scrollToBottom: E,
357
+ handleUserScrollToBottom: Me,
358
+ refresh: s
93
359
  };
94
- };
360
+ }
95
361
  export {
96
- N as default,
97
- H as getScrollMetrics,
98
- T as resolveScrollTarget,
99
- N as useScrollToBottom
362
+ Ye as default,
363
+ be as getCombinedScrollPresentation,
364
+ d as getScrollMetrics,
365
+ xe as getScrollPresentation,
366
+ Ie as resolveScrollBehavior,
367
+ We as resolveScrollTargets,
368
+ Ye as useScrollToBottom
100
369
  };
101
370
  //# sourceMappingURL=useScrollToBottom.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useScrollToBottom.es.js","sources":["../../../src/components/MarkdownFlow/useScrollToBottom.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\n\nexport type ScrollBehavior = \"smooth\" | \"auto\";\nexport type ScrollTarget = HTMLElement | Document | Window;\nexport type ScrollTargetRef = RefObject<ScrollTarget | null>;\n\nexport interface UseScrollToBottomOptions {\n contentRef?: RefObject<HTMLElement | null>;\n scrollTarget?: ScrollTarget | ScrollTargetRef | null;\n scrollThreshold?: number;\n contentVersion?: unknown;\n followNewContent?: boolean;\n autoScrollOnInit?: boolean;\n behavior?: ScrollBehavior;\n}\n\nexport interface UseScrollToBottomReturn {\n showScrollToBottom: boolean;\n isAtBottom: boolean;\n followNewContent: boolean;\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n refresh: () => void;\n}\n\nconst isWindow = (target: ScrollTarget): target is Window =>\n typeof Window !== \"undefined\" && target instanceof Window;\n\nconst isDocument = (target: ScrollTarget): target is Document =>\n typeof Document !== \"undefined\" && target instanceof Document;\n\nconst getDocumentScroller = (target: Document | Window): HTMLElement | null => {\n const document = isWindow(target) ? target.document : target;\n return (document.scrollingElement || document.documentElement) as HTMLElement;\n};\n\nexport const getScrollMetrics = (target: ScrollTarget) => {\n if (isWindow(target) || isDocument(target)) {\n const scroller = getDocumentScroller(target);\n const viewportHeight = isWindow(target)\n ? target.innerHeight\n : scroller?.clientHeight || 0;\n return {\n scrollTop: scroller?.scrollTop || 0,\n scrollHeight: scroller?.scrollHeight || 0,\n clientHeight: viewportHeight,\n };\n }\n return {\n scrollTop: target.scrollTop,\n scrollHeight: target.scrollHeight,\n clientHeight: target.clientHeight,\n };\n};\n\nconst scrollTargetValue = (\n target: ScrollTarget | ScrollTargetRef | null | undefined\n): ScrollTarget | null => {\n if (!target) return null;\n return \"current\" in target ? target.current : target;\n};\n\nconst isScrollable = (element: HTMLElement) => {\n const style =\n typeof window !== \"undefined\" ? window.getComputedStyle(element) : null;\n const overflow = style?.overflowY || style?.overflow;\n return element.scrollHeight > element.clientHeight && overflow !== \"visible\";\n};\n\nexport const resolveScrollTarget = (\n contentRef: RefObject<HTMLElement | null> | undefined,\n explicitTarget: ScrollTarget | ScrollTargetRef | null | undefined\n): ScrollTarget | null => {\n const explicit = scrollTargetValue(explicitTarget);\n if (explicit) return explicit;\n const content = contentRef?.current;\n if (!content) return null;\n if (isScrollable(content)) return content;\n let parent = content.parentElement;\n while (parent) {\n if (isScrollable(parent)) return parent;\n parent = parent.parentElement;\n }\n return typeof window !== \"undefined\" ? window : null;\n};\n\nexport const useScrollToBottom = (\n containerRef: RefObject<HTMLElement | null>,\n options: UseScrollToBottomOptions = {}\n): UseScrollToBottomReturn => {\n const {\n contentRef = containerRef,\n scrollTarget,\n scrollThreshold = 150,\n contentVersion,\n followNewContent: followNewContentOption = true,\n autoScrollOnInit = false,\n behavior = \"smooth\",\n } = options;\n const [showScrollToBottom, setShowScrollToBottom] = useState(false);\n const [isAtBottom, setIsAtBottom] = useState(true);\n const followingRef = useRef(followNewContentOption);\n const mountedRef = useRef(false);\n const frameRef = useRef<number | null>(null);\n\n const refresh = useCallback(() => {\n const target = resolveScrollTarget(contentRef, scrollTarget);\n if (!target) return;\n const { scrollTop, scrollHeight, clientHeight } = getScrollMetrics(target);\n const atBottom = scrollTop + clientHeight >= scrollHeight - scrollThreshold;\n setIsAtBottom(atBottom);\n setShowScrollToBottom(!atBottom && scrollHeight > clientHeight);\n if (atBottom) followingRef.current = true;\n }, [contentRef, scrollTarget, scrollThreshold]);\n\n const scrollToBottom = useCallback(\n (requestedBehavior: ScrollBehavior = behavior) => {\n const target = resolveScrollTarget(contentRef, scrollTarget);\n if (!target) return;\n const reducedMotion =\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n const actualBehavior =\n requestedBehavior === \"smooth\" && reducedMotion\n ? \"auto\"\n : requestedBehavior;\n const top = getScrollMetrics(target).scrollHeight;\n if (isWindow(target)) {\n target.scrollTo({ top, behavior: actualBehavior });\n } else if (isDocument(target)) {\n getDocumentScroller(target)?.scrollTo({\n top,\n behavior: actualBehavior,\n });\n } else {\n target.scrollTo({ top, behavior: actualBehavior });\n }\n followingRef.current = true;\n setIsAtBottom(true);\n setShowScrollToBottom(false);\n },\n [behavior, contentRef, scrollTarget]\n );\n\n useEffect(() => {\n const target = resolveScrollTarget(contentRef, scrollTarget);\n if (!target) return;\n const handleScroll = () => {\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n frameRef.current = requestAnimationFrame(() => {\n frameRef.current = null;\n const metrics = getScrollMetrics(target);\n if (\n metrics.scrollTop + metrics.clientHeight <\n metrics.scrollHeight - scrollThreshold\n ) {\n followingRef.current = false;\n }\n refresh();\n });\n };\n const handleResize = () => handleScroll();\n target.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", handleResize);\n const observer =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(handleResize)\n : null;\n if (contentRef.current) observer?.observe(contentRef.current);\n if (\n typeof Element !== \"undefined\" &&\n target instanceof Element &&\n target !== contentRef.current\n ) {\n observer?.observe(target);\n }\n refresh();\n return () => {\n target.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleResize);\n observer?.disconnect();\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n };\n }, [contentRef, refresh, scrollTarget, scrollThreshold]);\n\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n if (autoScrollOnInit) scrollToBottom(\"auto\");\n return;\n }\n if (followingRef.current) {\n const frame = requestAnimationFrame(() => scrollToBottom(\"auto\"));\n return () => cancelAnimationFrame(frame);\n }\n refresh();\n }, [autoScrollOnInit, contentVersion, refresh, scrollToBottom]);\n\n useEffect(() => {\n followingRef.current = followNewContentOption;\n }, [followNewContentOption]);\n\n return {\n showScrollToBottom,\n isAtBottom,\n followNewContent: followingRef.current,\n scrollToBottom,\n refresh,\n };\n};\n\nexport default useScrollToBottom;\n"],"names":["isWindow","target","isDocument","getDocumentScroller","document","getScrollMetrics","scroller","viewportHeight","scrollTargetValue","isScrollable","element","style","overflow","resolveScrollTarget","contentRef","explicitTarget","explicit","content","parent","useScrollToBottom","containerRef","options","scrollTarget","scrollThreshold","contentVersion","followNewContentOption","autoScrollOnInit","behavior","showScrollToBottom","setShowScrollToBottom","useState","isAtBottom","setIsAtBottom","followingRef","useRef","mountedRef","frameRef","refresh","useCallback","scrollTop","scrollHeight","clientHeight","atBottom","scrollToBottom","requestedBehavior","reducedMotion","actualBehavior","top","useEffect","handleScroll","metrics","handleResize","observer","frame"],"mappings":"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"}
1
+ {"version":3,"file":"useScrollToBottom.es.js","sources":["../../../src/components/MarkdownFlow/useScrollToBottom.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\n\nconst useCommittedLayoutEffect =\n typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nexport type ScrollBehavior = \"smooth\" | \"auto\";\nexport type PageScrollFallback = \"auto\" | \"always\" | \"never\";\nexport type ScrollTarget = HTMLElement | Document | Window;\nexport type ScrollTargetRef = RefObject<ScrollTarget | null>;\nexport type ScrollTargetResolver = () => ScrollTarget | null;\nexport type ScrollTargetInput =\n | ScrollTarget\n | ScrollTargetRef\n | ScrollTargetResolver\n | null;\n\nexport interface ScrollMetrics {\n scrollTop: number;\n scrollHeight: number;\n clientHeight: number;\n}\n\nexport interface ScrollPresentation {\n distanceFromBottom: number;\n isAtBottom: boolean;\n isScrollable: boolean;\n showScrollToBottom: boolean;\n}\n\nexport interface UseScrollToBottomOptions {\n /** Actual content box whose growth should be observed. Defaults to all direct element children of the viewport. */\n contentRef?: RefObject<HTMLElement | null>;\n /** Optional bottom anchor used to preserve nested-container scrollIntoView behavior. */\n endRef?: RefObject<HTMLElement | null>;\n /** Explicit scroll target or resolver. Unresolved targets stay inactive; omit to infer viewport, parent and page roots. */\n scrollTarget?: ScrollTargetInput;\n /** Whether page scrolling joins the viewport and parent targets. */\n pageScrollFallback?: PageScrollFallback;\n /** Near-bottom distance in pixels. Defaults to the strict 150px threshold. */\n scrollThreshold?: number;\n /** Optional refresh signal; DOM growth is observed without this prop. */\n contentVersion?: unknown;\n /** Follow growth while at the bottom, and pause after scrolling away. Defaults to true. */\n followNewContent?: boolean;\n /** Scroll to the end on the first mount. Defaults to false. */\n autoScrollOnInit?: boolean;\n /** User-triggered behavior. Auto and reduced-motion scrolling are immediate, regardless of host CSS. */\n behavior?: ScrollBehavior;\n}\n\nexport interface UseScrollToBottomReturn {\n showScrollToBottom: boolean;\n isAtBottom: boolean;\n followNewContent: boolean;\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n /** Backward-compatible click handler that ignores React event arguments. */\n handleUserScrollToBottom: () => void;\n refresh: () => void;\n}\n\nexport interface LegacyUseScrollToBottomOptions\n extends UseScrollToBottomOptions {\n /** Retained for source compatibility; scrolling now follows browser frames and observers. */\n scrollDelay?: number;\n}\n\nconst isWindow = (target: ScrollTarget): target is Window =>\n \"window\" in target && target.window === target;\n\nconst isDocument = (target: ScrollTarget): target is Document =>\n \"nodeType\" in target && target.nodeType === 9;\n\nconst getDocumentScroller = (target: Document | Window): HTMLElement | null => {\n const document = isWindow(target) ? target.document : target;\n return (document.scrollingElement || document.documentElement) as HTMLElement;\n};\n\nconst getTargetWindow = (target: ScrollTarget): Window | null => {\n if (isWindow(target)) return target;\n if (isDocument(target)) return target.defaultView;\n return target.ownerDocument.defaultView;\n};\n\nexport const getScrollMetrics = (target: ScrollTarget): ScrollMetrics => {\n if (isWindow(target) || isDocument(target)) {\n const scroller = getDocumentScroller(target);\n const viewportHeight = isWindow(target)\n ? target.innerHeight\n : scroller?.clientHeight || 0;\n return {\n scrollTop: scroller?.scrollTop || 0,\n scrollHeight: scroller?.scrollHeight || 0,\n clientHeight: viewportHeight,\n };\n }\n return {\n scrollTop: target.scrollTop,\n scrollHeight: target.scrollHeight,\n clientHeight: target.clientHeight,\n };\n};\n\nexport const getScrollPresentation = (\n metrics: ScrollMetrics,\n threshold = 150\n): ScrollPresentation => {\n const normalizedThreshold = Math.max(0, threshold);\n const isScrollable = metrics.scrollHeight > metrics.clientHeight;\n const distanceFromBottom = Math.max(\n 0,\n metrics.scrollHeight - metrics.scrollTop - metrics.clientHeight\n );\n const isAtBottom =\n !isScrollable ||\n distanceFromBottom === 0 ||\n distanceFromBottom < normalizedThreshold;\n return {\n distanceFromBottom,\n isAtBottom,\n isScrollable,\n showScrollToBottom: isScrollable && !isAtBottom,\n };\n};\n\nexport const getCombinedScrollPresentation = (\n metrics: ScrollMetrics[],\n threshold = 150\n): ScrollPresentation => {\n const presentations = metrics.map((item) =>\n getScrollPresentation(item, threshold)\n );\n return {\n distanceFromBottom: Math.max(\n 0,\n ...presentations.map((item) => item.distanceFromBottom)\n ),\n isAtBottom: presentations.every((item) => item.isAtBottom),\n isScrollable: presentations.some((item) => item.isScrollable),\n showScrollToBottom: presentations.some((item) => item.showScrollToBottom),\n };\n};\n\nexport const resolveScrollBehavior = (\n requestedBehavior: ScrollBehavior,\n prefersReducedMotion: boolean\n): ScrollBehavior =>\n requestedBehavior === \"smooth\" && prefersReducedMotion\n ? \"auto\"\n : requestedBehavior;\n\nconst scrollTargetValue = (\n target: ScrollTargetInput | undefined\n): ScrollTarget | null => {\n if (!target) return null;\n if (typeof target === \"function\") return target();\n return \"current\" in target ? target.current : target;\n};\n\nconst hasScrollableContent = (target: ScrollTarget) => {\n const { scrollHeight, clientHeight } = getScrollMetrics(target);\n return scrollHeight > clientHeight + 1;\n};\n\nconst permitsElementScrolling = (target: HTMLElement) => {\n const overflowY =\n target.ownerDocument.defaultView?.getComputedStyle(target).overflowY;\n return [\"auto\", \"scroll\", \"hidden\", \"overlay\"].includes(overflowY ?? \"\");\n};\n\nexport const resolveScrollTargets = (\n viewportRef: RefObject<HTMLElement | null> | undefined,\n explicitTarget: ScrollTargetInput | undefined,\n pageScrollFallback: PageScrollFallback = \"auto\"\n): ScrollTarget[] => {\n const explicit = scrollTargetValue(explicitTarget);\n if (explicitTarget !== undefined) return explicit ? [explicit] : [];\n\n const viewport = viewportRef?.current;\n if (!viewport) {\n return pageScrollFallback !== \"never\" && typeof document !== \"undefined\"\n ? [document]\n : [];\n }\n\n const localTargets: ScrollTarget[] = [\n viewport,\n viewport.parentElement,\n ].filter(\n (target): target is HTMLElement =>\n target !== null && permitsElementScrolling(target)\n );\n\n const shouldUsePageScroll =\n pageScrollFallback === \"always\" ||\n (pageScrollFallback === \"auto\" && !localTargets.some(hasScrollableContent));\n if (shouldUsePageScroll) localTargets.push(viewport.ownerDocument);\n\n return localTargets;\n};\n\nexport const resolveScrollTarget = (\n viewportRef: RefObject<HTMLElement | null> | undefined,\n explicitTarget: ScrollTargetInput | undefined\n): ScrollTarget | null =>\n resolveScrollTargets(viewportRef, explicitTarget, \"auto\")[0] ?? null;\n\nconst resolveObservedContent = (\n viewportRef: RefObject<HTMLElement | null>,\n contentRef: RefObject<HTMLElement | null> | undefined\n) => {\n if (contentRef?.current) return contentRef.current;\n return viewportRef.current;\n};\n\nconst sameTargets = (left: ScrollTarget[], right: ScrollTarget[]) =>\n left.length === right.length &&\n left.every((target, index) => target === right[index]);\n\nconst getScrollPositions = (targets: ScrollTarget[]) =>\n new Map(\n targets.map((target) => [target, getScrollMetrics(target).scrollTop])\n );\n\nconst getScrollEventTarget = (target: ScrollTarget): EventTarget =>\n isDocument(target) ? target.defaultView || target : target;\n\nconst scrollTargetTo = (target: ScrollTarget, options: ScrollToOptions) => {\n if (isDocument(target)) getDocumentScroller(target)?.scrollTo(options);\n else target.scrollTo(options);\n};\n\nconst isScrollInput = (event: Event) => {\n if (event.defaultPrevented) return false;\n if (event.type === \"wheel\") return (event as WheelEvent).deltaY !== 0;\n if (event.type === \"pointerdown\")\n return !((event as PointerEvent).button > 0);\n if (event.type !== \"keydown\") return true;\n const key = event as KeyboardEvent;\n if (key.ctrlKey || key.metaKey || key.altKey) return false;\n if (\n ![\n \"ArrowUp\",\n \"ArrowDown\",\n \"PageUp\",\n \"PageDown\",\n \"Home\",\n \"End\",\n \" \",\n ].includes(key.key)\n )\n return false;\n const element = event.target as Element | null;\n if (\n element?.closest?.(\n 'input, textarea, select, [contenteditable]:not([contenteditable=\"false\"]), [role=\"textbox\"]'\n )\n )\n return false;\n return (\n key.key !== \" \" || !element?.closest?.('button, a[href], [role=\"button\"]')\n );\n};\n\nexport function useScrollToBottom(\n viewportRef: RefObject<HTMLElement | null>,\n options?: UseScrollToBottomOptions\n): UseScrollToBottomReturn;\nexport function useScrollToBottom(\n viewportRef: RefObject<HTMLElement | null>,\n dependencies?: readonly unknown[],\n options?: LegacyUseScrollToBottomOptions\n): UseScrollToBottomReturn;\nexport function useScrollToBottom(\n viewportRef: RefObject<HTMLElement | null>,\n optionsOrDependencies?: UseScrollToBottomOptions | readonly unknown[],\n legacyOptions?: LegacyUseScrollToBottomOptions\n): UseScrollToBottomReturn {\n const committedDependencies = useRef<readonly unknown[] | undefined>(\n undefined\n );\n const dependencies = Array.isArray(optionsOrDependencies)\n ? optionsOrDependencies\n : undefined;\n const previousDependencies = committedDependencies.current;\n const stableDependencies = dependencies\n ? previousDependencies?.length === dependencies.length &&\n dependencies.every((value, index) =>\n Object.is(value, previousDependencies[index])\n )\n ? previousDependencies\n : [...dependencies]\n : undefined;\n // Commit a snapshot so unrelated renders preserve legacy dependency values,\n // including NaN and object identity, without leaking an abandoned render.\n useEffect(() => {\n committedDependencies.current = stableDependencies;\n }, [stableDependencies]);\n const isLegacyCall =\n Array.isArray(optionsOrDependencies) ||\n (optionsOrDependencies === undefined && legacyOptions !== undefined);\n const options: UseScrollToBottomOptions = isLegacyCall\n ? {\n autoScrollOnInit: true,\n scrollThreshold: 10,\n ...legacyOptions,\n contentVersion: stableDependencies ?? legacyOptions?.contentVersion,\n }\n : ((optionsOrDependencies as UseScrollToBottomOptions | undefined) ?? {});\n const {\n contentRef,\n endRef,\n scrollTarget,\n pageScrollFallback = \"auto\",\n scrollThreshold = 150,\n contentVersion,\n followNewContent: followNewContentOption = true,\n autoScrollOnInit = false,\n behavior = \"smooth\",\n } = options;\n const [showScrollToBottom, setShowScrollToBottom] = useState(false);\n const [isAtBottom, setIsAtBottom] = useState(true);\n const [isFollowing, setIsFollowing] = useState(followNewContentOption);\n const [bindingRevision, setBindingRevision] = useState(0);\n const followingRef = useRef(followNewContentOption);\n const followingPositionsRef = useRef<Map<ScrollTarget, number> | null>(null);\n const followEnabledRef = useRef(followNewContentOption);\n const initializedRef = useRef(false);\n const boundTargetsRef = useRef<ScrollTarget[]>([]);\n const boundViewportRef = useRef<HTMLElement | null>(null);\n const boundContentRef = useRef<HTMLElement | null>(null);\n const programmaticScrollRef = useRef(false);\n const programmaticTargetsRef = useRef<ScrollTarget[]>([]);\n const interruptedPositionsRef = useRef<Map<ScrollTarget, number> | null>(\n null\n );\n const eventFrameRef = useRef<number | null>(null);\n const contentFrameRef = useRef<number | null>(null);\n const programmaticFrameRef = useRef<{\n view: Window;\n id: number;\n } | null>(null);\n const settleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const setFollowing = useCallback((next: boolean) => {\n followingRef.current = next;\n setIsFollowing((current) => (current === next ? current : next));\n }, []);\n\n const clearSettleTimer = useCallback(() => {\n if (settleTimerRef.current !== null) {\n clearTimeout(settleTimerRef.current);\n settleTimerRef.current = null;\n }\n }, []);\n\n const clearProgrammaticFrame = useCallback(() => {\n if (programmaticFrameRef.current) {\n programmaticFrameRef.current.view.cancelAnimationFrame(\n programmaticFrameRef.current.id\n );\n programmaticFrameRef.current = null;\n }\n }, []);\n\n const finishProgrammaticScroll = useCallback(() => {\n programmaticScrollRef.current = false;\n clearSettleTimer();\n }, [clearSettleTimer]);\n\n const targetInputsRef = useRef({\n viewportRef,\n scrollTarget,\n pageScrollFallback,\n });\n // Read the latest committed inputs without replaying effects for equivalent\n // inline resolver functions. Abandoned renders must not change live targets.\n useCommittedLayoutEffect(() => {\n targetInputsRef.current = { viewportRef, scrollTarget, pageScrollFallback };\n });\n const getResolvedTargets = useCallback(() => {\n const inputs = targetInputsRef.current;\n return resolveScrollTargets(\n inputs.viewportRef,\n inputs.scrollTarget,\n inputs.pageScrollFallback\n );\n }, []);\n\n const applyPresentation = useCallback(\n (targets: ScrollTarget[]) => {\n if (\n programmaticScrollRef.current &&\n !sameTargets(targets, programmaticTargetsRef.current)\n ) {\n clearProgrammaticFrame();\n finishProgrammaticScroll();\n }\n if (\n interruptedPositionsRef.current &&\n !sameTargets(targets, [...interruptedPositionsRef.current.keys()])\n ) {\n interruptedPositionsRef.current = null;\n }\n const presentation = getCombinedScrollPresentation(\n targets.map(getScrollMetrics),\n scrollThreshold\n );\n setIsAtBottom(presentation.isAtBottom);\n\n if (programmaticScrollRef.current) {\n setShowScrollToBottom(\n presentation.isAtBottom ? presentation.showScrollToBottom : false\n );\n // The visibility threshold is not the native animation's destination.\n if (presentation.distanceFromBottom <= 1) {\n finishProgrammaticScroll();\n setFollowing(followEnabledRef.current);\n followingPositionsRef.current = followEnabledRef.current\n ? getScrollPositions(targets)\n : null;\n }\n return presentation;\n }\n\n setShowScrollToBottom(presentation.showScrollToBottom);\n const followingPositions = followingPositionsRef.current;\n // A queued native event can arrive after content grows but before its\n // observer runs. Unchanged positions are not a request to stop following.\n const stayedAtFollowingPosition =\n followingRef.current &&\n followingPositions !== null &&\n sameTargets(targets, [...followingPositions.keys()]) &&\n targets.every(\n (target) =>\n getScrollMetrics(target).scrollTop ===\n followingPositions.get(target)\n );\n const nextFollowing =\n !interruptedPositionsRef.current &&\n (presentation.isAtBottom || stayedAtFollowingPosition) &&\n followEnabledRef.current;\n followingPositionsRef.current = nextFollowing\n ? getScrollPositions(targets)\n : null;\n setFollowing(nextFollowing);\n return presentation;\n },\n [\n clearProgrammaticFrame,\n finishProgrammaticScroll,\n scrollThreshold,\n setFollowing,\n ]\n );\n\n const refresh = useCallback(() => {\n applyPresentation(getResolvedTargets());\n }, [applyPresentation, getResolvedTargets]);\n\n const scrollToBottom = useCallback(\n (requestedBehavior: ScrollBehavior = behavior) => {\n const targets = getResolvedTargets();\n if (targets.length === 0) return;\n\n const view = getTargetWindow(targets[0]);\n const prefersReducedMotion =\n view?.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n const actualBehavior = resolveScrollBehavior(\n requestedBehavior,\n prefersReducedMotion\n );\n // Native \"auto\" can inherit CSS smooth scrolling; our auto path must finish immediately.\n const nativeBehavior =\n actualBehavior === \"auto\" ? \"instant\" : actualBehavior;\n\n interruptedPositionsRef.current = null;\n followingPositionsRef.current = null;\n programmaticScrollRef.current = true;\n programmaticTargetsRef.current = targets;\n setFollowing(followEnabledRef.current);\n setShowScrollToBottom(false);\n clearProgrammaticFrame();\n clearSettleTimer();\n\n if (endRef?.current) {\n endRef.current.scrollIntoView({\n behavior: nativeBehavior,\n block: \"end\",\n });\n } else {\n targets.forEach((target) => {\n const top = getScrollMetrics(target).scrollHeight;\n scrollTargetTo(target, { top, behavior: nativeBehavior });\n });\n }\n\n if (actualBehavior === \"auto\") {\n // Immediate native scrolling has already reached its destination;\n // retain that position if content grows before the completion frame.\n if (\n followEnabledRef.current &&\n getCombinedScrollPresentation(\n targets.map(getScrollMetrics),\n scrollThreshold\n ).isAtBottom\n ) {\n followingPositionsRef.current = getScrollPositions(targets);\n }\n if (view) {\n const id = view.requestAnimationFrame(() => {\n programmaticFrameRef.current = null;\n finishProgrammaticScroll();\n refresh();\n });\n programmaticFrameRef.current = { view, id };\n } else {\n finishProgrammaticScroll();\n refresh();\n }\n return;\n }\n\n settleTimerRef.current = setTimeout(() => {\n finishProgrammaticScroll();\n refresh();\n }, 1200);\n },\n [\n behavior,\n clearProgrammaticFrame,\n clearSettleTimer,\n endRef,\n finishProgrammaticScroll,\n getResolvedTargets,\n refresh,\n scrollThreshold,\n setFollowing,\n ]\n );\n\n const ensureTargetBinding = useCallback(() => {\n const nextTargets = getResolvedTargets();\n const nextViewport = viewportRef.current;\n const nextContent = resolveObservedContent(viewportRef, contentRef);\n if (\n sameTargets(nextTargets, boundTargetsRef.current) &&\n nextViewport === boundViewportRef.current &&\n nextContent === boundContentRef.current\n )\n return false;\n // Reconcile before any queued layout frame can follow the replacement.\n if (!sameTargets(nextTargets, boundTargetsRef.current)) {\n applyPresentation(nextTargets);\n }\n boundTargetsRef.current = nextTargets;\n boundViewportRef.current = nextViewport;\n boundContentRef.current = nextContent;\n setBindingRevision((current) => current + 1);\n return true;\n }, [applyPresentation, contentRef, getResolvedTargets, viewportRef]);\n\n useEffect(() => {\n const targets = getResolvedTargets();\n const targetWindow = targets[0]\n ? getTargetWindow(targets[0])\n : (viewportRef.current?.ownerDocument.defaultView ?? null);\n if (targets.length === 0 && !targetWindow) return;\n\n boundTargetsRef.current = targets;\n boundViewportRef.current = viewportRef.current;\n boundContentRef.current = resolveObservedContent(viewportRef, contentRef);\n const eventTargets = new Set(targets.map(getScrollEventTarget));\n const targetWindows = new Set(\n [...targets.map(getTargetWindow), targetWindow].filter(\n (view): view is Window => view !== null\n )\n );\n const visualViewports = new Set(\n Array.from(targetWindows)\n .map((view) => view.visualViewport)\n .filter((viewport): viewport is VisualViewport => Boolean(viewport))\n );\n\n const scheduleEvent = (callback: () => void) => {\n if (eventFrameRef.current !== null && targetWindow) {\n targetWindow.cancelAnimationFrame(eventFrameRef.current);\n }\n if (!targetWindow) {\n callback();\n return;\n }\n eventFrameRef.current = targetWindow.requestAnimationFrame(() => {\n eventFrameRef.current = null;\n callback();\n });\n };\n\n const lastPositions = new Map(\n targets.map((target) => [target, getScrollMetrics(target).scrollTop])\n );\n const interruptProgrammaticScroll = () => {\n if (!programmaticScrollRef.current) return;\n interruptedPositionsRef.current = new Map(\n targets.map((target) => [target, getScrollMetrics(target).scrollTop])\n );\n clearProgrammaticFrame();\n finishProgrammaticScroll();\n setFollowing(false);\n targets.forEach((target) => {\n // Stop the native animation as well as the library's completion work.\n scrollTargetTo(target, {\n top: getScrollMetrics(target).scrollTop,\n behavior: \"instant\",\n });\n });\n refresh();\n };\n const handleInput = (event: Event) => {\n if (isScrollInput(event)) interruptProgrammaticScroll();\n };\n const handleScroll = () => {\n const interruptedPositions = interruptedPositionsRef.current;\n // Cancellation itself can queue an unchanged scroll event. Only new\n // positions can release the input pause; layout refreshes cannot.\n if (\n interruptedPositions &&\n targets.some(\n (target) =>\n getScrollMetrics(target).scrollTop !==\n interruptedPositions.get(target)\n )\n ) {\n interruptedPositionsRef.current = null;\n }\n let movedAway = false;\n targets.forEach((target) => {\n const top = getScrollMetrics(target).scrollTop;\n if (top < (lastPositions.get(target) ?? top) - 1) movedAway = true;\n lastPositions.set(target, top);\n });\n // Scrollbar dragging may not emit a content pointer event in every browser.\n if (movedAway) interruptProgrammaticScroll();\n // Record user intent before an observer or content frame can follow growth.\n refresh();\n };\n\n const handleLayoutChange = () => {\n scheduleEvent(() => {\n ensureTargetBinding();\n if (initializedRef.current && followingRef.current) {\n scrollToBottom(\"auto\");\n } else {\n refresh();\n }\n });\n };\n\n const inputEvents = [\"wheel\", \"touchstart\", \"pointerdown\", \"keydown\"];\n eventTargets.forEach((eventTarget) => {\n eventTarget.addEventListener(\"scroll\", handleScroll, { passive: true });\n inputEvents.forEach((type) =>\n eventTarget.addEventListener(type, handleInput, {\n passive: true,\n capture: true,\n })\n );\n });\n targetWindows.forEach((view) =>\n view.addEventListener(\"resize\", handleLayoutChange)\n );\n visualViewports.forEach((viewport) =>\n viewport.addEventListener(\"resize\", handleLayoutChange)\n );\n\n const observerWindow = targetWindow as (Window & typeof globalThis) | null;\n const ResizeObserverConstructor = observerWindow?.ResizeObserver;\n const resizeObserver = ResizeObserverConstructor\n ? new ResizeObserverConstructor(handleLayoutChange)\n : null;\n const observeResizeTargets = () => {\n resizeObserver?.disconnect();\n const elements = new Set<Element>();\n if (viewportRef.current) elements.add(viewportRef.current);\n const observedContent = resolveObservedContent(viewportRef, contentRef);\n if (observedContent) elements.add(observedContent);\n // A fixed-height viewport does not resize when a later message or image\n // grows. Without a content wrapper, every direct child is a resize root.\n if (!contentRef?.current && viewportRef.current) {\n Array.from(viewportRef.current.children).forEach((element) =>\n elements.add(element)\n );\n }\n targets.forEach((target) => {\n if (!isWindow(target) && !isDocument(target)) elements.add(target);\n });\n elements.forEach((element) => resizeObserver?.observe(element));\n };\n observeResizeTargets();\n\n const MutationObserverConstructor = observerWindow?.MutationObserver;\n const mutationObserver = MutationObserverConstructor\n ? new MutationObserverConstructor(() => {\n observeResizeTargets();\n handleLayoutChange();\n })\n : null;\n if (viewportRef.current) {\n mutationObserver?.observe(viewportRef.current, {\n childList: true,\n characterData: true,\n subtree: true,\n });\n }\n\n refresh();\n return () => {\n eventTargets.forEach((eventTarget) => {\n eventTarget.removeEventListener(\"scroll\", handleScroll);\n inputEvents.forEach((type) =>\n eventTarget.removeEventListener(type, handleInput, true)\n );\n });\n targetWindows.forEach((view) =>\n view.removeEventListener(\"resize\", handleLayoutChange)\n );\n visualViewports.forEach((viewport) =>\n viewport.removeEventListener(\"resize\", handleLayoutChange)\n );\n resizeObserver?.disconnect();\n mutationObserver?.disconnect();\n if (eventFrameRef.current !== null && targetWindow) {\n targetWindow.cancelAnimationFrame(eventFrameRef.current);\n eventFrameRef.current = null;\n }\n if (sameTargets(boundTargetsRef.current, targets)) {\n boundTargetsRef.current = [];\n }\n };\n }, [\n applyPresentation,\n bindingRevision,\n clearProgrammaticFrame,\n contentRef,\n ensureTargetBinding,\n finishProgrammaticScroll,\n getResolvedTargets,\n refresh,\n scrollToBottom,\n setFollowing,\n viewportRef,\n ]);\n\n // Ref objects are stable even when a host replaces their nodes during commit.\n useEffect(() => {\n ensureTargetBinding();\n });\n\n useEffect(() => {\n const targets = getResolvedTargets();\n const targetWindow = targets[0] ? getTargetWindow(targets[0]) : null;\n ensureTargetBinding();\n // An explicit ref may mount later; defer initialization until it resolves.\n if (targets.length === 0) return;\n const shouldAutoScrollOnInit = !initializedRef.current && autoScrollOnInit;\n\n if (!initializedRef.current) {\n initializedRef.current = true;\n if (!autoScrollOnInit) {\n refresh();\n return;\n }\n }\n\n if (contentFrameRef.current !== null && targetWindow) {\n targetWindow.cancelAnimationFrame(contentFrameRef.current);\n }\n if (!targetWindow) {\n if (followingRef.current) scrollToBottom(\"auto\");\n else refresh();\n return;\n }\n\n contentFrameRef.current = targetWindow.requestAnimationFrame(() => {\n contentFrameRef.current = null;\n if (followingRef.current || shouldAutoScrollOnInit) {\n scrollToBottom(\"auto\");\n } else refresh();\n });\n\n return () => {\n if (contentFrameRef.current !== null) {\n targetWindow.cancelAnimationFrame(contentFrameRef.current);\n contentFrameRef.current = null;\n }\n };\n }, [\n autoScrollOnInit,\n bindingRevision,\n contentVersion,\n ensureTargetBinding,\n getResolvedTargets,\n refresh,\n scrollToBottom,\n ]);\n\n useEffect(() => {\n followEnabledRef.current = followNewContentOption;\n if (!followNewContentOption) {\n setFollowing(false);\n return;\n }\n refresh();\n }, [followNewContentOption, refresh, setFollowing]);\n\n useEffect(\n () => () => {\n clearProgrammaticFrame();\n finishProgrammaticScroll();\n },\n [clearProgrammaticFrame, finishProgrammaticScroll]\n );\n\n const handleUserScrollToBottom = useCallback(() => {\n scrollToBottom();\n }, [scrollToBottom]);\n\n return {\n showScrollToBottom,\n isAtBottom,\n followNewContent: isFollowing,\n scrollToBottom,\n handleUserScrollToBottom,\n refresh,\n };\n}\n\nexport default useScrollToBottom;\n"],"names":["useCommittedLayoutEffect","useEffect","useLayoutEffect","isWindow","target","isDocument","getDocumentScroller","document","getTargetWindow","getScrollMetrics","scroller","viewportHeight","getScrollPresentation","metrics","threshold","normalizedThreshold","isScrollable","distanceFromBottom","isAtBottom","getCombinedScrollPresentation","presentations","item","resolveScrollBehavior","requestedBehavior","prefersReducedMotion","scrollTargetValue","hasScrollableContent","scrollHeight","clientHeight","permitsElementScrolling","overflowY","resolveScrollTargets","viewportRef","explicitTarget","pageScrollFallback","explicit","viewport","localTargets","resolveObservedContent","contentRef","sameTargets","left","right","index","getScrollPositions","targets","getScrollEventTarget","scrollTargetTo","options","isScrollInput","event","key","element","useScrollToBottom","optionsOrDependencies","legacyOptions","committedDependencies","useRef","dependencies","previousDependencies","stableDependencies","value","endRef","scrollTarget","scrollThreshold","contentVersion","followNewContentOption","autoScrollOnInit","behavior","showScrollToBottom","setShowScrollToBottom","useState","setIsAtBottom","isFollowing","setIsFollowing","bindingRevision","setBindingRevision","followingRef","followingPositionsRef","followEnabledRef","initializedRef","boundTargetsRef","boundViewportRef","boundContentRef","programmaticScrollRef","programmaticTargetsRef","interruptedPositionsRef","eventFrameRef","contentFrameRef","programmaticFrameRef","settleTimerRef","setFollowing","useCallback","next","current","clearSettleTimer","clearProgrammaticFrame","finishProgrammaticScroll","targetInputsRef","getResolvedTargets","inputs","applyPresentation","presentation","followingPositions","stayedAtFollowingPosition","nextFollowing","refresh","scrollToBottom","view","actualBehavior","nativeBehavior","top","id","ensureTargetBinding","nextTargets","nextViewport","nextContent","targetWindow","eventTargets","targetWindows","visualViewports","scheduleEvent","callback","lastPositions","interruptProgrammaticScroll","handleInput","handleScroll","interruptedPositions","movedAway","handleLayoutChange","inputEvents","eventTarget","type","observerWindow","ResizeObserverConstructor","resizeObserver","observeResizeTargets","elements","observedContent","MutationObserverConstructor","mutationObserver","shouldAutoScrollOnInit","handleUserScrollToBottom"],"mappings":"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"}