@heycys/gallery 0.0.0-stage → 0.1.1

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 (806) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -2
  3. package/THIRD-PARTY-NOTICES.md +3303 -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 +64 -0
  11. package/browser/editor/components/code/index.mjs +327 -0
  12. package/browser/editor/components/code/page.mjs +561 -0
  13. package/browser/editor/components/colors.mjs +50 -0
  14. package/browser/editor/components/columns/index.mjs +104 -0
  15. package/browser/editor/components/columns/page.mjs +310 -0
  16. package/browser/editor/components/details/index.mjs +73 -0
  17. package/browser/editor/components/details/page.mjs +86 -0
  18. package/browser/editor/components/dialog/index.mjs +84 -0
  19. package/browser/editor/components/dialog/page.mjs +201 -0
  20. package/browser/editor/components/divider/index.mjs +48 -0
  21. package/browser/editor/components/embed/icons.mjs +11 -0
  22. package/browser/editor/components/embed/index.mjs +123 -0
  23. package/browser/editor/components/embed/page.mjs +309 -0
  24. package/browser/editor/components/figure/index.mjs +87 -0
  25. package/browser/editor/components/figure/page.mjs +42 -0
  26. package/browser/editor/components/file/icons.mjs +14 -0
  27. package/browser/editor/components/file/index.mjs +77 -0
  28. package/browser/editor/components/file/page.mjs +114 -0
  29. package/browser/editor/components/flowchart/add.mjs +123 -0
  30. package/browser/editor/components/flowchart/index.mjs +246 -0
  31. package/browser/editor/components/flowchart/page.mjs +453 -0
  32. package/browser/editor/components/heading/index.mjs +53 -0
  33. package/browser/editor/components/heading/page.mjs +6 -0
  34. package/browser/editor/components/highlight/index.mjs +63 -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 +48 -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 +179 -0
  43. package/browser/editor/components/installed/page.mjs +523 -0
  44. package/browser/editor/components/installed/served.mjs +35 -0
  45. package/browser/editor/components/kit.mjs +67 -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 +192 -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 +859 -0
  66. package/browser/editor/components/rows.mjs +16 -0
  67. package/browser/editor/components/section/index.mjs +42 -0
  68. package/browser/editor/components/section/page.mjs +141 -0
  69. package/browser/editor/components/set-apart.mjs +24 -0
  70. package/browser/editor/components/sheets/index.mjs +137 -0
  71. package/browser/editor/components/sheets/page.mjs +227 -0
  72. package/browser/editor/components/sheets/pills.mjs +226 -0
  73. package/browser/editor/components/table/grid.mjs +73 -0
  74. package/browser/editor/components/table/index.mjs +308 -0
  75. package/browser/editor/components/table/page.mjs +683 -0
  76. package/browser/editor/components/table/slots.mjs +41 -0
  77. package/browser/editor/components/widget/index.mjs +50 -0
  78. package/browser/editor/page/annotate/anchors.mjs +230 -0
  79. package/browser/editor/page/annotate/card.mjs +102 -0
  80. package/browser/editor/page/annotate/index.mjs +1656 -0
  81. package/browser/editor/page/at-menu/index.mjs +317 -0
  82. package/browser/editor/page/autosave.mjs +1023 -0
  83. package/browser/editor/page/beside.mjs +21 -0
  84. package/browser/editor/page/block-info.mjs +63 -0
  85. package/browser/editor/page/block-menu/colors.mjs +84 -0
  86. package/browser/editor/page/block-menu/index.mjs +217 -0
  87. package/browser/editor/page/blocks.mjs +255 -0
  88. package/browser/editor/page/caret.mjs +682 -0
  89. package/browser/editor/page/changes/bar.mjs +102 -0
  90. package/browser/editor/page/changes/ghost.mjs +206 -0
  91. package/browser/editor/page/changes/gone-words.mjs +94 -0
  92. package/browser/editor/page/changes/index.mjs +447 -0
  93. package/browser/editor/page/changes/words.mjs +27 -0
  94. package/browser/editor/page/chip-fills.mjs +126 -0
  95. package/browser/editor/page/clipboard/import/colors.mjs +192 -0
  96. package/browser/editor/page/clipboard/import/html.mjs +792 -0
  97. package/browser/editor/page/clipboard/import/inline.mjs +232 -0
  98. package/browser/editor/page/clipboard/import/languages.mjs +42 -0
  99. package/browser/editor/page/clipboard/import/markdown.mjs +760 -0
  100. package/browser/editor/page/clipboard/import/math.mjs +100 -0
  101. package/browser/editor/page/clipboard/import/office.mjs +245 -0
  102. package/browser/editor/page/clipboard/import/read.mjs +120 -0
  103. package/browser/editor/page/clipboard/import/rich.mjs +29 -0
  104. package/browser/editor/page/clipboard/import/to-blocks.mjs +290 -0
  105. package/browser/editor/page/clipboard/index.mjs +816 -0
  106. package/browser/editor/page/clipboard/own/blocks.mjs +211 -0
  107. package/browser/editor/page/clipboard/own/chart-keys.mjs +58 -0
  108. package/browser/editor/page/clipboard/own/describe.mjs +124 -0
  109. package/browser/editor/page/clipboard/own/export.mjs +167 -0
  110. package/browser/editor/page/clipboard/own/ids.mjs +39 -0
  111. package/browser/editor/page/clipboard/own/index.mjs +13 -0
  112. package/browser/editor/page/clipboard/own/rules.mjs +44 -0
  113. package/browser/editor/page/clipboard/own/selection.mjs +159 -0
  114. package/browser/editor/page/clipboard/own/writers.mjs +315 -0
  115. package/browser/editor/page/columns/index.mjs +360 -0
  116. package/browser/editor/page/commit.mjs +1813 -0
  117. package/browser/editor/page/conflicts.mjs +249 -0
  118. package/browser/editor/page/convert.mjs +831 -0
  119. package/browser/editor/page/core.mjs +1693 -0
  120. package/browser/editor/page/drag/drop.mjs +307 -0
  121. package/browser/editor/page/drag/index.mjs +351 -0
  122. package/browser/editor/page/drag/preview.mjs +126 -0
  123. package/browser/editor/page/edge-scroll.mjs +50 -0
  124. package/browser/editor/page/editor.mjs +1780 -0
  125. package/browser/editor/page/emoji-picker/emoji-tab.mjs +287 -0
  126. package/browser/editor/page/emoji-picker/glyph-html.mjs +26 -0
  127. package/browser/editor/page/emoji-picker/grid.mjs +81 -0
  128. package/browser/editor/page/emoji-picker/icon-tab.mjs +217 -0
  129. package/browser/editor/page/emoji-picker/icons.mjs +31 -0
  130. package/browser/editor/page/emoji-picker/index.mjs +166 -0
  131. package/browser/editor/page/emoji-picker/styles.mjs +161 -0
  132. package/browser/editor/page/emoji-picker/support.mjs +204 -0
  133. package/browser/editor/page/emoji-picker/upload.mjs +236 -0
  134. package/browser/editor/page/export-report.mjs +23 -0
  135. package/browser/editor/page/fills.mjs +62 -0
  136. package/browser/editor/page/find/index.mjs +107 -0
  137. package/browser/editor/page/flags.mjs +70 -0
  138. package/browser/editor/page/fold/index.mjs +348 -0
  139. package/browser/editor/page/fold/rule.mjs +125 -0
  140. package/browser/editor/page/folded.mjs +23 -0
  141. package/browser/editor/page/format-bar/bar.mjs +449 -0
  142. package/browser/editor/page/format-bar/brush.mjs +77 -0
  143. package/browser/editor/page/format-bar/colors.mjs +46 -0
  144. package/browser/editor/page/format-bar/index.mjs +404 -0
  145. package/browser/editor/page/formula/index.mjs +236 -0
  146. package/browser/editor/page/formula/panel.mjs +336 -0
  147. package/browser/editor/page/formula/symbols.mjs +156 -0
  148. package/browser/editor/page/frame.mjs +74 -0
  149. package/browser/editor/page/frames.mjs +196 -0
  150. package/browser/editor/page/geometry.mjs +402 -0
  151. package/browser/editor/page/gesture.mjs +45 -0
  152. package/browser/editor/page/handle/index.mjs +650 -0
  153. package/browser/editor/page/handle-sizes.mjs +14 -0
  154. package/browser/editor/page/hints/index.mjs +84 -0
  155. package/browser/editor/page/history.mjs +401 -0
  156. package/browser/editor/page/insert/index.mjs +256 -0
  157. package/browser/editor/page/kept.mjs +38 -0
  158. package/browser/editor/page/links/address.mjs +40 -0
  159. package/browser/editor/page/links/index.mjs +866 -0
  160. package/browser/editor/page/links/pages.mjs +131 -0
  161. package/browser/editor/page/links/views.mjs +369 -0
  162. package/browser/editor/page/long-runs.mjs +75 -0
  163. package/browser/editor/page/look.mjs +77 -0
  164. package/browser/editor/page/made.mjs +24 -0
  165. package/browser/editor/page/margin.mjs +373 -0
  166. package/browser/editor/page/markdown/index.mjs +88 -0
  167. package/browser/editor/page/markdown/rules.mjs +33 -0
  168. package/browser/editor/page/marks.mjs +377 -0
  169. package/browser/editor/page/media-menu/index.mjs +158 -0
  170. package/browser/editor/page/menu.mjs +544 -0
  171. package/browser/editor/page/merge.mjs +124 -0
  172. package/browser/editor/page/notices.mjs +142 -0
  173. package/browser/editor/page/offered.mjs +32 -0
  174. package/browser/editor/page/outline/folds.mjs +53 -0
  175. package/browser/editor/page/outline/index.mjs +783 -0
  176. package/browser/editor/page/outline/list.mjs +184 -0
  177. package/browser/editor/page/outline/read.mjs +201 -0
  178. package/browser/editor/page/outline/strip.mjs +287 -0
  179. package/browser/editor/page/outline/tree.mjs +248 -0
  180. package/browser/editor/page/overlay-layer.mjs +227 -0
  181. package/browser/editor/page/overlays.mjs +205 -0
  182. package/browser/editor/page/own.mjs +28 -0
  183. package/browser/editor/page/pads.mjs +71 -0
  184. package/browser/editor/page/page-objects.mjs +105 -0
  185. package/browser/editor/page/panel.mjs +65 -0
  186. package/browser/editor/page/placement.mjs +58 -0
  187. package/browser/editor/page/post.mjs +41 -0
  188. package/browser/editor/page/present-links.mjs +50 -0
  189. package/browser/editor/page/quiet.mjs +48 -0
  190. package/browser/editor/page/resize/index.mjs +327 -0
  191. package/browser/editor/page/select-all/index.mjs +262 -0
  192. package/browser/editor/page/selection/delete.mjs +61 -0
  193. package/browser/editor/page/selection/index.mjs +164 -0
  194. package/browser/editor/page/selection/marquee.mjs +174 -0
  195. package/browser/editor/page/session.mjs +168 -0
  196. package/browser/editor/page/slash-menu/index.mjs +291 -0
  197. package/browser/editor/page/storage.mjs +48 -0
  198. package/browser/editor/page/sync-state.mjs +267 -0
  199. package/browser/editor/page/table/aligns.mjs +29 -0
  200. package/browser/editor/page/table/cell-bar.mjs +141 -0
  201. package/browser/editor/page/table/cells.mjs +527 -0
  202. package/browser/editor/page/table/icons.mjs +40 -0
  203. package/browser/editor/page/table/index.mjs +990 -0
  204. package/browser/editor/page/table/lists.mjs +187 -0
  205. package/browser/editor/page/table/widths.mjs +313 -0
  206. package/browser/editor/page/tex.mjs +32 -0
  207. package/browser/editor/page/text-select/index.mjs +671 -0
  208. package/browser/editor/page/tooltip.mjs +98 -0
  209. package/browser/editor/page/type-grid.mjs +83 -0
  210. package/browser/editor/page/typing/code-edges.mjs +274 -0
  211. package/browser/editor/page/typing/index.mjs +282 -0
  212. package/browser/editor/page/typing/leave.mjs +68 -0
  213. package/browser/editor/page/ui.mjs +160 -0
  214. package/browser/shared/annotations.mjs +569 -0
  215. package/browser/shared/code-folds.mjs +14 -0
  216. package/browser/shared/code-languages.mjs +70 -0
  217. package/browser/shared/code-lines.mjs +30 -0
  218. package/browser/shared/colors.mjs +30 -0
  219. package/browser/shared/component-catalog.mjs +573 -0
  220. package/browser/shared/components/bookmark.mjs +26 -0
  221. package/browser/shared/components/callout.mjs +9 -0
  222. package/browser/shared/components/chart.mjs +20 -0
  223. package/browser/shared/components/code.mjs +37 -0
  224. package/browser/shared/components/columns.mjs +16 -0
  225. package/browser/shared/components/details.mjs +15 -0
  226. package/browser/shared/components/dialog.mjs +28 -0
  227. package/browser/shared/components/diff.mjs +18 -0
  228. package/browser/shared/components/divider.mjs +6 -0
  229. package/browser/shared/components/embed.mjs +25 -0
  230. package/browser/shared/components/figure.mjs +14 -0
  231. package/browser/shared/components/file.mjs +23 -0
  232. package/browser/shared/components/heading.mjs +6 -0
  233. package/browser/shared/components/highlight.mjs +9 -0
  234. package/browser/shared/components/icon.mjs +18 -0
  235. package/browser/shared/components/image.mjs +39 -0
  236. package/browser/shared/components/index.mjs +396 -0
  237. package/browser/shared/components/installed.mjs +232 -0
  238. package/browser/shared/components/list.mjs +146 -0
  239. package/browser/shared/components/math.mjs +49 -0
  240. package/browser/shared/components/mention.mjs +33 -0
  241. package/browser/shared/components/page.mjs +46 -0
  242. package/browser/shared/components/paragraph.mjs +9 -0
  243. package/browser/shared/components/quote.mjs +6 -0
  244. package/browser/shared/components/section.mjs +8 -0
  245. package/browser/shared/components/sheets.mjs +80 -0
  246. package/browser/shared/components/state.mjs +20 -0
  247. package/browser/shared/components/table.mjs +49 -0
  248. package/browser/shared/components/text.mjs +14 -0
  249. package/browser/shared/components/widget.mjs +10 -0
  250. package/browser/shared/copy-ids.mjs +72 -0
  251. package/browser/shared/css-references.mjs +110 -0
  252. package/browser/shared/document-look.mjs +178 -0
  253. package/browser/shared/emoji/custom.mjs +91 -0
  254. package/browser/shared/emoji/data/LICENSE-lucide.txt +43 -0
  255. package/browser/shared/emoji/data/LICENSE-mingcute.txt +202 -0
  256. package/browser/shared/emoji/data/LICENSE-tabler.txt +21 -0
  257. package/browser/shared/emoji/data/README.md +28 -0
  258. package/browser/shared/emoji/data/categories.json +1 -0
  259. package/browser/shared/emoji/data/icons.json +1 -0
  260. package/browser/shared/emoji/data/keywords-en.json +1 -0
  261. package/browser/shared/emoji/data/keywords-zh.json +1 -0
  262. package/browser/shared/emoji/data/names.json +1 -0
  263. package/browser/shared/emoji/data/positions.json +1 -0
  264. package/browser/shared/emoji/data/twemoji-index.json +1 -0
  265. package/browser/shared/emoji/data/twemoji-svg.bin +0 -0
  266. package/browser/shared/emoji/data.mjs +194 -0
  267. package/browser/shared/emoji/emoji.mjs +38 -0
  268. package/browser/shared/emoji/glyphs.mjs +134 -0
  269. package/browser/shared/emoji/icon-value.mjs +91 -0
  270. package/browser/shared/escape.mjs +20 -0
  271. package/browser/shared/export-wrap.mjs +89 -0
  272. package/browser/shared/files.mjs +33 -0
  273. package/browser/shared/html-tree.mjs +59 -0
  274. package/browser/shared/http.mjs +22 -0
  275. package/browser/shared/i18n/en.mjs +1223 -0
  276. package/browser/shared/i18n/index.mjs +132 -0
  277. package/browser/shared/ids.mjs +24 -0
  278. package/browser/shared/import-types.mjs +23 -0
  279. package/browser/shared/inline-spacing.mjs +97 -0
  280. package/browser/shared/layers.mjs +42 -0
  281. package/browser/shared/long-runs.mjs +39 -0
  282. package/browser/shared/media.mjs +162 -0
  283. package/browser/shared/new-names.mjs +67 -0
  284. package/browser/shared/number-reading.mjs +92 -0
  285. package/browser/shared/old-names.mjs +143 -0
  286. package/browser/shared/outline.mjs +194 -0
  287. package/browser/shared/page-address.mjs +140 -0
  288. package/browser/shared/page-links.mjs +86 -0
  289. package/browser/shared/paths.mjs +73 -0
  290. package/browser/shared/preferences.mjs +116 -0
  291. package/browser/shared/preview-server.mjs +247 -0
  292. package/browser/shared/qa-levels.mjs +93 -0
  293. package/browser/shared/reading-place.mjs +91 -0
  294. package/browser/shared/renamed-storage.mjs +220 -0
  295. package/browser/shared/reports.mjs +46 -0
  296. package/browser/shared/search.mjs +85 -0
  297. package/browser/shared/session.mjs +77 -0
  298. package/browser/shared/table-chart.mjs +113 -0
  299. package/browser/shared/table-hides.mjs +120 -0
  300. package/browser/shared/table-slots.mjs +75 -0
  301. package/browser/shared/words.mjs +23 -0
  302. package/browser/shared/workspace-look.mjs +91 -0
  303. package/browser/shared/workspace.mjs +535 -0
  304. package/browser/shared/writing-preferences.mjs +68 -0
  305. package/browser/shared/zoom.mjs +57 -0
  306. package/dist/chunk-2B5E4CDJ.mjs +2 -0
  307. package/dist/chunk-342HXE3Q.mjs +2 -0
  308. package/dist/chunk-3HIRPVLU.mjs +2 -0
  309. package/dist/chunk-43B75J5T.mjs +2 -0
  310. package/dist/chunk-4FS7Z7WR.mjs +2 -0
  311. package/dist/chunk-4K5KC6V2.mjs +2 -0
  312. package/dist/chunk-5L7RYZCL.mjs +2 -0
  313. package/dist/chunk-5MHMDLZD.mjs +4 -0
  314. package/dist/chunk-5ZKJ3H4P.mjs +8 -0
  315. package/dist/chunk-64K7IPLO.mjs +255 -0
  316. package/dist/chunk-6QXGZM36.mjs +8 -0
  317. package/dist/chunk-6RGJOMJP.mjs +16 -0
  318. package/dist/chunk-742D2WWJ.mjs +19 -0
  319. package/dist/chunk-7DTINW6U.mjs +48 -0
  320. package/dist/chunk-A55HN5OK.mjs +2 -0
  321. package/dist/chunk-AGDILNWB.mjs +2 -0
  322. package/dist/chunk-AJ73XJF3.mjs +2 -0
  323. package/dist/chunk-AUZGSZJH.mjs +13 -0
  324. package/dist/chunk-BFE45AKL.mjs +2 -0
  325. package/dist/chunk-BGGDRNYQ.mjs +10 -0
  326. package/dist/chunk-BXO2ZY5P.mjs +2 -0
  327. package/dist/chunk-C564NU2H.mjs +77 -0
  328. package/dist/chunk-CEH4MRCC.mjs +2 -0
  329. package/dist/chunk-CY2FNNAB.mjs +16 -0
  330. package/dist/chunk-DFUDV4LX.mjs +2 -0
  331. package/dist/chunk-DKXG4XDG.mjs +2 -0
  332. package/dist/chunk-E7LWZRXY.mjs +4 -0
  333. package/dist/chunk-EZQ34M3F.mjs +124 -0
  334. package/dist/chunk-EZY3WC6Z.mjs +15 -0
  335. package/dist/chunk-FDLXYYG4.mjs +4 -0
  336. package/dist/chunk-FUKQNOQS.mjs +9 -0
  337. package/dist/chunk-GB5SOYQJ.mjs +7 -0
  338. package/dist/chunk-GRAXKKG4.mjs +2 -0
  339. package/dist/chunk-HYMEEXKN.mjs +4 -0
  340. package/dist/chunk-IVDLMMBD.mjs +2 -0
  341. package/dist/chunk-JPOSLGOC.mjs +6 -0
  342. package/dist/chunk-JVHHHGEA.mjs +3 -0
  343. package/dist/chunk-L3QKH4OK.mjs +26 -0
  344. package/dist/chunk-LAE5NQ4B.mjs +2 -0
  345. package/dist/chunk-LCTHTZIL.mjs +960 -0
  346. package/dist/chunk-LEF6DRCK.mjs +59 -0
  347. package/dist/chunk-LKX55H76.mjs +2 -0
  348. package/dist/chunk-LS4F7JUM.mjs +2 -0
  349. package/dist/chunk-MAFIGVXY.mjs +2 -0
  350. package/dist/chunk-NO5NJCHO.mjs +2 -0
  351. package/dist/chunk-NQPVAU63.mjs +2 -0
  352. package/dist/chunk-NSKUTQ5J.mjs +5 -0
  353. package/dist/chunk-O35FIXRB.mjs +2 -0
  354. package/dist/chunk-P2CAZPDP.mjs +3 -0
  355. package/dist/chunk-PL6GHLGD.mjs +15 -0
  356. package/dist/chunk-QAIHRH3I.mjs +13 -0
  357. package/dist/chunk-QJIR2BLP.mjs +6 -0
  358. package/dist/chunk-QR6A54KJ.mjs +3 -0
  359. package/dist/chunk-QUPLVPB2.mjs +7 -0
  360. package/dist/chunk-R7BNENLY.mjs +4 -0
  361. package/dist/chunk-S6O4UHLC.mjs +2 -0
  362. package/dist/chunk-SGJWQKEI.mjs +2 -0
  363. package/dist/chunk-SYGN7GLU.mjs +2 -0
  364. package/dist/chunk-TMYZB6AV.mjs +2 -0
  365. package/dist/chunk-TX6JH7TR.mjs +2 -0
  366. package/dist/chunk-TYK6VNAB.mjs +10 -0
  367. package/dist/chunk-U3SSPL4K.mjs +8 -0
  368. package/dist/chunk-U6KNPJPR.mjs +2 -0
  369. package/dist/chunk-UALRNVSE.mjs +4 -0
  370. package/dist/chunk-UH4SIXTR.mjs +2 -0
  371. package/dist/chunk-UMHUSOPJ.mjs +2 -0
  372. package/dist/chunk-V3HXVQEM.mjs +2 -0
  373. package/dist/chunk-V5JTW2LH.mjs +27 -0
  374. package/dist/chunk-V5VXUJKG.mjs +2 -0
  375. package/dist/chunk-V6XZ4VIR.mjs +2 -0
  376. package/dist/chunk-VBXMADMP.mjs +2 -0
  377. package/dist/chunk-VNV55RUA.mjs +2 -0
  378. package/dist/chunk-VPD2PS35.mjs +2 -0
  379. package/dist/chunk-W3BGBJQW.mjs +2 -0
  380. package/dist/chunk-W4VKN3GF.mjs +7 -0
  381. package/dist/chunk-W5BXXPDJ.mjs +3 -0
  382. package/dist/chunk-W7XHE4CT.mjs +2 -0
  383. package/dist/chunk-XNROSH2T.mjs +4 -0
  384. package/dist/chunk-XUNHRCOG.mjs +6 -0
  385. package/dist/chunk-Y34NR5JL.mjs +2 -0
  386. package/dist/chunk-Y6RLRPG3.mjs +3 -0
  387. package/dist/chunk-YEY3RSFQ.mjs +2 -0
  388. package/dist/cli.mjs +2 -0
  389. package/dist/server.mjs +2 -0
  390. package/dist/worker.mjs +5 -0
  391. package/kit/charts.js +355 -0
  392. package/kit/code.js +164 -0
  393. package/kit/dialogs.js +157 -0
  394. package/kit/math.js +2004 -0
  395. package/kit/report.css +2932 -0
  396. package/kit/runtime.js +1782 -0
  397. package/kit/sheets.js +123 -0
  398. package/kit/state.js +217 -0
  399. package/kit/tables.js +1499 -0
  400. package/kit/tokens.js +29 -0
  401. package/kit/ui.js +658 -0
  402. package/package.json +41 -4
  403. package/release.json +25 -0
  404. package/sdk/column-widths.d.ts +56 -0
  405. package/sdk/doc-charts.d.ts +82 -0
  406. package/sdk/doc-code.d.ts +28 -0
  407. package/sdk/doc-dialogs.d.ts +4 -0
  408. package/sdk/doc-kit.d.ts +147 -0
  409. package/sdk/doc-math.d.ts +3 -0
  410. package/sdk/doc-sheets.d.ts +15 -0
  411. package/sdk/doc-state.d.ts +41 -0
  412. package/sdk/doc-tables.d.ts +24 -0
  413. package/sdk/doc-tokens.d.ts +22 -0
  414. package/sdk/index.d.ts +30 -0
  415. package/skill/SKILL.md +150 -0
  416. package/skill/agents/openai.yaml +5 -0
  417. package/skill/references/building-components.md +367 -0
  418. package/skill/references/example-report.html +356 -0
  419. package/skill/references/writing-html.md +187 -0
  420. package/skill/sdk/column-widths.d.ts +56 -0
  421. package/skill/sdk/doc-charts.d.ts +82 -0
  422. package/skill/sdk/doc-code.d.ts +28 -0
  423. package/skill/sdk/doc-dialogs.d.ts +4 -0
  424. package/skill/sdk/doc-kit.d.ts +147 -0
  425. package/skill/sdk/doc-math.d.ts +3 -0
  426. package/skill/sdk/doc-sheets.d.ts +15 -0
  427. package/skill/sdk/doc-state.d.ts +41 -0
  428. package/skill/sdk/doc-tables.d.ts +24 -0
  429. package/skill/sdk/doc-tokens.d.ts +22 -0
  430. package/skill/sdk/index.d.ts +30 -0
  431. package/starter/doc.html +21 -0
  432. package/starter/doc.json +5 -0
  433. package/vendor/d3.v7.9.0.min.js +2 -0
  434. package/vendor/katex/auto-render.min.js +1 -0
  435. package/vendor/katex/contrib/mhchem.min.js +1 -0
  436. package/vendor/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  437. package/vendor/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  438. package/vendor/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  439. package/vendor/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  440. package/vendor/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  441. package/vendor/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
  442. package/vendor/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  443. package/vendor/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
  444. package/vendor/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
  445. package/vendor/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  446. package/vendor/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
  447. package/vendor/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  448. package/vendor/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  449. package/vendor/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  450. package/vendor/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
  451. package/vendor/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  452. package/vendor/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  453. package/vendor/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  454. package/vendor/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  455. package/vendor/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  456. package/vendor/katex/katex.min.css +1 -0
  457. package/vendor/katex/katex.min.js +1 -0
  458. package/vendor/pdfjs/LICENSE +177 -0
  459. package/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  460. package/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  461. package/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
  462. package/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  463. package/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  464. package/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
  465. package/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  466. package/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  467. package/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  468. package/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  469. package/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  470. package/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  471. package/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  472. package/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  473. package/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  474. package/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
  475. package/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  476. package/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  477. package/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
  478. package/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  479. package/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  480. package/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  481. package/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  482. package/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  483. package/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  484. package/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  485. package/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  486. package/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  487. package/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  488. package/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  489. package/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  490. package/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  491. package/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  492. package/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  493. package/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  494. package/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  495. package/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  496. package/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  497. package/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  498. package/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  499. package/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  500. package/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  501. package/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  502. package/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  503. package/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  504. package/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  505. package/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
  506. package/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
  507. package/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  508. package/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  509. package/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  510. package/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  511. package/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  512. package/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  513. package/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  514. package/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
  515. package/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  516. package/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  517. package/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  518. package/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  519. package/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
  520. package/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  521. package/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
  522. package/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
  523. package/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
  524. package/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  525. package/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  526. package/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
  527. package/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  528. package/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  529. package/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
  530. package/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
  531. package/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  532. package/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  533. package/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  534. package/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  535. package/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  536. package/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  537. package/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  538. package/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  539. package/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
  540. package/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
  541. package/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  542. package/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  543. package/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  544. package/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  545. package/vendor/pdfjs/cmaps/H.bcmap +0 -0
  546. package/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  547. package/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  548. package/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  549. package/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  550. package/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  551. package/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  552. package/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  553. package/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  554. package/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  555. package/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  556. package/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  557. package/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  558. package/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
  559. package/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
  560. package/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  561. package/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  562. package/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
  563. package/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  564. package/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  565. package/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
  566. package/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  567. package/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  568. package/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  569. package/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  570. package/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  571. package/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  572. package/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
  573. package/vendor/pdfjs/cmaps/LICENSE +36 -0
  574. package/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
  575. package/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
  576. package/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  577. package/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  578. package/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
  579. package/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  580. package/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  581. package/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  582. package/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  583. package/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  584. package/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  585. package/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  586. package/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  587. package/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  588. package/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  589. package/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  590. package/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  591. package/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  592. package/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  593. package/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  594. package/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  595. package/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  596. package/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  597. package/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  598. package/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  599. package/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  600. package/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  601. package/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  602. package/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  603. package/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  604. package/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  605. package/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  606. package/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  607. package/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  608. package/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  609. package/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  610. package/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  611. package/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  612. package/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  613. package/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  614. package/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  615. package/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  616. package/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  617. package/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  618. package/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  619. package/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  620. package/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  621. package/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  622. package/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  623. package/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  624. package/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  625. package/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  626. package/vendor/pdfjs/cmaps/V.bcmap +0 -0
  627. package/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  628. package/vendor/pdfjs/legacy/build/pdf.min.mjs +27 -0
  629. package/vendor/pdfjs/legacy/build/pdf.worker.min.mjs +27 -0
  630. package/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
  631. package/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
  632. package/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
  633. package/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  634. package/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
  635. package/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
  636. package/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
  637. package/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  638. package/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
  639. package/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
  640. package/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
  641. package/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +363 -0
  642. package/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
  643. package/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  644. package/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
  645. package/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
  646. package/vendor/types/@types/d3/LICENSE +21 -0
  647. package/vendor/types/@types/d3/index.d.ts +39 -0
  648. package/vendor/types/@types/d3/package.json +81 -0
  649. package/vendor/types/@types/d3-array/LICENSE +21 -0
  650. package/vendor/types/@types/d3-array/index.d.ts +1118 -0
  651. package/vendor/types/@types/d3-array/package.json +56 -0
  652. package/vendor/types/@types/d3-axis/LICENSE +21 -0
  653. package/vendor/types/@types/d3-axis/index.d.ts +293 -0
  654. package/vendor/types/@types/d3-axis/package.json +47 -0
  655. package/vendor/types/@types/d3-brush/LICENSE +21 -0
  656. package/vendor/types/@types/d3-brush/index.d.ts +255 -0
  657. package/vendor/types/@types/d3-brush/package.json +42 -0
  658. package/vendor/types/@types/d3-chord/LICENSE +21 -0
  659. package/vendor/types/@types/d3-chord/index.d.ts +471 -0
  660. package/vendor/types/@types/d3-chord/package.json +40 -0
  661. package/vendor/types/@types/d3-color/LICENSE +21 -0
  662. package/vendor/types/@types/d3-color/index.d.ts +669 -0
  663. package/vendor/types/@types/d3-color/package.json +55 -0
  664. package/vendor/types/@types/d3-contour/LICENSE +21 -0
  665. package/vendor/types/@types/d3-contour/index.d.ts +222 -0
  666. package/vendor/types/@types/d3-contour/package.json +38 -0
  667. package/vendor/types/@types/d3-delaunay/LICENSE +21 -0
  668. package/vendor/types/@types/d3-delaunay/index.d.ts +316 -0
  669. package/vendor/types/@types/d3-delaunay/package.json +30 -0
  670. package/vendor/types/@types/d3-dispatch/LICENSE +21 -0
  671. package/vendor/types/@types/d3-dispatch/index.d.ts +96 -0
  672. package/vendor/types/@types/d3-dispatch/package.json +51 -0
  673. package/vendor/types/@types/d3-drag/LICENSE +21 -0
  674. package/vendor/types/@types/d3-drag/index.d.ts +395 -0
  675. package/vendor/types/@types/d3-drag/package.json +42 -0
  676. package/vendor/types/@types/d3-dsv/LICENSE +21 -0
  677. package/vendor/types/@types/d3-dsv/index.d.ts +482 -0
  678. package/vendor/types/@types/d3-dsv/package.json +45 -0
  679. package/vendor/types/@types/d3-ease/LICENSE +21 -0
  680. package/vendor/types/@types/d3-ease/index.d.ts +316 -0
  681. package/vendor/types/@types/d3-ease/package.json +40 -0
  682. package/vendor/types/@types/d3-fetch/LICENSE +21 -0
  683. package/vendor/types/@types/d3-fetch/index.d.ts +282 -0
  684. package/vendor/types/@types/d3-fetch/package.json +37 -0
  685. package/vendor/types/@types/d3-force/LICENSE +21 -0
  686. package/vendor/types/@types/d3-force/index.d.ts +899 -0
  687. package/vendor/types/@types/d3-force/package.json +45 -0
  688. package/vendor/types/@types/d3-format/LICENSE +21 -0
  689. package/vendor/types/@types/d3-format/index.d.ts +337 -0
  690. package/vendor/types/@types/d3-format/package.json +45 -0
  691. package/vendor/types/@types/d3-geo/LICENSE +21 -0
  692. package/vendor/types/@types/d3-geo/index.d.ts +1371 -0
  693. package/vendor/types/@types/d3-geo/package.json +48 -0
  694. package/vendor/types/@types/d3-hierarchy/LICENSE +21 -0
  695. package/vendor/types/@types/d3-hierarchy/index.d.ts +928 -0
  696. package/vendor/types/@types/d3-hierarchy/package.json +50 -0
  697. package/vendor/types/@types/d3-interpolate/LICENSE +21 -0
  698. package/vendor/types/@types/d3-interpolate/index.d.ts +387 -0
  699. package/vendor/types/@types/d3-interpolate/package.json +47 -0
  700. package/vendor/types/@types/d3-path/LICENSE +21 -0
  701. package/vendor/types/@types/d3-path/index.d.ts +108 -0
  702. package/vendor/types/@types/d3-path/package.json +41 -0
  703. package/vendor/types/@types/d3-polygon/LICENSE +21 -0
  704. package/vendor/types/@types/d3-polygon/index.d.ts +41 -0
  705. package/vendor/types/@types/d3-polygon/package.json +40 -0
  706. package/vendor/types/@types/d3-quadtree/LICENSE +21 -0
  707. package/vendor/types/@types/d3-quadtree/index.d.ts +204 -0
  708. package/vendor/types/@types/d3-quadtree/package.json +45 -0
  709. package/vendor/types/@types/d3-random/LICENSE +21 -0
  710. package/vendor/types/@types/d3-random/index.d.ts +313 -0
  711. package/vendor/types/@types/d3-random/package.json +41 -0
  712. package/vendor/types/@types/d3-scale/LICENSE +21 -0
  713. package/vendor/types/@types/d3-scale/index.d.ts +2669 -0
  714. package/vendor/types/@types/d3-scale/package.json +53 -0
  715. package/vendor/types/@types/d3-scale-chromatic/LICENSE +21 -0
  716. package/vendor/types/@types/d3-scale-chromatic/index.d.ts +520 -0
  717. package/vendor/types/@types/d3-scale-chromatic/package.json +46 -0
  718. package/vendor/types/@types/d3-selection/LICENSE +21 -0
  719. package/vendor/types/@types/d3-selection/index.d.ts +1210 -0
  720. package/vendor/types/@types/d3-selection/package.json +56 -0
  721. package/vendor/types/@types/d3-shape/LICENSE +21 -0
  722. package/vendor/types/@types/d3-shape/index.d.ts +2792 -0
  723. package/vendor/types/@types/d3-shape/package.json +53 -0
  724. package/vendor/types/@types/d3-time/LICENSE +21 -0
  725. package/vendor/types/@types/d3-time/index.d.ts +697 -0
  726. package/vendor/types/@types/d3-time/package.json +46 -0
  727. package/vendor/types/@types/d3-time-format/LICENSE +21 -0
  728. package/vendor/types/@types/d3-time-format/index.d.ts +202 -0
  729. package/vendor/types/@types/d3-time-format/package.json +40 -0
  730. package/vendor/types/@types/d3-timer/LICENSE +21 -0
  731. package/vendor/types/@types/d3-timer/index.d.ts +68 -0
  732. package/vendor/types/@types/d3-timer/package.json +45 -0
  733. package/vendor/types/@types/d3-transition/LICENSE +21 -0
  734. package/vendor/types/@types/d3-transition/index.d.ts +664 -0
  735. package/vendor/types/@types/d3-transition/package.json +47 -0
  736. package/vendor/types/@types/d3-zoom/LICENSE +21 -0
  737. package/vendor/types/@types/d3-zoom/index.d.ts +611 -0
  738. package/vendor/types/@types/d3-zoom/package.json +48 -0
  739. package/vendor/types/@types/geojson/LICENSE +21 -0
  740. package/vendor/types/@types/geojson/index.d.ts +202 -0
  741. package/vendor/types/@types/geojson/package.json +46 -0
  742. package/vendor/typescript/LICENSE.txt +55 -0
  743. package/vendor/typescript/lib.decorators.d.ts +384 -0
  744. package/vendor/typescript/lib.decorators.legacy.d.ts +22 -0
  745. package/vendor/typescript/lib.dom.d.ts +39429 -0
  746. package/vendor/typescript/lib.dom.iterable.d.ts +571 -0
  747. package/vendor/typescript/lib.es2015.collection.d.ts +147 -0
  748. package/vendor/typescript/lib.es2015.core.d.ts +597 -0
  749. package/vendor/typescript/lib.es2015.d.ts +28 -0
  750. package/vendor/typescript/lib.es2015.generator.d.ts +77 -0
  751. package/vendor/typescript/lib.es2015.iterable.d.ts +605 -0
  752. package/vendor/typescript/lib.es2015.promise.d.ts +81 -0
  753. package/vendor/typescript/lib.es2015.proxy.d.ts +128 -0
  754. package/vendor/typescript/lib.es2015.reflect.d.ts +144 -0
  755. package/vendor/typescript/lib.es2015.symbol.d.ts +46 -0
  756. package/vendor/typescript/lib.es2015.symbol.wellknown.d.ts +326 -0
  757. package/vendor/typescript/lib.es2016.array.include.d.ts +116 -0
  758. package/vendor/typescript/lib.es2016.d.ts +21 -0
  759. package/vendor/typescript/lib.es2016.intl.d.ts +31 -0
  760. package/vendor/typescript/lib.es2017.arraybuffer.d.ts +21 -0
  761. package/vendor/typescript/lib.es2017.d.ts +26 -0
  762. package/vendor/typescript/lib.es2017.date.d.ts +31 -0
  763. package/vendor/typescript/lib.es2017.intl.d.ts +44 -0
  764. package/vendor/typescript/lib.es2017.object.d.ts +49 -0
  765. package/vendor/typescript/lib.es2017.sharedmemory.d.ts +135 -0
  766. package/vendor/typescript/lib.es2017.string.d.ts +45 -0
  767. package/vendor/typescript/lib.es2017.typedarrays.d.ts +53 -0
  768. package/vendor/typescript/lib.es2018.asyncgenerator.d.ts +77 -0
  769. package/vendor/typescript/lib.es2018.asynciterable.d.ts +53 -0
  770. package/vendor/typescript/lib.es2018.d.ts +24 -0
  771. package/vendor/typescript/lib.es2018.intl.d.ts +83 -0
  772. package/vendor/typescript/lib.es2018.promise.d.ts +30 -0
  773. package/vendor/typescript/lib.es2018.regexp.d.ts +37 -0
  774. package/vendor/typescript/lib.es2019.array.d.ts +79 -0
  775. package/vendor/typescript/lib.es2019.d.ts +24 -0
  776. package/vendor/typescript/lib.es2019.intl.d.ts +23 -0
  777. package/vendor/typescript/lib.es2019.object.d.ts +33 -0
  778. package/vendor/typescript/lib.es2019.string.d.ts +37 -0
  779. package/vendor/typescript/lib.es2019.symbol.d.ts +24 -0
  780. package/vendor/typescript/lib.es2020.bigint.d.ts +765 -0
  781. package/vendor/typescript/lib.es2020.d.ts +27 -0
  782. package/vendor/typescript/lib.es2020.date.d.ts +42 -0
  783. package/vendor/typescript/lib.es2020.intl.d.ts +474 -0
  784. package/vendor/typescript/lib.es2020.number.d.ts +28 -0
  785. package/vendor/typescript/lib.es2020.promise.d.ts +47 -0
  786. package/vendor/typescript/lib.es2020.sharedmemory.d.ts +99 -0
  787. package/vendor/typescript/lib.es2020.string.d.ts +44 -0
  788. package/vendor/typescript/lib.es2020.symbol.wellknown.d.ts +41 -0
  789. package/vendor/typescript/lib.es2021.d.ts +23 -0
  790. package/vendor/typescript/lib.es2021.intl.d.ts +166 -0
  791. package/vendor/typescript/lib.es2021.promise.d.ts +48 -0
  792. package/vendor/typescript/lib.es2021.string.d.ts +33 -0
  793. package/vendor/typescript/lib.es2021.weakref.d.ts +78 -0
  794. package/vendor/typescript/lib.es2022.array.d.ts +121 -0
  795. package/vendor/typescript/lib.es2022.d.ts +25 -0
  796. package/vendor/typescript/lib.es2022.error.d.ts +75 -0
  797. package/vendor/typescript/lib.es2022.intl.d.ts +145 -0
  798. package/vendor/typescript/lib.es2022.object.d.ts +26 -0
  799. package/vendor/typescript/lib.es2022.regexp.d.ts +39 -0
  800. package/vendor/typescript/lib.es2022.string.d.ts +25 -0
  801. package/vendor/typescript/lib.es5.d.ts +4601 -0
  802. package/vendor/typescript/package.json +4 -0
  803. package/vendor/typescript/typescript.js +446 -0
  804. package/web/assets/index-Bh74DfsV.css +1 -0
  805. package/web/assets/index-UW0RyFFt.js +13 -0
  806. package/web/index.html +14 -0
@@ -0,0 +1,561 @@
1
+ import { FOLD_DOTS } from "../../../shared/code-folds.mjs";
2
+ import { LINE_START } from "../../../shared/code-lines.mjs";
3
+ import { UNIT, matchesSource, ownHTML } from "../../page/core.mjs";
4
+ import { pointRange, select } from "../../page/caret.mjs";
5
+ import { ICONS, createMenu } from "../../page/menu.mjs";
6
+ import { capsFor } from "../registry.mjs";
7
+ import { lookRow } from "../rows.mjs";
8
+ import { addStyle, loadScript } from "../../page/ui.mjs";
9
+ import { CODE_HEIGHT, FOLDED, FOLDED_LINES, LANGUAGE, LINE, NOWRAP, codeBaseline, codeLanguage, codePre, codeText, isCode, linesOf, openCode, setCode, syncGutter } from "./index.mjs";
10
+ import { t } from "../../../shared/i18n/index.mjs";
11
+
12
+ // 代码块 on the page. A code block keeps the lines the kit highlighted until the reader clicks into
13
+ // them (or the arrow keys reach it, or Enter in its title): its source text then goes into a `code`
14
+ // text block, the caret at the character pressed. While edited it is highlighted again as it is typed
15
+ // (not while an input method composes) and its line numbers follow; Enter breaks a line keeping its
16
+ // indentation, Tab indents two spaces, a paste keeps its lines. Its title is a text block of its own
17
+ // (plain text, one line; Enter goes into the code). The header's fold arrow and wrap button switch
18
+ // its classes as one undo step each (the kit's do it in a reading view); its language label opens a
19
+ // menu of languages (自动识别 first: the language it looks like, the kit's guess), the one picked
20
+ // set as its data-language, one undo step, and the block drawn again in it. The arrow beside a line
21
+ // that starts a structure folds that line (Feishu's): its data-folded-lines, one undo step; the kit's
22
+ // lines fold as it says, and so do the open code's, a span a line, their numbers and arrows in the
23
+ // gutter (index.mjs syncGutter), the folds following the lines through typing.
24
+
25
+ // A code block as it is edited (the kit draws the rest, styles/code.css): the page's styles.
26
+ const STYLE = `
27
+ /* A code block being edited looks as the kit draws it: its line numbers in a column of their
28
+ own (the same size and gaps as the kit's), its code colored, redrawn as it changes, its long
29
+ lines wrapped unless it scrolls them (doc-code--nowrap). Folded, it hides its code as the
30
+ kit's does. */
31
+ /* Opened, its code and line numbers side by side; the room below the last line the code's own (a row
32
+ of flex items leaves the scroller's bottom padding out of what it scrolls through: scrolled to its
33
+ end, the last line stood against the edge). */
34
+ [data-ge-editing] .doc-code:not(.doc-code--folded) > pre:has(> code[data-ge-kind="code"]) { display: flex; align-items: flex-start; padding-bottom: 0; }
35
+ [data-ge-editing] .doc-code:not(.doc-code--folded) > pre:has(> code[data-ge-kind="code"]) > * { margin-bottom: 18px; } /* a margin: the line numbers count the code's own height */
36
+ [data-ge-editing] pre > code[data-ge-kind="code"], [data-ge-editing] pre > code[data-ge-kind="code"]:focus { --ge-text-tint: none; flex: 1 1 auto; display: block; min-width: 0; min-height: var(--doc-code-line-height, 20px); padding: 0 2px; white-space: pre-wrap; word-break: break-word; outline: none; }
37
+ [data-ge-editing] .doc-code--nowrap > pre > code[data-ge-kind="code"] { flex: 1 0 auto; min-width: auto; white-space: pre; word-break: normal; }
38
+ .ge-code-gutter { flex: none; display: flex; flex-direction: column; color: var(--doc-code-line-number, #b4b1ab); font-size: var(--doc-code-number-size, 12px); line-height: var(--doc-code-line-height, 20px); font-variant-numeric: tabular-nums; user-select: none; pointer-events: none; }
39
+ .ge-code-row { display: flex; flex: none; min-height: var(--doc-code-line-height, 20px); }
40
+ /* Numbers left-aligned on the line the title's text starts on, as wide as the last one: the kit's numbers, their size, inset and gap, and the rows' height, read from its custom properties (styles/code.css). */
41
+ .ge-code-number { box-sizing: content-box; min-width: calc(var(--ge-code-digits, 1) * 1ch); padding: 0 var(--doc-code-number-gap, 12px) 0 var(--doc-code-number-inset, 6px); text-align: left; }
42
+ .ge-code-gutter--bare .ge-code-row { padding-right: 4px; }
43
+ /* A line's arrow (its structure folds), as the kit's: left of its number, under the block's own
44
+ fold arrow; rounded, light, shown while the pointer is over the block (a folded one always,
45
+ turned); a short fill while pressed. */
46
+ .ge-code-fold, .ge-code-slot { flex: none; width: 16px; height: 16px; margin: 2px 0; }
47
+ .ge-code-fold { display: flex; align-items: center; justify-content: center; border-radius: 4px; color: var(--doc-code-line-fold, #c1c0bc); cursor: pointer; pointer-events: auto; visibility: hidden; }
48
+ .ge-code-fold svg { width: 10px; height: 10px; fill: currentColor; transition: transform .2s ease-out; }
49
+ .ge-code-fold:active { background: var(--doc-code-pressed, rgb(31 35 41 / 12%)); }
50
+ .doc-code:hover .ge-code-fold, .ge-code-fold[data-folded] { visibility: visible; }
51
+ .ge-code-fold[data-folded] svg { transform: rotate(-90deg); }
52
+ /* The open code's lines a fold hides, and "…" after a folded one (a click on it unfolds it). */
53
+ [data-ge-editing] code[data-ge-kind="code"] > .ge-code-line--hidden { display: none; }
54
+ [data-ge-editing] code[data-ge-kind="code"] > .ge-code-line--folded::after { content: ""; display: inline-block; width: 24px; height: 16px; margin-left: 6px; vertical-align: -3px; border-radius: 4px; background: ${FOLD_DOTS} center / 12px 2px no-repeat, var(--doc-code-fold-more, rgb(55 53 47 / 8%)); cursor: pointer; }
55
+ [data-ge-editing] pre[data-ge-code] { cursor: text; }
56
+ /* A code block's title being edited: one line (its placeholder, Feishu's, is the typing's). */
57
+ [data-ge-editing] .doc-code-title[contenteditable="true"] { --ge-text-tint: none; outline: none; text-overflow: clip; cursor: text; }
58
+ /* Its language opens the menu of languages: a button with a chevron, held while the menu is open;
59
+ folded, plain text (Feishu's: its language is picked unfolded). */
60
+ [data-ge-editing] main .doc-code:is(${UNIT}):not(.doc-code--folded) .doc-code-language { display: inline-flex; align-items: center; gap: 2px; padding: 0 4px 0 6px; border-radius: 4px; cursor: pointer; transition: background .1s ease-in-out; }
61
+ [data-ge-editing] main .doc-code:is(${UNIT}):not(.doc-code--folded) .doc-code-language::after { content: ""; width: 12px; height: 12px; background: currentColor; -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M3.25 4.75 6 7.5l2.75-2.75' fill='none' stroke='black' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / 12px no-repeat; mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M3.25 4.75 6 7.5l2.75-2.75' fill='none' stroke='black' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / 12px no-repeat; }
62
+ [data-ge-editing] main .doc-code:is(${UNIT}):not(.doc-code--folded) .doc-code-language:hover, [data-ge-editing] .doc-code[data-ge-menu] .doc-code-language { background: var(--doc-hover); }
63
+ [data-ge-editing] .doc-code[data-ge-menu] > .doc-code-tools { opacity: 1; pointer-events: auto; }
64
+ `;
65
+
66
+ // A code block's code opened for editing, or null.
67
+ const openHost = (block) => codePre(block)?.querySelector(':scope > code[data-ge-kind="code"]') ?? null;
68
+
69
+ // The kit's code script (/kit/code.js) on a page served without it (a report with no code block
70
+ // yet): loaded when the page makes its first, so that block's header (arrow, language, buttons) shows
71
+ // at once, and its colors: those of the text it came with (a code block pasted) as soon as the script
72
+ // is there (colored), those typed as they are typed.
73
+ let colored = null; // (code element) => its text highlighted (create)
74
+ const loadKit = () => loadScript("/kit/code.js", () => globalThis.DocCode);
75
+
76
+ /**
77
+ * A new code block: div.doc-code (the block) holding its title (a text block, empty: 代码块) and a
78
+ * pre holding a code element (its text block) with this text; its language, when one was picked, and
79
+ * the number its first line shows, when it is a copy of an excerpt numbered as in its file.
80
+ */
81
+ export function newCode(doc, text = "", title = "", language = null, first = null) {
82
+ const block = doc.createElement("div");
83
+ block.className = "doc-code";
84
+ // Framed like the code blocks of the file; its language is the one it looks like (自动识别) until
85
+ // the reader picks one.
86
+ for (const [name, value] of [["data-ge-new", ""], ["data-ge-type", "code"], ["data-ge-unit-kind", "code"], ["data-ge-frame", ""]]) block.setAttribute(name, value);
87
+ if (language) block.setAttribute(LANGUAGE, language);
88
+ if (first) block.setAttribute(LINE_START, String(first));
89
+ const heading = doc.createElement("div");
90
+ heading.className = "doc-code-title";
91
+ for (const [name, value] of [["contenteditable", "true"], ["data-ge-new", ""], ["data-ge-kind", "codeTitle"], ["data-ge-caps", capsFor("codeTitle")], ["data-ge-framed", ""], ["spellcheck", "false"]]) heading.setAttribute(name, value);
92
+ heading.textContent = title;
93
+ const pre = doc.createElement("pre");
94
+ const code = doc.createElement("code");
95
+ for (const [name, value] of [["contenteditable", "true"], ["data-ge-new", ""], ["data-ge-kind", "code"], ["data-ge-caps", capsFor("code")], ["spellcheck", "false"]]) code.setAttribute(name, value);
96
+ setCode(code, text);
97
+ pre.append(code);
98
+ block.append(heading, pre);
99
+ // The header's arrow, language and buttons, as the kit draws them, and the colors of the text it
100
+ // came with (a code block pasted): at once where the page has the kit's script, else once it came.
101
+ if (globalThis.DocCode) {
102
+ globalThis.DocCode.decorate(block);
103
+ if (code.textContent.trim()) colored?.(code);
104
+ } else if (doc === globalThis.document) loadKit().then((ok) => {
105
+ if (!ok || !block.isConnected) return;
106
+ globalThis.DocCode.decorate(block);
107
+ if (code.textContent.trim()) colored?.(code);
108
+ });
109
+ syncGutter(code);
110
+ return block;
111
+ }
112
+
113
+ /** A code block made again from the clipboard's description (its type's `build`, builders.mjs). */
114
+ export function build({ doc, block }) {
115
+ return newCode(doc, block.text, block.title ?? "", block.language ?? null, block.lineStart ?? null);
116
+ }
117
+
118
+ /** A code block made of a block's text (its type's `create`), standing for that block: the caret goes into its code. */
119
+ export const make = ({ doc, text, put, stand }) => put(stand(newCode(doc, text))).querySelector(":scope > pre > code");
120
+
121
+ /** Whether a text block is a code block's title. */
122
+ export const isCodeTitle = (host) => host?.getAttribute("data-ge-kind") === "codeTitle";
123
+
124
+ /**
125
+ * Editing code blocks, with what the editor gives it: the edit map, the baselines, the last
126
+ * recorded content of each block, recordText (one step of typing), whether an input method is
127
+ * composing, caretAtOffset (the caret after a number of characters of a block), look(element,
128
+ * { classes, sizes, attributes }, select) (the editor's undoable change), say (the status line) and
129
+ * closeTools() (what a press closes that opens over the page: the format bar, the "/" menu, the formula box).
130
+ */
131
+ export function create({ map, baselines, lastKnown, recordText, isComposing, caretAtOffset, look, say, closeTools }) {
132
+ addStyle(STYLE);
133
+ // A new code block's text highlighted once the kit's script has come (newCode): no step of its own,
134
+ // its last known content the highlighted one.
135
+ colored = (code) => {
136
+ highlight(code);
137
+ lastKnown.set(code, ownHTML(code));
138
+ };
139
+ // A code block keeps the lines the kit highlighted until the reader clicks into it (openAt);
140
+ // its baseline is its source text. The code block is its unit, the pre, which holds no text block
141
+ // meanwhile: one written with no code element has the pre for its element, and what the kit drew
142
+ // there is not its text.
143
+ function prepare(block) {
144
+ const pre = codePre(document.querySelector(`[data-ge-unit="${block.unit}"]`));
145
+ if (!pre) return;
146
+ if (!matchesSource(pre, block.inner)) {
147
+ pre.setAttribute("data-ge-lock", "script");
148
+ return;
149
+ }
150
+ pre.setAttribute("data-ge-code", String(block.id));
151
+ pre.removeAttribute("data-ge-block");
152
+ baselines.set(block.id, codeBaseline(block.inner));
153
+ }
154
+
155
+ // Open a code block for editing, with the caret where the reader pressed (or at its start).
156
+ function openAt(pre, point = null) {
157
+ const id = Number(pre.getAttribute("data-ge-code"));
158
+ const block = map.blocks.find((entry) => entry.id === id);
159
+ let offset = 0;
160
+ const at = point && pointRange(point.x, point.y);
161
+ if (at && pre.contains(at.startContainer)) {
162
+ const probe = document.createRange();
163
+ probe.selectNodeContents(pre);
164
+ probe.setEnd(at.startContainer, at.startOffset);
165
+ offset = probe.toString().length;
166
+ }
167
+ const host = openCode(pre, id, block.inner);
168
+ host.focus({ preventScroll: true });
169
+ const caret = document.createRange();
170
+ caret.setStart(host.firstChild, Math.min(offset, host.firstChild.length - 1));
171
+ select(caret);
172
+ highlight(host);
173
+ lastKnown.set(host, host.innerHTML);
174
+ return host;
175
+ }
176
+
177
+ // The characters from a block's start to the caret, or null when the caret is elsewhere.
178
+ function caretOffset(host) {
179
+ const selection = getSelection();
180
+ if (!selection.rangeCount || !host.contains(selection.anchorNode)) return null;
181
+ const head = document.createRange();
182
+ head.setStart(host, 0);
183
+ head.setEnd(selection.anchorNode, selection.anchorOffset);
184
+ return head.toString().length;
185
+ }
186
+
187
+ // A code block's colors while it is edited: the kit's highlighter (DocCode, when the report
188
+ // has code blocks) draws its code again in its language (自动识别: the one it looks like now, shown
189
+ // in its header), a span a line (LINE), the caret kept at the same character; its folds carried
190
+ // over (carriedFolds) and marked on its lines. The line numbers follow either way.
191
+ const drawnIn = new WeakMap(); // block -> the language it was last drawn in
192
+ function highlight(host) {
193
+ const pre = host.closest("pre");
194
+ const block = host.closest(".doc-code");
195
+ const kit = globalThis.DocCode;
196
+ if (pre && block && kit && !isComposing()) {
197
+ const text = codeText(host);
198
+ const caret = caretOffset(host);
199
+ const scratch = document.createElement("pre");
200
+ const language = kit.languageOf(block, text);
201
+ try {
202
+ kit.drawLines(scratch, text, language);
203
+ const lines = [...scratch.querySelectorAll(".doc-code-content")].map((content, index) => {
204
+ const line = document.createElement("span");
205
+ line.className = LINE;
206
+ if (index > 0) line.append(document.createTextNode("\n"));
207
+ line.append(...content.childNodes);
208
+ return line;
209
+ });
210
+ const regions = kit.folds.regions(text, language);
211
+ markFolds(lines, regions, carriedFolds(host, block, text, regions, caret));
212
+ host.replaceChildren(...lines, document.createTextNode("\n"));
213
+ if (caret !== null) caretAtOffset(host, caret);
214
+ drawnIn.set(block, language);
215
+ } catch {}
216
+ kit.decorate(block);
217
+ }
218
+ syncGutter(host);
219
+ }
220
+
221
+ // The lines folded before a change, where they are now: a folded line's span keeps its place
222
+ // through what the browser typed in the code, so the line it starts now is the one folded (code just
223
+ // opened or made, with no spans yet, takes the block's data-folded-lines). Kept while the line
224
+ // still starts a structure, and not when a line was made or joined with the caret inside its
225
+ // structure (Enter or Backspace there opens it, Feishu's).
226
+ function carriedFolds(host, block, text, regions, caret) {
227
+ const kit = globalThis.DocCode;
228
+ const lines = linesOf(host);
229
+ let folded;
230
+ if (lines.length === 0) folded = kit.folds.foldedLines(block.getAttribute(FOLDED_LINES));
231
+ else {
232
+ folded = new Set();
233
+ let at = 0;
234
+ for (const node of host.childNodes) {
235
+ const own = node.textContent;
236
+ if (node.nodeType === 1 && node.classList.contains(`${LINE}--folded`)) folded.add(at + Number(own.startsWith("\n")));
237
+ at += own.split("\n").length - 1;
238
+ }
239
+ }
240
+ const remade = lines.length > 0 && lines.length !== text.split("\n").length;
241
+ return new Set([...folded].filter((line) => {
242
+ const region = regions.get(line);
243
+ return region && !(remade && caret !== null && caret >= region.from && caret <= region.to);
244
+ }));
245
+ }
246
+
247
+ // Lines marked as their structure folds: those starting one, those folded, those a fold hides.
248
+ function markFolds(lines, regions, folded) {
249
+ const hidden = globalThis.DocCode.folds.hiddenLines(regions, folded);
250
+ lines.forEach((line, index) => {
251
+ line.classList.toggle(`${LINE}--foldable`, regions.has(index));
252
+ line.classList.toggle(`${LINE}--folded`, folded.has(index));
253
+ line.classList.toggle(`${LINE}--hidden`, hidden.has(index));
254
+ });
255
+ }
256
+
257
+ // A code block drawn again in the language it has now (picked, undone, or 自动识别 after its
258
+ // title changed): its open code by the editor, else its lines by the kit.
259
+ function redraw(block) {
260
+ const kit = globalThis.DocCode;
261
+ if (!kit || !block.isConnected) return;
262
+ const host = openHost(block);
263
+ if (host) return highlight(host);
264
+ const language = kit.languageOf(block);
265
+ if (drawnIn.get(block) !== language) {
266
+ kit.draw(block);
267
+ drawnIn.set(block, language);
268
+ }
269
+ kit.decorate(block);
270
+ }
271
+
272
+ // Its folded lines changed (an arrow, undo, redo): its lines folded as they say, the kit's or (its
273
+ // code open) the editor's; nothing when they already are (the open code's own lines wrote them).
274
+ // The caret leaves the lines folded away, to the end of the line folding them.
275
+ function refold(block) {
276
+ const kit = globalThis.DocCode;
277
+ if (!kit || !block.isConnected) return;
278
+ const host = openHost(block);
279
+ if (!host) return kit.fold(block);
280
+ const lines = linesOf(host);
281
+ if (lines.length === 0) return;
282
+ const wanted = kit.folds.foldedLines(block.getAttribute(FOLDED_LINES));
283
+ const now = lines.flatMap((line, index) => line.classList.contains(`${LINE}--folded`) ? [index] : []);
284
+ if (now.length === wanted.size && now.every((line) => wanted.has(line))) return;
285
+ const text = codeText(host);
286
+ const regions = kit.folds.regions(text, kit.languageOf(block, text));
287
+ markFolds(lines, regions, new Set([...wanted].filter((line) => regions.has(line))));
288
+ const selection = getSelection();
289
+ const inside = selection.rangeCount ? lines.find((line) => line.classList.contains(`${LINE}--hidden`) && line.contains(selection.anchorNode)) : null;
290
+ if (inside) {
291
+ let shown = lines.indexOf(inside);
292
+ while (shown > 0 && lines[shown].classList.contains(`${LINE}--hidden`)) shown--;
293
+ caretAtOffset(host, lines.slice(0, shown + 1).reduce((sum, line) => sum + line.textContent.length, 0));
294
+ }
295
+ lastKnown.set(host, host.innerHTML);
296
+ syncGutter(host);
297
+ }
298
+
299
+ // Its language set or removed (the menu, undo, redo), or its title typed in: drawn again; its
300
+ // folded lines: folded again.
301
+ new MutationObserver((records) => {
302
+ const changed = new Map();
303
+ for (const { target, attributeName } of records) if (target.matches?.(".doc-code")) changed.set(target, (changed.get(target) ?? new Set()).add(attributeName));
304
+ for (const [block, names] of changed) {
305
+ if (names.has(LANGUAGE)) redraw(block);
306
+ else refold(block);
307
+ }
308
+ }).observe(document.body, { subtree: true, attributes: true, attributeFilter: [LANGUAGE, FOLDED_LINES] });
309
+ document.addEventListener("input", (event) => {
310
+ const block = isCodeTitle(event.target) ? event.target.closest(".doc-code") : null;
311
+ if (block && !codeLanguage(block) && !isComposing()) redraw(block);
312
+ });
313
+ document.addEventListener("compositionend", (event) => {
314
+ const block = isCodeTitle(event.target) ? event.target.closest(".doc-code") : null;
315
+ if (block && !codeLanguage(block)) redraw(block);
316
+ });
317
+
318
+ // Type into a code block: its text, a line break with the indentation of the line it breaks.
319
+ function type(host, text) {
320
+ const selection = getSelection();
321
+ if (!selection.rangeCount) return;
322
+ const range = selection.getRangeAt(0);
323
+ if (text === "\n") {
324
+ const head = document.createRange();
325
+ head.setStart(host, 0);
326
+ head.setEnd(range.startContainer, range.startOffset);
327
+ text += /[^\n]*$/.exec(head.toString())[0].match(/^[ \t]*/)[0];
328
+ }
329
+ range.deleteContents();
330
+ // At the very end, a line break needs one after it for the browser to show the new line.
331
+ const tail = document.createRange();
332
+ tail.setStart(range.endContainer, range.endOffset);
333
+ tail.setEnd(host, host.childNodes.length);
334
+ const node = document.createTextNode(text.endsWith("\n") && tail.toString() === "" ? `${text}\n` : text);
335
+ range.insertNode(node);
336
+ range.setStart(node, text.length);
337
+ range.collapse(true);
338
+ select(range);
339
+ highlight(host);
340
+ recordText(host);
341
+ }
342
+
343
+ // A code block's code, opened for editing or not; null when it cannot be read (left to a script).
344
+ // What copying a code block takes (its `clipboard.describe`).
345
+ function textOf(unit) {
346
+ const pre = codePre(unit) ?? unit;
347
+ const host = pre.querySelector(':scope > code[data-ge-kind="code"]');
348
+ if (host) return codeText(host);
349
+ const block = pre.hasAttribute("data-ge-code") ? map.blocks.find((entry) => entry.id === Number(pre.getAttribute("data-ge-code"))) : null;
350
+ if (!block) return null;
351
+ const template = document.createElement("template");
352
+ template.innerHTML = block.inner;
353
+ return template.content.textContent;
354
+ }
355
+
356
+ // A click on a code block's fold arrow, wrap button or language (the kit's, in its header) while
357
+ // the page is edited: the arrow and the button switch a class of the block's (doc-code--folded,
358
+ // doc-code--nowrap), saved, one undo step, the kit's own click (a reading view's) not running;
359
+ // the language opens the menu of languages. Returns whether it was one.
360
+ function headerClick(event) {
361
+ if (lineFoldClick(event)) return true;
362
+ const button = event.target?.closest?.(".doc-code-fold, .doc-code-wrap, .doc-code-language");
363
+ const block = button?.closest(".doc-code");
364
+ if (!block || !block.closest("main") || !block.matches(UNIT)) return false;
365
+ event.preventDefault();
366
+ event.stopImmediatePropagation();
367
+ if (button.matches(".doc-code-language")) {
368
+ // Folded, its language is not picked (Feishu's): only unfolded.
369
+ if (closedFrom !== button && !block.classList.contains(FOLDED)) openLanguages(block, button);
370
+ closedFrom = null;
371
+ return true;
372
+ }
373
+ const name = button.matches(".doc-code-fold") ? FOLDED : NOWRAP;
374
+ const on = !block.classList.contains(name);
375
+ // The caret leaves code that folds away (Feishu's), and so does its language menu.
376
+ if (name === FOLDED && on && block.contains(document.activeElement)) document.activeElement.blur();
377
+ if (name === FOLDED && on && block.hasAttribute("data-ge-menu")) menu.close();
378
+ if (look(block, { classes: { [name]: on } })) {
379
+ globalThis.DocCode?.decorate?.(block);
380
+ say(t("{0} · Ctrl+Z 撤销", name === FOLDED ? (on ? t("已折叠代码块") : t("已展开代码块")) : (on ? t("代码已取消自动换行") : t("代码已自动换行"))));
381
+ }
382
+ return true;
383
+ }
384
+
385
+ // ---------- folding a line's structure ----------
386
+ // The control a press or click is on, with its block and line: a line's arrow (the kit's in its
387
+ // lines, the editor's in the open code's gutter) or the "…" after a folded line (the kit's, or the
388
+ // one the open code's folded line shows after its text). Null for anything else.
389
+ function lineFoldAt(event) {
390
+ const target = event.target;
391
+ const kit = target?.closest?.(".doc-code-line-fold, .doc-code-line-more");
392
+ const gutter = !kit && target?.closest?.(".ge-code-fold");
393
+ const more = !kit && !gutter && target?.matches?.(`.${LINE}--folded`) && pastText(target, event.clientX) ? target : null;
394
+ const control = kit || gutter || more;
395
+ const block = control?.closest(".doc-code");
396
+ if (!block || !block.closest("main") || !block.matches(UNIT)) return null;
397
+ const row = kit?.closest(".doc-code-line");
398
+ const line = row ? [...row.parentElement.children].indexOf(row) : gutter ? Number(gutter.getAttribute("data-line")) : linesOf(more.parentElement).indexOf(more);
399
+ return { block, line, unfold: Boolean(more) || control.matches(".doc-code-line-more") };
400
+ }
401
+ // Whether a point is past a line's text (on the "…" its ::after draws).
402
+ function pastText(line, x) {
403
+ const range = document.createRange();
404
+ range.selectNodeContents(line);
405
+ const rects = [...range.getClientRects()].filter((rect) => rect.width > 0);
406
+ return rects.length > 0 && x >= rects[rects.length - 1].right - 1;
407
+ }
408
+ // A press on one moves no caret and opens no code; its click folds or unfolds the line, one undo step.
409
+ document.addEventListener("pointerdown", (event) => {
410
+ if (event.button !== 0 || !lineFoldAt(event)) return;
411
+ event.preventDefault();
412
+ event.stopImmediatePropagation();
413
+ }, true);
414
+ function lineFoldClick(event) {
415
+ const at = lineFoldAt(event);
416
+ const kit = globalThis.DocCode;
417
+ if (!at || !kit) return false;
418
+ event.preventDefault();
419
+ event.stopImmediatePropagation();
420
+ const folded = kit.folds.foldedLines(at.block.getAttribute(FOLDED_LINES));
421
+ const fold = !folded.has(at.line) && !at.unfold;
422
+ if (fold) folded.add(at.line);
423
+ else folded.delete(at.line);
424
+ if (look(at.block, { attributes: { [FOLDED_LINES]: kit.folds.foldedValue(folded) } })) say(t("{0}第 {1} 行的代码结构 · Ctrl+Z 撤销", fold ? t("已折叠") : t("已展开"), at.line + 1));
425
+ return true;
426
+ }
427
+
428
+ // ---------- its language ----------
429
+ // The language label opens a menu below it (Notion's language picker): a search field, 自动识别
430
+ // (the language the block looks like, shown beside it), then the kit's languages; the current one
431
+ // checked. What is picked is the block's data-language (自动识别 removes it): one undo step, saved.
432
+ const menu = createMenu();
433
+ let closedFrom = null; // the label a press closed the menu from: its click does not open it again
434
+ function openLanguages(block, label) {
435
+ const kit = globalThis.DocCode;
436
+ if (!kit) return;
437
+ const own = codeLanguage(block);
438
+ const detected = kit.languageName(kit.autoLanguage(block));
439
+ const rows = (query) => {
440
+ const typed = query.trim().toLowerCase();
441
+ const found = (words) => !typed || words.toLowerCase().includes(typed);
442
+ return [
443
+ ...(found(t("自动识别 auto detect zidong zdsb")) ? [{ label: t("自动识别"), hint: detected, current: !own, run: () => pick(block, null) }, { separator: true }] : []),
444
+ // Each by the name the kit's header gives it (纯文本 in the UI's language).
445
+ ...kit.languages.filter((language) => found(`${language.name} ${language.words}`))
446
+ .map((language) => ({ label: kit.languageName(language.id), current: Boolean(own) && kit.languageName(own) === kit.languageName(language.id), run: () => pick(block, language.id) })),
447
+ ];
448
+ };
449
+ block.setAttribute("data-ge-menu", "");
450
+ menu.open(rows(""), label.getBoundingClientRect(), {
451
+ label: t("代码语言"), width: 220, height: 300, align: "end", icons: false, empty: t("没有找到这种语言"),
452
+ search: { placeholder: t("搜索语言"), filter: rows },
453
+ onClose: () => block.removeAttribute("data-ge-menu"),
454
+ });
455
+ }
456
+ function pick(block, language) {
457
+ const kit = globalThis.DocCode;
458
+ if (!block.isConnected || !look(block, { attributes: { [LANGUAGE]: language } })) return;
459
+ say(t("{0} · Ctrl+Z 撤销", language ? t("代码语言:{0}", kit.languageName(language)) : t("代码语言:自动识别({0})", kit.languageName(kit.autoLanguage(block)))));
460
+ }
461
+ // A press elsewhere, scrolling the page, resizing or leaving the window closes the menu. Every press
462
+ // says anew whether it closes it from its label (notion-lite's pressedWhileOpen): one whose click
463
+ // never came to the label (released off it, of another button) says nothing of the next click.
464
+ document.addEventListener("pointerdown", (event) => {
465
+ const label = menu.isOpen ? event.target.closest?.(".doc-code-language") : null;
466
+ closedFrom = label?.closest(".doc-code")?.hasAttribute("data-ge-menu") ? label : null;
467
+ if (menu.isOpen && !menu.contains(event.target)) menu.close();
468
+ }, true);
469
+ addEventListener("scroll", (event) => { if (menu.isOpen && !menu.contains(event.target)) menu.close(); }, { passive: true, capture: true });
470
+ addEventListener("resize", () => menu.close());
471
+ addEventListener("blur", () => menu.close());
472
+
473
+ // Enter in a code block's title: the caret goes into its code (opened, unfolded first), at its start.
474
+ function titleEnter(host) {
475
+ if (!isCodeTitle(host)) return false;
476
+ const block = host.closest(".doc-code");
477
+ if (block?.classList.contains(FOLDED)) {
478
+ look(block, { classes: { [FOLDED]: false } });
479
+ globalThis.DocCode?.decorate?.(block);
480
+ }
481
+ const pre = codePre(block);
482
+ const open = pre?.querySelector(':scope > code[data-ge-kind="code"]');
483
+ if (open) {
484
+ open.focus({ preventScroll: true });
485
+ const caret = document.createRange();
486
+ caret.setStart(open.firstChild ?? open, 0);
487
+ select(caret);
488
+ } else if (pre?.hasAttribute("data-ge-code")) {
489
+ const code = openAt(pre);
490
+ const caret = document.createRange();
491
+ caret.setStart(code.firstChild ?? code, 0);
492
+ select(caret);
493
+ }
494
+ return true;
495
+ }
496
+
497
+ /**
498
+ * A press on its lines (`press`): it opens for editing, the caret where the pointer was. True when
499
+ * the press was its.
500
+ */
501
+ function press(event) {
502
+ const pre = event.target.closest?.("main pre[data-ge-code]");
503
+ if (!pre) return false;
504
+ event.preventDefault();
505
+ closeTools();
506
+ openAt(pre, { x: event.clientX, y: event.clientY });
507
+ return true;
508
+ }
509
+
510
+ return {
511
+ create: make, prepare, openAt, type, textOf, press,
512
+ click: headerClick,
513
+ /** What was typed in its code highlighted; a change of its text undone or redone, its line numbers. */
514
+ typed(host) {
515
+ if (isCode(host)) highlight(host);
516
+ },
517
+ afterText(host) {
518
+ if (isCode(host)) syncGutter(host);
519
+ },
520
+ // Its keys (notion-lite's blocks/code/edit.js): in its code Enter breaks the line, and Tab types two
521
+ // spaces; Shift+Enter is Enter there as it is anywhere; Enter in its title goes into its code.
522
+ keys: {
523
+ enter({ host }) {
524
+ if (!isCode(host)) return titleEnter(host);
525
+ type(host, "\n");
526
+ return true;
527
+ },
528
+ shiftEnter({ host, enter }) {
529
+ if (!isCode(host)) return false;
530
+ enter();
531
+ return true;
532
+ },
533
+ tab({ host }, back) {
534
+ if (back || !isCode(host)) return false;
535
+ type(host, " ");
536
+ return true;
537
+ },
538
+ },
539
+ /** A new one: its text highlighted, as what it last held. */
540
+ onCreated(code) {
541
+ highlight(code);
542
+ lastKnown.set(code, ownHTML(code));
543
+ return false;
544
+ },
545
+ /** Enter on it selected: opened, when it is one of the file's (a new one's code takes the caret as any text). */
546
+ activate(unit) {
547
+ const pre = unit.matches(".doc-code") ? unit.querySelector(":scope > pre[data-ge-code]") : null;
548
+ if (pre) openAt(pre);
549
+ return Boolean(pre);
550
+ },
551
+ /** A code block's row of the block menu once its frame has a height: 显示全部代码 (none for another block). */
552
+ menuItems(target) {
553
+ if (target?.getAttribute?.("data-ge-unit-kind") !== "code" || target.style.getPropertyValue(CODE_HEIGHT).trim() === "") return [];
554
+ return [lookRow({ look, say }, target, { label: t("显示全部代码"), icon: ICONS.reset, change: { sizes: { [CODE_HEIGHT]: null } }, done: t("代码块已显示全部代码") })];
555
+ },
556
+ /** Whether a node is the language menu's (its keys are its own). */
557
+ keepsKeys: (node) => menu.contains(node),
558
+ /** The nodes to keep in the top layer when a modal dialog opens. */
559
+ get nodes() { return menu.nodes; },
560
+ };
561
+ }
@@ -0,0 +1,50 @@
1
+ import { COLORS as SHARED_COLORS } from "../../shared/colors.mjs";
2
+ import { t } from "../../shared/i18n/index.mjs";
3
+
4
+ // A block's colors (颜色, the block menu's: the families a component says it takes, `colors` in
5
+ // registry.mjs, are its class switches): its text in one of the nine colors (doc-text-<color>)
6
+ // and a background behind the whole block (doc-highlight-<color>), one of each family at most,
7
+ // so a text block may have both (Notion has one of the eighteen; the user's: both). A table cell has
8
+ // one of the eighteen (notion-lite's), `only`. The classes are the kit's
9
+ // (src/render/kit/styles/base.css: the same as the selection toolbar's for text; a block's
10
+ // background has room around its text, flow.css).
11
+
12
+ // What the reader calls each color in the UI's language (src/shared/colors.mjs `label`: its Chinese).
13
+ const LABELS = { gray: t("灰色"), brown: t("棕色"), orange: t("橙色"), yellow: t("黄色"), green: t("绿色"), blue: t("蓝色"), purple: t("紫色"), pink: t("粉色"), red: t("红色") };
14
+
15
+ /** Notion's nine colors, in its order, with their names (src/shared/colors.mjs, in the UI's language). */
16
+ export const COLORS = SHARED_COLORS.map(({ name, label }) => [name, LABELS[name] ?? label]);
17
+
18
+ export const textClass = (color) => `doc-text-${color}`;
19
+ export const backgroundClass = (color) => `doc-highlight-${color}`;
20
+
21
+ /** The classes of each family of colors, by its name: "text" and "background". */
22
+ export const COLOR_CLASSES = { text: COLORS.map(([color]) => textClass(color)), background: COLORS.map(([color]) => backgroundClass(color)) };
23
+
24
+ /** Every class a block's color may be. */
25
+ export const BLOCK_COLORS = [...COLOR_CLASSES.text, ...COLOR_CLASSES.background];
26
+
27
+ const classOf = (kind, color) => (kind === "text" ? textClass(color) : backgroundClass(color));
28
+
29
+ /** A block's colors: { text, background }, each a color's name or null (none). */
30
+ export function blockColorsOf(element) {
31
+ const of = (kind) => COLORS.find(([color]) => element.classList.contains(classOf(kind, color)))?.[0] ?? null;
32
+ return { text: of("text"), background: of("background") };
33
+ }
34
+
35
+ /** A table cell's one color: { kind, color } or null (none). */
36
+ export function cellColorOf(element) {
37
+ const { text, background } = blockColorsOf(element);
38
+ return text ? { kind: "text", color: text } : background ? { kind: "background", color: background } : null;
39
+ }
40
+
41
+ /**
42
+ * The class switches that give a block color `color` of family `kind` ({ kind, color }; color null:
43
+ * none of that family), the other family's as it is; `only` (a table cell): no other color at all.
44
+ * As a look change: { classes }.
45
+ */
46
+ export function colorLook({ kind, color }, { only = false } = {}) {
47
+ const classes = Object.fromEntries((only ? BLOCK_COLORS : COLOR_CLASSES[kind]).map((name) => [name, false]));
48
+ if (color) classes[classOf(kind, color)] = true;
49
+ return { classes };
50
+ }