redesign: irc-client / terminal aesthetic — buffer, nicklist, cap-ls grammar

This commit is contained in:
Jean Chevronnet 2026-08-30 18:36:41 +00:00
parent 899040a319
commit 182f14a7f2
No known key found for this signature in database
GPG key ID: 439666D63A9477E4
6 changed files with 264 additions and 321 deletions

View file

@ -1,5 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
<rect width="64" height="64" rx="14" fill="#0b0e14"/>
<text x="50%" y="55%" font-family="ui-monospace,monospace" font-size="34" font-weight="700"
fill="#e6edf3" text-anchor="middle" dominant-baseline="middle">e<tspan fill="#3fb950">.</tspan></text>
<rect width="64" height="64" rx="13" fill="#0d0e12"/>
<text x="13" y="45" font-family="ui-monospace,monospace" font-size="33" font-weight="700" fill="#e2a25a">&#8250;</text>
<rect x="37" y="27" width="13" height="20" rx="1" fill="#c8ccd4"/>
</svg>

Before

Width:  |  Height:  |  Size: 329 B

After

Width:  |  Height:  |  Size: 315 B

Before After
Before After

View file

@ -1,124 +1,126 @@
/* echoIRCd — the site as an IRC client. Monospace, warm phosphor, real IRC grammar. */
:root{
--bg:#0b0e14; --bg2:#11161f; --bg3:#161c27;
--line:#222b38; --line2:#2b3646;
--fg:#c8d3e0; --fg2:#7d8896; --hi:#e6edf3;
--accent:#3fb950; --accent2:#2ea043; --link:#58a6ff;
--radius:12px; --wrap:1040px;
color-scheme:dark;
--bg:#08090c; --win:#0d0e12; --panel:#14161c; --panel2:#0f1116;
--edge:#22252e; --edge2:#2d313c;
--fg:#c8ccd4; --dim:#767b85; --dimmer:#4a4e58;
--amber:#e2a25a; --green:#5fbf6b; --blue:#5f9bef; --magenta:#c58af0; --cyan:#4fcccf; --red:#ec6d6d;
--link:#6aa6f2; --ok:#5fbf6b;
--mono:ui-monospace,"SF Mono","JetBrains Mono","Cascadia Code",Menlo,Consolas,"DejaVu Sans Mono",monospace;
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
html{-webkit-text-size-adjust:100%}
body{
margin:0; background:var(--bg); color:var(--fg);
font:16px/1.65 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
margin:0;background:var(--bg);color:var(--fg);
font:14.5px/1.65 var(--mono);
background-image:radial-gradient(1200px 600px at 50% -10%,rgba(226,162,90,.05),transparent 70%);
-webkit-font-smoothing:antialiased;
}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
a{color:var(--link);text-decoration:none}
a:hover{text-decoration:underline}
h1,h2,h3,h4{color:var(--hi);line-height:1.2}
.accent{color:var(--accent)}
main{min-height:60vh}
.wrap,.hero,.split,.page-head,.cs-in{max-width:var(--wrap);margin:0 auto;padding-left:1.25rem;padding-right:1.25rem}
b{color:var(--fg);font-weight:600}
.dim{color:var(--dim)}
.kw{color:var(--amber)}
.ok{color:var(--ok)}
.i{font-style:italic}
.n-amber{color:var(--amber)} .n-green{color:var(--green)} .n-blue{color:var(--blue)}
.n-magenta{color:var(--magenta)} .n-cyan{color:var(--cyan)} .n-red{color:var(--red)}
/* nav */
.nav{
display:flex;align-items:center;justify-content:space-between;gap:1rem;
max-width:var(--wrap);margin:0 auto;padding:1.1rem 1.25rem;
}
.brand{font-family:ui-monospace,monospace;font-weight:700;font-size:1.25rem;color:var(--hi)}
.brand:hover{text-decoration:none}
.brand .dot{color:var(--accent)}
.navlinks{display:flex;gap:1.4rem;align-items:center;flex-wrap:wrap}
.navlinks a{color:var(--fg2);font-size:.95rem}
.navlinks a:hover{color:var(--hi);text-decoration:none}
.navlinks a.on{color:var(--hi)}
.navlinks a.ext{color:var(--fg2)}
/* hero */
.hero{padding:3.5rem 1.25rem 2rem;text-align:center}
.badge-row{display:flex;gap:.5rem;justify-content:center;flex-wrap:wrap;margin-bottom:1.6rem}
.badge{
font-size:.78rem;color:var(--accent);background:rgba(63,185,80,.08);
border:1px solid rgba(63,185,80,.28);border-radius:999px;padding:.25rem .7rem;
}
.hero h1{font-size:clamp(2.1rem,5vw,3.4rem);letter-spacing:-1.5px;margin:.2rem 0 1rem}
.lede{color:var(--fg2);font-size:1.12rem;max-width:640px;margin:0 auto 1.8rem}
.cta{display:flex;gap:.8rem;justify-content:center;flex-wrap:wrap}
.btn{
display:inline-block;padding:.65rem 1.2rem;border-radius:8px;font-weight:600;
border:1px solid var(--line2);color:var(--hi);background:var(--bg2);
}
.btn:hover{border-color:#3a475a;text-decoration:none}
.btn.primary{background:var(--accent2);border-color:var(--accent);color:#04120a}
.btn.primary:hover{background:var(--accent)}
.connectline{
margin:1.8rem auto 0;max-width:max-content;color:var(--accent);
background:var(--bg2);border:1px solid var(--line);border-radius:8px;padding:.55rem 1rem;font-size:.95rem;
/* the client window */
.client{
max-width:1060px;margin:1.6rem auto;background:var(--win);
border:1px solid var(--edge);border-radius:9px;overflow:hidden;
box-shadow:0 24px 60px -30px rgba(0,0,0,.8),0 0 0 1px rgba(255,255,255,.01);
}
/* split cards */
.split{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin-top:1.5rem}
.card{background:var(--bg2);border:1px solid var(--line);border-radius:var(--radius);padding:1.4rem 1.5rem}
.card h3{margin:0 0 .5rem;font-size:1.25rem}
.card p{margin:0;color:var(--fg2)}
.tag{font-size:.7rem;text-transform:uppercase;letter-spacing:.1em;color:var(--fg2);
border:1px solid var(--line2);border-radius:6px;padding:.1rem .45rem;margin-left:.4rem;vertical-align:middle}
/* title bar */
.titlebar{display:flex;align-items:center;gap:.6rem;padding:.55rem .9rem;background:var(--panel);border-bottom:1px solid var(--edge)}
.conn{width:9px;height:9px;border-radius:50%;background:var(--green);box-shadow:0 0 8px var(--green);flex:none}
.tb-name{color:var(--fg);font-weight:600}
.tb-server{margin-left:auto;color:var(--dim);font-size:.82rem}
/* feature grid */
.wrap{padding-top:3.5rem;padding-bottom:1rem}
.section-title{text-align:center;font-size:1.6rem;margin:0 0 2rem}
.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem}
.feat{background:var(--bg2);border:1px solid var(--line);border-radius:var(--radius);padding:1.3rem 1.4rem}
.feat .ico{font-size:1.5rem;margin-bottom:.5rem}
.feat h4{margin:.1rem 0 .5rem;font-size:1.08rem}
.feat p{margin:0;color:var(--fg2);font-size:.95rem}
.feat em{color:var(--fg);font-style:normal;font-weight:600}
/* tabs */
.tabs{display:flex;gap:.15rem;padding:0 .5rem;background:var(--panel);border-bottom:1px solid var(--edge);overflow-x:auto}
.tab{padding:.5rem .8rem;color:var(--dim);border-bottom:2px solid transparent;white-space:nowrap}
.tab:hover{color:var(--fg);text-decoration:none}
.tab.on{color:var(--amber);border-bottom-color:var(--amber)}
.tab.ext{margin-left:auto;color:var(--dimmer)}
/* connect strip */
.connect-strip{margin:4rem 0 0;background:linear-gradient(180deg,var(--bg2),var(--bg3));border-top:1px solid var(--line)}
.cs-in{display:flex;align-items:center;justify-content:space-between;gap:1.5rem;padding:2.4rem 1.25rem;flex-wrap:wrap}
.cs-in h2{margin:0 0 .2rem;font-size:1.5rem}
.cs-in p{margin:0;color:var(--fg2)}
.mini{border-collapse:collapse;font-size:.95rem}
.mini td{padding:.28rem .9rem;border-bottom:1px solid var(--line)}
.mini td:first-child{color:var(--fg2)}
/* topic */
.topic{padding:.5rem .95rem;background:var(--panel2);border-bottom:1px solid var(--edge);color:var(--dim);font-size:.85rem}
.topic .tp{color:var(--amber);margin-right:.35rem}
/* pages */
.page-head{padding:3rem 1.25rem 1rem;text-align:center}
.page-head h1{font-size:2.4rem;letter-spacing:-1px;margin:0 0 .6rem}
.prose .block{margin:0 0 2.2rem}
.block h2{font-size:1.35rem;border-bottom:1px solid var(--line);padding-bottom:.5rem;margin:0 0 .9rem}
.block ul{margin:.4rem 0 0;padding-left:1.1rem}
.block li{margin:.35rem 0;color:var(--fg2)}
.block li strong{color:var(--fg)}
/* workspace = buffer + nicklist */
.workspace{display:flex;align-items:stretch}
.buffer{flex:1;min-width:0;padding:1.1rem 1.1rem 1.4rem}
.nicklist{width:13.5rem;flex:none;background:var(--panel2);border-left:1px solid var(--edge);padding:1rem .85rem;font-size:.86rem}
.nl-head{color:var(--dim);text-transform:uppercase;letter-spacing:.12em;font-size:.72rem;margin-bottom:.6rem}
.nicklist ul{list-style:none;margin:0;padding:0}
.nicklist li{display:flex;align-items:center;gap:.15rem;padding:.14rem 0;white-space:nowrap}
.nicklist .s{display:inline-block;width:1.1em;text-align:center;color:var(--dim)}
.bf{margin-left:.35rem;font-size:.62rem;color:var(--dimmer);border:1px solid var(--edge2);border-radius:3px;padding:0 .25em}
/* chips */
.chips{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.6rem}
.chips span{
font-family:ui-monospace,monospace;font-size:.8rem;color:var(--fg);
background:var(--bg3);border:1px solid var(--line);border-radius:6px;padding:.2rem .5rem;
}
/* tables + code on connect page */
.detail{width:100%;border-collapse:collapse;margin:.5rem 0 1rem}
.detail th{text-align:left;color:var(--fg2);font-weight:500;padding:.5rem .9rem;border-bottom:1px solid var(--line);white-space:nowrap;vertical-align:top}
.detail td{padding:.5rem .9rem;border-bottom:1px solid var(--line);color:var(--fg)}
.code{
background:var(--bg2);border:1px solid var(--line);border-radius:8px;
padding:1rem 1.1rem;overflow-x:auto;color:var(--accent);
font-family:ui-monospace,monospace;font-size:.9rem;line-height:1.7;white-space:pre;
}
.hint{color:var(--fg2);font-size:.92rem}
.webchat{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin:1.5rem 0 0;color:var(--fg2)}
/* footer */
.foot{border-top:1px solid var(--line);margin-top:4rem}
.foot-in{max-width:var(--wrap);margin:0 auto;padding:1.6rem 1.25rem;display:flex;justify-content:space-between;gap:1rem;flex-wrap:wrap;color:var(--fg2);font-size:.9rem}
.foot .mono{color:var(--fg)}
.foot-links{display:flex;gap:1.1rem}
@media(max-width:760px){
.split{grid-template-columns:1fr}
.grid{grid-template-columns:1fr}
/* buffer lines — [time] [gutter] [message] */
.ln{display:grid;grid-template-columns:3.1em 7em 1fr;column-gap:.75em;align-items:baseline;padding:.09rem 0}
.ln .t{color:var(--dimmer);font-size:.82em}
.ln .g{text-align:right;white-space:nowrap;color:var(--dim)}
.ln .m{min-width:0;word-wrap:break-word;overflow-wrap:anywhere}
.ln .m a{color:var(--link)}
/* banner / wordmark */
.banner{padding:.6rem 0 1.4rem;border-bottom:1px dashed var(--edge);margin-bottom:1rem}
.wordmark{font-size:clamp(2.3rem,7vw,3.7rem);font-weight:700;letter-spacing:-2px;color:var(--fg);line-height:1}
.wordmark .w-hi{color:var(--amber)}
.w-sub{color:var(--dim);margin-top:.5rem;font-size:.95rem}
.cur{display:inline-block;width:.55em;color:var(--amber);animation:blink 1.1s steps(1) infinite}
.cur-lg{width:.5em;margin-left:.06em}
@keyframes blink{50%{opacity:0}}
@media(prefers-reduced-motion:reduce){.cur{animation:none}}
/* quickfacts */
.quickfacts{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:1.3rem}
.qf{border:1px solid var(--edge);border-radius:6px;padding:.4rem .7rem;color:var(--dim);background:var(--panel2);font-size:.85rem}
.qf:hover{border-color:var(--edge2);color:var(--fg);text-decoration:none}
.qf .qf-k{color:var(--amber)}
/* feature groups */
.grp{margin:1.5rem 0}
.grp-h{color:var(--amber);font-size:.82rem;text-transform:uppercase;letter-spacing:.14em;padding-bottom:.4rem;margin-bottom:.7rem;border-bottom:1px solid var(--edge);position:relative}
.grp-h::before{content:"── ";color:var(--dimmer)}
.bul{list-style:none;margin:0;padding:0}
.bul li{padding:.22rem 0 .22rem 1.3em;position:relative;color:var(--fg)}
.bul li::before{content:"·";position:absolute;left:.3em;color:var(--amber)}
.srvline{display:grid;grid-template-columns:7em 1fr;column-gap:.75em;align-items:baseline;margin:.2rem 0 .8rem}
.srvline .g{text-align:right}
.capline{color:var(--dim);word-break:break-word;line-height:1.7}
/* connect page: tables + code */
.detail{width:100%;border-collapse:collapse;margin:.7rem 0 1rem;font-size:.9rem}
.detail th{text-align:left;color:var(--dim);font-weight:400;padding:.4rem .8rem .4rem 0;border-bottom:1px solid var(--edge);white-space:nowrap;vertical-align:top;width:1%}
.detail td{padding:.4rem 0;border-bottom:1px solid var(--edge);color:var(--fg)}
.note{color:var(--dim);margin:.2rem 0 .6rem;font-size:.9rem}
.code{background:var(--panel2);border:1px solid var(--edge);border-left:2px solid var(--amber);border-radius:6px;
padding:.8rem 1rem;overflow-x:auto;color:var(--green);font-size:.88rem;line-height:1.75;white-space:pre;margin:.4rem 0}
.webchat{display:flex;align-items:center;gap:.8rem;flex-wrap:wrap;margin:1.1rem 0}
.btn{display:inline-block;border:1px solid var(--edge2);background:var(--panel);color:var(--fg);padding:.4rem .85rem;border-radius:6px;font-size:.88rem}
.btn:hover{border-color:var(--amber);color:var(--amber);text-decoration:none}
/* input + status bars */
.inputbar{display:flex;align-items:baseline;gap:.5rem;padding:.55rem .95rem;background:var(--panel);border-top:1px solid var(--edge);font-size:.9rem;overflow:hidden}
.ib-ch{color:var(--dim)}
.ib-prompt{color:var(--amber)}
.ib-text{color:var(--fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.statusbar{display:flex;align-items:center;gap:.8rem;padding:.4rem .95rem;background:var(--panel2);border-top:1px solid var(--edge);font-size:.74rem;color:var(--dim)}
.statusbar .sb-m{margin:0 auto;color:var(--amber);opacity:.75}
.statusbar a{color:var(--dim)}
.statusbar a:hover{color:var(--fg)}
@media(max-width:720px){
.client{margin:0;border:0;border-radius:0;min-height:100vh}
.workspace{flex-direction:column}
.nicklist{width:auto;border-left:0;border-top:1px solid var(--edge);order:2}
.nicklist ul{display:flex;flex-wrap:wrap;gap:.1rem .9rem}
.ln{grid-template-columns:5.5em 1fr}
.ln .t{display:none}
.srvline{grid-template-columns:5.5em 1fr}
.tb-server{display:none}
}