36 Commits

Author SHA1 Message Date
fe8c96c7b5 Merge version_7 into main
Merge version_7 into main
2026-02-21 00:17:43 +00:00
d16b4b791f Update src/app/page.tsx 2026-02-21 00:17:38 +00:00
e7689d174b Merge version_7 into main
Merge version_7 into main
2026-02-21 00:16:52 +00:00
41618c9bc5 Update src/app/shop/page.tsx 2026-02-21 00:16:48 +00:00
bb177b7d10 Update src/app/shop/[id]/page.tsx 2026-02-21 00:16:47 +00:00
d647d292ff Update src/app/page.tsx 2026-02-21 00:16:46 +00:00
c75ba484e1 Update src/app/layout.tsx 2026-02-21 00:16:45 +00:00
449413b96d Update src/app/blog/page.tsx 2026-02-21 00:16:44 +00:00
1093a8308b Merge version_6 into main
Merge version_6 into main
2026-02-18 16:37:10 +00:00
12770b0ccc Update src/app/styles/variables.css 2026-02-18 16:37:06 +00:00
00fbb6983d Update src/app/shop/page.tsx 2026-02-18 16:37:05 +00:00
23c51ab060 Update src/app/shop/[id]/page.tsx 2026-02-18 16:37:04 +00:00
fa0c2d1096 Update src/app/page.tsx 2026-02-18 16:37:04 +00:00
764a398356 Update src/app/layout.tsx 2026-02-18 16:37:03 +00:00
71bf474d69 Update src/app/blog/page.tsx 2026-02-18 16:37:02 +00:00
0f302cbf5f Merge version_5 into main
Merge version_5 into main
2026-02-18 16:31:23 +00:00
b466c9e65f Update src/app/styles/variables.css 2026-02-18 16:31:18 +00:00
476eac78dd Update src/app/layout.tsx 2026-02-18 16:31:17 +00:00
aa3d5a3d76 Merge version_4 into main
Merge version_4 into main
2026-02-18 16:18:52 +00:00
8313a676d2 Update theme fonts 2026-02-18 16:18:48 +00:00
c4f4932fb7 Update theme fonts 2026-02-18 16:18:47 +00:00
a103c39ef9 Merge version_4 into main
Merge version_4 into main
2026-02-18 16:18:41 +00:00
b49e234e9a Update theme fonts 2026-02-18 16:18:37 +00:00
4a9d7dda21 Update theme fonts 2026-02-18 16:18:36 +00:00
e837a437f2 Merge version_4 into main
Merge version_4 into main
2026-02-18 16:18:31 +00:00
fe7dfecc44 Update theme fonts 2026-02-18 16:18:27 +00:00
b3239e0d25 Update theme fonts 2026-02-18 16:18:26 +00:00
2508ebfb12 Merge version_4 into main
Merge version_4 into main
2026-02-18 16:06:59 +00:00
38ba9efff6 Update src/app/page.tsx 2026-02-18 16:06:55 +00:00
db24c79477 Merge version_3 into main
Merge version_3 into main
2026-02-18 16:00:18 +00:00
38a5b48a59 Update src/app/page.tsx 2026-02-18 16:00:13 +00:00
7900afcbe2 Merge version_3 into main
Merge version_3 into main
2026-02-18 15:57:45 +00:00
50c0b30e47 Update src/app/shop/page.tsx 2026-02-18 15:57:41 +00:00
68a9a217ee Update src/app/shop/[id]/page.tsx 2026-02-18 15:57:40 +00:00
b65e5c6210 Update src/app/page.tsx 2026-02-18 15:57:40 +00:00
e0eb29aeea Merge version_2 into main
Merge version_2 into main
2026-02-18 15:54:02 +00:00
7 changed files with 164 additions and 88 deletions

View File

@@ -14,7 +14,7 @@ export default function BlogPage() {
<ThemeProvider
defaultButtonVariant="shift-hover"
defaultTextAnimation="entrance-slide"
borderRadius="sharp"
borderRadius="rounded"
contentWidth="smallMedium"
sizing="medium"
background="noise"
@@ -69,4 +69,4 @@ export default function BlogPage() {
</ReactLenis>
</ThemeProvider>
);
}
}

View File

@@ -90,7 +90,9 @@ export default function RootLayout({
' background-color: #4d96ff05 !important;' +
'}' +
'img.webild-hover,' +
'img.webild-selected {' +
'img.webild-selected,' +
'video.webild-hover,' +
'video.webild-selected {' +
' outline-offset: 2px !important;' +
'}' +
'.webild-element-type-label {' +
@@ -162,6 +164,10 @@ export default function RootLayout({
return 'Image';
}
if (tagName === 'video') {
return 'Video';
}
const backgroundImage = computedStyle.backgroundImage;
if (backgroundImage && backgroundImage !== 'none') {
const urlMatch = backgroundImage.match(/url(['"]?([^'")]+)['"]?)/);
@@ -244,6 +250,38 @@ export default function RootLayout({
return url;
};
const getMediaTypeFromUrl = (url) => {
const videoExts = ['.mp4', '.webm', '.ogg', '.mov', '.avi', '.mkv', '.m4v', '.wmv'];
const imageExts = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.bmp', '.ico', '.tiff', '.avif'];
try {
const pathname = new URL(url).pathname.toLowerCase();
if (videoExts.some(function(ext) { return pathname.endsWith(ext); })) return 'video';
if (imageExts.some(function(ext) { return pathname.endsWith(ext); })) return 'image';
} catch(e) {}
return 'unknown';
};
const swapMediaElement = (oldEl, newTag, newSrc) => {
const newEl = document.createElement(newTag);
Array.from(oldEl.attributes).forEach(function(attr) {
if (attr.name !== 'src' && attr.name !== 'alt' && attr.name !== 'srcset' && attr.name !== 'autoplay' && attr.name !== 'loop' && attr.name !== 'muted' && attr.name !== 'playsinline') {
try { newEl.setAttribute(attr.name, attr.value); } catch(e) {}
}
});
newEl.style.cssText = oldEl.style.cssText;
if (newTag === 'video') {
newEl.setAttribute('autoplay', '');
newEl.setAttribute('loop', '');
newEl.setAttribute('muted', '');
newEl.setAttribute('playsinline', '');
}
newEl.src = newSrc;
if (oldEl.parentNode) {
oldEl.parentNode.replaceChild(newEl, oldEl);
}
return newEl;
};
const getElementInfo = (element, assignId = false) => {
const rect = element.getBoundingClientRect();
const tagName = element.tagName.toLowerCase();
@@ -286,7 +324,18 @@ export default function RootLayout({
isBackground: false
};
}
if (tagName === 'video') {
const rawSrc = element.src || element.currentSrc || (element.querySelector('source') && element.querySelector('source').src) || '';
const resolvedSrc = extractOriginalUrl(rawSrc);
info.imageData = {
src: resolvedSrc,
alt: element.getAttribute('aria-label') || undefined,
isBackground: false,
isVideo: true
};
}
const computedStyle = window.getComputedStyle(element);
const backgroundImage = computedStyle.backgroundImage;
if (backgroundImage && backgroundImage !== 'none') {
@@ -334,7 +383,8 @@ export default function RootLayout({
const tagName = element.tagName?.toLowerCase();
if (invalidElements.includes(tagName)) return false;
const isImage = tagName === 'img';
if (isImage) return true;
const isVideo = tagName === 'video';
if (isImage || isVideo) return true;
const hasInnerHTML = element.innerHTML && element.innerHTML.trim().length > 0;
const hasTextContent = element.textContent && element.textContent.trim().length > 0;
const hasChildren = element.children && element.children.length > 0;
@@ -374,7 +424,7 @@ export default function RootLayout({
node.nodeType === Node.TEXT_NODE && node.textContent && node.textContent.trim().length > 0
);
const hasImages = element.tagName === 'IMG' || computedStyle.backgroundImage !== 'none' || element.querySelector('img');
const hasImages = element.tagName === 'IMG' || element.tagName === 'VIDEO' || computedStyle.backgroundImage !== 'none' || element.querySelector('img') || element.querySelector('video');
const isInteractive = ['BUTTON', 'A', 'INPUT', 'SELECT', 'TEXTAREA'].includes(element.tagName);
const hasFewChildren = element.children.length <= 3;
const area = rect.width * rect.height;
@@ -1055,11 +1105,22 @@ export default function RootLayout({
updateButtonText(element, change.oldValue);
}
} else if (change.type === 'replaceImage') {
const isBackground = element.tagName.toLowerCase() !== 'img';
const revertTag = element.tagName.toLowerCase();
const isBackground = revertTag !== 'img' && revertTag !== 'video';
if (isBackground) {
element.style.backgroundImage = change.oldValue ? 'url(' + change.oldValue + ')' : '';
} else {
element.src = change.oldValue;
const oldMediaType = getMediaTypeFromUrl(change.oldValue);
if (revertTag === 'video' && oldMediaType === 'image') {
swapMediaElement(element, 'img', change.oldValue);
} else if (revertTag === 'img' && oldMediaType === 'video') {
swapMediaElement(element, 'video', change.oldValue);
} else if (revertTag === 'video') {
element.src = change.oldValue;
element.load();
} else {
element.src = change.oldValue;
}
}
}
} catch (err) {
@@ -1159,7 +1220,7 @@ export default function RootLayout({
if (!isActive) return;
if (e.data.type === 'webild-replace-image') {
const { selector, newSrc, isBackground } = e.data.data;
const { selector, newSrc, isBackground, allowMediaTypeSwap } = e.data.data;
let element = null;
try {
@@ -1190,7 +1251,32 @@ export default function RootLayout({
replaced = true;
} else if (element.tagName.toLowerCase() === 'img') {
oldValue = element.src;
element.src = newSrc;
const newMediaType = getMediaTypeFromUrl(newSrc);
if (newMediaType === 'video' && allowMediaTypeSwap) {
const swapped = swapMediaElement(element, 'video', newSrc);
if (selectedElement === element) selectedElement = swapped;
element = swapped;
} else {
element.src = newSrc;
}
replaced = true;
} else if (element.tagName.toLowerCase() === 'video') {
oldValue = element.src || element.currentSrc || '';
const newMediaType = getMediaTypeFromUrl(newSrc);
const sources = element.querySelectorAll('source');
if (newMediaType === 'image' && allowMediaTypeSwap) {
const swapped = swapMediaElement(element, 'img', newSrc);
if (selectedElement === element) selectedElement = swapped;
element = swapped;
} else {
if (sources.length > 0) {
sources.forEach(function(source) { source.src = newSrc; });
element.load();
} else {
element.src = newSrc;
element.load();
}
}
replaced = true;
} else {
const hasBackgroundImage = window.getComputedStyle(element).backgroundImage !== 'none';
@@ -1328,4 +1414,4 @@ export default function RootLayout({
</ServiceWrapper>
</html>
);
}
}

View File

@@ -3,8 +3,8 @@
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarStyleCentered from '@/components/navbar/NavbarStyleCentered/NavbarStyleCentered';
import HeroBillboard from '@/components/sections/hero/HeroBillboard';
import FeatureHoverPattern from '@/components/sections/feature/featureHoverPattern/FeatureHoverPattern';
import SplitAbout from '@/components/sections/about/SplitAbout';
import FeatureCardOne from '@/components/sections/feature/FeatureCardOne';
import AboutMetric from '@/components/sections/about/AboutMetric';
import TestimonialCardSix from '@/components/sections/testimonial/TestimonialCardSix';
import MetricCardThree from '@/components/sections/metrics/MetricCardThree';
import TeamCardSix from '@/components/sections/team/TeamCardSix';
@@ -17,7 +17,7 @@ export default function LandingPage() {
<ThemeProvider
defaultButtonVariant="shift-hover"
defaultTextAnimation="entrance-slide"
borderRadius="sharp"
borderRadius="rounded"
contentWidth="smallMedium"
sizing="medium"
background="noise"
@@ -76,37 +76,32 @@ export default function LandingPage() {
</div>
<div id="services" data-section="services">
<FeatureHoverPattern
<FeatureCardOne
title="Our Services"
description="A complete range of grooming services designed to keep you looking sharp"
tag="Premium Grooming"
tagIcon={Scissors}
features={[
{
icon: Scissors,
title: "Classic Haircuts", description: "Timeless styles executed with precision and attention to detail. From fades to tapers, we craft the perfect cut for you."
title: "Classic Haircuts", description: "Timeless styles executed with precision and attention to detail. From fades to tapers, we craft the perfect cut for you.", imageSrc: "https://img.b2bpic.net/free-photo/handsome-businessman-barber-shop_1157-21514.jpg?_wi=1", imageAlt: "Classic Haircuts"
},
{
icon: Scissors,
title: "Beard Grooming", description: "Professional beard trimming, shaping, and conditioning. Maintain that distinguished look with expert care."
title: "Beard Grooming", description: "Professional beard trimming, shaping, and conditioning. Maintain that distinguished look with expert care.", imageSrc: "https://img.b2bpic.net/free-photo/serious-elegant-bearded-male-wearing-classic-waistcoat-slim-bow-tie_613910-1520.jpg?_wi=1", imageAlt: "Beard Grooming"
},
{
icon: Sparkles,
title: "Hot Shave", description: "Traditional hot towel shaves using premium products and classic techniques for the ultimate relaxation."
title: "Hot Shave", description: "Traditional hot towel shaves using premium products and classic techniques for the ultimate relaxation.", imageSrc: "https://img.b2bpic.net/free-photo/portrait-pensive-man-with-receive-moustache-beard-trimming-procedure-barbershop_613910-15033.jpg?_wi=1", imageAlt: "Hot Shave"
},
{
icon: Wand2,
title: "Hair Styling", description: "Modern styling with premium products. Whether it's pomade or gel, we'll give you the look you want."
title: "Hair Styling", description: "Modern styling with premium products. Whether it's pomade or gel, we'll give you the look you want.", imageSrc: "https://img.b2bpic.net/free-photo/studio-portrait-bearded-photographer-wearing-classic-suit-holding-retro-camera-standing-with-his-arms-crossed_613910-19282.jpg?_wi=1", imageAlt: "Hair Styling"
},
{
icon: Heart,
title: "Signature Treatments", description: "Exclusive grooming treatments including scalp massage and conditioning therapy for complete wellness."
title: "Signature Treatments", description: "Exclusive grooming treatments including scalp massage and conditioning therapy for complete wellness.", imageSrc: "https://img.b2bpic.net/free-photo/handsome-businessman-barber-shop_1157-21514.jpg?_wi=2", imageAlt: "Signature Treatments"
},
{
icon: Crown,
title: "VIP Experience", description: "Premium service package with extended time, complimentary beverages, and personalized consultation."
title: "VIP Experience", description: "Premium service package with extended time, complimentary beverages, and personalized consultation.", imageSrc: "https://img.b2bpic.net/free-photo/serious-elegant-bearded-male-wearing-classic-waistcoat-slim-bow-tie_613910-1520.jpg?_wi=2", imageAlt: "VIP Experience"
}
]}
gridVariant="uniform-all-items-equal"
animationType="slide-up"
textboxLayout="default"
useInvertedBackground={false}
@@ -114,36 +109,16 @@ export default function LandingPage() {
</div>
<div id="about" data-section="about">
<SplitAbout
title="Refined Barbershop Heritage"
description="With over 15 years in the grooming industry, we've perfected the art of classic barbering combined with modern expertise. Our shop is a sanctuary where tradition meets innovation."
tag="Our Story"
tagIcon={History}
bulletPoints={[
{
title: "Master Craftsmen", description: "Our barbers are certified professionals with decades of combined experience in traditional and modern grooming techniques.", icon: Award
},
{
title: "Premium Products", description: "We use only the finest grooming products from trusted international brands to ensure superior results and client satisfaction.", icon: Zap
},
{
title: "Comfortable Atmosphere", description: "Step into a relaxing environment designed for comfort, featuring vintage barbershop aesthetics and modern amenities.", icon: Home
},
{
title: "Personalized Service", description: "Every client receives customized attention. We listen to your preferences and deliver results that exceed expectations."
}
<AboutMetric
title="At Refined Barber we redefine barbering by empowering clients to look and feel their absolute best"
metrics={[
{ icon: Users, label: "Satisfied Clients", value: "2,000+" },
{ icon: Star, label: "5-Star Rating", value: "98%" },
{ icon: Award, label: "Years Experience", value: "15+" },
{ icon: Zap, label: "Monthly Appointments", value: "800+" }
]}
imageSrc="https://img.b2bpic.net/free-photo/handsome-man-hair-salon-facing-camera_23-2148242826.jpg"
imageAlt="Refined barbershop interior"
mediaAnimation="slide-up"
textboxLayout="default"
metricsAnimation="slide-up"
useInvertedBackground={true}
imagePosition="right"
buttons={[
{
text: "Meet the Team", href: "team"
}
]}
/>
</div>
@@ -218,16 +193,16 @@ export default function LandingPage() {
tagIcon={Users}
members={[
{
id: "1", name: "Marcus DeVille", role: "Master Barber & Owner", imageSrc: "https://img.b2bpic.net/free-photo/handsome-businessman-barber-shop_1157-21514.jpg", imageAlt: "Marcus DeVille"
id: "1", name: "Marcus DeVille", role: "Master Barber & Owner", imageSrc: "https://img.b2bpic.net/free-photo/handsome-businessman-barber-shop_1157-21514.jpg?_wi=3", imageAlt: "Marcus DeVille"
},
{
id: "2", name: "Antonio Rossi", role: "Senior Stylist", imageSrc: "https://img.b2bpic.net/free-photo/serious-elegant-bearded-male-wearing-classic-waistcoat-slim-bow-tie_613910-1520.jpg", imageAlt: "Antonio Rossi"
id: "2", name: "Antonio Rossi", role: "Senior Stylist", imageSrc: "https://img.b2bpic.net/free-photo/serious-elegant-bearded-male-wearing-classic-waistcoat-slim-bow-tie_613910-1520.jpg?_wi=3", imageAlt: "Antonio Rossi"
},
{
id: "3", name: "James Turner", role: "Grooming Specialist", imageSrc: "https://img.b2bpic.net/free-photo/portrait-pensive-man-with-receive-moustache-beard-trimming-procedure-barbershop_613910-15033.jpg", imageAlt: "James Turner"
id: "3", name: "James Turner", role: "Grooming Specialist", imageSrc: "https://img.b2bpic.net/free-photo/portrait-pensive-man-with-receive-moustache-beard-trimming-procedure-barbershop_613910-15033.jpg?_wi=2", imageAlt: "James Turner"
},
{
id: "4", name: "David Hassan", role: "Master Barber", imageSrc: "https://img.b2bpic.net/free-photo/studio-portrait-bearded-photographer-wearing-classic-suit-holding-retro-camera-standing-with-his-arms-crossed_613910-19282.jpg", imageAlt: "David Hassan"
id: "4", name: "David Hassan", role: "Master Barber", imageSrc: "https://img.b2bpic.net/free-photo/studio-portrait-bearded-photographer-wearing-classic-suit-holding-retro-camera-standing-with-his-arms-crossed_613910-19282.jpg?_wi=2", imageAlt: "David Hassan"
}
]}
gridVariant="uniform-all-items-equal"
@@ -269,4 +244,4 @@ export default function LandingPage() {
</div>
</ThemeProvider>
);
}
}

View File

@@ -71,7 +71,7 @@ export default function ProductPage({ params }: ProductPageProps) {
<ThemeProvider
defaultButtonVariant="shift-hover"
defaultTextAnimation="entrance-slide"
borderRadius="sharp"
borderRadius="rounded"
contentWidth="smallMedium"
sizing="medium"
background="noise"
@@ -86,7 +86,10 @@ export default function ProductPage({ params }: ProductPageProps) {
brandName="Refined Barber"
navItems={[
{ name: "Home", id: "hero" },
{ name: "Shop", id: "/shop" }
{ name: "Services", id: "services" },
{ name: "About", id: "about" },
{ name: "Team", id: "team" },
{ name: "Testimonials", id: "testimonials" }
]}
button={{ text: "Cart", onClick: () => setCartOpen(true) }}
/>
@@ -111,7 +114,7 @@ export default function ProductPage({ params }: ProductPageProps) {
<ThemeProvider
defaultButtonVariant="shift-hover"
defaultTextAnimation="entrance-slide"
borderRadius="sharp"
borderRadius="rounded"
contentWidth="smallMedium"
sizing="medium"
background="noise"
@@ -126,7 +129,10 @@ export default function ProductPage({ params }: ProductPageProps) {
brandName="Refined Barber"
navItems={[
{ name: "Home", id: "hero" },
{ name: "Shop", id: "/shop" }
{ name: "Services", id: "services" },
{ name: "About", id: "about" },
{ name: "Team", id: "team" },
{ name: "Testimonials", id: "testimonials" }
]}
button={{ text: "Cart", onClick: () => setCartOpen(true) }}
/>
@@ -158,7 +164,7 @@ export default function ProductPage({ params }: ProductPageProps) {
<ThemeProvider
defaultButtonVariant="shift-hover"
defaultTextAnimation="entrance-slide"
borderRadius="sharp"
borderRadius="rounded"
contentWidth="smallMedium"
sizing="medium"
background="noise"
@@ -173,7 +179,10 @@ export default function ProductPage({ params }: ProductPageProps) {
brandName="Refined Barber"
navItems={[
{ name: "Home", id: "hero" },
{ name: "Shop", id: "/shop" }
{ name: "Services", id: "services" },
{ name: "About", id: "about" },
{ name: "Team", id: "team" },
{ name: "Testimonials", id: "testimonials" }
]}
button={{ text: "Cart", onClick: () => setCartOpen(true) }}
/>
@@ -224,4 +233,4 @@ export default function ProductPage({ params }: ProductPageProps) {
</ReactLenis>
</ThemeProvider>
);
}
}

View File

@@ -21,7 +21,7 @@ export default function ShopPage() {
<ThemeProvider
defaultButtonVariant="shift-hover"
defaultTextAnimation="entrance-slide"
borderRadius="sharp"
borderRadius="rounded"
contentWidth="smallMedium"
sizing="medium"
background="noise"
@@ -36,7 +36,10 @@ export default function ShopPage() {
brandName="Refined Barber"
navItems={[
{ name: "Home", id: "hero" },
{ name: "Shop", id: "/shop" }
{ name: "Services", id: "services" },
{ name: "About", id: "about" },
{ name: "Team", id: "team" },
{ name: "Testimonials", id: "testimonials" }
]}
button={{ text: "Cart", onClick: () => console.log("cart") }}
/>
@@ -60,7 +63,7 @@ export default function ShopPage() {
<ThemeProvider
defaultButtonVariant="shift-hover"
defaultTextAnimation="entrance-slide"
borderRadius="sharp"
borderRadius="rounded"
contentWidth="smallMedium"
sizing="medium"
background="noise"
@@ -75,7 +78,10 @@ export default function ShopPage() {
brandName="Refined Barber"
navItems={[
{ name: "Home", id: "hero" },
{ name: "Shop", id: "/shop" }
{ name: "Services", id: "services" },
{ name: "About", id: "about" },
{ name: "Team", id: "team" },
{ name: "Testimonials", id: "testimonials" }
]}
button={{ text: "Cart", onClick: () => console.log("cart") }}
/>
@@ -101,4 +107,4 @@ export default function ShopPage() {
</ReactLenis>
</ThemeProvider>
);
}
}

View File

@@ -11,7 +11,7 @@ html {
body {
background-color: var(--background);
color: var(--foreground);
font-family: var(--font-archivo), sans-serif;
font-family: var(--font-inter), sans-serif;
position: relative;
min-height: 100vh;
overscroll-behavior: none;
@@ -24,5 +24,5 @@ h3,
h4,
h5,
h6 {
font-family: var(--font-archivo), sans-serif;
font-family: var(--font-public-sans), sans-serif;
}

View File

@@ -2,21 +2,21 @@
/* Base units */
/* --vw is set by ThemeProvider */
/* --background: #f5f4ef;;
--card: #dad6cd;;
--foreground: #2a2928;;
--primary-cta: #2a2928;;
--secondary-cta: #efe7dd;;
--accent: #ffffff;;
--background-accent: #c6b180;; */
/* --background: #010912;;
--card: #152840;;
--foreground: #e6f0ff;;
--primary-cta: #cee7ff;;
--secondary-cta: #0e1a29;;
--accent: #3f5c79;;
--background-accent: #004a93;; */
--background: #f5f4ef;;
--card: #dad6cd;;
--foreground: #2a2928;;
--primary-cta: #2a2928;;
--secondary-cta: #efe7dd;;
--accent: #ffffff;;
--background-accent: #c6b180;;
--background: #010912;;
--card: #152840;;
--foreground: #e6f0ff;;
--primary-cta: #cee7ff;;
--secondary-cta: #0e1a29;;
--accent: #3f5c79;;
--background-accent: #004a93;;
/* text sizing - set by ThemeProvider */
/* --text-2xs: clamp(0.465rem, 0.62vw, 0.62rem);