markdown-flow-ui 0.3.2-dev.2 → 0.3.2

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 (283) hide show
  1. package/README.md +0 -13
  2. package/dist/_virtual/index.es8.js +2 -2
  3. package/dist/_virtual/index.es9.js +2 -2
  4. package/dist/_virtual/index8.cjs +1 -1
  5. package/dist/_virtual/index9.cjs +1 -1
  6. package/dist/assets/markdown-flow-ui.css +1 -1
  7. package/dist/components/ContentRender/IframeSandbox.cjs.map +1 -1
  8. package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
  9. package/dist/components/ContentRender/utils/video-markdown-run.cjs.map +1 -1
  10. package/dist/components/ContentRender/utils/video-markdown-run.es.js.map +1 -1
  11. package/dist/components/MarkdownFlow/ScrollToBottomButton.cjs.map +1 -1
  12. package/dist/components/MarkdownFlow/ScrollToBottomButton.es.js.map +1 -1
  13. package/dist/components/MarkdownFlow/ScrollToBottomControl.cjs.map +1 -1
  14. package/dist/components/MarkdownFlow/ScrollToBottomControl.es.js.map +1 -1
  15. package/dist/components/MarkdownFlow/useScrollToBottom.cjs.map +1 -1
  16. package/dist/components/MarkdownFlow/useScrollToBottom.es.js.map +1 -1
  17. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs +1 -1
  18. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.map +1 -1
  19. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.d.ts +2 -2
  20. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +323 -562
  21. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
  22. package/dist/components/MarkdownFlowEditor/components/EditorToolbar.cjs +1 -1
  23. package/dist/components/MarkdownFlowEditor/components/EditorToolbar.cjs.map +1 -1
  24. package/dist/components/MarkdownFlowEditor/components/EditorToolbar.d.ts +0 -8
  25. package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js +64 -107
  26. package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js.map +1 -1
  27. package/dist/components/MarkdownFlowEditor/editor-context.cjs +1 -1
  28. package/dist/components/MarkdownFlowEditor/editor-context.cjs.map +1 -1
  29. package/dist/components/MarkdownFlowEditor/editor-context.es.js +4 -10
  30. package/dist/components/MarkdownFlowEditor/editor-context.es.js.map +1 -1
  31. package/dist/components/MarkdownFlowEditor/editorI18n.d.ts +0 -308
  32. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs +1 -1
  33. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.d.ts +1 -15
  34. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js +87 -115
  35. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js.map +1 -1
  36. package/dist/components/MarkdownFlowEditor/locales/de-DE.json.cjs +1 -1
  37. package/dist/components/MarkdownFlowEditor/locales/de-DE.json.d.ts +1 -15
  38. package/dist/components/MarkdownFlowEditor/locales/de-DE.json.es.js +88 -116
  39. package/dist/components/MarkdownFlowEditor/locales/de-DE.json.es.js.map +1 -1
  40. package/dist/components/MarkdownFlowEditor/locales/en-US.json.cjs +1 -1
  41. package/dist/components/MarkdownFlowEditor/locales/en-US.json.d.ts +1 -15
  42. package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js +88 -116
  43. package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js.map +1 -1
  44. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.cjs +1 -1
  45. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.d.ts +1 -15
  46. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js +80 -108
  47. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js.map +1 -1
  48. package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.cjs +1 -1
  49. package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.d.ts +1 -15
  50. package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.es.js +82 -110
  51. package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.es.js.map +1 -1
  52. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.cjs +1 -1
  53. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.d.ts +1 -15
  54. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js +86 -114
  55. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js.map +1 -1
  56. package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.cjs +1 -1
  57. package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.d.ts +1 -15
  58. package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.es.js +88 -116
  59. package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.es.js.map +1 -1
  60. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs +1 -1
  61. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.d.ts +1 -15
  62. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js +85 -113
  63. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js.map +1 -1
  64. package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.cjs +1 -1
  65. package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.d.ts +1 -15
  66. package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.es.js +94 -122
  67. package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.es.js.map +1 -1
  68. package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.cjs +1 -1
  69. package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.d.ts +1 -15
  70. package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.es.js +74 -102
  71. package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.es.js.map +1 -1
  72. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.cjs +1 -1
  73. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.d.ts +1 -15
  74. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js +72 -100
  75. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js.map +1 -1
  76. package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.cjs +1 -1
  77. package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.cjs.map +1 -1
  78. package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.d.ts +2 -1
  79. package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js +62 -53
  80. package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js.map +1 -1
  81. package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.cjs.map +1 -1
  82. package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.d.ts +1 -1
  83. package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.es.js.map +1 -1
  84. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs +3 -3
  85. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs.map +1 -1
  86. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.d.ts +1 -5
  87. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js +149 -154
  88. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js.map +1 -1
  89. package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.cjs +1 -1
  90. package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.cjs.map +1 -1
  91. package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.d.ts +2 -1
  92. package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js +53 -42
  93. package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js.map +1 -1
  94. package/dist/components/MarkdownFlowEditor/types.cjs +1 -1
  95. package/dist/components/MarkdownFlowEditor/types.cjs.map +1 -1
  96. package/dist/components/MarkdownFlowEditor/types.d.ts +1 -11
  97. package/dist/components/MarkdownFlowEditor/types.es.js +2 -2
  98. package/dist/components/MarkdownFlowEditor/types.es.js.map +1 -1
  99. package/dist/components/MarkdownFlowEditor/utils.cjs +1 -1
  100. package/dist/components/MarkdownFlowEditor/utils.cjs.map +1 -1
  101. package/dist/components/MarkdownFlowEditor/utils.d.ts +0 -10
  102. package/dist/components/MarkdownFlowEditor/utils.es.js +59 -73
  103. package/dist/components/MarkdownFlowEditor/utils.es.js.map +1 -1
  104. package/dist/components/Slide/MarkdownSlideScaling.cjs.map +1 -1
  105. package/dist/components/Slide/MarkdownSlideScaling.es.js.map +1 -1
  106. package/dist/components/Slide/MobilePlayerSettingsSheet.es.js +16 -16
  107. package/dist/components/Slide/Player.cjs.map +1 -1
  108. package/dist/components/Slide/Player.es.js.map +1 -1
  109. package/dist/components/Slide/Slide.cjs.map +1 -1
  110. package/dist/components/Slide/Slide.es.js.map +1 -1
  111. package/dist/components/Slide/SubtitleOverlay.cjs.map +1 -1
  112. package/dist/components/Slide/SubtitleOverlay.es.js.map +1 -1
  113. package/dist/components/Slide/slideI18n.cjs.map +1 -1
  114. package/dist/components/Slide/slideI18n.es.js.map +1 -1
  115. package/dist/components/Slide/useSlide.cjs.map +1 -1
  116. package/dist/components/Slide/useSlide.es.js.map +1 -1
  117. package/dist/components/Slide/utils/streamingNavigation.cjs.map +1 -1
  118. package/dist/components/Slide/utils/streamingNavigation.es.js.map +1 -1
  119. package/dist/components/ui/dialog.cjs +1 -1
  120. package/dist/components/ui/dialog.cjs.map +1 -1
  121. package/dist/components/ui/dialog.es.js +27 -27
  122. package/dist/components/ui/dialog.es.js.map +1 -1
  123. package/dist/lib/interaction-defaults.cjs.map +1 -1
  124. package/dist/lib/interaction-defaults.es.js.map +1 -1
  125. package/dist/markdown-flow-ui-lib.css +1 -1
  126. package/dist/markdown-flow-ui.css +1 -1
  127. package/dist/node_modules/@braintree/sanitize-url/dist/index.cjs +1 -1
  128. package/dist/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
  129. package/dist/node_modules/@radix-ui/react-context/dist/index.cjs +1 -1
  130. package/dist/node_modules/@radix-ui/react-context/dist/index.cjs.map +1 -1
  131. package/dist/node_modules/@radix-ui/react-context/dist/index.es.js +34 -49
  132. package/dist/node_modules/@radix-ui/react-context/dist/index.es.js.map +1 -1
  133. package/dist/node_modules/@radix-ui/react-dialog/dist/index.cjs +1 -5
  134. package/dist/node_modules/@radix-ui/react-dialog/dist/index.cjs.map +1 -1
  135. package/dist/node_modules/@radix-ui/react-dialog/dist/index.es.js +206 -220
  136. package/dist/node_modules/@radix-ui/react-dialog/dist/index.es.js.map +1 -1
  137. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive/dist/index.cjs +2 -0
  138. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive/dist/index.cjs.map +1 -0
  139. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive/dist/index.es.js +50 -0
  140. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive/dist/index.es.js.map +1 -0
  141. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs/dist/index.cjs +2 -0
  142. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs/dist/index.cjs.map +1 -0
  143. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs/dist/index.es.js +34 -0
  144. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs/dist/index.es.js.map +1 -0
  145. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context/dist/index.cjs +2 -0
  146. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context/dist/index.cjs.map +1 -0
  147. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context/dist/index.es.js +82 -0
  148. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context/dist/index.es.js.map +1 -0
  149. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs +2 -0
  150. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs.map +1 -0
  151. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/dist/index.es.js +216 -0
  152. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/dist/index.es.js.map +1 -0
  153. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/dist/index.cjs +2 -0
  154. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/dist/index.cjs.map +1 -0
  155. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/dist/index.es.js +15 -0
  156. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/dist/index.es.js.map +1 -0
  157. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal/dist/index.cjs +2 -0
  158. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal/dist/index.cjs.map +1 -0
  159. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal/dist/index.es.js +18 -0
  160. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal/dist/index.es.js.map +1 -0
  161. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/dist/index.cjs +2 -0
  162. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/dist/index.cjs.map +1 -0
  163. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/dist/index.es.js +104 -0
  164. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/dist/index.es.js.map +1 -0
  165. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive/dist/index.cjs +2 -0
  166. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive/dist/index.cjs.map +1 -0
  167. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive/dist/index.es.js +39 -0
  168. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive/dist/index.es.js.map +1 -0
  169. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs +2 -0
  170. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs.map +1 -0
  171. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref/dist/index.es.js +13 -0
  172. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref/dist/index.es.js.map +1 -0
  173. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/dist/index.cjs +2 -0
  174. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/dist/index.cjs.map +1 -0
  175. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/dist/index.es.js +70 -0
  176. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/dist/index.es.js.map +1 -0
  177. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-effect-event/dist/index.cjs +2 -0
  178. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-effect-event/dist/index.cjs.map +1 -0
  179. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-effect-event/dist/index.es.js +20 -0
  180. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-effect-event/dist/index.es.js.map +1 -0
  181. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect/dist/index.cjs +2 -0
  182. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect/dist/index.cjs.map +1 -0
  183. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect/dist/index.es.js +7 -0
  184. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect/dist/index.es.js.map +1 -0
  185. package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.cjs +1 -1
  186. package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.cjs.map +1 -1
  187. package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.es.js +18 -9
  188. package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.es.js.map +1 -1
  189. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.cjs +1 -1
  190. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.cjs.map +1 -1
  191. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.es.js +148 -100
  192. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.es.js.map +1 -1
  193. package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs/dist/index.cjs +2 -0
  194. package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs/dist/index.cjs.map +1 -0
  195. package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs/dist/index.es.js +34 -0
  196. package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs/dist/index.es.js.map +1 -0
  197. package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive/dist/index.cjs +2 -0
  198. package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive/dist/index.cjs.map +1 -0
  199. package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive/dist/index.es.js +39 -0
  200. package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive/dist/index.es.js.map +1 -0
  201. package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs +2 -0
  202. package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs.map +1 -0
  203. package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref/dist/index.es.js +13 -0
  204. package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref/dist/index.es.js.map +1 -0
  205. package/dist/node_modules/@radix-ui/react-id/dist/index.cjs +1 -1
  206. package/dist/node_modules/@radix-ui/react-id/dist/index.cjs.map +1 -1
  207. package/dist/node_modules/@radix-ui/react-id/dist/index.es.js +8 -8
  208. package/dist/node_modules/@radix-ui/react-id/dist/index.es.js.map +1 -1
  209. package/dist/node_modules/@radix-ui/react-primitive/dist/index.cjs +1 -1
  210. package/dist/node_modules/@radix-ui/react-primitive/dist/index.cjs.map +1 -1
  211. package/dist/node_modules/@radix-ui/react-primitive/dist/index.es.js +1 -1
  212. package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.cjs +2 -0
  213. package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.cjs.map +1 -0
  214. package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.es.js +50 -0
  215. package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.es.js.map +1 -0
  216. package/dist/node_modules/@radix-ui/react-slot/dist/index.cjs +1 -1
  217. package/dist/node_modules/@radix-ui/react-slot/dist/index.cjs.map +1 -1
  218. package/dist/node_modules/@radix-ui/react-slot/dist/index.es.js +80 -41
  219. package/dist/node_modules/@radix-ui/react-slot/dist/index.es.js.map +1 -1
  220. package/dist/node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs/dist/index.cjs +2 -0
  221. package/dist/node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs/dist/index.cjs.map +1 -0
  222. package/dist/node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs/dist/index.es.js +34 -0
  223. package/dist/node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs/dist/index.es.js.map +1 -0
  224. package/dist/node_modules/@radix-ui/react-tooltip/dist/index.cjs +1 -1
  225. package/dist/node_modules/@radix-ui/react-tooltip/dist/index.cjs.map +1 -1
  226. package/dist/node_modules/@radix-ui/react-tooltip/dist/index.es.js +1 -1
  227. package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.cjs +2 -0
  228. package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.cjs.map +1 -0
  229. package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.es.js +12 -0
  230. package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.es.js.map +1 -0
  231. package/dist/node_modules/classnames/index.cjs +1 -1
  232. package/dist/node_modules/classnames/index.es.js +1 -1
  233. package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.cjs +2 -2
  234. package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.cjs.map +1 -1
  235. package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.es.js +75 -72
  236. package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.es.js.map +1 -1
  237. package/package.json +10 -10
  238. package/dist/components/MarkdownFlowEditor/components/CustomPopover.cjs +0 -2
  239. package/dist/components/MarkdownFlowEditor/components/CustomPopover.cjs.map +0 -1
  240. package/dist/components/MarkdownFlowEditor/components/CustomPopover.d.ts +0 -17
  241. package/dist/components/MarkdownFlowEditor/components/CustomPopover.es.js +0 -46
  242. package/dist/components/MarkdownFlowEditor/components/CustomPopover.es.js.map +0 -1
  243. package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.cjs +0 -2
  244. package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.cjs.map +0 -1
  245. package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.d.ts +0 -18
  246. package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.es.js +0 -184
  247. package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.es.js.map +0 -1
  248. package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs +0 -2
  249. package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs.map +0 -1
  250. package/dist/components/MarkdownFlowEditor/components/VariableSelect.d.ts +0 -11
  251. package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js +0 -172
  252. package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js.map +0 -1
  253. package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.cjs +0 -2
  254. package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.cjs.map +0 -1
  255. package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.d.ts +0 -3
  256. package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.es.js +0 -32
  257. package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.es.js.map +0 -1
  258. package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.cjs +0 -3
  259. package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.cjs.map +0 -1
  260. package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.d.ts +0 -9
  261. package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.es.js +0 -53
  262. package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.es.js.map +0 -1
  263. package/dist/components/ui/popover.cjs +0 -2
  264. package/dist/components/ui/popover.cjs.map +0 -1
  265. package/dist/components/ui/popover.es.js +0 -24
  266. package/dist/components/ui/popover.es.js.map +0 -1
  267. package/dist/node_modules/@radix-ui/react-popover/dist/index.cjs +0 -2
  268. package/dist/node_modules/@radix-ui/react-popover/dist/index.cjs.map +0 -1
  269. package/dist/node_modules/@radix-ui/react-popover/dist/index.es.js +0 -241
  270. package/dist/node_modules/@radix-ui/react-popover/dist/index.es.js.map +0 -1
  271. package/dist/node_modules/lucide-react/dist/esm/icons/braces.cjs +0 -7
  272. package/dist/node_modules/lucide-react/dist/esm/icons/braces.cjs.map +0 -1
  273. package/dist/node_modules/lucide-react/dist/esm/icons/braces.es.js +0 -25
  274. package/dist/node_modules/lucide-react/dist/esm/icons/braces.es.js.map +0 -1
  275. package/dist/node_modules/lucide-react/dist/esm/icons/plus.cjs +0 -7
  276. package/dist/node_modules/lucide-react/dist/esm/icons/plus.cjs.map +0 -1
  277. package/dist/node_modules/lucide-react/dist/esm/icons/plus.es.js +0 -16
  278. package/dist/node_modules/lucide-react/dist/esm/icons/plus.es.js.map +0 -1
  279. package/dist/node_modules/lucide-react/dist/esm/icons/search.cjs +0 -7
  280. package/dist/node_modules/lucide-react/dist/esm/icons/search.cjs.map +0 -1
  281. package/dist/node_modules/lucide-react/dist/esm/icons/search.es.js +0 -16
  282. package/dist/node_modules/lucide-react/dist/esm/icons/search.es.js.map +0 -1
  283. /package/dist/components/MarkdownFlowEditor/plugins/{VariablePlaceholder.test.d.ts → MediaPlaceholder.variables.test.d.ts} +0 -0
package/README.md CHANGED
@@ -202,16 +202,3 @@ MIT License - see [LICENSE](LICENSE) file for details.
202
202
  - 📖 [Documentation](https://github.com/ai-shifu/markdown-flow-ui#readme)
203
203
  - 🐛 [Issue Tracker](https://github.com/ai-shifu/markdown-flow-ui/issues)
204
204
  - 💬 [Discussions](https://github.com/ai-shifu/markdown-flow-ui/discussions)
205
-
206
- ### Question and memory authoring
207
-
208
- Use `<MarkdownFlowEditor questionMode />` to author question-based scripts.
209
- In `?[%{{ What would you like to learn? }} Practice | Theory]`, the marker
210
- contains the question and identifies the memory key for its answer. The editor
211
- keeps standalone `{{...}}` as ordinary source text and removes variable insertion,
212
- search, slash commands and quick-edit placeholders. Choice and input buttons
213
- insert a localized question hint in the marker for the author to replace.
214
-
215
- `questionMode` defaults to `false` so existing integrations retain their authoring
216
- controls until they adopt the question and memory contract. The editor never
217
- writes learner memory; the host runtime owns answer persistence.
@@ -1,5 +1,5 @@
1
- var s = { exports: {} };
1
+ var r = {};
2
2
  export {
3
- s as __module
3
+ r as __exports
4
4
  };
5
5
  //# sourceMappingURL=index.es8.js.map
@@ -1,5 +1,5 @@
1
- var r = {};
1
+ var s = { exports: {} };
2
2
  export {
3
- r as __exports
3
+ s as __module
4
4
  };
5
5
  //# sourceMappingURL=index.es9.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={exports:{}};exports.__module=e;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
2
2
  //# sourceMappingURL=index8.cjs.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={exports:{}};exports.__module=e;
2
2
  //# sourceMappingURL=index9.cjs.map
@@ -1,4 +1,4 @@
1
- .tag-image,.tag-video{display:inline-flex;align-items:center;gap:4px;cursor:pointer;font-family:inherit;font-size:14px;font-style:normal;font-weight:400;line-height:20px}.tag-placeholder-content{display:inline-flex;align-items:center;gap:2px;color:#0e46fb}.tag-fixed-output-marker{color:purple}:is(.tag-image,.tag-video,.tag-variable):hover{background:#d9d9d9;border-radius:2px}.tag-placeholder-icon{display:inline-flex;align-items:center;justify-content:center;color:inherit}.tag-placeholder-icon svg{width:14px;height:14px}.tag-fixed-text,.tag-fixed-text-placeholder{display:inline-block;background-color:#d7d7d7;border-radius:6px;padding:0 6px;margin:0 0 0 4px;line-height:1.6;cursor:text;position:relative}.tag-fixed-text{color:inherit}.tag-fixed-text-placeholder{color:var(--base-muted-foreground, #737373);font-size:12px}.tag-fixed-text-placeholder .tag-fixed-text-inner{color:inherit}.tag-fixed-text-tag{display:inline-block;width:0;overflow:hidden;opacity:0;pointer-events:none}.tag-fixed-text:hover:after,.tag-fixed-text-placeholder:hover:after{content:attr(data-tooltip);position:absolute;left:50%;bottom:calc(100% + 6px);transform:translate(-50%);background-color:#000000bf;color:#fff;font-size:12px;padding:4px 8px;border-radius:4px;white-space:nowrap;pointer-events:none;z-index:10}.tag-fixed-text:hover:before,.tag-fixed-text-placeholder:hover:before{content:"";position:absolute;left:50%;bottom:100%;transform:translate(-50%);border-width:4px;border-style:solid;border-color:rgba(0,0,0,.75) transparent transparent transparent;pointer-events:none;z-index:10}.tag-divider{display:flex;align-items:center;gap:9px;width:100%;padding:6px 0;cursor:pointer;-webkit-user-select:none;user-select:none}.tag-divider img{width:24px;height:24px;flex-shrink:0}.tag-divider-line{flex:1;border-bottom:1px dashed rgba(0,0,0,.25)}.tag-icon{margin-left:10px}.tag-variable{color:#0e46fb;cursor:pointer}.tag-variable:hover{color:#0331c9}.syntax-string{color:#d4631c!important}.syntax-keyword,.syntax-bracket,.syntax-bracket *{color:purple!important}.syntax-variable{color:#0e46fb!important}.syntax-variable-invalid{color:#d4631c!important}.syntax-percent-valid{color:#0e46fb!important}.syntax-percent-invalid{color:#d4631c!important}.syntax-comment,.syntax-comment *{color:green!important}.syntax-fixed,.syntax-fixed *{color:purple!important}.syntax-button-text{color:#d4631c!important}.cm-tooltip.cm-tooltip-autocomplete{border:1px solid #e5e5e5;background-color:#fff;border-radius:4px;box-shadow:0 2px 6px #0000001a;box-sizing:border-box;width:150px;padding:5px}.cm-tooltip-autocomplete ul li{width:138px}.cm-tooltip-autocomplete ul li:hover{background-color:#f9fafb;cursor:pointer;width:140px}.cm-activeLine .cm-line{background-color:transparent}.cm-editor{padding:0}.cm-editor:focus{outline:none}.cm-editor .cm-content:focus-visible{outline:none;box-shadow:none}.cm-editor .cm-scroller{padding:24px;box-sizing:border-box}.cm-editor .cm-content{caret-color:var(--base-foreground, #0a0a0a)}.markdown-flow-editor-toolbar{position:sticky;top:0;z-index:1;left:0;right:0;display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--base-border, #e5e5e5);border-radius:var(--border-radius-rounded-lg, 10px) var(--border-radius-rounded-lg, 10px) 0 0;padding:6px 12px;background:var(--base-muted, #f5f5f5)}.markdown-flow-editor-toolbar-left{display:flex;align-items:center;gap:0;flex-wrap:wrap}.markdown-flow-editor-toolbar-right-wrapper{margin-inline-start:auto;display:flex;align-items:center}.markdown-flow-editor-toolbar-right{display:inline-flex;align-items:center;gap:8px}.markdown-flow-editor-toolbar-right-item{display:inline-flex}.markdown-flow-editor-toolbar button{display:inline-flex;align-items:center;justify-content:center;border-radius:4px;border:none;background:transparent;color:#0a0a0a;cursor:pointer;padding:6px;transition:background .2s ease,color .2s ease}.markdown-flow-editor-toolbar button:last-child{margin-right:0}.markdown-flow-editor-toolbar button:not(:disabled):hover{background:#0000000d}.markdown-flow-editor-toolbar button[data-active=true]{background:#00000014}.markdown-flow-editor-toolbar button:disabled{color:#0a0a0a66;cursor:not-allowed}.markdown-flow-editor-toolbar-right-button{border:1px solid var(--base-border, #e5e5e5);background:#fff;padding:6px 10px;border-radius:6px;font-size:13px;gap:6px;display:inline-flex;align-items:center;justify-content:center}.markdown-flow-editor-toolbar-right-button:not(:disabled):hover{background:#0000000a}.toolbar-right-icon{display:inline-flex;align-items:center}.markdown-flow-editor-variable-search{width:260px;max-width:calc(100vw - 16px);box-sizing:border-box;border-radius:8px;border:1px solid var(--base-border, #e5e5e5);background:#fff;box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a;padding:10px;z-index:50}.variable-search-icon{position:absolute;inset-inline-start:12px;top:50%;transform:translateY(-50%);width:16px;height:16px;color:var(--base-muted-foreground, #737373)}.variable-search-input{padding-inline-start:32px;height:36px;border-radius:8px}.variable-search-list{max-height:320px;overflow-y:auto;margin-top:8px}.variable-search-section+.variable-search-section{margin-top:12px}.variable-search-section-title{font-size:12px;font-weight:600;color:var(--base-muted-foreground, #737373);margin:4px 0}.variable-search-item{width:100%;text-align:start;border:none;background:transparent;border-radius:6px;padding:8px 10px;display:flex;flex-direction:column;gap:2px;cursor:pointer}.variable-search-item:not(:disabled):hover,.variable-search-item-active{background:#0e46fb14}.variable-search-item-name{font-size:14px;font-weight:600;color:#111}.variable-search-item-label{font-size:12px;color:var(--base-muted-foreground, #737373)}.variable-search-empty{font-size:13px;color:var(--base-muted-foreground, #737373);text-align:center;padding:24px 8px 8px}.markdown-flow-editor[data-disabled=true]{opacity:.8;background:var(--base-muted, #f5f5f5);cursor:not-allowed}.markdown-flow-editor[data-disabled=true] .cm-editor{background-color:transparent}.markdown-flow-editor[data-disabled=true] .cm-content{cursor:not-allowed}.markdown-flow-editor{color:#0a0a0a;font-family:PingFang SC,Microsoft YaHei,Source Han Sans SC,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;position:relative;font-size:var(--text-md-font-size, 16px);font-style:normal;font-weight:400;border-radius:var(--border-radius-rounded-lg, 10px);border:var(--border-width-border, 1px) solid var(--base-border, #e5e5e5);background:var(--base-card, #fff);box-shadow:var(--shadow-xs-offset-x, 0) var(--shadow-xs-offset-y, 1px) var(--shadow-xs-blur-radius, 2px) var(--shadow-xs-spread-radius, 0) var(--shadow-xs-color, rgba(0, 0, 0, .05));height:100%;width:100%;overflow:auto}.ͼ1 .cm-line,.ͼ1 .cm-content{padding:0}.cm-line{font-family:PingFang SC,Microsoft YaHei,Source Han Sans SC,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;line-height:30px}.cm-editor.cm-focused{outline:none}.cm-activeLine{background-color:transparent!important}.c6,.ͼ1b,.c1c,.ͼ6,.ͼ7,.ͼ1c,.c7{text-decoration:auto}.markdown-flow-editor[data-disabled=true]{background-color:#fff}.content-render{--content-render-font-family: "Charter", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", sans-serif;--content-render-font-size: var(--mdf-slide-font-size, 16px);--content-render-line-height: var(--mdf-slide-line-height, 30px);font-family:var(--content-render-font-family);min-width:0;line-height:var(--content-render-line-height);word-break:break-word;overflow-wrap:break-word;-webkit-hyphens:auto;hyphens:auto}.content-render.markdown-body{background-color:transparent;color:#000c;text-align:justify;font-family:var(--content-render-font-family);font-size:var(--content-render-font-size);font-style:normal;font-weight:var(--font-weight-normal, 400);line-height:var(--content-render-line-height);width:100%}.content-render code{unicode-bidi:isolate}.content-render .content-render-custom-bar{display:flex;align-items:center;justify-content:flex-start;width:100%;text-align:left;align-self:flex-start}.content-render.markdown-body img,.content-render.markdown-body svg{display:block;margin-left:auto;margin-right:auto}.content-render.markdown-body img{max-width:100%;height:auto}.content-render.markdown-body svg{max-width:100%;height:auto}.content-render-ol,.content-render-ul{margin:0 0 1rem;padding-inline-start:2rem}.content-render-ol{list-style-type:decimal}.content-render-ul{list-style-type:disc}.content-render-table-container{overflow-x:auto;margin:1rem 0}.content-render.markdown-body .content-render-table{display:table;width:100%;border-collapse:collapse;border:1px solid #d1d5db}.content-render-th,.content-render-td{border:1px solid #d1d5db;text-align:start}.content-render-th{background-color:#f3f4f6;font-weight:600}.content-render-tr:hover{background-color:#f9fafb;transition:background-color .2s ease}.content-render-task-list-item{display:flex;align-items:center;margin-bottom:.25rem}.content-render .content-render-checkbox{margin-inline-end:.5rem;height:1rem;width:1rem;border-radius:.25rem;border:1px solid #d1d5db;color:#2563eb;background-color:#fff}.content-render .katex-display,.content-render .katex{direction:ltr;unicode-bidi:isolate}.content-render .katex-display{margin:1.5rem 0;text-align:center}.content-render .katex{font-size:1.1em}.content-render .katex-display .katex{font-size:1.2em}.content-render-mermaid-measurement svg{height:auto}.content-render .mermaid-chart-container{margin:1.5rem 0;padding:1rem;background-color:#fafafa;border:1px solid #e1e5e9;border-radius:8px;overflow:auto}.content-render .mermaid-chart-container svg{max-width:100%;height:auto}.content-render .content-render-mermaid{display:flex;justify-content:center;align-items:center}.content-render .content-render-custom-button-after-content-inner{display:inline-flex;align-items:center;gap:6px}.content-render .content-render-mermaid-inner{display:flex;justify-content:center;width:100%}.content-render .content-render-mermaid-inner svg{margin:0 auto}.content-render .mermaid-error{margin:1rem 0;padding:1rem;border:1px solid #ff6b6b;border-radius:8px;background-color:#ffe0e0;color:#c92a2a;font-family:Consolas,Monaco,Courier New,monospace;font-size:.9em}.content-render .mermaid-error pre{margin:.5rem 0 0;font-size:.85em;white-space:pre-wrap;word-wrap:break-word}.content-render .content-render-svg-scroll{width:100%;overflow-x:auto;overflow-y:hidden;min-width:0;margin:0 0 12px;display:block;line-height:0;-webkit-overflow-scrolling:touch}.content-render .content-render-svg{display:block;min-width:0;margin:0 auto;vertical-align:top}.content-render .content-render-svg.content-render-svg--fixed{width:max-content;max-width:none}.content-render .content-render-svg.content-render-svg--responsive{width:100%;max-width:100%}.content-render .custom-variable-container{margin-top:16px;border-radius:8px;background:#f7f7f7;padding:8px 12px;width:100%}.content-render .input-container{display:flex;align-items:end;max-width:500px;width:100%;border-radius:var(--border-radius-rounded-md, 8px);border:var(--border-width-border, 1px) solid var(--base-input, #e5e5e5);background:var(--custom-background-dark-input-30, #fff);box-shadow:var(--shadow-xs-offset-x, 0) var(--shadow-xs-offset-y, 1px) var(--shadow-xs-blur-radius, 2px) var(--shadow-xs-spread-radius, 0) var(--shadow-xs-color, rgba(0, 0, 0, .05))}.content-render .input-container input{width:100%;overflow:hidden;color:#0a0a0a;text-overflow:ellipsis;white-space:nowrap;font-family:inherit;font-size:var(--content-render-font-size);font-style:normal;font-weight:var(--font-weight-normal, 400);line-height:var(--text-sm-line-height, 20px)}.markdown-body input::selection{background-color:#d6e4ff}.content-render .single-select-container button{color:var(--base-foreground, #0a0a0a);font-family:inherit;font-size:calc(var(--content-render-font-size) * .875);font-style:normal;font-weight:400;line-height:var(--text-xs-line-height, 16px)}.content-render .single-select-container .select{border-color:var(--primary, #2563eb);font-weight:600;background-color:var(--primary, #2563eb);color:var(--primary-foreground, white)}.content-render .multi-select-container{gap:12px;padding:4px 0}.content-render .multi-select-confirm-wrapper{min-width:fit-content}.content-render .multi-select-confirm-button{border-radius:var(--border-radius-rounded-md, 8px);border:var(--border-width-border, 1px) solid var(--tailwind-colors-base-transparent, rgba(255, 255, 255, 0));background-color:var(--primary, #2563eb);box-shadow:var(--shadow-sm-1-offset-x, 0) var(--shadow-sm-1-offset-y, 1px) var(--shadow-sm-1-blur-radius, 3px) var(--shadow-sm-1-spread-radius, 0) var(--shadow-sm-1-color, rgba(0, 0, 0, .1)),var(--shadow-sm-2-offset-x, 0) var(--shadow-sm-2-offset-y, 1px) var(--shadow-sm-2-blur-radius, 2px) var(--shadow-sm-2-spread-radius, -1px) var(--shadow-sm-2-color, rgba(0, 0, 0, .1));color:var(--base-primary-foreground, #fafafa);font-family:inherit;font-size:calc(var(--content-render-font-size) * .875);font-style:normal;font-weight:var(--font-weight-semibold, 600);line-height:var(--text-xs-line-height, 16px);padding:8px 15px;cursor:pointer}.content-render .multi-select-confirm-button:disabled{cursor:not-allowed;background-color:#2563eb80;background-color:color-mix(in srgb,var(--primary, #2563eb) 50%,transparent)}.content-render .multi-select-container label{color:var(--base-foreground, #0a0a0a);font-family:inherit;font-size:var( --text-sm-font-size, calc(var(--content-render-font-size) * .875) );font-style:normal;font-weight:var(--font-weight-medium, 500);line-height:100%}.custom-variable-container .rc-textarea{width:100%}.custom-variable-container textarea{color:#0a0a0a;text-overflow:ellipsis;white-space:nowrap;font-family:inherit;font-size:var(--content-render-font-size);font-style:normal;font-weight:var(--font-weight-normal, 400);line-height:var(--text-sm-line-height, 20px)}.content-render-iframe-sandbox{justify-content:safe center}.slide--mobile-device .content-render{max-width:100%}.slide--mobile-device .content-render .multi-select-container{flex-direction:column;align-items:stretch}.slide--mobile-device .content-render .multi-select-input-row{flex-direction:column;align-items:stretch;gap:12px}.slide--mobile-device .content-render .multi-select-input-row .multi-select-confirm-wrapper,.slide--mobile-device .content-render .multi-select-confirm-wrapper--stacked,.slide--mobile-device .content-render .multi-select-confirm-wrapper{width:100%;padding-left:0}.slide--mobile-device .content-render .multi-select-confirm-button{width:100%;border-radius:48px;border:var(--border-width-border, 1px) solid var(--base-border, #e5e5e5);background-color:var(--primary, #2563eb);color:var(--base-primary-foreground, #fafafa);font-family:inherit;font-size:calc(var(--content-render-font-size) * .875);font-style:normal;font-weight:var(--font-weight-semibold, 600);line-height:var(--text-xs-line-height, 16px);padding:10px 0}.slide--mobile-device .content-render .multi-select-confirm-button:disabled{background-color:color-mix(in srgb,var(--primary, #2563eb) 50%,transparent)}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre,.markdown-body details{margin-bottom:12px!important}.markdown-body{--base-size-4: .25rem;--base-size-8: .5rem;--base-size-16: 1rem;--base-size-24: 1.5rem;--base-size-40: 2.5rem;--base-text-weight-normal: 400;--base-text-weight-medium: 500;--base-text-weight-semibold: 600;--fontStack-monospace: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;--fgColor-accent: Highlight}@media (prefers-color-scheme: dark){.markdown-body,[data-theme=dark]{color-scheme:dark;--focus-outlineColor: #1f6feb;--fgColor-default: #f0f6fc;--fgColor-muted: #9198a1;--fgColor-accent: #4493f8;--fgColor-success: #3fb950;--fgColor-attention: #d29922;--fgColor-danger: #f85149;--fgColor-done: #ab7df8;--bgColor-default: #0d1117;--bgColor-muted: #151b23;--bgColor-neutral-muted: #656c7633;--bgColor-attention-muted: #bb800926;--borderColor-default: #3d444d;--borderColor-muted: #3d444db3;--borderColor-neutral-muted: #3d444db3;--borderColor-accent-emphasis: #1f6feb;--borderColor-success-emphasis: #238636;--borderColor-attention-emphasis: #9e6a03;--borderColor-danger-emphasis: #da3633;--borderColor-done-emphasis: #8957e5;--color-prettylights-syntax-comment: #9198a1;--color-prettylights-syntax-constant: #79c0ff;--color-prettylights-syntax-constant-other-reference-link: #a5d6ff;--color-prettylights-syntax-entity: #d2a8ff;--color-prettylights-syntax-storage-modifier-import: #f0f6fc;--color-prettylights-syntax-entity-tag: #7ee787;--color-prettylights-syntax-keyword: #ff7b72;--color-prettylights-syntax-string: #a5d6ff;--color-prettylights-syntax-variable: #ffa657;--color-prettylights-syntax-brackethighlighter-unmatched: #f85149;--color-prettylights-syntax-brackethighlighter-angle: #9198a1;--color-prettylights-syntax-invalid-illegal-text: #f0f6fc;--color-prettylights-syntax-invalid-illegal-bg: #8e1519;--color-prettylights-syntax-carriage-return-text: #f0f6fc;--color-prettylights-syntax-carriage-return-bg: #b62324;--color-prettylights-syntax-string-regexp: #7ee787;--color-prettylights-syntax-markup-list: #f2cc60;--color-prettylights-syntax-markup-heading: #1f6feb;--color-prettylights-syntax-markup-italic: #f0f6fc;--color-prettylights-syntax-markup-bold: #f0f6fc;--color-prettylights-syntax-markup-deleted-text: #ffdcd7;--color-prettylights-syntax-markup-deleted-bg: #67060c;--color-prettylights-syntax-markup-inserted-text: #aff5b4;--color-prettylights-syntax-markup-inserted-bg: #033a16;--color-prettylights-syntax-markup-changed-text: #ffdfb6;--color-prettylights-syntax-markup-changed-bg: #5a1e02;--color-prettylights-syntax-markup-ignored-text: #f0f6fc;--color-prettylights-syntax-markup-ignored-bg: #1158c7;--color-prettylights-syntax-meta-diff-range: #d2a8ff;--color-prettylights-syntax-sublimelinter-gutter-mark: #3d444d}}@media (prefers-color-scheme: light){.markdown-body,[data-theme=light]{color-scheme:light;--focus-outlineColor: #0969da;--fgColor-default: #1f2328;--fgColor-muted: #59636e;--fgColor-accent: #0969da;--fgColor-success: #1a7f37;--fgColor-attention: #9a6700;--fgColor-danger: #d1242f;--fgColor-done: #8250df;--bgColor-default: #ffffff;--bgColor-muted: #f6f8fa;--bgColor-neutral-muted: #818b981f;--bgColor-attention-muted: #fff8c5;--borderColor-default: #d1d9e0;--borderColor-muted: #d1d9e0b3;--borderColor-neutral-muted: #d1d9e0b3;--borderColor-accent-emphasis: #0969da;--borderColor-success-emphasis: #1a7f37;--borderColor-attention-emphasis: #9a6700;--borderColor-danger-emphasis: #cf222e;--borderColor-done-emphasis: #8250df;--color-prettylights-syntax-comment: #59636e;--color-prettylights-syntax-constant: #0550ae;--color-prettylights-syntax-constant-other-reference-link: #0a3069;--color-prettylights-syntax-entity: #6639ba;--color-prettylights-syntax-storage-modifier-import: #1f2328;--color-prettylights-syntax-entity-tag: #0550ae;--color-prettylights-syntax-keyword: #cf222e;--color-prettylights-syntax-string: #0a3069;--color-prettylights-syntax-variable: #953800;--color-prettylights-syntax-brackethighlighter-unmatched: #82071e;--color-prettylights-syntax-brackethighlighter-angle: #59636e;--color-prettylights-syntax-invalid-illegal-text: #f6f8fa;--color-prettylights-syntax-invalid-illegal-bg: #82071e;--color-prettylights-syntax-carriage-return-text: #f6f8fa;--color-prettylights-syntax-carriage-return-bg: #cf222e;--color-prettylights-syntax-string-regexp: #116329;--color-prettylights-syntax-markup-list: #3b2300;--color-prettylights-syntax-markup-heading: #0550ae;--color-prettylights-syntax-markup-italic: #1f2328;--color-prettylights-syntax-markup-bold: #1f2328;--color-prettylights-syntax-markup-deleted-text: #82071e;--color-prettylights-syntax-markup-deleted-bg: #ffebe9;--color-prettylights-syntax-markup-inserted-text: #116329;--color-prettylights-syntax-markup-inserted-bg: #dafbe1;--color-prettylights-syntax-markup-changed-text: #953800;--color-prettylights-syntax-markup-changed-bg: #ffd8b5;--color-prettylights-syntax-markup-ignored-text: #d1d9e0;--color-prettylights-syntax-markup-ignored-bg: #0550ae;--color-prettylights-syntax-meta-diff-range: #8250df;--color-prettylights-syntax-sublimelinter-gutter-mark: #818b98}}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0;color:var(--fgColor-default);background-color:var(--bgColor-default);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}.markdown-body h1:hover .anchor .octicon-link:before,.markdown-body h2:hover .anchor .octicon-link:before,.markdown-body h3:hover .anchor .octicon-link:before,.markdown-body h4:hover .anchor .octicon-link:before,.markdown-body h5:hover .anchor .octicon-link:before,.markdown-body h6:hover .anchor .octicon-link:before{width:16px;height:16px;content:" ";display:inline-block;background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>");mask-image:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>")}.markdown-body details,.markdown-body figcaption,.markdown-body figure{display:block}.markdown-body summary{display:list-item}.markdown-body [hidden]{display:none!important}.markdown-body a{background-color:transparent;color:var(--fgColor-accent);text-decoration:none}.markdown-body abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-body b,.markdown-body strong{font-weight:var(--base-text-weight-semibold, 600)}.markdown-body dfn{font-style:italic}.markdown-body h1{margin:.67em 0;font-weight:var(--base-text-weight-semibold, 600);padding-bottom:.3em;font-size:2em;border-bottom:1px solid var(--borderColor-muted)}.markdown-body mark{background-color:var(--bgColor-attention-muted);color:var(--fgColor-default)}.markdown-body small{font-size:90%}.markdown-body sub,.markdown-body sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.markdown-body sub{bottom:-.25em}.markdown-body sup{top:-.5em}.markdown-body img{border-style:none;max-width:100%;box-sizing:content-box}.markdown-body code,.markdown-body kbd,.markdown-body pre,.markdown-body samp{font-family:monospace;font-size:1em}.markdown-body figure{margin:1em var(--base-size-40)}.markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--borderColor-muted);height:.25em;padding:0;margin:var(--base-size-24) 0;background-color:var(--borderColor-default);border:0}.markdown-body input{font:inherit;margin:0;overflow:visible;font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body [type=button],.markdown-body [type=reset],.markdown-body [type=submit]{-webkit-appearance:button;appearance:button}.markdown-body [type=checkbox],.markdown-body [type=radio]{box-sizing:border-box;padding:0}.markdown-body [type=number]::-webkit-inner-spin-button,.markdown-body [type=number]::-webkit-outer-spin-button{height:auto}.markdown-body [type=search]::-webkit-search-cancel-button,.markdown-body [type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none}.markdown-body ::-webkit-input-placeholder{color:inherit;opacity:.54}.markdown-body ::-webkit-file-upload-button{-webkit-appearance:button;appearance:button;font:inherit}.markdown-body a:hover{text-decoration:underline}.markdown-body ::placeholder{color:var(--fgColor-muted);opacity:1}.markdown-body hr:before{display:table;content:""}.markdown-body hr:after{display:table;clear:both;content:""}.markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;font-variant:tabular-nums}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body a:focus,.markdown-body [role=button]:focus,.markdown-body input[type=radio]:focus,.markdown-body input[type=checkbox]:focus{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}.markdown-body a:focus:not(:focus-visible),.markdown-body [role=button]:focus:not(:focus-visible),.markdown-body input[type=radio]:focus:not(:focus-visible),.markdown-body input[type=checkbox]:focus:not(:focus-visible){outline:solid 1px transparent}.markdown-body a:focus-visible,.markdown-body [role=button]:focus-visible,.markdown-body input[type=radio]:focus-visible,.markdown-body input[type=checkbox]:focus-visible{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}.markdown-body a:not([class]):focus,.markdown-body a:not([class]):focus-visible,.markdown-body input[type=radio]:focus,.markdown-body input[type=radio]:focus-visible,.markdown-body input[type=checkbox]:focus,.markdown-body input[type=checkbox]:focus-visible{outline-offset:0}.markdown-body kbd{display:inline-block;padding:var(--base-size-4);font:11px var( --fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace );line-height:10px;color:var(--fgColor-default);vertical-align:middle;background-color:var(--bgColor-muted);border:solid 1px var(--borderColor-neutral-muted);border-bottom-color:var(--borderColor-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--borderColor-neutral-muted)}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-bottom:var(--base-size-16);font-weight:var(--base-text-weight-semibold, 600);line-height:1.25}.markdown-body h2{font-weight:var(--base-text-weight-semibold, 600);padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid var(--borderColor-muted)}.markdown-body h3{font-weight:var(--base-text-weight-semibold, 600);font-size:1.25em}.markdown-body h4{font-weight:var(--base-text-weight-semibold, 600);font-size:1em}.markdown-body h5{font-weight:var(--base-text-weight-semibold, 600);font-size:.875em}.markdown-body h6{font-weight:var(--base-text-weight-semibold, 600);font-size:.85em;color:var(--fgColor-muted)}.markdown-body p{margin-top:0;margin-bottom:10px}.markdown-body blockquote{margin:0;padding:0 1em;color:var(--fgColor-muted);border-inline-start:.25em solid var(--borderColor-default)}.markdown-body ul,.markdown-body ol{margin-top:0;margin-bottom:0;padding-inline-start:2em}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ul ul ol,.markdown-body ul ol ol,.markdown-body ol ul ol,.markdown-body ol ol ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body tt,.markdown-body code,.markdown-body samp{font-family:var( --fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace );font-size:12px}.markdown-body pre{margin-top:0;margin-bottom:0;font-family:var( --fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace );font-size:12px;word-wrap:normal}.markdown-body .octicon{display:inline-block;overflow:visible!important;vertical-align:text-bottom;fill:currentColor}.markdown-body input::-webkit-outer-spin-button,.markdown-body input::-webkit-inner-spin-button{margin:0;appearance:none}.markdown-body .mr-2{margin-right:var(--base-size-8, 8px)!important}.markdown-body:before{display:table;content:""}.markdown-body:after{display:table;clear:both;content:""}.markdown-body>*:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:var(--fgColor-danger)}.markdown-body .anchor{float:inline-start;padding-inline-end:var(--base-size-4);margin-inline-start:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre,.markdown-body details{margin-top:0;margin-bottom:var(--base-size-16)}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:var(--fgColor-default);vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 tt,.markdown-body h1 code,.markdown-body h2 tt,.markdown-body h2 code,.markdown-body h3 tt,.markdown-body h3 code,.markdown-body h4 tt,.markdown-body h4 code,.markdown-body h5 tt,.markdown-body h5 code,.markdown-body h6 tt,.markdown-body h6 code{padding:0 .2em;font-size:inherit}.markdown-body summary h1,.markdown-body summary h2,.markdown-body summary h3,.markdown-body summary h4,.markdown-body summary h5,.markdown-body summary h6{display:inline-block}.markdown-body summary h1 .anchor,.markdown-body summary h2 .anchor,.markdown-body summary h3 .anchor,.markdown-body summary h4 .anchor,.markdown-body summary h5 .anchor,.markdown-body summary h6 .anchor{margin-inline-start:-40px}.markdown-body summary h1,.markdown-body summary h2{padding-bottom:0;border-bottom:0}.markdown-body ul.no-list,.markdown-body ol.no-list{padding:0;list-style-type:none}.markdown-body ol[type="a s"]{list-style-type:lower-alpha}.markdown-body ol[type="A s"]{list-style-type:upper-alpha}.markdown-body ol[type="i s"]{list-style-type:lower-roman}.markdown-body ol[type="I s"]{list-style-type:upper-roman}.markdown-body ol[type="1"]{list-style-type:decimal}.markdown-body div>ol:not([type]){list-style-type:decimal}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:var(--base-size-16)}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:var(--base-size-16);font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold, 600)}.markdown-body dl dd{padding:0 var(--base-size-16);margin-bottom:var(--base-size-16)}.markdown-body table th{font-weight:var(--base-text-weight-semibold, 600)}.markdown-body table th,.markdown-body table td{padding:6px 13px;border:1px solid var(--borderColor-default)}.markdown-body table td>:last-child{margin-bottom:0}.markdown-body table tr{background-color:var(--bgColor-default);border-top:1px solid var(--borderColor-muted)}.markdown-body table tr:nth-child(2n){background-color:var(--bgColor-muted)}.markdown-body table img{background-color:transparent}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid var(--borderColor-default)}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:var(--fgColor-default)}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;background-color:var(--bgColor-neutral-muted);border-radius:6px}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body samp{font-size:85%}.markdown-body pre code{font-size:100%}.markdown-body pre>code{padding:0;margin:0;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:var(--base-size-16)}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:var(--base-size-16);overflow:auto;font-size:85%;line-height:1.45;color:var(--fgColor-default);background-color:var(--bgColor-muted);border-radius:6px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{padding:10px var(--base-size-8) 9px;text-align:right;background:var(--bgColor-default);border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:var(--base-text-weight-semibold, 600);background:var(--bgColor-muted);border-top:0}.markdown-body [data-footnote-ref]:before{content:"["}.markdown-body [data-footnote-ref]:after{content:"]"}.markdown-body .footnotes{font-size:12px;color:var(--fgColor-muted);border-top:1px solid var(--borderColor-default)}.markdown-body .footnotes ol{padding-inline-start:var(--base-size-16)}.markdown-body .footnotes ol ul{display:inline-block;padding-inline-start:var(--base-size-16);margin-top:var(--base-size-16)}.markdown-body .footnotes li{position:relative}.markdown-body .footnotes li:target:before{position:absolute;top:calc(var(--base-size-8) * -1);inset-inline-end:calc(var(--base-size-8) * -1);bottom:calc(var(--base-size-8) * -1);inset-inline-start:calc(var(--base-size-24) * -1);pointer-events:none;content:"";border:2px solid var(--borderColor-accent-emphasis);border-radius:6px}.markdown-body .footnotes li:target{color:var(--fgColor-default)}.markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.markdown-body body:has(:modal){padding-right:var(--dialog-scrollgutter)!important}.markdown-body .pl-c{color:var(--color-prettylights-syntax-comment)}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:var(--color-prettylights-syntax-constant)}.markdown-body .pl-e,.markdown-body .pl-en{color:var(--color-prettylights-syntax-entity)}.markdown-body .pl-smi,.markdown-body .pl-s .pl-s1{color:var(--color-prettylights-syntax-storage-modifier-import)}.markdown-body .pl-ent{color:var(--color-prettylights-syntax-entity-tag)}.markdown-body .pl-k{color:var(--color-prettylights-syntax-keyword)}.markdown-body .pl-s,.markdown-body .pl-pds,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sre,.markdown-body .pl-sr .pl-sra{color:var(--color-prettylights-syntax-string)}.markdown-body .pl-v,.markdown-body .pl-smw{color:var(--color-prettylights-syntax-variable)}.markdown-body .pl-bu{color:var(--color-prettylights-syntax-brackethighlighter-unmatched)}.markdown-body .pl-ii{color:var(--color-prettylights-syntax-invalid-illegal-text);background-color:var(--color-prettylights-syntax-invalid-illegal-bg)}.markdown-body .pl-c2{color:var(--color-prettylights-syntax-carriage-return-text);background-color:var(--color-prettylights-syntax-carriage-return-bg)}.markdown-body .pl-sr .pl-cce{font-weight:700;color:var(--color-prettylights-syntax-string-regexp)}.markdown-body .pl-ml{color:var(--color-prettylights-syntax-markup-list)}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{font-weight:700;color:var(--color-prettylights-syntax-markup-heading)}.markdown-body .pl-mi{font-style:italic;color:var(--color-prettylights-syntax-markup-italic)}.markdown-body .pl-mb{font-weight:700;color:var(--color-prettylights-syntax-markup-bold)}.markdown-body .pl-md{color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}.markdown-body .pl-mi1{color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}.markdown-body .pl-mc{color:var(--color-prettylights-syntax-markup-changed-text);background-color:var(--color-prettylights-syntax-markup-changed-bg)}.markdown-body .pl-mi2{color:var(--color-prettylights-syntax-markup-ignored-text);background-color:var(--color-prettylights-syntax-markup-ignored-bg)}.markdown-body .pl-mdr{font-weight:700;color:var(--color-prettylights-syntax-meta-diff-range)}.markdown-body .pl-ba{color:var(--color-prettylights-syntax-brackethighlighter-angle)}.markdown-body .pl-sg{color:var(--color-prettylights-syntax-sublimelinter-gutter-mark)}.markdown-body .pl-corl{text-decoration:underline;color:var(--color-prettylights-syntax-constant-other-reference-link)}.markdown-body [role=button]:focus:not(:focus-visible),.markdown-body [role=tabpanel][tabindex="0"]:focus:not(:focus-visible),.markdown-body button:focus:not(:focus-visible),.markdown-body summary:focus:not(:focus-visible),.markdown-body a:focus:not(:focus-visible){outline:none;box-shadow:none}.markdown-body [tabindex="0"]:focus:not(:focus-visible),.markdown-body details-dialog:focus:not(:focus-visible){outline:none}.markdown-body g-emoji{display:inline-block;min-width:1ch;font-family:"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:var(--base-text-weight-normal, 400);line-height:1;vertical-align:-.075em}.markdown-body g-emoji img{width:1em;height:1em}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item label{font-weight:var(--base-text-weight-normal, 400)}.markdown-body .task-list-item.enabled label{cursor:pointer}.markdown-body .task-list-item+.task-list-item{margin-top:var(--base-size-4)}.markdown-body .task-list-item .handle{display:none}.markdown-body .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}.markdown-body ul:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body ol:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body .contains-task-list:hover .task-list-item-convert-container,.markdown-body .contains-task-list:focus-within .task-list-item-convert-container{display:block;width:auto;height:24px;overflow:visible;clip:auto}.markdown-body ::-webkit-calendar-picker-indicator{filter:invert(50%)}.markdown-body .markdown-alert{padding:var(--base-size-8) var(--base-size-16);margin-bottom:var(--base-size-16);color:inherit;border-inline-start:.25em solid var(--borderColor-default)}.markdown-body .markdown-alert>:first-child{margin-top:0}.markdown-body .markdown-alert>:last-child{margin-bottom:0}.markdown-body .markdown-alert .markdown-alert-title{display:flex;font-weight:var(--base-text-weight-medium, 500);align-items:center;line-height:1}.markdown-body .markdown-alert.markdown-alert-note{border-inline-start-color:var(--borderColor-accent-emphasis)}.markdown-body .markdown-alert.markdown-alert-note .markdown-alert-title{color:var(--fgColor-accent)}.markdown-body .markdown-alert.markdown-alert-important{border-inline-start-color:var(--borderColor-done-emphasis)}.markdown-body .markdown-alert.markdown-alert-important .markdown-alert-title{color:var(--fgColor-done)}.markdown-body .markdown-alert.markdown-alert-warning{border-inline-start-color:var(--borderColor-attention-emphasis)}.markdown-body .markdown-alert.markdown-alert-warning .markdown-alert-title{color:var(--fgColor-attention)}.markdown-body .markdown-alert.markdown-alert-tip{border-inline-start-color:var(--borderColor-success-emphasis)}.markdown-body .markdown-alert.markdown-alert-tip .markdown-alert-title{color:var(--fgColor-success)}.markdown-body .markdown-alert.markdown-alert-caution{border-inline-start-color:var(--borderColor-danger-emphasis)}.markdown-body .markdown-alert.markdown-alert-caution .markdown-alert-title{color:var(--fgColor-danger)}.markdown-body>*:first-child>.heading-element:first-child{margin-top:0!important}.markdown-body .highlight pre:has(+.zeroclipboard-container){min-height:52px}@media (prefers-color-scheme: dark){.markdown-body,[data-theme=dark]{color-scheme:light!important;--focus-outlineColor: #0969da !important;--fgColor-default: #1f2328 !important;--fgColor-muted: #59636e !important;--fgColor-accent: #0969da !important;--fgColor-success: #1a7f37 !important;--fgColor-attention: #9a6700 !important;--fgColor-danger: #d1242f !important;--fgColor-done: #8250df !important;--bgColor-default: #ffffff !important;--bgColor-muted: #f6f8fa !important;--bgColor-neutral-muted: #818b981f !important;--bgColor-attention-muted: #fff8c5 !important;--borderColor-default: #d1d9e0 !important;--borderColor-muted: #d1d9e0b3 !important;--borderColor-neutral-muted: #d1d9e0b3 !important;--borderColor-accent-emphasis: #0969da !important;--borderColor-success-emphasis: #1a7f37 !important;--borderColor-attention-emphasis: #9a6700 !important;--borderColor-danger-emphasis: #cf222e !important;--borderColor-done-emphasis: #8250df !important;--color-prettylights-syntax-comment: #59636e !important;--color-prettylights-syntax-constant: #0550ae !important;--color-prettylights-syntax-constant-other-reference-link: #0a3069 !important;--color-prettylights-syntax-entity: #6639ba !important;--color-prettylights-syntax-storage-modifier-import: #1f2328 !important;--color-prettylights-syntax-entity-tag: #0550ae !important;--color-prettylights-syntax-keyword: #cf222e !important;--color-prettylights-syntax-string: #0a3069 !important;--color-prettylights-syntax-variable: #953800 !important;--color-prettylights-syntax-brackethighlighter-unmatched: #82071e !important;--color-prettylights-syntax-brackethighlighter-angle: #59636e !important;--color-prettylights-syntax-invalid-illegal-text: #f6f8fa !important;--color-prettylights-syntax-invalid-illegal-bg: #82071e !important;--color-prettylights-syntax-carriage-return-text: #f6f8fa !important;--color-prettylights-syntax-carriage-return-bg: #cf222e !important;--color-prettylights-syntax-string-regexp: #116329 !important;--color-prettylights-syntax-markup-list: #3b2300 !important;--color-prettylights-syntax-markup-heading: #0550ae !important;--color-prettylights-syntax-markup-italic: #1f2328 !important;--color-prettylights-syntax-markup-bold: #1f2328 !important;--color-prettylights-syntax-markup-deleted-text: #82071e !important;--color-prettylights-syntax-markup-deleted-bg: #ffebe9 !important;--color-prettylights-syntax-markup-inserted-text: #116329 !important;--color-prettylights-syntax-markup-inserted-bg: #dafbe1 !important;--color-prettylights-syntax-markup-changed-text: #953800 !important;--color-prettylights-syntax-markup-changed-bg: #ffd8b5 !important;--color-prettylights-syntax-markup-ignored-text: #d1d9e0 !important;--color-prettylights-syntax-markup-ignored-bg: #0550ae !important;--color-prettylights-syntax-meta-diff-range: #8250df !important;--color-prettylights-syntax-sublimelinter-gutter-mark: #818b98 !important}}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
1
+ .tag-image,.tag-video{display:inline-flex;align-items:center;gap:4px;cursor:pointer;font-family:inherit;font-size:14px;font-style:normal;font-weight:400;line-height:20px}.tag-placeholder-content{display:inline-flex;align-items:center;gap:2px;color:#0e46fb}.tag-fixed-output-marker{color:purple}:is(.tag-image,.tag-video):hover{background:#d9d9d9;border-radius:2px}.tag-placeholder-icon{display:inline-flex;align-items:center;justify-content:center;color:inherit}.tag-placeholder-icon svg{width:14px;height:14px}.tag-fixed-text,.tag-fixed-text-placeholder{display:inline-block;background-color:#d7d7d7;border-radius:6px;padding:0 6px;margin:0 0 0 4px;line-height:1.6;cursor:text;position:relative}.tag-fixed-text{color:inherit}.tag-fixed-text-placeholder{color:var(--base-muted-foreground, #737373);font-size:12px}.tag-fixed-text-placeholder .tag-fixed-text-inner{color:inherit}.tag-fixed-text-tag{display:inline-block;width:0;overflow:hidden;opacity:0;pointer-events:none}.tag-fixed-text:hover:after,.tag-fixed-text-placeholder:hover:after{content:attr(data-tooltip);position:absolute;left:50%;bottom:calc(100% + 6px);transform:translate(-50%);background-color:#000000bf;color:#fff;font-size:12px;padding:4px 8px;border-radius:4px;white-space:nowrap;pointer-events:none;z-index:10}.tag-fixed-text:hover:before,.tag-fixed-text-placeholder:hover:before{content:"";position:absolute;left:50%;bottom:100%;transform:translate(-50%);border-width:4px;border-style:solid;border-color:rgba(0,0,0,.75) transparent transparent transparent;pointer-events:none;z-index:10}.tag-divider{display:flex;align-items:center;gap:9px;width:100%;padding:6px 0;cursor:pointer;-webkit-user-select:none;user-select:none}.tag-divider img{width:24px;height:24px;flex-shrink:0}.tag-divider-line{flex:1;border-bottom:1px dashed rgba(0,0,0,.25)}.tag-icon{margin-left:10px}.syntax-string{color:#d4631c!important}.syntax-keyword,.syntax-bracket,.syntax-bracket *{color:purple!important}.syntax-variable{color:#0e46fb!important}.syntax-variable-invalid{color:#d4631c!important}.syntax-percent-valid{color:#0e46fb!important}.syntax-percent-invalid{color:#d4631c!important}.syntax-comment,.syntax-comment *{color:green!important}.syntax-fixed,.syntax-fixed *{color:purple!important}.syntax-button-text{color:#d4631c!important}.cm-tooltip.cm-tooltip-autocomplete{border:1px solid #e5e5e5;background-color:#fff;border-radius:4px;box-shadow:0 2px 6px #0000001a;box-sizing:border-box;width:150px;padding:5px}.cm-tooltip-autocomplete ul li{width:138px}.cm-tooltip-autocomplete ul li:hover{background-color:#f9fafb;cursor:pointer;width:140px}.cm-activeLine .cm-line{background-color:transparent}.cm-editor{padding:0}.cm-editor:focus{outline:none}.cm-editor .cm-content:focus-visible{outline:none;box-shadow:none}.cm-editor .cm-scroller{padding:24px;box-sizing:border-box}.cm-editor .cm-content{caret-color:var(--base-foreground, #0a0a0a)}.markdown-flow-editor-toolbar{position:sticky;top:0;z-index:1;left:0;right:0;display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--base-border, #e5e5e5);border-radius:var(--border-radius-rounded-lg, 10px) var(--border-radius-rounded-lg, 10px) 0 0;padding:6px 12px;background:var(--base-muted, #f5f5f5)}.markdown-flow-editor-toolbar-left{display:flex;align-items:center;gap:0;flex-wrap:wrap}.markdown-flow-editor-toolbar-right-wrapper{margin-inline-start:auto;display:flex;align-items:center}.markdown-flow-editor-toolbar-right{display:inline-flex;align-items:center;gap:8px}.markdown-flow-editor-toolbar-right-item{display:inline-flex}.markdown-flow-editor-toolbar button{display:inline-flex;align-items:center;justify-content:center;border-radius:4px;border:none;background:transparent;color:#0a0a0a;cursor:pointer;padding:6px;transition:background .2s ease,color .2s ease}.markdown-flow-editor-toolbar button:last-child{margin-right:0}.markdown-flow-editor-toolbar button:not(:disabled):hover{background:#0000000d}.markdown-flow-editor-toolbar button[data-active=true]{background:#00000014}.markdown-flow-editor-toolbar button:disabled{color:#0a0a0a66;cursor:not-allowed}.markdown-flow-editor-toolbar-right-button{border:1px solid var(--base-border, #e5e5e5);background:#fff;padding:6px 10px;border-radius:6px;font-size:13px;gap:6px;display:inline-flex;align-items:center;justify-content:center}.markdown-flow-editor-toolbar-right-button:not(:disabled):hover{background:#0000000a}.toolbar-right-icon{display:inline-flex;align-items:center}.markdown-flow-editor[data-disabled=true]{opacity:.8;background:var(--base-muted, #f5f5f5);cursor:not-allowed}.markdown-flow-editor[data-disabled=true] .cm-editor{background-color:transparent}.markdown-flow-editor[data-disabled=true] .cm-content{cursor:not-allowed}.markdown-flow-editor{color:#0a0a0a;font-family:PingFang SC,Microsoft YaHei,Source Han Sans SC,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;position:relative;font-size:var(--text-md-font-size, 16px);font-style:normal;font-weight:400;border-radius:var(--border-radius-rounded-lg, 10px);border:var(--border-width-border, 1px) solid var(--base-border, #e5e5e5);background:var(--base-card, #fff);box-shadow:var(--shadow-xs-offset-x, 0) var(--shadow-xs-offset-y, 1px) var(--shadow-xs-blur-radius, 2px) var(--shadow-xs-spread-radius, 0) var(--shadow-xs-color, rgba(0, 0, 0, .05));height:100%;width:100%;overflow:auto}.ͼ1 .cm-line,.ͼ1 .cm-content{padding:0}.cm-line{font-family:PingFang SC,Microsoft YaHei,Source Han Sans SC,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;line-height:30px}.cm-editor.cm-focused{outline:none}.cm-activeLine{background-color:transparent!important}.c6,.ͼ1b,.c1c,.ͼ6,.ͼ7,.ͼ1c,.c7{text-decoration:auto}.markdown-flow-editor[data-disabled=true]{background-color:#fff}.content-render{--content-render-font-family: "Charter", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", sans-serif;--content-render-font-size: var(--mdf-slide-font-size, 16px);--content-render-line-height: var(--mdf-slide-line-height, 30px);font-family:var(--content-render-font-family);min-width:0;line-height:var(--content-render-line-height);word-break:break-word;overflow-wrap:break-word;-webkit-hyphens:auto;hyphens:auto}.content-render.markdown-body{background-color:transparent;color:#000c;text-align:justify;font-family:var(--content-render-font-family);font-size:var(--content-render-font-size);font-style:normal;font-weight:var(--font-weight-normal, 400);line-height:var(--content-render-line-height);width:100%}.content-render code{unicode-bidi:isolate}.content-render .content-render-custom-bar{display:flex;align-items:center;justify-content:flex-start;width:100%;text-align:left;align-self:flex-start}.content-render.markdown-body img,.content-render.markdown-body svg{display:block;margin-left:auto;margin-right:auto}.content-render.markdown-body img{max-width:100%;height:auto}.content-render.markdown-body svg{max-width:100%;height:auto}.content-render-ol,.content-render-ul{margin:0 0 1rem;padding-inline-start:2rem}.content-render-ol{list-style-type:decimal}.content-render-ul{list-style-type:disc}.content-render-table-container{overflow-x:auto;margin:1rem 0}.content-render.markdown-body .content-render-table{display:table;width:100%;border-collapse:collapse;border:1px solid #d1d5db}.content-render-th,.content-render-td{border:1px solid #d1d5db;text-align:start}.content-render-th{background-color:#f3f4f6;font-weight:600}.content-render-tr:hover{background-color:#f9fafb;transition:background-color .2s ease}.content-render-task-list-item{display:flex;align-items:center;margin-bottom:.25rem}.content-render .content-render-checkbox{margin-inline-end:.5rem;height:1rem;width:1rem;border-radius:.25rem;border:1px solid #d1d5db;color:#2563eb;background-color:#fff}.content-render .katex-display,.content-render .katex{direction:ltr;unicode-bidi:isolate}.content-render .katex-display{margin:1.5rem 0;text-align:center}.content-render .katex{font-size:1.1em}.content-render .katex-display .katex{font-size:1.2em}.content-render-mermaid-measurement svg{height:auto}.content-render .mermaid-chart-container{margin:1.5rem 0;padding:1rem;background-color:#fafafa;border:1px solid #e1e5e9;border-radius:8px;overflow:auto}.content-render .mermaid-chart-container svg{max-width:100%;height:auto}.content-render .content-render-mermaid{display:flex;justify-content:center;align-items:center}.content-render .content-render-custom-button-after-content-inner{display:inline-flex;align-items:center;gap:6px}.content-render .content-render-mermaid-inner{display:flex;justify-content:center;width:100%}.content-render .content-render-mermaid-inner svg{margin:0 auto}.content-render .mermaid-error{margin:1rem 0;padding:1rem;border:1px solid #ff6b6b;border-radius:8px;background-color:#ffe0e0;color:#c92a2a;font-family:Consolas,Monaco,Courier New,monospace;font-size:.9em}.content-render .mermaid-error pre{margin:.5rem 0 0;font-size:.85em;white-space:pre-wrap;word-wrap:break-word}.content-render .content-render-svg-scroll{width:100%;overflow-x:auto;overflow-y:hidden;min-width:0;margin:0 0 12px;display:block;line-height:0;-webkit-overflow-scrolling:touch}.content-render .content-render-svg{display:block;min-width:0;margin:0 auto;vertical-align:top}.content-render .content-render-svg.content-render-svg--fixed{width:max-content;max-width:none}.content-render .content-render-svg.content-render-svg--responsive{width:100%;max-width:100%}.content-render .custom-variable-container{margin-top:16px;border-radius:8px;background:#f7f7f7;padding:8px 12px;width:100%}.content-render .input-container{display:flex;align-items:end;max-width:500px;width:100%;border-radius:var(--border-radius-rounded-md, 8px);border:var(--border-width-border, 1px) solid var(--base-input, #e5e5e5);background:var(--custom-background-dark-input-30, #fff);box-shadow:var(--shadow-xs-offset-x, 0) var(--shadow-xs-offset-y, 1px) var(--shadow-xs-blur-radius, 2px) var(--shadow-xs-spread-radius, 0) var(--shadow-xs-color, rgba(0, 0, 0, .05))}.content-render .input-container input{width:100%;overflow:hidden;color:#0a0a0a;text-overflow:ellipsis;white-space:nowrap;font-family:inherit;font-size:var(--content-render-font-size);font-style:normal;font-weight:var(--font-weight-normal, 400);line-height:var(--text-sm-line-height, 20px)}.markdown-body input::selection{background-color:#d6e4ff}.content-render .single-select-container button{color:var(--base-foreground, #0a0a0a);font-family:inherit;font-size:calc(var(--content-render-font-size) * .875);font-style:normal;font-weight:400;line-height:var(--text-xs-line-height, 16px)}.content-render .single-select-container .select{border-color:var(--primary, #2563eb);font-weight:600;background-color:var(--primary, #2563eb);color:var(--primary-foreground, white)}.content-render .multi-select-container{gap:12px;padding:4px 0}.content-render .multi-select-confirm-wrapper{min-width:fit-content}.content-render .multi-select-confirm-button{border-radius:var(--border-radius-rounded-md, 8px);border:var(--border-width-border, 1px) solid var(--tailwind-colors-base-transparent, rgba(255, 255, 255, 0));background-color:var(--primary, #2563eb);box-shadow:var(--shadow-sm-1-offset-x, 0) var(--shadow-sm-1-offset-y, 1px) var(--shadow-sm-1-blur-radius, 3px) var(--shadow-sm-1-spread-radius, 0) var(--shadow-sm-1-color, rgba(0, 0, 0, .1)),var(--shadow-sm-2-offset-x, 0) var(--shadow-sm-2-offset-y, 1px) var(--shadow-sm-2-blur-radius, 2px) var(--shadow-sm-2-spread-radius, -1px) var(--shadow-sm-2-color, rgba(0, 0, 0, .1));color:var(--base-primary-foreground, #fafafa);font-family:inherit;font-size:calc(var(--content-render-font-size) * .875);font-style:normal;font-weight:var(--font-weight-semibold, 600);line-height:var(--text-xs-line-height, 16px);padding:8px 15px;cursor:pointer}.content-render .multi-select-confirm-button:disabled{cursor:not-allowed;background-color:#2563eb80;background-color:color-mix(in srgb,var(--primary, #2563eb) 50%,transparent)}.content-render .multi-select-container label{color:var(--base-foreground, #0a0a0a);font-family:inherit;font-size:var( --text-sm-font-size, calc(var(--content-render-font-size) * .875) );font-style:normal;font-weight:var(--font-weight-medium, 500);line-height:100%}.custom-variable-container .rc-textarea{width:100%}.custom-variable-container textarea{color:#0a0a0a;text-overflow:ellipsis;white-space:nowrap;font-family:inherit;font-size:var(--content-render-font-size);font-style:normal;font-weight:var(--font-weight-normal, 400);line-height:var(--text-sm-line-height, 20px)}.content-render-iframe-sandbox{justify-content:safe center}.slide--mobile-device .content-render{max-width:100%}.slide--mobile-device .content-render .multi-select-container{flex-direction:column;align-items:stretch}.slide--mobile-device .content-render .multi-select-input-row{flex-direction:column;align-items:stretch;gap:12px}.slide--mobile-device .content-render .multi-select-input-row .multi-select-confirm-wrapper,.slide--mobile-device .content-render .multi-select-confirm-wrapper--stacked,.slide--mobile-device .content-render .multi-select-confirm-wrapper{width:100%;padding-left:0}.slide--mobile-device .content-render .multi-select-confirm-button{width:100%;border-radius:48px;border:var(--border-width-border, 1px) solid var(--base-border, #e5e5e5);background-color:var(--primary, #2563eb);color:var(--base-primary-foreground, #fafafa);font-family:inherit;font-size:calc(var(--content-render-font-size) * .875);font-style:normal;font-weight:var(--font-weight-semibold, 600);line-height:var(--text-xs-line-height, 16px);padding:10px 0}.slide--mobile-device .content-render .multi-select-confirm-button:disabled{background-color:color-mix(in srgb,var(--primary, #2563eb) 50%,transparent)}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre,.markdown-body details{margin-bottom:12px!important}.markdown-body{--base-size-4: .25rem;--base-size-8: .5rem;--base-size-16: 1rem;--base-size-24: 1.5rem;--base-size-40: 2.5rem;--base-text-weight-normal: 400;--base-text-weight-medium: 500;--base-text-weight-semibold: 600;--fontStack-monospace: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;--fgColor-accent: Highlight}@media (prefers-color-scheme: dark){.markdown-body,[data-theme=dark]{color-scheme:dark;--focus-outlineColor: #1f6feb;--fgColor-default: #f0f6fc;--fgColor-muted: #9198a1;--fgColor-accent: #4493f8;--fgColor-success: #3fb950;--fgColor-attention: #d29922;--fgColor-danger: #f85149;--fgColor-done: #ab7df8;--bgColor-default: #0d1117;--bgColor-muted: #151b23;--bgColor-neutral-muted: #656c7633;--bgColor-attention-muted: #bb800926;--borderColor-default: #3d444d;--borderColor-muted: #3d444db3;--borderColor-neutral-muted: #3d444db3;--borderColor-accent-emphasis: #1f6feb;--borderColor-success-emphasis: #238636;--borderColor-attention-emphasis: #9e6a03;--borderColor-danger-emphasis: #da3633;--borderColor-done-emphasis: #8957e5;--color-prettylights-syntax-comment: #9198a1;--color-prettylights-syntax-constant: #79c0ff;--color-prettylights-syntax-constant-other-reference-link: #a5d6ff;--color-prettylights-syntax-entity: #d2a8ff;--color-prettylights-syntax-storage-modifier-import: #f0f6fc;--color-prettylights-syntax-entity-tag: #7ee787;--color-prettylights-syntax-keyword: #ff7b72;--color-prettylights-syntax-string: #a5d6ff;--color-prettylights-syntax-variable: #ffa657;--color-prettylights-syntax-brackethighlighter-unmatched: #f85149;--color-prettylights-syntax-brackethighlighter-angle: #9198a1;--color-prettylights-syntax-invalid-illegal-text: #f0f6fc;--color-prettylights-syntax-invalid-illegal-bg: #8e1519;--color-prettylights-syntax-carriage-return-text: #f0f6fc;--color-prettylights-syntax-carriage-return-bg: #b62324;--color-prettylights-syntax-string-regexp: #7ee787;--color-prettylights-syntax-markup-list: #f2cc60;--color-prettylights-syntax-markup-heading: #1f6feb;--color-prettylights-syntax-markup-italic: #f0f6fc;--color-prettylights-syntax-markup-bold: #f0f6fc;--color-prettylights-syntax-markup-deleted-text: #ffdcd7;--color-prettylights-syntax-markup-deleted-bg: #67060c;--color-prettylights-syntax-markup-inserted-text: #aff5b4;--color-prettylights-syntax-markup-inserted-bg: #033a16;--color-prettylights-syntax-markup-changed-text: #ffdfb6;--color-prettylights-syntax-markup-changed-bg: #5a1e02;--color-prettylights-syntax-markup-ignored-text: #f0f6fc;--color-prettylights-syntax-markup-ignored-bg: #1158c7;--color-prettylights-syntax-meta-diff-range: #d2a8ff;--color-prettylights-syntax-sublimelinter-gutter-mark: #3d444d}}@media (prefers-color-scheme: light){.markdown-body,[data-theme=light]{color-scheme:light;--focus-outlineColor: #0969da;--fgColor-default: #1f2328;--fgColor-muted: #59636e;--fgColor-accent: #0969da;--fgColor-success: #1a7f37;--fgColor-attention: #9a6700;--fgColor-danger: #d1242f;--fgColor-done: #8250df;--bgColor-default: #ffffff;--bgColor-muted: #f6f8fa;--bgColor-neutral-muted: #818b981f;--bgColor-attention-muted: #fff8c5;--borderColor-default: #d1d9e0;--borderColor-muted: #d1d9e0b3;--borderColor-neutral-muted: #d1d9e0b3;--borderColor-accent-emphasis: #0969da;--borderColor-success-emphasis: #1a7f37;--borderColor-attention-emphasis: #9a6700;--borderColor-danger-emphasis: #cf222e;--borderColor-done-emphasis: #8250df;--color-prettylights-syntax-comment: #59636e;--color-prettylights-syntax-constant: #0550ae;--color-prettylights-syntax-constant-other-reference-link: #0a3069;--color-prettylights-syntax-entity: #6639ba;--color-prettylights-syntax-storage-modifier-import: #1f2328;--color-prettylights-syntax-entity-tag: #0550ae;--color-prettylights-syntax-keyword: #cf222e;--color-prettylights-syntax-string: #0a3069;--color-prettylights-syntax-variable: #953800;--color-prettylights-syntax-brackethighlighter-unmatched: #82071e;--color-prettylights-syntax-brackethighlighter-angle: #59636e;--color-prettylights-syntax-invalid-illegal-text: #f6f8fa;--color-prettylights-syntax-invalid-illegal-bg: #82071e;--color-prettylights-syntax-carriage-return-text: #f6f8fa;--color-prettylights-syntax-carriage-return-bg: #cf222e;--color-prettylights-syntax-string-regexp: #116329;--color-prettylights-syntax-markup-list: #3b2300;--color-prettylights-syntax-markup-heading: #0550ae;--color-prettylights-syntax-markup-italic: #1f2328;--color-prettylights-syntax-markup-bold: #1f2328;--color-prettylights-syntax-markup-deleted-text: #82071e;--color-prettylights-syntax-markup-deleted-bg: #ffebe9;--color-prettylights-syntax-markup-inserted-text: #116329;--color-prettylights-syntax-markup-inserted-bg: #dafbe1;--color-prettylights-syntax-markup-changed-text: #953800;--color-prettylights-syntax-markup-changed-bg: #ffd8b5;--color-prettylights-syntax-markup-ignored-text: #d1d9e0;--color-prettylights-syntax-markup-ignored-bg: #0550ae;--color-prettylights-syntax-meta-diff-range: #8250df;--color-prettylights-syntax-sublimelinter-gutter-mark: #818b98}}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0;color:var(--fgColor-default);background-color:var(--bgColor-default);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}.markdown-body h1:hover .anchor .octicon-link:before,.markdown-body h2:hover .anchor .octicon-link:before,.markdown-body h3:hover .anchor .octicon-link:before,.markdown-body h4:hover .anchor .octicon-link:before,.markdown-body h5:hover .anchor .octicon-link:before,.markdown-body h6:hover .anchor .octicon-link:before{width:16px;height:16px;content:" ";display:inline-block;background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>");mask-image:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>")}.markdown-body details,.markdown-body figcaption,.markdown-body figure{display:block}.markdown-body summary{display:list-item}.markdown-body [hidden]{display:none!important}.markdown-body a{background-color:transparent;color:var(--fgColor-accent);text-decoration:none}.markdown-body abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-body b,.markdown-body strong{font-weight:var(--base-text-weight-semibold, 600)}.markdown-body dfn{font-style:italic}.markdown-body h1{margin:.67em 0;font-weight:var(--base-text-weight-semibold, 600);padding-bottom:.3em;font-size:2em;border-bottom:1px solid var(--borderColor-muted)}.markdown-body mark{background-color:var(--bgColor-attention-muted);color:var(--fgColor-default)}.markdown-body small{font-size:90%}.markdown-body sub,.markdown-body sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.markdown-body sub{bottom:-.25em}.markdown-body sup{top:-.5em}.markdown-body img{border-style:none;max-width:100%;box-sizing:content-box}.markdown-body code,.markdown-body kbd,.markdown-body pre,.markdown-body samp{font-family:monospace;font-size:1em}.markdown-body figure{margin:1em var(--base-size-40)}.markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--borderColor-muted);height:.25em;padding:0;margin:var(--base-size-24) 0;background-color:var(--borderColor-default);border:0}.markdown-body input{font:inherit;margin:0;overflow:visible;font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body [type=button],.markdown-body [type=reset],.markdown-body [type=submit]{-webkit-appearance:button;appearance:button}.markdown-body [type=checkbox],.markdown-body [type=radio]{box-sizing:border-box;padding:0}.markdown-body [type=number]::-webkit-inner-spin-button,.markdown-body [type=number]::-webkit-outer-spin-button{height:auto}.markdown-body [type=search]::-webkit-search-cancel-button,.markdown-body [type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none}.markdown-body ::-webkit-input-placeholder{color:inherit;opacity:.54}.markdown-body ::-webkit-file-upload-button{-webkit-appearance:button;appearance:button;font:inherit}.markdown-body a:hover{text-decoration:underline}.markdown-body ::placeholder{color:var(--fgColor-muted);opacity:1}.markdown-body hr:before{display:table;content:""}.markdown-body hr:after{display:table;clear:both;content:""}.markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;font-variant:tabular-nums}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body a:focus,.markdown-body [role=button]:focus,.markdown-body input[type=radio]:focus,.markdown-body input[type=checkbox]:focus{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}.markdown-body a:focus:not(:focus-visible),.markdown-body [role=button]:focus:not(:focus-visible),.markdown-body input[type=radio]:focus:not(:focus-visible),.markdown-body input[type=checkbox]:focus:not(:focus-visible){outline:solid 1px transparent}.markdown-body a:focus-visible,.markdown-body [role=button]:focus-visible,.markdown-body input[type=radio]:focus-visible,.markdown-body input[type=checkbox]:focus-visible{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}.markdown-body a:not([class]):focus,.markdown-body a:not([class]):focus-visible,.markdown-body input[type=radio]:focus,.markdown-body input[type=radio]:focus-visible,.markdown-body input[type=checkbox]:focus,.markdown-body input[type=checkbox]:focus-visible{outline-offset:0}.markdown-body kbd{display:inline-block;padding:var(--base-size-4);font:11px var( --fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace );line-height:10px;color:var(--fgColor-default);vertical-align:middle;background-color:var(--bgColor-muted);border:solid 1px var(--borderColor-neutral-muted);border-bottom-color:var(--borderColor-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--borderColor-neutral-muted)}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-bottom:var(--base-size-16);font-weight:var(--base-text-weight-semibold, 600);line-height:1.25}.markdown-body h2{font-weight:var(--base-text-weight-semibold, 600);padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid var(--borderColor-muted)}.markdown-body h3{font-weight:var(--base-text-weight-semibold, 600);font-size:1.25em}.markdown-body h4{font-weight:var(--base-text-weight-semibold, 600);font-size:1em}.markdown-body h5{font-weight:var(--base-text-weight-semibold, 600);font-size:.875em}.markdown-body h6{font-weight:var(--base-text-weight-semibold, 600);font-size:.85em;color:var(--fgColor-muted)}.markdown-body p{margin-top:0;margin-bottom:10px}.markdown-body blockquote{margin:0;padding:0 1em;color:var(--fgColor-muted);border-inline-start:.25em solid var(--borderColor-default)}.markdown-body ul,.markdown-body ol{margin-top:0;margin-bottom:0;padding-inline-start:2em}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ul ul ol,.markdown-body ul ol ol,.markdown-body ol ul ol,.markdown-body ol ol ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body tt,.markdown-body code,.markdown-body samp{font-family:var( --fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace );font-size:12px}.markdown-body pre{margin-top:0;margin-bottom:0;font-family:var( --fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace );font-size:12px;word-wrap:normal}.markdown-body .octicon{display:inline-block;overflow:visible!important;vertical-align:text-bottom;fill:currentColor}.markdown-body input::-webkit-outer-spin-button,.markdown-body input::-webkit-inner-spin-button{margin:0;appearance:none}.markdown-body .mr-2{margin-right:var(--base-size-8, 8px)!important}.markdown-body:before{display:table;content:""}.markdown-body:after{display:table;clear:both;content:""}.markdown-body>*:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:var(--fgColor-danger)}.markdown-body .anchor{float:inline-start;padding-inline-end:var(--base-size-4);margin-inline-start:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre,.markdown-body details{margin-top:0;margin-bottom:var(--base-size-16)}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:var(--fgColor-default);vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 tt,.markdown-body h1 code,.markdown-body h2 tt,.markdown-body h2 code,.markdown-body h3 tt,.markdown-body h3 code,.markdown-body h4 tt,.markdown-body h4 code,.markdown-body h5 tt,.markdown-body h5 code,.markdown-body h6 tt,.markdown-body h6 code{padding:0 .2em;font-size:inherit}.markdown-body summary h1,.markdown-body summary h2,.markdown-body summary h3,.markdown-body summary h4,.markdown-body summary h5,.markdown-body summary h6{display:inline-block}.markdown-body summary h1 .anchor,.markdown-body summary h2 .anchor,.markdown-body summary h3 .anchor,.markdown-body summary h4 .anchor,.markdown-body summary h5 .anchor,.markdown-body summary h6 .anchor{margin-inline-start:-40px}.markdown-body summary h1,.markdown-body summary h2{padding-bottom:0;border-bottom:0}.markdown-body ul.no-list,.markdown-body ol.no-list{padding:0;list-style-type:none}.markdown-body ol[type="a s"]{list-style-type:lower-alpha}.markdown-body ol[type="A s"]{list-style-type:upper-alpha}.markdown-body ol[type="i s"]{list-style-type:lower-roman}.markdown-body ol[type="I s"]{list-style-type:upper-roman}.markdown-body ol[type="1"]{list-style-type:decimal}.markdown-body div>ol:not([type]){list-style-type:decimal}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:var(--base-size-16)}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:var(--base-size-16);font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold, 600)}.markdown-body dl dd{padding:0 var(--base-size-16);margin-bottom:var(--base-size-16)}.markdown-body table th{font-weight:var(--base-text-weight-semibold, 600)}.markdown-body table th,.markdown-body table td{padding:6px 13px;border:1px solid var(--borderColor-default)}.markdown-body table td>:last-child{margin-bottom:0}.markdown-body table tr{background-color:var(--bgColor-default);border-top:1px solid var(--borderColor-muted)}.markdown-body table tr:nth-child(2n){background-color:var(--bgColor-muted)}.markdown-body table img{background-color:transparent}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid var(--borderColor-default)}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:var(--fgColor-default)}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;background-color:var(--bgColor-neutral-muted);border-radius:6px}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body samp{font-size:85%}.markdown-body pre code{font-size:100%}.markdown-body pre>code{padding:0;margin:0;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:var(--base-size-16)}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:var(--base-size-16);overflow:auto;font-size:85%;line-height:1.45;color:var(--fgColor-default);background-color:var(--bgColor-muted);border-radius:6px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{padding:10px var(--base-size-8) 9px;text-align:right;background:var(--bgColor-default);border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:var(--base-text-weight-semibold, 600);background:var(--bgColor-muted);border-top:0}.markdown-body [data-footnote-ref]:before{content:"["}.markdown-body [data-footnote-ref]:after{content:"]"}.markdown-body .footnotes{font-size:12px;color:var(--fgColor-muted);border-top:1px solid var(--borderColor-default)}.markdown-body .footnotes ol{padding-inline-start:var(--base-size-16)}.markdown-body .footnotes ol ul{display:inline-block;padding-inline-start:var(--base-size-16);margin-top:var(--base-size-16)}.markdown-body .footnotes li{position:relative}.markdown-body .footnotes li:target:before{position:absolute;top:calc(var(--base-size-8) * -1);inset-inline-end:calc(var(--base-size-8) * -1);bottom:calc(var(--base-size-8) * -1);inset-inline-start:calc(var(--base-size-24) * -1);pointer-events:none;content:"";border:2px solid var(--borderColor-accent-emphasis);border-radius:6px}.markdown-body .footnotes li:target{color:var(--fgColor-default)}.markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.markdown-body body:has(:modal){padding-right:var(--dialog-scrollgutter)!important}.markdown-body .pl-c{color:var(--color-prettylights-syntax-comment)}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:var(--color-prettylights-syntax-constant)}.markdown-body .pl-e,.markdown-body .pl-en{color:var(--color-prettylights-syntax-entity)}.markdown-body .pl-smi,.markdown-body .pl-s .pl-s1{color:var(--color-prettylights-syntax-storage-modifier-import)}.markdown-body .pl-ent{color:var(--color-prettylights-syntax-entity-tag)}.markdown-body .pl-k{color:var(--color-prettylights-syntax-keyword)}.markdown-body .pl-s,.markdown-body .pl-pds,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sre,.markdown-body .pl-sr .pl-sra{color:var(--color-prettylights-syntax-string)}.markdown-body .pl-v,.markdown-body .pl-smw{color:var(--color-prettylights-syntax-variable)}.markdown-body .pl-bu{color:var(--color-prettylights-syntax-brackethighlighter-unmatched)}.markdown-body .pl-ii{color:var(--color-prettylights-syntax-invalid-illegal-text);background-color:var(--color-prettylights-syntax-invalid-illegal-bg)}.markdown-body .pl-c2{color:var(--color-prettylights-syntax-carriage-return-text);background-color:var(--color-prettylights-syntax-carriage-return-bg)}.markdown-body .pl-sr .pl-cce{font-weight:700;color:var(--color-prettylights-syntax-string-regexp)}.markdown-body .pl-ml{color:var(--color-prettylights-syntax-markup-list)}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{font-weight:700;color:var(--color-prettylights-syntax-markup-heading)}.markdown-body .pl-mi{font-style:italic;color:var(--color-prettylights-syntax-markup-italic)}.markdown-body .pl-mb{font-weight:700;color:var(--color-prettylights-syntax-markup-bold)}.markdown-body .pl-md{color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}.markdown-body .pl-mi1{color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}.markdown-body .pl-mc{color:var(--color-prettylights-syntax-markup-changed-text);background-color:var(--color-prettylights-syntax-markup-changed-bg)}.markdown-body .pl-mi2{color:var(--color-prettylights-syntax-markup-ignored-text);background-color:var(--color-prettylights-syntax-markup-ignored-bg)}.markdown-body .pl-mdr{font-weight:700;color:var(--color-prettylights-syntax-meta-diff-range)}.markdown-body .pl-ba{color:var(--color-prettylights-syntax-brackethighlighter-angle)}.markdown-body .pl-sg{color:var(--color-prettylights-syntax-sublimelinter-gutter-mark)}.markdown-body .pl-corl{text-decoration:underline;color:var(--color-prettylights-syntax-constant-other-reference-link)}.markdown-body [role=button]:focus:not(:focus-visible),.markdown-body [role=tabpanel][tabindex="0"]:focus:not(:focus-visible),.markdown-body button:focus:not(:focus-visible),.markdown-body summary:focus:not(:focus-visible),.markdown-body a:focus:not(:focus-visible){outline:none;box-shadow:none}.markdown-body [tabindex="0"]:focus:not(:focus-visible),.markdown-body details-dialog:focus:not(:focus-visible){outline:none}.markdown-body g-emoji{display:inline-block;min-width:1ch;font-family:"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:var(--base-text-weight-normal, 400);line-height:1;vertical-align:-.075em}.markdown-body g-emoji img{width:1em;height:1em}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item label{font-weight:var(--base-text-weight-normal, 400)}.markdown-body .task-list-item.enabled label{cursor:pointer}.markdown-body .task-list-item+.task-list-item{margin-top:var(--base-size-4)}.markdown-body .task-list-item .handle{display:none}.markdown-body .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}.markdown-body ul:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body ol:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body .contains-task-list:hover .task-list-item-convert-container,.markdown-body .contains-task-list:focus-within .task-list-item-convert-container{display:block;width:auto;height:24px;overflow:visible;clip:auto}.markdown-body ::-webkit-calendar-picker-indicator{filter:invert(50%)}.markdown-body .markdown-alert{padding:var(--base-size-8) var(--base-size-16);margin-bottom:var(--base-size-16);color:inherit;border-inline-start:.25em solid var(--borderColor-default)}.markdown-body .markdown-alert>:first-child{margin-top:0}.markdown-body .markdown-alert>:last-child{margin-bottom:0}.markdown-body .markdown-alert .markdown-alert-title{display:flex;font-weight:var(--base-text-weight-medium, 500);align-items:center;line-height:1}.markdown-body .markdown-alert.markdown-alert-note{border-inline-start-color:var(--borderColor-accent-emphasis)}.markdown-body .markdown-alert.markdown-alert-note .markdown-alert-title{color:var(--fgColor-accent)}.markdown-body .markdown-alert.markdown-alert-important{border-inline-start-color:var(--borderColor-done-emphasis)}.markdown-body .markdown-alert.markdown-alert-important .markdown-alert-title{color:var(--fgColor-done)}.markdown-body .markdown-alert.markdown-alert-warning{border-inline-start-color:var(--borderColor-attention-emphasis)}.markdown-body .markdown-alert.markdown-alert-warning .markdown-alert-title{color:var(--fgColor-attention)}.markdown-body .markdown-alert.markdown-alert-tip{border-inline-start-color:var(--borderColor-success-emphasis)}.markdown-body .markdown-alert.markdown-alert-tip .markdown-alert-title{color:var(--fgColor-success)}.markdown-body .markdown-alert.markdown-alert-caution{border-inline-start-color:var(--borderColor-danger-emphasis)}.markdown-body .markdown-alert.markdown-alert-caution .markdown-alert-title{color:var(--fgColor-danger)}.markdown-body>*:first-child>.heading-element:first-child{margin-top:0!important}.markdown-body .highlight pre:has(+.zeroclipboard-container){min-height:52px}@media (prefers-color-scheme: dark){.markdown-body,[data-theme=dark]{color-scheme:light!important;--focus-outlineColor: #0969da !important;--fgColor-default: #1f2328 !important;--fgColor-muted: #59636e !important;--fgColor-accent: #0969da !important;--fgColor-success: #1a7f37 !important;--fgColor-attention: #9a6700 !important;--fgColor-danger: #d1242f !important;--fgColor-done: #8250df !important;--bgColor-default: #ffffff !important;--bgColor-muted: #f6f8fa !important;--bgColor-neutral-muted: #818b981f !important;--bgColor-attention-muted: #fff8c5 !important;--borderColor-default: #d1d9e0 !important;--borderColor-muted: #d1d9e0b3 !important;--borderColor-neutral-muted: #d1d9e0b3 !important;--borderColor-accent-emphasis: #0969da !important;--borderColor-success-emphasis: #1a7f37 !important;--borderColor-attention-emphasis: #9a6700 !important;--borderColor-danger-emphasis: #cf222e !important;--borderColor-done-emphasis: #8250df !important;--color-prettylights-syntax-comment: #59636e !important;--color-prettylights-syntax-constant: #0550ae !important;--color-prettylights-syntax-constant-other-reference-link: #0a3069 !important;--color-prettylights-syntax-entity: #6639ba !important;--color-prettylights-syntax-storage-modifier-import: #1f2328 !important;--color-prettylights-syntax-entity-tag: #0550ae !important;--color-prettylights-syntax-keyword: #cf222e !important;--color-prettylights-syntax-string: #0a3069 !important;--color-prettylights-syntax-variable: #953800 !important;--color-prettylights-syntax-brackethighlighter-unmatched: #82071e !important;--color-prettylights-syntax-brackethighlighter-angle: #59636e !important;--color-prettylights-syntax-invalid-illegal-text: #f6f8fa !important;--color-prettylights-syntax-invalid-illegal-bg: #82071e !important;--color-prettylights-syntax-carriage-return-text: #f6f8fa !important;--color-prettylights-syntax-carriage-return-bg: #cf222e !important;--color-prettylights-syntax-string-regexp: #116329 !important;--color-prettylights-syntax-markup-list: #3b2300 !important;--color-prettylights-syntax-markup-heading: #0550ae !important;--color-prettylights-syntax-markup-italic: #1f2328 !important;--color-prettylights-syntax-markup-bold: #1f2328 !important;--color-prettylights-syntax-markup-deleted-text: #82071e !important;--color-prettylights-syntax-markup-deleted-bg: #ffebe9 !important;--color-prettylights-syntax-markup-inserted-text: #116329 !important;--color-prettylights-syntax-markup-inserted-bg: #dafbe1 !important;--color-prettylights-syntax-markup-changed-text: #953800 !important;--color-prettylights-syntax-markup-changed-bg: #ffd8b5 !important;--color-prettylights-syntax-markup-ignored-text: #d1d9e0 !important;--color-prettylights-syntax-markup-ignored-bg: #0550ae !important;--color-prettylights-syntax-meta-diff-range: #8250df !important;--color-prettylights-syntax-sublimelinter-gutter-mark: #818b98 !important}}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
2
2
  Theme: GitHub
3
3
  Description: Light theme as seen on github.com
4
4
  Author: github.com
@@ -1 +1 @@
1
- {"version":3,"file":"IframeSandbox.cjs","sources":["../../../src/components/ContentRender/IframeSandbox.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\nimport SandboxApp from \"./SandboxApp\";\nimport { normalizeContentViewportMinHeight } from \"./utils/content-viewport-min-height\";\nimport ContentRender from \"./ContentRender\";\nimport {\n EMPTY_ROOT_HEIGHT_META,\n inspectViewportHeightFromHtmlRootString,\n inspectViewportHeightFromNodeChain,\n parseExplicitHeight,\n resolveExplicitHeightFromNodeChain,\n} from \"./utils/iframe-viewport-height\";\nimport {\n SANDBOX_INTERACTION_MESSAGE_SOURCE,\n SANDBOX_INTERACTION_MESSAGE_TYPE,\n} from \"../../lib/sandboxInteraction\";\nimport {\n injectScalingSystem,\n type ScalingWindow,\n} from \"./utils/iframe-scaling\";\nimport {\n getMarkdownFlowDirection,\n getMarkdownFlowLanguage,\n type MarkdownFlowLocale,\n} from \"../../lib/locale\";\nimport { useDetachedLanguage } from \"../../lib/useDetachedLanguage\";\nimport { useResolvedDirection } from \"../../lib/useResolvedDirection\";\nimport { getContentRenderLocaleTexts } from \"./contentRenderI18n\";\nimport { CJK_SAFE_SANS_FONT_FAMILY } from \"./cjkFontFamily\";\n\ntype BlackboardVendorModule = typeof import(\"./blackboard-vendor\");\n\n// Cache the sandbox vendor loader so every iframe reuses the same preload request.\nlet blackboardVendorPromise: Promise<BlackboardVendorModule> | null = null;\n\nconst loadBlackboardVendor = () => {\n if (!blackboardVendorPromise) {\n blackboardVendorPromise = import(\"./blackboard-vendor\");\n }\n\n return blackboardVendorPromise;\n};\n\nconst COMPLETE_IMAGE_TAG_PATTERN = /<img\\b[^>]*>/i;\nconst POST_IMAGE_STREAM_DEBOUNCE_MS = 180;\nconst SANDBOX_INTERACTION_THROTTLE_MS = 240;\n\nexport interface IframeSandboxProps {\n content: string;\n className?: string;\n locale?: MarkdownFlowLocale;\n /** Overrides the locale-derived language without changing authored HTML language. */\n lang?: string;\n /** Overrides locale-derived direction without replacing authored HTML direction. */\n dir?: React.HTMLAttributes<HTMLDivElement>[\"dir\"];\n loadingText?: string;\n styleLoadingText?: string;\n scriptLoadingText?: string;\n fullScreenButtonText?: string;\n exitFullScreenButtonText?: string;\n hideFullScreen?: boolean;\n mode?: \"content\" | \"blackboard\";\n type: \"sandbox\" | \"markdown\";\n replaceRootScreenHeightWithFull?: boolean;\n enableScaling?: boolean;\n disableLoadingOverlay?: boolean;\n}\n\nconst replaceRootScreenHeightToken = (className: string) =>\n className\n .split(/\\s+/)\n .filter(Boolean)\n .map((token) => {\n const segments = token.split(\":\");\n if (\n segments[segments.length - 1] !== \"h-screen\" &&\n segments[segments.length - 1] !== \"min-h-screen\"\n ) {\n return token;\n }\n segments[segments.length - 1] = \"h-full\";\n return segments.join(\":\");\n })\n .join(\" \");\n\nconst replaceRootScreenHeightWithFullClass = (\n html: string,\n enabled: boolean\n) => {\n if (!enabled || !html.trim()) {\n return html;\n }\n\n return html.replace(\n /^(\\s*<[a-zA-Z][\\w:-]*)(\\s[^>]*?)?>/,\n (match, tagStart: string, attrs = \"\") => {\n const classMatch = attrs.match(/\\bclass\\s*=\\s*([\"'])([^\"']*)\\1/i);\n\n if (!classMatch) {\n return match;\n }\n\n const nextClassName = replaceRootScreenHeightToken(classMatch[2]);\n\n if (nextClassName === classMatch[2]) {\n return match;\n }\n\n return `${tagStart}${attrs.replace(\n classMatch[0],\n `class=${classMatch[1]}${nextClassName}${classMatch[1]}`\n )}>`;\n }\n );\n};\n\nconst IframeSandboxInstance: React.FC<IframeSandboxProps> = ({\n content,\n type,\n className,\n locale,\n lang,\n dir,\n loadingText,\n styleLoadingText,\n scriptLoadingText,\n fullScreenButtonText,\n exitFullScreenButtonText,\n hideFullScreen = false,\n mode = \"content\",\n replaceRootScreenHeightWithFull = false,\n enableScaling = false,\n disableLoadingOverlay = false,\n}) => {\n const localeTexts = getContentRenderLocaleTexts(locale);\n const direction = dir ?? getMarkdownFlowDirection(locale);\n const language = lang ?? getMarkdownFlowLanguage(locale);\n const resolvedFullScreenButtonText =\n fullScreenButtonText || localeTexts.sandboxFullscreenButtonText;\n const resolvedExitFullScreenButtonText =\n exitFullScreenButtonText || localeTexts.sandboxExitFullscreenButtonText;\n const containerRef = useRef<HTMLDivElement>(null);\n const fullscreenButtonRef = useRef<HTMLButtonElement>(null);\n const sandboxLanguage = useDetachedLanguage(containerRef, language);\n const { resolvedDirection } = useResolvedDirection(containerRef, direction);\n const markdownContainerRef = useRef<HTMLDivElement>(null);\n const markdownContentRef = useRef<HTMLElement>(null);\n const setMarkdownContentContainerRef = useCallback(\n (node: HTMLDivElement | null) => {\n markdownContainerRef.current = node;\n markdownContentRef.current =\n node?.querySelector<HTMLElement>(\".content-render\") ?? null;\n },\n []\n );\n const { resolvedDirection: markdownContentDirection } = useResolvedDirection(\n markdownContentRef,\n direction\n );\n const sandboxDirection = direction ?? resolvedDirection;\n const requestedDirectionRef = useRef(direction);\n requestedDirectionRef.current = direction;\n // Auto direction cannot inspect text across the iframe document boundary.\n // Mirror the rendered sandbox direction to host controls instead.\n const [sandboxContentDirection, setSandboxContentDirection] = useState<\n \"ltr\" | \"rtl\"\n >();\n let fullscreenControlDirection: \"ltr\" | \"rtl\" | undefined;\n if (direction === \"auto\") {\n fullscreenControlDirection = resolvedDirection;\n if (type === \"sandbox\") {\n fullscreenControlDirection = sandboxContentDirection ?? resolvedDirection;\n } else if (mode === \"blackboard\") {\n fullscreenControlDirection = markdownContentDirection;\n }\n }\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const rootRef = useRef<Root | null>(null);\n const updateHeightRef = useRef<() => void>(() => {});\n const [height, setHeight] = useState(480);\n const [contentHeight, setContentHeight] = useState<number | null>(null);\n const [containerWidth, setContainerWidth] = useState(0);\n const [fullscreenControlHeight, setFullscreenControlHeight] = useState(0);\n const isMeasuringContentRef = useRef(false);\n const pendingHeightUpdateRef = useRef(false);\n const lastSandboxInteractionTimeRef = useRef(0);\n const [resetToken, setResetToken] = useState(0);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const shouldInjectSandboxVendor = type === \"sandbox\";\n\n const isBlackboardMode = mode === \"blackboard\";\n const shouldEnableScaling =\n enableScaling && isBlackboardMode && type === \"sandbox\";\n const shouldMeasureDynamicHeight = isBlackboardMode && type === \"sandbox\";\n const shouldProcessRootScreenHeight =\n shouldMeasureDynamicHeight && replaceRootScreenHeightWithFull;\n const prevHtmlRef = useRef<string>(\"\");\n const htmlContent = React.useMemo(\n () => (type === \"sandbox\" ? content : \"\"),\n [content, type]\n );\n const normalizedHtmlContent = React.useMemo(\n () =>\n replaceRootScreenHeightWithFullClass(\n htmlContent,\n shouldProcessRootScreenHeight\n ),\n [htmlContent, shouldProcessRootScreenHeight]\n );\n const originalRootHeightMeta = React.useMemo(\n () =>\n shouldProcessRootScreenHeight\n ? inspectViewportHeightFromHtmlRootString(htmlContent)\n : EMPTY_ROOT_HEIGHT_META,\n [htmlContent, shouldProcessRootScreenHeight]\n );\n const shouldStretchRootHeight = React.useMemo(\n () =>\n shouldProcessRootScreenHeight &&\n originalRootHeightMeta.hasFullViewportHeight,\n [\n originalRootHeightMeta.hasFullViewportHeight,\n shouldProcessRootScreenHeight,\n ]\n );\n const [renderHtmlContent, setRenderHtmlContent] = useState(\n normalizedHtmlContent\n );\n const prevIncomingHtmlRef = useRef(normalizedHtmlContent);\n const pendingHtmlRef = useRef(normalizedHtmlContent);\n const deferRenderTimerRef = useRef<number | null>(null);\n const initialPaintFrameRef = useRef<number | null>(null);\n const renderViewportHeightCssRef = useRef<string | null>(null);\n\n const emitSandboxInteraction = useCallback((eventType: string) => {\n if (typeof window === \"undefined\") {\n return;\n }\n const now = Date.now();\n if (\n now - lastSandboxInteractionTimeRef.current <\n SANDBOX_INTERACTION_THROTTLE_MS\n ) {\n return;\n }\n lastSandboxInteractionTimeRef.current = now;\n window.postMessage(\n {\n source: SANDBOX_INTERACTION_MESSAGE_SOURCE,\n type: SANDBOX_INTERACTION_MESSAGE_TYPE,\n eventType,\n },\n window.location.origin\n );\n }, []);\n\n useEffect(() => {\n if (type !== \"markdown\" || mode !== \"blackboard\") return;\n const container = markdownContainerRef.current;\n if (!container) return;\n const handleClick = () => emitSandboxInteraction(\"click\");\n container.addEventListener(\"click\", handleClick);\n return () => container.removeEventListener(\"click\", handleClick);\n }, [emitSandboxInteraction, mode, type]);\n\n const clearDeferredRenderTimer = () => {\n if (deferRenderTimerRef.current === null) return;\n window.clearTimeout(deferRenderTimerRef.current);\n deferRenderTimerRef.current = null;\n };\n\n const clearInitialPaintFrames = () => {\n if (initialPaintFrameRef.current !== null) {\n window.cancelAnimationFrame(initialPaintFrameRef.current);\n initialPaintFrameRef.current = null;\n }\n };\n\n useEffect(\n () => () => {\n clearDeferredRenderTimer();\n clearInitialPaintFrames();\n },\n []\n );\n\n useEffect(() => {\n const prevIncomingHtml = prevIncomingHtmlRef.current;\n prevIncomingHtmlRef.current = normalizedHtmlContent;\n\n const isAppendOnlyStream =\n !!prevIncomingHtml &&\n normalizedHtmlContent.length > prevIncomingHtml.length &&\n normalizedHtmlContent.startsWith(prevIncomingHtml);\n const containsCompleteImage = COMPLETE_IMAGE_TAG_PATTERN.test(\n normalizedHtmlContent\n );\n const shouldDeferRender = isAppendOnlyStream && containsCompleteImage;\n\n if (!shouldDeferRender) {\n clearDeferredRenderTimer();\n pendingHtmlRef.current = normalizedHtmlContent;\n setRenderHtmlContent(normalizedHtmlContent);\n return;\n }\n\n pendingHtmlRef.current = normalizedHtmlContent;\n clearDeferredRenderTimer();\n deferRenderTimerRef.current = window.setTimeout(() => {\n setRenderHtmlContent(pendingHtmlRef.current);\n deferRenderTimerRef.current = null;\n }, POST_IMAGE_STREAM_DEBOUNCE_MS);\n }, [normalizedHtmlContent]);\n\n const rootViewportHeightCss = React.useMemo(() => {\n if (!shouldMeasureDynamicHeight) {\n return null;\n }\n\n return inspectViewportHeightFromHtmlRootString(renderHtmlContent)\n .viewportHeightCss;\n }, [renderHtmlContent, shouldMeasureDynamicHeight]);\n\n useEffect(() => {\n renderViewportHeightCssRef.current = rootViewportHeightCss;\n }, [rootViewportHeightCss]);\n\n const hasRootVhHeight = Boolean(rootViewportHeightCss);\n const sandboxViewportHeight =\n isBlackboardMode && type === \"sandbox\"\n ? shouldEnableScaling\n ? \"100%\"\n : shouldStretchRootHeight\n ? \"100%\"\n : (rootViewportHeightCss ?? `${height}px`)\n : undefined;\n useEffect(() => {\n if (mode !== \"blackboard\") {\n prevHtmlRef.current = normalizedHtmlContent;\n return;\n }\n const prev = prevHtmlRef.current;\n const isContinuation = prev && normalizedHtmlContent.startsWith(prev);\n if (!isContinuation && prev) {\n setResetToken((token) => token + 1);\n }\n prevHtmlRef.current = normalizedHtmlContent;\n }, [mode, normalizedHtmlContent]);\n\n useEffect(() => {\n const iframe = iframeRef.current;\n if (!iframe) return undefined;\n\n const doc = iframe.contentDocument;\n if (!doc) return undefined;\n\n doc.open();\n doc.write(`<!DOCTYPE html>\n<html${mode === \"blackboard\" ? ' style=\"height: 100%;\"' : \"\"}>\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <style>\n :root { color-scheme: light; }\n html, body, #root { width: 100%; font-family: ${CJK_SAFE_SANS_FONT_FAMILY}; }\n ${mode === \"blackboard\" ? \"html, body, #root { height: 100%; }\" : \"\"}\n html, body { margin: 0; padding: 0; overflow: ${shouldEnableScaling ? \"hidden auto\" : mode === \"blackboard\" ? \"auto\" : \"hidden\"}; }\n *, *::before, *::after { box-sizing: border-box; }\n ${\n mode !== \"blackboard\"\n ? `\n .h-screen { height: auto !important; }\n .min-h-screen { min-height: auto !important; }\n .h-dvh, .h-svh, .h-lvh { height: auto !important; }\n .min-h-dvh, .min-h-svh, .min-h-lvh { min-height: auto !important; }\n `\n : \"\"\n }\n </style>\n </head>\n <body>\n <div id=\"root\"></div>\n </body>\n</html>`);\n doc.close();\n\n // Force iframe theme to stay in light mode regardless of host OS preference.\n doc.documentElement.setAttribute(\"data-theme\", \"light\");\n doc.documentElement.style.colorScheme = \"light\";\n doc.body?.style.setProperty(\"color-scheme\", \"light\");\n\n const shouldBridgeSandboxInteraction =\n isBlackboardMode && type === \"sandbox\";\n const handleSandboxClick = () => emitSandboxInteraction(\"click\");\n\n if (shouldBridgeSandboxInteraction) {\n doc.addEventListener(\"click\", handleSandboxClick, true);\n }\n\n const rootEl = doc.getElementById(\"root\");\n if (!rootEl) return undefined;\n\n const root = createRoot(rootEl);\n rootRef.current = root;\n let isDestroyed = false;\n const getHeightInspectionNode = (node: HTMLElement) => ({\n heightAttrValue: node.getAttribute(\"height\"),\n styleAttrValue: node.getAttribute(\"style\"),\n classAttrValue: node.getAttribute(\"class\"),\n });\n const getSingleChildElement = (node: HTMLElement) => {\n const childElements = Array.from(node.children) as HTMLElement[];\n\n return childElements.length === 1 ? childElements[0] : null;\n };\n\n const resolveExplicitHeight = () => {\n if (!shouldMeasureDynamicHeight) return null;\n if (!iframeRef.current || !doc.body) return null;\n const parentViewportHeight =\n iframeRef.current.ownerDocument?.documentElement?.clientHeight ||\n window.innerHeight;\n // Reuse parsed height metadata from the current html snapshot first to\n // avoid re-inspecting the same DOM chain on every height tick.\n const precomputedViewportHeightCss = renderViewportHeightCssRef.current;\n const parsed = precomputedViewportHeightCss\n ? parseExplicitHeight(\n precomputedViewportHeightCss,\n parentViewportHeight\n )\n : null;\n\n if (parsed !== null) {\n return Math.ceil(parsed);\n }\n\n const wrapper = doc.body.querySelector(\n \".sandbox-wrapper\"\n ) as HTMLElement | null;\n const container = wrapper?.firstElementChild as HTMLElement | null;\n if (!container) return null;\n const containerChildren = Array.from(container.children) as HTMLElement[];\n const rootContentElement =\n containerChildren.length === 1 ? containerChildren[0] : null;\n const runtimeHeightMeta = inspectViewportHeightFromNodeChain(\n rootContentElement,\n {\n getNode: getHeightInspectionNode,\n getSingleChild: getSingleChildElement,\n }\n );\n const runtimeViewportHeightCss = runtimeHeightMeta.viewportHeightCss;\n\n if (runtimeViewportHeightCss) {\n const runtimeViewportHeight = parseExplicitHeight(\n runtimeViewportHeightCss,\n parentViewportHeight\n );\n\n if (runtimeViewportHeight !== null) {\n return Math.ceil(runtimeViewportHeight);\n }\n }\n\n const explicitPixelHeight = resolveExplicitHeightFromNodeChain(\n rootContentElement,\n parentViewportHeight,\n {\n getNode: getHeightInspectionNode,\n getSingleChild: getSingleChildElement,\n }\n );\n\n return explicitPixelHeight !== null\n ? Math.ceil(explicitPixelHeight)\n : null;\n };\n\n const updateHeight = () => {\n if (!iframeRef.current || !doc.body) return;\n\n if (!isBlackboardMode) {\n // Guard: prevent re-entrant measurement from ResizeObserver /\n // MutationObserver callbacks triggered by our own height changes.\n if (isMeasuringContentRef.current) {\n // Mark that an update was requested while the guard was active.\n // We will retry once the guard releases (see setTimeout below).\n pendingHeightUpdateRef.current = true;\n return;\n }\n isMeasuringContentRef.current = true;\n const contentContainer =\n doc.body.querySelector<HTMLElement>(\".sandbox-container\");\n if (contentContainer)\n normalizeContentViewportMinHeight(contentContainer);\n\n // Content mode height measurement strategy:\n // Temporarily set iframe height to the 16:9 layout viewport so that:\n // 1. vmin units are stable: vmin = min(cw, minH)/100 = minH/100,\n // consistent with the final rendered 16:9 iframe.\n // 2. Viewport-filling content (e.g. inline style=\"height:100vh\")\n // retains its 16:9 viewport. Naturally sized content reserves only\n // its measured body height in the host page.\n // (Previously using cw caused such content to report 1:1 height,\n // overriding the 16:9 minimum.)\n const iframe = iframeRef.current;\n const cw = containerRef.current?.clientWidth || 0;\n const prevH = iframe.style.height;\n\n if (cw > 0) {\n const minH = Math.round((cw * 9) / 16);\n // Absolute height cap. Diverging vh-feedback (multiple `height:100vh`\n // siblings, or compound vh-relative children whose sum exceeds the\n // viewport) can otherwise grow the iframe geometrically across\n // repeated ResizeObserver/MutationObserver passes. 1:20 aspect is\n // a generous upper bound for any single sandbox slide.\n const maxH = Math.max(8192, cw * 20);\n iframe.style.height = minH + \"px\";\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n doc.body.offsetHeight; // force layout\n\n let measuredH = doc.body.scrollHeight;\n\n // Detect inner elements that clip overflowing content behind a\n // scrollbar (e.g. <div style=\"height:100vh; overflow-y:auto\"> whose\n // content is taller than the iframe). body.scrollHeight won't see\n // that overflow, so we walk the tree and factor in each scrollable\n // element's full scroll height based on its position in the iframe.\n const iframeWin = doc.defaultView;\n if (iframeWin) {\n // Include fixed-position widgets, which do not contribute to body\n // scrollHeight, as well as content behind internal scrollbars.\n const getInnerScrollableHeight = (root: Element): number => {\n let maxH = 0;\n const walk = (el: Element) => {\n const style = iframeWin.getComputedStyle(el);\n if (style.position === \"fixed\") {\n maxH = Math.max(\n maxH,\n Math.ceil(el.getBoundingClientRect().bottom)\n );\n }\n if (el !== root && el.scrollHeight > el.clientHeight + 1) {\n const oy = style.overflowY;\n if (oy === \"auto\" || oy === \"scroll\") {\n const rect = el.getBoundingClientRect();\n if (rect.top >= 0) {\n maxH = Math.max(\n maxH,\n Math.ceil(rect.top + el.scrollHeight)\n );\n }\n }\n }\n for (const child of el.children) walk(child);\n };\n walk(root);\n return maxH;\n };\n\n measuredH = Math.max(measuredH, getInnerScrollableHeight(doc.body));\n\n // Content that uses vh-relative sizing grows as the viewport\n // expands. Measure up to 8 more times at the expanded height so\n // we capture the full content height in a single updateHeight()\n // call rather than waiting for external re-triggers.\n for (let i = 0; i < 8 && measuredH > minH; i++) {\n iframe.style.height = measuredH + \"px\";\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n doc.body.offsetHeight; // force layout at expanded size\n const nextH = Math.max(\n doc.body.scrollHeight,\n getInnerScrollableHeight(doc.body)\n );\n if (nextH <= measuredH + 1) break; // stable — stop iterating\n // Geometric vh-feedback detection: vh-relative children scale\n // with the iframe viewport, so growing the iframe makes them\n // larger which grows scrollHeight — runaway divergence. Two\n // `height:100vh` siblings produce a 2× per-iteration multiplier.\n // Stop iterating; keep the prior (stable) measuredH.\n if (nextH >= measuredH * 1.5) break;\n measuredH = nextH;\n }\n }\n\n // Restore iframe to let React control it via contentModeStyle\n iframe.style.height = prevH;\n\n setContentHeight((prev) => {\n const next = Math.min(maxH, Math.max(1, Math.ceil(measuredH)));\n return prev === next ? prev : next;\n });\n }\n\n setTimeout(() => {\n isMeasuringContentRef.current = false;\n // Retry any update that was blocked while the guard was active\n // (e.g. dynamic content injected by scripts or images loading).\n if (pendingHeightUpdateRef.current) {\n pendingHeightUpdateRef.current = false;\n scheduleHeightUpdate();\n }\n }, 50);\n return;\n }\n\n // Scaling mode: viewport is fixed, content scales via font-size.\n if (shouldEnableScaling) return;\n\n // Blackboard mode: use existing measurement logic\n const bodyScrollH = doc.body.scrollHeight;\n const htmlScrollH = doc.documentElement?.scrollHeight || 0;\n const rootScrollH = rootEl?.scrollHeight || 0;\n const measuredHeight = Math.max(bodyScrollH, htmlScrollH, rootScrollH);\n\n if (shouldMeasureDynamicHeight) {\n const explicitHeight = resolveExplicitHeight();\n const nextHeight = Math.max(\n 200,\n explicitHeight ?? Math.ceil(measuredHeight)\n );\n setHeight((prevHeight) =>\n prevHeight === nextHeight ? prevHeight : nextHeight\n );\n }\n };\n const scheduleHeightUpdate = () => {\n requestAnimationFrame(() => {\n if (isDestroyed) return;\n updateHeight();\n });\n };\n updateHeightRef.current = scheduleHeightUpdate;\n\n updateHeight();\n scheduleHeightUpdate();\n\n if (shouldInjectSandboxVendor) {\n // Inject Tailwind/DaisyUI/GSAP before rendering sandbox content to avoid FOUC.\n loadBlackboardVendor()\n .then(({ injectBlackboardLibraries }) => {\n if (isDestroyed) return;\n injectBlackboardLibraries(doc);\n if (shouldEnableScaling) {\n injectScalingSystem(doc);\n }\n requestAnimationFrame(() => {\n if (isDestroyed) return;\n scheduleHeightUpdate();\n });\n })\n .catch(() => {\n if (isDestroyed) return;\n scheduleHeightUpdate();\n });\n }\n\n const hostElement = containerRef.current;\n let needsTailwindRefreshAfterHidden = Boolean(\n hostElement &&\n (hostElement.clientWidth <= 0 || hostElement.clientHeight <= 0)\n );\n let isTailwindRefreshQueued = false;\n let tailwindRefreshFrame: number | null = null;\n let tailwindRefreshTimer: number | null = null;\n const runPostTailwindRefreshLayout = () => {\n if (isDestroyed) return;\n scheduleHeightUpdate();\n const iframeWin = iframe.contentWindow as ScalingWindow | null;\n iframeWin?.__mdf_triggerFitContent?.();\n };\n const isHostVisible = () =>\n Boolean(\n hostElement &&\n hostElement.clientWidth > 0 &&\n hostElement.clientHeight > 0\n );\n const queueTailwindRefreshAfterHidden = () => {\n if (\n !shouldInjectSandboxVendor ||\n !hostElement ||\n !needsTailwindRefreshAfterHidden ||\n isTailwindRefreshQueued ||\n !isHostVisible()\n ) {\n return;\n }\n\n isTailwindRefreshQueued = true;\n loadBlackboardVendor()\n .then(({ refreshTailwindRuntime }) => {\n if (isDestroyed) return;\n\n tailwindRefreshFrame = window.requestAnimationFrame(() => {\n tailwindRefreshFrame = null;\n isTailwindRefreshQueued = false;\n\n const sandboxContainer = doc.querySelector(\".sandbox-container\");\n if (\n isDestroyed ||\n !isHostVisible() ||\n !sandboxContainer?.childNodes.length ||\n !refreshTailwindRuntime(doc)\n ) {\n return;\n }\n\n needsTailwindRefreshAfterHidden = false;\n runPostTailwindRefreshLayout();\n tailwindRefreshTimer = window.setTimeout(() => {\n tailwindRefreshTimer = null;\n runPostTailwindRefreshLayout();\n }, 100);\n });\n })\n .catch(() => {\n isTailwindRefreshQueued = false;\n });\n };\n const canObserveResize = typeof ResizeObserver !== \"undefined\";\n const hostResizeObserver =\n shouldInjectSandboxVendor && hostElement && canObserveResize\n ? new ResizeObserver((entries) => {\n const contentRect = entries[0]?.contentRect;\n const hostWidth = contentRect?.width ?? hostElement.clientWidth;\n const hostHeight = contentRect?.height ?? hostElement.clientHeight;\n const isHostSizeVisible = hostWidth > 0 && hostHeight > 0;\n\n if (!isHostSizeVisible) {\n return;\n }\n\n queueTailwindRefreshAfterHidden();\n })\n : null;\n if (hostResizeObserver && hostElement) {\n hostResizeObserver.observe(hostElement);\n }\n\n const resizeObserver = canObserveResize\n ? new ResizeObserver(() => updateHeight())\n : null;\n resizeObserver?.observe(doc.body);\n if (rootEl) {\n resizeObserver?.observe(rootEl);\n }\n\n const syncSandboxContentDirection = () => {\n if (type !== \"sandbox\" || requestedDirectionRef.current !== \"auto\") {\n return;\n }\n const wrapper = doc.querySelector<HTMLElement>(\".sandbox-wrapper\");\n const view = doc.defaultView;\n if (!wrapper || !view) return;\n const nextDirection =\n view.getComputedStyle(wrapper).direction === \"rtl\" ? \"rtl\" : \"ltr\";\n setSandboxContentDirection((currentDirection) =>\n currentDirection === nextDirection ? currentDirection : nextDirection\n );\n };\n\n // MutationObserver: detect DOM changes that ResizeObserver might miss\n // (e.g. content injected by scripts, images loading, dynamic rendering)\n const mutationObserver = new MutationObserver(() => {\n syncSandboxContentDirection();\n scheduleHeightUpdate();\n if (!isHostVisible()) {\n needsTailwindRefreshAfterHidden = true;\n return;\n }\n queueTailwindRefreshAfterHidden();\n });\n mutationObserver.observe(doc.body, {\n childList: true,\n characterData: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"style\", \"class\", \"dir\"],\n });\n\n return () => {\n isDestroyed = true;\n hostResizeObserver?.disconnect();\n resizeObserver?.disconnect();\n mutationObserver.disconnect();\n if (tailwindRefreshFrame !== null) {\n window.cancelAnimationFrame(tailwindRefreshFrame);\n }\n if (tailwindRefreshTimer !== null) {\n window.clearTimeout(tailwindRefreshTimer);\n }\n if (shouldEnableScaling) {\n const iframeWin = iframe.contentWindow as ScalingWindow | null;\n iframeWin?.__mdf_cleanupScaling?.();\n }\n if (shouldBridgeSandboxInteraction) {\n doc.removeEventListener(\"click\", handleSandboxClick, true);\n }\n if (rootRef.current === root) {\n rootRef.current = null;\n updateHeightRef.current = () => {};\n }\n // Defer unmount to avoid React warning when parent is mid-render\n setTimeout(() => {\n root.unmount();\n }, 0);\n };\n }, []);\n\n useEffect(() => {\n const onFullscreenChange = () => {\n setIsFullscreen(Boolean(document.fullscreenElement));\n };\n document.addEventListener(\"fullscreenchange\", onFullscreenChange);\n return () =>\n document.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n }, []);\n\n // Track the layout viewport width and enough host space for its own control.\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n const button = fullscreenButtonRef.current;\n const updateControlHeight = () => {\n setFullscreenControlHeight(\n button ? Math.ceil(button.offsetTop + button.offsetHeight) : 0\n );\n };\n if (typeof ResizeObserver === \"undefined\") {\n setContainerWidth(el.clientWidth);\n updateControlHeight();\n return;\n }\n const ro = new ResizeObserver((entries) => {\n const hostEntry = entries.find((entry) => entry.target === el);\n if (hostEntry) setContainerWidth(hostEntry.contentRect.width);\n updateControlHeight();\n });\n ro.observe(el);\n if (button) ro.observe(button);\n setContainerWidth(el.clientWidth);\n updateControlHeight();\n return () => ro.disconnect();\n }, [hideFullScreen]);\n\n // Keep a stable layout viewport for authored vh/vmin sizing, while the host\n // reserves only the measured content height. The iframe is top-aligned inside\n // the clipped host so a short card does not leave a slide-sized blank area.\n const contentModeStyle = useMemo<React.CSSProperties | undefined>(() => {\n if (isBlackboardMode || containerWidth === 0 || isFullscreen)\n return undefined;\n const minH = Math.round((containerWidth * 9) / 16);\n return { height: Math.max(contentHeight ?? minH, fullscreenControlHeight) };\n }, [\n isBlackboardMode,\n containerWidth,\n contentHeight,\n isFullscreen,\n fullscreenControlHeight,\n ]);\n\n const contentIframeHeight = contentModeStyle\n ? Math.max(Math.round((containerWidth * 9) / 16), contentHeight ?? 0)\n : undefined;\n\n const toggleFullscreen = () => {\n const target = containerRef.current || iframeRef.current;\n if (!target) return;\n if (document.fullscreenElement) {\n document.exitFullscreen().catch(() => {});\n return;\n }\n if (target.requestFullscreen) {\n target.requestFullscreen().catch(() => {});\n }\n };\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n\n root.render(\n <SandboxApp\n html={renderHtmlContent}\n locale={locale}\n dir={sandboxDirection}\n lang={sandboxLanguage}\n loadingText={loadingText}\n styleLoadingText={styleLoadingText}\n scriptLoadingText={scriptLoadingText}\n disableLoadingOverlay={disableLoadingOverlay}\n resetToken={resetToken}\n hasRootVhHeight={hasRootVhHeight}\n mode={mode}\n stretchRootHeight={shouldStretchRootHeight}\n enableScaling={shouldEnableScaling}\n />\n );\n\n // Schedule multiple measurements to catch async content (scripts, images, styles).\n initialPaintFrameRef.current = window.requestAnimationFrame(() => {\n updateHeightRef.current?.();\n if (shouldEnableScaling) {\n const iframeWin = iframeRef.current\n ?.contentWindow as ScalingWindow | null;\n iframeWin?.__mdf_triggerFitContent?.();\n }\n initialPaintFrameRef.current = null;\n });\n const t1 = setTimeout(() => updateHeightRef.current?.(), 100);\n const t2 = setTimeout(() => updateHeightRef.current?.(), 500);\n return () => {\n if (initialPaintFrameRef.current !== null) {\n window.cancelAnimationFrame(initialPaintFrameRef.current);\n initialPaintFrameRef.current = null;\n }\n clearTimeout(t1);\n clearTimeout(t2);\n };\n }, [\n renderHtmlContent,\n locale,\n sandboxDirection,\n sandboxLanguage,\n loadingText,\n styleLoadingText,\n scriptLoadingText,\n resetToken,\n disableLoadingOverlay,\n hasRootVhHeight,\n mode,\n shouldStretchRootHeight,\n shouldEnableScaling,\n ]);\n const containerClassName = [\n `w-full relative content-render-iframe-sandbox content-render-iframe-sandbox--${type}`,\n isBlackboardMode\n ? \"h-full overflow-auto flex flex-col\"\n : contentModeStyle\n ? \"overflow-hidden\"\n : \"aspect-[16/9] overflow-hidden flex items-center justify-center\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n ref={containerRef}\n dir={direction}\n lang={language}\n data-root-vh={hasRootVhHeight ? \"true\" : \"false\"}\n className={containerClassName}\n style={\n sandboxViewportHeight\n ? {\n height: sandboxViewportHeight,\n minHeight: sandboxViewportHeight,\n }\n : contentModeStyle\n }\n >\n {!hideFullScreen && (\n <button\n ref={fullscreenButtonRef}\n type=\"button\"\n dir={fullscreenControlDirection}\n onClick={toggleFullscreen}\n className={\n \"absolute top-2 end-2 z-50 p-1.5 bg-black/75 text-white rounded-md cursor-pointer\"\n }\n >\n {isFullscreen\n ? resolvedExitFullScreenButtonText\n : resolvedFullScreenButtonText}\n </button>\n )}\n {mode === \"blackboard\" && type === \"markdown\" ? (\n <div ref={setMarkdownContentContainerRef}>\n <ContentRender\n content={content}\n locale={locale}\n dir={direction}\n lang={language}\n disableSandboxLoadingOverlay={disableLoadingOverlay}\n />\n </div>\n ) : (\n <iframe\n ref={iframeRef}\n sandbox=\"allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox\"\n allow=\"fullscreen\"\n allowFullScreen\n className={[className, \"w-full h-full mx-auto my-auto block\"]\n .filter(Boolean)\n .join(\" \")}\n style={{\n height: sandboxViewportHeight ?? contentIframeHeight ?? \"100%\",\n minHeight: sandboxViewportHeight,\n margin: \"auto\",\n }}\n />\n )}\n </div>\n );\n};\n\nconst IframeSandbox: React.FC<IframeSandboxProps> = (props) => {\n const mode = props.mode ?? \"content\";\n const shouldEnableScaling = Boolean(\n props.enableScaling && mode === \"blackboard\" && props.type === \"sandbox\"\n );\n // The iframe shell captures these initialization-only values. Remounting the\n // inner instance keeps old and new React roots from sharing cleanup refs.\n const lifecycleKey = `${props.type}:${mode}:${shouldEnableScaling ? \"scaled\" : \"unscaled\"}`;\n\n return <IframeSandboxInstance key={lifecycleKey} {...props} />;\n};\n\nexport default IframeSandbox;\n"],"names":["blackboardVendorPromise","loadBlackboardVendor","COMPLETE_IMAGE_TAG_PATTERN","POST_IMAGE_STREAM_DEBOUNCE_MS","SANDBOX_INTERACTION_THROTTLE_MS","replaceRootScreenHeightToken","className","token","segments","replaceRootScreenHeightWithFullClass","html","enabled","match","tagStart","attrs","classMatch","nextClassName","IframeSandboxInstance","content","type","locale","lang","dir","loadingText","styleLoadingText","scriptLoadingText","fullScreenButtonText","exitFullScreenButtonText","hideFullScreen","mode","replaceRootScreenHeightWithFull","enableScaling","disableLoadingOverlay","localeTexts","getContentRenderLocaleTexts","direction","getMarkdownFlowDirection","language","getMarkdownFlowLanguage","resolvedFullScreenButtonText","resolvedExitFullScreenButtonText","containerRef","useRef","fullscreenButtonRef","sandboxLanguage","useDetachedLanguage","resolvedDirection","useResolvedDirection","markdownContainerRef","markdownContentRef","setMarkdownContentContainerRef","useCallback","node","markdownContentDirection","sandboxDirection","requestedDirectionRef","sandboxContentDirection","setSandboxContentDirection","useState","fullscreenControlDirection","iframeRef","rootRef","updateHeightRef","height","setHeight","contentHeight","setContentHeight","containerWidth","setContainerWidth","fullscreenControlHeight","setFullscreenControlHeight","isMeasuringContentRef","pendingHeightUpdateRef","lastSandboxInteractionTimeRef","resetToken","setResetToken","isFullscreen","setIsFullscreen","shouldInjectSandboxVendor","isBlackboardMode","shouldEnableScaling","shouldMeasureDynamicHeight","shouldProcessRootScreenHeight","prevHtmlRef","htmlContent","React","normalizedHtmlContent","originalRootHeightMeta","inspectViewportHeightFromHtmlRootString","EMPTY_ROOT_HEIGHT_META","shouldStretchRootHeight","renderHtmlContent","setRenderHtmlContent","prevIncomingHtmlRef","pendingHtmlRef","deferRenderTimerRef","initialPaintFrameRef","renderViewportHeightCssRef","emitSandboxInteraction","eventType","now","SANDBOX_INTERACTION_MESSAGE_SOURCE","SANDBOX_INTERACTION_MESSAGE_TYPE","useEffect","container","handleClick","clearDeferredRenderTimer","clearInitialPaintFrames","prevIncomingHtml","isAppendOnlyStream","containsCompleteImage","rootViewportHeightCss","hasRootVhHeight","sandboxViewportHeight","prev","iframe","doc","CJK_SAFE_SANS_FONT_FAMILY","shouldBridgeSandboxInteraction","handleSandboxClick","rootEl","root","createRoot","isDestroyed","getHeightInspectionNode","getSingleChildElement","childElements","resolveExplicitHeight","parentViewportHeight","precomputedViewportHeightCss","parsed","parseExplicitHeight","containerChildren","rootContentElement","runtimeViewportHeightCss","inspectViewportHeightFromNodeChain","runtimeViewportHeight","explicitPixelHeight","resolveExplicitHeightFromNodeChain","updateHeight","contentContainer","normalizeContentViewportMinHeight","cw","prevH","minH","maxH","measuredH","iframeWin","getInnerScrollableHeight","walk","el","style","oy","rect","child","i","nextH","next","scheduleHeightUpdate","bodyScrollH","htmlScrollH","rootScrollH","measuredHeight","explicitHeight","nextHeight","prevHeight","injectBlackboardLibraries","injectScalingSystem","hostElement","needsTailwindRefreshAfterHidden","isTailwindRefreshQueued","tailwindRefreshFrame","tailwindRefreshTimer","runPostTailwindRefreshLayout","isHostVisible","queueTailwindRefreshAfterHidden","refreshTailwindRuntime","sandboxContainer","canObserveResize","hostResizeObserver","entries","contentRect","hostWidth","hostHeight","resizeObserver","syncSandboxContentDirection","wrapper","view","nextDirection","currentDirection","mutationObserver","onFullscreenChange","button","updateControlHeight","ro","hostEntry","entry","contentModeStyle","useMemo","contentIframeHeight","toggleFullscreen","target","jsx","SandboxApp","t1","t2","containerClassName","jsxs","ContentRender","IframeSandbox","props","lifecycleKey"],"mappings":"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"}
1
+ {"version":3,"file":"IframeSandbox.cjs","sources":["../../../src/components/ContentRender/IframeSandbox.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\nimport SandboxApp from \"./SandboxApp\";\nimport { normalizeContentViewportMinHeight } from \"./utils/content-viewport-min-height\";\nimport ContentRender from \"./ContentRender\";\nimport {\n EMPTY_ROOT_HEIGHT_META,\n inspectViewportHeightFromHtmlRootString,\n inspectViewportHeightFromNodeChain,\n parseExplicitHeight,\n resolveExplicitHeightFromNodeChain,\n} from \"./utils/iframe-viewport-height\";\nimport {\n SANDBOX_INTERACTION_MESSAGE_SOURCE,\n SANDBOX_INTERACTION_MESSAGE_TYPE,\n} from \"../../lib/sandboxInteraction\";\nimport {\n injectScalingSystem,\n type ScalingWindow,\n} from \"./utils/iframe-scaling\";\nimport {\n getMarkdownFlowDirection,\n getMarkdownFlowLanguage,\n type MarkdownFlowLocale,\n} from \"../../lib/locale\";\nimport { useDetachedLanguage } from \"../../lib/useDetachedLanguage\";\nimport { useResolvedDirection } from \"../../lib/useResolvedDirection\";\nimport { getContentRenderLocaleTexts } from \"./contentRenderI18n\";\nimport { CJK_SAFE_SANS_FONT_FAMILY } from \"./cjkFontFamily\";\n\ntype BlackboardVendorModule = typeof import(\"./blackboard-vendor\");\n\n// Cache the sandbox vendor loader so every iframe reuses the same preload request.\nlet blackboardVendorPromise: Promise<BlackboardVendorModule> | null = null;\n\nconst loadBlackboardVendor = () => {\n if (!blackboardVendorPromise) {\n blackboardVendorPromise = import(\"./blackboard-vendor\");\n }\n\n return blackboardVendorPromise;\n};\n\nconst COMPLETE_IMAGE_TAG_PATTERN = /<img\\b[^>]*>/i;\nconst POST_IMAGE_STREAM_DEBOUNCE_MS = 180;\nconst SANDBOX_INTERACTION_THROTTLE_MS = 240;\n\nexport interface IframeSandboxProps {\n content: string;\n className?: string;\n locale?: MarkdownFlowLocale;\n /** Overrides the locale-derived language without changing authored HTML language. */\n lang?: string;\n /** Overrides locale-derived direction without replacing authored HTML direction. */\n dir?: React.HTMLAttributes<HTMLDivElement>[\"dir\"];\n loadingText?: string;\n styleLoadingText?: string;\n scriptLoadingText?: string;\n fullScreenButtonText?: string;\n exitFullScreenButtonText?: string;\n hideFullScreen?: boolean;\n mode?: \"content\" | \"blackboard\";\n type: \"sandbox\" | \"markdown\";\n replaceRootScreenHeightWithFull?: boolean;\n enableScaling?: boolean;\n disableLoadingOverlay?: boolean;\n}\n\nconst replaceRootScreenHeightToken = (className: string) =>\n className\n .split(/\\s+/)\n .filter(Boolean)\n .map((token) => {\n const segments = token.split(\":\");\n if (\n segments[segments.length - 1] !== \"h-screen\" &&\n segments[segments.length - 1] !== \"min-h-screen\"\n ) {\n return token;\n }\n segments[segments.length - 1] = \"h-full\";\n return segments.join(\":\");\n })\n .join(\" \");\n\nconst replaceRootScreenHeightWithFullClass = (\n html: string,\n enabled: boolean\n) => {\n if (!enabled || !html.trim()) {\n return html;\n }\n\n return html.replace(\n /^(\\s*<[a-zA-Z][\\w:-]*)(\\s[^>]*?)?>/,\n (match, tagStart: string, attrs = \"\") => {\n const classMatch = attrs.match(/\\bclass\\s*=\\s*([\"'])([^\"']*)\\1/i);\n\n if (!classMatch) {\n return match;\n }\n\n const nextClassName = replaceRootScreenHeightToken(classMatch[2]);\n\n if (nextClassName === classMatch[2]) {\n return match;\n }\n\n return `${tagStart}${attrs.replace(\n classMatch[0],\n `class=${classMatch[1]}${nextClassName}${classMatch[1]}`\n )}>`;\n }\n );\n};\n\nconst IframeSandboxInstance: React.FC<IframeSandboxProps> = ({\n content,\n type,\n className,\n locale,\n lang,\n dir,\n loadingText,\n styleLoadingText,\n scriptLoadingText,\n fullScreenButtonText,\n exitFullScreenButtonText,\n hideFullScreen = false,\n mode = \"content\",\n replaceRootScreenHeightWithFull = false,\n enableScaling = false,\n disableLoadingOverlay = false,\n}) => {\n const localeTexts = getContentRenderLocaleTexts(locale);\n const direction = dir ?? getMarkdownFlowDirection(locale);\n const language = lang ?? getMarkdownFlowLanguage(locale);\n const resolvedFullScreenButtonText =\n fullScreenButtonText || localeTexts.sandboxFullscreenButtonText;\n const resolvedExitFullScreenButtonText =\n exitFullScreenButtonText || localeTexts.sandboxExitFullscreenButtonText;\n const containerRef = useRef<HTMLDivElement>(null);\n const fullscreenButtonRef = useRef<HTMLButtonElement>(null);\n const sandboxLanguage = useDetachedLanguage(containerRef, language);\n const { resolvedDirection } = useResolvedDirection(containerRef, direction);\n const markdownContainerRef = useRef<HTMLDivElement>(null);\n const markdownContentRef = useRef<HTMLElement>(null);\n const setMarkdownContentContainerRef = useCallback(\n (node: HTMLDivElement | null) => {\n markdownContainerRef.current = node;\n markdownContentRef.current =\n node?.querySelector<HTMLElement>(\".content-render\") ?? null;\n },\n []\n );\n const { resolvedDirection: markdownContentDirection } = useResolvedDirection(\n markdownContentRef,\n direction\n );\n const sandboxDirection = direction ?? resolvedDirection;\n const requestedDirectionRef = useRef(direction);\n requestedDirectionRef.current = direction;\n // Auto direction cannot inspect text across the iframe document boundary.\n // Mirror the rendered sandbox direction to host controls instead.\n const [sandboxContentDirection, setSandboxContentDirection] = useState<\n \"ltr\" | \"rtl\"\n >();\n let fullscreenControlDirection: \"ltr\" | \"rtl\" | undefined;\n if (direction === \"auto\") {\n fullscreenControlDirection = resolvedDirection;\n if (type === \"sandbox\") {\n fullscreenControlDirection = sandboxContentDirection ?? resolvedDirection;\n } else if (mode === \"blackboard\") {\n fullscreenControlDirection = markdownContentDirection;\n }\n }\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const rootRef = useRef<Root | null>(null);\n const updateHeightRef = useRef<() => void>(() => {});\n const [height, setHeight] = useState(480);\n const [contentHeight, setContentHeight] = useState<number | null>(null);\n const [containerWidth, setContainerWidth] = useState(0);\n const [fullscreenControlHeight, setFullscreenControlHeight] = useState(0);\n const isMeasuringContentRef = useRef(false);\n const pendingHeightUpdateRef = useRef(false);\n const lastSandboxInteractionTimeRef = useRef(0);\n const [resetToken, setResetToken] = useState(0);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const shouldInjectSandboxVendor = type === \"sandbox\";\n\n const isBlackboardMode = mode === \"blackboard\";\n const shouldEnableScaling =\n enableScaling && isBlackboardMode && type === \"sandbox\";\n const shouldMeasureDynamicHeight = isBlackboardMode && type === \"sandbox\";\n const shouldProcessRootScreenHeight =\n shouldMeasureDynamicHeight && replaceRootScreenHeightWithFull;\n const prevHtmlRef = useRef<string>(\"\");\n const htmlContent = React.useMemo(\n () => (type === \"sandbox\" ? content : \"\"),\n [content, type]\n );\n const normalizedHtmlContent = React.useMemo(\n () =>\n replaceRootScreenHeightWithFullClass(\n htmlContent,\n shouldProcessRootScreenHeight\n ),\n [htmlContent, shouldProcessRootScreenHeight]\n );\n const originalRootHeightMeta = React.useMemo(\n () =>\n shouldProcessRootScreenHeight\n ? inspectViewportHeightFromHtmlRootString(htmlContent)\n : EMPTY_ROOT_HEIGHT_META,\n [htmlContent, shouldProcessRootScreenHeight]\n );\n const shouldStretchRootHeight = React.useMemo(\n () =>\n shouldProcessRootScreenHeight &&\n originalRootHeightMeta.hasFullViewportHeight,\n [\n originalRootHeightMeta.hasFullViewportHeight,\n shouldProcessRootScreenHeight,\n ]\n );\n const [renderHtmlContent, setRenderHtmlContent] = useState(\n normalizedHtmlContent\n );\n const prevIncomingHtmlRef = useRef(normalizedHtmlContent);\n const pendingHtmlRef = useRef(normalizedHtmlContent);\n const deferRenderTimerRef = useRef<number | null>(null);\n const initialPaintFrameRef = useRef<number | null>(null);\n const renderViewportHeightCssRef = useRef<string | null>(null);\n\n const emitSandboxInteraction = useCallback((eventType: string) => {\n if (typeof window === \"undefined\") {\n return;\n }\n const now = Date.now();\n if (\n now - lastSandboxInteractionTimeRef.current <\n SANDBOX_INTERACTION_THROTTLE_MS\n ) {\n return;\n }\n lastSandboxInteractionTimeRef.current = now;\n window.postMessage(\n {\n source: SANDBOX_INTERACTION_MESSAGE_SOURCE,\n type: SANDBOX_INTERACTION_MESSAGE_TYPE,\n eventType,\n },\n window.location.origin\n );\n }, []);\n\n useEffect(() => {\n if (type !== \"markdown\" || mode !== \"blackboard\") return;\n const container = markdownContainerRef.current;\n if (!container) return;\n const handleClick = () => emitSandboxInteraction(\"click\");\n container.addEventListener(\"click\", handleClick);\n return () => container.removeEventListener(\"click\", handleClick);\n }, [emitSandboxInteraction, mode, type]);\n\n const clearDeferredRenderTimer = () => {\n if (deferRenderTimerRef.current === null) return;\n window.clearTimeout(deferRenderTimerRef.current);\n deferRenderTimerRef.current = null;\n };\n\n const clearInitialPaintFrames = () => {\n if (initialPaintFrameRef.current !== null) {\n window.cancelAnimationFrame(initialPaintFrameRef.current);\n initialPaintFrameRef.current = null;\n }\n };\n\n useEffect(\n () => () => {\n clearDeferredRenderTimer();\n clearInitialPaintFrames();\n },\n []\n );\n\n useEffect(() => {\n const prevIncomingHtml = prevIncomingHtmlRef.current;\n prevIncomingHtmlRef.current = normalizedHtmlContent;\n\n const isAppendOnlyStream =\n !!prevIncomingHtml &&\n normalizedHtmlContent.length > prevIncomingHtml.length &&\n normalizedHtmlContent.startsWith(prevIncomingHtml);\n const containsCompleteImage = COMPLETE_IMAGE_TAG_PATTERN.test(\n normalizedHtmlContent\n );\n const shouldDeferRender = isAppendOnlyStream && containsCompleteImage;\n\n if (!shouldDeferRender) {\n clearDeferredRenderTimer();\n pendingHtmlRef.current = normalizedHtmlContent;\n setRenderHtmlContent(normalizedHtmlContent);\n return;\n }\n\n pendingHtmlRef.current = normalizedHtmlContent;\n clearDeferredRenderTimer();\n deferRenderTimerRef.current = window.setTimeout(() => {\n setRenderHtmlContent(pendingHtmlRef.current);\n deferRenderTimerRef.current = null;\n }, POST_IMAGE_STREAM_DEBOUNCE_MS);\n }, [normalizedHtmlContent]);\n\n const rootViewportHeightCss = React.useMemo(() => {\n if (!shouldMeasureDynamicHeight) {\n return null;\n }\n\n return inspectViewportHeightFromHtmlRootString(renderHtmlContent)\n .viewportHeightCss;\n }, [renderHtmlContent, shouldMeasureDynamicHeight]);\n\n useEffect(() => {\n renderViewportHeightCssRef.current = rootViewportHeightCss;\n }, [rootViewportHeightCss]);\n\n const hasRootVhHeight = Boolean(rootViewportHeightCss);\n const sandboxViewportHeight =\n isBlackboardMode && type === \"sandbox\"\n ? shouldEnableScaling\n ? \"100%\"\n : shouldStretchRootHeight\n ? \"100%\"\n : (rootViewportHeightCss ?? `${height}px`)\n : undefined;\n useEffect(() => {\n if (mode !== \"blackboard\") {\n prevHtmlRef.current = normalizedHtmlContent;\n return;\n }\n const prev = prevHtmlRef.current;\n const isContinuation = prev && normalizedHtmlContent.startsWith(prev);\n if (!isContinuation && prev) {\n setResetToken((token) => token + 1);\n }\n prevHtmlRef.current = normalizedHtmlContent;\n }, [mode, normalizedHtmlContent]);\n\n useEffect(() => {\n const iframe = iframeRef.current;\n if (!iframe) return undefined;\n\n const doc = iframe.contentDocument;\n if (!doc) return undefined;\n\n doc.open();\n doc.write(`<!DOCTYPE html>\n<html${mode === \"blackboard\" ? ' style=\"height: 100%;\"' : \"\"}>\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <style>\n :root { color-scheme: light; }\n html, body, #root { width: 100%; font-family: ${CJK_SAFE_SANS_FONT_FAMILY}; }\n ${mode === \"blackboard\" ? \"html, body, #root { height: 100%; }\" : \"\"}\n html, body { margin: 0; padding: 0; overflow: ${shouldEnableScaling ? \"hidden auto\" : mode === \"blackboard\" ? \"auto\" : \"hidden\"}; }\n *, *::before, *::after { box-sizing: border-box; }\n ${\n mode !== \"blackboard\"\n ? `\n .h-screen { height: auto !important; }\n .min-h-screen { min-height: auto !important; }\n .h-dvh, .h-svh, .h-lvh { height: auto !important; }\n .min-h-dvh, .min-h-svh, .min-h-lvh { min-height: auto !important; }\n `\n : \"\"\n }\n </style>\n </head>\n <body>\n <div id=\"root\"></div>\n </body>\n</html>`);\n doc.close();\n\n // Force iframe theme to stay in light mode regardless of host OS preference.\n doc.documentElement.setAttribute(\"data-theme\", \"light\");\n doc.documentElement.style.colorScheme = \"light\";\n doc.body?.style.setProperty(\"color-scheme\", \"light\");\n\n const shouldBridgeSandboxInteraction =\n isBlackboardMode && type === \"sandbox\";\n const handleSandboxClick = () => emitSandboxInteraction(\"click\");\n\n if (shouldBridgeSandboxInteraction) {\n doc.addEventListener(\"click\", handleSandboxClick, true);\n }\n\n const rootEl = doc.getElementById(\"root\");\n if (!rootEl) return undefined;\n\n const root = createRoot(rootEl);\n rootRef.current = root;\n let isDestroyed = false;\n const getHeightInspectionNode = (node: HTMLElement) => ({\n heightAttrValue: node.getAttribute(\"height\"),\n styleAttrValue: node.getAttribute(\"style\"),\n classAttrValue: node.getAttribute(\"class\"),\n });\n const getSingleChildElement = (node: HTMLElement) => {\n const childElements = Array.from(node.children) as HTMLElement[];\n\n return childElements.length === 1 ? childElements[0] : null;\n };\n\n const resolveExplicitHeight = () => {\n if (!shouldMeasureDynamicHeight) return null;\n if (!iframeRef.current || !doc.body) return null;\n const parentViewportHeight =\n iframeRef.current.ownerDocument?.documentElement?.clientHeight ||\n window.innerHeight;\n // Reuse parsed height metadata from the current html snapshot first to\n // avoid re-inspecting the same DOM chain on every height tick.\n const precomputedViewportHeightCss = renderViewportHeightCssRef.current;\n const parsed = precomputedViewportHeightCss\n ? parseExplicitHeight(\n precomputedViewportHeightCss,\n parentViewportHeight\n )\n : null;\n\n if (parsed !== null) {\n return Math.ceil(parsed);\n }\n\n const wrapper = doc.body.querySelector(\n \".sandbox-wrapper\"\n ) as HTMLElement | null;\n const container = wrapper?.firstElementChild as HTMLElement | null;\n if (!container) return null;\n const containerChildren = Array.from(container.children) as HTMLElement[];\n const rootContentElement =\n containerChildren.length === 1 ? containerChildren[0] : null;\n const runtimeHeightMeta = inspectViewportHeightFromNodeChain(\n rootContentElement,\n {\n getNode: getHeightInspectionNode,\n getSingleChild: getSingleChildElement,\n }\n );\n const runtimeViewportHeightCss = runtimeHeightMeta.viewportHeightCss;\n\n if (runtimeViewportHeightCss) {\n const runtimeViewportHeight = parseExplicitHeight(\n runtimeViewportHeightCss,\n parentViewportHeight\n );\n\n if (runtimeViewportHeight !== null) {\n return Math.ceil(runtimeViewportHeight);\n }\n }\n\n const explicitPixelHeight = resolveExplicitHeightFromNodeChain(\n rootContentElement,\n parentViewportHeight,\n {\n getNode: getHeightInspectionNode,\n getSingleChild: getSingleChildElement,\n }\n );\n\n return explicitPixelHeight !== null\n ? Math.ceil(explicitPixelHeight)\n : null;\n };\n\n const updateHeight = () => {\n if (!iframeRef.current || !doc.body) return;\n\n if (!isBlackboardMode) {\n // Guard: prevent re-entrant measurement from ResizeObserver /\n // MutationObserver callbacks triggered by our own height changes.\n if (isMeasuringContentRef.current) {\n // Mark that an update was requested while the guard was active.\n // We will retry once the guard releases (see setTimeout below).\n pendingHeightUpdateRef.current = true;\n return;\n }\n isMeasuringContentRef.current = true;\n const contentContainer =\n doc.body.querySelector<HTMLElement>(\".sandbox-container\");\n if (contentContainer)\n normalizeContentViewportMinHeight(contentContainer);\n\n // Content mode height measurement strategy:\n // Temporarily set iframe height to the 16:9 layout viewport so that:\n // 1. vmin units are stable: vmin = min(cw, minH)/100 = minH/100,\n // consistent with the final rendered 16:9 iframe.\n // 2. Viewport-filling content (e.g. inline style=\"height:100vh\")\n // retains its 16:9 viewport. Naturally sized content reserves only\n // its measured body height in the host page.\n // (Previously using cw caused such content to report 1:1 height,\n // overriding the 16:9 minimum.)\n const iframe = iframeRef.current;\n const cw = containerRef.current?.clientWidth || 0;\n const prevH = iframe.style.height;\n\n if (cw > 0) {\n const minH = Math.round((cw * 9) / 16);\n // Absolute height cap. Diverging vh-feedback (multiple `height:100vh`\n // siblings, or compound vh-relative children whose sum exceeds the\n // viewport) can otherwise grow the iframe geometrically across\n // repeated ResizeObserver/MutationObserver passes. 1:20 aspect is\n // a generous upper bound for any single sandbox slide.\n const maxH = Math.max(8192, cw * 20);\n iframe.style.height = minH + \"px\";\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n doc.body.offsetHeight; // force layout\n\n let measuredH = doc.body.scrollHeight;\n\n // Detect inner elements that clip overflowing content behind a\n // scrollbar (e.g. <div style=\"height:100vh; overflow-y:auto\"> whose\n // content is taller than the iframe). body.scrollHeight won't see\n // that overflow, so we walk the tree and factor in each scrollable\n // element's full scroll height based on its position in the iframe.\n const iframeWin = doc.defaultView;\n if (iframeWin) {\n // Include fixed-position widgets, which do not contribute to body\n // scrollHeight, as well as content behind internal scrollbars.\n const getInnerScrollableHeight = (root: Element): number => {\n let maxH = 0;\n const walk = (el: Element) => {\n const style = iframeWin.getComputedStyle(el);\n if (style.position === \"fixed\") {\n maxH = Math.max(\n maxH,\n Math.ceil(el.getBoundingClientRect().bottom)\n );\n }\n if (el !== root && el.scrollHeight > el.clientHeight + 1) {\n const oy = style.overflowY;\n if (oy === \"auto\" || oy === \"scroll\") {\n const rect = el.getBoundingClientRect();\n if (rect.top >= 0) {\n maxH = Math.max(\n maxH,\n Math.ceil(rect.top + el.scrollHeight)\n );\n }\n }\n }\n for (const child of el.children) walk(child);\n };\n walk(root);\n return maxH;\n };\n\n measuredH = Math.max(measuredH, getInnerScrollableHeight(doc.body));\n\n // Content that uses vh-relative sizing grows as the viewport\n // expands. Measure up to 8 more times at the expanded height so\n // we capture the full content height in a single updateHeight()\n // call rather than waiting for external re-triggers.\n for (let i = 0; i < 8 && measuredH > minH; i++) {\n iframe.style.height = measuredH + \"px\";\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n doc.body.offsetHeight; // force layout at expanded size\n const nextH = Math.max(\n doc.body.scrollHeight,\n getInnerScrollableHeight(doc.body)\n );\n if (nextH <= measuredH + 1) break; // stable — stop iterating\n // Geometric vh-feedback detection: vh-relative children scale\n // with the iframe viewport, so growing the iframe makes them\n // larger which grows scrollHeight — runaway divergence. Two\n // `height:100vh` siblings produce a 2× per-iteration multiplier.\n // Stop iterating; keep the prior (stable) measuredH.\n if (nextH >= measuredH * 1.5) break;\n measuredH = nextH;\n }\n }\n\n // Restore iframe to let React control it via contentModeStyle\n iframe.style.height = prevH;\n\n setContentHeight((prev) => {\n const next = Math.min(maxH, Math.max(1, Math.ceil(measuredH)));\n return prev === next ? prev : next;\n });\n }\n\n setTimeout(() => {\n isMeasuringContentRef.current = false;\n // Retry any update that was blocked while the guard was active\n // (e.g. dynamic content injected by scripts or images loading).\n if (pendingHeightUpdateRef.current) {\n pendingHeightUpdateRef.current = false;\n scheduleHeightUpdate();\n }\n }, 50);\n return;\n }\n\n // Scaling mode: viewport is fixed, content scales via font-size.\n if (shouldEnableScaling) return;\n\n // Blackboard mode: use existing measurement logic\n const bodyScrollH = doc.body.scrollHeight;\n const htmlScrollH = doc.documentElement?.scrollHeight || 0;\n const rootScrollH = rootEl?.scrollHeight || 0;\n const measuredHeight = Math.max(bodyScrollH, htmlScrollH, rootScrollH);\n\n if (shouldMeasureDynamicHeight) {\n const explicitHeight = resolveExplicitHeight();\n const nextHeight = Math.max(\n 200,\n explicitHeight ?? Math.ceil(measuredHeight)\n );\n setHeight((prevHeight) =>\n prevHeight === nextHeight ? prevHeight : nextHeight\n );\n }\n };\n const scheduleHeightUpdate = () => {\n requestAnimationFrame(() => {\n if (isDestroyed) return;\n updateHeight();\n });\n };\n updateHeightRef.current = scheduleHeightUpdate;\n\n updateHeight();\n scheduleHeightUpdate();\n\n if (shouldInjectSandboxVendor) {\n // Inject Tailwind/DaisyUI/GSAP before rendering sandbox content to avoid FOUC.\n loadBlackboardVendor()\n .then(({ injectBlackboardLibraries }) => {\n if (isDestroyed) return;\n injectBlackboardLibraries(doc);\n if (shouldEnableScaling) {\n injectScalingSystem(doc);\n }\n requestAnimationFrame(() => {\n if (isDestroyed) return;\n scheduleHeightUpdate();\n });\n })\n .catch(() => {\n if (isDestroyed) return;\n scheduleHeightUpdate();\n });\n }\n\n const hostElement = containerRef.current;\n let needsTailwindRefreshAfterHidden = Boolean(\n hostElement &&\n (hostElement.clientWidth <= 0 || hostElement.clientHeight <= 0)\n );\n let isTailwindRefreshQueued = false;\n let tailwindRefreshFrame: number | null = null;\n let tailwindRefreshTimer: number | null = null;\n const runPostTailwindRefreshLayout = () => {\n if (isDestroyed) return;\n scheduleHeightUpdate();\n const iframeWin = iframe.contentWindow as ScalingWindow | null;\n iframeWin?.__mdf_triggerFitContent?.();\n };\n const isHostVisible = () =>\n Boolean(\n hostElement &&\n hostElement.clientWidth > 0 &&\n hostElement.clientHeight > 0\n );\n const queueTailwindRefreshAfterHidden = () => {\n if (\n !shouldInjectSandboxVendor ||\n !hostElement ||\n !needsTailwindRefreshAfterHidden ||\n isTailwindRefreshQueued ||\n !isHostVisible()\n ) {\n return;\n }\n\n isTailwindRefreshQueued = true;\n loadBlackboardVendor()\n .then(({ refreshTailwindRuntime }) => {\n if (isDestroyed) return;\n\n tailwindRefreshFrame = window.requestAnimationFrame(() => {\n tailwindRefreshFrame = null;\n isTailwindRefreshQueued = false;\n\n const sandboxContainer = doc.querySelector(\".sandbox-container\");\n if (\n isDestroyed ||\n !isHostVisible() ||\n !sandboxContainer?.childNodes.length ||\n !refreshTailwindRuntime(doc)\n ) {\n return;\n }\n\n needsTailwindRefreshAfterHidden = false;\n runPostTailwindRefreshLayout();\n tailwindRefreshTimer = window.setTimeout(() => {\n tailwindRefreshTimer = null;\n runPostTailwindRefreshLayout();\n }, 100);\n });\n })\n .catch(() => {\n isTailwindRefreshQueued = false;\n });\n };\n const canObserveResize = typeof ResizeObserver !== \"undefined\";\n const hostResizeObserver =\n shouldInjectSandboxVendor && hostElement && canObserveResize\n ? new ResizeObserver((entries) => {\n const contentRect = entries[0]?.contentRect;\n const hostWidth = contentRect?.width ?? hostElement.clientWidth;\n const hostHeight = contentRect?.height ?? hostElement.clientHeight;\n const isHostSizeVisible = hostWidth > 0 && hostHeight > 0;\n\n if (!isHostSizeVisible) {\n return;\n }\n\n queueTailwindRefreshAfterHidden();\n })\n : null;\n if (hostResizeObserver && hostElement) {\n hostResizeObserver.observe(hostElement);\n }\n\n const resizeObserver = canObserveResize\n ? new ResizeObserver(() => updateHeight())\n : null;\n resizeObserver?.observe(doc.body);\n if (rootEl) {\n resizeObserver?.observe(rootEl);\n }\n\n const syncSandboxContentDirection = () => {\n if (type !== \"sandbox\" || requestedDirectionRef.current !== \"auto\") {\n return;\n }\n const wrapper = doc.querySelector<HTMLElement>(\".sandbox-wrapper\");\n const view = doc.defaultView;\n if (!wrapper || !view) return;\n const nextDirection =\n view.getComputedStyle(wrapper).direction === \"rtl\" ? \"rtl\" : \"ltr\";\n setSandboxContentDirection((currentDirection) =>\n currentDirection === nextDirection ? currentDirection : nextDirection\n );\n };\n\n // MutationObserver: detect DOM changes that ResizeObserver might miss\n // (e.g. content injected by scripts, images loading, dynamic rendering)\n const mutationObserver = new MutationObserver(() => {\n syncSandboxContentDirection();\n scheduleHeightUpdate();\n if (!isHostVisible()) {\n needsTailwindRefreshAfterHidden = true;\n return;\n }\n queueTailwindRefreshAfterHidden();\n });\n mutationObserver.observe(doc.body, {\n childList: true,\n characterData: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"style\", \"class\", \"dir\"],\n });\n\n return () => {\n isDestroyed = true;\n hostResizeObserver?.disconnect();\n resizeObserver?.disconnect();\n mutationObserver.disconnect();\n if (tailwindRefreshFrame !== null) {\n window.cancelAnimationFrame(tailwindRefreshFrame);\n }\n if (tailwindRefreshTimer !== null) {\n window.clearTimeout(tailwindRefreshTimer);\n }\n if (shouldEnableScaling) {\n const iframeWin = iframe.contentWindow as ScalingWindow | null;\n iframeWin?.__mdf_cleanupScaling?.();\n }\n if (shouldBridgeSandboxInteraction) {\n doc.removeEventListener(\"click\", handleSandboxClick, true);\n }\n if (rootRef.current === root) {\n rootRef.current = null;\n updateHeightRef.current = () => {};\n }\n // Defer unmount to avoid React warning when parent is mid-render\n setTimeout(() => {\n root.unmount();\n }, 0);\n };\n }, []);\n\n useEffect(() => {\n const onFullscreenChange = () => {\n setIsFullscreen(Boolean(document.fullscreenElement));\n };\n document.addEventListener(\"fullscreenchange\", onFullscreenChange);\n return () =>\n document.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n }, []);\n\n // Track the layout viewport width and enough host space for its own control.\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n const button = fullscreenButtonRef.current;\n const updateControlHeight = () => {\n setFullscreenControlHeight(\n button ? Math.ceil(button.offsetTop + button.offsetHeight) : 0\n );\n };\n if (typeof ResizeObserver === \"undefined\") {\n setContainerWidth(el.clientWidth);\n updateControlHeight();\n return;\n }\n const ro = new ResizeObserver((entries) => {\n const hostEntry = entries.find((entry) => entry.target === el);\n if (hostEntry) setContainerWidth(hostEntry.contentRect.width);\n updateControlHeight();\n });\n ro.observe(el);\n if (button) ro.observe(button);\n setContainerWidth(el.clientWidth);\n updateControlHeight();\n return () => ro.disconnect();\n }, [hideFullScreen]);\n\n // Keep a stable layout viewport for authored vh/vmin sizing, while the host\n // reserves only the measured content height. The iframe is top-aligned inside\n // the clipped host so a short card does not leave a slide-sized blank area.\n const contentModeStyle = useMemo<React.CSSProperties | undefined>(() => {\n if (isBlackboardMode || containerWidth === 0 || isFullscreen)\n return undefined;\n const minH = Math.round((containerWidth * 9) / 16);\n return { height: Math.max(contentHeight ?? minH, fullscreenControlHeight) };\n }, [\n isBlackboardMode,\n containerWidth,\n contentHeight,\n isFullscreen,\n fullscreenControlHeight,\n ]);\n\n const contentIframeHeight = contentModeStyle\n ? Math.max(Math.round((containerWidth * 9) / 16), contentHeight ?? 0)\n : undefined;\n\n const toggleFullscreen = () => {\n const target = containerRef.current || iframeRef.current;\n if (!target) return;\n if (document.fullscreenElement) {\n document.exitFullscreen().catch(() => {});\n return;\n }\n if (target.requestFullscreen) {\n target.requestFullscreen().catch(() => {});\n }\n };\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n\n root.render(\n <SandboxApp\n html={renderHtmlContent}\n locale={locale}\n dir={sandboxDirection}\n lang={sandboxLanguage}\n loadingText={loadingText}\n styleLoadingText={styleLoadingText}\n scriptLoadingText={scriptLoadingText}\n disableLoadingOverlay={disableLoadingOverlay}\n resetToken={resetToken}\n hasRootVhHeight={hasRootVhHeight}\n mode={mode}\n stretchRootHeight={shouldStretchRootHeight}\n enableScaling={shouldEnableScaling}\n />\n );\n\n // Schedule multiple measurements to catch async content (scripts, images, styles).\n initialPaintFrameRef.current = window.requestAnimationFrame(() => {\n updateHeightRef.current?.();\n if (shouldEnableScaling) {\n const iframeWin = iframeRef.current\n ?.contentWindow as ScalingWindow | null;\n iframeWin?.__mdf_triggerFitContent?.();\n }\n initialPaintFrameRef.current = null;\n });\n const t1 = setTimeout(() => updateHeightRef.current?.(), 100);\n const t2 = setTimeout(() => updateHeightRef.current?.(), 500);\n return () => {\n if (initialPaintFrameRef.current !== null) {\n window.cancelAnimationFrame(initialPaintFrameRef.current);\n initialPaintFrameRef.current = null;\n }\n clearTimeout(t1);\n clearTimeout(t2);\n };\n }, [\n renderHtmlContent,\n locale,\n sandboxDirection,\n sandboxLanguage,\n loadingText,\n styleLoadingText,\n scriptLoadingText,\n resetToken,\n disableLoadingOverlay,\n hasRootVhHeight,\n mode,\n shouldStretchRootHeight,\n shouldEnableScaling,\n ]);\n const containerClassName = [\n `w-full relative content-render-iframe-sandbox content-render-iframe-sandbox--${type}`,\n isBlackboardMode\n ? \"h-full overflow-auto flex flex-col\"\n : contentModeStyle\n ? \"overflow-hidden\"\n : \"aspect-[16/9] overflow-hidden flex items-center justify-center\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n ref={containerRef}\n dir={direction}\n lang={language}\n data-root-vh={hasRootVhHeight ? \"true\" : \"false\"}\n className={containerClassName}\n style={\n sandboxViewportHeight\n ? {\n height: sandboxViewportHeight,\n minHeight: sandboxViewportHeight,\n }\n : contentModeStyle\n }\n >\n {!hideFullScreen && (\n <button\n ref={fullscreenButtonRef}\n type=\"button\"\n dir={fullscreenControlDirection}\n onClick={toggleFullscreen}\n className={\n \"absolute top-2 end-2 z-50 p-1.5 bg-black/75 text-white rounded-md cursor-pointer\"\n }\n >\n {isFullscreen\n ? resolvedExitFullScreenButtonText\n : resolvedFullScreenButtonText}\n </button>\n )}\n {mode === \"blackboard\" && type === \"markdown\" ? (\n <div ref={setMarkdownContentContainerRef}>\n <ContentRender\n content={content}\n locale={locale}\n dir={direction}\n lang={language}\n disableSandboxLoadingOverlay={disableLoadingOverlay}\n />\n </div>\n ) : (\n <iframe\n ref={iframeRef}\n sandbox=\"allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox\"\n allow=\"fullscreen\"\n allowFullScreen\n className={[className, \"w-full h-full mx-auto my-auto block\"]\n .filter(Boolean)\n .join(\" \")}\n style={{\n height: sandboxViewportHeight ?? contentIframeHeight ?? \"100%\",\n minHeight: sandboxViewportHeight,\n margin: \"auto\",\n }}\n />\n )}\n </div>\n );\n};\n\nconst IframeSandbox: React.FC<IframeSandboxProps> = (props) => {\n const mode = props.mode ?? \"content\";\n const shouldEnableScaling = Boolean(\n props.enableScaling && mode === \"blackboard\" && props.type === \"sandbox\"\n );\n // The iframe shell captures these initialization-only values. Remounting the\n // inner instance keeps old and new React roots from sharing cleanup refs.\n const lifecycleKey = `${props.type}:${mode}:${shouldEnableScaling ? \"scaled\" : \"unscaled\"}`;\n\n return <IframeSandboxInstance key={lifecycleKey} {...props} />;\n};\n\nexport default IframeSandbox;\n"],"names":["blackboardVendorPromise","loadBlackboardVendor","COMPLETE_IMAGE_TAG_PATTERN","POST_IMAGE_STREAM_DEBOUNCE_MS","SANDBOX_INTERACTION_THROTTLE_MS","replaceRootScreenHeightToken","className","token","segments","replaceRootScreenHeightWithFullClass","html","enabled","match","tagStart","attrs","classMatch","nextClassName","IframeSandboxInstance","content","type","locale","lang","dir","loadingText","styleLoadingText","scriptLoadingText","fullScreenButtonText","exitFullScreenButtonText","hideFullScreen","mode","replaceRootScreenHeightWithFull","enableScaling","disableLoadingOverlay","localeTexts","getContentRenderLocaleTexts","direction","getMarkdownFlowDirection","language","getMarkdownFlowLanguage","resolvedFullScreenButtonText","resolvedExitFullScreenButtonText","containerRef","useRef","fullscreenButtonRef","sandboxLanguage","useDetachedLanguage","resolvedDirection","useResolvedDirection","markdownContainerRef","markdownContentRef","setMarkdownContentContainerRef","useCallback","node","markdownContentDirection","sandboxDirection","requestedDirectionRef","sandboxContentDirection","setSandboxContentDirection","useState","fullscreenControlDirection","iframeRef","rootRef","updateHeightRef","height","setHeight","contentHeight","setContentHeight","containerWidth","setContainerWidth","fullscreenControlHeight","setFullscreenControlHeight","isMeasuringContentRef","pendingHeightUpdateRef","lastSandboxInteractionTimeRef","resetToken","setResetToken","isFullscreen","setIsFullscreen","shouldInjectSandboxVendor","isBlackboardMode","shouldEnableScaling","shouldMeasureDynamicHeight","shouldProcessRootScreenHeight","prevHtmlRef","htmlContent","React","normalizedHtmlContent","originalRootHeightMeta","inspectViewportHeightFromHtmlRootString","EMPTY_ROOT_HEIGHT_META","shouldStretchRootHeight","renderHtmlContent","setRenderHtmlContent","prevIncomingHtmlRef","pendingHtmlRef","deferRenderTimerRef","initialPaintFrameRef","renderViewportHeightCssRef","emitSandboxInteraction","eventType","now","SANDBOX_INTERACTION_MESSAGE_SOURCE","SANDBOX_INTERACTION_MESSAGE_TYPE","useEffect","container","handleClick","clearDeferredRenderTimer","clearInitialPaintFrames","prevIncomingHtml","isAppendOnlyStream","containsCompleteImage","rootViewportHeightCss","hasRootVhHeight","sandboxViewportHeight","prev","iframe","doc","CJK_SAFE_SANS_FONT_FAMILY","shouldBridgeSandboxInteraction","handleSandboxClick","rootEl","root","createRoot","isDestroyed","getHeightInspectionNode","getSingleChildElement","childElements","resolveExplicitHeight","parentViewportHeight","precomputedViewportHeightCss","parsed","parseExplicitHeight","containerChildren","rootContentElement","runtimeViewportHeightCss","inspectViewportHeightFromNodeChain","runtimeViewportHeight","explicitPixelHeight","resolveExplicitHeightFromNodeChain","updateHeight","contentContainer","normalizeContentViewportMinHeight","cw","prevH","minH","maxH","measuredH","iframeWin","getInnerScrollableHeight","walk","el","style","oy","rect","child","i","nextH","next","scheduleHeightUpdate","bodyScrollH","htmlScrollH","rootScrollH","measuredHeight","explicitHeight","nextHeight","prevHeight","injectBlackboardLibraries","injectScalingSystem","hostElement","needsTailwindRefreshAfterHidden","isTailwindRefreshQueued","tailwindRefreshFrame","tailwindRefreshTimer","runPostTailwindRefreshLayout","isHostVisible","queueTailwindRefreshAfterHidden","refreshTailwindRuntime","sandboxContainer","canObserveResize","hostResizeObserver","entries","contentRect","hostWidth","hostHeight","resizeObserver","syncSandboxContentDirection","wrapper","view","nextDirection","currentDirection","mutationObserver","onFullscreenChange","button","updateControlHeight","ro","hostEntry","entry","contentModeStyle","useMemo","contentIframeHeight","toggleFullscreen","target","jsx","SandboxApp","t1","t2","containerClassName","jsxs","ContentRender","IframeSandbox","props","lifecycleKey"],"mappings":"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"}