doc-fetch-cli 2.0.4 → 2.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/bin/doc-fetch_darwin_amd64 +0 -0
- package/bin/doc-fetch_windows_amd64.exe +0 -0
- package/doc-fetch +0 -0
- package/doc-fetch_darwin_amd64 +0 -0
- package/doc-fetch_darwin_arm64 +0 -0
- package/doc-fetch_linux_amd64 +0 -0
- package/doc-fetch_windows_amd64.exe +0 -0
- package/package.json +1 -1
- package/website/BLOG-SETUP-SUMMARY.md +385 -0
- package/website/DEPLOYMENT.md +189 -0
- package/website/LAUNCH-CHECKLIST.md +134 -0
- package/website/README.md +75 -0
- package/website/SEO-STRATEGY.md +347 -0
- package/website/URL-STRUCTURE.md +334 -0
- package/website/WEBSITE-SUMMARY.md +246 -0
- package/website/package-lock.json +1628 -0
- package/website/package.json +39 -0
- package/website/pnpm-lock.yaml +1061 -0
- package/website/src/app.d.ts +13 -0
- package/website/src/app.html +11 -0
- package/website/src/lib/actions/addCopyButtons.ts +73 -0
- package/website/src/lib/assets/favicon.svg +1 -0
- package/website/src/lib/components/CopyCodeButton.svelte +97 -0
- package/website/src/lib/components/DarkModeToggle.svelte +140 -0
- package/website/src/lib/components/ReadingProgress.svelte +36 -0
- package/website/src/lib/components/RelatedPosts.svelte +151 -0
- package/website/src/lib/components/TableOfContents.svelte +184 -0
- package/website/src/lib/index.ts +1 -0
- package/website/src/lib/posts/convert-docs-to-markdown.md +506 -0
- package/website/src/routes/+layout.svelte +59 -0
- package/website/src/routes/+page.svelte +1033 -0
- package/website/src/routes/about/+page.svelte +607 -0
- package/website/src/routes/blog/+page.svelte +486 -0
- package/website/src/routes/blog/[slug]/+page.svelte +988 -0
- package/website/src/routes/blog/[slug]/+page.ts +53 -0
- package/website/src/routes/sitemap.xml/+server.ts +62 -0
- package/website/static/favicon.svg +10 -0
- package/website/static/og.png +2 -0
- package/website/static/og.svg +26 -0
- package/website/static/robots.txt +43 -0
- package/website/svelte.config.js +13 -0
- package/website/tsconfig.json +20 -0
- package/website/vite.config.ts +6 -0
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from 'svelte';
|
|
3
|
+
|
|
4
|
+
let scrolled = false;
|
|
5
|
+
|
|
6
|
+
onMount(() => {
|
|
7
|
+
const handleScroll = () => {
|
|
8
|
+
scrolled = window.scrollY > 50;
|
|
9
|
+
};
|
|
10
|
+
window.addEventListener('scroll', handleScroll);
|
|
11
|
+
return () => window.removeEventListener('scroll', handleScroll);
|
|
12
|
+
});
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<svelte:head>
|
|
16
|
+
<title>About DocFetch - Built by AlphaTechini</title>
|
|
17
|
+
<meta name="description" content="DocFetch is built by AlphaTechini, a senior infrastructure engineer specializing in Web2+Web3 systems and AI orchestration." />
|
|
18
|
+
<meta name="author" content="AlphaTechini" />
|
|
19
|
+
|
|
20
|
+
<!-- Open Graph -->
|
|
21
|
+
<meta property="og:type" content="profile" />
|
|
22
|
+
<meta property="og:title" content="About DocFetch" />
|
|
23
|
+
<meta property="og:description" content="Built by a senior infrastructure engineer with deep expertise in distributed systems" />
|
|
24
|
+
|
|
25
|
+
<!-- Structured Data: Person Schema -->
|
|
26
|
+
<script type="application/ld+json">
|
|
27
|
+
{
|
|
28
|
+
"@context": "https://schema.org",
|
|
29
|
+
"@type": "Person",
|
|
30
|
+
"name": "AlphaTechini",
|
|
31
|
+
"url": "https://github.com/AlphaTechini",
|
|
32
|
+
"sameAs": [
|
|
33
|
+
"https://github.com/AlphaTechini",
|
|
34
|
+
"https://www.npmjs.com/~alphatechini",
|
|
35
|
+
"https://pypi.org/user/alphatechini/"
|
|
36
|
+
],
|
|
37
|
+
"jobTitle": "Senior Infrastructure Engineer",
|
|
38
|
+
"worksFor": {
|
|
39
|
+
"@type": "Organization",
|
|
40
|
+
"name": "Open Source"
|
|
41
|
+
},
|
|
42
|
+
"knowsAbout": [
|
|
43
|
+
"Backend Engineering",
|
|
44
|
+
"Web3 Infrastructure",
|
|
45
|
+
"AI Orchestration",
|
|
46
|
+
"Distributed Systems",
|
|
47
|
+
"Developer Tools"
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
|
+
<!-- Structured Data: SoftwareApplication -->
|
|
53
|
+
<script type="application/ld+json">
|
|
54
|
+
{
|
|
55
|
+
"@context": "https://schema.org",
|
|
56
|
+
"@type": "SoftwareApplication",
|
|
57
|
+
"name": "DocFetch",
|
|
58
|
+
"applicationCategory": "DeveloperApplication",
|
|
59
|
+
"author": {
|
|
60
|
+
"@type": "Person",
|
|
61
|
+
"name": "AlphaTechini"
|
|
62
|
+
},
|
|
63
|
+
"description": "Transform documentation sites into AI-ready markdown",
|
|
64
|
+
"url": "https://docfetch.dev",
|
|
65
|
+
"dateCreated": "2026-02-20",
|
|
66
|
+
"version": "2.0.4"
|
|
67
|
+
}
|
|
68
|
+
</script>
|
|
69
|
+
</svelte:head>
|
|
70
|
+
|
|
71
|
+
<div class="container">
|
|
72
|
+
<header class={scrolled ? 'scrolled' : ''}>
|
|
73
|
+
<nav>
|
|
74
|
+
<div class="logo">
|
|
75
|
+
<a href="/">
|
|
76
|
+
<span class="logo-icon">📚</span>
|
|
77
|
+
<span class="logo-text">DocFetch</span>
|
|
78
|
+
</a>
|
|
79
|
+
</div>
|
|
80
|
+
<div class="nav-links">
|
|
81
|
+
<a href="/#features">Features</a>
|
|
82
|
+
<a href="/#installation">Installation</a>
|
|
83
|
+
<a href="/blog">Blog</a>
|
|
84
|
+
<a href="/about" class="active">About</a>
|
|
85
|
+
<a href="https://github.com/AlphaTechini/doc-fetch" target="_blank" rel="noopener noreferrer">GitHub →</a>
|
|
86
|
+
</div>
|
|
87
|
+
</nav>
|
|
88
|
+
</header>
|
|
89
|
+
|
|
90
|
+
<main>
|
|
91
|
+
<section class="hero">
|
|
92
|
+
<h1>About DocFetch</h1>
|
|
93
|
+
<p class="subtitle">
|
|
94
|
+
Built by a senior infrastructure engineer to solve a real problem in AI development.
|
|
95
|
+
</p>
|
|
96
|
+
</section>
|
|
97
|
+
|
|
98
|
+
<section class="content">
|
|
99
|
+
<article>
|
|
100
|
+
<h2>The Problem</h2>
|
|
101
|
+
<p>
|
|
102
|
+
When building AI agents and RAG systems, I constantly hit the same wall:
|
|
103
|
+
<strong>LLMs can't navigate documentation websites like humans do.</strong>
|
|
104
|
+
</p>
|
|
105
|
+
<p>
|
|
106
|
+
They can't click through sidebars, jump between related sections, or understand
|
|
107
|
+
the information architecture of documentation sites. This meant manually
|
|
108
|
+
copy-pasting dozens of pages to give my AI agents complete context.
|
|
109
|
+
</p>
|
|
110
|
+
<p>
|
|
111
|
+
This is unsustainable and error-prone. There had to be a better way.
|
|
112
|
+
</p>
|
|
113
|
+
|
|
114
|
+
<h2>The Solution</h2>
|
|
115
|
+
<p>
|
|
116
|
+
DocFetch automates the entire process. One command converts an entire
|
|
117
|
+
documentation website into clean, structured markdown with semantic indexing
|
|
118
|
+
(llm.txt) that helps AI agents navigate efficiently.
|
|
119
|
+
</p>
|
|
120
|
+
<p>
|
|
121
|
+
It's not just a scraper—it's purpose-built for AI/LLM workflows with features like:
|
|
122
|
+
</p>
|
|
123
|
+
<ul>
|
|
124
|
+
<li>Intelligent page classification (API, GUIDE, TUTORIAL, EXAMPLE)</li>
|
|
125
|
+
<li>Semantic descriptions for each section</li>
|
|
126
|
+
<li>Token-efficient output (no HTML bloat)</li>
|
|
127
|
+
<li>Respectful crawling (robots.txt, rate limiting)</li>
|
|
128
|
+
<li>Cross-platform support (Python, Node.js, Go, binaries)</li>
|
|
129
|
+
</ul>
|
|
130
|
+
|
|
131
|
+
<h2>About the Author</h2>
|
|
132
|
+
<div class="author-box">
|
|
133
|
+
<div class="author-info">
|
|
134
|
+
<h3>AlphaTechini</h3>
|
|
135
|
+
<p class="role">Senior Infrastructure Engineer</p>
|
|
136
|
+
<p>
|
|
137
|
+
Specializing in Web2 + Web3 systems integration, AI orchestration,
|
|
138
|
+
and distributed automation. Deep expertise in building fault-tolerant
|
|
139
|
+
event systems and developer tools.
|
|
140
|
+
</p>
|
|
141
|
+
<p>
|
|
142
|
+
<strong>Current focus:</strong> Building infrastructure-level AI
|
|
143
|
+
integrations that reduce human dependency and create strategic leverage.
|
|
144
|
+
</p>
|
|
145
|
+
|
|
146
|
+
<div class="links">
|
|
147
|
+
<a href="https://github.com/AlphaTechini" target="_blank" rel="noopener noreferrer" class="link">
|
|
148
|
+
<span class="icon">🐙</span> GitHub
|
|
149
|
+
</a>
|
|
150
|
+
<a href="https://www.npmjs.com/~alphatechini" target="_blank" rel="noopener noreferrer" class="link">
|
|
151
|
+
<span class="icon">📦</span> NPM
|
|
152
|
+
</a>
|
|
153
|
+
<a href="https://pypi.org/user/alphatechini/" target="_blank" rel="noopener noreferrer" class="link">
|
|
154
|
+
<span class="icon">🐍</span> PyPI
|
|
155
|
+
</a>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
|
|
160
|
+
<h2>Expertise & Technologies</h2>
|
|
161
|
+
<div class="tech-grid">
|
|
162
|
+
<div class="tech-category">
|
|
163
|
+
<h3>Backend</h3>
|
|
164
|
+
<ul>
|
|
165
|
+
<li>Node.js + Fastify</li>
|
|
166
|
+
<li>Go (systems programming)</li>
|
|
167
|
+
<li>Python</li>
|
|
168
|
+
<li>MongoDB</li>
|
|
169
|
+
</ul>
|
|
170
|
+
</div>
|
|
171
|
+
|
|
172
|
+
<div class="tech-category">
|
|
173
|
+
<h3>Frontend</h3>
|
|
174
|
+
<ul>
|
|
175
|
+
<li>Svelte + SvelteKit</li>
|
|
176
|
+
<li>Tailwind CSS</li>
|
|
177
|
+
<li>Plotly.js</li>
|
|
178
|
+
</ul>
|
|
179
|
+
</div>
|
|
180
|
+
|
|
181
|
+
<div class="tech-category">
|
|
182
|
+
<h3>Web3</h3>
|
|
183
|
+
<ul>
|
|
184
|
+
<li>Solidity</li>
|
|
185
|
+
<li>ERC-20, ERC-721</li>
|
|
186
|
+
<li>Uniswap Integration</li>
|
|
187
|
+
<li>On-chain Event Systems</li>
|
|
188
|
+
</ul>
|
|
189
|
+
</div>
|
|
190
|
+
|
|
191
|
+
<div class="tech-category">
|
|
192
|
+
<h3>AI/ML</h3>
|
|
193
|
+
<ul>
|
|
194
|
+
<li>LLM Orchestration</li>
|
|
195
|
+
<li>RAG Systems</li>
|
|
196
|
+
<li>Agent Architecture</li>
|
|
197
|
+
<li>Prompt Engineering</li>
|
|
198
|
+
</ul>
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
|
|
202
|
+
<h2>Philosophy</h2>
|
|
203
|
+
<blockquote>
|
|
204
|
+
"Build control layers, not features. Own infrastructure where possible.
|
|
205
|
+
Prefer composability over abstraction. Operate as startup founder +
|
|
206
|
+
systems engineer + security auditor simultaneously."
|
|
207
|
+
</blockquote>
|
|
208
|
+
|
|
209
|
+
<p>
|
|
210
|
+
This philosophy shapes every aspect of DocFetch:
|
|
211
|
+
</p>
|
|
212
|
+
<ul>
|
|
213
|
+
<li><strong>No vendor lock-in:</strong> Works with any LLM provider</li>
|
|
214
|
+
<li><strong>Own your infra:</strong> Self-hosted, open source</li>
|
|
215
|
+
<li><strong>Composable:</strong> CLI tool that integrates with existing workflows</li>
|
|
216
|
+
<li><strong>Security-aware:</strong> Respects robots.txt, rate limiting, SSRF protection</li>
|
|
217
|
+
</ul>
|
|
218
|
+
|
|
219
|
+
<h2>Projects</h2>
|
|
220
|
+
<div class="projects">
|
|
221
|
+
<div class="project">
|
|
222
|
+
<h3>DocFetch</h3>
|
|
223
|
+
<p>
|
|
224
|
+
Transform documentation sites into AI-ready markdown with intelligent
|
|
225
|
+
LLM.txt indexing. Published on NPM, PyPI, and Go modules.
|
|
226
|
+
</p>
|
|
227
|
+
<a href="https://github.com/AlphaTechini/doc-fetch" target="_blank" rel="noopener noreferrer">View on GitHub →</a>
|
|
228
|
+
</div>
|
|
229
|
+
|
|
230
|
+
<div class="project">
|
|
231
|
+
<h3>Reactive Network Trading Portfolio dApp</h3>
|
|
232
|
+
<p>
|
|
233
|
+
ERC-20 limited universe trading platform with stop-loss, auto-sell,
|
|
234
|
+
and RCS automation triggers. Built with Svelte + Fastify.
|
|
235
|
+
</p>
|
|
236
|
+
<a href="https://github.com/AlphaTechini/Reactive" target="_blank" rel="noopener noreferrer">View on GitHub →</a>
|
|
237
|
+
</div>
|
|
238
|
+
|
|
239
|
+
<div class="project">
|
|
240
|
+
<h3>Fault-Tolerant On-Chain Event Webhook Service</h3>
|
|
241
|
+
<p>
|
|
242
|
+
At-least-once delivery system for blockchain events with replayability,
|
|
243
|
+
ABI-only decoding, and operational reliability focus.
|
|
244
|
+
</p>
|
|
245
|
+
<a href="https://github.com/AlphaTechini/Fault-Tolerant-On-Chain-Event-Webhook-Service" target="_blank" rel="noopener noreferrer">View on GitHub →</a>
|
|
246
|
+
</div>
|
|
247
|
+
|
|
248
|
+
<div class="project">
|
|
249
|
+
<h3>xCreator (AI Social Post Engine)</h3>
|
|
250
|
+
<p>
|
|
251
|
+
Algorithm-aware social post generation with strict prompt template
|
|
252
|
+
injection and cost-controlled AI usage.
|
|
253
|
+
</p>
|
|
254
|
+
<a href="https://github.com/AlphaTechini/xCreator" target="_blank" rel="noopener noreferrer">View on GitHub →</a>
|
|
255
|
+
</div>
|
|
256
|
+
</div>
|
|
257
|
+
|
|
258
|
+
<h2>Contact & Contributions</h2>
|
|
259
|
+
<p>
|
|
260
|
+
DocFetch is open source and community-driven. Contributions, issues, and
|
|
261
|
+
feature requests are welcome!
|
|
262
|
+
</p>
|
|
263
|
+
<div class="cta-buttons">
|
|
264
|
+
<a href="https://github.com/AlphaTechini/doc-fetch" target="_blank" rel="noopener noreferrer" class="btn primary">
|
|
265
|
+
Contribute on GitHub
|
|
266
|
+
</a>
|
|
267
|
+
<a href="https://github.com/AlphaTechini/doc-fetch/issues" target="_blank" rel="noopener noreferrer" class="btn secondary">
|
|
268
|
+
Report Issue
|
|
269
|
+
</a>
|
|
270
|
+
</div>
|
|
271
|
+
</article>
|
|
272
|
+
</section>
|
|
273
|
+
</main>
|
|
274
|
+
|
|
275
|
+
<footer>
|
|
276
|
+
<div class="footer-content">
|
|
277
|
+
<div class="footer-left">
|
|
278
|
+
<p>Built with ❤️ for AI developers who deserve better documentation access</p>
|
|
279
|
+
<p class="copyright">© 2026 AlphaTechini. MIT License.</p>
|
|
280
|
+
</div>
|
|
281
|
+
<div class="footer-right">
|
|
282
|
+
<a href="https://github.com/AlphaTechini/doc-fetch" target="_blank" rel="noopener noreferrer">GitHub</a>
|
|
283
|
+
<a href="/blog">Blog</a>
|
|
284
|
+
<a href="/about">About</a>
|
|
285
|
+
</div>
|
|
286
|
+
</div>
|
|
287
|
+
</footer>
|
|
288
|
+
</div>
|
|
289
|
+
|
|
290
|
+
<style>
|
|
291
|
+
:global(:root) {
|
|
292
|
+
--bg-primary: #ffffff;
|
|
293
|
+
--bg-secondary: #f8f9fa;
|
|
294
|
+
--text-primary: #1a1a1a;
|
|
295
|
+
--text-secondary: #4a4a4a;
|
|
296
|
+
--text-muted: #6b7280;
|
|
297
|
+
--accent: #0066cc;
|
|
298
|
+
--accent-hover: #0052a3;
|
|
299
|
+
--border: #e5e7eb;
|
|
300
|
+
--max-width: 800px;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
:global(body) {
|
|
304
|
+
margin: 0;
|
|
305
|
+
padding: 0;
|
|
306
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
|
|
307
|
+
background: var(--bg-primary);
|
|
308
|
+
color: var(--text-primary);
|
|
309
|
+
line-height: 1.7;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.container {
|
|
313
|
+
max-width: var(--max-width);
|
|
314
|
+
margin: 0 auto;
|
|
315
|
+
padding: 0 2rem;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
header {
|
|
319
|
+
position: fixed;
|
|
320
|
+
top: 0;
|
|
321
|
+
left: 0;
|
|
322
|
+
right: 0;
|
|
323
|
+
background: rgba(255, 255, 255, 0.95);
|
|
324
|
+
backdrop-filter: blur(10px);
|
|
325
|
+
border-bottom: 1px solid transparent;
|
|
326
|
+
z-index: 1000;
|
|
327
|
+
transition: all 0.3s ease;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
header.scrolled {
|
|
331
|
+
border-bottom-color: var(--border);
|
|
332
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
nav {
|
|
336
|
+
display: flex;
|
|
337
|
+
justify-content: space-between;
|
|
338
|
+
align-items: center;
|
|
339
|
+
padding: 1rem 2rem;
|
|
340
|
+
max-width: 1200px;
|
|
341
|
+
margin: 0 auto;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
.logo a {
|
|
345
|
+
display: flex;
|
|
346
|
+
align-items: center;
|
|
347
|
+
gap: 0.5rem;
|
|
348
|
+
font-weight: 700;
|
|
349
|
+
font-size: 1.25rem;
|
|
350
|
+
text-decoration: none;
|
|
351
|
+
color: var(--text-primary);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
.logo-icon {
|
|
355
|
+
font-size: 1.5rem;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
.nav-links {
|
|
359
|
+
display: flex;
|
|
360
|
+
gap: 2rem;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
.nav-links a {
|
|
364
|
+
color: var(--text-secondary);
|
|
365
|
+
text-decoration: none;
|
|
366
|
+
font-size: 0.95rem;
|
|
367
|
+
transition: color 0.2s;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
.nav-links a:hover,
|
|
371
|
+
.nav-links a.active {
|
|
372
|
+
color: var(--accent);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
.hero {
|
|
376
|
+
padding: 8rem 0 3rem;
|
|
377
|
+
text-align: center;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
h1 {
|
|
381
|
+
font-size: 3rem;
|
|
382
|
+
font-weight: 800;
|
|
383
|
+
margin: 0 0 1rem;
|
|
384
|
+
letter-spacing: -0.02em;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
.subtitle {
|
|
388
|
+
font-size: 1.25rem;
|
|
389
|
+
color: var(--text-secondary);
|
|
390
|
+
max-width: 700px;
|
|
391
|
+
margin: 0 auto;
|
|
392
|
+
line-height: 1.7;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.content {
|
|
396
|
+
padding: 3rem 0 5rem;
|
|
397
|
+
border-top: 1px solid var(--border);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
h2 {
|
|
401
|
+
font-size: 2rem;
|
|
402
|
+
margin-top: 3rem;
|
|
403
|
+
margin-bottom: 1.5rem;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
h3 {
|
|
407
|
+
font-size: 1.4rem;
|
|
408
|
+
margin-top: 2rem;
|
|
409
|
+
margin-bottom: 1rem;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
p {
|
|
413
|
+
margin-bottom: 1.5rem;
|
|
414
|
+
color: var(--text-secondary);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
ul {
|
|
418
|
+
margin-bottom: 1.5rem;
|
|
419
|
+
padding-left: 2rem;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
li {
|
|
423
|
+
margin-bottom: 0.75rem;
|
|
424
|
+
color: var(--text-secondary);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
blockquote {
|
|
428
|
+
border-left: 3px solid var(--accent);
|
|
429
|
+
padding-left: 1.5rem;
|
|
430
|
+
margin: 2rem 0;
|
|
431
|
+
font-style: italic;
|
|
432
|
+
background: var(--bg-secondary);
|
|
433
|
+
padding: 1.5rem;
|
|
434
|
+
border-radius: 0 6px 6px 0;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
.author-box {
|
|
438
|
+
background: var(--bg-secondary);
|
|
439
|
+
padding: 2rem;
|
|
440
|
+
border-radius: 8px;
|
|
441
|
+
margin: 2rem 0;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
.author-info h3 {
|
|
445
|
+
margin: 0 0 0.5rem;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
.role {
|
|
449
|
+
color: var(--accent);
|
|
450
|
+
font-weight: 600;
|
|
451
|
+
margin: 0 0 1rem;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
.links {
|
|
455
|
+
display: flex;
|
|
456
|
+
gap: 1.5rem;
|
|
457
|
+
margin-top: 1.5rem;
|
|
458
|
+
flex-wrap: wrap;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
.link {
|
|
462
|
+
display: flex;
|
|
463
|
+
align-items: center;
|
|
464
|
+
gap: 0.5rem;
|
|
465
|
+
color: var(--accent);
|
|
466
|
+
text-decoration: none;
|
|
467
|
+
font-weight: 500;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
.link:hover {
|
|
471
|
+
text-decoration: underline;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
.icon {
|
|
475
|
+
font-size: 1.2rem;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
.tech-grid {
|
|
479
|
+
display: grid;
|
|
480
|
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
481
|
+
gap: 1.5rem;
|
|
482
|
+
margin: 2rem 0;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
.tech-category {
|
|
486
|
+
background: var(--bg-secondary);
|
|
487
|
+
padding: 1.5rem;
|
|
488
|
+
border-radius: 6px;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
.tech-category h3 {
|
|
492
|
+
margin: 0 0 1rem;
|
|
493
|
+
font-size: 1.1rem;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
.tech-category ul {
|
|
497
|
+
margin: 0;
|
|
498
|
+
padding-left: 1.25rem;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
.projects {
|
|
502
|
+
display: grid;
|
|
503
|
+
gap: 1.5rem;
|
|
504
|
+
margin: 2rem 0;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
.project {
|
|
508
|
+
background: var(--bg-secondary);
|
|
509
|
+
padding: 1.5rem;
|
|
510
|
+
border-radius: 6px;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
.project h3 {
|
|
514
|
+
margin: 0 0 0.75rem;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
.project p {
|
|
518
|
+
margin: 0 0 1rem;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
.cta-buttons {
|
|
522
|
+
display: flex;
|
|
523
|
+
gap: 1rem;
|
|
524
|
+
margin-top: 2rem;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
.btn {
|
|
528
|
+
display: inline-block;
|
|
529
|
+
padding: 0.875rem 2rem;
|
|
530
|
+
border-radius: 6px;
|
|
531
|
+
font-weight: 600;
|
|
532
|
+
text-decoration: none;
|
|
533
|
+
transition: all 0.2s;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
.btn.primary {
|
|
537
|
+
background: var(--accent);
|
|
538
|
+
color: white;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
.btn.primary:hover {
|
|
542
|
+
background: var(--accent-hover);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
.btn.secondary {
|
|
546
|
+
background: transparent;
|
|
547
|
+
color: var(--text-secondary);
|
|
548
|
+
border: 1px solid var(--border);
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
.btn.secondary:hover {
|
|
552
|
+
border-color: var(--text-secondary);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
footer {
|
|
556
|
+
border-top: 1px solid var(--border);
|
|
557
|
+
padding: 3rem 0;
|
|
558
|
+
margin-top: 4rem;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
.footer-content {
|
|
562
|
+
display: flex;
|
|
563
|
+
justify-content: space-between;
|
|
564
|
+
align-items: center;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
.footer-left p {
|
|
568
|
+
margin: 0;
|
|
569
|
+
color: var(--text-secondary);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
.copyright {
|
|
573
|
+
font-size: 0.875rem;
|
|
574
|
+
margin-top: 0.5rem !important;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
.footer-right {
|
|
578
|
+
display: flex;
|
|
579
|
+
gap: 2rem;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
.footer-right a {
|
|
583
|
+
color: var(--text-secondary);
|
|
584
|
+
text-decoration: none;
|
|
585
|
+
transition: color 0.2s;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
.footer-right a:hover {
|
|
589
|
+
color: var(--accent);
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
@media (max-width: 768px) {
|
|
593
|
+
h1 {
|
|
594
|
+
font-size: 2.5rem;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
.cta-buttons {
|
|
598
|
+
flex-direction: column;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
.footer-content {
|
|
602
|
+
flex-direction: column;
|
|
603
|
+
gap: 2rem;
|
|
604
|
+
text-align: center;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
</style>
|