From 01cd6c3f9db6a2afdcd3aac4ca1575a4dd17d3f4 Mon Sep 17 00:00:00 2001 From: librelad Date: Sat, 4 Jul 2026 23:10:21 +0100 Subject: [PATCH] feat(marketplace/site): How it works, Submit an app + Submissions views MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Turns the site into a small multi-view app. Three pinned nav buttons above the search (App Center pin style) switch the main pane: - How it works: the former footer text, expanded into cards (add an app, point your box here, how trust works, run your own). - Submit an app: the PR-based flow (fork → drop-in app folder → PR → reviewed + signed → published with a community badge + your name). No uploads/accounts. - Submissions: renders a static submissions.json (operator-published, like the catalog) — author names, status badges (pending/review/merged), PR links, a pending-count badge on the pin, graceful empty/loading states. Category/search return to browse; # deep-link still focuses one app. REPO_URL is overridable via . Co-Authored-By: Claude Fable 5 Signed-off-by: librelad --- .../marketplace/resources/site/index.html | 322 ++++++++++++------ 1 file changed, 227 insertions(+), 95 deletions(-) diff --git a/containers/marketplace/resources/site/index.html b/containers/marketplace/resources/site/index.html index 370d008..28bc8a4 100644 --- a/containers/marketplace/resources/site/index.html +++ b/containers/marketplace/resources/site/index.html @@ -172,6 +172,64 @@ .footnote { margin: 4px 22px 40px; font-size: 0.85rem; line-height: 1.6; } .footnote code { background: rgba(0,0,0,0.3); padding: 1px 6px; border-radius: 6px; } a { color: #93c5fd; } + + /* Sidebar nav pins (How it works / Submit / Submissions) — App Center pin + style: full-width, bottom-border, icon + label, hover/active tint. */ + .side-nav { border-bottom: 1px solid var(--sidebar-border); } + .side-pin { + display: flex; align-items: center; gap: 10px; padding: 15px 20px; cursor: pointer; + color: var(--sidebar-text); font-weight: 600; font-size: 14px; + border-bottom: 1px solid var(--sidebar-border); transition: background 0.15s ease, color 0.15s ease; + } + .side-nav .side-pin:last-child { border-bottom: none; } + .side-pin svg { width: 18px; height: 18px; flex-shrink: 0; } + .side-pin:hover { background: var(--surface-hover); color: var(--text-primary); } + .side-pin.active { background: rgba(var(--accent-rgb),0.16); color: #fff; } + .side-pin-badge { + margin-left: auto; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 999px; + background: rgba(var(--status-warning-rgb),0.9); color: #1a1206; font-size: 0.72rem; font-weight: 700; + display: inline-flex; align-items: center; justify-content: center; + } + + /* Info + submissions views (rendered into #main). */ + .doc { max-width: 820px; margin: 22px; } + .doc h1 { font-size: 1.5rem; margin-bottom: 6px; } + .doc .lead { color: var(--text-secondary); margin-bottom: 22px; line-height: 1.5; } + .doc-card { + background: var(--card-bg); border: 1px solid var(--card-border); border-radius: 12px; + padding: 18px 20px; margin-bottom: 16px; box-shadow: var(--card-shadow); + } + .doc-card h2 { font-size: 1.05rem; margin-bottom: 8px; } + .doc-card p, .doc-card li { color: var(--text-secondary); line-height: 1.55; font-size: 0.92rem; } + .doc-card ol, .doc-card ul { margin: 6px 0 0 20px; } + .doc-card li { margin-bottom: 6px; } + .doc-card code { background: rgba(0,0,0,0.3); padding: 1px 6px; border-radius: 6px; font-size: 0.86em; } + .doc-steps { counter-reset: step; list-style: none; margin-left: 0 !important; } + .doc-steps li { position: relative; padding-left: 38px; margin-bottom: 12px; } + .doc-steps li::before { + counter-increment: step; content: counter(step); + position: absolute; left: 0; top: 0; width: 26px; height: 26px; border-radius: 999px; + background: rgba(var(--accent-rgb),0.2); border: 1px solid rgba(var(--accent-rgb),0.5); color: var(--accent); + display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.85rem; + } + .doc-cta { display: inline-block; margin-top: 4px; padding: 9px 16px; border-radius: 8px; background: #6366f1; color: #fff !important; font-weight: 600; font-size: 0.9rem; text-decoration: none; } + .doc-cta:hover { background: #4f46e5; } + + .sub-list { display: flex; flex-direction: column; gap: 12px; margin-top: 16px; } + .sub-row { + display: flex; align-items: center; gap: 14px; padding: 14px 18px; + background: var(--card-bg); border: 1px solid var(--card-border); border-radius: 12px; box-shadow: var(--card-shadow); + } + .sub-icon { width: 40px; height: 40px; border-radius: 10px; background: rgba(var(--text-rgb),0.08); display: flex; align-items: center; justify-content: center; font-weight: 700; color: #c7d2fe; flex-shrink: 0; } + .sub-main { flex: 1; min-width: 0; } + .sub-title { font-weight: 600; } + .sub-meta { color: var(--text-muted); font-size: 0.85rem; margin-top: 2px; } + .sub-meta .who { color: var(--text-secondary); } + .sub-status { font-size: 0.75rem; padding: 3px 10px; border-radius: 999px; border: 1px solid; white-space: nowrap; } + .sub-status.pending { background: rgba(var(--status-warning-rgb),0.2); color: #fcd34d; border-color: rgba(var(--status-warning-rgb),0.5); } + .sub-status.merged { background: rgba(var(--status-success-rgb),0.28); color: #86efac; border-color: rgba(var(--status-success-rgb),0.6); } + .sub-status.review { background: rgba(var(--accent-rgb),0.18); color: #7dd3fc; border-color: rgba(var(--accent-rgb),0.45); } + .sub-link { color: #93c5fd; font-size: 0.85rem; white-space: nowrap; } @@ -185,6 +243,22 @@