# Plumber Nova — brand spec

| | |
|---|---|
| **Source** | https://bearsplumbing.net/ |
| **Captured** | 2026-07-25 |
| **Stack** | WordPress · Hello Elementor theme · Elementor Pro (containers) |
| **Slug** | `plumber-nova` |
| **Picker tags** | `plumbing trades` |
| **Patterns** | 34, all signature |
| **Library position** | First plumbing system in the pool. Sits opposite the roofing and HVAC systems as the loudest, flattest, most blue-collar of the trades set. |

First kit built under the `<industry>-<template name>` naming convention Jarrett set on
2026-07-25. The source company's name appears only inside verbatim copy, never in the
slug or the file names.

---

## Extraction rules that governed this build

1. Every pattern in `sections.html` is transcribed from a section that exists on the live
   source. Zero invented blocks. The catalog is the site.
2. Copy is verbatim or omitted. Headlines, review quotes, process steps, plan names,
   prices, nav and footer IA are exact. Nothing was paraphrased to fit.
3. Execution is ours. Spacing scale, token architecture, contrast fixes and the responsive
   contract are house standards applied over the source's structure.
4. Built pages compose only from catalog patterns.

## Decisions Jarrett made at Gate A (2026-07-25)

| Question | Ruling | What shipped |
|---|---|---|
| Which of three live phone numbers is canonical | Doesn't matter, use the default | `(281) 350-BEAR` everywhere. The other two, `281-350-2327` and `281-993-7289`, appear nowhere in the kit. |
| Publish EIN and licence number | Strip them | EIN 90-0822858 and Texas RMPL36236 are recorded here only and appear on no page. |
| The em dash in the About copy | Strip it | The sentence "plumbing isn't just pipes and fittings—it's trust" is omitted rather than reworded. The rest of the About narrative ships verbatim. |
| Keep Anton | Do whatever they do | Kept, used exactly where the source uses it: trust-strip sublines and the read-more link. |
| Divider treatment | Reproduce faithfully | Curve and mountains dividers rebuilt as inline SVG, not reinterpreted. |

---

## Colour

Ranked by rendered occurrence on the live DOM at 1440px, not by declaration count.

| Token | Hex | Extracted / derived | Rendered | Role |
|---|---|---|---|---|
| `--accent` | `#EF3E33` | extracted | 42 elements | Large grounds, icon tiles, form card |
| `--accent-deep` | `#C22C23` | **derived** | — | Text-safe red for small white labels |
| `--ink` | `#231F20` | extracted | 824 elements | Body ink, dark bands, secondary buttons |
| `--surface` | `#E3E3E3` | extracted | 12 elements | Card pads, divider fill |
| `--steel` | `#A7A9AC` | extracted | 9 elements | Frame rule, legal bar, button hover |
| `--bg` | `#FFFFFF` | extracted | dominant | Default ground |
| `--ink-deep` | `#171415` | **derived** | — | Footer ground, one step below ink |

**Contrast constraint.** White on `#EF3E33` measures 3.88:1 and fails AA at the source's
16px button size. The source ships that combination. We keep the colour and fix the
craft: `--accent-deep` at 5.71:1 carries every small white label, and the bright red is
reserved for grounds and large type. Applies to buttons, the review-card name header and
the trust-strip tiles.

**Rejected as brand, with evidence:**

- `#CC3366` — 154 rendered occurrences, and not brand. Elementor's default link colour on
  `<a>` wrappers whose visible text lives in a child span that repaints it `#231F20`. It
  paints on nothing the eye can see.
- `#FF6900`, `#CF2E2E`, `#0693E3` and the rest of the Gutenberg preset palette — declared,
  zero rendered.
- `#69727D`, `#1F2124`, `#0C0D0E`, `#2563EB` — Elementor form and default chrome.
- `#33373D`, `#39B54A`, `#88909B`, `#C2CBD2`, `#55595C` — declared in bundled CSS, zero
  rendered. Dead.
- `#CCD6DF` — real, 84 elements, but it is the rating-star track and not a text token.

**Dead `:root` tokens:** only `--n-tabs-border-color: #d5d8dc` and
`--n-tabs-icon-color-active: #fff`, both Elementor widget internals. No declared brand
colour renders nowhere. This is the cleanest declared-versus-rendered agreement of any
source in the pool so far, and it is recorded here so the next run knows the check ran.

---

## Type

| Original | Rendered on | Licence | Substitute | Rationale |
|---|---|---|---|---|
| Roboto Condensed | 236 elements, the whole site | Free, Google Fonts | **none** | Already free. Ships as-is. |
| Anton | 3 elements, label sizes | Free, Google Fonts | **none** | Already free. Ships as-is. |
| Arial | 40 elements | system | — | Fallback only, no deliberate use. |

**No substitution, therefore no metric re-tuning.** The source's 1.2em heading and 1.6em
body line-heights are calibrated to Roboto Condensed and we ship Roboto Condensed, so they
carry over unchanged. This is the one case where copying the source's metrics is correct
rather than false fidelity.

Ramp: 55/40/26/22 desktop stepping to 33/28/23/18 mobile, all 800 weight and uppercase.
Body 17px/400/1.6. Buttons 16px/700 uppercase.

---

## Signature devices

The `css-extract.py` shape sweep reported no brand signature shapes for this site. That
report was wrong, and the reason is worth recording: every shape it surfaced belonged to
the Elementor accessibility widget or Swiper, and neither of the site's actual devices is
a property the sweep tests.

1. **Double-rule border.** `border: 3px double #FFFFFF` on every button;
   `border: 7px double #A7A9AC` with `border-radius: 10px` on the hero panel. Found by
   walking computed styles on the live DOM. `border-style: double` is not in the sweep's
   property list.
2. **Shape dividers.** Seven on the homepage: one `curve` at 450px filled `#E3E3E3` under
   the hero, six `mountains` at 50px filled `#231F20`, `#FFFFFF` or `rgba(227,227,227,.95)`
   between the bands below. Found by enumerating `.elementor-shape` on the live DOM and
   reading the Elementor settings JSON in the page source.

Not signatures, for the record: no gradients anywhere, no clip-path, no mask, no blend
modes, no backdrop-filter. All button fills are flat.

---

## Interaction states

Extracted from the site's own per-page Elementor CSS, not from defaults. Transition is
`0.3s`, colour only, no transform lift anywhere.

| Element | Hover / focus |
|---|---|
| Primary button | background to `#A7A9AC`, text to `#231F20` |
| Secondary button | background to `#A7A9AC`, text to `#231F20` |
| Outline on dark | background to `#FFFFFF`, text and border to `#231F20` |
| Card CTA | background to `#231F20`, text to `#FFFFFF` |
| Form submit | background to `#231F20`, text `#FFFFFF`, border `#FFFFFF` |
| Footer service link | text to `#EF3E33` |
| Nav dropdown | background to `#231F20` |
| Burger toggle | background to `#EF3E33` |
| Text input | focus adds box-shadow and outline |

The red primary going **grey** on hover rather than a darker red is the source's own rule,
applied consistently. It is preserved.

---

## Voice anchors (verbatim)

- "Our Best Advertisement Is Your Satisfaction."
- "Trusted Plumber in Spring, TX"
- "Local / Family Owned", "Workmanship / Guaranteed", "Upfront / Pricing", "On-Time / Service"
- "Plumbing problems never wait for the right moment, which is why having a team you can rely on makes all the difference."
- "We provide fast, detail-oriented service that focuses on solving the source of the problem, not just the symptoms."
- "We believe every plumbing problem deserves a solution that addresses the source of the issue, not just the symptoms, so we take a detail-oriented approach to every job we complete."
- "Our neighbors trust us because we show up prepared, treat every home with respect and communicate clearly from start to finish."
- "What sets us apart"
- "What Your Neighbors Are Saying About Us"
- "Some companies begin with a business plan. Ours began with a young man, a work-study program, and a genuine desire to help people."
- "Limited-time savings don't stick around for long, so now's the perfect moment to take advantage of our seasonal offers before they're gone."
- "Protect Your Home. Save Money. Get Peace of Mind."
- "Built on Trust, Not Pressure"
- "More Than a Plan. A Relationship."
- "Honest Pricing. No Surprises."

### Verbatim facts

Address 18903 Tomato St. Spring, TX 77379 · Hours Monday - Friday: 8am-5pm ·
Ratings Google 4.8, Angi 4.7 · Membership $125 annual · Coupons $50 garbage disposal
installation, $25 tankless flush, $100 new water heater · Financing "Fixed Interest Plan
(Plan 2832)" and "Deferred Interest Plan (Plan 2601)" · Story begins 1989 at Klein High
School, Eric "Bear" Eaves, business begun summer 2005 · Reviewers Gail R., Gary P.,
Santiago S., Larry A., J. Aswad, Carlos G., Allison O., Regan C.

**Held back from the kit by ruling:** EIN / FEIN 90-0822858 and Texas licence RMPL36236.
Recorded here for provenance; they appear on no shipped page.

### Deliberate departures from verbatim

- The source sets one heading, "frequently asked questions", in lowercase while every other
  heading on the site is uppercase. The kit uses uppercase, matching the house rule and the
  other 99% of the source.
- The About sentence containing an em dash is omitted rather than altered, per ruling.
- Manufacturer partner marks are set as wordmarks rather than mirroring third-party logo
  files onto a public URL.

---

## Assets

| File | Source | Role |
|---|---|---|
| `plumber-nova-logo.png` | `2025/12/Main-Logo.png` | Header and footer mark |
| `hero-team-vans.webp` | `2025/12/banner-hero.webp` | Homepage hero, crew and vans |
| `van-wrapped.webp` | `2025/12/logo-wtapped-van.webp` | City landing banner |
| `van-side.webp` | `2025/12/Truck-Img-New.webp` | Directions block |
| `about-founders.jpg` | `2025/12/About-img.jpg` | Why-choose and story blocks |
| `crew-lineup.jpg` | `2025/12/20210215_085448.jpg` | Story block, carousel |
| `tech-at-work-1.jpg` | `2025/12/BP-51.jpg` | Service cards |
| `tech-at-work-2.jpg` | `2025/12/BP-53.jpg` | Service cards, offers |
| `tankless-install.webp` | `2026/02/tankless-water-heater-installation-5.jpg` | Water heater landing |
| `sewer-trench.webp` | `2026/06/construction_site_black_pipes...webp` | Sewer landing |
| `emergency-callout.jpg` | `2026/06/emergency-plumbing-6.jpg` | Copy blocks |

Videos are not mirrored; the source ships none.

---

## Pattern inventory

Full source-cited list lives in `sections.html`, one HTML comment per pattern. Summary:

| # | Pattern | Source |
|---|---|---|
| 01–15 | utility-bar, site-header, framed-hero, trust-strip, service-trio, contact-split, why-choose, logo-wall, offers-rail, reviews-rail, areas-grid, blog-trio, map-band, site-footer, legal-bar | `/` |
| 16–22 | page-banner, form-sidebar, reviews-local, copy-block, process-steps, directions, faq-accordion | `/area/conroe-tx-plumber/` |
| 23–24 | feature-list, emergency-callout | `/service/water-heater-repair/` |
| 25 | service-index | `/service/` |
| 26 | area-index | `/area/` |
| 27 | blog-index | `/blog/` |
| 28 | blog-post | `/blog/10-key-benefits-of-installing-a-tankless-water-heater-in-spring-tx/` |
| 29–30 | story-block, photo-carousel | `/about-us/` |
| 31 | role-listing | `/careers/` |
| 32 | plan-comparison | `/financing/`, `/membership/` |
| 33 | priced-options | `/pricing-guide/` |
| 34 | coupon-wall | `/specials/` |

**Folded, not missed.** The 76 area pages and 33 service pages contribute nothing beyond
patterns 16–24; they are one grammar with the city and service swapped. Legal pages are
pattern 29 without imagery. `/sitemap/` and `/thank-you/` are doc chrome, not catalog
patterns.

---

## Block-root census reconciliation

Elementor has no theme block-class vocabulary, so `crawl.py blocks` returns framework
noise (3,755 distinct `elementor-` classes). The usage-based equivalent is the
`data-widget_type` census across all 139 fetched pages. Every root is reconciled.

**Cataloged:** icon-list (1475) · icon-box (915) · theme-site-logo (272) · nav-menu (272) ·
google_maps (211) · social-icons (137) · form (110) · reviews (108) · nested-accordion (108) ·
call-to-action (28) · theme-post-content (12) · table-of-contents (12) · post-navigation (12) ·
posts.cards (2) · nested-carousel (2) · search (1) · nested-tabs (1)

**Folded as primitives:** heading (2132) · button (2008) · text-editor (1304) · image (876) ·
divider (1)

**Runtime or wrapper:** e-component (274) · template (238) · html (25, third-party embeds)

**Doc chrome, not a pattern:** sitemap (1)

Zero unreconciled roots.

---

## Crawl-scope log

**139 of 139 sitemap URLs fetched. Zero skipped.** Full enumeration was affordable, so no
skip needed an evidence citation because there are no skips.

| Sitemap | URLs | Fetched |
|---|---|---|
| `/page-sitemap.xml` | 123 | 123 |
| `/post-sitemap.xml` | 14 | 14 |
| `/category-sitemap.xml` | 1 | 1 |
| `/local-sitemap.xml` | 1 | 1 |

### Template proof, and why `cluster` was not used

The standard CSS-fingerprint `cluster` step does not work on this source. Elementor emits a
per-page stylesheet keyed to that page's own element IDs, so all 139 pages return 139
unique fingerprints and the tool reports every page as "UNIQUE, must inspect" — true of the
CSS, false of the design.

Substituted a structural fingerprint: the ordered sequence of `data-widget_type` values per
page, hashed. Identical sequence means identical template. That collapsed 139 pages to 30
structural classes:

| Pages | Widgets | Template |
|---|---|---|
| 50 | 86 | Area page, 10 cities |
| 25 | 87 | Area page, 5 cities, one extra widget, same grammar |
| 20 | 72 | Service page, short variant |
| 12 | 34 | Blog post |
| 3 | 92 | Service page, long variant |
| 3 | 37 | Legal page |
| 2 | 81 | Service page, install variant |
| 2 | 71 | Service page, drain-pipe variant |
| 1 each | varies | home, about-us, both indexes, blog index and category, careers, contact, financing, giving-back, membership, pricing-guide, sitemap, specials, thank-you, 5 one-off service pages |

### Anomalies

- `/blog/how-bears-plumbing-delivers-5-star-service-every-time/` is in the sitemap and
  returns a 404 page. Stale entry.
- `/locations.kml` is in the sitemap and is not HTML. Excluded.
- `/blog/category/uncategorized/` renders header and footer with an empty content area.
  Not built as a pattern.

---

## Forbidden

- Card shadows or elevation of any kind. The source paints one box-shadow site-wide.
- Pill buttons. The source renders zero; the four 50% radii are social icon circles.
- Sentence-case headings. Every heading on the source is uppercase.
- Gradients on buttons or bands. All fills are flat.
- Accent-coloured words inside headings. The source has none and neither does this kit.
- Small white text on `#EF3E33`. Use `#C22C23`.
- Eyebrow or kicker devices. The source ships none, so the carve-out never came up.
- Em dashes in prose.

## Mood keywords

`condensed-caps` · `double-ruled` · `one-red` · `flat-no-elevation` · `work-truck`

---

## Visual diff against the source

Done at build time, 1440px, comparing kit renders against live source sections. The
Browser pane's scroll was unresponsive for this whole session, so both sides were stepped
through by hiding preceding siblings rather than scrolling. Four mismatches were found by
looking, none of which any automated gate caught:

| Found | Fix |
|---|---|
| Trust-strip lockup rendered on one line, "LOCALFamily Owned", because `.word` and `.sub` were inline spans | Both set to `display: block`, restoring the two-tier stack |
| Service cards were square and left-aligned; the source rounds them and centres the body and button | `border-radius: var(--radius-media)`, centred body, centred button |
| Full-width band headings were left-aligned; the source centres the h2 and the action row on every full-width band | Added `.band-center`, applied only to the sections confirmed centred on the source. Split layouts stay left-aligned, as on the source. |
| The mountains divider was authored as sharp peaks; the source's is a soft undulating wave | Path rewritten with smooth quadratics |

**Executed differently on purpose.** The source's special-offer cards are branded coupon
graphics with the bear mascot and a coupon code. The kit uses a photo card carrying the
verbatim amount and the verbatim alt-text line instead of mirroring the coupon artwork.
Amounts and copy are verbatim; the artwork is not reproduced.

## Gate results

All Phase 5 gates pass: verbatim (179 strings), class, palette, asset, and the six browser
gates (contrast, responsive at 375, heading accents, broken images, banned devices, em
dashes in prose).

The verbatim gate failed on the first run with 39 fabricated strings: invented symptom
lists on the water heater and sewer pages, invented pricing tiers, an invented careers
lede, invented coupon headings and an invented table-of-contents title. All 39 were
replaced with source text or removed. Worth recording because every one of them read as
plausible trade copy, and only the mechanical check caught them.
