summaryrefslogtreecommitdiff
path: root/extras/html/themes/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'extras/html/themes/index.html')
-rw-r--r--extras/html/themes/index.html514
1 files changed, 269 insertions, 245 deletions
diff --git a/extras/html/themes/index.html b/extras/html/themes/index.html
index ecef268..c05160d 100644
--- a/extras/html/themes/index.html
+++ b/extras/html/themes/index.html
@@ -3,8 +3,10 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Gemtexter Theme Gallery - 50 Unique Themes</title>
+ <title>Gemtexter Retro Theme Gallery - 50 Retro-Futuristic Themes</title>
<style>
+ @import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700;900&family=Share+Tech+Mono&display=swap');
+
* {
box-sizing: border-box;
margin: 0;
@@ -12,51 +14,151 @@
}
body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
- background-color: #f5f5f5;
- color: #333;
+ font-family: 'Share Tech Mono', monospace;
+ background-color: #000;
+ color: #0f0;
line-height: 1.6;
+ min-width: 1200px;
+ overflow-x: auto;
+ }
+
+ /* Scanline effect */
+ body::before {
+ content: "";
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: repeating-linear-gradient(
+ 0deg,
+ transparent,
+ transparent 2px,
+ rgba(0, 255, 0, 0.03) 2px,
+ rgba(0, 255, 0, 0.03) 4px
+ );
+ pointer-events: none;
+ z-index: 1;
+ }
+
+ .container {
+ position: relative;
+ z-index: 2;
+ max-width: 1400px;
+ margin: 0 auto;
+ padding: 2em;
}
.header {
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: white;
text-align: center;
padding: 4em 2em;
- box-shadow: 0 4px 20px rgba(0,0,0,0.1);
+ margin-bottom: 3em;
+ border: 2px solid #0f0;
+ background: radial-gradient(ellipse at center, rgba(0, 255, 0, 0.1) 0%, transparent 70%);
+ position: relative;
+ }
+
+ .header::before {
+ content: "SYSTEM ONLINE";
+ position: absolute;
+ top: 10px;
+ left: 10px;
+ font-size: 0.8em;
+ color: #0f0;
+ opacity: 0.6;
}
.header h1 {
+ font-family: 'Orbitron', monospace;
font-size: 3em;
+ font-weight: 900;
margin-bottom: 0.5em;
- text-shadow: 2px 2px 4px rgba(0,0,0,0.2);
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ text-shadow:
+ 0 0 10px #0f0,
+ 0 0 20px #0f0,
+ 0 0 30px #0f0;
+ animation: glow 2s ease-in-out infinite alternate;
+ }
+
+ @keyframes glow {
+ from { text-shadow: 0 0 10px #0f0, 0 0 20px #0f0, 0 0 30px #0f0; }
+ to { text-shadow: 0 0 20px #0f0, 0 0 30px #0f0, 0 0 40px #0f0; }
}
.header p {
font-size: 1.2em;
- opacity: 0.9;
- max-width: 600px;
+ opacity: 0.8;
+ max-width: 800px;
margin: 0 auto;
}
- .container {
- max-width: 1400px;
- margin: 0 auto;
+ .stats {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 2em;
+ margin: 3em 0;
+ }
+
+ .stat {
+ background: rgba(0, 255, 0, 0.05);
+ border: 1px solid #0f0;
padding: 2em;
+ text-align: center;
+ position: relative;
+ overflow: hidden;
+ }
+
+ .stat::before {
+ content: "";
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: radial-gradient(circle, rgba(0, 255, 0, 0.1) 0%, transparent 70%);
+ animation: rotate 20s linear infinite;
+ }
+
+ @keyframes rotate {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+ }
+
+ .stat-number {
+ font-family: 'Orbitron', monospace;
+ font-size: 3em;
+ font-weight: 700;
+ color: #0f0;
+ position: relative;
+ z-index: 1;
+ }
+
+ .stat-label {
+ color: #0f0;
+ opacity: 0.7;
+ margin-top: 0.5em;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ position: relative;
+ z-index: 1;
}
.filters {
- background: white;
+ background: rgba(0, 255, 0, 0.05);
+ border: 1px solid #0f0;
padding: 2em;
- border-radius: 12px;
- box-shadow: 0 2px 10px rgba(0,0,0,0.05);
margin-bottom: 3em;
text-align: center;
}
.filters h2 {
+ font-family: 'Orbitron', monospace;
margin-bottom: 1em;
- color: #667eea;
+ color: #0f0;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
}
.filter-buttons {
@@ -68,43 +170,50 @@
.filter-btn {
padding: 0.5em 1.5em;
- border: 2px solid #667eea;
- background: white;
- color: #667eea;
- border-radius: 25px;
+ border: 1px solid #0f0;
+ background: transparent;
+ color: #0f0;
cursor: pointer;
transition: all 0.3s ease;
- font-size: 1em;
+ font-family: 'Share Tech Mono', monospace;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ }
+
+ .filter-btn:hover {
+ background: #0f0;
+ color: #000;
+ box-shadow: 0 0 10px #0f0;
}
- .filter-btn:hover, .filter-btn.active {
- background: #667eea;
- color: white;
+ .filter-btn.active {
+ background: #0f0;
+ color: #000;
}
.theme-grid {
display: grid;
- grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
+ grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
gap: 2em;
}
.theme-card {
- background: white;
- border-radius: 12px;
+ background: rgba(0, 0, 0, 0.8);
+ border: 1px solid #0f0;
overflow: hidden;
- box-shadow: 0 4px 20px rgba(0,0,0,0.08);
- transition: transform 0.3s ease, box-shadow 0.3s ease;
+ transition: all 0.3s ease;
position: relative;
}
.theme-card:hover {
- transform: translateY(-4px);
- box-shadow: 0 8px 30px rgba(0,0,0,0.12);
+ border-color: #0ff;
+ box-shadow: 0 0 20px rgba(0, 255, 255, 0.5);
+ transform: translateY(-2px);
}
.theme-preview {
height: 200px;
- background: #f0f0f0;
+ background: #000;
position: relative;
overflow: hidden;
}
@@ -113,33 +222,27 @@
width: 100%;
height: 100%;
object-fit: cover;
- }
-
- .theme-preview-placeholder {
- width: 100%;
- height: 100%;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 3em;
- font-weight: bold;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: white;
+ filter: brightness(1.2) contrast(1.1);
}
.theme-info {
padding: 1.5em;
+ background: rgba(0, 255, 0, 0.05);
}
.theme-name {
- font-size: 1.3em;
- font-weight: bold;
+ font-family: 'Orbitron', monospace;
+ font-size: 1.2em;
+ font-weight: 700;
margin-bottom: 0.5em;
- color: #333;
+ color: #0f0;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
}
.theme-details {
- color: #666;
+ color: #0f0;
+ opacity: 0.7;
font-size: 0.9em;
margin-bottom: 1em;
}
@@ -153,20 +256,22 @@
.tag {
padding: 0.2em 0.8em;
- background: #f0f0f0;
- border-radius: 15px;
- font-size: 0.85em;
- color: #666;
+ background: transparent;
+ border: 1px solid #0f0;
+ font-size: 0.8em;
+ color: #0f0;
+ opacity: 0.7;
+ text-transform: uppercase;
}
- .tag.layout {
- background: #e3f2fd;
- color: #1976d2;
+ .tag.effect {
+ border-color: #0ff;
+ color: #0ff;
}
- .tag.color {
- background: #fce4ec;
- color: #c2185b;
+ .tag.palette {
+ border-color: #f0f;
+ color: #f0f;
}
.theme-actions {
@@ -179,117 +284,79 @@
padding: 0.8em;
text-align: center;
text-decoration: none;
- border-radius: 8px;
+ border: 1px solid #0f0;
+ background: transparent;
+ color: #0f0;
transition: all 0.3s ease;
- font-weight: 500;
- }
-
- .btn-preview {
- background: #667eea;
- color: white;
- }
-
- .btn-preview:hover {
- background: #5a67d8;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ font-family: 'Share Tech Mono', monospace;
}
- .btn-download {
- background: white;
- color: #667eea;
- border: 2px solid #667eea;
- }
-
- .btn-download:hover {
- background: #667eea;
- color: white;
+ .btn:hover {
+ background: #0f0;
+ color: #000;
+ box-shadow: 0 0 10px #0f0;
}
.footer {
text-align: center;
padding: 3em 2em;
- color: #666;
- background: white;
+ color: #0f0;
+ opacity: 0.7;
margin-top: 4em;
+ border-top: 1px solid #0f0;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
}
- .stats {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 2em;
- margin: 3em 0;
- text-align: center;
- }
-
- .stat {
- background: white;
- padding: 2em;
- border-radius: 12px;
- box-shadow: 0 2px 10px rgba(0,0,0,0.05);
- }
-
- .stat-number {
- font-size: 3em;
- font-weight: bold;
- color: #667eea;
+ /* Terminal cursor */
+ .cursor {
+ animation: blink 1s infinite;
}
- .stat-label {
- color: #666;
- margin-top: 0.5em;
- }
-
- @media (max-width: 768px) {
- .header h1 {
- font-size: 2em;
- }
-
- .theme-grid {
- grid-template-columns: 1fr;
- }
+ @keyframes blink {
+ 0%, 49% { opacity: 1; }
+ 50%, 100% { opacity: 0; }
}
</style>
</head>
<body>
- <div class="header">
- <h1>Gemtexter Theme Gallery</h1>
- <p>50 unique, hand-crafted themes for your Gemtext content. Each theme features carefully selected fonts, harmonious color palettes, and distinctive layouts.</p>
- </div>
-
<div class="container">
+ <div class="header">
+ <h1>Gemtexter Retro Themes</h1>
+ <p>50 retro-futuristic single-column themes with 1200px minimum width. Experience the aesthetics of classic terminals and retro computing.</p>
+ </div>
+
<div class="stats">
<div class="stat">
<div class="stat-number">50</div>
- <div class="stat-label">Unique Themes</div>
+ <div class="stat-label">Retro Themes</div>
</div>
<div class="stat">
- <div class="stat-number">24</div>
- <div class="stat-label">Layout Types</div>
+ <div class="stat-number">1200px</div>
+ <div class="stat-label">Min Width</div>
</div>
<div class="stat">
- <div class="stat-number">15</div>
- <div class="stat-label">Font Families</div>
+ <div class="stat-number">1</div>
+ <div class="stat-label">Column Layout</div>
</div>
<div class="stat">
- <div class="stat-number">∞</div>
- <div class="stat-label">Possibilities</div>
+ <div class="stat-number">6</div>
+ <div class="stat-label">Effect Types</div>
</div>
</div>
<div class="filters">
- <h2>Filter by Layout</h2>
+ <h2>Filter by Effect</h2>
<div class="filter-buttons">
<button class="filter-btn active" onclick="filterThemes('all')">All Themes</button>
- <button class="filter-btn" onclick="filterThemes('centered')">Centered</button>
- <button class="filter-btn" onclick="filterThemes('wide')">Wide</button>
- <button class="filter-btn" onclick="filterThemes('magazine')">Magazine</button>
- <button class="filter-btn" onclick="filterThemes('card')">Card</button>
- <button class="filter-btn" onclick="filterThemes('minimal')">Minimal</button>
- <button class="filter-btn" onclick="filterThemes('brutalist')">Brutalist</button>
<button class="filter-btn" onclick="filterThemes('terminal')">Terminal</button>
- <button class="filter-btn" onclick="filterThemes('book')">Book</button>
- <button class="filter-btn" onclick="filterThemes('hero')">Hero</button>
- <button class="filter-btn" onclick="filterThemes('dark')">Dark Themes</button>
- <button class="filter-btn" onclick="filterThemes('light')">Light Themes</button>
+ <button class="filter-btn" onclick="filterThemes('scanlines')">Scanlines</button>
+ <button class="filter-btn" onclick="filterThemes('crt')">CRT</button>
+ <button class="filter-btn" onclick="filterThemes('grid')">Grid</button>
+ <button class="filter-btn" onclick="filterThemes('dots')">Dots</button>
+ <button class="filter-btn" onclick="filterThemes('none')">Clean</button>
</div>
</div>
@@ -299,63 +366,62 @@
</div>
<div class="footer">
- <p>All themes are free to use and include properly licensed fonts.</p>
- <p>Generated with love for the Gemtexter community.</p>
+ <p>System Status: Online | All themes validated for W3C compliance | Retro Mode: Active<span class="cursor">_</span></p>
</div>
<script>
- // Theme data
+ // Theme data from generated metadata
const themes = [
- {name: "vibrant_garden", layout: "hero", colorType: "light", fonts: ["Abril Fatface", "Lato"]},
- {name: "pure_voyage", layout: "brutalist", colorType: "dark", fonts: ["Oxygen", "Lato"]},
- {name: "twilight_nebula", layout: "floating", colorType: "dark", fonts: ["Roboto Slab", "Oxygen"]},
- {name: "mystic_canyon", layout: "future", colorType: "dark", fonts: ["Merriweather", "Oxygen"]},
- {name: "dynamic_forest", layout: "future", colorType: "light", fonts: ["Higher Jump", "Lato"]},
- {name: "soft_horizon", layout: "geometric", colorType: "light", fonts: ["Pixelon", "Oxygen"]},
- {name: "pastel_crystal", layout: "newspaper", colorType: "light", fonts: ["Repetition Scrolling", "Merriweather"]},
- {name: "bright_light", layout: "magazine", colorType: "light", fonts: ["Typewriter", "Roboto Slab"]},
- {name: "crisp_oasis", layout: "asymmetric", colorType: "light", fonts: ["Khand", "Lato"]},
- {name: "sharp_canyon", layout: "card", colorType: "dark", fonts: ["Roboto Slab", "Oxygen"]},
- {name: "strong_breeze", layout: "terminal", colorType: "dark", fonts: ["Oxygen", "Merriweather"]},
- {name: "aurora_dawn", layout: "swiss", colorType: "dark", fonts: ["Merriweather", "Roboto Slab"]},
- {name: "mystic_meadow", layout: "artistic", colorType: "light", fonts: ["Roboto Slab", "Oxygen"]},
- {name: "vibrant_nebula", layout: "overlap", colorType: "dark", fonts: ["Higher Jump", "Oxygen"]},
- {name: "sleek_river", layout: "sidebar", colorType: "light", fonts: ["Pixelon", "Roboto Slab"]},
- {name: "clear_forest", layout: "gradient", colorType: "light", fonts: ["Repetition Scrolling", "Merriweather"]},
- {name: "bold_pulse", layout: "book", colorType: "dark", fonts: ["Typewriter", "Roboto Slab"]},
- {name: "fresh_field", layout: "organic", colorType: "light", fonts: ["Oxygen", "Lato"]},
- {name: "clear_frost", layout: "newspaper", colorType: "dark", fonts: ["Roboto Slab", "Oxygen"]},
- {name: "ember_mountain", layout: "brutalist", colorType: "light", fonts: ["Oxygen", "Lato"]},
- {name: "refined_oasis", layout: "centered", colorType: "dark", fonts: ["Abril Fatface", "Lato"]},
- {name: "sharp_mountain", layout: "wide", colorType: "light", fonts: ["Roboto Slab", "Lato"]},
- {name: "deep_crystal", layout: "geometric", colorType: "dark", fonts: ["Abril Fatface", "Merriweather"]},
- {name: "cozy_wave", layout: "overlap", colorType: "light", fonts: ["Roboto Slab", "Lato"]},
- {name: "ember_mist", layout: "hero", colorType: "dark", fonts: ["Oxygen", "Merriweather"]},
- {name: "vibrant_storm", layout: "technical", colorType: "light", fonts: ["Merriweather", "Roboto Slab"]},
- {name: "pure_storm", layout: "organic", colorType: "dark", fonts: ["Higher Jump", "Oxygen"]},
- {name: "cool_breeze", layout: "artistic", colorType: "light", fonts: ["Pixelon", "Roboto Slab"]},
- {name: "ethereal_mist", layout: "minimal_grid", colorType: "dark", fonts: ["Repetition Scrolling", "Merriweather"]},
- {name: "modern_rhythm", layout: "split", colorType: "light", fonts: ["Typewriter", "Roboto Slab"]},
- {name: "aurora_breeze", layout: "terminal", colorType: "dark", fonts: ["Khand", "Lato"]},
- {name: "muted_oasis", layout: "centered", colorType: "light", fonts: ["Oxygen", "Lato"]},
- {name: "ember_night", layout: "masonry", colorType: "dark", fonts: ["Roboto Slab", "Lato"]},
- {name: "modern_storm", layout: "book", colorType: "light", fonts: ["Oxygen", "Oxygen"]},
- {name: "amber_glacier", layout: "magazine", colorType: "dark", fonts: ["Roboto Slab", "Merriweather"]},
- {name: "twilight_horizon", layout: "card", colorType: "light", fonts: ["Merriweather", "Roboto Slab"]},
- {name: "gentle_glacier", layout: "swiss", colorType: "dark", fonts: ["Roboto Slab", "Oxygen"]},
- {name: "deep_sky", layout: "future", colorType: "light", fonts: ["Higher Jump", "Oxygen"]},
- {name: "smooth_echo", layout: "sidebar", colorType: "dark", fonts: ["Pixelon", "Roboto Slab"]},
- {name: "refined_aurora", layout: "wide", colorType: "light", fonts: ["Repetition Scrolling", "Merriweather"]},
- {name: "radiant_voyage", layout: "gradient", colorType: "dark", fonts: ["Typewriter", "Roboto Slab"]},
- {name: "cosmic_odyssey", layout: "hero", colorType: "light", fonts: ["Oxygen", "Lato"]},
- {name: "neon_storm", layout: "brutalist", colorType: "dark", fonts: ["Abril Fatface", "Lato"]},
- {name: "cosmic_dusk", layout: "retro", colorType: "light", fonts: ["Roboto Slab", "Oxygen"]},
- {name: "cozy_crystal", layout: "asymmetric", colorType: "dark", fonts: ["Oxygen", "Lato"]},
- {name: "clean_rhythm", layout: "floating", colorType: "light", fonts: ["Merriweather", "Oxygen"]},
- {name: "pastel_canyon", layout: "minimal_grid", colorType: "dark", fonts: ["Higher Jump", "Lato"]},
- {name: "clean_garden", layout: "newspaper", colorType: "light", fonts: ["Pixelon", "Oxygen"]},
- {name: "twilight_meadow", layout: "masonry", colorType: "dark", fonts: ["Roboto Slab", "Oxygen"]},
- {name: "bright_spark", layout: "split", colorType: "light", fonts: ["Roboto Slab", "Oxygen"]}
+ {name: "phosphor_stream", palette: "cyberpunk", effect: "crt"},
+ {name: "neutron_portal", palette: "retro_orange", effect: "terminal"},
+ {name: "quantum_matrix", palette: "amber_crt", effect: "grid"},
+ {name: "analog_buffer", palette: "matrix", effect: "none"},
+ {name: "classic_wave", palette: "vapor", effect: "dots"},
+ {name: "synthwave_nexus", palette: "synthwave", effect: "dots"},
+ {name: "transistor_dimension", palette: "vapor", effect: "grid"},
+ {name: "stellar_console", palette: "phosphor", effect: "terminal"},
+ {name: "pixel_portal", palette: "cyberpunk", effect: "none"},
+ {name: "cyber_sphere", palette: "retro_orange", effect: "crt"},
+ {name: "binary_compiler", palette: "retro_orange", effect: "none"},
+ {name: "neutron_console", palette: "matrix", effect: "terminal"},
+ {name: "transistor_pulse", palette: "dos_classic", effect: "crt"},
+ {name: "terminal_console", palette: "synthwave", effect: "terminal"},
+ {name: "terminal_hub", palette: "matrix", effect: "terminal"},
+ {name: "grid_engine", palette: "cyberpunk", effect: "grid"},
+ {name: "circuit_processor", palette: "blue_crt", effect: "dots"},
+ {name: "binary_system", palette: "dos_classic", effect: "crt"},
+ {name: "cyber_database", palette: "retro_orange", effect: "grid"},
+ {name: "analog_dimension", palette: "blue_crt", effect: "terminal"},
+ {name: "cosmic_reactor", palette: "retro_orange", effect: "scanlines"},
+ {name: "cosmic_prism", palette: "dos_classic", effect: "dots"},
+ {name: "retro_nexus", palette: "retro_orange", effect: "scanlines"},
+ {name: "phosphor_engine", palette: "dos_classic", effect: "scanlines"},
+ {name: "fusion_core", palette: "blue_crt", effect: "crt"},
+ {name: "cosmic_cache", palette: "cyberpunk", effect: "none"},
+ {name: "synthwave_mainframe", palette: "synthwave", effect: "none"},
+ {name: "silicon_prism", palette: "terminal_green", effect: "dots"},
+ {name: "laser_core", palette: "phosphor", effect: "crt"},
+ {name: "cosmic_grid", palette: "cyberpunk", effect: "crt"},
+ {name: "cathode_gateway", palette: "synthwave", effect: "grid"},
+ {name: "transistor_node", palette: "blue_crt", effect: "crt"},
+ {name: "cathode_simulation", palette: "blue_crt", effect: "crt"},
+ {name: "phosphor_runtime", palette: "amber_crt", effect: "crt"},
+ {name: "outrun_memory", palette: "vapor", effect: "grid"},
+ {name: "classic_processor", palette: "matrix", effect: "grid"},
+ {name: "circuit_circuit", palette: "vapor", effect: "dots"},
+ {name: "binary_terminal", palette: "synthwave", effect: "terminal"},
+ {name: "monochrome_prism", palette: "blue_crt", effect: "crt"},
+ {name: "matrix_cache", palette: "terminal_green", effect: "scanlines"},
+ {name: "arcade_pulse", palette: "matrix", effect: "crt"},
+ {name: "magnetic_processor", palette: "dos_classic", effect: "crt"},
+ {name: "neutron_gateway", palette: "retro_orange", effect: "none"},
+ {name: "vector_compiler", palette: "dos_classic", effect: "none"},
+ {name: "vacuum_array", palette: "amber_crt", effect: "scanlines"},
+ {name: "neon_deck", palette: "matrix", effect: "crt"},
+ {name: "cathode_dimension", palette: "matrix", effect: "scanlines"},
+ {name: "quantum_core", palette: "cyberpunk", effect: "dots"},
+ {name: "classic_matrix", palette: "cyberpunk", effect: "terminal"},
+ {name: "mainframe_void", palette: "matrix", effect: "none"}
];
// Generate theme cards
@@ -365,25 +431,24 @@
themes.forEach(theme => {
const card = document.createElement('div');
card.className = 'theme-card';
- card.setAttribute('data-layout', theme.layout);
- card.setAttribute('data-color', theme.colorType);
-
- const initial = theme.name.split('_').map(w => w[0].toUpperCase()).join('');
+ card.setAttribute('data-effect', theme.effect);
+ card.setAttribute('data-palette', theme.palette);
card.innerHTML = `
<div class="theme-preview">
- ${getThemePreview(theme)}
+ <img src="screenshots/${theme.name}.png" alt="${theme.name} preview"
+ onerror="this.src='screenshots/default.png'">
</div>
<div class="theme-info">
- <div class="theme-name">${theme.name.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase())}</div>
- <div class="theme-details">${theme.fonts.join(' + ')}</div>
+ <div class="theme-name">${theme.name.replace(/_/g, ' ')}</div>
+ <div class="theme-details">Retro ${theme.palette.replace(/_/g, ' ')} theme</div>
<div class="theme-tags">
- <span class="tag layout">${theme.layout.replace(/_/g, ' ')}</span>
- <span class="tag color">${theme.colorType}</span>
+ <span class="tag effect">${theme.effect}</span>
+ <span class="tag palette">${theme.palette.replace(/_/g, ' ')}</span>
</div>
<div class="theme-actions">
- <a href="${theme.name}/example.html" class="btn btn-preview">Preview</a>
- <a href="#" class="btn btn-download" onclick="downloadTheme('${theme.name}'); return false;">Download</a>
+ <a href="${theme.name}/example.html" class="btn">Preview</a>
+ <a href="#" class="btn" onclick="downloadTheme('${theme.name}'); return false;">Download</a>
</div>
</div>
`;
@@ -392,42 +457,6 @@
});
}
- function getThemePreview(theme) {
- // Check if screenshot exists and use it, otherwise show placeholder
- const screenshotPath = `screenshots/${theme.name}.png`;
-
- // Use the actual screenshot image
- return `
- <img src="${screenshotPath}" alt="${theme.name} preview"
- onerror="this.onerror=null; this.outerHTML=getFallbackPreview('${theme.name}', '${theme.layout}', '${theme.colorType}');"
- style="width: 100%; height: 100%; object-fit: cover;">
- `;
- }
-
- function getFallbackPreview(name, layout, colorType) {
- // Fallback placeholder if image fails to load
- const colors = {
- 'dark': ['#0a0a0a', '#1a1a1a', '#2a2a2a'],
- 'light': ['#ffffff', '#f8f8f8', '#eeeeee']
- };
-
- const bgColor = colors[colorType][0];
- const accentColor = colorType === 'dark' ? '#667eea' : '#764ba2';
- const textColor = colorType === 'dark' ? '#ffffff' : '#1a1a1a';
-
- return `
- <div class="theme-preview-placeholder" style="background: ${bgColor}; color: ${textColor}; position: relative; overflow: hidden;">
- <div style="position: absolute; top: 0; left: 0; right: 0; height: 60px; background: ${accentColor}; opacity: 0.8;"></div>
- <div style="position: relative; z-index: 1; font-size: 2.5em; text-shadow: 2px 2px 4px rgba(0,0,0,0.3);">
- ${name.split('_').map(w => w[0].toUpperCase()).join('')}
- </div>
- <div style="position: absolute; bottom: 10px; left: 10px; right: 10px; font-size: 0.8em; opacity: 0.7;">
- ${layout.replace(/_/g, ' ')}
- </div>
- </div>
- `;
- }
-
// Filter themes
function filterThemes(filter) {
const cards = document.querySelectorAll('.theme-card');
@@ -445,23 +474,18 @@
cards.forEach(card => {
if (filter === 'all') {
card.style.display = 'block';
- } else if (filter === 'dark' || filter === 'light') {
- card.style.display = card.getAttribute('data-color') === filter ? 'block' : 'none';
} else {
- const layout = card.getAttribute('data-layout');
- card.style.display = layout.includes(filter) ? 'block' : 'none';
+ const effect = card.getAttribute('data-effect');
+ card.style.display = effect === filter ? 'block' : 'none';
}
});
}
- // Download theme (placeholder function)
+ // Download theme info
function downloadTheme(themeName) {
- alert(`To use the "${themeName}" theme:\n\n1. Copy the ${themeName} directory to your themes folder\n2. Set HTML_THEME_DIR=./extras/html/themes/${themeName} in your gemtexter.conf\n3. Run ./gemtexter --generate to apply the theme`);
+ alert(`SYSTEM MESSAGE:\n\nTo activate "${themeName}" theme:\n\n1. Copy ${themeName} directory to themes folder\n2. Set HTML_THEME_DIR=./extras/html/themes/${themeName}\n3. Execute: ./gemtexter --generate\n\nTheme features single-column layout with 1200px minimum width.`);
}
- // Make getFallbackPreview available globally for onerror handler
- window.getFallbackPreview = getFallbackPreview;
-
// Initialize
generateThemeCards();
</script>