@heycys/gallery 0.0.0-stage → 0.1.1

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