@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,656 @@
1
+ import { chipBox } from "../chip-fills.mjs";
2
+ import { DETAILS, DIALOG } from "../../components/kit.mjs";
3
+ import { boxRole } from "../../components/registry.mjs";
4
+ import { UNIT, can, isHost, mergeInto, partsOf, removalTarget, takeOut, textEnd, unitElement } from "../core.mjs";
5
+ import { atomOf, caretAt, caretAtOffset, dragPlace, editable, hosts, pointRange, select } from "../caret.mjs";
6
+ import { edgeFollower } from "../edge-scroll.mjs";
7
+ import { gapScore } from "../geometry.mjs";
8
+ import { endsGesture, gestureLock } from "../gesture.mjs";
9
+ import { joinCode } from "../marks.mjs";
10
+ import { own } from "../overlays.mjs";
11
+ import { keptByComponent } from "../page-objects.mjs";
12
+ import { addStyle, element } from "../ui.mjs";
13
+ import { Z } from "../../../shared/layers.mjs";
14
+ import { t } from "../../../shared/i18n/index.mjs";
15
+
16
+ // Selecting text across blocks (Feishu's: a press in text dragged into other blocks selects the
17
+ // text between; feishu-lite D:\code\feishu-lite, src/editing/selection/). Each block is a text
18
+ // block of its own here, and the browser keeps a selection inside one, so once the pointer leaves
19
+ // the block the press began in, the page takes the selection over: from where the press began to the
20
+ // text under the pointer (or the nearest block's, beside or between blocks; the page scrolls near
21
+ // the window's edges), drawn with the CSS Custom Highlight API in the selection's own colors, the
22
+ // browser's selecting held off meanwhile; back in that block, the browser's again. Shift+click in
23
+ // another block selects from the caret to there.
24
+ // Its text is that of body text, headings and list items (in quotes, highlight blocks, columns…).
25
+ // A block holding none (a code block, a table, a file, an image, a formula block, a callout, a
26
+ // divider…) is taken whole as it passes it, filled as a selected block is (selection/ mark), its
27
+ // own text not marked: over one, an end of the selection stands before it or after it, as the drag
28
+ // goes, and a press begun in one (its code, a cell) takes it whole once it has left it.
29
+ // The selection stays after the press: Ctrl+C copies it (its blocks, each of its type, the first and
30
+ // the last partly: clipboard/ copyAcross), Ctrl+X too and deletes it; Backspace, Delete, typing,
31
+ // Enter and a paste delete it first (the first block keeps its text before the selection and takes
32
+ // the last block's after it; the blocks between go, those taken whole among them; one undo step),
33
+ // Esc selects its blocks, an arrow collapses it. The format
34
+ // bar shows for it once the press ends (format-bar/: its text formatted, piece by piece, one undo
35
+ // step; its blocks turned into another type together, drawn again over them; no link, formula or
36
+ // card), and its keys format it too; a press on the bar keeps it. Ctrl+A selects the blocks of the
37
+ // first container holding all it touches (select-all/). Anything else (a press, Ctrl+Z) lets it go.
38
+
39
+ const NAME = "ge-cross"; // its ranges (what it holds; the scenarios read them), drawn by the strips below
40
+ const SHOWN = "ge-cross-shown"; // the same, drawn by the browser: in a modal dialog, which the page's layer is under
41
+ // Selected text looks the same in a block (the browser's) and across blocks (the page's), whatever
42
+ // the system's colors: the text keeps its color on Notion's blue (as the link box's stand-in, links/).
43
+ // The browser draws a selection a line high, so its lines meet; a highlight (the CSS Custom Highlight
44
+ // API) only as high as the letters, which leaves a gap between lines. So across blocks the page draws
45
+ // it as the browser does: a strip a line high over each line of each block's selected text (from its
46
+ // first letter to its last), in a layer of its own at the page's origin (it scrolls with the page)
47
+ // blended over the page, so the text keeps its color and the blue is the browser's (the palette's
48
+ // selection strip: multiplied on a light page, screened on a dark one).
49
+ const SELECTED = "var(--ge-select)";
50
+ const STYLE = `
51
+ ${gestureLock("data-ge-cross", { select: true })}
52
+ :is([data-ge-block], [data-ge-new])::selection, :is([data-ge-block], [data-ge-new]) ::selection { color: inherit; background-color: ${SELECTED}; }
53
+ ::highlight(${NAME}) { color: inherit; background-color: transparent; }
54
+ ::highlight(${SHOWN}) { color: inherit; background-color: ${SELECTED}; }
55
+ .ge-cross-layer { position: absolute; left: 0; top: 0; width: 0; height: 0; overflow: visible; pointer-events: none; z-index: ${Z.layer}; mix-blend-mode: multiply; }
56
+ .ge-cross-layer > span { position: absolute; left: 0; top: 0; background: var(--ge-select-strip); }
57
+ :root[data-doc-theme="dark"] .ge-cross-layer { mix-blend-mode: screen; }
58
+ @media (prefers-color-scheme: dark) {
59
+ :root:not([data-doc-theme="light"]) .ge-cross-layer { mix-blend-mode: screen; }
60
+ }
61
+ `;
62
+
63
+ // The boxes of what `range` holds, a chip of `chips` (those it holds whole) its own box and no piece of it.
64
+ function boxesOf(range, chips) {
65
+ const boxes = [];
66
+ const words = range.cloneRange();
67
+ for (const chip of chips) {
68
+ words.setEndBefore(chip);
69
+ boxes.push(...words.getClientRects(), ...chip.getClientRects());
70
+ words.setEnd(range.endContainer, range.endOffset);
71
+ words.setStartAfter(chip);
72
+ }
73
+ boxes.push(...words.getClientRects());
74
+ return boxes;
75
+ }
76
+
77
+ // The strips over each line of `texts` ([{ host, range }]), relative to `origin` (the layer's corner
78
+ // in the window): a line's from its first letter to its last, a line high (the block's line-height),
79
+ // centred on its letters; what a range holds that is a block of its own (taller than a line) left out,
80
+ // and a chip of the text it holds whole a strip of its own, over all of it (the layer's strips blend as
81
+ // one), but for one the line wraps, its pieces on their lines.
82
+ function lineStrips(texts, origin) {
83
+ const strips = [];
84
+ for (const { host, range } of texts) {
85
+ const style = getComputedStyle(host);
86
+ const height = parseFloat(style.lineHeight) || parseFloat(style.fontSize) * 1.6;
87
+ const chips = [...host.querySelectorAll("[data-ge-atom]")].filter((chip) => holds(range, chip));
88
+ const lines = [];
89
+ for (const rect of boxesOf(range, chips)) {
90
+ if (rect.width === 0 || rect.height > height * 1.5) continue;
91
+ const middle = (rect.top + rect.bottom) / 2;
92
+ const line = lines.find((each) => Math.abs(each.middle - middle) < height / 2);
93
+ if (line) {
94
+ line.left = Math.min(line.left, rect.left);
95
+ line.right = Math.max(line.right, rect.right);
96
+ } else lines.push({ middle, left: rect.left, right: rect.right });
97
+ }
98
+ for (const line of lines) strips.push({ left: line.left - origin.left, top: line.middle - height / 2 - origin.top, width: line.right - line.left, height });
99
+ for (const chip of chips) {
100
+ if (chip.getClientRects().length > 1) continue;
101
+ const box = chipBox(chip);
102
+ strips.push({ left: box.left - origin.left, top: box.top - origin.top, width: box.width, height: box.height });
103
+ }
104
+ }
105
+ return strips;
106
+ }
107
+
108
+ // The text blocks it takes text from, and a deletion joins: body text, headings, list items.
109
+ const isText = (host) => isHost(host) && (host.getAttribute("data-ge-kind") ?? "flow") === "flow";
110
+ const textHosts = (unit) => [...unit.querySelectorAll("[data-ge-block], [data-ge-new]")].filter((node) => isHost(node) && isText(node));
111
+
112
+ // The outermost block around `node` holding no text of the body (a code block, a table, a file…),
113
+ // taken whole, or null.
114
+ function wholeOf(node) {
115
+ let whole = null;
116
+ for (let unit = (node?.nodeType === 1 ? node : node?.parentElement)?.closest(UNIT); unit?.closest("main"); unit = unit.parentElement?.closest(UNIT)) {
117
+ if ((isHost(unit) && isText(unit)) || textHosts(unit).length > 0) break;
118
+ whole = unit;
119
+ }
120
+ return whole;
121
+ }
122
+
123
+ // The text a press can begin in: a text block's, or what a block taken whole edits as its own (a
124
+ // code block's code), or null.
125
+ function textAt(node) {
126
+ const host = editable(node);
127
+ if (host) return host;
128
+ const own = (node?.nodeType === 1 ? node : node?.parentElement)?.closest('[contenteditable="true"]');
129
+ return own?.closest("main") && wholeOf(own) ? own : null;
130
+ }
131
+
132
+ // Whether a block is no block of a selection between its ends, taken or deleted only with the block
133
+ // around it: a part of that block (a card's title, a tabs area's tab: notion-lite's tabs are no
134
+ // blocks a selection holds), or in a tab not shown (notion-lite's tabs not shown are not on the page).
135
+ const ownPart = (unit) => (!unit.parentElement?.hasAttribute("data-ge-box") && !isHost(unit))
136
+ || boxRole(unit.parentElement.getAttribute("data-ge-box-kind")) === "tabs" || Boolean(unit.parentElement.closest("main [hidden]"));
137
+
138
+ // The place right before a block (with what goes with it: core.mjs partsOf) or right after it.
139
+ function edge(unit, after) {
140
+ const parts = partsOf(unit);
141
+ const node = after ? parts.at(-1) : parts[0];
142
+ const index = [...node.parentNode.childNodes].indexOf(node);
143
+ return { host: null, unit, node: node.parentNode, offset: after ? index + 1 : index };
144
+ }
145
+
146
+ // Whether point a comes before point b in the page.
147
+ function before(a, b) {
148
+ const range = document.createRange();
149
+ range.setStart(a.node, a.offset);
150
+ return range.comparePoint(b.node, b.offset) > 0;
151
+ }
152
+
153
+ const rangeOf = ({ start, end }) => {
154
+ const range = document.createRange();
155
+ range.setStart(start.node, start.offset);
156
+ range.setEnd(end.node, end.offset);
157
+ return range;
158
+ };
159
+
160
+ // Whether `range` holds all of `node`.
161
+ function holds(range, node) {
162
+ const own = document.createRange();
163
+ own.selectNode(node);
164
+ return range.compareBoundaryPoints(Range.START_TO_START, own) <= 0 && range.compareBoundaryPoints(Range.END_TO_END, own) >= 0;
165
+ }
166
+
167
+ /**
168
+ * isEditing(); struct(parents, touched, mutate): the editor's undoable structural change; say;
169
+ * keepText(unit): why a block may not go (block-info.mjs); selectUnits(units): select blocks;
170
+ * markUnits(units): fill blocks as selected without selecting them (blocks.mjs); split(host): Enter
171
+ * in a text block (typing/). copy(data, range, { texts, wholes }, cut): it written to the clipboard's
172
+ * `data`, whether it was (clipboard/ copyAcross: a cut it refuses deletes nothing). claims(from, to):
173
+ * whether a drag from text block `from` into `to` is another tool's (a table's cells:
174
+ * table/cells.mjs), which then selects; the press is no longer this one's. keeps(node): a press on it keeps the selection (the format bar); formatKey(event):
175
+ * a key that formats it, handled (the format bar's keys); changed(): it was drawn by a press that
176
+ * ended, or let go (the format bar shows or hides). selectAll(event, touched): whether a key over it
177
+ * was Ctrl+A, handled (select-all/: the first container holding all it touches, as blocks),
178
+ * `touched()` letting it go and giving the blocks it touches.
179
+ */
180
+ export function createTextSelection({ isEditing, struct, say, keepText, selectUnits, markUnits = () => {}, split, copy: write, claims = () => false, keeps = () => false, formatKey = () => false, changed = () => {}, selectAll = () => false }) {
181
+ addStyle(STYLE);
182
+ const supported = Boolean(globalThis.CSS?.highlights && globalThis.Highlight);
183
+ let press = null; // the main button down in text: { anchor, crossing }
184
+ let cross = null; // the page's selection: { start, end } (points { host, node, offset }, in page order; host null at a block's edge)
185
+ let swallow = false; // a Shift+click drew it: the mousedown after the press does nothing
186
+
187
+ // ---------- points ----------
188
+
189
+ // Where the pointer is in the page's text, `from` being the selection's other end: the body text
190
+ // under it; over a block taken whole, before it or after it (whichever leaves it inside); else the
191
+ // nearest text block by height (at its start above it, its end below it, beside it the nearest
192
+ // place on that line).
193
+ function pointAt(x, y, from) {
194
+ const place = dragPlace([from.node, from.offset], x, y);
195
+ const host = place && editable(place[0]);
196
+ if (host?.closest("main") && isText(host)) return { host, node: place[0], offset: place[1] };
197
+ const whole = wholeOf(document.elementFromPoint(x, y));
198
+ if (whole) return edge(whole, !from || before(from, edge(whole, false)));
199
+ let best = null;
200
+ let bestScore = null;
201
+ for (const each of hosts().filter((node) => node.closest("main") && isText(node))) {
202
+ const rect = each.getBoundingClientRect();
203
+ // By height, then (level ones: columns side by side) by width; of nested ones, the innermost.
204
+ const score = gapScore(rect, x, y);
205
+ if (!bestScore || score[0] < bestScore[0] || (score[0] === bestScore[0] && score[1] <= bestScore[1])) {
206
+ best = each;
207
+ bestScore = score;
208
+ }
209
+ }
210
+ if (!best) return null;
211
+ const rect = best.getBoundingClientRect();
212
+ if (y < rect.top) return { host: best, node: best, offset: 0 };
213
+ if (y > rect.bottom) return { host: best, node: best, offset: textEnd(best) };
214
+ const inside = pointRange(Math.min(Math.max(x, rect.left + 1), rect.right - 1), y);
215
+ if (inside && editable(inside.startContainer) === best) return { host: best, node: inside.startContainer, offset: inside.startOffset };
216
+ return { host: best, node: best, offset: x < rect.left + rect.width / 2 ? 0 : textEnd(best) };
217
+ }
218
+
219
+ // Where the selection starts, `focus` being its other end: the press's place in body text; begun
220
+ // in a block taken whole (its code, a cell), that block's edge away from `focus`.
221
+ function startOf(anchor, focus) {
222
+ if (isText(anchor.host)) return anchor;
223
+ const whole = wholeOf(anchor.host) ?? unitElement(anchor.host);
224
+ if (!whole) return anchor;
225
+ const head = edge(whole, false);
226
+ return before(head, focus) ? head : edge(whole, true);
227
+ }
228
+
229
+ // ---------- what it holds ----------
230
+
231
+ // Its text, by text block ({ host, range }, the block's own text: not the lists it holds), and the
232
+ // blocks it takes whole (outermost), each in page order.
233
+ function piecesOf(selection) {
234
+ const range = rangeOf(selection);
235
+ // A closed disclosure it holds all of is taken whole (its content folded away is no text to
236
+ // draw); in one it holds a part of (from its title on), what is folded away is no piece either.
237
+ const closed = [...document.querySelectorAll(`main ${DETAILS.match}:not([open])`)];
238
+ const wholeClosed = closed.filter((details) => holds(range, details) && !closed.some((other) => other !== details && other.contains(details) && holds(range, other)));
239
+ const folded = (host) => closed.some((details) => details.contains(host) && (wholeClosed.includes(details) || !details.querySelector(DETAILS.label)?.contains(host)));
240
+ // A text block between its ends has all its own text in it; one holding an end (a list item, a
241
+ // flowchart's step, holding the block the selection starts or ends in) only the part of its own
242
+ // text it reaches: none when its text stands before the start (the selection begun in a block the
243
+ // item holds) or after the end.
244
+ const reaches = (host) => host === selection.start.host || host === selection.end.host || (range.isPointInRange(host, 0) && range.isPointInRange(host, textEnd(host)));
245
+ const texts = hosts().filter((host) => host.closest("main") && isText(host) && range.intersectsNode(host) && reaches(host) && !folded(host)).map((host) => {
246
+ const part = document.createRange();
247
+ part.setStart(host, 0);
248
+ part.setEnd(host, textEnd(host));
249
+ if (host === selection.start.host) part.setStart(selection.start.node, selection.start.offset);
250
+ if (host === selection.end.host) part.setEnd(selection.end.node, selection.end.offset);
251
+ return { host, range: part };
252
+ });
253
+ const wholes = [...wholeClosed];
254
+ for (const unit of document.querySelectorAll(`main :is(${UNIT})`)) {
255
+ if (wholes.some((other) => other === unit || other.contains(unit))) continue;
256
+ if (ownPart(unit)) continue;
257
+ if ((isHost(unit) && isText(unit)) || textHosts(unit).length > 0 || !holds(range, unit)) continue;
258
+ wholes.push(unit);
259
+ }
260
+ return { texts, wholes };
261
+ }
262
+
263
+ // The outermost blocks wholly between its two ends (not holding either), which a deletion takes.
264
+ function unitsBetween(selection) {
265
+ const range = rangeOf(selection);
266
+ const ends = [selection.start.host, selection.end.host].filter(Boolean);
267
+ const chosen = [];
268
+ for (const unit of document.querySelectorAll(`main :is(${UNIT})`)) {
269
+ if (ends.some((host) => unit === host || unit.contains(host))) continue;
270
+ if (chosen.some((other) => other.contains(unit))) continue;
271
+ if (ownPart(unit)) continue; // with the block
272
+ if (holds(range, unit)) chosen.push(unit);
273
+ }
274
+ return chosen;
275
+ }
276
+
277
+ // The blocks it touches, outermost: those wholly between its ends, and the blocks of its two ends
278
+ // (a block whose text blocks it all reaches, as a list whose every item it reaches, for them).
279
+ function blocksTouched(selection) {
280
+ const between = unitsBetween(selection);
281
+ const reached = new Set(piecesOf(selection).texts.map(({ host }) => host));
282
+ const covered = (host) => reached.has(host) || between.some((unit) => unit.contains(host));
283
+ const units = new Set(between);
284
+ for (const host of [selection.start.host, selection.end.host].filter(Boolean)) {
285
+ let unit = unitElement(host);
286
+ for (let outer = unit?.parentElement?.closest(UNIT); outer?.closest("main") && [...outer.querySelectorAll("[data-ge-block], [data-ge-new]")].filter(isHost).every(covered); outer = outer.parentElement?.closest(UNIT)) unit = outer;
287
+ if (unit) units.add(unit);
288
+ }
289
+ return [...units].filter((unit) => ![...units].some((other) => other !== unit && other.contains(unit)));
290
+ }
291
+
292
+ // ---------- drawing ----------
293
+
294
+ function draw(a, b) {
295
+ cross = before(a, b) ? { start: a, end: b } : { start: b, end: a };
296
+ getSelection().removeAllRanges(); // the page's own from now
297
+ const { texts, wholes } = piecesOf(cross);
298
+ CSS.highlights.set(NAME, new Highlight(...texts.map(({ range }) => range)));
299
+ paint(texts);
300
+ markUnits(wholes);
301
+ }
302
+
303
+ // Its text drawn: the strips (lineStrips) in the page's layer, or, in a modal dialog, the browser's highlight.
304
+ let layer = null;
305
+ function paint(texts) {
306
+ const inDialog = texts.some(({ host }) => host.closest("dialog[open]")?.matches(":modal"));
307
+ if (inDialog) CSS.highlights.set(SHOWN, new Highlight(...texts.map(({ range }) => range)));
308
+ else CSS.highlights.delete(SHOWN);
309
+ layer ??= element("div", { class: "ge-cross-layer", "data-doc-dev": "" });
310
+ if (!layer.isConnected) document.body.append(layer);
311
+ const strips = inDialog ? [] : lineStrips(texts, layer.getBoundingClientRect());
312
+ while (layer.children.length > strips.length) layer.lastChild.remove();
313
+ while (layer.children.length < strips.length) layer.append(own(element("span"), "cross-selection", { alive: () => cross !== null }));
314
+ strips.forEach(({ left, top, width, height }, index) => Object.assign(layer.children[index].style, {
315
+ transform: `translate(${Math.round(left)}px, ${Math.round(top)}px)`, width: `${Math.round(width)}px`, height: `${Math.round(height)}px`,
316
+ }));
317
+ }
318
+
319
+ function letGo() {
320
+ if (!cross) return;
321
+ cross = null;
322
+ if (supported) {
323
+ CSS.highlights.delete(NAME);
324
+ CSS.highlights.delete(SHOWN);
325
+ }
326
+ layer?.replaceChildren();
327
+ markUnits([]);
328
+ changed();
329
+ }
330
+
331
+ // The page laid out again (the window resized): the strips over the text where it is now.
332
+ window.addEventListener("resize", () => {
333
+ if (cross) paint(piecesOf(cross).texts);
334
+ });
335
+
336
+ // Drawn again over its text changed in place (formatted, its blocks turned into another type:
337
+ // `texts` its pieces' new ranges in page order): its ends in text where they were, at a block's
338
+ // edge as they were (one still on the page).
339
+ function redraw(texts) {
340
+ if (!cross || texts.length === 0) return;
341
+ const first = texts[0].range;
342
+ const last = texts.at(-1).range;
343
+ const edge = (point) => !point.host && point.node.isConnected;
344
+ const start = edge(cross.start) ? cross.start : { host: texts[0].host, node: first.startContainer, offset: first.startOffset };
345
+ const end = edge(cross.end) ? cross.end : { host: texts.at(-1).host, node: last.endContainer, offset: last.endOffset };
346
+ draw(start, end);
347
+ }
348
+
349
+ // Drawn again over its text blocks turned into another type (`texts`: where its pieces are now, in
350
+ // page order), as notion-lite's placeCaret(keep) keeps a selection; when one of them holds no text of
351
+ // the body now (a callout, a disclosure's title, code), let go instead. Returns whether it is drawn.
352
+ function reselect(texts) {
353
+ if (!cross) return false;
354
+ if (texts.length === 0 || !texts.every(({ host }) => host.isConnected && isText(host))) {
355
+ letGo();
356
+ return false;
357
+ }
358
+ redraw(texts);
359
+ return true;
360
+ }
361
+
362
+ // ---------- the press ----------
363
+
364
+ document.addEventListener("pointerdown", (event) => {
365
+ if (cross && keeps(event.target)) return; // the format bar's buttons act on it
366
+ const extending = event.shiftKey && cross;
367
+ const shiftFrom = event.shiftKey ? (cross?.start ?? caretPoint()) : null;
368
+ letGo();
369
+ if (!supported || !isEditing() || event.button !== 0 || event.pointerType !== "mouse" || event.ctrlKey || event.metaKey || event.altKey) return;
370
+ // In text, or anywhere in a block taken whole (its code, not open yet; a file's row), which the
371
+ // press then stands for, but for what a component keeps: a drag there is its own.
372
+ const host = textAt(event.target) ?? (keptByComponent(event.target) ? null : wholeOf(event.target));
373
+ if (!host?.closest("main")) return;
374
+ // Shift+click in another block: from the caret (or the selection's start) to there (unless it is
375
+ // another tool's: cells of a table).
376
+ if (shiftFrom && shiftFrom.host !== host && !claims(shiftFrom.host, host)) {
377
+ const to = pointAt(event.clientX, event.clientY, shiftFrom);
378
+ if (!to) return;
379
+ event.preventDefault();
380
+ event.stopImmediatePropagation();
381
+ swallow = true; // and the browser's own selecting on the mousedown after it
382
+ draw(startOf(shiftFrom, to), to);
383
+ changed();
384
+ return;
385
+ }
386
+ if (extending) return;
387
+ const at = pointRange(event.clientX, event.clientY);
388
+ if (!at || (textAt(at.startContainer) ?? wholeOf(at.startContainer)) !== host) return;
389
+ // Beside a chip the browser's place may be in its text: the place beside it.
390
+ const [node, offset] = atomOf(event.target) ? [at.startContainer, at.startOffset] : dragPlace([at.startContainer, at.startOffset], event.clientX, event.clientY);
391
+ press = { anchor: { host, node, offset }, crossing: false, whole: isText(host) ? null : wholeOf(host) };
392
+ }, true);
393
+ document.addEventListener("mousedown", (event) => {
394
+ if (!swallow) return;
395
+ swallow = false;
396
+ event.preventDefault();
397
+ event.stopImmediatePropagation();
398
+ }, true);
399
+
400
+ document.addEventListener("pointermove", (event) => {
401
+ if (!press || !(event.buttons & 1)) return;
402
+ press.x = event.clientX;
403
+ press.y = event.clientY;
404
+ // Into another tool's blocks (a table's cells, from a cell): theirs.
405
+ const at = pointRange(press.x, press.y);
406
+ const under = at ? textAt(at.startContainer) : null;
407
+ if (under && under !== press.anchor.host && claims(press.anchor.host, under)) {
408
+ if (press.crossing) letGo();
409
+ release();
410
+ return;
411
+ }
412
+ // Still in the block taken whole the press began in: the block's own (its code's selection).
413
+ if (press.whole?.contains(document.elementFromPoint(press.x, press.y))) {
414
+ if (!press.crossing) return;
415
+ press.crossing = false;
416
+ document.documentElement.removeAttribute("data-ge-cross");
417
+ letGo();
418
+ return;
419
+ }
420
+ const focus = under === press.anchor.host ? { host: under, node: at.startContainer, offset: at.startOffset } : pointAt(press.x, press.y, press.anchor);
421
+ if (!focus) return;
422
+ if (focus.host === press.anchor.host) {
423
+ if (!press.crossing) return;
424
+ // Back in the block the press began in: the browser's selection again.
425
+ press.crossing = false;
426
+ document.documentElement.removeAttribute("data-ge-cross");
427
+ letGo();
428
+ const range = document.createRange();
429
+ range.setStart(press.anchor.node, press.anchor.offset);
430
+ range.collapse(true);
431
+ select(range);
432
+ getSelection().extend(focus.node, focus.offset);
433
+ return;
434
+ }
435
+ if (!press.crossing) {
436
+ press.crossing = true;
437
+ document.documentElement.setAttribute("data-ge-cross", "");
438
+ }
439
+ draw(startOf(press.anchor, focus), focus);
440
+ scrolling.wake();
441
+ }, true);
442
+
443
+ // Near the top or bottom edge of what it started in (the window, or a detail card's content) that
444
+ // scrolls (as long as the pointer stays there), the selection reaching what comes into view: a task
445
+ // of the editor's frames (edge-scroll.mjs).
446
+ const scrolling = edgeFollower("text selection", {
447
+ pointer: () => (press?.crossing ? press : null),
448
+ scroller: () => press.anchor.host.closest(DIALOG.openContent),
449
+ scrolled() {
450
+ const focus = pointAt(press.x, press.y, press.anchor);
451
+ if (focus && focus.host !== press.anchor.host) draw(startOf(press.anchor, focus), focus);
452
+ },
453
+ fail: () => release(),
454
+ });
455
+
456
+ const release = () => {
457
+ if (!press) return;
458
+ press = null;
459
+ document.documentElement.removeAttribute("data-ge-cross");
460
+ if (cross) changed();
461
+ };
462
+ document.addEventListener("pointerup", release, true);
463
+ // The press ends the other ways too (the pointer cancelled, the window blurred, the page hidden).
464
+ endsGesture({ active: () => Boolean(press), cancel: release });
465
+
466
+ // The caret as a point, or null.
467
+ function caretPoint() {
468
+ const selection = getSelection();
469
+ if (!selection.rangeCount) return null;
470
+ const host = editable(selection.anchorNode);
471
+ return host?.closest("main") ? { host, node: selection.anchorNode, offset: selection.anchorOffset } : null;
472
+ }
473
+
474
+ // The caret at `point`; at a block's edge, in the body text nearest it that way (`forward`: after
475
+ // it), or the other way when there is none.
476
+ function caretTo(point, forward) {
477
+ if (point.host) {
478
+ const range = document.createRange();
479
+ range.setStart(point.node, point.offset);
480
+ point.host.focus({ preventScroll: true });
481
+ select(range);
482
+ return;
483
+ }
484
+ const texts = hosts().filter((host) => host.closest("main") && isText(host));
485
+ const next = texts.find((host) => before(point, { node: host, offset: 0 }));
486
+ const previous = texts.filter((host) => before({ node: host, offset: textEnd(host) }, point)).at(-1);
487
+ const host = forward ? next ?? previous : previous ?? next;
488
+ if (host) caretAt(host, host === next ? "start" : "end");
489
+ }
490
+
491
+ // Delete it: the first block keeps its text before it and takes the last block's after it, the
492
+ // blocks between go (those taken whole among them); one undo step, the caret where it began.
493
+ // Returns whether it went.
494
+ function remove() {
495
+ const selection = cross;
496
+ const { start, end } = selection;
497
+ letGo();
498
+ if (!(start.host ?? start.node).isConnected || !(end.host ?? end.node).isConnected) return false;
499
+ if (![start.host, end.host].every((host) => !host || isText(host))) {
500
+ say(t("跨块删除只支持正文、标题和列表里的文字。"));
501
+ return false;
502
+ }
503
+ // A block between goes as a selected block would (keepText: block-info.mjs), a text block between
504
+ // unless it cannot be deleted (a block taken whole, a formula block too, by the first rule only).
505
+ const units = unitsBetween(selection);
506
+ const reason = units.map((unit) => keepText(unit) ?? (isText(unit) && !can(unit, "remove") ? t("这里有不能删除的块。") : null)).find(Boolean);
507
+ if (reason) {
508
+ say(reason, "note", 6000);
509
+ return false;
510
+ }
511
+ let offset = 0;
512
+ if (start.host) {
513
+ const head = document.createRange();
514
+ head.setStart(start.host, 0);
515
+ head.setEnd(start.node, start.offset);
516
+ offset = head.toString().length;
517
+ }
518
+ // What goes: the blocks between, and a container they (and the last block, joined) leave
519
+ // empty, as when blocks are deleted (core.mjs removalTarget).
520
+ const targets = units.map((unit) => removalTarget(unit, new Set(units))).filter((node, index, all) => all.indexOf(node) === index);
521
+ const endTarget = start.host && end.host ? removalTarget(end.host, new Set([...units, end.host])) : null;
522
+ const parents = [...new Set([start.host, end.host, ...[end.host, endTarget, ...targets].map((node) => node?.parentElement)].filter(Boolean))];
523
+ const touched = [start.host, end.host].filter(Boolean);
524
+ // With neither end in text, the caret goes to the text after where the blocks were (else before).
525
+ const beside = start.host || end.host ? null : end;
526
+ const result = struct(parents, touched, () => {
527
+ if (end.host) {
528
+ const lead = document.createRange();
529
+ lead.setStart(end.host, 0);
530
+ lead.setEnd(end.node, end.offset);
531
+ lead.deleteContents();
532
+ }
533
+ if (start.host) {
534
+ const tail = document.createRange();
535
+ tail.setStart(start.node, start.offset);
536
+ tail.setEnd(start.host, textEnd(start.host));
537
+ tail.deleteContents();
538
+ }
539
+ for (const target of targets) takeOut(target);
540
+ // Joined unless the two cannot be (a block that may not merge, lists that cannot go along):
541
+ // then each keeps what is left of its text.
542
+ if (start.host && end.host && mergeInto(start.host, end.host, { anyKind: true }) && endTarget !== end.host && endTarget.isConnected) takeOut(endTarget);
543
+ if (start.host) joinCode(start.host); // inline code meeting inline code at the join is one piece
544
+ return { touched: touched.filter((host) => host.isConnected), focus: start.host ?? end.host ?? null };
545
+ });
546
+ if (!result) return false;
547
+ if (start.host) {
548
+ start.host.focus({ preventScroll: true }); // the block pressed in may have gone (a selection drawn upwards)
549
+ caretAtOffset(start.host, offset);
550
+ } else if (end.host?.isConnected) caretAt(end.host, "start");
551
+ else if (beside?.node.isConnected) caretTo({ host: null, node: beside.node, offset: Math.min(beside.offset, beside.node.childNodes.length) }, true);
552
+ return true;
553
+ }
554
+
555
+ // ---------- keys and the clipboard ----------
556
+
557
+ document.addEventListener("keydown", (event) => {
558
+ if (!cross) return;
559
+ const key = event.key;
560
+ const mod = event.ctrlKey || event.metaKey;
561
+ if (["Shift", "Control", "Meta", "Alt"].includes(key) || (mod && ["c", "x", "v"].includes(key.toLowerCase()))) return; // the clipboard's events do it
562
+ if (key === "Escape") {
563
+ event.preventDefault();
564
+ event.stopImmediatePropagation();
565
+ const units = blocksTouched(cross);
566
+ letGo();
567
+ selectUnits(units);
568
+ return;
569
+ }
570
+ if (key.startsWith("Arrow") && !mod) {
571
+ event.preventDefault();
572
+ event.stopImmediatePropagation();
573
+ const back = key === "ArrowLeft" || key === "ArrowUp";
574
+ const point = back ? cross.start : cross.end;
575
+ letGo();
576
+ caretTo(point, !back);
577
+ return;
578
+ }
579
+ if (key === "Backspace" || key === "Delete") {
580
+ event.preventDefault();
581
+ event.stopImmediatePropagation();
582
+ remove();
583
+ return;
584
+ }
585
+ if (key === "Enter") {
586
+ event.preventDefault();
587
+ event.stopImmediatePropagation();
588
+ if (!remove()) return;
589
+ const host = editable(getSelection().anchorNode);
590
+ if (host) split(host);
591
+ return;
592
+ }
593
+ // Typing (an input method too): what is typed replaces it.
594
+ if ((key.length === 1 && !mod) || event.keyCode === 229) {
595
+ if (!remove()) event.preventDefault();
596
+ return;
597
+ }
598
+ // Ctrl+A: the blocks of the first container holding all it touches (select-all/).
599
+ if (selectAll(event, () => {
600
+ const units = blocksTouched(cross);
601
+ letGo();
602
+ return units;
603
+ })) {
604
+ event.stopImmediatePropagation();
605
+ return;
606
+ }
607
+ // The format keys format it (the format bar's), it staying.
608
+ if (mod && formatKey(event)) {
609
+ event.stopImmediatePropagation();
610
+ return;
611
+ }
612
+ letGo();
613
+ }, true);
614
+
615
+ // Text put in without a key before it (some input methods, dictation): it replaces it too, typed
616
+ // where the deletion leaves the caret.
617
+ document.addEventListener("beforeinput", (event) => {
618
+ if (!cross) return;
619
+ event.preventDefault();
620
+ event.stopImmediatePropagation();
621
+ const text = event.inputType === "insertText" || event.inputType === "insertReplacementText" ? event.data ?? event.dataTransfer?.getData("text/plain") : null;
622
+ if ((event.inputType.startsWith("insert") || event.inputType.startsWith("delete")) && remove() && text) document.execCommand("insertText", false, text);
623
+ else letGo();
624
+ }, true);
625
+
626
+ // Copied (cut: deleted after, unless the copy refused it).
627
+ const copy = (event) => {
628
+ event.preventDefault();
629
+ event.stopImmediatePropagation();
630
+ return write(event.clipboardData, rangeOf(cross), piecesOf(cross), event.type === "cut");
631
+ };
632
+ document.addEventListener("copy", (event) => { if (cross) copy(event); }, true);
633
+ document.addEventListener("cut", (event) => {
634
+ if (cross && copy(event)) remove();
635
+ }, true);
636
+ document.addEventListener("paste", (event) => {
637
+ if (!cross) return;
638
+ // What is pasted replaces it: deleted first, the paste goes on at the caret.
639
+ if (!remove()) {
640
+ event.preventDefault();
641
+ event.stopImmediatePropagation();
642
+ }
643
+ }, true);
644
+
645
+ return {
646
+ /** Whether the page holds a selection across blocks. */
647
+ get active() { return cross !== null; },
648
+ /** Its text, by text block ({ host, range }, page order), or null when there is none. */
649
+ texts: () => (cross ? piecesOf(cross).texts : null),
650
+ /** The blocks it takes whole (outermost, page order), or null when there is none. */
651
+ wholes: () => (cross ? piecesOf(cross).wholes : null),
652
+ redraw,
653
+ reselect,
654
+ letGo,
655
+ };
656
+ }