@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
package/kit/tables.js ADDED
@@ -0,0 +1,1449 @@
1
+ "use strict";
2
+ (() => {
3
+ // src/render/kit/tables/auto-column-widths.ts
4
+ var defaults = {
5
+ percentile: 0.9,
6
+ hardMinWidth: 48,
7
+ narrativeMinWidth: 160,
8
+ maxReadableFloor: Infinity,
9
+ tokenHeavyMinWidth: 140,
10
+ compactMaxProtectedWidth: 160,
11
+ cellPadding: 24,
12
+ columnOverhead: 0,
13
+ font: "14px system-ui"
14
+ };
15
+ var kinds = ["token-heavy", "narrative", "compact"];
16
+ var total = (columns) => columns.reduce((sum, column) => sum + column.width, 0);
17
+ var clamp = (value, min, max) => Math.min(max, Math.max(min, value));
18
+ function quantile(values, q) {
19
+ if (!values.length) return 0;
20
+ const sorted = [...values].sort((a, b) => a - b);
21
+ const position = (sorted.length - 1) * q;
22
+ const low = Math.floor(position), high = Math.ceil(position);
23
+ return sorted[low] * (1 - position + low) + sorted[high] * (position - low);
24
+ }
25
+ function createTextMeasurer(font) {
26
+ const context = typeof document === "undefined" ? null : document.createElement("canvas").getContext("2d");
27
+ if (context) context.font = font;
28
+ const size = Number(font.match(/([\d.]+)px/)?.[1]) || 14;
29
+ const cache = /* @__PURE__ */ new Map();
30
+ return (text) => {
31
+ if (cache.has(text)) return cache.get(text);
32
+ const width = Math.max(0, ...text.split(/\r\n|\r|\n/).map((line) => context ? context.measureText(line).width : Array.from(line).reduce((sum, char) => sum + size * (/[^\x00-\xff]/.test(char) ? 1 : 0.55), 0)));
33
+ cache.set(text, width);
34
+ return width;
35
+ };
36
+ }
37
+ var WORD_BREAKS = /\s+|(?<=[、,。;:!?)」』》】〉〕”’,;!?)\]/])(?=[^\s、,。;:!?)」』》】〉〕”’,;!?)\]])|(?<=-)(?=[^\d\s-])|(?<=[^\s(「『《【〈〔“‘(\[])(?=[(「『《【〈〔“‘(\[])/u;
38
+ var PIECE_BREAKS = new RegExp(String.raw`${WORD_BREAKS.source}|(?<=[^\s(「『《【〈〔“‘(\[])(?=[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}])|(?<=[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}])(?=[^\s、,。;:!?)」』》】〉〕”’,;!?)\]])`, "u");
39
+ var longest = (text, breaks, measure) => Math.max(0, ...text.trim().split(breaks).map(measure));
40
+ function tokenHeavy(token) {
41
+ if (/^https?:\/\//i.test(token) || /[/\\]/.test(token)) return true;
42
+ if (/^[a-f0-9]{20,}$/i.test(token)) return true;
43
+ if (token.length >= 24 && /^[A-Za-z0-9_.:@/+~-]+$/.test(token)) return true;
44
+ return token.length >= 28 && !/[\u3040-\u30ff\u3400-\u9fff\uac00-\ud7af]/.test(token);
45
+ }
46
+ function columnKind(header, cells, measure) {
47
+ return analyze(header, cells, measure).kind;
48
+ }
49
+ function analyze(header, cells, measure) {
50
+ const values = cells.length ? cells : [header];
51
+ let words = 0, width = 0, heavy = 0;
52
+ for (const value of values) {
53
+ const tokens = value.trim().split(/\s+/).filter(Boolean);
54
+ words += tokens.length;
55
+ width += measure(value);
56
+ for (const token of tokens) {
57
+ if (tokenHeavy(token)) heavy++;
58
+ }
59
+ }
60
+ const kind = heavy > 0 && heavy / words >= 0.5 ? "token-heavy" : words / values.length >= 4 || width / values.length >= measure("abcdefghijklmnopqrstuvwxyz") ? "narrative" : "compact";
61
+ return { kind };
62
+ }
63
+ function shrink(columns, available, padding) {
64
+ let overflow = total(columns) - available;
65
+ const epsilon = 1e-6;
66
+ for (const compact of [false, true]) {
67
+ const group = columns.filter((column) => column.kind === "compact" === compact);
68
+ while (overflow > epsilon) {
69
+ const states = group.map((column) => ({
70
+ column,
71
+ slack: column.width - column.softMinWidth,
72
+ content: Math.max(1, column.preferredWidth - padding)
73
+ })).filter((item) => item.slack > epsilon);
74
+ if (!states.length) break;
75
+ const contentSum = states.reduce((sum, state) => sum + state.content, 0);
76
+ const fraction = Math.min(overflow / contentSum, ...states.map((state) => state.slack / state.content));
77
+ let reduced = 0;
78
+ for (const { column, content } of states) {
79
+ const before = column.width;
80
+ column.width = Math.max(column.softMinWidth, before - fraction * content);
81
+ reduced += before - column.width;
82
+ }
83
+ if (reduced <= epsilon) break;
84
+ overflow -= reduced;
85
+ }
86
+ }
87
+ }
88
+ function lowerWidest(widths, floors, excess) {
89
+ const lowered = (level) => widths.map((width, index) => Math.min(width, Math.max(level, floors[index])));
90
+ const saved = (level) => widths.reduce((sum, width, index) => sum + width - Math.min(width, Math.max(level, floors[index])), 0);
91
+ let low = Math.min(...floors), high = Math.max(...widths);
92
+ if (saved(low) <= excess) return lowered(low);
93
+ for (let step = 0; step < 40; step++) {
94
+ const level = (low + high) / 2;
95
+ if (saved(level) > excess) low = level;
96
+ else high = level;
97
+ }
98
+ return lowered(high);
99
+ }
100
+ function allocateColumnWidths(columns, options) {
101
+ const config = { ...defaults, ...options };
102
+ if (!Number.isFinite(config.totalWidth) || config.totalWidth <= 0) throw new Error("totalWidth must be positive and finite.");
103
+ for (const key of ["percentile", "hardMinWidth", "narrativeMinWidth", "tokenHeavyMinWidth", "compactMaxProtectedWidth", "cellPadding", "columnOverhead"]) {
104
+ if (!Number.isFinite(config[key]) || config[key] < 0) throw new Error(`${key} must be finite and nonnegative.`);
105
+ }
106
+ if (!(config.maxReadableFloor > 0)) throw new Error("maxReadableFloor must be positive.");
107
+ if (config.hardMinWidth === 0 || config.percentile > 1) throw new Error("hardMinWidth must be positive; percentile must be between 0 and 1.");
108
+ if (typeof config.font !== "string" || !config.font.trim()) throw new Error("font must be a nonempty string.");
109
+ if (!Array.isArray(columns)) throw new Error("columns must be an array.");
110
+ const keys = /* @__PURE__ */ new Set();
111
+ const measure = createTextMeasurer(config.font);
112
+ const compactTargets = [];
113
+ const wordFloors = /* @__PURE__ */ new Map();
114
+ const layouts2 = columns.map((column) => {
115
+ if (!column || typeof column.key !== "string" || !column.key || keys.has(column.key)) throw new Error("Column keys must be unique nonempty strings.");
116
+ keys.add(column.key);
117
+ if (typeof column.header !== "string" || !Array.isArray(column.cells)) throw new Error("Each column requires a header and cells.");
118
+ if (column.kind !== void 0 && !kinds.includes(column.kind)) throw new Error("Invalid column kind.");
119
+ if (column.numeric !== void 0 && typeof column.numeric !== "boolean") throw new Error("numeric must be a boolean.");
120
+ for (const value of column.cells) if (value != null && typeof value !== "string" && (typeof value !== "number" || !Number.isFinite(value))) throw new Error("Cells must be strings, finite numbers, null or undefined.");
121
+ const hardMinWidth = Math.max(config.hardMinWidth, column.minWidth ?? 0);
122
+ for (const bound of [column.minWidth, column.maxWidth]) if (bound !== void 0 && (!Number.isFinite(bound) || bound <= 0)) throw new Error("Column bounds must be positive and finite.");
123
+ if (column.maxWidth !== void 0 && column.maxWidth < hardMinWidth) throw new Error("maxWidth cannot be below the hard minimum.");
124
+ if (column.cellWidths !== void 0 && (!Array.isArray(column.cellWidths) || column.cellWidths.length !== column.cells.length || column.cellWidths.some((width) => !Number.isFinite(width) || width < 0))) throw new Error("cellWidths must match cells and contain finite nonnegative widths.");
125
+ if (column.cellWordWidths !== void 0 && (!Array.isArray(column.cellWordWidths) || column.cellWordWidths.length !== column.cells.length || column.cellWordWidths.some((width) => !Number.isFinite(width) || width < 0))) throw new Error("cellWordWidths must match cells and contain finite nonnegative widths.");
126
+ if (column.headerWordWidth !== void 0 && (!Number.isFinite(column.headerWordWidth) || column.headerWordWidth < 0)) throw new Error("headerWordWidth must be finite and nonnegative.");
127
+ if (column.cellPieceWidths !== void 0 && (!Array.isArray(column.cellPieceWidths) || column.cellPieceWidths.length !== column.cells.length || column.cellPieceWidths.some((width) => !Number.isFinite(width) || width < 0))) throw new Error("cellPieceWidths must match cells and contain finite nonnegative widths.");
128
+ const nonempty = column.cells.map((value, index) => ({ value, index })).filter(({ value }) => value != null && String(value).trim() !== "");
129
+ const values = nonempty.map(({ value }) => String(value));
130
+ if (column.headerWidth !== void 0 && (!Number.isFinite(column.headerWidth) || column.headerWidth < 0)) throw new Error("headerWidth must be finite and nonnegative.");
131
+ const headerWidth = column.headerWidth ?? measure(column.header) + config.cellPadding;
132
+ const analysis = analyze(column.header, values, measure);
133
+ const kind = column.kind ?? analysis.kind;
134
+ const measuredWidths = nonempty.map(({ value, index }) => column.cellWidths?.[index] ?? measure(String(value)) + config.cellPadding);
135
+ const protectedWidth = kind === "compact" ? measuredWidths.reduce((max, width) => width <= config.compactMaxProtectedWidth ? Math.max(max, width) : max, 0) : 0;
136
+ const preferredWidth = clamp(Math.max(headerWidth, protectedWidth, quantile(measuredWidths, config.percentile)), hardMinWidth, column.maxWidth ?? Infinity);
137
+ const contentFloor = Math.min(320, config.cellPadding + Math.max(0, quantile(measuredWidths, config.percentile) - config.cellPadding) / 3);
138
+ const floor = kind === "token-heavy" ? Math.max(config.tokenHeavyMinWidth, contentFloor) : kind === "narrative" ? Math.max(config.narrativeMinWidth, contentFloor) : Math.min(config.compactMaxProtectedWidth, preferredWidth);
139
+ const soft = column.numeric ? floor : Math.min(config.maxReadableFloor, floor);
140
+ const layout = { key: column.key, kind, preferredWidth, softMinWidth: clamp(soft, hardMinWidth, preferredWidth), hardMinWidth, width: preferredWidth, ratio: 0 };
141
+ if (kind === "compact") {
142
+ for (const width of new Set(measuredWidths)) {
143
+ if (width > preferredWidth && width <= (column.maxWidth ?? Infinity)) compactTargets.push({ column: layout, width });
144
+ }
145
+ if (!column.numeric) {
146
+ const words = nonempty.map(({ value, index }) => column.cellWordWidths?.[index] ?? longest(String(value), WORD_BREAKS, measure) + config.cellPadding);
147
+ const pieces = nonempty.map(({ value, index }) => column.cellPieceWidths?.[index] ?? longest(String(value), PIECE_BREAKS, measure) + config.cellPadding);
148
+ const least = Math.max(column.headerWordWidth ?? longest(column.header, WORD_BREAKS, measure) + config.cellPadding, ...pieces);
149
+ wordFloors.set(layout, { whole: Math.max(least, quantile(words, config.percentile)), least: Math.max(least, quantile(words, 0.5)) });
150
+ }
151
+ }
152
+ return layout;
153
+ });
154
+ const besideProse = layouts2.some((column) => column.kind === "narrative") ? wordFloors : /* @__PURE__ */ new Map();
155
+ for (const [column, { whole }] of besideProse) column.softMinWidth = clamp(Math.min(column.softMinWidth, whole), column.hardMinWidth, column.preferredWidth);
156
+ const target = config.totalWidth - columns.length * config.columnOverhead;
157
+ const readableWidth = layouts2.reduce((sum2, column) => sum2 + column.softMinWidth, 0);
158
+ const available = Math.max(target, readableWidth);
159
+ let spare = available - total(layouts2);
160
+ compactTargets.sort((a, b) => a.width - a.column.width - (b.width - b.column.width) || a.column.key.localeCompare(b.column.key));
161
+ for (const { column, width } of compactTargets) {
162
+ const extra = width - column.width;
163
+ if (extra > 0 && extra <= spare) {
164
+ column.width = width;
165
+ column.preferredWidth = width;
166
+ spare -= extra;
167
+ }
168
+ }
169
+ shrink(layouts2, available, config.cellPadding);
170
+ const excess = total(layouts2) - target;
171
+ if (excess > 0.5 && besideProse.size) {
172
+ const lowered = [...besideProse].map(([column, { least }]) => ({ column, floor: clamp(Math.min(column.softMinWidth, least), column.hardMinWidth, column.preferredWidth) }));
173
+ if (lowered.reduce((sum2, { column, floor }) => sum2 + column.width - floor, 0) >= excess) {
174
+ const widths = lowerWidest(lowered.map(({ column }) => column.width), lowered.map(({ floor }) => floor), excess);
175
+ lowered.forEach(({ column }, index) => {
176
+ column.width = widths[index];
177
+ column.softMinWidth = Math.min(column.softMinWidth, widths[index]);
178
+ });
179
+ }
180
+ }
181
+ const sum = total(layouts2);
182
+ layouts2.forEach((column) => {
183
+ column.ratio = column.width / sum;
184
+ });
185
+ return layouts2;
186
+ }
187
+
188
+ // src/shared/number-reading.mjs
189
+ function rawCellValue(cell) {
190
+ return (cell?.dataset.sortValue ?? cell?.textContent ?? "").trim();
191
+ }
192
+ var missingValues = /* @__PURE__ */ new Set(["", "-", "\u2014", "\u2013", "\u2212", "n/a", "na", "null"]);
193
+ function isMissingValue(raw) {
194
+ return missingValues.has(raw.toLowerCase());
195
+ }
196
+ var QUALIFIER = String.raw`(?:约|大约|近|超过|不足|≈|~|<=?|>=?|≤|≥|±)?`;
197
+ var AMOUNT = String.raw`[$¥€£₩₹]?\s*((?:\d{1,3}(?:[,\s\u00a0\u2009]\d{3})+|\d{1,4}(?:,\d{4})+|\d+)(?:\.\d*)?(?:e[+-]?\d+)?|\.\d+)`;
198
+ var UNIT = String.raw`((?:[%‰x×]|[A-Za-zµμ\u4e00-\u9fff°℃]+(?:\/[A-Za-zµμ\u4e00-\u9fff°℃·]+)?)?)`;
199
+ var UNIT_SCALES = { \u5343: 1e3, \u4E07: 1e4, \u4EBF: 1e8 };
200
+ var SCALE = UNIT_SCALES;
201
+ var SINGLE = new RegExp(`^${QUALIFIER}\\s*([+-]?)\\s*${AMOUNT}\\s*${UNIT}$`, "i");
202
+ var RANGE = new RegExp(`^([+-]?)\\s*${AMOUNT}\\s*${UNIT}\\s*(?:-|~|\u81F3|\u5230)\\s*[+-]?\\s*${AMOUNT}\\s*${UNIT}$`, "i");
203
+ function numberReading(raw) {
204
+ let text = raw.normalize("NFKC").trim().replace(/[−–—]/g, "-");
205
+ const accounting = /^\((.+)\)$/.exec(text);
206
+ if (accounting) text = accounting[1].trim();
207
+ const single = SINGLE.exec(text);
208
+ const match = single ?? RANGE.exec(text);
209
+ if (!match) return null;
210
+ const value = Number(`${match[1]}${match[2].replace(/[,\s\u00a0\u2009]/g, "")}`);
211
+ const written = accounting ? -value : value;
212
+ const unit = match[3] ?? "";
213
+ const scaled = written * (SCALE[unit[0]] ?? 1);
214
+ if (!Number.isFinite(scaled)) return null;
215
+ return single ? { value: scaled, written, unit } : { value: scaled, written, unit, range: true };
216
+ }
217
+ function numberValue(raw) {
218
+ return numberReading(raw)?.value ?? null;
219
+ }
220
+ function numericParts(cell) {
221
+ const raw = rawCellValue(cell);
222
+ if (isMissingValue(raw)) return null;
223
+ const scalar = numberValue(raw);
224
+ if (scalar !== null) return [scalar];
225
+ const tokens = raw.split(/\s*\/\s*/);
226
+ if (tokens.length < 2) return null;
227
+ const values = tokens.map(numberValue);
228
+ return values.every((value) => value !== null) ? values : null;
229
+ }
230
+ function parsedValue(cell, type) {
231
+ const raw = rawCellValue(cell);
232
+ if (isMissingValue(raw)) return null;
233
+ if (type === "number") {
234
+ const values = numericParts(cell);
235
+ return values?.length === 1 ? values[0] : null;
236
+ }
237
+ if (type === "date") {
238
+ const value = Date.parse(raw);
239
+ return Number.isFinite(value) ? value : null;
240
+ }
241
+ return raw;
242
+ }
243
+
244
+ // src/render/kit/tables/cells.js
245
+ function elementFor(target) {
246
+ const element = typeof target === "string" ? document.querySelector(target) : target;
247
+ if (!(element instanceof HTMLTableElement)) {
248
+ throw new Error("DocTables target must be a table element.");
249
+ }
250
+ return element;
251
+ }
252
+ var wrapperOf = (table) => table.parentElement?.classList.contains("doc-table-wrap") ? table.parentElement : null;
253
+ var numbersOff = (table) => table.getAttribute("data-number-columns") === "off" || wrapperOf(table)?.getAttribute("data-number-columns") === "off";
254
+ var mergedCells = (table) => [...table.tHead?.rows || [], ...Array.from(table.tBodies).flatMap((body) => [...body.rows])].some((row) => Array.from(row.cells).some((cell) => cell.rowSpan !== 1 || cell.colSpan !== 1));
255
+ function tableRows(table) {
256
+ return Array.from(table.tBodies).flatMap((body) => Array.from(body.rows));
257
+ }
258
+ var footRows = (table) => Array.from(table.tFoot?.rows || []);
259
+ function footColumns(table) {
260
+ const columns = /* @__PURE__ */ new Map();
261
+ const rows = footRows(table);
262
+ if (rows.some((row) => Array.from(row.cells).some((cell) => cell.rowSpan !== 1))) return columns;
263
+ for (const row of rows) {
264
+ let column = 0;
265
+ for (const cell of row.cells) {
266
+ if (cell.colSpan === 1) columns.set(column, [...columns.get(column) || [], cell]);
267
+ column += cell.colSpan;
268
+ }
269
+ }
270
+ return columns;
271
+ }
272
+ function cellText(cell) {
273
+ return cell.textContent.trim();
274
+ }
275
+ var RUN = /\/*[^\s/]+\/*|\/+|\s+/g;
276
+ var CODE_RUN = "doc-code-run";
277
+ var NAME_BREAK = /(?<=[^.\s]\.)(?=[^.])|(?<=[^_./\s])(?=_+[A-Za-z0-9])|(?<=[a-z0-9])(?=[A-Z])/;
278
+ var codeRuns = (text) => text.match(RUN) ?? [];
279
+ var runParts = (run) => run.split(NAME_BREAK);
280
+ function splitCodeRuns(table) {
281
+ for (const code of table.querySelectorAll("td code, th code")) {
282
+ if (code.closest("[contenteditable]") || code.querySelector(`.${CODE_RUN}`) || !code.textContent.trim() || [...code.childNodes].some((node) => node.nodeType !== Node.TEXT_NODE)) continue;
283
+ const doc = code.ownerDocument;
284
+ const pieces = codeRuns(code.textContent);
285
+ code.replaceChildren(...pieces.flatMap((piece, index) => {
286
+ if (!piece.trim()) return [doc.createTextNode(piece)];
287
+ const run = doc.createElement("span");
288
+ run.className = CODE_RUN;
289
+ run.replaceChildren(...runParts(piece).flatMap((part, at) => at ? [doc.createElement("wbr"), doc.createTextNode(part)] : [doc.createTextNode(part)]));
290
+ return piece.endsWith("/") && index < pieces.length - 1 ? [run, doc.createElement("wbr")] : [run];
291
+ }));
292
+ }
293
+ }
294
+ function joinCodeRuns(root) {
295
+ for (const code of new Set([...root.querySelectorAll(`.${CODE_RUN}`)].map((run) => run.parentElement))) code.textContent = code.textContent;
296
+ }
297
+ var TEXT_SORTS = /* @__PURE__ */ new Set(["text", "date"]);
298
+ function inferColumnSemantics(table) {
299
+ const headers = Array.from(table.tHead?.rows[0]?.cells || []);
300
+ const rows = tableRows(table);
301
+ if (mergedCells(table) || numbersOff(table)) {
302
+ table.querySelectorAll(".number").forEach((cell) => cell.classList.remove("number"));
303
+ headers.forEach((header) => {
304
+ if (header.dataset.sortType === "number") delete header.dataset.sortType;
305
+ });
306
+ return [];
307
+ }
308
+ if (headers.length === 0 || rows.length === 0) return [];
309
+ const numericColumns = [];
310
+ const foot = footColumns(table);
311
+ headers.forEach((header, index) => {
312
+ const cells = rows.map((row) => row.cells[index]).filter(Boolean);
313
+ if (cells.length === 0) return;
314
+ const observedCells = cells.filter((cell) => !isMissingValue(rawCellValue(cell)));
315
+ const inferredNumericDisplay = !TEXT_SORTS.has(header.dataset.sortType) && observedCells.length > 0 && observedCells.every((cell) => numericParts(cell) !== null);
316
+ const inferredSortableNumber = inferredNumericDisplay && observedCells.every((cell) => parsedValue(cell, "number") !== null);
317
+ header.classList.toggle("number", inferredNumericDisplay);
318
+ cells.forEach((cell) => cell.classList.toggle("number", inferredNumericDisplay));
319
+ (foot.get(index) || []).forEach((cell) => cell.classList.toggle(
320
+ "number",
321
+ inferredNumericDisplay && (isMissingValue(rawCellValue(cell)) || numericParts(cell) !== null)
322
+ ));
323
+ if (!inferredSortableNumber) {
324
+ if (header.dataset.sortType === "number") delete header.dataset.sortType;
325
+ if (inferredNumericDisplay) numericColumns.push(index);
326
+ return;
327
+ }
328
+ numericColumns.push(index);
329
+ if (!header.dataset.sortType && !header.hasAttribute("data-sort-ignore")) {
330
+ header.dataset.sortType = "number";
331
+ }
332
+ });
333
+ return numericColumns;
334
+ }
335
+
336
+ // src/shared/table-slots.mjs
337
+ function tileSlots(rows) {
338
+ const matrix = rows.map(() => []);
339
+ const places = /* @__PURE__ */ new Map();
340
+ for (let r = 0; r < rows.length; r++) {
341
+ let c = 0;
342
+ for (const { ref, rowspan, colspan } of rows[r].cells) {
343
+ while (matrix[r][c]) c++;
344
+ if (!(rowspan >= 1) || !(colspan >= 1)) return null;
345
+ for (let i = 0; i < rowspan; i++) {
346
+ if (rows[r + i]?.section !== rows[r].section) return null;
347
+ for (let j = 0; j < colspan; j++) {
348
+ if (matrix[r + i][c + j]) return null;
349
+ matrix[r + i][c + j] = ref;
350
+ }
351
+ }
352
+ places.set(ref, { r, c, rows: rowspan, cols: colspan });
353
+ c += colspan;
354
+ }
355
+ }
356
+ const columns = matrix[0]?.length ?? 0;
357
+ if (columns === 0 || matrix.some((row) => row.length !== columns || row.includes(void 0))) return null;
358
+ return { matrix, places, columns };
359
+ }
360
+ var slotsOf = (rows) => tileSlots(rows.map((row) => ({ section: row.parentElement, cells: [...row.cells].map((cell) => ({ ref: cell, rowspan: cell.rowSpan, colspan: cell.colSpan })) })));
361
+ var columnCells = (slots, c) => [...slots.places].filter(([, place]) => place.c === c && place.cols === 1).map(([ref]) => ref);
362
+ var columnWidths = (slots, widthOf) => Array.from({ length: slots.columns }, (_, c) => {
363
+ for (const cell of columnCells(slots, c)) {
364
+ const width = widthOf(cell);
365
+ if (width) return width;
366
+ }
367
+ return null;
368
+ });
369
+
370
+ // src/render/kit/tables/edges.js
371
+ var EDGE = "data-doc-edge";
372
+ function markEdges(table) {
373
+ const rows = [...table.rows];
374
+ const edges = /* @__PURE__ */ new Map();
375
+ const spans = table.parentElement?.classList.contains("doc-table-wrap") && rows.some((row) => [...row.cells].some((cell) => cell.rowSpan !== 1));
376
+ const slots = spans ? slotsOf(rows) : null;
377
+ if (slots) {
378
+ for (const [cell, { r, c, rows: down, cols }] of slots.places) {
379
+ const sides = [c + cols === slots.columns && "right", r + down === rows.length && "bottom"].filter(Boolean).join(" ");
380
+ if (sides) edges.set(cell, sides);
381
+ }
382
+ }
383
+ for (const cell of table.querySelectorAll(`:scope > * > tr > [${EDGE}]`)) if (!edges.has(cell)) cell.removeAttribute(EDGE);
384
+ for (const [cell, sides] of edges) if (cell.getAttribute(EDGE) !== sides) cell.setAttribute(EDGE, sides);
385
+ }
386
+
387
+ // src/shared/table-hides.mjs
388
+ function cellColumns(table) {
389
+ const taken = [];
390
+ const columnOf = /* @__PURE__ */ new Map();
391
+ let columns = 0;
392
+ [...table.rows].forEach((row, r) => {
393
+ let c = 0;
394
+ for (const cell of row.cells) {
395
+ while (taken[r]?.[c]) c++;
396
+ const across = Math.max(1, cell.colSpan);
397
+ for (let i = 0; i < Math.max(1, cell.rowSpan); i++) for (let j = 0; j < across; j++) (taken[r + i] ??= [])[c + j] = true;
398
+ columnOf.set(cell, c + across - 1);
399
+ c += across;
400
+ columns = Math.max(columns, c);
401
+ }
402
+ });
403
+ return { columnOf, columns };
404
+ }
405
+ function wordsBox(cell) {
406
+ const boxes = [];
407
+ const range = document.createRange();
408
+ const walker = document.createTreeWalker(cell, NodeFilter.SHOW_TEXT);
409
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) {
410
+ if (!node.nodeValue.trim() || node.parentElement?.closest(".katex-mathml")) continue;
411
+ range.selectNodeContents(node);
412
+ boxes.push(...range.getClientRects());
413
+ }
414
+ for (const element of cell.querySelectorAll("img, svg, canvas, input, video")) boxes.push(element.getBoundingClientRect());
415
+ const drawn = boxes.filter((box) => box.width > 0 || box.height > 0);
416
+ if (drawn.length === 0) return null;
417
+ return {
418
+ left: Math.min(...drawn.map((box) => box.left)),
419
+ right: Math.max(...drawn.map((box) => box.right)),
420
+ top: Math.min(...drawn.map((box) => box.top)),
421
+ bottom: Math.max(...drawn.map((box) => box.bottom))
422
+ };
423
+ }
424
+ function tableHides(wrapper, table) {
425
+ const width = wrapper.clientWidth;
426
+ const height = wrapper.clientHeight;
427
+ const box = table.getBoundingClientRect();
428
+ const holds = (cell) => Boolean((cell.textContent ?? "").trim() || cell.querySelector("img, svg, canvas, input, video"));
429
+ const { columnOf, columns } = cellColumns(table);
430
+ const fixed = table.classList.contains("doc-table--sticky-first") || Boolean(table.querySelector(':scope > tbody > tr > th[scope="row"]:first-child'));
431
+ const before = /* @__PURE__ */ new Set();
432
+ const past = /* @__PURE__ */ new Set();
433
+ const names = [];
434
+ let reach = 0;
435
+ for (const row of table.rows) {
436
+ if (row.getClientRects().length === 0) continue;
437
+ for (const cell of row.cells) {
438
+ const column = columnOf.get(cell);
439
+ if (names[column] === void 0 && cell.colSpan <= 1 && holds(cell)) names[column] = (cell.textContent ?? "").replace(/\s+/g, " ").trim();
440
+ if (fixed && column === 0) continue;
441
+ if (cell.getBoundingClientRect().right - box.left <= width + 1) {
442
+ if (holds(cell)) before.add(column);
443
+ continue;
444
+ }
445
+ const found = wordsBox(cell);
446
+ if (!found) continue;
447
+ if (found.left - box.left < width - 1) before.add(column);
448
+ if (found.right - box.left > width + 1) {
449
+ past.add(column);
450
+ reach = Math.max(reach, found.right - box.left);
451
+ }
452
+ }
453
+ }
454
+ const named = (column) => ({ column, name: names[column] ?? "" });
455
+ const away = [...past].filter((column) => !before.has(column)).sort((a, b) => a - b).map(named);
456
+ const cut = [...past].filter((column) => before.has(column)).sort((a, b) => a - b).map(named);
457
+ const quoted = (list) => `${list.slice(0, 4).map(({ column, name }) => name ? `"${name.length > 16 ? `${name.slice(0, 15)}\u2026` : name}"` : `column ${column + 1}`).join(", ")}${list.length > 4 ? ", \u2026" : ""}`;
458
+ const parts = [cut.length && `${cut.length} cut at the frame's edge (${quoted(cut)})`, away.length && `${away.length} out of sight (${quoted(away)})`].filter(Boolean);
459
+ const rows = [...table.tBodies].flatMap((body) => [...body.rows]).filter((row) => row.getClientRects().length > 0);
460
+ const shown = rows.filter((row) => {
461
+ const { top, bottom } = row.getBoundingClientRect();
462
+ if (bottom - box.top <= height + 1) return true;
463
+ if (top - box.top >= height - 1) return false;
464
+ return Math.max(-Infinity, ...[...row.cells].map(wordsBox).filter(Boolean).map((found) => found.bottom)) - box.top <= height + 1;
465
+ }).length;
466
+ return { columns, away, cut, said: parts.length ? `of ${columns} columns, ${parts.join(", ")}` : "", reach, rows: rows.length, shown };
467
+ }
468
+
469
+ // src/render/kit/tables/sticky.js
470
+ function fixedFirstCell(table) {
471
+ return table.classList.contains("doc-table--sticky-first") ? table.rows[0]?.cells[0] ?? null : table.querySelector(':scope > tbody > tr > th[scope="row"]:first-child');
472
+ }
473
+
474
+ // src/render/kit/tables/scrollbars.js
475
+ var global = globalThis;
476
+ var RAIL = 12;
477
+ var MIN_THUMB = 24;
478
+ var scrollbars = /* @__PURE__ */ new WeakMap();
479
+ var probe = globalThis.document?.createElement("div");
480
+ function setStyle(element, property, value) {
481
+ probe.style.setProperty(property, value);
482
+ if (element.style.getPropertyValue(property) !== probe.style.getPropertyValue(property)) element.style.setProperty(property, value);
483
+ }
484
+ function drawScrollbars(wrapper, table) {
485
+ if (scrollbars.has(wrapper)) return;
486
+ let node = wrapper.querySelector(":scope > .doc-scrollbars");
487
+ if (!node) {
488
+ node = document.createElement("div");
489
+ node.className = "doc-scrollbars";
490
+ node.setAttribute("aria-hidden", "true");
491
+ node.innerHTML = '<div class="doc-scrollbar doc-scrollbar--y"><div class="doc-scrollbar-thumb"></div></div><div class="doc-scrollbar doc-scrollbar--x"><div class="doc-scrollbar-thumb"></div></div>';
492
+ wrapper.prepend(node);
493
+ }
494
+ let frame = node.querySelector(":scope > .doc-scrollbars-frame");
495
+ if (!frame) {
496
+ frame = document.createElement("div");
497
+ frame.className = "doc-scrollbars-frame";
498
+ node.prepend(frame);
499
+ }
500
+ const bars = { node, table, frame, y: node.querySelector(".doc-scrollbar--y"), x: node.querySelector(".doc-scrollbar--x"), timer: 0, axes: {}, noted: "", reach: 0 };
501
+ scrollbars.set(wrapper, bars);
502
+ wrapper.addEventListener("scroll", () => {
503
+ placeScrollbars(wrapper);
504
+ bars.node.setAttribute("data-active", "");
505
+ clearTimeout(bars.timer);
506
+ bars.timer = setTimeout(() => bars.node.removeAttribute("data-active"), 900);
507
+ }, { passive: true });
508
+ wrapper.addEventListener("wheel", (event) => passOn(wrapper, event), { passive: true });
509
+ const observer = new ResizeObserver(() => placeScrollbars(wrapper));
510
+ observer.observe(wrapper);
511
+ observer.observe(table);
512
+ }
513
+ function placeScrollbars(wrapper, { renote = false } = {}) {
514
+ const bars = scrollbars.get(wrapper);
515
+ if (!bars) return;
516
+ const { table } = bars;
517
+ const { clientWidth: width, clientHeight: height, offsetWidth, offsetHeight } = wrapper;
518
+ const content = { width: Math.max(width, table.offsetWidth), height: Math.max(height, table.offsetHeight) };
519
+ setStyle(bars.frame, "width", `${offsetWidth}px`);
520
+ setStyle(bars.frame, "height", `${offsetHeight}px`);
521
+ const x = content.width - width > 1, y = content.height - height > 1;
522
+ const sizes = `${width}x${height}:${content.width}x${content.height}`;
523
+ if (width > 0 && (renote || sizes !== bars.noted)) {
524
+ bars.noted = sizes;
525
+ bars.reach = noteHidden(wrapper, table);
526
+ }
527
+ bars.node.toggleAttribute("data-more", x && wrapper.scrollLeft + width < bars.reach - 1);
528
+ const style = getComputedStyle(wrapper);
529
+ const corner = (radius, border) => Math.max(0, (parseFloat(style[radius]) || 0) - (parseFloat(style[border]) || 0));
530
+ const header = table.tHead?.getBoundingClientRect().height || 0;
531
+ const first = fixedFirstCell(table)?.getBoundingClientRect().width || 0;
532
+ const place = (rail, start, end, fixed, view, total2, at) => {
533
+ const track = Math.max(0, end - start);
534
+ const size = Math.min(track, Math.max(MIN_THUMB, track * Math.max(0, view - fixed) / (total2 - fixed)));
535
+ const range = total2 - view;
536
+ setStyle(rail, "--doc-scrollbar-track", `${track}px`);
537
+ setStyle(rail, "--doc-scrollbar-thumb-size", `${size}px`);
538
+ setStyle(rail, "--doc-scrollbar-thumb-at", `${(track - size) * Math.min(1, Math.max(0, at / range))}px`);
539
+ return { track, size, range };
540
+ };
541
+ bars.node.toggleAttribute("data-x", x);
542
+ bars.node.toggleAttribute("data-y", y);
543
+ if (y) {
544
+ const start = Math.max(header, corner("borderTopRightRadius", "borderTopWidth"));
545
+ const end = height - Math.max(corner("borderBottomRightRadius", "borderBottomWidth"), x ? RAIL : 0);
546
+ setStyle(bars.y, "left", `${width - RAIL}px`);
547
+ setStyle(bars.y, "top", `${start}px`);
548
+ bars.axes.y = place(bars.y, start, end, header, height, content.height, wrapper.scrollTop);
549
+ }
550
+ if (x) {
551
+ const start = Math.max(first, corner("borderBottomLeftRadius", "borderLeftWidth"));
552
+ const end = width - Math.max(corner("borderBottomRightRadius", "borderRightWidth"), y ? RAIL : 0);
553
+ setStyle(bars.x, "left", `${start}px`);
554
+ setStyle(bars.x, "top", `${height - RAIL}px`);
555
+ bars.axes.x = place(bars.x, start, end, first, width, content.width, wrapper.scrollLeft);
556
+ }
557
+ }
558
+ function noteHidden(wrapper, table) {
559
+ const notes = [];
560
+ const hides = tableHides(wrapper, table);
561
+ if (hides.said) notes.push(`columns-hidden: ${hides.said} (scroll sideways)`);
562
+ if (hides.shown < hides.rows) notes.push(`rows-hidden: the frame shows ${hides.shown} of ${hides.rows} rows (scroll down)`);
563
+ const said = notes.join("\n");
564
+ if (said && wrapper.getAttribute("data-doc-layout") !== said) wrapper.setAttribute("data-doc-layout", said);
565
+ else if (!said && wrapper.hasAttribute("data-doc-layout")) wrapper.removeAttribute("data-doc-layout");
566
+ return hides.reach;
567
+ }
568
+ function passOn(wrapper, event) {
569
+ if (event.ctrlKey || !event.deltaY || getComputedStyle(wrapper).overscrollBehaviorBlock !== "none") return;
570
+ const atTop = wrapper.scrollTop <= 0;
571
+ const atEnd = wrapper.scrollTop + wrapper.clientHeight >= wrapper.scrollHeight - 1;
572
+ if (!(event.deltaY < 0 ? atTop : atEnd)) return;
573
+ const delta = event.deltaY * (event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? innerHeight : 1);
574
+ for (let node = wrapper.parentElement; node && node !== document.body; node = node.parentElement) {
575
+ const { overflowY } = getComputedStyle(node);
576
+ if ((overflowY === "auto" || overflowY === "scroll") && node.scrollHeight > node.clientHeight + 1) return node.scrollBy({ top: delta, behavior: "instant" });
577
+ }
578
+ global.scrollBy({ top: delta, behavior: "instant" });
579
+ }
580
+ global.addEventListener("pointerdown", (event) => {
581
+ const rail = event.button === 0 ? event.target.closest?.(".doc-scrollbar") : null;
582
+ const wrapper = rail?.parentElement.parentElement;
583
+ if (!scrollbars.has(wrapper) || document.documentElement.hasAttribute("data-ge-resize")) return;
584
+ event.preventDefault();
585
+ event.stopPropagation();
586
+ const vertical = rail.classList.contains("doc-scrollbar--y");
587
+ const property = vertical ? "scrollTop" : "scrollLeft";
588
+ const along = (pointer) => vertical ? pointer.clientY - rail.getBoundingClientRect().top : pointer.clientX - rail.getBoundingClientRect().left;
589
+ const { track = 0, size = 0, range = 0 } = scrollbars.get(wrapper).axes[vertical ? "y" : "x"] ?? {};
590
+ const perPixel = track > size ? range / (track - size) : 0;
591
+ if (event.target === rail) wrapper[property] = (along(event) - size / 2) * perPixel;
592
+ const start = { pointer: along(event), scroll: wrapper[property] };
593
+ rail.setAttribute("data-drag", "");
594
+ rail.setPointerCapture?.(event.pointerId);
595
+ const move = (moved) => {
596
+ wrapper[property] = start.scroll + (along(moved) - start.pointer) * perPixel;
597
+ };
598
+ const end = () => {
599
+ rail.removeAttribute("data-drag");
600
+ rail.removeEventListener("pointermove", move);
601
+ rail.removeEventListener("pointerup", end);
602
+ rail.removeEventListener("pointercancel", end);
603
+ };
604
+ rail.addEventListener("pointermove", move);
605
+ rail.addEventListener("pointerup", end);
606
+ rail.addEventListener("pointercancel", end);
607
+ }, true);
608
+
609
+ // src/render/kit/tables/whole.js
610
+ var WHOLE_ROWS = 20;
611
+ function shownWhole(rows, columns) {
612
+ if (rows <= WHOLE_ROWS) return true;
613
+ const all = columns.reduce((sum, column) => sum + column.width, 0);
614
+ const words = columns.reduce((sum, column) => sum + (column.words ? column.width : 0), 0);
615
+ return all > 0 && words * 2 >= all;
616
+ }
617
+
618
+ // src/render/kit/tables/layout.js
619
+ var COLUMN_FLOOR = 120;
620
+ var COLUMN_NATURAL_MAX = 240;
621
+ var NARROW = "(max-width: 420px)";
622
+ var CODE_RUN_MAX = 320;
623
+ var WIDE = "\u2014\u3000-\u30FF\u3400-\u9FFF\uAC00-\uD7AF\uF900-\uFAFF\uFF00-\uFFEF";
624
+ var NATIVE_BREAKS = new RegExp(`(?<=-)|(?<=[${WIDE}])|(?=[${WIDE}])`, "u");
625
+ var layouts = /* @__PURE__ */ new WeakMap();
626
+ var layoutObservers = /* @__PURE__ */ new WeakMap();
627
+ var pendingLayouts = /* @__PURE__ */ new Set();
628
+ var layoutFrame = 0;
629
+ var fontOf = (style) => `${style.fontStyle || "normal"} ${style.fontWeight || "400"} ${style.fontSize || "15px"} ${style.fontFamily || "system-ui"}`;
630
+ function fontFor(element) {
631
+ return fontOf(getComputedStyle(element));
632
+ }
633
+ var familyName = (name) => name.trim().replace(/^(["'])(.*)\1$/, "$2").toLowerCase();
634
+ var familiesOf = (list) => list.split(",").map(familyName).filter(Boolean);
635
+ var measurers = /* @__PURE__ */ new Map();
636
+ function measurerFor(font, family) {
637
+ let measurer = measurers.get(font);
638
+ if (!measurer) measurers.set(font, measurer = { measure: createTextMeasurer(font), families: familiesOf(family) });
639
+ return measurer.measure;
640
+ }
641
+ function forgetMeasurers(faces) {
642
+ if (!faces) return measurers.clear();
643
+ const loaded = new Set(faces.map((face) => familyName(String(face.family ?? ""))));
644
+ for (const [font, { families }] of [...measurers]) if (families.some((name) => loaded.has(name))) measurers.delete(font);
645
+ }
646
+ globalThis.document?.fonts?.addEventListener?.("loadingdone", (event) => forgetMeasurers([...event.fontfaces ?? []]));
647
+ globalThis.document?.fonts?.ready.then(() => forgetMeasurers());
648
+ var cellMeasures = /* @__PURE__ */ new WeakMap();
649
+ var measuredRatio = globalThis.devicePixelRatio;
650
+ function sameZoom() {
651
+ if (globalThis.devicePixelRatio === measuredRatio) return;
652
+ measuredRatio = globalThis.devicePixelRatio;
653
+ measurers.clear();
654
+ cellMeasures = /* @__PURE__ */ new WeakMap();
655
+ }
656
+ var measuredFamilies = /* @__PURE__ */ new WeakMap();
657
+ var forgetMeasures = (table) => cellMeasures.delete(table);
658
+ function fontsChange(table, faces) {
659
+ const families = measuredFamilies.get(table);
660
+ if (!faces || !families) return "words";
661
+ const names = faces.map((face) => familyName(String(face.family ?? "")));
662
+ if (names.some((name) => families.has(name))) return "words";
663
+ return names.some((name) => name.startsWith("katex")) && table.querySelector(".katex") ? "formulas" : "";
664
+ }
665
+ function cellPaddingFor(style) {
666
+ return (parseFloat(style.paddingLeft || "12px") || 0) + (parseFloat(style.paddingRight || "12px") || 0) + (parseFloat(style.borderLeftWidth) || 0) + (parseFloat(style.borderRightWidth) || 0);
667
+ }
668
+ var tabularDigits = /* @__PURE__ */ new Map();
669
+ function tabularDigitWidth(font) {
670
+ if (!tabularDigits.has(font)) {
671
+ const probe2 = document.createElement("span");
672
+ probe2.style.cssText = `position:absolute;visibility:hidden;white-space:pre;font:${font};font-variant-numeric:tabular-nums`;
673
+ probe2.textContent = "0123456789";
674
+ document.body.append(probe2);
675
+ tabularDigits.set(font, probe2.getBoundingClientRect().width / 10);
676
+ probe2.remove();
677
+ }
678
+ return tabularDigits.get(font);
679
+ }
680
+ function codeEdges(style) {
681
+ return (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0) + (parseFloat(style.borderLeftWidth) || 0) + (parseFloat(style.borderRightWidth) || 0);
682
+ }
683
+ function contextOf(table) {
684
+ const root = document.documentElement;
685
+ const classes = [...table.classList].filter((name) => name !== "doc-table--auto").join(" ");
686
+ return `${classes}${wrapperOf(table)?.className ?? ""}${root.getAttribute("data-doc-theme") ?? ""}|${root.getAttribute("data-doc-width") ?? ""}`;
687
+ }
688
+ function createCellMeasurer(table) {
689
+ sameZoom();
690
+ const styles = /* @__PURE__ */ new Map();
691
+ const kept = cellMeasures.get(table);
692
+ const measured = /* @__PURE__ */ new Map();
693
+ const families = /* @__PURE__ */ new Set();
694
+ const context = contextOf(table);
695
+ let using = null;
696
+ const styleOf = (element) => {
697
+ let style = styles.get(element);
698
+ if (!style) {
699
+ const computed = getComputedStyle(element);
700
+ style = { computed, font: fontOf(computed), family: computed.fontFamily || "system-ui", spacing: parseFloat(computed.letterSpacing) || 0, tabular: /tabular-nums/.test(computed.fontVariantNumeric || "") };
701
+ styles.set(element, style);
702
+ }
703
+ return style;
704
+ };
705
+ const widthOf = (text, parent) => {
706
+ const { font, family, spacing, tabular } = styleOf(parent);
707
+ using?.add(family);
708
+ const measureText = measurerFor(font, family);
709
+ const digits = tabular ? text.replace(/\D/g, "").length : 0;
710
+ return (digits ? measureText(text.replace(/\d/g, "")) + digits * tabularDigitWidth(font) : measureText(text)) + Math.max(0, text.length - 1) * spacing;
711
+ };
712
+ const cellKey = (cell) => {
713
+ if (cell.querySelector(".katex")) return null;
714
+ const { computed, font } = styleOf(cell);
715
+ return `${context}${cell.className}${cell.getAttribute("style") ?? ""}${font}|${computed.letterSpacing}|${computed.fontVariantNumeric}|${computed.paddingLeft}|${computed.paddingRight}|${computed.borderLeftWidth}|${computed.borderRightWidth}${cell.innerHTML}`;
716
+ };
717
+ const measureCell = (cell) => {
718
+ let entry = measured.get(cell);
719
+ if (!entry) {
720
+ const key = cellKey(cell);
721
+ const before = key === null ? null : kept?.get(cell);
722
+ if (before && before.key === key) entry = before;
723
+ else {
724
+ using = /* @__PURE__ */ new Set();
725
+ entry = { key, result: measureWords(cell), families: using };
726
+ using = null;
727
+ }
728
+ measured.set(cell, entry);
729
+ entry.families.forEach((family) => families.add(family));
730
+ }
731
+ return entry.result;
732
+ };
733
+ const measure = (cell) => measureCell(cell).width;
734
+ measure.least = (cell) => measureCell(cell).least;
735
+ measure.run = (cell) => measureCell(cell).run;
736
+ measure.word = (cell) => measureCell(cell).word;
737
+ measure.piece = (cell) => measureCell(cell).piece;
738
+ measure.done = () => {
739
+ if (measured.size === 0) return measuredFamilies.delete(table);
740
+ cellMeasures.set(table, new Map([...measured].filter(([, entry]) => entry.key !== null)));
741
+ measuredFamilies.set(table, new Set([...families].flatMap(familiesOf)));
742
+ };
743
+ return measure;
744
+ function measureWords(cell) {
745
+ let line = 0, widest = 0, lastSpace = true, run = 0;
746
+ const word = { now: 0, widest: 0 }, piece = { now: 0, widest: 0 };
747
+ const along = (part, width, restart) => {
748
+ part.now = (restart ? 0 : part.now) + width;
749
+ part.widest = Math.max(part.widest, part.now);
750
+ };
751
+ const content = cell;
752
+ const walk = (node) => {
753
+ if (node.nodeType === Node.TEXT_NODE) {
754
+ let text = node.textContent.replace(/\s+/g, " ");
755
+ if (lastSpace) text = text.replace(/^ /, "");
756
+ if (!text) return;
757
+ const parent = node.parentElement;
758
+ const width = widthOf(text, parent);
759
+ line += width;
760
+ lastSpace = text.endsWith(" ");
761
+ if (parent.closest(".doc-range")) {
762
+ run = Math.max(run, width);
763
+ along(word, width, false);
764
+ along(piece, width, false);
765
+ return;
766
+ }
767
+ text.split(WORD_BREAKS).forEach((part, index) => along(word, widthOf(part, parent), index > 0));
768
+ text.split(PIECE_BREAKS).forEach((part, index) => along(piece, widthOf(part, parent), index > 0));
769
+ return;
770
+ }
771
+ if (node.nodeType !== Node.ELEMENT_NODE) return;
772
+ if (node.tagName === "BR") {
773
+ widest = Math.max(widest, line);
774
+ line = 0;
775
+ lastSpace = true;
776
+ word.now = piece.now = 0;
777
+ return;
778
+ }
779
+ if (node.classList.contains("katex")) {
780
+ const drawn = [...node.getClientRects()].reduce((sum, rect) => sum + rect.width, 0);
781
+ line += drawn;
782
+ along(word, drawn, false);
783
+ along(piece, drawn, false);
784
+ lastSpace = false;
785
+ return;
786
+ }
787
+ if (node.classList.contains("doc-link-mention-icon")) {
788
+ const { computed } = styleOf(node);
789
+ const drawn = (parseFloat(computed.width) || 0) + (parseFloat(computed.marginInlineEnd) || 0);
790
+ line += drawn;
791
+ along(word, drawn, false);
792
+ along(piece, drawn, false);
793
+ lastSpace = false;
794
+ return;
795
+ }
796
+ if (node.tagName === "UL" || node.tagName === "OL") {
797
+ widest = Math.max(widest, line);
798
+ const indent = parseFloat(styleOf(node).computed.paddingInlineStart) || 0;
799
+ for (const item of node.children) {
800
+ line = word.now = piece.now = indent;
801
+ lastSpace = true;
802
+ item.childNodes.forEach(walk);
803
+ widest = Math.max(widest, line);
804
+ }
805
+ line = word.now = piece.now = 0;
806
+ lastSpace = true;
807
+ return;
808
+ }
809
+ if (node.tagName === "CODE") {
810
+ const edges = codeEdges(styleOf(node).computed);
811
+ const runs = node.querySelector(`.${CODE_RUN}`) ? codeRuns(node.textContent) : node.textContent.split(/\s+/).flatMap((part) => part.split(NATIVE_BREAKS));
812
+ for (const part of runs) if (part.trim()) run = Math.max(run, widthOf(part, node) + edges);
813
+ }
814
+ if (node !== content) {
815
+ const style = styleOf(node).computed;
816
+ line += (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);
817
+ }
818
+ node.childNodes.forEach(walk);
819
+ };
820
+ walk(content);
821
+ const padding = cellPaddingFor(styleOf(cell).computed);
822
+ return {
823
+ width: Math.ceil(Math.max(widest, line) + padding),
824
+ least: run > 0 ? Math.ceil(Math.min(run, CODE_RUN_MAX) + padding) : 0,
825
+ run: run > 0 ? Math.ceil(run + padding) : 0,
826
+ word: Math.ceil(word.widest + padding),
827
+ piece: Math.ceil(piece.widest + padding)
828
+ };
829
+ }
830
+ }
831
+ function frameOf(table) {
832
+ const wrapper = wrapperOf(table);
833
+ const sized = Boolean(wrapper) && getComputedStyle(wrapper).getPropertyValue("--doc-span-width").trim() !== "";
834
+ const wider = sized ? Math.max(1, parseFloat(getComputedStyle(wrapper).getPropertyValue("--doc-span")) || 1) : 1;
835
+ return { wrapper, sized, wider, previousWidth: wrapper?.style.width };
836
+ }
837
+ function sizedInside({ wrapper, sized, wider }) {
838
+ if (!sized) return null;
839
+ wrapper.style.width = "";
840
+ const style = getComputedStyle(wrapper);
841
+ const inner = wrapper.clientWidth - (parseFloat(style.paddingLeft) || 0) - (parseFloat(style.paddingRight) || 0);
842
+ return inner > 0 ? { wider, inner } : null;
843
+ }
844
+ function frameEdges(wrapper) {
845
+ const style = getComputedStyle(wrapper);
846
+ return (parseFloat(style.borderLeftWidth) || 0) + (parseFloat(style.borderRightWidth) || 0) + (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);
847
+ }
848
+ var scratch = globalThis.document?.createElement("col");
849
+ function writeColgroup(table, columns) {
850
+ let colgroup = table.querySelector(":scope > colgroup[data-doc-columns]");
851
+ if (!colgroup) {
852
+ table.querySelectorAll(":scope > colgroup").forEach((node) => node.remove());
853
+ colgroup = document.createElement("colgroup");
854
+ colgroup.dataset.docColumns = "";
855
+ table.insertBefore(colgroup, table.firstElementChild?.tagName === "CAPTION" ? table.firstElementChild.nextSibling : table.firstElementChild);
856
+ }
857
+ const cols = colgroup.children;
858
+ const same = ({ width, key }, index) => {
859
+ const col = cols[index];
860
+ scratch.style.width = width;
861
+ return col.attributes.length === 2 && col.dataset.columnKey === key && col.style.width === scratch.style.width;
862
+ };
863
+ if (cols.length === columns.length && columns.every(same)) return;
864
+ colgroup.replaceChildren(...columns.map(({ width, key }) => {
865
+ const col = document.createElement("col");
866
+ col.style.width = width;
867
+ col.dataset.columnKey = key;
868
+ return col;
869
+ }));
870
+ }
871
+ function clearColumnMarks(table) {
872
+ table.querySelectorAll("[data-column-kind], [data-column-wrap], [data-run-wrap]").forEach((cell) => {
873
+ delete cell.dataset.columnKind;
874
+ cell.removeAttribute("data-column-wrap");
875
+ cell.removeAttribute("data-run-wrap");
876
+ });
877
+ }
878
+ var setAttribute = (element, name, value) => {
879
+ if (element.getAttribute(name) !== value) element.setAttribute(name, value);
880
+ };
881
+ var markRunWrap = (cell, width, measureCell) => cell.toggleAttribute("data-run-wrap", measureCell.run(cell) > width + 0.5);
882
+ function clearAuto(table, wrapper) {
883
+ table.classList.remove("doc-table--auto");
884
+ table.style.removeProperty("width");
885
+ table.querySelector("colgroup[data-doc-columns]")?.remove();
886
+ clearColumnMarks(table);
887
+ if (wrapper) {
888
+ wrapper.style.removeProperty("width");
889
+ delete wrapper.dataset.docMinWidth;
890
+ }
891
+ layouts.delete(table);
892
+ }
893
+ var tableSlots = (table) => slotsOf([...table.rows]);
894
+ var columnWidthOf = (cell) => {
895
+ const width = parseFloat(cell.style.getPropertyValue("--doc-column-width"));
896
+ return width > 0 ? width : null;
897
+ };
898
+ function manualWidths(table) {
899
+ const slots = tableSlots(table);
900
+ if (!slots) return null;
901
+ const widths = columnWidths(slots, columnWidthOf);
902
+ return widths.some((width) => width !== null) ? widths : null;
903
+ }
904
+ function manualLayout(table, frame, widths, measureCell) {
905
+ const { wrapper } = frame;
906
+ const slots = tableSlots(table);
907
+ const natural = widths.map((width, index) => width ?? Math.min(COLUMN_NATURAL_MAX, Math.max(COLUMN_FLOOR, ...columnCells(slots, index).map(measureCell))));
908
+ const frameSize = sizedInside(frame);
909
+ const scale = frameSize ? frameSize.inner * frameSize.wider / natural.reduce((sum, width) => sum + width, 0) : 1;
910
+ const sizes = natural.map((width) => width * scale);
911
+ const total2 = sizes.reduce((sum, width) => sum + width, 0);
912
+ table.classList.add("doc-table--auto");
913
+ table.style.width = `${total2}px`;
914
+ clearColumnMarks(table);
915
+ if (wrapper) {
916
+ const edges = frameEdges(wrapper);
917
+ setAttribute(wrapper, "data-doc-min-width", String(Math.min(total2, COLUMN_FLOOR) + edges));
918
+ if (!frameSize) {
919
+ wrapper.style.width = "100%";
920
+ const style = getComputedStyle(wrapper);
921
+ const available = wrapper.clientWidth - (parseFloat(style.paddingLeft) || 0) - (parseFloat(style.paddingRight) || 0);
922
+ wrapper.style.width = total2 < available ? `${total2 + edges}px` : "100%";
923
+ }
924
+ }
925
+ writeColgroup(table, sizes.map((width, index) => ({ width: `${width}px`, key: String(index) })));
926
+ layouts.set(table, sizes.map((width, index) => ({ key: String(index), kind: "compact", preferredWidth: width, softMinWidth: width, hardMinWidth: width, width, ratio: width / total2 })));
927
+ for (const [cell, { c, cols }] of slots?.places ?? []) markRunWrap(cell, sizes.slice(c, c + cols).reduce((sum, width) => sum + width, 0), measureCell);
928
+ }
929
+ function raiseNarrow(widths, room, floor) {
930
+ const low = widths.filter((width) => width < floor).sort((a, b) => a - b);
931
+ let level = floor;
932
+ if (low.reduce((sum, width) => sum + floor - width, 0) > room) {
933
+ let sum = 0;
934
+ for (let index = 0; index < low.length; index++) {
935
+ sum += low[index];
936
+ level = (room + sum) / (index + 1);
937
+ if (index === low.length - 1 || level <= low[index + 1]) break;
938
+ }
939
+ }
940
+ return widths.map((width) => Math.max(width, Math.min(level, floor)));
941
+ }
942
+ function refreshLayout(table) {
943
+ idleLayouts.delete(table);
944
+ const measure = createCellMeasurer(table);
945
+ layOut(table, measure);
946
+ measure.done();
947
+ markWhole(table);
948
+ const wrapper = wrapperOf(table);
949
+ if (wrapper) placeScrollbars(wrapper, { renote: true });
950
+ }
951
+ function layOut(table, measure) {
952
+ const headers = [...table.tHead?.rows[0]?.cells || []];
953
+ const rows = [...tableRows(table), ...footRows(table)];
954
+ const spanned = [...table.rows].some((row) => [...row.cells].some((cell) => cell.colSpan !== 1 || cell.rowSpan !== 1));
955
+ const frame = frameOf(table);
956
+ const manual = manualWidths(table);
957
+ if (manual) return manualLayout(table, frame, manual, measure);
958
+ const count = headers.length || rows[0]?.cells.length || 0;
959
+ if (!count || table.tHead && table.tHead.rows.length !== 1 || spanned) return nativeLayout(table, frame);
960
+ allocatedLayout(table, frame, headers, rows, count, measure);
961
+ }
962
+ var wholeTexts = /* @__PURE__ */ new WeakMap();
963
+ function markWhole(table) {
964
+ const wrapper = wrapperOf(table);
965
+ if (!wrapper) return;
966
+ const rows = bodyRows(table);
967
+ const whole = rows.length <= WHOLE_ROWS || mostlyWords(table, rows);
968
+ const was = wrapper.hasAttribute("data-doc-whole");
969
+ wrapper.toggleAttribute("data-doc-whole", whole);
970
+ if (was && !whole) keepCaret(wrapper);
971
+ }
972
+ function bodyRows(table) {
973
+ const rows = tableRows(table);
974
+ const headerCells = (row) => row.cells.length > 0 && [...row.cells].every((cell) => cell.tagName === "TH");
975
+ return !table.tHead && rows.length > 1 && headerCells(rows[0]) && !headerCells(rows[1]) ? rows.slice(1) : rows;
976
+ }
977
+ var textMeasurers = /* @__PURE__ */ new Map();
978
+ function mostlyWords(table, rows) {
979
+ const slots = slotsOf(rows);
980
+ const columns = [];
981
+ rows.forEach((row) => [...row.cells].forEach((cell, index) => {
982
+ const text2 = cellText(cell);
983
+ if (text2) (columns[slots ? slots.places.get(cell).c : index] ??= []).push(text2);
984
+ }));
985
+ const font = fontFor(rows[0]?.cells[0] || table);
986
+ const text = `${font}
987
+ ${columns.map((texts) => texts?.join("\n") ?? "").join("\f")}`;
988
+ const kept = wholeTexts.get(table);
989
+ if (kept?.text === text) return kept.whole;
990
+ if (!textMeasurers.has(font)) textMeasurers.set(font, createTextMeasurer(font));
991
+ const measure = textMeasurers.get(font);
992
+ const whole = shownWhole(rows.length, columns.filter(Boolean).map((texts) => ({
993
+ words: columnKind("", texts, measure) === "narrative",
994
+ width: texts.reduce((sum, each) => sum + measure(each), 0)
995
+ })));
996
+ wholeTexts.set(table, { text, whole });
997
+ return whole;
998
+ }
999
+ function keepCaret(wrapper) {
1000
+ const node = globalThis.getSelection?.()?.focusNode;
1001
+ const cell = (node?.nodeType === Node.ELEMENT_NODE ? node : node?.parentElement)?.closest("td, th");
1002
+ if (!cell || !wrapper.contains(cell)) return;
1003
+ const frame = wrapper.getBoundingClientRect();
1004
+ const below = cell.getBoundingClientRect().bottom - (frame.top + wrapper.clientTop + wrapper.clientHeight);
1005
+ if (below > 0) wrapper.scrollTop += below;
1006
+ }
1007
+ function nativeLayout(table, frame) {
1008
+ if (table.classList.contains("doc-table--auto")) clearAuto(table, frame.wrapper);
1009
+ const frameSize = sizedInside(frame);
1010
+ if (frameSize) {
1011
+ table.dataset.docFilled = "";
1012
+ table.style.width = frameSize.wider > 1 ? `${frameSize.inner * frameSize.wider}px` : "100%";
1013
+ } else if (table.hasAttribute("data-doc-filled")) {
1014
+ table.removeAttribute("data-doc-filled");
1015
+ table.style.removeProperty("width");
1016
+ }
1017
+ }
1018
+ function allocatedLayout(table, frame, headers, rows, count, measureCell) {
1019
+ table.removeAttribute("data-doc-filled");
1020
+ const { wrapper, sized, wider, previousWidth } = frame;
1021
+ const parent = wrapper || table.parentElement;
1022
+ if (!parent) return;
1023
+ if (wrapper) wrapper.style.width = sized ? "" : "100%";
1024
+ const style = getComputedStyle(parent);
1025
+ const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);
1026
+ const border = (parseFloat(style.borderLeftWidth) || 0) + (parseFloat(style.borderRightWidth) || 0);
1027
+ const available = (parent.clientWidth || parent.getBoundingClientRect().width - border) - padding;
1028
+ if (!(available > 0)) {
1029
+ if (wrapper) wrapper.style.width = previousWidth;
1030
+ return;
1031
+ }
1032
+ const font = fontFor(rows[0]?.cells[0] || table);
1033
+ const cellPadding = cellPaddingFor(getComputedStyle(rows[0]?.cells[0] || headers[0]));
1034
+ const measuredCells = /* @__PURE__ */ new Map();
1035
+ for (const cell of [...headers, ...rows.flatMap((row) => [...row.cells])]) measuredCells.set(cell, measureCell(cell));
1036
+ const narrow = Boolean(globalThis.matchMedia?.(NARROW).matches);
1037
+ const share = narrow ? available / 3 : Infinity;
1038
+ const runRoom = narrow ? Math.max(share, available - (count - 1) * share) : Infinity;
1039
+ const columns = Array.from({ length: count }, (_, index) => {
1040
+ const cells = [headers[index], ...rows.map((row) => row.cells[index])].filter(Boolean);
1041
+ const least = Math.min(runRoom, Math.max(0, ...cells.map(measureCell.least)));
1042
+ return {
1043
+ key: headers[index]?.dataset.columnKey || String(index),
1044
+ header: headers[index] ? cellText(headers[index]) : "",
1045
+ headerWidth: headers[index] ? measuredCells.get(headers[index]) : 0,
1046
+ // Include filtered-out rows so toggling a filter does not shift the columns.
1047
+ cells: rows.map((row) => row.cells[index] ? cellText(row.cells[index]) : ""),
1048
+ cellWidths: rows.map((row) => measuredCells.get(row.cells[index]) ?? 0),
1049
+ // Its longest words (WORD_BREAKS), for a short text column that wraps beside columns of prose.
1050
+ headerWordWidth: headers[index] ? measureCell.word(headers[index]) : 0,
1051
+ cellWordWidths: rows.map((row) => row.cells[index] ? measureCell.word(row.cells[index]) : 0),
1052
+ // Its widest pieces no line breaks in (PIECE_BREAKS), the least such a column is lowered to.
1053
+ cellPieceWidths: rows.map((row) => row.cells[index] ? measureCell.piece(row.cells[index]) : 0),
1054
+ // A numeric column (cells.js) keeps its floor on a narrow screen: a number never wraps.
1055
+ numeric: cells.some((cell) => cell.classList.contains("number")),
1056
+ ...least > 0 ? { minWidth: least } : {}
1057
+ };
1058
+ });
1059
+ const target = available * wider;
1060
+ const result = allocateColumnWidths(columns, { totalWidth: target, font, cellPadding, ...share < Infinity ? { maxReadableFloor: share } : {} });
1061
+ let sum = result.reduce((value, column) => value + column.width, 0);
1062
+ if (!sized && sum < available) {
1063
+ const raised = raiseNarrow(result.map((column) => column.width), available - sum, COLUMN_FLOOR);
1064
+ result.forEach((column, index) => {
1065
+ column.width = raised[index];
1066
+ });
1067
+ sum = Math.min(available, raised.reduce((value, width) => value + width, 0));
1068
+ if (available - sum < 0.01) sum = available;
1069
+ result.forEach((column) => {
1070
+ column.ratio = column.width / sum;
1071
+ });
1072
+ }
1073
+ const tableWidth = sized ? Math.max(target, sum) : sum;
1074
+ table.classList.add("doc-table--auto");
1075
+ table.style.width = sized && tableWidth <= available + 4 ? "100%" : `${tableWidth}px`;
1076
+ if (wrapper) setAttribute(wrapper, "data-doc-min-width", String(Math.ceil(result.reduce((value, column) => value + column.softMinWidth, 0) + border + padding)));
1077
+ if (wrapper && !sized) wrapper.style.width = tableWidth >= available - 0.01 ? "100%" : `${tableWidth + border + padding}px`;
1078
+ writeColgroup(table, result.map((column) => ({ width: `${column.ratio * 100}%`, key: column.key })));
1079
+ result.forEach((column, index) => {
1080
+ for (const cell of [headers[index], ...rows.map((row) => row.cells[index])].filter(Boolean)) {
1081
+ setAttribute(cell, "data-column-kind", column.kind);
1082
+ const width = column.ratio * tableWidth;
1083
+ if (measuredCells.get(cell) > width + 0.5) setAttribute(cell, "data-column-wrap", (cell.tagName === "TH" || column.kind === "compact") && measureCell.word(cell) <= width + 0.5 ? "words" : "");
1084
+ else cell.removeAttribute("data-column-wrap");
1085
+ markRunWrap(cell, width, measureCell);
1086
+ }
1087
+ });
1088
+ layouts.set(table, result.map((column) => ({ ...column, width: column.ratio * tableWidth })));
1089
+ }
1090
+ function queueLayout(table) {
1091
+ pendingLayouts.add(table);
1092
+ if (layoutFrame) return;
1093
+ layoutFrame = requestAnimationFrame(() => {
1094
+ layoutFrame = 0;
1095
+ const tables = [...pendingLayouts];
1096
+ pendingLayouts.clear();
1097
+ tables.filter((table2) => table2.isConnected).forEach(refreshLayout);
1098
+ });
1099
+ }
1100
+ var idleLayouts = /* @__PURE__ */ new Set();
1101
+ var idleQueued = false;
1102
+ function idleLayout(table) {
1103
+ idleLayouts.add(table);
1104
+ if (idleQueued) return;
1105
+ idleQueued = true;
1106
+ const run = () => {
1107
+ idleQueued = false;
1108
+ const tables = [...idleLayouts];
1109
+ idleLayouts.clear();
1110
+ tables.forEach(queueLayout);
1111
+ };
1112
+ if (globalThis.requestIdleCallback) requestIdleCallback(run, { timeout: 1e3 });
1113
+ else setTimeout(run, 50);
1114
+ }
1115
+ function applyColumnWidths(table, { layout = true } = {}) {
1116
+ if (!layoutObservers.has(table)) {
1117
+ const previous = /* @__PURE__ */ new WeakMap();
1118
+ const observer = new ResizeObserver((entries) => {
1119
+ for (const { target, contentRect } of entries) {
1120
+ if (contentRect.width !== previous.get(target)) {
1121
+ previous.set(target, contentRect.width);
1122
+ queueLayout(table);
1123
+ }
1124
+ }
1125
+ });
1126
+ const wrapper = wrapperOf(table);
1127
+ const parent = wrapper ? wrapper.parentElement : table.parentElement;
1128
+ if (parent) observer.observe(parent);
1129
+ if (wrapper) observer.observe(wrapper);
1130
+ layoutObservers.set(table, observer);
1131
+ if (wrapper) drawScrollbars(wrapper, table);
1132
+ }
1133
+ if (layout) queueLayout(table);
1134
+ }
1135
+ function applyLayoutDefaults(table, options) {
1136
+ applyColumnWidths(table, options);
1137
+ return table;
1138
+ }
1139
+
1140
+ // src/render/kit/words.js
1141
+ var TABLES = {
1142
+ "sorted-ascending": { zh: "{0}\uFF1A\u5F53\u524D\u5347\u5E8F\uFF0C\u70B9\u51FB\u5207\u6362", en: "{0}: sorted ascending, click to switch" },
1143
+ "sorted-descending": { zh: "{0}\uFF1A\u5F53\u524D\u964D\u5E8F\uFF0C\u70B9\u51FB\u5207\u6362", en: "{0}: sorted descending, click to switch" },
1144
+ "sort-ascending": { zh: "{0}\uFF1A\u70B9\u51FB\u6309\u5347\u5E8F\u6392\u5E8F", en: "{0}: click to sort ascending" },
1145
+ "sort-descending": { zh: "{0}\uFF1A\u70B9\u51FB\u6309\u964D\u5E8F\u6392\u5E8F", en: "{0}: click to sort descending" },
1146
+ "status-ascending": { zh: "\u5F53\u524D\u6392\u5E8F\uFF1A{0} \xB7 \u5347\u5E8F", en: "Sorted by {0} \xB7 ascending" },
1147
+ "status-descending": { zh: "\u5F53\u524D\u6392\u5E8F\uFF1A{0} \xB7 \u964D\u5E8F", en: "Sorted by {0} \xB7 descending" },
1148
+ "original-order": { zh: "\u539F\u59CB\u987A\u5E8F", en: "Original order" }
1149
+ };
1150
+ var UI_LANGUAGE = "data-ge-language";
1151
+ function kitLanguage(root = globalThis.document?.documentElement) {
1152
+ const ui = root?.getAttribute(UI_LANGUAGE) ?? null;
1153
+ const english = ui !== null ? ui === "en" : /^en(?:-|$)/i.test(root?.getAttribute("lang") ?? "");
1154
+ return english ? "en" : "zh";
1155
+ }
1156
+ function wordIn(table, language, key, ...values) {
1157
+ const entry = table[key];
1158
+ if (!entry) throw new Error(`The kit has no word "${key}" here (src/render/kit/words.js).`);
1159
+ const text = entry[language] ?? entry.zh;
1160
+ return values.length === 0 ? text : text.replace(/\{(\d+)\}/g, (whole, index) => index < values.length ? String(values[index]) : whole);
1161
+ }
1162
+ var sayer = (table) => (key, ...values) => wordIn(table, kitLanguage(), key, ...values);
1163
+ var sayTables = /* @__PURE__ */ sayer(TABLES);
1164
+ var ENGLISH_ROOT = `:root[${UI_LANGUAGE}="en"], :root:not([${UI_LANGUAGE}])[lang|="en" i]`;
1165
+
1166
+ // src/render/kit/tables/sort.js
1167
+ var collator = new Intl.Collator("zh-CN", {
1168
+ numeric: true,
1169
+ sensitivity: "base"
1170
+ });
1171
+ var controllers = /* @__PURE__ */ new WeakMap();
1172
+ var heldOrder = () => document.documentElement.getAttribute("data-ge-order") === "file";
1173
+ function compareValues(left, right, direction) {
1174
+ if (left == null && right == null) return 0;
1175
+ if (left == null) return 1;
1176
+ if (right == null) return -1;
1177
+ const comparison = typeof left === "number" && typeof right === "number" ? left - right : collator.compare(String(left), String(right));
1178
+ return direction === "asc" ? comparison : -comparison;
1179
+ }
1180
+ function statusElement(table) {
1181
+ const selector = table.dataset.sortStatus;
1182
+ if (!selector) return null;
1183
+ try {
1184
+ return document.querySelector(selector);
1185
+ } catch {
1186
+ return null;
1187
+ }
1188
+ }
1189
+ function controlFor(header) {
1190
+ const button = document.createElement("button");
1191
+ button.type = "button";
1192
+ button.className = "doc-table-sort-button";
1193
+ button.setAttribute("contenteditable", "false");
1194
+ header.append(button);
1195
+ return button;
1196
+ }
1197
+ function makeSortable(target) {
1198
+ const table = elementFor(target);
1199
+ const known = controllers.get(table);
1200
+ if (known) {
1201
+ known.sync();
1202
+ return table;
1203
+ }
1204
+ applyLayoutDefaults(table);
1205
+ inferColumnSemantics(table);
1206
+ const body = table.tBodies[0];
1207
+ if (!body || mergedCells(table) || sortableColumns(table).length === 0) return table;
1208
+ let columns = [];
1209
+ const originalOrder = /* @__PURE__ */ new WeakMap();
1210
+ let next = 0;
1211
+ const orderOf = (row) => {
1212
+ if (!originalOrder.has(row)) originalOrder.set(row, next++);
1213
+ return originalOrder.get(row);
1214
+ };
1215
+ Array.from(body.rows).forEach(orderOf);
1216
+ let current = null;
1217
+ const listeners = /* @__PURE__ */ new Set();
1218
+ const getState = () => ({ sort: current ? { column: current.index, key: current.header.dataset.sortKey || null, direction: current.direction } : null });
1219
+ const notify = () => {
1220
+ for (const listener of listeners) listener(getState());
1221
+ table.dispatchEvent(new CustomEvent("doc-table-sort", { detail: getState().sort }));
1222
+ };
1223
+ function updateHeaders() {
1224
+ for (const column of columns) {
1225
+ const active = current?.header === column.header;
1226
+ const direction = active ? current.direction : column.defaultDirection;
1227
+ column.header.setAttribute(
1228
+ "aria-sort",
1229
+ active ? direction === "asc" ? "ascending" : "descending" : "none"
1230
+ );
1231
+ const ascending = direction === "asc";
1232
+ column.button.setAttribute(
1233
+ "aria-label",
1234
+ sayTables(active ? ascending ? "sorted-ascending" : "sorted-descending" : ascending ? "sort-ascending" : "sort-descending", column.label)
1235
+ );
1236
+ column.button.dataset.docSortArrow = direction;
1237
+ }
1238
+ }
1239
+ function updateStatus(column, direction) {
1240
+ const status = statusElement(table);
1241
+ if (status) status.textContent = sayTables(direction === "asc" ? "status-ascending" : "status-descending", column.label);
1242
+ }
1243
+ function updateRanks() {
1244
+ Array.from(body.rows).forEach((row, index) => {
1245
+ const rank = row.querySelector("[data-sort-rank]");
1246
+ if (rank) rank.textContent = String(index + 1);
1247
+ });
1248
+ }
1249
+ function sortBy(column, requestedDirection) {
1250
+ if (mergedCells(table)) return;
1251
+ const direction = requestedDirection || (current?.header === column.header ? current.direction === "asc" ? "desc" : "asc" : column.defaultDirection);
1252
+ if (current?.header === column.header && current.direction === direction) return;
1253
+ const rows = Array.from(body.rows);
1254
+ rows.sort((leftRow, rightRow) => {
1255
+ const comparison = compareValues(
1256
+ parsedValue(leftRow.cells[column.index], column.type),
1257
+ parsedValue(rightRow.cells[column.index], column.type),
1258
+ direction
1259
+ );
1260
+ return comparison || orderOf(leftRow) - orderOf(rightRow);
1261
+ });
1262
+ const fragment = document.createDocumentFragment();
1263
+ rows.forEach((row) => fragment.appendChild(row));
1264
+ body.appendChild(fragment);
1265
+ current = { header: column.header, index: column.index, direction };
1266
+ updateHeaders();
1267
+ updateRanks();
1268
+ updateStatus(column, direction);
1269
+ notify();
1270
+ }
1271
+ function sync() {
1272
+ const wanted = mergedCells(table) ? [] : sortableColumns(table);
1273
+ for (const column of columns) {
1274
+ if (wanted.some((each) => each.header === column.header)) continue;
1275
+ column.header.removeAttribute("aria-sort");
1276
+ }
1277
+ columns = wanted.map((column) => {
1278
+ const kept = columns.find((each) => each.header === column.header);
1279
+ const button = kept?.button.isConnected && kept.button.parentElement === column.header ? kept.button : controlFor(column.header);
1280
+ if (button.nextSibling) column.header.append(button);
1281
+ return { ...column, button };
1282
+ });
1283
+ const buttons = new Set(columns.map((column) => column.button));
1284
+ table.querySelectorAll(".doc-table-sort-button").forEach((button) => {
1285
+ if (!buttons.has(button)) button.remove();
1286
+ });
1287
+ if (current) {
1288
+ const column = columns.find((each) => each.header === current.header);
1289
+ current = column ? { ...current, index: column.index } : null;
1290
+ }
1291
+ for (const column of columns) {
1292
+ if (column.type !== "number") continue;
1293
+ column.header.classList.add("number");
1294
+ Array.from(body.rows).forEach((row) => row.cells[column.index]?.classList.add("number"));
1295
+ }
1296
+ Array.from(body.rows).forEach(orderOf);
1297
+ updateHeaders();
1298
+ }
1299
+ table.addEventListener("click", (event) => {
1300
+ const button = event.target.closest?.(".doc-table-sort-button");
1301
+ const column = button && columns.find((each) => each.button === button);
1302
+ if (column) sortBy(column);
1303
+ });
1304
+ controllers.set(table, {
1305
+ getState,
1306
+ sync,
1307
+ setState(next2) {
1308
+ if (!next2 || !("sort" in next2)) throw new Error("Table state requires sort.");
1309
+ if (next2.sort === null) {
1310
+ if (!current) return;
1311
+ [...body.rows].sort((a, b) => orderOf(a) - orderOf(b)).forEach((row) => body.append(row));
1312
+ current = null;
1313
+ updateHeaders();
1314
+ updateRanks();
1315
+ const status = statusElement(table);
1316
+ if (status) status.textContent = sayTables("original-order");
1317
+ notify();
1318
+ return;
1319
+ }
1320
+ const column = columns.find((entry) => entry.index === next2.sort.column);
1321
+ if (!column || !["asc", "desc"].includes(next2.sort.direction)) throw new Error("Invalid table sort column or direction.");
1322
+ sortBy(column, next2.sort.direction);
1323
+ },
1324
+ subscribe(listener) {
1325
+ if (typeof listener !== "function") throw new Error("Table subscribe requires a function.");
1326
+ listeners.add(listener);
1327
+ return () => listeners.delete(listener);
1328
+ }
1329
+ });
1330
+ table.dataset.docSortableReady = "true";
1331
+ sync();
1332
+ const defaultColumn = columns.find((column) => column.header.hasAttribute("data-sort-default"));
1333
+ if (defaultColumn && !heldOrder()) sortBy(defaultColumn, defaultColumn.defaultDirection);
1334
+ return table;
1335
+ }
1336
+ function sortableColumns(table) {
1337
+ return Array.from(table.tHead?.rows[0]?.cells || []).map((header, index) => ({
1338
+ header,
1339
+ index,
1340
+ type: header.dataset.sortType,
1341
+ label: header.textContent.trim(),
1342
+ defaultDirection: header.dataset.sortDefault || (header.dataset.sortType === "text" ? "asc" : "desc")
1343
+ })).filter((column) => column.type && !column.header.hasAttribute("data-sort-ignore"));
1344
+ }
1345
+
1346
+ // src/render/kit/tables/index.js
1347
+ var global2 = globalThis;
1348
+ function enhance(target, { layout = true } = {}) {
1349
+ const table = elementFor(target);
1350
+ splitCodeRuns(table);
1351
+ applyLayoutDefaults(table, { layout });
1352
+ inferColumnSemantics(table);
1353
+ if (table.hasAttribute("data-doc-table-static")) return table;
1354
+ return makeSortable(table);
1355
+ }
1356
+ function controllerFor(target) {
1357
+ const table = enhance(target);
1358
+ const controller = controllers.get(table);
1359
+ if (!controller) throw new Error("Table state requires a sortable table.");
1360
+ return controller;
1361
+ }
1362
+ global2.DocTables = Object.freeze({
1363
+ getState: (target) => controllerFor(target).getState(),
1364
+ setState: (target, state) => controllerFor(target).setState(state),
1365
+ subscribe: (target, listener) => controllerFor(target).subscribe(listener),
1366
+ allocateColumnWidths,
1367
+ /** Force measurement after custom content/layout changes; returns a detached snapshot. */
1368
+ layout(target) {
1369
+ const table = elementFor(target);
1370
+ enhance(table);
1371
+ forgetMeasures(table);
1372
+ refreshLayout(table);
1373
+ return (layouts.get(table) || []).map((column) => ({ ...column }));
1374
+ }
1375
+ });
1376
+ global2.ReportTables = global2.DocTables;
1377
+ if (!global2.DocKit) throw new Error("DocTables requires /kit/runtime.js to be loaded first.");
1378
+ function ownChange(record) {
1379
+ const element = record.target.nodeType === 1 ? record.target : record.target.parentElement;
1380
+ if (element?.closest("colgroup[data-doc-columns]")) return true;
1381
+ const nodes = [...record.addedNodes, ...record.removedNodes];
1382
+ return nodes.length > 0 && nodes.every((node) => node.nodeType === 1 && (node.tagName === "COLGROUP" || node.classList.contains("doc-table-sort-button")));
1383
+ }
1384
+ function bindSort(table, signal) {
1385
+ const key = table.getAttribute("data-doc-bind")?.trim();
1386
+ const controller = controllers.get(table);
1387
+ if (!key || !controller) return;
1388
+ const store = global2.DocKit.bindings;
1389
+ const show = () => {
1390
+ const value = store.get(key);
1391
+ controller.setState(value && typeof value === "object" ? value : { sort: null });
1392
+ };
1393
+ const stopTable = controller.subscribe((state) => store.set(key, state));
1394
+ const stopKey = store.subscribe((changed) => changed === key && show());
1395
+ signal.addEventListener("abort", () => {
1396
+ stopTable();
1397
+ stopKey();
1398
+ });
1399
+ if (!heldOrder()) show();
1400
+ }
1401
+ global2.DocKit.component({
1402
+ id: "table",
1403
+ selector: "table.doc-table, table[data-sortable-table]",
1404
+ on: ["content", "reveal", "layout", "viewport", "fonts"],
1405
+ mount(table, { signal }) {
1406
+ enhance(table);
1407
+ markEdges(table);
1408
+ bindSort(table, signal);
1409
+ const switched = new MutationObserver(() => {
1410
+ enhance(table);
1411
+ queueLayout(table);
1412
+ });
1413
+ for (const node of [table, wrapperOf(table)]) if (node) switched.observe(node, { attributes: true, attributeFilter: ["data-number-columns"] });
1414
+ signal.addEventListener("abort", () => switched.disconnect());
1415
+ return {
1416
+ update(reason, detail, { quiet = false } = {}) {
1417
+ if (reason === "layout") {
1418
+ if (layoutObservers.has(table)) queueLayout(table);
1419
+ } else if (reason === "fonts") {
1420
+ const change = fontsChange(table, detail);
1421
+ if (change === "words") forgetMeasures(table);
1422
+ if (change) queueLayout(table);
1423
+ } else if (reason !== "content" || detail.some((record) => !ownChange(record))) {
1424
+ if (reason === "content" && controllers.has(table)) enhance(table, { layout: false });
1425
+ if (reason === "content") markEdges(table);
1426
+ if (quiet) idleLayout(table);
1427
+ else queueLayout(table);
1428
+ }
1429
+ },
1430
+ destroy() {
1431
+ layoutObservers.get(table)?.disconnect();
1432
+ layoutObservers.delete(table);
1433
+ pendingLayouts.delete(table);
1434
+ }
1435
+ };
1436
+ },
1437
+ // An export of the view: the sort controls taken out (their headers' words are untouched), the widths the layout
1438
+ // set taken off (tables.js lays the copy out again), its cells' code joined from its runs.
1439
+ dehydrate(table) {
1440
+ if (table.classList.contains("doc-table--auto")) {
1441
+ table.style.removeProperty("width");
1442
+ wrapperOf(table)?.style.removeProperty("width");
1443
+ if (table.getAttribute("style") === "") table.removeAttribute("style");
1444
+ }
1445
+ table.querySelectorAll(".doc-table-sort-button").forEach((button) => button.remove());
1446
+ joinCodeRuns(table);
1447
+ }
1448
+ });
1449
+ })();