[object Object]

← back to Robet Site

re-theme to ROBERT BARBER (business identified): hero BOOK A CUT + barber-pole SVG, services Cut/Fade/Beard&Shave, HairSalon JSON-LD, barber OG card, copy throughout; Lighthouse held 100s, 9/9 tests

c065dfb3ad9a7797b8eeb8363139ad12651ffb39 · 2026-06-30 04:37:03 -0700 · Steve

Files touched

Diff

commit c065dfb3ad9a7797b8eeb8363139ad12651ffb39
Author: Steve <steve@designerwallcoverings.com>
Date:   Tue Jun 30 04:37:03 2026 -0700

    re-theme to ROBERT BARBER (business identified): hero BOOK A CUT + barber-pole SVG, services Cut/Fade/Beard&Shave, HairSalon JSON-LD, barber OG card, copy throughout; Lighthouse held 100s, 9/9 tests
---
 config.json        |   8 ++++----
 public/hero.svg    |  24 ++++++++++++++++--------
 public/index.html  |  37 +++++++++++++++++++------------------
 public/og.png      | Bin 41769 -> 45444 bytes
 tests/api.test.mjs |   2 +-
 5 files changed, 40 insertions(+), 31 deletions(-)

diff --git a/config.json b/config.json
index dd78bad..ac5bb30 100644
--- a/config.json
+++ b/config.json
@@ -1,14 +1,14 @@
 {
   "brand": "ROBERT",
-  "tagline": "BOOK A MEETING.",
-  "heroHeadline": "BOOK\nA\nMEETING.",
-  "heroSub": "Pick a time, tell me what you need, get a straight answer. No back-and-forth.",
+  "tagline": "BOOK A CUT.",
+  "heroHeadline": "BOOK\nA\nCUT.",
+  "heroSub": "Walk in sharp. Pick a time, pick your cut — in and out, no waiting around.",
   "heroImage": "/hero.svg",
   "contact": {
     "email": "info@designerwallcoverings.com",
     "phone": "",
     "address": "",
-    "hours": "By appointment — pick a slot below"
+    "hours": "By appointment — pick a chair below"
   },
   "scheduling": {
     "owner": "info@designerwallcoverings.com",
diff --git a/public/hero.svg b/public/hero.svg
index b4176a1..444b705 100644
--- a/public/hero.svg
+++ b/public/hero.svg
@@ -1,11 +1,17 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 1000" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Brutalist concrete structure">
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 1000" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Brutalist barbershop">
   <defs>
     <linearGradient id="conc" x1="0" y1="0" x2="0" y2="1">
       <stop offset="0" stop-color="#3a3a38"/>
       <stop offset="1" stop-color="#15140f"/>
     </linearGradient>
     <pattern id="dots" width="22" height="22" patternUnits="userSpaceOnUse">
-      <circle cx="3" cy="3" r="2.4" fill="#f5f500" fill-opacity="0.18"/>
+      <circle cx="3" cy="3" r="2.4" fill="#f5f500" fill-opacity="0.16"/>
+    </pattern>
+    <!-- barber pole: red / paper / ink diagonal stripes -->
+    <pattern id="pole" width="120" height="120" patternUnits="userSpaceOnUse" patternTransform="rotate(35)">
+      <rect width="120" height="40" y="0" fill="#ff2e1f"/>
+      <rect width="120" height="40" y="40" fill="#f3f1ea"/>
+      <rect width="120" height="40" y="80" fill="#0a0a0a"/>
     </pattern>
     <filter id="grain"><feTurbulence type="fractalNoise" baseFrequency="0.9" numOctaves="2" stitchTiles="stitch"/>
       <feColorMatrix type="saturate" values="0"/><feComponentTransfer><feFuncA type="linear" slope="0.06"/></feComponentTransfer>
@@ -20,19 +26,21 @@
     <rect x="120" y="140" width="430" height="720" fill="#4a4945"/>
     <rect x="120" y="140" width="430" height="120" fill="#f5f500"/>
     <rect x="600" y="320" width="300" height="540" fill="#2b2a26"/>
-    <rect x="950" y="80" width="520" height="500" fill="#56544e"/>
-    <rect x="950" y="600" width="520" height="320" fill="#ff2e1f"/>
+    <rect x="1180" y="80" width="290" height="840" fill="#56544e"/>
+  </g>
+
+  <!-- the barber pole -->
+  <g stroke="#0a0a0a" stroke-width="8">
+    <rect x="980" y="120" width="120" height="760" fill="url(#pole)"/>
+    <rect x="965" y="80" width="150" height="50" fill="#c9c6bd"/>   <!-- cap -->
+    <rect x="965" y="870" width="150" height="50" fill="#c9c6bd"/>  <!-- base -->
   </g>
 
   <!-- girders -->
   <g stroke="#0a0a0a" stroke-width="10" stroke-linecap="square">
     <line x1="0" y1="900" x2="1600" y2="900"/>
     <line x1="335" y1="140" x2="335" y2="860"/>
-    <line x1="1210" y1="80" x2="1210" y2="580"/>
   </g>
 
-  <!-- diagonal brace -->
-  <polygon points="600,860 900,320 940,340 640,880" fill="#f5f500" stroke="#0a0a0a" stroke-width="4"/>
-
   <rect width="1600" height="1000" filter="url(#grain)" opacity="0.5"/>
 </svg>
diff --git a/public/index.html b/public/index.html
index 283a6a3..5b1eece 100644
--- a/public/index.html
+++ b/public/index.html
@@ -3,8 +3,8 @@
 <head>
   <meta charset="utf-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1" />
-  <title>ROBERT · Book a Meeting</title>
-  <meta name="description" content="Book a meeting with Robert. Pick a time, get a straight answer." />
+  <title>ROBERT · Barber</title>
+  <meta name="description" content="Book a cut with Robert — barber. Pick a time, pick your cut, walk in sharp." />
   <link rel="canonical" href="https://robert.agentabrams.com/" />
   <link rel="preconnect" href="https://venturacorridor.com" crossorigin />
   <meta name="theme-color" content="#0a0a0a" />
@@ -15,8 +15,8 @@
   <!-- Open Graph -->
   <meta property="og:type" content="website" />
   <meta property="og:site_name" content="ROBERT" />
-  <meta property="og:title" content="ROBERT · Book a Meeting" />
-  <meta property="og:description" content="Pick a time, tell me what you need, get a straight answer. No back-and-forth." />
+  <meta property="og:title" content="ROBERT · Barber" />
+  <meta property="og:description" content="Walk in sharp. Pick a time, pick your cut — in and out." />
   <meta property="og:url" content="https://robert.agentabrams.com/" />
   <meta property="og:image" content="https://robert.agentabrams.com/og.png" />
   <meta property="og:image:width" content="1200" />
@@ -24,23 +24,24 @@
 
   <!-- Twitter -->
   <meta name="twitter:card" content="summary_large_image" />
-  <meta name="twitter:title" content="ROBERT · Book a Meeting" />
-  <meta name="twitter:description" content="Pick a time, tell me what you need, get a straight answer." />
+  <meta name="twitter:title" content="ROBERT · Barber" />
+  <meta name="twitter:description" content="Walk in sharp. Pick a time, pick your cut." />
   <meta name="twitter:image" content="https://robert.agentabrams.com/og.png" />
 
   <!-- structured data (data block; not executed → exempt from CSP script-src) -->
   <script type="application/ld+json">
   {
     "@context": "https://schema.org",
-    "@type": "Person",
+    "@type": "HairSalon",
     "name": "Robert",
     "url": "https://robert.agentabrams.com/",
     "image": "https://robert.agentabrams.com/og.png",
     "email": "info@designerwallcoverings.com",
-    "description": "Book a meeting with Robert. Pick a time, get a straight answer.",
+    "description": "Robert — barber. Cuts, fades, beard line-ups and hot-towel shaves. Book a chair online.",
+    "priceRange": "$$",
     "potentialAction": {
       "@type": "ScheduleAction",
-      "name": "Book a meeting",
+      "name": "Book a cut",
       "target": {
         "@type": "EntryPoint",
         "urlTemplate": "https://venturacorridor.com/book?owner=info@designerwallcoverings.com",
@@ -84,26 +85,26 @@
       <div class="hero-inner">
         <h1 id="heroHeadline">BOOK
 A
-MEETING.</h1>
-        <p id="heroSub">Pick a time, tell me what you need, get a straight answer. No back-and-forth.</p>
-        <a class="cta" href="#booking">Book a slot →</a>
+CUT.</h1>
+        <p id="heroSub">Walk in sharp. Pick a time, pick your cut — in and out, no waiting around.</p>
+        <a class="cta" href="#booking">Book a chair →</a>
       </div>
     </section>
 
     <!-- work / services -->
     <section id="work">
-      <span class="kicker">/ what you get</span>
-      <h2 class="sec-h">An appointment that pays off.</h2>
+      <span class="kicker">/ the work</span>
+      <h2 class="sec-h">Sharp every time.</h2>
       <div class="grid3">
-        <div class="cell"><h3>Consult</h3><p>Bring the problem. Leave with a clear direction and concrete next steps.</p></div>
-        <div class="cell"><h3>Review</h3><p>We go through the specifics together — options, tradeoffs, and timeline.</p></div>
-        <div class="cell"><h3>Decide</h3><p>Walk away with a decision and a plan — not a maybe.</p></div>
+        <div class="cell"><h3>Cut</h3><p>Scissor or clipper, tailored to your head — not a template. Wash and style included.</p></div>
+        <div class="cell"><h3>Fade</h3><p>Skin, low, mid, or high. Clean lines, blended right, no harsh edges.</p></div>
+        <div class="cell"><h3>Beard &amp; Shave</h3><p>Line-up, trim, or a hot-towel straight-razor shave. Sharp and close.</p></div>
       </div>
     </section>
 
     <!-- booking: Smart Scheduling -->
     <section id="booking">
-      <span class="kicker">/ smart scheduling</span>
+      <span class="kicker">/ book a chair</span>
       <h2 class="sec-h">Pick a time.</h2>
       <div class="embed-box" id="embedBox"></div>
       <p class="mono" style="margin-top:14px">
diff --git a/public/og.png b/public/og.png
index 22503c2..32c29b6 100644
Binary files a/public/og.png and b/public/og.png differ
diff --git a/tests/api.test.mjs b/tests/api.test.mjs
index 3deb6aa..d6d04d4 100644
--- a/tests/api.test.mjs
+++ b/tests/api.test.mjs
@@ -90,7 +90,7 @@ test('homepage embeds valid JSON-LD with a booking action', async () => {
   const m = html.match(/<script type="application\/ld\+json">([\s\S]*?)<\/script>/);
   assert.ok(m, 'ld+json block present');
   const j = JSON.parse(m[1]); // throws if invalid → test fails
-  assert.equal(j['@type'], 'Person');
+  assert.equal(j['@type'], 'HairSalon');
   assert.equal(j.potentialAction['@type'], 'ScheduleAction');
   assert.match(j.potentialAction.target.urlTemplate, /venturacorridor\.com\/book/);
 });

← 2ffa1a4 loop ledger: round3 items (7)+(4) done — ROUND 3 COMPLETE (8  ·  back to Robet Site  ·  ledger: barber re-theme noted 9b96ab4 →