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