[object Object]

← back to Robet Site

deeper Booksy pull: full review TEXT for all 5 reviews (clicked into reviews tab) — real quotes now show in review cards (xss-escaped); 9/9 tests

bd5bc35b1889fc24398a17a16864642a910fd238 · 2026-06-30 06:28:10 -0700 · Steve

Files touched

Diff

commit bd5bc35b1889fc24398a17a16864642a910fd238
Author: Steve <steve@designerwallcoverings.com>
Date:   Tue Jun 30 06:28:10 2026 -0700

    deeper Booksy pull: full review TEXT for all 5 reviews (clicked into reviews tab) — real quotes now show in review cards (xss-escaped); 9/9 tests
---
 public/app.js       |  8 +++++---
 public/reviews.json | 15 ++++++++++-----
 public/styles.css   |  1 +
 3 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/public/app.js b/public/app.js
index dce6a6f..b0aee10 100644
--- a/public/app.js
+++ b/public/app.js
@@ -90,12 +90,14 @@
     try { data = await (await fetch('/reviews.json')).json(); } catch (_) { return; }
     const link = $('#reviewsLink'); if (link && data.sourceUrl) link.href = data.sourceUrl;
     const stars = (n) => '★'.repeat(n) + '☆'.repeat(5 - n);
+    const esc = (s) => String(s || '').replace(/[<>&"]/g, (c) => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;', '"': '&quot;' }[c]));
     grid.innerHTML = (data.items || []).map((r) =>
       `<div class="review">
          <div class="stars">${stars(r.rank)}</div>
-         <div class="who mono">${r.author}</div>
-         <div class="svc mono">${r.service}</div>
-         <div class="when mono">${r.date}</div>
+         ${r.text ? `<p class="quote">“${esc(r.text)}”</p>` : ''}
+         <div class="who mono">${esc(r.author)}</div>
+         <div class="svc mono">${esc(r.service)}</div>
+         <div class="when mono">${esc(r.date)}</div>
        </div>`).join('');
   })();
 
diff --git a/public/reviews.json b/public/reviews.json
index a077b88..c7cac31 100644
--- a/public/reviews.json
+++ b/public/reviews.json
@@ -3,10 +3,15 @@
   "sourceUrl": "https://booksy.com/en-us/431695_robert-yourbarber310-sherman-oaks-barber_barber-shop_134655_los-angeles",
   "average": "5.0",
   "items": [
-    { "rank": 5, "author": "Ben Huebscher", "service": "Haircut, Beard Trim, & Line up", "date": "2022-11-03" },
-    { "rank": 5, "author": "Mario Arellano Jr", "service": "Men's/Kids Haircut", "date": "2022-09-24" },
-    { "rank": 5, "author": "Armen Adzhemyan", "service": "Haircut, Beard Trim, & Line up", "date": "2022-09-16" },
-    { "rank": 5, "author": "Sam C", "service": "Men & Kids Haircut", "date": "2022-02-26" },
-    { "rank": 5, "author": "Mario Arellano", "service": "Men's Haircut", "date": "2021-11-03" }
+    { "rank": 5, "author": "Mario Arellano Jr", "service": "Men's/Kids Haircut", "date": "2022-09-24",
+      "text": "Returning client: Super easy to book my appointment and Robert was quick to confirm/respond to my appointment request. Another great haircut for me and my son. Thanks again! 10/10 would recommend to friends." },
+    { "rank": 5, "author": "Armen Adzhemyan", "service": "Haircut, Beard Trim, & Line up", "date": "2022-09-16",
+      "text": "Robert is an awesome person overall and a great barber! He's very attentive and has great communication skills!" },
+    { "rank": 5, "author": "Sam C", "service": "Men & Kids Haircut", "date": "2022-02-26",
+      "text": "Love Alumni Barber shop. Robert has been cutting my hair and done a great job, so now he cuts my 3 year old's hair as well!" },
+    { "rank": 5, "author": "Mario Arellano", "service": "Men's Haircut", "date": "2021-11-03",
+      "text": "Great service all around, from the point of booking my service through the app to the final look of the cut. 10/10 recommend Alumni Barbershop." },
+    { "rank": 5, "author": "Mario Arellano Jr", "service": "Men & Kids Haircut", "date": "2022-03-13",
+      "text": "Always a good experience when getting a haircut with Robert. 10/10" }
   ]
 }
diff --git a/public/styles.css b/public/styles.css
index 0b52917..f3d7eba 100644
--- a/public/styles.css
+++ b/public/styles.css
@@ -177,6 +177,7 @@ section { padding: 70px 24px; border-bottom: var(--bord); }
 .reviews-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 0; }
 .review { border: var(--bord); padding: 24px; margin: -2.5px 0 0 -2.5px; background: var(--paper); }
 .review .stars { color: #c20010; font-size: 22px; letter-spacing: 2px; }  /* AA 5.63:1 on paper */
+.review .quote { font-weight: 600; line-height: 1.35; margin: 12px 0; font-size: 16px; }
 .review .who { font-size: 18px; font-weight: 800; margin-top: 8px; text-transform: uppercase; }
 .review .svc { font-weight: 600; margin-top: 4px; }
 .review .when { color: #555; font-size: 12px; margin-top: 8px; }  /* AA 6.8:1 (was opacity .55 → failed) */

← 6d5052d pull from Booksy: booking → his Booksy page, hero → his real  ·  back to Robet Site  ·  (newest)