LeoScorpioLeo Ltd/LeoScorpioLeo (T-shirts)/Theme & UI
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
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.
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.
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.
Section 0
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).
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.
| File | Owns |
|---|---|
| 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
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.
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-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.
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
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
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.
| Element | Size | Notes |
|---|---|---|
| Body / p | 16px | line-height 1.5. This is the "normal" size every description paragraph should render at. |
| h1 | 38px | All 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). |
| h2 | 34px | |
| h3 | 30px | |
| h4 | 26px | |
| h5 | 20px | |
| h6 | 18px |
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.
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.
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
--amber default, --amber-bright on hover/focus — everywhere, no exceptions carved out per section.
2px solid --amber outline, 2px offset, on every focusable element site-wide (:focus-visible) — one universal ring, not styled per component.
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
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 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.
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
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
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.
Rust→rust-deep diagonal (90°) gradient, --text-main text, no border, 8px radius.
Subtle inset amber glow (inset 0 0 10px rgba(232,163,61,.18)) — a quiet warmth, not a highlight.
Outward amber glow (0 0 16px rgba(232,163,61,.55)) plus a 1px lift (translateY(-1px)).
Section 8
--surface-card background, 12px radius. On hover: lift (-3px) plus an amber glow shadow (0 8px 28px rgba(232,163,61,.18)).
--text-main, hover --amber-bright.
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
--base-dark background for the whole tabs+summary area. Inactive tab label: --text-muted. Active tab and hover: --amber-bright.
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.
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).
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.
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.
| 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.
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
Two distinct table types exist on the site — don't conflate them when styling a third:
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.
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
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 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
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
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
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
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
Appendix A · Reference Only — Not Part Of This System
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.
60px × 60px repeating square tile.
Background #FAF7F2 (warm paper) · Foreground #7A5B3E (dark sepia).
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.