tractatus/public/images/tractatus-icon-animated.svg
TheFlow 2298d36bed fix(submissions): restructure Economist package and fix article display
- Create Economist SubmissionTracking package correctly:
  * mainArticle = full blog post content
  * coverLetter = 216-word SIR— letter
  * Links to blog post via blogPostId
- Archive 'Letter to The Economist' from blog posts (it's the cover letter)
- Fix date display on article cards (use published_at)
- Target publication already displaying via blue badge

Database changes:
- Make blogPostId optional in SubmissionTracking model
- Economist package ID: 68fa85ae49d4900e7f2ecd83
- Le Monde package ID: 68fa2abd2e6acd5691932150

Next: Enhanced modal with tabs, validation, export

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 08:47:42 +13:00

134 lines
7 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<defs>
<!-- Central core gradient (shared with Passport - cyan to blue) -->
<radialGradient id="tractatusCore">
<stop offset="0%" style="stop-color:#64ffda;stop-opacity:1" />
<stop offset="70%" style="stop-color:#448aff;stop-opacity:1" />
<stop offset="100%" style="stop-color:#0ea5e9;stop-opacity:1" />
</radialGradient>
<!-- Service-specific gradients (6 governance services) -->
<linearGradient id="serviceBoundary" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#10b981;stop-opacity:1" />
<stop offset="100%" style="stop-color:#059669;stop-opacity:1" />
</linearGradient>
<linearGradient id="serviceInstruction" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#6366f1;stop-opacity:1" />
<stop offset="100%" style="stop-color:#4f46e5;stop-opacity:1" />
</linearGradient>
<linearGradient id="serviceValidator" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#8b5cf6;stop-opacity:1" />
<stop offset="100%" style="stop-color:#7c3aed;stop-opacity:1" />
</linearGradient>
<linearGradient id="servicePressure" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#f59e0b;stop-opacity:1" />
<stop offset="100%" style="stop-color:#d97706;stop-opacity:1" />
</linearGradient>
<linearGradient id="serviceMetacognitive" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#ec4899;stop-opacity:1" />
<stop offset="100%" style="stop-color:#db2777;stop-opacity:1" />
</linearGradient>
<linearGradient id="serviceDeliberation" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#14b8a6;stop-opacity:1" />
<stop offset="100%" style="stop-color:#0d9488;stop-opacity:1" />
</linearGradient>
<linearGradient id="connectionGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#64ffda;stop-opacity:0.2" />
<stop offset="50%" style="stop-color:#64ffda;stop-opacity:0.5" />
<stop offset="100%" style="stop-color:#64ffda;stop-opacity:0.2" />
</linearGradient>
<filter id="dropShadow">
<feDropShadow dx="0" dy="2" stdDeviation="3" flood-opacity="0.3"/>
</filter>
</defs>
<!-- Subtle background -->
<circle cx="100" cy="100" r="95" fill="rgba(255,255,255,0.02)"/>
<!-- Orbital rings with subtle rotation animation -->
<circle cx="100" cy="100" r="85" stroke="#64ffda" stroke-width="1" opacity="0.15" fill="none">
<animate attributeName="opacity" values="0.15;0.25;0.15" dur="6s" repeatCount="indefinite"/>
</circle>
<circle cx="100" cy="100" r="70" stroke="#64ffda" stroke-width="1" opacity="0.25" fill="none">
<animate attributeName="opacity" values="0.25;0.35;0.25" dur="5s" repeatCount="indefinite"/>
</circle>
<circle cx="100" cy="100" r="55" stroke="#64ffda" stroke-width="1" opacity="0.35" fill="none">
<animate attributeName="opacity" values="0.35;0.45;0.35" dur="4s" repeatCount="indefinite"/>
</circle>
<!-- Connection lines with pulsing animation -->
<g opacity="0.4">
<line x1="100" y1="100" x2="100" y2="35" stroke="url(#connectionGradient)" stroke-width="2">
<animate attributeName="opacity" values="0.3;0.6;0.3" dur="4s" repeatCount="indefinite"/>
</line>
<line x1="100" y1="100" x2="156" y2="67.5" stroke="url(#connectionGradient)" stroke-width="2">
<animate attributeName="opacity" values="0.3;0.6;0.3" dur="4s" begin="0.67s" repeatCount="indefinite"/>
</line>
<line x1="100" y1="100" x2="156" y2="132.5" stroke="url(#connectionGradient)" stroke-width="2">
<animate attributeName="opacity" values="0.3;0.6;0.3" dur="4s" begin="1.33s" repeatCount="indefinite"/>
</line>
<line x1="100" y1="100" x2="100" y2="165" stroke="url(#connectionGradient)" stroke-width="2">
<animate attributeName="opacity" values="0.3;0.6;0.3" dur="4s" begin="2s" repeatCount="indefinite"/>
</line>
<line x1="100" y1="100" x2="44" y2="132.5" stroke="url(#connectionGradient)" stroke-width="2">
<animate attributeName="opacity" values="0.3;0.6;0.3" dur="4s" begin="2.67s" repeatCount="indefinite"/>
</line>
<line x1="100" y1="100" x2="44" y2="67.5" stroke="url(#connectionGradient)" stroke-width="2">
<animate attributeName="opacity" values="0.3;0.6;0.3" dur="4s" begin="3.33s" repeatCount="indefinite"/>
</line>
</g>
<!-- Six governance service nodes with breathing animation (staggered) -->
<!-- 1. BoundaryEnforcer (top) - Green -->
<circle cx="100" cy="35" r="18" fill="url(#serviceBoundary)" filter="url(#dropShadow)" opacity="0.9">
<animate attributeName="r" values="18;21;18" dur="4s" repeatCount="indefinite"/>
</circle>
<!-- 2. InstructionPersistenceClassifier (top-right) - Indigo -->
<circle cx="156" cy="67.5" r="18" fill="url(#serviceInstruction)" filter="url(#dropShadow)" opacity="0.9">
<animate attributeName="r" values="18;21;18" dur="4s" begin="0.67s" repeatCount="indefinite"/>
</circle>
<!-- 3. CrossReferenceValidator (bottom-right) - Purple -->
<circle cx="156" cy="132.5" r="18" fill="url(#serviceValidator)" filter="url(#dropShadow)" opacity="0.9">
<animate attributeName="r" values="18;21;18" dur="4s" begin="1.33s" repeatCount="indefinite"/>
</circle>
<!-- 4. ContextPressureMonitor (bottom) - Amber -->
<circle cx="100" cy="165" r="18" fill="url(#servicePressure)" filter="url(#dropShadow)" opacity="0.9">
<animate attributeName="r" values="18;21;18" dur="4s" begin="2s" repeatCount="indefinite"/>
</circle>
<!-- 5. MetacognitiveVerifier (bottom-left) - Rose -->
<circle cx="44" cy="132.5" r="18" fill="url(#serviceMetacognitive)" filter="url(#dropShadow)" opacity="0.9">
<animate attributeName="r" values="18;21;18" dur="4s" begin="2.67s" repeatCount="indefinite"/>
</circle>
<!-- 6. PluralisticDeliberationOrchestrator (top-left) - Teal -->
<circle cx="44" cy="67.5" r="18" fill="url(#serviceDeliberation)" filter="url(#dropShadow)" opacity="0.9">
<animate attributeName="r" values="18;21;18" dur="4s" begin="3.33s" repeatCount="indefinite"/>
</circle>
<!-- Central core with breathing animation -->
<circle cx="100" cy="100" r="35" fill="url(#tractatusCore)" filter="url(#dropShadow)">
<animate attributeName="r" values="35;38;35" dur="3s" repeatCount="indefinite"/>
</circle>
<!-- Outer glow with pulsing -->
<circle cx="100" cy="100" r="38" fill="none" stroke="rgba(100,255,218,0.2)" stroke-width="2">
<animate attributeName="r" values="38;45;38" dur="3s" repeatCount="indefinite"/>
<animate attributeName="opacity" values="0.2;0.4;0.2" dur="3s" repeatCount="indefinite"/>
</circle>
<!-- Center symbol - "T" -->
<circle cx="100" cy="100" r="28" fill="rgba(0,0,0,0.25)"/>
<text x="100" y="110" text-anchor="middle" font-family="Arial, sans-serif" font-size="32" font-weight="bold" fill="white" opacity="0.95">T</text>
</svg>