// ============================================================================ // Retro-Future Theme // A modern, accessible theme with clean typography and thoughtful colors // ============================================================================ // ---------------------------------------------------------------------------- // Custom Properties (CSS Variables) // ---------------------------------------------------------------------------- :root { // Color Palette - Light Mode --color-background: oklch(98.2% 0.014 85); --color-text: oklch(31.55% 0.009 17.62); --color-text-muted: oklch(50% 0.009 17.62); --color-primary: oklch(62.78% 0.12 226); // Blue --color-secondary: oklch(70.27% 0.192 13.7); // Orange --color-accent: oklch(86.59% 0.088 168.12); // Teal --color-highlight: rgb(210, 55, 81); // Red --color-border: oklch(85% 0.014 85); // Code blocks --color-code-bg: #ffffff; --color-code-border: var(--color-primary); // Syntax highlighting --color-syntax-string: oklch(50% 0.15 155); --color-syntax-number: oklch(55% 0.18 50); --color-syntax-function: oklch(48% 0.14 240); --color-syntax-keyword: oklch(52% 0.16 300); --color-syntax-comment: oklch(60% 0.02 85); // Spacing Scale --space-xs: 0.25rem; // 4px --space-sm: 0.5rem; // 8px --space-md: 1rem; // 16px --space-lg: 1.5rem; // 24px --space-xl: 2rem; // 32px --space-2xl: 3rem; // 48px --space-3xl: 4rem; // 64px // Typography Scale --font-size-sm: 0.875rem; --font-size-base: 1.25rem; --font-size-lg: 1.375rem; --font-size-xl: 1.5rem; --font-size-2xl: 1.75rem; --font-size-2-5xl: 1.875rem; --font-size-3xl: 2.25rem; --font-size-4xl: 3rem; --font-size-5xl: 4rem; // Font Families --font-body: "Atkinson Hyperlegible Next", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; --font-display: "Bangers", "Comic Sans MS", cursive; --font-mono: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, monospace; // Line Heights --line-height-tight: 1.25; --line-height-base: 1.6; // Layout --layout-content-width: 52rem; --layout-padding: var(--space-md); // Border Radius --radius-sm: 0.25rem; --radius-md: 0.5rem; // Borders --border-accent-width: 4px; // Transitions --transition-fast: 150ms ease; --transition-base: 250ms ease; // Icons --icon-size: 18px; // Header bio --bio-photo-size: 60px; --bio-photo-border: 3px; --bio-text-max-width: 300px; // Scrollbar --scrollbar-size: 12px; --scrollbar-border: 2px; } // Dark Mode @media (prefers-color-scheme: dark) { :root { --color-background: oklch(31.55% 0.009 17.62); --color-text: oklch(98.2% 0.014 85); --color-text-muted: oklch(70% 0.014 85); --color-primary: oklch(86.59% 0.088 168.12); --color-secondary: oklch(80.27% 0.192 13.7); --color-accent: oklch(62.78% 0.12 226); --color-highlight: rgb(240, 85, 111); --color-border: oklch(45% 0.009 17.62); --color-code-bg: #1a1a1a; --color-syntax-string: oklch(72% 0.15 155); --color-syntax-number: oklch(75% 0.14 50); --color-syntax-function: oklch(75% 0.12 240); --color-syntax-keyword: oklch(78% 0.12 300); --color-syntax-comment: oklch(55% 0.02 85); } } // ---------------------------------------------------------------------------- // Web Fonts // ---------------------------------------------------------------------------- @import url('https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible+Next:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&family=Bangers&display=swap'); // ---------------------------------------------------------------------------- // Reset & Base Styles // ---------------------------------------------------------------------------- *, *::before, *::after { box-sizing: border-box; } * { margin: 0; padding: 0; } html { font-size: 100%; -webkit-text-size-adjust: 100%; scrollbar-color: var(--color-primary) var(--color-background); } body { font-family: var(--font-body); font-size: var(--font-size-base); line-height: var(--line-height-base); color: var(--color-text); background-color: var(--color-background); text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } // Text selection ::selection { background-color: var(--color-primary); color: var(--color-background); } // Scrollbar styling ::-webkit-scrollbar { width: var(--scrollbar-size); height: var(--scrollbar-size); } ::-webkit-scrollbar-track { background: var(--color-background); } ::-webkit-scrollbar-thumb { background: var(--color-primary); border-radius: calc(var(--scrollbar-size) / 2); border: var(--scrollbar-border) solid var(--color-background); &:hover { background: var(--color-secondary); } } // ---------------------------------------------------------------------------- // Typography // ---------------------------------------------------------------------------- h1, h2, h3, h4, h5, h6 { font-family: var(--font-body); font-weight: 700; line-height: var(--line-height-tight); margin-bottom: var(--space-md); color: var(--color-text); text-wrap: balance; } h1 { font-size: clamp(var(--font-size-3xl), 5vw, var(--font-size-4xl)); margin-top: var(--space-2xl); } h2 { font-size: clamp(var(--font-size-2xl), 4vw, var(--font-size-3xl)); margin-top: var(--space-xl); } h3 { font-size: clamp(var(--font-size-xl), 3vw, var(--font-size-2xl)); margin-top: var(--space-lg); } h4 { font-size: var(--font-size-xl); margin-top: var(--space-lg); } h5, h6 { font-size: var(--font-size-lg); margin-top: var(--space-md); } p { margin-bottom: var(--space-md); text-wrap: pretty; } a { color: var(--color-primary); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 3px; transition: color var(--transition-fast); &:hover { color: var(--color-secondary); } &:focus-visible { outline: 2px dashed var(--color-primary); outline-offset: 2px; border-radius: var(--radius-sm); } } strong, b { font-weight: 700; } em, i { font-style: italic; } // ---------------------------------------------------------------------------- // Code Blocks // ---------------------------------------------------------------------------- code { font-family: var(--font-mono); font-size: 0.9em; background-color: var(--color-code-bg); color: var(--color-highlight); padding: 0.125em 0.375em; border-radius: var(--radius-sm); border: 1px solid var(--color-code-border); } pre { font-family: var(--font-mono); font-size: var(--font-size-sm); line-height: var(--line-height-base); background-color: var(--color-code-bg); padding: var(--space-md); border-radius: var(--radius-md); border: 1px solid var(--color-code-border); overflow: hidden; margin-bottom: var(--space-md); color: var(--color-text); display: grid; grid-template-columns: auto 1fr; code { background: none; padding: 0 0 0 1em; border: none; font-size: inherit; color: inherit; grid-column: 2; overflow-x: auto; display: block; } .line-numbers { grid-column: 1; text-align: right; padding-right: 1em; border-right: 1px solid var(--color-code-border); color: var(--color-text-muted); user-select: none; white-space: pre; overflow: hidden; } } .code-block { margin-bottom: var(--space-md); &__filename { background-color: var(--color-code-border); color: var(--color-code-bg); padding: var(--space-xs) var(--space-md); font-family: var(--font-mono); font-size: var(--font-size-base); font-weight: 600; border-radius: var(--radius-md) var(--radius-md) 0 0; border: 1px solid var(--color-code-border); border-bottom: none; text-align: center; } pre { margin-bottom: 0; border-radius: 0 0 var(--radius-md) var(--radius-md); } &__filename + pre { border-top-left-radius: 0; border-top-right-radius: 0; } } // ---------------------------------------------------------------------------- // Blockquotes & Asides // ---------------------------------------------------------------------------- blockquote { border-left: var(--border-accent-width) solid var(--color-primary); padding-left: var(--space-md); margin: var(--space-lg) 0; font-style: italic; color: var(--color-text-muted); } .note { background-color: var(--color-code-bg); border-left: var(--border-accent-width) solid var(--color-secondary); border-radius: var(--radius-md); padding: var(--space-lg); margin: var(--space-xl) 0; &__title { font-weight: 700; font-size: var(--font-size-lg); color: var(--color-secondary); margin-bottom: var(--space-sm); } &__content { color: var(--color-text); p:last-child { margin-bottom: 0; } } &--note { border-left-color: var(--color-primary); .note__title { color: var(--color-primary); } } &--info { border-left-color: var(--color-accent); .note__title { color: var(--color-accent); } } &--warning { border-left-color: var(--color-highlight); .note__title { color: var(--color-highlight); } } &--tip { border-left-color: var(--color-secondary); .note__title { color: var(--color-secondary); } } } // ---------------------------------------------------------------------------- // Lists // ---------------------------------------------------------------------------- ul, ol { margin-bottom: var(--space-md); padding-left: var(--space-xl); list-style-position: outside; } li { margin-bottom: var(--space-xs); } article .post-content, .page-content, .section-content { ul { list-style: none; padding-left: 0; margin-left: 0; li { position: relative; &::before { content: "✦"; color: var(--color-secondary); font-weight: bold; position: absolute; left: -1.25em; } } } ol { list-style-position: outside; padding-left: 0; margin-left: 1.5em; li::marker { color: var(--color-secondary); font-weight: 600; } } h1, h2, h3, h4, h5, h6 { color: var(--color-primary); } a { text-decoration-style: wavy; } } // ---------------------------------------------------------------------------- // Layout // ---------------------------------------------------------------------------- .container { max-width: var(--layout-content-width); margin-left: auto; margin-right: auto; padding-left: var(--layout-padding); padding-right: var(--layout-padding); } main { min-height: 60vh; padding-bottom: var(--space-3xl); } // ---------------------------------------------------------------------------- // Header // ---------------------------------------------------------------------------- .site-header { padding: var(--space-xl) 0; margin-bottom: var(--space-2xl); .container { display: flex; justify-content: space-between; align-items: center; gap: var(--space-xl); } nav { margin-top: var(--space-md); ul { list-style: none; padding: 0; margin: 0; display: flex; gap: var(--space-lg); } a { color: var(--color-primary); font-weight: 500; text-transform: uppercase; transition: color var(--transition-base); &:hover { color: var(--color-secondary); text-decoration: none; } &[aria-current="page"] { color: var(--color-highlight); text-decoration: none; } } } } .header-bio { display: flex; align-items: center; gap: var(--space-md); &__photo img { width: var(--bio-photo-size); height: var(--bio-photo-size); border-radius: 50%; border: var(--bio-photo-border) solid var(--color-accent); object-fit: cover; display: block; } &__info { display: flex; flex-direction: column; gap: var(--space-xs); } &__main { display: flex; flex-direction: column; gap: var(--space-xs); } &__name { font-weight: 600; font-size: var(--font-size-base); color: var(--color-primary); } &__text { font-size: var(--font-size-sm); color: var(--color-text-muted); line-height: var(--line-height-base); max-width: var(--bio-text-max-width); } &__socials { display: flex; justify-content: flex-end; gap: var(--space-sm); a { text-decoration: none; transition: all var(--transition-fast); color: var(--color-background); background-color: var(--color-primary); border-radius: var(--radius-md); padding: var(--space-xs); display: flex; align-items: center; justify-content: center; transform: rotateY(5deg) rotateX(10deg) rotateZ(5deg); box-shadow: 2px 4px 0px color-mix(in srgb, var(--color-border) 50%, transparent); &:hover { background-color: var(--color-highlight); transform: rotateY(0deg) rotateX(0deg) rotateZ(0deg) scale(1.1); } svg { display: block; width: var(--icon-size); height: var(--icon-size); } } } } // ---------------------------------------------------------------------------- // Page Title // ---------------------------------------------------------------------------- .page-title { font-family: var(--font-display); font-size: clamp(var(--font-size-4xl), 8vw, var(--font-size-5xl)); font-weight: 400; color: var(--color-primary); margin: 0 0 var(--space-2xl) 0; line-height: 1.2; } // ---------------------------------------------------------------------------- // Articles // ---------------------------------------------------------------------------- article header { margin-bottom: var(--space-2xl); .post-title { margin-bottom: var(--space-sm); margin-top: 0; } .post-meta, .post-meta__tags { color: var(--color-highlight); font-size: var(--font-size-base); line-height: var(--line-height-base); font-weight: 500; font-style: italic; letter-spacing: -0.02em; } .post-meta { display: flex; align-items: baseline; gap: var(--space-sm); flex-wrap: wrap; } .post-meta__tags { @extend %tag-list; } .post-description { font-size: var(--font-size-lg); color: var(--color-text-muted); margin-top: var(--space-md); font-style: italic; } } .series-info { background-color: var(--color-code-bg); border-left: var(--border-accent-width) solid var(--color-accent); border-radius: var(--radius-md); padding: var(--space-lg); margin-bottom: var(--space-2xl); &__header { margin-bottom: var(--space-md); font-size: var(--font-size-base); strong { color: var(--color-accent); } a { color: var(--color-primary); font-weight: 600; } } &__nav ol { list-style-position: inside; padding-left: 0; margin: 0; li { margin-bottom: var(--space-xs); &.current { font-weight: 600; color: var(--color-primary); } a { color: var(--color-text); &:hover { color: var(--color-primary); } } &.current a { color: var(--color-primary); text-decoration: none; cursor: default; } } } } // ---------------------------------------------------------------------------- // Post List // ---------------------------------------------------------------------------- // Shared bullet styling %bullet-point { position: relative; &::before { content: "✦"; color: var(--color-secondary); position: absolute; left: -1.5em; font-size: 0.7em; top: 0.35em; } } // Shared list link styling %list-link { color: var(--color-primary); text-decoration: none; transition: color var(--transition-base); &:hover { color: var(--color-secondary); } } // Shared tag list styling %tag-list { display: inline-flex; gap: 0; list-style: none; padding: 0; margin: 0; font-style: normal; li { display: inline; &:not(:last-child)::after { content: ",\00a0"; } } a { color: inherit; text-decoration: none; &:hover { text-decoration: underline; } } } .post-list { list-style: none; padding: 0; margin: 0; &__item { margin-bottom: var(--space-2xl); padding-bottom: var(--space-xl); } &__title { @extend %bullet-point; margin: 0 0 var(--space-sm) 0; font-size: var(--font-size-2-5xl); line-height: var(--line-height-tight); font-weight: 600; a { @extend %list-link; } } &__series { font-size: var(--font-size-sm); color: var(--color-text-muted); margin: var(--space-xs) 0 var(--space-sm) 0; font-style: italic; a { color: var(--color-primary); text-decoration: none; &:hover { color: var(--color-secondary); text-decoration: underline; } } } &__meta { color: var(--color-highlight); font-size: var(--font-size-base); line-height: var(--line-height-base); font-weight: 500; font-style: italic; margin-bottom: var(--space-sm); letter-spacing: -0.02em; display: flex; align-items: baseline; gap: var(--space-sm); flex-wrap: wrap; } &__description { color: var(--color-text-muted); margin-bottom: var(--space-md); } &__tags { @extend %tag-list; } } // ---------------------------------------------------------------------------- // Taxonomy List // ---------------------------------------------------------------------------- .taxonomy-list { list-style: none; padding: 0; margin: 0; &__item { @extend %bullet-point; margin-bottom: var(--space-md); font-size: var(--font-size-xl); line-height: var(--line-height-tight); font-weight: 600; a { @extend %list-link; } } &__count { color: var(--color-text-muted); font-size: var(--font-size-base); font-weight: 400; margin-left: var(--space-xs); } } // ---------------------------------------------------------------------------- // Images // ---------------------------------------------------------------------------- img { max-width: 100%; height: auto; } figure { margin: var(--space-xl) auto; text-align: center; img, video { display: block; margin: 0 auto; } figcaption { margin-top: var(--space-sm); font-size: var(--font-size-sm); color: var(--color-text-muted); text-align: center; font-style: italic; } } // ---------------------------------------------------------------------------- // Mermaid Diagrams // ---------------------------------------------------------------------------- .mermaid { margin: var(--space-xl) 0; display: flex; justify-content: center; } // ---------------------------------------------------------------------------- // Syntax Highlighting // ---------------------------------------------------------------------------- pre code { .z-comment { color: var(--color-syntax-comment); font-style: italic; } .z-keyword, .z-keyword-constant, .z-keyword-declaration, .z-keyword-namespace, .z-keyword-pseudo, .z-keyword-reserved, .z-storage { color: var(--color-syntax-keyword); font-weight: 600; } .z-keyword-type, .z-storage-type { color: var(--color-syntax-function); font-weight: 600; } .z-constant, .z-constant-builtin, .z-constant-language, .z-constant-numeric, .z-constant-other { color: var(--color-syntax-number); } .z-constant-language { font-weight: 600; } .z-constant-character { color: var(--color-syntax-string); } .z-constant-regexp, .z-string-regexp { color: var(--color-highlight); } .z-entity, .z-entity-name, .z-entity-name-function, .z-entity-other, .z-entity-other-inherited-class, .z-support, .z-support-function, .z-support-type { color: var(--color-syntax-function); } .z-entity-name, .z-variable-language { font-weight: 600; } .z-entity-name-class, .z-entity-name-type, .z-entity-other-attribute-name, .z-support-class { color: var(--color-secondary); } .z-entity-name-tag { color: var(--color-syntax-keyword); } .z-invalid { color: var(--color-background); background-color: var(--color-highlight); } .z-invalid-deprecated { color: var(--color-background); background-color: var(--color-text-muted); } .z-markup { color: var(--color-text); } .z-markup-bold { color: var(--color-syntax-number); font-weight: 700; } .z-markup-deleted { color: var(--color-highlight); } .z-markup-heading { color: var(--color-highlight); font-weight: 600; } .z-markup-inserted { color: var(--color-syntax-string); } .z-markup-italic { color: var(--color-syntax-keyword); font-style: italic; } .z-markup-list { color: var(--color-highlight); } .z-markup-quote { color: var(--color-syntax-number); } .z-markup-raw { color: var(--color-syntax-string); } .z-meta { color: var(--color-text); } .z-string { color: var(--color-syntax-string); } .z-string-escape { color: var(--color-syntax-keyword); } .z-support-constant { color: var(--color-syntax-number); } .z-variable, .z-variable-parameter { color: var(--color-text); } } // ---------------------------------------------------------------------------- // Utilities // ---------------------------------------------------------------------------- .visually-hidden { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } // ---------------------------------------------------------------------------- // Pagination // ---------------------------------------------------------------------------- .pagination { display: flex; justify-content: center; align-items: center; gap: var(--space-md); margin-top: var(--space-xl); &__button { padding: var(--space-sm) var(--space-lg); background-color: var(--color-primary); color: var(--color-background); text-decoration: none; border-radius: var(--radius-md); font-weight: 600; transition: background-color var(--transition-fast); &:hover { background-color: var(--color-secondary); color: var(--color-background); } } &__info { color: var(--color-text-muted); font-size: var(--font-size-sm); } } // ---------------------------------------------------------------------------- // Responsive Design // ---------------------------------------------------------------------------- @media (max-width: 40rem) { :root { --layout-padding: var(--space-sm); } .site-header nav ul { flex-direction: column; gap: var(--space-sm); } article .post-content { ul { padding-left: 1.5em; } ol { padding-left: 1.5em; margin-left: 0; } } }