LeoScorpioLeo Ltd/LeoScorpioLeo (T-shirts)/Theme & UI

LEOSCORPIOLEO SITE-WIDE UI STANDARD

VISUAL & FORMATTING SOP FOR EVERY LEOSCORPIOLEO.COM PAGE

Version 1.0 — Corroded Copper System

LeoScorpioLeo, Ltd (LSL) • Look Good. Feel Good. Do Good. Pass it on!

Preface

Purpose & Scope

Read this first. It governs every color, font, and themed component on the site.

This is a full rewrite (2026-08-06) of a page that used to document a nine-token blue/cyan/magenta palette proposal from 2026-07-30 that was never adopted. That draft is retired — every fact below is ground-truthed against the actual live CSS, not a plan. If a rule here and the live site ever disagree, the live CSS is the bug and this document is what it should be fixed to match.

Scope

Everything on leoscorpioleo.com and every /X subpath it serves — shop, product pages, cart, checkout, account, blog, every widget and form. One WordPress + WooCommerce install, running the News25 Prime theme. All of the rules in this document are layered on top of that theme via a small set of mu-plugins (must-use plugins) rather than theme customizer settings, specifically so they survive theme updates and theme switches — see Section 0.3 for the file map.

Relationship to the Listing SOP

The Shirt Listing SOP governs product-listing content — voice, structure, the sizzle/steak arc, the exact wording recipe. This document governs the visual system everything (including that content) actually renders through — colors, type, spacing, every component. The two cross-reference each other rather than duplicate: e.g. the Listing SOP's Rule 2.6a says the Details tab must be real WooCommerce attributes; this document's Section 9.3 says what those attributes look like once rendered.

Instruction to any LLM (Large Language Model) executing this SOP

Section 0

Foundations

0.1 Concept

Corroded Copper — dystopian-cyberpunk, nature-reclaims-technology. A near-black base and deep jungle-green bands, with rust and amber as the only warm accents against them. The idea the palette is built to carry: structure corrodes, signal fades, growth persists — technology decays, life finds a way regardless. It replaced an earlier "Overgrowth" system on 2026-08-03; the tiled background image asset is still literally named overgrowth-tile.jpg as a result (Section 2).

0.2 Stack

WordPress + WooCommerce. Active theme is News25 Prime — a classic PHP theme, not a block/FSE theme (confirmed: no usable template-parts/navigation-post routes). Because of that, header/footer/nav structure comes from the theme's own PHP templates, and this SOP's job is entirely the CSS layered on top, not template structure.

0.3 Where the rules actually live (implementation map)

FileOwns
wp-content/mu-plugins/
lsl-cyberpunk-theme.css
All site-wide color tokens (Section 1) and nearly every component in this document: header/nav, breadcrumb, footer, sidebar/widgets, buttons, shop grid/cards, price/stock/onsale, tabs, shop_table and the Additional Information attributes table, pagination, cart/checkout, generic form inputs, the .lsl-jp Japanese-text hook, blog post-heading and calendar overrides.
wp-content/mu-plugins/
lsl-size-swatches.css
+ lsl-size-swatches.js
The Colors/Sizes variant-selector panel on product pages only (Section 9.2) — its own small design system, deliberately namespaced (--lsl-swatch-*) so it can never collide with the sitewide tokens.
wp-content/mu-plugins/
lsl-header-carousel.css
+ .js + .php
The header bestseller-product carousel (Section 5).

All three are mu-plugins (must-use), not theme files or a customizer setting — they load on every request regardless of active theme, and survive theme updates/switches that would silently wipe theme-level customization. Each is enqueued with filemtime()-based cache-busting, so an FTP edit goes live immediately with no manual version bump.

Section 1

Color Tokens

Every color anywhere on the site is one of these thirteen custom properties, defined once in lsl-cyberpunk-theme.css's :root. Click any swatch to copy its hex.

copied
Base / Void
#10130D · --base-dark
Page background wash; flat chrome (header/footer/breadcrumb/tabs)
copied
Surface Card
#171A12 · --surface-card
Product cards, widgets, shop_table, cart/checkout blocks
copied
Surface 2
#1B1E15 · --surface-2
Form inputs, selects, textareas
copied
Deep Green
#1B2A17 · --deep-green
Breadcrumb bar background
copied
Text Main
#E7E2D2 · --text-main
Primary body/heading text on every dark surface
copied
Text Muted
#8A8F78 · --text-muted
Footer text, muted labels, inactive tabs, struck-through price
copied
Rust
#B5551E · --rust
Buttons/CTAs (gradient start), onsale badge, sale price, attrs-table odd rows, pagination rest state
copied
Rust Deep
#8C4116 · --rust-deep
Buttons/CTAs (gradient end), widget-title/breadcrumb-pill gradient end
copied
Amber
#E8A33D · --amber
Default link color, price, in-stock chip, attrs-table even rows, .lsl-jp Japanese text
copied
Amber Bright
#F0B65A · --amber-bright
Hover/focus state for links, nav, tabs, footer, sidebar
copied
Copper Glow
#D9622B · --copper-glow
Pagination active/current-page state only
copied
Pale Lavender
#EFEAF5 · --pale-lavender
Text/border paired with Copper Glow, pagination active state only
copied
Line
rgba(184,172,138,.18) · --line
Every border/divider/hr site-wide — a translucent warm-grey, never flat black or gray

Role guide

BG

base-dark / surface-card / surface-2 / deep-green — the only backgrounds that exist on this site. base-dark for flat chrome and the page wash; surface-card for anything "boxed" (cards, widgets, tables); surface-2 one step lighter for form fields; deep-green only for the breadcrumb bar.

Text

text-main is the default; text-muted is a deliberate step down for secondary information (footer, inactive tabs, struck-through prices) — never used for anything a customer needs to read as primary content.

Accent

rust/rust-deep = action (buttons, CTAs, badges); amber/amber-bright = navigation and information (links, price, hover states, in-stock). copper-glow/pale-lavender are reserved for pagination's active state alone — see the Do/Don't in Section 17 before reusing them anywhere else.

Section 2

Background Texture

Every page carries a tiled background image, overgrowth-tile.jpg, repeated at 1400px, under a flat rgba(16,19,13,.76) dark wash — painted once on html, body only. Every inner container that would otherwise paint its own background (#page, .site, #content, .news25-content, .site-content, .content-area) is forced transparent, so the tile reads as one continuous surface behind the whole page rather than restarting at every container boundary.

Header, footer, and breadcrumb deliberately opt out of the texture and use a flat --base-dark instead — chrome that needs to stay legible and structurally distinct from scrolling page content doesn't get the tile.

Section 3

Typography

3.1 Typeface & scale

Font is Poppins (weights 300–900, incl. italics), falling back to the system UI stack (system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif) — this is the theme's own font choice, unchanged by the color system, which only re-tints heading/body color, never font-family or size.

ElementSizeNotes
Body / p16pxline-height 1.5. This is the "normal" size every description paragraph should render at.
h138pxAll headings: bold weight, line-height 1.2, tight letter-spacing. Color forced to --text-main site-wide (the theme's own heading color is a near-black meant for a light page, and goes invisible on this dark theme without the override).
h234px
h330px
h426px
h520px
h618px

3.2 Body copy color override

Product/page paragraph text (.entry-content p, .wp-block-paragraph) is forced to --text-main !important for the same reason as headings — the theme's own paragraph color is near-black, correct for a light page, invisible here. The one deliberate exception: paragraphs inside the Additional Information attributes table are excluded from this blanket rule (:not(table.woocommerce-product-attributes p)) because that table needs its text color to flip per row instead — see Section 9.3.

3.3 Product description formatting

The rule that descriptions must never render smaller than the theme's normal paragraph size, and must use real <h3>/<ul><li> markup rather than bold text or bullet characters standing in for headings and lists, is a content-authoring rule, not a CSS rule — it lives in the Listing SOP as Rules 2.7 and 2.7a. This document is what those rules render through once followed correctly.

3.4 Japanese mirror text

Any element carrying the class .lsl-jp renders in --amber instead of the inherited body color — the hook bilingual listings use to make each Japanese line read as its own visual thread against the English line above it. Authoring convention for exactly how it's applied line-by-line and inside bulleted lists: Listing SOP Section 2.8.

Section 4

Global Elements

Links

--amber default, --amber-bright on hover/focus — everywhere, no exceptions carved out per section.

Focus

2px solid --amber outline, 2px offset, on every focusable element site-wide (:focus-visible) — one universal ring, not styled per component.

Selection

Selected text: --amber background, --base-dark text (both ::selection and ::-moz-selection).

Every border, <hr>, and divider on the site uses --line — never a flat black or gray rule.

Section 5

Header & Navigation

Flat --base-dark chrome (opts out of the page texture — Section 2). All header text --text-main, hover/focus --amber-bright. The site title and tagline text are hidden site-wide on every page (logo alone carries identity, matching the homepage's original cleaner treatment). The logo itself carries a soft dual drop-shadow glow (a warm cream shadow plus an amber shadow) rather than sitting flat.

Home ⌂ Search… 3

Home icon button: rust→rust-deep diagonal gradient fill (same gradient as every other CTA, Section 7), amber glow on hover. Search/nav inputs: --surface-card background. Cart-count badge: --amber circle, --base-dark number.

Header product carousel

A live bestseller carousel replaces the theme's static ad slot on every page. Each card is a flat #B5551E rust chip with warm-cream text (#F5ECDD) by default — but James's carousel script randomizes rust/amber per card at render time, so cards don't all read identically. Card contents: 64px thumbnail, product name, price.

Section 6

Breadcrumb Bar

Home Shop›Astrology›Scorpio Moon Tee

Bar background: --deep-green. The leading "Home" pill uses the same rust→rust-deep gradient as every button and widget title bar — a recurring "gradient chip" motif, not unique to this component. Trail links: --amber, hover --amber-bright.

Section 7

Buttons & CTAs

One universal rule covers every actionable button on the site — .btn, .button, Add to Cart, the single-product Add to Cart, input[type=submit]/button[type=submit], Gutenberg's wp-block-button, Proceed to Checkout, and Place Order. There is no per-page or per-context custom button color anywhere.

Add to Cart Proceed to Checkout Place Order
Fill

Rust→rust-deep diagonal (90°) gradient, --text-main text, no border, 8px radius.

Rest

Subtle inset amber glow (inset 0 0 10px rgba(232,163,61,.18)) — a quiet warmth, not a highlight.

Hover

Outward amber glow (0 0 16px rgba(232,163,61,.55)) plus a 1px lift (translateY(-1px)).

Section 8

Shop Grid & Product Cards

Scorpio Moon Tee
$28.00
In stock
Card

--surface-card background, 12px radius. On hover: lift (-3px) plus an amber glow shadow (0 8px 28px rgba(232,163,61,.18)).

Title

--text-main, hover --amber-bright.

Badges

Onsale: --rust pill, bold. In-stock: --amber pill with --base-dark text — the one deliberately bright "bioluminescent" accent moment kept in this otherwise muted palette.

Price colors: default --amber. Sale price: bold --rust. Original (struck-through) price: --text-muted at reduced opacity.

Section 9

Product Detail Page

9.1 Tabs (Description / Additional Information / Reviews)

--base-dark background for the whole tabs+summary area. Inactive tab label: --text-muted. Active tab and hover: --amber-bright.

9.2 Colors / Sizes variant selector

Its own small design system, deliberately namespaced under --lsl-swatch-* custom properties so it can never collide with or be overridden by the sitewide palette.

Colors
Dark Chocolate ▾
Sizes
L ▾
Panel

The label column and value column both paint solid --lsl-swatch-panel (rust, same hex as sitewide --rust), text --lsl-swatch-panel-ink (a warm cream, #F5E9D6).

Control

Both the Colors and Sizes trigger (closed state) use --lsl-swatch-control — a lighter amber than the sitewide token, #C4873F — with dark ink text and square corners, deliberately distinct from the rounded-gradient button language in Section 7.

Dropdown

Both Colors and Sizes are JS-built custom dropdowns, never a native <select> — Chrome/Edge give no CSS hook to recolor a native select's open popup (it's always the browser's own white OS chrome), so a real custom dropdown is the only way to keep it on-brand. Opened, Colors rows hover to that color's actual Gildan 5000 garment hex (light or dark hover-text chosen per row for contrast); Sizes rows have no per-value color, so they hover to a flat lighter-amber accent instead.

Every background/border declaration in this component carries !important — theme/plugin CSS loaded after it has repeatedly won cascade ties on unguarded rules in this exact component, so nothing here is left unguarded.

9.3 Additional Information table

Weight
Width, in (S-5XL)
Length, in (S-5XL)
Care Instructions

Real WooCommerce product attributes, never text pasted into the Description — Listing SOP Rule 2.6a governs the authoring side. Rows alternate --rust / --amber, and text color flips per row for contrast: --text-main on rust rows, --base-dark on amber rows — including the value cell's nested <p>, which needed its own override since the sitewide body-copy rule (Section 3.2) would otherwise force it light regardless of row color.

9.4 Description body

Inherits the sitewide typography from Section 3 — no product-page-specific font rules exist. The legibility and real-markup requirements live in the Listing SOP (2.7, 2.7a) because they're authoring rules, not CSS.

Section 10

Tables

Two distinct table types exist on the site — don't conflate them when styling a third:

shop_table

table.shop_table — cart and checkout order-review tables. Flat --surface-card background, --rust bottom border under the header row. A receipt, styled to be read quickly, not browsed.

attributes

table.woocommerce-product-attributes — Additional Information (Section 9.3). Deliberately more decorative: alternating rust/amber bands, because it's the one table a customer browses for its own sake, not just a summary to confirm.

Section 11

Forms & Inputs

Every input, select, and textarea outside the variant-selector component (which has its own system, Section 9.2): --surface-2 background, --text-main text, --line border. Placeholder text: --text-muted.

Section 12

Cart & Checkout

Cart, checkout order-review, and cart-totals blocks: --surface-card background, --line border — the same "boxed" surface treatment as product cards and widgets, keeping every panel on the page visually related.

Section 13

Pagination

123→

Inactive page numbers: --rust background, --amber text and border. Active/current, hover, and focus states: brighter --copper-glow background, --pale-lavender text and border — the one place either of those two tokens is used. It needs to read as unmistakably different from the resting rust/amber pairing, which is why it borrows outside the core token set rather than just brightening rust/amber further.

Section 14

Sidebar & Widgets

Widget wrapper: --surface-card. Widget title bars (Categories, Archives, "Updates," etc.): the same rust→rust-deep gradient chip as the breadcrumb "Home" pill and the header home button — one recurring motif for any titled block, not three separate decisions. Category/archive links: --text-main, hover --amber-bright; item counts: --text-muted.

Section 15

Footer

Flat --base-dark, opts out of the page texture like the header. All footer text is --text-muted — deliberately a step dimmer than body copy, since the footer is wayfinding, not content the visitor came to read. Links brighten to --amber-bright on hover/focus, same as everywhere else.

Section 16

Blog-Specific Overrides

The single-post article body (.post-content) keeps its own light background, untouched by the dark-chrome rules elsewhere on the site — so headings inside it get a forced dark color (#1B2A17, the same hex as --deep-green) instead of the sitewide --text-main, which would otherwise render near-invisible light-on-light. The Calendar widget's post-day links: --rust, bold, hover --amber-bright.

Section 17

Do / Don't

Do
  • Reference a token from Section 1 for every color decision — never a hand-typed hex.
  • Extend lsl-cyberpunk-theme.css (or a new dedicated mu-plugin file for a large distinct feature, matching the swatch-selector pattern) for any new component — never an inline style= on a live page.
  • Reach for !important when a new rule needs to beat theme/plugin CSS loaded after it, and say why in a comment — the established pattern throughout this codebase.
  • Keep the variant-selector's --lsl-swatch-* tokens separate from the sitewide palette, even where the hex values happen to match.
Don't
  • Introduce a second color system. The 2026-07-30 blue/cyan/magenta exploration was never adopted — don't revive it without an explicit decision to replace Corroded Copper.
  • Use --copper-glow / --pale-lavender outside pagination's active state — they're a one-purpose highlight pair, not general accents.
  • Build a light-mode variant of the live site. It doesn't have one, and nothing in this document should be read as proposing one.
  • Leave a native browser default unstyled. Every interactive element already has a themed rule; a new one should match the closest existing pattern (Section 7 for anything button-shaped, Section 9.2 for anything dropdown-shaped) rather than rendering as unstyled browser chrome.

Appendix A · Reference Only — Not Part Of This System

Tsugi Grid Pattern

A reusable seamless background pattern James refers back to often for other, non-LeoScorpioLeo design work. Saved here purely as a durable reference so the spec doesn't have to be re-derived each time — it is not a site token, is not used anywhere on leoscorpioleo.com's live theme, and is exempt from Section 1's "every color is one of the thirteen tokens" rule and Section 0's "the live site is a single dark theme" rule above. Don't apply it to leoscorpioleo.com pages without being asked.

First used 2026-08-10 on leoscorpioleo.com/resume/ — a standalone static page deliberately outside this SOP's scope (see Purpose & Scope at top), so that use isn't a precedent for the main site.

Cell

60px × 60px repeating square tile.

Palette

Background #FAF7F2 (warm paper) · Foreground #7A5B3E (dark sepia).

Geometry

A solid 6px rule along the top edge of each cell, plus a 3-dot vertical array (r=3px) centered at x=30, at y=15 / 30 / 45.

Implementation — inline SVG data-URI, no image asset, no HTTP request, resolution-independent at any zoom/DPI:

.tsugi-grid-bg {
  background-color: #FAF7F2;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='60' height='60' viewBox='0 0 60 60'%3E%3Crect width='60' height='60' fill='%23FAF7F2'/%3E%3Crect width='60' height='6' fill='%237A5B3E'/%3E%3Ccircle cx='30' cy='15' r='3' fill='%237A5B3E'/%3E%3Ccircle cx='30' cy='30' r='3' fill='%237A5B3E'/%3E%3Ccircle cx='30' cy='45' r='3' fill='%237A5B3E'/%3E%3C/svg%3E");
  background-repeat: repeat;
  background-size: 60px 60px;
}

Built from filled rects/circles rather than stroked lines, so the top rule and dots never clip or double at tile seams — a stroked <line> at y=0 would render half outside the viewBox.