@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,48 @@
1
+ import { t } from "../../shared/i18n/index.mjs";
2
+
3
+ // What 减少通知 leaves out (the workbench's 设置: shared/preferences.mjs quietNotices; notices.mjs
4
+ // say() asks routine() of every notice but an error): the notices of the everyday operations, which
5
+ // users of Notion and Feishu know and notion-lite says nothing of (its snackbar speaks only of a
6
+ // copy to the clipboard, a failure, an upload, an import or an export):
7
+ // - what was just done, which the page shows: moved, deleted, pasted, turned into, inserted,
8
+ // formatted, resized, colored, indented, folded… (every notice that offers Ctrl+Z is one);
9
+ // - how to go on: a selection's keys, a drag's, the format the next letters take;
10
+ // - a copy made with Ctrl+C, a save asked for with Ctrl+S (the page saves by itself), a drag or
11
+ // a resize cancelled or ending where it began, and a key that had nothing to do (Tab on a list's
12
+ // first item, Shift+Tab on its outermost, a block moved past the end of its row).
13
+ // What still shows is what the reader must act on or would not know otherwise: errors, a save that
14
+ // failed or is held, conflicts, text that could not be put back, something refused with the reason
15
+ // ("这里不能粘贴块。"), what an action did that the page does not show (a link copied from a menu, a
16
+ // web page that refused a frame shown as a bookmark, lines pasted into one, a detail card no longer
17
+ // kept, a page whose preview could not be read) and the result of a long one (an export done).
18
+ // Each is matched in the UI's language, its {0}… standing for anything.
19
+
20
+ // Notices that offer Ctrl+Z but say what the page does not show: they still show.
21
+ const TOLD = () => [
22
+ t("入口已移除:页面上没有地方能打开这张详情卡片了 · Ctrl+Z 撤销"),
23
+ `${t("暂不支持获取该网站的预览信息")}{0}`, // links/views.mjs UNREAD: the title or icon of a link left as its address
24
+ ];
25
+
26
+ const ROUTINE = () => [
27
+ t("{0} · Ctrl+Z 撤销"), // whatever was just done
28
+ t("已新建分区 · 标题、分割线都可以按需加"),
29
+ t("已复制 {0} · 在要放的块里按 Ctrl+V 粘贴到它后面"), t("已复制 {0} 格"),
30
+ t("已保存。"), t("{0}。", t("标题已更新")),
31
+ t("已取消调整。"), t("已取消移动。"), t("位置没有变化。"),
32
+ t("已选中 {0} 块 · Delete 删除 · 拖动手柄一起移动 · Esc 取消"), t("已选中{0} · Delete 删除{1} · Esc 取消"),
33
+ t("已选中{0} · Delete 删除 · Esc 取消{1}"), t("已选中这一块的文字 · 再按 {0} 选中{1}"), t("已选中这一块的文字"), // Ctrl+A (select-all/)
34
+ t("正在移动{0} · 拖到要放的位置后松开 · 停在选项卡上切换,停在折叠块标题上展开 · Esc 取消"),
35
+ t("接着打的字:{0} · 再按一次取消"), t("接着打的字照旧"),
36
+ t("链接:{0}"), t("链接已移除。"),
37
+ t("这一项上面没有同级的项,不能再缩进。"), t("这一项已经在最外层。"), t("选中的项上面没有同级的项,不能再缩进。"), t("选中的项已经在最外层。"),
38
+ t("{0}已经在{1}。"), t("这里只有{0};可以拖动手柄移到别处。"),
39
+ ];
40
+
41
+ const patternOf = (said) => new RegExp(`^${said.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\\\{\d+\\\}/g, "[\\s\\S]*?")}$`);
42
+ let patterns = null;
43
+
44
+ /** Whether `text` (in the UI's language) is a routine notice, one 减少通知 leaves out. */
45
+ export function routine(text) {
46
+ patterns ??= { told: TOLD().map(patternOf), routine: ROUTINE().map(patternOf) };
47
+ return !patterns.told.some((pattern) => pattern.test(text)) && patterns.routine.some((pattern) => pattern.test(text));
48
+ }
@@ -0,0 +1,327 @@
1
+ import { Z } from "../../../shared/layers.mjs";
2
+ import { SPAN } from "../../../shared/media.mjs";
3
+ import { CENTERED } from "../../components/figure/index.mjs";
4
+ import { RESIZABLE, RESIZABLE_AT, SIZES } from "../../components/registry.mjs";
5
+ import { scrollHeight } from "../../components/table/index.mjs";
6
+ import { cancelOnEscape, endsGesture, gestureLock } from "../gesture.mjs";
7
+ import { kept } from "../kept.mjs";
8
+ import { note, own } from "../overlays.mjs";
9
+ import { addStyle, element, mount } from "../ui.mjs";
10
+ import { t } from "../../../shared/i18n/index.mjs";
11
+
12
+ // Resizing chart cards and tables in the preview ("Sizes" in the kit's styles/sizes.css). With the pointer on the
13
+ // right edge of a card or table, or on its bottom edge (a chart's plot height, a table's scroll
14
+ // height), the cursor changes; dragging shows a blue line where the edge goes and the size that
15
+ // makes, and letting go applies it as one undo step (Esc cancels). Widths are shares of the width
16
+ // the block stands in: the reading width, or its column's. A card's width snaps to the middle and
17
+ // to the end; a centered card grows on both sides. A table's
18
+ // width moves its own right end by as much as the pointer moves, also when the table is wider than
19
+ // its frame and scrolls in it; it snaps to the width it stands in, and past it the table is wider than
20
+ // the text and scrolls sideways in its frame, which stays at that width. (The columns of a row
21
+ // are resized by the gaps between them: columns/.)
22
+ // A table of a dozen rows or fewer has no bottom edge to drag. A code block's bottom edge sets the
23
+ // height of its frame: shorter than its code, the code scrolls inside it, and the edge snaps to the
24
+ // height that shows all of it (no height of its own). Letting go where the drag started changes
25
+ // nothing. Anything that ends the press another way (the capture lost, the window losing the
26
+ // focus, the page hidden) cancels it; the lines and the label belong to the drag (overlays.mjs). A
27
+ // code block's bottom edge has no label: the line alone (where it snaps, the status line says after).
28
+
29
+ const STYLE = `
30
+ ${gestureLock("data-ge-resize=\"x\"", { cursor: "ew-resize" })}
31
+ ${gestureLock("data-ge-resize=\"y\"", { cursor: "ns-resize" })}
32
+ .ge-resize-line { position: fixed; left: 0; top: 0; z-index: ${Z.guide}; border-radius: 2px; background: rgb(151 197 241); pointer-events: none; }
33
+ .ge-resize-label { position: fixed; left: 0; top: 0; z-index: ${Z.label}; padding: 2px 7px; border-radius: 5px; background: var(--doc-accent, #2678d8); color: #fff; font: 12px/18px var(--doc-font, system-ui, sans-serif); white-space: nowrap; pointer-events: none; }
34
+ `;
35
+ const GRAB = { inside: 3, outside: 8 }; // how near an edge the pointer takes it, inside and outside the block (px)
36
+ const SNAP = 14; // px
37
+ const MIN_WIDTH = 160; // px: the least a card's edge is dragged to (a table's is its columns' floors)
38
+ // The sizes (name and range) are each component's description's (registry SIZES): the same ones the
39
+ // server checks a size by.
40
+ const range = (kind, name) => SIZES[kind][name];
41
+ // The size a kind's bottom edge sets (`height` among its sizes), and that size's least: a code block's
42
+ // frame is about a line and a half.
43
+ const heightOf = (kind) => Object.keys(SIZES[kind]).find((name) => SIZES[kind][name].height);
44
+ const heightRange = (kind) => range(kind, heightOf(kind));
45
+
46
+ /**
47
+ * units: Map(id -> { kind }) from the edit map. active(): whether resizing may start.
48
+ * look(element, { sizes }, select): the editor's undoable change of sizes. say(text): the status line.
49
+ * owns(node): whether a table's right and bottom edges are the table tools' (table/widths.mjs: a
50
+ * click arms one, a drag then is this tool's, `startTable`).
51
+ */
52
+ export function createResize({ units, active, look, say, owns = () => false }) {
53
+ addStyle(STYLE);
54
+ let hover = null; // { node, axis } under the pointer
55
+ let drag = null;
56
+
57
+ // Blocks made or converted on the page carry their kind (a code block made from a paragraph).
58
+ const kindOf = (node) => node.getAttribute("data-ge-unit-kind") ?? units.get(Number(node.getAttribute("data-ge-unit")))?.kind;
59
+ const codeOf = (node) => node.querySelector(":scope > pre");
60
+ // A card's chart: the svg its host holds, straight in it or beside controls of its own (a part).
61
+ const plot = (node) => node.querySelector(".doc-chart > svg") ?? node.querySelector(".doc-chart svg");
62
+ const sizeOf = (node, name) => node.style.getPropertyValue(name).trim() || null;
63
+ // The page's gutter in full width (--doc-wide-gutter) while editing: the room the handle takes
64
+ // beside the blocks (--ge-edge-room, handle/; the tool works only while editing).
65
+ const gutter = () => parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--ge-edge-room")) || 0;
66
+ const SHORT = 12; // a table with this many rows or fewer shows them all: no height to set
67
+
68
+ // The blocks that may resize (`resizable`) of the open modal dialog if there is one, else of the page: kept
69
+ // between moves (kept.mjs), as looking them up and measuring each on every move cost up to 1.8ms a
70
+ // move on a long report.
71
+ const blocks = kept(() => {
72
+ const scope = document.querySelector("dialog[open]") ?? document.querySelector("main");
73
+ return [...(scope?.querySelectorAll(RESIZABLE_AT) ?? [])];
74
+ });
75
+ // One of them the reader can reach now: visible, of a kind that resizes, not folded or inert.
76
+ const reachable = (node) => RESIZABLE.has(kindOf(node)) && node.getClientRects().length > 0 && !node.closest("[inert]") && !node.matches(".doc-code--folded");
77
+
78
+ // Which edge of which block the pointer is on: the right one of a card or table, or the bottom
79
+ // one of a table, a card with a chart or a code block that is (or may be) shorter than its code.
80
+ // Only a block whose edges the pointer is within the grab of is looked at any further.
81
+ function edgeAt(x, y) {
82
+ for (const node of blocks()) {
83
+ const rect = node.getBoundingClientRect();
84
+ const near = x >= Math.min(rect.left, rect.right - GRAB.inside) && x <= rect.right + GRAB.outside && y >= Math.min(rect.top, rect.bottom - GRAB.inside) && y <= rect.bottom + GRAB.outside;
85
+ if (!near || !reachable(node)) continue;
86
+ const kind = kindOf(node);
87
+ if (kind !== "code" && !(kind === "table" && owns(node)) && y >= rect.top && y <= rect.bottom && x >= rect.right - GRAB.inside && x <= rect.right + GRAB.outside) return { node, axis: "x" };
88
+ if (!(x >= rect.left && x <= rect.right && y >= rect.bottom - GRAB.inside && y <= rect.bottom + GRAB.outside)) continue;
89
+ const code = kind === "code" ? codeOf(node) : null;
90
+ const tall = kind === "table" ? !owns(node) && node.querySelectorAll(":scope > table > tbody > tr").length > SHORT
91
+ : kind === "code" ? Boolean(code) && (code.scrollHeight > heightRange(kind).min * 2 || sizeOf(node, heightOf(kind)) !== null) : plot(node);
92
+ if (tall) return { node, axis: "y" };
93
+ }
94
+ return null;
95
+ }
96
+
97
+ function setHover(next) {
98
+ hover = next;
99
+ const axis = next?.axis ?? null;
100
+ if (document.documentElement.getAttribute("data-ge-resize") === axis) return; // the same on every move along an edge
101
+ if (axis) document.documentElement.setAttribute("data-ge-resize", axis);
102
+ else document.documentElement.removeAttribute("data-ge-resize");
103
+ }
104
+
105
+ function contentBox(container) {
106
+ const rect = container.getBoundingClientRect();
107
+ const style = getComputedStyle(container);
108
+ const left = rect.left + parseFloat(style.borderLeftWidth) + parseFloat(style.paddingLeft);
109
+ const right = rect.right - parseFloat(style.borderRightWidth) - parseFloat(style.paddingRight);
110
+ return { left, right, width: right - left };
111
+ }
112
+
113
+ // ---------- widths ----------
114
+
115
+ // The share of the width it stands in a right edge at x gives; a centered card's is twice its half.
116
+ function shareAt(x) {
117
+ const { rect, box, centered } = drag;
118
+ if (centered) return (2 * (x - (box.left + box.right) / 2)) / box.width;
119
+ return (x - rect.left) / box.width;
120
+ }
121
+
122
+ // A table's width goes by how far the pointer moved: the table's own right
123
+ // end moves that much, also when the table is wider than its frame and scrolls in it (its end
124
+ // then lies past the frame's edge, or at it when scrolled to the end). It snaps back where it
125
+ // started and to the reading width; past that it is wider than the text, as far as the window goes.
126
+ // A table narrower than the text never scrolls: it goes no narrower than its columns' readable
127
+ // floors (tables.js leaves them on the wrapper).
128
+ function tableWidthAt(x) {
129
+ const { box, table } = drag;
130
+ const far = Math.max(box.right, document.documentElement.clientWidth - gutter());
131
+ const width = (at) => table.width + (at - table.press);
132
+ const narrowest = table.press - (table.width - Math.max(MIN_WIDTH, table.floor));
133
+ let edge = Math.min(Math.max(x, narrowest), far);
134
+ const snaps = [{ x: table.press, label: t("原宽度"), keep: true }, { x: table.press + (box.width - table.width), label: t("铺满正文") }];
135
+ const snap = snaps.find((candidate) => Math.abs(candidate.x - edge) <= SNAP);
136
+ if (snap) edge = snap.x;
137
+ if (snap?.keep) return { edge, label: snap.label, value: drag.before };
138
+ // Rounded up, so the frame is never narrower than where it was let go (at the floors, say).
139
+ const share = Math.ceil(Math.max(range("table", SPAN).min, width(edge) / box.width) * 1000) / 1000;
140
+ const label = snap?.label ?? (share > 1 ? t("超宽表 · 表宽 {0}px,横向滚动", Math.round(width(edge)))
141
+ : edge <= narrowest + 0.5 ? t("最窄 · {0}%", Math.round(share * 100)) : `${Math.round(share * 100)}%`);
142
+ return { edge, label, value: Math.abs(share - 1) < 0.005 ? "1" : String(Math.min(share, range("table", SPAN).max)) };
143
+ }
144
+
145
+ // Where the edge may go and where it snaps: back where it started (no change), the middle (a
146
+ // card), the end of the line or the reading width.
147
+ function widthAt(x) {
148
+ const { node, kind, rect, box, centered } = drag;
149
+ if (kind === "table") return tableWidthAt(x);
150
+ const center = (box.left + box.right) / 2;
151
+ const far = box.right;
152
+ const near = centered ? center + MIN_WIDTH / 2 : rect.left + MIN_WIDTH;
153
+ const fromStart = Math.abs(rect.left - box.left) < 2;
154
+ const snaps = [{ x: rect.right, label: t("原宽度"), keep: true }];
155
+ const middle = centered ? center + box.width / 4 : box.left + box.width / 2;
156
+ if (kind === "figure" && middle > near) snaps.push({ x: middle, label: centered ? t("半宽 · 居中") : fromStart ? t("半宽") : t("到中线") });
157
+ snaps.push({ x: box.right, label: fromStart || centered ? t("全宽") : t("占满本行") });
158
+ let edge = Math.min(Math.max(x, near), far);
159
+ const snap = snaps.find((candidate) => Math.abs(candidate.x - edge) <= SNAP);
160
+ if (snap) edge = snap.x;
161
+ if (snap?.keep) return { edge, label: snap.label, value: drag.before };
162
+ const share = Math.round(Math.max(range(kind, SPAN).min, shareAt(edge)) * 1000) / 1000;
163
+ const whole = Math.abs(share - 1) < 0.005;
164
+ const label = snap?.label ?? `${Math.round(share * 100)}%${centered ? t(" · 居中") : ""}`;
165
+ // A card at the whole width is the default.
166
+ const value = whole ? (kind === "figure" && !centered ? null : "1") : String(Math.min(share, range(kind, SPAN).max));
167
+ return { edge, label, value };
168
+ }
169
+
170
+ // ---------- heights ----------
171
+
172
+ // The plot's height as drawn: at least 280px wide, scaled down in a narrower card, so the
173
+ // height set is the viewBox's, not the one shown.
174
+ const drawnHeight = (svg) => svg.viewBox?.baseVal?.height || svg.getBoundingClientRect().height;
175
+
176
+ // A chart card: the plot's height, never below what the chart needs; back where it started
177
+ // changes nothing. A table: its scroll area,
178
+ // at most all its rows. A code block: its frame (a code card's header aside), at most its whole
179
+ // code, which it snaps to.
180
+ function heightAt(y) {
181
+ const { node, kind, rect, before } = drag;
182
+ if (kind === "code") {
183
+ const code = codeOf(node);
184
+ const header = rect.height - code.getBoundingClientRect().height;
185
+ const whole = rect.height + (code.scrollHeight - code.clientHeight); // all its lines, no scrolling
186
+ const height = Math.min(Math.max(y - rect.top, Math.min(whole, header + heightRange(kind).min)), whole);
187
+ if (before !== null && Math.abs(rect.top + height - rect.bottom) <= SNAP / 2) return { edge: rect.bottom, label: t("原高度"), value: before };
188
+ if (whole - height <= SNAP) return { edge: rect.top + whole, label: t("显示全部代码"), value: null };
189
+ const frame = Math.round(height - header);
190
+ return { edge: rect.top + header + frame, label: t("高 {0}px · 其余滚动查看", frame), value: `${frame}px` };
191
+ }
192
+ if (kind === "figure") {
193
+ const svg = plot(node);
194
+ const drawn = drawnHeight(svg);
195
+ const scale = svg.getBoundingClientRect().height / drawn || 1;
196
+ const floor = 160; // the least a chart is drawn at (a softer floor than the one a size is checked by)
197
+ if (Math.abs(rect.bottom - y) <= SNAP) return { edge: rect.bottom, label: t("原高度"), value: before };
198
+ // Level with a card beside it (in another column of its row): the bottoms meet.
199
+ const beside = drag.beside.find((bottom) => Math.abs(bottom - y) <= SNAP);
200
+ const height = Math.round(Math.min(Math.max(drawn + ((beside ?? y) - rect.bottom) / scale, floor), heightRange(kind).max));
201
+ const edge = rect.bottom + (height - drawn) * scale;
202
+ return { edge, label: beside !== undefined && Math.abs(edge - beside) < 1.5 ? t("与旁边对齐 · 图表高 {0}px", height) : t("图表高 {0}px", height), value: `${height}px` };
203
+ }
204
+ const all = node.scrollHeight + (node.offsetHeight - node.clientHeight);
205
+ let height = Math.min(Math.max(y - rect.top, heightRange(kind).min), all);
206
+ if (Math.abs(rect.top + height - rect.bottom) <= SNAP / 2) return { edge: rect.bottom, label: t("原高度"), value: drag.before };
207
+ if (height >= all - 2) {
208
+ const fits = all <= scrollHeight(node); // the default scroll area shows them all
209
+ return { edge: rect.top + all, label: t("显示全部行"), value: fits ? null : "none" };
210
+ }
211
+ height = Math.round(height);
212
+ return { edge: rect.top + height, label: t("高 {0}px", height), value: `${height}px` };
213
+ }
214
+
215
+ // The bottoms of the cards standing beside a card: alone in another column of its row of columns.
216
+ function besideBottoms(node) {
217
+ const column = node.parentElement;
218
+ const row = column?.classList.contains("doc-column") ? column.parentElement : null;
219
+ if (!row?.classList.contains("doc-columns")) return [];
220
+ return [...row.children].filter((other) => other !== column && other.classList.contains("doc-column"))
221
+ .flatMap((other) => [...other.children].filter((card) => card.matches("figure.doc-figure") && card.getClientRects().length > 0))
222
+ .map((card) => card.getBoundingClientRect().bottom);
223
+ }
224
+
225
+ // ---------- dragging ----------
226
+
227
+ function start(event, { node, axis }) {
228
+ const kind = kindOf(node);
229
+ const name = axis === "x" ? SPAN : heightOf(kind);
230
+ const before = sizeOf(node, name);
231
+ const rect = node.getBoundingClientRect();
232
+ drag = {
233
+ node, axis, kind, name, before, rect,
234
+ box: contentBox(node.parentElement),
235
+ // A card's height snaps level with the cards beside it: the bottoms of those in the other columns of its row.
236
+ beside: axis === "y" && kind === "figure" ? besideBottoms(node) : [],
237
+ centered: axis === "x" && kind === "figure" && node.classList.contains(CENTERED),
238
+ // A table's whole width (past its frame when it scrolls sideways), where the press was, and
239
+ // whether it is scrolled to its end.
240
+ table: axis === "x" && kind === "table" ? {
241
+ width: Math.max(rect.width, node.scrollWidth + (node.offsetWidth - node.clientWidth)),
242
+ floor: Number(node.dataset.docMinWidth) || 0,
243
+ press: event.clientX,
244
+ atEnd: node.scrollLeft + node.clientWidth >= node.scrollWidth - 2,
245
+ } : null,
246
+ label: kind === "code" ? null : element("div", { class: "ge-resize-label" }),
247
+ result: null,
248
+ };
249
+ const session = drag;
250
+ session.lines = (session.centered ? [0, 1] : [0]).map(() => element("div", { class: "ge-resize-line" }));
251
+ for (const part of [session.label, ...session.lines].filter(Boolean)) mount(own(part, "resize", { owner: node, alive: () => drag === session }));
252
+ note("resize", `start ${axis}`);
253
+ document.documentElement.setPointerCapture?.(event.pointerId);
254
+ update(event.clientX, event.clientY);
255
+ }
256
+
257
+ function update(x, y) {
258
+ const { axis, rect, box, lines, label } = drag;
259
+ drag.result = axis === "x" ? widthAt(x) : heightAt(y);
260
+ const { edge } = drag.result;
261
+ if (axis === "x") {
262
+ const mirror = 2 * ((box.left + box.right) / 2) - edge;
263
+ lines.forEach((line, index) => Object.assign(line.style, {
264
+ width: "2px", height: `${Math.round(rect.height)}px`,
265
+ transform: `translate(${Math.round((index ? mirror : edge) - 1)}px, ${Math.round(rect.top)}px)`,
266
+ }));
267
+ if (label) label.style.transform = `translate(${Math.round(Math.min(edge + 10, innerWidth - label.offsetWidth - 8))}px, ${Math.round(Math.max(8, y - 30))}px)`;
268
+ } else {
269
+ Object.assign(lines[0].style, { width: `${Math.round(rect.width)}px`, height: "2px", transform: `translate(${Math.round(rect.left)}px, ${Math.round(edge - 1)}px)` });
270
+ if (label) label.style.transform = `translate(${Math.round(Math.min(x + 12, innerWidth - label.offsetWidth - 8))}px, ${Math.round(Math.min(edge + 8, innerHeight - 28))}px)`;
271
+ }
272
+ if (label) label.textContent = drag.result.label;
273
+ }
274
+
275
+ function finish(commit) {
276
+ if (!drag) return;
277
+ const { node, axis, kind, name, before, lines, label, result, table } = drag;
278
+ note("resize", commit ? "released" : "cancelled");
279
+ drag = null;
280
+ lines.forEach((line) => line.remove());
281
+ label?.remove();
282
+ setHover(null);
283
+ if (commit && result && look(node, { sizes: { [name]: result.value } }, null)) {
284
+ say(t("已调整{0}{1}:{2} · Ctrl+Z 撤销", kind === "figure" ? t("卡片") : kind === "code" ? t("代码块") : t("表格"), axis === "x" ? t("宽度") : t("高度"), result.label));
285
+ // Scrolled to its end, a table stays so: its new end shows at the frame's edge, ready for the
286
+ // next drag (after tables.js has laid it out again, on the next frame).
287
+ if (table?.atEnd) requestAnimationFrame(() => requestAnimationFrame(() => { node.scrollLeft = node.scrollWidth; }));
288
+ }
289
+ }
290
+
291
+ // ---------- events ----------
292
+
293
+ document.addEventListener("pointermove", (event) => {
294
+ if (drag) return update(event.clientX, event.clientY);
295
+ const busy = !active() || event.buttons || document.documentElement.hasAttribute("data-ge-drag") || event.target?.closest?.("[data-doc-dev]");
296
+ setHover(busy ? null : edgeAt(event.clientX, event.clientY));
297
+ }, { passive: true, capture: true });
298
+ document.addEventListener("pointerdown", (event) => {
299
+ if (drag || event.button !== 0 || !active() || event.target?.closest?.("[data-doc-dev]")) return;
300
+ const at = edgeAt(event.clientX, event.clientY);
301
+ if (!at) return;
302
+ event.preventDefault(); // no caret, no text selection
303
+ event.stopImmediatePropagation(); // nor the editor's reaction to a press on the page
304
+ start(event, at);
305
+ }, true);
306
+ document.addEventListener("pointerup", () => { if (drag) finish(true); }, true);
307
+ // After pointerup the drag is over already; any other way it ends, it is cancelled (gesture.mjs).
308
+ endsGesture({ active: () => Boolean(drag), cancel: () => finish(false) });
309
+ cancelOnEscape({ active: () => Boolean(drag), cancel: () => { finish(false); say(t("已取消调整。")); } });
310
+
311
+ return {
312
+ /** A table's width ("x", from its right edge) or scroll height ("y", from its bottom edge) dragged, the press `event` on it (the table tools' armed edge). */
313
+ startTable(event, node, axis = "x") {
314
+ if (drag || !active()) return false;
315
+ setHover({ node, axis });
316
+ start(event, { node, axis });
317
+ return true;
318
+ },
319
+ /** Stop any resizing. */
320
+ hide() {
321
+ if (drag) finish(false);
322
+ setHover(null);
323
+ },
324
+ /** The editor's UI nodes to keep in the top layer when a modal dialog opens. */
325
+ get nodes() { return drag ? [...drag.lines, drag.label].filter(Boolean) : []; },
326
+ };
327
+ }
@@ -0,0 +1,262 @@
1
+ import { BOXED, BOX_NAMES, KIND_NAMES, isLead, selectAllOf } from "../../components/registry.mjs";
2
+ import { UNIT, boxKind, textEnd, unitElement, unitsOf } from "../core.mjs";
3
+ import { editable, select } from "../caret.mjs";
4
+ import { ZWSP } from "../../../shared/inline-spacing.mjs";
5
+ import { t } from "../../../shared/i18n/index.mjs";
6
+ import { shortcut } from "../tooltip.mjs";
7
+
8
+ // Ctrl+A (⌘A) widening step by step (docs/editor.md, "Selecting all"). notion-lite's rule (its
9
+ // editor/input/keys/text-keys.js and block-keys.js): the first press in a text block selects that
10
+ // block's text, a press when it is all selected (or empty) selects the page's blocks, and with
11
+ // blocks selected a press selects the page's. The user's (2026-10-23) puts the containers between,
12
+ // one level a press:
13
+ //
14
+ // 1. the text block's own text (a list item's words, not the blocks it holds; a code block's code;
15
+ // a cell's text; the title's), the browser's selection, so the format bar shows for it;
16
+ // 2. everything in the container block it stands in, as blocks are selected (a box selection's
17
+ // fills): a highlight block's blocks (not its icon, the box's lead, which notion-lite's callout
18
+ // has no block for), a disclosure's content (not its title, the disclosure's own text, as
19
+ // notion-lite selects a toggle's children without it), a quote's paragraphs, a column's blocks,
20
+ // the blocks of the tab shown, a detail card's content, the blocks a list item holds under its
21
+ // text (notion-lite's children of a list item, its own words not among them);
22
+ // 3. the next container up, the one just selected whole among its blocks, and so on; a row of
23
+ // columns, a Sheet area and a table are a step of their own, the block whole (all of its
24
+ // columns, all of its tabs, all of its cells), above a column, a tab's panel and a cell;
25
+ // 4. the page: every block of it (the header's lines and the page's blocks; not its title or its
26
+ // icon, the page's own and no blocks, as in Notion). In an open detail card its content is the
27
+ // top: the page behind it is not the card's (of two open, the one the press is in: openCard).
28
+ //
29
+ // Not containers: sections (the user's: 分区的不用管; a section's blocks are the page's), lists (an
30
+ // item is a block of the flow it stands in, as Notion has no list block), the plain divs that group
31
+ // blocks, the header and a Sheet's tab row. A press that would select what is selected already goes
32
+ // on to the next step, so each press selects more (the top never, after a text block's text: the
33
+ // block selected is more than its text, a page of one paragraph too); at the top it does nothing. A selection of blocks
34
+ // (a box selection, a handle's) goes on from its blocks, a selection across blocks (text-select/)
35
+ // from the blocks it touches (to the first container holding them all, its text being only a part),
36
+ // selected cells (table/) from their table. A field of the page's own UI (the link card, the formula
37
+ // editor, a menu's search, a tab being renamed) keeps the browser's Ctrl+A.
38
+
39
+ const TEXT = "[data-ge-block], [data-ge-new][contenteditable='true']";
40
+
41
+ const kindOf = (node) => node.getAttribute("data-ge-unit-kind");
42
+ // A block of blocks with a box of its own around them (a highlight block; not a group, a plain div).
43
+ const drawsBox = (node) => node.hasAttribute("data-ge-box") && BOXED.has(kindOf(node)) && boxKind(node) !== "plain";
44
+
45
+ // On a Mac ⌘A (Ctrl+A is the line's start there, as in every text field), elsewhere Ctrl+A: notion-lite's isSelectAllKey.
46
+ const MAC = /Mac|iPhone|iPad/.test(globalThis.navigator?.platform ?? "");
47
+
48
+ /** Ctrl+A (⌘A on a Mac), no Shift or Alt. */
49
+ export const isSelectAllKey = (event) => (MAC ? event.metaKey : event.ctrlKey) && !event.shiftKey && !event.altKey && event.key?.toLowerCase() === "a";
50
+
51
+ /** The blocks a box holds as its own: its units without its lead (a highlight block's icon). */
52
+ export const heldUnits = (box) => unitsOf(box).filter((unit) => !isLead(boxKind(box), kindOf(unit)));
53
+
54
+ // What each step selects, in the reader's words: those of the box (`selectAll`), else its name's.
55
+ function contentLabel(kind) {
56
+ const own = selectAllOf(kind).content;
57
+ return own === true ? t("{0}里的全部内容", BOX_NAMES[kind]) : own;
58
+ }
59
+ const wholeLabel = (unit) => t("整个{0}", KIND_NAMES[kindOf(unit)] ?? t("整体块"));
60
+
61
+ /**
62
+ * What a selection of `units` reaches, to tell whether a step selects more: its text blocks, the
63
+ * blocks in it that hold none (a picture, a divider, a highlight block's icon), and a block of
64
+ * blocks drawing a box of its own (a highlight block: selected whole it is more than its blocks). A
65
+ * list and its items, a quote and its paragraphs reach the same; a list item whole reaches its own
66
+ * text besides the blocks it holds.
67
+ */
68
+ export function coverage(units) {
69
+ const reached = new Set();
70
+ for (const unit of units) {
71
+ for (const node of [unit, ...unit.querySelectorAll(`${TEXT}, ${UNIT}`)]) {
72
+ if (node.matches(TEXT) || !node.querySelector(TEXT) || drawsBox(node)) reached.add(node);
73
+ }
74
+ }
75
+ return reached;
76
+ }
77
+
78
+ /** The innermost element around all of `nodes` (none being another's): the parent of one. */
79
+ export function around(nodes) {
80
+ let at = nodes[0]?.parentElement ?? null;
81
+ while (at && !nodes.every((node) => node !== at && at.contains(node))) at = at.parentElement;
82
+ return at;
83
+ }
84
+
85
+ /**
86
+ * The open detail card a press is in: the one `from` stands in (the block or text block it goes on
87
+ * from; outside them all, none: the page), else the one holding the focus, else the one drawn over
88
+ * the others at its middle (a card opened from another's covers it; with no layout, the last). null: none.
89
+ */
90
+ export function openCard(doc, from = null) {
91
+ if (from) return from.closest?.("dialog[open]") ?? null;
92
+ const focused = doc.activeElement?.closest?.("dialog[open]");
93
+ if (focused) return focused;
94
+ const open = [...doc.querySelectorAll("dialog[open]")];
95
+ const drawn = open.filter((dialog) => {
96
+ const box = dialog.getBoundingClientRect();
97
+ const hit = box.width > 0 ? doc.elementFromPoint?.(box.left + box.width / 2, box.top + box.height / 2) : null;
98
+ return Boolean(hit && dialog.contains(hit));
99
+ });
100
+ return drawn.at(-1) ?? open.at(-1) ?? null;
101
+ }
102
+
103
+ /**
104
+ * The top: the content of the detail card open where the press is (openCard: `from`, the node it
105
+ * goes on from, else the focus), else the page (the header's lines and the page's blocks). { units, label, top }.
106
+ */
107
+ export function topStep(doc, from = null) {
108
+ const card = openCard(doc, from)?.querySelector('[data-ge-box-kind="dialog"]');
109
+ if (card) return { units: heldUnits(card), label: contentLabel("dialog"), top: true };
110
+ const main = doc.querySelector('main[data-ge-box-kind="main"]') ?? doc.querySelector("main");
111
+ if (!main) return { units: [], label: t("整个页面"), top: true };
112
+ const header = [...main.children].find((child) => boxKind(child) === "header");
113
+ const lines = header ? unitsOf(header).filter((unit) => kindOf(unit) !== "icon") : [];
114
+ return { units: [...lines, ...heldUnits(main)], label: t("整个页面"), top: true };
115
+ }
116
+
117
+ /**
118
+ * The steps above `start` (an element: the box or block the selection stands in), innermost
119
+ * first, the top last: [{ units, label, top? }]. A detail card's content is the last.
120
+ */
121
+ export function stepsAbove(start) {
122
+ const steps = [];
123
+ for (let at = start; at; at = at.parentElement) {
124
+ const kind = at.hasAttribute?.("data-ge-box") ? boxKind(at) : null;
125
+ if (!kind) continue;
126
+ if (kind === "main") break;
127
+ const { content, whole, top = false } = selectAllOf(kind) ?? {};
128
+ if (content) {
129
+ const units = heldUnits(at);
130
+ if (units.length > 0) steps.push({ units, label: contentLabel(kind), top });
131
+ if (top) return steps;
132
+ }
133
+ if (whole) {
134
+ const owner = at.matches(UNIT) ? at : at.parentElement?.closest(UNIT);
135
+ if (owner && !steps.some((step) => step.units.length === 1 && step.units[0] === owner)) steps.push({ units: [owner], label: wholeLabel(owner) });
136
+ }
137
+ }
138
+ steps.push(topStep(start?.ownerDocument ?? document, start));
139
+ return steps;
140
+ }
141
+
142
+ /** The steps from text block `host` once its text is all selected: a table's cell the table whole first. */
143
+ export function stepsFromText(host) {
144
+ const unit = unitElement(host);
145
+ if (!unit) return [topStep(host.ownerDocument, host)]; // the title, one beside a detail card's content: no block of their own
146
+ const whole = unit !== host && kindOf(unit) === "table" ? [{ units: [unit], label: wholeLabel(unit) }] : [];
147
+ return [...whole, ...stepsAbove(unit.parentElement)];
148
+ }
149
+
150
+ /**
151
+ * The first of `steps` that selects more than `reached` (coverage: what is selected now), holding
152
+ * it all; `strict` false: one holding it is enough (a selection across blocks, whose text may be a
153
+ * part of theirs). The top takes what it can (the title is no block of the page), and after a text
154
+ * block's text (`text`) even when it holds that block alone: the block selected is more than its
155
+ * text (notion-lite's press with the text all selected; a page or a detail card of one paragraph).
156
+ * null: none (the top is selected already).
157
+ */
158
+ export function nextStep(steps, reached, { strict = true, text = false } = {}) {
159
+ for (const step of steps) {
160
+ const area = coverage(step.units);
161
+ const holds = [...reached].every((node) => area.has(node));
162
+ if (holds && (!strict || area.size > reached.size)) return step;
163
+ if (step.top && area.size > 0 && (!holds || text)) return step;
164
+ }
165
+ return null;
166
+ }
167
+
168
+ // The selection's part in a text block's own text, against all of it: whether it holds all of it
169
+ // (an empty block's is all selected: notion-lite's). Counted in characters and formulas, the
170
+ // zero-width pads (pads.mjs) none.
171
+ function wholeText(host) {
172
+ const own = document.createRange();
173
+ own.setStart(host, 0);
174
+ own.setEnd(host, textEnd(host));
175
+ const letters = (range) => range.toString().replaceAll(ZWSP, "");
176
+ const atoms = (range) => range.cloneContents().querySelectorAll("[data-ge-atom]").length;
177
+ const all = letters(own);
178
+ if (all === "" && atoms(own) === 0) return { own, all: true };
179
+ const selection = getSelection();
180
+ if (!selection.rangeCount) return { own, all: false };
181
+ const range = selection.getRangeAt(0);
182
+ if (range.compareBoundaryPoints(Range.END_TO_START, own) > 0 || range.compareBoundaryPoints(Range.START_TO_END, own) < 0) return { own, all: false };
183
+ const part = own.cloneRange();
184
+ if (range.compareBoundaryPoints(Range.START_TO_START, own) > 0) part.setStart(range.startContainer, range.startOffset);
185
+ if (range.compareBoundaryPoints(Range.END_TO_END, own) < 0) part.setEnd(range.endContainer, range.endOffset);
186
+ return { own, all: letters(part) === all && atoms(part) === atoms(own) };
187
+ }
188
+
189
+ /**
190
+ * blocks: the block tools (blocks.mjs: picked, select(units, { quiet })). say: the status line.
191
+ * cells: the table tools' selection (table/): table() the table whose cells are selected (no
192
+ * caret in one), or null; clear() lets it go.
193
+ */
194
+ export function createSelectAll({ blocks, say, cells = { table: () => null, clear() {} } }) {
195
+ const KEY = shortcut("mod+a"); // the key as the tooltips name it: Ctrl+A, ⌘A on a Mac
196
+ const more = (steps, step) => {
197
+ const next = nextStep(steps.slice(steps.indexOf(step) + 1), coverage(step.units));
198
+ return next ? t(" · 再按 {0} 选中{1}", KEY, next.label) : "";
199
+ };
200
+
201
+ // A step taken: its blocks selected (the cells' selection let go), said with the step after it.
202
+ function take(steps, step) {
203
+ if (!step) return; // the top is selected already: nothing more
204
+ cells.clear();
205
+ blocks.select(step.units, { quiet: true });
206
+ say(t("已选中{0} · Delete 删除 · Esc 取消{1}", step.label, more(steps, step)));
207
+ }
208
+
209
+ function fromText(host) {
210
+ const { own, all } = wholeText(host);
211
+ const steps = stepsFromText(host);
212
+ const next = nextStep(steps, new Set([host]), { text: true });
213
+ if (!all) {
214
+ select(own);
215
+ say(next ? t("已选中这一块的文字 · 再按 {0} 选中{1}", KEY, next.label) : t("已选中这一块的文字"));
216
+ return;
217
+ }
218
+ take(steps, next);
219
+ }
220
+
221
+ return {
222
+ /**
223
+ * The editor's key chain (editor.mjs): Ctrl+A with the caret in text block `host` (null: none,
224
+ * blocks or cells selected, or nothing). True when it was the key and handled.
225
+ */
226
+ key(event, host) {
227
+ if (!isSelectAllKey(event) || event.isComposing || event.keyCode === 229) return false;
228
+ const target = event.target;
229
+ // A field of the page's own UI, or the report's own editable element, keeps the browser's.
230
+ if (target?.closest?.("input, textarea, select") || (target?.isContentEditable && !editable(target))) return false;
231
+ event.preventDefault();
232
+ if (host) return fromText(host), true;
233
+ const table = cells.table();
234
+ if (table?.isConnected) {
235
+ const steps = [{ units: [table], label: wholeLabel(table) }, ...stepsAbove(table.parentElement)];
236
+ take(steps, steps[0]);
237
+ return true;
238
+ }
239
+ const picked = blocks.picked;
240
+ if (picked.length > 0) {
241
+ const steps = stepsAbove(around(picked));
242
+ take(steps, nextStep(steps, coverage(picked)));
243
+ } else {
244
+ const steps = [topStep(document)];
245
+ take(steps, nextStep(steps, new Set()));
246
+ }
247
+ return true;
248
+ },
249
+ /**
250
+ * A key over a selection across blocks (text-select/): Ctrl+A selects the first container
251
+ * holding all it touches, `touched()` letting it go and giving its blocks. True when it was the key.
252
+ */
253
+ across(event, touched) {
254
+ if (!isSelectAllKey(event)) return false;
255
+ event.preventDefault();
256
+ const units = touched();
257
+ const steps = units.length > 0 ? stepsAbove(around(units)) : [topStep(document)];
258
+ take(steps, nextStep(steps, coverage(units), { strict: false }));
259
+ return true;
260
+ },
261
+ };
262
+ }