A card that earns trust
White surface, hairline border, 14px radius, the resting card shadow, and a 4px hover lift with a deeper shadow.
Design specification · June 2026
Everything needed to produce pages that match the PreBizSys design language exactly: tokens, type, spacing, breakpoints, components, motion, images, performance budgets, and copy rules. This page renders the system live and carries every copy-paste value. Nothing in your output should invent a value that is not on this page.
PreBizSys (Premier Business Systems) gets under-digitized local and small businesses found: on Google, on the map, and in AI answers.
The wordmark is text, never an image: the name in the display face, bold, tight tracking, ending in an orange full stop. On dark grounds the name is white; on light grounds it is graphite. The mono sub-label rides underneath in uppercase. The sub-label hides at the smallest breakpoint (below 561px).
Brand lockup, dark ground (canonical)
PreBizSys.| Part | Treatment |
|---|---|
| Name "PreBizSys" | display face · weight 700 · 1.35rem · letter-spacing -0.02em · white on dark, graphite on light |
| Stop "." | always --pbs-orange (#F25C05), weight 700: the one brand mark |
| Sub-label | "PREMIER BUSINESS SYSTEMS" · mono face · 0.62rem · letter-spacing 0.18em · uppercase · muted |
A confident, transparent craftsman.Plain English, headline first. We explain what we do and show the work; we never hide behind jargon or hype.
We sell the work, never a result we can't control.No promised rankings, no promised traffic. Google and the AI engines decide who shows up; what we commit to is the work itself, done right.
Truthful, always.Every proof element is real. Nothing is invented to look better, and a claim we can't verify does not ship.
Get your business found: on Google, on the map, and in AI answers.
Supporting lines in active use: "Everything you need to get found, built and run as one system." (what we do) · "We sell the work, never a promised outcome." (the floor line) · "See where you're invisible." (the call to action frame). The free audit is the entry point of every conversion path.
Every color, size, space, radius, shadow, and easing on a PreBizSys page comes from one set of CSS custom properties under one namespace: pbs-. Components build against semantic roles, never raw hex values.
Author against these. If a design need has no role, the fix is adding a token to the source, never an inline hex.
| Role | Value | Use |
|---|---|---|
--pbs-bg | graphite | dark page ground (hero, statement bands) |
--pbs-bg-alt | offwhite | light section ground |
--pbs-surface | white | cards and panels |
--pbs-text | #EDEEF0 | body text on dark grounds |
--pbs-text-on-light | graphite | text on light grounds |
--pbs-text-muted | #A6ACB4 | muted text on dark grounds |
--pbs-muted-on-light | #586069 | muted text on light grounds |
--pbs-border | rgba(255,255,255,0.10) | hairlines on dark |
--pbs-border-light | rgba(28,33,38,0.12) | hairlines on light |
--pbs-action | orange | primary CTA, key marks, eyebrow tick, link underline |
--pbs-action-hover | orange-deep | CTA hover and active states |
--pbs-on-action | white | text on the orange CTA |
--pbs-card-shadow | 0 1px 2px rgba(28,33,38,0.06), 0 14px 34px rgba(28,33,38,0.10) | resting card elevation |
var(--x, #fallback) with --x undeclared. The fallback silently becomes the real value and drifts. Every token is declared in the one source AND has a consumer.Mono eyebrow voice · clamp(0.78rem, 0.74rem + 0.21vw, 0.89rem)
Display one
Display two carries section titles
Display three carries card titles
The lead voice introduces a section in two calm lines.
The body voice does the everyday reading. It holds a comfortable measure (around 60 to 76 characters), a steady 1.6 line height, and never gets decorated. Numbers and labels step into the mono voice; emphasis stays semibold, never shouty.
font-display: swap, and pair each with a metric-override fallback face (size-adjust, ascent-override, descent-override tuned so the system fallback occupies identical space). The swap then moves nothing. Preload only the two above-the-fold faces (display 700 and body 400), as woff2, with crossorigin. Never load fonts from a third-party host in production. Why: on an earlier build the font swap landed around 2.8 seconds in and shifted the hero about 37px, producing intermittent layout-shift scores of 0.382.padding-block: var(--pbs-section-pad) where --pbs-section-pad: clamp(3.5rem, 2rem + 6vw, 7rem), roughly 56px on mobile opening to 112px at 1440px. This very page demonstrates it.max-width: 1200px and gutters of clamp(1.25rem, 0.5rem + 3.5vw, 3rem), so content edges align site-wide.<section class="pbs-section pbs-zone--..."><div class="pbs-container">. The only sanctioned exemptions: the site header, the site footer, the full-viewport homepage hero, and the compact page hero. Nothing else, ever. Why: an earlier build let four different sectioning conventions coexist on one site; a single page accumulated five different container widths and heading sizes from 12px to 54px. A closed convention with a named exemption list makes that impossible.| Token | Value | Use |
|---|---|---|
--pbs-radius-sm | 4px | focus rings, small chips |
--pbs-radius | 8px | buttons, inputs, code chips |
--pbs-radius-lg | 14px | cards, panels, image frames |
--pbs-radius-pill | 999px | pills: eyebrow badge, chips, plan tags |
--pbs-shadow-sm | 0 1px 2px rgba(0,0,0,0.20) | subtle lift on dark |
--pbs-shadow | 0 10px 30px rgba(0,0,0,0.35) | floating panels (menus, drawers) |
--pbs-shadow-cta | 0 8px 24px rgba(242,92,5,0.32) | the warm glow under the orange CTA |
--pbs-ease | cubic-bezier(0.22, 1, 0.36, 1) | decelerate: content arrives and settles |
--pbs-ease-spring | cubic-bezier(0.34, 1.56, 0.64, 1) | gentle overshoot: hover pops |
--pbs-dur-fast / --pbs-dur / --pbs-dur-slow | 140ms / 260ms / 420ms | micro-interactions |
--pbs-enter-dur / --pbs-enter-move / --pbs-enter-step | 820ms / 26px / 110ms | entrance rise: duration, distance, stagger |
--pbs-link-underline / --pbs-link-thickness / --pbs-link-offset / --pbs-link-wash | orange / 2px / 0.15em / rgba(242,92,5,0.10) | the prose-link system (section 4) |
Copy-paste: the canonical token block (single source, complete)
:root {
/* COLOR: raw palette */
--pbs-graphite: #1C2126; /* primary ink */
--pbs-steel: #2D343C; /* secondary dark panels, footer */
--pbs-concrete: #6B7280; /* captions, placeholders */
--pbs-offwhite: #F7F7F5; /* light page ground */
--pbs-white: #FFFFFF; /* cards, panels */
--pbs-orange: #F25C05; /* the one decisive accent (reserved) */
--pbs-orange-deep: #C9430A; /* action hover / active */
--pbs-green: #1F9D55; /* status signals only */
/* COLOR: semantic roles (build against these) */
--pbs-bg: var(--pbs-graphite);
--pbs-bg-alt: var(--pbs-offwhite);
--pbs-surface: var(--pbs-white);
--pbs-text: #EDEEF0; /* body on dark */
--pbs-text-on-light: var(--pbs-graphite);
--pbs-text-muted: #A6ACB4; /* muted on dark */
--pbs-muted-on-light: #586069; /* muted on light */
--pbs-border: rgba(255,255,255,0.10);/* hairlines on dark */
--pbs-border-light: rgba(28,33,38,0.12); /* hairlines on light */
--pbs-action: var(--pbs-orange);
--pbs-action-hover: var(--pbs-orange-deep);
--pbs-on-action: var(--pbs-white);
--pbs-card-shadow: 0 1px 2px rgba(28,33,38,0.06), 0 14px 34px rgba(28,33,38,0.10);
/* TYPE */
--pbs-font-display: "Space Grotesk", "Archivo", "Prompt", -apple-system,
BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
--pbs-font-body: "Inter", "Karla", -apple-system, BlinkMacSystemFont,
"Segoe UI", Roboto, Helvetica, Arial, sans-serif;
--pbs-font-mono: "Space Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
/* v1.1 type-scale ratification (M3-S126-Q, 2026-06-12): "Confident" scale */
--pbs-fs-eyebrow: clamp(0.78rem, 0.74rem + 0.21vw, 0.89rem);
--pbs-fs-body: clamp(1.125rem, 1.09rem + 0.14vw, 1.22rem);
--pbs-fs-lead: clamp(1.28rem, 1.17rem + 0.51vw, 1.625rem);
--pbs-fs-h3: clamp(1.47rem, 1.3rem + 0.74vw, 1.97rem);
--pbs-fs-h2: clamp(2.125rem, 1.77rem + 1.57vw, 3.19rem);
--pbs-fs-h1: clamp(2.94rem, 2.04rem + 3.98vw, 5.625rem);
--pbs-fs-h1-hero: clamp(2.85rem, 1.6rem + 3.85vw + 0.9vh, 4.9rem);
/* Support tier (v1.1): fixed support sizes now tokened */
--pbs-fs-small: clamp(1.03rem, 1rem + 0.14vw, 1.125rem); /* reading-support text */
--pbs-fs-fine: 0.9rem; /* fine print / legal */
--pbs-fs-btn: 1.125rem; /* button labels + inputs */
--pbs-fs-card: 1.47rem; /* card/tile titles */
--pbs-fs-price: 2.25rem; /* price figures */
--pbs-fw-regular: 400;
--pbs-fw-medium: 500;
--pbs-fw-semibold: 600;
--pbs-fw-bold: 700;
--pbs-lh-tight: 1.04; /* big display headlines */
--pbs-lh-snug: 1.25; /* subheads */
--pbs-lh-body: 1.6; /* running text */
--pbs-ls-tight: -0.02em;/* display tracking */
--pbs-ls-wide: 0.14em; /* eyebrow / overline tracking */
/* SPACING (8px base scale) */
--pbs-space-1: 0.25rem; /* 4px */
--pbs-space-2: 0.5rem; /* 8px */
--pbs-space-3: 0.75rem; /* 12px */
--pbs-space-4: 1rem; /* 16px */
--pbs-space-5: 1.5rem; /* 24px */
--pbs-space-6: 2rem; /* 32px */
--pbs-space-7: 3rem; /* 48px */
--pbs-space-8: 4rem; /* 64px */
--pbs-space-9: 6rem; /* 96px */
--pbs-space-10: 8rem; /* 128px */
/* LAYOUT */
--pbs-container: 1200px;
--pbs-container-pad: clamp(1.25rem, 0.5rem + 3.5vw, 3rem);
--pbs-section-pad: clamp(3.5rem, 2rem + 6vw, 7rem);
/* RADIUS / ELEVATION */
--pbs-radius-sm: 4px;
--pbs-radius: 8px;
--pbs-radius-lg: 14px;
--pbs-radius-pill: 999px;
--pbs-shadow-sm: 0 1px 2px rgba(0,0,0,0.20);
--pbs-shadow: 0 10px 30px rgba(0,0,0,0.35);
--pbs-shadow-cta:0 8px 24px rgba(242,92,5,0.32);
/* MOTION */
--pbs-ease: cubic-bezier(0.22, 1, 0.36, 1);
--pbs-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
--pbs-dur-fast: 140ms;
--pbs-dur: 260ms;
--pbs-dur-slow: 420ms;
--pbs-enter-dur: 820ms;
--pbs-enter-move: 26px;
--pbs-enter-step: 110ms;
/* LINKS */
--pbs-link-underline: var(--pbs-action);
--pbs-link-thickness: 2px;
--pbs-link-offset: 0.15em;
--pbs-link-wash: rgba(242,92,5,0.10);
}
Most of the responsiveness is continuous: the type scale and macro spacing flex by clamp at every width. The layout itself reflows structurally at exactly three shared cutoffs.
Resize this window: the live tier readout appears here.
| Tier | Query | What reflows |
|---|---|---|
| Desktop | base (no query) | the full layout; the container caps at 1200px and centers with gutters |
| Nav complement | min-width: 861px | desktop nav links shown (the hamburger's complement) |
| Tablet and below | max-width: 980px | multi-column grids drop columns (3-col footer to 2-col; 2-col feature rows to 1-col) |
| Mobile-landscape and below | max-width: 860px | nav collapses to the hamburger drawer; 3-up card grids and plan tiles go single-column |
| Mobile-portrait and below | max-width: 560px | capture rows stack; buttons go full-width; the brand sub-label hides; nav bar drops to 64px |
max-width queries override downward. Author in that order.Every component below is live on this page with its production values. Each carries its usage rule and, where one exists, the real failure the rule prevents.
Dark ground (the canonical CTA context)
A lead that earns the next thirty seconds of reading in one or two calm sentences.
White surface, hairline border, 14px radius, the resting card shadow, and a 4px hover lift with a deeper shadow.
44px tile, graphite fill, white line-art glyph at 1.8 stroke. Pale tinted tiles nearly vanished in testing; filled tiles stay legible.
The same card carries features, work samples, and FAQ-adjacent content. Title in display semibold; body in the muted-on-light voice.
--pbs-surface background, --pbs-border-light hairline, --pbs-radius-lg, --pbs-card-shadow, fluid padding clamp(1.5rem, 1rem + 1.4vw, 2.25rem).Pages alternate tonal zones so the scroll reads as deliberate beats, and this page does it too. Tone is set ONCE per section by the zone class; components re-skin off the zone, so authors never hand-pick per-element colors.
Keep watching
$79/month
or $790/year (2 months free)
The recurring external scan with a plain-English report of where you stand and what moved.
Fix the biggest gap
$399one-time
$349 if you're already on Visibility Watch
The single-biggest-gap fix. What you pay credits forward.
Run it all for you
$1,495/month
your $1,495 Deep-Dive Audit becomes month one if you continue
Everything below it, plus the ongoing work that runs the whole program.
plan--anchor treatment: a stronger border (rgba(28,33,38,0.20)) and a deeper resting shadow, plus the floating pill tag overlapping its top edge./month, one-time) beside the figure.Body copy opts into the link system with one class: an inline link like this one back to the tokens carries a permanent 2px orange underline offset 0.15em; hover adds a soft orange wash and thickens the line, and the treatment clones cleanly across wrapped lines.
class="pbs-prose" to get the link treatment. Nav, buttons, cards, and footers keep their own treatments. Why: a build that shipped the reset without a prose rule rendered in-body links INVISIBLE, indistinguishable from plain text.Two vocabularies and one driver, all governed by one safety rule: if JavaScript is missing, failing, or disabled, everything is visible and the page scrolls natively. Motion is a feel upgrade, never load-bearing.
opacity: 0) and the keyframe animation that releases it live in the SAME declaration block in the SAME render-blocking stylesheet. They cannot be split apart by an optimizer. If CSS loads, the animation runs; if CSS does not load, nothing was ever hidden.--pbs-rv-o, --pbs-rv-y set inline per element), never direct inline opacity or transform, so a stray !important rule elsewhere can pin an element visible without ever trapping it hidden.html.pbs-motion-off which clears every armed element and restores native scroll. The failure path is a class, not a hope.prefers-reduced-motion: reduce kills everything: one global media query zeroes all transitions and animations, forces entrance and reveal elements fully visible, and the motion engine early-returns before it arms anything or starts the smooth-scroll driver. Reduced-motion visitors get a complete, static, natively-scrolling page.smoothWheel: true, smoothTouch: false (phones keep native momentum, which keeps interaction latency clean).lenis.scrollTo(target) once it is live.window.PBS_SMOOTH_SCROLL = false keeps native scroll. Smooth scroll is the FIRST thing to cut if the interaction budget is threatened; the page must be fully usable without it.Copy-paste: the structural reveal CSS (ships render-blocking, never deferred)
/* Scroll reveals: VISIBLE at parse; JS arms below-viewport elements only */
.pbs-reveal {
--pbs-rv-o: 1;
--pbs-rv-y: 0px;
--pbs-rv-delay: 0ms;
opacity: var(--pbs-rv-o);
transform: translateY(var(--pbs-rv-y));
}
.pbs-reveal--armed {
transition: opacity var(--pbs-enter-dur) var(--pbs-ease) var(--pbs-rv-delay),
transform var(--pbs-enter-dur) var(--pbs-ease) var(--pbs-rv-delay);
will-change: opacity, transform;
}
html.pbs-motion-off .pbs-reveal { --pbs-rv-o: 1; --pbs-rv-y: 0px; transition: none; }
/* Entrance choreography: prestate + release are ONE atomic block */
@media (prefers-reduced-motion: no-preference) {
@keyframes pbs-rise {
from { opacity: 0; transform: translate3d(0, var(--pbs-enter-move), 0); filter: blur(6px); }
60% { filter: blur(0); }
to { opacity: 1; transform: translate3d(0, 0, 0); filter: blur(0); }
}
.pbs-enter { opacity: 0; animation: pbs-rise var(--pbs-enter-dur) var(--pbs-ease) both; will-change: transform, opacity, filter; }
.pbs-enter--1 { animation-delay: calc(var(--pbs-enter-step) * 1); }
.pbs-enter--2 { animation-delay: calc(var(--pbs-enter-step) * 2); }
.pbs-enter--3 { animation-delay: calc(var(--pbs-enter-step) * 3); }
.pbs-enter--4 { animation-delay: calc(var(--pbs-enter-step) * 4); }
.pbs-enter--5 { animation-delay: calc(var(--pbs-enter-step) * 5); }
}
/* Lenis structural CSS (the engine adds these classes only when active) */
html.lenis, html.lenis body { height: auto; }
html.lenis { scroll-behavior: auto !important; }
.lenis.lenis-smooth { scroll-behavior: auto !important; }
html.lenis [data-lenis-prevent] { overscroll-behavior: contain; }
.lenis.lenis-stopped { overflow: clip; }
html.lenis iframe { pointer-events: none; }
/* Reduced motion: one global kill, everything visible */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after { transition: none !important; animation: none !important; scroll-behavior: auto !important; }
.pbs-enter { opacity: 1 !important; transform: none !important; filter: none !important; }
.pbs-reveal { opacity: 1 !important; transform: none !important; }
}
Copy-paste: the minimal init pattern (registry + deferred engine)
<!-- All motion is config: adding motion = adding a registry row,
never a new script block. The engine script implements the rules
above (arm below-viewport only, custom-property release,
reduced-motion early-return, fail-safe to html.pbs-motion-off,
lazy library loading) and ships deferred in the footer. -->
<script>
window.PBS_MOTION_REGISTRY = [
{ selector: '.pbs-reveal', effect: 'rise', options: { replay: true, stagger: 110 } },
{ selector: '.pbs-img--lcp img', effect: 'image-reveal', options: { y: 24, scale: 0.94, duration: 1.0 } }
/* 'timeline' configs (crafted sequences) are the ONLY thing that
loads the animation library; a page with none ships zero of it. */
];
/* window.PBS_SMOOTH_SCROLL = false; // opt out of smooth scroll */
</script>
<script defer src="/systems/js/pbs-motion.js"></script>
The engine and the smooth-scroll and animation libraries are self-hosted, same-origin, in production. Image reveals (the image-reveal effect) are transform-only (rise + slight zoom) and fire only AFTER the image has painted (img.complete && naturalWidth > 0); never animate opacity or clip-path on a hero image.
Modern formats from day one, explicit dimensions on every image, and one eager hero per page. The page never reflows when an image lands.
width and height attributes, or a ratio frame (.pbs-img-frame with --pbs-ratio). This is the zero-layout-shift mechanism, not a nice-to-have.loading="eager" fetchpriority="high" decoding="async". Everything else: loading="lazy" decoding="async".sizes attribute must reflect the real rendered width per viewport.imagesizes must EXACTLY equal the rendered sizes; a mismatch double-fetches on high-density phones (a previous fix took one fetch from 145KB to 54KB). Never preload below-fold or never-displayed crops.Copy-paste: the hero / LCP image (one per page, above the fold)
<picture>
<source type="image/avif"
srcset="hero-800.avif 800w, hero-1200.avif 1200w, hero-1600.avif 1600w"
sizes="(max-width: 860px) 100vw, 62vw" />
<source type="image/webp"
srcset="hero-800.webp 800w, hero-1200.webp 1200w, hero-1600.webp 1600w"
sizes="(max-width: 860px) 100vw, 62vw" />
<img src="hero-1200.webp" width="1200" height="800" alt="..."
loading="eager" fetchpriority="high" decoding="async" />
</picture>
Copy-paste: every other image (below-fold default)
<figure class="pbs-figure">
<div class="pbs-img-frame" style="--pbs-ratio: 3 / 2;">
<img src="photo-800.webp"
srcset="photo-800.webp 800w, photo-1200.webp 1200w"
sizes="(max-width: 860px) 100vw, 50vw"
width="800" height="533" alt="..."
loading="lazy" decoding="async" />
</div>
<figcaption>...</figcaption>
</figure>
The frame defaults to 16:9 and takes any ratio via --pbs-ratio. Frames carry the 14px radius and a faint placeholder tint that paints before the image loads. If the image pipeline negotiates formats on the Accept header, a single src may replace the <picture> form; the dimensions rule is unconditional either way.
The Core Web Vitals budget is a gate: output that misses it is not done. The budget is measured on mid-tier throttled MOBILE, the honest environment, never a fast laptop.
| Metric | Budget | What holds it |
|---|---|---|
| LCP (largest contentful paint) | under 2.5s | eager hero with fetchpriority; AVIF/WebP right-sized; preload only the hero image; critical CSS inline at parse; zero render-blocking fonts (metric-matched fallback paints immediately); all motion JS deferred past paint |
| CLS (cumulative layout shift) | under 0.1, target 0 | explicit dimensions or ratio frames on every image; metric-override font fallbacks (shift-free swap); no parse-time hidden states (reveal-safety); layout CSS never in a deferred file |
| INP (interaction to next paint) | under 200ms | one shared animation ticker, never two; native touch scrolling on phones; smooth scroll deferred past load and first to cut; no layout-thrash patterns |
| Script | Approx. (min + gzip) | Loads | Rule |
|---|---|---|---|
| Motion engine | about 2KB | deferred, footer | always present; tiny |
| Smooth-scroll driver (Lenis) | about 3KB | lazy, AFTER the load event | off under reduced motion; the first thing to cut |
| Animation library (GSAP core) | about 24KB | lazy, ONLY when a timeline config exists | a page with no crafted timeline ships ZERO of it |
Anything that writes copy into a PreBizSys-styled page follows these rules without exception. They are brand floor, not style preference.
Three contracts: one token source, one load order, and a clear line between what is locked and what is flexible.
--pbs-action, --pbs-text-on-light), not raw palette names, and never against literal hex values.pbs- prefix and must not collide with the names in this document.| # | Layer | Delivery |
|---|---|---|
| 1 | Tokens (the :root block) | inline, render-blocking, FIRST |
| 2 | Fonts (@font-face: self-hosted WOFF2 + metric-override fallbacks) | inline, render-blocking |
| 3 | Base (reset, accessibility floor, sectioning convention, tonal zones) | inline, render-blocking |
| 4 | Links (the prose-link system) | inline, render-blocking, after base (it must out-cascade the reset) |
| 5 | Images (ratio frames, figure rhythm) | inline, render-blocking |
| 6 | Reveal (entrance + scroll vocabularies, reduced-motion kill) | inline, render-blocking, NEVER deferred |
| 7 | Components (buttons, cards, plans, nav: the section-4 language) | theme/builder layer, consuming layers 1 to 6 |
| 8 | Page-specific (true one-offs only) | last; never duplicating a system rule |
| 9 | Motion JS (engine + lazy driver + lazy library) | deferred, footer, after everything paints |
| Locked (never altered by generated output) | Flexible (the app's room to move) |
|---|---|
Token values and names · the pbs- namespace · the sectioning convention and its closed exemption list · the breakpoint set (980 / 860+861 / 560) and desktop-first cascade · the orange-reservation rule (one decisive action per view) · the component anatomy in section 4 (buttons, cards, zones, plan tiles, prose links) · the reveal-safety rule and reduced-motion kill · the image dimensions rule · the performance budgets · the copy rules in section 8 · the wordmark treatment
|
Page composition: which bands, in what order, with what zone rhythm · section copy (within the voice and section-8 rules) · which components each band uses · image subjects and ratios (within the format and dimension rules) · how many cards, steps, or tiles a band carries · whether a page uses scroll reveals or ships static · icon line-art glyphs (within the 1.8-stroke style) |
The test for any generated page: set it beside the PreBizSys homepage. If a stranger can tell which one the system produced, the output has drifted. When something this spec does not cover comes up, the answer is a question back to PreBizSys, not an improvisation.