Vertex Brand & Design System

Rules and recipes
for building pages.

This page is for agents (human or AI) shipping new pages on vertexlogicalsolutions.com. Copy patterns from here. Don't invent new ones. When this page and DESIGN.md disagree, DESIGN.md wins.

01

Quick start

If you're building a new page, start here.

  1. 01

    Use BaseLayoutAA

    Every new page imports ../layouts/BaseLayoutAA.astro. It loads HeaderAA, FooterAA, the utility bar, Plus Jakarta Sans, and the variant-d.css palette. Never use BaseLayout, BaseLayoutA, BaseLayoutC, or BaseLayoutD for new pages — they're older variants kept around for parity with experimental builds.

  2. 02

    Compose from blessed sections

    New page = pick from src/components/sections-aa/ + src/components/sections-d/. Don't build new sections from scratch unless the existing ones genuinely don't fit. When in doubt, fork an existing component into sections-aa/ with a new name.

  3. 03

    One H1 per page

    The H1 is the page-level headline. Every other heading is H2/H3. The H1 lives in the hero section and includes the page's primary keyword.

  4. 04

    Every H2 carries the keyword

    Target keyword on the homepage is 3PL for ecommerce brands. Each H2 must surface "3PL" + "ecommerce brands" or close variants. See section 06 for the production-bound H2 list.

  5. 05

    Color is rationed

    Teal #1d9890 is precious — eyebrows, icons, divider rules, accents on dark only. Body text is --d-text (#4a5568). Headings are always navy-900 (#0a1d3f) on light, white on dark navy.

  6. 06

    Use the existing component patterns

    Cards = white on white, ring-1 ring-d-line, 20px radius, soft shadow. Eyebrow + H2 + lede header pattern repeats across every section. Don't invent new card shapes.

  7. 07

    Generate icons, don't hunt them

    New icon needed? Use the prompt template in section 07 to generate one via nano-banana-pro at 1:1 aspect, model: pro. Save to /public/icons/<set>/. Never use Heroicons / Phosphor / generic icon libraries — they read off-brand next to our generated set.

02

Page recipes

Compose, don't invent.

Reach for one of these recipes first. They're all on home-aa already, so behavior is proven and visually consistent.

Recipe · Section header

Eyebrow → H2 → lede

Every section starts with a teal uppercase eyebrow, followed by the section H2 (with keyword), followed by a one-paragraph lede that frames the section.

Why Vertex

Why ecommerce brands switch to our 3PL.

Faster receiving, higher accuracy, and no annual contracts. The 3PL ecommerce brands switch to.

<p class="d-eyebrow">Why Vertex</p>
<h2 class="mt-7 text-[36px] sm:text-[48px] lg:text-[62px] font-extrabold leading-[1.08] tracking-[-0.025em] text-[var(--d-navy-900)]">
  Why ecommerce brands switch to our 3PL.
</h2>
<p class="mt-5 max-w-[940px] text-[18px] lg:text-[20px] leading-[1.6] text-[var(--d-text)]">
  Lede paragraph — frames the section. Includes the keyword again where natural.
</p>

Recipe · Card grid (4-up)

Service or capability cards

Use for ServicesAA-style category cards. Always 4-up at lg+, 2-up at md, 1-up on mobile. Each card has: generated teal icon (72×72) → title → 3px teal-400 underline → bullet list.

Fulfillment Services

  • Order fulfillment services
  • Ecommerce fulfillment services
  • 3PL services

Amazon Services

  • Seller Fulfilled Prime
  • Amazon FBA prep
  • Amazon fulfillment

Source: src/components/sections-aa/ServicesAA.astro

Recipe · Comparison table

Typical vs Vertex split

7/5 horizontal split. Left card lists "typical 3PL" pain points with X markers. Right card has the navy header + 6 numbered items with generated icons. Use only for differentiator content. Body copy stays on one line.

Source: src/components/sections-aa/WhyVertexAA.astro

Recipe · Pricing split

Dark/light pricing card

28px-radius card, 60/40 horizontal split. Left side solid --d-navy-950 (NO gradient overlays — that read SaaS template). Right side white. Both inside one card with ring-d-line.

Source: src/components/sections-aa/PricingAA.astro

Recipe · Trust strip

8-logo client roster

Use for "Trusted by" client logos. Always 8 cells (or grid stays even on responsive breakpoints — 2/4/8). Logos in full color, capped at 40px height inside a 48px container. Brand-name label below each logo. NO grayscale, NO cell dividers.

Source: src/components/sections-aa/HeroAA.astro (bottom band)

03

Component library

Copy these. Don't reinvent.

Five primitives every page uses. Each has a rendered demo and the exact code to copy.

Eyebrow label

Above every H2. Teal-500, uppercase, tracking-0.14em, 12px Bold.

Always. Never skip the eyebrow on a section header.

Our Services

<p class="d-eyebrow">Our Services</p>

Primary CTA · on light

The brand-teal pill in HeaderAA. Solid teal-500, white text, 9px radius, 15px text, with --d-shadow-cta teal-tinted drop-shadow. Min-height 48 / 54 on lg. NO arrow icon.

Source: HeaderAA.astro

<a href="/contact"
   style="box-shadow: var(--d-shadow-cta);"
   class="inline-flex min-h-12 items-center justify-center whitespace-nowrap
          rounded-[9px] bg-[var(--d-teal-500)] px-5 text-[15px] font-extrabold
          text-white transition-colors hover:bg-[var(--d-teal-600)]
          lg:min-h-[54px] lg:px-7">
  Contact Sales
</a>

Primary CTA · on dark (inverted)

The white pill on the dark hero. Inverted: white bg, navy-950 text. 10px radius, gap-3 with arrow. Soft white-glow shadow.

Source: HeroAA.astro

<a href="/contact"
   class="inline-flex items-center justify-center gap-3 rounded-[10px]
          bg-white px-6 py-3.5 text-[15px] font-extrabold
          text-[var(--d-navy-950)]
          shadow-[0_18px_44px_-24px_rgb(255_255_255_/_0.35)]
          transition-colors hover:bg-[var(--d-navy-50)]">
  Get a Custom Quote
  <span aria-hidden="true">→</span>
</a>

Secondary CTA · on dark

The ghost pill beside the hero primary. White text on white/10 bg with white/34 ring + backdrop-blur. Names a specific destination.

Source: HeroAA.astro

<a href="/how-it-works"
   class="inline-flex items-center justify-center gap-3 rounded-[10px]
          bg-white/10 px-6 py-3.5 text-[15px] font-extrabold text-white
          ring-1 ring-white/34 backdrop-blur-sm
          transition-all hover:bg-white/16 hover:ring-white/55">
  How it Works
  <span aria-hidden="true">→</span>
</a>

Secondary CTA · on light

White bordered pill on a light section. Use sparingly — most secondary actions on light sections are inline text-arrow links, not pills.

<a href="/how-it-works"
   class="inline-flex min-h-12 items-center justify-center whitespace-nowrap
          rounded-[9px] bg-white px-5 text-[15px] font-extrabold
          text-[var(--d-navy-900)] ring-1 ring-[var(--d-navy-900)]/15
          transition-colors hover:bg-[var(--d-paper-2)]
          hover:ring-[var(--d-navy-900)]/30 lg:min-h-[54px] lg:px-7">
  How it Works
</a>

Card on white

White background, ring-1 ring-d-line, 20px radius, soft shadow. Hover: lift 4px, ring deepens to navy-200. Standard for service cards, capability cards, anything in a grid.

Card heading

Same-day fulfillment

Orders placed before cutoff ship the same day.

<article class="group flex flex-col rounded-[20px] bg-white p-7
   ring-1 ring-[var(--d-line)] transition-all duration-300
   hover:-translate-y-1 hover:ring-[var(--d-navy-200)]"
   style="box-shadow: 0 24px 70px -42px rgb(10 29 63 / 0.22);">
  <p class="d-eyebrow">Card heading</p>
  <h3 class="mt-4 text-[20px] font-extrabold text-[var(--d-navy-900)]">
    Card title
  </h3>
  <p class="mt-3 text-[14px] leading-[1.6] text-[var(--d-text)]">Body.</p>
</article>

Tag pill

Pill chips for service-area cities, capability tags, or status indicators. White bg, ring-d-line, 9px radius.

Toronto Atlanta
<span class="inline-flex items-center gap-2 rounded-[9px] bg-white px-4 py-2
   text-[14px] font-extrabold text-[var(--d-navy-900)] ring-1 ring-[var(--d-line)]">
  Toronto
</span>
04

Color rules

When to use which color.

Use this For
--d-navy-900All H1–H6 text on light, primary CTA, footer.
--d-navy-950Utility bar, hero overlay, pricing card LEFT half, FinalCTA card.
--d-teal-500Eyebrows, generated icons, divider rules under H2/cards, accents on dark.
--d-teal-400The 3px × 40px underline rule under H2s and card titles.
whiteSection bg by default. Card surfaces.
--d-paperSection alternation when needed (rare). Tag pill bg.
--d-lineCard rings, dividers, hairlines.
--d-textPrimary body copy.
--d-text-mutCaptions, micro-labels, secondary text.

⚠ Hard rules

  • Never use teal as text color on white (contrast fails AA).
  • Never use a teal gradient overlay on a dark card (reads SaaS-template).
  • Never use teal as a border on white cards.
  • Never use any color outside the variant-d.css palette without updating DESIGN.md first.
05

Typography rules

One typeface. Weight does the work.

Plus Jakarta Sans only. Variable, weights 400–800. Hierarchy through weight + size + tracking, not pairing.

Role Spec Tailwind
Hero H176px / 800 / -0.03emtext-[44px] sm:text-[64px] lg:text-[76px] font-extrabold tracking-[-0.03em]
Section H264px / 800 / -0.025emtext-[36px] sm:text-[48px] lg:text-[64px] font-extrabold tracking-[-0.025em]
Card title26px / 800 / -0.02emtext-[24px] lg:text-[26px] font-extrabold tracking-[-0.02em]
Lead body20px / 400 / 1.65 lhtext-[18px] lg:text-[20px] leading-[1.6]
Body16px / 400 / 1.65 lhtext-[16px] leading-[1.65]
Eyebrow12px / 700 / 0.14em up.d-eyebrow (or text-[12px] font-bold uppercase tracking-[0.14em] text-[var(--d-teal-500)])

✓ Do

  • Use 800 ExtraBold for every headline
  • Use 400 Regular for body
  • Use 600+ for tracked-uppercase labels
  • Use the .d-eyebrow class for every section eyebrow

✗ Don't

  • Pair Plus Jakarta Sans with another typeface
  • Use weights 100–300 (font looks anemic)
  • Use the same weight for everything (flat type)
  • Set body smaller than 14px on the homepage
  • Use italic — we don't have an italic moment in the system
06

Copy & SEO rules

Every H2 carries the keyword.

Target keyword on the homepage: 3PL for ecommerce brands. The 8 production-bound H2s below show how to bake the keyword into a natural sentence — copy this pattern when you write a new section.

Section Production H2
ServicesThe full 3PL stack for ecommerce brands.
Why VertexWhy ecommerce brands switch to our 3PL.
IntegrationsA 3PL connected to every ecommerce platform.
Service AreasEcommerce 3PL coverage across the U.S. & Canada.
Pricing3PL pricing built for scaling ecommerce brands.
TestimonialsWhat ecommerce brands say about our 3PL.
Resources3PL guides for ecommerce brands.
FAQ3PL for ecommerce brands, answered.

CTA language

USE

Contact Sales

AVOID

Get a Custom Quote

Replaced May 2026 per Vertex call.

USE

How it Works

AVOID

Get Started

Specific destination beats generic action.

USE

Book a Discovery Call

AVOID

Sign Up

B2B-appropriate, names the meeting type.

USE

See full pricing

AVOID

Request a Demo

We're a 3PL, not SaaS — "demo" is wrong category.

Voice

✓ Always

  • "ecommerce brands", "D2C", "3PL"
  • Specific platform names: Shopify, Amazon, WooCommerce, BigCommerce, Wix
  • Concrete numbers: 99.98%, 24h, 100K+, 65k ft²
  • Plain language. Second person. Short sentences.

✗ Never

  • FIFO, dock-to-live-SKU, cross-dock, transloading, nodes (in plain copy), ERP, SLA without context
  • "Datex Footprint" or "TechDynamics WMS" as the headline
  • "Scale your enterprise", "compliance-ready", "C-suite visibility"
  • "Either B2C or B2B"-style false dichotomies
07

Imagery decisions

Three families. Pick deliberately.

Vertex has three image families. They don't substitute for each other. Pick the right one for what you're trying to communicate.

Generated icons

Solid teal pictograms representing a category. Use ON cards (next to title), in numbered lists, in primary visual slots.

/public/icons/<set>/

Real brand logos

Client + integration logos in full color. Use in trust strips, integration grids, testimonial attribution. Never modify (no greyscale, no recolor).

/public/clients/, /public/logos/

Brand patterns

Abstract logistics line illustrations. Use as ambient section backgrounds at 0.06–0.18 opacity. Always with fade-mask to white. Never on cards.

/public/images/generated/

Decision tree

  • Need to communicate a category or capability? → Generated teal icon.
  • Need to credibly say "we work with these brands"? → Real brand logos in full color.
  • Need atmosphere on a section background? → Brand pattern at low opacity.
  • Need a hero photograph? → Use the existing warehouse video. Don't add stock photos to other sections.

Generation prompts

Use Gemini (nano-banana-pro). Set model: pro.

Icon prompt · 1:1 aspect

Solid color flat brand icon for "[concept]".
[Subject description].
Rendered in pure solid teal #1d9890 only.
Clean white square background.
No gradients, no shadows, no outlines.
Bold geometric shape, fills 60–70% of canvas.
Modern app icon set style.

Pattern prompt · 16:9 aspect

Subtle abstract logistics line illustration
for "[section]".
Thin line-art elements at low contrast:
dotted route paths, package boxes, location
pins, truck silhouettes, supply-chain diagrams.
Flat 2D, no fills — line work only.
Stroke: pale blue-gray (#c2d0e6), 1px lines.
Composed as ambient texture, not foreground.
White background.
08

Anti-patterns

Banned. If you ship one of these, revert.

If something looks like a Tailwind UI template screenshot, it fails. These specific patterns are off-brand and should never appear on a Vertex page.

  • Teal/colored gradient overlays on dark cards

    Reads SaaS-template. The pricing card ships solid navy-950 with no overlays.

  • Identical 4-column symmetric grids stacked back-to-back

    Vary composition: split, asymmetric, full-width.

  • Vertical hairline dividers between cells in logo strips

    Read tabular. The trust strip uses gap-only.

  • Grayscale logo bands with hover-color reveal

    Cold for our positioning. Logos render in full color.

  • One-word orphan lines in H2s

    Fix with shorter copy or restructure the <span class="block"> breaks.

  • Single brand logo on a category card

    Implies single-platform support. Use a generated category icon.

  • Mismatched icon weights (line-art SVG next to real brand logo)

    All icons in a section must come from the same family.

  • "Either B2C or B2B"-style false dichotomies

    Most 3PLs do support both. Use real D2C pain points instead.

  • "Get a Custom Quote" copy anywhere

    Replaced by "Contact Sales" in May 2026.

  • Heroicons / Phosphor / generic icon libraries

    Generate the icon you need via nano-banana-pro instead.

  • Decorative SVG noise / floating particles / wavy dividers

    No.

  • Multiple brand patterns in one section

    One pattern per section, max.

09

File structure

Where new code goes.

src/
  pages/
    home-aa.astro          ← production-bound homepage
    brand.astro            ← this design system
    [new-page].astro       ← new pages go here
  layouts/
    BaseLayoutAA.astro     ← USE THIS for new pages
  components/
    sections-aa/           ← production sections (HeroAA, ServicesAA, etc.)
    sections-d/            ← shared sections still in use (StatsD, TestimonialsD, FAQD)
    ui/                    ← Container, Section, etc. primitives
  data/
    services-h.ts          ← 12 search-driven services
    site.ts                ← brand metadata, nav, finalCTA
  styles/
    variant-d.css          ← color tokens + base type scale (READ-ONLY)
    global.css             ← reset + utilities

public/
  icons/
    services-aa/           ← 4 generated service icons (teal pictograms)
    why-vertex-aa/         ← 6 generated WhyVertex icons
    [new-set]/             ← new icon sets go here
  images/generated/        ← 10 brand patterns (section backgrounds)
  clients/                 ← 8 real Vertex client logos
  logos/                   ← integration platform + carrier logos
  flags/                   ← country flag SVGs
  video/                   ← hero video (hero-720.mp4 / .webm)

Adding a new page? Drop a file in src/pages/, import BaseLayoutAA, compose from sections-aa/. Astro handles routing automatically.

Source of truth: DESIGN.md at the project root. This page renders the same rules with examples. When the two disagree, DESIGN.md wins.

Talk to our 3PL team

Custom quote in 24 hours.

Tell us what you ship and where your customers are. We respond from a human address inside one business day. No mailing list.

We reply from a human address. No drip sequence, no mailing list.