@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,309 @@
1
+ import { Z } from "../../../shared/layers.mjs";
2
+ import { gestureLock } from "../../page/gesture.mjs";
3
+ import { SPAN, SPAN_SIZE, UPLOAD_LIMITS, sizeLimit } from "../../../shared/media.mjs";
4
+ import { ICONS } from "../../page/menu.mjs";
5
+ import { onSettle, own } from "../../page/overlays.mjs";
6
+ import { drawAt, shapeOf } from "../../page/overlay-layer.mjs";
7
+ import { keptByComponent } from "../../page/page-objects.mjs";
8
+ import { addStyle, addStyleTo, copyAddress, element, mountOver, overlayHost } from "../../page/ui.mjs";
9
+ import { TOOL_ICONS } from "../media/icons.mjs";
10
+ import { captionNode, captionOf, showFile } from "../media/parts.mjs";
11
+ import { SNAP, columnRoom } from "../media/size.mjs";
12
+ import { TOOLBAR_STYLE, mediaBar, toolButton } from "../media/toolbar.mjs";
13
+ import { EMBED_ICONS } from "./icons.mjs";
14
+ import { FILE_SANDBOX, HEIGHT, HEIGHT_SIZE, WEB_SANDBOX, frameAddress, frameOf, newEmbed } from "./index.mjs";
15
+ import { t } from "../../../shared/i18n/index.mjs";
16
+
17
+ // 嵌入 on the page (notion-lite's src/blocks/embed/, Notion's 605415 media block and 726447 frame). A
18
+ // new embed (the "/" menu's 嵌入, made from an empty block: convert.mjs) is a placeholder, a gray bar,
19
+ // until something is given in the menu that opens below it at once and on a click (../media/page.mjs;
20
+ // 300px): 链接, a
21
+ // web page (https; a YouTube video shown as its player, a Google document as its preview), which the
22
+ // server asks first whether it lets other pages frame it, one that does not becoming a bookmark as
23
+ // Notion's (a bookmark's fromLink); 上传, an HTML or PDF file (20 MB at most) kept in the report's folder. One
24
+ // undo step. With the pointer on its frame, notion-lite's toolbar stands at its top right (全屏,
25
+ // 查看原始内容, 更多: the block menu) and a handle at each bottom corner: dragging one sets the frame's
26
+ // width (a share of the width it stands in, the frame centered, so both sides move) and height (96 to
27
+ // 2000px) together, one undo step on letting go (Esc puts them back). While a block or a handle is
28
+ // dragged the frames let the pointer through. 全屏 shows the page or file over the page in a frame of
29
+ // its own (Esc, 关闭 or a click beside it closes it). No caption is asked for (one the file has still
30
+ // shows). The block menu has 替换, 全屏, 查看原始内容, 复制链接, 恢复默认大小.
31
+
32
+ const MAX_BYTES = UPLOAD_LIMITS.embed;
33
+
34
+ // Its placeholder's look (every empty block's) is served with the page: ../placeholder.mjs.
35
+ const STYLE = `
36
+ html[data-ge-drag] .doc-embed-frame, html[data-ge-embed-resize] .doc-embed-frame { pointer-events: none; }
37
+ ${gestureLock("data-ge-embed-resize=\"right\"", { cursor: "nwse-resize" })}
38
+ ${gestureLock("data-ge-embed-resize=\"left\"", { cursor: "nesw-resize" })}
39
+ .ge-layer > .ge-embed-corner { pointer-events: auto; }
40
+ /* A corner handle: a plain gray bar bent round the frame's corner, no border (as the image's sides). */
41
+ .ge-embed-corner { width: 20px; height: 20px; cursor: nwse-resize; }
42
+ .ge-embed-corner[data-side="left"] { cursor: nesw-resize; }
43
+ .ge-embed-corner::after { content: ""; position: absolute; bottom: 5px; width: 9px; height: 9px; border: 0 solid light-dark(rgb(55 53 47 / 35%), rgb(255 255 255 / 38%)); border-bottom-width: 3px; transition: border-color 120ms ease; }
44
+ .ge-embed-corner[data-side="right"]::after { right: 5px; border-right-width: 3px; border-bottom-right-radius: 5px; }
45
+ .ge-embed-corner[data-side="left"]::after { left: 5px; border-left-width: 3px; border-bottom-left-radius: 5px; }
46
+ .ge-embed-corner:hover::after, html[data-ge-embed-resize] .ge-embed-corner::after { border-color: light-dark(rgb(55 53 47 / 60%), rgb(255 255 255 / 62%)); }
47
+ /* 全屏: notion-lite's panel over the page (72px from its edges, 1360px wide at most). */
48
+ .ge-embed-viewer { position: fixed; inset: 0; z-index: ${Z.viewer}; background: light-dark(rgb(15 15 15 / 60%), rgb(15 15 15 / 80%)); }
49
+ .ge-embed-viewer-panel { position: absolute; inset: 72px; max-width: 1360px; margin: 0 auto; display: flex; flex-direction: column; border-radius: 12px; overflow: hidden;
50
+ background: light-dark(#fff, #202020); box-shadow: 0 0 0 1px var(--ge-outline), 0 20px 40px rgb(0 0 0 / 30%); }
51
+ .ge-embed-viewer-bar { display: flex; align-items: center; gap: 8px; height: 45px; flex: none; padding: 0 12px 0 16px; border-bottom: 1px solid var(--ge-line);
52
+ color: var(--ge-tx); font: 500 14px/1.2 ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; }
53
+ .ge-embed-viewer-name { flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
54
+ .ge-embed-viewer-panel > iframe { flex: 1; width: 100%; min-height: 0; border: 0; background: light-dark(#fff, #191919); }
55
+ `;
56
+
57
+ /**
58
+ * Embeds on the page, with what the editor gives them: the media blocks' shared parts (`pages.media`:
59
+ * ../media/page.mjs block("embed"): the undo steps, say, active(), the block menu, the upload of
60
+ * kind "embed": { path }, the menu), embedUrl(path) (where the server shows a file of the report's
61
+ * folder in a frame), frameable(url) (whether a page lets frames show it) and the bookmarks' page
62
+ * object (`pages.bookmark`: fromLink, a bookmark of the page in the figure's place).
63
+ */
64
+ export function create({ pages, embedUrl, frameable }) {
65
+ const media = pages.media.block("embed");
66
+ const { look, say, active, openMenu } = media;
67
+ addStyle(STYLE);
68
+
69
+ // A frame of `src` (a web page, or a file of the report's folder), and an empty caption.
70
+ function frameParts(doc, src, caption = "") {
71
+ const local = !/^https:/.test(src);
72
+ const frame = doc.createElement("iframe");
73
+ frame.className = "doc-embed-frame";
74
+ showFile(frame, "src", src, local ? embedUrl(src) : src);
75
+ if (!local) {
76
+ frame.setAttribute("sandbox", WEB_SANDBOX);
77
+ frame.setAttribute("referrerpolicy", "strict-origin-when-cross-origin");
78
+ frame.setAttribute("allowfullscreen", "");
79
+ } else if (!/\.pdf$/i.test(src)) frame.setAttribute("sandbox", FILE_SANDBOX);
80
+ frame.setAttribute("loading", "lazy");
81
+ return [frame, captionNode(doc, caption)];
82
+ }
83
+
84
+ /** The 链接 / 上传 menu of an embed, below it. */
85
+ const pick = (figure) => media.pick(figure, {
86
+ tabs: [{ key: "link", label: t("链接") }, { key: "upload", label: t("上传") }],
87
+ width: 300,
88
+ link: { placeholder: t("粘贴网页链接,例如 https://…"), button: t("嵌入链接"), caption: t("适用于允许嵌入的网页。") },
89
+ upload: { label: t("选择文件"), primary: true, accept: ".html,.htm,.pdf", caption: t("支持 HTML 和 PDF 文件。") },
90
+ onEmbed: (url) => embedLink(figure, url),
91
+ onUpload: (file) => uploadInto(figure, file),
92
+ });
93
+
94
+ async function embedLink(figure, url, options = {}) {
95
+ if (!/^https:/i.test(url)) return say(t("只能嵌入 https 开头的网页。"), "error");
96
+ media.busy(figure, t("正在检查网页…"));
97
+ const answer = await frameable(url).catch(() => ({ frameable: true }));
98
+ if (!figure.isConnected) return;
99
+ if (!answer.frameable) {
100
+ media.idle(figure);
101
+ if (!pages.bookmark) return say(t("这个网页不允许嵌入。"), "error");
102
+ say(t("这个网页不允许嵌入,已改为网页书签。"));
103
+ return pages.bookmark.fromLink(figure, url, options);
104
+ }
105
+ place(figure, frameAddress(url), options);
106
+ }
107
+
108
+ async function uploadInto(figure, file) {
109
+ if (!/\.(html?|pdf)$/i.test(file.name)) return say(t("只能嵌入 HTML 或 PDF 文件。"), "error");
110
+ if (file.size > MAX_BYTES) return say(t("文件太大(最多 {0})。", sizeLimit("embed")), "error");
111
+ return media.attempt(figure, t("正在上传 {0}…", file.name), t("无法上传这个文件"), async () => place(figure, (await media.uploadFile(file)).path));
112
+ }
113
+
114
+ // The frame in: a new embed in the place of the placeholder (or of the embed replaced, with its
115
+ // caption and height), never the same element, so that undo brings back what stood there. One undo
116
+ // step; the embed selected.
117
+ function place(figure, src, { pasted = false } = {}) {
118
+ if (!figure.isConnected) return;
119
+ const doc = figure.ownerDocument;
120
+ const replacing = Boolean(frameOf(figure));
121
+ const next = newEmbed(doc);
122
+ next.classList.toggle("doc-embed--file", !/^https:/.test(src));
123
+ const height = figure.style.getPropertyValue(HEIGHT);
124
+ if (replacing && height) next.style.setProperty(HEIGHT, height);
125
+ next.replaceChildren(...frameParts(doc, src, captionOf(figure)?.innerHTML ?? ""));
126
+ media.place(figure, next, { replacing, pasted });
127
+ if (replacing) say(t("已替换嵌入内容 · Ctrl+Z 撤销"));
128
+ }
129
+
130
+ // ---------- the toolbar and the corner handles ----------
131
+
132
+ let hovered = null;
133
+ let resizing = null; // { figure, side, x, y, width, height, room, before: { height, span } }
134
+ const bar = mediaBar(t("嵌入操作"));
135
+ const tool = (label, tip, icon, run) => toolButton({ label, tip, icon, run: (button) => run(hovered, button), alive: () => hovered?.isConnected });
136
+ bar.append(
137
+ tool(t("全屏"), t("全屏查看"), TOOL_ICONS.expand, (figure) => fullScreen(figure)),
138
+ tool(t("查看原始内容"), t("在新标签页中打开"), EMBED_ICONS.open, (figure) => original(figure)),
139
+ tool(t("更多"), t("打开区块操作菜单"), TOOL_ICONS.more, (figure, button) => {
140
+ const rect = button.getBoundingClientRect();
141
+ openMenu(figure, { left: rect.left, right: rect.right, top: rect.top, bottom: rect.bottom });
142
+ }),
143
+ );
144
+ const corners = { left: element("div", { class: "ge-embed-corner", "data-side": "left" }), right: element("div", { class: "ge-embed-corner", "data-side": "right" }) };
145
+ const tools = () => [bar, corners.left, corners.right];
146
+
147
+ function show(figure) {
148
+ hovered = figure;
149
+ const frame = figure && frameOf(figure);
150
+ const shape = frame && shapeOf(frame);
151
+ if (!shape) {
152
+ hovered = null;
153
+ tools().forEach((node) => node.remove());
154
+ return;
155
+ }
156
+ const alive = () => hovered === figure && figure.isConnected;
157
+ for (const node of tools()) own(node, "embed tools", { owner: figure, alive });
158
+ const { rect } = shape;
159
+ if (bar.parentNode !== shape.layer) shape.layer.append(bar); // in the page before its width is measured
160
+ drawAt(bar, shape.layer, rect.right - 4 - bar.offsetWidth, rect.top + 4);
161
+ drawAt(corners.left, shape.layer, rect.left, rect.bottom - 20);
162
+ drawAt(corners.right, shape.layer, rect.right - 20, rect.bottom - 20);
163
+ }
164
+
165
+ // The pointer reaching a frame (its own document gets the moves inside it), or leaving it for the page.
166
+ document.addEventListener("mouseover", (event) => {
167
+ if (resizing || tools().some((node) => node.contains(event.target))) return;
168
+ const figure = active() && !keptByComponent(event.target) ? event.target.closest?.("main figure.doc-embed") ?? null : null;
169
+ if (figure !== hovered) show(figure && frameOf(figure) ? figure : null);
170
+ }, true);
171
+ addEventListener("scroll", () => { if (hovered && !resizing) show(hovered); }, { passive: true, capture: true });
172
+ // The hovered frame taken off the page by an undo, a redo or a commit: the tools go at once, not at the next pointer move.
173
+ onSettle(() => { if (hovered && !hovered.isConnected && !resizing) show(null); });
174
+
175
+ // A corner dragged: the frame's width (centered, so the corner follows the pointer and the other side
176
+ // moves as far) and height, live; one undo step on letting go.
177
+ const sizeOf = (figure) => ({ height: figure.style.getPropertyValue(HEIGHT), span: figure.style.getPropertyValue(SPAN).trim() });
178
+ const setSize = (figure, { height, span }) => {
179
+ for (const [name, value] of [[HEIGHT, height], [SPAN, span]]) value ? figure.style.setProperty(name, value) : figure.style.removeProperty(name);
180
+ };
181
+ const end = (keep) => {
182
+ if (!resizing) return;
183
+ const { figure, before } = resizing;
184
+ resizing = null;
185
+ document.documentElement.removeAttribute("data-ge-embed-resize");
186
+ const now = sizeOf(figure);
187
+ setSize(figure, before);
188
+ const changed = now.height !== before.height || now.span !== before.span;
189
+ if (keep && changed && look(figure, { sizes: { [HEIGHT]: now.height || null, [SPAN]: now.span || null } })) {
190
+ say(t("嵌入大小:{0},{1} · Ctrl+Z 撤销", now.span ? t("{0}% 宽", Math.round(Number(now.span) * 100)) : t("整行宽"), now.height || t("默认高度")));
191
+ }
192
+ show(figure);
193
+ };
194
+ for (const [side, corner] of Object.entries(corners)) {
195
+ corner.addEventListener("pointerdown", (event) => {
196
+ if (event.button !== 0 || !hovered) return;
197
+ event.preventDefault();
198
+ const figure = hovered;
199
+ const room = columnRoom(figure);
200
+ const rect = frameOf(figure).getBoundingClientRect();
201
+ resizing = { figure, side, x: event.clientX, y: event.clientY, width: rect.width, height: rect.height, room, before: sizeOf(figure) };
202
+ corner.setPointerCapture?.(event.pointerId);
203
+ document.documentElement.setAttribute("data-ge-embed-resize", side);
204
+ });
205
+ corner.addEventListener("pointermove", (event) => {
206
+ if (!resizing) return;
207
+ const { figure, x, y, width, height, room } = resizing;
208
+ let next = Math.max(room * SPAN_SIZE.min, Math.min(room, width + (event.clientX - x) * (side === "right" ? 2 : -2)));
209
+ if (room - next <= SNAP) next = room; // the whole width snaps
210
+ setSize(figure, {
211
+ height: `${Math.round(Math.max(HEIGHT_SIZE.min, Math.min(HEIGHT_SIZE.max, height + event.clientY - y)))}px`,
212
+ span: next >= room ? "" : String(Math.round((next / room) * 1000) / 1000),
213
+ });
214
+ show(figure);
215
+ });
216
+ corner.addEventListener("pointerup", () => end(true));
217
+ corner.addEventListener("pointercancel", () => end(false));
218
+ corner.addEventListener("lostpointercapture", () => end(true));
219
+ }
220
+ document.addEventListener("keydown", (event) => {
221
+ if (event.key !== "Escape" || !resizing) return;
222
+ event.preventDefault();
223
+ event.stopPropagation();
224
+ end(false);
225
+ }, true);
226
+
227
+ // ---------- the page or file itself, the block menu ----------
228
+
229
+ // The page, or the file where the preview shows it, in a new tab.
230
+ function original(figure) {
231
+ const frame = frameOf(figure);
232
+ if (frame) window.open(frame.src, "_blank", "noopener,noreferrer");
233
+ }
234
+
235
+ // Where the block shows from, absolute: a web page's address, a file's where the preview serves it.
236
+ const addressOf = (figure) => {
237
+ const frame = frameOf(figure);
238
+ return frame ? new URL(frame.getAttribute("src"), location.href).href : "";
239
+ };
240
+
241
+ // 全屏: the page or file in a frame of its own over the page (sandboxed as its frame is),
242
+ // notion-lite's panel; Esc, 关闭 or a click beside the panel closes it.
243
+ let viewer = null;
244
+ function fullScreen(figure) {
245
+ const frame = frameOf(figure);
246
+ if (!frame) return;
247
+ closeViewer();
248
+ const name = element("div", { class: "ge-embed-viewer-name", text: addressOf(figure) });
249
+ const close = element("div", { class: "ge-media-tool", role: "button", "aria-label": t("关闭"), text: "×" });
250
+ const copy = frame.cloneNode(false);
251
+ copy.removeAttribute("class");
252
+ copy.removeAttribute("style");
253
+ const panel = element("div", { class: "ge-embed-viewer-panel", role: "dialog", "aria-label": t("全屏查看") }, element("div", { class: "ge-embed-viewer-bar" }, name, close), copy);
254
+ // Over the whole window: the workbench's, when the page is shown in one (ui.mjs overlayHost).
255
+ const host = overlayHost();
256
+ addStyleTo(host.doc, TOOLBAR_STYLE);
257
+ addStyleTo(host.doc, STYLE);
258
+ const node = mountOver(host, element("div", { class: "ge-embed-viewer" }, panel));
259
+ node.addEventListener("click", (event) => { if (event.target === node || close.contains(event.target)) closeViewer(); });
260
+ const keys = (event) => {
261
+ if (event.key !== "Escape") return;
262
+ event.preventDefault();
263
+ event.stopPropagation();
264
+ closeViewer();
265
+ };
266
+ const docs = [...new Set([document, host.doc])];
267
+ docs.forEach((doc) => doc.addEventListener("keydown", keys, true));
268
+ viewer = { node, keys, docs };
269
+ }
270
+ function closeViewer() {
271
+ if (!viewer) return;
272
+ viewer.docs.forEach((doc) => doc.removeEventListener("keydown", viewer.keys, true));
273
+ viewer.node.remove();
274
+ viewer = null;
275
+ }
276
+
277
+ // 复制链接: where the block shows from.
278
+ function copyLink(figure) {
279
+ const href = addressOf(figure);
280
+ if (href) copyAddress(href, say);
281
+ }
282
+
283
+ /** An embed's rows in its block menu. */
284
+ function menuItems(target) {
285
+ if (!target?.matches?.("figure.doc-embed") || !frameOf(target)) return [];
286
+ const rows = [
287
+ { label: t("替换"), icon: ICONS.reset, run: () => setTimeout(() => pick(target)) },
288
+ { label: t("全屏"), icon: TOOL_ICONS.expand, run: () => setTimeout(() => fullScreen(target)) },
289
+ { label: t("查看原始内容"), icon: EMBED_ICONS.open, run: () => original(target) },
290
+ { label: t("复制链接"), icon: ICONS.copy, run: () => copyLink(target) },
291
+ ];
292
+ if (target.style.getPropertyValue(HEIGHT) || target.style.getPropertyValue(SPAN)) {
293
+ rows.push({ label: t("恢复默认大小"), icon: ICONS.reset, run: () => { if (look(target, { sizes: { [HEIGHT]: null, [SPAN]: null } })) say(t("已恢复默认大小 · Ctrl+Z 撤销")); } });
294
+ }
295
+ return rows;
296
+ }
297
+
298
+ return {
299
+ pick, menuItems,
300
+ /** A new one: its page or file chosen next. */
301
+ onCreated(figure) {
302
+ pick(figure);
303
+ return true;
304
+ },
305
+ /** An embed pasted with its page's address (clipboard/): checked and framed, one undo step with the paste (`options`). */
306
+ fromLink: embedLink,
307
+ get nodes() { return [...tools(), ...(viewer ? [viewer.node] : [])].filter((node) => node.isConnected); },
308
+ };
309
+ }
@@ -0,0 +1,87 @@
1
+ import { SPAN } from "../../../shared/media.mjs";
2
+ import { CHART_KEY } from "../../../shared/table-chart.mjs";
3
+ import { svg } from "../icons.mjs";
4
+ import { writtenCaption } from "../media/parts.mjs";
5
+ import { t } from "../../../shared/i18n/index.mjs";
6
+
7
+ // 卡片 (卡片块): a card (figure.doc-figure) holding a figure, a chart or a drawing of the report's
8
+ // own (its HTML, CSS or SVG), its title and caption. One block: its title and caption are text
9
+ // blocks (fields), a chart is drawn by the report's own type (DocCharts.define, its data in its
10
+ // host's JSON or a table's rows), a drawing's words are words only (text: fixed in place, never
11
+ // split, source/blocks.mjs). Its width and chart height are sizes, and it may be centered.
12
+ //
13
+ // Where the engines reach it (src/editor/page/ unless named): resize/ (dragging its right and
14
+ // bottom edges: widthAt, heightAt), page.mjs (its block menu rows: 居中显示, 全宽显示,
15
+ // 恢复默认大小), history.mjs (charts are told a size changed: setLook), src/transfer/markdown.mjs
16
+ // (`clipboard`), ../source/ (finding its title and caption).
17
+ // Its look: the kit's styles/figure.css and chart.css, its chart drawn by charts/ (src/render/kit/).
18
+ export const CENTERED = "doc-figure--compact"; // 居中显示
19
+ export const CHART_HEIGHT = "--doc-chart-height";
20
+
21
+ // A chart drawn from a table names it by a key (src/shared/table-chart.mjs): a copy of a card or a
22
+ // table pasted on the page may get keys of its own (page/clipboard/own/chart-keys.mjs), which it
23
+ // holds as JSON ({ old: new | null }) until it is a unit of the file, and which go to the server with
24
+ // it (page/core.mjs nodeOf: { copy, keys }; source/text.mjs copiedSource writes them).
25
+ export const COPY_KEYS = "data-ge-chart-keys";
26
+
27
+ /**
28
+ * A copy's keys as the page sends them, checked: { old: new | null }, each old one a key as the file
29
+ * writes it, each new one a key the page made (t1, t2 …), or null when they are not that.
30
+ */
31
+ export function copyKeys(keys) {
32
+ if (!keys || typeof keys !== "object" || Array.isArray(keys)) return null;
33
+ const entries = Object.entries(keys);
34
+ return entries.length > 0 && entries.length <= 50 && entries.every(([from, to]) => from.length > 0 && from.length <= 200 && (to === null || (typeof to === "string" && CHART_KEY.test(to)))) ? keys : null;
35
+ }
36
+
37
+ // The parts of a card a page export writes, an empty line between them: its title in bold, the chart
38
+ // as an image (`chart`: its picture in the export, else none), its tables and a drawing's words when
39
+ // there is no picture of it, the pictures it holds, its caption.
40
+ function cardParts(unit, how) {
41
+ const heading = unit.querySelector(":scope > h2, :scope > h3, :scope > h4");
42
+ const parts = heading && how.plain(heading) ? [[`**${how.inline(how.serializeInner(heading))}**`]] : [];
43
+ const link = how.chart(unit);
44
+ const charted = Boolean(unit.querySelector("[data-doc-chart]"));
45
+ if (link) parts.push([`![${how.plain(heading) || how.untitled(unit, charted)}](${link})`]);
46
+ else {
47
+ for (const inner of unit.querySelectorAll("table")) parts.push(how.writtenAs("table", inner));
48
+ // No picture of it (复制页面内容, an export with no browser): a drawing of the report's own
49
+ // says its words, as a whole block does (a chart's are its data, in its table or nowhere).
50
+ const drawing = charted ? [] : [...unit.children].filter((child) => child !== heading && !child.matches("figcaption, .doc-figure-caption, p, table, .doc-table-wrap, .doc-table-meta, script, style, template"));
51
+ const words = drawing.flatMap((part) => how.wordsIn(part, "text"));
52
+ if (words.length) parts.push([words.join(" · ")]);
53
+ }
54
+ for (const picture of how.picturesIn(unit, { tables: false })) parts.push([picture]);
55
+ const caption = writtenCaption(unit);
56
+ const said = (caption ? how.inline(how.serializeInner(caption)) : "") || [...unit.querySelectorAll(":scope > p")].map((p) => how.inline(how.serializeInner(p))).filter(Boolean).join("\n\n");
57
+ if (said) parts.push(said.split("\n"));
58
+ return parts;
59
+ }
60
+
61
+ export default {
62
+ name: "figure",
63
+ glance: [
64
+ { row: 20, name: "图表", write: "a card holding `<div data-doc-chart=\"type\">` with its data as JSON, the type defined with `DocCharts.define`; or `<table data-doc-chart=\"type\">`, drawn from its rows", after: "for the table: its frame, then a card after it, its caption the card's `h3`", rule: "Figures and charts" },
65
+ { row: 21, name: "图 (示意图、时间线)", write: "`figure.doc-figure` holding your own HTML or SVG", rule: "Figures and charts" },
66
+ ],
67
+ units: {
68
+ figure: {
69
+ name: t("卡片"),
70
+ icon: svg('<path d="M3.75 16.25h12.5"/><path d="M6.25 13.25v-3.5M10 13.25v-7.5M13.75 13.25v-5.5"/>'),
71
+ match: [{ rank: 50, tag: "figure" }],
72
+ boxed: true,
73
+ resizable: "figure[data-ge-unit]", // its right and bottom edges, once it is in the file
74
+ toggles: [CENTERED], // 居中显示
75
+ sizes: {
76
+ [SPAN]: { min: 0.15, max: 1 },
77
+ [CHART_HEIGHT]: { min: 120, max: 2000, px: true, height: true },
78
+ },
79
+ clipboard: { kind: "parts", read: cardParts, unsaid: "[data-doc-chart]" }, // copied as itself; a chart's data are no words of it
80
+ },
81
+ },
82
+ attributes: ["data-doc-chart"], // a declared chart (charts/): its type, then what it draws
83
+ hosts: {
84
+ // A card's title and caption, and the spans of a table's scope line.
85
+ field: { name: t("卡片标题和说明"), caps: ({ bound }) => bound ? ["links"] : ["remove", "links"] },
86
+ },
87
+ };
@@ -0,0 +1,33 @@
1
+ import { SPAN } from "../../../shared/media.mjs";
2
+ import { ICONS } from "../../page/menu.mjs";
3
+ import { lookRow } from "../rows.mjs";
4
+ import { CENTERED, CHART_HEIGHT } from "./index.mjs";
5
+ import { t } from "../../../shared/i18n/index.mjs";
6
+
7
+ // 卡片 on the page: its rows of the block menu (docs/editor.md, "Resizing cards, tables and
8
+ // code blocks"; resize/ drags the same sizes by their edges): the card centered or at full width,
9
+ // and back to the default size once a width or height is set.
10
+
11
+ /**
12
+ * look(element, { classes, sizes }, select): the editor's undoable change of classes and sizes
13
+ * (history.mjs); say: the status line.
14
+ */
15
+ export function create({ look, say }) {
16
+ const row = (target, options) => lookRow({ look, say }, target, options);
17
+ return {
18
+ /** The card's rows of the block menu (none for another block). */
19
+ menuItems(target) {
20
+ if (target?.getAttribute?.("data-ge-unit-kind") !== "figure") return [];
21
+ const centered = target.classList.contains(CENTERED);
22
+ const span = target.style.getPropertyValue(SPAN).trim();
23
+ const rows = [
24
+ row(target, { label: t("居中显示"), icon: ICONS.center, current: centered && span === "", change: { classes: { [CENTERED]: true }, sizes: { [SPAN]: null } }, done: t("卡片已居中显示") }),
25
+ row(target, { label: t("全宽显示"), icon: ICONS.full, current: !centered && (span === "1" || span === ""), change: { classes: { [CENTERED]: false }, sizes: { [SPAN]: null } }, done: t("卡片已全宽显示") }),
26
+ ];
27
+ if (span !== "" || target.style.getPropertyValue(CHART_HEIGHT).trim() !== "") {
28
+ rows.push(row(target, { label: t("恢复默认大小"), icon: ICONS.reset, current: false, change: { sizes: { [SPAN]: null, [CHART_HEIGHT]: null } }, done: t("已恢复默认大小") }));
29
+ }
30
+ return rows;
31
+ },
32
+ };
33
+ }
@@ -0,0 +1,14 @@
1
+ import { svg } from "../icons.mjs";
2
+
3
+ // The file block's icons: the editor's own line drawings (components/icons.mjs svg), no size or color of
4
+ // their own: the bar, the menus and the kit's file row (styles/file.css, which draws 上传 and 下载 as a
5
+ // mask of these two) set them.
6
+
7
+ export const FILE_ICONS = {
8
+ // A sheet with its corner folded and an arrow rising from its middle.
9
+ upload: svg('<path d="M6.25 2.75h4.5l4.5 4.5v8.5a1.5 1.5 0 0 1-1.5 1.5h-7.5a1.5 1.5 0 0 1-1.5-1.5v-11.5a1.5 1.5 0 0 1 1.5-1.5z"/><path d="M10.75 2.75v3a1.5 1.5 0 0 0 1.5 1.5h3"/><path d="M10 14v-4.75M7.9 11.1 10 9l2.1 2.1"/>'),
10
+ // An arrow down in a ring.
11
+ download: svg('<circle cx="10" cy="10" r="7.25"/><path d="M10 6.5v6.25M7.4 10.2 10 12.8l2.6-2.6"/>'),
12
+ // A clip.
13
+ paperclip: svg('<path d="M15.2 9.2 9.6 14.8a3.6 3.6 0 0 1-5.1-5.1l6.1-6.1a2.4 2.4 0 0 1 3.4 3.4l-6.1 6.1a1.2 1.2 0 0 1-1.7-1.7l5.4-5.4"/>'),
14
+ };
@@ -0,0 +1,77 @@
1
+ import { FILE_ICONS } from "./icons.mjs";
2
+ import { captionWords, fileOf, mediaReadOnly, newMediaFigure, writtenCaption } from "../media/parts.mjs";
3
+ import { barMarkup } from "../placeholder-bar.mjs";
4
+ import { t } from "../../../shared/i18n/index.mjs";
5
+
6
+ // 文件 (Notion's file block): the kit's figure.doc-file, one file of the report's folder
7
+ // (assets/<file>) as a row the reader clicks to save it, its name and size, and its caption, a
8
+ // <figcaption> always written (empty while there is none; a media block's caption, components/media/).
9
+ // A card: one block, moved, deleted, captioned, replaced as a whole; the name and size are the
10
+ // file's. Made from an empty block (the "/" menu: 文件) or a file pasted: a placeholder until a file
11
+ // is chosen (上传, or a link whose file the server downloads into the report's folder:
12
+ // editor/media-store.mjs), written once it has one. page.mjs: the picker, the block
13
+ // menu's rows; file.mjs: a new one in report.html.
14
+ //
15
+ // Where the engines reach it (src/editor/page/ unless named): convert.mjs (made from an empty block:
16
+ // `create`), editor.mjs (the picker opens on a new one: page.mjs `onCreated`), clipboard/ (a file
17
+ // pasted), src/transfer/markdown.mjs (`clipboard`), ../source/ (its caption: blocks.mjs). Its look: the kit's styles/file.css (src/render/kit/); its
18
+ // file handed out by the preview and embedded in an export: src/render/files.mjs.
19
+ export const PAPERCLIP = FILE_ICONS.paperclip;
20
+
21
+ /**
22
+ * A file block's placeholder bar, as markup: in a new one, and in one the file keeps empty from the first paint (the server
23
+ * puts it there: components/placeholder.mjs showEmpty).
24
+ */
25
+ const placeholder = () => barMarkup("doc-file", FILE_ICONS.upload, t("上传文件")); // its words in the language t() says them in now (placeholder.mjs showEmpty)
26
+
27
+ export default {
28
+ name: "file",
29
+ listed: () => t("文件"),
30
+ readOnly: [mediaReadOnly("file")],
31
+ units: {
32
+ file: { name: t("文件"), match: [{ rank: 44, tag: "figure", class: "doc-file" }], boxed: true },
33
+ },
34
+ types: {
35
+ file: {
36
+ menu: ["advanced", 18], fresh: 3,
37
+ tag: "figure", className: "doc-file", kind: "file", bare: true,
38
+ create: ({ doc, put }) => put(newFile(doc)), // its placeholder stands for the empty block; what it holds is chosen next
39
+ clipboard: {
40
+ kind: "media",
41
+ read(unit, { plain }) {
42
+ const link = unit.querySelector(":scope > a.doc-file-link");
43
+ const href = link?.getAttribute("href");
44
+ if (!href) return null;
45
+ const name = link.getAttribute("download") || plain(link.querySelector(".doc-file-name")) || href.split("/").pop();
46
+ return { label: name, src: href, name, file: true, caption: writtenCaption(unit) };
47
+ },
48
+ },
49
+ // What a new one is written with (core.mjs nodeOf): its file, name, size and caption; an empty
50
+ // figure while it has no file (its placeholder, kept: file.mjs).
51
+ extras: (element) => fileNode(element),
52
+ part: ".doc-file",
53
+ bar: placeholder,
54
+ label: t("文件"), icon: PAPERCLIP,
55
+ words: "文件 附件 上传 wenjian wj fujian fj file attachment upload",
56
+ glance: { row: 17, name: "文件", write: "`figure.doc-file`", rule: "Kit blocks" },
57
+ },
58
+ },
59
+ };
60
+
61
+ /** A file block's link, once it has a file. */
62
+ export const linkOf = (figure) => figure.querySelector(":scope > a.doc-file-link[data-ge-href]");
63
+
64
+ // What a new file is written with: its file (not where the preview hands it out), its name, size and caption.
65
+ function fileNode(figure) {
66
+ const link = linkOf(figure);
67
+ const size = link?.querySelector(".doc-file-size")?.textContent ?? "";
68
+ return {
69
+ href: fileOf(link, "href") ?? "",
70
+ name: link?.querySelector(".doc-file-name")?.textContent ?? "",
71
+ ...(size ? { size } : {}),
72
+ caption: captionWords(figure),
73
+ };
74
+ }
75
+
76
+ /** A new file block (the "/" menu's 文件): its placeholder (上传文件), until a file is chosen (page.mjs). */
77
+ export const newFile = (doc) => newMediaFigure(doc, "file", placeholder());
@@ -0,0 +1,114 @@
1
+ import { UPLOAD_LIMITS, sizeLimit } from "../../../shared/media.mjs";
2
+ import { ICONS } from "../../page/menu.mjs";
3
+ import { TOOL_ICONS } from "../media/icons.mjs";
4
+ import { captionNode, captionOf, showFile } from "../media/parts.mjs";
5
+ import { FILE_ICONS } from "./icons.mjs";
6
+ import { formatSize } from "../../../shared/media.mjs";
7
+ import { linkOf, newFile } from "./index.mjs";
8
+ import { t } from "../../../shared/i18n/index.mjs";
9
+
10
+ // 文件 on the page (notion-lite's src/blocks/file/edit.js, Notion's 957562). A new file block (the
11
+ // "/" menu's 文件, made from an empty block: convert.mjs; or a file pasted that is no image) is a
12
+ // placeholder, a gray bar saying 上传文件, until a file is chosen in the 上传 / 链接 menu
13
+ // (media-menu/, 300px: 选择文件, or a link whose file the server downloads; it opens below it at
14
+ // once, and on a click: ../media/page.mjs): the file goes to the report's folder (20 MB at most), and the block shows
15
+ // its row, its name and size. One undo step. The row hands the file out for saving, as the report
16
+ // does. Its caption is a media block's (../media/page.mjs: shown once 标题 asks for it).
17
+ // The block menu has 替换文件, 下载 and 标题 (menuItems).
18
+
19
+ const MAX_BYTES = UPLOAD_LIMITS.file;
20
+
21
+ // A file of the report's folder (`path`) where the server hands it out (`url`), named and sized, and an empty caption.
22
+ function fileParts(doc, { path, name, size }, url, caption = "") {
23
+ const link = doc.createElement("a");
24
+ link.className = "doc-file-link";
25
+ showFile(link, "href", path, url);
26
+ link.setAttribute("download", name);
27
+ link.setAttribute("contenteditable", "false");
28
+ const title = doc.createElement("span");
29
+ title.className = "doc-file-name";
30
+ title.textContent = name;
31
+ link.append(title);
32
+ if (Number.isFinite(size)) {
33
+ const weight = doc.createElement("span");
34
+ weight.className = "doc-file-size";
35
+ weight.textContent = formatSize(size);
36
+ link.append(weight);
37
+ }
38
+ return [link, captionNode(doc, caption)];
39
+ }
40
+
41
+ /**
42
+ * File blocks on the page, with what the editor gives them: the media blocks' shared parts
43
+ * (`pages.media`: ../media/page.mjs block("file"): the undo steps, say, select, the upload of kind "file":
44
+ * { path, name, size }, the menu, the caption) and fileUrl(path) (where the server hands out a file
45
+ * of the report's folder).
46
+ */
47
+ export function create({ pages, fileUrl }) {
48
+ const media = pages.media.block("file");
49
+ const { say } = media;
50
+
51
+ /** The 上传 / 链接 menu of a file block, below it. */
52
+ const pick = (figure) => media.pick(figure, {
53
+ tabs: [{ key: "upload", label: t("上传") }, { key: "link", label: t("链接") }],
54
+ width: 300,
55
+ upload: { label: t("选择文件"), primary: true },
56
+ link: { placeholder: t("粘贴文件链接…"), button: t("嵌入链接"), caption: t("适用于任何文件的网址。") },
57
+ onUpload: (file) => uploadInto(figure, file),
58
+ onEmbed: (url) => fetchInto(figure, url),
59
+ });
60
+
61
+ async function uploadInto(figure, file) {
62
+ if (file.size > MAX_BYTES) return say(t("文件太大(最多 {0})。", sizeLimit("file")), "error");
63
+ return media.attempt(figure, t("正在上传 {0}…", file.name), t("无法上传这个文件"), async () => place(figure, await media.uploadFile(file)));
64
+ }
65
+
66
+ const fetchInto = (figure, url) => media.attempt(figure, t("正在下载…"), t("无法下载这个文件"), async () => place(figure, await media.uploadUrl(url)));
67
+
68
+ // The file in: a new block in the place of the placeholder, or of the block that had one (替换文件,
69
+ // with its caption), never the same element, so that undo brings back what stood there (a
70
+ // placeholder never written, a block as it was) and the file loses the new one. One undo step; the
71
+ // block selected.
72
+ function place(figure, answer) {
73
+ if (!figure.isConnected) return;
74
+ const doc = figure.ownerDocument;
75
+ const replacing = Boolean(linkOf(figure));
76
+ const next = newFile(doc);
77
+ next.replaceChildren(...fileParts(doc, answer, fileUrl(answer.path), captionOf(figure)?.innerHTML ?? ""));
78
+ media.place(figure, next, { replacing });
79
+ if (replacing) say(t("已替换文件 · Ctrl+Z 撤销"));
80
+ }
81
+
82
+ // Saving the file, as a click on its row does.
83
+ function download(figure) {
84
+ const link = linkOf(figure);
85
+ if (!link) return;
86
+ const save = figure.ownerDocument.createElement("a");
87
+ save.href = link.href;
88
+ save.download = link.getAttribute("download") ?? "";
89
+ save.click();
90
+ }
91
+
92
+ /** A file block's rows in its block menu. */
93
+ function menuItems(target) {
94
+ if (!target?.matches?.("figure.doc-file") || !linkOf(target)) return [];
95
+ return [
96
+ { label: t("替换文件"), icon: ICONS.reset, run: () => setTimeout(() => pick(target)) },
97
+ { label: t("下载"), icon: FILE_ICONS.download, run: () => download(target) },
98
+ { label: t("标题@caption"), icon: TOOL_ICONS.caption, run: () => setTimeout(() => media.caption(target)) },
99
+ ];
100
+ }
101
+
102
+ return {
103
+ pick, menuItems,
104
+ /** Whether a file makes a file block: any that is no image. */
105
+ acceptsFile: (file) => !/^image\//.test(file.type),
106
+ /** A file block below the block of `host` (a text block), `file` uploaded. Returns whether it took it. */
107
+ fromFiles: (host, [file]) => media.paste(host, file, newFile, uploadInto),
108
+ /** A new one: its file chosen next. */
109
+ onCreated(figure) {
110
+ pick(figure);
111
+ return true;
112
+ },
113
+ };
114
+ }