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,836 @@
|
|
|
1
|
+
/* Ledger page styles: cv. Owned by the cv page; shared component rules
|
|
2
|
+
belong in assets/css/base.css under "Architectural Ledger blocks".
|
|
3
|
+
|
|
4
|
+
The CV reads as a register: one dossier band at the top, then sections
|
|
5
|
+
whose titles sit in a sticky rail on the left while their entries run
|
|
6
|
+
past on the right. Depth is the four-step surface ladder — canvas,
|
|
7
|
+
panel, card, hover — never a shadow, and every corner is square. */
|
|
8
|
+
|
|
9
|
+
/* Page accent: `.page-accent--green` is defined once in base.css and
|
|
10
|
+
applied on `<main class="cv-page page-accent--green">`. */
|
|
11
|
+
|
|
12
|
+
/* ── Dossier band ──────────────────────────────────────────────────────
|
|
13
|
+
Title, tags, the standing disclaimer, and the two contact channels the
|
|
14
|
+
disclaimer points at, on the panel step of the ladder. */
|
|
15
|
+
|
|
16
|
+
/* The disclaimer belongs to the header, so it sits close under it — the full
|
|
17
|
+
--space-3xl this used to carry read as two unrelated blocks rather than a
|
|
18
|
+
heading and its footnote. --space-lg is the nearest rung to a third of it. */
|
|
19
|
+
.cv-dossier {
|
|
20
|
+
position: relative;
|
|
21
|
+
overflow: hidden;
|
|
22
|
+
background: var(--color-panel-contrast);
|
|
23
|
+
border: 1.5px solid var(--border-ink);
|
|
24
|
+
border-radius: var(--radius-card);
|
|
25
|
+
padding: var(--space-xl);
|
|
26
|
+
margin-bottom: var(--space-lg);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
:root:not([data-theme="dark"]) .cv-dossier,
|
|
30
|
+
:root:not([data-theme="dark"]) .cv-entry,
|
|
31
|
+
:root:not([data-theme="dark"]) .cv-product,
|
|
32
|
+
html[data-theme="light"] .cv-dossier,
|
|
33
|
+
html[data-theme="light"] .cv-entry,
|
|
34
|
+
html[data-theme="light"] .cv-product {
|
|
35
|
+
/* Match `.cv-disclaimer-box`: 1px gentle-subtle hairline on paper. */
|
|
36
|
+
border-width: 1px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* "Curriculum" at the shared page-title size is wider than the dossier's
|
|
40
|
+
old side inset. Keep a small inset on the phone; the title still fits. */
|
|
41
|
+
@media (max-width: 639px) {
|
|
42
|
+
.cv-dossier {
|
|
43
|
+
padding-inline: var(--space-sm);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* At 320px the padded column is narrower than "Curriculum" at --type-page.
|
|
48
|
+
The title alone borrows the card's side inset; contacts and tags keep it. */
|
|
49
|
+
@media (max-width: 359px) {
|
|
50
|
+
main.cv-page {
|
|
51
|
+
padding-inline: var(--space-sm);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.cv-dossier .page-header-title {
|
|
55
|
+
margin-inline: calc(-1 * var(--space-sm));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@media (min-width: 768px) {
|
|
60
|
+
.cv-dossier {
|
|
61
|
+
padding: var(--space-2xl);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.cv-dossier-shard {
|
|
66
|
+
top: -4rem;
|
|
67
|
+
right: -3rem;
|
|
68
|
+
width: 16rem;
|
|
69
|
+
height: 16rem;
|
|
70
|
+
background: var(--color-secondary);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.cv-dossier-shard--beta {
|
|
74
|
+
top: auto;
|
|
75
|
+
right: auto;
|
|
76
|
+
left: -3rem;
|
|
77
|
+
bottom: -4rem;
|
|
78
|
+
width: 12rem;
|
|
79
|
+
height: 12rem;
|
|
80
|
+
background: var(--color-primary);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* A shard is a corner accent. Between the 640px suppression breakpoint and the
|
|
84
|
+
desktop layout the panel is narrow enough that a 16rem shard stops being a
|
|
85
|
+
corner and starts crossing the title — "Curriculum Vitæ" was reading over a
|
|
86
|
+
tonal step at 768px. Same correction on the writing lead and the rascunhos
|
|
87
|
+
masthead, which had the same collision. */
|
|
88
|
+
@media (max-width: 1023px) {
|
|
89
|
+
.cv-dossier-shard {
|
|
90
|
+
top: -2.5rem;
|
|
91
|
+
right: -2rem;
|
|
92
|
+
width: 9rem;
|
|
93
|
+
height: 9rem;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.cv-dossier-shard--beta {
|
|
97
|
+
top: auto;
|
|
98
|
+
left: -2rem;
|
|
99
|
+
bottom: -2.5rem;
|
|
100
|
+
width: 7rem;
|
|
101
|
+
height: 7rem;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.cv-dossier-inner {
|
|
106
|
+
position: relative;
|
|
107
|
+
z-index: 1;
|
|
108
|
+
display: grid;
|
|
109
|
+
grid-template-columns: minmax(0, 1fr);
|
|
110
|
+
gap: var(--space-xl);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
@media (min-width: 1024px) {
|
|
114
|
+
.cv-dossier-inner {
|
|
115
|
+
grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
|
|
116
|
+
align-items: end;
|
|
117
|
+
gap: var(--gutter);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.cv-dossier-head {
|
|
122
|
+
margin: 0;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* Same masthead as the other listing pages: `.page-header-title` supplies
|
|
126
|
+
`--type-page` below 768px and `--type-page-lg` from there up. A container
|
|
127
|
+
cap used to shrink "Curriculum Vitæ" onto one line and left this title
|
|
128
|
+
smaller than Articles, Projects, and Rascunhos. */
|
|
129
|
+
.cv-dossier .page-header-title {
|
|
130
|
+
margin-bottom: 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* The header renderer joins the tags into one line, so they read as a
|
|
134
|
+
ledger classification strip rather than as chips. */
|
|
135
|
+
.cv-dossier-tags {
|
|
136
|
+
display: block;
|
|
137
|
+
margin-top: var(--space-md);
|
|
138
|
+
color: var(--color-on-surface-variant);
|
|
139
|
+
letter-spacing: 0.06em;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.cv-dossier-standfirst {
|
|
143
|
+
max-width: var(--reading-measure);
|
|
144
|
+
margin-top: var(--space-md);
|
|
145
|
+
color: var(--color-on-surface-variant);
|
|
146
|
+
line-height: var(--leading-body);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.cv-dossier-aside {
|
|
150
|
+
display: flex;
|
|
151
|
+
flex-direction: column;
|
|
152
|
+
gap: var(--space-lg);
|
|
153
|
+
border-top: 1px solid var(--border-gentle-divider);
|
|
154
|
+
padding-top: var(--space-lg);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
@media (min-width: 1024px) {
|
|
160
|
+
.cv-dossier-aside {
|
|
161
|
+
align-self: stretch;
|
|
162
|
+
justify-content: center;
|
|
163
|
+
border-top: 0;
|
|
164
|
+
border-left: 1px solid var(--border-gentle-divider);
|
|
165
|
+
padding: 0 0 0 var(--gutter);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.cv-dossier-note {
|
|
170
|
+
color: var(--color-on-surface);
|
|
171
|
+
font-size: var(--type-body);
|
|
172
|
+
line-height: var(--leading-body);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.cv-dossier-note p {
|
|
176
|
+
margin: 0;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/* ── Contacts ──────────────────────────────────────────────────────────
|
|
180
|
+
The shared contact renderer is used unchanged; only its shape is
|
|
181
|
+
re-cut here, because a round avatar tile has no place in a register. */
|
|
182
|
+
|
|
183
|
+
.professional-connections-grid.cv-contacts {
|
|
184
|
+
display: flex;
|
|
185
|
+
flex-wrap: wrap;
|
|
186
|
+
gap: var(--space-sm);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* The runtime puts `h-full` on the contact anchor. On one line that is a
|
|
190
|
+
no-op, but as soon as the tiles wrap — every width under ~640px — the
|
|
191
|
+
percentage resolves against the whole wrapped column and each tile paints
|
|
192
|
+
at the full stack height: two 67px cards became two 143px cards with 76px
|
|
193
|
+
of dead space each. The height has to come from the content. */
|
|
194
|
+
.professional-connections-grid.cv-contacts .group {
|
|
195
|
+
flex: 1 1 11rem;
|
|
196
|
+
height: auto;
|
|
197
|
+
min-height: 0;
|
|
198
|
+
align-items: center;
|
|
199
|
+
gap: var(--space-sm);
|
|
200
|
+
padding: var(--space-sm) var(--space-md);
|
|
201
|
+
background: var(--color-surface-card);
|
|
202
|
+
border-color: var(--border-gentle-subtle);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.professional-connections-grid.cv-contacts .group:hover {
|
|
206
|
+
background: var(--color-surface-high);
|
|
207
|
+
border-color: var(--border-gentle-hover);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.cv-contacts .group>div:first-child {
|
|
211
|
+
width: 2.25rem;
|
|
212
|
+
height: 2.25rem;
|
|
213
|
+
border-radius: 0;
|
|
214
|
+
background: var(--color-surface-high);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.cv-contacts .group:hover>div:first-child {
|
|
218
|
+
background: var(--color-surface-container-high);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.cv-contacts .group .material-symbols-outlined {
|
|
222
|
+
font-size: var(--type-card);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* ── Section register ──────────────────────────────────────────────────
|
|
226
|
+
Full-width rule, title in the left rail, entries on the right. */
|
|
227
|
+
|
|
228
|
+
.cv-register,
|
|
229
|
+
.cv-band {
|
|
230
|
+
border-top: 1px solid var(--border-gentle-divider);
|
|
231
|
+
padding-top: var(--space-xl);
|
|
232
|
+
scroll-margin-top: 7rem;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.cv-register+.cv-register,
|
|
236
|
+
.cv-register+.cv-band {
|
|
237
|
+
margin-top: var(--space-3xl);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.cv-register {
|
|
241
|
+
display: grid;
|
|
242
|
+
grid-template-columns: minmax(0, 1fr);
|
|
243
|
+
gap: var(--space-lg);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
@media (min-width: 1024px) {
|
|
247
|
+
.cv-register {
|
|
248
|
+
grid-template-columns: minmax(0, 3fr) minmax(0, 9fr);
|
|
249
|
+
gap: var(--gutter);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.cv-register-rail {
|
|
253
|
+
position: sticky;
|
|
254
|
+
top: 7rem;
|
|
255
|
+
align-self: start;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
.cv-register-title {
|
|
260
|
+
margin: 0;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.cv-register-rule {
|
|
264
|
+
display: block;
|
|
265
|
+
width: 2.5rem;
|
|
266
|
+
margin-top: var(--space-sm);
|
|
267
|
+
border-top: 2px solid var(--color-primary);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.cv-register-body {
|
|
271
|
+
min-width: 0;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/* ── Register entry: roles and degrees share one card ──────────────────
|
|
275
|
+
Label line names the organisation and its unit, display line names the
|
|
276
|
+
post, and any part whose field is empty is simply absent. */
|
|
277
|
+
|
|
278
|
+
.cv-entry-stack {
|
|
279
|
+
display: flex;
|
|
280
|
+
flex-direction: column;
|
|
281
|
+
gap: var(--space-md);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.cv-entry {
|
|
285
|
+
display: flex;
|
|
286
|
+
flex-direction: column;
|
|
287
|
+
gap: var(--space-sm);
|
|
288
|
+
padding: var(--space-lg);
|
|
289
|
+
background: var(--color-surface-card);
|
|
290
|
+
border: 1.5px solid var(--border-ink);
|
|
291
|
+
border-radius: var(--radius-card);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.cv-entry-head {
|
|
295
|
+
display: flex;
|
|
296
|
+
flex-wrap: wrap;
|
|
297
|
+
align-items: baseline;
|
|
298
|
+
justify-content: space-between;
|
|
299
|
+
gap: var(--space-xs) var(--space-md);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.cv-entry-ident {
|
|
303
|
+
display: flex;
|
|
304
|
+
flex-wrap: wrap;
|
|
305
|
+
align-items: baseline;
|
|
306
|
+
gap: var(--space-sm);
|
|
307
|
+
min-width: 0;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/* The organisation and the unit inside it are two halves of one address, so
|
|
311
|
+
they share the label face the department already used; only the ink tells
|
|
312
|
+
them apart, the company in the accent and the unit in the quiet variant. */
|
|
313
|
+
.cv-entry-lead {
|
|
314
|
+
color: var(--color-secondary);
|
|
315
|
+
font-size: var(--type-dek);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/* `--color-outline-variant` is the border token: as ink it lands at 1.31:1 in
|
|
319
|
+
light and 1.74:1 in dark, so the separator disappeared. `--color-outline` is
|
|
320
|
+
the quietest token that still clears 4.5:1 on the card step (4.72 light,
|
|
321
|
+
5.44 dark). */
|
|
322
|
+
.cv-entry-sep {
|
|
323
|
+
color: var(--color-outline);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
.cv-entry-unit {
|
|
327
|
+
color: var(--color-on-surface-variant);
|
|
328
|
+
font-size: var(--type-dek);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.cv-entry-span {
|
|
332
|
+
color: var(--color-on-surface-variant);
|
|
333
|
+
white-space: nowrap;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* Wide enough for two columns, the span sits opposite the role; once the
|
|
337
|
+
head wraps it starts where every other line of the card starts. */
|
|
338
|
+
@media (min-width: 640px) {
|
|
339
|
+
.cv-entry-span {
|
|
340
|
+
margin-left: auto;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
.cv-entry-title {
|
|
345
|
+
margin: 0;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/* A place is prose, not notation, so it reads in the body face rather than
|
|
349
|
+
mono — and on the same left edge as every other line of the card. The pin
|
|
350
|
+
icon and the indent it sat beNewsreader said nothing the word "France" does not
|
|
351
|
+
already say, and cost the entry its one straight margin. */
|
|
352
|
+
.cv-entry-place {
|
|
353
|
+
color: var(--color-on-surface-variant);
|
|
354
|
+
letter-spacing: normal;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
.cv-entry-copy {
|
|
358
|
+
max-width: var(--reading-measure);
|
|
359
|
+
color: var(--color-on-surface-variant);
|
|
360
|
+
line-height: var(--leading-body);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
.cv-entry-copy p,
|
|
364
|
+
.cv-entry-copy ul,
|
|
365
|
+
.cv-entry-copy ol {
|
|
366
|
+
margin: 0 0 0.9em;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
.cv-entry-copy> :last-child {
|
|
370
|
+
margin-bottom: 0;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.cv-entry-copy ul,
|
|
374
|
+
.cv-entry-copy ol {
|
|
375
|
+
padding-left: 1.2rem;
|
|
376
|
+
list-style: disc;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
.cv-entry-copy ol {
|
|
380
|
+
list-style: decimal;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
.cv-entry-copy li {
|
|
384
|
+
margin-bottom: 0.35em;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
.cv-entry-copy a {
|
|
388
|
+
color: var(--color-link);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
.cv-entry-copy a:hover {
|
|
392
|
+
color: var(--color-link-hover);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.cv-entry-foot {
|
|
396
|
+
display: flex;
|
|
397
|
+
flex-wrap: wrap;
|
|
398
|
+
align-items: center;
|
|
399
|
+
gap: var(--space-sm);
|
|
400
|
+
margin-top: var(--space-xs);
|
|
401
|
+
padding-top: var(--space-sm);
|
|
402
|
+
border-top: 1px solid var(--border-gentle-divider);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
.cv-entry-foot-label {
|
|
406
|
+
color: var(--color-on-surface-variant);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/* ── Summary ───────────────────────────────────────────────────────── */
|
|
410
|
+
|
|
411
|
+
.cv-summary {
|
|
412
|
+
max-width: var(--reading-measure);
|
|
413
|
+
color: var(--color-on-surface);
|
|
414
|
+
font-size: var(--type-body);
|
|
415
|
+
line-height: var(--leading-body);
|
|
416
|
+
background: var(--color-surface-card);
|
|
417
|
+
border: 1.5px solid var(--border-ink);
|
|
418
|
+
border-radius: var(--radius-card);
|
|
419
|
+
padding: var(--space-xl);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
.cv-summary p {
|
|
423
|
+
margin: 0 0 1em;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
.cv-summary p:last-child {
|
|
427
|
+
margin-bottom: 0;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/* Both paragraphs take the same weight. The first used to be set as a lede —
|
|
431
|
+
darker, 1.15rem, tighter leading — which made one summary look like two
|
|
432
|
+
different blocks stacked. */
|
|
433
|
+
|
|
434
|
+
/* ── Products ──────────────────────────────────────────────────────── */
|
|
435
|
+
|
|
436
|
+
.cv-product-grid {
|
|
437
|
+
display: grid;
|
|
438
|
+
grid-template-columns: minmax(0, 1fr);
|
|
439
|
+
gap: var(--space-md);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
@media (min-width: 640px) {
|
|
443
|
+
.cv-product-grid {
|
|
444
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
@media (min-width: 1024px) {
|
|
449
|
+
.cv-product-grid {
|
|
450
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
.cv-product {
|
|
455
|
+
display: flex;
|
|
456
|
+
flex-direction: column;
|
|
457
|
+
gap: var(--space-sm);
|
|
458
|
+
padding: var(--space-lg);
|
|
459
|
+
background: var(--color-surface-card);
|
|
460
|
+
border: 1.5px solid var(--border-ink);
|
|
461
|
+
border-radius: var(--radius-card);
|
|
462
|
+
transition: background-color var(--motion-duration-fast) var(--motion-ease-default), border-color var(--motion-duration-fast) var(--motion-ease-default);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
.cv-product:hover {
|
|
466
|
+
background: var(--color-surface-high);
|
|
467
|
+
border-color: color-mix(in srgb, var(--color-primary) 40%, var(--border-ink));
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
.cv-product-head {
|
|
471
|
+
display: flex;
|
|
472
|
+
flex-wrap: wrap;
|
|
473
|
+
align-items: baseline;
|
|
474
|
+
justify-content: space-between;
|
|
475
|
+
gap: var(--space-xs) var(--space-sm);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
.cv-product-company,
|
|
479
|
+
.cv-product-span {
|
|
480
|
+
color: var(--color-on-surface-variant);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
.cv-product-span {
|
|
484
|
+
white-space: nowrap;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
.cv-product-title {
|
|
488
|
+
margin: 0;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
.cv-product-title a {
|
|
492
|
+
color: var(--color-on-surface);
|
|
493
|
+
text-decoration: none;
|
|
494
|
+
transition: color var(--motion-duration-fast) var(--motion-ease-default);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
.cv-product:hover .cv-product-title a {
|
|
498
|
+
color: var(--color-primary);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
.cv-product-copy {
|
|
502
|
+
flex: 1;
|
|
503
|
+
margin: 0;
|
|
504
|
+
color: var(--color-on-surface-variant);
|
|
505
|
+
line-height: var(--leading-body);
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
.cv-product-foot {
|
|
509
|
+
margin-top: auto;
|
|
510
|
+
padding-top: var(--space-sm);
|
|
511
|
+
border-top: 1px solid var(--border-gentle-divider);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/* ── Languages: name, leader, level ────────────────────────────────── */
|
|
515
|
+
|
|
516
|
+
.cv-language-list {
|
|
517
|
+
display: flex;
|
|
518
|
+
flex-direction: column;
|
|
519
|
+
max-width: 34rem;
|
|
520
|
+
background: var(--color-surface-card);
|
|
521
|
+
border: 1.5px solid var(--border-ink);
|
|
522
|
+
border-radius: var(--radius-card);
|
|
523
|
+
padding: var(--space-lg);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
.cv-language {
|
|
527
|
+
display: flex;
|
|
528
|
+
align-items: baseline;
|
|
529
|
+
gap: var(--space-sm);
|
|
530
|
+
padding: var(--space-sm) 0;
|
|
531
|
+
border-bottom: 1px solid var(--border-gentle-divider);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
.cv-language:first-child {
|
|
535
|
+
border-top: 1px solid var(--border-gentle-divider);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
.cv-language-name {
|
|
539
|
+
color: var(--color-on-surface);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
.cv-language-rule {
|
|
543
|
+
flex: 1 1 auto;
|
|
544
|
+
min-width: var(--space-xl);
|
|
545
|
+
border-bottom: 1px dotted var(--color-outline-variant);
|
|
546
|
+
transform: translateY(-0.3rem);
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
.cv-language-level {
|
|
550
|
+
color: var(--color-on-surface-variant);
|
|
551
|
+
white-space: nowrap;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/* ── Timeline band ─────────────────────────────────────────────────────
|
|
555
|
+
The applet carries its own rail of controls, so it runs full width
|
|
556
|
+
under a band heading instead of inside the section rail. */
|
|
557
|
+
|
|
558
|
+
.cv-band-head {
|
|
559
|
+
display: flex;
|
|
560
|
+
flex-wrap: wrap;
|
|
561
|
+
align-items: baseline;
|
|
562
|
+
justify-content: space-between;
|
|
563
|
+
gap: var(--space-md);
|
|
564
|
+
margin-bottom: var(--space-xl);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
.cv-band-head .section-title {
|
|
568
|
+
margin: 0;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
.cv-timeline-grid {
|
|
572
|
+
display: grid;
|
|
573
|
+
grid-template-columns: minmax(0, 1fr);
|
|
574
|
+
gap: var(--gutter);
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
@media (min-width: 1024px) {
|
|
578
|
+
.cv-timeline-grid {
|
|
579
|
+
grid-template-columns: minmax(0, 3fr) minmax(0, 9fr);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
.cv-timeline-rail-inner {
|
|
584
|
+
display: flex;
|
|
585
|
+
flex-direction: column;
|
|
586
|
+
gap: var(--space-lg);
|
|
587
|
+
background: var(--color-surface-card);
|
|
588
|
+
border: 1.5px solid var(--border-ink);
|
|
589
|
+
border-radius: var(--radius-card);
|
|
590
|
+
padding: var(--space-xl);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
@media (min-width: 1024px) {
|
|
594
|
+
.cv-timeline-rail-inner {
|
|
595
|
+
position: sticky;
|
|
596
|
+
top: 7rem;
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
.cv-timeline-control-group {
|
|
601
|
+
display: flex;
|
|
602
|
+
flex-direction: column;
|
|
603
|
+
gap: var(--space-sm);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
.cv-timeline-control-title,
|
|
607
|
+
.cv-timeline-control-subtitle {
|
|
608
|
+
margin: 0;
|
|
609
|
+
color: var(--color-on-surface-variant);
|
|
610
|
+
letter-spacing: 0.12em;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
.cv-timeline-control-subtitle {
|
|
614
|
+
font-size: var(--type-label);
|
|
615
|
+
margin-bottom: var(--space-xs);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
.cv-timeline-options,
|
|
619
|
+
.cv-timeline-legend,
|
|
620
|
+
.cv-timeline-selection-list {
|
|
621
|
+
list-style: none;
|
|
622
|
+
margin: 0;
|
|
623
|
+
padding: 0;
|
|
624
|
+
display: flex;
|
|
625
|
+
flex-direction: column;
|
|
626
|
+
gap: var(--space-xs);
|
|
627
|
+
color: var(--color-on-surface-variant);
|
|
628
|
+
font-size: var(--type-label-lg);
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
/* Lane chips share the listing-rail pill dialect (Articles / Rascunhos
|
|
632
|
+
filters): left accent rule, tinted active fill, label face. */
|
|
633
|
+
.cv-timeline-options {
|
|
634
|
+
gap: 0;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
.cv-timeline-legend {
|
|
638
|
+
gap: var(--space-sm);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
.cv-timeline-legend li,
|
|
642
|
+
.cv-timeline-option {
|
|
643
|
+
display: flex;
|
|
644
|
+
align-items: center;
|
|
645
|
+
gap: var(--space-sm);
|
|
646
|
+
color: var(--color-on-surface-variant);
|
|
647
|
+
font-size: var(--type-label-lg);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
.cv-timeline-option {
|
|
651
|
+
cursor: pointer;
|
|
652
|
+
justify-content: flex-start;
|
|
653
|
+
padding: 0.35rem 0.5rem;
|
|
654
|
+
background: none;
|
|
655
|
+
border: 0;
|
|
656
|
+
border-left: 2px solid transparent;
|
|
657
|
+
font-family: var(--font-label);
|
|
658
|
+
font-size: var(--type-label-lg);
|
|
659
|
+
font-weight: var(--weight-label);
|
|
660
|
+
letter-spacing: 0.03em;
|
|
661
|
+
transition: background-color var(--motion-duration-fast) var(--motion-ease-default),
|
|
662
|
+
border-color var(--motion-duration-fast) var(--motion-ease-default),
|
|
663
|
+
color var(--motion-duration-fast) var(--motion-ease-default);
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
.cv-timeline-option:hover {
|
|
667
|
+
background: var(--color-surface-high);
|
|
668
|
+
border-left-color: var(--color-outline-variant);
|
|
669
|
+
color: var(--color-on-surface);
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
.cv-timeline-option:has(input:checked) {
|
|
673
|
+
background: color-mix(in srgb, var(--color-primary) 10%, transparent);
|
|
674
|
+
border-left-color: var(--color-primary);
|
|
675
|
+
color: var(--color-primary);
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
.cv-timeline-option input[type="checkbox"] {
|
|
679
|
+
position: absolute;
|
|
680
|
+
opacity: 0;
|
|
681
|
+
width: 1px;
|
|
682
|
+
height: 1px;
|
|
683
|
+
margin: 0;
|
|
684
|
+
pointer-events: none;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
.cv-timeline-option input[type="checkbox"]:focus-visible+*,
|
|
688
|
+
.cv-timeline-option:has(input:focus-visible) {
|
|
689
|
+
outline: 2px solid var(--color-primary);
|
|
690
|
+
outline-offset: 2px;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
.cv-timeline-key {
|
|
694
|
+
display: inline-block;
|
|
695
|
+
flex-shrink: 0;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
.cv-timeline-key--bar {
|
|
699
|
+
width: 2rem;
|
|
700
|
+
height: 0.75rem;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
.cv-timeline-key--bar-thin {
|
|
704
|
+
width: 2rem;
|
|
705
|
+
height: 0.5rem;
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
/* The chart plots single-dated writing as round marks, so the key that
|
|
709
|
+
explains them stays round too. */
|
|
710
|
+
.cv-timeline-key--dot {
|
|
711
|
+
width: 0.75rem;
|
|
712
|
+
height: 0.75rem;
|
|
713
|
+
border-radius: 9999px;
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
/* Key fills read from the timeline lane tokens, the same categorical scale
|
|
717
|
+
the chart paints its bars from. They were Tailwind `bg-primary` /
|
|
718
|
+
`bg-tertiary` utilities, which collided the way the chart did — Job shared
|
|
719
|
+
a swatch with Article, Product with Post — and which additionally resolve
|
|
720
|
+
through `--color-primary`, rebound to green on this page by
|
|
721
|
+
`.page-accent--green`. A legend has to be the one thing on the page that
|
|
722
|
+
cannot drift from what it explains. */
|
|
723
|
+
.cv-timeline-key--employment {
|
|
724
|
+
background: var(--timeline-employment);
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
.cv-timeline-key--education {
|
|
728
|
+
background: var(--timeline-education);
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
.cv-timeline-key--product {
|
|
732
|
+
background: var(--timeline-product);
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
.cv-timeline-key--project {
|
|
736
|
+
background: var(--timeline-project);
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
.cv-timeline-key--article {
|
|
740
|
+
background: var(--timeline-article);
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
.cv-timeline-key--post {
|
|
744
|
+
background: var(--timeline-post);
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
.cv-timeline-range,
|
|
748
|
+
.cv-timeline-selection-empty {
|
|
749
|
+
margin: 0;
|
|
750
|
+
color: var(--color-on-surface-variant);
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
.cv-timeline-clear {
|
|
754
|
+
align-self: flex-start;
|
|
755
|
+
padding: 0;
|
|
756
|
+
border: 0;
|
|
757
|
+
background: none;
|
|
758
|
+
color: var(--color-primary);
|
|
759
|
+
cursor: pointer;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
.cv-timeline-clear:hover {
|
|
763
|
+
color: var(--color-link-hover);
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
.cv-timeline-zoom-label {
|
|
767
|
+
color: var(--color-on-surface-variant);
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
.cv-timeline-canvas {
|
|
771
|
+
min-width: 0;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
.cv-timeline-canvas .applet-canvas {
|
|
775
|
+
background: var(--color-background);
|
|
776
|
+
border: 1.5px solid var(--border-ink);
|
|
777
|
+
border-radius: var(--radius-card);
|
|
778
|
+
overflow: hidden;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
/* ── Dossier note and contact call to action ──
|
|
782
|
+
The disclaimer says the public sheet is a summary and that the full record
|
|
783
|
+
is available on request, which makes it the page's actual call to action
|
|
784
|
+
rather than a footnote. It gets an icon and a gentle tonal highlight, and
|
|
785
|
+
the contact channels below it are labelled as the action they are — there
|
|
786
|
+
is no public PDF to download, so asking is the path. */
|
|
787
|
+
|
|
788
|
+
/* Now its own box below the header rather than a flex-row sibling of the
|
|
789
|
+
contact CTA, so it borrows the register's card shape — hairline border,
|
|
790
|
+
card-step surface — instead of the aside's tonal, border-left treatment. */
|
|
791
|
+
/* Half the old gap below: the header group (dossier + disclaimer) still needs
|
|
792
|
+
air before the first register rule, but not the full band-sized break it
|
|
793
|
+
was taking. --space-xl is the nearest rung. */
|
|
794
|
+
.cv-disclaimer-box {
|
|
795
|
+
display: flex;
|
|
796
|
+
gap: var(--space-sm);
|
|
797
|
+
align-items: flex-start;
|
|
798
|
+
padding: var(--space-lg);
|
|
799
|
+
margin-bottom: var(--space-xl);
|
|
800
|
+
background: var(--color-surface-card);
|
|
801
|
+
border: 1.5px solid var(--border-ink);
|
|
802
|
+
border-radius: var(--radius-card);
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
.material-symbols-outlined.cv-dossier-note-icon {
|
|
806
|
+
font-size: var(--type-card);
|
|
807
|
+
line-height: 1.5;
|
|
808
|
+
color: var(--color-tertiary);
|
|
809
|
+
flex-shrink: 0;
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
.cv-disclaimer-box .cv-dossier-note {
|
|
813
|
+
margin: 0;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
.cv-disclaimer-box .cv-dossier-note p {
|
|
817
|
+
margin: 0;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
.cv-disclaimer-box .cv-dossier-note p+p {
|
|
821
|
+
margin-top: var(--space-sm);
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
.cv-contact-cta {
|
|
825
|
+
display: flex;
|
|
826
|
+
flex-direction: column;
|
|
827
|
+
gap: var(--space-sm);
|
|
828
|
+
margin-top: var(--space-md);
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
.cv-contact-cta-label {
|
|
832
|
+
font-family: var(--font-label);
|
|
833
|
+
font-size: var(--type-meta);
|
|
834
|
+
letter-spacing: 0.12em;
|
|
835
|
+
color: var(--color-on-surface-variant);
|
|
836
|
+
}
|