/* ============================================================ index.css — homepage only: the link hub grid (legacy, if still used anywhere), the terminal widget, and the "currently fronting" card beneath it. ============================================================ */ /* ============================================================ 3. LINK HUB (index page) ============================================================ */ .links { display: grid; grid-template-columns: repeat(auto-fit, 72px); gap: 0.9rem; justify-content: center; } .link-card { position: relative; display: flex; align-items: center; justify-content: center; width: 72px; height: 72px; border-radius: 16px; background: var(--surface-0); border: 1px solid var(--surface-1); color: var(--text); text-decoration: none; transition: transform 0.15s ease, border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease; } .link-card:hover { transform: translateY(-3px); background: var(--surface-1); border-color: rgb(var(--accent-rgb)); box-shadow: 0 6px 20px rgba(var(--accent-rgb), 0.22); } .icon { width: 30px; height: 30px; flex-shrink: 0; filter: brightness(0) invert(1); transition: filter 0.15s ease; } .link-card:hover .icon { filter: none; } /* Tooltip revealed on hover */ .link-text { position: absolute; bottom: calc(100% + 10px); left: 50%; transform: translateX(-50%) translateY(4px); display: flex; flex-direction: column; align-items: center; gap: 0.1rem; padding: 0.5rem 0.75rem; border-radius: 10px; background: var(--crust); border: 1px solid rgb(var(--accent-rgb)); box-shadow: 0 6px 18px rgba(17, 17, 27, 0.55); white-space: nowrap; line-height: 1.3; opacity: 0; pointer-events: none; transition: opacity 0.15s ease, transform 0.15s ease; z-index: 10; } .link-text::after { content: ""; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); border: 6px solid transparent; border-top-color: rgb(var(--accent-rgb)); } .link-card:hover .link-text, .link-card:focus-visible .link-text { opacity: 1; transform: translateX(-50%) translateY(0); } .link-title { font-weight: 500; font-size: 0.95rem; color: var(--text); } .link-sub { font-size: 0.78rem; color: var(--subtext-0); } /* ============================================================ 14. TERMINAL HOMEPAGE (+ 88x31 button wall) ============================================================ */ .terminal { position: relative; z-index: 1; width: min(92vw, 600px); /* locked height — the box must not resize between boot and ready, or as command output is appended (the inner .t-output scrolls instead) */ height: min(62vh, 460px); display: flex; flex-direction: column; padding: 1rem 1.15rem 1.15rem; background: var(--mantle); border: 1px solid var(--surface-1); border-radius: 14px; box-shadow: 0 18px 50px -20px rgba(0, 0, 0, 0.7); font-family: 'Comic Code', ui-monospace, 'JetBrains Mono', Menlo, monospace; font-size: 0.86rem; line-height: 1.5; color: var(--text); overflow: hidden; /* lets .t-banner size itself off the terminal's width (cqw), not the viewport, so the ascii always fits regardless of the loaded font */ container-type: inline-size; } body:has(.terminal) .hub { max-width: min(92vw, 600px); width: 100%; } body:has(.terminal) .hub .terminal { width: 100%; margin: 0 auto; } /* ---- boot log ---- */ .t-boot { margin: 0; white-space: pre-wrap; word-break: break-word; font-size: 0.78rem; color: var(--subtext-0); max-height: 72vh; overflow: hidden; } .t-boot[hidden] { display: none; } .b-line { display: block; } .b-time { color: var(--overlay-0); } .b-info { color: var(--blue); font-weight: 700; } .b-ok { color: var(--green); font-weight: 700; } /* ---- main terminal ---- */ .t-main { display: flex; flex-direction: column; flex: 1; /* fill the fixed-height terminal so .t-output scrolls */ min-height: 0; } .t-main[hidden] { display: none; } .t-banner { margin: 0 0 0.5rem; color: rgb(var(--accent-rgb)); /* scale to the terminal's width (1cqw = 1% of it) so the 42-char banner always fits; capped so it never gets oversized on a wide terminal */ font-size: min(0.78rem, 1.9cqw); line-height: 1.04; white-space: pre; overflow: hidden; text-shadow: 0 0 14px rgba(var(--accent-rgb), 0.35); } .t-greet { margin-bottom: 0.7rem; color: var(--subtext-1); } .t-greet b { color: rgb(var(--accent-rgb)); } .t-dim { color: var(--subtext-0); } .t-accent { color: rgb(var(--accent-rgb)); } .t-inputline { display: flex; align-items: center; gap: 0.5rem; padding-bottom: 0.55rem; border-bottom: 1px solid var(--surface-0); } .t-prompt { color: var(--green); white-space: nowrap; font-weight: 700; } .t-path { color: var(--blue); font-weight: 700; } .t-input { flex: 1; min-width: 0; background: transparent; border: none; outline: none; color: var(--text); font: inherit; caret-color: rgb(var(--accent-rgb)); } .t-output { margin-top: 0.6rem; min-height: 0; flex: 1; overflow-y: auto; display: flex; flex-direction: column; gap: 0.6rem; } .t-echo { color: var(--subtext-0); } .t-result { white-space: pre-wrap; word-break: break-word; margin-top: 0.15rem; } .t-entry.is-error .t-result { color: var(--red); } /* hyfetch trans-flag block */ .hf-c1 { color: #5bcefa; } .hf-c2 { color: #f5a9b8; } .hf-c3 { color: #ffffff; } .hf-pad { color: transparent; } /* ---- terminal: socials list (svg icon + clickable link) ---- */ .t-socials-hint { margin-bottom: 0.4rem; } .t-socials { display: flex; flex-direction: column; gap: 0.1rem; } .t-social { display: grid; grid-template-columns: 18px 6.5rem 6rem 1fr; align-items: center; gap: 0.55rem; padding: 0.22rem 0.4rem; border-radius: 6px; text-decoration: none; color: var(--text); border: 1px solid transparent; } .t-social:hover { background: var(--surface-0); border-color: rgba(var(--accent-rgb), 0.4); } .t-social-ic { width: 16px; height: 16px; object-fit: contain; } .t-social-key { color: rgb(var(--accent-rgb)); } .t-social-label { color: var(--text); } .t-social-sub { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /* the "Opening …" confirmation line */ .t-social-open { display: inline-flex; align-items: center; gap: 0.4rem; grid-template-columns: none; padding: 0; border: none; } .t-social-open:hover { background: transparent; } /* ---- terminal: ls-style socials list + social card ---- */ .t-ls { display: grid; grid-template-columns: repeat(auto-fill, minmax(7rem, 1fr)); gap: 0.1rem 1.2rem; } .t-ls-item { color: rgb(var(--accent-rgb)); } .t-ls-foot { margin-top: 0.6rem; } .t-ls-foot b { color: var(--text); } .t-social-card { display: flex; flex-direction: column; gap: 0.35rem; } .t-sc-head { display: flex; align-items: center; gap: 0.45rem; } .t-sc-head .t-social-ic { width: 18px; height: 18px; } .t-sc-url { color: var(--blue); text-decoration: none; word-break: break-all; } .t-sc-url:hover { text-decoration: underline; } .t-sc-ask { margin-top: 0.2rem; } .t-sc-ask b { color: var(--text); } .t-social-open { display: inline-flex; align-items: center; gap: 0.4rem; color: var(--text); text-decoration: none; } .t-social-open .t-social-ic { width: 16px; height: 16px; } /* ---- hyfetch: arch logo + info, side by side ---- */ .hf { display: flex; gap: 1.1rem; align-items: flex-start; flex-wrap: wrap; } .hf-logo { margin: 0; white-space: pre; line-height: 1.02; font-size: 0.62rem; } .hf-info { margin: 0; white-space: pre; } /* ===================================================================== * fronting.js — "currently fronting" box (sits below the terminal) * ===================================================================== */ .fronting-card { position: relative; z-index: 1; width: 100%; margin: 0.9rem auto 0; padding: 0.85rem 1rem; background: var(--mantle); border: 1px solid var(--surface-1); border-radius: 14px; box-shadow: 0 18px 50px -22px rgba(0, 0, 0, 0.6); } .fronting-card[hidden] { display: none; } .fr-head { display: flex; align-items: center; gap: 0.45rem; margin-bottom: 0.7rem; font-size: 0.72rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--subtext-0); } .fr-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 0 rgba(166, 227, 161, 0.55); animation: fr-pulse 2.4s ease-out infinite; } @keyframes fr-pulse { 0% { box-shadow: 0 0 0 0 rgba(166, 227, 161, 0.5); } 70% { box-shadow: 0 0 0 7px rgba(166, 227, 161, 0); } 100% { box-shadow: 0 0 0 0 rgba(166, 227, 161, 0); } } @media (prefers-reduced-motion: reduce) { .fr-dot { animation: none; } } .fr-members { display: flex; flex-wrap: wrap; gap: 0.6rem; } .fr-member { --fr-accent: var(--pink); display: flex; align-items: center; gap: 0.6rem; flex: 1 1 auto; min-width: 0; padding: 0.5rem 0.75rem 0.5rem 0.5rem; border-radius: 12px; background: var(--surface-0); border: 1px solid var(--surface-1); border-left: 3px solid var(--fr-accent); color: var(--text); } .fr-av { width: 38px; height: 38px; border-radius: 50%; object-fit: cover; flex: 0 0 auto; border: 2px solid var(--fr-accent); background: var(--crust); } .fr-av--empty { display: inline-block; } .fr-meta { display: flex; flex-direction: column; min-width: 0; line-height: 1.25; } .fr-name { font-weight: 600; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .fr-pronouns { font-size: 0.74rem; color: var(--subtext-0); } .fr-empty { font-size: 0.82rem; color: var(--subtext-0); font-style: italic; } @media (max-width: 640px) { .terminal { width: 94vw; height: clamp(300px, 65dvh, 70vh); } }