@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,196 @@
1
+ import { audit, note, provide, report } from "./overlays.mjs";
2
+
3
+ // The editor's one animation-frame loop (docs/editor.md, "Overlays"). What the editor draws over the
4
+ // page follows it through tasks of this loop, never through loops of their own: the block tools
5
+ // (fills, the handle, a drag), the dashed frame of the text being edited, a box selection scrolling
6
+ // the page. One frame is requested at a time, however often tasks ask, from inside the loop too. A
7
+ // task runs on the next frame after wake(), and what its run() returns says when it runs again:
8
+ // true, on the next frame (a gesture under way: a drag, a box selection scrolling the page by the
9
+ // window's edge); FOLLOW, when something may have moved what it drew over (it stands over blocks: the
10
+ // handle, the fills, the frame of the text being edited, the flags); anything else, at its next
11
+ // wake(). One that throws takes down what it draws (fail()), the error is said (overlays.mjs report:
12
+ // not on every frame), and it waits for the next wake(): no stale picture stays. After the tasks,
13
+ // the overlays are audited (overlays.mjs): none may stand for nothing. An event that may show a
14
+ // stray (a scroll, a press, a key) asks for an audit too.
15
+ //
16
+ // The loop rests while nothing moves. Run on every frame while anything was drawn, it measured and
17
+ // drew the same things again and again with the pointer resting on a paragraph (its handle shown) or
18
+ // blocks selected: 60–160ms of the main thread a second, 115 frames a second, for a picture that did
19
+ // not change. What may move a block, and so runs the followers again: the page changed (a mutation
20
+ // anywhere but in the editor's own layers, overlay-layer.mjs, whose drawings move nothing), anything
21
+ // scrolled (a box of the page that scrolls by itself, the page under what sticks to the window), the
22
+ // window or the page resized, a transition or an animation under way (on every frame until it ends,
23
+ // LONGEST at most when its end never comes), a picture or a frame loaded (or failing), fonts loaded, the pointer
24
+ // onto another element (what :hover styles) or the focus moving (:focus-within), and any task woken
25
+ // (the pointer moved, the selection changed). After each, the followers run on SETTLE frames more: a
26
+ // layout the page's own frame callbacks change after the editor's (the kit's tables lay themselves
27
+ // out in a frame), one the next frame finishes.
28
+
29
+ /** What run() returns to run again whenever what it drew over may have moved (not on every frame). */
30
+ export const FOLLOW = "follow";
31
+
32
+ const SETTLE = 3; // frames the followers run on after the last thing that may have moved their blocks
33
+ const LONGEST = 5000; // ms: a transition or animation whose end never comes (one that repeats for good) stops counting as moving
34
+
35
+ const tasks = new Map(); // name -> { run, fail, wanted, follows }
36
+ let frame = 0;
37
+ let requested = 0; // frames requested and not yet run: never more than one
38
+ let epoch = 0; // frames run
39
+ let lastRun = 0;
40
+ let auditWanted = false;
41
+ let running = false; // a frame is being run
42
+ let settling = 0; // frames the followers still run on without a new reason
43
+ const moving = new Map(); // element -> { names: Set of transitions and animations under way on it, since }
44
+
45
+ const follows = () => {
46
+ for (const task of tasks.values()) if (task.follows) return true;
47
+ return false;
48
+ };
49
+
50
+ function request() {
51
+ if (frame) return;
52
+ requested++;
53
+ frame = requestAnimationFrame(editorFrame);
54
+ }
55
+
56
+ // Transitions and animations under way, their elements still on the page and begun not too long ago.
57
+ function stillMoving() {
58
+ if (moving.size === 0) return false;
59
+ const now = performance.now();
60
+ for (const [element, entry] of moving) if (!element.isConnected || now - entry.since > LONGEST) moving.delete(element);
61
+ return moving.size > 0;
62
+ }
63
+
64
+ function editorFrame() {
65
+ frame = 0;
66
+ requested--;
67
+ epoch++;
68
+ lastRun = performance.now();
69
+ // Something may have moved the blocks lately: the followers run on this frame.
70
+ if (settling > 0 || stillMoving()) {
71
+ settling = Math.max(0, settling - 1);
72
+ for (const task of tasks.values()) if (task.follows) task.wanted = true;
73
+ }
74
+ running = true;
75
+ let ran = false;
76
+ for (const [name, task] of tasks) {
77
+ if (!task.wanted) continue;
78
+ task.wanted = false;
79
+ ran = true;
80
+ try {
81
+ const next = task.run();
82
+ task.wanted = next === true;
83
+ task.follows = next === FOLLOW;
84
+ } catch (error) {
85
+ task.wanted = false;
86
+ task.follows = false;
87
+ try {
88
+ task.fail?.();
89
+ } catch (cleanup) {
90
+ report(`${name} (taking it down)`, cleanup);
91
+ }
92
+ report(name, error);
93
+ }
94
+ }
95
+ running = false;
96
+ if (auditWanted || ran) {
97
+ auditWanted = false;
98
+ try {
99
+ audit();
100
+ } catch (error) {
101
+ report("audit", error);
102
+ }
103
+ }
104
+ const following = follows();
105
+ watch(following);
106
+ if ([...tasks.values()].some((task) => task.wanted) || (following && (settling > 0 || moving.size > 0))) request();
107
+ }
108
+
109
+ /**
110
+ * A task of the loop: run() draws (returns true to run again on the next frame, FOLLOW to run again
111
+ * when what it drew over may have moved), fail() takes down what it draws. Returns { wake }: run it
112
+ * on the next frame.
113
+ */
114
+ export function task(name, { run, fail }) {
115
+ const entry = { run, fail, wanted: false, follows: false };
116
+ tasks.set(name, entry);
117
+ return {
118
+ wake() {
119
+ entry.wanted = true;
120
+ settling = SETTLE;
121
+ request();
122
+ },
123
+ };
124
+ }
125
+
126
+ /** Audit the overlays on the next frame (an event that may have shown a stray). */
127
+ function auditSoon() {
128
+ auditWanted = true;
129
+ request();
130
+ }
131
+
132
+ // Something that may have moved the blocks happened: the followers run on the next frames.
133
+ function moved() {
134
+ settling = SETTLE;
135
+ if (follows()) request();
136
+ }
137
+
138
+ // The page's mutations, watched only while a task follows (none to pay for while the reader types
139
+ // with nothing drawn): those inside the editor's layers are its own drawings, which move no block.
140
+ const mutations = new MutationObserver((records) => {
141
+ for (const record of records) {
142
+ const node = record.target.nodeType === 1 ? record.target : record.target.parentElement;
143
+ if (!node?.closest(".ge-layer")) return moved();
144
+ }
145
+ });
146
+ let watching = false;
147
+ function watch(on) {
148
+ if (on === watching) return;
149
+ watching = on;
150
+ if (on) mutations.observe(document.documentElement, { childList: true, subtree: true, attributes: true, characterData: true });
151
+ else mutations.disconnect();
152
+ }
153
+ const resizes = new ResizeObserver(() => moved());
154
+ resizes.observe(document.documentElement);
155
+ const main = document.querySelector("main");
156
+ if (main) resizes.observe(main);
157
+ for (const type of ["scroll", "resize", "pointerover", "focusin", "focusout"]) addEventListener(type, moved, { capture: true, passive: true });
158
+ // A picture's or a frame's load never reaches the window (a load event's path ends at the document).
159
+ for (const type of ["load", "error"]) document.addEventListener(type, moved, { capture: true, passive: true });
160
+ document.fonts?.addEventListener("loadingdone", moved);
161
+ // A transition or an animation begun goes on moving what it moves until it ends (or is cancelled).
162
+ const began = (event) => {
163
+ if (!(event.target instanceof Element)) return;
164
+ let entry = moving.get(event.target);
165
+ if (!entry) moving.set(event.target, (entry = { names: new Set(), since: 0 }));
166
+ entry.names.add(event.propertyName ?? event.animationName);
167
+ entry.since = performance.now();
168
+ moved();
169
+ };
170
+ const ended = (event) => {
171
+ const entry = moving.get(event.target);
172
+ entry?.names.delete(event.propertyName ?? event.animationName);
173
+ if (entry?.names.size === 0) moving.delete(event.target);
174
+ moved();
175
+ };
176
+ for (const type of ["transitionrun", "animationstart"]) addEventListener(type, began, { capture: true, passive: true });
177
+ for (const type of ["transitionend", "transitioncancel", "animationend", "animationcancel"]) addEventListener(type, ended, { capture: true, passive: true });
178
+
179
+ /** Frames run so far: a measurement taken in one frame is good for that frame only. */
180
+ export const frameNumber = () => epoch;
181
+
182
+ /** Whether a frame is being run now (outside one, what is measured is measured afresh). */
183
+ export const inFrame = () => running;
184
+
185
+ provide("frames", () => ({
186
+ requested,
187
+ epoch,
188
+ sinceLastRun: lastRun ? Math.round(performance.now() - lastRun) : null,
189
+ settling,
190
+ moving: moving.size,
191
+ watching,
192
+ tasks: [...tasks].map(([name, entry]) => ({ name, wanted: entry.wanted, follows: entry.follows })),
193
+ }));
194
+
195
+ for (const type of ["scroll", "pointerdown", "keyup"]) addEventListener(type, auditSoon, { capture: true, passive: true });
196
+ note("frames", "started");
@@ -0,0 +1,400 @@
1
+ import { UNIT, isEmpty, isHost, nestedBlocks, withLeads } from "./core.mjs";
2
+ import { boxRole, isBlock, isLead } from "../components/registry.mjs";
3
+
4
+ // Where the blocks are on the screen (docs/editor.md, "Selecting blocks"). measure() reads the
5
+ // page once into a tree of boxes and units with their rectangles. hoverAt, atHeight, measuredNode, pick,
6
+ // endOf and gapScore are pure functions of that tree, so their rules are tested without a browser
7
+ // (tests/unit/geometry.mjs); what reads the DOM is measure() and the readers of one element it and the
8
+ // overlays use: extentOf, fillExtentOf, clipOf, markerRect, markerAt, blankTarget:
9
+ //
10
+ // hoverAt the block whose handle shows while the pointer is on empty space beside it (and,
11
+ // of text blocks, the one a click there puts the caret into)
12
+ // pick the blocks a box selection takes: the ones it touches, lifted to one level
13
+ // endOf what a click below the last block of a box does: a new paragraph there, or the
14
+ // caret into the empty paragraph already at the end
15
+ // innerBox the innermost box at a click's height, whose blocks are those beside it
16
+ //
17
+ // Where dragged blocks would go (resolveDrop) is drag/drop.mjs, from the same tree.
18
+ //
19
+ // Geometry proposes, the page's structure (boxes, units) decides the level, and accepts() and the
20
+ // block rules decide what may happen; nothing here changes the page.
21
+ //
22
+ // A box: { type: "box", el, kind, role, rect, content, row, children: [unit | box] }, its units and the
23
+ // boxes standing loose in it (the report's header in the page); `content`: its rect inside its
24
+ // padding and border (where an empty box takes a block); `row`: it lays its blocks side by side (a
25
+ // tab row, a row of columns), "wrap" when in rows that wrap (a flowchart's nodes). A unit: { type: "unit", el, kind, rect, start, empty, text,
26
+ // nestable, children: [box] }, the boxes it holds (itself when it is one: a section, a list); its
27
+ // rect is where it shows (extentOf: a list item with its marker), `start` where its own content
28
+ // starts (a list item's text, right of the marker; its left otherwise); `text`: it is a text block
29
+ // itself, `nestable`: a list item that may take lists. Rects are { left, top, right, bottom } in
30
+ // page coordinates (scrolling does not change them); what is not shown (a hidden Sheet panel, a
31
+ // closed disclosure) is not in the tree.
32
+
33
+ const FLOWS = new Set(["root", "flow", "column"]);
34
+
35
+ const RULE = 12; // a divider line shows as a band this far above and below it (as tall as the handle)
36
+
37
+ /**
38
+ * Where a block shows (client coordinates), or null when it does not: its own box and those of its
39
+ * leads, a list item's marker left of it, out to its list's edge (the list's room for markers), and
40
+ * a divider line (an <hr>) as a band around the line, a line of text tall (the line alone is a
41
+ * pixel or two), as the reader sees the block. Its fill, its handle, where the pointer finds it and
42
+ * what a box selection touches go by this.
43
+ */
44
+ export function extentOf(el) {
45
+ let rect = null;
46
+ for (const part of withLeads(el)) {
47
+ const next = part.getBoundingClientRect();
48
+ if (next.width === 0 && next.height === 0) continue;
49
+ rect = rect
50
+ ? { left: Math.min(rect.left, next.left), top: Math.min(rect.top, next.top), right: Math.max(rect.right, next.right), bottom: Math.max(rect.bottom, next.bottom) }
51
+ : { left: next.left, top: next.top, right: next.right, bottom: next.bottom };
52
+ }
53
+ const marker = rect ? markerLeft(el) : null;
54
+ if (marker !== null) rect.left = Math.min(rect.left, marker);
55
+ if (rect && el.localName === "hr") {
56
+ const middle = (rect.top + rect.bottom) / 2;
57
+ rect.top = Math.min(rect.top, middle - RULE);
58
+ rect.bottom = Math.max(rect.bottom, middle + RULE);
59
+ }
60
+ return rect;
61
+ }
62
+
63
+ const RULE_FILL = 7; // ...and as what the editor draws over it shows it: Notion's divider row (13px)
64
+
65
+ /**
66
+ * Where what the editor draws over a block lies (a selected block's fill, the frame of what is
67
+ * edited): its extent (extentOf), a divider line's band as tall as Notion's divider row; the band
68
+ * the pointer finds it by stays taller (it once showed the fill 36px high around a 1px line).
69
+ */
70
+ export function fillExtentOf(el) {
71
+ const rect = extentOf(el);
72
+ if (!rect || el.localName !== "hr") return rect;
73
+ const middle = (rect.top + rect.bottom) / 2;
74
+ return { ...rect, top: middle - RULE_FILL, bottom: middle + RULE_FILL };
75
+ }
76
+
77
+ /**
78
+ * The part of the window a block can show in (client coordinates): inside every element around it
79
+ * that cuts off what overflows it (a dialog's scrolling content, a Sheet's tab row), or null when
80
+ * none does. What the editor draws over a block (its fill, its frame) is cut to it, as the block is.
81
+ */
82
+ export function clipOf(el) {
83
+ let clip = null;
84
+ for (let node = el.parentElement; node && node !== document.body; node = node.parentElement) {
85
+ const style = getComputedStyle(node);
86
+ if (style.overflowX === "visible" && style.overflowY === "visible") continue;
87
+ const rect = node.getBoundingClientRect();
88
+ const left = rect.left + node.clientLeft;
89
+ const top = rect.top + node.clientTop;
90
+ const inner = { left, top, right: left + node.clientWidth, bottom: top + node.clientHeight }; // inside its borders and scroll bars
91
+ clip = clip
92
+ ? { left: Math.max(clip.left, inner.left), top: Math.max(clip.top, inner.top), right: Math.min(clip.right, inner.right), bottom: Math.min(clip.bottom, inner.bottom) }
93
+ : inner;
94
+ }
95
+ return clip;
96
+ }
97
+
98
+ /**
99
+ * The kit's marker of a list item (its number, bullet or to-do box, drawn left of its text by the
100
+ * item's ::before: flow.css, todo.css) where the browser laid it out, or null when the item has
101
+ * none. The one reading of it: the handle's reach, a number's tooltip and menu, a to-do's box.
102
+ */
103
+ export function markerRect(el) {
104
+ if (el.localName !== "li") return null;
105
+ const before = getComputedStyle(el, "::before");
106
+ if (before.position !== "absolute" || !before.content || before.content === "none" || before.content === "normal") return null;
107
+ // One drawn inside the item is none (a flowchart's step number, in its card: flowchart.css).
108
+ if (parseFloat(before.left) >= 0) return null;
109
+ const number = (value) => parseFloat(value) || 0;
110
+ const box = el.getBoundingClientRect();
111
+ const width = number(before.width) + (before.boxSizing === "border-box" ? 0 : number(before.paddingLeft) + number(before.paddingRight) + number(before.borderLeftWidth) + number(before.borderRightWidth));
112
+ const right = box.left - number(before.marginRight);
113
+ const top = box.top + number(before.top);
114
+ const height = number(before.height) || number(getComputedStyle(el).lineHeight) || 26;
115
+ return { left: right - width, right, top, bottom: top + height, width, height };
116
+ }
117
+
118
+ /**
119
+ * The marker of a list item when a point is on it: its width (2px more to either side) on the
120
+ * item's first line. Null when it is not, or the item has none.
121
+ */
122
+ export function markerAt(el, x, y) {
123
+ const rect = markerRect(el);
124
+ if (!rect) return null;
125
+ const top = el.getBoundingClientRect().top;
126
+ const line = Math.max(rect.height, parseFloat(getComputedStyle(el).lineHeight) || 0);
127
+ return x >= rect.left - 2 && x <= rect.right + 2 && y >= top && y <= top + line ? rect : null;
128
+ }
129
+
130
+ // Where the marker of a list item standing outside its box starts (the browser's, in its list's
131
+ // padding; the kit's, markerRect), or null when it has none there.
132
+ function markerLeft(el) {
133
+ if (el.localName !== "li" || !el.parentElement?.matches("ul, ol")) return null;
134
+ const list = el.parentElement.getBoundingClientRect().left;
135
+ const style = getComputedStyle(el);
136
+ if (style.display.includes("list-item") && style.listStylePosition === "outside" && style.listStyleType !== "none") return list;
137
+ const marker = markerRect(el);
138
+ return marker && Math.min(list, marker.left);
139
+ }
140
+
141
+ /**
142
+ * Whether a press or the pointer is on empty space: the page around the report, or a box between
143
+ * its blocks. Never text: a list item is the box of its lists too, yet a press on it is in its text.
144
+ */
145
+ export function blankTarget(target) {
146
+ if (!target?.closest || target.closest("[data-doc-dev]")) return false;
147
+ if (target === document.documentElement || target === document.body) return true;
148
+ if (!target.closest("main")) return false; // the report's own controls outside it
149
+ return target.localName === "main" || (target.hasAttribute("data-ge-box") && target.getAttribute("contenteditable") !== "true");
150
+ }
151
+
152
+ /**
153
+ * The tree of `root` (a box, the page's main by default). With `band` ({ top, bottom }, page
154
+ * coordinates) only the units reaching into it are measured, and what they hold (reaching it with
155
+ * a divider's band to spare: a divider at a section's top reaches past the section).
156
+ */
157
+ export function measure(root = document.querySelector("main"), band = null) {
158
+ const dx = scrollX;
159
+ const dy = scrollY;
160
+ const onPage = (rect) => rect && { left: rect.left + dx, top: rect.top + dy, right: rect.right + dx, bottom: rect.bottom + dy };
161
+ const ownRect = (el) => {
162
+ const rect = el.getBoundingClientRect();
163
+ return rect.width === 0 && rect.height === 0 ? null : onPage(rect);
164
+ };
165
+ const reaches = (rect) => Boolean(rect) && (!band || (rect.bottom + RULE >= band.top && rect.top - RULE <= band.bottom));
166
+
167
+ function boxNode(el) {
168
+ const kind = el.getAttribute("data-ge-box-kind");
169
+ const style = getComputedStyle(el);
170
+ const rect = ownRect(el);
171
+ const node = { type: "box", el, kind, role: boxRole(kind), rect, content: rect && contentOf(rect, style), row: sideBySide(style), children: [] };
172
+ for (const child of el.children) {
173
+ if (child.matches(UNIT)) {
174
+ const unit = unitNode(child);
175
+ if (unit) node.children.push(unit);
176
+ } else if (child.hasAttribute("data-ge-box")) {
177
+ const box = boxNode(child);
178
+ if (reaches(box.rect)) node.children.push(box);
179
+ }
180
+ }
181
+ return node;
182
+ }
183
+
184
+ function unitNode(el) {
185
+ const rect = onPage(extentOf(el));
186
+ if (!reaches(rect)) return null;
187
+ const start = el.localName === "li" ? el.getBoundingClientRect().left + dx : rect.left;
188
+ const text = isHost(el);
189
+ const empty = text && el.localName === "p" && el.classList.length === 0 && isEmpty(el);
190
+ // An item takes lists when the file's has its box for them, or it was made on the page.
191
+ const nestable = el.localName === "li" && (el.getAttribute("data-ge-box-kind") === "nest" || (el.hasAttribute("data-ge-new") && !el.hasAttribute("data-ge-unit")));
192
+ // An item holding blocks: its own line, above them (a box selection touching it takes the item).
193
+ const lists = text ? nestedBlocks(el) : [];
194
+ const own = lists.length > 0 ? { ...rect, bottom: lists[0].getBoundingClientRect().top + dy } : null;
195
+ const node = { type: "unit", el, kind: el.getAttribute("data-ge-unit-kind"), rect, start, empty, text, nestable, own, children: [] };
196
+ for (const inner of boxesOf(el)) {
197
+ if (folded(inner)) continue;
198
+ const box = boxNode(inner);
199
+ if (box.rect) node.children.push(box);
200
+ }
201
+ return node;
202
+ }
203
+
204
+ return boxNode(root);
205
+ }
206
+
207
+ /**
208
+ * Whether a box is a closed disclosure's content: none of it is on the page. (The browser still
209
+ * places its blocks, under the title, over the blocks after the disclosure: a box selection or the
210
+ * pointer there would find them.)
211
+ */
212
+ const folded = (box) => box.parentElement?.localName === "details" && !box.parentElement.open;
213
+
214
+ // The boxes a unit holds: itself when it is one, otherwise those inside it with no unit or box between.
215
+ function boxesOf(el) {
216
+ if (el.hasAttribute("data-ge-box")) return [el];
217
+ return [...el.querySelectorAll("[data-ge-box]")].filter((box) => box.parentElement.closest(`${UNIT}, [data-ge-box]`) === el);
218
+ }
219
+
220
+ // A box's rect inside its padding and border.
221
+ function contentOf(rect, style) {
222
+ const inset = (side) => (parseFloat(style[`padding${side}`]) || 0) + (parseFloat(style[`border${side}Width`]) || 0);
223
+ return { left: rect.left + inset("Left"), top: rect.top + inset("Top"), right: rect.right - inset("Right"), bottom: rect.bottom - inset("Bottom") };
224
+ }
225
+
226
+ // A box laying its blocks side by side (a tab row, a grid of cards) rather than one below another:
227
+ // true, or "wrap" when its rows wrap (a flowchart's nodes, as the kit lays them out: rows that fill
228
+ // its width, a node alone in a row of its own where nothing goes beside it), false for none.
229
+ export function sideBySide(style) {
230
+ if (style.display.includes("grid")) return style.gridTemplateColumns.trim().split(/\s+/).length > 1;
231
+ if (!style.display.includes("flex") || style.flexDirection.startsWith("column")) return false;
232
+ return style.flexWrap.startsWith("wrap") ? "wrap" : true;
233
+ }
234
+
235
+ /**
236
+ * The block beside the point (page coordinates) whose handle shows while the pointer is on empty
237
+ * space: of the units whose rectangle, widened by `reach` on both sides, holds the point, the one
238
+ * nested deepest (a list item rather than its list, a paragraph rather than its section), and of
239
+ * those side by side the nearest. `skip(unit)`: a unit with no handle of its own (a section, a
240
+ * Sheet area), whose blocks still count.
241
+ */
242
+ export function hoverAt(tree, x, y, { reach = 150, skip = () => false } = {}) {
243
+ let best = null;
244
+ const visit = (box, depth) => {
245
+ for (const child of box.children) {
246
+ if (child.type === "box") {
247
+ visit(child, depth);
248
+ continue;
249
+ }
250
+ const { left, top, right, bottom } = child.rect;
251
+ const distance = Math.max(left - x, x - right, 0);
252
+ if (y >= top && y <= bottom && distance <= reach && !skip(child) && (!best || depth > best.depth || (depth === best.depth && distance < best.distance))) {
253
+ best = { unit: child, depth, distance };
254
+ }
255
+ // Looked into either way: what it holds may reach past it (a divider's band at its top).
256
+ for (const inner of child.children) visit(inner, depth + 1);
257
+ }
258
+ };
259
+ visit(tree, 0);
260
+ return best?.unit.el ?? null;
261
+ }
262
+
263
+ // The units a node holds, through its boxes; a skipped unit (one with no handle of its own: a row of
264
+ // columns, a column) is looked into.
265
+ function innerUnits(node, skip) {
266
+ const found = [];
267
+ const visit = (each) => {
268
+ for (const child of each.children) {
269
+ if (child.type === "box" || skip(child)) visit(child);
270
+ else found.push(child);
271
+ }
272
+ };
273
+ visit(node);
274
+ return found;
275
+ }
276
+
277
+ /**
278
+ * The block whose handle shows with the pointer at (x, y) (page coordinates) in a measured unit
279
+ * holding blocks (a list item and its lists, a quote, a disclosure): the handle follows the
280
+ * pointer's height, as Notion's and Feishu's do. The innermost block reaching that height; between
281
+ * blocks (their gaps), the nearest by height, then by width (blocks side by side). The unit's own
282
+ * head (a list item's own line, a title above what it holds) is one of them: there it is the unit
283
+ * itself. `skip(unit)`: a unit with no handle of its own, whose blocks count.
284
+ */
285
+ export function atHeight(node, x, y, { skip = () => false } = {}) {
286
+ const score = (rect) => gapScore(rect, x, y);
287
+ for (;;) {
288
+ const inner = innerUnits(node, skip).filter((unit) => unit.rect);
289
+ if (inner.length === 0) return node;
290
+ const first = Math.min(...inner.map((unit) => unit.rect.top));
291
+ const head = node.own ?? (first - node.rect.top >= 8 ? { ...node.rect, bottom: first } : null);
292
+ let best = head ? { unit: null, score: score(head) } : null;
293
+ for (const unit of inner) {
294
+ const each = score(unit.rect);
295
+ if (!best || each[0] < best.score[0] || (each[0] === best.score[0] && each[1] < best.score[1])) best = { unit, score: each };
296
+ }
297
+ if (!best.unit) return node;
298
+ node = best.unit;
299
+ }
300
+ }
301
+
302
+ /** The measured node of an element in a tree, or null. */
303
+ export function measuredNode(tree, el) {
304
+ if (tree.el === el && tree.type === "unit") return tree;
305
+ for (const child of tree.children) {
306
+ const found = measuredNode(child, el);
307
+ if (found) return found;
308
+ }
309
+ return null;
310
+ }
311
+
312
+ const meets = (a, b) => a.left <= b.right && a.right >= b.left && a.top <= b.bottom && a.bottom >= b.top;
313
+
314
+ /**
315
+ * The blocks a box selection over `rect` (page coordinates) takes, in document order: the units it
316
+ * touches that hold no other unit it touches, each lifted to the child of the innermost box around
317
+ * all of them. Two paragraphs of a section give those paragraphs; a paragraph of each of two
318
+ * sections gives both sections; blocks in two columns of a row give those blocks (a column is no
319
+ * block of its own); items of a list give the items, an item and the paragraph before
320
+ * the list give that paragraph and the list; an item holding lists whose own line it touches is
321
+ * taken whole (below that line, the nested items it touches). What lifts to something that is no unit (the report's
322
+ * header, around its lines) is left out.
323
+ */
324
+ export function pick(tree, rect) {
325
+ const hits = []; // [path from the tree down to the unit, the unit last]
326
+ // A box's lead (a highlight block's icon) is no block to pick (notion-lite's is none): it is the
327
+ // block's own, so a box touching only it, or only the block's padding, takes the whole highlight
328
+ // block, as a disclosure's title row takes the disclosure (notion-lite's box-select.js).
329
+ const visit = (node, path) => {
330
+ for (const child of node.children) {
331
+ const next = [...path, child];
332
+ if (child.type === "unit" && node.type === "box" && isLead(node.kind, child.kind)) continue;
333
+ if (child.type === "unit" && meets(child.rect, rect)) hits.push(next);
334
+ visit(child, next); // what it holds may reach past it (a divider's band at its top)
335
+ }
336
+ };
337
+ visit(tree, [tree]);
338
+ const outer = new Set(hits.flatMap((path) => path.slice(0, -1)));
339
+ // A list item whose own line it touches counts as one, the lists it holds with it.
340
+ const whole = (node) => node.type === "unit" && Boolean(node.own) && meets(node.own, rect);
341
+ const leaves = hits.filter((path) => (whole(path.at(-1)) || !outer.has(path.at(-1))) && !path.slice(0, -1).some(whole));
342
+ if (leaves.length === 0) return [];
343
+ // The innermost box on every leaf's path.
344
+ let common = 0;
345
+ while (leaves.every((path) => path.length > common + 1 && path[common + 1] === leaves[0][common + 1])) common++;
346
+ let level = common;
347
+ while (leaves[0][level].type !== "box") level--;
348
+ const picked = [];
349
+ for (const path of leaves) {
350
+ let lifted = path[level + 1];
351
+ // A column is no block of its own (as Feishu's): across columns, the blocks touched in each.
352
+ if (lifted.type === "unit" && !isBlock(lifted.kind)) lifted = path[level + 3];
353
+ if (lifted?.type === "unit" && !picked.includes(lifted)) picked.push(lifted);
354
+ }
355
+ return picked.map((unit) => unit.el);
356
+ }
357
+
358
+ /**
359
+ * A click on the empty space of `box` (measured) at height `y` (page coordinates): below its last
360
+ * block, a flow or the page takes a new paragraph at its end ({ box, after }: after its last
361
+ * block, or at its start); when the last block, followed down through the flows it holds (a
362
+ * section's, a panel's, a disclosure's), is an empty paragraph, the caret goes there instead
363
+ * ({ focus }), so clicking again does not pile them up. Anywhere else, null.
364
+ */
365
+ export function endOf(box, y) {
366
+ if (!FLOWS.has(box.role)) return null;
367
+ const last = box.children.at(-1) ?? null;
368
+ if (last && y <= last.rect.bottom) return null;
369
+ let deepest = last;
370
+ while (deepest?.type === "unit") {
371
+ const next = deepest.children.filter((inner) => FLOWS.has(inner.role)).at(-1)?.children.at(-1);
372
+ if (!next) break;
373
+ deepest = next;
374
+ }
375
+ if (deepest?.type === "unit" && deepest.empty) return { focus: deepest.el };
376
+ return { box: box.el, after: last?.el ?? null };
377
+ }
378
+
379
+ /**
380
+ * The innermost box of `box` (measured) reaching height `y` (page coordinates), `box` itself when
381
+ * none does: a Sheet's panel, a section, a disclosure's content, a list; of those side by side (the
382
+ * columns of a row) the nearest to `x`. What stands beside a click on the page's margin goes by it,
383
+ * as the margin is no box's but the page's.
384
+ */
385
+ export function innerBox(box, x, y) {
386
+ const inner = box.children.flatMap((child) => (child.type === "box" ? [child] : child.children)).filter(({ rect }) => y >= rect.top && y <= rect.bottom);
387
+ if (inner.length === 0) return box;
388
+ const gap = ({ rect }) => gapScore(rect, x, y)[1];
389
+ return innerBox(inner.reduce((a, b) => (gap(b) < gap(a) ? b : a)), x, y);
390
+ }
391
+
392
+ /**
393
+ * How far a rectangle is from the point (x, y): [the gap by height, the gap by width], 0 where the
394
+ * point is within it. The nearest block to a point goes by it, height first (then width: blocks
395
+ * side by side); how a tie goes is each caller's.
396
+ */
397
+ export const gapScore = (rect, x, y) => [
398
+ y < rect.top ? rect.top - y : y > rect.bottom ? y - rect.bottom : 0,
399
+ x < rect.left ? rect.left - x : x > rect.right ? x - rect.right : 0,
400
+ ];
@@ -0,0 +1,45 @@
1
+ // How a press gesture ends besides the pointer coming up (docs/editor.md, "Overlays"): resizing a
2
+ // card, dragging a gap between columns, drawing a box selection and selecting text across blocks
3
+ // all end the same ways, written once here. Each keeps its own state machine and what it does on
4
+ // letting go; only the ways of giving up are shared, and every one of them is idempotent.
5
+
6
+ /**
7
+ * The CSS that locks the page while a gesture is under way, the tool having set `attribute` (a
8
+ * name, or name="value") on the document element: the cursor it asks for (`cursor`) shows wherever
9
+ * the pointer goes, and, with `select`, nothing gets selected. The one place the editor's gesture
10
+ * styles are !important, and they must be: the elements under a pointer that a gesture holds (the
11
+ * tool captures it on the document element) have rules of their own for the cursor (a grip's grab,
12
+ * a table's resize bar) and for selecting, more specific than any rule about "everything while
13
+ * this happens".
14
+ */
15
+ export function gestureLock(attribute, { cursor = null, select = false } = {}) {
16
+ const on = `html[${attribute}]`;
17
+ return `${on}, ${on} * { ${cursor ? `cursor: ${cursor} !important; ` : ""}${select ? "-webkit-user-select: none !important; user-select: none !important; " : ""}}`;
18
+ }
19
+
20
+ /**
21
+ * The gesture is over, cancelled (what it took is let go, nothing is written), when the browser
22
+ * cancels the pointer (a touch it took), the capture is lost any other way (after pointerup the
23
+ * gesture is over already), the window loses the focus, or the page is hidden. `active()`: whether
24
+ * the gesture is under way; `cancel()`: give it up. `owns(event)`: whether a lost capture is the
25
+ * gesture's, by default the document element's, where the tools hold the pointer.
26
+ */
27
+ export function endsGesture({ active, cancel, owns = (event) => event.target === document.documentElement }) {
28
+ addEventListener("pointercancel", () => { if (active()) cancel(); }, true);
29
+ document.documentElement.addEventListener("lostpointercapture", (event) => { if (active() && owns(event)) cancel(); });
30
+ addEventListener("blur", () => { if (active()) cancel(); });
31
+ document.addEventListener("visibilitychange", () => { if (document.hidden && active()) cancel(); });
32
+ }
33
+
34
+ /**
35
+ * Esc while the gesture is under way gives it up, and nothing else sees the key (`cancel` may say
36
+ * so on the status line).
37
+ */
38
+ export function cancelOnEscape({ active, cancel }) {
39
+ addEventListener("keydown", (event) => {
40
+ if (event.key !== "Escape" || !active()) return;
41
+ event.preventDefault();
42
+ event.stopPropagation();
43
+ cancel();
44
+ }, true);
45
+ }