/* Kepr 3: Kepr 2's look (kepr.uk, gold theme), ported only as far as the pages that exist use it. */ :root { --bg: #090706; --bg-surface: #0e0c09; --bg-elevated: #1b1710; --border: #2a2018; --text: #c8b898; --text-secondary: #7a6a50; --text-muted: #7a6a50; --text-faint: #4a3a28; --text-heading: #e8d8b8; --accent: #c89a5a; --accent-bright: #d9b88c; --accent-dim: #85663c; --accent-flash: #5a88c8; --accent-tint-04: rgba(200, 154, 90, 0.04); --accent-tint-12: rgba(200, 154, 90, 0.12); --sage: #7a9a68; --sans: "Quicksand", system-ui, sans-serif; --mono: "Martian Mono", ui-monospace, monospace; } * { box-sizing: border-box; scrollbar-width: thin; scrollbar-color: var(--border) transparent; } html, body { margin: 0; padding: 0; background: var(--bg); color: var(--text); font-family: var(--sans); font-size: 16px; line-height: 1.6; overflow-x: hidden; } a { color: inherit; text-decoration: none; } a:hover { text-decoration: underline; text-decoration-color: var(--accent); text-decoration-thickness: 1px; text-underline-offset: 4px; } /* ----- top bar ------------------------------------------------------------ */ body > nav { display: flex; align-items: center; padding: 24px 48px; font-size: 0.6875rem; letter-spacing: 0.04em; } .wordmark { display: flex; color: var(--accent); } .wordmark:hover { text-decoration: none; } .wordmark-icon { display: block; width: 32px; height: 32px; color: var(--accent); } .wordmark-icon polygon { fill: none; stroke: currentColor; stroke-linejoin: round; } .tri-outer polygon { stroke-width: 2; } .tri-inner polygon { stroke-width: 1.5; } .tri-outer, .tri-inner { transform-origin: 16px 16px; } .tri-outer { animation: tri-ccw 12s linear infinite, accent-flash 9s ease-in-out infinite; } .tri-inner { animation: tri-cw 8s linear infinite, accent-flash 6.7s ease-in-out infinite; } @keyframes tri-ccw { to { transform: rotate(-360deg); } } @keyframes tri-cw { to { transform: rotate(360deg); } } @keyframes accent-flash { 0%, 84%, 100% { color: var(--accent); } 92% { color: var(--accent-flash); } } .wordmark-by { margin-left: 10px; font-size: 0.625rem; color: var(--text-faint); letter-spacing: 0.03em; } .nav-links { margin-left: auto; display: inline-flex; gap: 28px; font-family: var(--mono); } .nav-links a { color: var(--text-secondary); } main { max-width: 980px; margin: 0 auto; padding: 24px 48px 120px; } footer { text-align: center; padding: 80px 24px 48px; } footer .credit { font-family: var(--mono); font-size: 0.6875rem; color: var(--text-muted); } .mono { font-family: var(--mono); font-size: 0.8125rem; color: var(--text-secondary); } .muted { color: var(--text-muted); } @keyframes fadeUp { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeIn { from { opacity: 0; } } /* ----- repo header -------------------------------------------------------- */ .repo-head { margin: 20px 0 24px; } .repo-name { font-family: "Comfortaa", var(--sans); font-weight: 700; font-size: 4rem; line-height: 1.05; margin: -0.1em 0 10px; color: var(--text); overflow-wrap: anywhere; animation: fadeUp 280ms ease both; } .repo-contributor { margin: 4px 0 0; font-size: 0.8125rem; animation: fadeUp 280ms 40ms ease both; } .repo-contributor a:hover { color: var(--accent); } .repo-desc, .repo-homepage { margin: 0 0 10px; font-size: 1.0625rem; color: var(--text-secondary); line-height: 1.75; animation: fadeUp 280ms 30ms ease both; } .repo-desc p { margin: 12px 0 0; } .repo-desc a, .repo-homepage a { color: var(--accent); } .repo-desc code { font-family: var(--mono); font-size: 0.85em; color: var(--accent); } .lang-badges { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0 6px; } .lang-badge { font-family: var(--mono); font-size: 0.6875rem; color: var(--accent-dim); background: var(--bg-surface); border: 1px solid var(--border); border-radius: 3px; padding: 1px 7px; letter-spacing: 0.02em; } .repo-meta { margin: 0; font-size: 0.875rem; color: var(--text-muted); line-height: 1.7; animation: fadeUp 280ms 60ms ease both; } .repo-tabbar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 14px 20px; margin-top: 22px; } .repo-tabs { display: flex; gap: 24px; flex-wrap: wrap; font-family: var(--mono); animation: fadeUp 280ms 90ms ease both; } .repo-tab { font-size: 0.6875rem; color: var(--text-muted); padding: 0 0 11px; border-bottom: 1px solid transparent; transition: color 140ms, border-color 140ms; } .repo-tab:hover { color: var(--accent); text-decoration: none; } .install-lines { display: flex; flex-direction: column; align-items: flex-end; gap: 6px; max-width: 100%; margin-left: auto; animation: fadeUp 280ms 120ms ease both; } .install-line { display: flex; align-items: center; gap: 12px; max-width: 100%; font-family: var(--mono); font-size: 0.75rem; color: var(--text-muted); background: var(--bg-surface); border: 1px solid var(--border); border-radius: 3px; padding: 5px 11px; } .install-line code { white-space: pre; overflow-x: auto; font-family: inherit; } .copy-btn { background: none; border: 0; padding: 0; cursor: pointer; font: inherit; font-size: 0.625rem; color: var(--text-faint); letter-spacing: 0.04em; } .copy-btn:hover, .copy-btn.copied { color: var(--accent); } /* ----- sections ----------------------------------------------------------- */ .repo-section { margin: 36px 0 0; animation: fadeIn 320ms 80ms ease both; } .repo-section-toggle > summary, .repo-details-toggle > summary { list-style: none; cursor: pointer; user-select: none; } .repo-section-toggle > summary::-webkit-details-marker, .repo-details-toggle > summary::-webkit-details-marker { display: none; } .section-head { display: flex; align-items: baseline; gap: 12px; padding-bottom: 8px; border-bottom: 1px solid var(--border); margin-bottom: 4px; } .section-head::after, .repo-details-head::after { content: "▸"; font-size: 0.5625rem; opacity: 0.4; transition: transform 120ms; } .section-head::after { margin-left: auto; } details[open] > .section-head::after, details[open] > .repo-details-head::after { transform: rotate(90deg); } .section-label { font-size: 0.6875rem; letter-spacing: 0.12em; color: var(--text-secondary); text-transform: uppercase; } .section-count { font-family: var(--mono); font-size: 0.6875rem; color: var(--accent); } /* ----- timeline ----------------------------------------------------------- */ .timeline { display: block; margin: 18px 0 4px; overflow: visible; } .timeline-line { stroke: var(--text-faint); stroke-width: 1; stroke-dasharray: 4 4; } .timeline .dot circle { fill: var(--accent); transition: fill-opacity 120ms, r 120ms; } .timeline .d0 circle { fill: var(--accent-dim); fill-opacity: 0.45; } .timeline .d1 circle { fill-opacity: 0.55; } .timeline .d2 circle { fill-opacity: 0.8; } .timeline .d3 circle { fill: var(--accent-bright); fill-opacity: 1; } .timeline .dot:hover circle, .timeline .dot:focus circle { fill: var(--accent-bright); fill-opacity: 1; } .timeline-legend { margin: 0 0 14px; font-size: 0.625rem; color: var(--text-faint); } .timeline-tip { position: fixed; z-index: 200; max-width: 340px; padding: 0.45rem 0.7rem; background: #0f0c08; border: 1px solid var(--border); border-radius: 4px; pointer-events: none; line-height: 1.5; } .timeline-tip .tip-id { font-family: var(--mono); font-size: 12px; color: var(--accent); } .timeline-tip .tip-msg { margin-top: 3px; font-style: italic; font-size: 15px; color: var(--text-heading); } .timeline-tip .tip-meta { margin-top: 4px; font-family: var(--mono); font-size: 10px; color: var(--text-muted); } /* ----- history ------------------------------------------------------------ */ .history-row { position: relative; display: grid; grid-template-columns: 110px 1fr auto; align-items: baseline; gap: 0 10px; padding: 9px 8px; border-bottom: 1px solid var(--border); transition: background 100ms; } .history-row::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 2px; background: var(--accent); transform: scaleY(0); transition: transform 120ms ease; } .history-row:hover { background: var(--accent-tint-04); text-decoration: none; } .history-row:hover::before { transform: scaleY(1); } .history-id { font-family: var(--mono); font-size: 0.75rem; color: var(--text-secondary); } .history-msg { min-width: 0; line-height: 1.7; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; transition: color 100ms; } .history-row:hover .history-msg { color: var(--accent); } .history-when { font-family: var(--mono); font-size: 0.6875rem; color: var(--text-muted); white-space: nowrap; } .pager { display: flex; justify-content: space-between; margin: 14px 0 0; font-size: 0.6875rem; } .pager a:last-child { margin-left: auto; } .pager a:hover { color: var(--accent); } /* ----- README and rendered Markdown --------------------------------------- */ .repo-details { margin: 36px 0 0; animation: fadeIn 320ms 80ms ease both; } .repo-details-toggle { border-bottom: 1px solid var(--border); padding-bottom: 24px; } .repo-details-head { display: flex; align-items: center; gap: 6px; padding: 8px 0; font-family: var(--mono); font-size: 0.6875rem; letter-spacing: 0.12em; color: var(--text-secondary); text-transform: uppercase; } .markdown { font-size: 1.05rem; line-height: 1.7; overflow-wrap: break-word; } .markdown h1, .markdown h2, .markdown h3, .markdown h4 { font-weight: 400; margin: 1.4em 0 0.4em; color: var(--text-heading); } .markdown h1 { font-size: 1.5rem; } .markdown h2 { font-size: 1.3rem; } .markdown h3 { font-size: 1.15rem; } .markdown p { margin: 0.8em 0; } .markdown ul, .markdown ol { margin: 0.8em 0 0.8em 1.5em; padding: 0; } .markdown a { color: var(--accent); } .markdown code { font-family: var(--mono); font-size: 0.82em; color: var(--accent); background: var(--bg-surface); padding: 0.15em 0.35em; border-radius: 3px; } .markdown pre { background: var(--bg-surface); border-radius: 4px; padding: 1em 1.2em; overflow-x: auto; margin: 1em 0; } .markdown pre code { background: none; padding: 0; color: var(--text); font-size: 0.85em; } .markdown blockquote { border-left: 3px solid var(--border); margin: 1em 0; padding: 0.1em 1em; color: var(--text-secondary); } .markdown hr { border: none; border-top: 1px solid var(--border); margin: 1.5em 0; } .markdown img { max-width: 100%; } .markdown table { border-collapse: collapse; display: block; overflow-x: auto; } .markdown th, .markdown td { border: 1px solid var(--border); padding: 4px 10px; } /* ----- file viewer -------------------------------------------------------- */ .breadcrumb { margin: 0 0 4px; font-size: 0.75rem; overflow-wrap: anywhere; } .breadcrumb a:hover { color: var(--accent); } .file-page-title { font-size: 1.75rem; font-weight: 400; margin: 4px 0 12px; overflow-wrap: anywhere; } .file-meta, .file-toggle { margin: 0 0 12px; font-size: 0.6875rem; } .file-meta a, .file-toggle a.active { color: var(--accent); } .file-image img { max-width: 100%; background: var(--bg-surface); border: 1px solid var(--border); } .file-view { border: 1px solid var(--border); background: var(--bg-surface); overflow-x: auto; } .code { margin: 0; padding: 16px 0; font-family: var(--mono); font-size: 0.8125rem; line-height: 1.65; tab-size: 4; } /* A grid, so tab stops count from the start of the code rather than the line number. */ .code .line { display: grid; grid-template-columns: 6em 1fr; padding-right: 24px; scroll-margin-top: 40vh; } .code .line:target, .code .line.hl { background: var(--accent-tint-12); } .code .lc { white-space: pre; } .code .ln { padding-right: 1.5em; text-align: right; color: var(--text-faint); user-select: none; } .code .ln:hover { color: var(--accent); text-decoration: none; } /* Shiki's CSS-variables theme roles, in Kepr 2's highlight.js colours. */ .tk-comment { color: var(--text-muted); font-style: italic; } .tk-keyword { color: var(--accent); } .tk-string, .tk-string-expression { color: var(--sage); } .tk-constant { color: var(--accent-bright); } .tk-function { color: var(--accent); } .tk-parameter { color: var(--text); } .tk-punctuation { color: var(--text-secondary); } .tk-link { color: var(--accent); text-decoration: underline; } .tk-inserted { color: var(--sage); } .tk-deleted { color: #c45c5c; } .tk-i { font-style: italic; } /* ----- phone -------------------------------------------------------------- */ @media (max-width: 768px) { body > nav { padding: 20px 16px; } .nav-links { gap: 18px; } main { padding: 16px 16px 80px; } .repo-name { font-size: 2.75rem; } .install-lines { align-items: stretch; margin-left: 0; width: 100%; } .history-row { grid-template-columns: 1fr auto; } .history-id { grid-column: 1 / -1; } .code .line { grid-template-columns: 4.5em 1fr; } .code .ln { padding-right: 1em; } } /* Later in the file than every animation it stops, so it wins without !important. */ @media (prefers-reduced-motion: reduce) { .tri-outer, .tri-inner, .repo-name, .repo-contributor, .repo-desc, .repo-homepage, .repo-meta, .repo-tabs, .install-lines, .repo-section, .repo-details { animation: none; } }