@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,453 @@
1
+ import { UNIT, boldThroughout, dropIfEmpty, emptyContainer, firstLineOf, heldIn, isEmpty, isFirstLine, isHost, nestedBlocks, newContainer, newHost, ownHTML } from "../../page/core.mjs";
2
+ import { arrow, atEdge, caretAt, hosts } from "../../page/caret.mjs";
3
+ import { begin, done, made } from "../../page/made.mjs";
4
+ import { formatRange } from "../../page/marks.mjs";
5
+ import { ICONS } from "../../page/menu.mjs";
6
+ import { TOGGLES, accepts, sizeValue, textTypeOf } from "../registry.mjs";
7
+ import { START, validStart } from "../list/index.mjs";
8
+ import { FLOW_DIRECTION, FLOW_RATIO, isFlowchart, isStep, nodeAround, validDirection } from "./index.mjs";
9
+ import { FLOW_ROW, flowShares } from "../../../shared/components/list.mjs";
10
+ import { svg } from "../icons.mjs";
11
+ import { addStyle } from "../../page/ui.mjs";
12
+ import { t } from "../../../shared/i18n/index.mjs";
13
+
14
+ // 步骤流程图 on the page (index.mjs; docs/editor.md, "Flowcharts"). A node is a container as a
15
+ // highlight block is, its keys the highlight block's (Enter splits the block the caret is in,
16
+ // Backspace at a block's start joins it to the block above, an empty one deleted, Delete joins the
17
+ // block after it), the list machinery never reaching it (core.mjs: parentItem, holderItem,
18
+ // previousLine and nextLine stop at it), and a few rules of its own (the mock's keys table):
19
+ // - Enter on the empty last block of a node (not its first line) takes that block out of the node:
20
+ // it is the first line of a new node right after it (`enter`);
21
+ // - Enter on the empty first line of the flowchart's last node, which holds nothing else, takes the
22
+ // node out of the flowchart: its line a body paragraph right after the flowchart (`enter`);
23
+ // - Enter in the first line splits it, what follows the caret a plain paragraph below it, never a
24
+ // new node or a list (core.mjs splitBlock); at its very start, with words in it, a new node goes
25
+ // before this one, the caret and the words (their bold too) staying where they are (`enterAtStart`);
26
+ // - Backspace at the start of a node's first line deletes the node when nothing is written in it
27
+ // (core.mjs emptyContainer: the step is `removedEmpty`), and otherwise changes nothing, the caret
28
+ // going to the end of the node before (`backspace`); a block of its content never leaves it by
29
+ // Backspace or Shift+Tab (a list item of it at its start a paragraph of the node, as in a
30
+ // highlight block: components/list/page.mjs);
31
+ // - Delete at the end of a node's last block does nothing: neither the next node nor the block
32
+ // after the flowchart is taken in (`forwardDelete`; core.mjs nextLine);
33
+ // - Tab and Shift+Tab indent only within the lists a node holds; nodes never nest (`tab`: a hint).
34
+ // A new node comes after one from the round "+" at its right (add.mjs) and from its block menu
35
+ // (在后面添加节点, menuItems), one undo step, the caret in its empty first line, bold armed
36
+ // (format-bar/). The conversions' DOM work (a list's item made a node and back, a whole list made a
37
+ // flowchart and back) is here; where they take a block out of its container and put it back
38
+ // (convert.mjs) they are the conversions'.
39
+ //
40
+ // The layout tools (the user's interpretation A of 2026-10-25, the mock's): 方向 in the block menu of
41
+ // the flowchart (自动换行, 排成一行, 排成一列: the list's data-direction) and of a node (under 这个节点之后:
42
+ // 跟随整体, 向右, 向下: the node's own data-direction, for the joint after it; then the flowchart's
43
+ // three, under 整个流程图, the handles a reader finds on a flowchart being its nodes'), one undo step
44
+ // each (menuItems); and the widths of the nodes of a row, dragged at the gap between two of them (the gap
45
+ // tool of 分栏, page/columns/, which finds a flowchart's rows here: rowsOfFlow, rowShares,
46
+ // leastWidth), written as each node's weight in its row (--doc-flow-ratio).
47
+
48
+ // ---------- nodes and titles (DOM only; tested with jsdom) ----------
49
+
50
+ /** The node (a flowchart's step) a block stands right in, or null. */
51
+ export const stepOf = (block) => (isStep(block?.parentElement) ? block.parentElement : null);
52
+
53
+ // The whole text of a block as a range.
54
+ const wholeOf = (host) => {
55
+ const range = host.ownerDocument.createRange();
56
+ range.selectNodeContents(host);
57
+ return range;
58
+ };
59
+
60
+ /**
61
+ * A paragraph made a node's title: its text bold throughout (<p><strong>…</strong></p>), unless it
62
+ * is so already or empty (an empty one is empty: bold is armed in it as the caret comes, format-bar/).
63
+ * Returns it.
64
+ */
65
+ export function asTitle(paragraph) {
66
+ if (isEmpty(paragraph)) paragraph.replaceChildren();
67
+ else if (!boldThroughout(paragraph)) formatRange(paragraph, wholeOf(paragraph), "bold", true);
68
+ return paragraph;
69
+ }
70
+
71
+ /** A title's words as the own text of a list item made of its node: its bold taken off when it covers them all (as inline HTML). */
72
+ export function titleWords(paragraph) {
73
+ const copy = paragraph.cloneNode(true);
74
+ if (boldThroughout(copy)) formatRange(copy, wholeOf(copy), "bold", false);
75
+ return ownHTML(copy);
76
+ }
77
+
78
+ // The color classes of an element that a unit kind takes (an item's for a node, a node's for an item).
79
+ const colorsFor = (element, kind) => [...element.classList].filter((name) => (TOGGLES[kind] ?? []).includes(name));
80
+
81
+ /**
82
+ * A new node (a step and its node box, a container the change made) holding `blocks`, its icon
83
+ * first when one is among them; an empty title made first when no paragraph comes first after its
84
+ * icon (a node's first block is always one). `colors`: its color classes.
85
+ */
86
+ export function newStep(doc, blocks = [], colors = []) {
87
+ const step = made(newContainer(doc, "step"));
88
+ for (const name of colors) step.classList.add(name);
89
+ const icon = blocks.find((block) => block.matches?.(".doc-icon")) ?? null;
90
+ const rest = blocks.filter((block) => block !== icon);
91
+ const first = rest[0];
92
+ const title = first && textTypeOf(first) === "paragraph" ? [] : [newHost(doc, "paragraph")];
93
+ step.append(...(icon ? [icon] : []), ...title, ...rest);
94
+ return step;
95
+ }
96
+
97
+ /** A list's item made a node: its words its title (bold), the blocks it holds its content, its color its own. */
98
+ export function stepFromItem(item) {
99
+ const doc = item.ownerDocument;
100
+ const title = newHost(doc, "paragraph");
101
+ title.innerHTML = ownHTML(item);
102
+ return newStep(doc, [asTitle(title), ...nestedBlocks(item)], colorsFor(item, "step"));
103
+ }
104
+
105
+ /** A node made a list's item: its title's words its own text (bold taken off), the rest of its blocks held after them; its icon is left behind. */
106
+ export function itemFromStep(step) {
107
+ const doc = step.ownerDocument;
108
+ const item = newHost(doc, "item");
109
+ for (const name of colorsFor(step, "item")) item.classList.add(name);
110
+ const first = firstLineOf(step);
111
+ if (first) item.innerHTML = titleWords(first);
112
+ // What it holds is no part of the item's text (core.mjs editableAhead does the same for an item the file has).
113
+ const held = heldIn(step).filter((block) => block !== first);
114
+ for (const block of held) if (block.getAttribute("contenteditable") !== "true") block.setAttribute("contenteditable", "false");
115
+ item.append(...held);
116
+ return item;
117
+ }
118
+
119
+ /**
120
+ * A list (a whole one) turned into a flowchart in its place: each of its items a node (stepFromItem),
121
+ * what an item holds that node's content as it is; its first number (an ol's) and its direction, when
122
+ * it has them, kept. Returns the flowchart.
123
+ */
124
+ export function flowchartFromList(list) {
125
+ const flow = made(newContainer(list.ownerDocument, "flowchart"));
126
+ if (list.localName === "ol" && validStart(list.getAttribute(START))) flow.setAttribute(START, list.getAttribute(START));
127
+ if (validDirection(list.getAttribute(FLOW_DIRECTION))) flow.setAttribute(FLOW_DIRECTION, list.getAttribute(FLOW_DIRECTION));
128
+ flow.append(...[...list.children].filter((child) => child.localName === "li").map(stepFromItem));
129
+ list.replaceWith(flow);
130
+ return flow;
131
+ }
132
+
133
+ /**
134
+ * A flowchart turned into a list of `type` (bullets, numbers, todo) in its place: each node an item
135
+ * (itemFromStep); a numbered list keeps its first number. Returns the list.
136
+ */
137
+ export function listFromFlowchart(flow, type) {
138
+ const list = made(newContainer(flow.ownerDocument, type));
139
+ if (type === "numbers" && validStart(flow.getAttribute(START))) list.setAttribute(START, flow.getAttribute(START));
140
+ list.append(...[...flow.children].filter(isStep).map(itemFromStep));
141
+ flow.replaceWith(list);
142
+ return list;
143
+ }
144
+
145
+ /**
146
+ * A highlight block turned into a flowchart of one node holding its blocks as they are (its icon in
147
+ * the number's place, an empty title first when its first block is no paragraph), its background the
148
+ * node's. Returns the flowchart.
149
+ */
150
+ export function flowchartFromPanel(panel) {
151
+ const doc = panel.ownerDocument;
152
+ const flow = made(newContainer(doc, "flowchart"));
153
+ const blocks = [...panel.children].filter((child) => child.matches(UNIT));
154
+ flow.append(newStep(doc, blocks, colorsFor(panel, "step")));
155
+ panel.replaceWith(flow);
156
+ return flow;
157
+ }
158
+
159
+ /** A node's blocks for a highlight block made of it (its icon among them), its background the block's. */
160
+ export const panelColors = (step) => colorsFor(step, "highlight");
161
+
162
+ // ---------- rows and widths (read from the page) ----------
163
+
164
+ /**
165
+ * A flowchart's rows as the kit laid them out (runtime/flowchart.js): its nodes shown, in order, a row
166
+ * the run of them whose cards stand at one height (a flex line: its cards' tops are one), the next
167
+ * row lower. One list of nodes a row.
168
+ */
169
+ export function rowsOfFlow(flow) {
170
+ const rows = [];
171
+ let top = null;
172
+ for (const step of [...flow.children].filter(isStep)) {
173
+ const rect = step.getBoundingClientRect();
174
+ if (rect.width === 0 && rect.height === 0) continue;
175
+ if (top !== null && Math.abs(rect.top - top) < 2) rows.at(-1).push(step);
176
+ else rows.push([step]);
177
+ top = rect.top;
178
+ }
179
+ return rows;
180
+ }
181
+
182
+ /** A node's weight in its row as its style attribute writes it (--doc-flow-ratio: a positive number), or null. */
183
+ export function weightOf(step) {
184
+ const value = Number(step.style.getPropertyValue(FLOW_RATIO).trim() || NaN);
185
+ return value > 0 && Number.isFinite(value) ? value : null;
186
+ }
187
+
188
+ /** The shares of the row's width the nodes of a row take now, as the kit lays them out (the shared description's flowShares). */
189
+ export const rowShares = (steps) => flowShares(steps.map(weightOf));
190
+
191
+ /** A share written as a node's weight (to three places; the least a part of a row takes, at most all of it). */
192
+ export const weightValue = (share) => sizeValue("step", FLOW_RATIO, String(share));
193
+
194
+ // A run of letters, digits and marks a line cannot break in (a Chinese, Japanese or Korean character
195
+ // is a word of its own, narrower than any card: the kit's runtime/flowchart.js WORDS).
196
+ const LONG_WORD = /[^\s\u2e80-\u9fff\uac00-\ud7af\uf900-\ufaff\uff00-\uffef]{2,}/g;
197
+ // The elements whose box a line of words starts in (where a word's line begins: a list's indent, a quote's).
198
+ const LINE_START = "p, h1, h2, h3, h4, h5, h6, li, blockquote, figcaption, td, th, summary, div";
199
+
200
+ /**
201
+ * The narrowest a node's card may be drawn beside others (px), as the kit lays it out (runtime/
202
+ * flowchart.js `fits`): FLOW_ROW.least, and its longest word with what stands beside it (from the
203
+ * card's left edge to where that word's line starts: its padding and border, a list's or a quote's
204
+ * indent; its padding and border on the right). Its words measured where they are drawn (a range's
205
+ * boxes), its icon's and the editor's own drawings left out.
206
+ */
207
+ export function leastWidth(step) {
208
+ const card = step.getBoundingClientRect();
209
+ const style = getComputedStyle(step);
210
+ const right = (parseFloat(style.paddingRight) || 0) + (parseFloat(style.borderRightWidth) || 0);
211
+ const walker = step.ownerDocument.createTreeWalker(step, NodeFilter.SHOW_TEXT, {
212
+ acceptNode: (node) => (node.parentElement?.closest("[data-doc-dev], .doc-icon") ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT),
213
+ });
214
+ const range = step.ownerDocument.createRange();
215
+ let least = FLOW_ROW.least;
216
+ for (let text = walker.nextNode(); text; text = walker.nextNode()) {
217
+ for (const match of text.data.matchAll(LONG_WORD)) {
218
+ range.setStart(text, match.index);
219
+ range.setEnd(text, match.index + match[0].length);
220
+ const width = [...range.getClientRects()].reduce((sum, box) => sum + box.width, 0);
221
+ const line = text.parentElement.closest(LINE_START) ?? step;
222
+ const lineStyle = getComputedStyle(line);
223
+ const start = line === step ? card.left + (parseFloat(style.borderLeftWidth) || 0) + (parseFloat(style.paddingLeft) || 0)
224
+ : line.getBoundingClientRect().left + (parseFloat(lineStyle.borderLeftWidth) || 0) + (parseFloat(lineStyle.paddingLeft) || 0);
225
+ least = Math.max(least, Math.ceil(start - card.left + width + right));
226
+ }
227
+ }
228
+ return least;
229
+ }
230
+
231
+ // ---------- directions (方向) ----------
232
+
233
+ // The mock's icons, on the 20-unit grid at the menus' line weight (menu.mjs): the 方向 row a node and
234
+ // its two ways out (right and down); 自动换行 (跟随整体) a node and a spark (the kit measures); 接在右边
235
+ // (排成一行) two nodes side by side and the arrow between them; 接在下边 (排成一列) one below the other
236
+ // and the arrow down.
237
+ const ROUTE_ICON = svg('<rect x="2.75" y="2.75" width="5" height="5" rx="1.25"/><path d="M9.75 5.25h6.5M14.5 3.5l1.75 1.75-1.75 1.75"/><path d="M5.25 9.75v6.5M3.5 14.5l1.75 1.75 1.75-1.75"/>');
238
+ const AUTO_ICON = svg('<rect x="2.75" y="7.25" width="9.5" height="8.5" rx="2"/><path d="M15.25 2.5c.3 1.55.95 2.2 2.5 2.5-1.55.3-2.2.95-2.5 2.5-.3-1.55-.95-2.2-2.5-2.5 1.55-.3 2.2-.95 2.5-2.5z" fill="currentColor" stroke-width="1"/>');
239
+ const RIGHT_ICON = svg('<rect x="2.25" y="7.25" width="4.25" height="5.5" rx="1.25"/><rect x="13.5" y="7.25" width="4.25" height="5.5" rx="1.25"/><path d="M8 10h4M10.5 8.5 12 10l-1.5 1.5"/>');
240
+ const DOWN_ICON = svg('<rect x="7.25" y="2.25" width="5.5" height="4.25" rx="1.25"/><rect x="7.25" y="13.5" width="5.5" height="4.25" rx="1.25"/><path d="M10 8v4M8.5 10.5 10 12l1.5-1.5"/>');
241
+
242
+ // The flowchart's three (its data-direction), each its words alone, no note under it (the user,
243
+ // 2026-10-25): 自动换行 none (the kit fills rows as wide as read well and wraps the rest onto the next:
244
+ // the user's decision of 2026-10-25), 排成一行 row (one row, wrapping only where a card would be
245
+ // narrower than it may be), 排成一列 column (one node a row).
246
+ const FLOW_CHOICES = [
247
+ { value: null, label: t("自动换行"), icon: AUTO_ICON },
248
+ { value: "row", label: t("排成一行"), icon: RIGHT_ICON },
249
+ { value: "column", label: t("排成一列"), icon: DOWN_ICON },
250
+ ];
251
+ // A node's three (its own data-direction, for the joint after it, winning over the flowchart's),
252
+ // no note under them either: 跟随整体 none (the flowchart's), 接在右边 row (the next node beside it,
253
+ // past the kit's count while the cards keep their least width), 接在下边 column (the row ends after it,
254
+ // the arrow turning from this row's end to the next row's start).
255
+ const NODE_CHOICES = [
256
+ { value: null, label: t("跟随整体"), icon: AUTO_ICON },
257
+ { value: "row", label: t("接在右边"), icon: RIGHT_ICON },
258
+ { value: "column", label: t("接在下边"), icon: DOWN_ICON },
259
+ ];
260
+
261
+ // ---------- keys, a new node ----------
262
+
263
+ // A node keeps its card's corners while edited (the kit's, flowchart.css), the blocks in it a text
264
+ // block's (editor.mjs --ge-text-radius, passed down to them otherwise); an empty title says what it is
265
+ // at the title's weight (the editor's placeholder, typing/ updatePlaceholder).
266
+ const STYLE = `
267
+ [data-ge-editing] ol.doc-flow > li { --ge-text-radius: 8px; }
268
+ [data-ge-editing] ol.doc-flow > li > * { --ge-text-radius: 3px; }
269
+ [data-ge-editing] ol.doc-flow > li > p[data-ge-placeholder]:first-of-type::before { font-weight: 600; }
270
+ `;
271
+
272
+ /**
273
+ * Flowcharts' keys, a new node and 方向, with what the editor gives it: struct (a structural undo
274
+ * step), look (an undoable change of a block's attributes, history.mjs: look(element, change,
275
+ * select), `select` selected again on undo) and say (the status line).
276
+ */
277
+ export function create({ struct, look, say }) {
278
+ addStyle(STYLE);
279
+ /**
280
+ * A new node right after `step`, its first line empty (bold armed there as the caret comes:
281
+ * format-bar/), the caret in it: one undo step. Returns the new node. `before`: right before
282
+ * `step` instead (the block handle's "+" with Alt).
283
+ */
284
+ function addAfter(step, { before = false } = {}) {
285
+ if (!step?.isConnected || !step.parentElement?.hasAttribute("data-ge-box")) return null;
286
+ let node = null;
287
+ const result = struct([step.parentElement], [], () => {
288
+ begin();
289
+ node = newStep(step.ownerDocument);
290
+ if (before) step.before(node);
291
+ else step.after(node);
292
+ const { created } = done(null);
293
+ const title = firstLineOf(node);
294
+ return { touched: [title], focus: title, created };
295
+ });
296
+ if (!result) return null;
297
+ caretAt(result.focus, "start");
298
+ say(t("已添加节点 · Ctrl+Z 撤销"));
299
+ return node;
300
+ }
301
+
302
+ // Enter on an empty block of a node. True when it was the node's: its empty last block (not its
303
+ // first line) the first line of a new node after it (an empty paragraph the block was, or one
304
+ // standing for it); the empty first line of the flowchart's last node, holding nothing else, a
305
+ // body paragraph after the flowchart (the node going, and the flowchart when it had no other).
306
+ function enter(host) {
307
+ const step = stepOf(host);
308
+ if (!step || !isEmpty(host) || !isHost(host)) return false;
309
+ const held = heldIn(step);
310
+ const flow = step.parentElement;
311
+ if (!isFirstLine(host)) {
312
+ if (held.at(-1) !== host) return false;
313
+ const result = struct([flow, step], [host], () => {
314
+ begin();
315
+ const paragraph = host.localName === "p" && !host.classList.contains("doc-note") ? host : newHost(host.ownerDocument, "paragraph");
316
+ if (paragraph !== host) host.remove();
317
+ step.after(newStep(host.ownerDocument, [paragraph]));
318
+ const { created } = done(null);
319
+ return { touched: [paragraph], focus: paragraph, created };
320
+ });
321
+ if (!result) return false;
322
+ caretAt(result.focus, "start");
323
+ return true;
324
+ }
325
+ if (held.length !== 1 || [...flow.children].filter(isStep).at(-1) !== step) return false;
326
+ if (!accepts(flow.parentElement?.getAttribute("data-ge-box-kind"), "paragraph") || flow.hasAttribute("data-ge-keep")) return false;
327
+ const result = struct([flow.parentElement, flow, step], [host], () => {
328
+ flow.after(host);
329
+ step.remove();
330
+ dropIfEmpty(flow);
331
+ return { touched: [host], focus: host };
332
+ });
333
+ if (!result) return false;
334
+ caretAt(host, "start");
335
+ return true;
336
+ }
337
+
338
+ // Enter with the caret at the very start of a node's first line holding words: a new node before
339
+ // this one, its first line empty (bold armed there as the caret comes), the caret staying at the
340
+ // start of this one's, whose words keep their bold (a list makes an empty item before an item so,
341
+ // and a highlight block an empty line before its first one: nothing goes before a node's first
342
+ // line in it, so the empty line is a node of its own). One undo step. True when it was the node's.
343
+ function enterAtStart(host) {
344
+ const step = stepOf(host);
345
+ if (!step || !isFirstLine(host) || isEmpty(host) || !atEdge(host, false) || !step.parentElement?.hasAttribute("data-ge-box")) return false;
346
+ const result = struct([step.parentElement], [], () => {
347
+ begin();
348
+ const node = newStep(step.ownerDocument);
349
+ step.before(node);
350
+ const { created } = done(null);
351
+ return { touched: [firstLineOf(node)], focus: host, created };
352
+ });
353
+ if (!result) return false;
354
+ caretAt(host, "start");
355
+ return true;
356
+ }
357
+
358
+ // Backspace at the start of a node's first line, the node holding something (an empty one is
359
+ // deleted whole, core.mjs emptyContainer, by typing/): nothing changes but the caret, which goes to the
360
+ // end of the node before, where ← takes it from here (caret.mjs arrow: the end of that node's last
361
+ // block, a code block there opened at the end of its code, a closed disclosure there at the end of
362
+ // its title; the text blocks alone would skip a code block not open yet); in the first node it
363
+ // stays, and the status line says why. True when it was the node's.
364
+ function backspace(host) {
365
+ if (!isFirstLine(host) || !stepOf(host) || emptyContainer(host)) return false;
366
+ const step = stepOf(host);
367
+ const before = step.previousElementSibling;
368
+ if (!isStep(before)) {
369
+ say(t("节点里还有内容:清空后再按 Backspace 会删除节点"));
370
+ return true;
371
+ }
372
+ if (arrow(host, "ArrowLeft")) return true;
373
+ const last = hosts().filter((node) => before.contains(node)).at(-1);
374
+ if (last) caretAt(last, "end");
375
+ return true;
376
+ }
377
+
378
+ // Delete at the end of a text block in a node. True when it was the node's: at the end of the
379
+ // node's last block nothing happens (the next node and the block after the flowchart stay where
380
+ // they are); an empty first line with blocks after it is not deleted (a node's first block is
381
+ // always its title): the block after it joins it as Delete joins any (typing/).
382
+ function forwardDelete(host) {
383
+ const step = nodeAround(host);
384
+ if (!step) return false;
385
+ return hosts().filter((node) => nodeAround(node) === step).at(-1) === host;
386
+ }
387
+
388
+ // Tab and Shift+Tab in a node that the lists did not take (components/list/page.mjs takes them in
389
+ // an item of a list the node holds, and Tab in a block right after such a list): nodes never nest,
390
+ // and a block never leaves its node, so nothing moves; the status line says where Tab works. True
391
+ // when it was the node's.
392
+ function tab(host) {
393
+ if (!nodeAround(host)) return false;
394
+ say(t("节点不能缩进:Tab 只在节点里的列表中缩进。"));
395
+ return true;
396
+ }
397
+
398
+ // The choices of 方向 for `element` (the flowchart, or a node), under `title`, the one it has
399
+ // checked: a choice writes data-direction on it (none for the first: the flowchart's 自动, a node's
400
+ // 跟随整体), one undo step that selects `target` again (the block whose menu it was), the status
401
+ // line saying what it is now (`says`).
402
+ const currentOf = (element, choices) => choices.find((choice) => choice.value === (validDirection(element.getAttribute(FLOW_DIRECTION)) ? element.getAttribute(FLOW_DIRECTION) : null));
403
+ function directionGroup(element, choices, title, says, target) {
404
+ const current = currentOf(element, choices);
405
+ return [{ title }, ...choices.map((choice) => ({
406
+ label: choice.label, icon: choice.icon, current: choice === current,
407
+ run: () => { if (look(element, { attributes: { [FLOW_DIRECTION]: choice.value } }, target)) say(t("{0} · Ctrl+Z 撤销", says(choice.label))); },
408
+ }))];
409
+ }
410
+ const flowSays = (label) => t("方向已改为{0}", label);
411
+ const nodeSays = (label) => t("节点方向已改为{0}", label);
412
+
413
+ /**
414
+ * The block menu's rows of a flowchart and of a node. 方向 (the route icon, the current choice
415
+ * beside it): on the flowchart its own (自动换行 / 排成一行 / 排成一列, under 流程图的方向); on a node the
416
+ * joint after it (跟随整体 / 接在右边 / 接在下边, under 这个节点之后) and, below them, the whole flowchart's three
417
+ * (under 整个流程图): a flowchart has no handle of its own (the handles a reader finds on it are its
418
+ * nodes', as a list's are its items'), so its direction is set from a node's menu too, where
419
+ * 跟随整体 says what it follows. Then a node's 在后面添加节点. None for another block, or for one of
420
+ * a flowchart the page does not edit.
421
+ */
422
+ function menuItems(target) {
423
+ const flow = isFlowchart(target) ? target : isStep(target) ? target.parentElement : null;
424
+ if (!flow?.hasAttribute("data-ge-box") || flow.hasAttribute("data-ge-keep")) return [];
425
+ if (flow === target) {
426
+ return [{ label: t("方向"), icon: ROUTE_ICON, hint: currentOf(flow, FLOW_CHOICES).label, submenu: () => directionGroup(flow, FLOW_CHOICES, t("流程图的方向"), flowSays, flow) }];
427
+ }
428
+ return [
429
+ {
430
+ label: t("方向"), icon: ROUTE_ICON, hint: currentOf(target, NODE_CHOICES).label,
431
+ submenu: () => [...directionGroup(target, NODE_CHOICES, t("这个节点之后"), nodeSays, target), { separator: true }, ...directionGroup(flow, FLOW_CHOICES, t("整个流程图"), flowSays, target)],
432
+ },
433
+ { label: t("在后面添加节点"), icon: ICONS.plus, run: () => addAfter(target) },
434
+ ];
435
+ }
436
+
437
+ return {
438
+ addAfter, menuItems,
439
+ /** The handle's "+" on a node: a node beside it (`before`: Alt), the first line of that new node returned for the "/" menu; undefined for a flowchart. */
440
+ addNear: (unit, before) => (isStep(unit) ? firstLineOf(addAfter(unit, { before })) : undefined),
441
+ // A node holds blocks of other components (its first line is a paragraph), and what it does to
442
+ // their keys it says `around` them.
443
+ keys: {
444
+ around: {
445
+ enter: ({ host }) => enter(host) || enterAtStart(host),
446
+ tab: ({ host }) => tab(host),
447
+ backspace: ({ host }) => backspace(host),
448
+ delete: ({ host }) => forwardDelete(host),
449
+ },
450
+ },
451
+ rowOps: { rowsOfFlow, rowShares, leastWidth, weightValue }, // what the gaps between a row's nodes resize (page/columns/)
452
+ };
453
+ }
@@ -0,0 +1,51 @@
1
+ import { headingIcon } from "../icons.mjs";
2
+ import { t } from "../../../shared/i18n/index.mjs";
3
+
4
+ // 标题 1–4: headings h1–h4 (the fourth is body-sized, set apart by its weight; an author's h5 or h6 is
5
+ // kept as it is, never offered). A section's title is whatever heading it holds: no heading
6
+ // makes a section by itself.
7
+ //
8
+ // Where the engines reach it (src/editor/page/ unless named): typing/ (an empty heading's
9
+ // placeholder, `placeholder` below), convert.mjs and markdown/ ("# " to "#### "), core.mjs (Enter splits a
10
+ // heading into a paragraph), clipboard/own/ and src/transfer/markdown.mjs (written by its level: `clipboard`).
11
+ // Its color (颜色 in the block menu): class switches, colors.mjs.
12
+ // Its look: the kit's styles/flow.css (src/render/kit/).
13
+ // How a heading of a level is written out: # … #### by level.
14
+ const writtenAs = (level) => ({ kind: "heading", level });
15
+
16
+ export default {
17
+ name: "heading",
18
+ listed: () => t("标题"), hideable: false,
19
+ glance: { row: 2, name: "标题 2–4", write: "`<h2>`–`<h4>`", rule: "Text and lists" }, // no row of 标题 1: the page's title is written by gallery new
20
+ units: {
21
+ heading: {
22
+ name: t("标题"),
23
+ match: [{ rank: 190, tag: ["h1", "h2", "h3", "h4", "h5", "h6"] }],
24
+ colors: ["text", "background"],
25
+ emptyIsNothing: true, fromWords: true,
26
+ clipboard: { of: (unit) => writtenAs(Math.min(4, Number(unit.localName.slice(1)) || 2)) }, // h5 and h6, which no type stands for, as heading 4
27
+ },
28
+ },
29
+ types: {
30
+ heading1: {
31
+ turn: 3, menu: ["basic", 3],
32
+ tag: "h1", kind: "heading", leaf: "heading1", text: true, empty: true, placeholder: t("标题 1"), clipboard: writtenAs(1),
33
+ label: t("标题 1"), icon: headingIcon(1), hint: "#", markdown: [{ match: /^(#|#)[ \u00a0\u3000]$/ }], words: "标题1 一级标题 大标题 biaoti1 yiji bt1 bt heading1 h1 title",
34
+ },
35
+ heading2: {
36
+ turn: 4, menu: ["basic", 4],
37
+ tag: "h2", kind: "heading", leaf: "heading2", text: true, empty: true, placeholder: t("标题 2"), clipboard: writtenAs(2),
38
+ label: t("标题 2"), icon: headingIcon(2), hint: "##", markdown: [{ match: /^(##|##)[ \u00a0\u3000]$/ }], words: "标题2 二级标题 biaoti2 erji bt2 bt heading2 h2",
39
+ },
40
+ heading3: {
41
+ turn: 5, menu: ["basic", 5],
42
+ tag: "h3", kind: "heading", leaf: "heading3", text: true, empty: true, placeholder: t("标题 3"), clipboard: writtenAs(3),
43
+ label: t("标题 3"), icon: headingIcon(3), hint: "###", markdown: [{ match: /^(###|###)[ \u00a0\u3000]$/ }], words: "标题3 三级标题 小标题 biaoti3 sanji bt3 bt heading3 h3",
44
+ },
45
+ heading4: {
46
+ turn: 6, menu: ["basic", 6],
47
+ tag: "h4", kind: "heading", leaf: "heading4", text: true, empty: true, placeholder: t("标题 4"), clipboard: writtenAs(4),
48
+ label: t("标题 4"), icon: headingIcon(4), hint: "####", markdown: [{ match: /^(####|####)[ \u00a0\u3000]$/ }], words: "标题4 四级标题 biaoti4 siji bt4 bt heading4 h4",
49
+ },
50
+ },
51
+ };
@@ -0,0 +1,79 @@
1
+ import { escapeText } from "../../../shared/escape.mjs";
2
+ import { svg } from "../icons.mjs";
3
+ import { HIGHLIGHT } from "../kit.mjs";
4
+ import { t } from "../../../shared/i18n/index.mjs";
5
+
6
+ // 高亮块: the kit's .doc-panel, a box of blocks that keep their own types, with the opening
7
+ // summary's look. The opening summary (.doc-summary) is one like any other: only the writing
8
+ // rules put it first. There is none inside another.
9
+ //
10
+ // Where the engines reach it (src/editor/page/ unless named): typing/ (Enter on its empty last
11
+ // paragraph: `leaveByEnter`, typing/leave.mjs),
12
+ // convert.mjs (a block turned into one keeps its type; none inside another), clipboard/own/ (copying
13
+ // it, and any block with its class: `clipboard`).
14
+ // Its look: the kit's styles/highlight.css (src/render/kit/).
15
+ export default {
16
+ name: "highlight",
17
+ listed: () => t("高亮块"),
18
+ glance: { row: 1, name: "开头概括", write: "`section.doc-summary` after the header, `<p><strong>` headings", rule: "The page" },
19
+ units: {
20
+ highlight: {
21
+ name: t("高亮块"),
22
+ match: [
23
+ { rank: 10, class: "doc-summary" }, // the opening summary: a highlight panel that comes first
24
+ { rank: 220, class: "doc-panel" },
25
+ ],
26
+ boxed: true,
27
+ removedEmpty: true, // Backspace on its one empty block deletes it whole (typing/)
28
+ colors: ["background"],
29
+ },
30
+ },
31
+ boxes: {
32
+ highlight: {
33
+ role: "flow", name: t("高亮块"),
34
+ also: ["icon"], // a highlight block's icon
35
+ leaveByEnter: true, // Enter on its empty last block moves that block out after it (typing/leave.mjs)
36
+ lead: "icon", // its icon, first in it
37
+ firstLineActs: true, // its first block shows its handle
38
+ groups: true,
39
+ holdsOne: true, // emptied, it keeps an empty paragraph after its icon (core.mjs tidyEmptied)
40
+ selectAll: { content: true },
41
+ classes: [
42
+ { rank: 50, class: "doc-summary" },
43
+ { rank: 70, class: "doc-panel" },
44
+ ],
45
+ },
46
+ },
47
+ types: {
48
+ highlight: {
49
+ turn: 11, menu: ["basic", 12],
50
+ tag: "div", className: "doc-panel", kind: "highlight", box: "highlight", leaf: "paragraph", container: ".doc-panel:not(details)",
51
+ takesAsIs: true, holder: 3,
52
+ nests: false, // none inside another (a drop or a file may still nest one)
53
+ joins: false, // a block turned into one is one of its own (Notion's callout), never another's
54
+ leadIcon: "💡", // Notion's new callout
55
+ clipboard: {
56
+ kind: "aside", claims: HIGHLIGHT.match,
57
+ // Its blocks; one with words straight in it, a paragraph of what it says. A list with its class
58
+ // is a list, and a text block of a type of its own that type.
59
+ describe(node, { isHost, holding, colorOf, copiedType, serializeInner, plain }) {
60
+ if (!node.matches(HIGHLIGHT.match) || node.matches("ul, ol") || (isHost(node) && copiedType(node))) return undefined;
61
+ const straight = [...node.childNodes].some((child) => child.nodeType === 3 && child.data.trim());
62
+ const words = isHost(node) ? serializeInner(node) : straight ? escapeText(plain(node)) : null;
63
+ const blocks = words === null ? holding(node) : [{ type: "paragraph", html: words }];
64
+ const color = colorOf(node);
65
+ return blocks ? { type: "highlight", blocks, ...(color ? { color } : {}) } : null;
66
+ },
67
+ endsIn(unit, { blocksIn, boxesOf, colorOf }) {
68
+ if (!unit.matches(HIGHLIGHT.match)) return undefined;
69
+ const color = colorOf(unit);
70
+ return [{ type: "highlight", blocks: blocksIn(boxesOf(unit)), ...(color ? { color } : {}) }];
71
+ },
72
+ check: (block, { container }) => container(block),
73
+ },
74
+ label: t("高亮块"), icon: svg('<rect x="3.25" y="3.25" width="13.5" height="13.5" rx="2.5"/><rect x="6" y="6.5" width="8" height="2.75" rx=".6" fill="currentColor" stroke="none" opacity=".35"/><path d="M6.25 12.75h7.5"/>'),
75
+ words: "高亮块 高亮 概述 摘要 gaoliang gaishu zhaiyao glk gl highlight panel summary",
76
+ glance: { row: 12, name: "高亮块", before: "; ", write: "`<aside>`", after: "`aside.doc-panel` (one made in the preview a `div.doc-panel`, the same block)", rule: "Kit blocks" },
77
+ },
78
+ },
79
+ };
@@ -0,0 +1,57 @@
1
+ // The page's icon (the kit's "icon" component, a whole block): 页面图标, Notion's, right above the
2
+ // report's title, left-aligned with it (div.doc-icon). It is made, changed and taken away with its
3
+ // own controls (page.mjs: 添加图标 above the title, the icon picker on a click), never moved, selected
4
+ // or turned into another type; the server writes it right before the title wherever the page placed
5
+ // it (source/apply.mjs) and mirrors it in report.json (icon), which the workbench's tree shows. Its
6
+ // inside is no text block: a component of its own (`components`).
7
+ //
8
+ // Where the engines reach it: source/apply.mjs (written and checked as an `icon` node, report.json's
9
+ // note), editor/service.mjs (report.json), editor/media-store.mjs (images), registry.mjs (the header
10
+ // takes it), handle/ (no handle), clipboard/own/ (`clipboard`: a highlight block's or a node's).
11
+ import { ICON, iconKind, iconValueOf, validIcon } from "../../../shared/emoji/icon-value.mjs";
12
+ import { t } from "../../../shared/i18n/index.mjs";
13
+
14
+ export { ICON, iconKind, iconMarkup, iconValueOf, validIcon } from "../../../shared/emoji/icon-value.mjs";
15
+
16
+ /**
17
+ * An icon made on the page (a new highlight block's 💡, one the clipboard brings, one the picker
18
+ * gives), its value its text until the icon editing draws it (page.mjs). An icon of the 图标 tab
19
+ * (a glyph) carries data-icon as the file's does: the kit colors it by that.
20
+ */
21
+ export function iconElement(doc, value) {
22
+ const node = doc.createElement("div");
23
+ node.className = ICON;
24
+ for (const [name, own] of [["data-ge-new", ""], ["data-ge-type", "icon"], ["data-ge-unit-kind", "icon"], ["data-ge-icon", value]]) node.setAttribute(name, own);
25
+ if (iconKind(value) === "glyph") node.setAttribute("data-icon", value);
26
+ node.textContent = value;
27
+ return node;
28
+ }
29
+
30
+ export default {
31
+ name: "icon",
32
+ readOnly: [{ rank: 100, at: `.${ICON}`, says: null }], // an icon (the page's, a highlight block's), one of a set drawn as a picture too: its picker is its tool (page.mjs), never a chart
33
+ units: {
34
+ icon: { name: t("页面图标"), fixed: true, handle: "none", match: [{ rank: 5, class: ICON }] }, // in the header only; its own controls (page.mjs)
35
+ },
36
+ components: [ICON],
37
+ types: {
38
+ icon: {
39
+ tag: "div", className: ICON, kind: "icon", bare: true,
40
+ // Its value as the element keeps it; it leads its highlight block or node. Only there it comes
41
+ // from the clipboard.
42
+ clipboard: {
43
+ kind: "icon", lead: true,
44
+ describe(node) {
45
+ if (!node.matches(`.${ICON}`)) return undefined;
46
+ const icon = node.getAttribute("data-ge-icon") ?? iconValueOf(node.outerHTML);
47
+ return icon ? { type: "icon", icon } : null;
48
+ },
49
+ check: (block, { box, isLead }) => isLead(box, "icon") && validIcon(block.icon),
50
+ build: ({ doc, block }) => iconElement(doc, block.icon),
51
+ text: () => [],
52
+ },
53
+ // Its value, as the page shows it (data-ge-icon: the element shows an image of it).
54
+ extras: (element) => ({ icon: element.getAttribute("data-ge-icon") ?? iconValueOf(element.outerHTML) ?? "" }),
55
+ },
56
+ },
57
+ };