@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/report.css ADDED
@@ -0,0 +1,2821 @@
1
+ /* The kit's values: colors (light and dark, through light-dark()), the chart series, fonts, the
2
+ type scale, widths and gaps, and each component's own colors. Read by every other file, and by
3
+ tokens.js (DocTokens) for scripts: there is no second palette. */
4
+
5
+ /* Segoe UI as the system has it, its line placed on its glyphs (Windows): the same faces, nothing to
6
+ download, their ascent and descent rewritten so a line's ink sits in the middle of its line box, as
7
+ Feishu's first Windows font (Tahoma) has it; Segoe UI's own leaves room above its letters, and the
8
+ Chinese text, on the same baseline, sat a pixel low in a selected block's fill and a colored one's
9
+ background. Absent elsewhere (macOS, Linux): the stack goes on to the next family. */
10
+ @font-face { font-family: "Doc Segoe"; src: local("Segoe UI"), local("SegoeUI"); font-weight: 400; ascent-override: 100%; descent-override: 25%; line-gap-override: 0%; }
11
+ @font-face { font-family: "Doc Segoe"; src: local("Segoe UI Italic"), local("SegoeUI-Italic"); font-weight: 400; font-style: italic; ascent-override: 100%; descent-override: 25%; line-gap-override: 0%; }
12
+ @font-face { font-family: "Doc Segoe"; src: local("Segoe UI Semibold"), local("SegoeUI-Semibold"); font-weight: 600; ascent-override: 100%; descent-override: 25%; line-gap-override: 0%; }
13
+ @font-face { font-family: "Doc Segoe"; src: local("Segoe UI Semibold Italic"), local("SegoeUI-SemiboldItalic"); font-weight: 600; font-style: italic; ascent-override: 100%; descent-override: 25%; line-gap-override: 0%; }
14
+ @font-face { font-family: "Doc Segoe"; src: local("Segoe UI Bold"), local("SegoeUI-Bold"); font-weight: 700; ascent-override: 100%; descent-override: 25%; line-gap-override: 0%; }
15
+ @font-face { font-family: "Doc Segoe"; src: local("Segoe UI Bold Italic"), local("SegoeUI-BoldItalic"); font-weight: 700; font-style: italic; ascent-override: 100%; descent-override: 25%; line-gap-override: 0%; }
16
+
17
+ :root {
18
+ color-scheme: light dark;
19
+ --doc-bg: light-dark(#fcfcfc, #181818);
20
+ --doc-surface: light-dark(#ffffff, #202020);
21
+ --doc-text: light-dark(#1d1d1f, #f3f3f3);
22
+ --doc-muted: light-dark(#6e6e73, #a1a1a6);
23
+ --doc-border: light-dark(rgb(29 29 31 / 12%), rgb(243 243 243 / 13%));
24
+ --doc-grid: light-dark(rgb(29 29 31 / 8%), rgb(243 243 243 / 8%));
25
+ --doc-accent: light-dark(#2678d8, #72adf0);
26
+ --doc-accent-soft: light-dark(#eaf3fd, #172a3d);
27
+ --doc-list-marker: light-dark(rgb(20 86 240), rgb(76 136 255)); /* list numbers and bullets: Feishu's blue */
28
+ --doc-success: var(--doc-series-3);
29
+ --doc-warning: var(--doc-series-2);
30
+ /* Cursor Canvas category red; the other Gallery series colors stay unchanged. */
31
+ --doc-danger: var(--doc-series-5);
32
+ --doc-info: var(--doc-series-1);
33
+ --doc-neutral: var(--doc-muted);
34
+ --doc-series-1: light-dark(#3c9bc9, #73bde0);
35
+ --doc-series-2: light-dark(#ed8d5a, #f2aa82);
36
+ --doc-series-3: light-dark(#6e9f69, #447542);
37
+ --doc-series-4: light-dark(#927ab8, #b4a0d2);
38
+ --doc-series-5: light-dark(#c04848, #fc6b83);
39
+ --doc-series-6: light-dark(#65bdba, #89d1ce);
40
+ /* System UI fonts: Apple's, then Segoe UI with its line on its glyphs on Windows (Doc Segoe,
41
+ above), then Chinese ones. */
42
+ --doc-font: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Doc Segoe", "Segoe UI Variable Text", "Segoe UI", "Helvetica Neue", "PingFang SC", "Microsoft YaHei", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
43
+ --doc-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, "PT Mono", "Liberation Mono", monospace;
44
+ /* Links in the text: the muted gray in every block, on a thin line of Notion's gray always shown. */
45
+ --doc-link: var(--doc-muted);
46
+ --doc-link-line: light-dark(rgb(55 53 47 / 40%), rgb(255 255 255 / 28.2%));
47
+ /* Inline code (as Notion): red text on a faint fill. */
48
+ --doc-code-inline: light-dark(#cf5148, #e8776d);
49
+ --doc-code-inline-fill: var(--doc-hover);
50
+ /* 712px: 44 characters of body text (16px) to a line of Chinese. */
51
+ --doc-content-max-width: 712px;
52
+ --doc-compact-figure-max-width: 520px;
53
+ --doc-page-gutter: 20px;
54
+ --doc-wide-gutter: clamp(12px, 2.5vw, 40px);
55
+ /* A detail card (dialog.css): the room on each side of its text, how far it stays from the
56
+ window's sides (a reader's card goes up to them), the room above and below it, where a press
57
+ closes it, and its scrollbar's width. */
58
+ --doc-dialog-side: 40px;
59
+ --doc-dialog-edge: 0px;
60
+ --doc-dialog-block-gutter: 40px;
61
+ --doc-dialog-scrollbar: 10px;
62
+ /* The gap above and below a block, one name per distinct gap (docs/render.md says which block
63
+ takes which). A component (a card, a table, a callout, a row of columns, a widget) and a divider
64
+ stand 20px from the text around them. */
65
+ --doc-component-gap: 20px;
66
+ /* A block set apart (a highlight panel and the opening summary, a code block, a Sheet frame, a quote,
67
+ the end of a list): 16px. */
68
+ --doc-block-gap: 16px;
69
+ /* Media blocks (an image, a bookmark, an embed) stand as far from the text around them as a line
70
+ of text from the next (notion-lite's 8px each side): 14px and the text's own half-leading. */
71
+ --doc-media-gap: 14px;
72
+ --doc-column-gap: 20px;
73
+ --doc-body-font-size: 16px;
74
+ --doc-body-line-height: 26px;
75
+ --doc-paragraph-gap: 12px; /* between two paragraphs */
76
+ /* Blocks that come several together stand closer, a group rather than loose panels: disclosures,
77
+ code blocks and formula blocks, 8px apart. */
78
+ --doc-group-gap: 8px;
79
+ /* Between the items of a list, from an item to the list it holds, from a list to one right after it. */
80
+ --doc-list-gap: 5px;
81
+ --doc-small-font-size: 13px;
82
+ --doc-small-line-height: 18px;
83
+ --doc-note-font-size: 14px;
84
+ --doc-note-line-height: 20px;
85
+ /* The report's title, above the scale of the headings in its text. */
86
+ --doc-title-font-size: 28px;
87
+ --doc-title-line-height: 36px;
88
+ /* Four heading levels (as Feishu); the fourth is body-sized, set apart by its weight. */
89
+ --doc-h1-font-size: 26px;
90
+ --doc-h1-line-height: 36px;
91
+ --doc-h2-font-size: 22px;
92
+ --doc-h2-line-height: 31px;
93
+ --doc-h3-font-size: 20px;
94
+ --doc-h3-line-height: 28px;
95
+ --doc-h4-font-size: 16px;
96
+ --doc-h4-line-height: 24px;
97
+ /* A card's title. */
98
+ --doc-card-title-font-size: 18px;
99
+ --doc-card-title-line-height: 25px;
100
+ --doc-table-font-size: 15px;
101
+ --doc-table-line-height: 20px;
102
+ --doc-table-radius: 8px;
103
+ /* A sortable header's arrow (table.css): light where the pointer shows it, darker on the sorted column. */
104
+ --doc-table-sort-arrow: light-dark(rgb(55 53 47 / 28%), rgb(255 255 255 / 28%));
105
+ --doc-table-sort-arrow-active: light-dark(rgb(55 53 47 / 72%), rgb(255 255 255 / 72%));
106
+ /* Notion's neutral fills and line, written once: under the pointer, pressed, and the hairline (a table's lines, a Sheet's frame, an embed's).
107
+ The dark hairline is a light veil, Notion's #383836 on the page's background: on the palette's
108
+ gray (#383836 too: a table's header cells, a gray highlight block around it) or any other fill
109
+ it is that much lighter, so it never vanishes into one. */
110
+ --doc-hover: light-dark(rgb(33 27 23 / 5%), rgb(255 255 255 / 5.5%));
111
+ --doc-press: light-dark(rgb(33 27 23 / 10%), rgb(255 255 255 / 11%));
112
+ --doc-hairline: light-dark(#e6e5e3, rgb(255 255 240 / 13.9%));
113
+ /* A table's frame in a block with a fill of its own (table.css): the hairline as it lies on the
114
+ palette's gray, opaque. The frame lies over the table's body, whose fill is the page's, where the
115
+ veil comes out the gray of a block around it. */
116
+ --doc-table-frame-filled: light-dark(#e6e5e3, #545450);
117
+ /* A flowchart's arrows and the circle behind a step's number (flowchart.css): neutral greys. */
118
+ --doc-flow-line: light-dark(rgb(55 53 47 / 38%), rgb(255 255 255 / 34%));
119
+ --doc-flow-badge: light-dark(rgb(55 53 47 / 8%), rgb(255 255 255 / 10%));
120
+ /* The thin scrollbars the kit draws over a table's frame (tables.js). */
121
+ --doc-scrollbar-thumb: light-dark(rgb(29 29 31 / 24%), rgb(243 243 243 / 26%));
122
+ --doc-scrollbar-thumb-active: light-dark(rgb(29 29 31 / 42%), rgb(243 243 243 / 44%));
123
+ /* Code blocks in Notion's look (its panel, monospace, toolbar and Prism colors), independent of
124
+ chart categories. The room above and below the words of a code block's title and a disclosure's
125
+ (their header row: code.css, details.css), one design for the two. */
126
+ --doc-block-title-padding: 5px;
127
+ --doc-code-font: "SFMono-Regular", Menlo, Consolas, "PT Mono", "Liberation Mono", Courier, monospace;
128
+ --doc-code-foreground: light-dark(#2c2c2b, #f0efed);
129
+ --doc-code-background: light-dark(rgb(66 35 3 / 3%), rgb(252 252 252 / 3%));
130
+ --doc-caption: light-dark(#7d7a75, #ada9a3); /* a picture's caption (Notion's) */
131
+ --doc-code-chrome: #8e8b86;
132
+ --doc-code-pressed: light-dark(rgb(31 35 41 / 12%), rgb(255 255 255 / 12%));
133
+ --doc-code-toolbar-shadow: 0 8px 12px rgb(25 25 25 / 2.7%), 0 2px 6px rgb(25 25 25 / 2.7%), 0 0 0 1px light-dark(rgb(42 28 0 / 7%), #383836);
134
+ --doc-code-separator: light-dark(#f0efed, #2c2c2b);
135
+ --doc-code-line-number: light-dark(rgb(55 53 47 / 35%), rgb(255 255 255 / 28%));
136
+ --doc-code-line-fold: light-dark(rgb(55 53 47 / 30%), rgb(255 255 255 / 24%)); /* fainter than the block's own arrow (chrome) */
137
+ --doc-code-fold-more: light-dark(rgb(55 53 47 / 8%), rgb(255 255 255 / 9%));
138
+ --doc-code-fold-more-hover: light-dark(rgb(55 53 47 / 14%), rgb(255 255 255 / 15%));
139
+ --doc-code-scrollbar: light-dark(#d3d1cb, rgb(255 255 255 / 20%));
140
+ /* The colors Shiki's CSS-variables theme reads (code.js; the 12 of them it has rules for). */
141
+ --doc-code-token-comment: light-dark(#708090, #998066);
142
+ --doc-code-token-string: light-dark(#669900, #bde052);
143
+ --doc-code-token-string-expression: var(--doc-code-token-string);
144
+ --doc-code-token-keyword: light-dark(#0077aa, #66a2cc);
145
+ --doc-code-token-function: light-dark(#dd4a68, #ecec93);
146
+ --doc-code-token-constant: light-dark(#990055, #d1949e);
147
+ --doc-code-token-parameter: var(--doc-code-foreground);
148
+ --doc-code-token-punctuation: light-dark(#999999, rgb(240 239 237 / 70%));
149
+ --doc-code-token-link: light-dark(#9a6e3a, #f5b83d);
150
+ --doc-code-token-inserted: var(--doc-diff-added);
151
+ --doc-code-token-deleted: var(--doc-diff-removed);
152
+ --doc-code-token-changed: var(--doc-code-token-function);
153
+ --doc-diff-added: light-dark(#1a7f37, #3fb950);
154
+ --doc-diff-removed: light-dark(#cf222e, #f85149);
155
+ --doc-diff-added-fill: light-dark(rgb(46 160 67 / 10%), rgb(46 160 67 / 15%));
156
+ --doc-diff-removed-fill: light-dark(rgb(248 81 73 / 10%), rgb(248 81 73 / 15%));
157
+ --doc-diff-added-strip: light-dark(rgb(46 160 67 / 55%), rgb(63 185 80 / 55%));
158
+ --doc-diff-removed-strip: light-dark(rgb(248 81 73 / 55%), rgb(248 81 73 / 55%));
159
+ --doc-chart-axis-font-size: 13px;
160
+ --doc-table-fill: var(--doc-bg);
161
+ }
162
+
163
+ :root[data-doc-theme="light"] { color-scheme: light; }
164
+ :root[data-doc-theme="dark"] { color-scheme: dark; }
165
+
166
+ /* The kit's words a stylesheet shows (--doc-word-<key>: an empty code block's title), written here
167
+ from its table (src/render/kit/words.js, STYLE_WORDS) by kit-build.mjs: Chinese, and English where
168
+ Gallery says its UI is (data-ge-language="en") or, in a file of its own, the page's lang is en. */
169
+ :root { --doc-word-code-title: "代码块"; }
170
+ :root[data-ge-language="en"], :root:not([data-ge-language])[lang|="en" i] { --doc-word-code-title: "Code"; }
171
+
172
+ @media (max-width: 640px) {
173
+ :root { --doc-page-gutter: 12px; }
174
+ }
175
+
176
+ /* The document itself: the body's type and colors, holding the first paint until the page is
177
+ ready, links and inline code, the inline text colors and highlights, the screen-reader-only
178
+ helper, and reduced motion. */
179
+
180
+ * { box-sizing: border-box; }
181
+
182
+ /* The corner radius of the box a block draws inside itself (a file's row, a bookmark's card, an
183
+ embed's frame), which the page editor's selection wraps, and how far past it the selection lies
184
+ (a file's row 4px; a callout's square box 6px, its selection round by as much); not passed down
185
+ to what is in the block. */
186
+ @property --doc-box-radius { syntax: "<length>"; inherits: false; initial-value: 0px; }
187
+ @property --doc-box-reach { syntax: "<length>"; inherits: false; initial-value: 0px; }
188
+
189
+ /* Scrollbars as Notion's: a thumb on a transparent track, in either theme (Chrome's dark default
190
+ drew a gray track). Inherited, so every scrolling part of the page has it unless it says otherwise.
191
+ The page has no sideways to scroll, what is wide scrolling in itself: a touchpad going sideways
192
+ moves nothing and goes on to the browser, for its swipe back and forward. Past its top or end the
193
+ page springs back. */
194
+ html { background: var(--doc-bg); scrollbar-color: var(--doc-code-scrollbar) transparent; }
195
+ @media screen { html { overflow-x: hidden; } }
196
+
197
+ body {
198
+ min-width: 320px;
199
+ margin: 0;
200
+ color: var(--doc-text);
201
+ background: var(--doc-bg);
202
+ font-family: var(--doc-font);
203
+ font-size: var(--doc-body-font-size);
204
+ line-height: var(--doc-body-line-height);
205
+ }
206
+
207
+ /* Hold the first paint until ui.js marks the page ready: by then the reader's theme and width
208
+ are applied and the report's scripts have set up Sheets, charts, tables and formulas, so the
209
+ page never flashes an intermediate state. If that never happens, reveal it anyway. */
210
+ :root:not([data-doc-ready]) body:has(> .doc-page) {
211
+ visibility: hidden;
212
+ animation: doc-reveal 0s linear 1.2s forwards;
213
+ }
214
+ @keyframes doc-reveal { to { visibility: visible; } }
215
+
216
+ button, input, select, textarea { font: inherit; }
217
+
218
+ /* A link is gray with a thin line under it, clear of Chinese characters, under the pointer as anywhere. */
219
+ a { color: var(--doc-link); text-decoration: underline .05em var(--doc-link-line); text-underline-offset: .2em; }
220
+ /* Underlined text: the line clear of Chinese characters, in inline code's red. */
221
+ u { text-decoration: underline 2px var(--doc-code-inline); text-underline-offset: .3em; text-decoration-skip-ink: none; }
222
+ /* An underline's line in another color than the red, or thinner or heavier than its 2px (the page
223
+ editor's format bar sets them; "plain" is the text's own color). */
224
+ .doc-underline-orange { text-decoration-color: light-dark(#d27b2d, #e0955a); }
225
+ .doc-underline-blue { text-decoration-color: light-dark(#337ea9, #6ea8d8); }
226
+ .doc-underline-purple { text-decoration-color: light-dark(#9065b0, #b28ad6); }
227
+ .doc-underline-plain { text-decoration-color: currentColor; }
228
+ .doc-underline-thin { text-decoration-thickness: 1px; }
229
+ .doc-underline-thick { text-decoration-thickness: 3px; }
230
+
231
+ /* Inline code (as Notion): no margin of its own, the text's own spaces part it from the words
232
+ beside it (the editor types one there, as between Chinese and Latin text). The code of a code
233
+ block or a diff is none (code.css draws it); the exclusion weighs nothing, so inline code keeps the
234
+ weight of a bare `code`. */
235
+ code:where(:not(:is(.doc-code > pre, .doc-diff-body) code)) {
236
+ position: relative;
237
+ margin: 0;
238
+ bottom: .065em;
239
+ padding: .2em .4em;
240
+ border-radius: 4px;
241
+ color: var(--doc-code-inline);
242
+ background: var(--doc-code-inline-fill);
243
+ font-family: var(--doc-mono);
244
+ font-size: 85%;
245
+ line-height: normal;
246
+ }
247
+
248
+ /* A number range (3–13, 1–3B, 22.8%–23.7%) is one word: the line never breaks at its dash
249
+ (runtime/spacing.js holds it in this span as the page renders). */
250
+ .doc-range { white-space: nowrap; }
251
+
252
+ /* Inline text colors and highlights (<span class="doc-text-red">): Notion's nine colors
253
+ (its text and background colors, light and dark). The page editor's selection toolbar writes
254
+ these classes; both follow the light/dark theme. A text color is also --doc-ink, for a
255
+ component that takes it over (a code block's plain text, a list item's marker, a formula block).
256
+ A background is --doc-fill, and its deep shade --doc-fill-deep (its color's text color),
257
+ for a line a component draws along its fill (a callout's). */
258
+ /* The fill a color class sets is its host's own, not passed down to what stands in it: a table's cell
259
+ takes its own fill or the table's (table.css), never that of the panel or disclosure around it;
260
+ a callout without a color its own default's, never the line of the panel it stands in. */
261
+ @property --doc-fill { syntax: "*"; inherits: false; }
262
+ @property --doc-fill-deep { syntax: "*"; inherits: false; }
263
+ .doc-text-gray { --doc-ink: var(--doc-muted); color: var(--doc-ink); }
264
+ .doc-text-brown { --doc-ink: light-dark(#9f765a, #ba856f); color: var(--doc-ink); }
265
+ .doc-text-orange { --doc-ink: light-dark(#d27b2d, #c77d48); color: var(--doc-ink); }
266
+ .doc-text-yellow { --doc-ink: light-dark(#cb9434, #ca9849); color: var(--doc-ink); }
267
+ .doc-text-green { --doc-ink: light-dark(#50946e, #529e72); color: var(--doc-ink); }
268
+ .doc-text-blue { --doc-ink: light-dark(#387dc9, #5e87c9); color: var(--doc-ink); }
269
+ .doc-text-purple { --doc-ink: light-dark(#9a6bb4, #9d68d3); color: var(--doc-ink); }
270
+ .doc-text-pink { --doc-ink: light-dark(#c14c8a, #d15796); color: var(--doc-ink); }
271
+ .doc-text-red { --doc-ink: light-dark(#cf5148, #df5452); color: var(--doc-ink); }
272
+ /* What every host of a color class has: the fill, as its background. Its corners are its host's own, one declaration
273
+ each (a span here, a paragraph and heading below, a list item in flow.css, a card or a disclosure in its own
274
+ stylesheet); a block that takes no corners is square, and says nothing. */
275
+ :is(.doc-highlight-gray, .doc-highlight-brown, .doc-highlight-orange, .doc-highlight-yellow, .doc-highlight-green, .doc-highlight-blue, .doc-highlight-purple, .doc-highlight-pink, .doc-highlight-red) { background: var(--doc-fill); -webkit-box-decoration-break: clone; box-decoration-break: clone; }
276
+ span:is(.doc-highlight-gray, .doc-highlight-brown, .doc-highlight-orange, .doc-highlight-yellow, .doc-highlight-green, .doc-highlight-blue, .doc-highlight-purple, .doc-highlight-pink, .doc-highlight-red) { border-radius: 3px; }
277
+ .doc-highlight-gray { --doc-fill: light-dark(#f0efed, #383836); --doc-fill-deep: var(--doc-muted); }
278
+ .doc-highlight-brown { --doc-fill: light-dark(#f5ede9, #45362d); --doc-fill-deep: light-dark(#9f765a, #ba856f); }
279
+ .doc-highlight-orange { --doc-fill: light-dark(#fbebde, #53361f); --doc-fill-deep: light-dark(#d27b2d, #c77d48); }
280
+ .doc-highlight-yellow { --doc-fill: light-dark(#f9f3dc, #504425); --doc-fill-deep: light-dark(#cb9434, #ca9849); }
281
+ .doc-highlight-green { --doc-fill: light-dark(#e8f1ec, #263d30); --doc-fill-deep: light-dark(#50946e, #529e72); }
282
+ .doc-highlight-blue { --doc-fill: light-dark(#e5f2fc, #233850); --doc-fill-deep: light-dark(#387dc9, #5e87c9); }
283
+ .doc-highlight-purple { --doc-fill: light-dark(#f3ebf9, #3c2d47); --doc-fill-deep: light-dark(#9a6bb4, #9d68d3); }
284
+ .doc-highlight-pink { --doc-fill: light-dark(#fae9f1, #4e2b3c); --doc-fill-deep: light-dark(#c14c8a, #d15796); }
285
+ .doc-highlight-red { --doc-fill: light-dark(#fce9e7, #502c29); --doc-fill-deep: light-dark(#cf5148, #df5452); }
286
+
287
+ /* A block's color (颜色 in the page editor's block menu, Notion's block colors): the same classes on
288
+ a paragraph or heading color its whole text, or put a background behind the whole block. The
289
+ background reaches 2px past the block, round by 4px, which is just where the editor's light blue
290
+ of a selected text block lies (Feishu's), and takes no room: nothing moves when a block is given
291
+ one (padding and margins once made a heading shift and a paragraph's fill outgrow its selection). */
292
+ :is(p, h1, h2, h3, h4):is(.doc-highlight-gray, .doc-highlight-brown, .doc-highlight-orange, .doc-highlight-yellow, .doc-highlight-green, .doc-highlight-blue, .doc-highlight-purple, .doc-highlight-pink, .doc-highlight-red) { border-radius: 2px; box-shadow: 0 0 0 2px var(--doc-fill); }
293
+
294
+ /* A component that failed to start or draw, told next to it to who writes the page (the kit's runtime;
295
+ never in an export or a presentation, nor on paper). */
296
+ .doc-kit-error {
297
+ margin: 8px 0;
298
+ padding: 8px 12px;
299
+ border-radius: 6px;
300
+ color: light-dark(#a1352b, #f19c92);
301
+ background: light-dark(#fce9e7, #3b2321);
302
+ font: 13px/1.5 var(--doc-mono);
303
+ white-space: pre-wrap;
304
+ }
305
+ @media print {
306
+ .doc-kit-error { display: none; }
307
+ }
308
+
309
+ @media (prefers-reduced-motion: reduce) {
310
+ *, *::before, *::after { scroll-behavior: auto !important; transition-duration: .01ms !important; }
311
+ }
312
+
313
+ /* The page: the reading column (or full width) and the report's header (kicker, title, a
314
+ line under the title). */
315
+
316
+ .doc-page {
317
+ container-type: inline-size;
318
+ width: min(
319
+ var(--doc-content-max-width),
320
+ calc(100% - (2 * var(--doc-page-gutter)))
321
+ );
322
+ margin: 0 auto;
323
+ /* Top room for the shared controls is fixed, so the page never moves when they appear. Below the
324
+ last block, room to scroll it up toward the middle of the window (Notion's 30vh), 64px at least. */
325
+ padding: 52px 0 max(64px, 30vh);
326
+ /* A run with no place to break (a long path or URL in prose, a callout or inline code) breaks
327
+ where it would leave its line, as a cell's, a caption's and a code block's already do: unbroken,
328
+ it widened the page past a 360px window. break-word, not anywhere: a word still counts whole
329
+ for min-content, so a table's columns and a card's least width stay as they were. */
330
+ overflow-wrap: break-word;
331
+ }
332
+
333
+ :root[data-doc-width="full"] .doc-page {
334
+ width: calc(100% - (2 * var(--doc-wide-gutter)));
335
+ max-width: none;
336
+ }
337
+
338
+ /* The page's icon (Notion's): above the title, left-aligned with its text, as large as Notion's
339
+ for its title (78px for 40px there). An emoji, an icon of the MingCute or Tabler set in a color
340
+ (data-icon) or an image of the report's folder; the preview, a build and an export show each as a
341
+ picture inside (render/emoji.mjs): an emoji's Twemoji image, the icon's SVG in the color below
342
+ (Notion's ten, light and dark), the image covering its box, 4 round. Written as the emoji itself, the
343
+ system's font shows it. */
344
+ .doc-icon {
345
+ width: max-content;
346
+ margin: 0 0 12px;
347
+ font-size: 56px;
348
+ line-height: 1;
349
+ font-family: "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", sans-serif;
350
+ }
351
+ .doc-icon > img,
352
+ .doc-icon > svg { display: block; width: 56px; height: 56px; }
353
+ .doc-icon > img:not([alt]),
354
+ .doc-icon > img[alt=""] { object-fit: cover; border-radius: 4px; }
355
+ .doc-icon[data-icon]:empty { width: 56px; height: 56px; }
356
+ /* The ten colors: shared/emoji/icon-value.mjs ICON_COLOR_VALUES, which tests/unit/icons.mjs holds these rules to. */
357
+ .doc-icon[data-icon$="_gray.svg"] { color: light-dark(#55534E, #D3D3D3); }
358
+ .doc-icon[data-icon$="_lightgray.svg"] { color: light-dark(#A6A299, #7F7F7F); }
359
+ .doc-icon[data-icon$="_brown.svg"] { color: light-dark(#9F6B53, #AA755F); }
360
+ .doc-icon[data-icon$="_yellow.svg"] { color: light-dark(#CB912F, #CA8E1B); }
361
+ .doc-icon[data-icon$="_orange.svg"] { color: light-dark(#D9730D, #D87620); }
362
+ .doc-icon[data-icon$="_green.svg"] { color: light-dark(#448361, #2D9964); }
363
+ .doc-icon[data-icon$="_blue.svg"] { color: light-dark(#337EA9, #2E7CD1); }
364
+ .doc-icon[data-icon$="_purple.svg"] { color: light-dark(#9065B0, #8D5BC1); }
365
+ .doc-icon[data-icon$="_pink.svg"] { color: light-dark(#C14C8A, #C94079); }
366
+ .doc-icon[data-icon$="_red.svg"] { color: light-dark(#D44C47, #CD4945); }
367
+
368
+ .doc-kicker {
369
+ margin: 0 0 8px;
370
+ color: var(--doc-muted);
371
+ font-size: var(--doc-small-font-size);
372
+ font-weight: 600;
373
+ line-height: var(--doc-small-line-height);
374
+ }
375
+
376
+ /* The title keeps one gap below it, whatever comes next, in the header or after it (a line under it,
377
+ body text, a card, a section): its margin collapses with the next block's, through the header. */
378
+ .doc-title {
379
+ margin: 0 0 32px;
380
+ font-size: var(--doc-title-font-size);
381
+ font-weight: 600;
382
+ line-height: var(--doc-title-line-height);
383
+ letter-spacing: -.025em;
384
+ }
385
+
386
+ /* A line under the title (any brief note) is a paragraph like
387
+ any in the body (small text: .doc-note), with the same gaps: the header adds none. */
388
+ .doc-header > .doc-title ~ p { margin: 0 0 var(--doc-paragraph-gap); }
389
+
390
+ @media (max-width: 760px) {
391
+ .doc-page { padding-top: 60px; }
392
+ }
393
+
394
+ @media print {
395
+ .doc-page,
396
+ :root[data-doc-width="full"] .doc-page { width: 100%; padding-top: 0; padding-bottom: 64px; }
397
+ }
398
+
399
+ /* The display settings at the top right (ui.js), as Notion's: one quiet button (no frame, a light
400
+ fill under the pointer) opening a menu card of the reader's choices for this report: its look
401
+ (the system's, light or dark, the chosen one checked), full width (a switch), and a copy of the
402
+ view as it is now. And the kit's plain button. */
403
+
404
+ .doc-display {
405
+ /* A row under the pointer, the button while its menu is open. */
406
+ position: fixed;
407
+ z-index: 1000;
408
+ top: max(10px, env(safe-area-inset-top));
409
+ right: max(16px, env(safe-area-inset-right));
410
+ }
411
+ /* Where the page's side is narrower than the button and its inset (46px: below 804px, the 712px
412
+ reading column and twice that; at full width, whose gutter is at most 40px), a fixed button would
413
+ lie over the text as the page scrolls under it: there it stays in the room the page keeps above its
414
+ header (.doc-page's padding-top, page.css) and scrolls away with the page. The width a media
415
+ query reads counts the window's scrollbar, which the page's side has not: up to 17px more (a
416
+ classic scrollbar, Windows). */
417
+ @media (max-width: 820px) {
418
+ .doc-display { position: absolute; }
419
+ }
420
+ :root[data-doc-width="full"] .doc-display { position: absolute; }
421
+
422
+ .doc-display-button {
423
+ display: grid;
424
+ width: 30px;
425
+ height: 30px;
426
+ padding: 0;
427
+ place-items: center;
428
+ border: 0;
429
+ border-radius: 6px;
430
+ color: var(--doc-muted);
431
+ background: transparent;
432
+ cursor: pointer;
433
+ transition: color 100ms ease-in-out, background-color 100ms ease-in-out;
434
+ }
435
+
436
+ .doc-display-button:hover,
437
+ .doc-display-button[aria-expanded="true"] {
438
+ color: var(--doc-text);
439
+ background: var(--doc-hover);
440
+ }
441
+
442
+ .doc-display-button:active { background: var(--doc-press); }
443
+
444
+ .doc-display-button:focus-visible {
445
+ outline: 2px solid var(--doc-accent);
446
+ outline-offset: -2px;
447
+ }
448
+
449
+ .doc-display-button svg {
450
+ width: 20px;
451
+ height: 20px;
452
+ fill: none;
453
+ stroke: currentColor;
454
+ stroke-width: 1.5;
455
+ stroke-linecap: round;
456
+ stroke-linejoin: round;
457
+ }
458
+
459
+ /* The menu card: radius 10, Notion's popup surface and shadow, sections of rows split by a hairline. */
460
+ .doc-display-menu {
461
+ position: absolute;
462
+ top: calc(100% + 6px);
463
+ right: 0;
464
+ width: 232px;
465
+ max-width: calc(100vw - 24px);
466
+ overflow: hidden;
467
+ border-radius: 10px;
468
+ color: var(--doc-text);
469
+ background: light-dark(#ffffff, #252525);
470
+ box-shadow:
471
+ 0 0 0 1px light-dark(rgb(42 28 0 / 7%), #383836),
472
+ 0 20px 24px light-dark(rgb(25 25 25 / 5%), rgb(0 0 0 / 20%)),
473
+ 0 5px 8px light-dark(rgb(25 25 25 / 2.7%), rgb(0 0 0 / 12%));
474
+ font: 14px/1.2 var(--doc-font);
475
+ transition: opacity 120ms ease-out, translate 120ms ease-out;
476
+ }
477
+
478
+ @starting-style {
479
+ .doc-display-menu { opacity: 0; translate: 0 -4px; }
480
+ }
481
+
482
+ .doc-display-section {
483
+ position: relative;
484
+ display: flex;
485
+ flex-direction: column;
486
+ gap: 1px;
487
+ padding: 4px;
488
+ }
489
+
490
+ .doc-display-section + .doc-display-section::before {
491
+ content: "";
492
+ position: absolute;
493
+ top: 0;
494
+ inset-inline: 12px;
495
+ height: 1px;
496
+ background: light-dark(rgb(42 28 0 / 7%), rgb(255 255 243 / 8%));
497
+ }
498
+
499
+ .doc-display-header {
500
+ padding: 6px 8px 4px;
501
+ color: var(--doc-muted);
502
+ font-size: 12px;
503
+ font-weight: 500;
504
+ user-select: none;
505
+ }
506
+
507
+ .doc-display-item {
508
+ display: flex;
509
+ width: 100%;
510
+ min-height: 28px;
511
+ padding: 0 8px;
512
+ align-items: center;
513
+ gap: 8px;
514
+ border: 0;
515
+ border-radius: 6px;
516
+ color: inherit;
517
+ background: transparent;
518
+ font: inherit;
519
+ text-align: left;
520
+ cursor: pointer;
521
+ user-select: none;
522
+ transition: background-color 20ms ease-in;
523
+ }
524
+
525
+ /* Under the pointer, or reached with the keys: one light fill, as Notion's rows. */
526
+ .doc-display-item:hover,
527
+ .doc-display-item:focus-visible { background: var(--doc-hover); }
528
+
529
+ .doc-display-item:focus { outline: none; }
530
+
531
+ .doc-display-item:active { background: var(--doc-press); }
532
+
533
+ .doc-display-item:disabled { opacity: .5; cursor: progress; }
534
+
535
+ .doc-display-icon {
536
+ display: grid;
537
+ flex: none;
538
+ width: 20px;
539
+ height: 20px;
540
+ place-items: center;
541
+ color: var(--doc-muted);
542
+ }
543
+
544
+ .doc-display-item svg {
545
+ width: 18px;
546
+ height: 18px;
547
+ fill: none;
548
+ stroke: currentColor;
549
+ stroke-width: 1.5;
550
+ stroke-linecap: round;
551
+ stroke-linejoin: round;
552
+ }
553
+
554
+ .doc-display-label {
555
+ flex: 1 1 auto;
556
+ min-width: 0;
557
+ overflow: hidden;
558
+ text-overflow: ellipsis;
559
+ white-space: nowrap;
560
+ }
561
+
562
+ /* The look chosen: a check at the right. */
563
+ .doc-display-item .doc-display-check { flex: none; width: 16px; height: 16px; stroke-width: 1.8; visibility: hidden; }
564
+ .doc-display-item[aria-checked="true"] .doc-display-check { visibility: visible; }
565
+
566
+ /* Full width: a switch, as Notion's (26 × 14, a 14px knob). */
567
+ .doc-display-switch {
568
+ display: flex;
569
+ flex: none;
570
+ width: 26px;
571
+ height: 14px;
572
+ padding: 2px;
573
+ box-sizing: content-box;
574
+ border-radius: 44px;
575
+ background: light-dark(rgb(135 131 120 / 30%), rgb(202 204 206 / 30%));
576
+ transition: background-color 200ms;
577
+ }
578
+
579
+ .doc-display-switch > span {
580
+ width: 14px;
581
+ height: 14px;
582
+ border-radius: 44px;
583
+ background: #ffffff;
584
+ transition: transform 200ms ease-out;
585
+ }
586
+
587
+ .doc-display-item[aria-checked="true"] .doc-display-switch { background: var(--doc-accent); }
588
+ .doc-display-item[aria-checked="true"] .doc-display-switch > span { transform: translateX(12px); }
589
+
590
+ .doc-button {
591
+ display: inline-flex;
592
+ min-height: 36px;
593
+ align-items: center;
594
+ justify-content: center;
595
+ padding: 7px 12px;
596
+ border: 1px solid var(--doc-border);
597
+ border-radius: 8px;
598
+ color: var(--doc-text);
599
+ background: var(--doc-surface);
600
+ font-weight: 500;
601
+ line-height: 20px;
602
+ cursor: pointer;
603
+ transition: background-color 100ms ease, border-color 100ms ease;
604
+ }
605
+
606
+ .doc-button:hover {
607
+ border-color: color-mix(in srgb, var(--doc-text) 22%, transparent);
608
+ background: color-mix(in srgb, var(--doc-text) 5%, var(--doc-surface));
609
+ }
610
+
611
+ .doc-button:focus-visible {
612
+ outline: 2px solid var(--doc-accent);
613
+ outline-offset: 2px;
614
+ }
615
+
616
+ @media print {
617
+ .doc-display { display: none; }
618
+ }
619
+
620
+ /* 选项卡区块 (sheets.js), as Notion's tabs: a frame 16px round (1px, Notion's line) holding a row of
621
+ pill tabs and the panel shown, 16px in; or, with .doc-sheet-shell--plain, no frame and no room
622
+ inside it (the tabs and the panel at the flow's edge). A tab is a pill 32px high, its name 14px:
623
+ gray, a light fill under the pointer; the one shown in the text's color on that fill. Nothing
624
+ beside the page (notion-lite's tabs: no copy of the tabs at the window's edge). */
625
+
626
+ .doc-sheet-shell {
627
+ margin: var(--doc-block-gap) 0;
628
+ border: 1px solid var(--doc-hairline);
629
+ border-radius: 16px;
630
+ }
631
+ .doc-sheet-shell--plain { border: 0; border-radius: 0; }
632
+
633
+ .doc-sheet-tabs {
634
+ display: flex;
635
+ max-width: 100%;
636
+ gap: 4px;
637
+ margin: 16px 16px 14px;
638
+ overflow-x: auto;
639
+ scrollbar-width: none;
640
+ }
641
+ .doc-sheet-tabs::-webkit-scrollbar { display: none; }
642
+ .doc-sheet-shell--plain > .doc-sheet-tabs { margin: 0 0 14px; }
643
+
644
+ .doc-sheet-tab {
645
+ display: inline-flex;
646
+ flex-shrink: 0;
647
+ align-items: center;
648
+ height: 32px;
649
+ padding: 0 10px;
650
+ border: 0;
651
+ border-radius: 9999px;
652
+ color: light-dark(#8e8b86, #9b9a97);
653
+ background: transparent;
654
+ font: inherit;
655
+ font-size: 14px;
656
+ font-weight: 500;
657
+ line-height: 1.2;
658
+ white-space: nowrap;
659
+ cursor: pointer;
660
+ transition: background-color 100ms ease-in-out;
661
+ }
662
+ .doc-sheet-tab:hover { background: var(--doc-hover); }
663
+ .doc-sheet-tab:active { background: var(--doc-press); }
664
+ .doc-sheet-tab[aria-selected="true"] { color: var(--doc-text); background: var(--doc-hover); }
665
+ .doc-sheet-tab[aria-selected="true"]:hover { background: light-dark(rgb(33 27 23 / 7.5%), rgb(255 255 255 / 8%)); }
666
+ .doc-sheet-tab:focus-visible { outline: 2px solid var(--doc-accent); outline-offset: 1px; }
667
+
668
+ .doc-sheet-shell > [data-doc-sheet] { padding: 0 16px 16px; }
669
+ .doc-sheet-shell--plain > [data-doc-sheet] { padding: 0; }
670
+ .doc-sheet-shell > [data-doc-sheet][hidden] { display: none; }
671
+
672
+ /* A tab's emoji (data-tab-icon, the page editor's 编辑图标), before its name. */
673
+ .doc-sheet-tab[data-tab-icon]::before { content: attr(data-tab-icon); margin-inline-end: 6px; font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif; }
674
+ /* Its picture, as the page's icon and a highlight block's (Twemoji, never the system's font): the
675
+ preview, a build and an export give it as --doc-tab-icon (render/emoji.mjs). */
676
+ .doc-sheet-tab[data-tab-icon][style*="--doc-tab-icon"]::before { content: ""; display: inline-block; flex: none; width: 1.125em; height: 1.125em; background: var(--doc-tab-icon) center / contain no-repeat; }
677
+
678
+ /* A report's state widgets (state.js): fields, filter buttons, lists of what the reader kept. */
679
+
680
+ /* Labelled fields, one below another: a whole block of the report's controls. */
681
+ .doc-state-fields {
682
+ display: grid;
683
+ gap: 6px;
684
+ margin-block: var(--doc-component-gap);
685
+ }
686
+
687
+ .doc-state-fields > label {
688
+ margin-top: 4px;
689
+ color: var(--doc-muted);
690
+ font-size: var(--doc-note-font-size);
691
+ line-height: var(--doc-note-line-height);
692
+ }
693
+
694
+ .doc-state-fields > label:first-child { margin-top: 0; }
695
+
696
+ .doc-state-field {
697
+ width: 100%;
698
+ min-height: 38px;
699
+ padding: 8px 10px;
700
+ border: 1px solid var(--doc-border);
701
+ border-radius: 8px;
702
+ color: var(--doc-text);
703
+ background: var(--doc-bg);
704
+ line-height: 20px;
705
+ resize: vertical;
706
+ }
707
+
708
+ .doc-state-field:focus-visible {
709
+ outline: 2px solid var(--doc-accent);
710
+ outline-offset: 2px;
711
+ }
712
+
713
+ .doc-state-actions,
714
+ .doc-filter-row {
715
+ display: flex;
716
+ flex-wrap: wrap;
717
+ gap: 8px;
718
+ align-items: center;
719
+ }
720
+
721
+ .doc-filter-row { margin-block: var(--doc-component-gap); }
722
+
723
+ /* A filter: its buttons and what they filter, one block (the page editor's 整体块). */
724
+ .doc-filter { margin-block: var(--doc-component-gap); }
725
+ .doc-filter > .doc-filter-row { margin-block: 0; }
726
+ .doc-filter > :last-child { margin-bottom: 0; }
727
+
728
+ .doc-state-actions { margin-top: 10px; }
729
+
730
+ .doc-filter-button {
731
+ min-height: 30px;
732
+ padding: 4px 10px;
733
+ border: 1px solid var(--doc-border);
734
+ border-radius: 999px;
735
+ color: var(--doc-muted);
736
+ background: transparent;
737
+ font-size: var(--doc-small-font-size);
738
+ cursor: pointer;
739
+ }
740
+
741
+ .doc-filter-button:hover,
742
+ .doc-filter-button:is(.is-active, [aria-pressed="true"]) {
743
+ color: var(--doc-text);
744
+ border-color: color-mix(in srgb, var(--doc-accent) 48%, var(--doc-border));
745
+ background: var(--doc-accent-soft);
746
+ }
747
+
748
+ .doc-filter-button:focus-visible {
749
+ outline: 2px solid var(--doc-accent);
750
+ outline-offset: 2px;
751
+ }
752
+
753
+ .doc-state-list {
754
+ display: grid;
755
+ gap: 8px;
756
+ margin: 12px 0 var(--doc-component-gap);
757
+ padding: 0;
758
+ list-style: none;
759
+ }
760
+
761
+ .doc-state-list li {
762
+ padding: 9px 10px;
763
+ border-radius: 8px;
764
+ background: color-mix(in srgb, var(--doc-text) 5%, var(--doc-surface));
765
+ }
766
+
767
+ /* 公式 (math.js, KaTeX): inline formulas and formula blocks. */
768
+
769
+ /* An inline formula keeps a hair of optical room (.08em) at each side, a margin and not a space: the
770
+ spaces around it are real text. It wraps with its line as TeX's does: between KaTeX's pieces, after
771
+ a relation or an operator (each piece kept whole: katex.css), never off the line's end. */
772
+ .doc-math-inline { margin-inline: .08em; }
773
+ /* A formula and the closing punctuation right after it (,。、)…: runtime/spacing.js puts them in this
774
+ span, or the bold, link or colored run the formula ends and the marks) are not parted by a line's
775
+ end, so the mark never starts a line: the one place the span holds is between its own children.
776
+ Inside them the line breaks as anywhere: between the formula's pieces, as above, and in the run's
777
+ words before it, which would otherwise make one unbreakable line wider than the page; at a word's
778
+ end only (overflow-wrap: normal), as a cell that breaks a line anywhere it must would part the
779
+ run's end from the marks. */
780
+ .doc-math-tie { white-space: nowrap; }
781
+ .doc-math-tie > :not(.doc-math-inline):not(.katex):not(.doc-math-joiner) { white-space: normal; overflow-wrap: normal; }
782
+ /* The formula's boxes are held too: Chrome breaks after an inline-block (KaTeX's last box) by the
783
+ white-space of its parent, so a .katex-html that wraps would leave the mark at the start of the next
784
+ line. It wraps only at the zero-width spaces between its boxes (.doc-math-break, spacing.js).
785
+ After a wrapper's end Chrome breaks by the wrapper's white-space (normal, above): a word joiner
786
+ (U+2060, no line breaks beside it) drawn before the marks holds that place, generated content of
787
+ an empty span (spacing.js), so that no copy of the text holds it; held as the span is, so that a
788
+ line that breaks anywhere it must (a table cell's, overflow-wrap) does not break there either: a
789
+ formula and its mark wider than the line reach past it rather than part. */
790
+ .doc-math-tie .katex-html { white-space: nowrap; }
791
+ .doc-math-break { white-space: normal; }
792
+ .doc-math-joiner::before { content: "\2060"; }
793
+
794
+ /* Formula blocks often come several together: a group gap apart (their own 8px inside), as disclosures are.
795
+ The block's own size (1.08em) is its text's metrics: the line height (1.8 of it) and the strut the
796
+ formula stands on; the formula's own size is set at .katex below. */
797
+ .doc-math-block {
798
+ max-width: 100%;
799
+ margin: var(--doc-group-gap) 0;
800
+ padding: 8px 0;
801
+ overflow-x: auto;
802
+ color: var(--doc-text);
803
+ font-size: 1.08em;
804
+ line-height: 1.8;
805
+ text-align: center;
806
+ }
807
+
808
+ /* A formula wider than the page scrolls sideways under a thumb as a table's (styles/table.css): 6px,
809
+ round, 3px in from the bottom edge, shown while the pointer is over it; no track, no buttons.
810
+ The page's scrollbar color (base.css, inherited) is set back, or Chrome draws its own bar. */
811
+ .doc-math-block { scrollbar-color: auto; }
812
+ .doc-math-block::-webkit-scrollbar { height: 12px; background: transparent; }
813
+ .doc-math-block::-webkit-scrollbar-button { display: none; }
814
+ .doc-math-block::-webkit-scrollbar-thumb { border: 3px solid transparent; border-radius: 999px; background: transparent padding-box; }
815
+ .doc-math-block:hover::-webkit-scrollbar-thumb { background-color: var(--doc-scrollbar-thumb); }
816
+ .doc-math-block::-webkit-scrollbar-thumb:hover { background-color: var(--doc-scrollbar-thumb-active); }
817
+ @supports not selector(::-webkit-scrollbar) {
818
+ .doc-math-block { scrollbar-width: thin; scrollbar-color: var(--doc-scrollbar-thumb) transparent; }
819
+ }
820
+
821
+ /* KaTeX's own size for formulas in text (as Notion), on the text's line. */
822
+ .doc-math-inline .katex { font-size: 1.21em; line-height: 1; }
823
+ .doc-math-block .katex-display { width: max-content; min-width: 100%; margin: 0; }
824
+ /* A block formula is drawn at 1.08em of the block (KaTeX's 1.21em is set back), and the block is itself
825
+ 1.08em of the text: 1.1664em of the text, 18.66px at the body size, a little smaller than the 1.21em of
826
+ a formula in a line. The two multiply and are kept so: the block's own size is its line height and
827
+ its strut, and one step of 1.1664em instead (the block at 1em) draws the same formula but makes
828
+ every formula block 2.3px lower (kit-diff). */
829
+ .doc-math-block .katex { font-size: 1.08em; }
830
+
831
+ /* A formula block's color (颜色 in the page editor's block menu, base.css's classes): a background
832
+ with room at its sides, or the color of its text. */
833
+ .doc-math-block:is(.doc-highlight-gray, .doc-highlight-brown, .doc-highlight-orange, .doc-highlight-yellow, .doc-highlight-green, .doc-highlight-blue, .doc-highlight-purple, .doc-highlight-pink, .doc-highlight-red) { padding-inline: 12px; border-radius: 10px; }
834
+ .doc-math-block:is(.doc-text-gray, .doc-text-brown, .doc-text-orange, .doc-text-yellow, .doc-text-green, .doc-text-blue, .doc-text-purple, .doc-text-pink, .doc-text-red) { color: var(--doc-ink); }
835
+
836
+ /* A link shown as its page's icon and title (图标视图, 页面块: shared/components/mention.mjs): the
837
+ link's color and line as any link's (base.css), the icon before the title, a little taller than
838
+ a capital and on the text's middle, rounded a little, the line under the title alone; an empty
839
+ icon is a globe drawn in the link's color. */
840
+ .doc-link-mention-icon {
841
+ display: inline-block;
842
+ width: 1.125em;
843
+ height: 1.125em;
844
+ margin-inline-end: .3em;
845
+ vertical-align: -.2em;
846
+ border-radius: 3px;
847
+ object-fit: contain;
848
+ }
849
+ span.doc-link-mention-icon {
850
+ border-radius: 0;
851
+ background: currentColor;
852
+ opacity: .85;
853
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%23000' stroke-width='1.5'%3E%3Ccircle cx='10' cy='10' r='7.25'/%3E%3Cpath d='M2.75 10h14.5M10 2.75c-1.9 2-2.85 4.4-2.85 7.25S8.1 15.25 10 17.25M10 2.75c1.9 2 2.85 4.4 2.85 7.25s-.95 5.25-2.85 7.25'/%3E%3C/svg%3E") center / contain no-repeat;
854
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%23000' stroke-width='1.5'%3E%3Ccircle cx='10' cy='10' r='7.25'/%3E%3Cpath d='M2.75 10h14.5M10 2.75c-1.9 2-2.85 4.4-2.85 7.25S8.1 15.25 10 17.25M10 2.75c1.9 2 2.85 4.4 2.85 7.25s-.95 5.25-2.85 7.25'/%3E%3C/svg%3E") center / contain no-repeat;
855
+ }
856
+
857
+ /* A page block: the address is a document's. An empty icon is a page, as a page with none has in the
858
+ workbench's tree, and the pointer lights it up as Notion's page mention, a whole to click on. */
859
+ .doc-link-mention[href]:not([href^="http" i]) > span.doc-link-mention-icon {
860
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5.75 2.75h5.5l3.5 3.5v9.5a1.5 1.5 0 0 1-1.5 1.5h-7.5a1.5 1.5 0 0 1-1.5-1.5V4.25a1.5 1.5 0 0 1 1.5-1.5z'/%3E%3Cpath d='M11 2.75v3c0 .41.34.75.75.75h3'/%3E%3Cpath d='M7.25 10h5.5M7.25 13h3.5'/%3E%3C/svg%3E");
861
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5.75 2.75h5.5l3.5 3.5v9.5a1.5 1.5 0 0 1-1.5 1.5h-7.5a1.5 1.5 0 0 1-1.5-1.5V4.25a1.5 1.5 0 0 1 1.5-1.5z'/%3E%3Cpath d='M11 2.75v3c0 .41.34.75.75.75h3'/%3E%3Cpath d='M7.25 10h5.5M7.25 13h3.5'/%3E%3C/svg%3E");
862
+ }
863
+ .doc-link-mention[href]:not([href^="http" i]):hover {
864
+ border-radius: 1px;
865
+ background: rgb(148 148 148 / 15%);
866
+ box-shadow: 0 0 0 3px rgb(148 148 148 / 15%);
867
+ }
868
+ /* A page block whose document is not there (render/page-chips.mjs): its words, gray, no line. */
869
+ .doc-link-mention[data-doc-gone] { color: var(--doc-muted); text-decoration: none; }
870
+
871
+ /* One left empty (no address yet: the editor's gray 链接 or 页面) shows to no reader. */
872
+ .doc-link-mention:empty { display: none; }
873
+
874
+ /* 代码块 (code.js): div.doc-code, Feishu's code block in Notion's look. A soft panel holding a
875
+ header (the kit's fold arrow, the block's title, an excerpt's range of lines, the kit's toolbar
876
+ shown while the pointer is over the block: its language, copy and wrap) above its code (the pre),
877
+ its lines numbered and its long lines wrapped. Folded (doc-code--folded) it shows its header
878
+ alone; doc-code--nowrap scrolls its long lines instead. A diff (.doc-diff) looks the same,
879
+ its lines drawn in .doc-diff-body, its header showing its counts. The code's frame height is a
880
+ size (--doc-code-height, sizes.css). */
881
+
882
+ :is(.doc-code, .doc-diff) {
883
+ position: relative;
884
+ display: grid;
885
+ /* The arrow, the title (as wide as its text, cut first, when a range follows it), the range, the
886
+ room left (12px at least: the header's right edge), the toolbar. */
887
+ grid-template-columns: 28px minmax(0, max-content) auto minmax(12px, 1fr) auto;
888
+ align-items: center;
889
+ min-width: 0;
890
+ max-width: 100%;
891
+ margin: var(--doc-block-gap) 0;
892
+ border-radius: 10px;
893
+ color: var(--doc-code-foreground);
894
+ background: var(--doc-code-background);
895
+ /* A line number's size, and the room around it (the editor's gutter reads the same ones). */
896
+ --doc-code-number-size: 12px;
897
+ --doc-code-number-inset: 6px;
898
+ --doc-code-number-gap: 12px;
899
+ /* A line's height, and the least a line takes (the editor's gutter and open code read it too). */
900
+ --doc-code-line-height: 20px;
901
+ }
902
+ /* Code blocks often come several together: a group gap apart, as disclosures (details.css). */
903
+ :is(.doc-code, .doc-diff):has(+ :is(.doc-code, .doc-diff)) { margin-bottom: var(--doc-group-gap); }
904
+ :is(.doc-code, .doc-diff) + :is(.doc-code, .doc-diff) { margin-top: var(--doc-group-gap); }
905
+
906
+ /* The header: the arrow (Feishu's: no fill under the pointer, a short one while pressed), the
907
+ title, the toolbar. */
908
+ .doc-code-fold {
909
+ grid-area: 1 / 1;
910
+ justify-self: center;
911
+ display: flex;
912
+ align-items: center;
913
+ justify-content: center;
914
+ width: 20px;
915
+ height: 20px;
916
+ margin: 0;
917
+ padding: 0;
918
+ border: 0;
919
+ border-radius: 4px;
920
+ color: var(--doc-code-chrome);
921
+ background: transparent;
922
+ cursor: pointer;
923
+ opacity: 0;
924
+ transition: opacity .2s ease;
925
+ }
926
+ .doc-code-fold svg { width: 12px; height: 12px; fill: currentColor; transition: transform .2s ease-out; }
927
+ .doc-code-fold:active { background: var(--doc-code-pressed); }
928
+ :is(.doc-code, .doc-diff):hover > .doc-code-fold,
929
+ .doc-code-fold:focus-visible,
930
+ .doc-code--folded > .doc-code-fold { opacity: 1; }
931
+ .doc-code--folded > .doc-code-fold svg { transform: rotate(-90deg); }
932
+
933
+ /* The title takes the header's room up to the toolbar (the place to click into it in the page editor),
934
+ or, beside a range, as much as its words: body text's size and line (a disclosure's title too,
935
+ details.css). */
936
+ .doc-code-title {
937
+ grid-area: 1 / 2 / 2 / 5;
938
+ min-width: 0;
939
+ min-height: var(--doc-body-line-height);
940
+ padding: var(--doc-block-title-padding) 0;
941
+ overflow: hidden;
942
+ color: var(--doc-caption);
943
+ font-family: var(--doc-font);
944
+ font-size: var(--doc-body-font-size);
945
+ line-height: var(--doc-body-line-height);
946
+ white-space: nowrap;
947
+ text-overflow: ellipsis;
948
+ }
949
+ /* An empty title shows the kit's word for a code block, 代码块 or Code (words.js: the UI's language in
950
+ Gallery, the page's lang in a file of its own; tokens.css holds it). */
951
+ .doc-code-title:empty::before { content: var(--doc-word-code-title); }
952
+ .doc-code:has(> .doc-code-range) > .doc-code-title { grid-column-end: 3; }
953
+
954
+ /* An excerpt's lines (data-line-start), beside its title: 第 120–139 行 (code.js, from its first
955
+ line's number and its count), after a dot, in its line numbers' color, never cut: the title's
956
+ size and line, one line of one size. */
957
+ .doc-code-range {
958
+ grid-area: 1 / 3;
959
+ padding: var(--doc-block-title-padding) 0;
960
+ color: var(--doc-code-line-number);
961
+ font-family: var(--doc-font);
962
+ font-size: var(--doc-body-font-size);
963
+ line-height: var(--doc-body-line-height);
964
+ white-space: nowrap;
965
+ }
966
+ .doc-code-range::before { content: "·"; margin: 0 6px; }
967
+
968
+ .doc-code-tools {
969
+ grid-area: 1 / 5;
970
+ display: flex;
971
+ padding: 0 6px;
972
+ opacity: 0;
973
+ pointer-events: none;
974
+ transition: opacity .2s ease;
975
+ }
976
+ :is(.doc-code, .doc-diff):hover > .doc-code-tools,
977
+ .doc-code-tools:focus-within,
978
+ .doc-code--folded > .doc-code-tools,
979
+ .doc-diff > .doc-code-tools { opacity: 1; pointer-events: auto; }
980
+ .doc-code-toolbar {
981
+ display: flex;
982
+ align-items: center;
983
+ padding: 2px;
984
+ border-radius: 6px;
985
+ background: var(--doc-surface);
986
+ box-shadow: var(--doc-code-toolbar-shadow);
987
+ }
988
+ .doc-code-language,
989
+ .doc-diff-stats {
990
+ padding: 0 6px;
991
+ color: var(--doc-code-chrome);
992
+ font-family: var(--doc-font);
993
+ font-size: 12px;
994
+ line-height: 24px;
995
+ white-space: nowrap;
996
+ }
997
+ .doc-code-separator { width: 1px; height: 16px; margin: 0 4px; border-radius: 2px; background: var(--doc-code-separator); }
998
+ :is(.doc-code-copy, .doc-code-wrap) {
999
+ display: flex;
1000
+ align-items: center;
1001
+ justify-content: center;
1002
+ width: 24px;
1003
+ height: 24px;
1004
+ margin: 0;
1005
+ padding: 0;
1006
+ border: 0;
1007
+ border-radius: 4px;
1008
+ color: var(--doc-code-chrome);
1009
+ background: transparent;
1010
+ cursor: pointer;
1011
+ transition: background .1s ease-in-out;
1012
+ }
1013
+ :is(.doc-code-copy, .doc-code-wrap) svg { display: block; width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.3; stroke-linecap: round; stroke-linejoin: round; }
1014
+ :is(.doc-code-copy, .doc-code-wrap):hover { background: var(--doc-hover); }
1015
+
1016
+ /* Folded, its language and copy show at the right all the time, alone, with no bar (Feishu's; its
1017
+ language is not picked then). */
1018
+ .doc-code--folded .doc-code-toolbar { background: none; box-shadow: none; }
1019
+ .doc-code--folded :is(.doc-code-separator, .doc-code-wrap) { display: none; }
1020
+
1021
+ /* The code: Notion's monospace at 85%, lines numbered in a gutter of their own. */
1022
+ .doc-code > pre,
1023
+ .doc-diff-body {
1024
+ grid-area: 2 / 1 / 3 / -1;
1025
+ box-sizing: border-box;
1026
+ min-width: 0;
1027
+ max-width: 100%;
1028
+ /* Its frame's height, set on the block, else 40 lines (with its padding): past it the code scrolls,
1029
+ its padding below the last line kept as when it does not (the room to edit that line). */
1030
+ max-height: var(--doc-code-height, calc(40 * var(--doc-code-line-height) + 20px));
1031
+ margin: 0;
1032
+ overflow: auto;
1033
+ border: 0;
1034
+ border-radius: 0 0 10px 10px;
1035
+ color: inherit;
1036
+ background: transparent;
1037
+ font-family: var(--doc-code-font);
1038
+ font-size: 14px;
1039
+ font-weight: 400;
1040
+ line-height: var(--doc-code-line-height);
1041
+ tab-size: 2;
1042
+ scrollbar-color: var(--doc-code-scrollbar) transparent;
1043
+ scrollbar-width: thin;
1044
+ }
1045
+ /* Its padding: a code block's, and a diff's (whose lines hold the right one, so that their fills reach its edge).
1046
+ What scrolls into view in a frame that scrolls keeps that room clear of its edges (scroll-padding, as
1047
+ a detail card's content: dialog.css): the caret on the last line takes the code to its very end, the
1048
+ room under that line shown, where the browser stopped with the line against the frame's bottom edge
1049
+ (4px more: the caret's box is a little short of its line). */
1050
+ .doc-code > pre { padding: 2px 22px 18px 6px; scroll-padding-block: 2px 22px; }
1051
+ .doc-diff-body { padding: 0 0 12px; scroll-padding-block: 0 16px; }
1052
+ .doc-code--folded > :is(pre, .doc-diff-body) { display: none; }
1053
+ /* Its code is in the block's font, not the browser's monospace for a code element. */
1054
+ :is(.doc-code > pre, .doc-diff-body) code { font: inherit; }
1055
+
1056
+ .doc-code-lines { display: block; min-width: 100%; white-space: normal; }
1057
+ .doc-code-line { display: flex; min-height: var(--doc-code-line-height); }
1058
+ .doc-code-line[data-line-number]::before {
1059
+ content: attr(data-line-number);
1060
+ box-sizing: content-box;
1061
+ flex-shrink: 0;
1062
+ color: var(--doc-code-line-number);
1063
+ font-size: var(--doc-code-number-size);
1064
+ font-variant-numeric: tabular-nums;
1065
+ user-select: none;
1066
+ }
1067
+ .doc-code-content { flex: 1; min-width: 0; padding-inline: 2px; white-space: pre-wrap; word-break: break-word; }
1068
+ .doc-code--nowrap .doc-code-lines { width: max-content; }
1069
+ .doc-code--nowrap .doc-code-content { white-space: pre; }
1070
+
1071
+ /* Folding a line's structure (Feishu's): a code block's lines keep a column left of their numbers,
1072
+ under the block's own fold arrow (their centers 14px from its edge, as the header's), for the
1073
+ arrows of the lines that start one: rounded, faint (fainter than the block's own arrow), shown while
1074
+ the pointer is over the block (a folded one always, turned); no fill under the pointer, a short
1075
+ one while pressed. A folded line's structure is hidden and "…" follows it. */
1076
+ .doc-code > pre .doc-code-line { position: relative; padding-left: 16px; }
1077
+ /* Its numbers left-aligned on the line its title's text starts on (28px from its edge), as wide as
1078
+ its last one (--doc-code-digits, code.js), 12px from the code; without numbers, the code there.
1079
+ A diff's are right-aligned in 3 digits (below). */
1080
+ .doc-code > pre .doc-code-line[data-line-number]::before { min-width: calc(var(--doc-code-digits, 1) * 1ch); padding: 0 var(--doc-code-number-gap) 0 var(--doc-code-number-inset); text-align: left; }
1081
+ .doc-code[data-line-numbers="false"] > pre .doc-code-line { padding-left: 20px; }
1082
+ .doc-code-line-fold {
1083
+ position: absolute;
1084
+ left: 0;
1085
+ top: 2px;
1086
+ display: flex;
1087
+ align-items: center;
1088
+ justify-content: center;
1089
+ width: 16px;
1090
+ height: 16px;
1091
+ margin: 0;
1092
+ padding: 0;
1093
+ border: 0;
1094
+ border-radius: 4px;
1095
+ color: var(--doc-code-line-fold);
1096
+ background: transparent;
1097
+ cursor: pointer;
1098
+ visibility: hidden;
1099
+ }
1100
+ .doc-code-line-fold svg { width: 10px; height: 10px; fill: currentColor; transition: transform .2s ease-out; }
1101
+ .doc-code-line-fold:active { background: var(--doc-code-pressed); }
1102
+ .doc-code:hover .doc-code-line-fold,
1103
+ .doc-code-line-fold:focus-visible,
1104
+ .doc-code-line--folded > .doc-code-line-fold { visibility: visible; }
1105
+ .doc-code-line--folded > .doc-code-line-fold svg { transform: rotate(-90deg); }
1106
+ .doc-code-line--hidden { display: none; }
1107
+ .doc-code-line--folded > .doc-code-content { flex: 0 1 auto; }
1108
+ .doc-code-line-more {
1109
+ flex: none;
1110
+ width: 24px;
1111
+ height: 16px;
1112
+ margin: 2px 0 0 6px;
1113
+ padding: 0;
1114
+ border: 0;
1115
+ border-radius: 4px;
1116
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='2'%3E%3Ccircle cx='1' cy='1' r='1' fill='%238e8b86'/%3E%3Ccircle cx='6' cy='1' r='1' fill='%238e8b86'/%3E%3Ccircle cx='11' cy='1' r='1' fill='%238e8b86'/%3E%3C/svg%3E") center / 12px 2px no-repeat, var(--doc-code-fold-more);
1117
+ cursor: pointer;
1118
+ }
1119
+ .doc-code-line-more:hover { background-color: var(--doc-code-fold-more-hover); }
1120
+
1121
+ /* A diff: its counts always in its header, as plain text; copying under the pointer; its lines'
1122
+ fills soft, a thin strip at their left. */
1123
+ .doc-diff .doc-code-toolbar { background: none; box-shadow: none; }
1124
+ .doc-diff .doc-code-separator { display: none; }
1125
+ .doc-diff .doc-code-copy { opacity: 0; transition: opacity .2s ease, background .1s ease-in-out; }
1126
+ .doc-diff:hover .doc-code-copy, .doc-diff .doc-code-copy:focus-visible { opacity: 1; }
1127
+ .doc-code-line.has-accent { border-left: 2px solid transparent; }
1128
+ .doc-code-line--added { background: var(--doc-diff-added-fill); }
1129
+ .doc-code-line--removed { background: var(--doc-diff-removed-fill); }
1130
+ .doc-code-line--added.has-accent { border-left-color: var(--doc-diff-added-strip); }
1131
+ .doc-code-line--removed.has-accent { border-left-color: var(--doc-diff-removed-strip); }
1132
+ .doc-code-line--added.has-colored-number::before, .doc-diff-added { color: var(--doc-diff-added); }
1133
+ .doc-code-line--removed.has-colored-number::before, .doc-diff-removed { color: var(--doc-diff-removed); }
1134
+ .doc-diff-body > .doc-code-lines { box-sizing: border-box; }
1135
+ .doc-diff-body .doc-code-line { box-sizing: border-box; padding-right: 22px; }
1136
+ .doc-diff-body .doc-code-line[data-line-number]::before { min-width: 3ch; padding: 0 12px 0 8px; text-align: right; }
1137
+ .doc-diff-stats { display: inline-flex; gap: 6px; font-variant-numeric: tabular-nums; }
1138
+ .doc-diff-stats[hidden] { display: none; }
1139
+ .doc-diff-stats[hidden] + .doc-code-separator { display: none; }
1140
+
1141
+ /* A narrow screen (the kit's narrowest breakpoint): a code block shows its code whole, its lines
1142
+ wrapped (a frame height of its own, a size, still holds: sizes.css), its title wraps rather than
1143
+ being cut, and its toolbar lies over the header's right end when it shows (the pointer or the focus
1144
+ in the block), taking no room from the title; a folded block's too. */
1145
+ @media (max-width: 420px) {
1146
+ .doc-code > pre { max-height: var(--doc-code-height, none); }
1147
+ .doc-code-title { white-space: normal; overflow-wrap: anywhere; text-overflow: clip; }
1148
+ .doc-code > .doc-code-tools { position: absolute; top: 4px; right: 0; }
1149
+ .doc-code--folded:not(:hover) > .doc-code-tools:not(:focus-within) { opacity: 0; pointer-events: none; }
1150
+ }
1151
+
1152
+ /* A code block's color (颜色 in the page editor's block menu, base.css's classes): its background, or
1153
+ the color of the code the highlighter leaves plain. */
1154
+ .doc-code:is(.doc-highlight-gray, .doc-highlight-brown, .doc-highlight-orange, .doc-highlight-yellow, .doc-highlight-green, .doc-highlight-blue, .doc-highlight-purple, .doc-highlight-pink, .doc-highlight-red) { --doc-code-background: var(--doc-fill); }
1155
+ .doc-code:is(.doc-text-gray, .doc-text-brown, .doc-text-orange, .doc-text-yellow, .doc-text-green, .doc-text-blue, .doc-text-purple, .doc-text-pink, .doc-text-red) { --doc-code-foreground: var(--doc-ink); }
1156
+
1157
+ /* A highlight block (高亮块: Notion's callout, notion-lite's look): a group of blocks set apart,
1158
+ 10px round, 12px in, a light gray background by default (Notion's callout gray).
1159
+ A color class on it (the editor's 颜色: base.css) gives it that background, or colors its text
1160
+ and draws it with a thin border instead. An icon (.doc-icon: an emoji, an icon of a set, an
1161
+ image, as the page's) may come first: it stands left of the blocks, 24px, on their first line,
1162
+ the blocks 8px right of it. Its text reads as in any flow; it is for content the reading task
1163
+ needs to stand out. The opening summary is one, first on the page: the same look, the same
1164
+ blocks inside. */
1165
+ :is(.doc-summary, .doc-panel) {
1166
+ position: relative;
1167
+ margin-block: var(--doc-block-gap);
1168
+ padding: 12px;
1169
+ border: 1px solid transparent;
1170
+ border-radius: 10px;
1171
+ }
1172
+ :where(.doc-summary, .doc-panel) { background: light-dark(#f1f1ef, #383836); }
1173
+ :is(.doc-summary, .doc-panel):is(.doc-text-gray, .doc-text-brown, .doc-text-orange, .doc-text-yellow, .doc-text-green, .doc-text-blue, .doc-text-purple, .doc-text-pink, .doc-text-red) { border-color: light-dark(rgb(42 28 0 / 9%), rgb(255 255 243 / 9%)); background: none; }
1174
+
1175
+ /* Its icon, on the first line of its first block (a heading's own line height). */
1176
+ :is(.doc-summary, .doc-panel):has(> .doc-icon) { --doc-panel-line: var(--doc-body-line-height); padding-left: 44px; }
1177
+ :is(.doc-summary, .doc-panel):has(> .doc-icon + h2) { --doc-panel-line: var(--doc-h2-line-height); }
1178
+ :is(.doc-summary, .doc-panel):has(> .doc-icon + h3) { --doc-panel-line: var(--doc-h3-line-height); }
1179
+ :is(.doc-summary, .doc-panel):has(> .doc-icon + h4) { --doc-panel-line: var(--doc-h4-line-height); }
1180
+ /* Its icon alone (no block yet): a line high, so the icon stands inside it (its padding and border around the line). */
1181
+ :is(.doc-summary, .doc-panel):has(> .doc-icon:only-child) { min-height: calc(var(--doc-panel-line) + 26px); }
1182
+ :is(.doc-summary, .doc-panel) > .doc-icon {
1183
+ position: absolute;
1184
+ left: 12px;
1185
+ top: calc(12px + (var(--doc-panel-line) - 24px) / 2);
1186
+ display: flex;
1187
+ align-items: center;
1188
+ justify-content: center;
1189
+ width: 24px;
1190
+ height: 24px;
1191
+ margin: 0;
1192
+ font-size: 21px;
1193
+ line-height: 1;
1194
+ }
1195
+ :is(.doc-summary, .doc-panel) > .doc-icon > :is(img, svg) { width: 22px; height: 22px; }
1196
+ :is(.doc-summary, .doc-panel) > .doc-icon > img[alt=""] { width: 24px; height: 24px; border-radius: 3px; }
1197
+ :is(.doc-summary, .doc-panel) > .doc-icon[data-icon]:empty { width: 24px; height: 24px; }
1198
+
1199
+ /* Its text keeps the flow's gaps (flow.css), and a text, code or formula block at its edges takes none (these rules
1200
+ weigh as much as a component's own margin and stand before the components' files, which win): a
1201
+ card, a table, a callout or a disclosure first or last in it keeps its own margins, a panel's
1202
+ inside being the one place a component is spaced as it is among text. A column's, a disclosure's
1203
+ and a detail card's edges take none whatever the block (flow.css). */
1204
+ :is(.doc-summary, .doc-panel) > :where(:first-child, .doc-icon + *) { margin-top: 0; }
1205
+ :is(.doc-summary, .doc-panel) > :where(:last-child) { margin-bottom: 0; }
1206
+
1207
+ /* ---------- body text in flows ----------
1208
+ A flow is the page itself, a Sheet panel, the content of a section, the opening
1209
+ summary, a highlight panel, a disclosure, a dialog or a column, and of a plain <div> (no class) grouping
1210
+ blocks inside any of them but the page and a panel. The text blocks of a flow (its own
1211
+ paragraphs, headings, lists, quotes and rules) read the same wherever they sit, and the rules
1212
+ stop at them: the inside of a card, table, callout or report widget keeps its own styles, so a
1213
+ component looks the same in any flow too. The flows are the components' descriptions' (flow,
1214
+ and the parts edited as flow: src/shared/components/): the one list of them is the selector
1215
+ below, which every rule of the flow nests in (&), and a unit test holds it to the descriptions.
1216
+ The rules have no weight (:where, and & has none of its own), so any component or report class
1217
+ wins. */
1218
+
1219
+ :where(.doc-page, .doc-section, .doc-summary, .doc-panel, .doc-details-content, .doc-dialog-content, [data-doc-sheet], .doc-column, :is(.doc-section, .doc-summary, .doc-panel, .doc-details-content, .doc-dialog-content, .doc-column) > div:not([class])) {
1220
+ & > :where(p),
1221
+ & > :where(ul, ol, blockquote) :where(p) {
1222
+ margin: 0 0 var(--doc-paragraph-gap);
1223
+ }
1224
+
1225
+ /* The four heading levels (in the flow, or held by one of its list items). */
1226
+ & > :where(h1, h2, h3, h4),
1227
+ & > :where(ul, ol) :where(li) > :where(h1, h2, h3, h4) {
1228
+ color: var(--doc-text);
1229
+ font-weight: 600;
1230
+ letter-spacing: -.025em;
1231
+ }
1232
+ & > :where(h1),
1233
+ & > :where(ul, ol) :where(li) > :where(h1) {
1234
+ margin: 26px 0 10px;
1235
+ font-size: var(--doc-h1-font-size);
1236
+ line-height: var(--doc-h1-line-height);
1237
+ }
1238
+ & > :where(h2),
1239
+ & > :where(ul, ol) :where(li) > :where(h2) {
1240
+ margin: 22px 0 8px;
1241
+ font-size: var(--doc-h2-font-size);
1242
+ line-height: var(--doc-h2-line-height);
1243
+ }
1244
+ & > :where(h3),
1245
+ & > :where(ul, ol) :where(li) > :where(h3) {
1246
+ margin: 20px 0 8px;
1247
+ font-size: var(--doc-h3-font-size);
1248
+ line-height: var(--doc-h3-line-height);
1249
+ }
1250
+ & > :where(h4),
1251
+ & > :where(ul, ol) :where(li) > :where(h4) {
1252
+ margin: 16px 0 8px;
1253
+ font-size: var(--doc-h4-font-size);
1254
+ line-height: var(--doc-h4-line-height);
1255
+ }
1256
+ & > :where(ul, ol) {
1257
+ margin: 10px 0 var(--doc-block-gap);
1258
+ padding-inline-start: 1.625em;
1259
+ }
1260
+ /* One gap between any two items, as Notion's and Feishu's: between items of a level, from an item
1261
+ to the first it holds, from the last it holds to the next item, and from a list to a list right
1262
+ after it (two lists side by side read as one). */
1263
+ & > :where(ul, ol) :where(li + li) { margin-top: var(--doc-list-gap); }
1264
+ & > :where(ul, ol) :where(li > :is(ul, ol)) { margin: var(--doc-list-gap) 0 0; padding-inline-start: 1.5625em; }
1265
+ /* The other blocks an item holds after its text (notion-lite's children of a list item: a paragraph,
1266
+ a heading, an image, a code block…): under its text, at its left edge (the markers hang outside
1267
+ the item), the list's one gap above each and none below; a component's own class keeps its look. */
1268
+ & > :where(ul, ol) :where(li) > :where(p, h1, h2, h3, h4, div, figure, blockquote, details, table, pre, hr) { margin-top: var(--doc-list-gap); margin-bottom: 0; }
1269
+ & > :where(ul, ol):where(:has(+ :is(ul, ol))) { margin-bottom: 0; }
1270
+ & > :where(ul, ol) + :where(ul, ol) { margin-top: var(--doc-list-gap); }
1271
+ /* The lists the kit draws the markers of (& in the rules inside): a list without a class of its own
1272
+ straight in the flow, or straight in a flowchart's step (what a step holds after its title is its
1273
+ content, a list there counted from the first depth again, as in a highlight block: flowchart.css),
1274
+ and the lists their items hold, by depth; no depth goes on through a flowchart (an ol of its
1275
+ class), whose steps' lists start again. */
1276
+ & > :where(ul:not([class]), ol:not([class])), & :where(ol.doc-flow > li) > :where(ul:not([class]), ol:not([class])) {
1277
+ &, & :where(li > :is(ul, ol)) { list-style: none; }
1278
+ & :where(li) { position: relative; }
1279
+ /* Lists (Feishu's): their markers the kit's, blue, left of the text: numbers 1., a., i. by depth,
1280
+ each list from its start (or an item's value), right-aligned 6px from the text; bullets a dot, a
1281
+ ring, a square by depth, 16px left of the text, on the middle of the first line. A list with a
1282
+ class of its own keeps the browser's markers. */
1283
+ & :where(li)::before {
1284
+ position: absolute;
1285
+ right: 100%;
1286
+ color: var(--doc-list-marker);
1287
+ font-variant-numeric: tabular-nums;
1288
+ white-space: nowrap;
1289
+ user-select: none;
1290
+ }
1291
+ :where(&:is(ol) > li, & li > ol:not(.doc-flow) > li)::before { margin-right: 4px; padding: 0 2px; border-radius: 2px; }
1292
+ :where(&:is(ul) > li, & li > ul > li)::before {
1293
+ content: "";
1294
+ top: calc(.5lh - 2.75px);
1295
+ width: 5.5px; /* Feishu's bullet glyphs (Arial 16px at 1.375): 5.4px */
1296
+ height: 5.5px;
1297
+ margin-right: 13.25px; /* its middle 16px left of the text */
1298
+ border-radius: 50%;
1299
+ background: currentColor;
1300
+ }
1301
+ :where(&:is(ol) > li)::before { content: counter(list-item) "."; }
1302
+ :where(& > li > :is(ul, ol:not(.doc-flow)):is(ol) > li)::before { content: counter(list-item, lower-alpha) "."; }
1303
+ :where(& > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)):is(ol) > li)::before { content: counter(list-item, lower-roman) "."; }
1304
+ :where(& > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)):is(ol) > li)::before { content: counter(list-item) "."; }
1305
+ :where(& > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)):is(ol) > li)::before { content: counter(list-item, lower-alpha) "."; }
1306
+ :where(& > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)):is(ol) > li)::before { content: counter(list-item, lower-roman) "."; }
1307
+ :where(& > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)):is(ol) > li)::before { content: counter(list-item) "."; }
1308
+ :where(& > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)):is(ol) > li)::before { content: counter(list-item, lower-alpha) "."; }
1309
+ :where(& > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)):is(ol) > li)::before { content: counter(list-item, lower-roman) "."; }
1310
+ :where(& > li > :is(ul, ol:not(.doc-flow)):is(ul) > li)::before { background: transparent; box-shadow: inset 0 0 0 1px currentColor; }
1311
+ :where(& > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)):is(ul) > li)::before { top: calc(.5lh - 2.5px); width: 5px; height: 5px; margin-right: 13.5px; border-radius: 1px; }
1312
+ :where(& > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)):is(ul) > li)::before { background: transparent; box-shadow: inset 0 0 0 1px currentColor; }
1313
+ :where(& > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)):is(ul) > li)::before { top: calc(.5lh - 2.5px); width: 5px; height: 5px; margin-right: 13.5px; border-radius: 1px; }
1314
+ :where(& > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)):is(ul) > li)::before { background: transparent; box-shadow: inset 0 0 0 1px currentColor; }
1315
+ :where(& > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)) > li > :is(ul, ol:not(.doc-flow)):is(ul) > li)::before { top: calc(.5lh - 2.5px); width: 5px; height: 5px; margin-right: 13.5px; border-radius: 1px; }
1316
+ /* A numbered list giving an item a number of its own (<li value>): the browser's numbers, which count
1317
+ on from it (the kit's do not), in the same blue. */
1318
+ :where(&:is(ol):has(> li[value]), & li > ol:has(> li[value])) { list-style: decimal; }
1319
+ :where(&:is(ol):has(> li[value]), & li > ol:has(> li[value])) > li::before { content: none; }
1320
+ :where(&:is(ol):has(> li[value]), & li > ol:has(> li[value])) > li::marker { color: var(--doc-list-marker); }
1321
+ }
1322
+
1323
+ & > :where(p, ul, ol, blockquote, h1, h2, h3, h4) :where(strong) { font-weight: 600; }
1324
+
1325
+ /* A quote and a divider (in the flow, or held by one of its list items: the same look, there the
1326
+ list's one gap above it and none below, as any block an item holds, none at its sides). */
1327
+ & > :where(blockquote) { margin: var(--doc-block-gap) 0; }
1328
+ & > :where(blockquote),
1329
+ & > :where(ul, ol) :where(li) > :where(blockquote) {
1330
+ margin-inline: 0;
1331
+ padding: 2px 0 2px 14px;
1332
+ border-left: 3px solid var(--doc-border);
1333
+ color: var(--doc-muted);
1334
+ }
1335
+
1336
+ & > :where(blockquote) > :where(:last-child),
1337
+ & > :where(ul, ol) :where(li) > :where(blockquote) > :where(:last-child) { margin-bottom: 0; }
1338
+ & > :where(hr) { margin: var(--doc-component-gap) 0; }
1339
+ & > :where(hr),
1340
+ & > :where(ul, ol) :where(li) > :where(hr) { margin-inline: 0; border: 0; border-top: 1px solid var(--doc-border); }
1341
+ }
1342
+
1343
+ /* The edges of a container of blocks: a column's, a disclosure's content's and a detail card's first
1344
+ block takes no gap above it and its last none below, whatever the block (a highlight panel's are
1345
+ its own: highlight.css, where a component keeps its margins). A Sheet panel's last block takes none
1346
+ below it: a framed panel's room under its blocks is its padding alone (sheets.css), so a paragraph
1347
+ typed into an empty tab leaves its bottom where the tab's placeholder had it. Its first keeps its
1348
+ own under the tabs (notion-lite's heading in a tab keeps its top margin; a paragraph's falls into
1349
+ the tabs' margin). */
1350
+ :is(.doc-column, .doc-details-content, .doc-dialog-content) > :first-child { margin-top: 0; }
1351
+ :is(.doc-column, .doc-details-content, .doc-dialog-content, [data-doc-sheet]) > :last-child { margin-bottom: 0; }
1352
+ /* A text block the reader left empty (a line of space, as in Notion) is one line high: a callout's
1353
+ text and a disclosure's title too. */
1354
+ .doc-page :where(p, h1, h2, h3, h4, li, .doc-callout, .doc-details-summary-label):empty::after { content: "\200b"; }
1355
+
1356
+ /* An item's color (颜色 in the page editor's block menu, notion-lite's: base.css's classes): a text
1357
+ color is its marker's too, and the items it holds take both; a background lies behind it, its
1358
+ marker and the items it holds, 2px past them as a paragraph's (base.css), its part left of the
1359
+ item a second shadow as far out as the list's indent, so that nothing moves. */
1360
+ li:is(.doc-text-gray, .doc-text-brown, .doc-text-orange, .doc-text-yellow, .doc-text-green, .doc-text-blue, .doc-text-purple, .doc-text-pink, .doc-text-red) { --doc-list-marker: var(--doc-ink); }
1361
+ li:is(.doc-highlight-gray, .doc-highlight-brown, .doc-highlight-orange, .doc-highlight-yellow, .doc-highlight-green, .doc-highlight-blue, .doc-highlight-purple, .doc-highlight-pink, .doc-highlight-red) { border-radius: 4px; box-shadow: 0 0 0 2px var(--doc-fill), -1.625em 0 0 2px var(--doc-fill); }
1362
+
1363
+ /* Body text may stand straight in the page or a Sheet panel, before, between or instead of
1364
+ sections (the flow rules above take its known text elements, never a component). The gap below
1365
+ the header is the title's own (page.css), whatever comes first. */
1366
+
1367
+ /* 小字: small text, a block of its own in any flow, as far from the block above as from the one below. */
1368
+ .doc-note {
1369
+ margin: var(--doc-paragraph-gap) 0;
1370
+ color: var(--doc-muted);
1371
+ font-size: var(--doc-note-font-size);
1372
+ line-height: var(--doc-note-line-height);
1373
+ }
1374
+ /* What follows a tab in it (span.doc-tab: the page editor's Tab) stands at the line's right end,
1375
+ as a scope on the left and a unit on the right. */
1376
+ .doc-note:has(> .doc-tab) { display: flow-root; }
1377
+ .doc-note > .doc-tab { float: right; margin-inline-start: 16px; }
1378
+
1379
+ /* 待办事项 (Notion's to-do): ul.doc-todo, a list whose items each have a box where a bullet would
1380
+ be, 16px square with 2px corners, a 1.5px line in the text's color, its middle on the first
1381
+ line's, its right edge 6px left of the text (as the numbers'). A checked item (li[data-checked])
1382
+ has it filled blue with a white check (Notion's), and its own text struck through, the line half
1383
+ the text's color, the text at 65%; the lists it holds keep their look. The list's spacing is any
1384
+ list's (flow.css). The page editor checks an item with a click on its box (or Ctrl+Enter); a
1385
+ report read elsewhere shows it as it is. */
1386
+ ul.doc-todo { list-style: none; }
1387
+ ul.doc-todo > li { position: relative; }
1388
+ ul.doc-todo > li::before {
1389
+ content: "";
1390
+ position: absolute;
1391
+ right: 100%;
1392
+ top: calc(.5lh - 8px);
1393
+ box-sizing: border-box;
1394
+ width: 16px;
1395
+ height: 16px;
1396
+ margin-right: 6px;
1397
+ border: 1.5px solid currentColor;
1398
+ border-radius: 2px;
1399
+ }
1400
+ ul.doc-todo > li[data-checked]::before {
1401
+ border: 0;
1402
+ background: #2783de url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='white' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round' d='m3.25 8.4 3.2 3.2 6.3-7.2'/%3E%3C/svg%3E") center / 14px no-repeat;
1403
+ }
1404
+ ul.doc-todo > li[data-checked] {
1405
+ color: color-mix(in srgb, currentColor 65%, transparent);
1406
+ text-decoration: line-through color-mix(in srgb, currentColor 50%, transparent);
1407
+ }
1408
+ /* The lists a checked item holds: as they are (a decoration reaches every block inside its
1409
+ element, but not an inline block). */
1410
+ ul.doc-todo > li[data-checked] > :is(ul, ol) { display: inline-block; width: 100%; vertical-align: top; color: var(--doc-text); }
1411
+
1412
+ /* 流程图: ol.doc-flow, a list whose items are the steps of a process (the page editor's 步骤流程图).
1413
+ Each step is a node, a container as a highlight block is, drawn as a card: 8px round with a
1414
+ hairline border on the surface's white, its number (the list's own count, from its start; a number
1415
+ of three digits a pill) in a 20px grey circle on the middle of its first line, or its icon there
1416
+ instead (a lead div.doc-icon, as a highlight block's: an emoji, an icon of a set in its color, a
1417
+ picture; 20px), and its blocks: its first a paragraph, its title, bold as the file writes it
1418
+ (<p><strong>…</strong></p>: the kit puts no weight on the paragraph itself, so a title the reader
1419
+ un-bolded reads as body text), the blocks after it its content, ordinary blocks at the body's weight
1420
+ (a heading its own) under the title as a list item's (flow.css: the list's gap above each; a
1421
+ component 8px, and nothing under the last, the card's padding the room there): a paragraph, a
1422
+ heading, a quote, a picture, a code block, a list of any kind, its markers the kit's, counted from
1423
+ the first depth again (flow.css), a flowchart (cards in a card). A step written the short way, its
1424
+ own words before its blocks (<li>收集数据<p>…</p></li>, until the editor rewrites it as a node), is
1425
+ drawn the same: its own words its title at the title's weight, its blocks its content.
1426
+ The steps stand in rows (runtime/flowchart.js works them out and writes them into a stylesheet of
1427
+ its own, keyed by the list's data-doc-flow-key): each row fills the flowchart's width, a step's
1428
+ share of it its weight among the row's (--doc-flow-ratio), 28px between two steps of a row and
1429
+ 34px between two rows; without the kit's rules, one step a row (the column below), which is also
1430
+ what a flowchart of one step a row is. Its layout has no print rule of its own: printed, the kit
1431
+ works the rows out again at the paper's width (runtime/flowchart.js, as the browser lays the page
1432
+ out for paper; the workbench's PDF lays the page out at the paper's width before it prints), so a
1433
+ flowchart prints as a screen as wide as the paper shows it. On paper the kit keeps a flowchart
1434
+ that fits on a page on one, so no arrow from a row's end stands at a page's foot pointing at
1435
+ nothing or is cut by its edge; one taller than a page breaks between its rows where it stands, and
1436
+ printed by the browser the kit leaves out the arrow such a break parts from the row it leads to.
1437
+ An arrow, a 1.5px line and an open chevron in a neutral grey, leads from each step to the next: a
1438
+ step's ::after, a fill clipped (or masked) to the arrow's outline, never text, so nothing selects or
1439
+ edits it. Down the number's column from a step to the one under it (the default here), across on
1440
+ the titles' line to the next step of its row, or, from a row's last step, turning: down half the
1441
+ gap between the rows, across, and down into the next row's first step, its corners 6px round (the
1442
+ runtime's rules choose; the outlines are custom properties of the arrow). A word too long for
1443
+ its card breaks inside it (overflow-wrap), whatever the layout. A step's color (颜色, as a list
1444
+ item takes it): a background fills its card; a text color its words (its content's too), its
1445
+ number and its border. Its margins have no weight (:where), so a container's own trim wins (the
1446
+ first and last block of a highlight panel, flow.css's columns and disclosures), as for every text
1447
+ block.
1448
+ The page editor reads the corners of a step's card, and of the whole flowchart (its cards'), to
1449
+ wrap its selection and frame around them (--doc-box-radius, base.css). */
1450
+
1451
+ /* The middle of a step's first line from its words' top: worked out on the step (its own line
1452
+ height), its number, its icon and its arrow across placed by it. */
1453
+ @property --doc-flow-mid { syntax: "<length>"; inherits: true; initial-value: 13px; }
1454
+
1455
+ :where(ol.doc-flow) { margin: var(--doc-block-gap) 0; }
1456
+ /* Selected whole in the page editor, its fill has its cards' corners. */
1457
+ ol.doc-flow {
1458
+ --doc-box-radius: 8px;
1459
+ --doc-box-reach: 4px;
1460
+ display: flex;
1461
+ flex-direction: column;
1462
+ gap: 34px;
1463
+ padding: 0;
1464
+ list-style: none;
1465
+ }
1466
+ ol.doc-flow > li {
1467
+ --doc-flow-mid: .5lh;
1468
+ --doc-box-radius: 8px;
1469
+ --doc-box-reach: 4px;
1470
+ position: relative;
1471
+ box-sizing: border-box;
1472
+ min-width: 0;
1473
+ margin: 0;
1474
+ padding: 9px 13px 9px 41px;
1475
+ border: 1px solid var(--doc-border);
1476
+ border-radius: 8px;
1477
+ background: var(--doc-surface);
1478
+ box-shadow: none;
1479
+ font-weight: 600; /* a step written the short way: its own words its title */
1480
+ overflow-wrap: anywhere;
1481
+ break-inside: avoid;
1482
+ }
1483
+ /* An empty step is a line high, as an empty item is (flow.css: its ::after is its arrow here), and so
1484
+ is an empty title, its <strong> waiting for words (<p><strong></strong></p>: an empty paragraph is
1485
+ a line high already, flow.css, but one holding an empty element would be none). */
1486
+ ol.doc-flow > li:empty { min-height: calc(1lh + 20px); }
1487
+ ol.doc-flow > li > p:has(> strong:only-child:empty)::after { content: "\200b"; }
1488
+ /* Its number: the ol's count (its start, an item's value), in a circle on the first line's middle, its
1489
+ right edge 8px left of the words (a longer number a pill growing to the left). Its place and size
1490
+ are its own wherever the flowchart stands (a list's markers, flow.css, never reach it). */
1491
+ ol.doc-flow > li::before {
1492
+ content: counter(list-item);
1493
+ position: absolute;
1494
+ top: calc(9px + var(--doc-flow-mid) - 10px);
1495
+ right: calc(100% - 33px);
1496
+ left: auto;
1497
+ box-sizing: border-box;
1498
+ width: auto;
1499
+ min-width: 20px;
1500
+ height: 20px;
1501
+ margin: 0;
1502
+ padding: 0 3px;
1503
+ border-radius: 10px;
1504
+ background: var(--doc-flow-badge);
1505
+ color: var(--doc-muted);
1506
+ font-size: 12px;
1507
+ font-weight: 500;
1508
+ font-variant-numeric: tabular-nums;
1509
+ line-height: 20px;
1510
+ text-align: center;
1511
+ user-select: none;
1512
+ -webkit-print-color-adjust: exact;
1513
+ print-color-adjust: exact;
1514
+ }
1515
+ /* Taken off for a moment by the kit as items move, so the browser counts them again (runtime/flowchart.js). */
1516
+ ol.doc-flow[data-doc-flow-recount] > li::before { content: none; }
1517
+ /* Its icon, first in it (as a highlight block's), in its number's place: 20px on the first line's
1518
+ middle, the number gone (an icon of the numbers, Tabler's, shows its own and is counted by
1519
+ nothing). An emoji and a picture a little inside it, an icon of a set the whole of it. */
1520
+ ol.doc-flow > li:has(> .doc-icon)::before { content: none; }
1521
+ ol.doc-flow > li > .doc-icon {
1522
+ position: absolute;
1523
+ top: calc(9px + var(--doc-flow-mid) - 10px);
1524
+ left: 13px;
1525
+ display: flex;
1526
+ align-items: center;
1527
+ justify-content: center;
1528
+ width: 20px;
1529
+ height: 20px;
1530
+ margin: 0;
1531
+ font-size: 16px;
1532
+ line-height: 1;
1533
+ user-select: none;
1534
+ }
1535
+ ol.doc-flow > li > .doc-icon > img { width: 18px; height: 18px; }
1536
+ ol.doc-flow > li > .doc-icon > svg,
1537
+ ol.doc-flow > li > .doc-icon > img[alt=""] { width: 20px; height: 20px; }
1538
+ ol.doc-flow > li > .doc-icon > img[alt=""] { border-radius: 3px; }
1539
+ ol.doc-flow > li > .doc-icon[data-icon]:empty { width: 20px; height: 20px; }
1540
+ /* The arrow to the next step: down from under this card to the one under it, the numbers' column, 4px
1541
+ clear of each card (34px between them); its outline (a shaft 1.5px thick and an open chevron at
1542
+ 45°, its arms --doc-flow-arm long) is a polygon the ::after's fill is clipped to. Across and
1543
+ turning: the kit's rules (runtime/flowchart.js), with the outlines below. */
1544
+ ol.doc-flow > li:has(~ li)::after {
1545
+ /* The chevron's arms' length; the outlines of an arrow across (a polygon the box is clipped to: a
1546
+ shaft 1.5px thick and an open chevron at 45°, its tip at the right) and of a turning one, which
1547
+ the kit's rules give the arrows that go so (runtime/flowchart.js): down from the top right, a 6px
1548
+ corner, across, a 6px corner, down to the tip at the bottom left, as two mask layers drawn in CSS
1549
+ pixels (no viewBox: nothing in them scaled, so no piece lands a fraction of a pixel off another,
1550
+ as pieces of fractional size did, their joints showing as breaks at the corners). The right one
1551
+ is the box less its first 11px, its path held at its right edge (a nested svg at x 100%): the
1552
+ line down, the corner and the whole line across, cut where the layer starts; the left one, 13px
1553
+ wide, the line across from 1.5px past that cut, the corner, the line down a pixel into the
1554
+ arrow's shaft and the arrow: every joint inside a stroke that covers it whole. */
1555
+ --doc-flow-arm: 4px;
1556
+ --doc-flow-right: polygon(0 calc(50% - .75px), calc(100% - 2.87px) calc(50% - .75px), calc(100% - 1.59px - var(--doc-flow-arm)) calc(50% - var(--doc-flow-arm) + .53px), calc(100% - .53px - var(--doc-flow-arm)) calc(50% - var(--doc-flow-arm) - .53px), 100% 50%, calc(100% - .53px - var(--doc-flow-arm)) calc(50% + var(--doc-flow-arm) + .53px), calc(100% - 1.59px - var(--doc-flow-arm)) calc(50% + var(--doc-flow-arm) - .53px), calc(100% - 2.87px) calc(50% + .75px), 0 calc(50% + .75px));
1557
+ --doc-flow-turn:
1558
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Csvg x='100%25' overflow='visible'%3E%3Cpath d='M-5 0V7A6 6 0 0 1-11 13H-9999' fill='none' stroke='black' stroke-width='1.5'/%3E%3C/svg%3E%3C/svg%3E") right 0 top 0 / calc(100% - 11px) 26px no-repeat,
1559
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='13' height='26'%3E%3Cpath d='M12.5 13H11A6 6 0 0 0 5 19V20' fill='none' stroke='black' stroke-width='1.5'/%3E%3Cpath d='M4.25 19V23.13L1.53 20.41L.47 21.47L5 26L9.53 21.47L8.47 20.41L5.75 23.13V19z'/%3E%3C/svg%3E") left 0 top 0 / 13px 26px no-repeat;
1560
+ content: "";
1561
+ position: absolute;
1562
+ top: calc(100% + 5px);
1563
+ left: 18px;
1564
+ width: 10px;
1565
+ height: 26px;
1566
+ background: var(--doc-flow-line);
1567
+ clip-path: polygon(calc(50% - .75px) 0, calc(50% - .75px) calc(100% - 2.87px), calc(50% - var(--doc-flow-arm) + .53px) calc(100% - 1.59px - var(--doc-flow-arm)), calc(50% - var(--doc-flow-arm) - .53px) calc(100% - .53px - var(--doc-flow-arm)), 50% 100%, calc(50% + var(--doc-flow-arm) + .53px) calc(100% - .53px - var(--doc-flow-arm)), calc(50% + var(--doc-flow-arm) - .53px) calc(100% - 1.59px - var(--doc-flow-arm)), calc(50% + .75px) calc(100% - 2.87px), calc(50% + .75px) 0);
1568
+ pointer-events: none;
1569
+ user-select: none;
1570
+ -webkit-print-color-adjust: exact;
1571
+ print-color-adjust: exact;
1572
+ }
1573
+ /* A turning arrow as an outline the box is clipped to, as the arrows across and down are, where the
1574
+ browser takes shape() (its corners arcs, its line across as long as the box): a mask image is
1575
+ resampled where the box stands between pixels, its same ink spread over a row or two more, so the
1576
+ turn read heavier than the arrow across beside it (the user, 2026-10-26: the same colour, measured,
1577
+ only drawn softer). The line down from the top right (its centre 5px in), a 6px corner, the line
1578
+ across 13px down, a 6px corner, the line down 5px in from the left and the arrow's chevron at the
1579
+ bottom, 1.5px thick: the outer edge down and round, the inner edge back. The kit's rules give it to
1580
+ the arrows that turn (runtime/flowchart.js), the mask above staying where shape() is not taken. */
1581
+ @supports (clip-path: shape(from 0 0, line to 1px 1px)) {
1582
+ ol.doc-flow > li:has(~ li)::after {
1583
+ --doc-flow-turn-mask: none;
1584
+ --doc-flow-turn-shape: shape(from calc(100% - 4.25px) 0, line to calc(100% - 4.25px) 7px, arc to calc(100% - 11px) 13.75px of 6.75px cw, line to 11px 13.75px, arc to 5.75px 19px of 5.25px ccw, line to 5.75px calc(100% - 2.87px), line to calc(5px + var(--doc-flow-arm) - .53px) calc(100% - 1.59px - var(--doc-flow-arm)), line to calc(5px + var(--doc-flow-arm) + .53px) calc(100% - .53px - var(--doc-flow-arm)), line to 5px 100%, line to calc(5px - var(--doc-flow-arm) - .53px) calc(100% - .53px - var(--doc-flow-arm)), line to calc(5px - var(--doc-flow-arm) + .53px) calc(100% - 1.59px - var(--doc-flow-arm)), line to 4.25px calc(100% - 2.87px), line to 4.25px 19px, arc to 11px 12.25px of 6.75px cw, line to calc(100% - 11px) 12.25px, arc to calc(100% - 5.75px) 7px of 5.25px ccw, line to calc(100% - 5.75px) 0, close);
1585
+ }
1586
+ }
1587
+ /* Its blocks: its title first (no gap above it, after its icon too: on the number's line), then its
1588
+ content, at the body's weight (a heading its own, a title's <strong> bold: flow.css), spaced as a
1589
+ list item's blocks are (flow.css); a component in it (a picture, a table, code, a callout, a
1590
+ disclosure, a formula block, a flowchart) 8px under what comes before it and none below, whatever
1591
+ its own margins, and its last block, whatever it is, none below it: the card's padding is the
1592
+ room under its content, as a highlight panel's is. (Written the short way, its first block is its
1593
+ content's, under its own words: the kit's rules give it the list's gap above it again.) */
1594
+ ol.doc-flow > li > :where(p, ul, ol, div, figure, blockquote, details, table, pre) { font-weight: 400; }
1595
+ ol.doc-flow > li > :where(:first-child, .doc-icon + *) { margin-top: 0; }
1596
+ ol.doc-flow > li > :is(div:not(.doc-icon), figure, details, table, pre, ol.doc-flow) { margin-top: 8px; margin-bottom: 0; }
1597
+ ol.doc-flow > li > :where(:last-child) { margin-bottom: 0; }
1598
+
1599
+ /* A step's color (颜色 in the page editor's block menu, base.css's classes): a background fills its
1600
+ card; a text color its words (its content's, a block's own color still its own), its number (a
1601
+ tint of it behind) and its border (a lighter shade). */
1602
+ ol.doc-flow > li:is(.doc-highlight-gray, .doc-highlight-brown, .doc-highlight-orange, .doc-highlight-yellow, .doc-highlight-green, .doc-highlight-blue, .doc-highlight-purple, .doc-highlight-pink, .doc-highlight-red) { background: var(--doc-fill); }
1603
+ ol.doc-flow > li:is(.doc-text-gray, .doc-text-brown, .doc-text-orange, .doc-text-yellow, .doc-text-green, .doc-text-blue, .doc-text-purple, .doc-text-pink, .doc-text-red) { border-color: color-mix(in srgb, var(--doc-ink) 35%, transparent); }
1604
+ ol.doc-flow > li:is(.doc-text-gray, .doc-text-brown, .doc-text-orange, .doc-text-yellow, .doc-text-green, .doc-text-blue, .doc-text-purple, .doc-text-pink, .doc-text-red)::before { background: color-mix(in srgb, var(--doc-ink) 14%, transparent); color: var(--doc-ink); }
1605
+
1606
+ /* Sizes a card, table, code block or column may carry, as custom properties in its style attribute
1607
+ (the reader sets them in the preview; an author may for a deliberate layout):
1608
+ --doc-span its width as a share of the width it stands in: the reading width, or
1609
+ its column's (.5 is half, 1 all of it; past 1 a table is that much
1610
+ wider and scrolls sideways in its wrapper); a picture's as a share of
1611
+ the reading width wherever it stands, at most the width it stands in
1612
+ (1: all of that), as notion-lite keeps a picture's own width in pixels:
1613
+ moved into a column it keeps its size, never wider than the column
1614
+ --doc-chart-height a chart card's plot height, in px
1615
+ --doc-table-height how tall a table's scroll area grows, in px (or none: all rows); unset,
1616
+ a long table of data at most 72vh or 720px, a short one or one mostly
1617
+ of words whole (table.css)
1618
+ --doc-code-height a code block's frame height, in px (on the pre or its code card):
1619
+ longer code scrolls inside it
1620
+ --doc-column-ratio a column's share of its row, less the gaps (columns.css)
1621
+ Unset, the kit's defaults apply. A width is the block's own, never inherited by blocks inside it. */
1622
+ @property --doc-span { syntax: "*"; inherits: false; }
1623
+ @property --doc-column-ratio { syntax: "*"; inherits: false; }
1624
+ :where(.doc-figure, .doc-table-wrap, .doc-image, .doc-embed) {
1625
+ /* Only valid while --doc-span is set, so var() fallbacks below give the defaults. */
1626
+ --doc-span-width: calc(var(--doc-span) * 100%);
1627
+ }
1628
+ /* The reading width is the page's (100cqw: .doc-page is the one container of the kit, page.css). */
1629
+ :where(.doc-image) { --doc-span-width: min(100%, calc(var(--doc-span) * 100cqw)); }
1630
+
1631
+ /* 分栏: blocks side by side (Feishu's columns). A .doc-columns holds 2 to 5 .doc-column, each
1632
+ a flow of blocks like a section's. A column's width is its share of the row less the gaps
1633
+ (--doc-column-ratio, the shares of a row adding up to 1); none written, the columns are
1634
+ equal. Blocks in a column keep no outer margin at its top or bottom. On a narrow screen the
1635
+ columns stack, each the row's width. */
1636
+ .doc-columns {
1637
+ display: flex;
1638
+ gap: var(--doc-column-gap);
1639
+ margin-block: var(--doc-component-gap);
1640
+ }
1641
+
1642
+ .doc-column {
1643
+ flex: calc(100 * var(--doc-column-ratio, 1)) 1 0%;
1644
+ min-width: 0;
1645
+ }
1646
+
1647
+ @media (max-width: 640px) {
1648
+ .doc-columns { flex-direction: column; }
1649
+ .doc-column { flex: none; }
1650
+ }
1651
+
1652
+ /* 卡片块: a card holding a figure (a chart, chart.css, or a drawing of the report's own), its title
1653
+ and caption, framed once: a border, round corners and the surface, inset at its sides
1654
+ (data-surface="bounded", which older files write, says the same). Its width and plot height are sizes (sizes.css); .doc-figure--compact centers it. A
1655
+ picture block is no card (figure.doc-image, image.css): it has no frame. */
1656
+
1657
+ .doc-figure {
1658
+ width: var(--doc-span-width, auto);
1659
+ min-width: 0;
1660
+ max-width: 100%;
1661
+ margin: var(--doc-component-gap) 0;
1662
+ padding: 20px 24px 16px;
1663
+ border: 1px solid var(--doc-border);
1664
+ border-radius: 10px;
1665
+ background: var(--doc-surface);
1666
+ }
1667
+
1668
+ .doc-figure--compact {
1669
+ width: var(--doc-span-width, min(100%, var(--doc-compact-figure-max-width)));
1670
+ margin-inline: auto;
1671
+ }
1672
+
1673
+ /* A card's title (its own heading, straight in it) takes the heading scale; the headings of a drawing
1674
+ inside it are the drawing's. */
1675
+ .doc-figure > :where(h2, h3) { margin: 0; font-weight: 600; letter-spacing: -.025em; }
1676
+
1677
+ .doc-figure > h2 {
1678
+ font-size: var(--doc-h2-font-size);
1679
+ line-height: var(--doc-h2-line-height);
1680
+ }
1681
+
1682
+ .doc-figure > h3 {
1683
+ font-size: var(--doc-card-title-font-size);
1684
+ line-height: var(--doc-card-title-line-height);
1685
+ }
1686
+
1687
+ /* A card's caption: the kit's p.doc-figure-caption, or a <figcaption> of the report's own figure,
1688
+ which the intake makes a card as it stands (natural.mjs), read the same. */
1689
+ .doc-figure-caption,
1690
+ .doc-figure > :where(figcaption) {
1691
+ margin: 5px 0 0;
1692
+ color: var(--doc-muted);
1693
+ font-size: var(--doc-small-font-size);
1694
+ line-height: var(--doc-small-line-height);
1695
+ }
1696
+
1697
+ /* The room between a card's header (its title, a caption under it) and what it holds: 12px below the
1698
+ header's last line, whatever follows, a chart (whose own 12px it shares: the margins collapse, a
1699
+ card's children standing in its block flow) or a drawing of the report's own with no margin of its
1700
+ own, an inline <svg> too; a drawing's own larger margin stays its own. A caption right under the
1701
+ title keeps its 5px (the title's 12px and its -7px collapse to 5px); nothing after the last child.
1702
+ After the caption's rule, which weighs the same. */
1703
+ .doc-figure > :where(h2, h3, .doc-figure-caption, figcaption):not(:last-child) { margin-bottom: 12px; }
1704
+ .doc-figure > :where(h2, h3) + :where(.doc-figure-caption, figcaption) { margin-top: -7px; }
1705
+
1706
+ @media (max-width: 760px) {
1707
+ /* A card at the reading width. */
1708
+ .doc-figure { width: auto; }
1709
+ }
1710
+
1711
+ @media (max-width: 420px) {
1712
+ .doc-figure { padding: 18px 16px 14px; }
1713
+ }
1714
+
1715
+ /* The media blocks (图片 image.css, 文件 file.css, 网页书签 bookmark.css, 嵌入 embed.css): each a
1716
+ figure with its content and a caption under it, which they share: the caption is 14px, gray, as
1717
+ close to the block as Notion's (notion-lite's media.css: 6px above and below, 2px in from the left)
1718
+ and shown only with text (an empty <figcaption> is always written), and a figure left empty (the
1719
+ page editor's placeholder, kept in the file) is nothing to readers. An image's caption is centered
1720
+ (image.css: Feishu's). A new media block is one more name in these lists. */
1721
+ :is(.doc-image, .doc-file, .doc-bookmark, .doc-embed) > figcaption {
1722
+ padding: 6px 0 6px 2px;
1723
+ color: var(--doc-caption);
1724
+ font-size: 14px;
1725
+ line-height: 1.4;
1726
+ overflow-wrap: break-word;
1727
+ }
1728
+ :is(.doc-image, .doc-file, .doc-bookmark, .doc-embed) > figcaption:empty { display: none; }
1729
+ figure:is(.doc-image, .doc-file, .doc-bookmark, .doc-embed):not(:has(> *)) { display: none; }
1730
+
1731
+ /* 图片 (Notion's image block): a picture of the report's folder and its caption under it.
1732
+ Its width is the picture's own, at most the width it stands in, or --doc-span (sizes.css: a
1733
+ share of the reading width, at most the width it stands in; the picture then fills it). Without a span it is at most 80% of the
1734
+ window's height, its width following, so a tall picture (a scan, a phone's screenshot) shows
1735
+ whole on a screen; a picture wider than tall reaches that only on a short window. Centered;
1736
+ .doc-image--left and .doc-image--right put it at that side. The caption is as wide as the
1737
+ picture (it takes no width of its own): 14px, gray, shown only with text (an empty <figcaption>
1738
+ is always written). */
1739
+ :where(.doc-image) {
1740
+ /* Only valid while --doc-span is set (--doc-span-width, sizes.css), so the fallbacks below give the picture's own width. */
1741
+ --doc-image-fill: calc(var(--doc-span) * 0% + 100%);
1742
+ }
1743
+
1744
+ .doc-image {
1745
+ width: var(--doc-span-width, fit-content);
1746
+ min-width: 0;
1747
+ max-width: 100%;
1748
+ margin: var(--doc-media-gap) auto;
1749
+ }
1750
+ .doc-image--left { margin-inline: 0 auto; }
1751
+ .doc-image--right { margin-inline: auto 0; }
1752
+
1753
+ .doc-image > img {
1754
+ display: block;
1755
+ width: var(--doc-image-fill, auto);
1756
+ max-width: 100%;
1757
+ /* A picture the reader sized is as tall as its width makes it: with a span the fill is a
1758
+ percentage, which against the figure's height (its content's) is no limit. */
1759
+ max-height: var(--doc-image-fill, 80vh);
1760
+ height: auto;
1761
+ /* A width of the source's own on the picture (style="width: 300px") meets that height limit
1762
+ without its shape changing: the picture is drawn whole inside the box, never stretched. */
1763
+ object-fit: contain;
1764
+ border-radius: 2px;
1765
+ }
1766
+
1767
+ /* Centered under the picture (Feishu's), the rest of its caption the media blocks' (media.css). */
1768
+ .doc-image > figcaption {
1769
+ contain: inline-size; /* as wide as the picture, never wider */
1770
+ padding-inline: 2px;
1771
+ text-align: center;
1772
+ }
1773
+
1774
+ @media print {
1775
+ .doc-image { break-inside: avoid; }
1776
+ }
1777
+
1778
+ /* 文件 (Notion's file block): one file of the report's folder as a row the reader clicks to save
1779
+ it: Notion's page-with-an-arrow icon, the file's name (cut with an ellipsis), its size in small
1780
+ gray type and a download mark at the right end; the row lights up under the pointer. Its caption
1781
+ under it as media.css has it. */
1782
+ /* Its name as far from the text around it as a line of text from the next (notion-lite's file row
1783
+ is as tall as a line of text): the media gap less its row's own padding; its row 10px round as a
1784
+ code block (--doc-box-radius: what the editor's selection wraps). */
1785
+ .doc-file {
1786
+ --doc-box-radius: 10px;
1787
+ --doc-box-reach: 4px; /* the editor's selection 4px past its row (notion-lite's): two files' fills never meet */
1788
+ min-width: 0;
1789
+ margin: calc(var(--doc-media-gap) - 4px) 0;
1790
+ }
1791
+
1792
+ .doc-file-link {
1793
+ display: flex;
1794
+ align-items: center;
1795
+ gap: 4px;
1796
+ padding: 2px 4px 2px 2px;
1797
+ border-radius: 10px;
1798
+ color: inherit;
1799
+ text-decoration: none;
1800
+ cursor: pointer;
1801
+ transition: background 20ms ease-in;
1802
+ }
1803
+ .doc-file-link:hover { background: var(--doc-hover); }
1804
+ .doc-file-link:active { background: var(--doc-press); }
1805
+ .doc-file-link::before,
1806
+ .doc-file-link::after {
1807
+ content: "";
1808
+ flex-shrink: 0;
1809
+ background: currentColor;
1810
+ mask: var(--doc-file-icon) center / 20px no-repeat;
1811
+ }
1812
+ .doc-file-link::before { --doc-file-icon: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.25%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M6.25%202.75h4.5l4.5%204.5v8.5a1.5%201.5%200%200%201-1.5%201.5h-7.5a1.5%201.5%200%200%201-1.5-1.5v-11.5a1.5%201.5%200%200%201%201.5-1.5z%22%2F%3E%3Cpath%20d%3D%22M10.75%202.75v3a1.5%201.5%200%200%200%201.5%201.5h3%22%2F%3E%3Cpath%20d%3D%22M10%2014v-4.75M7.9%2011.1%2010%209l2.1%202.1%22%2F%3E%3C%2Fsvg%3E"); width: 22px; height: 22px; }
1813
+ .doc-file-link::after { --doc-file-icon: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.25%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Ccircle%20cx%3D%2210%22%20cy%3D%2210%22%20r%3D%227.25%22%2F%3E%3Cpath%20d%3D%22M10%206.5v6.25M7.4%2010.2%2010%2012.8l2.6-2.6%22%2F%3E%3C%2Fsvg%3E"); width: 24px; height: 24px; margin-inline-start: auto; background: var(--doc-caption); }
1814
+ .doc-file-name {
1815
+ min-width: 0;
1816
+ overflow: hidden;
1817
+ text-overflow: ellipsis;
1818
+ white-space: nowrap;
1819
+ }
1820
+ .doc-file-size {
1821
+ flex-shrink: 0;
1822
+ margin-inline-start: 2px;
1823
+ color: var(--doc-caption);
1824
+ font-size: 12px;
1825
+ line-height: 16px;
1826
+ white-space: nowrap;
1827
+ }
1828
+
1829
+ /* A file's color (颜色 in the page editor's block menu, base.css's classes): its background (the figure's, the caption in it), round as its row; its text the text color. */
1830
+ .doc-file:is(.doc-highlight-gray, .doc-highlight-brown, .doc-highlight-orange, .doc-highlight-yellow, .doc-highlight-green, .doc-highlight-blue, .doc-highlight-purple, .doc-highlight-pink, .doc-highlight-red) { border-radius: 10px; }
1831
+
1832
+ @media print {
1833
+ .doc-file-link::after { display: none; }
1834
+ }
1835
+
1836
+ /* 网页书签 (Notion's bookmark block, its classic card): a web page as a card, 10px round with a thin
1837
+ border, lighting up under the pointer. At the left its title (one line), description (two lines,
1838
+ gray) and address with the page's icon; at the right its cover filling the card's height. Where
1839
+ the card is narrower than about 360px the cover goes (it wraps above, with no height). Its
1840
+ caption under it as media.css has it. */
1841
+ /* Set apart from the blocks around it as an image is; its card's corners what the editor's selection
1842
+ wraps (--doc-box-radius). */
1843
+ .doc-bookmark {
1844
+ --doc-box-radius: 10px;
1845
+ min-width: 0;
1846
+ margin: var(--doc-media-gap) 0;
1847
+ }
1848
+
1849
+ .doc-bookmark-card {
1850
+ display: flex;
1851
+ flex-wrap: wrap-reverse;
1852
+ align-items: stretch;
1853
+ overflow: hidden;
1854
+ border: 1px solid light-dark(rgb(28 19 1 / 11%), rgb(255 255 235 / 10%));
1855
+ border-radius: 10px;
1856
+ color: inherit;
1857
+ text-decoration: none;
1858
+ cursor: pointer;
1859
+ transition: background 20ms ease-in;
1860
+ }
1861
+ .doc-bookmark-card:hover { background: var(--doc-hover); }
1862
+ .doc-bookmark-card:active { background: var(--doc-press); }
1863
+
1864
+ .doc-bookmark-text {
1865
+ display: block;
1866
+ flex: 4 1 180px;
1867
+ min-width: 0;
1868
+ padding: 12px 14px 14px;
1869
+ overflow: hidden;
1870
+ }
1871
+ .doc-bookmark-title {
1872
+ display: block;
1873
+ min-height: 24px;
1874
+ margin-bottom: 2px;
1875
+ overflow: hidden;
1876
+ font-size: 14px;
1877
+ line-height: 20px;
1878
+ text-overflow: ellipsis;
1879
+ white-space: nowrap;
1880
+ }
1881
+ .doc-bookmark-description {
1882
+ display: block;
1883
+ height: 32px;
1884
+ overflow: hidden;
1885
+ color: var(--doc-caption);
1886
+ font-size: 12px;
1887
+ line-height: 16px;
1888
+ }
1889
+ .doc-bookmark-url {
1890
+ display: flex;
1891
+ margin-top: 6px;
1892
+ }
1893
+ .doc-bookmark-icon {
1894
+ flex-shrink: 0;
1895
+ width: 16px;
1896
+ height: 16px;
1897
+ margin-inline-end: 6px;
1898
+ }
1899
+ .doc-bookmark-href {
1900
+ min-width: 0;
1901
+ overflow: hidden;
1902
+ font-size: 12px;
1903
+ line-height: 16px;
1904
+ text-overflow: ellipsis;
1905
+ white-space: nowrap;
1906
+ }
1907
+ .doc-bookmark-cover {
1908
+ position: relative;
1909
+ display: block;
1910
+ flex: 1 1 180px;
1911
+ }
1912
+ .doc-bookmark-cover > img {
1913
+ position: absolute;
1914
+ inset: 0;
1915
+ display: block;
1916
+ width: 100%;
1917
+ height: 100%;
1918
+ object-fit: cover;
1919
+ border-radius: 2px;
1920
+ }
1921
+
1922
+ /* A bookmark's color (颜色 in the page editor's block menu, base.css's classes): its background (the figure's, behind its card and the caption), round as its card; its text the text color. */
1923
+ .doc-bookmark:is(.doc-highlight-gray, .doc-highlight-brown, .doc-highlight-orange, .doc-highlight-yellow, .doc-highlight-green, .doc-highlight-blue, .doc-highlight-purple, .doc-highlight-pink, .doc-highlight-red) { border-radius: 10px; }
1924
+
1925
+ @media print {
1926
+ .doc-bookmark-card { break-inside: avoid; }
1927
+ }
1928
+
1929
+ /* 嵌入 (Notion's embed block): a web page, or an HTML or PDF file of the report's folder, in a frame
1930
+ as wide as the text, --doc-embed-height tall (320px; a file's 500px, in a thin round border
1931
+ as Notion's HTML file). Its caption under it as media.css has it. */
1932
+ /* Set apart from the blocks around it as an image is; its frame 6px round, which the editor's
1933
+ selection wraps (--doc-box-radius). */
1934
+ .doc-embed {
1935
+ --doc-box-radius: 6px;
1936
+ width: var(--doc-span-width, auto); /* sizes.css */
1937
+ min-width: 0;
1938
+ margin: var(--doc-media-gap) auto;
1939
+ }
1940
+
1941
+ .doc-embed > .doc-embed-frame {
1942
+ display: block;
1943
+ width: 100%;
1944
+ height: var(--doc-embed-height, 320px);
1945
+ border: 0;
1946
+ border-radius: 6px;
1947
+ background: var(--doc-surface);
1948
+ }
1949
+ .doc-embed--file > .doc-embed-frame {
1950
+ height: var(--doc-embed-height, 500px);
1951
+ border: 1px solid var(--doc-hairline);
1952
+ border-radius: 6px;
1953
+ }
1954
+
1955
+ @media print {
1956
+ .doc-embed { break-inside: avoid; }
1957
+ }
1958
+
1959
+ /* A chart host (charts.js): room before its type draws, the line a chart drawn from a table says when
1960
+ it draws nothing, its svg, and the axis look a report's own chart takes by class (a group of class
1961
+ "axis", as d3.axisBottom draws). */
1962
+
1963
+ .doc-chart {
1964
+ position: relative;
1965
+ min-width: 0;
1966
+ margin-top: 12px;
1967
+ }
1968
+
1969
+ /* Room for a chart not drawn yet (nothing in its host but its data); drawn, it is as tall as what
1970
+ its type drew (a card follows its chart's height, also one set shorter or scaled down in a narrow
1971
+ card), an svg of it or the HTML of a part (its own buttons beside its svg). */
1972
+ .doc-chart:not(:has(> :not(script))) { min-height: 280px; }
1973
+
1974
+ /* A chart drawn from a table with nothing to draw (charts/from-table.js): a muted line saying why,
1975
+ in place of the plot. */
1976
+ .doc-chart-message {
1977
+ padding: 28px 0;
1978
+ color: var(--doc-muted);
1979
+ font-size: var(--doc-small-font-size);
1980
+ line-height: var(--doc-small-line-height);
1981
+ text-align: center;
1982
+ }
1983
+
1984
+ .doc-chart > svg {
1985
+ display: block;
1986
+ width: 100%;
1987
+ height: auto;
1988
+ overflow: visible;
1989
+ }
1990
+
1991
+ .doc-chart .axis text {
1992
+ fill: var(--doc-muted);
1993
+ font-family: var(--doc-font);
1994
+ font-size: var(--doc-chart-axis-font-size);
1995
+ }
1996
+ .doc-chart .axis path,
1997
+ .doc-chart .axis line { stroke: var(--doc-border); }
1998
+
1999
+ /* 详情卡片 (dialogs.js): a link that opens a detail card, and the card: a modal dialog whose content
2000
+ region is a flow, the page's text at the page's width. */
2001
+
2002
+ /* The link reads as a button in the text: a rounded fill around the words, which keep the text's
2003
+ color, and a small open icon after them; its line breaks keep the fill on each piece. */
2004
+ .doc-dialog-trigger {
2005
+ display: inline;
2006
+ margin: 0 1px;
2007
+ padding: 1px 5px 1px 6px;
2008
+ border: 0;
2009
+ border-radius: 6px;
2010
+ color: inherit;
2011
+ background: color-mix(in srgb, currentColor 8%, transparent);
2012
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, currentColor 9%, transparent);
2013
+ font: inherit;
2014
+ font-weight: inherit;
2015
+ line-height: inherit;
2016
+ text-align: inherit;
2017
+ text-decoration: none;
2018
+ vertical-align: baseline;
2019
+ cursor: pointer;
2020
+ -webkit-box-decoration-break: clone;
2021
+ box-decoration-break: clone;
2022
+ transition: background-color 0.12s ease;
2023
+ }
2024
+
2025
+ /* The icon never stands alone on a line, apart from the last word (agent-sim-2026-10-28: a link
2026
+ ending at the line's end at 1024px put it on the next): an inline box, not an inline-block (a
2027
+ line may break before one), holding a word joiner (U+2060, no break on either side of it), its
2028
+ 0.72em of room its padding, the icon a mask of that size at its right. */
2029
+ .doc-dialog-trigger::after {
2030
+ content: "\2060";
2031
+ display: inline;
2032
+ margin-left: 0.3em;
2033
+ padding-left: 0.72em;
2034
+ background: currentColor;
2035
+ opacity: 0.45;
2036
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9.5 2.5h4v4M13.5 2.5 9 7M6.5 13.5h-4v-4M2.5 13.5 7 9'/%3E%3C/svg%3E") right center / 0.72em 0.72em no-repeat;
2037
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9.5 2.5h4v4M13.5 2.5 9 7M6.5 13.5h-4v-4M2.5 13.5 7 9'/%3E%3C/svg%3E") right center / 0.72em 0.72em no-repeat;
2038
+ }
2039
+
2040
+ .doc-dialog-trigger:hover { background: color-mix(in srgb, currentColor 13%, transparent); }
2041
+ .doc-dialog-trigger:hover::after { opacity: 0.75; }
2042
+
2043
+ .doc-dialog-trigger:focus-visible {
2044
+ outline: 2px solid var(--doc-accent);
2045
+ outline-offset: 1px;
2046
+ }
2047
+
2048
+ /* The page under it keeps still (html.doc-dialog-open), its scrollbar's room kept where it had one
2049
+ (.doc-dialog-gutter): nothing on it moves as a card opens or closes. */
2050
+ @media screen {
2051
+ :root.doc-dialog-open { overflow: hidden; }
2052
+ :root.doc-dialog-open.doc-dialog-gutter { scrollbar-gutter: stable; }
2053
+ }
2054
+
2055
+ /* The reading column and 40px on each side of it, up to the page's sides (their edge while the page
2056
+ is edited, dialog/): 100% is the window less a scrollbar's room kept, as it is for the page. Height
2057
+ follows the content; long content stops at the viewport gutters and scrolls inside. A modal
2058
+ dialog is fixed with inset 0, so `auto` would stretch it; `fit-content` matches the UA default. */
2059
+ .doc-dialog {
2060
+ width: min(
2061
+ calc(var(--doc-content-max-width) + (2 * var(--doc-dialog-side))),
2062
+ calc(100% - (2 * var(--doc-dialog-edge)))
2063
+ );
2064
+ height: fit-content;
2065
+ min-width: 0;
2066
+ max-width: none;
2067
+ min-height: 0;
2068
+ max-height: calc(100dvh - (2 * var(--doc-dialog-block-gutter)));
2069
+ margin: auto;
2070
+ padding: 0;
2071
+ overflow: hidden;
2072
+ border: 0;
2073
+ border-radius: 12px;
2074
+ color: var(--doc-text);
2075
+ background: var(--doc-surface);
2076
+ box-shadow: 0 0 0 1px var(--doc-border), 0 6px 14px rgb(15 15 15 / 8%), 0 18px 48px rgb(15 15 15 / 18%);
2077
+ }
2078
+
2079
+ /* It comes up from a little below, the backdrop fading in. */
2080
+ .doc-dialog[open] {
2081
+ display: flex;
2082
+ flex-direction: column;
2083
+ animation: doc-dialog-in 0.16s cubic-bezier(0.2, 0.8, 0.2, 1);
2084
+ }
2085
+
2086
+ .doc-dialog::backdrop { background: rgb(15 15 15 / 36%); }
2087
+ .doc-dialog[open]::backdrop { animation: doc-dialog-fade 0.16s ease-out; }
2088
+ :root[data-doc-theme="dark"] .doc-dialog::backdrop { background: rgb(0 0 0 / 55%); }
2089
+
2090
+ @media (prefers-color-scheme: dark) {
2091
+ :root:not([data-doc-theme="light"]) .doc-dialog::backdrop { background: rgb(0 0 0 / 55%); }
2092
+ }
2093
+
2094
+ @keyframes doc-dialog-in {
2095
+ from { opacity: 0; transform: translateY(8px) scale(0.985); }
2096
+ }
2097
+
2098
+ @keyframes doc-dialog-fade {
2099
+ from { opacity: 0; }
2100
+ }
2101
+
2102
+ @media (prefers-reduced-motion: reduce) {
2103
+ .doc-dialog[open], .doc-dialog[open]::backdrop { animation: none; }
2104
+ }
2105
+
2106
+ .doc-dialog-panel {
2107
+ display: flex;
2108
+ width: 100%;
2109
+ min-width: 0;
2110
+ min-height: 0;
2111
+ flex: 1 1 auto;
2112
+ flex-direction: column;
2113
+ }
2114
+
2115
+ /* Its text is the page's at any window: the reading column, and on a window narrower than the card
2116
+ as far from the window's side as the page's text (--doc-dialog-inset: the page's gutter, less
2117
+ what stands between the card and that side). Room for what it holds from the start (a card just
2118
+ made holds a heading and an empty line), no more than the card may be high. What is scrolled into view keeps the content's padding
2119
+ clear of the card's edges (scroll-padding, which the browser's caret following and
2120
+ scrollIntoView both keep): the caret in the last block, or a block made at the end, takes the
2121
+ content to its very end, the padding under it shown, where the browser stopped with that block
2122
+ against the card's bottom edge. 8px more below than the padding: the caret's box is its glyphs',
2123
+ a few pixels short of its line (the scroll stops at the end all the same). */
2124
+ .doc-dialog-content {
2125
+ --doc-dialog-inset: max(
2126
+ calc(var(--doc-page-gutter) - var(--doc-dialog-edge)),
2127
+ calc((100% - var(--doc-content-max-width)) / 2)
2128
+ );
2129
+ min-width: 0;
2130
+ min-height: min(160px, calc(100dvh - (2 * var(--doc-dialog-block-gutter))));
2131
+ max-width: 100%;
2132
+ flex: 1 1 auto;
2133
+ padding: 32px var(--doc-dialog-inset) 40px;
2134
+ overflow: auto;
2135
+ overscroll-behavior: contain;
2136
+ scroll-padding-block: 32px 48px;
2137
+ }
2138
+
2139
+ /* It takes the focus as it opens, to be scrolled by keys (dialogs.js); nothing to show for that. */
2140
+ .doc-dialog-content:focus { outline: 0; }
2141
+
2142
+ /* A long card keeps its text's width: its scrollbar is of a known width and always has its room,
2143
+ taken from the padding on its side, so the text is the same with it, without it and as a card
2144
+ grows past the window's height. A touch screen's floats over the text and takes none. The page's
2145
+ scrollbar color (base.css, inherited) is set back, or Chrome draws its own bar. */
2146
+ @media (hover: hover) and (pointer: fine) {
2147
+ @supports selector(::-webkit-scrollbar) {
2148
+ .doc-dialog-content {
2149
+ padding-right: calc(var(--doc-dialog-inset) - var(--doc-dialog-scrollbar));
2150
+ scrollbar-color: auto;
2151
+ scrollbar-gutter: stable;
2152
+ }
2153
+ .doc-dialog-content::-webkit-scrollbar { width: var(--doc-dialog-scrollbar); background: transparent; }
2154
+ .doc-dialog-content::-webkit-scrollbar-button { display: none; }
2155
+ .doc-dialog-content::-webkit-scrollbar-thumb { border: 2px solid transparent; border-radius: 999px; background: var(--doc-scrollbar-thumb) padding-box; }
2156
+ .doc-dialog-content::-webkit-scrollbar-thumb:hover { background-color: var(--doc-scrollbar-thumb-active); }
2157
+ }
2158
+ }
2159
+
2160
+ @media print {
2161
+ .doc-dialog, .doc-dialog[open] { display: none; }
2162
+ }
2163
+
2164
+ @media (max-width: 640px) {
2165
+ .doc-dialog-content { padding-block: 20px 28px; scroll-padding-block: 20px 36px; }
2166
+ }
2167
+
2168
+ /* 图片放大 (runtime/zoom.js): a picture opened large over the page. Notion's viewer, as the page
2169
+ editor's (editor/components/image/viewer.mjs): the page dimmed under a dark veil in either theme,
2170
+ the picture in the middle at the size the runtime works out (fitted to the window, never past its
2171
+ own), its caption under it in light gray, a close button at the top right drawn as the viewer's bar
2172
+ is (a dark square, a white cross, a lighter fill under the pointer; no blue: its focus ring, once
2173
+ Tab reaches it, is white). The page under it keeps still (html.doc-zoom-open), its scrollbar's room kept where it
2174
+ had one (.doc-zoom-gutter). A picture that opens shows the zoom-in cursor
2175
+ (html.doc-zoom-hover, set while the pointer is on one). It fades in, the picture growing a
2176
+ little, not with reduced motion; it never prints. A picture that opens is a tab stop while the page
2177
+ is read, its focus ring the kit's. */
2178
+
2179
+ :root.doc-zoom-hover .doc-page img:hover { cursor: zoom-in; }
2180
+
2181
+ /* A picture that opens, reached from the keyboard (the runtime's data-doc-zoom: a tab stop while the
2182
+ page is read): the kit's focus ring, as a disclosure's summary has; none from the pointer. */
2183
+ .doc-page img[data-doc-zoom]:focus-visible { outline: 2px solid var(--doc-accent); outline-offset: 2px; }
2184
+
2185
+ @media screen {
2186
+ :root.doc-zoom-open { overflow: hidden; }
2187
+ :root.doc-zoom-open.doc-zoom-gutter { scrollbar-gutter: stable; }
2188
+ }
2189
+
2190
+ /* The whole window, the veil its own background (a click on it closes the viewer: a click on the
2191
+ ::backdrop of a dialog as large as the window never comes). */
2192
+ .doc-zoom {
2193
+ position: fixed;
2194
+ inset: 0;
2195
+ width: 100vw;
2196
+ max-width: none;
2197
+ height: 100dvh;
2198
+ max-height: none;
2199
+ margin: 0;
2200
+ padding: 0;
2201
+ overflow: hidden;
2202
+ border: 0;
2203
+ color: rgb(255 255 255 / 80%);
2204
+ background: rgb(15 15 15 / 80%);
2205
+ overscroll-behavior: contain;
2206
+ }
2207
+ .doc-zoom::backdrop { background: transparent; }
2208
+ .doc-zoom:focus { outline: none; } /* it takes the focus as it opens: no ring around the window */
2209
+
2210
+ .doc-zoom[open] {
2211
+ display: flex;
2212
+ flex-direction: column;
2213
+ align-items: center;
2214
+ justify-content: center;
2215
+ gap: 12px;
2216
+ animation: doc-zoom-fade 0.15s ease-out;
2217
+ }
2218
+
2219
+ .doc-zoom-picture {
2220
+ display: block;
2221
+ max-width: none;
2222
+ flex: none;
2223
+ object-fit: contain;
2224
+ border-radius: 2px;
2225
+ user-select: none;
2226
+ animation: doc-zoom-grow 0.18s cubic-bezier(0.2, 0.8, 0.2, 1);
2227
+ }
2228
+
2229
+ /* The caption's words as the page shows them (its marks, formulas, links), on one line or a few. */
2230
+ .doc-zoom-caption {
2231
+ max-width: min(var(--doc-content-max-width), calc(100vw - 32px));
2232
+ flex: none;
2233
+ font: var(--doc-note-font-size) / var(--doc-note-line-height) var(--doc-font);
2234
+ text-align: center;
2235
+ overflow-wrap: break-word;
2236
+ }
2237
+ .doc-zoom-caption a { color: inherit; text-decoration: underline; }
2238
+
2239
+ .doc-zoom-close {
2240
+ position: absolute;
2241
+ top: 12px;
2242
+ right: 12px;
2243
+ width: 32px;
2244
+ height: 32px;
2245
+ padding: 0;
2246
+ border: 0;
2247
+ border-radius: 4px;
2248
+ color: #fff;
2249
+ background: rgb(0 0 0 / 62%);
2250
+ font-size: 0;
2251
+ cursor: pointer;
2252
+ transition: background-color 20ms ease-in;
2253
+ }
2254
+ .doc-zoom-close::before {
2255
+ content: "";
2256
+ position: absolute;
2257
+ inset: 0;
2258
+ background: currentColor;
2259
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round'%3E%3Cpath d='m11 11 10 10M21 11 11 21'/%3E%3C/svg%3E") 0 0 / 100% 100% no-repeat;
2260
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round'%3E%3Cpath d='m11 11 10 10M21 11 11 21'/%3E%3C/svg%3E") 0 0 / 100% 100% no-repeat;
2261
+ }
2262
+ .doc-zoom-close:hover { background: rgb(40 40 40 / 80%); }
2263
+ .doc-zoom-close:focus { outline: none; }
2264
+ .doc-zoom-close:focus-visible { outline: 2px solid rgb(255 255 255 / 80%); outline-offset: 2px; }
2265
+
2266
+ @keyframes doc-zoom-fade {
2267
+ from { opacity: 0; }
2268
+ }
2269
+
2270
+ @keyframes doc-zoom-grow {
2271
+ from { transform: scale(0.96); }
2272
+ }
2273
+
2274
+ @media (prefers-reduced-motion: reduce) {
2275
+ .doc-zoom[open], .doc-zoom-picture { animation: none; }
2276
+ }
2277
+
2278
+ @media print {
2279
+ .doc-zoom { display: none !important; }
2280
+ }
2281
+
2282
+ /* 表格 (tables.js): the frame (.doc-table-wrap) and the scrollbars the kit draws over it, the
2283
+ table, its sort controls, a sticky first column, and the scope line above it. Its width and
2284
+ scroll height are sizes (sizes.css). A table is lines on the page (Notion's and Feishu's): the
2285
+ frame's rounded line around it and one line between every two rows and every two columns, all
2286
+ one color (--doc-hairline); no fills of its own. A header cell (th) looks as any other: its
2287
+ gray and its bold are looks it was given (the page editor's 标题行 and 标题列 give them), it only
2288
+ sticks. The frame and the table are one: the table fills the frame to its edge, the frame's
2289
+ line drawn over it. The line is drawn once wherever it lies: in dark it is a light veil over what
2290
+ is under it (tokens.css), so that it shows on a gray header cell and beside a gray highlight
2291
+ block as on the page, and a line drawn over another would be lighter there. In a block with a
2292
+ fill of its own (a highlight block, one of the palette's colors) the frame is opaque, the line as
2293
+ it lies on the palette's gray (--doc-table-frame-filled): beside the body rows the veil over
2294
+ the table's fill (the page's) would be the gray of the block around it. */
2295
+
2296
+ .doc-table-wrap {
2297
+ --doc-table-frame: var(--doc-hairline);
2298
+ position: relative;
2299
+ align-self: start;
2300
+ /* A share over 1 keeps the wrapper at the reading width; the table is that much wider and
2301
+ scrolls inside it (tables.js). */
2302
+ width: var(--doc-span-width, fit-content);
2303
+ max-width: 100%;
2304
+ max-height: var(--doc-table-height, min(72vh, 720px));
2305
+ margin-block: var(--doc-component-gap);
2306
+ overflow: auto;
2307
+ /* Its line: an outline on its inner edge, painted over the table, where the last cells draw none of
2308
+ their own (below; once the kit runs, its layer draws it instead, over cells that stick too:
2309
+ .doc-scrollbars-frame); its rounded corners clip the table. */
2310
+ outline: 1px solid var(--doc-table-frame);
2311
+ outline-offset: -1px;
2312
+ border-radius: var(--doc-table-radius);
2313
+ background: var(--doc-table-fill);
2314
+ /* Sideways it never bounces past its ends (a touchpad's, which pulled the table off the frame's
2315
+ edge) nor hands the scroll on (to the browser's back and forward). Down, only a frame that
2316
+ scrolls down (below) is held so, the wheel past its ends handed on to the page by the kit
2317
+ (tables/scrollbars.js): any other hands it to the page as the browser does. */
2318
+ overscroll-behavior-inline: none;
2319
+ isolation: isolate;
2320
+ /* No scrollbar of the system's takes room from the columns: the kit draws its own over the frame. */
2321
+ scrollbar-width: none;
2322
+ }
2323
+ .doc-table-wrap::-webkit-scrollbar { display: none; } /* WebKit without scrollbar-width */
2324
+ /* A short table, or one mostly of words (data-doc-whole, tables/whole.js), is shown whole: its
2325
+ frame as tall as its rows, read with the page. A long table of data keeps the kit's height above,
2326
+ its rows scrolling under the header row that stays; a height written on the frame
2327
+ (--doc-table-height, the reader's) holds either way. */
2328
+ .doc-table-wrap[data-doc-whole] { max-height: var(--doc-table-height, none); }
2329
+ .doc-table-wrap:has(> .doc-scrollbars[data-y]) { overscroll-behavior-block: none; }
2330
+
2331
+ /* The frame's scrollbars (tables.js): a layer stuck at the frame's top-left that takes no room,
2332
+ with a rail along the right edge and one along the bottom for each axis that overflows
2333
+ (data-y, data-x), each thumb 3px in from the frame's edge. tables.js sets each rail's place
2334
+ (the part of the edge that scrolls: below the header, between the rounded corners) and its
2335
+ track, thumb size and thumb offset (--doc-scrollbar-*). They show while the pointer is
2336
+ over the frame or it scrolls. */
2337
+ .doc-scrollbars {
2338
+ position: sticky;
2339
+ top: 0;
2340
+ left: 0;
2341
+ z-index: 6;
2342
+ width: 0;
2343
+ height: 0;
2344
+ }
2345
+ .doc-scrollbar {
2346
+ position: absolute;
2347
+ display: none;
2348
+ opacity: 0;
2349
+ transition: opacity 160ms ease;
2350
+ }
2351
+ .doc-scrollbars[data-y] > .doc-scrollbar--y,
2352
+ .doc-scrollbars[data-x] > .doc-scrollbar--x { display: block; }
2353
+ .doc-table-wrap:hover > .doc-scrollbars > .doc-scrollbar,
2354
+ .doc-scrollbars[data-active] > .doc-scrollbar,
2355
+ .doc-scrollbar[data-drag] { opacity: 1; }
2356
+ .doc-scrollbar--y { width: 12px; height: var(--doc-scrollbar-track); }
2357
+ .doc-scrollbar--x { width: var(--doc-scrollbar-track); height: 12px; }
2358
+ .doc-scrollbar-thumb {
2359
+ position: absolute;
2360
+ border-radius: 999px;
2361
+ background: var(--doc-scrollbar-thumb);
2362
+ transition: background-color 120ms ease;
2363
+ }
2364
+ .doc-scrollbar--y > .doc-scrollbar-thumb {
2365
+ top: 0;
2366
+ right: 3px; /* clear of the edge, where the page editor's handles of the frame's edges are */
2367
+ width: 6px;
2368
+ height: var(--doc-scrollbar-thumb-size);
2369
+ transform: translateY(var(--doc-scrollbar-thumb-at));
2370
+ }
2371
+ .doc-scrollbar--x > .doc-scrollbar-thumb {
2372
+ bottom: 3px;
2373
+ left: 0;
2374
+ width: var(--doc-scrollbar-thumb-size);
2375
+ height: 6px;
2376
+ transform: translateX(var(--doc-scrollbar-thumb-at));
2377
+ }
2378
+ .doc-scrollbar:is(:hover, [data-drag]) > .doc-scrollbar-thumb { background: var(--doc-scrollbar-thumb-active); }
2379
+ /* The frame's line above everything in the frame (a header row or column that sticks over the
2380
+ outline too): as big as the frame (tables.js), on the layer stuck at its top-left. */
2381
+ .doc-scrollbars-frame {
2382
+ position: absolute;
2383
+ top: 0;
2384
+ left: 0;
2385
+ box-sizing: border-box;
2386
+ border: 1px solid var(--doc-table-frame);
2387
+ border-radius: var(--doc-table-radius);
2388
+ pointer-events: none;
2389
+ }
2390
+ /* Where the layer draws the frame's line, the frame's outline (before the kit runs, and on paper,
2391
+ where the layer is hidden) is not drawn under it. */
2392
+ .doc-table-wrap:has(> .doc-scrollbars) { outline-color: transparent; }
2393
+ /* In a block with a fill of its own (a highlight block, its gray its own unless it is given a text
2394
+ color; any block of the palette's background colors) the frame's line is opaque (above). */
2395
+ :is(:is(.doc-summary, .doc-panel):not(.doc-text-gray, .doc-text-brown, .doc-text-orange, .doc-text-yellow, .doc-text-green, .doc-text-blue, .doc-text-purple, .doc-text-pink, .doc-text-red), .doc-highlight-gray, .doc-highlight-brown, .doc-highlight-orange, .doc-highlight-yellow, .doc-highlight-green, .doc-highlight-blue, .doc-highlight-purple, .doc-highlight-pink, .doc-highlight-red) .doc-table-wrap { --doc-table-frame: var(--doc-table-frame-filled); }
2396
+ /* A frame that scrolls sideways and is not at its end fades out at its right edge (data-more,
2397
+ tables.js): the columns go on past it, which its rails, shown only under the pointer, do not say.
2398
+ Drawn over the cells by the frame's line layer, taking no room. */
2399
+ .doc-scrollbars-frame::after {
2400
+ content: "";
2401
+ position: absolute;
2402
+ top: 0;
2403
+ right: 0;
2404
+ bottom: 0;
2405
+ width: 28px;
2406
+ border-radius: 0 calc(var(--doc-table-radius) - 1px) calc(var(--doc-table-radius) - 1px) 0;
2407
+ background: linear-gradient(to right, transparent, var(--doc-table-fill));
2408
+ opacity: 0;
2409
+ transition: opacity 160ms ease;
2410
+ }
2411
+ .doc-scrollbars[data-more] > .doc-scrollbars-frame::after { opacity: 1; }
2412
+
2413
+ /* Each cell draws its own lines, on its right and at its bottom (separate borders: a cell that sticks
2414
+ while the frame scrolls takes its lines along, a merged cell has them where it ends); in a frame
2415
+ the frame's line is the last ones (below). A table outside a frame draws its top and left edges
2416
+ itself. */
2417
+ .doc-table {
2418
+ width: auto;
2419
+ max-width: 100%;
2420
+ border-collapse: separate;
2421
+ border-spacing: 0;
2422
+ background: var(--doc-table-fill);
2423
+ font-size: var(--doc-table-font-size);
2424
+ font-weight: 400;
2425
+ line-height: var(--doc-table-line-height);
2426
+ }
2427
+
2428
+ :not(.doc-table-wrap) > .doc-table { border-top: 1px solid var(--doc-hairline); border-left: 1px solid var(--doc-hairline); }
2429
+ /* Keys moving into a frame that scrolls: the accent's line in place of its own. */
2430
+ .doc-table-wrap:focus-visible { outline: 2px solid var(--doc-accent); outline-offset: -2px; }
2431
+
2432
+ .doc-table th,
2433
+ .doc-table td {
2434
+ padding: 10px 9px; /* Notion's 9px at the sides */
2435
+ border: 0 solid var(--doc-hairline);
2436
+ border-right-width: 1px;
2437
+ border-bottom-width: 1px;
2438
+ font-weight: 400; /* a th's too: its bold is a look (.doc-bold) */
2439
+ overflow-wrap: anywhere;
2440
+ text-align: left;
2441
+ vertical-align: top;
2442
+ white-space: normal;
2443
+ word-break: break-word;
2444
+ }
2445
+ /* A cell left empty is one line high, as a text block left empty is (flow.css): a row of empty cells
2446
+ is as tall as a row of words from the first paint on, not flat until the page editor makes the
2447
+ cells editable (an empty editable cell is a line high). */
2448
+ .doc-table :is(td, th):empty::after { content: "\200b"; }
2449
+
2450
+ /* In a frame the last column's lines and the last row's are the frame's line, which lies over them:
2451
+ theirs are not drawn (the row's last cell, at the frame's right edge, unless a cell of the last
2452
+ column above reaches down past its row: such a table keeps them; the footer's last row, or the
2453
+ body's). Where a cell spans rows only the table's slots say which cells lie on those edges (one
2454
+ spanning down to the last row lies on the bottom one; below one spanning in the last column a row
2455
+ ends inside): the kit marks them (data-doc-edge, tables/edges.js). */
2456
+ .doc-table-wrap > .doc-table:not(:has(> * > tr > :last-child[rowspan]:not([rowspan="1"]))) > * > tr > :last-child,
2457
+ .doc-table-wrap > .doc-table > * > tr > [data-doc-edge~="right"] { border-right-color: transparent; }
2458
+ .doc-table-wrap > .doc-table > tfoot > tr:last-child > *,
2459
+ .doc-table-wrap > .doc-table:not(:has(> tfoot)) > tbody:last-of-type > tr:last-child > *,
2460
+ .doc-table-wrap > .doc-table:not(:has(> :is(tbody, tfoot))) > thead > tr:last-child > *,
2461
+ .doc-table-wrap > .doc-table > * > tr > [data-doc-edge~="bottom"] { border-bottom-color: transparent; }
2462
+
2463
+ /* A list in a cell (the page editor's 单元格里的列表): the browser's markers, its items close
2464
+ together, nothing above or below it at the cell's edges. */
2465
+ .doc-table :is(td, th) > :is(ul, ol) { margin: 2px 0; padding-inline-start: 1.4em; }
2466
+ .doc-table :is(td, th) > ul { list-style: disc; }
2467
+ .doc-table :is(td, th) > ol { list-style: decimal; }
2468
+ .doc-table :is(td, th) > :is(ul, ol):first-child { margin-top: 0; }
2469
+ .doc-table :is(td, th) > :is(ul, ol):last-child { margin-bottom: 0; }
2470
+ .doc-table :is(td, th) > :is(ul, ol) > li + li { margin-top: 2px; }
2471
+
2472
+ .doc-table--auto { table-layout: fixed; max-width: none; }
2473
+ .doc-table [data-column-kind="compact"] { white-space: nowrap; word-break: normal; }
2474
+ .doc-table [data-column-kind="narrative"] { overflow-wrap: break-word; word-break: normal; }
2475
+ .doc-table [data-column-kind="token-heavy"],
2476
+ .doc-table [data-column-wrap] { white-space: normal; overflow-wrap: anywhere; word-break: normal; }
2477
+ .doc-table [data-column-kind] code { white-space: inherit; }
2478
+ /* Words kept whole (keep-all: a line breaks at a space or a punctuation mark, never between the
2479
+ characters of a Chinese word): a header's (标准差, 区间, a unit in brackets: (%)) and a short
2480
+ field's that wraps (卷数 beside columns of prose: 六十卷、 / 目录一卷; tables/layout.js), where its
2481
+ column holds its longest word (data-column-wrap="words"); a narrower one breaks between characters
2482
+ as Chinese text does, never before a closing mark. A header the kit marks nothing on (it fits, or
2483
+ the browser lays the table out) keeps them whole too. */
2484
+ .doc-table th:not([data-column-wrap]),
2485
+ .doc-table [data-column-wrap="words"] { word-break: keep-all; }
2486
+ /* Inline code in a cell breaks only after a slash or at a space (a path at its folders, never at a
2487
+ hyphen or inside a word): its runs (tables/cells.js, as the page renders; not while the page
2488
+ editor edits the cell) each kept on one line, a break allowed between them. A column the kit sizes
2489
+ is at least as wide as its code's longest run, up to 320px of it (tables/layout.js), and a table
2490
+ the browser lays out (merged cells) makes room for it itself; a number range held on one line
2491
+ (.doc-range, runtime/spacing.js) alike. Only a run or a range wider than its column (past 320px,
2492
+ half a narrow screen, or in a column the reader sized: data-run-wrap, layout.js) breaks where the
2493
+ column ends (a range at its dash): code first between its names, at the <wbr> cells.js puts after
2494
+ a dot, before underscores and where a lowercase letter meets a capital (window.|__demo,
2495
+ request|Animation|Frame), anywhere only in a name wider than the column. */
2496
+ .doc-table code { overflow-wrap: break-word; word-break: normal; }
2497
+ .doc-code-run { white-space: nowrap; }
2498
+ .doc-code-run wbr { display: none; } /* Chrome breaks at a <wbr> even in nowrap */
2499
+ .doc-table [data-run-wrap] .doc-code-run { white-space: normal; overflow-wrap: anywhere; }
2500
+ .doc-table [data-run-wrap] .doc-code-run wbr { display: inline; }
2501
+ .doc-table [data-run-wrap] .doc-range { white-space: normal; }
2502
+
2503
+ /* The header row stays at the top of a frame that scrolls down, the first column (a sticky first
2504
+ column, .doc-table--sticky-first, or a header column: each body row's first cell a th
2505
+ scope="row") at its left when it scrolls sideways, the cell where they meet at both: over the cells
2506
+ beneath them, so filled (a cell's own fill, always opaque, or the table's when it has none), their
2507
+ lines their own. The first column's fill is the kit's to decide, so it is the one declaration here
2508
+ that wins over a style attribute (!important: nothing else beats one): a source style that makes
2509
+ a cell see-through (a translucent or transparent background) would show the cells passing
2510
+ beneath it. */
2511
+ .doc-table > thead th {
2512
+ position: sticky;
2513
+ top: 0;
2514
+ z-index: 4;
2515
+ background: var(--doc-fill, var(--doc-table-fill));
2516
+ }
2517
+ .doc-table--sticky-first :is(th, td):first-child,
2518
+ .doc-table > tbody > tr > th[scope="row"]:first-child {
2519
+ position: sticky;
2520
+ left: 0;
2521
+ z-index: 2;
2522
+ background: var(--doc-fill, var(--doc-table-fill)) !important;
2523
+ }
2524
+ .doc-table--sticky-first th:first-child { z-index: 5; }
2525
+ .doc-table:has(> tbody > tr > th[scope="row"]:first-child) > thead > tr > th:first-child {
2526
+ left: 0;
2527
+ z-index: 5;
2528
+ }
2529
+
2530
+ .doc-table .number { text-align: center; font-variant-numeric: tabular-nums; }
2531
+
2532
+ /* A cell's look (the page editor's table tools write these classes on its td or th): a text color
2533
+ (base.css), a fill over the whole cell (base.css's: a cell is square, and one that sticks wears it too, above), bold words (the words
2534
+ typed in it later too), and an alignment over the kit's own (a numeric column's centre), a vertical one (the kit's: top). A header
2535
+ row's and column's look is these: .doc-highlight-gray and .doc-bold. */
2536
+ .doc-table :is(td, th).doc-bold { font-weight: 600; }
2537
+ .doc-table :is(td, th).doc-align-left { text-align: left; }
2538
+ .doc-table :is(td, th).doc-align-center { text-align: center; }
2539
+ .doc-table :is(td, th).doc-align-right { text-align: right; }
2540
+ .doc-table :is(td, th).doc-valign-top { vertical-align: top; }
2541
+ .doc-table :is(td, th).doc-valign-middle { vertical-align: middle; }
2542
+ .doc-table :is(td, th).doc-valign-bottom { vertical-align: bottom; }
2543
+
2544
+ /* A sortable header's control (sort.js): a small button after the header's words, holding no text
2545
+ and taking no room (width 0), so a header is as wide with it as without it and its words stay its
2546
+ own. Its arrow hangs in the cell's right padding (3px off the words, then its 6px drawn, of the 9px): a small triangle with
2547
+ round corners (the disclosure's arrow's shape), pointing down, or up for an ascending sort
2548
+ (data-doc-sort-arrow="asc", sort.js). It shows while the pointer is over the header, light gray, darker
2549
+ under the pointer and on the column the rows are sorted by. Only a press on it, a little around
2550
+ the arrow, sorts: not one on the header's words. */
2551
+ .doc-table-sort-button {
2552
+ position: relative;
2553
+ display: inline-block;
2554
+ width: 0;
2555
+ height: var(--doc-table-line-height);
2556
+ margin: 0;
2557
+ padding: 0;
2558
+ border: 0;
2559
+ vertical-align: top;
2560
+ background: transparent;
2561
+ cursor: pointer;
2562
+ }
2563
+ /* Where a press takes: around the arrow, as tall as the line. */
2564
+ .doc-table-sort-button::before {
2565
+ content: "";
2566
+ position: absolute;
2567
+ top: 0;
2568
+ left: 0;
2569
+ width: 13px;
2570
+ height: 100%;
2571
+ border-radius: 4px;
2572
+ }
2573
+ .doc-table-sort-button::after {
2574
+ content: "";
2575
+ position: absolute;
2576
+ top: 50%;
2577
+ left: 3px;
2578
+ width: 7px;
2579
+ height: 7px;
2580
+ background: var(--doc-table-sort-arrow);
2581
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath d='M2 3.25h6L5 7.25z' fill='black' stroke='black' stroke-width='1.8' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
2582
+ transform: translateY(-50%);
2583
+ opacity: 0;
2584
+ pointer-events: none;
2585
+ transition: opacity 100ms ease, background-color 100ms ease;
2586
+ }
2587
+ .doc-table-sort-button[data-doc-sort-arrow="asc"]::after { transform: translateY(-50%) rotate(180deg); }
2588
+ .doc-table-sort-button:focus-visible { outline: none; }
2589
+ .doc-table-sort-button:focus-visible::before { outline: 2px solid var(--doc-accent); }
2590
+
2591
+ .doc-table th:hover > .doc-table-sort-button::after,
2592
+ .doc-table th:is([aria-sort="ascending"], [aria-sort="descending"]) > .doc-table-sort-button::after,
2593
+ .doc-table-sort-button:focus-visible::after { opacity: 1; }
2594
+ .doc-table th:is([aria-sort="ascending"], [aria-sort="descending"]) > .doc-table-sort-button::after,
2595
+ .doc-table-sort-button:hover::after { background: var(--doc-table-sort-arrow-active); }
2596
+
2597
+ /* A table's scope line, as older files write it right above the frame (a new report writes small
2598
+ text, p.doc-note, its unit after a span.doc-tab): read as small text, its words, code and
2599
+ bold in one line. After a plain span (no class: <span>scope</span><span>unit</span>, or the unit
2600
+ bold, <strong>unit</strong>) the last plain element stands at the line's right end, as small text's
2601
+ tab does, and plain spans between keep 18px apart. */
2602
+ .doc-table-meta {
2603
+ display: flow-root;
2604
+ margin: 8px 0 12px;
2605
+ color: var(--doc-muted);
2606
+ font-size: var(--doc-note-font-size);
2607
+ line-height: var(--doc-note-line-height);
2608
+ }
2609
+
2610
+ .doc-table-meta > span:not([class]) + span:not([class]):not(:last-child) { margin-inline-start: 18px; }
2611
+ .doc-table-meta > span:not([class]) + :not([class]):last-child { float: right; margin-inline-start: 18px; white-space: nowrap; }
2612
+ .doc-table-meta + .doc-table-wrap { margin-top: 0; }
2613
+
2614
+ @media (max-width: 760px) {
2615
+ /* A table with a width of its own is at least as wide as the reading width. */
2616
+ :where(.doc-table-wrap) { --doc-span-width: calc(max(var(--doc-span), 1) * 100%); }
2617
+ }
2618
+
2619
+ /* On paper a table is whole: no scroll area, nothing clipped, no scrollbars or fading edge (a height
2620
+ written on a frame shown whole too). */
2621
+ @media print {
2622
+ .doc-table-wrap, .doc-table-wrap[data-doc-whole] { max-height: none; overflow: visible; }
2623
+ .doc-scrollbars { display: none; }
2624
+ .doc-table-wrap:has(> .doc-scrollbars) { outline-color: var(--doc-table-frame); }
2625
+ }
2626
+
2627
+ @media (max-width: 640px) {
2628
+ /* The unit on a line of its own under the scope; the words of the line stay one text. */
2629
+ .doc-table-meta > span:not([class]) + :not([class]):last-child { display: block; float: none; margin: 4px 0 0; }
2630
+ }
2631
+
2632
+ /* 提示块: inline text set apart on a fill, with a line at its left in that fill's deep shade. Its
2633
+ color is the background it is given (颜色 in the page editor's block menu, base.css's classes:
2634
+ --doc-fill and --doc-fill-deep), and with none the palette's blue (src/shared/colors.mjs),
2635
+ the same as one given that blue. A text color colors its words only. Its corners are square;
2636
+ the editor's selection lies 6px past it, round (--doc-box-reach: what it wraps, base.css). */
2637
+
2638
+ .doc-callout {
2639
+ --doc-box-reach: 6px;
2640
+ margin-block: var(--doc-component-gap);
2641
+ padding: 12px 14px;
2642
+ border-left: 3px solid var(--doc-fill-deep, light-dark(#387dc9, #5e87c9));
2643
+ background: var(--doc-fill, light-dark(#e5f2fc, #233850));
2644
+ line-height: 1.6;
2645
+ }
2646
+
2647
+ /* 折叠列表: a disclosure, its title row with an arrow, and its content region, a flow. It is drawn
2648
+ as a code block is (code.css), one design for the two: a soft panel 10px round, a header of the
2649
+ arrow (the code block's triangle, in a 28px column, always shown: it is what opens the block) and
2650
+ the title (body text's size and line, --doc-block-title-padding above and below, as the code
2651
+ block's), the content under the title's start. The room around the title's words is the title's own (notion-lite's toggle: the
2652
+ padding on the text one edits, its button alone opening and closing it), so in the page editor a
2653
+ press there is in the title, as a press beside a code block's title is in that one. */
2654
+
2655
+ .doc-details {
2656
+ min-width: 0;
2657
+ max-width: 100%;
2658
+ margin-block: var(--doc-paragraph-gap); /* as a paragraph's: a disclosure stands among text */
2659
+ border: 0;
2660
+ border-radius: 10px;
2661
+ background: var(--doc-code-background);
2662
+ }
2663
+ /* Disclosures often come several together: a group gap apart, a group rather than loose panels. */
2664
+ .doc-details:has(+ .doc-details) { margin-bottom: var(--doc-group-gap); }
2665
+ .doc-details + .doc-details { margin-top: var(--doc-group-gap); }
2666
+
2667
+ .doc-details > summary {
2668
+ display: grid;
2669
+ grid-template-columns: 28px minmax(0, 1fr);
2670
+ align-items: start;
2671
+ margin: 0;
2672
+ padding: 0;
2673
+ border-radius: 10px;
2674
+ cursor: pointer;
2675
+ background: transparent;
2676
+ font-size: var(--doc-body-font-size);
2677
+ font-weight: 500;
2678
+ line-height: var(--doc-body-line-height);
2679
+ list-style: none;
2680
+ text-align: left;
2681
+ }
2682
+
2683
+ .doc-details > summary::-webkit-details-marker { display: none; }
2684
+ .doc-details-summary-label {
2685
+ min-width: 0;
2686
+ padding: var(--doc-block-title-padding) 16px var(--doc-block-title-padding) 0;
2687
+ overflow-wrap: anywhere;
2688
+ word-break: break-word;
2689
+ }
2690
+
2691
+ .doc-details-summary-label code {
2692
+ white-space: normal;
2693
+ overflow-wrap: anywhere;
2694
+ word-break: break-word;
2695
+ }
2696
+
2697
+ /* The code block's fold arrow: a small filled triangle, pointing right while the block is closed,
2698
+ in the middle of the title's first line (below the room above its words). */
2699
+ .doc-details > summary::before {
2700
+ justify-self: center;
2701
+ width: 12px;
2702
+ height: 12px;
2703
+ margin-top: calc(var(--doc-block-title-padding) + (var(--doc-body-line-height) - 12px) / 2);
2704
+ content: "";
2705
+ background: var(--doc-code-chrome);
2706
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M3.25 4.5h5.5L6 8z' fill='black' stroke='black' stroke-width='1.6' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
2707
+ transform: rotate(-90deg);
2708
+ transition: transform .2s ease-out;
2709
+ }
2710
+
2711
+ .doc-details[open] > summary::before { transform: rotate(0); }
2712
+ /* Its color (颜色 in the page editor's block menu, notion-lite's toggle: base.css's classes): a
2713
+ background in place of its own panel's, or the text of its title and its blocks (they take it as
2714
+ theirs, a heading's own color aside). */
2715
+ .doc-details:is(.doc-highlight-gray, .doc-highlight-brown, .doc-highlight-orange, .doc-highlight-yellow, .doc-highlight-green, .doc-highlight-blue, .doc-highlight-purple, .doc-highlight-pink, .doc-highlight-red) { background: var(--doc-fill); }
2716
+ .doc-details > summary:focus-visible { outline: 2px solid var(--doc-accent); outline-offset: 2px; }
2717
+ .doc-details-content {
2718
+ min-width: 0;
2719
+ max-width: 100%;
2720
+ margin: 0;
2721
+ padding: 2px 16px 14px 28px;
2722
+ }
2723
+ .doc-details-content > *,
2724
+ .doc-details-content .doc-table-wrap {
2725
+ min-width: 0;
2726
+ max-width: 100%;
2727
+ }
2728
+
2729
+ /* An instance of a component package stands apart from what is around it as a block set apart does,
2730
+ whatever state it is in. One with no package here (src/shared/components/installed.mjs) shows what
2731
+ it holds as it stands, the kit marking it (data-doc-fallback). Its component's styles are not
2732
+ there, so this is all the look it has, and what reads by itself reads: a title, paragraphs, lists,
2733
+ a table, what a script of data holds as the kit draws it (doc-component-data: a table, keys beside
2734
+ their values, a list), what is wider than the page scrolling in it. In the preview a note above it
2735
+ says why, to who writes the page (data-doc-dev: no export takes it, nor a presentation or paper). */
2736
+
2737
+ [data-doc-component] {
2738
+ margin: var(--doc-block-gap) 0;
2739
+ }
2740
+ [data-doc-fallback] {
2741
+ overflow-x: auto;
2742
+ }
2743
+ [data-doc-fallback] :where(img, svg, video, iframe) {
2744
+ max-width: 100%;
2745
+ }
2746
+ [data-doc-fallback] :where(img, video) {
2747
+ height: auto;
2748
+ }
2749
+ [data-doc-fallback] :where(h1, h2, h3, h4) {
2750
+ margin: 12px 0 6px;
2751
+ color: var(--doc-text);
2752
+ font-size: var(--doc-h4-font-size);
2753
+ line-height: var(--doc-h4-line-height);
2754
+ font-weight: 600;
2755
+ }
2756
+ [data-doc-fallback] :where(p, ul, ol, dl, table) {
2757
+ margin: 0 0 8px;
2758
+ }
2759
+ [data-doc-fallback] :where(ul, ol) {
2760
+ padding-inline-start: 1.625em;
2761
+ }
2762
+ [data-doc-fallback] :where(table) {
2763
+ border-collapse: collapse;
2764
+ }
2765
+ [data-doc-fallback] :where(th, td) {
2766
+ padding: 4px 8px;
2767
+ border: 1px solid var(--doc-border);
2768
+ text-align: start;
2769
+ }
2770
+ .doc-component-data :where(ul, dl, table) {
2771
+ margin: 0;
2772
+ }
2773
+ .doc-component-data :where(dt, dd, td) {
2774
+ overflow-wrap: break-word;
2775
+ }
2776
+ /* A head and a cell of a few words keep them on one line: what is wider than the page scrolls. */
2777
+ .doc-component-data :where(th, .doc-component-short) {
2778
+ white-space: nowrap;
2779
+ }
2780
+ /* A value alone is itself, no item of a list; a list of values alone below the top a line of them. */
2781
+ ul.doc-component-one, .doc-component-data ul.doc-component-line {
2782
+ padding: 0;
2783
+ list-style: none;
2784
+ }
2785
+ .doc-component-data .doc-component-line > li {
2786
+ display: inline;
2787
+ }
2788
+ .doc-component-data .doc-component-line > li + li::before {
2789
+ content: " · ";
2790
+ color: var(--doc-muted);
2791
+ }
2792
+ :where(dl.doc-component-data, .doc-component-data dl) {
2793
+ display: grid;
2794
+ grid-template-columns: minmax(0, max-content) minmax(0, 1fr);
2795
+ gap: 4px 16px;
2796
+ }
2797
+ .doc-component-data dt {
2798
+ color: var(--doc-muted);
2799
+ }
2800
+ .doc-component-data dd {
2801
+ margin: 0;
2802
+ }
2803
+ .doc-component-data .doc-component-more {
2804
+ color: var(--doc-muted);
2805
+ font-size: var(--doc-small-font-size);
2806
+ }
2807
+ .doc-component-data dl > .doc-component-more, dl.doc-component-data > .doc-component-more {
2808
+ grid-column: 1 / -1;
2809
+ }
2810
+ .doc-component-note {
2811
+ margin-bottom: 6px;
2812
+ color: var(--doc-muted);
2813
+ font-size: 12px;
2814
+ line-height: 1.5;
2815
+ }
2816
+
2817
+ /* On paper what it holds is whole, as a table is (table.css). */
2818
+ @media print {
2819
+ [data-doc-fallback] { overflow-x: visible; }
2820
+ .doc-component-note { display: none; }
2821
+ }