Spaces:
Running
Running
| ```html | |
| <!DOCTYPE html> | |
| <html lang="de"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>TextForge Pro - Text Processing Suite</title> | |
| <link rel="preconnect" href="https://fonts.googleapis.com"> | |
| <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
| <link | |
| href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap" | |
| rel="stylesheet"> | |
| <script src="https://cdn.tailwindcss.com"></script> | |
| <script> | |
| tailwind.config = { | |
| theme: { | |
| extend: { | |
| fontFamily: { | |
| display: ['Space Grotesk', 'sans-serif'], | |
| mono: ['JetBrains Mono', 'monospace'] | |
| } | |
| } | |
| } | |
| } | |
| </script> | |
| <style> | |
| :root { | |
| --bg-primary: #0a0a0f; | |
| --bg-secondary: #12121a; | |
| --bg-tertiary: #1a1a25; | |
| --fg-primary: #e8e8ed; | |
| --fg-secondary: #9898a8; | |
| --fg-muted: #5a5a6e; | |
| --accent-primary: #00d4aa; | |
| --accent-secondary: #7c3aed; | |
| --accent-tertiary: #f59e0b; | |
| --border-color: #2a2a3a; | |
| --card-bg: rgba(18, 18, 26, 0.8); | |
| --glow-primary: rgba(0, 212, 170, 0.15); | |
| --glow-secondary: rgba(124, 58, 237, 0.15); | |
| } | |
| * { | |
| box-sizing: border-box; | |
| scrollbar-width: thin; | |
| scrollbar-color: var(--border-color) transparent; | |
| } | |
| *::-webkit-scrollbar { | |
| width: 6px; | |
| height: 6px; | |
| } | |
| *::-webkit-scrollbar-track { | |
| background: transparent; | |
| } | |
| *::-webkit-scrollbar-thumb { | |
| background: var(--border-color); | |
| border-radius: 3px; | |
| } | |
| *::-webkit-scrollbar-thumb:hover { | |
| background: var(--fg-muted); | |
| } | |
| body { | |
| font-family: 'Space Grotesk', sans-serif; | |
| background: var(--bg-primary); | |
| color: var(--fg-primary); | |
| min-height: 100vh; | |
| overflow-x: hidden; | |
| } | |
| .bg-mesh { | |
| position: fixed; | |
| inset: 0; | |
| z-index: -1; | |
| background: | |
| radial-gradient(ellipse 80% 50% at 20% 20%, var(--glow-primary), transparent), | |
| radial-gradient(ellipse 60% 40% at 80% 80%, var(--glow-secondary), transparent), | |
| linear-gradient(180deg, var(--bg-primary) 0%, var(--bg-secondary) 100%); | |
| } | |
| .noise-overlay { | |
| position: fixed; | |
| inset: 0; | |
| z-index: -1; | |
| opacity: 0.03; | |
| background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E"); | |
| } | |
| .glass-card { | |
| background: var(--card-bg); | |
| backdrop-filter: blur(20px); | |
| border: 1px solid var(--border-color); | |
| border-radius: 16px; | |
| transition: border-color 0.3s ease, box-shadow 0.3s ease; | |
| } | |
| .glass-card:hover { | |
| border-color: rgba(0, 212, 170, 0.3); | |
| } | |
| .input-field { | |
| background: var(--bg-tertiary); | |
| border: 1px solid var(--border-color); | |
| border-radius: 12px; | |
| color: var(--fg-primary); | |
| font-family: 'JetBrains Mono', monospace; | |
| font-size: 14px; | |
| padding: 16px; | |
| width: 100%; | |
| resize: vertical; | |
| transition: border-color 0.2s, box-shadow 0.2s; | |
| } | |
| .input-field:focus { | |
| outline: none; | |
| border-color: var(--accent-primary); | |
| box-shadow: 0 0 0 3px var(--glow-primary); | |
| } | |
| .input-field::placeholder { | |
| color: var(--fg-muted); | |
| } | |
| .btn { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: 8px; | |
| padding: 10px 18px; | |
| border-radius: 10px; | |
| font-weight: 500; | |
| font-size: 14px; | |
| cursor: pointer; | |
| transition: all 0.2s ease; | |
| border: 1px solid transparent; | |
| font-family: 'Space Grotesk', sans-serif; | |
| } | |
| .btn-primary { | |
| background: linear-gradient(135deg, var(--accent-primary), #00a888); | |
| color: var(--bg-primary); | |
| } | |
| .btn-primary:hover { | |
| transform: translateY(-2px); | |
| box-shadow: 0 8px 20px var(--glow-primary); | |
| } | |
| .btn-primary:active { | |
| transform: translateY(0); | |
| } | |
| .btn-secondary { | |
| background: var(--bg-tertiary); | |
| color: var(--fg-primary); | |
| border-color: var(--border-color); | |
| } | |
| .btn-secondary:hover { | |
| background: var(--border-color); | |
| border-color: var(--accent-secondary); | |
| } | |
| .btn-accent { | |
| background: linear-gradient(135deg, var(--accent-secondary), #5b21b6); | |
| color: white; | |
| } | |
| .btn-accent:hover { | |
| transform: translateY(-2px); | |
| box-shadow: 0 8px 20px var(--glow-secondary); | |
| } | |
| .btn-small { | |
| padding: 6px 12px; | |
| font-size: 12px; | |
| border-radius: 8px; | |
| } | |
| .preset-chip { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 6px; | |
| padding: 8px 14px; | |
| background: var(--bg-tertiary); | |
| border: 1px solid var(--border-color); | |
| border-radius: 20px; | |
| font-size: 13px; | |
| cursor: pointer; | |
| transition: all 0.2s; | |
| font-family: 'Space Grotesk', sans-serif; | |
| color: var(--fg-primary); | |
| } | |
| .preset-chip:hover { | |
| border-color: var(--accent-primary); | |
| background: rgba(0, 212, 170, 0.1); | |
| transform: translateY(-1px); | |
| } | |
| .preset-chip.active { | |
| background: var(--accent-primary); | |
| color: var(--bg-primary); | |
| border-color: var(--accent-primary); | |
| } | |
| .stat-card { | |
| background: var(--bg-tertiary); | |
| border: 1px solid var(--border-color); | |
| border-radius: 12px; | |
| padding: 16px; | |
| text-align: center; | |
| transition: all 0.3s ease; | |
| } | |
| .stat-card:hover { | |
| border-color: var(--accent-primary); | |
| transform: translateY(-2px); | |
| } | |
| .stat-value { | |
| font-size: 28px; | |
| font-weight: 700; | |
| color: var(--accent-primary); | |
| font-family: 'JetBrains Mono', monospace; | |
| } | |
| .stat-label { | |
| font-size: 12px; | |
| color: var(--fg-secondary); | |
| margin-top: 4px; | |
| text-transform: uppercase; | |
| letter-spacing: 0.5px; | |
| } | |
| .history-item { | |
| background: var(--bg-tertiary); | |
| border: 1px solid var(--border-color); | |
| border-radius: 10px; | |
| padding: 12px; | |
| margin-bottom: 8px; | |
| cursor: pointer; | |
| transition: all 0.2s; | |
| } | |
| .history-item:hover { | |
| border-color: var(--accent-secondary); | |
| background: rgba(124, 58, 237, 0.05); | |
| transform: translateX(4px); | |
| } | |
| .suggestion-card { | |
| background: linear-gradient(135deg, rgba(245, 158, 11, 0.1), rgba(245, 158, 11, 0.05)); | |
| border: 1px solid rgba(245, 158, 11, 0.2); | |
| border-radius: 12px; | |
| padding: 14px; | |
| cursor: pointer; | |
| transition: all 0.2s; | |
| } | |
| .suggestion-card:hover { | |
| border-color: var(--accent-tertiary); | |
| transform: translateX(4px); | |
| background: linear-gradient(135deg, rgba(245, 158, 11, 0.15), rgba(245, 158, 11, 0.08)); | |
| } | |
| .progress-bar { | |
| height: 4px; | |
| background: var(--bg-tertiary); | |
| border-radius: 2px; | |
| overflow: hidden; | |
| } | |
| .progress-fill { | |
| height: 100%; | |
| background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); | |
| border-radius: 2px; | |
| transition: width 0.3s ease; | |
| } | |
| .char-freq-item { | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| padding: 8px 12px; | |
| background: var(--bg-tertiary); | |
| border-radius: 8px; | |
| margin-bottom: 6px; | |
| transition: background 0.2s; | |
| } | |
| .char-freq-item:hover { | |
| background: var(--border-color); | |
| } | |
| .char-freq-bar { | |
| flex: 1; | |
| height: 6px; | |
| background: var(--border-color); | |
| border-radius: 3px; | |
| overflow: hidden; | |
| } | |
| .char-freq-fill { | |
| height: 100%; | |
| background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); | |
| border-radius: 3px; | |
| transition: width 0.3s ease; | |
| } | |
| .toast { | |
| position: fixed; | |
| bottom: 24px; | |
| right: 24px; | |
| background: var(--bg-secondary); | |
| border: 1px solid var(--accent-primary); | |
| border-radius: 12px; | |
| padding: 16px 24px; | |
| display: flex; | |
| align-items: center; | |
| gap: 12px; | |
| z-index: 1000; | |
| transform: translateY(100px); | |
| opacity: 0; | |
| transition: all 0.3s ease; | |
| box-shadow: 0 10px 40px rgba(0, 212, 170, 0.2); | |
| } | |
| .toast.show { | |
| transform: translateY(0); | |
| opacity: 1; | |
| } | |
| .modal-overlay { | |
| position: fixed; | |
| inset: 0; | |
| background: rgba(0, 0, 0, 0.7); | |
| backdrop-filter: blur(4px); | |
| z-index: 100; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| opacity: 0; | |
| pointer-events: none; | |
| transition: opacity 0.3s ease; | |
| } | |
| .modal-overlay.show { | |
| opacity: 1; | |
| pointer-events: auto; | |
| } | |
| .modal-content { | |
| background: var(--bg-secondary); | |
| border: 1px solid var(--border-color); | |
| border-radius: 16px; | |
| padding: 24px; | |
| max-width: 400px; | |
| width: 90%; | |
| transform: scale(0.9); | |
| transition: transform 0.3s ease; | |
| } | |
| .modal-overlay.show .modal-content { | |
| transform: scale(1); | |
| } | |
| .word-cloud { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 8px; | |
| padding: 12px; | |
| background: var(--bg-tertiary); | |
| border-radius: 12px; | |
| } | |
| .word-chip { | |
| padding: 4px 10px; | |
| background: var(--bg-secondary); | |
| border: 1px solid var(--border-color); | |
| border-radius: 16px; | |
| font-size: 12px; | |
| transition: all 0.2s; | |
| cursor: default; | |
| } | |
| .word-chip:hover { | |
| border-color: var(--accent-primary); | |
| background: rgba(0, 212, 170, 0.1); | |
| } | |
| .word-chip.large { | |
| font-size: 14px; | |
| padding: 6px 14px; | |
| background: rgba(0, 212, 170, 0.15); | |
| border-color: var(--accent-primary); | |
| } | |
| .word-chip.medium { | |
| font-size: 13px; | |
| padding: 5px 12px; | |
| } | |
| .saved-preset-item { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: 10px 12px; | |
| background: var(--bg-tertiary); | |
| border: 1px solid var(--border-color); | |
| border-radius: 10px; | |
| margin-bottom: 8px; | |
| cursor: pointer; | |
| transition: all 0.2s; | |
| } | |
| .saved-preset-item:hover { | |
| border-color: var(--accent-primary); | |
| background: rgba(0, 212, 170, 0.05); | |
| } | |
| .delete-btn { | |
| padding: 4px; | |
| border-radius: 6px; | |
| transition: all 0.2s; | |
| color: var(--fg-muted); | |
| background: none; | |
| border: none; | |
| cursor: pointer; | |
| } | |
| .delete-btn:hover { | |
| background: rgba(239, 68, 68, 0.2); | |
| color: #ef4444; | |
| } | |
| .tab-btn { | |
| padding: 8px 16px; | |
| background: transparent; | |
| border: none; | |
| color: var(--fg-secondary); | |
| font-size: 14px; | |
| cursor: pointer; | |
| border-bottom: 2px solid transparent; | |
| transition: all 0.2s; | |
| font-family: 'Space Grotesk', sans-serif; | |
| } | |
| .tab-btn:hover { | |
| color: var(--fg-primary); | |
| } | |
| .tab-btn.active { | |
| color: var(--accent-primary); | |
| border-bottom-color: var(--accent-primary); | |
| } | |
| @keyframes fadeInUp { | |
| from { | |
| opacity: 0; | |
| transform: translateY(20px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| .animate-in { | |
| animation: fadeInUp 0.4s ease forwards; | |
| } | |
| .stagger-1 { | |
| animation-delay: 0.1s; | |
| opacity: 0; | |
| } | |
| .stagger-2 { | |
| animation-delay: 0.2s; | |
| opacity: 0; | |
| } | |
| .stagger-3 { | |
| animation-delay: 0.3s; | |
| opacity: 0; | |
| } | |
| .stagger-4 { | |
| animation-delay: 0.4s; | |
| opacity: 0; | |
| } | |
| @keyframes pulse { | |
| 0%, | |
| 100% { | |
| opacity: 1; | |
| } | |
| 50% { | |
| opacity: 0.5; | |
| } | |
| } | |
| .processing { | |
| animation: pulse 1s ease-in-out infinite; | |
| } | |
| @keyframes shimmer { | |
| 0% { | |
| background-position: -200% 0; | |
| } | |
| 100% { | |
| background-position: 200% 0; | |
| } | |
| } | |
| .shimmer { | |
| background: linear-gradient(90deg, var(--bg-tertiary) 25%, var(--border-color) 50%, var(--bg-tertiary) 75%); | |
| background-size: 200% 100%; | |
| animation: shimmer 1.5s infinite; | |
| } | |
| @media (prefers-reduced-motion: reduce) { | |
| *, | |
| *::before, | |
| *::after { | |
| animation-duration: 0.01ms !important; | |
| animation-iteration-count: 1 !important; | |
| transition-duration: 0.01ms !important; | |
| } | |
| } | |
| @media (max-width: 1024px) { | |
| .main-grid { | |
| grid-template-columns: 1fr !important; | |
| } | |
| } | |
| @media (max-width: 768px) { | |
| .stat-grid { | |
| grid-template-columns: repeat(2, 1fr) !important; | |
| } | |
| .header-actions { | |
| flex-direction: column; | |
| gap: 8px; | |
| } | |
| .toast { | |
| left: 16px; | |
| right: 16px; | |
| bottom: 16px; | |
| } | |
| } | |
| @media (max-width: 480px) { | |
| .preset-chip { | |
| padding: 6px 10px; | |
| font-size: 12px; | |
| } | |
| .stat-value { | |
| font-size: 22px; | |
| } | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="bg-mesh"></div> | |
| <div class="noise-overlay"></div> | |
| <!-- Header --> | |
| <header class="sticky top-0 z-50 backdrop-blur-xl border-b border-[var(--border-color)]"> | |
| <div class="max-w-7xl mx-auto px-4 py-4 flex items-center justify-between flex-wrap gap-4"> | |
| <div class="flex items-center gap-4"> | |
| <div | |
| class="w-10 h-10 rounded-xl bg-gradient-to-br from-[var(--accent-primary)] to-[var(--accent-secondary)] flex items-center justify-center"> | |
| <svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" | |
| d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" /> | |
| </svg> | |
| </div> | |
| <div> | |
| <h1 class="text-xl font-bold">TextForge Pro</h1> | |
| <p class="text-xs text-[var(--fg-secondary)]">Text Processing Suite</p> | |
| </div> | |
| </div> | |
| <div class="flex items-center gap-3 header-actions"> | |
| <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" | |
| class="text-sm text-[var(--accent-primary)] hover:underline">Built with anycoder</a> | |
| <button id="clearAllBtn" class="btn btn-secondary btn-small"> | |
| <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/> | |
| </svg> | |
| Clear All | |
| </button> | |
| </div> | |
| </div> | |
| </header> | |
| <!-- Main Content --> | |
| <main class="max-w-7xl mx-auto px-4 py-6"> | |
| <!-- Stats Row --> | |
| <div class="stat-grid grid grid-cols-4 gap-4 mb-6 animate-in stagger-1"> | |
| <div class="stat-card"> | |
| <div class="stat-value" id="charCount">0</div> | |
| <div class="stat-label">Characters</div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-value" id="wordCount">0</div> | |
| <div class="stat-label">Words</div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-value" id="lineCount">0</div> | |
| <div class="stat-label">Lines</div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-value" id="uniqueWords">0</div> | |
| <div class="stat-label">Unique</div> | |
| </div> | |
| </div> | |
| <!-- Main Grid --> | |
| <div class="main-grid grid grid-cols-[1fr_320px] gap-6"> | |
| <!-- Left Column - Editor --> | |
| <div class="space-y-6"> | |
| <!-- Input Section --> | |
| <section class="glass-card p-6 animate-in stagger-2"> | |
| <div class="flex items-center justify-between mb-4 flex-wrap gap-2"> | |
| <h2 class="text-lg font-semibold">Input Text</h2> | |
| <div class="flex gap-2"> | |
| <button id="pasteBtn" class="btn btn-secondary btn-small"> | |
| <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"/> | |
| </svg> | |
| Paste | |
| </button> | |
| <label class="btn btn-secondary btn-small cursor-pointer"> | |
| <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12"/> | |
| </svg> | |
| Import | |
| <input type="file" id="fileInput" class="hidden" accept=".txt,.md,.html,.css,.js,.json,.csv"> | |
| </label> | |
| </div> | |
| </div> | |
| <textarea id="inputText" class="input-field min-h-[200px]" placeholder="Paste or type your text here..."></textarea> | |
| </section> | |
| <!-- Presets Section --> | |
| <section class="glass-card p-6 animate-in stagger-3"> | |
| <h2 class="text-lg font-semibold mb-4">Processing Presets</h2> | |
| <div class="flex flex-wrap gap-2 mb-4" id="presetsContainer"> | |
| <button class="preset-chip" data-preset="clean"> | |
| <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/> | |
| </svg> | |
| Clean Text | |
| </button> | |
| <button class="preset-chip" data-preset="html"> | |
| <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"/> | |
| </svg> | |
| Remove HTML | |
| </button> | |
| <button class="preset-chip" data-preset="unique"> | |
| <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01"/> | |
| </svg> | |
| Unique Only | |
| </button> | |
| <button class="preset-chip" data-preset="sort"> | |
| <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12"/> | |
| </svg> | |
| Sort Lines | |
| </button> | |
| <button class="preset-chip" data-preset="minify"> | |
| <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4"/> | |
| </svg> | |
| Minify | |
| </button> | |
| <button class="preset-chip" data-preset="keywords"> | |
| <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> | |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z"/> | |
| </svg> | |
| Extract Keywords<div class="codepen" data-height="245" data-pen-title="Six Faces / Walking The Cow" data-preview="true" data-prefill='{"title":"Six Faces / Walking The Cow","description":"A scroll-driven 3D cube that rotates through six faces as you move down the page. Each face holds an image from an experiment in reverse creativity, asking AI to work against itself, break composition rules, and leave the mistakes in place.\n\nThe technical part is just the container. The frame on the wall.\n\nFor Daniel Johnston, who walked the cow first.","tags":["scroll","scrollsync","cow","reverse-creativity"],"scripts":[],"stylesheets":[]}'> | |
| <pre data-lang="html"><div id="scene"> | |
| <div id="cube"> | |
| <div class="face" data-face="top" data-i="0"><span class="face-ph">TOP</span></div> | |
| <div class="face" data-face="front" data-i="1"><span class="face-ph">FRONT</span></div> | |
| <div class="face" data-face="right" data-i="2"><span class="face-ph">RIGHT</span></div> | |
| <div class="face" data-face="back" data-i="3"><span class="face-ph">BACK</span></div> | |
| <div class="face" data-face="left" data-i="4"><span class="face-ph">LEFT</span></div> | |
| <div class="face" data-face="bottom" data-i="5"><span class="face-ph">BOTTOM</span></div> | |
| </div> | |
| </div> | |
| <div id="hud"> | |
| <div id="hud_pct">000%</div> | |
| <div class="progress-bar"> | |
| <div class="progress-fill" id="prog_fill"></div> | |
| </div> | |
| <div class="scene-label" id="scene_name">DESCENT</div> | |
| </div> | |
| <button id="theme_toggle" aria-label="Toggle light/dark mode"> | |
| <svg class="icon-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"> | |
| <circle cx="12" cy="12" r="4" /> | |
| <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41" /> | |
| </svg> | |
| <svg class="icon-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"> | |
| <path d="M21 12.79A9 9 0 1 1 11.21 3a7 7 0 0 0 9.79 9.79z" /> | |
| </svg> | |
| </button> | |
| <div id="scene_strip"> | |
| <a href="#s0" class="scene-dot active"></a> | |
| <a href="#s1" class="scene-dot"></a> | |
| <a href="#s2" class="scene-dot"></a> | |
| <a href="#s3" class="scene-dot"></a> | |
| <a href="#s4" class="scene-dot"></a> | |
| <a href="#s5" class="scene-dot"></a> | |
| </div> | |
| <div id="face_caption"> | |
| <div id="face_caption_num">01</div> | |
| <div id="face_caption_name">DESCENT</div> | |
| </div> | |
| <div id="scroll_container"> | |
| <section id="s0"> | |
| <div class="text-card"> | |
| <div class="tag">Cube Gallery — Bad Art</div> | |
| <h1>WORK<br>AGAINST<br>THE MODEL</h1> | |
| <p class="body-text"> | |
| What happens when you ask AI | |
| to do the opposite of what it was built for? | |
| Break proportion. Flip symmetry. | |
| Leave the mistakes in place. | |
| Scroll to find out. | |
| </p> | |
| <div class="cta-row"> | |
| <a class="cta" href="#s1"> | |
| Enter | |
| <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5"> | |
| <path d="M1 6h10M6 1l5 5-5 5" /> | |
| </svg> | |
| </a> | |
| </div> | |
| </div> | |
| </section> | |
| <section id="s1"> | |
| <div class="text-card right"> | |
| <div class="h-line"></div> | |
| <div class="tag">01 — Art Rebellion</div> | |
| <h2>FLIP<br>THE<br>PROMPT</h2> | |
| <p class="body-text"> | |
| A cow walking a monster | |
| instead of a monster walking a cow. | |
| That inversion is enough | |
| to break template thinking. | |
| The cape ends up on the wrong body. | |
| </p> | |
| <div class="cta-row"> | |
| <a class="cta-back" href="#s0"> | |
| <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5"> | |
| <path d="M11 6H1M6 11L1 6l5-5" /> | |
| </svg> | |
| Back | |
| </a> | |
| <a class="cta" href="#s2"> | |
| Turn | |
| <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5"> | |
| <path d="M1 6h10M6 1l5 5-5 5" /> | |
| </svg> | |
| </a> | |
| </div> | |
| </div> | |
| </section> | |
| <section id="s2"> | |
| <div class="text-card"> | |
| <div class="h-line"></div> | |
| <div class="tag">02 — Moo Walk</div> | |
| <h2>NEITHER<br>LEADS</h2> | |
| <p class="body-text"> | |
| Clashing colors. No balance. | |
| A dance with no choreography. | |
| When the model works against itself | |
| something more genuine surfaces. | |
| </p> | |
| <div class="cta-row"> | |
| <a class="cta-back" href="#s1"> | |
| <svg viewBox="0 0 12 12" fill="none" stroke ="currentColor" stroke-width="1.5"> | |
| <path d="M11 6H1M6 11L1 6l5-5" /> | |
| </svg> | |
| B ack | |
| </a> | |
| <a class="cta" href="#s3"> | |
| Turn | |
| <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5"> | |
| <path d="M1 6h10M6 1l5 5-5 5" /> | |
| </svg> | |
| </a> | |
| </div> | |
| </div> | |
| </section> | |
| <section id="s3"> | |
| <div class="text-card right"> | |
| <div class="h-line"></div> | |
| <div class="tag">03 — Bad Art</div> | |
| <h2>REVERSE<br>CREATIVITY</h2> | |
| <p class="body-text"> | |
| AI is trained to polish and regularize. | |
| The harder direction is unlearning that. | |
| A television for a head | |
| is not an error. | |
| It is the point. | |
| </p> | |
| <div class="stat-row" style="justify-content: flex-end"> | |
| <div class="stat"> | |
| <span class="stat-num">6</span> | |
| <span class="stat-label">Works</span> | |
| </div> | |
| <div class="stat"> | |
| <span class="stat-num">360</span> | |
| <span class="stat-label">Degrees</span> | |
| </div> | |
| <div class="stat"> | |
| <span class="stat-num">1</span> | |
| <span class="stat-label">Object</span> | |
| </div> | |
| </div> | |
| <div class="cta-row"> | |
| <a class="cta-back" href="#s2"> | |
| <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5"> | |
| <path d="M11 6H1M6 11L1 6l5-5" /> | |
| </svg> | |
| Back | |
| </a> | |
| <a class="cta" href="#s4"> | |
| Turn | |
| <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5"> | |
| <path d="M1 6h10M6 1l5 5-5 5" /> | |
| </svg> | |
| </a> | |
| </div> | |
| </div> | |
| </section> | |
| <section id="s4"> | |
| <div class="text-card"> | |
| <div class="h-line"></div> | |
| <div class="tag">04 — No Rules</div> | |
| <h2>NONSENSE<br>AT THE<br>CENTER</h2> | |
| <p class="body-text"> | |
| Dada and the surrealists knew this. | |
| Put the absurd at the center | |
| and the edges stop pretending. | |
| Nine heads in the branches. | |
| The sun has a face and it approves. | |
| </p> | |
| <div class="cta-row"> | |
| <a class="cta-back" href="#s3"> | |
| <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5"> | |
| <path d="M11 6H1M6 11L1 6l5-5" /> | |
| </svg> | |
| Back | |
| </a> | |
| <a class="cta" href="#s5"> | |
| Turn | |
| <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5"> | |
| <path d="M1 6h10M6 1l5 5-5 5" /> | |
| </svg> | |
| </a> | |
| </div> |