@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,88 @@
1
+ import { escapeText, unescapeText } from "../../../shared/escape.mjs";
2
+ import { svg } from "../icons.mjs";
3
+ import { t } from "../../../shared/i18n/index.mjs";
4
+
5
+ // 公式: a display formula (.doc-math-block, Notion's 公式区块), its TeX between \[ \] (or $$ $$)
6
+ // as its only content. One block, and a text block of kind "tex" of its own: the page shows the
7
+ // kit's KaTeX as one chip whose source is that text (core.mjs newAtom), a click opens the formula
8
+ // editor below it (page.mjs), what is kept is one undo step and goes to the file as the block's new
9
+ // text. One with anything but its TeX in it (markup, a script's) stays as it is. Inline formulas in
10
+ // text are not blocks: they are chips the text model keeps (core.mjs prepareBlock, serializeNode,
11
+ // pastedLines; caret.mjs and marks.mjs step over them).
12
+ // page.mjs: the block on the page (a new one, its chip, editing it); the server writes a new one as it
13
+ // writes any text block, checking its TeX (source/checks.mjs, texSource).
14
+ //
15
+ // Where the engines reach it (src/editor/page/ unless named): convert.mjs (a block turned into one, its
16
+ // text the formula, a new block in its place as the server takes no text block turned into one:
17
+ // page.mjs `create`), editor.mjs (what follows a new one: `onCreated`; Enter on one selected:
18
+ // `activate`; a press on it: `press`; `preload`: a conversion comes after KaTeX; `redraw`: a group
19
+ // turned before it came; a key or a composition with the caret on it selects it, and the browser's Tab
20
+ // passes over it, by its host's `tex`), caret.mjs and typing/ (the arrows pass over it, `places`, and
21
+ // so does the caret of a block deleted beside it, `textNear`, by its host's `tex`), type-grid.mjs
22
+ // (`preload`), clipboard/ (copying it: `clipboard`, and `build` in page.mjs; a paste with the caret on
23
+ // it goes after it, by its host's `tex`), core.mjs (its chip).
24
+ // Its look: the kit's styles/math.css, rendered by math.js (src/render/kit/).
25
+ export const ICON = svg('<path d="M14.5 5.75v-1.5h-9l5 5.75-5 5.75h9v-1.5"/>');
26
+
27
+ /**
28
+ * Whether a display formula's text is its TeX alone, between \[ \] or $$ $$ (entities allowed, no
29
+ * tags); \[\] is an empty one (made on the page and left so: it stays, as Notion's).
30
+ */
31
+ export function texSource(text) {
32
+ if (typeof text !== "string" || /[<>]/.test(text)) return false;
33
+ const match = /^\s*(?:\\\[([\s\S]*)\\\]|\$\$([\s\S]*)\$\$)\s*$/.exec(text);
34
+ const body = match?.[1] ?? match?.[2];
35
+ return body !== undefined && !(match[1] !== undefined ? body.includes("\\]") : body.includes("$$"));
36
+ }
37
+
38
+ /** Whether a text block is a display formula. */
39
+ export const isTex = (host) => host?.getAttribute?.("data-ge-kind") === "tex";
40
+
41
+ /** A display formula's source in parts: what comes before its TeX ("\[" and spaces), its TeX, what comes after. */
42
+ export function texParts(source) {
43
+ const match = /^(\s*\\\[\s*)([\s\S]*?)(\s*\\\]\s*)$/.exec(source ?? "") ?? /^(\s*\$\$\s*)([\s\S]*?)(\s*\$\$\s*)$/.exec(source ?? "");
44
+ return match ? { open: match[1], tex: unescapeText(match[2]), close: match[3] } : null;
45
+ }
46
+
47
+ /**
48
+ * TeX as it stands between a display formula's delimiters (`close`, as texParts gives it): one that
49
+ * holds the closing delimiter, which KaTeX reads in no formula, has its last character as an entity,
50
+ * so that the text is still one formula (texSource), for what is typed is kept even so.
51
+ */
52
+ export const texText = (tex, close = "\\]") => escapeText(tex).replaceAll(close.trim(), (end) => `${end.slice(0, -1)}&#${end.charCodeAt(1)};`);
53
+
54
+ export default {
55
+ name: "math",
56
+ listed: () => t("公式块"),
57
+ glance: { row: 8, name: "a formula in a line", write: "`\\(…\\)`", rule: "Text and lists" },
58
+ readOnly: [{ rank: 50, at: ".doc-math-block, .katex-display", says: t("行间公式暂不能在页面上修改。") }],
59
+ units: {
60
+ math: { name: t("公式"), icon: ICON, match: [{ rank: 120, class: "doc-math-block" }], boxed: true },
61
+ },
62
+ components: ["doc-math-block"],
63
+ hosts: {
64
+ tex: { name: t("公式"), caps: () => ["plain"], tex: true }, // its TeX, changed only through the formula editor
65
+ },
66
+ types: {
67
+ math: {
68
+ turn: 15, menu: ["advanced", 22], fresh: 7,
69
+ tag: "div", className: "doc-math-block", kind: "math", tex: true,
70
+ preload: true, // KaTeX (page.mjs): a block turned into one draws its text as the formula at once, what undo and redo put back
71
+ // Its TeX as the block keeps it (none: an empty one); its page.mjs makes it again.
72
+ clipboard: {
73
+ kind: "equation",
74
+ read: (unit, { serializeInner }) => ({ tex: texParts(serializeInner(unit))?.tex.trim() ?? "" }),
75
+ describe(node, { serializeInner }) {
76
+ if (!isTex(node)) return undefined;
77
+ const parts = texParts(serializeInner(node));
78
+ return parts ? { type: "math", tex: parts.tex.trim() } : null;
79
+ },
80
+ check: (block, { string }) => string(block.tex, 20000), // empty: an empty formula block
81
+ text: (block) => [`<span class="doc-math-inline">\\(${escapeText(block.tex)}\\)</span>`],
82
+ },
83
+ label: t("公式块"), icon: ICON,
84
+ words: "公式块 公式 数学 方程 行间公式 gongshikuai gongshi gsk hjgs shuxue fangcheng latex tex equation math formula block",
85
+ glance: { row: 8, name: "公式块", write: "`<p>\\[…\\]</p>`", rule: "Text and lists" },
86
+ },
87
+ },
88
+ };
@@ -0,0 +1,236 @@
1
+ import { atomSource, newAtom, ownHTML, serializeInner, setOwnHTML } from "../../page/core.mjs";
2
+ import { addStyle } from "../../page/ui.mjs";
3
+ import { capsFor } from "../registry.mjs";
4
+ import { isTex, texParts, texText } from "./index.mjs";
5
+ import { formulaSays, openFormulaPanel } from "../../page/formula/panel.mjs";
6
+ import { renderTex, unread } from "../../page/tex.mjs";
7
+ import { t } from "../../../shared/i18n/index.mjs";
8
+
9
+ // 公式 on the page (Notion's 公式区块, notion-lite blocks/equation): a display formula is a text
10
+ // block of kind "tex" holding one chip, the kit's KaTeX, whose source is the block's text (core.mjs
11
+ // newAtom), so that what the commits and undo know of it is its TeX. The page shows it as the kit
12
+ // does; under the pointer it is tinted (radius 10), and a click opens the formula editor below it
13
+ // (formula/panel.mjs: its symbol bar, its field), the formula following what is typed. However the
14
+ // editor is left, what is in it is kept as one undo step (the block's text: its TeX between the
15
+ // delimiters it had, \[ \] for a new one). A new one (the "/" menu's 公式块) is empty, "添加一个 TeX
16
+ // 公式", its editor open; an empty one is written \[\] and stays (Notion's), and so does one emptied:
17
+ // its chip holds no drawing then. TeX that does not read stays as typed, and its block is the gray bar
18
+ // of an empty one saying 无效的公式 (its chip, empty too, marked data-ge-empty="invalid").
19
+ // Nothing can be typed into the block itself, nor pasted. The keys pass over it as over a block with no
20
+ // text (caret.mjs: the arrows by places, the caret of a block deleted beside it and the browser's Tab by
21
+ // textNear). With the caret on it, Enter opens its editor, and any other key that types or edits, and
22
+ // an input method's composition on an empty one, select it and do nothing more (editor.mjs onKeydown:
23
+ // the next key is the selected block's, Backspace and Delete deleting it); a paste goes after it
24
+ // (clipboard/).
25
+
26
+ // An empty one's look (every empty block's gray bar, the block itself: served empty, then its chip
27
+ // empty) is served with the page: ../placeholder.mjs.
28
+ const STYLE = `
29
+ /* The editor's tints are inset shadows over the block (as editor.mjs's over text in a component), never its background: what a block paints of its own
30
+ says whether its fill is a box's (overlay-layer.mjs boxRadius), so a selected formula is filled as text whatever the pointer does (notion-lite's halo), an empty one as its bar. */
31
+ [data-ge-editing] .doc-math-block[data-ge-kind="tex"] { border-radius: 10px; cursor: pointer; caret-color: transparent; outline: none; box-shadow: inset 0 0 0 100vmax transparent; transition: box-shadow 20ms ease-in; }
32
+ /* Not an empty one, whose bar has a hover of its own (placeholder.mjs), nor one whose box is open. */
33
+ [data-ge-editing] .doc-math-block[data-ge-kind="tex"]:not([data-ge-math-edit], :has(> .ge-math-chip:empty)):hover { box-shadow: inset 0 0 0 100vmax var(--ge-hover); }
34
+ /* The box open on a formula tints its block, over the bar of an empty one. */
35
+ [data-ge-editing] .doc-math-block[data-ge-math-edit] { box-shadow: inset 0 0 0 100vmax var(--ge-fill); }
36
+ [data-ge-editing] .doc-math-block[data-ge-math-edit="invalid"] { box-shadow: inset 0 0 0 100vmax light-dark(rgb(235 87 87 / 10%), rgb(235 87 87 / 16%)); }
37
+ [data-ge-editing] .doc-math-block .ge-math-chip:empty { display: none; }
38
+ [data-ge-editing] .doc-math-block .ge-math-chip { display: block; }
39
+ [data-ge-editing] .doc-math-block .ge-math-message { color: var(--ge-tx2); font-size: 14px; }
40
+ [data-ge-editing] .doc-math-block[data-ge-math-edit="invalid"] .ge-math-message { color: rgb(235 87 87); }
41
+ /* A formula in the text is one piece of it: plain as the page shows it, a light fill under the
42
+ pointer, around all of it (chip-fills.mjs), the page's box open or not (not a formula block's chip,
43
+ whose block takes the fill, nor an empty chip, gray already, nor a formula the report drew itself:
44
+ data-ge-own). As heavy as a selected chip's fill there, which comes after it and goes over it. */
45
+ [data-ge-editing] [data-ge-atom] .katex { border-radius: 4px; box-decoration-break: clone; }
46
+ [data-ge-editing] [data-ge-atom]:not(.ge-math-chip, [data-ge-empty], [data-ge-own], [data-ge-formula-edit]):hover .katex { background: color-mix(in srgb, var(--doc-text, #000) 6%, transparent); }
47
+ `;
48
+ const style = () => addStyle(STYLE);
49
+
50
+
51
+ // The chip of a display formula: `nodes` shown, `source` written back.
52
+ const chipOf = (doc, source, nodes = []) => {
53
+ const chip = newAtom(doc, source, nodes);
54
+ chip.className = "ge-math-chip";
55
+ return chip;
56
+ };
57
+
58
+ // What a chip shows for `tex`: KaTeX's display of it; nothing for none, or for TeX it does not read,
59
+ // which the chip says; KaTeX's message when KaTeX is not on the page yet (redraw).
60
+ function draw(chip, tex) {
61
+ const { html, error } = tex ? renderTex(tex, true) : { html: "", error: null };
62
+ chip.innerHTML = html;
63
+ chip.toggleAttribute("data-ge-empty", false);
64
+ if (!error) return;
65
+ if (globalThis.katex) return chip.setAttribute("data-ge-empty", "invalid");
66
+ const message = chip.ownerDocument.createElement("span");
67
+ message.className = "ge-math-message";
68
+ message.textContent = error;
69
+ chip.append(message);
70
+ }
71
+
72
+ /**
73
+ * A display formula of the file made ready for editing (editor.mjs enter): what the kit drew (or its
74
+ * text, KaTeX missing) in one chip whose source is the block's text. Returns its baseline.
75
+ */
76
+ export function prepareTex(node, block) {
77
+ style();
78
+ node.setAttribute("data-ge-kind", "tex");
79
+ node.setAttribute("data-ge-caps", (block.caps ?? ["plain"]).join(" "));
80
+ if (node.getAttribute("contenteditable") !== "true") node.setAttribute("contenteditable", "true"); // set ahead as the page opens (core.mjs editableAhead)
81
+ node.setAttribute("spellcheck", "false");
82
+ // An empty one (\[\]) shows "添加一个 TeX 公式", not what the kit drew of nothing.
83
+ const tex = texParts(block.inner)?.tex.trim();
84
+ const chip = chipOf(node.ownerDocument, block.inner, tex ? [...node.childNodes] : []);
85
+ node.replaceChildren(chip);
86
+ if (tex && unread(chip, tex, true)) draw(chip, tex);
87
+ return serializeInner(node);
88
+ }
89
+
90
+ /** A new display formula of `tex` (empty: "添加一个 TeX 公式", written \[\]). */
91
+ export function newMath(doc, tex = "") {
92
+ style();
93
+ const block = doc.createElement("div");
94
+ block.className = "doc-math-block";
95
+ for (const [name, value] of [["contenteditable", "true"], ["data-ge-new", ""], ["data-ge-type", "math"], ["data-ge-unit-kind", "math"], ["data-ge-kind", "tex"], ["data-ge-caps", capsFor("tex")], ["spellcheck", "false"]]) block.setAttribute(name, value);
96
+ const chip = chipOf(doc, `\\[${texText(tex.trim())}\\]`);
97
+ draw(chip, tex.trim());
98
+ block.append(chip);
99
+ return block;
100
+ }
101
+
102
+ /** A formula block made again from the clipboard's description (its type's `build`, builders.mjs). */
103
+ export function build({ doc, block }) {
104
+ return newMath(doc, block.tex.trim());
105
+ }
106
+
107
+ /**
108
+ * A formula block standing for a block (its type's `create`), that block's text the formula
109
+ * (notion-lite's turnInto: 转成公式区块时文字就是公式); made of an empty block, empty: its formula is typed next.
110
+ */
111
+ export const make = ({ doc, text, put }) => put(newMath(doc, text.trim()));
112
+
113
+ /**
114
+ * Editing display formulas, with what the editor gives it: recordText(host) (one undo step),
115
+ * active() (the page edits), loadKatex(), say (the status line), closeTools() (what a press closes
116
+ * that opens over the page: the format bar, the "/" menu, the formula box).
117
+ */
118
+ export function create({ recordText, active, loadKatex, say, closeTools }) {
119
+ style();
120
+ let open = null; // { host, panel, before, parts }
121
+
122
+ const texHost = (target) => {
123
+ const host = target?.closest?.('.doc-math-block[data-ge-kind="tex"]');
124
+ return host && active() && host.closest("main") && !host.closest("[data-ge-lock]") ? host : null;
125
+ };
126
+ // A press on one edits it (`press`); a press puts no caret in it, and nothing is typed into it.
127
+ document.addEventListener("mousedown", (event) => {
128
+ if (event.button === 0 && texHost(event.target)) event.preventDefault();
129
+ }, true);
130
+ document.addEventListener("beforeinput", (event) => {
131
+ if (isTex(event.target?.closest?.("[contenteditable]"))) event.preventDefault();
132
+ }, true);
133
+
134
+ // The formula in the block follows the field.
135
+ function preview(host, tex, error) {
136
+ const chip = host.querySelector(":scope > .ge-math-chip");
137
+ const shown = chip ?? host.appendChild(chipOf(host.ownerDocument, ""));
138
+ draw(shown, error ? "" : tex.trim());
139
+ if (error) shown.append(Object.assign(host.ownerDocument.createElement("span"), { className: "ge-math-message", textContent: t("无效的公式") }));
140
+ host.setAttribute("data-ge-math-edit", error ? "invalid" : "");
141
+ }
142
+
143
+ function finish(value) {
144
+ if (!open) return;
145
+ const { host, before, parts } = open;
146
+ open = null;
147
+ host.removeAttribute("data-ge-math-edit");
148
+ if (!host.isConnected) return;
149
+ const tex = value.trim();
150
+ if (tex === parts.tex.trim()) {
151
+ setOwnHTML(host, before);
152
+ return;
153
+ }
154
+ // Emptied, it stays an empty one (its delimiters, nothing drawn).
155
+ const chip = chipOf(host.ownerDocument, `${parts.open}${texText(tex, parts.close)}${parts.close}`);
156
+ draw(chip, tex);
157
+ host.replaceChildren(chip);
158
+ recordText(host, true);
159
+ say(formulaSays.kept(tex, Boolean(parts.tex)));
160
+ }
161
+
162
+ /** Open the formula editor below a display formula. */
163
+ async function edit(host) {
164
+ if (open?.host === host) return open.panel.focus();
165
+ dismiss();
166
+ if (!(await loadKatex())) return say(formulaSays.unloaded(t("修改")), "error");
167
+ if (!host.isConnected) return;
168
+ const chip = host.querySelector(":scope > .ge-math-chip");
169
+ const parts = chip ? texParts(atomSource(chip)) : { open: "\\[", tex: "", close: "\\]" };
170
+ if (!parts) return say(formulaSays.peculiar);
171
+ open = { host, before: ownHTML(host), parts };
172
+ host.setAttribute("data-ge-math-edit", "");
173
+ open.panel = openFormulaPanel({
174
+ value: parts.tex, display: true, center: true, anchor: () => host.getBoundingClientRect(),
175
+ onInput: (tex, error) => open?.host === host && preview(host, tex, error),
176
+ onSubmit: finish,
177
+ });
178
+ }
179
+
180
+ /**
181
+ * Display formulas made while KaTeX was not on the page (a group of text blocks turned into them,
182
+ * each one's text its formula), drawn once it is: what they show, not what the file holds.
183
+ */
184
+ async function redraw(hosts) {
185
+ const missing = hosts.filter((host) => isTex(host) && host.querySelector(":scope > .ge-math-chip .ge-math-message"));
186
+ if (missing.length === 0 || !(await loadKatex())) return;
187
+ for (const host of missing) {
188
+ const chip = host.isConnected ? host.querySelector(":scope > .ge-math-chip") : null;
189
+ const tex = chip ? texParts(atomSource(chip))?.tex.trim() : "";
190
+ if (tex) draw(chip, tex);
191
+ }
192
+ }
193
+
194
+ /** What follows a new formula block: its editor opens, as notion-lite's handleCreated. */
195
+ function onCreated(host) {
196
+ edit(host);
197
+ return true;
198
+ }
199
+
200
+ /** Enter on one selected: its editor opens, as notion-lite's activate. */
201
+ function activate(host) {
202
+ if (isTex(host)) edit(host);
203
+ return isTex(host);
204
+ }
205
+
206
+ /** The editor left from outside it (a press elsewhere, the page saved or left): what is in it is kept. */
207
+ function dismiss() {
208
+ if (!open) return;
209
+ const { panel } = open;
210
+ panel.close();
211
+ finish(panel.value);
212
+ }
213
+
214
+ /**
215
+ * A press on a display formula (`press`): it goes into the formula editor (a Shift press does not).
216
+ * True when the press was its.
217
+ */
218
+ function press(event) {
219
+ const host = event.shiftKey ? null : texHost(event.target);
220
+ if (!host) return false;
221
+ event.preventDefault();
222
+ closeTools();
223
+ edit(host);
224
+ return true;
225
+ }
226
+
227
+ return {
228
+ create: make, onCreated, activate, redraw, dismiss, press,
229
+ prepare: (block, node) => prepareTex(node, block),
230
+ /** What a formula block needs on the page: KaTeX, the promise of its coming, or null when it is there. */
231
+ preload: () => (globalThis.katex ? null : loadKatex()),
232
+ get panel() { return open?.panel.node ?? null; },
233
+ /** Whether a node is its editor's, or the formula being edited: a press there ends nothing. */
234
+ holds: (node) => Boolean(open) && (open.panel.node.contains(node) || open.host.contains(node)),
235
+ };
236
+ }
@@ -0,0 +1,6 @@
1
+ // The TeX logo as TeX sets it — T, the E lowered half an ex and drawn 1/6 em back, the X 1/8 em back
2
+ // — in KaTeX_Main's own outlines (Computer Modern, the font KaTeX ships under the SIL OFL), as one
3
+ // filled path: the empty formula block's mark (../placeholder.mjs), drawn the same wherever fonts are missing.
4
+ // Made from node_modules/katex/dist/fonts/KaTeX_Main-Regular.ttf (its glyf outlines, 1000 units to
5
+ // the em, scaled into a box 18 units tall; its view just the ink, so that it fills the width it is given).
6
+ export const TEX_LOGO = "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0.68 0.5 34.1 17'><path d='M0.68 5.04Q0.7 5 0.87 2.88Q1.04 0.76 1.04 0.73L1.04 0.61L12.6 0.61L12.6 0.73Q12.62 0.76 12.79 2.88Q12.96 5 12.96 5.04L12.96 5.16L12.21 5.16L12.21 5.04Q12.19 4.97 12.15 4.59Q12.02 2.75 11.54 2.2Q11.22 1.81 10.5 1.6Q10.11 1.5 9.05 1.5L8.54 1.5Q8.1 1.5 8 1.53Q7.89 1.56 7.83 1.73Q7.82 1.77 7.82 7.01L7.82 12.23Q7.97 12.44 8.29 12.5Q8.97 12.56 9.99 12.56L10.56 12.56L10.56 13.43L10.31 13.43Q9.92 13.37 6.83 13.37Q3.75 13.37 3.35 13.43L3.1 13.43L3.1 12.56L3.67 12.56Q4.69 12.56 5.37 12.5Q5.7 12.44 5.85 12.23L5.85 7.01Q5.85 1.77 5.83 1.73Q5.77 1.56 5.67 1.53Q5.56 1.5 5.13 1.5L4.62 1.5Q3.73 1.5 3.54 1.52Q2.73 1.65 2.25 2.05Q1.65 2.56 1.5 4.59Q1.46 4.97 1.44 5.04L1.44 5.16L0.68 5.16L0.68 5.04ZM12.93 5.79Q12.74 5.6 12.56 5.56Q12.38 5.52 11.61 5.5L10.98 5.5L10.98 4.63L21.81 4.63L21.81 4.71L22.07 6.9L22.34 9.1L22.34 9.17L21.58 9.17L21.58 9.1Q21.56 9.04 21.52 8.7Q21.3 6.92 20.66 6.27Q20.03 5.62 18.48 5.52Q18.29 5.5 17.19 5.5Q15.3 5.5 15.15 5.54Q14.98 5.56 14.92 5.75Q14.9 5.79 14.9 8.09L14.9 10.38L15.92 10.38Q17.15 10.37 17.44 10.27Q17.97 10.12 18.16 9.73Q18.34 9.34 18.38 8.55L18.38 8.17L19.14 8.17L19.14 13.47L18.38 13.47L18.38 13.09Q18.34 12.3 18.16 11.91Q17.97 11.52 17.44 11.37Q17.15 11.27 15.92 11.25L14.9 11.25L14.9 13.79Q14.9 16.35 14.92 16.38Q14.94 16.46 15 16.52Q15.11 16.61 15.98 16.61L16.94 16.61Q18.65 16.61 18.91 16.59Q20.01 16.46 20.63 16.03Q21.24 15.61 21.56 14.74Q21.83 14.04 22 12.9Q22.07 12.43 22.09 12.39L22.09 12.33L22.85 12.33L22.85 12.39Q22.83 12.45 22.46 14.92Q22.09 17.39 22.05 17.44L22.05 17.5L10.98 17.5L10.98 16.63L11.61 16.63Q12.38 16.61 12.56 16.57Q12.74 16.53 12.93 16.35L12.93 5.79ZM26.14 13.43Q25.9 13.37 23.7 13.37Q21.85 13.37 21.62 13.43L21.47 13.43L21.47 12.56L21.79 12.56Q23.47 12.5 24.08 11.76Q24.15 11.65 25.66 9.34Q27.16 7.03 27.16 7.01Q27.16 6.97 25.48 4.34Q23.8 1.71 23.74 1.65Q23.4 1.37 22.38 1.37L22.11 1.37L21.73 1.37L21.73 0.5L21.9 0.5Q22.19 0.56 24.29 0.56Q26.63 0.56 27.05 0.5L27.26 0.5L27.26 1.37L27.16 1.37Q26.84 1.37 26.44 1.47Q26.05 1.58 26.01 1.67Q26.01 1.73 27.14 3.5Q28.26 5.27 28.3 5.27Q28.32 5.27 29.3 3.75Q30.29 2.22 30.29 2.2Q30.4 2 30.15 1.75Q29.87 1.43 29.28 1.37L29.13 1.37L29.13 0.5L29.3 0.5Q29.55 0.56 31.74 0.56Q33.6 0.56 33.83 0.5L33.98 0.5L33.98 1.37L33.66 1.37Q32.1 1.43 31.46 2.09Q31.4 2.15 30.08 4.13Q28.83 6.08 28.83 6.1Q28.83 6.14 30.77 9.17Q32.71 12.2 32.77 12.25Q32.92 12.42 33.18 12.48Q33.45 12.54 34.19 12.56L34.77 12.56L34.77 13.43L34.6 13.43Q34.32 13.37 32.22 13.37Q29.89 13.37 29.45 13.43L29.25 13.43L29.25 12.56L29.36 12.56Q29.68 12.56 30.08 12.45Q30.48 12.35 30.48 12.21Q30.48 12.16 29.79 11.08Q29.11 10 28.41 8.92L27.71 7.84L27.66 7.9Q27.62 7.94 27.52 8.07Q27.43 8.2 27.29 8.42Q27.14 8.64 26.94 8.97Q26.73 9.3 26.44 9.74Q25.2 11.63 25.18 11.68Q25.16 11.7 25.16 11.84Q25.16 12.1 25.46 12.31Q25.76 12.52 26.18 12.56L26.33 12.56L26.33 13.43L26.14 13.43Z'/></svg>";
@@ -0,0 +1,19 @@
1
+ import { svg } from "../icons.mjs";
2
+
3
+ // The media blocks' toolbar icons (an image's, an embed's, the block menus' rows): the editor's own line
4
+ // drawings (components/icons.mjs svg) on the same 20 units as the menus' others, the picture in the
5
+ // middle 16 of them. They carry no size or color: the toolbar's buttons and the menus set them.
6
+
7
+ export const TOOL_ICONS = {
8
+ // The three sides: a picture beside the line it stands against, between a rule above and below.
9
+ alignLeft: svg('<path d="M4 4.5h12M4 15.5h12"/><rect x="4" y="7.25" width="6.5" height="5.5" rx="1.25"/>'),
10
+ alignCenter: svg('<path d="M4 4.5h12M4 15.5h12"/><rect x="6.75" y="7.25" width="6.5" height="5.5" rx="1.25"/>'),
11
+ alignRight: svg('<path d="M4 4.5h12M4 15.5h12"/><rect x="9.5" y="7.25" width="6.5" height="5.5" rx="1.25"/>'),
12
+ // A picture with two lines of caption under it.
13
+ caption: svg('<rect x="4.5" y="4" width="11" height="6.5" rx="1.5"/><path d="M4.5 13.25h11M4.5 16h6"/>'),
14
+ // A magnifier with a plus.
15
+ expand: svg('<circle cx="9" cy="9" r="5"/><path d="m12.75 12.75 3.5 3.5M7 9h4M9 7v4"/>'),
16
+ // An arrow down onto a line.
17
+ download: svg('<path d="M10 4v9M6.5 9.75l3.5 3.5 3.5-3.5M4.5 16h11"/>'),
18
+ more: svg('<circle cx="5" cy="10" r="1.3" fill="currentColor" stroke="none"/><circle cx="10" cy="10" r="1.3" fill="currentColor" stroke="none"/><circle cx="15" cy="10" r="1.3" fill="currentColor" stroke="none"/>'),
19
+ };
@@ -0,0 +1,162 @@
1
+ import { MEDIA_BLOCKS, MEDIA_CLASS, mediaBlockOf } from "../../../shared/components/index.mjs";
2
+ import { caretAt } from "../../page/caret.mjs";
3
+ import { UNIT } from "../../page/core.mjs";
4
+ import { openMediaMenu } from "../../page/media-menu/index.mjs";
5
+ import { keptByComponent } from "../../page/page-objects.mjs";
6
+ import { blobBase64 } from "../../page/post.mjs";
7
+ import { addStyle } from "../../page/ui.mjs";
8
+ import { barClass } from "../placeholder-bar.mjs";
9
+ import { captionOf } from "./parts.mjs";
10
+ import { TOOLBAR_STYLE } from "./toolbar.mjs";
11
+ import { t } from "../../../shared/i18n/index.mjs";
12
+
13
+ // What the four media blocks (图片, 文件, 网页书签, 嵌入) do on the page alike (notion-lite's
14
+ // src/editor/media/index.js, which they share the same way): a click on a placeholder opens the
15
+ // block's menu; what is chosen replaces the placeholder with a NEW element (never the same one, so
16
+ // that undo brings back the placeholder as it was and the file loses the block); a caption shows
17
+ // once it is asked for or focused, goes out of sight when it is left empty, and Enter in it makes a
18
+ // paragraph after the block. What a block makes of what is chosen (its picture, row, card or frame),
19
+ // its menu, rows and tools are its own (image/, file/, bookmark/, embed/ page.mjs).
20
+
21
+ const STYLE = `${TOOLBAR_STYLE}
22
+ /* A caption is shown with words, while it has the caret, or once 标题 asks for it (data-ge-caption), with Notion's placeholder. */
23
+ ${MEDIA_BLOCKS.map((id) => `[data-ge-editing] .${MEDIA_CLASS[id]}[data-ge-caption] > figcaption`).join(", ")} { display: block; }
24
+ ${MEDIA_BLOCKS.map((id) => `[data-ge-editing] .${MEDIA_CLASS[id]} > figcaption:empty::before`).join(", ")} { content: ${JSON.stringify(t("写一个标题…"))}; color: var(--ge-tx3); }
25
+ `;
26
+
27
+ // Every media placeholder (a gray bar), by the selector the page finds it by.
28
+ const BARS = MEDIA_BLOCKS.map((id) => `main figure.${MEDIA_CLASS[id]} > .${barClass(MEDIA_CLASS[id])}`).join(", ");
29
+
30
+ // What a placeholder's words were before something was under way (busy), by the words' element.
31
+ const idleWords = new WeakMap();
32
+
33
+ /**
34
+ * The media blocks on the page, with what the editor gives them: struct (an undo step), say,
35
+ * active() (the block tools may act), blocks() (the block tools), newParagraph(parent, after),
36
+ * typedKey(event) (a key of the "/" or "@" menu, which comes before a caption's) and upload(kind,
37
+ * body) (POST /__gallery/edit/upload: the server's answer, or an Error).
38
+ *
39
+ * Returns block(id), the parts a block's own editing is made from; each block's page object is `pages[id]`.
40
+ */
41
+ export function create({ struct, finishStep, look, say, active, blocks, newParagraph, typedKey, upload, pages }) {
42
+ const select = (unit) => blocks()?.select(unit);
43
+ const openMenu = (unit, rect) => blocks()?.openMenu(unit, rect);
44
+ addStyle(STYLE);
45
+
46
+ // A click on a placeholder opens its block's menu.
47
+ document.addEventListener("click", (event) => {
48
+ const bar = event.target?.closest?.(BARS);
49
+ if (!bar || !active() || keptByComponent(bar)) return;
50
+ event.preventDefault();
51
+ pages[mediaBlockOf(bar.parentElement)]?.pick(bar.parentElement);
52
+ }, true);
53
+
54
+ // A caption that has the caret is shown (data-ge-caption: an editing-only mark, gone once the caret
55
+ // leaves): one the reader empties goes out of sight only then, not under it, where the caret would
56
+ // be lost and the change with it.
57
+ document.addEventListener("focusin", (event) => {
58
+ const text = event.target;
59
+ if (text?.localName === "figcaption" && text.getAttribute("data-ge-kind") === "mediaCaption") text.parentElement?.setAttribute("data-ge-caption", "");
60
+ }, true);
61
+ // Once the caret leaves, the caption is shown by its words (the kit), not by the mark; an empty one
62
+ // goes out of sight again (notion-lite's): emptied by the reader too, the line break the browser
63
+ // leaves in it taken out, or the kit (:empty) would keep showing a blank line under the block.
64
+ document.addEventListener("focusout", (event) => {
65
+ const text = event.target;
66
+ if (text?.localName !== "figcaption" || text.getAttribute("data-ge-kind") !== "mediaCaption") return;
67
+ if (!text.textContent.trim() && !text.querySelector("[data-ge-atom]")) text.replaceChildren();
68
+ text.parentElement?.removeAttribute("data-ge-caption");
69
+ }, true);
70
+ // Enter in a caption: a menu's first (its row), else a paragraph after the block.
71
+ document.addEventListener("keydown", (event) => {
72
+ if (event.key !== "Enter" || event.shiftKey || event.isComposing || event.keyCode === 229) return;
73
+ const text = event.target?.closest?.('[data-ge-kind="mediaCaption"]');
74
+ const figure = text?.parentElement?.closest("figure");
75
+ if (!figure) return;
76
+ event.stopImmediatePropagation();
77
+ if (typedKey(event)) return;
78
+ event.preventDefault();
79
+ newParagraph(figure.parentElement, figure);
80
+ }, true);
81
+
82
+ /** The parts the editing of media block `id` is made from. */
83
+ function block(id) {
84
+ const wordsOf = (figure) => figure.querySelector(`:scope > .${barClass(MEDIA_CLASS[id])} span`);
85
+ // The placeholder says what is under way ("正在上传…") until idle() puts its own words back.
86
+ const busy = (figure, text) => {
87
+ const words = wordsOf(figure);
88
+ if (!words) return;
89
+ if (!idleWords.has(words)) idleWords.set(words, words.textContent);
90
+ words.textContent = text;
91
+ };
92
+ const idle = (figure) => {
93
+ const words = wordsOf(figure);
94
+ if (words && idleWords.has(words)) words.textContent = idleWords.get(words);
95
+ };
96
+ return {
97
+ struct, look, say, active, select, openMenu,
98
+ busy, idle,
99
+ /** Something under way for `figure`: `working` said in its placeholder; `task()` failing, the placeholder is as it was and `failed` (and the reason) said. */
100
+ async attempt(figure, working, failed, task) {
101
+ busy(figure, working);
102
+ try {
103
+ await task();
104
+ } catch (error) {
105
+ idle(figure);
106
+ say(t("{0}:{1}", failed, error.message), "error");
107
+ }
108
+ },
109
+ /** The menu of this block (openMediaMenu's options), below the element `anchorOf(figure)` gives (the block itself). */
110
+ pick(figure, menu, anchorOf = (each) => each) {
111
+ if (figure?.isConnected) openMediaMenu(anchorOf(figure), menu);
112
+ },
113
+ /** A file the reader chose (or a picture cut out, `name`d) sent to the report's folder: the server's answer. */
114
+ uploadFile: async (blob, name = blob.name) => upload(id, { name, type: blob.type, data: await blobBase64(blob) }),
115
+ /** A link's file downloaded into the report's folder by the server: its answer. */
116
+ uploadUrl: (url) => upload(id, { url }),
117
+ /**
118
+ * `next` (a new element made of what was chosen) in the place of `figure`, one undo step, the
119
+ * block selected. `replacing`: the block had content: undo selects the block it was. `pasted`:
120
+ * it fills a block just pasted, one undo step with the paste, the selection as it was. The
121
+ * placeholder that goes has its own words back (not what was under way: "正在上传…", busy), so
122
+ * that undo brings it back as it was before.
123
+ */
124
+ place(figure, next, { replacing = false, pasted = false } = {}) {
125
+ const picked = blocks()?.picked.includes(figure);
126
+ if (!pasted || !finishStep(figure, next)) {
127
+ struct([figure.parentElement], [], () => {
128
+ figure.replaceWith(next);
129
+ return { touched: [], focus: null, select: replacing ? figure : null };
130
+ });
131
+ }
132
+ idle(figure);
133
+ if (!pasted) select(next);
134
+ else if (picked) blocks().select(next, { quiet: true });
135
+ },
136
+ /** The caption shown (an empty one too), the caret at its end. */
137
+ caption(figure) {
138
+ const text = figure && captionOf(figure);
139
+ if (!text) return;
140
+ figure.setAttribute("data-ge-caption", "");
141
+ caretAt(text, "end");
142
+ },
143
+ /**
144
+ * `file` pasted into `host` (a text block): a new block made by `make(doc)` below its block, then
145
+ * `fill(figure, file)` (its placeholder filled). Returns whether it took the file.
146
+ */
147
+ paste(host, file, make, fill) {
148
+ const unit = host?.closest?.(UNIT);
149
+ if (!file || !unit?.parentElement) return false;
150
+ const figure = make(host.ownerDocument);
151
+ struct([unit.parentElement], [], () => {
152
+ unit.after(figure);
153
+ return { touched: [], focus: null };
154
+ });
155
+ fill(figure, file);
156
+ return true;
157
+ },
158
+ };
159
+ }
160
+
161
+ return { block };
162
+ }
@@ -0,0 +1,60 @@
1
+ import { MEDIA_BLOCKS, MEDIA_CLASS } from "../../../shared/components/index.mjs";
2
+ import { barElement } from "../placeholder-bar.mjs";
3
+ import { t } from "../../../shared/i18n/index.mjs";
4
+
5
+ // What the four media blocks (图片, 文件, 网页书签, 嵌入) are made of, once: the figure of a new one,
6
+ // its caption, the file it shows. Pure DOM, so a block's index.mjs (which the server loads too) uses
7
+ // it; what each block adds (its picture, row, card or frame) is its own. notion-lite's
8
+ // view/media/parts.js, which the blocks share the same way.
9
+
10
+ /**
11
+ * The text block a media block's caption is (data-ge-kind): plain inline text that may be empty, never
12
+ * removed. The part of every media block there is, so it is no one block's: registry.mjs PAGE says it.
13
+ */
14
+ export const MEDIA_HOSTS = { mediaCaption: { name: t("说明@caption"), caps: () => ["empty", "links"], parts: MEDIA_BLOCKS.map((id) => [id, "caption"]) } };
15
+
16
+ /** A media block's caption (a <figcaption>, written whether it has words or not). */
17
+ /** What a media block's figure says of itself, read-only (a definition's `readOnly`): nothing, it has its own tools. */
18
+ export const mediaReadOnly = (id) => ({ rank: 90, at: `figure.${MEDIA_CLASS[id]}`, says: null });
19
+
20
+ export const captionOf = (figure) => figure.querySelector(":scope > figcaption");
21
+
22
+ /** What a page export writes as a figure's caption: a kit figure's own element too (a card's). */
23
+ export const writtenCaption = (figure) => figure.querySelector(":scope > figcaption, :scope > .doc-figure-caption");
24
+
25
+ /** What a new block is written with of its caption: its words, or nothing when it has none. */
26
+ export const captionWords = (figure) => {
27
+ const caption = captionOf(figure);
28
+ return caption && caption.textContent.trim() ? caption.innerHTML : "";
29
+ };
30
+
31
+ /** A caption made in `doc`: a text block of its own kind (mediaCaption), holding `html`. */
32
+ export function captionNode(doc, html = "") {
33
+ const text = doc.createElement("figcaption");
34
+ for (const [name, value] of [["contenteditable", "true"], ["data-ge-new", ""], ["data-ge-kind", "mediaCaption"], ["data-ge-caps", MEDIA_HOSTS.mediaCaption.caps({ bound: false, blockLevel: true }).join(" ")]]) text.setAttribute(name, value);
35
+ text.innerHTML = html;
36
+ return text;
37
+ }
38
+
39
+ /** A new media block `id` (image, file, bookmark, embed) in `doc`, holding `bar` (its placeholder, as markup). */
40
+ export function newMediaFigure(doc, id, bar) {
41
+ const figure = doc.createElement("figure");
42
+ figure.className = MEDIA_CLASS[id];
43
+ for (const [name, value] of [["data-ge-new", ""], ["data-ge-type", id], ["data-ge-unit-kind", id], ["contenteditable", "false"]]) figure.setAttribute(name, value);
44
+ figure.append(barElement(doc, bar));
45
+ return figure;
46
+ }
47
+
48
+ /**
49
+ * `element` showing what the file names (`path`: a file of the report's folder, assets/<file>; a
50
+ * bookmark's card, the page's address): `attribute` (src or href) is where it shows now (`url`: where
51
+ * the preview serves a file), data-ge-<attribute> what the file says, which is what is written
52
+ * (render/media-ref.mjs makes the same pair when it serves a page).
53
+ */
54
+ export function showFile(element, attribute, path, url) {
55
+ element.setAttribute(attribute, url);
56
+ element.setAttribute(`data-ge-${attribute}`, path);
57
+ }
58
+
59
+ /** What the file says `element` shows (see showFile), or null. */
60
+ export const fileOf = (element, attribute) => element?.getAttribute(`data-ge-${attribute}`) ?? null;
@@ -0,0 +1,20 @@
1
+ // What the media blocks that are sized share (an image's sides, an embed's corners): the width a
2
+ // block takes is a share (SPAN of shared/media.mjs, written as a size: the description's `sizes`)
3
+ // of the width it stands in, a picture's of the reading width (styles/sizes.css: notion-lite's width
4
+ // in pixels, which a move into a column keeps), never past the width it stands in; and a block close
5
+ // to the whole width snaps to it.
6
+
7
+ /** How near (px) the whole width a dragged block snaps to it. */
8
+ export const SNAP = 14;
9
+
10
+ /** The width the column a media block stands in offers it (px): its parent's, less its padding. */
11
+ export function columnRoom(figure) {
12
+ const parent = figure.parentElement;
13
+ const style = getComputedStyle(parent);
14
+ return parent.clientWidth - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight);
15
+ }
16
+
17
+ /** The reading width a picture's share is of (px): the page's (styles/sizes.css, 100cqw of .doc-page), else the column's. */
18
+ export function readingRoom(figure) {
19
+ return figure.closest(".doc-page")?.clientWidth || columnRoom(figure);
20
+ }
@@ -0,0 +1,37 @@
1
+ import { tooltip } from "../../page/tooltip.mjs";
2
+ import { element } from "../../page/ui.mjs";
3
+
4
+ // The toolbar a media block with something to show gets with the pointer on it (an image's, an
5
+ // embed's): Notion's, at its top right, in the editor's overlay layer; notion-lite's actionBar and
6
+ // toolButton (view/media/parts.js). What each block puts in it, and where it stands, is its own.
7
+
8
+ /** The toolbar's look, and its buttons' (a popover's too: an image's 对齐 pops three of them). */
9
+ export const TOOLBAR_STYLE = `
10
+ .ge-layer > .ge-media-bar { pointer-events: auto; }
11
+ .ge-media-bar { display: flex; padding: 2px; border-radius: 6px; background: var(--ge-bg);
12
+ box-shadow: 0 0 0 1px var(--ge-outline), 0 4px 12px -2px light-dark(rgb(25 25 25 / 8%), rgb(0 0 0 / 30%)); }
13
+ .ge-media-tool { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 4px; color: var(--ge-ico2); cursor: pointer; user-select: none; transition: background 20ms ease-in; }
14
+ .ge-media-tool svg { display: block; width: 20px; height: 20px; flex: none; fill: none; stroke: currentColor; stroke-width: 1.25; stroke-linecap: round; stroke-linejoin: round; }
15
+ .ge-media-tool:hover, .ge-media-tool[data-on] { background: var(--ge-hover); }
16
+ `;
17
+
18
+ /** An empty toolbar named `label`. */
19
+ export const mediaBar = (label) => element("div", { class: "ge-media-bar", role: "toolbar", "aria-label": label });
20
+
21
+ /**
22
+ * A toolbar button: `label` (what it is), `tip` (the tooltip), `icon` (an svg, or a function giving
23
+ * it, drawn by draw() each time the bar is shown), `run(button)` on a click while `alive()` (the block it stands for is
24
+ * still on the page).
25
+ */
26
+ export function toolButton({ label, tip, icon, run, alive }) {
27
+ const button = element("div", { class: "ge-media-tool", role: "button", "aria-label": label });
28
+ button.draw = () => { button.innerHTML = typeof icon === "function" ? icon() : icon; };
29
+ if (typeof icon !== "function") button.draw(); // a function icon depends on the block: drawn when the bar is shown
30
+ tooltip(button, tip);
31
+ button.addEventListener("pointerdown", (event) => event.preventDefault());
32
+ button.addEventListener("click", (event) => {
33
+ event.preventDefault();
34
+ if (alive()) run(button);
35
+ });
36
+ return button;
37
+ }