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,298 @@
|
|
|
1
|
+
/* Ledger page styles: site footer. Owned by _includes/page/site-footer.html;
|
|
2
|
+
shared component rules belong in assets/css/base.css.
|
|
3
|
+
|
|
4
|
+
The footer is the one band that appears under every page, so it takes the
|
|
5
|
+
panel step of the surface ladder rather than a border-only treatment: the
|
|
6
|
+
tonal shift says "the page ended", and the hairline above it does the work
|
|
7
|
+
the tonal step alone cannot (background → panel is ~1.13:1 in light).
|
|
8
|
+
|
|
9
|
+
Type roles follow the post-pullback rules. Headings and links are chrome
|
|
10
|
+
labels, so they take the label face, uppercase and tracked, at the same
|
|
11
|
+
size as the top rail — the footer sections and the header sections are the
|
|
12
|
+
same list, and they should read as the same list. The catchphrase under the
|
|
13
|
+
wordmark is the same fragment as the home hero tagline. The
|
|
14
|
+
imprint is a legend in the body face. No monospace anywhere. */
|
|
15
|
+
|
|
16
|
+
.site-footer {
|
|
17
|
+
position: relative;
|
|
18
|
+
overflow: hidden;
|
|
19
|
+
background: var(--color-panel-contrast);
|
|
20
|
+
border-top: 1px solid var(--border-gentle-divider);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.site-footer-inner {
|
|
24
|
+
position: relative;
|
|
25
|
+
z-index: 1;
|
|
26
|
+
padding-top: var(--space-xl);
|
|
27
|
+
padding-bottom: var(--space-lg);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* ── Shards ──
|
|
31
|
+
Decoration only, and the shared utility already unmounts them under 640px.
|
|
32
|
+
`overflow: hidden` on the band keeps the negative offsets out of the
|
|
33
|
+
document scroll width at every width in between.
|
|
34
|
+
|
|
35
|
+
Both sit at the bottom, where the imprint is one short left-aligned line and
|
|
36
|
+
the rest of the row is empty at every width the shards survive. The first
|
|
37
|
+
position tried was the top-right corner, which put a wedge straight through
|
|
38
|
+
the Elsewhere column — the same collision the CV dossier shard had to be
|
|
39
|
+
corrected for. */
|
|
40
|
+
.site-footer-shard {
|
|
41
|
+
right: -3rem;
|
|
42
|
+
bottom: -4rem;
|
|
43
|
+
width: 13rem;
|
|
44
|
+
height: 13rem;
|
|
45
|
+
background: var(--color-secondary);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.site-footer-shard--beta {
|
|
49
|
+
right: auto;
|
|
50
|
+
left: -3.5rem;
|
|
51
|
+
bottom: -3rem;
|
|
52
|
+
width: 10rem;
|
|
53
|
+
height: 10rem;
|
|
54
|
+
background: var(--color-primary);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Between the suppression breakpoint and the desktop layout the imprint takes
|
|
58
|
+
most of the row, so the shards give it back the width. */
|
|
59
|
+
@media (max-width: 1023px) {
|
|
60
|
+
.site-footer-shard {
|
|
61
|
+
right: -2.5rem;
|
|
62
|
+
bottom: -3rem;
|
|
63
|
+
width: 9rem;
|
|
64
|
+
height: 9rem;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.site-footer-shard--beta {
|
|
68
|
+
left: -3rem;
|
|
69
|
+
bottom: -2.5rem;
|
|
70
|
+
width: 7rem;
|
|
71
|
+
height: 7rem;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* ── Grid ──
|
|
76
|
+
One column stacked, three across at tablet, then a 12-column measure at
|
|
77
|
+
desktop where the masthead earns the widest span. Each block carries its
|
|
78
|
+
own span class rather than an :nth-child rule, so a block dropping out
|
|
79
|
+
reflows the row instead of breaking it. */
|
|
80
|
+
.site-footer-grid {
|
|
81
|
+
display: grid;
|
|
82
|
+
grid-template-columns: minmax(0, 1fr);
|
|
83
|
+
gap: var(--space-xl);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.site-footer-block {
|
|
87
|
+
min-width: 0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@media (min-width: 768px) {
|
|
91
|
+
.site-footer-grid {
|
|
92
|
+
grid-template-columns: repeat(12, minmax(0, 1fr));
|
|
93
|
+
column-gap: var(--gutter);
|
|
94
|
+
row-gap: var(--space-2xl);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.site-footer-masthead {
|
|
98
|
+
grid-column: span 12;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* Pages takes two-thirds so four page columns fit; Contact keeps a third. */
|
|
102
|
+
.site-footer-sections {
|
|
103
|
+
grid-column: span 8;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.site-footer-elsewhere {
|
|
107
|
+
grid-column: span 4;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
@media (min-width: 1024px) {
|
|
112
|
+
|
|
113
|
+
/* Masthead span 4 keeps the author line one wordmark-wide; Pages moves one
|
|
114
|
+
track left (span 6) so four page columns still sit the same distance from
|
|
115
|
+
the wordmark and from Contact (span 2). */
|
|
116
|
+
.site-footer-masthead {
|
|
117
|
+
grid-column: span 4;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.site-footer-sections {
|
|
121
|
+
grid-column: span 6;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.site-footer-elsewhere {
|
|
125
|
+
grid-column: span 2;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* ── Masthead ── */
|
|
130
|
+
.site-footer-wordmark-link {
|
|
131
|
+
display: inline-flex;
|
|
132
|
+
align-items: center;
|
|
133
|
+
gap: var(--space-sm);
|
|
134
|
+
text-decoration: none;
|
|
135
|
+
color: var(--color-on-surface);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.site-footer-wordmark {
|
|
139
|
+
font-family: var(--font-title);
|
|
140
|
+
font-size: calc(var(--type-card) - 2pt);
|
|
141
|
+
line-height: 1.15;
|
|
142
|
+
font-synthesis: none;
|
|
143
|
+
/* Full author name can wrap gracefully on narrow screens if needed */
|
|
144
|
+
overflow-wrap: normal;
|
|
145
|
+
word-break: normal;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
@media (min-width: 640px) {
|
|
149
|
+
.site-footer-wordmark {
|
|
150
|
+
white-space: nowrap;
|
|
151
|
+
line-height: 1;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* The mockup's footer bio describes someone else, so this is site.description
|
|
156
|
+
— one sentence, and the only sentence the site has about itself. */
|
|
157
|
+
.site-footer-bio {
|
|
158
|
+
margin-top: var(--space-md);
|
|
159
|
+
max-width: 32rem;
|
|
160
|
+
font-family: var(--font-label);
|
|
161
|
+
font-size: var(--type-meta);
|
|
162
|
+
font-weight: var(--weight-label);
|
|
163
|
+
letter-spacing: 0.03em;
|
|
164
|
+
line-height: var(--leading-body);
|
|
165
|
+
color: var(--color-on-surface-variant);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* ── Block headings ── */
|
|
169
|
+
.site-footer-heading {
|
|
170
|
+
margin: 0 0 var(--space-md);
|
|
171
|
+
font-family: var(--font-label);
|
|
172
|
+
font-size: var(--type-meta);
|
|
173
|
+
font-weight: 400;
|
|
174
|
+
letter-spacing: 0.04em;
|
|
175
|
+
color: var(--color-on-surface);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/* ── Link lists ──
|
|
179
|
+
Sections and Elsewhere are the same object in two sources, so they share
|
|
180
|
+
one presentation. The contacts list arrives from the runtime with its own
|
|
181
|
+
utility classes; a two-class selector outranks them without the runtime
|
|
182
|
+
having to know the footer exists. */
|
|
183
|
+
.site-footer-list {
|
|
184
|
+
display: flex;
|
|
185
|
+
flex-direction: column;
|
|
186
|
+
gap: var(--space-sm);
|
|
187
|
+
margin: 0;
|
|
188
|
+
padding: 0;
|
|
189
|
+
list-style: none;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* Page names and contact channels are read as words, not scanned as labels,
|
|
193
|
+
so they take the body face. Small caps stay on the block headings. */
|
|
194
|
+
.site-footer-link,
|
|
195
|
+
.site-footer .site-footer-contacts a {
|
|
196
|
+
font-family: var(--font-body);
|
|
197
|
+
font-size: var(--type-label-lg);
|
|
198
|
+
letter-spacing: normal;
|
|
199
|
+
text-transform: none;
|
|
200
|
+
color: var(--color-on-surface-variant);
|
|
201
|
+
text-decoration: none;
|
|
202
|
+
transition: color var(--motion-duration-fast) var(--motion-ease-default);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.site-footer-link:hover,
|
|
206
|
+
.site-footer .site-footer-contacts a:hover {
|
|
207
|
+
color: var(--color-primary);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/* The live page is marked, not just coloured: the rule repeats the rail's
|
|
211
|
+
`is-active` treatment so the two navigations agree about where you are. */
|
|
212
|
+
.site-footer-link.is-current {
|
|
213
|
+
color: var(--color-on-surface);
|
|
214
|
+
border-bottom: 2px solid var(--color-primary);
|
|
215
|
+
padding-bottom: 0.15rem;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* ── Imprint ── */
|
|
219
|
+
.site-footer-imprint {
|
|
220
|
+
display: flex;
|
|
221
|
+
flex-wrap: wrap;
|
|
222
|
+
gap: var(--space-xs) var(--space-md);
|
|
223
|
+
margin: var(--space-lg) 0 0;
|
|
224
|
+
padding-top: var(--space-lg);
|
|
225
|
+
border-top: 1px solid var(--border-gentle-subtle);
|
|
226
|
+
font-family: var(--font-body);
|
|
227
|
+
font-size: var(--type-meta);
|
|
228
|
+
line-height: 1.6;
|
|
229
|
+
color: var(--color-on-surface-variant);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/* A middot between items rather than a separator element, so an absent
|
|
233
|
+
license leaves no orphaned punctuation beNewsreader. */
|
|
234
|
+
.site-footer-imprint-item+.site-footer-imprint-item::before {
|
|
235
|
+
content: "·";
|
|
236
|
+
margin-right: var(--space-md);
|
|
237
|
+
color: var(--color-outline-variant);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.site-footer-imprint-link {
|
|
241
|
+
color: var(--color-on-surface-variant);
|
|
242
|
+
text-decoration: none;
|
|
243
|
+
border-bottom: 1px solid var(--border-gentle);
|
|
244
|
+
transition: color var(--motion-duration-fast) var(--motion-ease-default), border-color var(--motion-duration-fast) var(--motion-ease-default);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.site-footer-imprint-link:hover {
|
|
248
|
+
color: var(--color-primary);
|
|
249
|
+
border-bottom-color: var(--color-primary);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/* ── Print ──
|
|
253
|
+
On paper the navigation and the external links are dead ends and the tonal
|
|
254
|
+
band is a large grey rectangle, so only the imprint survives. It is the one
|
|
255
|
+
part a printed page still needs: who holds the copyright and under which
|
|
256
|
+
licence. */
|
|
257
|
+
@media print {
|
|
258
|
+
.site-footer {
|
|
259
|
+
background: none;
|
|
260
|
+
border-top: 1px solid var(--color-outline-variant);
|
|
261
|
+
overflow: visible;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.site-footer-inner {
|
|
265
|
+
padding-top: var(--space-md);
|
|
266
|
+
padding-bottom: var(--space-md);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.site-footer-shard,
|
|
270
|
+
.site-footer-grid {
|
|
271
|
+
display: none;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.site-footer-imprint {
|
|
275
|
+
margin-top: 0;
|
|
276
|
+
padding-top: 0;
|
|
277
|
+
border-top: 0;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/* ── Page columns ──
|
|
282
|
+
The three nav groups plus Bibliography become four columns, so the footer
|
|
283
|
+
reads the Explore pairs and leaves Bibliography its own list rather than
|
|
284
|
+
burying it under References. They stack on a phone, where four columns of
|
|
285
|
+
two would be four columns of nothing. */
|
|
286
|
+
.site-footer-columns {
|
|
287
|
+
display: grid;
|
|
288
|
+
grid-template-columns: minmax(0, 1fr);
|
|
289
|
+
gap: var(--space-md);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
@media (min-width: 480px) {
|
|
293
|
+
.site-footer-columns {
|
|
294
|
+
grid-template-columns: repeat(4, minmax(0, auto));
|
|
295
|
+
gap: var(--space-lg);
|
|
296
|
+
justify-content: start;
|
|
297
|
+
}
|
|
298
|
+
}
|