diff --git a/public/themes/computers/locales/en.json b/public/themes/computers/locales/en.json new file mode 100644 index 0000000..68eafe4 --- /dev/null +++ b/public/themes/computers/locales/en.json @@ -0,0 +1,55 @@ +{ + "theme": { + "name": "Computers & GalliumCoin", + "title": "GalliumCoin Mining Lab", + "res": { "units": "CPU Power", "unit": "cycle", "funds": "GalliumCoin", "material": "Energy (W)" }, + "fmt": { "funds": "{value} GAL" }, + "action": { "make": "Run a computation", "buyMaterial": "Buy energy" }, + "gen": { + "gen1": { "name": "Old Laptop", "desc": "Fans screaming, but it still crunches numbers." }, + "gen2": { "name": "Gaming PC", "desc": "The RGB lighting adds at least 10% more power." }, + "gen3": { "name": "GPU Mining Rig", "desc": "Six graphics cards and a prayer." }, + "gen4": { "name": "Server Rack", "desc": "Forty-two units of blinking lights." }, + "gen5": { "name": "Data Center", "desc": "A warehouse of racks and an industrial cooling plant." }, + "gen6": { "name": "Quantum Mainframe", "desc": "Computes every possibility at once." } + }, + "upg": { + "click_1": "Mechanical Keyboard", + "click_2": "Keyboard Macros", + "click_3": "Neural Interface", + "g1_a": "Thermal Paste", + "g1_b": "Fresh OS Install", + "g2_a": "Liquid Cooling", + "g2_b": "Overclocking", + "g3_a": "Custom BIOS", + "g3_b": "Memory Timing Tuning", + "g4_a": "Hot-Swap Drives", + "g4_b": "Load Balancer", + "g5_a": "Redundant Power Lines", + "g5_b": "Free Cooling (Arctic Site)", + "g6_a": "Cryogenic Coolant", + "g6_b": "Entangled Qubits", + "global_1": "Firmware Update", + "global_2": "Parallel Computing", + "global_3": "Learning Scheduler", + "global_4": "Distributed Grid", + "demand_1": "Forum Hype", + "demand_2": "Tech Influencers", + "demand_3": "Exchange Listing", + "demand_4": "Global Hype Cycle", + "value_1": "Shiny Whitepaper", + "value_2": "Celebrity Endorsement", + "value_3": "To The Moon", + "mat_eff_1": "Efficient PSU", + "mat_eff_2": "Low-Power Chips", + "mat_disc_1": "Off-Peak Contract", + "mat_disc_2": "Own Solar Farm", + "stack_1": "Bigger Batteries", + "stack_2": "Capacitor Banks", + "stack_3": "Grid Substation", + "stack_4": "Dedicated Power Line", + "stack_5": "Private Power Plant", + "auto_buy": "Smart Power Meter" + } + } +} diff --git a/public/themes/computers/locales/fr.json b/public/themes/computers/locales/fr.json new file mode 100644 index 0000000..7783712 --- /dev/null +++ b/public/themes/computers/locales/fr.json @@ -0,0 +1,55 @@ +{ + "theme": { + "name": "Ordinateurs et GalliumCoin", + "title": "Laboratoire de minage GalliumCoin", + "res": { "units": "Puissance CPU", "unit": "cycle", "funds": "GalliumCoin", "material": "Énergie (W)" }, + "fmt": { "funds": "{value} GAL" }, + "action": { "make": "Lancer un calcul", "buyMaterial": "Acheter de l'énergie" }, + "gen": { + "gen1": { "name": "Vieux portable", "desc": "Les ventilateurs hurlent, mais il calcule encore." }, + "gen2": { "name": "PC gamer", "desc": "Les LED RGB ajoutent au moins 10 % de puissance." }, + "gen3": { "name": "Rig de minage GPU", "desc": "Six cartes graphiques et une prière." }, + "gen4": { "name": "Baie de serveurs", "desc": "Quarante-deux unités de lumières clignotantes." }, + "gen5": { "name": "Centre de données", "desc": "Un entrepôt de baies et une centrale de refroidissement industrielle." }, + "gen6": { "name": "Mainframe quantique", "desc": "Calcule toutes les possibilités à la fois." } + }, + "upg": { + "click_1": "Clavier mécanique", + "click_2": "Macros de clavier", + "click_3": "Interface neuronale", + "g1_a": "Pâte thermique", + "g1_b": "Réinstallation propre", + "g2_a": "Watercooling", + "g2_b": "Overclocking", + "g3_a": "BIOS personnalisé", + "g3_b": "Réglage des timings mémoire", + "g4_a": "Disques à chaud", + "g4_b": "Répartiteur de charge", + "g5_a": "Lignes électriques redondantes", + "g5_b": "Refroidissement naturel (site arctique)", + "g6_a": "Liquide cryogénique", + "g6_b": "Qubits intriqués", + "global_1": "Mise à jour du firmware", + "global_2": "Calcul parallèle", + "global_3": "Ordonnanceur apprenant", + "global_4": "Grille distribuée", + "demand_1": "Buzz sur les forums", + "demand_2": "Influenceurs tech", + "demand_3": "Cotation sur une plateforme", + "demand_4": "Cycle de hype mondial", + "value_1": "Livre blanc clinquant", + "value_2": "Soutien d'une célébrité", + "value_3": "Vers la Lune", + "mat_eff_1": "Alimentation efficace", + "mat_eff_2": "Puces basse consommation", + "mat_disc_1": "Contrat heures creuses", + "mat_disc_2": "Ferme solaire perso", + "stack_1": "Batteries plus grosses", + "stack_2": "Bancs de condensateurs", + "stack_3": "Poste de transformation", + "stack_4": "Ligne électrique dédiée", + "stack_5": "Centrale privée", + "auto_buy": "Compteur intelligent" + } + } +} diff --git a/public/themes/computers/theme.css b/public/themes/computers/theme.css new file mode 100644 index 0000000..6795e7b --- /dev/null +++ b/public/themes/computers/theme.css @@ -0,0 +1,15 @@ +/* Computers: a dark control-room console. */ +:root[data-theme='computers'] { + color-scheme: dark; + --bg: #0d1117; + --surface: #161b22; + --surface-2: #21262d; + --text: #e6edf3; + --text-muted: #9aa5b1; + --border: #30363d; + --accent: #1f6feb; + --accent-contrast: #ffffff; + --danger: #f85149; + --radius: 6px; + --font: 'Segoe UI', Inter, system-ui, -apple-system, sans-serif; +} diff --git a/public/themes/computers/theme.json b/public/themes/computers/theme.json new file mode 100644 index 0000000..4b3a0d0 --- /dev/null +++ b/public/themes/computers/theme.json @@ -0,0 +1,4 @@ +{ + "order": 5, + "assets": {} +} diff --git a/tests/server.test.js b/tests/server.test.js index 546186a..0840bb8 100644 --- a/tests/server.test.js +++ b/tests/server.test.js @@ -19,7 +19,7 @@ test('resolveSafe stays inside the public directory', () => { test('/api/themes lists installed themes with their languages', async () => { const themes = await handleApi(PUBLIC_DIR, '/api/themes'); const ids = themes.map((t) => t.id); - for (const id of ['paperclip', 'witch', 'alien', 'insects']) assert.ok(ids.includes(id), id); + for (const id of ['paperclip', 'witch', 'alien', 'insects', 'computers']) assert.ok(ids.includes(id), id); assert.deepEqual(themes.find((t) => t.id === 'paperclip').locales, ['en', 'fr']); });