/* The front page (docs/landing/index.html). Self-contained: system fonts, no framework, one palette per theme. The download blocks use the same jfj-dl markup as the Sphinx download pages (docs/_ext/jfjoch_downloads.py) and are styled here for this page. */ :root { --bg: #fbfbfd; --bg-raised: #ffffff; --bg-tint: #eef0fa; --fg: #1b1d2a; --fg-muted: #5b6072; --line: rgba(27, 29, 42, 0.12); --primary: #3949ab; --primary-strong: #2c3a8f; --primary-soft: rgba(57, 73, 171, 0.1); --on-primary: #ffffff; --accent: #e9a23b; --accent-soft: rgba(233, 162, 59, 0.16); --shadow: 0 1px 2px rgba(27, 29, 42, 0.06), 0 8px 24px rgba(27, 29, 42, 0.06); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { --bg: #11131c; --bg-raised: #181b27; --bg-tint: #1d2130; --fg: #e8e9f1; --fg-muted: #9ea3b8; --line: rgba(232, 233, 241, 0.12); --primary: #8e9dff; --primary-strong: #aab5ff; --primary-soft: rgba(142, 157, 255, 0.14); --on-primary: #0d1030; --accent: #f0b65b; --accent-soft: rgba(240, 182, 91, 0.16); --shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 8px 24px rgba(0, 0, 0, 0.35); } } :root[data-theme="dark"] { --bg: #11131c; --bg-raised: #181b27; --bg-tint: #1d2130; --fg: #e8e9f1; --fg-muted: #9ea3b8; --line: rgba(232, 233, 241, 0.12); --primary: #8e9dff; --primary-strong: #aab5ff; --primary-soft: rgba(142, 157, 255, 0.14); --on-primary: #0d1030; --accent: #f0b65b; --accent-soft: rgba(240, 182, 91, 0.16); --shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 8px 24px rgba(0, 0, 0, 0.35); } * { box-sizing: border-box; } html { scroll-behavior: smooth; } body { margin: 0; background: var(--bg); color: var(--fg); font: 16px/1.55 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; -webkit-font-smoothing: antialiased; } a { color: var(--primary); text-decoration: none; } a:hover { color: var(--primary-strong); text-decoration: underline; } code { font-family: "SFMono-Regular", Menlo, Consolas, "Roboto Mono", monospace; font-size: 0.92em; background: var(--primary-soft); padding: 0.1em 0.35em; border-radius: 4px; } h1, h2, h3 { line-height: 1.2; letter-spacing: -0.01em; margin: 0; } main > section, .top, .foot { max-width: 1120px; margin: 0 auto; padding: 0 24px; } /* ---- header ---------------------------------------------------------------------------------- */ .top { display: flex; align-items: center; gap: 24px; padding-top: 18px; padding-bottom: 18px; } .brand { display: inline-flex; align-items: center; gap: 10px; color: var(--fg); font-weight: 600; font-size: 1.05em; } .brand:hover { text-decoration: none; } .brand img { display: block; } .top__nav { display: flex; gap: 22px; margin-left: auto; font-weight: 500; } .top__nav a { color: var(--fg-muted); } .top__nav a:hover { color: var(--primary); text-decoration: none; } .theme-toggle { display: inline-flex; align-items: center; justify-content: center; width: 38px; height: 38px; border: 1px solid var(--line); border-radius: 50%; background: var(--bg-raised); color: var(--fg-muted); cursor: pointer; } .theme-toggle:hover { color: var(--primary); border-color: var(--primary); } .theme-toggle__moon { display: none; } :root[data-theme="dark"] .theme-toggle__sun { display: none; } :root[data-theme="dark"] .theme-toggle__moon { display: block; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .theme-toggle__sun { display: none; } :root:not([data-theme="light"]) .theme-toggle__moon { display: block; } } /* ---- hero ------------------------------------------------------------------------------------ */ .hero { position: relative; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 560px); align-items: center; gap: 32px; padding-top: 56px; padding-bottom: 64px; } .hero__art { grid-column: 2; grid-row: 1; width: 100%; max-width: 560px; justify-self: end; margin: 0; } /* A detector frame beside the placed model in its density, over the live analysis' timeline, drawn on the page's own colours: one file per theme, shown by the same rules that pick the theme's tokens. */ .hero__art img { display: block; width: 100%; height: auto; } .hero__art .hero__art-dark { display: none; } :root[data-theme="dark"] .hero__art .hero__art-light { display: none; } :root[data-theme="dark"] .hero__art .hero__art-dark { display: block; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .hero__art .hero__art-light { display: none; } :root:not([data-theme="light"]) .hero__art .hero__art-dark { display: block; } } .hero__art figcaption { margin-top: 10px; font-size: 0.78em; color: var(--fg-muted); text-align: right; } .hero__text { grid-column: 1; grid-row: 1; max-width: 600px; } .eyebrow { margin: 0 0 14px; font-size: 0.78em; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--primary); } .hero h1 { font-size: clamp(2.1rem, 4.6vw, 3.4rem); font-weight: 700; letter-spacing: -0.025em; margin-bottom: 18px; } .lede { font-size: 1.2em; color: var(--fg-muted); margin: 0 0 26px; } .lede strong { color: var(--fg); font-weight: 600; } .hero__actions { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 26px; } .btn { display: inline-block; padding: 11px 20px; border-radius: 8px; font-weight: 600; border: 1px solid transparent; transition: transform 0.12s, box-shadow 0.12s, background 0.12s; } .btn:hover { text-decoration: none; transform: translateY(-1px); } .btn--primary { background: var(--primary); color: var(--on-primary); box-shadow: var(--shadow); } .btn--primary:hover { background: var(--primary-strong); color: var(--on-primary); } .btn--ghost { border-color: var(--line); color: var(--fg); background: var(--bg-raised); } .btn--ghost:hover { border-color: var(--primary); color: var(--primary); } .hero__run { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; margin: 0; font-size: 0.95em; } .hero__run code { font-size: 1em; padding: 0.35em 0.7em; max-width: 100%; overflow-wrap: anywhere; } /* ---- programs -------------------------------------------------------------------------------- */ .programs { padding-bottom: 56px; } .programs__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; } .program { display: flex; flex-direction: column; padding: 24px 24px 20px; border: 1px solid var(--line); border-radius: 14px; background: var(--bg-raised); box-shadow: var(--shadow); } .program__kicker { margin: 0 0 8px; font-size: 0.74em; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--primary); } .program h2 { font-size: 1.45em; font-weight: 650; margin-bottom: 12px; } .program > p:not([class]) { margin: 0 0 14px; color: var(--fg); flex: 1 1 auto; } .program__meta { margin: 0 0 14px; font-size: 0.82em; color: var(--fg-muted); } .program__links { margin: 0; padding-top: 14px; border-top: 1px solid var(--line); display: flex; flex-wrap: wrap; gap: 6px 18px; font-weight: 500; } .program__links a:first-child { font-weight: 700; } /* ---- download -------------------------------------------------------------------------------- */ .download { padding-top: 48px; padding-bottom: 24px; border-top: 1px solid var(--line); } .download__head { max-width: 640px; margin-bottom: 28px; } .download__head h2 { font-size: 2em; font-weight: 700; margin-bottom: 10px; } .download__head p { margin: 0; color: var(--fg-muted); font-size: 1.05em; } .download__head [data-os-note]:not(:empty) { color: var(--fg); font-weight: 500; } .download__program { margin-bottom: 36px; } .download__program h3 { font-size: 1.3em; font-weight: 650; margin-bottom: 8px; } .download__program > p { margin: 0 0 16px; max-width: 720px; color: var(--fg-muted); } .download__program--text > p { color: var(--fg); } .jfj-dl__release { margin: 0 0 14px; font-size: 0.95em; color: var(--fg-muted); } .jfj-dl__release strong { color: var(--fg); } .jfj-dl__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 16px; } .jfj-dl__card { position: relative; padding: 18px 18px 8px; border: 1px solid var(--line); border-radius: 12px; background: var(--bg-raised); } .jfj-dl__card.is-yours { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft), var(--shadow); } .jfj-dl__card.is-yours::after { content: "Your system"; position: absolute; top: -11px; right: 14px; padding: 2px 10px; border-radius: 999px; background: var(--accent); color: #1b1d2a; font-size: 0.72em; font-weight: 700; letter-spacing: 0.04em; } .jfj-dl__platform { font-size: 1.1em; font-weight: 650; margin-bottom: 12px; } a.jfj-dl__btn { display: block; margin-bottom: 10px; padding: 10px 14px; border: 1px solid var(--primary); border-radius: 8px; background: var(--primary); color: var(--on-primary); font-weight: 600; line-height: 1.3; transition: background 0.12s, box-shadow 0.12s; } a.jfj-dl__btn:hover { text-decoration: none; background: var(--primary-strong); box-shadow: var(--shadow); color: var(--on-primary); } a.jfj-dl__btn--secondary { background: transparent; color: var(--primary); } a.jfj-dl__btn--secondary:hover { background: var(--primary-soft); color: var(--primary-strong); } a.jfj-dl__btn--missing, a.jfj-dl__btn--missing:hover { background: transparent; border-style: dashed; border-color: var(--line); color: var(--fg-muted); box-shadow: none; cursor: default; } .jfj-dl__file { display: block; margin-top: 2px; font-family: "SFMono-Regular", Menlo, Consolas, "Roboto Mono", monospace; font-size: 0.74em; font-weight: 400; opacity: 0.85; word-break: break-all; } .jfj-dl__req { margin: 6px 0 8px; font-size: 0.82em; line-height: 1.45; color: var(--fg-muted); } .jfj-dl__note { margin: 10px 0 0; font-size: 0.82em; color: var(--fg-muted); } .jfj-dl__note:empty { display: none; } /* ---- licence, footer ------------------------------------------------------------------------- */ .licence { padding-top: 40px; padding-bottom: 48px; border-top: 1px solid var(--line); } .licence h2 { font-size: 1.5em; font-weight: 650; margin-bottom: 12px; } .licence p { margin: 0; max-width: 760px; color: var(--fg-muted); } .foot { padding-top: 24px; padding-bottom: 40px; border-top: 1px solid var(--line); font-size: 0.88em; color: var(--fg-muted); } .foot p { margin: 0 0 6px; } /* ---- small screens --------------------------------------------------------------------------- */ @media (max-width: 760px) { body { font-size: 15px; } .top { gap: 14px; flex-wrap: wrap; } .top__nav { gap: 14px; margin-left: 0; order: 3; width: 100%; font-size: 0.95em; } .theme-toggle { margin-left: auto; } .hero { grid-template-columns: 1fr; padding-top: 28px; padding-bottom: 40px; } .hero__art { grid-column: 1; grid-row: 1; max-width: 360px; justify-self: center; } .hero__art figcaption { text-align: center; } .hero__text { grid-row: 2; } .programs__grid { grid-template-columns: 1fr; } }