/* ─── Reset ──────────────────────────────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } /* ─── Variables ──────────────────────────────────────────────────────────────── */ :root { --bg: #222129; --bg-card: #272327; --bg-hover: #2e2b33; --text: #fff; --muted: rgba(255,255,255,0.5); --accent: #FFA86A; --border: rgba(255,255,255,0.1); --tag-bg: rgba(255,168,106,0.15); --tag-text: #FFA86A; --font: "Fira Code", "Monaco", "Consolas", "Ubuntu Mono", monospace; } /* ─── Base ───────────────────────────────────────────────────────────────────── */ html { font-size: 13px; } body { font-family: var(--font); font-feature-settings: "liga", "tnum", "zero", "ss01", "locl"; letter-spacing: -0.02em; line-height: 1.54; background: var(--bg); color: var(--text); padding: 32px 36px; max-width: 1000px; margin: 0 auto; /* Don't let the page grow beyond one screen */ height: 100vh; overflow: hidden; } ul { list-style: none; } a { color: var(--accent); text-decoration: none; } /* ─── Front matter ───────────────────────────────────────────────────────────── */ .front-matter { text-align: center; padding-bottom: 16px; margin-bottom: 16px; border-bottom: 1px solid var(--border); } .fm-name { font-size: 1.8rem; font-weight: 800; letter-spacing: -0.03em; color: var(--accent); margin-bottom: 4px; } .fm-contact { display: flex; justify-content: center; flex-wrap: wrap; font-size: 0.8rem; color: var(--muted); } .fm-contact span + span::before { content: " \2022 "; margin: 0 6px; } /* ─── Columns: flex column-wrap ──────────────────────────────────────────────── */ /* * All cards and headings are direct children of .columns. * flex-flow: column wrap makes them stack vertically, and once they * exceed the container height they wrap into the next column — * exactly like text wrapping in a newspaper column. * Any card, at any level, can be the wrap point. * * max-height is the remaining viewport after front-matter. * The front-matter is roughly 80px tall with the padding above. * JS sets this precisely via --col-height, but the CSS default is close. */ .columns { display: flex; flex-flow: column wrap; align-content: space-between; max-height: calc(100vh - 130px); gap: 0; } /* Every direct child is half the container width */ .columns > * { width: calc(50% - 20px); } /* Dividing rule: pseudo-element positioned in the middle */ .columns::before { content: ""; position: absolute; left: 50%; top: 0; bottom: 0; width: 1px; background: var(--border); pointer-events: none; } .columns { position: relative; } /* Section headings */ .sec-heading { font-size: 0.7rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.12em; color: var(--accent); border-bottom: 1px solid var(--border); padding-bottom: 3px; margin-bottom: 6px; margin-top: 4px; } /* ─── Shared header ──────────────────────────────────────────────────────────── */ .title-header, .project-header, .edu-header { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; margin-bottom: 1px; } .title-name, .project-name, .edu-degree { font-weight: 700; font-size: 0.88rem; } .date-range { font-size: 0.72rem; color: var(--muted); white-space: nowrap; flex-shrink: 0; } .title-meta, .edu-meta { font-size: 0.76rem; color: var(--muted); margin-bottom: 3px; } /* ─── Title card ─────────────────────────────────────────────────────────────── */ .title-card { padding: 5px 0 6px; border-bottom: 1px solid var(--border); margin-bottom: 4px; } .title-blurb ul { padding-left: 12px; } .title-blurb li { font-size: 0.82rem; line-height: 1.5; margin-bottom: 1px; color: rgba(255,255,255,0.85); } .title-blurb li::before { content: "- "; color: var(--muted); } /* ─── Project card ───────────────────────────────────────────────────────────── */ .project-card { background: var(--bg-card); border: 1px solid var(--border); border-left: 2px solid rgba(255,168,106,0.35); border-radius: 3px; padding: 6px 9px; margin-bottom: 4px; cursor: default; transition: background 0.18s, border-left-color 0.18s; } .project-card:has(.project-details li):hover { background: var(--bg-hover); border-left-color: var(--accent); } .project-name { font-size: 0.83rem; } .project-summary ul { padding-left: 12px; margin-top: 2px; } .project-summary li { font-size: 0.8rem; line-height: 1.5; color: rgba(255,255,255,0.85); } .project-summary li::before { content: "- "; color: var(--muted); } .project-details { max-height: 0; overflow: hidden; opacity: 0; transition: max-height 0.28s ease, opacity 0.22s ease; } .project-card:hover .project-details { max-height: 500px; opacity: 1; } .project-details ul { padding-left: 12px; margin-top: 4px; } .project-details li { font-size: 0.78rem; color: var(--muted); line-height: 1.5; margin-bottom: 1px; } .project-details li::before { content: "- "; } .tech-list { display: flex; flex-wrap: wrap; gap: 3px; margin-top: 5px; } .tech-tag { background: var(--tag-bg); color: var(--tag-text); font-size: 0.66rem; padding: 1px 5px; border-radius: 2px; letter-spacing: 0; } /* ─── Education card ─────────────────────────────────────────────────────────── */ .education-card { padding: 5px 0 6px; border-bottom: 1px solid var(--border); margin-bottom: 4px; cursor: default; } .edu-bullets ul { padding-left: 12px; margin-top: 3px; } .edu-bullets li { font-size: 0.82rem; line-height: 1.5; margin-bottom: 1px; color: rgba(255,255,255,0.85); } .edu-bullets li::before { content: "- "; color: var(--muted); } .edu-extras { max-height: 0; overflow: hidden; opacity: 0; transition: max-height 0.28s ease, opacity 0.22s ease; } .education-card:hover .edu-extras { max-height: 400px; opacity: 1; margin-top: 4px; } .edu-extras ul { padding-left: 12px; } .edu-extras li { font-size: 0.78rem; color: var(--muted); line-height: 1.5; margin-bottom: 1px; } .edu-extras li::before { content: "- "; } /* ─── Interests ──────────────────────────────────────────────────────────────── */ .interest-card { font-size: 0.82rem; line-height: 1.54; padding: 2px 0; } .interest-title { font-weight: 700; } .interest-title::after { content: ": "; color: var(--muted); font-weight: normal; } .interest-description { color: var(--muted); } /* ─── Responsive ─────────────────────────────────────────────────────────────── */ @media (max-width: 640px) { body { height: auto; overflow: auto; padding: 20px 16px; } .columns { flex-flow: column nowrap; max-height: none; } .columns > * { width: 100%; } .columns::before { display: none; } }