Forge
0d405cb9
1/* Shared layout for /writing/* article pages */
2*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
3
4:root {
5 --bg: #0f172a;
6 --bg-card: #1e293b;
7 --text: #f1f5f9;
8 --text-secondary: #94a3b8;
9 --text-muted: #64748b;
10 --accent: #2dd4bf;
11 --accent-hover: #5eead4;
12 --accent-dim: rgba(45, 212, 191, 0.12);
13 --border: #334155;
14 --radius: 12px;
15 --font: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
16}
17
18html { scroll-behavior: smooth; }
19@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }
20
21body {
22 font-family: var(--font);
23 background: var(--bg);
24 color: var(--text);
25 line-height: 1.6;
26 -webkit-font-smoothing: antialiased;
27}
28
29.skip-link {
30 position: absolute;
31 top: -100%;
32 left: 1rem;
33 background: var(--accent);
34 color: var(--bg);
35 padding: 0.5rem 1rem;
36 border-radius: 0 0 var(--radius) var(--radius);
37 z-index: 100;
38 font-weight: 600;
39}
40.skip-link:focus { top: 0; }
41
42a { color: var(--accent); text-decoration: none; transition: color 0.2s; }
43a:hover { color: var(--accent-hover); }
44a:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 2px; }
45
46nav {
47 position: sticky; top: 0; z-index: 50;
48 background: rgba(15, 23, 42, 0.85);
49 backdrop-filter: blur(12px);
50 border-bottom: 1px solid var(--border);
51 padding: 0 1.5rem;
52}
53nav .nav-inner {
54 max-width: 1100px; margin: 0 auto;
55 display: flex; align-items: center; justify-content: space-between;
56 gap: 1rem;
57 min-height: 56px;
58}
59nav .logo { font-weight: 700; font-size: 1.1rem; color: var(--text); }
60nav .logo a { color: inherit; text-decoration: none; }
61nav .logo a:hover { color: var(--text); }
62nav .logo span { color: var(--accent); }
63nav .nav-right { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; justify-content: flex-end; }
64nav ul { list-style: none; display: flex; gap: 1.5rem; }
65nav ul a { color: var(--text-secondary); font-size: 0.9rem; font-weight: 500; }
66nav ul a:hover { color: var(--accent); }
67nav ul.nav-lang { gap: 0.35rem; align-items: center; }
68nav ul.nav-lang a { font-size: 0.85rem; font-weight: 600; }
69nav ul.nav-lang a[aria-current="page"] { color: var(--accent); }
70nav ul.nav-lang .nav-sep { color: var(--text-muted); padding: 0 0.1rem; font-weight: 400; pointer-events: none; }
71
72@media (max-width: 640px) {
73 nav ul:not(.nav-lang) { gap: 0.8rem; }
74 nav ul:not(.nav-lang) a { font-size: 0.8rem; }
75}
76
77.container { max-width: 1100px; margin: 0 auto; padding: 0 1.5rem; }
78
79.article-wrap {
80 padding: 2.5rem 0 4rem;
81 max-width: 720px;
82 margin: 0 auto;
83}
84
85.article-back {
86 font-size: 0.9rem;
87 margin-bottom: 1.5rem;
88 display: inline-block;
89}
90.article-back a { font-weight: 600; }
91
92.article-header {
93 margin-bottom: 2rem;
94 padding-bottom: 1.5rem;
95 border-bottom: 1px solid var(--border);
96}
97.article-header h1 {
98 font-size: clamp(1.5rem, 4vw, 2rem);
99 font-weight: 800;
100 letter-spacing: -0.02em;
101 line-height: 1.2;
102 margin-bottom: 0.75rem;
103}
104.article-meta {
105 font-size: 0.85rem;
106 color: var(--text-muted);
107}
108
109/* Optional YAML-driven disclosure (see src/writing/README-provenance.md). Off by default. */
110.article-provenance {
111 margin-bottom: 1.75rem;
112}
113.article-provenance-details {
114 background: var(--bg-card);
115 border: 1px solid var(--border);
116 border-radius: var(--radius);
117 padding: 0.75rem 1rem;
118}
119.article-provenance-summary {
120 cursor: pointer;
121 font-size: 0.9rem;
122 font-weight: 600;
123 color: var(--text-secondary);
124 list-style: none;
125}
126.article-provenance-summary::-webkit-details-marker { display: none; }
127.article-provenance-details[open] .article-provenance-summary {
128 margin-bottom: 0.65rem;
129 padding-bottom: 0.5rem;
130 border-bottom: 1px solid var(--border);
131}
132.article-provenance-dl {
133 display: grid;
134 grid-template-columns: minmax(7rem, 34%) 1fr;
135 gap: 0.35rem 1rem;
136 font-size: 0.88rem;
137 color: var(--text-secondary);
138 line-height: 1.45;
139}
140.article-provenance-dl dt {
141 color: var(--text-muted);
142 font-weight: 600;
143}
144.article-provenance-dl dd { min-width: 0; }
145.article-provenance-list {
146 margin: 0;
147 padding-left: 1.1rem;
148}
149.article-provenance-multiline {
150 white-space: pre-wrap;
151 word-break: break-word;
152}
153
154@media (max-width: 520px) {
155 .article-provenance-dl {
156 grid-template-columns: 1fr;
157 }
158 .article-provenance-dl dt { margin-top: 0.5rem; }
159 .article-provenance-dl dt:first-child { margin-top: 0; }
160}
161
162.prose {
163 font-size: 1.02rem;
164 color: var(--text-secondary);
165 line-height: 1.75;
166}
167.prose p { margin-bottom: 1.1rem; }
168.prose h2 {
169 font-size: 1.2rem;
170 font-weight: 700;
171 color: var(--text);
172 margin: 2rem 0 0.75rem;
173}
174.prose ul, .prose ol {
175 margin: 0 0 1.1rem 1.25rem;
176}
177.prose li { margin-bottom: 0.4rem; }
178.prose strong { color: var(--text); font-weight: 600; }
179.prose code {
180 font-family: ui-monospace, 'Cascadia Code', Consolas, monospace;
181 font-size: 0.9em;
182 background: rgba(30, 41, 59, 0.9);
183 padding: 0.15rem 0.4rem;
184 border-radius: 6px;
185 border: 1px solid var(--border);
186}
187
188/* Тело статьи: ссылки заметны (глобально a { text-decoration: none }). */
189.prose a {
190 color: var(--accent);
191 font-weight: 500;
192 text-decoration: underline;
193 text-decoration-color: rgba(45, 212, 191, 0.5);
194 text-underline-offset: 0.2em;
195 transition: color 0.2s, text-decoration-color 0.2s;
196}
197.prose a:hover {
198 color: var(--accent-hover);
199 text-decoration-color: rgba(94, 234, 212, 0.75);
200}
201/* Иначе **ссылка** даёт <a><strong></strong></a> и .prose strong красит текст как обычный акцент — ссылка «пропадает». */
202.prose a strong {
203 color: inherit;
204 font-weight: 600;
205}
206
207.writing-list {
208 list-style: none;
209 margin: 0;
210 padding: 0;
211}
212.writing-list li {
213 margin-bottom: 1rem;
214 padding: 1.25rem 1.5rem;
215 background: var(--bg-card);
216 border: 1px solid var(--border);
217 border-radius: var(--radius);
218 transition: border-color 0.2s;
219}
220.writing-list li:hover { border-color: rgba(45, 212, 191, 0.3); }
221.writing-list a.title {
222 font-size: 1.05rem;
223 font-weight: 650;
224 color: var(--text);
225 display: block;
226 margin-bottom: 0.35rem;
227}
228.writing-list a.title:hover { color: var(--accent); }
229.writing-list .blurb {
230 font-size: 0.9rem;
231 color: var(--text-secondary);
232 line-height: 1.5;
233}
234
235.page-title {
236 font-size: 1.75rem;
237 font-weight: 800;
238 margin-bottom: 0.5rem;
239 letter-spacing: -0.02em;
240}
241.page-intro {
242 color: var(--text-secondary);
243 margin-bottom: 2rem;
244 max-width: 560px;
245}
246
247.tags-browse {
248 font-size: 0.9rem;
249 margin-bottom: 1rem;
250 font-weight: 600;
251}
252
253.tag-cloud {
254 list-style: none;
255 margin: 0 0 2rem;
256 padding: 0;
257 display: flex;
258 flex-wrap: wrap;
259 gap: 0.5rem 0.75rem;
260 align-items: baseline;
261}
262.tag-cloud li {
263 display: inline-flex;
264 align-items: center;
265 gap: 0.35rem;
266}
267.tag-count {
268 font-size: 0.75rem;
269 color: var(--text-muted);
270 font-weight: 600;
271}
272
273.article-tags {
274 margin-top: 0.75rem;
275 display: flex;
276 flex-wrap: wrap;
277 gap: 0.4rem;
278}
279
280.tag-pill {
281 display: inline-block;
282 font-size: 0.78rem;
283 font-weight: 600;
284 padding: 0.2rem 0.55rem;
285 border-radius: 999px;
286 background: var(--accent-dim);
287 border: 1px solid rgba(45, 212, 191, 0.35);
288 color: var(--accent);
289 text-decoration: none !important;
290 line-height: 1.3;
291}
292.tag-pill:hover {
293 color: var(--accent-hover);
294 border-color: rgba(94, 234, 212, 0.45);
295}
296.tag-pill--sm {
297 font-size: 0.72rem;
298 padding: 0.12rem 0.45rem;
299 font-weight: 600;
300}
301
302.writing-item-tags {
303 margin: 0.35rem 0 0.5rem;
304 display: flex;
305 flex-wrap: wrap;
306 gap: 0.35rem;
307}
308
309.solutions-menu {
310 margin: 0.4rem 0 1rem;
311 display: flex;
312 flex-wrap: wrap;
313 gap: 0.4rem 0.8rem;
314 font-size: 0.86rem;
315}
316.solutions-menu a {
317 color: var(--text-secondary);
318 border-bottom: 1px dashed rgba(148, 163, 184, 0.35);
319}
320.solutions-menu a:hover,
321.solutions-menu a[aria-current="page"] {
322 color: var(--accent);
323 border-bottom-color: rgba(45, 212, 191, 0.55);
324}
325
326.tags-index-list {
327 list-style: none;
328 margin: 0;
329 padding: 0;
330}
331.tags-index-list li {
332 margin-bottom: 0.5rem;
333 font-size: 1rem;
334}
335.tags-index-list a {
336 font-weight: 600;
337}
338.tags-index-count {
339 color: var(--text-muted);
340 font-size: 0.9rem;
341 margin-left: 0.35rem;
342}
343
344footer {
345 padding: 2.5rem 0;
346 border-top: 1px solid var(--border);
347 text-align: center;
348 color: var(--text-secondary);
349 font-size: 0.85rem;
350}
351.contact-links {
352 display: flex; justify-content: center; gap: 2rem;
353 margin-bottom: 1rem; flex-wrap: wrap;
354}
355.contact-links a { font-weight: 500; font-size: 0.95rem; }
356
357.sr-only {
358 position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
359 overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0;
360}
361
View only · write via MCP/CIDE