@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,500 @@
1
+ import { Z } from "../../shared/layers.mjs";
2
+ import { addStyle, element, mount } from "./ui.mjs";
3
+ import { hideTooltip, tooltip } from "./tooltip.mjs";
4
+ import { svg } from "../components/icons.mjs";
5
+ import { t } from "../../shared/i18n/index.mjs";
6
+
7
+ // The editor's menu card, used by the "/" menu (slash-menu/: block types, filtered as the reader
8
+ // types) and by the block menu a block's handle opens (block-menu/: a header with the block's type,
9
+ // the types it can be turned into as a grid of icons, then its commands). One row (or cell of a
10
+ // grid) is highlighted: ↑/↓ move it (a line of the grid at a time, ←/→ along it) and Enter runs it,
11
+ // the keys being forwarded by the editor, because the focus stays where it was (in the text, or on
12
+ // the page with a block selected). A press on a row never moves the caret. Colors follow the
13
+ // report's light or dark theme (light-dark()). A row may open a submenu (Notion's 颜色 ›): a second
14
+ // card right of it, opened by resting on the row, a click, Enter or →, and closed by ←, by resting
15
+ // on another row, or with the menu; while it is open from the keys they move in it.
16
+
17
+ const STYLE = `
18
+ .ge-pop {
19
+ position: fixed; left: 0; top: 0; z-index: ${Z.menu}; width: 265px; max-width: calc(100vw - 16px); max-height: calc(100vh - 24px);
20
+ overflow-x: hidden; overflow-y: auto; padding: 4px 0; border-radius: 10px; background: var(--ge-bg); color: var(--ge-tx);
21
+ box-shadow: var(--ge-shadow-pop);
22
+ font: 14px/1.2 ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI Variable Display", "Segoe UI", Helvetica, "PingFang SC", "Microsoft YaHei", Arial, sans-serif;
23
+ user-select: none; scrollbar-width: thin; scrollbar-color: var(--ge-line-strong) transparent; animation: ge-pop-in .12s ease-out;
24
+ }
25
+ @keyframes ge-pop-in { from { opacity: 0; transform: scale(.98); } }
26
+ @media (prefers-reduced-motion: reduce) { .ge-pop { animation: none; } }
27
+ .ge-pop-title { display: flex; align-items: center; gap: 8px; padding: 8px 12px; color: var(--ge-tx2); font-size: 12px; font-weight: 500; line-height: 14px; }
28
+ .ge-pop-title:has(> .ge-pop-icon) { padding-block: 4px; }
29
+ .ge-pop-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
30
+ /* Notion's 4px above the first row (a row right at the top had its corners cut by the card's); a
31
+ title or a search field first keeps its own room. */
32
+ .ge-pop > .ge-pop-title:first-child { padding-top: 6px; }
33
+ .ge-pop:has(> .ge-pop-search:first-child) { padding-top: 0; }
34
+ .ge-pop-row { display: flex; align-items: center; gap: 8px; width: calc(100% - 8px); height: 28px; margin: 0 4px 1px; padding: 0 8px; border: 0; border-radius: 6px; background: transparent; color: inherit; font: inherit; text-align: left; cursor: pointer; }
35
+ .ge-pop-row[data-active] { background: var(--ge-hover); }
36
+ .ge-pop-row:disabled { cursor: default; }
37
+ .ge-pop-row:disabled:not([data-current]) .ge-pop-label, .ge-pop-row:disabled:not([data-current]) .ge-pop-icon { opacity: .45; }
38
+ .ge-pop-icon { flex: none; display: flex; align-items: center; justify-content: center; width: 20px; height: 20px; color: var(--ge-ico); }
39
+ .ge-pop-icon svg { display: block; width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 1.25; stroke-linecap: round; stroke-linejoin: round; }
40
+ .ge-pop-icon img { display: block; width: 20px; height: 20px; border-radius: 3px; object-fit: contain; }
41
+ .ge-pop-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
42
+ /* A row with a hint (its current choice, its key) reads by its label first: the label keeps its
43
+ words and the hint takes what is left, cut short with an ellipsis where it is too long (an English
44
+ row's current choice once took the whole row, its label drawn 0px wide). */
45
+ .ge-pop-label:has(+ .ge-pop-hint) { flex: 1 0 auto; max-width: 100%; }
46
+ .ge-pop-hint { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; color: var(--ge-tx3); font-size: 12px; white-space: nowrap; }
47
+ /* A row of a page (its title, the page it is under as its hint): a long title is what an ellipsis
48
+ cuts, and the page above keeps its words, up to a part of the row. */
49
+ .ge-pop-row[data-long] .ge-pop-label { flex: 1 1 0; max-width: none; }
50
+ .ge-pop-row[data-long] .ge-pop-hint { flex: none; max-width: 40%; }
51
+ .ge-pop-check, .ge-pop-arrow { flex: none; width: 16px; height: 16px; }
52
+ .ge-pop-arrow { color: var(--ge-tx3); }
53
+ .ge-pop-arrow svg { display: block; width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
54
+ .ge-pop-row[aria-expanded="true"] { background: var(--ge-hover); }
55
+ .ge-pop-check svg { display: block; width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
56
+ .ge-pop-sep { height: 1px; margin: 3px 12px 4px; background: var(--ge-line); }
57
+ .ge-pop-note { padding: 0 12px 6px 40px; color: var(--ge-tx3); font-size: 12px; line-height: 1.5; }
58
+ .ge-pop-empty { padding: 8px 12px; color: var(--ge-tx3); }
59
+ /* What a row makes, shown beside it under the pointer (a component package's preview.svg). */
60
+ .ge-pop-preview { display: block; width: 240px; max-height: 180px; border-radius: 4px; object-fit: contain; background: var(--ge-bg); }
61
+ .ge-pop-search { position: sticky; top: 0; z-index: 1; padding: 8px 8px 6px; background: var(--ge-bg); }
62
+ .ge-pop-search input { box-sizing: border-box; width: 100%; height: 28px; margin: 0; padding: 0 8px; border: 0; border-radius: 6px; outline: none; background: var(--ge-hover); color: var(--ge-tx); font: inherit; box-shadow: inset 0 0 0 1px var(--ge-line); }
63
+ .ge-pop-search input:focus { box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--ge-tx3) 60%, transparent); }
64
+ .ge-pop-search input::placeholder { color: var(--ge-tx3); }
65
+ /* Rows in a card that is there already (inside: a link card's pages): under what stands in it, as wide as it, no card of their own. */
66
+ .ge-pop[data-inside] { position: static; flex: 0 0 100%; width: auto; max-width: none; padding: 4px 0 0; border-radius: 0; background: none; box-shadow: none; animation: none; }
67
+ .ge-pop[data-inside] .ge-pop-row { width: 100%; margin-inline: 0; }
68
+ `;
69
+
70
+ // A section's lines, of the icons of 在下方新建分区 and 解散分区: the mark beside them says which.
71
+ const SECTION_LINES = '<path d="M3.25 5.25h13.5M3.25 9.75h9"/>';
72
+
73
+ /** Icons of the editor's menus (a block type's own is in its component's description). */
74
+ export const ICONS = {
75
+ plus: svg('<path d="M10 4.25v11.5M4.25 10h11.5"/>'),
76
+ copy: svg('<rect x="7.25" y="7.25" width="9.5" height="9.5" rx="2"/><path d="M12.75 7.25V5.5a2 2 0 0 0-2-2h-5.5a2 2 0 0 0-2 2V11a2 2 0 0 0 2 2h2"/>'),
77
+ trash: svg('<path d="M3.75 5.75h12.5M8 5.75V4.5a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v1.25M5.25 5.75l.7 9.6a1.5 1.5 0 0 0 1.5 1.4h5.1a1.5 1.5 0 0 0 1.5-1.4l.7-9.6"/>'),
78
+ outer: svg('<rect x="3.25" y="3.25" width="13.5" height="13.5" rx="2.5" stroke-dasharray="2.2 2.2"/><rect x="6.5" y="6.5" width="7" height="7" rx="1.25"/>'),
79
+ section: svg(`${SECTION_LINES}<path d="M14.5 12v5M12 14.5h5"/>`),
80
+ dissolve: svg(`${SECTION_LINES}<path d="m12.75 12.75 3.5 3.5M16.25 12.75l-3.5 3.5"/>`), // section's plus, turned 45°
81
+ // Blocks gathered into a new section: their lines between brackets.
82
+ group: svg('<path d="M6 3.75h-.75a2 2 0 0 0-2 2v8.5a2 2 0 0 0 2 2H6M14 3.75h.75a2 2 0 0 1 2 2v8.5a2 2 0 0 1-2 2H14"/><path d="M7.25 7.75h5.5M7.25 12.25h5.5"/>'),
83
+ center: svg('<rect x="5.25" y="4.25" width="9.5" height="11.5" rx="1.75"/><path d="M2.75 4v12M17.25 4v12"/>'),
84
+ full: svg('<rect x="3.25" y="4.25" width="13.5" height="11.5" rx="1.75"/><path d="m6.5 10h7M6.5 10l1.75-1.75M6.5 10l1.75 1.75M13.5 10l-1.75-1.75M13.5 10l-1.75 1.75"/>'),
85
+ reset: svg('<path d="M4.75 6.75A6 6 0 1 1 4 10.5"/><path d="M4.5 3.5v3.5H8"/>'),
86
+ check: svg('<path d="m3.5 8.5 3 3 6-7"/>', 16),
87
+ frame: svg('<rect x="3.25" y="4.25" width="13.5" height="11.5" rx="3"/><path d="M6.25 7.75h3"/>'),
88
+ rename: svg('<path d="M11.75 4.75l3.5 3.5"/><path d="M13.25 3.25a1.5 1.5 0 0 1 2.12 0l1.38 1.38a1.5 1.5 0 0 1 0 2.12L7.5 16H4v-3.5z"/>'),
89
+ chevron: svg('<path d="m6.5 4 4 4-4 4"/>', 16),
90
+ face: svg('<circle cx="10" cy="10" r="6.75"/><path d="M7.5 11.5a3 3 0 0 0 5 0"/><circle cx="7.9" cy="8.5" r=".9" fill="currentColor" stroke="none"/><circle cx="12.1" cy="8.5" r=".9" fill="currentColor" stroke="none"/>'),
91
+ };
92
+
93
+ // A row's picture, as the tooltip shows it.
94
+ const previewOf = ({ src }) => element("img", { class: "ge-pop-preview", src, alt: "" });
95
+
96
+ const opened = new Set(); // the menus open now, whichever part of the page opened them
97
+
98
+ /** Whether a menu is open anywhere on the page (a press outside it closes it). */
99
+ export const menuOpen = () => opened.size > 0;
100
+
101
+ /**
102
+ * items: rows { label, run, icon?, hint?, long?, current?, checked?, disabled?, note?, preview? } (long:
103
+ * a label of any length, a page's title, cut before its hint is; current: the choice
104
+ * made, checked and not to be chosen again; checked: a switch that is on, checked and clicked to turn
105
+ * it off; preview: { src, says }, a picture of what the row makes, where it has one, and a line on it,
106
+ * shown at the row's right while the pointer rests on it, notion-lite's row tooltip) (or { label, icon?, submenu:
107
+ * () => items, width?, search? } opening a submenu, with a search field at its top when `search` is
108
+ * given, as `opts.search` below, and `search.empty` the words shown when nothing is found), titles
109
+ * { title, icon? }, separators { separator: true } and grids { node, cells, columns } (type-grid.mjs: the
110
+ * node shown as it is, its cells, buttons that act on their own click, highlighted as rows are).
111
+ * opts: { label, empty, highlight, onClose, around, side, width } — width: the card's, in px, instead
112
+ * of 265 (the block menu: as wide as its grid of types). around: the rect of the block a handle
113
+ * (the anchor) stands for; the menu keeps clear of that block: left of it beside the handle, else
114
+ * below or above it (scrolling inside when only part of it fits), and over it only when the block
115
+ * leaves no room at all. side: "right": beside the anchor, right of it (left of it when there is no
116
+ * room), level with it (a section's bar). Without either the menu stands below the anchor (the
117
+ * caret), or above it when there is no room below; align: "end", its right edge at the anchor's.
118
+ * icons: false, rows of words alone (no column for icons: a code block's languages); height: the
119
+ * card's greatest height, in px (its rows scroll inside it past that). stand(size): where the card
120
+ * stands, its { left, top } for its { width, height }, in place of all of these rules (a pasted
121
+ * address's 选择视图, by the format bar's rule: placement.mjs besideText). inside: an element the rows
122
+ * go in, in place of a card over the page (a link card's pages): they stand where it has them.
123
+ * search: { placeholder, filter(text) }: a field above the rows, which takes the focus (unless
124
+ * `focus` is false: a submenu the pointer opened, whose field the first letter typed goes to,
125
+ * menu.type); what is typed in it gives the rows anew (filter returns the items), its keys moving the
126
+ * highlight (↑/↓), running the row (Enter) and closing the menu (Esc).
127
+ */
128
+ export function createMenu() {
129
+ addStyle(STYLE);
130
+ let node = null;
131
+ let list = null; // where the rows go: the card, or under its search field
132
+ let rows = [];
133
+ let active = -1;
134
+ let pointed = false; // the highlight is where the pointer is (not where the keys moved it)
135
+ let options = {};
136
+ let anchor = null;
137
+ let sub = null; // the submenu's card (a menu of its own), made when first needed
138
+ let subRow = null; // the row it is open from
139
+ let subKeys = false; // opened from the keys: they move in it
140
+ let subTimer = 0;
141
+ let pointedRow = null;
142
+
143
+ // The pointer over a row highlights it. In a menu that starts with nothing highlighted (the block
144
+ // menu), leaving the row takes the highlight off again, as :hover would; a row the keys moved to
145
+ // stays, and so does the "/" menu's, the row Enter runs.
146
+ const point = (row) => {
147
+ highlight(rows.indexOf(row), false);
148
+ pointed = true;
149
+ if (row === pointedRow) return;
150
+ pointedRow = row;
151
+ clearTimeout(subTimer);
152
+ // Notion's: a submenu opens 80ms after the pointer rests on its row (200ms while another is
153
+ // open), and goes 250ms after the pointer rests elsewhere.
154
+ if (row.submenu && row !== subRow) subTimer = setTimeout(() => openSub(row), subRow ? 200 : 80);
155
+ else if (!row.submenu && subRow) subTimer = setTimeout(closeSub, 250);
156
+ };
157
+ const leave = (row) => {
158
+ if (pointed && rows[active] === row && options.highlight === false) highlight(-1);
159
+ if (pointedRow !== row) return;
160
+ pointedRow = null;
161
+ clearTimeout(subTimer); // passing over a row opens nothing
162
+ if (subRow === row && !subKeys) subTimer = setTimeout(closeSub, 250); // unless the pointer goes into it
163
+ };
164
+
165
+ function build(items) {
166
+ rows = [];
167
+ const children = [];
168
+ for (const item of items) {
169
+ if (item.separator) {
170
+ if (children.length > 0 && !children.at(-1).classList.contains("ge-pop-sep")) children.push(element("div", { class: "ge-pop-sep", role: "separator" }));
171
+ } else if (item.title) children.push(element("div", { class: "ge-pop-title" }, ...(item.icon ? [element("span", { class: "ge-pop-icon", html: item.icon })] : []), element("span", { class: "ge-pop-name", text: item.title })));
172
+ else if (item.node) {
173
+ const grid = { start: rows.length, count: item.cells.length, columns: item.columns };
174
+ for (const cell of item.cells) {
175
+ cell.grid = grid;
176
+ cell.addEventListener("pointermove", () => point(cell));
177
+ cell.addEventListener("pointerleave", () => leave(cell));
178
+ rows.push(cell);
179
+ }
180
+ children.push(item.node);
181
+ } else {
182
+ const row = element("button", { type: "button", class: "ge-pop-row", role: "menuitem" });
183
+ if (item.long) row.setAttribute("data-long", "");
184
+ if (options.icons !== false) row.append(element("span", { class: "ge-pop-icon", html: item.icon ?? "" }));
185
+ row.append(element("span", { class: "ge-pop-label", text: item.label }));
186
+ if (item.hint) row.append(element("span", { class: "ge-pop-hint", text: item.hint }));
187
+ if (item.submenu) {
188
+ row.append(element("span", { class: "ge-pop-arrow", html: ICONS.chevron }));
189
+ row.setAttribute("aria-haspopup", "menu");
190
+ row.submenu = item.submenu;
191
+ row.subWidth = item.width;
192
+ row.subSearch = item.search;
193
+ }
194
+ if (item.current || item.checked) {
195
+ row.append(element("span", { class: "ge-pop-check", html: ICONS.check, "aria-label": item.current ? t("当前") : t("已开启") }));
196
+ row.setAttribute("data-current", "");
197
+ if (item.checked) row.setAttribute("aria-checked", "true");
198
+ }
199
+ row.disabled = Boolean(item.disabled || item.current);
200
+ row.run = item.run;
201
+ row.addEventListener("mousedown", (event) => event.preventDefault());
202
+ row.addEventListener("pointermove", () => point(row));
203
+ row.addEventListener("pointerleave", () => leave(row));
204
+ row.addEventListener("click", () => run(row));
205
+ rows.push(row);
206
+ children.push(row);
207
+ if (item.note) children.push(element("div", { class: "ge-pop-note", text: item.note }));
208
+ if (item.preview) tooltip(row, item.preview.src ? () => previewOf(item.preview) : item.preview.says, item.preview.src ? item.preview.says : null, { placement: "right", align: "start", beside: true });
209
+ }
210
+ }
211
+ while (children.at(-1)?.classList.contains("ge-pop-sep")) children.pop();
212
+ if (rows.length === 0 && options.empty) children.push(element("div", { class: "ge-pop-empty", text: options.empty }));
213
+ hideTooltip();
214
+ list.replaceChildren(...children);
215
+ active = -1;
216
+ pointed = false;
217
+ }
218
+
219
+ function highlight(index, scroll = true) {
220
+ rows[active]?.removeAttribute("data-active");
221
+ active = index;
222
+ const row = rows[active];
223
+ if (!row) return;
224
+ row.setAttribute("data-active", "");
225
+ if (scroll) row.scrollIntoView({ block: "nearest" });
226
+ }
227
+
228
+ const clamp = (value, low, high) => Math.max(low, Math.min(high, value));
229
+
230
+ function place() {
231
+ if (options.inside) return;
232
+ const margin = 8;
233
+ const gap = 6;
234
+ node.style.maxHeight = options.height ? `${options.height}px` : "";
235
+ if (options.width) node.style.width = `${options.width}px`;
236
+ const width = node.offsetWidth;
237
+ let height = node.offsetHeight;
238
+ const room = innerHeight - 2 * margin;
239
+ const fit = (space) => {
240
+ if (height > space) {
241
+ node.style.maxHeight = `${Math.floor(space)}px`;
242
+ height = space;
243
+ // A card as wide as its content widens by the scrollbar it now has.
244
+ if (options.width) node.style.width = `${options.width + node.offsetWidth - node.clientWidth}px`;
245
+ }
246
+ };
247
+ let left;
248
+ let top;
249
+ const block = options.around;
250
+ if (options.stand) {
251
+ fit(room);
252
+ ({ left, top } = options.stand({ width, height }));
253
+ } else if (options.side === "right") {
254
+ fit(room);
255
+ const aside = options.gap ?? gap;
256
+ left = anchor.right + aside + width <= innerWidth - margin ? anchor.right + aside : anchor.left - aside - width;
257
+ top = clamp(anchor.top, margin, innerHeight - margin - height);
258
+ } else if (!block) {
259
+ // Below the anchor (the caret), or above it where there is more room; never over it (it once
260
+ // covered the line typed in, at the top of the window): the card scrolls inside when it fits
261
+ // in neither.
262
+ const aside = options.gap ?? gap;
263
+ left = clamp(options.align === "end" ? anchor.right - width : anchor.left, margin, innerWidth - width - margin);
264
+ const below = innerHeight - margin - (anchor.bottom + aside);
265
+ const above = anchor.top - aside - margin;
266
+ if (height <= below || below >= above) {
267
+ fit(Math.max(below, 120));
268
+ top = anchor.bottom + aside;
269
+ } else {
270
+ fit(Math.max(above, 120));
271
+ top = Math.max(margin, anchor.top - aside - height);
272
+ }
273
+ } else {
274
+ const below = innerHeight - margin - (block.bottom + gap);
275
+ const above = block.top - gap - margin;
276
+ const beside = anchor.left - gap - width;
277
+ if (beside >= margin) {
278
+ // Left of the block, centered on its handle.
279
+ fit(room);
280
+ left = beside;
281
+ top = clamp((anchor.top + anchor.bottom) / 2 - height / 2, margin, innerHeight - margin - height);
282
+ } else if (Math.max(below, above) >= Math.min(height, 180)) {
283
+ // Below the block, else above it; in the larger of the two when it fits in neither.
284
+ left = clamp(anchor.left, margin, innerWidth - width - margin);
285
+ const under = height <= below || (height > above && below >= above);
286
+ fit(under ? below : above);
287
+ top = under ? block.bottom + gap : block.top - gap - height;
288
+ } else {
289
+ // The block fills the window: beside the handle, over the block.
290
+ fit(room);
291
+ left = Math.min(anchor.right + gap, innerWidth - width - margin);
292
+ top = clamp((anchor.top + anchor.bottom) / 2 - height / 2, margin, innerHeight - margin - height);
293
+ }
294
+ }
295
+ node.style.left = `${Math.round(Math.max(margin, left))}px`;
296
+ node.style.top = `${Math.round(top)}px`;
297
+ }
298
+
299
+ // ---------- a row's submenu ----------
300
+
301
+ function openSub(row, keys = false) {
302
+ clearTimeout(subTimer);
303
+ if (!node || !rows.includes(row)) return;
304
+ if (subRow === row && sub?.isOpen) {
305
+ if (keys && !subKeys) {
306
+ subKeys = true;
307
+ sub.move(1);
308
+ }
309
+ return;
310
+ }
311
+ closeSub();
312
+ sub ??= createMenu();
313
+ subRow = row;
314
+ subKeys = keys;
315
+ row.setAttribute("aria-expanded", "true");
316
+ // A choice in it closes both cards, then runs; so does one its search field found.
317
+ const closing = (items) => items.map((item) => (item.run ? { ...item, run: () => { close(); item.run(); } } : item));
318
+ const items = closing(row.submenu());
319
+ const search = row.subSearch && { placeholder: row.subSearch.placeholder, filter: (text) => closing(row.subSearch.filter(text)) };
320
+ sub.open(items, row.getBoundingClientRect(), {
321
+ side: "right", gap: 0, height: Math.round(innerHeight * 0.7), highlight: keys, width: row.subWidth, label: row.textContent, search, empty: row.subSearch?.empty, focus: keys,
322
+ onClose: () => {
323
+ row.removeAttribute("aria-expanded");
324
+ if (subRow === row) {
325
+ subRow = null;
326
+ subKeys = false;
327
+ }
328
+ },
329
+ });
330
+ for (const card of sub.nodes) card.addEventListener("pointerenter", () => clearTimeout(subTimer));
331
+ }
332
+
333
+ function closeSub() {
334
+ clearTimeout(subTimer);
335
+ sub?.close();
336
+ }
337
+
338
+ function run(row) {
339
+ if (!row || row.disabled) return false;
340
+ if (row.submenu) {
341
+ openSub(row, true);
342
+ return true;
343
+ }
344
+ if (row.grid) {
345
+ row.click(); // a grid's cell does its own work (and closes the menu)
346
+ return true;
347
+ }
348
+ const action = row.run;
349
+ close();
350
+ action?.();
351
+ return true;
352
+ }
353
+
354
+ // The search field: what is typed in it filters the rows (not while an input method composes).
355
+ function searchField(search) {
356
+ const field = element("input", { type: "text", placeholder: search.placeholder ?? t("搜索"), spellcheck: "false", autocomplete: "off", "aria-label": search.placeholder ?? t("搜索") });
357
+ const filter = () => {
358
+ build(search.filter(field.value));
359
+ highlight(rows.findIndex((row) => !row.disabled));
360
+ };
361
+ field.addEventListener("input", (event) => { if (!event.isComposing) filter(); });
362
+ field.addEventListener("compositionend", filter);
363
+ field.addEventListener("keydown", (event) => {
364
+ if (event.isComposing || event.keyCode === 229) return;
365
+ if (!menu.arrow(event)) {
366
+ if (event.key === "Enter") menu.choose();
367
+ else if (event.key === "Escape") close();
368
+ else if (event.key !== "Tab") return;
369
+ }
370
+ event.preventDefault();
371
+ });
372
+ return element("div", { class: "ge-pop-search" }, field);
373
+ }
374
+
375
+ function close() {
376
+ if (!node) return;
377
+ opened.delete(menu);
378
+ closeSub();
379
+ hideTooltip();
380
+ pointedRow = null;
381
+ node.remove();
382
+ node = null;
383
+ list = null;
384
+ rows = [];
385
+ active = -1;
386
+ const done = options.onClose;
387
+ options = {};
388
+ done?.();
389
+ }
390
+
391
+ const menu = {
392
+ open(items, rect, opts = {}) {
393
+ close();
394
+ options = opts;
395
+ anchor = rect;
396
+ opened.add(menu);
397
+ node = element("div", { class: "ge-pop", role: "menu", "aria-label": opts.label ?? t("菜单") });
398
+ if (opts.inside) {
399
+ node.setAttribute("data-inside", "");
400
+ opts.inside.append(node);
401
+ } else mount(node);
402
+ list = node;
403
+ if (opts.search) {
404
+ list = element("div");
405
+ node.append(searchField(opts.search), list);
406
+ }
407
+ build(items);
408
+ if (opts.highlight !== false) highlight(rows.findIndex((row) => !row.disabled && !row.passed));
409
+ place();
410
+ if (opts.focus !== false) node.querySelector(".ge-pop-search input")?.focus({ preventScroll: true });
411
+ },
412
+ /** Replace the rows (filtering), keeping the place; `first`: the first row highlighted. */
413
+ update(items, rect = anchor, { first = true } = {}) {
414
+ if (!node) return;
415
+ anchor = rect;
416
+ build(items);
417
+ if (first) highlight(rows.findIndex((row) => !row.disabled && !row.passed));
418
+ place();
419
+ },
420
+ /** Stand again, by `rect` or by what `stand` reads: the page moved under it. */
421
+ follow(rect = anchor) {
422
+ if (!node) return;
423
+ anchor = rect;
424
+ place();
425
+ },
426
+ close,
427
+ /**
428
+ * Move the highlight by one row, skipping disabled rows; in a grid by a line of it, out of it
429
+ * past its first or last line. `along`: ←/→ in a grid (false when no cell is highlighted).
430
+ */
431
+ move(delta, along = false) {
432
+ if (sub?.isOpen && subKeys) {
433
+ if (along && delta < 0 && !sub.move(delta, true)) {
434
+ closeSub();
435
+ return true;
436
+ }
437
+ return along ? true : sub.move(delta);
438
+ }
439
+ if (along && delta > 0 && rows[active]?.submenu) {
440
+ openSub(rows[active], true);
441
+ return true;
442
+ }
443
+ if (rows.length === 0) return false;
444
+ pointed = false;
445
+ const grid = rows[active]?.grid;
446
+ if (along) {
447
+ if (!grid) return false;
448
+ highlight(grid.start + (active - grid.start + delta + grid.count) % grid.count);
449
+ return true;
450
+ }
451
+ let index = active < 0 && delta < 0 ? rows.length : active; // from nothing, ↑ reaches the last row
452
+ if (grid) {
453
+ const at = active - grid.start;
454
+ const line = Math.floor(at / grid.columns);
455
+ const last = Math.floor((grid.count - 1) / grid.columns);
456
+ const next = delta > 0 && line < last ? Math.min(at + grid.columns, grid.count - 1) : delta < 0 && line > 0 ? at - grid.columns : null;
457
+ if (next !== null) {
458
+ highlight(grid.start + next);
459
+ return true;
460
+ }
461
+ index = delta > 0 ? grid.start + grid.count - 1 : grid.start;
462
+ }
463
+ // Passed over: a disabled row, and a cell that is already the block's (passed: a color's swatch).
464
+ for (let step = 0; step < rows.length; step++) {
465
+ index = (index + delta + rows.length) % rows.length;
466
+ if (!rows[index].disabled && !rows[index].passed) break;
467
+ }
468
+ highlight(index);
469
+ return true;
470
+ },
471
+ /** ↑/↓ as a key event: moves the highlight (`move`); false for any other key (the caller's own keys stay its). */
472
+ arrow(event) {
473
+ if (event.key !== "ArrowDown" && event.key !== "ArrowUp") return false;
474
+ menu.move(event.key === "ArrowDown" ? 1 : -1);
475
+ return true;
476
+ },
477
+ /**
478
+ * A letter typed while a submenu with a search field is open (the pointer opened it, the focus
479
+ * staying where it was): the field takes the focus, and the letter goes into it (the key's own
480
+ * typing, not prevented). Returns whether it went there.
481
+ */
482
+ type(event) {
483
+ const field = sub?.isOpen ? sub.nodes[0]?.querySelector(".ge-pop-search input") : null;
484
+ if (!field || event.ctrlKey || event.metaKey || event.altKey || (event.key.length !== 1 && event.keyCode !== 229)) return false;
485
+ subKeys = true; // its keys now move in it
486
+ field.focus({ preventScroll: true });
487
+ return true;
488
+ },
489
+ /** Run the highlighted row. Returns whether one ran. */
490
+ choose: () => (sub?.isOpen && subKeys ? sub.choose() : run(rows[active])),
491
+ get isOpen() { return node !== null; },
492
+ get hasChoice() { return sub?.isOpen && subKeys ? sub.hasChoice : Boolean(rows[active] && !rows[active].disabled); },
493
+ /** Whether the highlight is where the pointer is, not where the keys moved it. */
494
+ get pointed() { return pointed; },
495
+ contains: (target) => Boolean(node?.contains(target) || sub?.contains(target)),
496
+ /** The nodes to keep in the top layer when a modal dialog opens. */
497
+ get nodes() { return node ? [node, ...(sub?.nodes ?? [])] : []; },
498
+ };
499
+ return menu;
500
+ }
@@ -0,0 +1,100 @@
1
+ // Merging a block's inline HTML word by word (mergeText), and the helpers around it: the server's
2
+ // commits merge with them (source/merge.mjs), and the page undoes a change three ways with them
3
+ // once someone else's words were merged into the block (history.mjs).
4
+
5
+ // Longest common subsequence of two lists of strings, as index pairs. Shared ends are matched
6
+ // first, so the table only covers the part that changed. (The page's one LCS: the merge, the three-way
7
+ // undo and the conflict card's word diff all use it.)
8
+ export function commonRun(xs, ys) {
9
+ const head = [];
10
+ let start = 0;
11
+ while (start < xs.length && start < ys.length && xs[start] === ys[start]) head.push([start, start++]);
12
+ let endX = xs.length;
13
+ let endY = ys.length;
14
+ const tail = [];
15
+ while (endX > start && endY > start && xs[endX - 1] === ys[endY - 1]) tail.unshift([--endX, --endY]);
16
+ const n = endX - start;
17
+ const m = endY - start;
18
+ const table = Array.from({ length: n + 1 }, () => new Uint32Array(m + 1));
19
+ for (let i = n - 1; i >= 0; i--) {
20
+ for (let j = m - 1; j >= 0; j--) {
21
+ table[i][j] = xs[start + i] === ys[start + j] ? table[i + 1][j + 1] + 1 : Math.max(table[i + 1][j], table[i][j + 1]);
22
+ }
23
+ }
24
+ const middle = [];
25
+ for (let i = 0, j = 0; i < n && j < m;) {
26
+ if (xs[start + i] === ys[start + j]) middle.push([start + i++, start + j++]);
27
+ else if (table[i + 1][j] >= table[i][j + 1]) i++;
28
+ else j++;
29
+ }
30
+ return [...head, ...middle, ...tail];
31
+ }
32
+
33
+ // ---------- merging a block both sides changed ----------
34
+
35
+ // Tokens of a block's inline HTML: a tag, an entity, a word, a run of spaces, or any other single
36
+ // character (each Chinese or Japanese character on its own). Tokens compare by what they mean
37
+ // (`key`): entities decoded, a tag by its name and attributes, spaces collapsed, so the editor's
38
+ // rewrite of text it did not change still matches the source.
39
+ const TOKEN = /<[^>]*>|&(?:#\d+|#x[\da-f]+|[a-z]+\d*);|(?:(?![\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}])[\p{L}\p{N}_])+|[ \t\r\n\f]+|[\s\S]/giu;
40
+
41
+ const ENTITIES = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'", nbsp: " " };
42
+
43
+ const decodeEntities = (text) => text.replace(/&(#\d+|#x[\da-f]+|[a-z]+\d*);/gi, (whole, name) => {
44
+ if (name[0] !== "#") return ENTITIES[name.toLowerCase()] ?? whole;
45
+ const code = /^#x/i.test(name) ? parseInt(name.slice(2), 16) : Number(name.slice(1));
46
+ return code > 0 && code <= 0x10ffff ? String.fromCodePoint(code) : whole;
47
+ });
48
+
49
+ function tokenKey(raw) {
50
+ const tag = /^<(\/?)\s*([a-z][\w-]*)([^>]*?)\/?>$/i.exec(raw);
51
+ if (!tag) return /^[ \t\r\n\f]+$/.test(raw) ? " " : decodeEntities(raw);
52
+ const attributes = [...tag[3].matchAll(/([^\s=/]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+)))?/g)]
53
+ .map(([, name, double, single, bare]) => ` ${name.toLowerCase()}=${decodeEntities(double ?? single ?? bare ?? "")}`);
54
+ return `<${tag[1]}${tag[2].toLowerCase()}${attributes.join("")}>`;
55
+ }
56
+
57
+ const tokensOf = (html) => (html.match(TOKEN) ?? []).map((raw) => ({ raw, key: tokenKey(raw) }));
58
+
59
+ /**
60
+ * Three-way merge of a block's inline HTML: the reader's and the file's changes to the same base
61
+ * text. Changes to different places, with at least one unchanged word, character or tag (not
62
+ * just a space) between them, both go in; two changes to the same or neighbouring places, unless
63
+ * identical, make it a conflict (null). The caller still validates the result like any edit.
64
+ */
65
+ export function mergeText(base, mine, theirs) {
66
+ const [b, m, t] = [base, mine, theirs].map(tokensOf);
67
+ if (b.length + m.length + t.length > 6000) return null; // long enough that a conflict is the better answer
68
+ const keys = (tokens) => tokens.map((token) => token.key);
69
+ const toMine = new Map(commonRun(keys(b), keys(m)));
70
+ const toTheirs = new Map(commonRun(keys(b), keys(t)));
71
+ const same = (x, y) => x.length === y.length && x.every((token, index) => token.key === y[index].key);
72
+ const output = [];
73
+ let [i, j, k] = [0, 0, 0]; // the next token of each version not written yet
74
+ // Tokens both sides kept (spaces aside) anchor the merge; between two anchors, at most one side
75
+ // changed anything.
76
+ for (let at = 0; at <= b.length; at++) {
77
+ const end = at === b.length;
78
+ if (!end && !(b[at].key !== " " && toMine.has(at) && toTheirs.has(at))) continue;
79
+ const [nextMine, nextTheirs] = end ? [m.length, t.length] : [toMine.get(at), toTheirs.get(at)];
80
+ const [was, ours, their] = [b.slice(i, at), m.slice(j, nextMine), t.slice(k, nextTheirs)];
81
+ if (same(ours, was)) output.push(...their);
82
+ else if (same(their, was) || same(ours, their)) output.push(...ours);
83
+ else return null;
84
+ if (!end) output.push(m[nextMine]);
85
+ [i, j, k] = [at + 1, nextMine + 1, nextTheirs + 1];
86
+ }
87
+ return output.map((token) => token.raw).join("");
88
+ }
89
+
90
+ export function commonPrefix(a, b) {
91
+ let length = 0;
92
+ while (length < a.length && length < b.length && a[length] === b[length]) length++;
93
+ return length;
94
+ }
95
+
96
+ export function commonSuffix(a, b) {
97
+ let length = 0;
98
+ while (length < a.length && length < b.length && a[a.length - 1 - length] === b[b.length - 1 - length]) length++;
99
+ return length;
100
+ }