@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,697 @@
1
+ import { IN_LAYER, Z } from "../../../shared/layers.mjs";
2
+ import { onOutlineOpen, onPreferences, outlineOpen, preference, setPreference } from "../../../shared/preferences.mjs";
3
+ import { t } from "../../../shared/i18n/index.mjs";
4
+ import { SHEETS } from "../../components/kit.mjs";
5
+ import { task } from "../frames.mjs";
6
+ import { cancelOnEscape, endsGesture, gestureLock } from "../gesture.mjs";
7
+ import { MARGIN, onMargin, outlineMost, outlineWidth, setMargin } from "../margin.mjs";
8
+ import { drawOver, shapeOf } from "../overlay-layer.mjs";
9
+ import { onSettle, own } from "../overlays.mjs";
10
+ import { local } from "../storage.mjs";
11
+ import { addStyle, element } from "../ui.mjs";
12
+ import { carryFolds, foldsOf, keepFolds } from "./folds.mjs";
13
+ import { ROW, createList } from "./list.mjs";
14
+ import { entriesOf, touchesOutline } from "./read.mjs";
15
+ import { STRIP_TOP, createStrip } from "./strip.mjs";
16
+ import { currentOf, followTop, glideFrom, keysOf, markedRow, nodesOf, pathTo, rowsOf, signatureOf, spyLine, treeOf } from "./tree.mjs";
17
+
18
+ // 目录: the page's outline at the right of the editor area (docs/editor.md, "The outline and the right side"), while the
19
+ // reader has it on for this report (the top bar's 更多 › 目录: shared/preferences.mjs outlineOpen, each
20
+ // report's own, off until switched on there; the page follows a switch at once, made in the workbench
21
+ // or in another tab of the same report). Never on a page opened on its own in a frame (?solo), in 演示视图 (no
22
+ // editor), an export or print. The editor starts it before the page's blocks are made editable
23
+ // (editor.mjs start, before enter: the headings' kinds marked from the map, core.mjs markKinds), and it
24
+ // is drawn at once, with no fade, and given a frame to show in: it comes with the page; switched on, it
25
+ // fades in; switched off, it goes at once.
26
+ //
27
+ // What it lists (read.mjs, tree.mjs): the heading blocks, nested by level, a tabs area's tabs as pills
28
+ // with their headings under them. Its form is margin.mjs's: the list in full at the window's right
29
+ // edge, the column in the middle of what it leaves (200px unless the reader dragged its guide: a quiet
30
+ // list on the page's background, a hairline guide down its left, the current row's segment dark on
31
+ // it), or, with less room, its strip (strip.mjs), which shows the list as a card while the pointer is on it, each of its
32
+ // lines lighting its own row. A form that changes after the page came is faded in (the list sliding a
33
+ // little from the right), never there all at once.
34
+ //
35
+ // - A click on a heading's row scrolls the page smoothly (at once with reduced motion; from more than
36
+ // two windows away at once to a window short of it, gliding the rest) to put the heading 24px below
37
+ // the window's top, as 演示视图's 上一节/下一节, then lights it for a moment (a quiet gray, in the
38
+ // overlay layer of its block; gone with the heading, or once it is hidden). A hidden tab is shown
39
+ // first, a closed disclosure opened (reading state: nothing is saved). The row is current at once and
40
+ // stays so until the page has moved 40px from where the jump left it. The reader taking the page over
41
+ // during the jump (the wheel, a key that scrolls, the scrollbar, a press in the page) ends it there:
42
+ // it never pulls the page back. A tab's row shows that tab and scrolls to its tab row.
43
+ // - A jump leaves the text: its selection goes (the format bar with it, which stood over the heading
44
+ // gone to). Chosen by the pointer, the page is the reader's: the focus leaves the outline (the keys
45
+ // that read scroll the page, a letter types nothing; a click in the text edits there). Chosen by a key
46
+ // (Enter, Space), the focus stays in the tree, where PageUp/PageDown scroll the page. Esc leaves the
47
+ // tree: for the caret where it was while no jump has moved the page, else for the page where it is.
48
+ // - The current heading (the spy): the one furthest down, of those with a box on the page, whose top
49
+ // has passed a line min(120px, 30% of the window) below the window's top, the first in order of those
50
+ // level with it (headings side by side in columns); none above the first. Over the page's last window
51
+ // the line comes down with the scroll to the window's bottom (tree.mjs spyLine), so the last short
52
+ // sections each get their turn. Inside a folded row, that row is marked. The list keeps the current
53
+ // row at most a third of its clear view down (the rows to come below it) and two rows from its top
54
+ // at least, scrolling (smoothly) as little as that takes; not while the pointer is over it, or the
55
+ // reader scrolled it in the last 1.5s (the pointer gone after that, a row scrolled out of sight is
56
+ // brought back). The wheel over it scrolls it, and at its ends the page.
57
+ // - A triangle at a parent's left folds or unfolds it (a folded one always shows it; an open one while
58
+ // the pointer is over the list or the keyboard is in it); what is folded is kept for the report
59
+ // (folds.mjs), so the page the workbench shows again after an Agent's write folds the same, and
60
+ // follows a heading whose key changes (one with no block id, keyed by its text, typed in or given its
61
+ // id as it is saved). The top level's headings are bold.
62
+ // - Its guide line, dragged, makes the list wider or narrower (160 to 360px, as far as the room lets
63
+ // it while the column keeps its edge room at both sides), the column staying in the middle of what
64
+ // it leaves (margin.mjs: its two rooms giving or taking half each); let go, the width is the
65
+ // reader's for every report (shared/preferences.mjs outlineWidth); Esc puts it back.
66
+ // - It follows the page as it changes (one reading a frame at most, the rows drawn again only when
67
+ // what they show changed): headings typed, renamed, added, deleted, moved, undone, tabs renamed or
68
+ // shown; not while an input method composes (its letters are no title yet: read once it commits).
69
+ // It is the editor's own UI (data-doc-dev): a press on it starts no box selection, the handle
70
+ // does not show by it, and while a block is dragged or a box drawn it lets the pointer through.
71
+
72
+ const DOCK = { top: 52, left: MARGIN.guide, right: 8 }; // the list's room in the dock: below the page's top room, its guide 8px in (where the column's right room ends: margin.mjs), 8px short of the scrollbar
73
+ const CARD = 56; // the strip's card: as wide as the list chosen, and this much more
74
+ const ENTER = { ms: 160, slide: 8 }; // the list in full coming after the page did: faded in, sliding this far from the right
75
+ const RESIZING = "data-ge-outline-resize"; // on the document element while the guide is dragged
76
+ const JUMP_TOP = 24; // a heading's top after a jump, below the window's
77
+ const STAY = 40; // px the page moves after a jump before the heading gone to stops being the current one
78
+ const FOLLOW_QUIET = 1500; // ms after the reader scrolled the list, it is not scrolled to the current row
79
+ const FOLLOW_LEAST = 2 * ROW; // the current row at least two rows below the list's clear top (tree.mjs followTop)
80
+ const FADE = { top: 24, bottom: 32 }; // the list's faded ends while there is more (STYLE)
81
+ const PAGE = 0.875; // PageUp/PageDown in the tree scroll the page by this much of the window, as the browser's do
82
+ const LINE = 40; // and ↑/↓ by this much, with the focus on the page after a press in the list (as the browser does)
83
+ const FLASH = { hold: 600, fade: 600 };
84
+ const UI_FONT = `ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI Variable Display", "Segoe UI", Helvetica, "PingFang SC", "Microsoft YaHei", Arial, sans-serif`;
85
+ // The current row and the tabs' pills in a medium weight where the system's Chinese face has one
86
+ // (PingFang, on Apple's systems). Elsewhere (Microsoft YaHei has none) 500 draws a title's Latin words in
87
+ // Segoe's semibold beside regular Chinese, so they keep 400 there: the color and the guide's segment
88
+ // mark the current row, the fill the tab shown.
89
+ const MEDIUM = /Mac|iPhone|iPad/.test(globalThis.navigator?.platform ?? "") ? 500 : 400;
90
+ // The keys that scroll the page: pressed during a jump, the reader takes the page over.
91
+ const SCROLL_KEYS = new Set(["PageUp", "PageDown", "Home", "End", " ", "ArrowUp", "ArrowDown"]);
92
+
93
+ const STYLE = `
94
+ .ge-outline, .ge-outline-strip, .ge-outline-card { font: 400 14px/22px ${UI_FONT}; color: var(--ge-tx2); -webkit-user-select: none; user-select: none; }
95
+ .ge-outline svg, .ge-outline-strip svg, .ge-outline-card svg { display: block; width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
96
+ .ge-outline[hidden], .ge-outline-strip[hidden], .ge-outline-card[hidden] { display: none; }
97
+
98
+ /* The dock: fixed at the window's right edge, its whole height, the list from the page's top room down; only the list and its guide take the pointer. */
99
+ .ge-outline { position: fixed; top: 0; right: 0; bottom: 0; z-index: ${Z.outline}; width: ${MARGIN.full}px; box-sizing: border-box; padding: ${DOCK.top}px ${DOCK.right}px 0 ${DOCK.left}px; display: flex; flex-direction: column; pointer-events: none; }
100
+ .ge-outline-frame { position: relative; flex: 0 1 auto; min-height: 0; display: flex; flex-direction: column; }
101
+ /* The list scrolls by itself with no scrollbar (none to move its rows as it comes and goes, none beside the page's own): its fades say there is more; the wheel and a touch move it, and at its ends go on to the page (no wheel trapped over it). */
102
+ .ge-outline-scroll { flex: 0 1 auto; min-height: 0; overflow-y: auto; scrollbar-width: none; }
103
+ .ge-outline-scroll::-webkit-scrollbar { display: none; }
104
+ .ge-outline-frame > .ge-outline-scroll { padding-bottom: 24px; pointer-events: auto; }
105
+ .ge-outline-scroll[data-more="up"] { -webkit-mask-image: linear-gradient(transparent, #000 24px); mask-image: linear-gradient(transparent, #000 24px); }
106
+ .ge-outline-scroll[data-more="down"] { -webkit-mask-image: linear-gradient(#000 calc(100% - 32px), transparent); mask-image: linear-gradient(#000 calc(100% - 32px), transparent); }
107
+ .ge-outline-scroll[data-more="up down"] { -webkit-mask-image: linear-gradient(transparent, #000 24px, #000 calc(100% - 32px), transparent); mask-image: linear-gradient(transparent, #000 24px, #000 calc(100% - 32px), transparent); }
108
+ /* The guide's grip: dragged, the list wider or narrower; under the pointer (a moment after it came) and while dragged, the guide a wider, darker bar. */
109
+ .ge-outline-grip { position: absolute; left: -${MARGIN.grip}px; top: 0; bottom: 24px; width: 9px; cursor: col-resize; pointer-events: auto; }
110
+ .ge-outline-grip::after { content: ""; position: absolute; left: 3px; top: 4px; bottom: 4px; width: 3px; border-radius: 2px; transition: background-color 120ms ease; }
111
+ .ge-outline-grip:hover::after { background: var(--ge-line-strong); transition-delay: 120ms; }
112
+ :root[${RESIZING}] .ge-outline-grip::after { background: color-mix(in srgb, var(--ge-tx3) 70%, transparent); transition-delay: 0s; }
113
+ :root[${RESIZING}] .ge-outline-scroll { pointer-events: none; }
114
+ ${gestureLock(RESIZING, { cursor: "col-resize", select: true })}
115
+
116
+ /* The list: a hairline guide at its left, the current row's segment darker on it, the lit row's blue (whole pixels: crisp at any scale). */
117
+ .ge-outline-list { position: relative; padding-left: 6px; outline: none; }
118
+ .ge-outline-list::before { content: ""; position: absolute; left: 0; top: 4px; bottom: 4px; width: 1px; background: var(--ge-line-strong); }
119
+ .ge-outline-list[data-empty]::before { display: none; }
120
+ .ge-outline-mark { position: absolute; left: -1px; top: 0; width: 2px; height: 16px; border-radius: 1px; background: var(--ge-tx); pointer-events: none; }
121
+ .ge-outline-mark[data-hot] { background: var(--ge-accent); }
122
+ .ge-outline-mark[hidden] { display: none; }
123
+ .ge-outline-row { position: relative; display: flex; align-items: center; gap: 2px; height: ${ROW}px; box-sizing: border-box; padding: 0 6px 0 calc(2px + var(--ge-depth, 0) * 12px); border-radius: 6px; cursor: pointer; white-space: nowrap; outline: none; }
124
+ .ge-outline-text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
125
+ .ge-outline-row:is(:hover, :focus-visible, [data-hot]) { color: var(--ge-tx); background: var(--ge-hover); }
126
+ .ge-outline-row:active { background: var(--ge-press); }
127
+ .ge-outline-row[data-current] { color: var(--ge-tx); font-weight: ${MEDIUM}; }
128
+ /* The top level's headings bold: at the top, or right under a tab (its pill keeps its own look). */
129
+ .ge-outline-row[data-top] { font-weight: 600; }
130
+ /* The triangle at a parent's left, in a column of its own (a leaf keeps the room): a folded one always shows (pointing right), an open one (pointing down) while the pointer is over the list or the keyboard is in it (the focus seen: a fold by the pointer leaves the focus on its row, unseen). No grey under the pointer, only while pressed. */
131
+ .ge-outline-twist, .ge-outline-slot { flex: none; width: 16px; height: 16px; }
132
+ .ge-outline-twist { border-radius: 4px; color: var(--ge-tx3); }
133
+ .ge-outline-twist svg { fill: currentColor; transition: transform 120ms ease; }
134
+ .ge-outline-twist:hover { color: var(--ge-tx2); }
135
+ .ge-outline-twist:active { background: var(--ge-press); }
136
+ .ge-outline-row[aria-expanded="true"] .ge-outline-twist svg { transform: rotate(90deg); }
137
+ .ge-outline-list:not(:hover, :focus-visible, :has(:focus-visible)) .ge-outline-row[aria-expanded="true"] .ge-outline-twist { visibility: hidden; }
138
+ /* A tabs area's tab: its name as a pill at the rows' size (its text in line with the rows beside it), the tab shown filled as the page's pills, the others ringed by a hairline (plain, they read as less than their own headings). */
139
+ .ge-outline-row[data-kind="tab"] .ge-outline-text { margin-left: -4px; }
140
+ .ge-outline-tab { display: inline-block; max-width: 100%; box-sizing: border-box; height: 22px; padding: 0 6px; border-radius: 6px; overflow: hidden; text-overflow: ellipsis; vertical-align: top; font-weight: ${MEDIUM}; line-height: 22px; box-shadow: inset 0 0 0 1px var(--ge-line-strong); }
141
+ .ge-outline-row[data-shown] .ge-outline-tab { background: var(--ge-hover); color: var(--ge-tx); box-shadow: none; }
142
+ .ge-outline-row[data-shown]:is(:hover, :focus-visible, [data-hot]) .ge-outline-tab { background: transparent; }
143
+ .ge-outline-empty { padding: 4px 0 4px 8px; color: var(--ge-tx3); white-space: normal; }
144
+
145
+ /* The strip: short lines, each its own target: the one under the pointer blue, longer and thicker. */
146
+ .ge-outline-strip { position: fixed; top: 0; right: 0; bottom: 0; z-index: ${Z.outline}; width: ${MARGIN.strip}px; pointer-events: none; }
147
+ .ge-outline-ticks { position: absolute; top: ${STRIP_TOP}px; right: 4px; width: 28px; box-sizing: border-box; display: flex; flex-direction: column; align-items: flex-end; gap: var(--ge-tick-gap, 6px); padding: 8px 6px; border-radius: 6px; cursor: pointer; pointer-events: auto; outline: none; }
148
+ .ge-outline-ticks:focus-visible { background: var(--ge-hover); }
149
+ .ge-outline-ticks i { display: block; flex: none; width: var(--ge-tick, 16px); height: 2px; border-radius: 1px; background: var(--ge-line-strong); transform-origin: right center; transition: width 120ms ease-out, transform 120ms ease-out, background-color 120ms ease-out; }
150
+ .ge-outline-ticks:is(:hover, :focus-visible, [aria-expanded="true"]) i { background: color-mix(in srgb, var(--ge-tx3) 75%, transparent); }
151
+ .ge-outline-ticks i[data-current] { background: var(--ge-tx); }
152
+ .ge-outline-ticks i[data-hot] { width: calc(var(--ge-tick, 16px) + 6px); background: var(--ge-accent); transform: scaleY(1.5); }
153
+ .ge-outline-none { display: block; width: 16px; height: 16px; color: var(--ge-tx3); }
154
+ /* Its card: the list over the page beside the strip, its top level with the strip's lines, the menus' surface; the list scrolls inside it, faded at its ends as in full. */
155
+ .ge-outline-card { position: fixed; z-index: ${Z.menu}; top: ${STRIP_TOP}px; right: ${MARGIN.strip + 4}px; width: ${MARGIN.full + CARD}px; max-height: calc(100vh - ${STRIP_TOP + 16}px); box-sizing: border-box; display: flex; flex-direction: column; padding: 8px 8px 8px 12px; border-radius: 10px; background: var(--ge-bg); box-shadow: var(--ge-shadow-pop); }
156
+
157
+ /* While a block is dragged, a box drawn, text selected across blocks or something resized, the outline lets the pointer through. */
158
+ :root:is([data-ge-drag], [data-ge-marquee], [data-ge-cross], [data-ge-resize], [data-ge-gap-drag], [data-ge-tdrag], [data-ge-tresize], [data-ge-tcells]) :is(.ge-outline-scroll, .ge-outline-ticks, .ge-outline-grip) { pointer-events: none; }
159
+
160
+ /* A heading lit for a moment after a jump: its fill's shape, a quiet gray. */
161
+ .ge-outline-flash { z-index: ${IN_LAYER.tint}; pointer-events: none; background: var(--ge-outline-flash); }
162
+
163
+ @media print { .ge-outline, .ge-outline-strip, .ge-outline-card { display: none; } }
164
+ `;
165
+
166
+ const still = () => globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? false;
167
+ const editableAt = (node) => (node?.nodeType === 1 && node.closest?.('[contenteditable="true"]')) || null;
168
+ const shown = (node) => Boolean(node?.isConnected && node.getClientRects().length > 0);
169
+
170
+ let made = null; // the page's outline: one
171
+
172
+ /** slug: the report's (what is folded is kept under it). Returns { holds(target): a node of the outline, shown: whether it shows (in full or as its strip) }. */
173
+ export function createOutline({ slug }) {
174
+ if (made) return made;
175
+ const main = document.querySelector("main");
176
+ if (!main) return { holds: () => false, shown: false };
177
+ addStyle(STYLE);
178
+
179
+ let on = outlineOpen(slug); // this report's switch (off until switched on here)
180
+ let chosen = preference("outlineWidth"); // the list's width in full as the reader dragged it (0: the default)
181
+ let form = null; // the form shown: "full", "strip" or null
182
+ let tree = [];
183
+ let rows = [];
184
+ let heads = []; // the heading nodes in the outline's order
185
+ let drawnSignature = null; // what the rows drawn show (tree.mjs signatureOf), and with which folds
186
+ let dirty = true; // the page changed: read it again
187
+ const folded = foldsOf(local, slug);
188
+ const keyOfRef = new WeakMap(); // a node's element -> its key read last (a fold follows a key that changes)
189
+ let chosenKey = null; // the heading a click went to: current until the page moves STAY from where it landed
190
+ let jumping = false; // a jump's scroll under way (from the click until it lands)
191
+ let jumps = 0; // jumps begun (a frame's start of one taken over meanwhile, or followed by another, does nothing)
192
+ let landedAt = null; // the page's scrollY where the jump landed
193
+ let settling = null; // the jump's scroll waiting for its end: (arrived) => void ends it
194
+ let markedKey = null; // the node marked last (to keep it in view only when it changes)
195
+ let pointerIn = false;
196
+ let listScrolled = 0; // when the reader last scrolled the list
197
+ let returnTo = null; // { host, range }: where the caret was when the outline took the focus
198
+ let composing = false; // an input method composing: its letters are no title yet
199
+ let flashing = null; // { node, heading }: the heading lit after a jump
200
+
201
+ const list = createList({ jump: go, fold: toggle, escape: giveBack, page: (direction) => page(direction) });
202
+ const scroller = element("div", { class: "ge-outline-scroll" }, list.node);
203
+ const grip = element("div", { class: "ge-outline-grip", role: "separator", "aria-orientation": "vertical", "aria-label": t("拖动调整目录宽度") });
204
+ const dock = element("nav", { class: "ge-outline", "aria-label": t("目录"), "data-doc-dev": "", hidden: "" }, element("div", { class: "ge-outline-frame" }, scroller, grip));
205
+ const strip = createStrip({
206
+ list,
207
+ opened: () => frames.wake(),
208
+ closed: () => frames.wake(),
209
+ escape: () => giveBack(),
210
+ choose: (index) => { if (rows[index]) go(rows[index].node); },
211
+ });
212
+ document.body.append(dock, strip.strip, strip.card);
213
+
214
+ // ---------- reading the page ----------
215
+
216
+ function read() {
217
+ tree = treeOf(entriesOf(main));
218
+ const nodes = nodesOf(tree);
219
+ const moves = [];
220
+ for (const node of nodes) {
221
+ if (!node.ref) continue;
222
+ const before = keyOfRef.get(node.ref);
223
+ if (before !== undefined && before !== node.key) moves.push([before, node.key]);
224
+ keyOfRef.set(node.ref, node.key);
225
+ }
226
+ if (carryFolds(folded, moves)) keepFolds(local, slug, folded, keysOf(tree));
227
+ heads = nodes.filter((node) => node.kind === "heading");
228
+ rows = rowsOf(tree, folded);
229
+ }
230
+
231
+ // The heading the reader is at (tree.mjs currentOf), of those with a box on the page; the line it
232
+ // must pass comes down over the page's last window (spyLine: the last short sections each get their turn).
233
+ function spied() {
234
+ const tops = heads.map((node) => (node.ref?.isConnected ? node.ref.getClientRects()[0]?.top ?? null : null));
235
+ const line = spyLine({ scrollY, maxScroll: document.documentElement.scrollHeight - innerHeight, view: innerHeight, base: Math.min(120, innerHeight * 0.3) });
236
+ const at = currentOf(tops, line);
237
+ return at >= 0 ? heads[at] : null;
238
+ }
239
+
240
+ function currentNode() {
241
+ if (chosenKey !== null) {
242
+ const chosen = heads.find((node) => node.key === chosenKey);
243
+ if (shown(chosen?.ref)) return chosen; // not one a tab switched since has hidden
244
+ chosenKey = null;
245
+ }
246
+ return spied();
247
+ }
248
+
249
+ // One frame: the page read again when it changed (not while an input method composes), the rows
250
+ // drawn when what they show did, the current row marked, the strip's lines, the edges of the list.
251
+ function run() {
252
+ if (!form) return false;
253
+ if (dirty && !composing) {
254
+ dirty = false;
255
+ read();
256
+ const signature = `${signatureOf(tree)}\u0003${[...folded].join("\u0001")}`;
257
+ if (signature !== drawnSignature) {
258
+ drawnSignature = signature;
259
+ list.render(rows, folded, -1);
260
+ markedKey = null;
261
+ } else list.update(rows);
262
+ }
263
+ if (flashing && !shown(flashing.heading)) unflash(); // its heading hidden (a tab switched) or gone
264
+ const current = currentNode();
265
+ const marked = markedRow(rows, current && pathTo(tree, current), folded);
266
+ list.mark(marked);
267
+ if (form === "strip") strip.draw(rows, marked);
268
+ const key = rows[marked]?.node.key ?? null;
269
+ if (key !== markedKey) {
270
+ const first = markedKey === null;
271
+ markedKey = key;
272
+ follow(marked, { smooth: !first });
273
+ }
274
+ edges();
275
+ return false;
276
+ }
277
+ const frames = task("outline", {
278
+ run,
279
+ fail: () => { drawnSignature = null; dirty = true; },
280
+ });
281
+ const wake = () => { if (form) frames.wake(); };
282
+
283
+ // The list scrolled to keep the current row in its band (tree.mjs followTop: at most a third of the
284
+ // way down, so reading down the rows to come fill the rest; two rows from the top at least), as little
285
+ // as that takes; not while the pointer is over the outline or the reader just scrolled it. `hidden`:
286
+ // only when the row is out of the list's clear view (the reader's own scroll kept while it shows).
287
+ function follow(index, { smooth = true, hidden = false } = {}) {
288
+ const box = form === "full" ? scroller : strip.open ? strip.scroll : null;
289
+ const row = list.rowAt(index);
290
+ if (!box || !row || pointerIn || Date.now() - listScrolled < FOLLOW_QUIET) return;
291
+ const frame = box.getBoundingClientRect();
292
+ const rect = row.getBoundingClientRect();
293
+ if (hidden && rect.top >= frame.top + FADE.top && rect.bottom <= frame.bottom - FADE.bottom) return;
294
+ const top = rect.top - frame.top + box.scrollTop;
295
+ const to = followTop({ top, row: ROW, scrollTop: box.scrollTop, view: box.clientHeight, full: box.scrollHeight, least: FOLLOW_LEAST, fade: FADE });
296
+ if (to !== null) box.scrollTo({ top: to, behavior: smooth && !still() ? "smooth" : "instant" });
297
+ }
298
+
299
+ // The pointer gone from the outline: once the list has been left alone FOLLOW_QUIET, it comes back to
300
+ // the current row if the reader scrolled it out of sight (the wheel over it).
301
+ let backTimer = 0;
302
+ function backSoon() {
303
+ clearTimeout(backTimer);
304
+ backTimer = setTimeout(() => { if (!pointerIn) follow(list.marked, { hidden: true }); }, Math.max(0, FOLLOW_QUIET - (Date.now() - listScrolled)) + 50);
305
+ }
306
+
307
+ // The list's fades at its ends while there is more above or below (in full, or in the strip's card).
308
+ function edges() {
309
+ const box = form === "full" ? scroller : strip.open ? strip.scroll : null;
310
+ if (!box) return;
311
+ const more = [];
312
+ if (box.scrollTop > 1) more.push("up");
313
+ if (box.scrollTop + box.clientHeight < box.scrollHeight - 1) more.push("down");
314
+ const value = more.join(" ");
315
+ if ((box.getAttribute("data-more") ?? "") !== value) {
316
+ if (value) box.setAttribute("data-more", value);
317
+ else box.removeAttribute("data-more");
318
+ }
319
+ }
320
+
321
+ for (const box of [scroller, strip.scroll]) {
322
+ box.addEventListener("scroll", edges, { passive: true });
323
+ for (const type of ["wheel", "touchmove"]) box.addEventListener(type, () => { listScrolled = Date.now(); }, { passive: true });
324
+ }
325
+ for (const node of [dock, strip.strip, strip.card]) {
326
+ node.addEventListener("pointerenter", () => { pointerIn = true; });
327
+ node.addEventListener("pointerleave", () => { pointerIn = false; backSoon(); wake(); });
328
+ }
329
+
330
+ // ---------- folding ----------
331
+
332
+ function toggle(node) {
333
+ if (folded.has(node.key)) folded.delete(node.key);
334
+ else folded.add(node.key);
335
+ keepFolds(local, slug, folded, keysOf(tree));
336
+ dirty = true;
337
+ frames.wake();
338
+ }
339
+
340
+ // ---------- going to a heading ----------
341
+
342
+ // The page scrolled to put `target` JUMP_TOP below the window's top; `then(end, wanted)` once the
343
+ // scroll is over (`end`: the scrollY it went for, `wanted`: where the target was then, unclamped).
344
+ // More than two windows away, the page goes at once to a window short of it and glides the rest
345
+ // (tree.mjs glideFrom: the browser's glide over 14000px took 1.5s). Over means: at its end, or no
346
+ // longer moving towards it (a scrollend, or 1.5s gone by, then looked at again while it still moves:
347
+ // a slow machine's glide is waited for, the reader's scroll is not).
348
+ function scrollToTarget(target, then) {
349
+ settling?.(false);
350
+ const top = Math.round(target.getBoundingClientRect().top + scrollY - JUMP_TOP);
351
+ const end = Math.max(0, Math.min(top, document.documentElement.scrollHeight - innerHeight));
352
+ let timer = 0;
353
+ const done = (arrived = true) => {
354
+ if (settling !== done) return;
355
+ settling = null;
356
+ clearTimeout(timer);
357
+ removeEventListener("scrollend", check);
358
+ if (arrived) then?.(end, top);
359
+ };
360
+ function check() {
361
+ if (settling !== done) return;
362
+ const left = Math.abs(scrollY - end);
363
+ if (left < 1) return done(true);
364
+ clearTimeout(timer);
365
+ timer = setTimeout(() => {
366
+ if (Math.abs(scrollY - end) < left - 0.5) timer = setTimeout(check, 250); // still on its way
367
+ else done(true);
368
+ }, 60);
369
+ }
370
+ settling = done;
371
+ if (Math.abs(end - scrollY) < 1) {
372
+ done(true);
373
+ return;
374
+ }
375
+ const from = still() ? null : glideFrom(scrollY, end, innerHeight);
376
+ if (from !== null) scrollTo({ top: from, behavior: "instant" });
377
+ addEventListener("scrollend", check);
378
+ timer = setTimeout(check, 1500);
379
+ scrollTo({ top: end, behavior: still() ? "instant" : "smooth" });
380
+ }
381
+
382
+ // Scrolled to `target`, and again while it is not there yet and the page can still go (what was just
383
+ // shown lays itself out as the page scrolls: a tab's tables, a disclosure's content), then `then()`.
384
+ // A scroll that ended somewhere else than it went for, the page laid out as it was, was the reader's
385
+ // (the scrollbar): the jump ends there, never pulling the page back. One the page's layout moved (the
386
+ // browser keeping what was in view where it was as a tab's tables laid themselves out above it) lands
387
+ // again. While it goes, the list says so (data-going: the browser scenarios wait for it).
388
+ function land(target, then, tries = 0) {
389
+ jumping = true;
390
+ list.node.setAttribute("data-going", "");
391
+ scrollToTarget(target, (end, wanted) => {
392
+ const max = document.documentElement.scrollHeight - innerHeight;
393
+ const clamped = end > max && scrollY >= max - 1; // the page got shorter meanwhile: as far as it goes
394
+ const shifted = Math.abs(Math.round(target.getBoundingClientRect().top + scrollY - JUMP_TOP) - wanted) > 1;
395
+ if (Math.abs(scrollY - end) > 1 && !clamped && !shifted) return stopJump();
396
+ const off = Math.round(target.getBoundingClientRect().top) - JUMP_TOP;
397
+ const room = off > 0 ? max - scrollY : scrollY;
398
+ if (Math.abs(off) > 2 && room > 1 && tries < 3 && target.isConnected) return land(target, then, tries + 1);
399
+ jumping = false;
400
+ list.node.removeAttribute("data-going");
401
+ then?.();
402
+ });
403
+ }
404
+
405
+ // The jump ended before it landed: the page is the reader's, the spy says where they are.
406
+ function stopJump() {
407
+ settling?.(false);
408
+ jumping = false;
409
+ chosenKey = null;
410
+ landedAt = null;
411
+ list.node.removeAttribute("data-going");
412
+ wake();
413
+ }
414
+
415
+ function unflash() {
416
+ flashing?.node.remove();
417
+ flashing = null;
418
+ }
419
+
420
+ function flash(heading) {
421
+ unflash();
422
+ const shape = shown(heading) ? shapeOf(heading) : null;
423
+ if (!shape) return;
424
+ const node = element("div", { class: "ge-outline-flash", "data-doc-dev": "" });
425
+ const entry = { node, heading };
426
+ own(node, "outline-flash", { owner: heading, alive: () => flashing === entry && heading.isConnected });
427
+ drawOver(node, shape, { x: 4, y: 2, radius: 4 });
428
+ flashing = entry;
429
+ setTimeout(() => {
430
+ if (flashing !== entry) return;
431
+ const gone = () => { if (flashing === entry) unflash(); };
432
+ const fade = still() ? null : node.animate?.([{ opacity: 1 }, { opacity: 0 }], { duration: FLASH.fade, easing: "ease-in", fill: "forwards" });
433
+ if (fade) fade.onfinish = gone;
434
+ else gone();
435
+ }, FLASH.hold);
436
+ }
437
+ // After a change of the page (history: a change, an undo, a redo), at once: a heading lit and gone with it is let go.
438
+ onSettle(() => { if (flashing && !shown(flashing.heading)) unflash(); });
439
+
440
+ // A jump leaves the text: its selection goes (the format bar, a selection's strips with it: they stood
441
+ // over the heading gone to), and Esc has no caret to give back (the page is where the reader went).
442
+ function leaveText() {
443
+ returnTo = null;
444
+ const selection = getSelection();
445
+ if (selection.rangeCount && main.contains(selection.anchorNode)) selection.removeAllRanges();
446
+ }
447
+
448
+ // `keyboard`: chosen by Enter or Space, the focus stays in the tree; by the pointer, the page is the
449
+ // reader's: the focus leaves the outline (the keys that read scroll the page, a letter types nothing).
450
+ function go(node, { keyboard = false } = {}) {
451
+ const jump = ++jumps;
452
+ const begin = (target, then) => requestAnimationFrame(() => { if (jump === jumps && jumping) land(target, then); });
453
+ if (node.kind === "tab") {
454
+ const area = node.ref?.closest(SHEETS.match);
455
+ if (!area) return;
456
+ const key = node.ref.getAttribute(SHEETS.tabKey);
457
+ globalThis.DocKit.reveal([...area.children].find((child) => child.getAttribute(SHEETS.panelKey) === key) ?? area);
458
+ chosenKey = null;
459
+ landedAt = null;
460
+ jumping = true;
461
+ begin(node.ref.closest(SHEETS.rowAt) ?? area);
462
+ } else {
463
+ const heading = node.ref;
464
+ if (!heading?.isConnected) return;
465
+ globalThis.DocKit.reveal(heading);
466
+ chosenKey = node.key;
467
+ landedAt = null;
468
+ jumping = true;
469
+ begin(heading, () => {
470
+ landedAt = scrollY;
471
+ flash(heading);
472
+ });
473
+ }
474
+ leaveText();
475
+ // Chosen by a key, the card closes (the focus back on the strip); by the pointer, it stays while the pointer is on it.
476
+ if (strip.open && (keyboard || (!strip.keyed && !pointerIn))) strip.closeCard({ focus: keyboard });
477
+ if (!keyboard) toPage();
478
+ frames.wake();
479
+ }
480
+
481
+ // The focus on the page itself, out of the outline and the text: a letter types nothing, the keys that
482
+ // read scroll the page (below), the editor's keys for the page (undo, select-all) are the page's.
483
+ function toPage() {
484
+ const active = document.activeElement;
485
+ if (active && active !== document.body && (holds(active) || main.contains(active))) active.blur();
486
+ }
487
+
488
+ // With the focus on the page itself after a press in the list (a jump by the pointer), the browser
489
+ // scrolls the list with the keys that read (it scrolls what holds the focus, else what was pressed
490
+ // last): the page is scrolled instead, by what those keys scroll it with nothing pressed there.
491
+ let pressedInList = false;
492
+ document.addEventListener("pointerdown", (event) => { pressedInList = Boolean(event.target?.closest?.(".ge-outline-scroll")); }, true);
493
+ addEventListener("keydown", (event) => {
494
+ if (!pressedInList || event.defaultPrevented || document.activeElement !== document.body || event.ctrlKey || event.metaKey || event.altKey || event.isComposing) return;
495
+ const step = Math.round(innerHeight * PAGE);
496
+ const by = event.shiftKey ? (event.key === " " ? -step : undefined) : { PageDown: step, PageUp: -step, " ": step, ArrowDown: LINE, ArrowUp: -LINE }[event.key];
497
+ const behavior = still() ? "instant" : "smooth";
498
+ if (by !== undefined) scrollBy({ top: by, behavior });
499
+ else if (!event.shiftKey && (event.key === "Home" || event.key === "End")) scrollTo({ top: event.key === "Home" ? 0 : document.documentElement.scrollHeight, behavior });
500
+ else return;
501
+ event.preventDefault();
502
+ });
503
+
504
+ // PageUp/PageDown in the tree: the page scrolls, as with the focus on it (the list, with no scrollbar, is not paged).
505
+ function page(direction) {
506
+ scrollBy({ top: direction * Math.round(innerHeight * PAGE), behavior: still() ? "instant" : "smooth" });
507
+ }
508
+
509
+ // The reader taking the page over during a jump: the wheel or a touch (not on the outline's own
510
+ // list), a key that scrolls the page (not the rows' own keys), a press in the page or on its scrollbar.
511
+ const takeOver = () => { if (jumping) stopJump(); };
512
+ // The wheel over the list scrolls it, and at its end in the wheel's way the page: then it is the reader's.
513
+ const listEnd = (box, down) => (down ? box.scrollTop + box.clientHeight >= box.scrollHeight - 1 : box.scrollTop <= 0);
514
+ addEventListener("wheel", (event) => {
515
+ const box = holds(event.target) ? event.target.closest(".ge-outline-scroll") : null;
516
+ if (!holds(event.target) || !box || listEnd(box, event.deltaY > 0)) takeOver();
517
+ }, { passive: true, capture: true });
518
+ addEventListener("touchstart", (event) => { if (!holds(event.target)) takeOver(); }, { passive: true, capture: true });
519
+ addEventListener("keydown", (event) => {
520
+ if (!jumping || !SCROLL_KEYS.has(event.key)) return;
521
+ if (list.holds(event.target) && event.key !== "PageUp" && event.key !== "PageDown") return;
522
+ takeOver();
523
+ }, true);
524
+ addEventListener("pointerdown", (event) => { if (!holds(event.target)) takeOver(); }, true);
525
+ // After it landed, the heading gone to stays current until the page has moved STAY px.
526
+ addEventListener("scroll", () => {
527
+ if (!jumping && chosenKey !== null && (landedAt === null || Math.abs(scrollY - landedAt) > STAY)) {
528
+ chosenKey = null;
529
+ landedAt = null;
530
+ }
531
+ wake();
532
+ }, { passive: true });
533
+
534
+ // ---------- the focus ----------
535
+
536
+ // The caret's place when the outline takes the focus from the text, given back by Esc.
537
+ document.addEventListener("focusin", (event) => {
538
+ if (!holds(event.target)) return;
539
+ const host = editableAt(event.relatedTarget);
540
+ if (!host || holds(host)) return;
541
+ const selection = getSelection();
542
+ const range = selection.rangeCount ? selection.getRangeAt(0) : null;
543
+ returnTo = { host, range: range && host.contains(range.startContainer) ? range.cloneRange() : null };
544
+ }, true);
545
+
546
+ function giveBack() {
547
+ if (strip.open) {
548
+ strip.closeCard({ focus: true });
549
+ return;
550
+ }
551
+ const back = returnTo;
552
+ returnTo = null;
553
+ if (back?.host?.isConnected) {
554
+ back.host.focus({ preventScroll: true });
555
+ if (back.range) {
556
+ const selection = getSelection();
557
+ selection.removeAllRanges();
558
+ selection.addRange(back.range);
559
+ }
560
+ } else toPage();
561
+ }
562
+
563
+ // ---------- shown or not, in which form ----------
564
+
565
+ // The outline in the form the room gives it (null: none), the list as wide as the room gives it. Drawn
566
+ // at once as the page comes (no frame shows it empty); a form coming after that fades in (`fade`);
567
+ // one going goes at once (the reader switching it off too). The focus in it stays in it as its form
568
+ // changes (on its row in full, on the strip's button).
569
+ function show(layout, { fade = false } = {}) {
570
+ if (layout.outline === "full") dock.style.width = `${layout.dock}px`;
571
+ const next = on ? layout.outline : null;
572
+ if (next === form) return;
573
+ const active = document.activeElement;
574
+ const focusedRow = list.node.contains(active) ? Number(active.closest?.(".ge-outline-row")?.dataset.index ?? -1) : -1;
575
+ const hadFocus = holds(active);
576
+ const was = form;
577
+ form = next;
578
+ if (was === "full") dock.hidden = true;
579
+ if (was === "strip") strip.show(false);
580
+ if (form === "full") {
581
+ if (list.node.parentNode !== scroller) scroller.append(list.node);
582
+ for (const animation of dock.getAnimations?.() ?? []) animation.cancel();
583
+ dock.hidden = false;
584
+ if (fade && !still()) dock.animate?.([{ opacity: 0, transform: `translateX(${ENTER.slide}px)` }, { opacity: 1, transform: "none" }], { duration: ENTER.ms, easing: "ease-out" });
585
+ } else if (form === "strip") strip.show(true, { fade });
586
+ if (!form) return;
587
+ dirty = true;
588
+ markedKey = null;
589
+ try {
590
+ run();
591
+ } catch {
592
+ drawnSignature = null;
593
+ dirty = true;
594
+ frames.wake(); // drawn by the loop, which says what went wrong
595
+ }
596
+ if (hadFocus) {
597
+ if (form === "full") list.focus(focusedRow >= 0 ? focusedRow : Math.max(0, list.marked));
598
+ else strip.focusButton();
599
+ }
600
+ }
601
+
602
+ // The strip's card as wide as the list chosen, and a little more.
603
+ const cardWidth = () => { strip.card.style.width = `${outlineWidth(chosen, MARGIN) + CARD}px`; };
604
+ cardWidth();
605
+
606
+ // Shown in the form the room gives it as the editor starts, at once (it comes with the page), then
607
+ // as the room changes (the window, the list's width) and switched on or off by the
608
+ // reader, faded in (switched off, gone at once). Another page of the origin dragging the list's width
609
+ // (every report's): followed. This report's outline switched by another page (the workbench's top bar,
610
+ // the report in another tab): followed; another report's switch changes nothing here.
611
+ show(setMargin({ outline: on, outlineWidth: chosen }));
612
+ onMargin((layout) => show(layout, { fade: true }));
613
+ onPreferences(() => {
614
+ const width = preference("outlineWidth");
615
+ if (width === chosen || sizing) return;
616
+ chosen = width;
617
+ cardWidth();
618
+ setMargin({ outlineWidth: chosen });
619
+ });
620
+ onOutlineOpen(() => {
621
+ const next = outlineOpen(slug);
622
+ if (next === on) return;
623
+ on = next;
624
+ show(setMargin({ outline: on }), { fade: true });
625
+ });
626
+
627
+ // ---------- the width ----------
628
+
629
+ // The guide dragged: the list wider or narrower as the pointer goes (the column staying in the middle
630
+ // of what it leaves: margin.mjs), within 160px and what leaves the column its edge room at both sides
631
+ // (outlineMost); let go, the
632
+ // width is the reader's (every report, every page of the origin); Esc, the window losing the focus or
633
+ // the pointer taken away put it back.
634
+ let sizing = null; // { x, width, most, now, before }
635
+ grip.addEventListener("pointerdown", (event) => {
636
+ if (event.button !== 0 || form !== "full") return;
637
+ event.preventDefault();
638
+ const width = Math.round(dock.getBoundingClientRect().width);
639
+ sizing = { x: event.clientX, width, most: Math.max(width, outlineMost()), now: width, before: chosen };
640
+ try { document.documentElement.setPointerCapture(event.pointerId); } catch {}
641
+ document.documentElement.setAttribute(RESIZING, "");
642
+ });
643
+ document.documentElement.addEventListener("pointermove", (event) => {
644
+ if (!sizing) return;
645
+ const width = Math.round(Math.max(MARGIN.fullMin, Math.min(sizing.most, sizing.width + sizing.x - event.clientX)));
646
+ if (width === sizing.now) return;
647
+ sizing.now = width;
648
+ setMargin({ outlineWidth: width });
649
+ });
650
+ // Let go where it began (or never moved): nothing chosen, the width chosen before laid out again (the
651
+ // drag gave the layout the width shown, narrower than the one chosen where the room is short).
652
+ function endSizing(keep) {
653
+ if (!sizing) return;
654
+ const { now, before, width } = sizing;
655
+ sizing = null;
656
+ document.documentElement.removeAttribute(RESIZING);
657
+ if (!keep || now === width) setMargin({ outlineWidth: before });
658
+ else {
659
+ chosen = now;
660
+ setPreference("outlineWidth", now);
661
+ cardWidth();
662
+ }
663
+ }
664
+ document.documentElement.addEventListener("pointerup", () => endSizing(true));
665
+ endsGesture({ active: () => Boolean(sizing), cancel: () => endSizing(false) });
666
+ cancelOnEscape({ active: () => Boolean(sizing), cancel: () => endSizing(false) });
667
+
668
+
669
+ // The page changing: read again on the next frame when it may change what is listed (one reading
670
+ // a frame however much changed; words typed elsewhere only move the headings: the current one again).
671
+ // Off, nothing is read (showing it reads the page anew).
672
+ new MutationObserver((records) => {
673
+ if (!form) return;
674
+ if (touchesOutline(records)) dirty = true;
675
+ wake();
676
+ }).observe(main, { childList: true, subtree: true, characterData: true, attributes: true, attributeFilter: ["hidden", "open", "aria-selected", "data-block-id", "data-sheet-tab", "data-ge-unit-kind"] });
677
+ // Where the headings are changes without a scroll too (a picture loaded, a disclosure opened, the window resized).
678
+ new ResizeObserver(wake).observe(main);
679
+ addEventListener("resize", wake);
680
+ // An input method composing: what it types is read once it commits (compositionend; Chrome does
681
+ // not always send one, editor.mjs compositionOver: a key, an input or a press that is no part of one ends it too).
682
+ const composed = () => {
683
+ if (!composing) return;
684
+ composing = false;
685
+ wake();
686
+ };
687
+ document.addEventListener("compositionstart", () => { composing = true; }, true);
688
+ document.addEventListener("compositionend", composed, true);
689
+ for (const type of ["keydown", "input"]) document.addEventListener(type, (event) => { if (composing && !event.isComposing && event.keyCode !== 229) composed(); }, true);
690
+ document.addEventListener("pointerdown", composed, true);
691
+
692
+ function holds(target) {
693
+ return Boolean(target?.nodeType === 1 && (dock.contains(target) || strip.holds(target)));
694
+ }
695
+ made = { holds, get shown() { return form !== null; } };
696
+ return made;
697
+ }