Files
haopengzhan 8c0b04db0e feat: initial release of pengzhan.dev personal editorial blog platform
- Editorial web platform built with Node.js, Express, EJS, and Vanilla CSS
- Markdown content engine with YAML frontmatter, bilingual variants, and hot-reload watcher
- Unified SQLite with FTS5 search indexing, query logging, and schema filters
- Centered editorial post layout with margin-docked left TOC and mobile bottom sheet
- WordPress-grade comment system with moderation dashboard and bulk operations under /guanli
- Complete SEO suite (JSON-LD structured data, RSS/Atom feeds, XML sitemap, robots.txt)
- CI/CD workflows for linting, security audits (Gitleaks), automated tests, and Docker releases
2026-09-16 23:08:53 -07:00

56 lines
2.8 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600" width="100%" height="100%">
<defs>
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#cbd5e1"/>
<stop offset="100%" stop-color="#94a3b8"/>
</linearGradient>
<filter id="shadow" x="-10%" y="-10%" width="120%" height="120%">
<feDropShadow dx="0" dy="8" stdDeviation="12" flood-opacity="0.18"/>
</filter>
</defs>
<rect width="600" height="600" fill="url(#bg)" rx="32"/>
<!-- Terminal Card -->
<g filter="url(#shadow)">
<rect x="70" y="140" width="280" height="200" rx="16" fill="#1e293b"/>
<!-- Terminal dots -->
<circle cx="95" cy="165" r="5" fill="#ef4444"/>
<circle cx="112" cy="165" r="5" fill="#f59e0b"/>
<circle cx="129" cy="165" r="5" fill="#10b981"/>
<!-- Terminal text -->
<text x="95" y="210" fill="#f8fafc" font-family="-apple-system, sans-serif" font-size="16" font-weight="700">Using Gemini-CLI</text>
<text x="95" y="235" fill="#93c5fd" font-family="-apple-system, sans-serif" font-size="14">and MCP Server</text>
<text x="95" y="260" fill="#cbd5e1" font-family="-apple-system, sans-serif" font-size="13">to Organize My</text>
<text x="95" y="285" fill="#38bdf8" font-family="-apple-system, sans-serif" font-size="15" font-weight="700">Dropbox</text>
</g>
<!-- Server Rack / MCP node -->
<g filter="url(#shadow)">
<rect x="400" y="130" width="130" height="220" rx="16" fill="#e2e8f0" stroke="#94a3b8" stroke-width="4"/>
<circle cx="465" cy="165" r="14" fill="#64748b"/>
<line x1="430" y1="210" x2="500" y2="210" stroke="#cbd5e1" stroke-width="4" stroke-linecap="round"/>
<line x1="430" y1="235" x2="500" y2="235" stroke="#cbd5e1" stroke-width="4" stroke-linecap="round"/>
<line x1="430" y1="260" x2="500" y2="260" stroke="#cbd5e1" stroke-width="4" stroke-linecap="round"/>
<line x1="430" y1="285" x2="500" y2="285" stroke="#cbd5e1" stroke-width="4" stroke-linecap="round"/>
</g>
<!-- Connecting Arrows -->
<path d="M 350 240 L 400 240" stroke="#0284c7" stroke-width="6" stroke-dasharray="6,4" stroke-linecap="round"/>
<path d="M 210 340 L 210 390 L 300 390 L 300 420" stroke="#0284c7" stroke-width="5" stroke-linecap="round"/>
<polygon points="300,435 292,418 308,418" fill="#0284c7"/>
<!-- Dropbox Box Icon -->
<g transform="translate(230, 440)" filter="url(#shadow)">
<!-- Top Left Diamond -->
<polygon points="70,10 35,32 70,55 105,32" fill="#0061ff"/>
<!-- Top Right Diamond -->
<polygon points="70,10 105,32 140,10 105,-12" fill="#3b82f6"/>
<!-- Bottom diamond front -->
<polygon points="70,55 35,78 70,100 105,78" fill="#1d4ed8"/>
<!-- Open flap left -->
<polygon points="35,32 0,55 35,78 70,55" fill="#2563eb"/>
<!-- Open flap right -->
<polygon points="105,32 70,55 105,78 140,55" fill="#1d4ed8"/>
</g>
</svg>