diff --git a/manifests/m/m5dev/nintendo-nkit/3.1.0/manifest.json b/manifests/m/m5dev/nintendo-nkit/3.1.0/manifest.json new file mode 100644 index 0000000..740d184 --- /dev/null +++ b/manifests/m/m5dev/nintendo-nkit/3.1.0/manifest.json @@ -0,0 +1,40 @@ +{ + "id": "nintendo-nkit", + "name": "Nintendo NKit & ZArchive Suite", + "version": "3.1.0", + "author": "Claus Valca", + "publisher_id": "m5dev", + "min_core_version": "3.9.0", + "license": "MIT", + "description": "Standalone NKit suite for Nintendo GameCube, Wii, and Wii U ZArchive compression.", + "homepage": "https://github.com/M5Devs", + "icon": "https://raw.githubusercontent.com/M5Devs/OpenROM-Plugins-Store/main/packages/wiiu.png", + "download_url": "https://github.com/M5Devs/OpenROM-Plugins-Store/releases/download/v3.1.0/nintendo-nkit.orplug", + "tags": [ + "nintendo", + "nkit", + "zarchive", + "wua", + "wiiu", + "gamecube" + ], + "extensions": [ + ".iso", + ".wud", + ".wux", + ".nkit.iso", + ".wua" + ], + "binaries": { + "win32": "nkit.exe", + "linux": "nkit", + "darwin": "nkit" + }, + "conversions": [ + { + "from": "WUD", + "to": "WUA", + "command": "{bin} convert --in {input} --out {output}" + } + ] +} diff --git a/manifests/m/m5dev/saturn-ssp/1.0.0/manifest.json b/manifests/m/m5dev/saturn-ssp/1.0.0/manifest.json index a49487f..2556bde 100644 --- a/manifests/m/m5dev/saturn-ssp/1.0.0/manifest.json +++ b/manifests/m/m5dev/saturn-ssp/1.0.0/manifest.json @@ -2,19 +2,36 @@ "id": "saturn-ssp", "name": "Sega Saturn Patcher (SSP)", "version": "1.0.0", - "author": "m5dev", + "author": "Claus Valca", + "publisher_id": "m5dev", + "min_core_version": "3.9.0", + "license": "MIT", "description": "Specialized Sega Saturn Patcher disc modification tool.", - "conversions": [ - "SSP" - ], + "homepage": "https://github.com/M5Devs", + "icon": "https://raw.githubusercontent.com/M5Devs/OpenROM-Plugins-Store/main/packages/saturn.png", + "download_url": "https://github.com/M5Devs/OpenROM-Plugins-Store/releases/download/v1.0.0/saturn-ssp.orplug", "tags": [ "saturn", "ssp", "patcher", "sega" ], - "icon": "https://raw.githubusercontent.com/M5Devs/OpenROM-Plugins-Store/main/packages/saturn.png", - "download_url": "https://github.com/M5Devs/OpenROM-Plugins-Store/releases/download/v1.0.0/saturn-ssp.orplug", - "homepage": "https://github.com/M5Devs", - "license": "MIT" + "extensions": [ + ".bin", + ".cue", + ".iso", + ".ssp" + ], + "binaries": { + "win32": "ssp.exe", + "linux": "ssp", + "darwin": "ssp" + }, + "conversions": [ + { + "from": "ISO", + "to": "SSP", + "command": "{bin} -i {input} -o {output}" + } + ] } diff --git a/manifests/m/m5dev/wiiu-nkit/3.1.0/manifest.json b/manifests/m/m5dev/wiiu-nkit/3.1.0/manifest.json deleted file mode 100644 index 26254f1..0000000 --- a/manifests/m/m5dev/wiiu-nkit/3.1.0/manifest.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "wiiu-nkit", - "name": "Wii U NKit & ZArchive Suite", - "version": "3.1.0", - "author": "m5dev", - "description": "Standalone NKit v3.1.0 suite for Wii U ZArchive compression.", - "conversions": [ - "WUA", - "WUD", - "WUX" - ], - "tags": [ - "wiiu", - "nkit", - "zarchive", - "wua" - ], - "icon": "https://raw.githubusercontent.com/M5Devs/OpenROM-Plugins-Store/main/packages/wiiu.png", - "download_url": "https://github.com/M5Devs/OpenROM-Plugins-Store/releases/download/v3.1.0/wiiu-nkit.orplug", - "homepage": "https://github.com/M5Devs", - "license": "GPL-3.0" -} diff --git a/manifests/m/m5dev/xbox360-tools/1.0.0/manifest.json b/manifests/m/m5dev/xbox360-tools/1.0.0/manifest.json index b639db0..3bb2741 100644 --- a/manifests/m/m5dev/xbox360-tools/1.0.0/manifest.json +++ b/manifests/m/m5dev/xbox360-tools/1.0.0/manifest.json @@ -2,20 +2,35 @@ "id": "xbox360-tools", "name": "Xbox 360 ZAR & XISO Tools", "version": "1.0.0", - "author": "m5dev", + "author": "Claus Valca", + "publisher_id": "m5dev", + "min_core_version": "3.9.0", + "license": "MIT", "description": "Extract XISO and compress to .zar for Xenia Edge.", - "conversions": [ - "ZAR", - "XISO" - ], + "homepage": "https://github.com/M5Devs", + "icon": "https://raw.githubusercontent.com/M5Devs/OpenROM-Plugins-Store/main/packages/xbox360.png", + "download_url": "https://github.com/M5Devs/OpenROM-Plugins-Store/releases/download/v1.0.0/xbox360-tools.orplug", "tags": [ "xbox360", "xiso", "zar", "xenia" ], - "icon": "https://raw.githubusercontent.com/M5Devs/OpenROM-Plugins-Store/main/packages/xbox360.png", - "download_url": "https://github.com/M5Devs/OpenROM-Plugins-Store/releases/download/v1.0.0/xbox360-tools.orplug", - "homepage": "https://github.com/M5Devs", - "license": "MIT" + "extensions": [ + ".iso", + ".zar", + ".xiso" + ], + "binaries": { + "win32": "zar_tool.exe", + "linux": "zar_tool", + "darwin": "zar_tool" + }, + "conversions": [ + { + "from": "XISO", + "to": "ZAR", + "command": "{bin} compress --input {input} --output {output}" + } + ] } diff --git a/public/api/catalog.json b/public/api/catalog.json index ca4f6a6..fa5340a 100644 --- a/public/api/catalog.json +++ b/public/api/catalog.json @@ -1,60 +1,101 @@ { "version": "1.0", - "generated_at": "2026-10-17T12:33:54.587039+00:00", + "generated_at": "2026-10-17T13:01:46.676997+00:00", "total_plugins": 3, "plugins": [ { - "id": "saturn-ssp", - "name": "Sega Saturn Patcher (SSP)", - "version": "1.0.0", - "author": "m5dev", - "description": "Specialized Sega Saturn Patcher disc modification tool.", - "conversions": [ - "SSP" - ], + "id": "nintendo-nkit", + "name": "Nintendo NKit & ZArchive Suite", + "version": "3.1.0", + "author": "Claus Valca", + "publisher_id": "m5dev", + "min_core_version": "3.9.0", + "license": "MIT", + "description": "Standalone NKit suite for Nintendo GameCube, Wii, and Wii U ZArchive compression.", + "homepage": "https://github.com/M5Devs", + "icon": "https://raw.githubusercontent.com/M5Devs/OpenROM-Plugins-Store/main/packages/wiiu.png", + "download_url": "https://github.com/M5Devs/OpenROM-Plugins-Store/releases/download/v3.1.0/nintendo-nkit.orplug", "tags": [ - "saturn", - "ssp", - "patcher", - "sega" + "nintendo", + "nkit", + "zarchive", + "wua", + "wiiu", + "gamecube" + ], + "extensions": [ + ".iso", + ".wud", + ".wux", + ".nkit.iso", + ".wua" + ], + "binaries": { + "win32": "nkit.exe", + "linux": "nkit", + "darwin": "nkit" + }, + "conversions": [ + { + "from": "WUD", + "to": "WUA", + "command": "{bin} convert --in {input} --out {output}" + } ], - "icon": "https://raw.githubusercontent.com/M5Devs/OpenROM-Plugins-Store/main/packages/saturn.png", - "download_url": "https://github.com/M5Devs/OpenROM-Plugins-Store/releases/download/v1.0.0/saturn-ssp.orplug", - "homepage": "https://github.com/M5Devs", - "license": "MIT", "publisher": { "id": "m5dev", - "name": "Yusuf Ezz (M5 Dev)", + "name": "Claus Valca (M5 Dev)", + "github_username": "ClausValcaTD", "github": "https://github.com/M5Devs", + "avatar_url": "https://github.com/ClausValcaTD.png", + "bio": "Creator & Core Architect of OpenROM and Official Plugin Toolchains", "is_verified": true, "badge": "Core Architect" } }, { - "id": "wiiu-nkit", - "name": "Wii U NKit & ZArchive Suite", - "version": "3.1.0", - "author": "m5dev", - "description": "Standalone NKit v3.1.0 suite for Wii U ZArchive compression.", - "conversions": [ - "WUA", - "WUD", - "WUX" - ], + "id": "saturn-ssp", + "name": "Sega Saturn Patcher (SSP)", + "version": "1.0.0", + "author": "Claus Valca", + "publisher_id": "m5dev", + "min_core_version": "3.9.0", + "license": "MIT", + "description": "Specialized Sega Saturn Patcher disc modification tool.", + "homepage": "https://github.com/M5Devs", + "icon": "https://raw.githubusercontent.com/M5Devs/OpenROM-Plugins-Store/main/packages/saturn.png", + "download_url": "https://github.com/M5Devs/OpenROM-Plugins-Store/releases/download/v1.0.0/saturn-ssp.orplug", "tags": [ - "wiiu", - "nkit", - "zarchive", - "wua" + "saturn", + "ssp", + "patcher", + "sega" + ], + "extensions": [ + ".bin", + ".cue", + ".iso", + ".ssp" + ], + "binaries": { + "win32": "ssp.exe", + "linux": "ssp", + "darwin": "ssp" + }, + "conversions": [ + { + "from": "ISO", + "to": "SSP", + "command": "{bin} -i {input} -o {output}" + } ], - "icon": "https://raw.githubusercontent.com/M5Devs/OpenROM-Plugins-Store/main/packages/wiiu.png", - "download_url": "https://github.com/M5Devs/OpenROM-Plugins-Store/releases/download/v3.1.0/wiiu-nkit.orplug", - "homepage": "https://github.com/M5Devs", - "license": "GPL-3.0", "publisher": { "id": "m5dev", - "name": "Yusuf Ezz (M5 Dev)", + "name": "Claus Valca (M5 Dev)", + "github_username": "ClausValcaTD", "github": "https://github.com/M5Devs", + "avatar_url": "https://github.com/ClausValcaTD.png", + "bio": "Creator & Core Architect of OpenROM and Official Plugin Toolchains", "is_verified": true, "badge": "Core Architect" } @@ -63,26 +104,44 @@ "id": "xbox360-tools", "name": "Xbox 360 ZAR & XISO Tools", "version": "1.0.0", - "author": "m5dev", + "author": "Claus Valca", + "publisher_id": "m5dev", + "min_core_version": "3.9.0", + "license": "MIT", "description": "Extract XISO and compress to .zar for Xenia Edge.", - "conversions": [ - "ZAR", - "XISO" - ], + "homepage": "https://github.com/M5Devs", + "icon": "https://raw.githubusercontent.com/M5Devs/OpenROM-Plugins-Store/main/packages/xbox360.png", + "download_url": "https://github.com/M5Devs/OpenROM-Plugins-Store/releases/download/v1.0.0/xbox360-tools.orplug", "tags": [ "xbox360", "xiso", "zar", "xenia" ], - "icon": "https://raw.githubusercontent.com/M5Devs/OpenROM-Plugins-Store/main/packages/xbox360.png", - "download_url": "https://github.com/M5Devs/OpenROM-Plugins-Store/releases/download/v1.0.0/xbox360-tools.orplug", - "homepage": "https://github.com/M5Devs", - "license": "MIT", + "extensions": [ + ".iso", + ".zar", + ".xiso" + ], + "binaries": { + "win32": "zar_tool.exe", + "linux": "zar_tool", + "darwin": "zar_tool" + }, + "conversions": [ + { + "from": "XISO", + "to": "ZAR", + "command": "{bin} compress --input {input} --output {output}" + } + ], "publisher": { "id": "m5dev", - "name": "Yusuf Ezz (M5 Dev)", + "name": "Claus Valca (M5 Dev)", + "github_username": "ClausValcaTD", "github": "https://github.com/M5Devs", + "avatar_url": "https://github.com/ClausValcaTD.png", + "bio": "Creator & Core Architect of OpenROM and Official Plugin Toolchains", "is_verified": true, "badge": "Core Architect" } diff --git a/public/index.html b/public/index.html index 60497e1..6b03f53 100644 --- a/public/index.html +++ b/public/index.html @@ -9,16 +9,19 @@
@@ -26,29 +29,42 @@

OpenROM Plugin Store

-

Discover, install, and compress retro ROM archives effortlessly. Community-driven conversion extensions for OpenROM ecosystem.

+

Discover, install, and compress retro ROM archives effortlessly. Official and community tools for the OpenROM toolchain ecosystem.

+ +
+ + + + +
- +
+ + diff --git a/public/plugin.html b/public/plugin.html new file mode 100644 index 0000000..3c54fd6 --- /dev/null +++ b/public/plugin.html @@ -0,0 +1,207 @@ + + + + + + Plugin Details - OpenROM Plugin Store + + + +
+ +
+ +
+ + ← Back to Store + + +
+
Loading plugin details...
+
+
+ + + + + + diff --git a/public/publisher.html b/public/publisher.html new file mode 100644 index 0000000..afa94b1 --- /dev/null +++ b/public/publisher.html @@ -0,0 +1,224 @@ + + + + + + Publisher Profile - OpenROM Plugin Store + + + +
+ +
+ +
+ + ← Back to Store + + +
+
Loading publisher profile...
+
+ +

Maintained Plugins

+
+ +
+
+ + + + + + diff --git a/public/styles.css b/public/styles.css index f986c17..8f1d629 100644 --- a/public/styles.css +++ b/public/styles.css @@ -1,21 +1,21 @@ :root { - --bg-dark: #0b0e14; - --bg-card: #151a23; - --bg-card-hover: #1c2330; - --text-main: #e6edf3; - --text-muted: #8b949e; - --accent-cyan: #00f2ff; - --accent-purple: #9d4edd; - --accent-blue: #38bdf8; - --border-color: #30363d; - --badge-bg: rgba(0, 242, 255, 0.1); - --badge-border: rgba(0, 242, 255, 0.3); - --btn-green: #238636; - --btn-green-hover: #2ea043; - --btn-blue: #1f6feb; - --btn-blue-hover: #388bfd; - --font-mono: 'Fira Code', 'Courier New', monospace; - --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --bg-dark: #090910; + --bg-surface: #10101a; + --bg-card: #141420; + --bg-card-hover: #1b1b2e; + --bg-input: #0d0d16; + --text-main: #e2e8f0; + --text-muted: #94a3b8; + --text-bright: #ffffff; + --accent-cyan: #00e5ff; + --verified-blue: #38bdf8; + --accent-purple: #a855f7; + --accent-green: #10b981; + --border-color: #222238; + --border-highlight: #00e5ff; + --font-mono: 'Fira Code', 'JetBrains Mono', 'Courier New', monospace; + --font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + --shadow-glow: 0 0 15px rgba(0, 229, 255, 0.25); } * { @@ -34,10 +34,10 @@ body { min-height: 100vh; } -/* Header */ +/* Header & Nav */ header { - background-color: rgba(21, 26, 35, 0.8); - backdrop-filter: blur(10px); + background-color: rgba(16, 16, 26, 0.9); + backdrop-filter: blur(12px); border-bottom: 1px solid var(--border-color); position: sticky; top: 0; @@ -58,8 +58,8 @@ header { align-items: center; gap: 0.75rem; font-size: 1.25rem; - font-weight: 700; - color: #fff; + font-weight: 800; + color: var(--text-bright); text-decoration: none; font-family: var(--font-mono); letter-spacing: -0.5px; @@ -68,15 +68,15 @@ header { .logo-icon { background: linear-gradient(135deg, var(--accent-cyan), var(--accent-purple)); color: #000; - width: 36px; - height: 36px; + width: 38px; + height: 38px; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-weight: 900; - font-size: 1.2rem; - box-shadow: 0 0 15px rgba(0, 242, 255, 0.4); + font-size: 1.1rem; + box-shadow: var(--shadow-glow); } .logo span { @@ -85,94 +85,144 @@ header { .nav-links { display: flex; + align-items: center; gap: 1.5rem; } .nav-links a { color: var(--text-muted); text-decoration: none; - font-weight: 500; + font-weight: 600; font-size: 0.95rem; - transition: color 0.2s; + transition: all 0.2s; display: flex; align-items: center; gap: 0.4rem; } -.nav-links a:hover { +.nav-links a:hover, .nav-links a.active { + color: var(--accent-cyan); +} + +.nav-links .btn-login { + background: var(--bg-card); + border: 1px solid var(--border-color); + padding: 0.4rem 0.9rem; + border-radius: 6px; + color: var(--text-main); +} + +.nav-links .btn-login:hover { + border-color: var(--accent-cyan); color: var(--accent-cyan); } +/* Mobile Nav Toggle */ +.mobile-menu-btn { + display: none; + background: none; + border: none; + color: var(--text-main); + font-size: 1.5rem; + cursor: pointer; +} + /* Hero Section */ .hero { - background: radial-gradient(circle at 50% 20%, rgba(157, 78, 221, 0.15), transparent 70%); - padding: 4rem 1.5rem 3rem; + background: radial-gradient(circle at 50% 0%, rgba(0, 229, 255, 0.12), transparent 70%); + padding: 3.5rem 1.5rem 2.5rem; text-align: center; - border-bottom: 1px solid rgba(48, 54, 61, 0.5); + border-bottom: 1px solid var(--border-color); } .hero-content { - max-width: 800px; + max-width: 850px; margin: 0 auto; } .hero h1 { font-size: 2.75rem; - font-weight: 800; + font-weight: 900; margin-bottom: 1rem; background: linear-gradient(90deg, #ffffff, var(--accent-cyan)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; - line-height: 1.2; + letter-spacing: -0.5px; } .hero p { font-size: 1.15rem; color: var(--text-muted); - margin-bottom: 2rem; + margin-bottom: 1.5rem; } -/* Search and Controls */ +/* Controls & Filter Chips */ .controls-container { max-width: 1200px; - margin: -1.5rem auto 2rem; + margin: 1.5rem auto 2rem; padding: 0 1.5rem; display: flex; - gap: 1rem; - align-items: center; + flex-direction: column; + gap: 1.25rem; } .search-bar { - flex: 1; position: relative; + width: 100%; } .search-bar input { width: 100%; - padding: 0.85rem 1.25rem 0.85rem 2.8rem; + padding: 0.9rem 1.25rem 0.9rem 3rem; background-color: var(--bg-card); border: 1px solid var(--border-color); - border-radius: 8px; - color: var(--text-main); + border-radius: 10px; + color: var(--text-bright); font-size: 1rem; outline: none; - transition: border-color 0.2s, box-shadow 0.2s; + transition: all 0.2s; } .search-bar input:focus { border-color: var(--accent-cyan); - box-shadow: 0 0 10px rgba(0, 242, 255, 0.2); + box-shadow: var(--shadow-glow); } .search-icon { position: absolute; - left: 1rem; + left: 1.1rem; top: 50%; transform: translateY(-50%); color: var(--text-muted); } -/* Main Grid */ +.filter-chips { + display: flex; + flex-wrap: wrap; + gap: 0.6rem; + align-items: center; +} + +.chip { + background: var(--bg-card); + border: 1px solid var(--border-color); + color: var(--text-muted); + padding: 0.4rem 1rem; + border-radius: 20px; + font-size: 0.85rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; +} + +.chip:hover, .chip.active { + background: rgba(0, 229, 255, 0.12); + border-color: var(--accent-cyan); + color: var(--accent-cyan); + box-shadow: var(--shadow-glow); +} + +/* Main Layout */ main { max-width: 1200px; margin: 0 auto; @@ -181,6 +231,7 @@ main { width: 100%; } +/* Plugin Grid */ .plugin-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); @@ -195,15 +246,14 @@ main { padding: 1.5rem; display: flex; flex-direction: column; - transition: transform 0.2s, border-color 0.2s, box-shadow 0.2s; + transition: all 0.2s ease-in-out; position: relative; - overflow: hidden; } .plugin-card:hover { - transform: translateY(-3px); - border-color: rgba(0, 242, 255, 0.4); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4); + transform: translateY(-4px); + border-color: var(--accent-cyan); + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.6), var(--shadow-glow); } .card-header { @@ -214,36 +264,42 @@ main { } .plugin-icon { - width: 52px; - height: 52px; + width: 54px; + height: 54px; border-radius: 10px; - background-color: #21262d; + background-color: var(--bg-surface); object-fit: cover; border: 1px solid var(--border-color); display: flex; align-items: center; justify-content: center; - font-weight: bold; - color: var(--accent-cyan); - font-size: 1.4rem; + font-size: 1.5rem; + flex-shrink: 0; } .card-title-group { flex: 1; + min-width: 0; } .plugin-title { font-size: 1.15rem; font-weight: 700; - color: #fff; + color: var(--text-bright); line-height: 1.3; + text-decoration: none; +} + +.plugin-title:hover { + color: var(--accent-cyan); } .plugin-version { - font-size: 0.8rem; + font-size: 0.75rem; font-family: var(--font-mono); - color: var(--text-muted); - background-color: #21262d; + color: var(--accent-cyan); + background-color: rgba(0, 229, 255, 0.1); + border: 1px solid rgba(0, 229, 255, 0.2); padding: 0.15rem 0.4rem; border-radius: 4px; display: inline-block; @@ -259,18 +315,31 @@ main { margin-top: 0.4rem; } +.publisher-info a { + color: var(--text-muted); + text-decoration: none; + font-weight: 600; + transition: color 0.2s; +} + +.publisher-info a:hover { + color: var(--accent-cyan); +} + .verified-badge { - color: var(--accent-blue); - font-size: 0.9rem; + color: var(--verified-blue); + font-weight: 700; + font-size: 0.95rem; display: inline-flex; align-items: center; - gap: 0.1rem; + gap: 0.15rem; + cursor: help; } .badge-tag { - background-color: rgba(157, 78, 221, 0.15); + background-color: rgba(168, 85, 247, 0.15); color: var(--accent-purple); - border: 1px solid rgba(157, 78, 221, 0.3); + border: 1px solid rgba(168, 85, 247, 0.3); font-size: 0.7rem; padding: 0.1rem 0.4rem; border-radius: 10px; @@ -285,6 +354,15 @@ main { flex: 1; } +.conversions-label { + font-size: 0.75rem; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.5px; + margin-bottom: 0.4rem; + font-weight: 700; +} + .tag-list { display: flex; flex-wrap: wrap; @@ -293,24 +371,15 @@ main { } .tag { - background-color: var(--badge-bg); + background-color: rgba(0, 229, 255, 0.08); color: var(--accent-cyan); - border: 1px solid var(--badge-border); + border: 1px solid rgba(0, 229, 255, 0.2); font-size: 0.75rem; font-family: var(--font-mono); padding: 0.2rem 0.5rem; border-radius: 6px; } -.conversions-label { - font-size: 0.75rem; - color: var(--text-muted); - text-transform: uppercase; - letter-spacing: 0.5px; - margin-bottom: 0.3rem; - font-weight: 600; -} - .card-actions { display: grid; grid-template-columns: 1fr 1fr; @@ -318,49 +387,250 @@ main { margin-top: auto; } +/* Buttons */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.4rem; - padding: 0.6rem 0.8rem; - border-radius: 6px; - font-weight: 600; + padding: 0.65rem 1rem; + border-radius: 8px; + font-weight: 700; font-size: 0.85rem; text-decoration: none; cursor: pointer; - transition: background-color 0.2s, border-color 0.2s, transform 0.1s; + transition: all 0.2s; border: none; + outline: none; } .btn:active { - transform: scale(0.98); + transform: scale(0.97); } .btn-install { - background-color: var(--btn-green); - color: #fff; + background-color: #10b981; + color: #000; + box-shadow: 0 0 10px rgba(16, 185, 129, 0.2); } .btn-install:hover { - background-color: var(--btn-green-hover); + background-color: #34d399; + box-shadow: 0 0 15px rgba(16, 185, 129, 0.4); } .btn-download { - background-color: #21262d; - color: var(--text-main); + background-color: var(--bg-surface); + color: var(--text-bright); border: 1px solid var(--border-color); } .btn-download:hover { - background-color: #30363d; - border-color: var(--text-muted); + border-color: var(--accent-cyan); + color: var(--accent-cyan); +} + +.btn-primary { + background: linear-gradient(135deg, var(--accent-cyan), #00a8ff); + color: #000; + font-weight: 800; + box-shadow: var(--shadow-glow); +} + +.btn-primary:hover { + opacity: 0.95; + box-shadow: 0 0 20px rgba(0, 229, 255, 0.5); +} + +.btn-secondary { + background: var(--bg-card); + border: 1px solid var(--border-color); + color: var(--text-bright); +} + +.btn-secondary:hover { + border-color: var(--accent-cyan); + color: var(--accent-cyan); +} + +/* Page Container / Detail Views */ +.page-container { + max-width: 900px; + margin: 2rem auto 4rem; + padding: 0 1.5rem; +} + +.detail-card, .publisher-profile-card { + background: var(--bg-card); + border: 1px solid var(--border-color); + border-radius: 16px; + padding: 2rem; + margin-bottom: 2rem; +} + +.publisher-header { + display: flex; + align-items: center; + gap: 1.5rem; + margin-bottom: 1.5rem; + padding-bottom: 1.5rem; + border-bottom: 1px solid var(--border-color); +} + +.publisher-avatar { + width: 90px; + height: 90px; + border-radius: 50%; + border: 2px solid var(--accent-cyan); + box-shadow: var(--shadow-glow); + object-fit: cover; +} + +.publisher-meta h1 { + font-size: 1.8rem; + color: var(--text-bright); + display: flex; + align-items: center; + gap: 0.5rem; +} + +.publisher-bio { + color: var(--text-muted); + font-size: 1rem; + margin: 0.5rem 0 1rem; +} + +.publisher-links a { + color: var(--accent-cyan); + text-decoration: none; + font-weight: 600; + font-size: 0.9rem; + display: inline-flex; + align-items: center; + gap: 0.4rem; +} + +.publisher-links a:hover { + text-decoration: underline; +} + +/* Code Box */ +.code-box { + background: var(--bg-input); + border: 1px solid var(--border-color); + border-radius: 8px; + padding: 1rem; + font-family: var(--font-mono); + font-size: 0.9rem; + color: var(--accent-cyan); + overflow-x: auto; + margin: 0.5rem 0 1.25rem; +} + +/* Form Styling for Maker */ +.tabs { + display: flex; + gap: 1rem; + border-bottom: 1px solid var(--border-color); + margin-bottom: 2rem; +} + +.tab-btn { + background: none; + border: none; + color: var(--text-muted); + font-size: 1.1rem; + font-weight: 700; + padding: 0.75rem 1rem; + cursor: pointer; + border-bottom: 2px solid transparent; + transition: all 0.2s; +} + +.tab-btn:hover, .tab-btn.active { + color: var(--accent-cyan); + border-bottom-color: var(--accent-cyan); +} + +.tab-content { + display: none; +} + +.tab-content.active { + display: block; +} + +.form-group { + margin-bottom: 1.5rem; +} + +.form-group label { + display: block; + font-weight: 700; + font-size: 0.9rem; + margin-bottom: 0.4rem; + color: var(--text-bright); +} + +.form-group label span { + color: var(--accent-cyan); +} + +.form-control { + width: 100%; + padding: 0.75rem 1rem; + background-color: var(--bg-input); + border: 1px solid var(--border-color); + border-radius: 8px; + color: var(--text-bright); + font-family: inherit; + font-size: 0.95rem; + outline: none; + transition: border-color 0.2s; +} + +.form-control:focus { + border-color: var(--accent-cyan); + box-shadow: var(--shadow-glow); +} + +textarea.form-control { + resize: vertical; + min-height: 100px; +} + +.form-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1.5rem; +} + +/* Toast */ +.toast { + position: fixed; + bottom: 2rem; + right: 2rem; + background-color: var(--accent-cyan); + color: #000; + padding: 0.8rem 1.5rem; + border-radius: 8px; + font-weight: 800; + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); + transform: translateY(100px); + opacity: 0; + transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); + z-index: 1000; +} + +.toast.show { + transform: translateY(0); + opacity: 1; } /* Footer */ footer { border-top: 1px solid var(--border-color); - background-color: var(--bg-card); + background-color: var(--bg-surface); padding: 2rem 1.5rem; text-align: center; color: var(--text-muted); @@ -377,11 +647,32 @@ footer a:hover { text-decoration: underline; } -@media (max-width: 600px) { +@media (max-width: 768px) { .hero h1 { - font-size: 2rem; + font-size: 2.1rem; } - .card-actions { + .form-row { grid-template-columns: 1fr; } + .publisher-header { + flex-direction: column; + text-align: center; + } + .nav-links { + display: none; + flex-direction: column; + position: absolute; + top: 100%; + left: 0; + right: 0; + background: var(--bg-surface); + border-bottom: 1px solid var(--border-color); + padding: 1.5rem; + } + .nav-links.mobile-open { + display: flex; + } + .mobile-menu-btn { + display: block; + } } diff --git a/publishers/m5dev.json b/publishers/m5dev.json index bd7616e..4853b65 100644 --- a/publishers/m5dev.json +++ b/publishers/m5dev.json @@ -1,7 +1,10 @@ { "id": "m5dev", - "name": "Yusuf Ezz (M5 Dev)", + "name": "Claus Valca (M5 Dev)", + "github_username": "ClausValcaTD", "github": "https://github.com/M5Devs", + "avatar_url": "https://github.com/ClausValcaTD.png", + "bio": "Creator & Core Architect of OpenROM and Official Plugin Toolchains", "is_verified": true, "badge": "Core Architect" } diff --git a/scripts/build_catalog.py b/scripts/build_catalog.py index d350912..f678f3b 100644 --- a/scripts/build_catalog.py +++ b/scripts/build_catalog.py @@ -12,6 +12,8 @@ def load_verified_publishers() -> set: data = json.load(f) if isinstance(data, list): return set(data) + elif isinstance(data, dict): + return set(data.keys()) except Exception as e: print(f"⚠️ Warning: Failed to load verified publishers from {v_file}: {e}") return set() @@ -57,7 +59,7 @@ def build_catalog(): if k not in ("is_verified", "verified") } - author_id = clean_manifest.get("author") or clean_manifest.get("publisher_id", "") + author_id = clean_manifest.get("publisher_id") or clean_manifest.get("author", "") publisher_data = publishers.get(author_id, { "id": author_id, diff --git a/scripts/validate_plugin.py b/scripts/validate_plugin.py index 0229185..a5d5a2d 100644 --- a/scripts/validate_plugin.py +++ b/scripts/validate_plugin.py @@ -47,7 +47,7 @@ def validate_manifest(file_path: Path) -> bool: print(f"❌ Error in {file_path}: Field 'id' must not be empty.") is_valid = False - author_id = data.get("author") + author_id = data.get("publisher_id") or data.get("author") if author_id and isinstance(author_id, str): publisher_path = Path("publishers") / f"{author_id}.json" if not publisher_path.exists(): diff --git a/verified_publishers.json b/verified_publishers.json index a5a8fbe..05dc638 100644 --- a/verified_publishers.json +++ b/verified_publishers.json @@ -1,3 +1,3 @@ -[ - "m5dev" -] +{ + "m5dev": "Claus Valca" +}