File size: 11,248 Bytes
627d03f 493b437 627d03f 493b437 627d03f 53395c6 493b437 627d03f 493b437 627d03f 493b437 53395c6 493b437 53395c6 e131516 493b437 53395c6 e131516 493b437 53395c6 89c9a68 493b437 53395c6 493b437 53395c6 493b437 53395c6 493b437 53395c6 493b437 53395c6 5d1686b e131516 53395c6 5d1686b 53395c6 5d1686b 53395c6 5d1686b 493b437 53395c6 493b437 53395c6 493b437 53395c6 493b437 53395c6 493b437 53395c6 493b437 53395c6 493b437 53395c6 493b437 53395c6 493b437 627d03f 493b437 0e13237 493b437 627d03f 53395c6 493b437 0e13237 493b437 0e13237 493b437 0e13237 493b437 53395c6 493b437 e131516 493b437 53395c6 493b437 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | /* Fastino demo palette: cool paper, violet-black ink, orange identity, purple
support. Orange is the brand accent; purple must stay subordinate. */
@import url("https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&display=swap");
/* 0xProto Nerd: not on Google Fonts, use the Nerd Fonts CDN, fall back gracefully */
@import url("https://www.nerdfonts.com/assets/css/webfont.css");
:root {
--paper: #F4F6F8; /* page background */
--card: #FFFFFF; /* panel fills */
--greige: #ECEFF3; /* hover fills, subtle blocks */
--ash: #E0E5EA; /* borders, dividers */
--ink: #100E1C; /* violet-black, headings + body */
--ink-soft: rgba(16, 14, 28, 0.68);
--ink-faint: #5F6874; /* AA 4.8:1 on paper, 5.2 on card */
--warm-gray: #B8BFC7; /* border accents */
--orange: #FF6A2A; /* identity: fills, active strokes. Never on text. */
--orange-deep: #C14A00; /* orange when it must be text on light bg; AA 4.7:1 */
--purple: #7038FF; /* support accent: hover, focus, span hue */
--ok: #0C7A4C;
--ok-bg: rgba(12, 122, 76, 0.12);
--neg: #C2183B;
--neg-bg: rgba(194, 24, 59, 0.10);
--neu: #55606E;
--neu-bg: rgba(85, 96, 110, 0.10);
--font-head: "Geist", "Helvetica Neue", Arial, sans-serif;
--font-body: "Geist", "Helvetica Neue", Arial, sans-serif;
--font-mono: "0xProto Nerd Font", "0xProto Nerd", "JetBrains Mono", ui-monospace, Menlo, monospace;
--ease-out: cubic-bezier(0.23, 1, 0.32, 1);
--radius: 10px;
--radius-s: 6px;
/* span label palette; always paired with a text label */
--c0: #FF6A2A; --c1: #7038FF; --c2: #0B7A78; --c3: #C2183B;
--c4: #4B4FE0; --c5: #8A6100; --c6: #0B68C2; --c7: #6E5B3E;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: var(--font-body);
background: var(--paper);
color: var(--ink);
font-size: 15px;
line-height: 1.55;
-webkit-font-smoothing: antialiased;
}
.wrap { max-width: 1160px; margin: 0 auto; padding: 32px 22px 56px; }
/* ---- intro ---- */
.site-intro { display: flex; align-items: flex-end; gap: 24px; }
.intro-copy { flex: 1; min-width: 0; }
.site-intro h1 {
font-family: var(--font-head); font-weight: 700;
font-size: 34px; letter-spacing: -0.015em; line-height: 1.15;
}
.site-intro h1 em { font-style: normal; color: var(--orange-deep); }
.site-intro .sub { margin-top: 6px; color: var(--ink-soft); font-size: 15px; max-width: 56ch; }
.intro-mascot { flex-shrink: 0; user-select: none; -webkit-user-drag: none; }
@media (max-width: 860px) { .intro-mascot { width: 84px; height: 84px; align-self: flex-start; } }
/* ---- workspace ---- */
.workspace { display: grid; grid-template-columns: 5fr 7fr; gap: 16px; align-items: start; }
.workspace.single { grid-template-columns: 1fr; }
.card {
background: var(--greige); border: 1px solid var(--ash); border-radius: var(--radius);
display: flex; flex-direction: column;
}
.panel-header {
display: flex; align-items: flex-start; justify-content: space-between; gap: 12px;
padding: 13px 16px 10px; border-bottom: 1px solid var(--ash);
}
.panel-header h2 { font-size: 14px; font-weight: 600; }
.panel-header p { font-size: 12px; color: var(--ink-faint); margin-top: 1px; }
textarea, .editor {
flex: 1; width: 100%; border: 0; resize: vertical; min-height: 160px;
padding: 14px 16px; background: var(--card);
font: inherit; color: var(--ink); border-radius: 0 0 var(--radius) var(--radius);
}
textarea:focus, .editor:focus { outline: 2px solid var(--ash); outline-offset: -2px; }
textarea:focus-visible { outline: 2px solid var(--orange-deep); }
/* ---- example selector: pill chips ---- */
.examples-panel { margin: 44px 0 14px; }
.examples-label {
font-size: 11px; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase;
color: var(--ink-faint); display: block; margin-bottom: 8px;
}
.example-list { display: flex; flex-wrap: wrap; gap: 8px; }
.ex {
font: inherit; font-size: 13px; font-weight: 500; color: var(--ink);
background: var(--card); border: 1px solid var(--ash); border-radius: 99px;
padding: 6px 14px; cursor: pointer;
transition: background 140ms var(--ease-out), border-color 140ms var(--ease-out), transform 80ms var(--ease-out);
}
.ex:hover { background: var(--greige); border-color: var(--warm-gray); }
.ex:active { transform: scale(0.97); }
.ex:focus-visible { outline: 2px solid var(--orange); outline-offset: 2px; }
.ex.active {
background: var(--ink); color: var(--paper); border-color: var(--ink);
}
/* ---- output body ---- */
.output-body {
flex: 1; padding: 14px 16px; background: var(--card);
font-size: 15px; line-height: 1.95; white-space: pre-wrap; word-break: break-word;
overflow-y: auto;
}
.output-empty { color: var(--ink-faint); font-size: 13.5px; }
.output-empty strong { display: block; color: var(--ink-soft); font-weight: 600; font-size: 15px; margin-bottom: 4px; }
/* ---- inline span highlighting (staggered reveal) ---- */
.span {
border-radius: var(--radius-s); padding: 1px 2px; margin: 0 1px;
background: color-mix(in srgb, var(--span-color) 20%, transparent);
border-bottom: 2px solid var(--span-color);
cursor: pointer; position: relative;
opacity: 0; transform: translateY(3px);
animation: span-in 380ms var(--ease-out) forwards;
animation-delay: calc(var(--i) * 55ms);
transition: background 140ms var(--ease-out);
}
.span:hover { background: color-mix(in srgb, var(--span-color) 30%, transparent); }
.span.selected {
background: color-mix(in srgb, var(--span-color) 40%, transparent);
box-shadow: 0 0 0 1px var(--span-color);
}
@keyframes span-in { to { opacity: 1; transform: translateY(0); } }
/* attribute badges attached inline after a span; tone colors resolved in JS
(semantic tone wins, else the span's label color at low alpha) */
.attr {
display: inline-block; vertical-align: super;
font-family: var(--font-mono); font-size: 10px; font-weight: 600;
border-radius: 3px; padding: 0 4px; margin-left: 2px; line-height: 1.7;
color: var(--badge-text); background: var(--badge-bg);
border: 1px solid var(--badge-border);
opacity: 0; animation: span-in 320ms var(--ease-out) forwards;
animation-delay: calc(var(--i) * 55ms + 160ms);
}
/* ---- span inspector (detail panel under the text) ---- */
.inspector {
border-top: 1px solid var(--ash);
padding: 12px 16px 14px;
background: var(--card);
border-radius: 0 0 var(--radius) var(--radius);
}
.inspector-head { display: flex; align-items: baseline; gap: 10px; margin-bottom: 10px; }
.inspector-head .span-text { font-size: 16px; font-weight: 600; }
.inspector-head .span-label {
font-family: var(--font-mono); font-size: 12px; font-weight: 600;
color: var(--span-color, var(--ink)); background: color-mix(in srgb, var(--span-color, var(--warm-gray)) 14%, transparent);
border: 1px solid var(--span-color, var(--warm-gray));
border-radius: var(--radius-s); padding: 1px 7px;
}
.inspector-head .span-score { font-family: var(--font-mono); font-size: 12px; color: var(--ink-faint); margin-left: auto; }
.inspector-groups { display: grid; grid-template-columns: repeat(auto-fit, minmax(168px, 1fr)); gap: 10px; }
.attr-group { border: 1px solid var(--ash); border-radius: var(--radius-s); padding: 9px 11px; background: var(--greige); }
.attr-group-name { font-family: var(--font-mono); font-size: 11px; color: var(--ink-faint); text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: 7px; }
.attr-row { display: flex; align-items: baseline; gap: 8px; font-size: 13px; padding: 2px 0; }
.attr-row .attr-label { font-weight: 500; }
.attr-row .attr-score { margin-left: auto; font-family: var(--font-mono); font-size: 11px; color: var(--ink-faint); }
.attr-meter { height: 3px; border-radius: 2px; background: var(--ash); margin-top: 3px; overflow: hidden; }
.attr-meter i { display: block; height: 100%; background: var(--span-color, var(--orange)); border-radius: 2px; }
/* ---- legend / stats footer ---- */
.controls { padding: 10px 16px 13px; border-top: 1px solid var(--ash); display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.legend-chip {
display: inline-flex; align-items: center; gap: 6px;
font-size: 12px; font-weight: 500; color: var(--ink);
background: var(--paper); border: 1px solid var(--ash); border-radius: 99px; padding: 3px 10px; cursor: pointer;
}
.legend-swatch { width: 9px; height: 9px; border-radius: 3px; background: var(--span-color); }
.legend-count { font-family: var(--font-mono); color: var(--ink-faint); font-size: 11px; }
.stats { display: flex; gap: 18px; margin-left: auto; font-size: 12px; color: var(--ink-faint); }
.stats strong { font-family: var(--font-mono); font-weight: 500; color: var(--ink); margin-left: 4px; }
/* ---- schema code: notebook cell ---- */
.code-toggle {
font: inherit; font-size: 12px; font-weight: 500; color: var(--ink-soft);
background: var(--paper); border: 1px solid var(--ash); border-radius: var(--radius-s);
padding: 4px 11px; cursor: pointer; display: inline-flex; align-items: center; gap: 5px;
transition: background 160ms var(--ease-out);
}
.code-toggle:hover { background: var(--greige); }
.code-toggle:focus-visible { outline: 2px solid var(--orange); outline-offset: 2px; }
.code-cell {
margin: 0 16px 14px; padding: 0;
background: var(--card); border: 1px solid var(--ash); border-radius: var(--radius);
overflow: hidden;
}
.code-cell-bar {
display: flex; align-items: center; gap: 12px;
padding: 10px 14px 8px;
border-bottom: 1px solid var(--ash);
}
.cell-prompt {
font-family: var(--font-mono); font-size: 12px; font-weight: 500;
color: var(--ink-faint); flex-shrink: 0;
}
.copy-btn {
margin-left: auto; font: inherit; font-family: var(--font-mono); font-size: 11px;
color: var(--ink-soft); background: var(--paper); border: 1px solid var(--ash);
border-radius: 4px; padding: 3px 10px; cursor: pointer;
transition: background 140ms var(--ease-out), border-color 140ms var(--ease-out);
}
.copy-btn:hover { background: var(--greige); border-color: var(--warm-gray); }
.copy-btn:focus-visible { outline: 2px solid var(--orange); outline-offset: 2px; }
.copy-done { color: var(--ok); }
.code-panel {
margin: 0; padding: 12px 14px;
background: var(--card); color: var(--ink);
font-family: var(--font-mono); font-size: 12.5px; line-height: 1.6;
white-space: pre; overflow-x: auto;
}
.cell-out {
display: flex; align-items: center; gap: 12px;
padding: 8px 14px 10px; border-top: 1px solid var(--ash);
background: var(--paper);
}
.cell-out-hint {
font-family: var(--font-mono); font-size: 12px; color: var(--warm-gray);
}
.footnote { margin-top: 20px; font-size: 12px; color: var(--ink-faint); }
.footnote a { color: var(--ink-soft); }
.labs-mark { color: var(--ink); font-weight: 500; text-decoration: none; border-bottom: 1px solid var(--ash); }
.labs-mark:hover { color: var(--orange-deep); border-bottom-color: var(--orange-deep); }
@media (max-width: 860px) {
.workspace { grid-template-columns: 1fr; }
.inspector-groups { grid-template-columns: 1fr; }
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
}
|