diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..ba067ff --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,35 @@ +# Repository Instructions + +## SHD design-system maintenance + +Treat `docs/DESIGN_SYSTEM.md` and the shared tokens and patterns in `src/app.css` +as maintained parts of the product. + +Whenever a change makes a significant visual or interaction-design decision, +update the design system in the same change. This includes: + +- introducing or changing colors, typography, spacing, borders, elevation, or motion; +- creating a new reusable layout, navigation, table, editor, form, card, status, or feedback pattern; +- materially changing dashboard density, hierarchy, responsive behavior, or accessibility behavior; +- changing the semantic meaning of an existing visual state; +- establishing a pattern that future pages or components should follow. + +For significant design changes: + +1. Reuse or extend the CSS custom properties in `src/app.css`; do not scatter + near-duplicate hard-coded values throughout new components. +2. Update `docs/DESIGN_SYSTEM.md` with the new or revised rule, token, pattern, + usage guidance, and responsive or accessibility considerations. +3. Refactor repeated UI into a reusable component when that makes the pattern + clearer and reduces divergence. +4. Preserve the SHD design principles: tactical but restrained, data-first, + square and engineered, orange reserved for action and emphasis, and explicit + textual state indicators. +5. Verify hover, pressed, focus-visible, pending, disabled, error, success, and + reduced-motion behavior where applicable. +6. Run `npm run check` and `npm run build` before completing the change. + +Minor alignment fixes, isolated bug fixes, and corrections that do not introduce +or revise a reusable design decision do not require a documentation update. + +If uncertain whether a visual change is significant, update the design system. diff --git a/docs/DESIGN_SYSTEM.md b/docs/DESIGN_SYSTEM.md index 2a3fbfb..3f7341b 100644 --- a/docs/DESIGN_SYSTEM.md +++ b/docs/DESIGN_SYSTEM.md @@ -45,6 +45,22 @@ Use the spacing tokens for new components. Prefer `8px`, `12px`, and `20px` gaps - Maximum content width: approximately 1400–1640px. - Larger headings and more generous vertical rhythm are appropriate. - Preserve the grid background and orange accents. +- Catalogue and editorial pages use `catalogue-hero` for an angular introductory + panel and may pair it with a compact operational control bar. +- Community build cards retain the colored top rule, abstract loadout artwork, + concise tags, agent attribution, and a full-width terminal action. + +### Agent and authentication surfaces + +- Account pages should read as an agent dossier: identity and access at the top, + activity metrics beside it, archives in the primary column, and security + controls in a narrower console column. +- Authentication pages use a split frame: contextual SHD network information on + the left and the actionable secure-access console on the right. +- OAuth providers appear as connection nodes with a recognizable provider color; + SHD orange remains reserved for the primary local action and navigation. +- On small screens, the split frame becomes a single column and account controls + move before archival content. ### Admin dashboard @@ -98,3 +114,17 @@ Do not communicate state by color alone; include a label, icon, or pattern. 6. Verify keyboard focus, pending behavior, empty states, mobile layout, and archived data behavior. If a new interface needs a genuinely new pattern, document it here when introducing it. + +## Design-system governance + +Significant visual and interaction changes must update this document and the +shared implementation in the same change. A change is significant when it +introduces or materially revises a reusable token, component pattern, layout, +responsive rule, accessibility behavior, motion behavior, or state convention. + +Small alignment corrections and isolated visual bug fixes do not require a +documentation change unless they establish a rule that other interfaces should +follow. + +Repository agents and contributors should follow the maintenance checklist in +`AGENTS.md`. diff --git a/src/app.css b/src/app.css index 4a06dfa..c06eab5 100644 --- a/src/app.css +++ b/src/app.css @@ -52,3 +52,11 @@ .admin-page{width:100%;min-height:calc(100vh - 76px);padding:18px clamp(14px,2vw,32px) 40px;background:linear-gradient(135deg,#101314aa 0,transparent 38%)}.admin-command{height:auto;min-height:76px;position:relative;top:auto;display:flex;justify-content:space-between;align-items:center;padding:0 0 16px;background:transparent;border-bottom:1px solid #303536}.command-title h1{margin:4px 0 2px;font-size:27px;letter-spacing:1px}.command-title>p:last-child{margin:0;color:#697073;font-size:9px;letter-spacing:1.1px}.command-status{display:flex;gap:7px}.command-status>div{position:relative;min-width:105px;height:47px;padding:9px 12px;background:#111415;border:1px solid #303536;display:grid;align-content:center}.command-status span{font-size:7px;letter-spacing:1.3px;color:#6f7678}.command-status strong{font-size:10px;letter-spacing:1px;margin-top:3px}.command-status i{position:absolute;right:9px;top:9px;width:6px;height:6px;border-radius:50%;background:#68bd82;box-shadow:0 0 8px #68bd82}.admin-dashboard{display:grid;grid-template-columns:210px minmax(0,1fr);gap:12px;margin-top:12px}.admin-sidebar{position:sticky;top:88px;min-height:520px;height:calc(100vh - 118px);display:flex;flex-direction:column;background:#0f1213;border:1px solid #2c3132}.sidebar-label{height:43px;padding:10px 12px;border-bottom:1px solid #2c3132;display:flex;justify-content:space-between;align-items:center}.sidebar-label span,.sidebar-label b{font-size:7px;letter-spacing:1.3px}.sidebar-label span{color:#8d9395}.sidebar-label b{color:#505759}.admin-sidebar nav{display:flex;flex-direction:column;margin:0;height:auto}.admin-sidebar nav a{display:grid;grid-template-columns:33px 1fr auto;align-items:center;min-height:49px;padding:0 12px 0 0;color:#858c8e;border:0;border-bottom:1px solid #272c2d;font-size:10px}.admin-sidebar nav a small{height:100%;display:grid;place-items:center;background:#141819;color:#535a5c;font-size:7px;letter-spacing:.6px}.admin-sidebar nav a span{padding-left:11px}.admin-sidebar nav a b{font-size:17px;color:#f6a821}.admin-sidebar nav a em{font-style:normal;font-size:6px;color:#555c5e;letter-spacing:1px}.admin-sidebar nav a:hover,.admin-sidebar nav a.active{color:#fff;background:#151819}.admin-sidebar nav a.active{box-shadow:inset 2px 0 #f6a821}.admin-sidebar nav a.active small{background:#2b2111;color:#f6a821}.admin-sidebar nav a.pending{opacity:.5;pointer-events:none}.sidebar-foot{margin-top:auto;padding:14px;border-top:1px solid #2c3132;display:grid}.sidebar-foot span{font-size:7px;color:#5e6668;letter-spacing:1.3px}.sidebar-foot strong{font-size:14px;color:#f6a821;margin:4px 0}.sidebar-foot small{font-size:8px;color:#596164}.admin-content{min-width:0}.module-toolbar{min-height:63px;display:flex;align-items:center;justify-content:space-between;padding:0 2px 12px;border-bottom:1px solid #303536}.module-toolbar h2{font-size:19px;letter-spacing:.4px;margin:3px 0}.module-toolbar p{margin:0}.module-toolbar>div>p:last-child{font-size:9px;color:#71787a}.module-toolbar>div:last-child{display:flex;gap:8px}.module-toolbar .primary,.module-toolbar .secondary{height:40px;padding:0 15px}.module-kpis{display:grid;grid-template-columns:repeat(4,minmax(120px,1fr));gap:8px;margin:10px 0}.module-kpis>div{position:relative;min-height:70px;padding:11px 13px;background:#111415;border:1px solid #2d3233;border-top:2px solid #3a4041;display:grid}.module-kpis>div:first-child{border-top-color:#f6a821}.module-kpis span{font-size:7px;letter-spacing:1.3px;color:#737a7c}.module-kpis strong{font-size:23px;line-height:1.1;margin:3px 0}.module-kpis small{font-size:7px;color:#555d5f}.dashboard-editor{margin:10px 0;background:#131617;border:1px solid #4a5051;border-top:2px solid #f6a821;padding:14px 16px}.editor-title{display:flex;justify-content:space-between;align-items:start;padding-bottom:9px;border-bottom:1px solid #303536}.editor-title h3{font-size:16px;margin:3px 0}.editor-title button{border:0;background:transparent;color:#7e8587;font-size:24px;line-height:1}.dashboard-editor .form-grid{grid-template-columns:repeat(5,minmax(0,1fr));gap:9px}.dashboard-editor .field{margin:8px 0}.dashboard-editor .field input,.dashboard-editor .field select,.dashboard-editor .field textarea{padding:8px 9px;margin-top:5px;font-size:10px}.range-field>div,.uptime-field>div{display:grid;grid-template-columns:1fr 1fr;gap:5px}.dashboard-table{border:1px solid #2d3233;background:#111415;overflow:auto}.dashboard-row{min-width:820px;display:grid;grid-template-columns:1.5fr 1fr .75fr .85fr .6fr .3fr;align-items:center;gap:10px;min-height:46px;padding:7px 13px;border-top:1px solid #272c2d;font-size:10px}.dashboard-row:hover:not(.table-heading){background:#15191a}.dashboard-row>div{display:grid;gap:3px}.dashboard-row>div small{font-size:7px;color:#60686a}.dashboard-row>span{width:max-content}.dashboard-row>button{justify-self:end;border:0;border-bottom:1px solid transparent;background:transparent;color:#f6a821;font-size:8px;font-weight:bold;padding:5px;cursor:pointer}.dashboard-row>button:hover{border-color:#f6a821}.table-heading{min-height:32px;border-top:0;background:#0d1011;color:#697174;font-size:7px;letter-spacing:1.2px}.state-dot{font-size:7px;letter-spacing:.8px;color:#75c08c}.state-dot:before{content:"";display:inline-block;width:5px;height:5px;margin-right:6px;border-radius:50%;background:currentColor;box-shadow:0 0 6px currentColor}.dashboard-row.archived{opacity:.45}.type-offensive,.type-defensive{padding:4px 6px;border:1px solid}.type-offensive{color:#df8069;border-color:#70463c}.type-defensive{color:#70b9d6;border-color:#365e6e}.tier-grid{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-top:10px}.tier-card{min-width:0;padding:8px 11px 11px;border:1px solid #343a3b;background:#101314}.tier-card legend{padding:0 7px;color:#f6a821;font-size:8px;font-weight:bold;letter-spacing:1.3px}.trigger-list{max-height:130px;overflow:auto;border:1px solid #292f30}.trigger-list>div{display:grid;grid-template-columns:1fr auto;align-items:center;min-height:33px;padding:4px 7px;border-top:1px solid #252a2b;background:#121516}.trigger-list label{display:flex;align-items:center;gap:7px;font-size:9px}.trigger-list input{width:auto;margin:0;accent-color:#f6a821}.trigger-list button,.effects-head button{border:0;background:transparent;color:#f6a821;font-size:7px}.effects-head{display:flex;justify-content:space-between;align-items:center;margin-top:10px}.talent-effect{display:grid;grid-template-columns:1fr 90px 27px;gap:5px;margin-top:5px}.talent-effect select,.talent-effect input{min-width:0;padding:7px;margin:0;font-size:9px}.talent-effect button{border:1px solid #563734;background:#1d1212;color:#da746c}.talent-identity{grid-template-columns:2fr 1fr!important}.uptime-field>span{display:flex;align-items:center;gap:7px}.uptime-field>span input{width:auto;margin:0;accent-color:#f6a821}.script-note{align-self:end;margin:8px 0;padding:9px;border:1px dashed #394041;display:grid}.script-note b{font-size:7px;color:#8e9597;letter-spacing:1.2px}.script-note span{font-size:8px;color:#5d6567;margin-top:4px}.configured{color:#79bd8d;font-size:8px} @media(max-width:900px){.admin-command{align-items:flex-start}.command-status>div:nth-child(n+2){display:none}.admin-dashboard{grid-template-columns:1fr}.admin-sidebar{position:static;height:auto;min-height:0}.admin-sidebar nav{display:grid;grid-template-columns:1fr 1fr}.sidebar-foot{display:none}.module-kpis{grid-template-columns:1fr 1fr}.dashboard-editor .form-grid{grid-template-columns:1fr 1fr}.tier-grid{grid-template-columns:1fr}}@media(max-width:560px){.admin-command,.module-toolbar{flex-direction:column;align-items:flex-start;gap:12px}.module-toolbar>div:last-child{width:100%}.module-toolbar button{flex:1}.module-kpis{grid-template-columns:1fr 1fr}.dashboard-editor .form-grid{grid-template-columns:1fr}.talent-identity{grid-template-columns:1fr!important}} +/* Shared SHD routed surfaces */ +.site-header .brand-mark{position:relative}.site-header .brand-mark i{position:absolute;inset:3px;border:1px solid #f6a82155;border-radius:50%}.site-header .brand-mark b{position:relative;font-size:8px}.brand-name{display:grid;font-size:14px;line-height:1}.brand-name>span{display:inline;color:#f6a821}.brand-name small{font-size:5px;color:#555d5f;letter-spacing:1.3px;margin-top:4px}.site-header .account small i{display:inline-block;width:5px;height:5px;border-radius:50%;background:var(--shd-success);box-shadow:0 0 6px var(--shd-success);margin-right:3px} +.catalogue-page,.guides-page,.profile-page{padding-top:34px}.catalogue-hero{min-height:230px;display:flex;justify-content:space-between;align-items:center;padding:25px 32px;margin-bottom:12px;border:1px solid var(--shd-border);background:radial-gradient(circle at 80% 50%,#332714 0,transparent 30%),linear-gradient(120deg,#141718,#0d1011);clip-path:polygon(0 0,97% 0,100% 18%,100% 100%,3% 100%,0 82%)}.catalogue-hero h1{font-size:clamp(48px,6vw,82px);line-height:.82;letter-spacing:-3px;margin:14px 0}.catalogue-hero h1 em{font-style:normal;color:var(--shd-orange)}.catalogue-hero>div>p:last-child{max-width:580px;color:var(--shd-text-muted);font:15px/1.55 Georgia,serif}.catalogue-count{min-width:210px;display:grid;text-align:right}.catalogue-count strong{font-size:38px}.catalogue-count span{font-size:7px;color:#6d7476;letter-spacing:1.5px;margin:3px 0 18px}.catalogue-count .primary{justify-self:end}.filter-bar{display:grid;grid-template-columns:2fr 1fr 1fr auto;gap:7px;align-items:end;margin:12px 0 18px;padding:11px;background:#101314;border:1px solid #2d3233}.filter-bar label{font-size:7px;color:#72797b;letter-spacing:1.2px}.filter-bar input,.filter-bar select{height:38px;margin-top:6px;padding:0 10px;font-size:9px}.filter-bar button{height:38px;padding:0 14px}.catalogue-grid{max-width:none}.catalogue-grid article{position:relative}.build-open{width:100%;margin-top:15px;padding:10px;border:1px solid #3a4041;background:#101314;color:#f6a821;font-size:8px;font-weight:bold;letter-spacing:1px}.guide-layout{display:grid;grid-template-columns:1fr 330px;gap:12px}.guide-feature{min-height:360px;padding:35px;position:relative;border:1px solid #303536;border-top:2px solid #f6a821;background:linear-gradient(135deg,#151819,#0d1011)}.guide-code{position:absolute;right:25px;top:22px;color:#4f5658;font-size:8px;letter-spacing:1.5px}.guide-feature h2{font-size:42px;line-height:.95;margin:20px 0}.guide-feature>p:not(.eyebrow){max-width:650px;color:#858b8d;font:15px/1.6 Georgia,serif}.guide-meta{display:flex;gap:8px;position:absolute;left:35px;bottom:30px}.guide-meta span{display:grid;padding:8px 11px;border:1px solid #303536;color:#60686a;font-size:7px;letter-spacing:1px}.guide-meta b{color:#d7d9d5;font-size:9px;margin-top:4px}.guide-index{border:1px solid #303536;background:#111415;padding:20px}.guide-index>div{display:grid;grid-template-columns:30px 1fr auto;align-items:center;min-height:54px;border-top:1px solid #292e2f}.guide-index small{color:#535b5d;font-size:8px}.guide-index span{font-size:9px;letter-spacing:.8px}.guide-index b{color:#f6a821} +.profile-command{display:flex;justify-content:space-between;align-items:center;padding:0 0 24px;border-bottom:1px solid #303536}.profile-ident{display:flex;align-items:center;gap:18px}.profile-avatar{width:76px;height:76px;display:grid;place-items:center;border:1px solid #f6a821;border-radius:50%;color:#f6a821;font-size:29px;font-weight:900;box-shadow:inset 0 0 0 6px #0a0c0d,inset 0 0 0 7px #f6a82155}.profile-ident h1{font-size:39px;margin:4px 0}.role-badge{display:inline-block;padding:4px 8px;border:1px solid #6e5226;color:#f6a821;font-size:7px;letter-spacing:1.3px}.profile-metrics{display:flex;gap:7px}.profile-metrics div{min-width:77px;height:59px;display:grid;place-items:center;padding:7px;background:#111415;border:1px solid #303536}.profile-metrics strong{font-size:20px}.profile-metrics span{font-size:7px;color:#697174;letter-spacing:1px}.account-alert{display:flex;gap:16px;margin:12px 0;padding:12px 15px;background:#2a2112;border:1px solid #795c2a;border-left:3px solid #f6a821;font-size:10px}.account-alert b{color:#f6a821}.account-alert span{color:#b8ad99}.profile-dashboard{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:12px;margin-top:12px}.profile-feed{display:grid;gap:12px}.profile-module,.account-console{background:#111415;border:1px solid #303536;padding:16px}.module-head{display:flex;justify-content:space-between;align-items:center}.module-head h2,.profile-module h2,.account-console h2{font-size:17px;margin:4px 0 12px}.module-head .secondary{padding:10px 12px}.profile-table{border:1px solid #292e2f}.profile-row{display:grid;grid-template-columns:1.5fr .7fr .7fr .3fr;align-items:center;gap:9px;min-height:47px;padding:7px 11px;border-top:1px solid #292e2f;font-size:9px}.profile-row.heading{min-height:30px;border:0;background:#0d1011;color:#636b6d;font-size:7px;letter-spacing:1px}.profile-row>div{display:grid}.profile-row small{font-size:7px;color:#596164}.profile-row>span{text-transform:uppercase;color:#858d8f}.profile-row button{border:0;background:transparent;color:#f6a821;font-size:8px}.profile-empty{text-align:center;padding:38px}.profile-empty>span{font-size:31px;color:#f6a821}.profile-empty b{display:block;font-size:10px;letter-spacing:1px;margin:10px}.profile-empty p{color:#71797b;font:13px Georgia,serif}.profile-empty a{color:#f6a821;font-size:8px;font-weight:bold}.profile-columns{display:grid;grid-template-columns:1fr 1fr;gap:12px}.large-count{font-size:32px}.count-label{display:block;font-size:7px;color:#687073;letter-spacing:1.2px}.account-console{height:max-content}.console-head{display:flex;justify-content:space-between;padding-bottom:11px;margin-bottom:15px;border-bottom:1px solid #303536;color:#747c7e;font-size:7px;letter-spacing:1.3px}.console-head i{width:6px;height:6px;border-radius:50%;background:#75c08c;box-shadow:0 0 6px #75c08c}.console-action{width:100%;margin-top:9px}.connection-card{display:grid;grid-template-columns:35px 1fr auto;align-items:center;padding:10px;border:1px solid #303536}.discord-node{color:#8993ff;font-size:21px}.connection-card div{display:grid}.connection-card b{font-size:9px}.connection-card small{font-size:7px;color:#656d6f;margin-top:3px}.connection-card a{color:#f6a821;font-size:8px;font-weight:bold} +.auth-page{display:block;padding:55px clamp(20px,5vw,80px)}.auth-frame{width:min(980px,100%);min-height:520px;margin:auto;display:grid;grid-template-columns:1.15fr .85fr;border:1px solid #34393a;background:#101314;clip-path:polygon(0 0,96% 0,100% 7%,100% 100%,4% 100%,0 93%)}.auth-intel{width:auto!important;padding:65px!important;border:0!important;border-right:1px solid #303536!important;background:radial-gradient(circle at 15% 80%,#392b15 0,transparent 33%),#0e1112!important}.auth-intel h1{font-size:66px!important;line-height:.85;letter-spacing:-3px;margin:24px 0}.auth-intel h1 em{font-style:normal;color:#f6a821}.auth-intel>p:not(.eyebrow){max-width:470px;color:#909698;font:15px/1.6 Georgia,serif}.auth-status{display:flex;justify-content:space-between;margin-top:55px;padding-top:14px;border-top:1px solid #303536;color:#626a6c;font-size:7px;letter-spacing:1.2px}.auth-status i{display:inline-block;width:5px;height:5px;border-radius:50%;background:#75c08c;box-shadow:0 0 6px #75c08c;margin-right:5px}.auth-console{width:auto!important;padding:34px!important;border:0!important;background:#141718!important}.auth-console .console-head b{color:#f6a821}.auth-console .discord{margin-top:18px}.auth-console small{margin-top:18px} +.builder-page{padding-top:28px}.builder-command{margin-bottom:14px;border-bottom:1px solid #303536}.builder-command .page-title{margin-bottom:12px}.builder-status{display:flex;gap:24px;padding:9px 2px;color:#61696b;font-size:7px;letter-spacing:1.2px}.builder-status i{display:inline-block;width:5px;height:5px;border-radius:50%;background:#75c08c;box-shadow:0 0 6px #75c08c;margin-right:5px}.builder-page .slot-card{position:relative;overflow:hidden}.builder-page .slot-card:after{content:"";position:absolute;right:-24px;bottom:-24px;width:52px;height:52px;border:1px solid #f6a82122;transform:rotate(45deg)}.builder-page .summary{border-top:2px solid #f6a821} +@media(max-width:900px){.filter-bar{grid-template-columns:1fr 1fr}.catalogue-hero{align-items:flex-start}.guide-layout,.profile-dashboard,.auth-frame{grid-template-columns:1fr}.profile-command{align-items:flex-start}.profile-metrics{display:grid;grid-template-columns:1fr 1fr}.account-console{order:-1}.auth-intel{border-right:0!important;border-bottom:1px solid #303536!important;padding:42px!important}.auth-intel h1{font-size:52px!important}}@media(max-width:560px){.catalogue-hero,.profile-command{flex-direction:column;align-items:flex-start}.catalogue-count{text-align:left;margin-top:20px}.catalogue-count .primary{justify-self:start}.filter-bar{grid-template-columns:1fr}.guide-meta{position:static;margin-top:25px;flex-wrap:wrap}.profile-metrics{width:100%;margin-top:20px}.profile-columns{grid-template-columns:1fr}.auth-page{padding:25px 14px}.auth-intel,.auth-console{padding:28px!important}} + diff --git a/src/lib/components/AppShell.svelte b/src/lib/components/AppShell.svelte index 5d3ac3c..ba55523 100644 --- a/src/lib/components/AppShell.svelte +++ b/src/lib/components/AppShell.svelte @@ -1,5 +1,6 @@ + {user.username} — SHD.build -

AGENT PROFILE

{user.username}

{user.role.toUpperCase()}
{data.account.builds.length} builds · {data.account.guides.length} guides · {data.account.favorites.length} favorites
-{#if data.chooseUsername}

Choose the unique SHD.build username other agents will see.

{/if}{#if data.discordLinked}

Discord account linked successfully.

{/if}{#if data.oauthError}

Discord linking could not be completed.

{/if} -
-

LOADOUT ARCHIVE

My builds

NEW BUILD +
{#if data.account.builds.length}{#each data.account.builds as build}
{build.title}{build.visibility}{new Date(String(build.updated_at)).toLocaleDateString()}
{/each}{:else}

Your saved and published loadouts will appear here.

{/if}

Favorites and ratings

{data.account.favorites.length} favorited · {data.account.ratings.length} rated

- -
+
+
+
{user.username.slice(0,1).toUpperCase()}

AGENT PROFILE

{user.username}

{user.role.toUpperCase()} ACCESS
+
{data.account.builds.length}BUILDS
{data.account.guides.length}GUIDES
{data.account.favorites.length}FAVORITES
{data.account.ratings.length}RATED
+
+ {#if data.chooseUsername}
IDENTITY SETUP REQUIREDChoose the unique SHD.build username other agents will see.
{/if} + {#if data.discordLinked}

Discord account linked successfully.

{/if} + {#if data.oauthError}

Discord linking could not be completed.

{/if} +
+
+

LOADOUT ARCHIVE

MY BUILDS

NEW BUILD +
+ {#if data.account.builds.length}
LOADOUTVISIBILITYUPDATED
{#each data.account.builds as build}
{build.title}/{build.slug}
{build.visibility}{new Date(String(build.updated_at)).toLocaleDateString()}
{/each}
{:else}
◇NO BUILDS RECORDED

Your saved and published loadouts will appear here.

CREATE YOUR FIRST BUILD →
{/if} +
+

SAVED INTELLIGENCE

FAVORITES

{data.account.favorites.length}SAVED LOADOUTS

FIELD FEEDBACK

RATINGS

{data.account.ratings.length}RATED LOADOUTS
+
+ +
+
diff --git a/src/routes/builder/+page.svelte b/src/routes/builder/+page.svelte index 2e93581..a4120d9 100644 --- a/src/routes/builder/+page.svelte +++ b/src/routes/builder/+page.svelte @@ -30,8 +30,8 @@ Build a loadout — SHD.build -
-

LOADOUT WORKBENCH

SAVED LOCALLY
+
+

LOADOUT WORKBENCH

SAVED LOCALLY
DRAFT ACTIVE6 EQUIPMENT SLOTSLOCAL STORAGE
{#if message}

{message}

{/if}
{#each slots as slot}{/each}
diff --git a/src/routes/builds/+page.svelte b/src/routes/builds/+page.svelte index 3b25969..9276358 100644 --- a/src/routes/builds/+page.svelte +++ b/src/routes/builds/+page.svelte @@ -1,9 +1,9 @@ Discover builds — SHD.build -

FIELD-TESTED LOADOUTS

Discover builds

Browse, sort, rate, and copy community builds.

NEW BUILD +
{#each builds as build}
{build.mode} · ★ {build.rating}

{build.title}

BY {build.author.toUpperCase()}

{/each}
+

SHD LOADOUT ARCHIVE

DISCOVER
BUILDS.

Field-tested configurations submitted by agents across Manhattan.

2,847PUBLIC LOADOUTSNEW BUILD +
{#each builds as build}
{build.mode}★ {build.rating}
SHD LOADOUT

COMMUNITY BUILD

{build.title}

{#each build.tags as tag}{tag}{/each}
{build.author.slice(0,1)}BY {build.author}{build.votes} RATINGS
{/each}
diff --git a/src/routes/guides/+page.svelte b/src/routes/guides/+page.svelte index 5b141fd..2e50a7c 100644 --- a/src/routes/guides/+page.svelte +++ b/src/routes/guides/+page.svelte @@ -1,2 +1,2 @@ Build guides — SHD.build -

FIELD NOTES

Build guides

Detailed community strategies and loadout walkthroughs will live here.

Guides are coming next

The route is ready for guide listing, search, authorship, and rich build-linked articles.

+

SHD FIELD MANUAL

BUILD
GUIDES.

Long-form tactical notes, play styles, rotations, and loadout walkthroughs from experienced agents.

FIELDINTELLIGENCE NETWORKCREATE A BUILD +
SHD // INTEL

EDITORIAL SYSTEM

FIELD REPORTS
COMING ONLINE

The guide publishing route is ready for build-linked articles. Rich writing, tactical sections, author profiles, and community discovery arrive in a later increment.

STATUS QUEUEDPRIORITY NORMALNODE NYC-01
diff --git a/src/routes/sign-in/+page.svelte b/src/routes/sign-in/+page.svelte index 78639fb..f4cd3a6 100644 --- a/src/routes/sign-in/+page.svelte +++ b/src/routes/sign-in/+page.svelte @@ -1,3 +1,3 @@ - + Sign in — SHD.build -

AGENT ACCESS

WELCOME BACK

Sign in to publish builds, join discussions, and keep your loadouts synced.

◉ CONTINUE WITH DISCORD
OR USE YOUR ACCOUNT
{#if form?.loginError}

{form.loginError}

{/if}{#if data.oauthError}

{data.oauthError}

{/if}
+

SHD IDENTITY NETWORK

AGENT
ACCESS.

Authenticate to publish builds, join field discussions, and keep your loadouts synchronized across devices.

NETWORK ONLINENODE NYC-01
SECURE SIGN-INSHD // AUTH
◉ CONTINUE WITH DISCORD
OR USE LOCAL CREDENTIALS
{#if form?.loginError}

{form.loginError}

{/if}{#if data.oauthError}

{data.oauthError}

{/if}
Credentials are verified securely on the server. Discord shares only the basic identity information required to link your account.