WestMetal Group / Design System

Built with precision.
Designed for trust.

A shared foundation for building clear, capable, and unmistakably WestMetal experiences—from a single button to a full campaign.

Version1.0
UpdatedJuly 2026
Maintained byWestMetal Group
01 / Brand assets

A consistent mark in every context.

Prefer the horizontal logo for headers and wide formats. Use the circle or icon marks when space is constrained. Preserve the artwork’s proportions and use the white variants only on dark, uncluttered surfaces.

Horizontal logo
Circle — color
Circle — black
Circle — white
Icon — blue
Icon — black
Icon — white
Site icons

Favicon & touch icons

Use the SVG favicon when supported, retain the PNG as a raster fallback, and use the 180px touch icon for Apple home-screen bookmarks.

Do protect the mark

Keep clear space around the logo equal to at least the height of the “W” icon. Use approved artwork and maintain strong contrast.

Don’t improvise

Never stretch, rotate, recolor, outline, add effects, rearrange, or place the mark over visually noisy imagery.

02 / Photo library

Shared photography for components and page layouts.

Browse the theme’s photo library as a thumbnail grid, then open images in a modal with download and previous/next navigation.

Browse 18 thumbnails per page. Click any image to open the full library in the lightbox, then use its previous/next controls or arrow keys.

03 / Color

Blue carries the brand. Neutrals do the work.

WestMetal Blue is the primary brand and action color. Dark blue adds depth; steel and greys establish structure. Reserve semantic red and green for feedback—not decoration.

Success#66CB18
Error#BA3C3C
Focus#4A90E2
Surface#F7F9FB

Contrast rule: use white text on WestMetal Blue or Blue Dark, and charcoal/black text on light blue, steel, grey, or white surfaces.

04 / Typography

Aktiv Grotesk Extended

The extended proportions feel technical and assured without becoming mechanical. Use Light for primary headings, Regular for body copy, Medium for compact interface labels, and heavier weights sparingly.

Aa
Aktiv Grotesk Extended

Primary heading and body family · Served by Adobe Fonts

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz 0123456789

Hairline100

Precision fabrication, built for scale.

Thin200

Precision fabrication, built for scale.

Light300

Precision fabrication, built for scale.

Regular400

Precision fabrication, built for scale.

Medium500

Precision fabrication, built for scale.

Bold700

Precision fabrication, built for scale.

Extra Bold800

Precision fabrication, built for scale.

Black900

Precision fabrication, built for scale.

Display48 / 1.05 / 300

Precision at scale.

H140 / 1.10 / 300

Your overflow fabrication partner.

H232 / 1.20 / 300

Built for demanding shops.

H320 / 1.30 / 400

Field-ready components

Body18 / 1.50 / 400

Clear communication keeps projects moving and crews productive.

Small14 / 1.50 / 400

Supporting details, helper text, and metadata.

Label12 / 1.20 / 600

PROJECT REQUIREMENTS

Hierarchy

Use one H1 per page and descend in order. Never choose a heading level for appearance alone.

Line length

Keep body copy near 55–75 characters per line. Use balanced wrapping for short headlines only.

Capitalization

Use sentence case for headings and actions. Reserve uppercase for compact labels and navigation.

05 / Spacing & layout

Order, rhythm, and enough breathing room.

The system uses a 4px spacing base and a reusable CSS Grid API. Add .grid, choose a column count with data-columns, and optionally control the gutter with data-gap. Page content is capped at 1500px.

22px
44px
88px
1212px
1616px
2424px
3232px
4848px
6464px
Page container · max 1500px
Grid API

Equal-column layouts

The same markup pattern supports one through six columns. The examples below use the production .grid[data-columns] rules—not a separate demonstration grid.

One columndata-columns="1"
Long-form content, focused forms, and narrow editorial sections.
1
<div class="grid" data-columns="1">…</div>
Two columnsdata-columns="2"
Split content, comparisons, image-and-copy layouts, or paired cards.
1
2
<div class="grid" data-columns="2">…</div>
Three columnsdata-columns="3"
Services, feature groups, related resources, and medium-density card collections.
1
2
3
<div class="grid" data-columns="3">…</div>
Four columnsdata-columns="4"
Compact benefits, icon tiles, capability summaries, and scannable UI collections.
1
2
3
4
<div class="grid" data-columns="4">…</div>
Uneven layouts

Two-thirds patterns

Use .grid-thirds when one side carries the primary narrative. Add .grid-thirds-reverse when the narrow supporting column belongs on the left.

Primary / supporting2fr 1fr
Primary · ⅔
Support · ⅓
.grid.grid-thirds
Supporting / primary1fr 2fr
Support · ⅓
Primary · ⅔
.grid.grid-thirds.grid-thirds-reverse
data-gap="1–5"

Gutter control

Sets the gap from 1rem through 5rem. Use the smallest value that keeps related content distinct.

.grid-sm

1200px container

Constrains a grid when the full 1500px page width would make content too dispersed.

.grid-extra-sm

960px container

Useful for comparisons, forms, and concentrated two-column content.

.order-1 / .order-2

Mobile order

Changes visual order below 800px while preserving a sensible source order.

Desktop

Choose the column count that matches the content. Five- and six-column grids progressively reduce at 1500px, 1200px, and 1024px.

Tablet

Most grids collapse at 800px. Four-column layouts reduce earlier at 1200px to protect useful card widths.

Mobile

Default to one column below 800px. Automation tiles intentionally retain two columns as a component-specific exception.

06 / Buttons

Actions should look actionable.

Use one primary action per decision area. Buttons support text-only, leading-icon, trailing-icon, and icon-only configurations. Write labels as concise verb phrases and use icons only when they improve recognition.

<button class="button" data-type="primary" data-size="md" data-color="blue" data-icon-position="leading"><i class="fa-solid fa-upload" aria-hidden="true"></i> Upload specs</button>

Icon-only rule: every icon-only button requires a concise aria-label. Decorative icons inside labeled buttons should use aria-hidden="true".

07 / Font icons

Font Awesome interface icons.

The global Font Awesome kit supplies interface icons. Use the solid style by default for consistent weight and legibility. Select an icon below to copy its complete class name.

Primary library: Font Awesome. Material Symbols remain in legacy components and may be retained until those components are updated.

<i class="fa-solid fa-download" aria-hidden="true"></i>

Use one style

Default to fa-solid. Do not mix outlined, sharp, duotone, and solid icons within one interface region.

Pair with language

Use text labels for unfamiliar or consequential actions. Icons should reinforce meaning, not make the user guess.

Keep icons decorative

When visible text provides the name, add aria-hidden="true". For icon-only controls, name the button itself.

08 / Input fields

Ask only for what the job requires.

Keep forms short, labels visible, instructions specific, and errors close to the problem. Never rely on placeholder text as the only label.

We’ll use this to follow up on your request.
error Enter a project name.
Include enough detail for an accurate next step.
Capabilities needed
09 / Custom components

The interface already has a working parts library.

These are the custom, production components currently available in the theme. Reuse and extend them before introducing a new visual pattern.

Overloaded shop?We’ve got you covered.
Page entry

Hero

Home-page value proposition with supporting copy and one primary drawer action.

components/pf-hero.phpView live demo arrow_outward
Page titleYour Partner in Precision Fabrication
Page entry

Interior banner

Compact image-led introduction with page-specific title and subtitle logic.

components/pf-banner.phpView live demo arrow_outward
speedSpeedReduce fabrication time
Interactive

Automation tiles

Four benefit buttons with icon, bubble hover treatment, and contact-drawer trigger.

components/pf-tiles.phpView live demo arrow_outward
Curtain Wall SystemsCut, routed, and labeled.
Content collection

Fabrication cards

Image-forward service cards for systems, capabilities, and conversion content.

components/pf-fab.phpView live demo arrow_outward
Automation Advantage
Feature

RHINOFAB feature

Dark, equipment-focused capability section with branded machine artwork and benefits.

components/pf-rhino.phpView live demo arrow_outward
Editorial

Split content

Responsive two-column narrative pattern used for the story, process, and capability pages.

components/pf-content-*.phpView live demo arrow_outward
It felt like having an extra shop on call.Owner, Glazing Firm
Proof

Testimonials

Overlapping quote treatment with attribution and GlazierIQ network endorsement.

components/pf-testimonial.phpView live demo arrow_outward
Contactlocation_onSouth Lyon, MI 48178call248.522.7030
Utility

Contact sidebar

Sticky contact card with dedicated sidebar and footer display contexts.

components/pf-contact-sidebar.phpView live demo arrow_outward
Send Us Your Specs
Interactive

Form drawer

Accessible modal dialog triggered from CTAs, with escape and overlay-close behavior.

components/pf-form-drawer.php
1Quote2Approve3Receive
Process

Three-step process

Ordered Quote → Approve → Receive workflow for explaining what happens next.

components/pf-content-how.phpView live demo arrow_outward
Why jobs fall behindCapacity, precision, and timing.
Editorial

Problem / solution split

Brand-blue narrative section pairing detailed copy with supporting shop photography.

components/pf-why.phpView live demo arrow_outward
info

Project note Include system details and required delivery dates with your request.

check_circle

Request received Our estimating team will follow up shortly.

error

Upload failed Check the file size and try again.

10 / Design patterns

Build pages around decisions, not decoration.

Lead with the user’s problem, establish credible capability, explain the process, then make the next step obvious.

01

Orient

State the audience, problem, and outcome in the hero.

02

Prove

Show equipment, process, experience, or concrete outcomes.

03

Explain

Break a complex service into a short, ordered path.

04

Act

End with one clear, contextual call to action.

Do design for scanning

Front-load meaning, use descriptive headings, group related information, and make the next action visible.

Don’t create a wall of cards

Vary the page rhythm with editorial copy, imagery, proof, process, and focused actions.

11 / Voice & content

Experienced. Direct. On your side.

Write like a knowledgeable shop partner: specific enough to be useful, confident enough to lead, and human enough to call.

We are

Practical

“Send the cut list and required date. We’ll confirm capacity and next steps.”

We are

Capable

“Automated equipment keeps high-volume runs consistent and field-ready.”

We are not

Inflated

Avoid vague superlatives, corporate filler, and claims the page cannot prove.

Use: “Send us your specs”

Avoid: “Click here to submit”

Use: “What happens next”

Avoid: “Our proprietary methodology”

Use: “Add capacity without adding overhead”

Avoid: “Revolutionize your fabrication paradigm”

12 / Accessibility

Quality includes everyone.

Target WCAG 2.2 AA. Accessibility is a design, content, and engineering responsibility—not a final checklist.

contrast

Contrast

Maintain 4.5:1 for normal text and 3:1 for large text and essential interface graphics.

keyboard

Keyboard

Every action must work without a mouse, in a logical order, with a visible focus state.

touch_app

Targets

Use touch targets at least 44×44px where practical and provide enough space to avoid errors.

image

Alternatives

Write useful alt text for meaningful images and leave decorative images empty.

subtitles

Media

Caption video, provide transcripts for audio, and never rely on motion alone.

motion_photos_off

Motion

Respect reduced-motion preferences and avoid unnecessary animation or flashing content.

13 / Front-end standards

Ship interfaces that hold up under pressure.

Use semantic HTML, progressive enhancement, scoped components, and the existing token system. Performance and resilience are part of the design.

HTML

Start with meaning

Use landmarks, ordered headings, native controls, labels, lists, and buttons before adding ARIA.

CSS

Use shared tokens

Build from custom properties, component scopes, fluid sizing, and the established 800px responsive breakpoint.

JS

Enhance, don’t require

Keep core content available without JavaScript. Test focus, escape behavior, and browser navigation.

PERF

Keep it lean

Use SVG for marks, responsive images for photography, lazy-load below the fold, and avoid layout shifts.

QA

Test the edges

Check 320px through large desktop, keyboard-only use, zoom at 200%, long content, and form errors.

NAMING

Make intent obvious

Use component-oriented classes, `data-*` attributes for variants, and readable names over abbreviations.

Theme architecture

Keep composition, presentation, and behavior separate.

Page templates compose reusable PHP parts. SCSS partials own presentation. JavaScript modules add behavior. WordPress setup stays inside the functions directory so the root files remain easy to scan.

Directory mapTheme file structure
westmetal-group/
├── assets/
│   ├── css/
│   │   ├── components/       # Component-scoped SCSS
│   │   ├── layouts/          # Header, footer, page layouts
│   │   ├── partials/         # Tokens, base, type, forms, utilities
│   │   └── styles.scss       # Single import manifest
│   ├── fonts/                # Bundled webfont files
│   ├── images/               # Photography, icons, brand SVGs
│   └── js/
│       ├── modules/          # One module per behavior
│       └── app.js            # Front-end controller
├── components/               # Reusable PHP template parts
├── functions/                # Theme setup and WordPress concerns
├── partials/                 # Secondary template fragments
├── header.php / footer.php   # Global shell
├── page-*.php                # Page composition templates
└── functions.php             # Theme bootstrap only
partials/

Foundation

Variables, reset/base rules, typography, buttons, forms, animation, and utilities. These files should not know about individual page components.

components/

Reusable UI

One partial per custom component. Scope rules beneath the component’s root class and keep variants in attributes or modifier classes.

layouts/

Composition

Global shell and page-level arrangements: header, footer, navigation drawers, general page grids, and exceptional page templates.

styles.scss

Manifest

Imports partials in dependency order: foundation first, components second, layouts last. It should contain imports—not feature CSS.

Implementation examples

Follow the component path from PHP to browser.

These examples show the preferred pattern for a reusable template part, its scoped SCSS, optional JavaScript behavior, and WordPress composition.

PHPAccessible template part
<?php
$title = $args['title'] ?? 'Default heading';
$theme = $args['theme'] ?? 'light';
?>

<section class="pf-feature" data-theme="<?php echo esc_attr($theme); ?>">
  <div class="pf-feature__content">
    <h2><?php echo esc_html($title); ?></h2>
    <?php if (!empty($args['body'])) : ?>
      <p><?php echo esc_html($args['body']); ?></p>
    <?php endif; ?>
  </div>
</section>
SCSSComponent-scoped styles
// assets/css/components/_pf-feature.scss
.pf-feature {
  padding: 3rem max(1rem, calc(50% - var(--wrapWidth) / 2));
  background: var(--white);

  &__content {
    max-width: 760px;
  }

  &[data-theme="dark"] {
    color: var(--white);
    background: var(--charcoal);
  }

  @media (width <= 800px) {
    padding-inline: 0.625rem;
  }
}
JavaScriptProgressive enhancement
export function featureInit() {
  const features = document.querySelectorAll('.pf-feature');
  if (!features.length) return;

  features.forEach(feature => {
    const trigger = feature.querySelector('[data-feature-trigger]');
    trigger?.addEventListener('click', () => {
      feature.classList.toggle('is-active');
    });
  });
}
WordPressCompose with arguments
<?php
get_template_part(
  'components/pf-feature',
  null,
  [
    'title' => 'Built for demanding shops.',
    'body'  => 'Field-ready fabrication without added overhead.',
    'theme' => 'dark',
  ]
);
WordPressVersioned asset loading
<?php
function pinnFab_enqueue_assets() {
  $version = wp_get_theme()->get('Version');

  wp_enqueue_style(
    'pinnFab-style',
    get_template_directory_uri() . '/assets/css/styles.css',
    [],
    $version
  );

  wp_enqueue_script(
    'pinnFab-script',
    get_template_directory_uri() . '/assets/js/app.js',
    [],
    $version,
    true
  );
}
add_action('wp_enqueue_scripts', 'pinnFab_enqueue_assets');
check_circle

Escape at output

Use esc_html(), esc_attr(), and esc_url() according to context. Sanitize data when it enters the system.

check_circle

Prefer native HTML

Reach for buttons, links, dialogs, fields, landmarks, and heading structure before adding ARIA or custom keyboard behavior.

check_circle

Guard every module

JavaScript initializers should return safely when their component is absent and attach behavior only within the component scope.

check_circle

Keep variants explicit

Use existing tokens and attributes such as data-theme, data-size, and data-color instead of one-off overrides.

check_circle

Respect motion settings

Animation must have a purpose, avoid layout shifts, and provide a reduced-motion treatment.

check_circle

Test real content

Verify long headings, missing images, validation errors, keyboard flow, 200% zoom, and 320px-wide layouts before release.

Release checklist

  • Content is accurate, concise, and proofread.
  • Heading order and landmarks are valid.
  • Keyboard, focus, form errors, and reduced motion are tested.
  • Text and interface contrast meet WCAG AA.
  • Responsive behavior is verified on real content.
  • Images are optimized and include correct alt text.
  • No console errors, broken links, or layout shifts remain.
  • The primary action is clear at every key decision point.
Copied to clipboard
WestMetal Group

Send Us Your Specs

Tell us about. your project, timeline, and fabrication needs...
Drag & Drop Files, Choose Files to Upload You can upload up to 5 files.
Accepts: PDF, DWG, DXF, JPG, PNG, DOCX, ZIP
Callback (optional)

Looking for More Support?

Pinnacle Fabrication is part of the GlazierIQ family — connecting fabrication, shop drawings, and training to help glazing contractors work smarter.

  • MP Drafting (for shop drawings and engineering support)
  • LearnGlazing (for free online glazier training and onboarding tools)
Would you like us to introduce you to: