pandorga 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +77 -0
- data/DESIGN.md +1434 -0
- data/LICENSE +21 -0
- data/README.md +81 -0
- data/_data/themes/dark.yml +97 -0
- data/_data/themes/light.yml +120 -0
- data/_data/themes/shared.yml +37 -0
- data/_data/translations.yml +85 -0
- data/_includes/chord-tab.html +38 -0
- data/_includes/content-runtime/00-config.html +22 -0
- data/_includes/content-runtime/10-utils.html +176 -0
- data/_includes/content-runtime/20-markdown.html +264 -0
- data/_includes/content-runtime/25-code-blocks.html +315 -0
- data/_includes/content-runtime/30-includes-bib.html +190 -0
- data/_includes/content-runtime/30-includes-xcite.html +122 -0
- data/_includes/content-runtime/30-includes.html +365 -0
- data/_includes/content-runtime/40-listing.html +225 -0
- data/_includes/content-runtime/41-listing-helpers.html +71 -0
- data/_includes/content-runtime/42-listing-filter.html +208 -0
- data/_includes/content-runtime/43-blocks.html +379 -0
- data/_includes/content-runtime/50-detail.html +861 -0
- data/_includes/content-runtime/55-toc.html +176 -0
- data/_includes/content-runtime/60-fragments.html +567 -0
- data/_includes/content-runtime/90-bootstrap.html +76 -0
- data/_includes/cut-in.html +10 -0
- data/_includes/cv/cv-box.html +18 -0
- data/_includes/dict-card.html +24 -0
- data/_includes/figure.html +36 -0
- data/_includes/home/band-index.html +43 -0
- data/_includes/home/band-listing.html +49 -0
- data/_includes/mathjax.html +10 -0
- data/_includes/ongoing-product.html +1 -0
- data/_includes/page/content-runtime.html +20 -0
- data/_includes/page/date_evolution.html +19 -0
- data/_includes/page/figure-lightbox.html +102 -0
- data/_includes/page/formatted_date.html +15 -0
- data/_includes/page/hero-default.html +18 -0
- data/_includes/page/listing-runtime-attrs.html +8 -0
- data/_includes/page/mermaid.html +101 -0
- data/_includes/page/network-graph.html +1253 -0
- data/_includes/page/page-header.html +41 -0
- data/_includes/page/professional-connections.html +2 -0
- data/_includes/page/site-footer.html +101 -0
- data/_includes/page/timeline-section.html +868 -0
- data/_includes/plotly.html +22 -0
- data/_includes/theme/dev-reexport.html +100 -0
- data/_includes/theme/favicons.html +4 -0
- data/_includes/theme/font-loader.html +55 -0
- data/_includes/theme/shell-theme-boot.html +115 -0
- data/_includes/theme/site-logo.html +6 -0
- data/_includes/theme/tailwind-theme-colors.json.liquid +65 -0
- data/_includes/theme/tailwind-theme-fonts.json.liquid +6 -0
- data/_includes/theme/theme-context.liquid +20 -0
- data/_includes/theme/theme-toggle.html +94 -0
- data/_includes/theme/theme-vars-block.liquid +161 -0
- data/_includes/theme/theme-vars.html +16 -0
- data/_includes/transcription.html +80 -0
- data/_includes/tweet.html +22 -0
- data/_includes/video.html +11 -0
- data/_includes/xcite.html +3 -0
- data/_includes/youtube-short.html +26 -0
- data/_includes/youtube.html +12 -0
- data/_layouts/article.html +27 -0
- data/_layouts/articles.html +534 -0
- data/_layouts/bibliography.html +417 -0
- data/_layouts/blog.html +544 -0
- data/_layouts/cv.html +393 -0
- data/_layouts/home.html +319 -0
- data/_layouts/network.html +9 -0
- data/_layouts/pandorga/articles.html +4 -0
- data/_layouts/pandorga/bibliography.html +4 -0
- data/_layouts/pandorga/blog.html +4 -0
- data/_layouts/pandorga/cv.html +4 -0
- data/_layouts/pandorga/media.html +4 -0
- data/_layouts/pandorga/network.html +4 -0
- data/_layouts/pandorga/portfolio.html +4 -0
- data/_layouts/post.html +7 -0
- data/_layouts/product.html +5 -0
- data/_layouts/project.html +27 -0
- data/_layouts/projects.html +534 -0
- data/_layouts/resources.html +387 -0
- data/_layouts/shell.html +203 -0
- data/_layouts/text.html +246 -0
- data/_plugins/bibliography_artifact.rb +57 -0
- data/_plugins/content_backend.rb +37 -0
- data/_plugins/content_collections.rb +51 -0
- data/_plugins/content_detail_paths.rb +58 -0
- data/_plugins/content_headers.rb +73 -0
- data/_plugins/content_keys.rb +310 -0
- data/_plugins/content_local_serve.rb +168 -0
- data/_plugins/content_site_adapter.rb +159 -0
- data/_plugins/content_validators_hook.rb +20 -0
- data/_plugins/content_writing_index.rb +52 -0
- data/_plugins/content_writing_paths.rb +55 -0
- data/_plugins/force_utf8_encoding.rb +13 -0
- data/_plugins/git_chronology.rb +211 -0
- data/_plugins/git_metadata.rb +43 -0
- data/_plugins/job_sections.rb +25 -0
- data/_plugins/lib/content_validators.rb +27 -0
- data/_plugins/lib/resource_validator.rb +56 -0
- data/_plugins/lib/tag_validator.rb +153 -0
- data/_plugins/lib/text_excerpt.rb +56 -0
- data/_plugins/lib/writing_entry.rb +107 -0
- data/_plugins/local_detail_rewrites.rb +194 -0
- data/_plugins/timeline.rb +507 -0
- data/_plugins/writing_slug_limits.rb +70 -0
- data/assets/css/article.css +1330 -0
- data/assets/css/base.css +1432 -0
- data/assets/css/cv.css +13 -0
- data/assets/css/global-link.css +94 -0
- data/assets/css/ledger/bibliography.css +307 -0
- data/assets/css/ledger/chrome.css +118 -0
- data/assets/css/ledger/cv.css +836 -0
- data/assets/css/ledger/detail.css +1270 -0
- data/assets/css/ledger/footer.css +298 -0
- data/assets/css/ledger/home.css +1490 -0
- data/assets/css/ledger/network.css +106 -0
- data/assets/css/ledger/projects.css +716 -0
- data/assets/css/ledger/rascunhos.css +379 -0
- data/assets/css/ledger/sources.css +327 -0
- data/assets/css/ledger/writing.css +754 -0
- data/assets/tailwind-play.js +15 -0
- data/examples/full/Gemfile +7 -0
- data/examples/full/_config.yml +92 -0
- data/examples/full/_redirects +3 -0
- data/examples/full/content/collections/articles/2026-01-01-welcome.md +9 -0
- data/examples/full/content/collections/data/contacts.yml +3 -0
- data/examples/full/content/collections/data/education.yml +4 -0
- data/examples/full/content/collections/jobs/research-fellow.md +12 -0
- data/examples/full/content/collections/posts/2026-01-02-note.md +9 -0
- data/examples/full/content/collections/products/ledger-tool.md +6 -0
- data/examples/full/content/collections/projects/demo-kit.md +10 -0
- data/examples/full/content/collections/resources/style-guide.md +7 -0
- data/examples/full/content/pages/cv/summary.md +1 -0
- data/examples/full/content/pages/headers.yml +20 -0
- data/examples/full/index.html +4 -0
- data/examples/minimal/Gemfile +7 -0
- data/examples/minimal/_config.yml +47 -0
- data/examples/minimal/_redirects +3 -0
- data/examples/minimal/content/collections/articles/2026-01-01-hello.md +10 -0
- data/examples/minimal/content/collections/articles/2026-01-02-second.md +9 -0
- data/examples/minimal/content/pages/headers.yml +6 -0
- data/examples/minimal/index.html +4 -0
- data/exe/pandorga +7 -0
- data/functions/api/studio/[[path]].js +562 -0
- data/functions/api/studio/_lib/auth.js +131 -0
- data/functions/api/studio/_lib/blocks.js +156 -0
- data/functions/api/studio/_lib/gemini.js +62 -0
- data/functions/api/studio/_lib/github.js +278 -0
- data/functions/api/studio/_lib/guidelines.js +143 -0
- data/functions/api/studio/_lib/paths.js +76 -0
- data/functions/api/studio/_lib/prompts.js +165 -0
- data/functions/api/studio/_lib/rate-limit.js +40 -0
- data/functions/api/studio/_lib/rewrite.js +136 -0
- data/functions/api/studio/_lib/sanitize.js +143 -0
- data/lib/pandorga/cli.rb +66 -0
- data/lib/pandorga/commands/doctor.rb +66 -0
- data/lib/pandorga/commands/export.rb +30 -0
- data/lib/pandorga/commands/install_functions.rb +41 -0
- data/lib/pandorga/commands/new.rb +113 -0
- data/lib/pandorga/commands/publish.rb +53 -0
- data/lib/pandorga/commands/serve.rb +34 -0
- data/lib/pandorga/commands/studio_schema.rb +309 -0
- data/lib/pandorga/jekyll/generator.rb +74 -0
- data/lib/pandorga/jekyll/plugins/bibliography_artifact.rb +57 -0
- data/lib/pandorga/jekyll/plugins/content_backend.rb +37 -0
- data/lib/pandorga/jekyll/plugins/content_collections.rb +51 -0
- data/lib/pandorga/jekyll/plugins/content_detail_paths.rb +58 -0
- data/lib/pandorga/jekyll/plugins/content_headers.rb +73 -0
- data/lib/pandorga/jekyll/plugins/content_keys.rb +310 -0
- data/lib/pandorga/jekyll/plugins/content_local_serve.rb +168 -0
- data/lib/pandorga/jekyll/plugins/content_site_adapter.rb +159 -0
- data/lib/pandorga/jekyll/plugins/content_validators_hook.rb +20 -0
- data/lib/pandorga/jekyll/plugins/content_writing_index.rb +52 -0
- data/lib/pandorga/jekyll/plugins/content_writing_paths.rb +55 -0
- data/lib/pandorga/jekyll/plugins/force_utf8_encoding.rb +13 -0
- data/lib/pandorga/jekyll/plugins/git_chronology.rb +211 -0
- data/lib/pandorga/jekyll/plugins/git_metadata.rb +43 -0
- data/lib/pandorga/jekyll/plugins/job_sections.rb +25 -0
- data/lib/pandorga/jekyll/plugins/lib/content_validators.rb +27 -0
- data/lib/pandorga/jekyll/plugins/lib/resource_validator.rb +56 -0
- data/lib/pandorga/jekyll/plugins/lib/tag_validator.rb +153 -0
- data/lib/pandorga/jekyll/plugins/lib/text_excerpt.rb +56 -0
- data/lib/pandorga/jekyll/plugins/lib/writing_entry.rb +107 -0
- data/lib/pandorga/jekyll/plugins/local_detail_rewrites.rb +194 -0
- data/lib/pandorga/jekyll/plugins/timeline.rb +507 -0
- data/lib/pandorga/jekyll/plugins/writing_slug_limits.rb +70 -0
- data/lib/pandorga/jekyll.rb +15 -0
- data/lib/pandorga/object_store_env.rb +51 -0
- data/lib/pandorga/registry/schema.yml +115 -0
- data/lib/pandorga/registry.rb +279 -0
- data/lib/pandorga/version.rb +5 -0
- data/lib/pandorga.rb +19 -0
- data/scripts/cdn-allowlist.json +19 -0
- data/scripts/content/backfill-content-keys.rb +99 -0
- data/scripts/content/band_art.rb +362 -0
- data/scripts/content/export-content-json.rb +741 -0
- data/scripts/content/flatten-ansi-capture.mjs +153 -0
- data/scripts/content/hero_portraits.rb +28 -0
- data/scripts/content/publish-content-to-object-store.sh +78 -0
- data/scripts/content/publish-content-to-r2.sh +5 -0
- data/scripts/content/sync-content-json-to-r2.rb +167 -0
- data/scripts/content/sync-content-redirects.rb +12 -0
- data/scripts/generate-configuration-doc.rb +127 -0
- data/scripts/lib/content_license.rb +50 -0
- data/scripts/lib/content_storage_config.rb +70 -0
- data/scripts/lib/normalize-display-math.mjs +52 -0
- data/scripts/lib/r2_json_sync.rb +76 -0
- data/scripts/lib/withdrawn_public_objects.rb +23 -0
- data/scripts/lib/writing_index_contract.rb +61 -0
- data/scripts/pdf/md-to-pdf.mjs +1400 -0
- data/scripts/pdf/md-to-pdf.sh +27 -0
- data/scripts/test/fixtures/dual-template/_config.yml +32 -0
- data/scripts/test/fixtures/dual-template/index.html +4 -0
- data/scripts/test/render-parity/article-note.json +5 -0
- data/scripts/test/render-parity/blockquote.json +5 -0
- data/scripts/test/render-parity/blocks/ansi-basic.json +7 -0
- data/scripts/test/render-parity/blocks/ansi-bold-is-bright.json +7 -0
- data/scripts/test/render-parity/blocks/ansi-drops-cursor-moves.json +7 -0
- data/scripts/test/render-parity/blocks/ansi-escapes-markup.json +7 -0
- data/scripts/test/render-parity/blocks/ansi-extended-colour.json +7 -0
- data/scripts/test/render-parity/blocks/ansi-real-control-byte.json +7 -0
- data/scripts/test/render-parity/blocks/archive-card-date-once.json +19 -0
- data/scripts/test/render-parity/blocks/archive-card-empty-foot.json +7 -0
- data/scripts/test/render-parity/blocks/archive-card-footer-dates.json +22 -0
- data/scripts/test/render-parity/blocks/archive-card-meta-parts.json +26 -0
- data/scripts/test/render-parity/blocks/archive-card.json +32 -0
- data/scripts/test/render-parity/blocks/cta-link.json +13 -0
- data/scripts/test/render-parity/blocks/lang-pill-pt.json +8 -0
- data/scripts/test/render-parity/blocks/lang-pill.json +8 -0
- data/scripts/test/render-parity/blocks/ledger-row-meta-parts.json +29 -0
- data/scripts/test/render-parity/blocks/ledger-row.json +35 -0
- data/scripts/test/render-parity/blocks/meta-strip.json +27 -0
- data/scripts/test/render-parity/blocks/poster-media-image.json +8 -0
- data/scripts/test/render-parity/blocks/poster-media-video.json +9 -0
- data/scripts/test/render-parity/blocks/section-banner.json +13 -0
- data/scripts/test/render-parity/blocks/system-card-custom-meta.json +22 -0
- data/scripts/test/render-parity/blocks/system-card.json +48 -0
- data/scripts/test/render-parity/blocks/tag-chips-links.json +12 -0
- data/scripts/test/render-parity/blocks/tag-chips.json +9 -0
- data/scripts/test/render-parity/cut-in-blank-line.json +9 -0
- data/scripts/test/render-parity/cut-in-right.json +9 -0
- data/scripts/test/render-parity/cut-in.json +8 -0
- data/scripts/test/render-parity/figure.json +5 -0
- data/scripts/test/render-parity/load-runtime.mjs +337 -0
- data/scripts/test/render-parity/ongoing-product.json +5 -0
- data/scripts/test/render-parity/plotly.json +5 -0
- data/scripts/test/render-parity/poem.json +5 -0
- data/scripts/test/render-parity/run-absent-field-checks.mjs +232 -0
- data/scripts/test/render-parity/run-block-fixture.mjs +86 -0
- data/scripts/test/render-parity/run-detail-parity-checks.mjs +123 -0
- data/scripts/test/render-parity/run-field-flow-checks.mjs +227 -0
- data/scripts/test/render-parity/run-fixture.mjs +159 -0
- data/scripts/test/render-parity/selectors.mjs +43 -0
- data/scripts/test/render-parity/video.json +5 -0
- data/scripts/test/render-parity/youtube-short.json +10 -0
- data/scripts/test/render-parity/youtube.json +8 -0
- data/scripts/test/test-absent-field-absent-element.rb +43 -0
- data/scripts/test/test-cdn-pins.rb +44 -0
- data/scripts/test/test-cloudflare-watch-paths-doc.rb +31 -0
- data/scripts/test/test-configuration-doc.rb +36 -0
- data/scripts/test/test-content-detail-urls.rb +346 -0
- data/scripts/test/test-content-keys.rb +110 -0
- data/scripts/test/test-content-license.rb +45 -0
- data/scripts/test/test-content-render-parity.rb +38 -0
- data/scripts/test/test-content-validators.rb +12 -0
- data/scripts/test/test-css-structure.rb +72 -0
- data/scripts/test/test-cv-export-contract.rb +158 -0
- data/scripts/test/test-detail-render-parity.rb +40 -0
- data/scripts/test/test-dev-reexport.rb +122 -0
- data/scripts/test/test-doctor.rb +39 -0
- data/scripts/test/test-dual-template-instances.rb +87 -0
- data/scripts/test/test-dual-template-runtime.rb +167 -0
- data/scripts/test/test-examples-build.rb +60 -0
- data/scripts/test/test-export-content-json-incremental.rb +138 -0
- data/scripts/test/test-export.rb +53 -0
- data/scripts/test/test-exported-fields-reach-the-view.rb +60 -0
- data/scripts/test/test-form-control-theming.rb +143 -0
- data/scripts/test/test-git-chronology.rb +414 -0
- data/scripts/test/test-hero-portraits.mjs +97 -0
- data/scripts/test/test-hero-portraits.rb +162 -0
- data/scripts/test/test-home-band-art.rb +135 -0
- data/scripts/test/test-install-functions.rb +39 -0
- data/scripts/test/test-language-export.rb +79 -0
- data/scripts/test/test-listing-filter-contract.rb +119 -0
- data/scripts/test/test-math-row-breaks.mjs +79 -0
- data/scripts/test/test-math-row-breaks.rb +18 -0
- data/scripts/test/test-new.rb +113 -0
- data/scripts/test/test-no-personal-data.rb +85 -0
- data/scripts/test/test-public-cv-export.rb +164 -0
- data/scripts/test/test-r2-config-consistency.rb +57 -0
- data/scripts/test/test-r2-json-sync.rb +193 -0
- data/scripts/test/test-registry-home.rb +34 -0
- data/scripts/test/test-runtime-js-syntax.rb +64 -0
- data/scripts/test/test-slim-writing-index.rb +126 -0
- data/scripts/test/test-studio-api-contract.rb +99 -0
- data/scripts/test/test-studio-content-files.rb +79 -0
- data/scripts/test/test-studio-liquid-roundtrip.mjs +179 -0
- data/scripts/test/test-studio-rate-limit.mjs +70 -0
- data/scripts/test/test-studio-rewrite-api-contract.rb +59 -0
- data/scripts/test/test-studio-rewrite-sanitize.mjs +210 -0
- data/scripts/test/test-studio-schema-composition.rb +126 -0
- data/scripts/test/test-studio-slug-config.rb +167 -0
- data/scripts/test/test-template-packages.rb +51 -0
- data/scripts/test/test-text-excerpt.rb +51 -0
- data/scripts/test/test-unwrap-media-src.mjs +39 -0
- data/scripts/test/test-unwrap-media-src.rb +19 -0
- data/scripts/test/test-withdrawn-content-export.rb +69 -0
- data/scripts/test/test-writing-index-export-slugs.rb +84 -0
- data/scripts/test/test-writing-slug-limits.rb +61 -0
- data/scripts/test/test-xcite-chronology.rb +106 -0
- data/scripts/validate.sh +74 -0
- data/scripts/visual/build-cv-pages-json.js +33 -0
- data/scripts/visual/build-site-pages-json.js +94 -0
- data/scripts/visual/publish-visual-inspection-to-r2.sh +42 -0
- data/scripts/visual/take-screenshots.js +88 -0
- data/scripts/visual/visual-inspection-pages.json +113 -0
- data/studio/assets/index-B_j0pMD5.css +1 -0
- data/studio/assets/index-Ch4YEv9g.js +285 -0
- data/studio/index.html +27 -0
- data/studio/schema.yml +869 -0
- data/studio-app/README.md +27 -0
- data/studio-app/index.html +26 -0
- data/studio-app/package-lock.json +2499 -0
- data/studio-app/package.json +26 -0
- data/studio-app/skills-lock.json +47 -0
- data/studio-app/src/api/client.js +71 -0
- data/studio-app/src/editor/body-editor.js +70 -0
- data/studio-app/src/editor/liquid-core.js +382 -0
- data/studio-app/src/editor/liquid.js +77 -0
- data/studio-app/src/lib/document.js +207 -0
- data/studio-app/src/lib/list-controls.js +317 -0
- data/studio-app/src/lib/schema.js +66 -0
- data/studio-app/src/lib/yaml-doc.js +100 -0
- data/studio-app/src/main.js +3693 -0
- data/studio-app/src/media/browser.js +578 -0
- data/studio-app/src/preview/render.js +430 -0
- data/studio-app/src/styles/studio.css +2826 -0
- data/studio-app/vite.config.js +25 -0
- data/templates/articles/README.md +40 -0
- data/templates/articles/fixtures/article.md +9 -0
- data/templates/articles/screenshots/README.md +6 -0
- data/templates/articles/studio.yml +73 -0
- data/templates/articles/template.yml +21 -0
- data/templates/bibliography/README.md +41 -0
- data/templates/bibliography/fixtures/references.json +9 -0
- data/templates/bibliography/screenshots/README.md +6 -0
- data/templates/bibliography/studio.yml +66 -0
- data/templates/bibliography/template.yml +18 -0
- data/templates/blog/README.md +38 -0
- data/templates/blog/fixtures/post.md +9 -0
- data/templates/blog/screenshots/README.md +6 -0
- data/templates/blog/studio.yml +69 -0
- data/templates/blog/template.yml +20 -0
- data/templates/cv/README.md +34 -0
- data/templates/cv/fixtures/job.md +12 -0
- data/templates/cv/screenshots/README.md +6 -0
- data/templates/cv/studio.yml +200 -0
- data/templates/cv/template.yml +25 -0
- data/templates/media/README.md +38 -0
- data/templates/media/fixtures/resource.md +7 -0
- data/templates/media/screenshots/README.md +6 -0
- data/templates/media/studio.yml +58 -0
- data/templates/media/template.yml +17 -0
- data/templates/network/README.md +34 -0
- data/templates/network/fixtures/sources.json +3 -0
- data/templates/network/screenshots/README.md +6 -0
- data/templates/network/studio.yml +28 -0
- data/templates/network/template.yml +10 -0
- data/templates/portfolio/README.md +39 -0
- data/templates/portfolio/fixtures/project.md +10 -0
- data/templates/portfolio/screenshots/README.md +6 -0
- data/templates/portfolio/studio.yml +89 -0
- data/templates/portfolio/template.yml +18 -0
- metadata +505 -0
|
@@ -0,0 +1,1490 @@
|
|
|
1
|
+
/* Ledger page styles: home. Owned by the home page; shared component rules
|
|
2
|
+
belong in assets/css/base.css under "Architectural Ledger blocks".
|
|
3
|
+
|
|
4
|
+
The page is a stack of full-bleed bands that alternate on the surface
|
|
5
|
+
ladder (background -> panel-contrast). Depth is tonal: no shadows, no
|
|
6
|
+
radii, no hex literals — a hardcoded colour would break one of the two
|
|
7
|
+
themes. */
|
|
8
|
+
|
|
9
|
+
/* ── Bands ── */
|
|
10
|
+
.home-ledger {
|
|
11
|
+
display: block;
|
|
12
|
+
width: 100%;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.home-band {
|
|
16
|
+
position: relative;
|
|
17
|
+
width: 100%;
|
|
18
|
+
padding-block: var(--space-2xl);
|
|
19
|
+
background-color: transparent;
|
|
20
|
+
border-bottom: 1px solid var(--border-gentle);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.home-band--hero {
|
|
24
|
+
background-color: var(--color-background);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.home-band--contrast {
|
|
28
|
+
background-color: var(--color-panel-contrast);
|
|
29
|
+
background-image: none;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.home-band:last-child {
|
|
33
|
+
border-bottom: 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.home-band-inner {
|
|
37
|
+
max-width: 80rem;
|
|
38
|
+
margin-inline: auto;
|
|
39
|
+
padding-inline: var(--gutter-mobile);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@media (min-width: 768px) {
|
|
43
|
+
.home-band {
|
|
44
|
+
padding-block: var(--space-3xl);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.home-band-inner {
|
|
48
|
+
padding-inline: var(--gutter);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* Structural edge: the short rule the mockup runs along the top-left of the
|
|
53
|
+
featured band, marking it as the page's first statement after the hero. */
|
|
54
|
+
.home-band--ruled::before {
|
|
55
|
+
content: "";
|
|
56
|
+
position: absolute;
|
|
57
|
+
top: 0;
|
|
58
|
+
left: 0;
|
|
59
|
+
width: 6rem;
|
|
60
|
+
height: 3px;
|
|
61
|
+
background: var(--color-primary);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* ── Hero ── */
|
|
65
|
+
/* The band was 3rem above the name and 4.5rem below, which read as the block
|
|
66
|
+
sitting low in its own space. Equal above and below, at 60% of the larger
|
|
67
|
+
of the two, so the masthead is centred in the air around it. On desktop the
|
|
68
|
+
photograph matches the copy column height at 3:4; on a phone it is 4:3
|
|
69
|
+
full-bleed. */
|
|
70
|
+
.home-band--hero {
|
|
71
|
+
padding-block: 2.7rem;
|
|
72
|
+
position: relative;
|
|
73
|
+
isolation: isolate;
|
|
74
|
+
overflow: hidden;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.home-band--hero .home-band-inner {
|
|
78
|
+
position: relative;
|
|
79
|
+
z-index: 1;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* ── Hero art slot (site supplies art via pandorga.home.hero_art) ── */
|
|
83
|
+
.home-hero-art,
|
|
84
|
+
.home-hero-pandorga {
|
|
85
|
+
position: absolute;
|
|
86
|
+
inset: 0;
|
|
87
|
+
pointer-events: none;
|
|
88
|
+
z-index: 0;
|
|
89
|
+
overflow: hidden;
|
|
90
|
+
opacity: 0.42;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.home-hero-art-svg,
|
|
94
|
+
.home-hero-pandorga-svg {
|
|
95
|
+
width: 100%;
|
|
96
|
+
height: 100%;
|
|
97
|
+
display: block;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@media (max-width: 639px) {
|
|
101
|
+
.home-hero-art,
|
|
102
|
+
.home-hero-pandorga {
|
|
103
|
+
opacity: 0.28;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Ambient pool beNewsreader the hero.
|
|
108
|
+
*
|
|
109
|
+
* Same weight as the earlier primary-container bloom, but keyed to neutral
|
|
110
|
+
* ink/outline so it stays grey paper depth instead of a blue spotlight. */
|
|
111
|
+
.home-band--hero::before {
|
|
112
|
+
content: "";
|
|
113
|
+
position: absolute;
|
|
114
|
+
z-index: -1;
|
|
115
|
+
top: -18%;
|
|
116
|
+
right: 8%;
|
|
117
|
+
width: min(38rem, 60%);
|
|
118
|
+
aspect-ratio: 1;
|
|
119
|
+
border-radius: 50%;
|
|
120
|
+
background: radial-gradient(circle,
|
|
121
|
+
color-mix(in srgb, var(--color-outline) 22%, transparent) 0%,
|
|
122
|
+
color-mix(in srgb, var(--color-on-surface) 8%, transparent) 42%,
|
|
123
|
+
transparent 72%);
|
|
124
|
+
filter: blur(52px);
|
|
125
|
+
pointer-events: none;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
[data-theme="dark"] .home-band--hero::before {
|
|
129
|
+
background: radial-gradient(circle,
|
|
130
|
+
color-mix(in srgb, var(--color-on-surface) 10%, transparent) 0%,
|
|
131
|
+
color-mix(in srgb, var(--color-outline) 8%, transparent) 50%,
|
|
132
|
+
transparent 70%);
|
|
133
|
+
filter: blur(60px);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
137
|
+
.home-band--hero::before {
|
|
138
|
+
transition: opacity var(--motion-duration-slow, 400ms) var(--motion-ease-default);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.home-hero {
|
|
143
|
+
display: grid;
|
|
144
|
+
grid-template-columns: minmax(0, 1fr);
|
|
145
|
+
gap: var(--space-xl);
|
|
146
|
+
align-items: start;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
@media (min-width: 1024px) {
|
|
150
|
+
.home-hero {
|
|
151
|
+
/* Copy content height sets the flex line. Portrait stretches to that
|
|
152
|
+
height; aspect-ratio then sets W = 3/4 × H. Children are taken out of
|
|
153
|
+
flow so the photo's intrinsic box cannot inflate the line or collapse
|
|
154
|
+
the copy. */
|
|
155
|
+
display: flex;
|
|
156
|
+
flex-direction: row;
|
|
157
|
+
align-items: stretch;
|
|
158
|
+
gap: var(--space-2xl);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.home-hero-copy {
|
|
162
|
+
flex: 1 1 auto;
|
|
163
|
+
min-width: min(100%, 20rem);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.home-hero-portrait {
|
|
167
|
+
position: relative;
|
|
168
|
+
flex: 0 0 auto;
|
|
169
|
+
align-self: stretch;
|
|
170
|
+
width: auto;
|
|
171
|
+
height: auto;
|
|
172
|
+
aspect-ratio: 3 / 4;
|
|
173
|
+
overflow: hidden;
|
|
174
|
+
min-width: 0;
|
|
175
|
+
min-height: 0;
|
|
176
|
+
max-width: none;
|
|
177
|
+
justify-self: unset;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.home-hero-plate-wrap {
|
|
181
|
+
position: absolute;
|
|
182
|
+
inset: 0;
|
|
183
|
+
width: 100%;
|
|
184
|
+
height: 100%;
|
|
185
|
+
flex: none;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.home-hero-plate {
|
|
189
|
+
position: absolute;
|
|
190
|
+
inset: 0;
|
|
191
|
+
width: 100%;
|
|
192
|
+
height: 100%;
|
|
193
|
+
aspect-ratio: auto;
|
|
194
|
+
flex: none;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.home-hero-plate img {
|
|
198
|
+
position: absolute;
|
|
199
|
+
inset: 0;
|
|
200
|
+
width: 100%;
|
|
201
|
+
height: 100%;
|
|
202
|
+
max-width: none;
|
|
203
|
+
object-fit: cover;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.home-hero-copy {
|
|
208
|
+
display: flex;
|
|
209
|
+
flex-direction: column;
|
|
210
|
+
justify-content: flex-start;
|
|
211
|
+
min-width: 0;
|
|
212
|
+
container-type: inline-size;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.home-hero-tagline {
|
|
216
|
+
display: flex;
|
|
217
|
+
align-items: center;
|
|
218
|
+
gap: var(--space-sm);
|
|
219
|
+
margin: 0 0 var(--space-sm);
|
|
220
|
+
color: var(--color-on-surface);
|
|
221
|
+
font-family: var(--font-label);
|
|
222
|
+
font-size: var(--type-label-lg);
|
|
223
|
+
font-weight: var(--weight-label);
|
|
224
|
+
letter-spacing: 0.03em;
|
|
225
|
+
line-height: 1.35;
|
|
226
|
+
max-width: 100%;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
@media (min-width: 1024px) {
|
|
230
|
+
.home-hero-tagline {
|
|
231
|
+
font-size: calc(var(--type-label-lg) + 2pt);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.home-hero-tagline::after {
|
|
236
|
+
content: "";
|
|
237
|
+
flex: 1 1 auto;
|
|
238
|
+
height: 0;
|
|
239
|
+
border-top: 1px dashed color-mix(in srgb, var(--color-outline) 45%, transparent);
|
|
240
|
+
min-width: 1.5rem;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.home-hero-tagline p {
|
|
244
|
+
margin: 0;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/* Name spans the copy column (container query on .home-hero-copy). The floor
|
|
248
|
+
is the band-title step — Articles, Rascunhos, Projects — so a phone does
|
|
249
|
+
not drop the name to the card size to keep it on one line. From 640px the
|
|
250
|
+
floor follows `.section-title` up to `--type-section-lg`. Wider columns
|
|
251
|
+
still grow toward `--type-page-lg`. */
|
|
252
|
+
.home-hero-title {
|
|
253
|
+
font-family: var(--font-title);
|
|
254
|
+
font-weight: 400;
|
|
255
|
+
font-size: clamp(var(--type-section), calc(100cqi * 0.92 / 14.5), var(--type-page-lg));
|
|
256
|
+
line-height: 1.05;
|
|
257
|
+
letter-spacing: -0.02em;
|
|
258
|
+
color: var(--color-on-surface);
|
|
259
|
+
font-synthesis: none;
|
|
260
|
+
font-optical-sizing: auto;
|
|
261
|
+
margin: 0 0 var(--space-xl);
|
|
262
|
+
max-width: 100%;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
@media (max-width: 767px) {
|
|
266
|
+
.home-hero-title {
|
|
267
|
+
white-space: normal;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
@media (min-width: 640px) {
|
|
272
|
+
.home-hero-title {
|
|
273
|
+
font-size: clamp(var(--type-section-lg), calc(100cqi * 0.92 / 14.5), var(--type-page-lg));
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
@media (min-width: 768px) {
|
|
278
|
+
.home-hero-title {
|
|
279
|
+
white-space: nowrap;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
.home-hero-given,
|
|
284
|
+
.home-hero-family {
|
|
285
|
+
display: inline;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.home-hero-family {
|
|
289
|
+
color: var(--color-primary);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.home-hero-summary {
|
|
293
|
+
max-width: var(--reading-measure, 45rem);
|
|
294
|
+
color: var(--color-on-surface);
|
|
295
|
+
line-height: var(--leading-body);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
.home-hero-summary p {
|
|
299
|
+
margin: 0 0 var(--space-md);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.home-hero-summary p:last-child {
|
|
303
|
+
margin-bottom: 0;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.home-hero-portrait {
|
|
307
|
+
position: relative;
|
|
308
|
+
width: 100%;
|
|
309
|
+
max-width: 16rem;
|
|
310
|
+
justify-self: end;
|
|
311
|
+
display: flex;
|
|
312
|
+
flex-direction: column;
|
|
313
|
+
min-height: 0;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.home-hero-plate-wrap {
|
|
317
|
+
position: relative;
|
|
318
|
+
z-index: 1;
|
|
319
|
+
flex: 0 0 auto;
|
|
320
|
+
display: flex;
|
|
321
|
+
flex-direction: column;
|
|
322
|
+
min-height: 0;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.home-hero-actions {
|
|
326
|
+
display: flex;
|
|
327
|
+
flex-wrap: wrap;
|
|
328
|
+
align-items: center;
|
|
329
|
+
gap: var(--space-sm);
|
|
330
|
+
margin-top: var(--space-lg);
|
|
331
|
+
position: relative;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/* Primary hero CTA: a small lift on hover — tactile without box-shadow. */
|
|
335
|
+
.home-hero-cta {
|
|
336
|
+
transition: color var(--motion-duration-fast) var(--motion-ease-default),
|
|
337
|
+
border-color var(--motion-duration-fast) var(--motion-ease-default),
|
|
338
|
+
background-color var(--motion-duration-fast) var(--motion-ease-default),
|
|
339
|
+
transform var(--motion-duration-fast) var(--motion-ease-default);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.home-hero-cta:hover {
|
|
343
|
+
transform: translateY(-2px);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
.home-hero-cta:active {
|
|
347
|
+
transform: translateY(0);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/* ── Portrait plate ──
|
|
351
|
+
Beside the copy on a wide page the plate is portrait (3:4): its height
|
|
352
|
+
matches the left column and the width is W = 3/4 × H. Edge-to-edge on a
|
|
353
|
+
phone it is landscape (4:3) from the band width. */
|
|
354
|
+
.home-hero-plate {
|
|
355
|
+
position: relative;
|
|
356
|
+
z-index: 1;
|
|
357
|
+
margin: 0;
|
|
358
|
+
overflow: hidden;
|
|
359
|
+
aspect-ratio: 3 / 4;
|
|
360
|
+
/* Black in both themes: the photograph fades in over this, so a theme
|
|
361
|
+
canvas here would read as the wrong picture arriving late. */
|
|
362
|
+
background: black;
|
|
363
|
+
border: 1.5px solid var(--border-ink);
|
|
364
|
+
border-radius: var(--radius-card);
|
|
365
|
+
width: 100%;
|
|
366
|
+
flex: 0 0 auto;
|
|
367
|
+
min-height: 0;
|
|
368
|
+
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-on-surface) 10%, transparent);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
@media (max-width: 767px) {
|
|
372
|
+
.home-hero-plate {
|
|
373
|
+
aspect-ratio: 4 / 3;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
:root:not([data-theme="dark"]) .home-hero-plate,
|
|
378
|
+
html[data-theme="light"] .home-hero-plate {
|
|
379
|
+
border-width: 1px;
|
|
380
|
+
border-color: var(--border-ink);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
[data-theme="dark"] .home-hero-plate {
|
|
384
|
+
box-shadow: none;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/* Silk facet beNewsreader the portrait — restored; the Borders pass had hidden it. */
|
|
388
|
+
.home-hero-shard {
|
|
389
|
+
top: -2.25rem;
|
|
390
|
+
right: -2rem;
|
|
391
|
+
width: 15rem;
|
|
392
|
+
height: 15rem;
|
|
393
|
+
background: var(--color-primary);
|
|
394
|
+
opacity: var(--cubist-shard-opacity-strong, 16%);
|
|
395
|
+
z-index: 0;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
@media (max-width: 1023px) {
|
|
399
|
+
.home-hero-shard {
|
|
400
|
+
width: 11rem;
|
|
401
|
+
height: 11rem;
|
|
402
|
+
top: -1.5rem;
|
|
403
|
+
right: -1.25rem;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
@media (max-width: 1023px) {
|
|
408
|
+
.home-hero-portrait::before {
|
|
409
|
+
content: "";
|
|
410
|
+
position: absolute;
|
|
411
|
+
z-index: 0;
|
|
412
|
+
top: 55%;
|
|
413
|
+
left: 50%;
|
|
414
|
+
transform: translate(-50%, -50%);
|
|
415
|
+
width: 140%;
|
|
416
|
+
height: 120%;
|
|
417
|
+
border-radius: 50%;
|
|
418
|
+
background: radial-gradient(circle,
|
|
419
|
+
color-mix(in srgb, var(--color-outline) 18%, transparent) 0%,
|
|
420
|
+
color-mix(in srgb, var(--color-on-surface) 7%, transparent) 45%,
|
|
421
|
+
transparent 72%);
|
|
422
|
+
filter: blur(40px);
|
|
423
|
+
pointer-events: none;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
[data-theme="dark"] .home-hero-portrait::before {
|
|
427
|
+
background: radial-gradient(circle,
|
|
428
|
+
color-mix(in srgb, var(--color-on-surface) 12%, transparent) 0%,
|
|
429
|
+
transparent 70%);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
.home-hero-plate img {
|
|
434
|
+
width: 100%;
|
|
435
|
+
height: 100%;
|
|
436
|
+
object-fit: cover;
|
|
437
|
+
object-position: 52% 18%;
|
|
438
|
+
display: block;
|
|
439
|
+
filter: saturate(1.05) contrast(0.98);
|
|
440
|
+
opacity: 0;
|
|
441
|
+
transition: opacity var(--motion-duration-slow) var(--motion-ease-default),
|
|
442
|
+
transform var(--motion-duration-slow) var(--motion-ease-default),
|
|
443
|
+
filter var(--motion-duration-slow) var(--motion-ease-default),
|
|
444
|
+
mix-blend-mode var(--motion-duration-base) var(--motion-ease-default);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
.home-hero-plate img.is-shown {
|
|
448
|
+
opacity: 1;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
.home-hero-plate:hover img {
|
|
452
|
+
transform: scale(1.02);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
@media (prefers-reduced-motion: reduce) {
|
|
456
|
+
|
|
457
|
+
.home-hero-plate img,
|
|
458
|
+
.home-hero-plate:hover img {
|
|
459
|
+
transform: none;
|
|
460
|
+
transition: none;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/* ── Section banners ──
|
|
465
|
+
Atelier plate edge: a denser hairline, a longer accent rule, and a short
|
|
466
|
+
vertical tick so each band reads as a ruled plate rather than a soft fade. */
|
|
467
|
+
.home-band:not(.home-band--hero) .ledger-section-banner {
|
|
468
|
+
padding-top: var(--space-lg);
|
|
469
|
+
border-top: 1px solid var(--border-gentle);
|
|
470
|
+
box-shadow: 0 4px 0 -3px var(--border-gentle-faint);
|
|
471
|
+
position: relative;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
.home-band:not(.home-band--hero) .ledger-section-banner::before {
|
|
475
|
+
content: "";
|
|
476
|
+
position: absolute;
|
|
477
|
+
left: 0;
|
|
478
|
+
top: -2px;
|
|
479
|
+
width: 4rem;
|
|
480
|
+
height: 3px;
|
|
481
|
+
background: var(--color-primary);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
.home-band:not(.home-band--hero) .ledger-section-banner::after {
|
|
485
|
+
content: "";
|
|
486
|
+
position: absolute;
|
|
487
|
+
left: 4.35rem;
|
|
488
|
+
top: -4px;
|
|
489
|
+
width: 1px;
|
|
490
|
+
height: 7px;
|
|
491
|
+
background: color-mix(in srgb, var(--color-primary) 55%, var(--color-outline));
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
.home-section-aside {
|
|
495
|
+
display: flex;
|
|
496
|
+
flex-direction: column;
|
|
497
|
+
align-items: flex-start;
|
|
498
|
+
gap: var(--space-sm);
|
|
499
|
+
max-width: 30rem;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/* The aside sits at the end of the banner, so its contents align to that same
|
|
503
|
+
edge — button and copy on one axis. Aligning the button left while the copy
|
|
504
|
+
ran right made every band look like a zigzag. */
|
|
505
|
+
@media (min-width: 768px) {
|
|
506
|
+
.home-section-aside {
|
|
507
|
+
align-items: flex-end;
|
|
508
|
+
text-align: right;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
.home-section-aside .ledger-cta {
|
|
512
|
+
align-self: flex-end;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/* The lead column of a banner holds the kicker, the title and the note, all
|
|
517
|
+
three filled from content/pages/headers.yml. It has to be able to
|
|
518
|
+
shrink: the banner is a flex row and the aside beside it is sized by its
|
|
519
|
+
button, so without this the note pushes the button off the line. */
|
|
520
|
+
.ledger-section-banner .ledger-section-lead {
|
|
521
|
+
min-width: 0;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
/* One line under the title saying what the band holds. It is prose rather than
|
|
525
|
+
a chrome label, so it takes the body face and the reading measure instead of
|
|
526
|
+
the uppercase treatment `.ledger-section-note` carries in base.css — that
|
|
527
|
+
one is the right-hand tally at the end of a banner, which is a different
|
|
528
|
+
thing standing in a different place.
|
|
529
|
+
|
|
530
|
+
The element is removed outright when the field is empty (see
|
|
531
|
+
hydrateHomeSections), so this margin never opens a gap of its own. */
|
|
532
|
+
.home-section-note {
|
|
533
|
+
margin: var(--space-sm) 0 0;
|
|
534
|
+
max-width: var(--reading-measure, 45rem);
|
|
535
|
+
color: var(--color-on-surface-variant);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/* ── Featured article band ── */
|
|
539
|
+
/* The lead is a panel, not a row.
|
|
540
|
+
It used to be three bare columns sitting on the band background, which is
|
|
541
|
+
the same ground the three cards below it stand on: nothing about it said it
|
|
542
|
+
was the piece the band leads with, and a reader scanning down met four
|
|
543
|
+
equal entries. It now takes the card rung of the surface ladder, is fenced
|
|
544
|
+
by the same hairline every other panel on the site carries, and opens on a
|
|
545
|
+
rule in the primary — the structural edge this page already uses on
|
|
546
|
+
`.home-band--ruled` — so the eye stops at the top of it. The image inside is
|
|
547
|
+
inset by the panel's own padding rather than running to the band edge, which
|
|
548
|
+
is the other half of the promotion: the lead contains its picture, the cards
|
|
549
|
+
below are contained by theirs.
|
|
550
|
+
|
|
551
|
+
Everything here is ladder tokens and the gentle border family; the site
|
|
552
|
+
ships a light and a dark palette, so a literal colour would be wrong in one
|
|
553
|
+
of them.
|
|
554
|
+
|
|
555
|
+
The three type terms below are custom properties because the plate in the
|
|
556
|
+
third column is measured against them rather than given a size of its own —
|
|
557
|
+
see --home-featured-plate-height and `.home-featured .ledger-poster`. */
|
|
558
|
+
.home-featured {
|
|
559
|
+
--home-featured-title-size: var(--type-card-lg);
|
|
560
|
+
--home-featured-title-line: 1.25;
|
|
561
|
+
--home-featured-copy-line: var(--leading-body);
|
|
562
|
+
position: relative;
|
|
563
|
+
overflow: hidden;
|
|
564
|
+
display: grid;
|
|
565
|
+
grid-template-columns: minmax(0, 1fr);
|
|
566
|
+
gap: var(--space-md);
|
|
567
|
+
align-items: stretch;
|
|
568
|
+
background: var(--color-surface-card);
|
|
569
|
+
border: 1.5px solid var(--border-ink);
|
|
570
|
+
border-radius: var(--radius-card);
|
|
571
|
+
border-top: 2px solid var(--color-primary);
|
|
572
|
+
padding: var(--space-md) var(--space-lg);
|
|
573
|
+
transition:
|
|
574
|
+
background-color var(--motion-duration-fast) var(--motion-ease-default),
|
|
575
|
+
border-color var(--motion-duration-fast) var(--motion-ease-default);
|
|
576
|
+
margin-bottom: var(--space-lg);
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
/* The hover rung, same as `.ledger-card` takes: the panel is one link target
|
|
580
|
+
end to end, so the whole surface answers. */
|
|
581
|
+
.home-featured:hover {
|
|
582
|
+
background: var(--color-surface-high);
|
|
583
|
+
border-color: color-mix(in srgb, var(--color-primary) 55%, var(--border-gentle-hover));
|
|
584
|
+
border-top-color: var(--color-primary);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
[data-theme="dark"] .home-featured:hover {
|
|
588
|
+
border-color: color-mix(in srgb, var(--color-primary) 40%, var(--border-gentle-hover));
|
|
589
|
+
border-top-color: var(--color-primary);
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
@media (min-width: 900px) {
|
|
593
|
+
.home-featured {
|
|
594
|
+
--home-featured-title-size: var(--type-section);
|
|
595
|
+
padding: var(--space-lg);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
.home-featured.home-featured--illustrated {
|
|
599
|
+
grid-template-columns: minmax(0, 1fr) 13.5rem;
|
|
600
|
+
gap: var(--space-xl);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
@media (min-width: 1280px) {
|
|
605
|
+
.home-featured.home-featured--illustrated {
|
|
606
|
+
grid-template-columns: minmax(0, 1fr) 15rem;
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
/* Shards on the featured panel, which carried none: the one card the home
|
|
611
|
+
page leads with was also the only one on the band with no footing in the
|
|
612
|
+
cubist half of the identity.
|
|
613
|
+
|
|
614
|
+
The pair is placed around the poster rather than across the card, because
|
|
615
|
+
the poster is opaque and a shard beNewsreader it is a shard nobody sees. The
|
|
616
|
+
alpha takes the top-left, over the index column, where there is nothing but
|
|
617
|
+
chrome and air. The beta takes the bottom-right and comes out from *under*
|
|
618
|
+
the poster into the strip below it, which is the same move the index band
|
|
619
|
+
makes with its own plates.
|
|
620
|
+
|
|
621
|
+
Hues are the two the home band does not already spend: the index panels
|
|
622
|
+
below run secondary and primary, so this pair runs tertiary and secondary,
|
|
623
|
+
and neither repeats the corner its neighbor uses. Shards are absolutely
|
|
624
|
+
positioned, so they are not grid items and the three-column template is
|
|
625
|
+
untouched. */
|
|
626
|
+
.home-featured-shard {
|
|
627
|
+
left: -3rem;
|
|
628
|
+
top: -3.5rem;
|
|
629
|
+
width: 11rem;
|
|
630
|
+
height: 11rem;
|
|
631
|
+
background: var(--color-tertiary);
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
.home-featured-shard--beta {
|
|
635
|
+
left: auto;
|
|
636
|
+
right: -3rem;
|
|
637
|
+
top: auto;
|
|
638
|
+
bottom: -4rem;
|
|
639
|
+
width: 13rem;
|
|
640
|
+
height: 13rem;
|
|
641
|
+
background: var(--color-secondary);
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/* Below the two-column layout the panel is short and the columns stack, so a
|
|
645
|
+
shard sized for the wide card reaches the title.
|
|
646
|
+
|
|
647
|
+
The beta restates `top`/`left` as `auto`. It carries both class names, so
|
|
648
|
+
the rule above also matches it, and an override that gives it a `bottom`
|
|
649
|
+
without taking back the `top` leaves it with all four offsets set — at
|
|
650
|
+
which point top and left win and the pair collapses into one corner. */
|
|
651
|
+
@media (max-width: 1023px) {
|
|
652
|
+
.home-featured-shard {
|
|
653
|
+
width: 8rem;
|
|
654
|
+
height: 8rem;
|
|
655
|
+
top: -2.5rem;
|
|
656
|
+
left: -2.5rem;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
.home-featured-shard--beta {
|
|
660
|
+
width: 9rem;
|
|
661
|
+
height: 9rem;
|
|
662
|
+
top: auto;
|
|
663
|
+
left: auto;
|
|
664
|
+
bottom: -3rem;
|
|
665
|
+
right: -2.5rem;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
/* The columns sit clear of both. */
|
|
670
|
+
.home-featured> :not(.shard-accent) {
|
|
671
|
+
position: relative;
|
|
672
|
+
z-index: 1;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
.home-featured-lead {
|
|
676
|
+
display: flex;
|
|
677
|
+
flex-direction: column;
|
|
678
|
+
justify-content: space-between;
|
|
679
|
+
gap: var(--space-xs);
|
|
680
|
+
min-width: 0;
|
|
681
|
+
max-width: var(--reading-measure, 45rem);
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
.home-featured-rail {
|
|
685
|
+
display: flex;
|
|
686
|
+
flex-wrap: wrap;
|
|
687
|
+
align-items: center;
|
|
688
|
+
gap: var(--space-xs) var(--space-md);
|
|
689
|
+
margin-bottom: 0;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
.home-featured-rail .ledger-meta {
|
|
693
|
+
margin: 0;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
.home-featured-badge {
|
|
697
|
+
flex: 0 0 auto;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
.home-featured-title {
|
|
701
|
+
margin: 0;
|
|
702
|
+
font-family: var(--font-content-title);
|
|
703
|
+
font-size: var(--home-featured-title-size);
|
|
704
|
+
font-weight: var(--weight-title);
|
|
705
|
+
font-synthesis: none;
|
|
706
|
+
line-height: var(--home-featured-title-line);
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/* Home article / rascunho / project cards — content-title voice, not display. */
|
|
710
|
+
.home-card-grid .ledger-card-title,
|
|
711
|
+
.home-card-grid .card-title,
|
|
712
|
+
.home-draft-card .ledger-card-title,
|
|
713
|
+
.home-system-grid .ledger-card-title,
|
|
714
|
+
.home-system-grid .card-title {
|
|
715
|
+
font-family: var(--font-content-title);
|
|
716
|
+
font-weight: var(--weight-title);
|
|
717
|
+
font-synthesis: none;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
.home-featured-title a {
|
|
721
|
+
color: var(--color-on-surface);
|
|
722
|
+
text-decoration: none;
|
|
723
|
+
transition: color var(--motion-duration-fast) var(--motion-ease-default);
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
.home-featured:hover .home-featured-title a {
|
|
727
|
+
color: var(--color-primary);
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
.home-featured-copy {
|
|
731
|
+
margin: 0;
|
|
732
|
+
max-width: var(--reading-measure, 45rem);
|
|
733
|
+
font-family: var(--font-body);
|
|
734
|
+
font-size: var(--type-subtitle);
|
|
735
|
+
font-weight: var(--weight-body);
|
|
736
|
+
line-height: var(--home-featured-copy-line);
|
|
737
|
+
color: var(--color-legend);
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
.home-featured-foot {
|
|
741
|
+
display: flex;
|
|
742
|
+
flex-wrap: wrap;
|
|
743
|
+
align-items: center;
|
|
744
|
+
justify-content: space-between;
|
|
745
|
+
gap: var(--space-sm);
|
|
746
|
+
margin-top: auto;
|
|
747
|
+
padding-top: var(--space-sm);
|
|
748
|
+
border-top: 1px solid var(--border-gentle-divider);
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
.home-featured-foot .home-featured-cta {
|
|
752
|
+
margin-left: auto;
|
|
753
|
+
padding: 0.35rem var(--space-md);
|
|
754
|
+
background: var(--color-primary);
|
|
755
|
+
color: var(--color-on-primary);
|
|
756
|
+
font-weight: var(--weight-label);
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
.home-featured-foot .home-featured-cta:hover {
|
|
760
|
+
background: color-mix(in srgb, var(--color-primary) 85%, var(--color-on-surface));
|
|
761
|
+
color: var(--color-on-primary);
|
|
762
|
+
text-decoration: none;
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
.home-featured-foot .home-featured-cta>span:not(.ledger-cta-arrow):not(.ledger-cta-icon),
|
|
766
|
+
.home-featured-foot .home-featured-cta:hover>span:not(.ledger-cta-arrow):not(.ledger-cta-icon) {
|
|
767
|
+
text-decoration: none;
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
/* ── Writing cards ── */
|
|
771
|
+
.home-card-grid {
|
|
772
|
+
display: grid;
|
|
773
|
+
grid-template-columns: minmax(0, 1fr);
|
|
774
|
+
gap: var(--space-lg);
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
@media (min-width: 768px) {
|
|
778
|
+
.home-card-grid {
|
|
779
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
@media (min-width: 1024px) {
|
|
784
|
+
.home-card-grid {
|
|
785
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
/* The archive card prints the publication date twice — once in the meta strip
|
|
790
|
+
and once in the footer's date evolution. On a three-card preview the strip
|
|
791
|
+
is enough; the full history stays on the writing index. */
|
|
792
|
+
.home-card-grid .ledger-card-foot .date-evolution {
|
|
793
|
+
display: none;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
.home-card-grid .ledger-card-foot {
|
|
797
|
+
justify-content: flex-end;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
/* A top rule per card, rotating through the palette triad, is what gives the
|
|
801
|
+
grid its ledger rhythm in the mockup. */
|
|
802
|
+
.home-card-grid .ledger-card {
|
|
803
|
+
border-top-width: 2px;
|
|
804
|
+
border-top-style: solid;
|
|
805
|
+
border-top-color: var(--color-primary);
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
.home-card-grid .ledger-card:nth-child(2) {
|
|
809
|
+
border-top-color: var(--color-secondary);
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
.home-card-grid .ledger-card:nth-child(3) {
|
|
813
|
+
border-top-color: var(--color-tertiary);
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
/* ── Rascunhos: dropped sheets ──
|
|
817
|
+
Four compact cards rather than four full-width text rows: the poster is
|
|
818
|
+
visible at every breakpoint now (it used to hide below 640px), each card
|
|
819
|
+
keeps a small fixed tilt for the "dropped on the desk" feel, and the
|
|
820
|
+
whole band reads as shorter for the same four entries. Tertiary is the
|
|
821
|
+
hue "posts" already carries everywhere else on this page (the Network of
|
|
822
|
+
Ideas arcs and legend both key rascunhos to it), so the band's accent
|
|
823
|
+
reuses that variable instead of a new one. */
|
|
824
|
+
.home-draft-list {
|
|
825
|
+
display: grid;
|
|
826
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
827
|
+
gap: var(--space-md);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
@media (min-width: 1024px) {
|
|
831
|
+
.home-draft-list {
|
|
832
|
+
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
833
|
+
gap: var(--space-lg);
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
.home-draft-card {
|
|
838
|
+
overflow: hidden;
|
|
839
|
+
border-top-width: 2px;
|
|
840
|
+
border-top-style: solid;
|
|
841
|
+
border-top-color: var(--color-tertiary);
|
|
842
|
+
transform: rotate(0deg);
|
|
843
|
+
transition: transform var(--motion-duration-fast) var(--motion-ease-default),
|
|
844
|
+
background-color var(--motion-duration-fast) var(--motion-ease-default),
|
|
845
|
+
border-color var(--motion-duration-fast) var(--motion-ease-default);
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
/* A handful of fixed degrees per grid position — not a JS random() — so the
|
|
849
|
+
tilt is identical on every render and every screenshot. */
|
|
850
|
+
.home-draft-list>*:nth-child(4n + 1) {
|
|
851
|
+
transform: rotate(-1.2deg);
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
.home-draft-list>*:nth-child(4n + 2) {
|
|
855
|
+
transform: rotate(0.9deg);
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
.home-draft-list>*:nth-child(4n + 3) {
|
|
859
|
+
transform: rotate(-0.7deg);
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
.home-draft-list>*:nth-child(4n) {
|
|
863
|
+
transform: rotate(1.1deg);
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
.home-draft-card:hover,
|
|
867
|
+
.home-draft-card:focus-within {
|
|
868
|
+
transform: rotate(0deg);
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
.home-draft-card .ledger-card-body {
|
|
872
|
+
padding: var(--space-md);
|
|
873
|
+
gap: var(--space-xs);
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
/* Up from 1rem. The four dropped sheets are the only place on the home page
|
|
877
|
+
where a card title sat at body size, so the band read as a footnote to the
|
|
878
|
+
articles above it rather than as its own section. */
|
|
879
|
+
.home-draft-card .ledger-card-title {
|
|
880
|
+
font-size: var(--type-card);
|
|
881
|
+
line-height: 1.3;
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
.home-draft-card .ledger-meta {
|
|
885
|
+
font-family: var(--font-mono);
|
|
886
|
+
font-size: var(--type-mono);
|
|
887
|
+
font-weight: 400;
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
.home-draft-card .ledger-card-copy {
|
|
891
|
+
font-family: var(--font-body);
|
|
892
|
+
font-size: var(--type-subtitle);
|
|
893
|
+
font-weight: var(--weight-body);
|
|
894
|
+
line-height: var(--leading-body);
|
|
895
|
+
color: var(--color-legend);
|
|
896
|
+
/* Fill the surplus the equal-height grid hands the body. `height: 0` with
|
|
897
|
+
`flex: 1` gives the paragraph a definite block size from the flex
|
|
898
|
+
allocation, so line-clamp/overflow clip against that height instead of
|
|
899
|
+
growing past the ellipsis (the old flex:1 + clamp:2 bug that left text
|
|
900
|
+
after "…" and sliced mid-glyph at the card edge). */
|
|
901
|
+
flex: 1 1 auto;
|
|
902
|
+
min-height: 0;
|
|
903
|
+
height: 0;
|
|
904
|
+
display: -webkit-box;
|
|
905
|
+
-webkit-line-clamp: 6;
|
|
906
|
+
line-clamp: 6;
|
|
907
|
+
-webkit-box-orient: vertical;
|
|
908
|
+
overflow: hidden;
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
.home-draft-card .ledger-card-foot .ledger-cta {
|
|
912
|
+
font-size: var(--type-cta);
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
/* Hover/focus zoom on the poster image only, the card clips it via the
|
|
916
|
+
overflow: hidden above so the scale never blows out the card bounds. */
|
|
917
|
+
.home-draft-card .ledger-poster img,
|
|
918
|
+
.home-draft-card .ledger-poster video {
|
|
919
|
+
transition: transform var(--motion-duration-slow) var(--motion-ease-default);
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
.home-draft-card:hover .ledger-poster img,
|
|
923
|
+
.home-draft-card:hover .ledger-poster video,
|
|
924
|
+
.home-draft-card:focus-within .ledger-poster img,
|
|
925
|
+
.home-draft-card:focus-within .ledger-poster video {
|
|
926
|
+
transform: scale(1.04);
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
@media (prefers-reduced-motion: reduce) {
|
|
930
|
+
|
|
931
|
+
.home-draft-card,
|
|
932
|
+
.home-draft-card .ledger-poster img,
|
|
933
|
+
.home-draft-card .ledger-poster video {
|
|
934
|
+
transition: none;
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
/* ── Engineering artifacts ── */
|
|
939
|
+
.home-system-grid {
|
|
940
|
+
display: grid;
|
|
941
|
+
grid-template-columns: minmax(0, 1fr);
|
|
942
|
+
gap: var(--space-lg);
|
|
943
|
+
/* Used to be align-items: start, to stop a short-summary card from being
|
|
944
|
+
stretched into its neighbor's poster height with empty card under its
|
|
945
|
+
links. Left at the grid's default (stretch) now instead: `.ledger-card`
|
|
946
|
+
and `.ledger-system-card` are already flex columns whose body grows
|
|
947
|
+
(`.ledger-card-copy { flex: 1 }`) and whose footer is pinned to the
|
|
948
|
+
bottom (`.ledger-card-foot { margin-top: auto }` in base.css), so the
|
|
949
|
+
extra height a short card gets from stretch reads as intentional air
|
|
950
|
+
above a bottom-anchored footer rather than as a dead gap under it. */
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
@media (min-width: 768px) {
|
|
954
|
+
.home-system-grid {
|
|
955
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
/* Asymmetric pairs — 7/5 then 5/7 — are the "tension scale" of the mockup,
|
|
960
|
+
and they keep two video posters from sitting at identical widths. */
|
|
961
|
+
@media (min-width: 1024px) {
|
|
962
|
+
.home-system-grid {
|
|
963
|
+
grid-template-columns: repeat(12, minmax(0, 1fr));
|
|
964
|
+
gap: var(--space-xl);
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
.home-system-grid>*:nth-child(4n + 1),
|
|
968
|
+
.home-system-grid>*:nth-child(4n) {
|
|
969
|
+
grid-column: span 7;
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
.home-system-grid>*:nth-child(4n + 2),
|
|
973
|
+
.home-system-grid>*:nth-child(4n + 3) {
|
|
974
|
+
grid-column: span 5;
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
.home-system-grid .ledger-card-links {
|
|
979
|
+
row-gap: var(--space-sm);
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
.home-system-grid .ledger-card-copy {
|
|
983
|
+
font-family: var(--font-body);
|
|
984
|
+
font-size: var(--type-subtitle);
|
|
985
|
+
font-weight: var(--weight-body);
|
|
986
|
+
color: var(--color-legend);
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
|
|
990
|
+
@media (min-width: 768px) {}
|
|
991
|
+
|
|
992
|
+
/* ── Profile band, hero plate scale, section action order ──
|
|
993
|
+
Appended after the parallel page work; see the redesign PR. */
|
|
994
|
+
|
|
995
|
+
/* The portrait sits at the end of its grid column so its right edge meets
|
|
996
|
+
the edge every band below aligns to. Cap lives on the earlier
|
|
997
|
+
`.home-hero-portrait` rule (Borders Edition). */
|
|
998
|
+
.home-profile-summary {
|
|
999
|
+
max-width: var(--reading-measure);
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
.home-profile-summary p {
|
|
1003
|
+
margin-bottom: var(--space-md);
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
.home-profile-summary p:last-child {
|
|
1007
|
+
margin-bottom: 0;
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
/* ── Reference band: Sources + Network of Ideas ──────────────────────────
|
|
1011
|
+
Two destinations in one band, each a card whose poster is a plate drawn
|
|
1012
|
+
from that section's own content by the export and fetched at runtime.
|
|
1013
|
+
The plate sits one step *below* the card on the surface ladder, the way
|
|
1014
|
+
the mockup recesses its diagram panels: card -> background, no shadow.
|
|
1015
|
+
|
|
1016
|
+
Every stroke and fill is a custom property, because the two SVGs are
|
|
1017
|
+
injected inline precisely so that a theme flip repaints them. A hex here,
|
|
1018
|
+
or an <img>, would be correct in one palette and wrong in the other.
|
|
1019
|
+
The figure is hidden until the markup lands, so a plate that never arrives
|
|
1020
|
+
leaves the panel with its title and its link rather than an empty frame. */
|
|
1021
|
+
|
|
1022
|
+
/* Ambient pool beNewsreader the pair. Dark palette only, for the reason set out
|
|
1023
|
+
above the hero's.
|
|
1024
|
+
*
|
|
1025
|
+
* The two panels sat side by side with a visible seam and nothing beNewsreader
|
|
1026
|
+
* them. One pool centred on that seam, beNewsreader both, lights the pair as a
|
|
1027
|
+
* single object rather than giving each panel an opening of its own. Held at
|
|
1028
|
+
* 5% against the hero's 7%: at equal strength the page reads as having two
|
|
1029
|
+
* openings, and only one of them is where it starts.
|
|
1030
|
+
*
|
|
1031
|
+
* Centred is right here and nowhere else — the seam is the thing being lit,
|
|
1032
|
+
* so the offset is vertical instead, which is what keeps the pool partly
|
|
1033
|
+
* outside the band it backs. `.home-band` already carries `position:
|
|
1034
|
+
* relative`; `isolation: isolate` is what stops `z-index: -1` escaping beNewsreader
|
|
1035
|
+
* the page background. */
|
|
1036
|
+
.home-band--index {
|
|
1037
|
+
isolation: isolate;
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
[data-theme="dark"] .home-band--index::before {
|
|
1041
|
+
content: "";
|
|
1042
|
+
position: absolute;
|
|
1043
|
+
z-index: -1;
|
|
1044
|
+
top: -8%;
|
|
1045
|
+
left: 50%;
|
|
1046
|
+
width: min(72rem, 100%);
|
|
1047
|
+
height: 116%;
|
|
1048
|
+
transform: translateX(-50%);
|
|
1049
|
+
border-radius: 50%;
|
|
1050
|
+
background: radial-gradient(ellipse,
|
|
1051
|
+
color-mix(in srgb, var(--color-primary) 5%, transparent) 0%,
|
|
1052
|
+
transparent 70%);
|
|
1053
|
+
filter: blur(70px);
|
|
1054
|
+
pointer-events: none;
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
.home-index-split {
|
|
1058
|
+
display: grid;
|
|
1059
|
+
grid-template-columns: minmax(0, 1fr);
|
|
1060
|
+
gap: var(--space-xl);
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
@media (min-width: 900px) {
|
|
1064
|
+
.home-index-split {
|
|
1065
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
1066
|
+
gap: var(--space-xl);
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
.home-index-panel {
|
|
1071
|
+
position: relative;
|
|
1072
|
+
overflow: hidden;
|
|
1073
|
+
display: flex;
|
|
1074
|
+
flex-direction: column;
|
|
1075
|
+
align-items: flex-start;
|
|
1076
|
+
gap: var(--space-md);
|
|
1077
|
+
padding: 0 0 var(--space-lg);
|
|
1078
|
+
background: var(--color-surface-card-contrast);
|
|
1079
|
+
border: 1.5px solid var(--border-ink);
|
|
1080
|
+
border-radius: var(--radius-card);
|
|
1081
|
+
transition:
|
|
1082
|
+
background-color var(--motion-duration-fast) var(--motion-ease-default),
|
|
1083
|
+
border-color var(--motion-duration-fast) var(--motion-ease-default);
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
.home-index-panel:hover {
|
|
1087
|
+
background: var(--color-surface-high-contrast);
|
|
1088
|
+
border-color: var(--border-gentle-hover);
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
/* The plates are line-art, so the cubist half of the identity had no footing
|
|
1092
|
+
on this band at all. One shard per panel, the canonical polygons across
|
|
1093
|
+
the set, rotating hue the way every other shard on the site does.
|
|
1094
|
+
*
|
|
1095
|
+
* They sit in the foot of the panel, under the title and the link: the plate
|
|
1096
|
+
* above carries an opaque background, so a shard beNewsreader it would be a shard
|
|
1097
|
+
* nobody sees. `overflow: hidden` on the panel above keeps the negative
|
|
1098
|
+
* offsets out of the document scroll width, and the shared utility already
|
|
1099
|
+
* unmounts both below 640px. */
|
|
1100
|
+
.home-index-shard {
|
|
1101
|
+
right: -3rem;
|
|
1102
|
+
bottom: -3.5rem;
|
|
1103
|
+
width: 11rem;
|
|
1104
|
+
height: 11rem;
|
|
1105
|
+
background: var(--color-secondary);
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
.home-index-shard--beta {
|
|
1109
|
+
right: auto;
|
|
1110
|
+
left: -3rem;
|
|
1111
|
+
bottom: -3.5rem;
|
|
1112
|
+
width: 11rem;
|
|
1113
|
+
height: 11rem;
|
|
1114
|
+
background: var(--color-primary);
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
.home-index-shard--gamma {
|
|
1118
|
+
right: -3rem;
|
|
1119
|
+
bottom: -3.5rem;
|
|
1120
|
+
width: 11rem;
|
|
1121
|
+
height: 11rem;
|
|
1122
|
+
background: var(--color-tertiary);
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
/* Between the shard cut-off and the layout each panel is the full
|
|
1126
|
+
band wide on small screens, so a shard sized for half of it stops being a corner accent. */
|
|
1127
|
+
@media (max-width: 899px) {
|
|
1128
|
+
|
|
1129
|
+
.home-index-shard,
|
|
1130
|
+
.home-index-shard--beta,
|
|
1131
|
+
.home-index-shard--gamma {
|
|
1132
|
+
width: 8rem;
|
|
1133
|
+
height: 8rem;
|
|
1134
|
+
bottom: -2.5rem;
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
.home-index-panel:not(:has(.home-index-plate)) {
|
|
1139
|
+
padding-top: var(--space-xl);
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
/* The title and the link have to sit clear of the shard beNewsreader them. The
|
|
1143
|
+
plate is excluded because it is the one child that must stay full-bleed,
|
|
1144
|
+
and the shard because it is the thing being sat clear of. */
|
|
1145
|
+
.home-index-panel> :not(.home-index-plate):not(.shard-accent) {
|
|
1146
|
+
position: relative;
|
|
1147
|
+
z-index: 1;
|
|
1148
|
+
margin-inline: var(--space-lg);
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
.home-index-note {
|
|
1152
|
+
margin: 0;
|
|
1153
|
+
font-size: var(--type-body);
|
|
1154
|
+
line-height: 1.5;
|
|
1155
|
+
flex: 1 1 auto;
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
.home-index-title {
|
|
1159
|
+
margin: 0;
|
|
1160
|
+
font-size: var(--type-card);
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
@media (min-width: 1024px) {
|
|
1164
|
+
.home-index-title {
|
|
1165
|
+
font-size: var(--type-card-lg);
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
/* ── The plate ── */
|
|
1170
|
+
.home-index-plate {
|
|
1171
|
+
align-self: stretch;
|
|
1172
|
+
margin: 0;
|
|
1173
|
+
background: var(--color-background);
|
|
1174
|
+
border-bottom: 1px solid var(--border-gentle-subtle);
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1177
|
+
/* The legend is not optional: the drawing has no labels, so the colour key
|
|
1178
|
+
is the only thing that says which mark is which. The tally beside it is
|
|
1179
|
+
counted from the content by the generator — see the script header. */
|
|
1180
|
+
.home-index-plate-head {
|
|
1181
|
+
display: flex;
|
|
1182
|
+
flex-wrap: wrap;
|
|
1183
|
+
align-items: center;
|
|
1184
|
+
justify-content: space-between;
|
|
1185
|
+
gap: var(--space-sm) var(--space-md);
|
|
1186
|
+
padding: var(--space-sm) var(--space-md);
|
|
1187
|
+
border-bottom: 1px solid var(--border-gentle-divider);
|
|
1188
|
+
font-family: var(--font-label);
|
|
1189
|
+
font-size: var(--type-label);
|
|
1190
|
+
letter-spacing: 0.04em;
|
|
1191
|
+
color: var(--color-on-surface-variant);
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
.home-index-legend {
|
|
1195
|
+
display: inline-flex;
|
|
1196
|
+
flex-wrap: wrap;
|
|
1197
|
+
align-items: center;
|
|
1198
|
+
gap: var(--space-md);
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
.home-index-key {
|
|
1202
|
+
display: inline-flex;
|
|
1203
|
+
align-items: center;
|
|
1204
|
+
gap: var(--space-xs);
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
.home-index-swatch {
|
|
1208
|
+
display: inline-block;
|
|
1209
|
+
width: 0.6rem;
|
|
1210
|
+
height: 0.6rem;
|
|
1211
|
+
flex-shrink: 0;
|
|
1212
|
+
background: var(--color-outline);
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
.home-index-tally {
|
|
1216
|
+
font-family: var(--font-mono);
|
|
1217
|
+
font-size: var(--type-meta);
|
|
1218
|
+
letter-spacing: 0.04em;
|
|
1219
|
+
text-transform: none;
|
|
1220
|
+
font-variant-numeric: tabular-nums;
|
|
1221
|
+
color: var(--color-on-surface-variant);
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
.home-index-art {
|
|
1225
|
+
display: block;
|
|
1226
|
+
width: 100%;
|
|
1227
|
+
height: auto;
|
|
1228
|
+
padding: var(--space-md) var(--space-sm) var(--space-sm);
|
|
1229
|
+
}
|
|
1230
|
+
|
|
1231
|
+
/* ── Shared plate furniture ── */
|
|
1232
|
+
/* Hairlines stay hairlines: the viewBox is scaled down hard on a phone, and
|
|
1233
|
+
without this the rules fade to a half-pixel smudge. */
|
|
1234
|
+
.home-index-art line,
|
|
1235
|
+
.home-index-art path,
|
|
1236
|
+
.home-index-art rect {
|
|
1237
|
+
vector-effect: non-scaling-stroke;
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
.home-index-art line,
|
|
1241
|
+
.home-index-art path {
|
|
1242
|
+
fill: none;
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
/* ── Network of Ideas: the metric card ── */
|
|
1246
|
+
/* The plate used to draw the whole graph, and at this size fifty entries under
|
|
1247
|
+
ninety theme threads came out as a smudge. It reports the graph instead:
|
|
1248
|
+
three counts in the display serif over one bar that splits them by what kind
|
|
1249
|
+
of writing they are, which is the only quantity here that needs a colour.
|
|
1250
|
+
|
|
1251
|
+
The numerals are SVG text, so they scale with the panel rather than sitting
|
|
1252
|
+
at one size. That is the point: they are the drawing. The label register does
|
|
1253
|
+
not scale, which is why the legend and the tally stayed in HTML. */
|
|
1254
|
+
.home-index-metric {
|
|
1255
|
+
font-family: var(--font-title);
|
|
1256
|
+
font-size: var(--type-page);
|
|
1257
|
+
fill: var(--color-on-surface);
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
.home-index-metric-label {
|
|
1261
|
+
font-family: var(--font-mono);
|
|
1262
|
+
font-size: calc(var(--type-label) - 2pt);
|
|
1263
|
+
letter-spacing: 0.12em;
|
|
1264
|
+
text-transform: uppercase;
|
|
1265
|
+
fill: var(--color-on-surface-variant);
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
.home-index-divider {
|
|
1269
|
+
stroke: var(--border-gentle-divider);
|
|
1270
|
+
stroke-width: 1;
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
.home-index-spine-rule {
|
|
1274
|
+
stroke: var(--color-outline-variant);
|
|
1275
|
+
stroke-width: 1;
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
.home-index-spine--articles {
|
|
1279
|
+
fill: var(--color-primary);
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
.home-index-spine--posts {
|
|
1283
|
+
fill: var(--color-tertiary);
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
.home-index-swatch--articles {
|
|
1287
|
+
background: var(--color-primary);
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
.home-index-swatch--posts {
|
|
1291
|
+
background: var(--color-tertiary);
|
|
1292
|
+
}
|
|
1293
|
+
|
|
1294
|
+
/* ── Sources: the unit field ── */
|
|
1295
|
+
/* One square per source, packed into its collection. Medium colour is the
|
|
1296
|
+
Sources page's own signal (--color-res-*), repeated here so the plate and
|
|
1297
|
+
the grid it opens agree on what a video looks like.
|
|
1298
|
+
|
|
1299
|
+
The tiles are filled rather than outlined. A 32px square is small enough
|
|
1300
|
+
that the colour reads as a tint of the block rather than as a shout, and
|
|
1301
|
+
an outline at this size would spend most of the tile on its own border. */
|
|
1302
|
+
.home-index-unit {
|
|
1303
|
+
fill: var(--color-outline);
|
|
1304
|
+
fill-opacity: 0.8;
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
.home-index-unit--youtube,
|
|
1308
|
+
.home-index-swatch--youtube {
|
|
1309
|
+
fill: var(--color-res-youtube);
|
|
1310
|
+
background: var(--color-res-youtube);
|
|
1311
|
+
}
|
|
1312
|
+
|
|
1313
|
+
.home-index-unit--podcast,
|
|
1314
|
+
.home-index-swatch--podcast {
|
|
1315
|
+
fill: var(--color-res-podcast);
|
|
1316
|
+
background: var(--color-res-podcast);
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
.home-index-unit--website,
|
|
1320
|
+
.home-index-swatch--website {
|
|
1321
|
+
fill: var(--color-primary);
|
|
1322
|
+
background: var(--color-primary);
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
.home-index-shelf {
|
|
1326
|
+
stroke: var(--color-outline-variant);
|
|
1327
|
+
stroke-width: 1;
|
|
1328
|
+
stroke-opacity: 0.6;
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
/* The collection names are the one thing the old drawing never said. They
|
|
1332
|
+
take the plate head's label treatment so the two lines of type in the
|
|
1333
|
+
plate read as one voice. */
|
|
1334
|
+
.home-index-collection {
|
|
1335
|
+
font-family: var(--font-mono);
|
|
1336
|
+
font-size: calc(var(--type-meta) + 2pt);
|
|
1337
|
+
letter-spacing: 0.06em;
|
|
1338
|
+
text-transform: uppercase;
|
|
1339
|
+
fill: var(--color-on-surface-variant);
|
|
1340
|
+
}
|
|
1341
|
+
|
|
1342
|
+
/* ── Hero, merged with the profile ──
|
|
1343
|
+
The CV band that used to follow the hero is folded into it: one masthead
|
|
1344
|
+
that names the person, says what he does and offers the full record, rather
|
|
1345
|
+
than a name band followed by a summary band saying the same thing twice. */
|
|
1346
|
+
|
|
1347
|
+
.home-hero-summary {
|
|
1348
|
+
max-width: var(--reading-measure);
|
|
1349
|
+
margin-top: 0;
|
|
1350
|
+
font-size: var(--type-body);
|
|
1351
|
+
line-height: var(--leading-body);
|
|
1352
|
+
color: var(--color-on-surface);
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
.home-hero-summary p {
|
|
1356
|
+
margin-bottom: var(--space-md);
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1359
|
+
.home-hero-summary p:last-child {
|
|
1360
|
+
margin-bottom: 0;
|
|
1361
|
+
}
|
|
1362
|
+
|
|
1363
|
+
/* ── Featured article poster ──
|
|
1364
|
+
Image stretches to match content height, with object-fit: cover cropping. */
|
|
1365
|
+
.home-featured .ledger-poster {
|
|
1366
|
+
height: 100%;
|
|
1367
|
+
min-height: 8rem;
|
|
1368
|
+
border: 1.5px solid var(--border-ink);
|
|
1369
|
+
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-on-surface) 10%, transparent);
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
:root:not([data-theme="dark"]) .home-featured .ledger-poster,
|
|
1373
|
+
html[data-theme="light"] .home-featured .ledger-poster {
|
|
1374
|
+
border-width: 1px;
|
|
1375
|
+
border-color: var(--border-ink);
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
.home-featured .ledger-poster img {
|
|
1379
|
+
width: 100%;
|
|
1380
|
+
height: 100%;
|
|
1381
|
+
object-fit: cover;
|
|
1382
|
+
}
|
|
1383
|
+
|
|
1384
|
+
.home-featured .ledger-poster::after {
|
|
1385
|
+
inset: 0.4rem;
|
|
1386
|
+
--frame-corner-size: 0.85rem;
|
|
1387
|
+
}
|
|
1388
|
+
|
|
1389
|
+
@media (max-width: 899px) {
|
|
1390
|
+
.home-featured-lead {
|
|
1391
|
+
order: 1;
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
.home-featured .ledger-poster {
|
|
1395
|
+
order: 2;
|
|
1396
|
+
height: 11rem;
|
|
1397
|
+
}
|
|
1398
|
+
}
|
|
1399
|
+
|
|
1400
|
+
/* ── Hero portrait, full-bleed on a phone ──
|
|
1401
|
+
On a phone the hero is one column and the portrait is the only element that
|
|
1402
|
+
can carry the screen's full width, so it runs edge to edge instead of being
|
|
1403
|
+
inset like the copy above it. The pull is exactly the gutter the band pads
|
|
1404
|
+
with — the same --gutter-mobile token, mirrored on both sides — so the plate
|
|
1405
|
+
ends flush with the viewport and adds no scrollable width; this must stay
|
|
1406
|
+
below 768px, which is where .home-band-inner swaps that token for --gutter.
|
|
1407
|
+
The side hairlines go with it: a border pinned to the screen edge reads as a
|
|
1408
|
+
frame cut off rather than as the plate's edge. Orientation still owns the
|
|
1409
|
+
crop; object-fit: cover re-crops the image inside the wider box. */
|
|
1410
|
+
@media (max-width: 767px) {
|
|
1411
|
+
.home-hero-portrait {
|
|
1412
|
+
max-width: none;
|
|
1413
|
+
width: calc(100% + (2 * var(--gutter-mobile)));
|
|
1414
|
+
margin-inline: calc(-1 * var(--gutter-mobile));
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
.home-hero-plate {
|
|
1418
|
+
max-width: none;
|
|
1419
|
+
width: 100%;
|
|
1420
|
+
border-inline: 0;
|
|
1421
|
+
}
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
/* ── Hero portrait between phone and desktop ──
|
|
1425
|
+
Keep the plate modest; the 3:4 crop applies from tablet up. */
|
|
1426
|
+
@media (min-width: 768px) and (max-width: 1023px) {
|
|
1427
|
+
.home-hero-portrait {
|
|
1428
|
+
max-width: 14rem;
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
/* ── Bibliography stats plate ── */
|
|
1433
|
+
#home-bib-panel .home-index-plate {
|
|
1434
|
+
display: flex;
|
|
1435
|
+
flex-direction: column;
|
|
1436
|
+
flex: 1 1 auto;
|
|
1437
|
+
min-height: 0;
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
#home-bib-panel .home-index-plate-head {
|
|
1441
|
+
flex: 0 0 auto;
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1444
|
+
#home-bib-panel .home-index-tally {
|
|
1445
|
+
flex-basis: 100%;
|
|
1446
|
+
}
|
|
1447
|
+
|
|
1448
|
+
.bib-stat-table {
|
|
1449
|
+
width: 100%;
|
|
1450
|
+
border-collapse: collapse;
|
|
1451
|
+
flex: 1 1 auto;
|
|
1452
|
+
display: flex;
|
|
1453
|
+
flex-direction: column;
|
|
1454
|
+
justify-content: flex-end;
|
|
1455
|
+
padding: 0 0 var(--space-md);
|
|
1456
|
+
}
|
|
1457
|
+
|
|
1458
|
+
.bib-stat-table tbody {
|
|
1459
|
+
display: flex;
|
|
1460
|
+
flex-direction: column;
|
|
1461
|
+
width: 100%;
|
|
1462
|
+
margin-top: auto;
|
|
1463
|
+
}
|
|
1464
|
+
|
|
1465
|
+
.bib-stat-table tr {
|
|
1466
|
+
display: flex;
|
|
1467
|
+
align-items: center;
|
|
1468
|
+
justify-content: space-between;
|
|
1469
|
+
width: 100%;
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1472
|
+
.bib-stat-table td {
|
|
1473
|
+
padding: var(--space-xs) var(--space-md);
|
|
1474
|
+
font-family: var(--font-label);
|
|
1475
|
+
font-size: var(--type-label);
|
|
1476
|
+
letter-spacing: 0.03em;
|
|
1477
|
+
color: var(--color-on-surface-variant);
|
|
1478
|
+
border-bottom: 1px solid var(--border-gentle-subtle);
|
|
1479
|
+
}
|
|
1480
|
+
|
|
1481
|
+
.bib-stat-table tr:last-child td {
|
|
1482
|
+
border-bottom: none;
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
.bib-stat-count {
|
|
1486
|
+
text-align: right;
|
|
1487
|
+
font-family: var(--font-mono);
|
|
1488
|
+
font-variant-numeric: tabular-nums;
|
|
1489
|
+
color: var(--color-on-surface);
|
|
1490
|
+
}
|