Rebrand store as Pulse with athletic theme and shared typography
- Pulse theme tokens in app.schema.json: Archivo Black headings (weight 400) + Inter body, white bg / black pill buttons, xl radius, AI-generated athletic imagery - Add headerFontWeight theme prop so single-weight fonts (Archivo Black) load and render correctly; ThemeProvider applies font-family + weight inline so Typography works regardless of `as` element - New shared Heading component (tagline / title / subtitle with size + align + tone variants) and Typography caption variant for taglines; refactor features, faq, cta, testimonials, products-carousel, products-grid, collection-grid, recommended-products, image-gallery, newsletter-cta to use them - Hero accepts a `buttons` array (label / href / variant) replacing primaryCta/secondaryCta; cover-image component removed and existing cover blocks migrated to Hero blocks with `buttons: []` - Newsletter CTA uses shadcn Button + Input so it inherits theme radius; stacked layout fixed to keep the image - Product/collection card titles use Typography subtitle variants (font-body), heading font weight is theme-controlled - Remove orphan commerce/shop-header.tsx and commerce/shop-footer.tsx; the editor-driven navigation/footer are the live chrome Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -22,6 +22,7 @@ export const Root: RootConfig<{
|
||||
defaultProps: {
|
||||
title: "Untitled",
|
||||
headerFont: "Inter",
|
||||
headerFontWeight: "600",
|
||||
bodyFont: "Inter",
|
||||
// Hex defaults so the color picker reads them and any non-picker
|
||||
// input (typed hex, AI-set value, etc.) is round-trip compatible.
|
||||
@@ -40,6 +41,19 @@ export const Root: RootConfig<{
|
||||
description: { label: "Description", type: "textarea" },
|
||||
ogImage: { label: "OG image", ...imageField({ adapter: frontendAiMediaAdapter }) },
|
||||
headerFont: { label: "Header font", ...headerFontField },
|
||||
headerFontWeight: {
|
||||
label: "Header font weight",
|
||||
type: "select",
|
||||
options: [
|
||||
{ label: "300 — Light", value: "300" },
|
||||
{ label: "400 — Regular", value: "400" },
|
||||
{ label: "500 — Medium", value: "500" },
|
||||
{ label: "600 — Semibold", value: "600" },
|
||||
{ label: "700 — Bold", value: "700" },
|
||||
{ label: "800 — Extrabold", value: "800" },
|
||||
{ label: "900 — Black", value: "900" },
|
||||
],
|
||||
},
|
||||
bodyFont: { label: "Body font", ...bodyFontField },
|
||||
primaryColor: { label: "Primary color", type: "color", placeholder: "#0a0a0a" },
|
||||
secondaryColor: { label: "Secondary color", type: "color", placeholder: "#64748B" },
|
||||
@@ -84,6 +98,7 @@ export const Root: RootConfig<{
|
||||
render: ({
|
||||
children,
|
||||
headerFont,
|
||||
headerFontWeight,
|
||||
bodyFont,
|
||||
primaryColor,
|
||||
secondaryColor,
|
||||
@@ -98,6 +113,7 @@ export const Root: RootConfig<{
|
||||
return (
|
||||
<ThemeProvider
|
||||
headerFont={headerFont}
|
||||
headerFontWeight={headerFontWeight}
|
||||
bodyFont={bodyFont}
|
||||
primaryColor={primaryColor}
|
||||
secondaryColor={secondaryColor}
|
||||
|
||||
Reference in New Issue
Block a user