@heycys/gallery 0.0.0-stage → 0.1.0

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 (785) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -2
  3. package/THIRD-PARTY-NOTICES.md +3253 -0
  4. package/assets/writing-preferences.md +107 -0
  5. package/bin/gallery.mjs +10 -0
  6. package/browser/editor/components/bookmark/icons.mjs +6 -0
  7. package/browser/editor/components/bookmark/index.mjs +80 -0
  8. package/browser/editor/components/bookmark/page.mjs +147 -0
  9. package/browser/editor/components/builders.mjs +19 -0
  10. package/browser/editor/components/callout/index.mjs +39 -0
  11. package/browser/editor/components/callout/page.mjs +13 -0
  12. package/browser/editor/components/code/index.mjs +327 -0
  13. package/browser/editor/components/code/page.mjs +561 -0
  14. package/browser/editor/components/colors.mjs +50 -0
  15. package/browser/editor/components/columns/index.mjs +104 -0
  16. package/browser/editor/components/columns/page.mjs +297 -0
  17. package/browser/editor/components/details/index.mjs +72 -0
  18. package/browser/editor/components/details/page.mjs +86 -0
  19. package/browser/editor/components/dialog/index.mjs +83 -0
  20. package/browser/editor/components/dialog/page.mjs +219 -0
  21. package/browser/editor/components/divider/index.mjs +48 -0
  22. package/browser/editor/components/embed/icons.mjs +11 -0
  23. package/browser/editor/components/embed/index.mjs +123 -0
  24. package/browser/editor/components/embed/page.mjs +309 -0
  25. package/browser/editor/components/figure/index.mjs +87 -0
  26. package/browser/editor/components/figure/page.mjs +33 -0
  27. package/browser/editor/components/file/icons.mjs +14 -0
  28. package/browser/editor/components/file/index.mjs +77 -0
  29. package/browser/editor/components/file/page.mjs +114 -0
  30. package/browser/editor/components/flowchart/add.mjs +123 -0
  31. package/browser/editor/components/flowchart/index.mjs +246 -0
  32. package/browser/editor/components/flowchart/page.mjs +453 -0
  33. package/browser/editor/components/heading/index.mjs +51 -0
  34. package/browser/editor/components/highlight/index.mjs +79 -0
  35. package/browser/editor/components/icon/index.mjs +57 -0
  36. package/browser/editor/components/icon/page.mjs +286 -0
  37. package/browser/editor/components/icons.mjs +45 -0
  38. package/browser/editor/components/image/crop.mjs +189 -0
  39. package/browser/editor/components/image/index.mjs +104 -0
  40. package/browser/editor/components/image/page.mjs +385 -0
  41. package/browser/editor/components/image/viewer.mjs +213 -0
  42. package/browser/editor/components/installed/index.mjs +133 -0
  43. package/browser/editor/components/installed/page.mjs +422 -0
  44. package/browser/editor/components/installed/served.mjs +35 -0
  45. package/browser/editor/components/kit.mjs +64 -0
  46. package/browser/editor/components/list/index.mjs +194 -0
  47. package/browser/editor/components/list/join.mjs +68 -0
  48. package/browser/editor/components/list/numbers.mjs +107 -0
  49. package/browser/editor/components/list/page.mjs +632 -0
  50. package/browser/editor/components/math/index.mjs +88 -0
  51. package/browser/editor/components/math/page.mjs +236 -0
  52. package/browser/editor/components/math/tex-logo.mjs +6 -0
  53. package/browser/editor/components/media/icons.mjs +19 -0
  54. package/browser/editor/components/media/page.mjs +162 -0
  55. package/browser/editor/components/media/parts.mjs +60 -0
  56. package/browser/editor/components/media/size.mjs +20 -0
  57. package/browser/editor/components/media/toolbar.mjs +37 -0
  58. package/browser/editor/components/media/write.mjs +7 -0
  59. package/browser/editor/components/pages.mjs +46 -0
  60. package/browser/editor/components/paragraph/index.mjs +43 -0
  61. package/browser/editor/components/paragraph/page.mjs +52 -0
  62. package/browser/editor/components/placeholder-bar.mjs +17 -0
  63. package/browser/editor/components/placeholder.mjs +128 -0
  64. package/browser/editor/components/quote/index.mjs +33 -0
  65. package/browser/editor/components/registry.mjs +833 -0
  66. package/browser/editor/components/rows.mjs +16 -0
  67. package/browser/editor/components/section/index.mjs +41 -0
  68. package/browser/editor/components/section/page.mjs +141 -0
  69. package/browser/editor/components/sheets/index.mjs +137 -0
  70. package/browser/editor/components/sheets/page.mjs +227 -0
  71. package/browser/editor/components/sheets/pills.mjs +226 -0
  72. package/browser/editor/components/table/grid.mjs +73 -0
  73. package/browser/editor/components/table/index.mjs +306 -0
  74. package/browser/editor/components/table/page.mjs +672 -0
  75. package/browser/editor/components/table/slots.mjs +41 -0
  76. package/browser/editor/components/widget/index.mjs +50 -0
  77. package/browser/editor/page/annotate/anchors.mjs +229 -0
  78. package/browser/editor/page/annotate/card.mjs +102 -0
  79. package/browser/editor/page/annotate/index.mjs +1629 -0
  80. package/browser/editor/page/at-menu/index.mjs +317 -0
  81. package/browser/editor/page/autosave.mjs +977 -0
  82. package/browser/editor/page/beside.mjs +21 -0
  83. package/browser/editor/page/block-info.mjs +63 -0
  84. package/browser/editor/page/block-menu/colors.mjs +82 -0
  85. package/browser/editor/page/block-menu/index.mjs +215 -0
  86. package/browser/editor/page/blocks.mjs +246 -0
  87. package/browser/editor/page/caret.mjs +679 -0
  88. package/browser/editor/page/chip-fills.mjs +126 -0
  89. package/browser/editor/page/clipboard/import/colors.mjs +192 -0
  90. package/browser/editor/page/clipboard/import/html.mjs +792 -0
  91. package/browser/editor/page/clipboard/import/inline.mjs +232 -0
  92. package/browser/editor/page/clipboard/import/languages.mjs +42 -0
  93. package/browser/editor/page/clipboard/import/markdown.mjs +760 -0
  94. package/browser/editor/page/clipboard/import/math.mjs +100 -0
  95. package/browser/editor/page/clipboard/import/office.mjs +245 -0
  96. package/browser/editor/page/clipboard/import/read.mjs +120 -0
  97. package/browser/editor/page/clipboard/import/rich.mjs +29 -0
  98. package/browser/editor/page/clipboard/import/to-blocks.mjs +290 -0
  99. package/browser/editor/page/clipboard/index.mjs +797 -0
  100. package/browser/editor/page/clipboard/own/blocks.mjs +202 -0
  101. package/browser/editor/page/clipboard/own/chart-keys.mjs +58 -0
  102. package/browser/editor/page/clipboard/own/describe.mjs +115 -0
  103. package/browser/editor/page/clipboard/own/export.mjs +167 -0
  104. package/browser/editor/page/clipboard/own/ids.mjs +39 -0
  105. package/browser/editor/page/clipboard/own/index.mjs +13 -0
  106. package/browser/editor/page/clipboard/own/rules.mjs +44 -0
  107. package/browser/editor/page/clipboard/own/selection.mjs +159 -0
  108. package/browser/editor/page/clipboard/own/writers.mjs +326 -0
  109. package/browser/editor/page/columns/index.mjs +360 -0
  110. package/browser/editor/page/commit.mjs +1798 -0
  111. package/browser/editor/page/conflicts.mjs +269 -0
  112. package/browser/editor/page/convert.mjs +830 -0
  113. package/browser/editor/page/core.mjs +1655 -0
  114. package/browser/editor/page/drag/drop.mjs +307 -0
  115. package/browser/editor/page/drag/index.mjs +335 -0
  116. package/browser/editor/page/drag/preview.mjs +121 -0
  117. package/browser/editor/page/edge-scroll.mjs +50 -0
  118. package/browser/editor/page/editor.mjs +1725 -0
  119. package/browser/editor/page/emoji-picker/emoji-tab.mjs +278 -0
  120. package/browser/editor/page/emoji-picker/glyph-html.mjs +26 -0
  121. package/browser/editor/page/emoji-picker/grid.mjs +79 -0
  122. package/browser/editor/page/emoji-picker/icon-tab.mjs +217 -0
  123. package/browser/editor/page/emoji-picker/icons.mjs +32 -0
  124. package/browser/editor/page/emoji-picker/index.mjs +164 -0
  125. package/browser/editor/page/emoji-picker/styles.mjs +2 -0
  126. package/browser/editor/page/emoji-picker/support.mjs +202 -0
  127. package/browser/editor/page/emoji-picker/upload.mjs +235 -0
  128. package/browser/editor/page/export-report.mjs +23 -0
  129. package/browser/editor/page/fills.mjs +60 -0
  130. package/browser/editor/page/find/index.mjs +107 -0
  131. package/browser/editor/page/flags.mjs +70 -0
  132. package/browser/editor/page/format-bar/bar.mjs +448 -0
  133. package/browser/editor/page/format-bar/brush.mjs +77 -0
  134. package/browser/editor/page/format-bar/colors.mjs +46 -0
  135. package/browser/editor/page/format-bar/index.mjs +404 -0
  136. package/browser/editor/page/formula/index.mjs +236 -0
  137. package/browser/editor/page/formula/panel.mjs +336 -0
  138. package/browser/editor/page/formula/symbols.mjs +156 -0
  139. package/browser/editor/page/frame.mjs +74 -0
  140. package/browser/editor/page/frames.mjs +196 -0
  141. package/browser/editor/page/geometry.mjs +400 -0
  142. package/browser/editor/page/gesture.mjs +45 -0
  143. package/browser/editor/page/handle/index.mjs +639 -0
  144. package/browser/editor/page/handle-sizes.mjs +14 -0
  145. package/browser/editor/page/hints/index.mjs +84 -0
  146. package/browser/editor/page/history.mjs +401 -0
  147. package/browser/editor/page/insert/index.mjs +243 -0
  148. package/browser/editor/page/kept.mjs +38 -0
  149. package/browser/editor/page/links/address.mjs +40 -0
  150. package/browser/editor/page/links/index.mjs +866 -0
  151. package/browser/editor/page/links/pages.mjs +131 -0
  152. package/browser/editor/page/links/views.mjs +369 -0
  153. package/browser/editor/page/look.mjs +65 -0
  154. package/browser/editor/page/made.mjs +24 -0
  155. package/browser/editor/page/margin.mjs +352 -0
  156. package/browser/editor/page/markdown/index.mjs +88 -0
  157. package/browser/editor/page/markdown/rules.mjs +33 -0
  158. package/browser/editor/page/marks.mjs +377 -0
  159. package/browser/editor/page/media-menu/index.mjs +158 -0
  160. package/browser/editor/page/menu.mjs +500 -0
  161. package/browser/editor/page/merge.mjs +100 -0
  162. package/browser/editor/page/notices.mjs +142 -0
  163. package/browser/editor/page/offered.mjs +32 -0
  164. package/browser/editor/page/outline/folds.mjs +52 -0
  165. package/browser/editor/page/outline/index.mjs +697 -0
  166. package/browser/editor/page/outline/list.mjs +172 -0
  167. package/browser/editor/page/outline/read.mjs +201 -0
  168. package/browser/editor/page/outline/strip.mjs +281 -0
  169. package/browser/editor/page/outline/tree.mjs +248 -0
  170. package/browser/editor/page/overlay-layer.mjs +227 -0
  171. package/browser/editor/page/overlays.mjs +205 -0
  172. package/browser/editor/page/own.mjs +28 -0
  173. package/browser/editor/page/pads.mjs +71 -0
  174. package/browser/editor/page/page-objects.mjs +105 -0
  175. package/browser/editor/page/panel.mjs +64 -0
  176. package/browser/editor/page/placement.mjs +58 -0
  177. package/browser/editor/page/post.mjs +41 -0
  178. package/browser/editor/page/present-links.mjs +50 -0
  179. package/browser/editor/page/quiet.mjs +48 -0
  180. package/browser/editor/page/resize/index.mjs +327 -0
  181. package/browser/editor/page/select-all/index.mjs +262 -0
  182. package/browser/editor/page/selection/delete.mjs +59 -0
  183. package/browser/editor/page/selection/index.mjs +157 -0
  184. package/browser/editor/page/selection/marquee.mjs +174 -0
  185. package/browser/editor/page/session.mjs +117 -0
  186. package/browser/editor/page/slash-menu/index.mjs +291 -0
  187. package/browser/editor/page/storage.mjs +48 -0
  188. package/browser/editor/page/sync-state.mjs +267 -0
  189. package/browser/editor/page/table/aligns.mjs +29 -0
  190. package/browser/editor/page/table/cell-bar.mjs +138 -0
  191. package/browser/editor/page/table/cells.mjs +527 -0
  192. package/browser/editor/page/table/icons.mjs +40 -0
  193. package/browser/editor/page/table/index.mjs +985 -0
  194. package/browser/editor/page/table/lists.mjs +187 -0
  195. package/browser/editor/page/table/widths.mjs +308 -0
  196. package/browser/editor/page/tex.mjs +32 -0
  197. package/browser/editor/page/text-select/index.mjs +656 -0
  198. package/browser/editor/page/tooltip.mjs +98 -0
  199. package/browser/editor/page/type-grid.mjs +82 -0
  200. package/browser/editor/page/typing/code-edges.mjs +228 -0
  201. package/browser/editor/page/typing/index.mjs +276 -0
  202. package/browser/editor/page/typing/leave.mjs +68 -0
  203. package/browser/editor/page/ui.mjs +160 -0
  204. package/browser/shared/annotations.mjs +571 -0
  205. package/browser/shared/code-folds.mjs +10 -0
  206. package/browser/shared/code-languages.mjs +70 -0
  207. package/browser/shared/code-lines.mjs +30 -0
  208. package/browser/shared/colors.mjs +28 -0
  209. package/browser/shared/component-catalog.mjs +559 -0
  210. package/browser/shared/components/bookmark.mjs +26 -0
  211. package/browser/shared/components/callout.mjs +7 -0
  212. package/browser/shared/components/chart.mjs +20 -0
  213. package/browser/shared/components/code.mjs +37 -0
  214. package/browser/shared/components/columns.mjs +16 -0
  215. package/browser/shared/components/details.mjs +15 -0
  216. package/browser/shared/components/dialog.mjs +28 -0
  217. package/browser/shared/components/diff.mjs +18 -0
  218. package/browser/shared/components/divider.mjs +6 -0
  219. package/browser/shared/components/embed.mjs +25 -0
  220. package/browser/shared/components/figure.mjs +14 -0
  221. package/browser/shared/components/file.mjs +23 -0
  222. package/browser/shared/components/heading.mjs +6 -0
  223. package/browser/shared/components/highlight.mjs +9 -0
  224. package/browser/shared/components/icon.mjs +18 -0
  225. package/browser/shared/components/image.mjs +39 -0
  226. package/browser/shared/components/index.mjs +342 -0
  227. package/browser/shared/components/installed.mjs +162 -0
  228. package/browser/shared/components/list.mjs +146 -0
  229. package/browser/shared/components/math.mjs +49 -0
  230. package/browser/shared/components/mention.mjs +33 -0
  231. package/browser/shared/components/page.mjs +37 -0
  232. package/browser/shared/components/paragraph.mjs +9 -0
  233. package/browser/shared/components/quote.mjs +6 -0
  234. package/browser/shared/components/section.mjs +8 -0
  235. package/browser/shared/components/sheets.mjs +80 -0
  236. package/browser/shared/components/state.mjs +20 -0
  237. package/browser/shared/components/table.mjs +49 -0
  238. package/browser/shared/components/text.mjs +14 -0
  239. package/browser/shared/components/widget.mjs +10 -0
  240. package/browser/shared/copy-ids.mjs +72 -0
  241. package/browser/shared/css-references.mjs +110 -0
  242. package/browser/shared/emoji/custom.mjs +91 -0
  243. package/browser/shared/emoji/data/LICENSE-mingcute.txt +202 -0
  244. package/browser/shared/emoji/data/LICENSE-tabler.txt +21 -0
  245. package/browser/shared/emoji/data/README.md +26 -0
  246. package/browser/shared/emoji/data/categories.json +1 -0
  247. package/browser/shared/emoji/data/icons.json +1 -0
  248. package/browser/shared/emoji/data/keywords-en.json +1 -0
  249. package/browser/shared/emoji/data/keywords-zh.json +1 -0
  250. package/browser/shared/emoji/data/names.json +1 -0
  251. package/browser/shared/emoji/data/positions.json +1 -0
  252. package/browser/shared/emoji/data/twemoji-index.json +1 -0
  253. package/browser/shared/emoji/data/twemoji-svg.bin +0 -0
  254. package/browser/shared/emoji/data.mjs +196 -0
  255. package/browser/shared/emoji/emoji.mjs +37 -0
  256. package/browser/shared/emoji/glyphs.mjs +134 -0
  257. package/browser/shared/emoji/icon-value.mjs +90 -0
  258. package/browser/shared/escape.mjs +20 -0
  259. package/browser/shared/export-wrap.mjs +89 -0
  260. package/browser/shared/files.mjs +33 -0
  261. package/browser/shared/html-tree.mjs +53 -0
  262. package/browser/shared/http.mjs +22 -0
  263. package/browser/shared/i18n/en.mjs +1164 -0
  264. package/browser/shared/i18n/index.mjs +132 -0
  265. package/browser/shared/ids.mjs +24 -0
  266. package/browser/shared/import-types.mjs +23 -0
  267. package/browser/shared/inline-spacing.mjs +97 -0
  268. package/browser/shared/layers.mjs +42 -0
  269. package/browser/shared/media.mjs +162 -0
  270. package/browser/shared/new-names.mjs +64 -0
  271. package/browser/shared/number-reading.mjs +92 -0
  272. package/browser/shared/old-names.mjs +143 -0
  273. package/browser/shared/page-address.mjs +140 -0
  274. package/browser/shared/page-links.mjs +86 -0
  275. package/browser/shared/paths.mjs +73 -0
  276. package/browser/shared/preferences.mjs +110 -0
  277. package/browser/shared/preview-server.mjs +247 -0
  278. package/browser/shared/qa-levels.mjs +93 -0
  279. package/browser/shared/reading-place.mjs +91 -0
  280. package/browser/shared/renamed-storage.mjs +220 -0
  281. package/browser/shared/reports.mjs +46 -0
  282. package/browser/shared/search.mjs +85 -0
  283. package/browser/shared/session.mjs +76 -0
  284. package/browser/shared/table-chart.mjs +113 -0
  285. package/browser/shared/table-hides.mjs +120 -0
  286. package/browser/shared/table-slots.mjs +75 -0
  287. package/browser/shared/words.mjs +23 -0
  288. package/browser/shared/workspace.mjs +535 -0
  289. package/browser/shared/writing-preferences.mjs +68 -0
  290. package/browser/shared/zoom.mjs +57 -0
  291. package/dist/chunk-2B5E4CDJ.mjs +2 -0
  292. package/dist/chunk-2PBALTR3.mjs +57 -0
  293. package/dist/chunk-342HXE3Q.mjs +2 -0
  294. package/dist/chunk-3LA3EMDE.mjs +15 -0
  295. package/dist/chunk-43B75J5T.mjs +2 -0
  296. package/dist/chunk-4K5KC6V2.mjs +2 -0
  297. package/dist/chunk-5FRMCDPY.mjs +16 -0
  298. package/dist/chunk-5L7RYZCL.mjs +2 -0
  299. package/dist/chunk-5LEK2CBS.mjs +2 -0
  300. package/dist/chunk-5OFN5AHC.mjs +2 -0
  301. package/dist/chunk-5SIYS5HN.mjs +2 -0
  302. package/dist/chunk-5TEK3RAD.mjs +2 -0
  303. package/dist/chunk-6CYG3Z4V.mjs +2 -0
  304. package/dist/chunk-6U2SLSDN.mjs +3 -0
  305. package/dist/chunk-742D2WWJ.mjs +19 -0
  306. package/dist/chunk-7GHT2UCA.mjs +15 -0
  307. package/dist/chunk-7QQBR7PB.mjs +2 -0
  308. package/dist/chunk-A55HN5OK.mjs +2 -0
  309. package/dist/chunk-ACOPDCNB.mjs +2 -0
  310. package/dist/chunk-AGDILNWB.mjs +2 -0
  311. package/dist/chunk-ATCJYAR4.mjs +2 -0
  312. package/dist/chunk-B3VTYBYR.mjs +960 -0
  313. package/dist/chunk-C564NU2H.mjs +77 -0
  314. package/dist/chunk-C7HWOBIF.mjs +2 -0
  315. package/dist/chunk-DB4WKGYF.mjs +7 -0
  316. package/dist/chunk-E7VYDG2X.mjs +2 -0
  317. package/dist/chunk-EUX7IC5J.mjs +48 -0
  318. package/dist/chunk-EVJ3BX3M.mjs +2 -0
  319. package/dist/chunk-EZY3WC6Z.mjs +15 -0
  320. package/dist/chunk-FQGQH4KM.mjs +2 -0
  321. package/dist/chunk-G7TOXONE.mjs +6 -0
  322. package/dist/chunk-GPF4YWWB.mjs +9 -0
  323. package/dist/chunk-GRAXKKG4.mjs +2 -0
  324. package/dist/chunk-GYQV7Y4J.mjs +120 -0
  325. package/dist/chunk-HMHK3EQ6.mjs +2 -0
  326. package/dist/chunk-HQQMJCQJ.mjs +10 -0
  327. package/dist/chunk-HYMEEXKN.mjs +4 -0
  328. package/dist/chunk-IERUOGC3.mjs +6 -0
  329. package/dist/chunk-ITNLYXXV.mjs +3 -0
  330. package/dist/chunk-L4DVONOG.mjs +2 -0
  331. package/dist/chunk-LAE5NQ4B.mjs +2 -0
  332. package/dist/chunk-LC7YNQFG.mjs +2 -0
  333. package/dist/chunk-LHTFLRB6.mjs +4 -0
  334. package/dist/chunk-LKX55H76.mjs +2 -0
  335. package/dist/chunk-MAFIGVXY.mjs +2 -0
  336. package/dist/chunk-NFIBI4IP.mjs +26 -0
  337. package/dist/chunk-NSKUTQ5J.mjs +5 -0
  338. package/dist/chunk-O52JMOCZ.mjs +2 -0
  339. package/dist/chunk-P2CAZPDP.mjs +3 -0
  340. package/dist/chunk-QAIHRH3I.mjs +13 -0
  341. package/dist/chunk-QMQUXTU4.mjs +12 -0
  342. package/dist/chunk-QR6A54KJ.mjs +3 -0
  343. package/dist/chunk-QVWVFC5K.mjs +6 -0
  344. package/dist/chunk-QYKCJ7FG.mjs +8 -0
  345. package/dist/chunk-QZY6Q64C.mjs +2 -0
  346. package/dist/chunk-TDQP3DKQ.mjs +10 -0
  347. package/dist/chunk-TMYZB6AV.mjs +2 -0
  348. package/dist/chunk-TX6JH7TR.mjs +2 -0
  349. package/dist/chunk-U3SSPL4K.mjs +8 -0
  350. package/dist/chunk-UH4SIXTR.mjs +2 -0
  351. package/dist/chunk-UNUEWH4S.mjs +2 -0
  352. package/dist/chunk-UXUK4PMC.mjs +27 -0
  353. package/dist/chunk-V4CPWKMZ.mjs +2 -0
  354. package/dist/chunk-V6XZ4VIR.mjs +2 -0
  355. package/dist/chunk-VACRB2NE.mjs +3 -0
  356. package/dist/chunk-W63L7367.mjs +7 -0
  357. package/dist/chunk-W7CXPCRV.mjs +6 -0
  358. package/dist/chunk-W7XHE4CT.mjs +2 -0
  359. package/dist/chunk-XINNG4F2.mjs +4 -0
  360. package/dist/chunk-Y34NR5JL.mjs +2 -0
  361. package/dist/chunk-YEY3RSFQ.mjs +2 -0
  362. package/dist/chunk-YL2DPWVS.mjs +4 -0
  363. package/dist/chunk-YXAUQPVK.mjs +8 -0
  364. package/dist/chunk-YZ5Z6H4W.mjs +4 -0
  365. package/dist/chunk-Z52HTUW7.mjs +4 -0
  366. package/dist/chunk-ZBIM6ARY.mjs +216 -0
  367. package/dist/cli.mjs +2 -0
  368. package/dist/server.mjs +2 -0
  369. package/dist/worker.mjs +5 -0
  370. package/kit/charts.js +355 -0
  371. package/kit/code.js +164 -0
  372. package/kit/dialogs.js +157 -0
  373. package/kit/math.js +1988 -0
  374. package/kit/report.css +2821 -0
  375. package/kit/runtime.js +1707 -0
  376. package/kit/sheets.js +123 -0
  377. package/kit/state.js +217 -0
  378. package/kit/tables.js +1449 -0
  379. package/kit/tokens.js +29 -0
  380. package/kit/ui.js +561 -0
  381. package/package.json +41 -4
  382. package/release.json +25 -0
  383. package/sdk/column-widths.d.ts +56 -0
  384. package/sdk/doc-charts.d.ts +82 -0
  385. package/sdk/doc-code.d.ts +28 -0
  386. package/sdk/doc-dialogs.d.ts +4 -0
  387. package/sdk/doc-kit.d.ts +141 -0
  388. package/sdk/doc-math.d.ts +3 -0
  389. package/sdk/doc-sheets.d.ts +15 -0
  390. package/sdk/doc-state.d.ts +41 -0
  391. package/sdk/doc-tables.d.ts +24 -0
  392. package/sdk/doc-tokens.d.ts +22 -0
  393. package/sdk/index.d.ts +30 -0
  394. package/skill/SKILL.md +138 -0
  395. package/skill/agents/openai.yaml +5 -0
  396. package/skill/references/building-components.md +327 -0
  397. package/skill/references/example-report.html +356 -0
  398. package/skill/references/writing-html.md +187 -0
  399. package/skill/sdk/column-widths.d.ts +56 -0
  400. package/skill/sdk/doc-charts.d.ts +82 -0
  401. package/skill/sdk/doc-code.d.ts +28 -0
  402. package/skill/sdk/doc-dialogs.d.ts +4 -0
  403. package/skill/sdk/doc-kit.d.ts +141 -0
  404. package/skill/sdk/doc-math.d.ts +3 -0
  405. package/skill/sdk/doc-sheets.d.ts +15 -0
  406. package/skill/sdk/doc-state.d.ts +41 -0
  407. package/skill/sdk/doc-tables.d.ts +24 -0
  408. package/skill/sdk/doc-tokens.d.ts +22 -0
  409. package/skill/sdk/index.d.ts +30 -0
  410. package/starter/doc.html +21 -0
  411. package/starter/doc.json +5 -0
  412. package/vendor/d3.v7.9.0.min.js +2 -0
  413. package/vendor/katex/auto-render.min.js +1 -0
  414. package/vendor/katex/contrib/mhchem.min.js +1 -0
  415. package/vendor/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  416. package/vendor/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  417. package/vendor/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  418. package/vendor/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  419. package/vendor/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  420. package/vendor/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
  421. package/vendor/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  422. package/vendor/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
  423. package/vendor/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
  424. package/vendor/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  425. package/vendor/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
  426. package/vendor/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  427. package/vendor/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  428. package/vendor/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  429. package/vendor/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
  430. package/vendor/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  431. package/vendor/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  432. package/vendor/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  433. package/vendor/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  434. package/vendor/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  435. package/vendor/katex/katex.min.css +1 -0
  436. package/vendor/katex/katex.min.js +1 -0
  437. package/vendor/pdfjs/LICENSE +177 -0
  438. package/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  439. package/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  440. package/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
  441. package/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  442. package/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  443. package/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
  444. package/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  445. package/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  446. package/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  447. package/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  448. package/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  449. package/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  450. package/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  451. package/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  452. package/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  453. package/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
  454. package/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  455. package/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  456. package/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
  457. package/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  458. package/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  459. package/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  460. package/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  461. package/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  462. package/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  463. package/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  464. package/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  465. package/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  466. package/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  467. package/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  468. package/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  469. package/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  470. package/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  471. package/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  472. package/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  473. package/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  474. package/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  475. package/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  476. package/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  477. package/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  478. package/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  479. package/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  480. package/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  481. package/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  482. package/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  483. package/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  484. package/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
  485. package/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
  486. package/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  487. package/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  488. package/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  489. package/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  490. package/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  491. package/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  492. package/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  493. package/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
  494. package/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  495. package/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  496. package/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  497. package/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  498. package/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
  499. package/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  500. package/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
  501. package/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
  502. package/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
  503. package/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  504. package/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  505. package/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
  506. package/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  507. package/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  508. package/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
  509. package/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
  510. package/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  511. package/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  512. package/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  513. package/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  514. package/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  515. package/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  516. package/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  517. package/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  518. package/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
  519. package/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
  520. package/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  521. package/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  522. package/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  523. package/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  524. package/vendor/pdfjs/cmaps/H.bcmap +0 -0
  525. package/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  526. package/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  527. package/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  528. package/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  529. package/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  530. package/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  531. package/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  532. package/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  533. package/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  534. package/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  535. package/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  536. package/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  537. package/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
  538. package/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
  539. package/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  540. package/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  541. package/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
  542. package/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  543. package/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  544. package/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
  545. package/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  546. package/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  547. package/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  548. package/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  549. package/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  550. package/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  551. package/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
  552. package/vendor/pdfjs/cmaps/LICENSE +36 -0
  553. package/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
  554. package/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
  555. package/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  556. package/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  557. package/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
  558. package/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  559. package/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  560. package/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  561. package/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  562. package/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  563. package/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  564. package/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  565. package/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  566. package/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  567. package/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  568. package/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  569. package/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  570. package/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  571. package/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  572. package/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  573. package/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  574. package/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  575. package/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  576. package/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  577. package/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  578. package/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  579. package/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  580. package/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  581. package/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  582. package/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  583. package/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  584. package/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  585. package/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  586. package/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  587. package/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  588. package/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  589. package/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  590. package/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  591. package/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  592. package/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  593. package/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  594. package/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  595. package/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  596. package/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  597. package/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  598. package/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  599. package/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  600. package/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  601. package/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  602. package/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  603. package/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  604. package/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  605. package/vendor/pdfjs/cmaps/V.bcmap +0 -0
  606. package/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  607. package/vendor/pdfjs/legacy/build/pdf.min.mjs +27 -0
  608. package/vendor/pdfjs/legacy/build/pdf.worker.min.mjs +27 -0
  609. package/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
  610. package/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
  611. package/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
  612. package/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  613. package/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
  614. package/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
  615. package/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
  616. package/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  617. package/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
  618. package/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
  619. package/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
  620. package/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +363 -0
  621. package/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
  622. package/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  623. package/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
  624. package/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
  625. package/vendor/types/@types/d3/LICENSE +21 -0
  626. package/vendor/types/@types/d3/index.d.ts +39 -0
  627. package/vendor/types/@types/d3/package.json +81 -0
  628. package/vendor/types/@types/d3-array/LICENSE +21 -0
  629. package/vendor/types/@types/d3-array/index.d.ts +1118 -0
  630. package/vendor/types/@types/d3-array/package.json +56 -0
  631. package/vendor/types/@types/d3-axis/LICENSE +21 -0
  632. package/vendor/types/@types/d3-axis/index.d.ts +293 -0
  633. package/vendor/types/@types/d3-axis/package.json +47 -0
  634. package/vendor/types/@types/d3-brush/LICENSE +21 -0
  635. package/vendor/types/@types/d3-brush/index.d.ts +255 -0
  636. package/vendor/types/@types/d3-brush/package.json +42 -0
  637. package/vendor/types/@types/d3-chord/LICENSE +21 -0
  638. package/vendor/types/@types/d3-chord/index.d.ts +471 -0
  639. package/vendor/types/@types/d3-chord/package.json +40 -0
  640. package/vendor/types/@types/d3-color/LICENSE +21 -0
  641. package/vendor/types/@types/d3-color/index.d.ts +669 -0
  642. package/vendor/types/@types/d3-color/package.json +55 -0
  643. package/vendor/types/@types/d3-contour/LICENSE +21 -0
  644. package/vendor/types/@types/d3-contour/index.d.ts +222 -0
  645. package/vendor/types/@types/d3-contour/package.json +38 -0
  646. package/vendor/types/@types/d3-delaunay/LICENSE +21 -0
  647. package/vendor/types/@types/d3-delaunay/index.d.ts +316 -0
  648. package/vendor/types/@types/d3-delaunay/package.json +30 -0
  649. package/vendor/types/@types/d3-dispatch/LICENSE +21 -0
  650. package/vendor/types/@types/d3-dispatch/index.d.ts +96 -0
  651. package/vendor/types/@types/d3-dispatch/package.json +51 -0
  652. package/vendor/types/@types/d3-drag/LICENSE +21 -0
  653. package/vendor/types/@types/d3-drag/index.d.ts +395 -0
  654. package/vendor/types/@types/d3-drag/package.json +42 -0
  655. package/vendor/types/@types/d3-dsv/LICENSE +21 -0
  656. package/vendor/types/@types/d3-dsv/index.d.ts +482 -0
  657. package/vendor/types/@types/d3-dsv/package.json +45 -0
  658. package/vendor/types/@types/d3-ease/LICENSE +21 -0
  659. package/vendor/types/@types/d3-ease/index.d.ts +316 -0
  660. package/vendor/types/@types/d3-ease/package.json +40 -0
  661. package/vendor/types/@types/d3-fetch/LICENSE +21 -0
  662. package/vendor/types/@types/d3-fetch/index.d.ts +282 -0
  663. package/vendor/types/@types/d3-fetch/package.json +37 -0
  664. package/vendor/types/@types/d3-force/LICENSE +21 -0
  665. package/vendor/types/@types/d3-force/index.d.ts +899 -0
  666. package/vendor/types/@types/d3-force/package.json +45 -0
  667. package/vendor/types/@types/d3-format/LICENSE +21 -0
  668. package/vendor/types/@types/d3-format/index.d.ts +337 -0
  669. package/vendor/types/@types/d3-format/package.json +45 -0
  670. package/vendor/types/@types/d3-geo/LICENSE +21 -0
  671. package/vendor/types/@types/d3-geo/index.d.ts +1371 -0
  672. package/vendor/types/@types/d3-geo/package.json +48 -0
  673. package/vendor/types/@types/d3-hierarchy/LICENSE +21 -0
  674. package/vendor/types/@types/d3-hierarchy/index.d.ts +928 -0
  675. package/vendor/types/@types/d3-hierarchy/package.json +50 -0
  676. package/vendor/types/@types/d3-interpolate/LICENSE +21 -0
  677. package/vendor/types/@types/d3-interpolate/index.d.ts +387 -0
  678. package/vendor/types/@types/d3-interpolate/package.json +47 -0
  679. package/vendor/types/@types/d3-path/LICENSE +21 -0
  680. package/vendor/types/@types/d3-path/index.d.ts +108 -0
  681. package/vendor/types/@types/d3-path/package.json +41 -0
  682. package/vendor/types/@types/d3-polygon/LICENSE +21 -0
  683. package/vendor/types/@types/d3-polygon/index.d.ts +41 -0
  684. package/vendor/types/@types/d3-polygon/package.json +40 -0
  685. package/vendor/types/@types/d3-quadtree/LICENSE +21 -0
  686. package/vendor/types/@types/d3-quadtree/index.d.ts +204 -0
  687. package/vendor/types/@types/d3-quadtree/package.json +45 -0
  688. package/vendor/types/@types/d3-random/LICENSE +21 -0
  689. package/vendor/types/@types/d3-random/index.d.ts +313 -0
  690. package/vendor/types/@types/d3-random/package.json +41 -0
  691. package/vendor/types/@types/d3-scale/LICENSE +21 -0
  692. package/vendor/types/@types/d3-scale/index.d.ts +2669 -0
  693. package/vendor/types/@types/d3-scale/package.json +53 -0
  694. package/vendor/types/@types/d3-scale-chromatic/LICENSE +21 -0
  695. package/vendor/types/@types/d3-scale-chromatic/index.d.ts +520 -0
  696. package/vendor/types/@types/d3-scale-chromatic/package.json +46 -0
  697. package/vendor/types/@types/d3-selection/LICENSE +21 -0
  698. package/vendor/types/@types/d3-selection/index.d.ts +1210 -0
  699. package/vendor/types/@types/d3-selection/package.json +56 -0
  700. package/vendor/types/@types/d3-shape/LICENSE +21 -0
  701. package/vendor/types/@types/d3-shape/index.d.ts +2792 -0
  702. package/vendor/types/@types/d3-shape/package.json +53 -0
  703. package/vendor/types/@types/d3-time/LICENSE +21 -0
  704. package/vendor/types/@types/d3-time/index.d.ts +697 -0
  705. package/vendor/types/@types/d3-time/package.json +46 -0
  706. package/vendor/types/@types/d3-time-format/LICENSE +21 -0
  707. package/vendor/types/@types/d3-time-format/index.d.ts +202 -0
  708. package/vendor/types/@types/d3-time-format/package.json +40 -0
  709. package/vendor/types/@types/d3-timer/LICENSE +21 -0
  710. package/vendor/types/@types/d3-timer/index.d.ts +68 -0
  711. package/vendor/types/@types/d3-timer/package.json +45 -0
  712. package/vendor/types/@types/d3-transition/LICENSE +21 -0
  713. package/vendor/types/@types/d3-transition/index.d.ts +664 -0
  714. package/vendor/types/@types/d3-transition/package.json +47 -0
  715. package/vendor/types/@types/d3-zoom/LICENSE +21 -0
  716. package/vendor/types/@types/d3-zoom/index.d.ts +611 -0
  717. package/vendor/types/@types/d3-zoom/package.json +48 -0
  718. package/vendor/types/@types/geojson/LICENSE +21 -0
  719. package/vendor/types/@types/geojson/index.d.ts +202 -0
  720. package/vendor/types/@types/geojson/package.json +46 -0
  721. package/vendor/typescript/LICENSE.txt +55 -0
  722. package/vendor/typescript/lib.decorators.d.ts +384 -0
  723. package/vendor/typescript/lib.decorators.legacy.d.ts +22 -0
  724. package/vendor/typescript/lib.dom.d.ts +39429 -0
  725. package/vendor/typescript/lib.dom.iterable.d.ts +571 -0
  726. package/vendor/typescript/lib.es2015.collection.d.ts +147 -0
  727. package/vendor/typescript/lib.es2015.core.d.ts +597 -0
  728. package/vendor/typescript/lib.es2015.d.ts +28 -0
  729. package/vendor/typescript/lib.es2015.generator.d.ts +77 -0
  730. package/vendor/typescript/lib.es2015.iterable.d.ts +605 -0
  731. package/vendor/typescript/lib.es2015.promise.d.ts +81 -0
  732. package/vendor/typescript/lib.es2015.proxy.d.ts +128 -0
  733. package/vendor/typescript/lib.es2015.reflect.d.ts +144 -0
  734. package/vendor/typescript/lib.es2015.symbol.d.ts +46 -0
  735. package/vendor/typescript/lib.es2015.symbol.wellknown.d.ts +326 -0
  736. package/vendor/typescript/lib.es2016.array.include.d.ts +116 -0
  737. package/vendor/typescript/lib.es2016.d.ts +21 -0
  738. package/vendor/typescript/lib.es2016.intl.d.ts +31 -0
  739. package/vendor/typescript/lib.es2017.arraybuffer.d.ts +21 -0
  740. package/vendor/typescript/lib.es2017.d.ts +26 -0
  741. package/vendor/typescript/lib.es2017.date.d.ts +31 -0
  742. package/vendor/typescript/lib.es2017.intl.d.ts +44 -0
  743. package/vendor/typescript/lib.es2017.object.d.ts +49 -0
  744. package/vendor/typescript/lib.es2017.sharedmemory.d.ts +135 -0
  745. package/vendor/typescript/lib.es2017.string.d.ts +45 -0
  746. package/vendor/typescript/lib.es2017.typedarrays.d.ts +53 -0
  747. package/vendor/typescript/lib.es2018.asyncgenerator.d.ts +77 -0
  748. package/vendor/typescript/lib.es2018.asynciterable.d.ts +53 -0
  749. package/vendor/typescript/lib.es2018.d.ts +24 -0
  750. package/vendor/typescript/lib.es2018.intl.d.ts +83 -0
  751. package/vendor/typescript/lib.es2018.promise.d.ts +30 -0
  752. package/vendor/typescript/lib.es2018.regexp.d.ts +37 -0
  753. package/vendor/typescript/lib.es2019.array.d.ts +79 -0
  754. package/vendor/typescript/lib.es2019.d.ts +24 -0
  755. package/vendor/typescript/lib.es2019.intl.d.ts +23 -0
  756. package/vendor/typescript/lib.es2019.object.d.ts +33 -0
  757. package/vendor/typescript/lib.es2019.string.d.ts +37 -0
  758. package/vendor/typescript/lib.es2019.symbol.d.ts +24 -0
  759. package/vendor/typescript/lib.es2020.bigint.d.ts +765 -0
  760. package/vendor/typescript/lib.es2020.d.ts +27 -0
  761. package/vendor/typescript/lib.es2020.date.d.ts +42 -0
  762. package/vendor/typescript/lib.es2020.intl.d.ts +474 -0
  763. package/vendor/typescript/lib.es2020.number.d.ts +28 -0
  764. package/vendor/typescript/lib.es2020.promise.d.ts +47 -0
  765. package/vendor/typescript/lib.es2020.sharedmemory.d.ts +99 -0
  766. package/vendor/typescript/lib.es2020.string.d.ts +44 -0
  767. package/vendor/typescript/lib.es2020.symbol.wellknown.d.ts +41 -0
  768. package/vendor/typescript/lib.es2021.d.ts +23 -0
  769. package/vendor/typescript/lib.es2021.intl.d.ts +166 -0
  770. package/vendor/typescript/lib.es2021.promise.d.ts +48 -0
  771. package/vendor/typescript/lib.es2021.string.d.ts +33 -0
  772. package/vendor/typescript/lib.es2021.weakref.d.ts +78 -0
  773. package/vendor/typescript/lib.es2022.array.d.ts +121 -0
  774. package/vendor/typescript/lib.es2022.d.ts +25 -0
  775. package/vendor/typescript/lib.es2022.error.d.ts +75 -0
  776. package/vendor/typescript/lib.es2022.intl.d.ts +145 -0
  777. package/vendor/typescript/lib.es2022.object.d.ts +26 -0
  778. package/vendor/typescript/lib.es2022.regexp.d.ts +39 -0
  779. package/vendor/typescript/lib.es2022.string.d.ts +25 -0
  780. package/vendor/typescript/lib.es5.d.ts +4601 -0
  781. package/vendor/typescript/package.json +4 -0
  782. package/vendor/typescript/typescript.js +446 -0
  783. package/web/assets/index-B6Ai3wsa.js +13 -0
  784. package/web/assets/index-SYPC3EZy.css +1 -0
  785. package/web/index.html +14 -0
@@ -0,0 +1,792 @@
1
+ import { newDomNames } from "../../../../shared/old-names.mjs";
2
+ import { convertRenderedMath } from "./math.mjs";
3
+ import { languageFromFence } from "./languages.mjs";
4
+ import { NOTION_COLOR_NAMES, backgroundColor, textColor } from "./colors.mjs";
5
+ import { normalize, spec } from "./rich.mjs";
6
+
7
+ // Pasted HTML as block specs or rich text (Notion 760354 htmlHelpers, notion-lite html-import.js;
8
+ // read.mjs decides which, after Notion 860313).
9
+ // parseClipboardHTML(html) the HTML in a document of its own (no scripts run, no pictures
10
+ // load), formulas a page drew made formula marks (math.mjs), cleaned
11
+ // as Notion's DOMPurify does, in a div; a new copy each call; the kit's
12
+ // old names (a page or an export made before 2026-10-26) new (newDomNames)
13
+ // normalizeHTML(root, { inline }) 760354 J, in place: Slack's emoji pictures as their :name: text; Notion's
14
+ // block-color-* classes as color marks; <br> in a <p> splits it; first pass: Google Sheets'
15
+ // wrapper, whitespace-only text, meta / style / script / head / title go, font-size ≥ 24px (or
16
+ // > 2em) makes an h1, line-through / italic / bold (≥ 500) styles wrap del / em / strong, b →
17
+ // strong, i → em, a font-weight: normal strong (Google Docs' wrapper) → span, section / article
18
+ // → div, display: inline divs → span, checkboxes → "[x] " / "[ ] ", a table of one cell a row
19
+ // (layout) → its contents and dividers, a ul right in a ul moves into the li before it, style and
20
+ // dir go, plain spans unwrapped; second pass: a container of only h1s (or h2s) one heading,
21
+ // empty divs / spans go, p / div holding blocks unwrapped; loose text at the top in <p> (not
22
+ // inline).
23
+ // htmlToBlocks(root) 760354 U (aH): normalized, element by element as blocks (blockOf)
24
+ // htmlToRichText(root) 760354 Q (Hw): normalized, as one rich text (pasted in text)
25
+ // containsRichFormatting(root) 760354 X (HZ): any element but span / div / p (or code, columns,
26
+ // colors, formulas); without, the HTML is pasted as plain text
27
+ // Blocks (blockOf, in this order): hr → divider; h* → heading 1 / 2 / 3 / 4 (its pictures after it);
28
+ // pre / code / div.sourceCode → code (language from a language-x class or a language's name; a
29
+ // figure's figcaption its caption); data-notion-callout → callout; blockquote → quote (its first
30
+ // node its text, the rest its blocks); details → toggle; data-notion-tab-container → tabs; table →
31
+ // table (row and column spans spread into empty cells; a first row all th a header row, every row
32
+ // starting with th a header column); data-notion-column-list → columns (8 at most); the kit's
33
+ // ol.doc-flow → report_flow of report_step (besides Notion's: flowchartBlock); ul / ol → their
34
+ // li; li, or text starting "[x]", "[ ]", "-", "*", "•" → list item / to-do (its first node and inline
35
+ // nodes its text, the rest its blocks); img → image (700 wide at most, captioned by data-caption or a
36
+ // figcaption); empty download links, video, audio, iframe → embed; data-notion-equation →
37
+ // equation; any other element with text → text (its pictures and list items after it).
38
+ // Inline (richTextOf): heading text bold (as one rich text); strong / em / u / code·pre / del·strike·s
39
+ // → b / i / _ / c / s; the nearest a's href → a; Notion's colors → h; Notion's inline formulas →
40
+ // e; control and zero-width characters dropped (247438 tI); 100,000 characters at most. stripText
41
+ // (headings, items): "[ ] ", "[x] " and a leading "-", "*", "•" go, runs of spaces one.
42
+ // Left out as the page has no such block: page, user and date mentions, comments, link previews,
43
+ // tables of contents; video and audio are embeds; toggle headings are toggles.
44
+ // Besides Notion's: formulas a page drew (math.mjs); colors (feishu-lite, colors.mjs): with
45
+ // `colors` "nearest" (Word, Google Docs, Notion), colors in styles become the page's nearest, with
46
+ // "exact" (any page) only the page's own, with either the kit's doc-text-* / doc-highlight-*
47
+ // classes; without (null), as Notion.
48
+
49
+ /** Notion's own attributes in its HTML (826191 l). */
50
+ export const ATTR = {
51
+ highlight: "data-notion-highlight", backgroundHighlight: "data-notion-background-highlight", inlineEquation: "data-notion-inline-equation",
52
+ comment: "data-notion-block-comment-id", code: "data-notion-code-syntax", callout: "data-notion-callout", calloutIcon: "data-notion-callout-icon",
53
+ calloutBackground: "data-notion-callout-background", toc: "data-notion-toc", file: "data-notion-file", fileAlias: "data-notion-file-alias",
54
+ columnList: "data-notion-column-list", column: "data-notion-column-ratio", image: "data-notion-image", video: "data-notion-video", audio: "data-notion-audio",
55
+ equation: "data-notion-equation", linkPreview: "data-notion-link-preview", embed: "data-notion-embed", tabContainer: "data-notion-tab-container", tabPage: "data-notion-tab-page",
56
+ };
57
+ const INLINE = new Set(["a", "strong", "em", "code", "del", "s", "span", "time", "sup", "sub"]); // 760354 u
58
+ const REMOVED = new Set(["meta", "style", "script", "head", "title"]); // 760354 p
59
+ const HEADINGS = ["h1", "h2", "h3", "h4", "h5", "h6"];
60
+ const BULLETS = ["•", "◦", "▪"]; // 760354 M
61
+ const SOURCE_CODE = "sourceCode";
62
+ const BLANK_LINES = /^( |\t)*(\n)+( |\t)*$/;
63
+ const TODO_CHECKED = /^\[x\].*/;
64
+ const TODO_EMPTY = /^\[ \].*/;
65
+ const BULLET_TEXT = /^[-*•].*/; // 760354 q / j / H
66
+ // 247438 rD: characters pasted text loses (controls, line and paragraph separators, zero-width spaces, tags, lone surrogates).
67
+ const BAD_CHAR = /[\x00-\x08\x0b-\x1f\u2028\u2029\u200b\u{e0000}-\u{e007f}\ud800-\udfff]/gu;
68
+ const clean = (text) => text.replace(BAD_CHAR, "");
69
+ // 760354 K: the colors Notion knows (the page's nine).
70
+ const COLORS = new Set(["default", ...NOTION_COLOR_NAMES].flatMap((c) => [c, `${c}_background`]));
71
+ const color = (value) => (COLORS.has(value) ? value : undefined);
72
+
73
+ const tagOf = (node) => (node?.nodeType === 1 ? node.tagName.toLowerCase() : "");
74
+ const isElement = (node, ...tags) => node?.nodeType === 1 && (!tags.length || tags.includes(tagOf(node)));
75
+ const isInline = (node) => node.nodeType === 3 || INLINE.has(tagOf(node)); // 760354 C
76
+ const ancestors = (node) => {
77
+ const out = [];
78
+ for (let p = node.parentNode; p; p = p.parentNode) out.push(p);
79
+ return out;
80
+ };
81
+ const listDepth = (node) => ancestors(node).filter((a) => isElement(a, "ul", "ol")).length; // 760354 S
82
+ // The kit's flowchart (步骤流程图, ol.doc-flow) and its steps, as a reader's page or an exported
83
+ // report has them: copied from one, a flowchart again (flowchartBlock).
84
+ const FLOW = "doc-flow";
85
+ const isFlowchart = (node) => isElement(node, "ol") && node.classList.contains(FLOW);
86
+ const isStep = (node) => isElement(node, "li") && isFlowchart(node.parentNode);
87
+ const KIT_COLOR = /^doc-(text|highlight)-[a-z]+$/;
88
+
89
+ // ---------- 760354 J: normalizing ----------
90
+
91
+ function retag(element, tag) {
92
+ const next = element.ownerDocument.createElement(tag);
93
+ while (element.firstChild) next.appendChild(element.firstChild);
94
+ for (const a of [...element.attributes].reverse()) next.setAttribute(a.name, a.value);
95
+ element.parentNode?.replaceChild(next, element);
96
+ return next;
97
+ }
98
+ function wrapInside(element, tag) {
99
+ const inner = element.ownerDocument.createElement(tag);
100
+ while (element.firstChild) inner.appendChild(element.firstChild);
101
+ element.appendChild(inner);
102
+ }
103
+ function unwrap(element) {
104
+ const moved = [];
105
+ let after = element;
106
+ while (element.firstChild) {
107
+ const child = element.firstChild;
108
+ moved.push(child);
109
+ element.parentNode?.insertBefore(child, after.nextSibling);
110
+ after = child;
111
+ }
112
+ const parent = element.parentNode;
113
+ if (parent) {
114
+ parent.removeChild(element);
115
+ parent.normalize();
116
+ }
117
+ return moved;
118
+ }
119
+ // G: a container that may be unwrapped or merged.
120
+ function plainContainer(element) {
121
+ return isElement(element) && element.childNodes.length > 0 && !["blockquote", "details", "figure", "summary"].includes(tagOf(element))
122
+ && ![ATTR.highlight, ATTR.columnList, ATTR.column, ATTR.callout, ATTR.equation, ATTR.tabContainer, ATTR.tabPage].some((a) => element.hasAttribute(a));
123
+ }
124
+ const BLOCK_CHILD = /^(p|div|img|ul|ol|table|hr|video|iframe|figure|details|pre|blockquote|h[1-6])$/;
125
+
126
+ function firstPass(node, queue) {
127
+ let el = node;
128
+ if (isElement(el, "google-sheets-html-origin") && el.parentNode) {
129
+ const kids = [...el.childNodes];
130
+ for (const kid of kids) el.parentNode.insertBefore(kid, el);
131
+ queue.unshift(...kids);
132
+ el.remove();
133
+ return;
134
+ }
135
+ if (el.parentNode && ((el.nodeType === 3 && BLANK_LINES.test(el.data)) || REMOVED.has(tagOf(el)))) {
136
+ el.parentNode.removeChild(el);
137
+ return;
138
+ }
139
+ if (el.nodeType !== 1) return;
140
+ const style = el.style;
141
+ if (style) {
142
+ const size = style.fontSize || "";
143
+ const px = /px|pt/.test(size) ? parseInt(size, 10) : undefined;
144
+ const em = /em/.test(size) ? parseInt(size, 10) : undefined;
145
+ if (px && px >= 24) el = retag(el, "h1");
146
+ else if (em && em > 2) el = retag(el, "h1");
147
+ if (el.style.textDecoration === "line-through") wrapInside(el, "del");
148
+ if (el.style.fontStyle === "italic") wrapInside(el, "em");
149
+ // Not a step of the kit's flowchart: the kit draws a step's own words at the title's weight
150
+ // (the short form) and its blocks at their own, so its weight is no mark of what it holds (its
151
+ // title's <strong> comes as it is; flowchartBlock).
152
+ if ((el.style.fontWeight === "bold" || (el.style.fontWeight && parseInt(el.style.fontWeight, 10) >= 500)) && !isStep(el)) wrapInside(el, "strong");
153
+ }
154
+ if (tagOf(el) === "img") {
155
+ const m = /^([0-9]+)px$/i.exec(el.style?.width || "");
156
+ if (!el.getAttribute("width") && m) el.setAttribute("width", m[1]);
157
+ }
158
+ if (tagOf(el) === "b") el = retag(el, "strong");
159
+ else if (tagOf(el) === "i") el = retag(el, "em");
160
+ if (tagOf(el) === "strong" && el.style?.fontWeight === "normal") el = retag(el, "span");
161
+ if (tagOf(el) === "section" || tagOf(el) === "article") el = retag(el, "div");
162
+ if (tagOf(el) === "div" && el.style?.display === "inline") el = retag(el, "span");
163
+ if (tagOf(el) === "input" && el.getAttribute("type") === "checkbox") {
164
+ const span = el.ownerDocument.createElement("span");
165
+ span.textContent = `[${el.hasAttribute("checked") ? "x" : " "}] `;
166
+ el.parentNode?.insertBefore(span, el);
167
+ el.remove();
168
+ queue.push(span);
169
+ return;
170
+ }
171
+ if (tagOf(el) === "table" && !el.classList.contains("simple-table")) {
172
+ const rows = [...el.querySelectorAll("tr")].map((row) => row.querySelectorAll("td, th"));
173
+ if (rows.every((cells) => cells.length === 1)) {
174
+ const fragment = el.ownerDocument.createDocumentFragment();
175
+ for (const [cell] of rows) {
176
+ for (const child of [...cell.childNodes]) {
177
+ fragment.appendChild(child.cloneNode(true));
178
+ queue.push(child);
179
+ }
180
+ fragment.appendChild(el.ownerDocument.createElement("hr"));
181
+ }
182
+ el.parentNode?.replaceChild(fragment, el);
183
+ }
184
+ }
185
+ if (isElement(el, "ul", "ol") && isElement(el.parentNode, "ul", "ol") && isElement(el.previousSibling, "li")) el.previousSibling.appendChild(el);
186
+ el.removeAttribute("style");
187
+ el.removeAttribute("dir");
188
+ if (tagOf(el) === "span") {
189
+ const className = el.getAttribute("class");
190
+ if (className === "page-comment" || className?.split(" ").includes("retain-span")) return;
191
+ const keep = [ATTR.highlight, ATTR.backgroundHighlight, "data-notion-block-discussion-id", ATTR.comment, ATTR.inlineEquation].some((a) => el.hasAttribute(a));
192
+ (keep ? [...el.children] : unwrap(el)).forEach((n) => queue.push(n));
193
+ return;
194
+ }
195
+ if (tagOf(el) === "pre" || tagOf(el) === "code") return;
196
+ queue.push(...el.childNodes);
197
+ }
198
+
199
+ function secondPass(node, queue) {
200
+ for (const h of ["h1", "h2"]) {
201
+ if (!(plainContainer(node) && [...node.childNodes].every((child) => isElement(child, h)))) continue;
202
+ const merged = node.ownerDocument.createElement(h);
203
+ for (const child of [...node.childNodes]) for (const grand of [...child.childNodes]) merged.appendChild(grand.cloneNode(true));
204
+ const parent = node.parentNode;
205
+ if (parent) {
206
+ if (isElement(node, "td", "th")) {
207
+ const cell = node.ownerDocument.createElement(tagOf(node));
208
+ cell.appendChild(merged);
209
+ parent.insertBefore(cell, node);
210
+ } else parent.insertBefore(merged, node);
211
+ parent.removeChild(node);
212
+ }
213
+ queue.push(merged);
214
+ return;
215
+ }
216
+ if (isElement(node, "div", "span") && node.parentNode && node.childNodes.length === 0) {
217
+ node.parentNode.removeChild(node);
218
+ return;
219
+ }
220
+ if (plainContainer(node) && isElement(node, "p", "div", "figure") && [...node.childNodes].some((child) => child.nodeType === 1 && BLOCK_CHILD.test(tagOf(child)))) {
221
+ unwrap(node).forEach((n) => queue.push(n));
222
+ return;
223
+ }
224
+ if (node?.childNodes) queue.push(...node.childNodes);
225
+ }
226
+
227
+ // Colors (besides Notion's: colors.mjs) as Notion's color marks, before the first pass drops styles.
228
+ const KIT_TEXT = /^doc-text-(\w+)$/;
229
+ const KIT_BACKGROUND = /^doc-highlight-(\w+)$/;
230
+ function markColors(root, mode) {
231
+ for (const el of root.querySelectorAll("*")) {
232
+ let text;
233
+ let background;
234
+ for (const name of el.classList) {
235
+ text ??= color(KIT_TEXT.exec(name)?.[1]);
236
+ background ??= color(KIT_BACKGROUND.exec(name) ? `${KIT_BACKGROUND.exec(name)[1]}_background` : "");
237
+ }
238
+ if (mode) {
239
+ const near = { nearest: mode === "nearest" };
240
+ text ??= textColor(el.getAttribute("data-paste-color") ?? el.style?.color ?? "", near);
241
+ background ??= backgroundColor(el.getAttribute("data-paste-background") ?? (el.style?.backgroundColor || el.style?.background) ?? "", near);
242
+ }
243
+ el.removeAttribute("data-paste-color");
244
+ el.removeAttribute("data-paste-background");
245
+ if (text && !el.hasAttribute(ATTR.highlight)) el.setAttribute(ATTR.highlight, text);
246
+ if (background && !el.hasAttribute(ATTR.backgroundHighlight)) el.setAttribute(ATTR.backgroundHighlight, background);
247
+ }
248
+ }
249
+
250
+ export function normalizeHTML(root, { inline = false, colors = null } = {}) {
251
+ const doc = root.ownerDocument;
252
+ // Slack's emoji pictures as their :name:.
253
+ for (const img of root.querySelectorAll("img[data-stringify-emoji]")) {
254
+ const raw = img.getAttribute("data-stringify-emoji") ?? "";
255
+ const m = /^:(.+):$/.exec(raw);
256
+ if (m && img.parentNode) img.parentNode.replaceChild(doc.createTextNode(raw), img);
257
+ }
258
+ // Notion's export's block-color-* classes as color marks.
259
+ for (const el of root.querySelectorAll(`[class*="block-color-"]:not([${ATTR.highlight}]):not(details):not(td):not(th):not([${ATTR.callout}]):not([${ATTR.tabContainer}]):not([${ATTR.tabPage}])`)) {
260
+ const name = [...el.classList].find((x) => x.startsWith("block-color-"));
261
+ if (name) el.setAttribute(ATTR.highlight, name.slice(12));
262
+ }
263
+ if (colors !== null) markColors(root, colors);
264
+ for (const el of root.querySelectorAll(`span[${ATTR.inlineEquation}]`)) {
265
+ if (el.textContent) continue;
266
+ const tex = el.getAttribute(ATTR.inlineEquation);
267
+ if (tex) el.replaceChildren(doc.createTextNode(tex));
268
+ }
269
+ root.normalize();
270
+ // <br> in a <p>: an element of nothing but br's gives them up first, then the paragraph splits at
271
+ // its first br, until it has none.
272
+ for (const p of root.querySelectorAll("p")) {
273
+ let n = p.firstChild;
274
+ for (let guard = 0; n && guard < 1e4; guard++) {
275
+ let moved = false;
276
+ if (n.nodeType === 1 && !n.textContent.trim()) {
277
+ for (const br of [...n.querySelectorAll("br")]) {
278
+ p.insertBefore(br, n);
279
+ moved = true;
280
+ }
281
+ }
282
+ const next = n.nextSibling;
283
+ if (moved) p.removeChild(n);
284
+ n = next;
285
+ }
286
+ }
287
+ const paragraphs = [...root.querySelectorAll("p")];
288
+ for (let guard = 0; guard < 1e4; guard++) {
289
+ const p = paragraphs.shift();
290
+ if (!p || !p.parentNode) break;
291
+ const br = p.querySelector("br");
292
+ if (!br || br.parentElement !== p) continue;
293
+ const next = doc.createElement("p");
294
+ for (const a of [...p.attributes]) next.setAttribute(a.name, a.value);
295
+ p.parentNode.insertBefore(next, p.nextSibling);
296
+ for (let n = br.nextSibling; n;) {
297
+ const after = n.nextSibling;
298
+ next.appendChild(n);
299
+ n = after;
300
+ }
301
+ p.removeChild(br);
302
+ paragraphs.unshift(next);
303
+ }
304
+ const queue = [...root.childNodes];
305
+ while (queue.length) {
306
+ const n = queue.shift();
307
+ if (n) firstPass(n, queue);
308
+ }
309
+ queue.push(...root.childNodes);
310
+ while (queue.length) {
311
+ const n = queue.shift();
312
+ if (n) secondPass(n, queue);
313
+ }
314
+ root.normalize();
315
+ if (!inline) {
316
+ for (const n of [...root.childNodes]) {
317
+ if (n.nodeType !== 3) continue;
318
+ const p = doc.createElement("p");
319
+ root.insertBefore(p, n);
320
+ p.appendChild(n);
321
+ }
322
+ }
323
+ return root;
324
+ }
325
+
326
+ // ---------- 760354 x: rich text ----------
327
+
328
+ // 760354 B: a formula's text (Notion's attributes, KaTeX's annotation, $$…$$ / $…$).
329
+ function equationOf(el) {
330
+ const annotation = el.querySelector('annotation[encoding="application/x-tex"]')?.textContent?.trim();
331
+ const text = el.textContent?.trim() ?? "";
332
+ return el.getAttribute(ATTR.equation) || el.getAttribute(ATTR.inlineEquation) || annotation || /^\$\$([\s\S]+?)\$\$\s*$/.exec(text)?.[1].trim() || /^\$([\s\S]+?)\$$/.exec(text)?.[1].trim();
333
+ }
334
+
335
+ function richTextOf(node, { stripText = false, stripSurroundingWhitespace = false, ignoreCodeBlock = false, preserveLineBreaks = false } = {}) {
336
+ const doc = node.ownerDocument;
337
+ if (!stripText) {
338
+ // Paragraphs, headings and items as lines with their bullets (the structure kept in one text).
339
+ for (const p of node.querySelectorAll("p:not(:first-child)")) p.prepend("\n");
340
+ for (const h of node.querySelectorAll(HEADINGS.map((tag) => `${tag}:not(:first-child)`).join(", "))) h.prepend("\n");
341
+ for (const li of node.querySelectorAll("ul > li")) {
342
+ const depth = listDepth(li) - 1;
343
+ li.prepend(`\n${" ".repeat(depth)}${BULLETS[depth % BULLETS.length]} `);
344
+ }
345
+ for (const ol of node.querySelectorAll("ol")) {
346
+ const indent = " ".repeat(listDepth(ol));
347
+ [...ol.children].forEach((li, i) => li.prepend(`\n${indent}${i + 1}. `));
348
+ }
349
+ for (const pre of node.querySelectorAll("pre")) pre.parentNode?.insertBefore(doc.createTextNode("\n\n"), pre);
350
+ }
351
+ const all = [];
352
+ (function walk(n) {
353
+ if (n.nodeType === 1 && (n.hasAttribute(ATTR.comment) || (ignoreCodeBlock && tagOf(n) === "pre"))) return;
354
+ all.push(n);
355
+ for (const child of n.childNodes) walk(child);
356
+ })(node);
357
+ const nodes = all.filter((n) => (n.nodeType !== 3 ? preserveLineBreaks && tagOf(n) === "br" : !(stripText && BLANK_LINES.test(n.data))));
358
+ const tokens = [];
359
+ const seenEquations = new Set();
360
+ nodes.forEach((n, i) => {
361
+ let text = n.nodeType === 3 ? n.data : "\n";
362
+ if (stripText) text = text.replace(/\[ \] /g, "").replace(/\[x\] /g, "").replace(/^[-*•]\s?/g, "").replace(/(\s)+/g, "$1");
363
+ if (i === 0 && stripSurroundingWhitespace && !node.hasAttribute?.("confluenceTabSpaces")) text = text.trimStart();
364
+ text = clean(text);
365
+ if (i === nodes.length - 1 && stripSurroundingWhitespace) text = text.trimEnd();
366
+ const up = ancestors(n).filter((a) => a.nodeType === 1);
367
+ const annotations = [];
368
+ if (!stripText && up.some((a) => HEADINGS.includes(tagOf(a)))) annotations.push(["b"]);
369
+ if (up.some((a) => tagOf(a) === "strong")) annotations.push(["b"]);
370
+ if (up.some((a) => tagOf(a) === "em")) annotations.push(["i"]);
371
+ if (up.some((a) => tagOf(a) === "u")) annotations.push(["_"]);
372
+ if (up.some((a) => tagOf(a) === "code" || tagOf(a) === "pre")) annotations.push(["c"]);
373
+ if (up.some((a) => ["del", "strike", "s"].includes(tagOf(a)))) annotations.push(["s"]);
374
+ const colors = new Set();
375
+ for (const a of up) {
376
+ const background = color(a.getAttribute(ATTR.backgroundHighlight) ?? "");
377
+ if (background && background.endsWith("_background")) colors.add(background);
378
+ const highlight = a.getAttribute(ATTR.highlight);
379
+ if (highlight && highlight !== "undefined" && color(highlight)) colors.add(highlight);
380
+ }
381
+ for (const c of colors) annotations.push(["h", c]);
382
+ const link = up.find((a) => tagOf(a) === "a");
383
+ if (link && link.href) {
384
+ let target = link.href;
385
+ try {
386
+ const m = /^#maybeCitation:<(.*)>$/.exec(decodeURIComponent(link.hash));
387
+ if (m) target = decodeURIComponent(m[1]);
388
+ } catch {
389
+ // not a valid encoding: the link as it is
390
+ }
391
+ annotations.push(["a", target]);
392
+ }
393
+ const equation = up.find((a) => a.hasAttribute(ATTR.inlineEquation) || a.classList.contains("notion-text-equation-token"));
394
+ if (equation) {
395
+ if (seenEquations.has(equation)) return;
396
+ seenEquations.add(equation);
397
+ const tex = equationOf(equation) ?? equation.textContent;
398
+ if (tex) tokens.push(["⁍", [["e", tex], ...annotations]]);
399
+ return;
400
+ }
401
+ if (text) tokens.push(annotations.length ? [text, annotations] : [text]);
402
+ });
403
+ // 247438 JG8: 100,000 characters at most.
404
+ let left = 1e5;
405
+ const cut = [];
406
+ for (const [t, a] of tokens) {
407
+ if (left <= 0) break;
408
+ const s = [...t].slice(0, left).join("");
409
+ left -= [...s].length;
410
+ cut.push(a ? [s, a] : [s]);
411
+ }
412
+ return normalize(cut);
413
+ }
414
+
415
+ // 760354 _: code's text (br a line break, a div ends one, spaces at line ends dropped).
416
+ function codeText(n) {
417
+ if (n.nodeName === "#text") return n.textContent ?? "";
418
+ return [...n.childNodes].map((child) => (tagOf(child) === "br" ? "\n" : tagOf(child) === "div" ? `${codeText(child)}\n` : codeText(child))).join("")
419
+ .split("\n").map((line) => line.trimEnd()).join("\n").trimEnd();
420
+ }
421
+
422
+ // 760354 T: a language in classes (its name, or language-x).
423
+ function languageOf(classList) {
424
+ for (const name of classList ?? []) {
425
+ const direct = languageFromFence(name);
426
+ if (direct) return direct;
427
+ const m = /language-(\w+)/.exec(name);
428
+ if (m && languageFromFence(m[1])) return languageFromFence(m[1]);
429
+ }
430
+ return null;
431
+ }
432
+
433
+ // ---------- 760354 R: elements as blocks ----------
434
+
435
+ const text = (node, type, options) => {
436
+ const props = {};
437
+ const highlight = node.getAttribute(ATTR.highlight);
438
+ const c = highlight ? color(highlight) : undefined;
439
+ if (highlight) node.removeAttribute(ATTR.highlight);
440
+ if (c) props.block_color = c;
441
+ return spec(type, richTextOf(node, options), props);
442
+ };
443
+
444
+ const MEDIA = () => ["img[src]", "a[download]", `a[${ATTR.file}]`, `audio[${ATTR.audio}]`, `video[${ATTR.video}]`, "li"];
445
+ // 760354 k / L: what in a block makes blocks of its own (pictures, downloads, Notion's files and media, items; pre when asked).
446
+ function extras(node, withPre = false) {
447
+ const selectors = MEDIA();
448
+ if (withPre) selectors.push("pre");
449
+ return blocksOf([...node.querySelectorAll(selectors.join(","))]);
450
+ }
451
+
452
+ // Video, audio and other links: Notion knows them as video / audio / image / file by address (939438 WT); here embeds.
453
+ const mediaBlock = (url) => spec("embed", [], { source: url });
454
+
455
+ const heading = (tag) => ({ h1: "header", h2: "sub_header", h3: "sub_sub_header" })[tag] ?? "header_4";
456
+
457
+ function codeBlock(node) {
458
+ const code = node.querySelector("code");
459
+ const language = languageFromFence(node.getAttribute(ATTR.code)) || languageOf(code?.parentElement?.classList) || languageOf(code?.classList) || "Plain Text";
460
+ const props = { language, code_wrap: true };
461
+ const caption = node.closest("figure")?.querySelector("figcaption");
462
+ if (caption) {
463
+ const t = richTextOf(caption, { stripText: true, stripSurroundingWhitespace: true });
464
+ if (t.length) props.caption = t;
465
+ caption.parentNode?.removeChild(caption);
466
+ }
467
+ const body = codeText(node);
468
+ return spec("code", body ? [[clean(body)]] : [], props);
469
+ }
470
+
471
+ function calloutBlock(node) {
472
+ const props = {};
473
+ const background = color(node.getAttribute(ATTR.calloutBackground) ?? "");
474
+ if (background) props.block_color = background;
475
+ const icon = node.getAttribute(ATTR.calloutIcon);
476
+ if (icon && !/^(https?:|\/|data:|notion:\/\/custom_emoji)/.test(icon)) props.icon = icon; // 760354 z: an emoji only (Notion's icons are no set's here)
477
+ const kids = [...node.childNodes].filter((child) => (child.textContent ?? "").trim() !== "");
478
+ const [first, ...rest] = kids;
479
+ let title = [];
480
+ let children = [];
481
+ if (first && isElement(first, "p")) {
482
+ title = richTextOf(first, { stripSurroundingWhitespace: true });
483
+ children = blocksOf(rest);
484
+ } else if (first && !isInline(first)) children = blocksOf(kids);
485
+ else if (first) title = richTextOf(node, { stripSurroundingWhitespace: true });
486
+ // A new callout (callout_version 2) has no title: its text is its first block.
487
+ const body = title.length ? [spec("text", title), ...children] : children;
488
+ return spec("callout", [], props, body.length ? body : [spec("text")]);
489
+ }
490
+
491
+ function quoteBlock(node) {
492
+ const [first, ...rest] = [...node.childNodes];
493
+ const title = isElement(first) ? richTextOf(first, { stripSurroundingWhitespace: true }) : first?.textContent?.trim() ? [[clean(first.textContent.trim())]] : [];
494
+ return spec("quote", title, {}, blocksOf(rest));
495
+ }
496
+
497
+ function detailsBlock(node) {
498
+ const summary = node.querySelector("summary");
499
+ const head = summary?.querySelector(HEADINGS.join(", "));
500
+ const props = {};
501
+ const highlight = node.getAttribute(ATTR.highlight);
502
+ if (highlight) {
503
+ node.removeAttribute(ATTR.highlight);
504
+ if (color(highlight)) props.block_color = color(highlight);
505
+ }
506
+ const kids = blocksOf([...node.childNodes].filter((child) => child !== summary));
507
+ const title = head ? richTextOf(head, { stripSurroundingWhitespace: true }) : summary?.textContent ? richTextOf(summary, { stripSurroundingWhitespace: true }) : [];
508
+ return spec("toggle", title, props, kids);
509
+ }
510
+
511
+ function tabsBlock(node) {
512
+ const pages = [...node.querySelectorAll(`[${ATTR.tabPage}]`)].filter((page) => page.parentElement === node).map((page) => {
513
+ const summary = page.querySelector("summary");
514
+ const title = summary ? richTextOf(summary, { stripSurroundingWhitespace: true }) : [];
515
+ const props = {};
516
+ const icon = page.getAttribute(ATTR.tabPage);
517
+ if (icon && !/^(https?:|data:|notion:\/\/custom_emoji)/.test(icon)) props.icon = icon;
518
+ return spec("text", title, props, blocksOf([...page.childNodes].filter((child) => child !== summary)));
519
+ });
520
+ return spec("tab", [], {}, pages);
521
+ }
522
+
523
+ const int = (value, fallback) => {
524
+ const n = value !== null ? parseInt(value, 10) : fallback;
525
+ return Number.isFinite(n) ? n : fallback;
526
+ };
527
+
528
+ // 760354 table: row and column spans spread into empty cells; a first row all th a header row, every
529
+ // row starting with a th a header column (both: the side with more th's).
530
+ function tableBlock(node) {
531
+ const rows = [...node.querySelectorAll("tr")].filter((row) => row.closest("table") === node);
532
+ let headerRow = false;
533
+ let headerColumn = false;
534
+ if (rows.length) {
535
+ const firstCells = rows[0].querySelectorAll("td, th");
536
+ const firstTh = rows[0].querySelectorAll("th");
537
+ headerRow = firstCells.length > 0 && firstTh.length === firstCells.length;
538
+ const startsWithTh = (row) => tagOf(row.querySelector("td, th")) === "th";
539
+ headerColumn = rows.every(startsWithTh);
540
+ if (headerRow && headerColumn && !(tagOf(rows[0].querySelector("td, th")) === "th")) {
541
+ if (firstTh.length >= rows.filter(startsWithTh).length) headerColumn = false;
542
+ else headerRow = false;
543
+ }
544
+ }
545
+ const grid = rows.map(() => []);
546
+ const taken = rows.map(() => []);
547
+ rows.forEach((row, r) => {
548
+ let c = 0;
549
+ for (const cell of [...row.querySelectorAll("td, th")].filter((x) => x.closest("tr") === row)) {
550
+ while (taken[r][c]) c++;
551
+ const rowSpan = int(cell.getAttribute("rowspan"), 1);
552
+ const colSpan = int(cell.getAttribute("colspan"), 1);
553
+ grid[r][c] = richTextOf(cell, { stripSurroundingWhitespace: true, preserveLineBreaks: true });
554
+ taken[r][c] = true;
555
+ for (let dr = 0; dr < rowSpan && r + dr < rows.length; dr++) {
556
+ for (let dc = 0; dc < colSpan; dc++) {
557
+ if (dr === 0 && dc === 0) continue;
558
+ grid[r + dr][c + dc] = [];
559
+ taken[r + dr][c + dc] = true;
560
+ }
561
+ }
562
+ c += colSpan;
563
+ }
564
+ });
565
+ const width = grid.reduce((max, row) => Math.max(max, row.length), 0);
566
+ const data = grid.filter((row) => row.length).map((row) => Array.from({ length: width }, (_, i) => row[i] ?? []));
567
+ if (!data.length || !width) return null; // a table only without a single cell
568
+ const columns = Array.from({ length: width }, (_, i) => `c${i}`);
569
+ const props = { table_block_column_order: columns, table_block_column_format: {}, table_block_column_header: headerRow, table_block_row_header: headerColumn };
570
+ return spec("table", [], props, data.map((row) => spec("table_row", [], { cells: Object.fromEntries(row.map((t, i) => [columns[i], t]).filter(([, t]) => t.length)) })));
571
+ }
572
+
573
+ function columnsBlock(node) {
574
+ const columns = [...node.children].filter((child) => child.hasAttribute(ATTR.column)).slice(0, 8).map((column) => {
575
+ const ratio = parseFloat(column.getAttribute(ATTR.column));
576
+ return spec("column", [], !Number.isNaN(ratio) && ratio > 0 && ratio <= 1 ? { ratio } : {}, blocksOf([...column.children]));
577
+ });
578
+ return spec("column_list", [], {}, columns);
579
+ }
580
+
581
+ // 760354 list items: the first node (not a picture, video or audio) and inline nodes its text, the
582
+ // rest its blocks; pictures and the like in its text its blocks too.
583
+ function listItem(node) {
584
+ const doc = node.ownerDocument;
585
+ let itemColor;
586
+ const highlighted = node.closest(`[${ATTR.highlight}]`);
587
+ if (highlighted && (highlighted === node || highlighted === node.parentElement || highlighted === node.parentElement?.parentElement)) {
588
+ itemColor = color(highlighted.getAttribute(ATTR.highlight) ?? "");
589
+ if (itemColor) highlighted.removeAttribute(ATTR.highlight);
590
+ }
591
+ const title = doc.createElement("span");
592
+ const rest = [];
593
+ [...node.childNodes].forEach((child, i) => {
594
+ if ((isElement(child, "a") && child.hasAttribute("data-confluence-web-image")) || (i === 0 && isElement(child, "a") && child.hasAttribute(ATTR.file))) rest.push(child);
595
+ else if ((i === 0 && !isElement(child, "img", "video", "audio")) || isInline(child)) {
596
+ title.appendChild(child);
597
+ if (child.nodeType === 1) rest.push(...child.querySelectorAll(MEDIA().join(",")));
598
+ } else rest.push(child);
599
+ });
600
+ const children = blocksOf(rest);
601
+ const checked = TODO_CHECKED.test(title.textContent ?? "");
602
+ const todo = checked || TODO_EMPTY.test(title.textContent ?? "");
603
+ const type = todo ? "to_do" : isElement(node.parentNode, "ol") ? "numbered_list" : "bulleted_list";
604
+ const props = {};
605
+ if (todo) props.checked = checked;
606
+ if (itemColor) props.block_color = itemColor;
607
+ return spec(type, richTextOf(title, { stripText: true, stripSurroundingWhitespace: true }), props, children);
608
+ }
609
+
610
+ // Besides Notion's: the kit's flowchart, a report_flow of report_step specs (to-blocks.mjs makes them
611
+ // a flowchart of nodes), its direction and first number. A step's icon (an emoji: an icon of a set
612
+ // or a picture is the report's own) its icon; its own words before its first block (the short form,
613
+ // <li>收集数据<p>…</p></li>) its title, its blocks its content (a title written as the node form,
614
+ // <p><strong>…</strong></p>, among them, first); its color (the kit's classes) and direction its
615
+ // own. Never list items: an item's paragraphs would be lines of its text, its title and content one.
616
+ function flowchartBlock(node) {
617
+ const doc = node.ownerDocument;
618
+ const steps = [...node.children].filter((child) => isElement(child, "li")).map((li) => {
619
+ const icon = [...li.children].find((child) => child.classList.contains("doc-icon")) ?? null;
620
+ const emoji = icon && !icon.hasAttribute("data-icon") ? (icon.querySelector("img")?.getAttribute("alt") ?? icon.textContent ?? "").trim() : "";
621
+ const words = doc.createElement("span");
622
+ const rest = [];
623
+ for (const child of [...li.childNodes]) {
624
+ if (child === icon) continue;
625
+ if (rest.length === 0 && isInline(child)) words.appendChild(child);
626
+ else rest.push(child);
627
+ }
628
+ const colors = [...li.classList].filter((name) => KIT_COLOR.test(name));
629
+ // Its color is the node's, not a mark of its words (markColors read it off its class and style).
630
+ li.removeAttribute(ATTR.highlight);
631
+ li.removeAttribute(ATTR.backgroundHighlight);
632
+ const direction = li.getAttribute("data-direction");
633
+ const props = { ...(emoji ? { icon: emoji } : {}), ...(colors.length ? { colors } : {}), ...(direction ? { direction } : {}) };
634
+ return spec("report_step", richTextOf(words, { stripText: true, stripSurroundingWhitespace: true }), props, blocksOf(rest));
635
+ });
636
+ const direction = node.getAttribute("data-direction");
637
+ const start = node.getAttribute("start");
638
+ return spec("report_flow", [], { ...(direction ? { direction } : {}), ...(start ? { start } : {}) }, steps);
639
+ }
640
+
641
+ function imageBlock(node) {
642
+ const props = { source: node.getAttribute("src") };
643
+ const width = node.width || int(node.getAttribute("width"), 0);
644
+ if (width) props.block_width = Math.min(width, 700);
645
+ const figcaption = node.closest("figure")?.querySelector("figcaption");
646
+ const dataCaption = node.getAttribute("data-caption");
647
+ if (dataCaption) props.caption = [[clean(dataCaption)]];
648
+ else if (figcaption) {
649
+ const t = richTextOf(figcaption, { stripText: true, stripSurroundingWhitespace: true });
650
+ if (t.length) props.caption = t;
651
+ figcaption.parentNode?.removeChild(figcaption);
652
+ }
653
+ return spec("image", [], props);
654
+ }
655
+
656
+ function fileBlock(node) {
657
+ const source = node.getAttribute(ATTR.file) ?? "";
658
+ let name = node.getAttribute(ATTR.fileAlias) ?? "";
659
+ if (!name && source.lastIndexOf("/") >= 0) name = source.slice(source.lastIndexOf("/") + 1);
660
+ return spec("file", name ? [[name]] : [], { source, ...(name ? { title: name } : {}) });
661
+ }
662
+
663
+ function blockOf(node) {
664
+ if (!isElement(node)) return [];
665
+ const tag = tagOf(node);
666
+ if (tag === "div" && node.getAttribute("class") === "page-comments") return [];
667
+ if (tag === "hr") return [spec("divider")];
668
+ if (tag[0] === "h") return [text(node, heading(tag), { stripText: true, stripSurroundingWhitespace: true }), ...extras(node)];
669
+ if (tag === "pre" || tag === "code" || (tag === "div" && node.className === SOURCE_CODE) || node.hasAttribute(ATTR.code)) return [codeBlock(node), ...extras(node)];
670
+ if (node.hasAttribute(ATTR.callout)) return [calloutBlock(node)];
671
+ if (tag === "blockquote") return [quoteBlock(node)];
672
+ if (tag === "details") return [detailsBlock(node)];
673
+ if (node.hasAttribute(ATTR.tabContainer)) return [tabsBlock(node)];
674
+ if (tag === "table") {
675
+ const table = tableBlock(node);
676
+ return table ? [table] : [];
677
+ }
678
+ if (tag === "div" && node.hasAttribute(ATTR.columnList)) return [columnsBlock(node)];
679
+ if (tag === "nav" && node.hasAttribute(ATTR.toc)) return extras(node); // a table of contents: no such block
680
+ if (isFlowchart(node)) return [flowchartBlock(node)];
681
+ if (tag === "ul" || tag === "ol") return blocksOf([...node.children]);
682
+ if (tag === "div" && node.hasAttribute(ATTR.highlight) && node.children.length === 1 && isElement(node.children[0], "ul", "ol")) return blockOf(node.children[0]);
683
+ const content = node.textContent ?? "";
684
+ if (tag === "li" || TODO_CHECKED.test(content) || TODO_EMPTY.test(content) || BULLET_TEXT.test(content)) return [listItem(node)];
685
+ if (tag === "img") return node.getAttribute("src") ? [imageBlock(node)] : [];
686
+ if (tag === "a" && node.getAttribute(ATTR.linkPreview)) return [];
687
+ if (tag === "a" && node.getAttribute(ATTR.embed)) {
688
+ const href = node.getAttribute("href");
689
+ return href ? [mediaBlock(href)] : [];
690
+ }
691
+ if (tag === "a" && node.getAttribute(ATTR.file)) return [fileBlock(node)];
692
+ if (tag === "a" && node.childNodes.length === 0 && node.hasAttribute("download") && node.getAttribute("href")) return [mediaBlock(node.getAttribute("href"))];
693
+ if (tag === "video" || tag === "audio") {
694
+ const source = node.querySelector("source")?.getAttribute("src");
695
+ if (source) return [mediaBlock(source)];
696
+ }
697
+ if (tag === "iframe") {
698
+ const source = node.getAttribute("src");
699
+ if (source) {
700
+ const height = int(node.getAttribute("height"), 0);
701
+ const width = int(node.getAttribute("width"), 0);
702
+ return [spec("embed", [], { source, ...(width ? { block_width: width } : {}), ...(height ? { block_height: height } : {}), block_page_width: !(width || height), block_preserve_scale: true })];
703
+ }
704
+ }
705
+ if (tag === "p" && node.getAttribute("confluenceNewLine")) return [text(node, "text", { stripText: true, stripSurroundingWhitespace: true })];
706
+ if (node.hasAttribute(ATTR.equation)) {
707
+ const tex = equationOf(node) ?? codeText(node);
708
+ return [spec("equation", tex ? [[tex]] : [])];
709
+ }
710
+ if (tag === "figure" && node.hasAttribute(ATTR.image)) {
711
+ const img = node.querySelector("img");
712
+ if (img) return blockOf(img);
713
+ }
714
+ return [...(/^\s*$/.test(content) ? [] : [text(node, "text", { stripSurroundingWhitespace: true })]), ...extras(node)];
715
+ }
716
+
717
+ const blocksOf = (nodes) => nodes.flatMap(blockOf);
718
+
719
+ // ---------- entry points ----------
720
+
721
+ /** 760354 U: the HTML's blocks. */
722
+ export function htmlToBlocks(root, options = {}) {
723
+ normalizeHTML(root, { ...options, inline: false });
724
+ return blocksOf([...root.children]);
725
+ }
726
+
727
+ /** 760354 Q: the HTML as one rich text. */
728
+ export function htmlToRichText(root, { stripText = false, stripSurroundingWhitespace = false, ...options } = {}) {
729
+ normalizeHTML(root, { ...options, inline: true });
730
+ return richTextOf(root, { stripText, stripSurroundingWhitespace });
731
+ }
732
+
733
+ const PLAIN_TAGS = new Set(["span", "div", "p"]);
734
+ /** 760354 X: whether the HTML has any element but span / div / p, or code, columns, colors, formulas. */
735
+ export function containsRichFormatting(root, options = {}) {
736
+ normalizeHTML(root, { ...options, inline: false });
737
+ return (function rich(el) {
738
+ const tag = tagOf(el);
739
+ if (!PLAIN_TAGS.has(tag) || (tag === "div" && (el.className === SOURCE_CODE || el.hasAttribute(ATTR.columnList))) || el.hasAttribute(ATTR.highlight) || el.hasAttribute(ATTR.backgroundHighlight)) return true;
740
+ if (el.hasAttribute(ATTR.equation) || el.hasAttribute(ATTR.inlineEquation)) return true; // besides Notion's: a formula takes the HTML
741
+ return [...el.childNodes].some((child) => child.nodeType === 1 && rich(child));
742
+ })(root);
743
+ }
744
+
745
+ // 860313 ej: Notion cleans the HTML with DOMPurify (its defaults) before it puts it in a div. As
746
+ // measured: only the body's content; iframe / noscript / script and the like go with their content;
747
+ // embed / object / link / meta / custom elements (google-sheets-html-origin…) go, their content
748
+ // stays; on* attributes go; href / src that are no safe address (javascript: …) go (data: only for
749
+ // pictures, audio and video).
750
+ const DROP = "script, iframe, noscript, noembed, noframes, plaintext, xmp, frame, frameset";
751
+ const UNWRAP = new Set(["embed", "object", "link", "meta", "base", "param", "applet"]);
752
+ const SAFE_URI = /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.-]+(?:[^a-z+.\-:]|$))/i; // DOMPurify IS_ALLOWED_URI
753
+ const DATA_URI_TAGS = new Set(["img", "audio", "video", "source", "track"]);
754
+ function sanitize(root) {
755
+ for (const el of root.querySelectorAll(DROP)) el.remove();
756
+ for (const el of [...root.querySelectorAll("*")]) {
757
+ const tag = tagOf(el);
758
+ if (UNWRAP.has(tag) || tag.includes("-")) {
759
+ el.replaceWith(...el.childNodes);
760
+ continue;
761
+ }
762
+ for (const a of [...el.attributes]) {
763
+ const name = a.name.toLowerCase();
764
+ if (name.startsWith("on")) el.removeAttribute(a.name);
765
+ else if (["href", "src", "xlink:href", "action", "formaction"].includes(name)) {
766
+ const value = a.value.replace(/[\x00-\x20\s]/g, "");
767
+ if (!SAFE_URI.test(value) && !(/^data:/i.test(value) && DATA_URI_TAGS.has(tag) && name === "src")) el.removeAttribute(a.name);
768
+ }
769
+ }
770
+ }
771
+ }
772
+
773
+ /**
774
+ * The clipboard's HTML in a document of its own (scripts do not run, pictures do not load), cleaned,
775
+ * moved into a div, which is returned. Relative links resolve against `base` (the page's address, as
776
+ * in Notion's div on its page). A new copy each call (normalizing changes it).
777
+ */
778
+ export function parseClipboardHTML(html, { base = globalThis.location?.href } = {}) {
779
+ const doc = new globalThis.DOMParser().parseFromString(html, "text/html");
780
+ if (base) {
781
+ const element = doc.createElement("base");
782
+ element.href = base;
783
+ doc.head.prepend(element);
784
+ }
785
+ newDomNames(doc.body); // a page of the kit's old names (report-*, data-report-*: shared/old-names.mjs) read as its new ones
786
+ convertRenderedMath(doc.body); // before cleaning: MathJax 2's TeX is in scripts
787
+ sanitize(doc.body);
788
+ const div = doc.createElement("div");
789
+ div.append(...doc.body.childNodes);
790
+ doc.body.append(div);
791
+ return div;
792
+ }