From e4e0c5f6c88ce8fe36052732b0ac95288163acee Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:45:55 +0000 Subject: [PATCH 01/50] Update docs/PREVIEW_PAGE_STANDARDS.md --- docs/PREVIEW_PAGE_STANDARDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/PREVIEW_PAGE_STANDARDS.md b/docs/PREVIEW_PAGE_STANDARDS.md index 7ed66ef..f5a7dca 100644 --- a/docs/PREVIEW_PAGE_STANDARDS.md +++ b/docs/PREVIEW_PAGE_STANDARDS.md @@ -357,7 +357,7 @@ const products = [ const testimonials = [ { name: "Sarah Johnson", - role: "CEO, TechCorp", + role: ", TechCorp", content: "This component library transformed our development workflow. Highly recommend!", image: "/images/avatar-1.jpg", rating: 5 -- 2.49.1 From 9d2d707c61a04269d059000a3f15c17c36589762 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:45:56 +0000 Subject: [PATCH 02/50] Update registry/components/FooterBase.json --- registry/components/FooterBase.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/registry/components/FooterBase.json b/registry/components/FooterBase.json index b79d535..e681ab4 100644 --- a/registry/components/FooterBase.json +++ b/registry/components/FooterBase.json @@ -5,14 +5,14 @@ "textRules": { "logoText": { "required": false, - "default": "Webild", + "default": "North Star Marketing Lab ", "example": "Company Name", "minChars": 2, "maxChars": 30 }, "copyrightText": { "required": false, - "default": "© 2025 | Webild", + "default": "© 2025 | North Star Marketing Lab ", "example": "© 2025 Company Name", "minChars": 5, "maxChars": 50 @@ -50,8 +50,8 @@ }, "propsSchema": { "columns": "Array<{ title: string, items: Array<{ label: string, href: string }> }> - Footer navigation columns", - "logoText?": "string (default: 'Webild')", - "copyrightText?": "string (default: '© 2025 | Webild')", + "logoText?": "string (default: 'North Star Marketing Lab ')", + "copyrightText?": "string (default: '© 2025 | North Star Marketing Lab ')", "onPrivacyClick?": "() => void", "ariaLabel?": "string (default: 'Site footer')", "className?": "string" -- 2.49.1 From cbb24603f6a6ceaf044f0ef2e81cb4e5f9b7fb57 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:45:57 +0000 Subject: [PATCH 03/50] Update registry/components/FooterBaseCard.json --- registry/components/FooterBaseCard.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/registry/components/FooterBaseCard.json b/registry/components/FooterBaseCard.json index 6bfe1be..c839797 100644 --- a/registry/components/FooterBaseCard.json +++ b/registry/components/FooterBaseCard.json @@ -5,14 +5,14 @@ "textRules": { "copyrightText": { "required": false, - "example": "© 2025 | Webild", + "example": "© 2025 | North Star Marketing Lab ", "minChars": 5, "maxChars": 100, "note": "Copyright text displayed at bottom left" }, "logoText": { "required": false, - "example": "Webild", + "example": "North Star Marketing Lab ", "minChars": 2, "maxChars": 30, "note": "Text used for h2 heading" @@ -33,14 +33,14 @@ } }, "propsSchema": { - "logoText?": "string (default: 'Webild')", + "logoText?": "string (default: 'North Star Marketing Lab ')", "columns": "Array<{ title: string, items: Array<{ label: string, href: string }> }> - Footer navigation columns", - "copyrightText?": "string (default: '© 2025 | Webild')", + "copyrightText?": "string (default: '© 2025 | North Star Marketing Lab ')", "onPrivacyClick?": "() => void", "ariaLabel?": "string (default: 'Site footer')", "className?": "string" }, - "usageExample": " console.log('Privacy clicked')} />", + "usageExample": " console.log('Privacy clicked')} />", "do": [ "Use for general use", "Requires columns[]" -- 2.49.1 From 4501d9cf1e76692cf48ee932cae908c2003dec23 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:45:57 +0000 Subject: [PATCH 04/50] Update registry/components/FooterBaseReveal.json --- registry/components/FooterBaseReveal.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/components/FooterBaseReveal.json b/registry/components/FooterBaseReveal.json index dd8cd66..1e3b57c 100644 --- a/registry/components/FooterBaseReveal.json +++ b/registry/components/FooterBaseReveal.json @@ -5,7 +5,7 @@ "textRules": { "copyrightText": { "required": false, - "default": "© 2025 | Webild", + "default": "© 2025 | North Star Marketing Lab ", "example": "© 2025 Company Name", "minChars": 5, "maxChars": 50 -- 2.49.1 From 21bbc6a58da4b8d22416bd18af5c5ae00ace6b7c Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:45:58 +0000 Subject: [PATCH 05/50] Update registry/components/FooterCard.json --- registry/components/FooterCard.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/registry/components/FooterCard.json b/registry/components/FooterCard.json index 037f3dc..c953a8b 100644 --- a/registry/components/FooterCard.json +++ b/registry/components/FooterCard.json @@ -5,14 +5,14 @@ "textRules": { "copyrightText": { "required": false, - "example": "© 2025 | Webild", + "example": "© 2025 | North Star Marketing Lab ", "minChars": 5, "maxChars": 100, "note": "Copyright text displayed at bottom left" }, "logoText": { "required": false, - "example": "Webild", + "example": "North Star Marketing Lab ", "minChars": 2, "maxChars": 30, "note": "Text used for SVG logo" @@ -32,14 +32,14 @@ } }, "propsSchema": { - "logoText?": "string (default: 'Webild')", - "copyrightText?": "string (default: '© 2025 | Webild')", + "logoText?": "string (default: 'North Star Marketing Lab ')", + "copyrightText?": "string (default: '© 2025 | North Star Marketing Lab ')", "socialLinks?": "Array<{ icon: LucideIcon, href: string, ariaLabel: string }> - Social media links", "ariaLabel?": "string (default: 'Site footer')", "className?": "string", "logoLineHeight?": "number (default: 1.1)" }, - "usageExample": "", + "usageExample": "", "do": [ "Use for general use", "Requires socialLinks?[]" -- 2.49.1 From 3c73eca13e1e9f5eaf3db66bfd9b2704e464fdff Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:45:59 +0000 Subject: [PATCH 06/50] Update registry/components/FooterLogoEmphasis.json --- registry/components/FooterLogoEmphasis.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/components/FooterLogoEmphasis.json b/registry/components/FooterLogoEmphasis.json index f8f6291..093ae32 100644 --- a/registry/components/FooterLogoEmphasis.json +++ b/registry/components/FooterLogoEmphasis.json @@ -5,7 +5,7 @@ "textRules": { "logoText": { "required": false, - "default": "Webild", + "default": "North Star Marketing Lab ", "example": "Company Name", "minChars": 2, "maxChars": 30 @@ -40,7 +40,7 @@ }, "propsSchema": { "columns": "Array<{ items: Array<{ label: string, href?: string, onClick?: () => void }> }> - Footer navigation columns (required, max 5)", - "logoText?": "string (default: 'Webild')", + "logoText?": "string (default: 'North Star Marketing Lab ')", "ariaLabel?": "string (default: 'Site footer')", "className?": "string" }, -- 2.49.1 From a23d2c37e91a9429118743556cf9af5a9f0b5049 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:00 +0000 Subject: [PATCH 07/50] Update registry/components/FooterLogoReveal.json --- registry/components/FooterLogoReveal.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/registry/components/FooterLogoReveal.json b/registry/components/FooterLogoReveal.json index 8722402..d030f06 100644 --- a/registry/components/FooterLogoReveal.json +++ b/registry/components/FooterLogoReveal.json @@ -5,7 +5,7 @@ "textRules": { "logoText": { "required": false, - "example": "Webild", + "example": "North Star Marketing Lab ", "minChars": 2, "maxChars": 30, "note": "Text used for SVG logo" @@ -19,12 +19,12 @@ } }, "propsSchema": { - "logoText?": "string (default: 'Webild')", + "logoText?": "string (default: 'North Star Marketing Lab ')", "logoLineHeight?": "number (default: 1.1)", "ariaLabel?": "string (default: 'Site footer')", "className?": "string" }, - "usageExample": "", + "usageExample": "", "do": [ "Use for general use" ], -- 2.49.1 From 8ad94f3e9bbce972a95f57dc7d3a666d3f419103 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:00 +0000 Subject: [PATCH 08/50] Update registry/components/FooterMedia.json --- registry/components/FooterMedia.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/registry/components/FooterMedia.json b/registry/components/FooterMedia.json index 9eefd8e..5c351e2 100644 --- a/registry/components/FooterMedia.json +++ b/registry/components/FooterMedia.json @@ -5,14 +5,14 @@ "textRules": { "logoText": { "required": false, - "default": "Webild", + "default": "North Star Marketing Lab ", "example": "Company Name", "minChars": 2, "maxChars": 30 }, "copyrightText": { "required": false, - "default": "© 2025 | Webild", + "default": "© 2025 | North Star Marketing Lab ", "example": "© 2025 Company Name", "minChars": 5, "maxChars": 50 @@ -65,8 +65,8 @@ "videoSrc": "string (required if no imageSrc)", "videoAriaLabel?": "string (default: 'Footer video')", "columns": "Array<{ title: string, items: Array<{ label: string, href: string }> }> - Footer navigation columns", - "logoText?": "string (default: 'Webild')", - "copyrightText?": "string (default: '© 2025 | Webild')", + "logoText?": "string (default: 'North Star Marketing Lab ')", + "copyrightText?": "string (default: '© 2025 | North Star Marketing Lab ')", "onPrivacyClick?": "() => void", "ariaLabel?": "string (default: 'Site footer')", "className?": "string" -- 2.49.1 From 700d117f776b63959fbd384a079991f01456deda Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:01 +0000 Subject: [PATCH 09/50] Update registry/components/FooterSimple.json --- registry/components/FooterSimple.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/components/FooterSimple.json b/registry/components/FooterSimple.json index 77636f7..3639148 100644 --- a/registry/components/FooterSimple.json +++ b/registry/components/FooterSimple.json @@ -11,7 +11,7 @@ }, "bottomRightText": { "required": true, - "example": "Made with Webild", + "example": "Made with North Star Marketing Lab ", "minChars": 2, "maxChars": 50 }, @@ -53,7 +53,7 @@ "ariaLabel?": "string (default: 'Site footer')", "className?": "string" }, - "usageExample": "", + "usageExample": "", "do": [ "Use for feature showcases", "Use for capability displays", -- 2.49.1 From f8aa122dcdf6fb2860171f447652e4fdb5ffe129 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:02 +0000 Subject: [PATCH 10/50] Update registry/components/HeroLogo.json --- registry/components/HeroLogo.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/components/HeroLogo.json b/registry/components/HeroLogo.json index 8bb2601..14c1b50 100644 --- a/registry/components/HeroLogo.json +++ b/registry/components/HeroLogo.json @@ -5,7 +5,7 @@ "textRules": { "logoText": { "required": true, - "example": "Webild", + "example": "North Star Marketing Lab ", "minChars": 2, "maxChars": 20 }, @@ -67,7 +67,7 @@ "ariaLabel?": "string (default: 'Hero section')", "className?": "string" }, - "usageExample": "\n \n", + "usageExample": "\n \n", "do": [ "Use for landing pages", "Use for feature showcases", -- 2.49.1 From f6fe14850c86f9bfc8ae115b742a63ea3a8ee380 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:02 +0000 Subject: [PATCH 11/50] Update registry/components/NavbarLayoutFloatingInline.json --- registry/components/NavbarLayoutFloatingInline.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/components/NavbarLayoutFloatingInline.json b/registry/components/NavbarLayoutFloatingInline.json index 03f0992..1546bf1 100644 --- a/registry/components/NavbarLayoutFloatingInline.json +++ b/registry/components/NavbarLayoutFloatingInline.json @@ -9,7 +9,7 @@ "required": false, "minChars": 2, "maxChars": 20, - "example": "Webild", + "example": "North Star Marketing Lab ", "fallbackBehavior": "Shows brandName text" }, "buttonRules": { @@ -51,7 +51,7 @@ }, "propsSchema": { "navItems": "Array<{name: string, id: string}>", - "brandName?": "string (default: 'Webild')", + "brandName?": "string (default: 'North Star Marketing Lab ')", "button": "{text: string, onClick?: () => void, href?: string}", "className?": "string (default: '')" }, -- 2.49.1 From b34a707c64085685e1f3340c343f1afc56e6798f Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:03 +0000 Subject: [PATCH 12/50] Update registry/components/NavbarLayoutFloatingOverlay.json --- registry/components/NavbarLayoutFloatingOverlay.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/components/NavbarLayoutFloatingOverlay.json b/registry/components/NavbarLayoutFloatingOverlay.json index 16b67d5..55ffe1f 100644 --- a/registry/components/NavbarLayoutFloatingOverlay.json +++ b/registry/components/NavbarLayoutFloatingOverlay.json @@ -9,7 +9,7 @@ "required": false, "minChars": 2, "maxChars": 20, - "example": "Webild", + "example": "North Star Marketing Lab ", "fallbackBehavior": "Shows brandName text" }, "buttonRules": { @@ -52,7 +52,7 @@ "propsSchema": { "navItems": "Array<{name: string, id: string}>", "className?": "string", - "brandName?": "string (default: 'Webild')", + "brandName?": "string (default: 'North Star Marketing Lab ')", "button": "{text: string, onClick?: () => void, href?: string}" }, "usageExample": "", -- 2.49.1 From 4fea0e6dd63a78ef25a3a13cf54b1e635af6ae93 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:04 +0000 Subject: [PATCH 13/50] Update registry/components/NavbarStyleApple.json --- registry/components/NavbarStyleApple.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/components/NavbarStyleApple.json b/registry/components/NavbarStyleApple.json index 99fbdf7..71b6e1b 100644 --- a/registry/components/NavbarStyleApple.json +++ b/registry/components/NavbarStyleApple.json @@ -9,7 +9,7 @@ "required": false, "minChars": 2, "maxChars": 20, - "example": "Webild", + "example": "North Star Marketing Lab ", "fallbackBehavior": "Shows brandName text" }, "linkRules": { @@ -34,7 +34,7 @@ }, "propsSchema": { "navItems": "Array<{name: string, id: string}>", - "brandName?": "string (default: 'Webild')" + "brandName?": "string (default: 'North Star Marketing Lab ')" }, "usageExample": "", "do": [ -- 2.49.1 From 2633e9f4b807b1503c62854ca1dac0652fdcbd6e Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:04 +0000 Subject: [PATCH 14/50] Update registry/components/NavbarStyleCentered.json --- registry/components/NavbarStyleCentered.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/components/NavbarStyleCentered.json b/registry/components/NavbarStyleCentered.json index 9785b4b..ab0426d 100644 --- a/registry/components/NavbarStyleCentered.json +++ b/registry/components/NavbarStyleCentered.json @@ -9,7 +9,7 @@ "required": false, "minChars": 2, "maxChars": 20, - "example": "Webild", + "example": "North Star Marketing Lab ", "fallbackBehavior": "Shows brandName text" }, "buttonRules": { @@ -52,7 +52,7 @@ "propsSchema": { "navItems": "Array<{name: string, id: string}>", "button": "{text: string, onClick?: () => void, href?: string}", - "brandName?": "string (default: 'Webild')", + "brandName?": "string (default: 'North Star Marketing Lab ')", "className?": "string (default: '')" }, "usageExample": "", -- 2.49.1 From 9bc9cc981b8a1a992bf8e6f0b8e3d1336d18ce2f Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:05 +0000 Subject: [PATCH 15/50] Update registry/components/NavbarStyleFullscreen.json --- registry/components/NavbarStyleFullscreen.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/components/NavbarStyleFullscreen.json b/registry/components/NavbarStyleFullscreen.json index b5ec216..7a36278 100644 --- a/registry/components/NavbarStyleFullscreen.json +++ b/registry/components/NavbarStyleFullscreen.json @@ -9,7 +9,7 @@ "required": false, "minChars": 2, "maxChars": 20, - "example": "Webild", + "example": "North Star Marketing Lab ", "fallbackBehavior": "Shows brandName text" }, "linkRules": { @@ -48,7 +48,7 @@ }, "propsSchema": { "navItems": "Array<{name: string, id: string}>", - "brandName?": "string (default: 'Webild')", + "brandName?": "string (default: 'North Star Marketing Lab ')", "bottomLeftText?": "string (default: 'Global Community')", "bottomRightText?": "string (default: 'hello@example.com')" }, -- 2.49.1 From 1519bece613c535d38daaec1e18e6700e3de62b3 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:06 +0000 Subject: [PATCH 16/50] Update registry/components/TeamCardFive.json --- registry/components/TeamCardFive.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/components/TeamCardFive.json b/registry/components/TeamCardFive.json index 395278c..9f9a83d 100644 --- a/registry/components/TeamCardFive.json +++ b/registry/components/TeamCardFive.json @@ -38,7 +38,7 @@ }, "role": { "required": true, - "example": "CEO & Founder", + "example": " & Founder", "minChars": 2, "maxChars": 50, "note": "Role/title displayed at base size with 75% opacity, centered with truncate" @@ -87,7 +87,7 @@ "ariaLabel?": "string (default: 'Team section')", "className?": "string" }, - "usageExample": "", + "usageExample": "", "do": [ "Use for team pages", "Use for staff directories", -- 2.49.1 From 7a2faef3b6275a1a5b1fe2d98a5ba4fdab152bd7 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:07 +0000 Subject: [PATCH 17/50] Update registry/components/TeamCardSix.json --- registry/components/TeamCardSix.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/components/TeamCardSix.json b/registry/components/TeamCardSix.json index 78112dd..4ac9186 100644 --- a/registry/components/TeamCardSix.json +++ b/registry/components/TeamCardSix.json @@ -38,7 +38,7 @@ }, "role": { "required": true, - "example": "CEO & Founder", + "example": " & Founder", "minChars": 2, "maxChars": 50, "note": "Role/title displayed at base size with truncate in blurred overlay" @@ -84,7 +84,7 @@ "ariaLabel?": "string (default: 'Team section')", "className?": "string" }, - "usageExample": "", + "usageExample": "", "do": [ "Use for about pages", "Use for company information", -- 2.49.1 From dca9ff4b221544b518ef41c6f387a1c6be1100e8 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:07 +0000 Subject: [PATCH 18/50] Update registry/components/TeamCardTwo.json --- registry/components/TeamCardTwo.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/components/TeamCardTwo.json b/registry/components/TeamCardTwo.json index 40f406a..ce726c3 100644 --- a/registry/components/TeamCardTwo.json +++ b/registry/components/TeamCardTwo.json @@ -38,7 +38,7 @@ }, "role": { "required": true, - "example": "Founder & CEO", + "example": "Founder & ", "minChars": 2, "maxChars": 40, "note": "Role/title displayed in secondary-button badge" @@ -99,7 +99,7 @@ "ariaLabel?": "string (default: 'Team section')", "className?": "string" }, - "usageExample": "", + "usageExample": "", "do": [ "Use for about pages", "Use for company information", -- 2.49.1 From d2af12633ae4ff50fd96b82151f0109230a0e46e Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:08 +0000 Subject: [PATCH 19/50] Update registry/components/TestimonialCardFive.json --- registry/components/TestimonialCardFive.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/components/TestimonialCardFive.json b/registry/components/TestimonialCardFive.json index cbacdcc..da76031 100644 --- a/registry/components/TestimonialCardFive.json +++ b/registry/components/TestimonialCardFive.json @@ -31,7 +31,7 @@ }, "name": { "required": true, - "example": "Alisa Hester, CEO of Ecomflow", + "example": "Alisa Hester, of Ecomflow", "minChars": 2, "maxChars": 80, "note": "Full name including role and company (e.g., 'John Smith, CTO of Tech Corp')" @@ -119,7 +119,7 @@ "ariaLabel?": "string (default: 'Testimonials section')", "className?": "string" }, - "usageExample": "", + "usageExample": "", "do": [ "Use for social proof", "Use for customer reviews", -- 2.49.1 From 116cc85ae2f660e4b91ea41ed3c4658015f7ad0f Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:09 +0000 Subject: [PATCH 20/50] Update registry/components/TestimonialCardSix.json --- registry/components/TestimonialCardSix.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/components/TestimonialCardSix.json b/registry/components/TestimonialCardSix.json index 3635300..e87b17d 100644 --- a/registry/components/TestimonialCardSix.json +++ b/registry/components/TestimonialCardSix.json @@ -90,7 +90,7 @@ "ariaLabel?": "string (default: 'Testimonials section')", "className?": "string" }, - "usageExample": "", + "usageExample": "", "do": [ "Use for social proof", "Use for customer reviews", -- 2.49.1 From 515cac36891eb3da229c5233445458f319ec2aa3 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:09 +0000 Subject: [PATCH 21/50] Update registry/components/TestimonialCardSixteen.json --- registry/components/TestimonialCardSixteen.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/components/TestimonialCardSixteen.json b/registry/components/TestimonialCardSixteen.json index 3199376..d57669c 100644 --- a/registry/components/TestimonialCardSixteen.json +++ b/registry/components/TestimonialCardSixteen.json @@ -97,7 +97,7 @@ "textBoxButtonClassName?": "string", "textBoxButtonTextClassName?": "string" }, - "usageExample": "\n \n", + "usageExample": "\n \n", "do": [ "Use for testimonial sections with visual emphasis on people", "Include exactly 3 KPI items for the bottom section", -- 2.49.1 From d1d361bf7d664c4e8b8c98d31d29d770795be58b Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:10 +0000 Subject: [PATCH 22/50] Update registry/components/TestimonialCardTen.json --- registry/components/TestimonialCardTen.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/components/TestimonialCardTen.json b/registry/components/TestimonialCardTen.json index fca62c3..f958f9d 100644 --- a/registry/components/TestimonialCardTen.json +++ b/registry/components/TestimonialCardTen.json @@ -49,7 +49,7 @@ }, "role": { "required": true, - "example": "CEO of BrightPath Solutions", + "example": " of BrightPath Solutions", "minChars": 2, "maxChars": 100 }, @@ -90,7 +90,7 @@ "ariaLabel?": "string (default: 'Testimonials section')", "className?": "string" }, - "usageExample": "", + "usageExample": "", "do": [ "Use for feature showcases", "Use for capability displays", -- 2.49.1 From e9c85d7276dc12b0b64ae221dbc4a08f59dfebe5 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:11 +0000 Subject: [PATCH 23/50] Update registry/components/TestimonialCardTwelve.json --- registry/components/TestimonialCardTwelve.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/components/TestimonialCardTwelve.json b/registry/components/TestimonialCardTwelve.json index 140f4ae..38c2d09 100644 --- a/registry/components/TestimonialCardTwelve.json +++ b/registry/components/TestimonialCardTwelve.json @@ -60,7 +60,7 @@ "ariaLabel?": "string (default: 'Testimonials section')", "className?": "string" }, - "usageExample": "", + "usageExample": "", "do": [ "Use for feature showcases", "Use for capability displays", -- 2.49.1 From c0830861194d6b9a1b34a78c101624325af54609 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:11 +0000 Subject: [PATCH 24/50] Update registry/schemas/FooterBase.schema.json --- registry/schemas/FooterBase.schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/schemas/FooterBase.schema.json b/registry/schemas/FooterBase.schema.json index f7a6a9c..f4de8c1 100644 --- a/registry/schemas/FooterBase.schema.json +++ b/registry/schemas/FooterBase.schema.json @@ -2,8 +2,8 @@ "name": "FooterBase", "propsSchema": { "columns": "Array<{ title: string, items: Array<{ label: string, href: string }> }> - Footer navigation columns", - "logoText?": "string (default: 'Webild')", - "copyrightText?": "string (default: '© 2025 | Webild')", + "logoText?": "string (default: 'North Star Marketing Lab ')", + "copyrightText?": "string (default: '© 2025 | North Star Marketing Lab ')", "onPrivacyClick?": "() => void", "ariaLabel?": "string (default: 'Site footer')", "className?": "string", -- 2.49.1 From 5480094df4bad2eb43659ed81072c8853e9004ef Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:12 +0000 Subject: [PATCH 25/50] Update registry/schemas/FooterBaseCard.schema.json --- registry/schemas/FooterBaseCard.schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/schemas/FooterBaseCard.schema.json b/registry/schemas/FooterBaseCard.schema.json index ef8a4fb..051bf99 100644 --- a/registry/schemas/FooterBaseCard.schema.json +++ b/registry/schemas/FooterBaseCard.schema.json @@ -1,9 +1,9 @@ { "name": "FooterBaseCard", "propsSchema": { - "logoText?": "string (default: 'Webild')", + "logoText?": "string (default: 'North Star Marketing Lab ')", "columns": "Array<{ title: string, items: Array<{ label: string, href: string }> }> - Footer navigation columns", - "copyrightText?": "string (default: '© 2025 | Webild')", + "copyrightText?": "string (default: '© 2025 | North Star Marketing Lab ')", "onPrivacyClick?": "() => void", "ariaLabel?": "string (default: 'Site footer')", "className?": "string", -- 2.49.1 From 4895ef1616df299c9eb09fd08894f8e1b8aba9c8 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:13 +0000 Subject: [PATCH 26/50] Update registry/schemas/FooterCard.schema.json --- registry/schemas/FooterCard.schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/schemas/FooterCard.schema.json b/registry/schemas/FooterCard.schema.json index 5ffd445..e042f24 100644 --- a/registry/schemas/FooterCard.schema.json +++ b/registry/schemas/FooterCard.schema.json @@ -1,8 +1,8 @@ { "name": "FooterCard", "propsSchema": { - "logoText?": "string (default: 'Webild')", - "copyrightText?": "string (default: '© 2025 | Webild')", + "logoText?": "string (default: 'North Star Marketing Lab ')", + "copyrightText?": "string (default: '© 2025 | North Star Marketing Lab ')", "socialLinks?": "Array<{ icon: LucideIcon, href: string, ariaLabel: string }> - Social media links", "ariaLabel?": "string (default: 'Site footer')", "className?": "string", -- 2.49.1 From 762b260bc11ca8ae47a51d1bf48d31fd147fb745 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:14 +0000 Subject: [PATCH 27/50] Update registry/schemas/FooterLogoEmphasis.schema.json --- registry/schemas/FooterLogoEmphasis.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/schemas/FooterLogoEmphasis.schema.json b/registry/schemas/FooterLogoEmphasis.schema.json index 718e52d..9c524fb 100644 --- a/registry/schemas/FooterLogoEmphasis.schema.json +++ b/registry/schemas/FooterLogoEmphasis.schema.json @@ -2,7 +2,7 @@ "name": "FooterLogoEmphasis", "propsSchema": { "columns": "Array<{ items: Array<{ label: string, href?: string, onClick?: () => void }> }> - Footer navigation columns (required, max 5)", - "logoText?": "string (default: 'Webild')", + "logoText?": "string (default: 'North Star Marketing Lab ')", "ariaLabel?": "string (default: 'Site footer')", "className?": "string", "containerClassName?": "string", -- 2.49.1 From a27b25f30e5f6d56ce9dd60a076ec42e24b4c237 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:14 +0000 Subject: [PATCH 28/50] Update registry/schemas/FooterLogoReveal.schema.json --- registry/schemas/FooterLogoReveal.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/schemas/FooterLogoReveal.schema.json b/registry/schemas/FooterLogoReveal.schema.json index 8646684..3404472 100644 --- a/registry/schemas/FooterLogoReveal.schema.json +++ b/registry/schemas/FooterLogoReveal.schema.json @@ -1,7 +1,7 @@ { "name": "FooterLogoReveal", "propsSchema": { - "logoText?": "string (default: 'Webild')", + "logoText?": "string (default: 'North Star Marketing Lab ')", "logoLineHeight?": "number (default: 1.1)", "ariaLabel?": "string (default: 'Site footer')", "className?": "string", -- 2.49.1 From 793f6fde094efe2a957cc6d13f34598bb9acae90 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:15 +0000 Subject: [PATCH 29/50] Update registry/schemas/FooterMedia.schema.json --- registry/schemas/FooterMedia.schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/schemas/FooterMedia.schema.json b/registry/schemas/FooterMedia.schema.json index ca8489d..3334c00 100644 --- a/registry/schemas/FooterMedia.schema.json +++ b/registry/schemas/FooterMedia.schema.json @@ -6,8 +6,8 @@ "videoSrc": "string (required if no imageSrc)", "videoAriaLabel?": "string (default: 'Footer video')", "columns": "Array<{ title: string, items: Array<{ label: string, href: string }> }> - Footer navigation columns", - "logoText?": "string (default: 'Webild')", - "copyrightText?": "string (default: '© 2025 | Webild')", + "logoText?": "string (default: 'North Star Marketing Lab ')", + "copyrightText?": "string (default: '© 2025 | North Star Marketing Lab ')", "onPrivacyClick?": "() => void", "ariaLabel?": "string (default: 'Site footer')", "className?": "string", -- 2.49.1 From fad2b71508a6027b63cb8884eb610038c02e16d9 Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:16 +0000 Subject: [PATCH 30/50] Update registry/schemas/NavbarLayoutFloatingInline.schema.json --- registry/schemas/NavbarLayoutFloatingInline.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/schemas/NavbarLayoutFloatingInline.schema.json b/registry/schemas/NavbarLayoutFloatingInline.schema.json index 71ca4b2..cfe431f 100644 --- a/registry/schemas/NavbarLayoutFloatingInline.schema.json +++ b/registry/schemas/NavbarLayoutFloatingInline.schema.json @@ -2,7 +2,7 @@ "name": "NavbarLayoutFloatingInline", "propsSchema": { "navItems": "Array<{name: string, id: string}>", - "brandName?": "string (default: 'Webild')", + "brandName?": "string (default: 'North Star Marketing Lab ')", "button": "{text: string, onClick?: () => void, href?: string}", "className?": "string (default: '')", "navItemClassName?": "string (default: '')", -- 2.49.1 From 78fd447e33490b22f419633c553c09ddd366a3cd Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:16 +0000 Subject: [PATCH 31/50] Update registry/schemas/NavbarLayoutFloatingOverlay.schema.json --- registry/schemas/NavbarLayoutFloatingOverlay.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/schemas/NavbarLayoutFloatingOverlay.schema.json b/registry/schemas/NavbarLayoutFloatingOverlay.schema.json index 1f8b917..63207f9 100644 --- a/registry/schemas/NavbarLayoutFloatingOverlay.schema.json +++ b/registry/schemas/NavbarLayoutFloatingOverlay.schema.json @@ -3,7 +3,7 @@ "propsSchema": { "navItems": "Array<{name: string, id: string}>", "className?": "string", - "brandName?": "string (default: 'Webild')", + "brandName?": "string (default: 'North Star Marketing Lab ')", "button": "{text: string, onClick?: () => void, href?: string}", "buttonClassName?": "string (default: '')", "buttonTextClassName?": "string (default: '')" -- 2.49.1 From b259bad7f271d648914c0c10685de61deaeeb4cd Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:17 +0000 Subject: [PATCH 32/50] Update registry/schemas/NavbarStyleApple.schema.json --- registry/schemas/NavbarStyleApple.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/schemas/NavbarStyleApple.schema.json b/registry/schemas/NavbarStyleApple.schema.json index 70ac82d..fec61a6 100644 --- a/registry/schemas/NavbarStyleApple.schema.json +++ b/registry/schemas/NavbarStyleApple.schema.json @@ -2,6 +2,6 @@ "name": "NavbarStyleApple", "propsSchema": { "navItems": "Array<{name: string, id: string}>", - "brandName?": "string (default: 'Webild')" + "brandName?": "string (default: 'North Star Marketing Lab ')" } } \ No newline at end of file -- 2.49.1 From 560cfad69f5bcebdedbe6308e7865855540a887e Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:18 +0000 Subject: [PATCH 33/50] Update registry/schemas/NavbarStyleCentered.schema.json --- registry/schemas/NavbarStyleCentered.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/schemas/NavbarStyleCentered.schema.json b/registry/schemas/NavbarStyleCentered.schema.json index 4e3e892..a58a402 100644 --- a/registry/schemas/NavbarStyleCentered.schema.json +++ b/registry/schemas/NavbarStyleCentered.schema.json @@ -4,7 +4,7 @@ "navItems": "Array<{name: string, id: string}>", "button": "{text: string, onClick?: () => void, href?: string}", "topBarButton?": "{text: string, onClick?: () => void, href?: string}", - "brandName?": "string (default: 'Webild')", + "brandName?": "string (default: 'North Star Marketing Lab ')", "className?": "string (default: '')" } } \ No newline at end of file -- 2.49.1 From 1b69d1d37669b9bb0474f40614721c83be1d9d1f Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:19 +0000 Subject: [PATCH 34/50] Update registry/schemas/NavbarStyleFullscreen.schema.json --- registry/schemas/NavbarStyleFullscreen.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/schemas/NavbarStyleFullscreen.schema.json b/registry/schemas/NavbarStyleFullscreen.schema.json index 107e582..6e4cf3c 100644 --- a/registry/schemas/NavbarStyleFullscreen.schema.json +++ b/registry/schemas/NavbarStyleFullscreen.schema.json @@ -2,7 +2,7 @@ "name": "NavbarStyleFullscreen", "propsSchema": { "navItems": "Array<{name: string, id: string}>", - "brandName?": "string (default: 'Webild')", + "brandName?": "string (default: 'North Star Marketing Lab ')", "bottomLeftText?": "string (default: 'Global Community')", "bottomRightText?": "string (default: 'hello@example.com')", "topBarClassName?": "string (default: '')" -- 2.49.1 From cd704017e211f070e5ec03d2483e5262b3bc4c9f Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:19 +0000 Subject: [PATCH 35/50] Update src/app/blog/page.tsx --- src/app/blog/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/blog/page.tsx b/src/app/blog/page.tsx index 93566e0..f965717 100644 --- a/src/app/blog/page.tsx +++ b/src/app/blog/page.tsx @@ -35,7 +35,7 @@ export default function BlogPage() { { name: "Contact", id: "contact-section" } ]} button={{ text: "Get Started" }} - brandName="Webild" + brandName="North Star Marketing Lab " /> -- 2.49.1 From 59a2d9cbdc678f0906924000635f59bbb296ed1b Mon Sep 17 00:00:00 2001 From: bender Date: Tue, 24 Feb 2026 04:46:21 +0000 Subject: [PATCH 36/50] Update src/app/layout.tsx --- src/app/layout.tsx | 1367 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1367 insertions(+) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 6ce7b5d..85cd582 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -565,6 +565,1373 @@ export default function RootLayout({ element.dataset.inputHandler = 'true'; element.dataset.beforeInputHandler = 'true'; + if (clickEvent && element.childNodes.length > 0) { + try { + let range = null; + + if (document.caretRangeFromPoint) { + range = document.caretRangeFromPoint(clickEvent.clientX, clickEvent.clientY); + } else if (document.caretPositionFromPoint) { + const position = document.caretPositionFromPoint(clickEvent.clientX, clickEvent.clientY); + if (position) { + range = document.createRange(); + range.setStart(position.offsetNode, position.offset); + range.collapse(true); + } + } + + if (range) { + const selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + } + } catch (e) { + console.warn('[North Star Marketing Lab ] Could not set caret position:', e); + } + } + }; + + const makeUneditable = (element, save = false) => { + if (!element || element.contentEditable !== 'true') return; + + element.contentEditable = 'false'; + isEditing = false; + + if (element.dataset.webildOriginalWhiteSpace) { + element.style.whiteSpace = element.dataset.webildOriginalWhiteSpace === 'normal' ? '' : element.dataset.webildOriginalWhiteSpace; + delete element.dataset.webildOriginalWhiteSpace; + } + if (element.dataset.webildOriginalWordWrap) { + element.style.wordWrap = element.dataset.webildOriginalWordWrap === 'normal' ? '' : element.dataset.webildOriginalWordWrap; + delete element.dataset.webildOriginalWordWrap; + } + if (element.dataset.webildOriginalOverflowWrap) { + element.style.overflowWrap = element.dataset.webildOriginalOverflowWrap === 'normal' ? '' : element.dataset.webildOriginalOverflowWrap; + delete element.dataset.webildOriginalOverflowWrap; + } + if (element.dataset.webildOriginalOverflow) { + element.style.overflow = element.dataset.webildOriginalOverflow === 'visible' ? '' : element.dataset.webildOriginalOverflow; + delete element.dataset.webildOriginalOverflow; + } + + if (element.dataset.beforeInputHandler === 'true') { + element.removeEventListener('beforeinput', () => {}); + delete element.dataset.beforeInputHandler; + } + + if (element.dataset.inputHandler === 'true') { + element.removeEventListener('input', () => {}); + delete element.dataset.inputHandler; + } + + window.parent.postMessage({ + type: 'webild-text-editing-ended', + data: { selector: getElementInfo(element).selector } + }, '*'); + + if (save && originalContent !== element.textContent) { + const elementInfo = getElementInfo(element); + let finalText = element.textContent; + + // Trim the final text and convert space-only to empty string for saving + if (finalText === ' ' || finalText.trim() === '') { + finalText = ''; + // Update the actual element text to empty for display + element.textContent = ''; + } + + const change = { + type: 'updateText', + selector: elementInfo.selector, + oldValue: originalContent, + newValue: finalText, + elementType: elementInfo.elementType, + sectionId: elementInfo.sectionId, + timestamp: Date.now() + }; + + saveChangeToStorage(change); + + window.parent.postMessage({ + type: 'webild-element-changed', + data: change + }, '*'); + } else if (!save && originalContent !== null) { + element.textContent = originalContent; + } + + originalContent = null; + }; + + const createHoverOverlay = (element) => { + const rect = element.getBoundingClientRect(); + const overlay = document.createElement('div'); + overlay.className = 'webild-hover-overlay'; + overlay.style.cssText = \` + position: fixed !important; + top: \${rect.top - 2}px !important; + left: \${rect.left - 2}px !important; + width: \${rect.width + 4}px !important; + height: \${rect.height + 4}px !important; + background-color: rgba(90, 113, 230, 0.15) !important; + pointer-events: none !important; + z-index: 999998 !important; + transition: all 0.15s ease !important; + \`; + document.body.appendChild(overlay); + return overlay; + }; + + const removeHoverOverlay = () => { + if (hoverOverlay) { + hoverOverlay.remove(); + hoverOverlay = null; + } + }; + + const showElementTypeLabel = (element, elementType) => { + if (!elementType) return; + + removeElementTypeLabel(); + + const rect = element.getBoundingClientRect(); + elementTypeLabel = document.createElement('div'); + elementTypeLabel.className = 'webild-element-type-label'; + const ariaLabel = element.getAttribute('aria-label'); + let labelText; + + if (elementType === 'Div') { + labelText = 'Div'; + } else if (elementType === 'Article') { + labelText = 'Article'; + } else if (elementType === 'Section') { + labelText = ariaLabel || 'Section'; + } else { + labelText = elementType; + } + + elementTypeLabel.textContent = labelText; + document.body.appendChild(elementTypeLabel); + const labelRect = elementTypeLabel.getBoundingClientRect(); + let labelTop = rect.top - labelRect.height - 2; + let labelLeft = rect.left - 3; + let isLabelOnTop = true; + if (labelTop < 0) { + labelTop = rect.bottom + 1; + isLabelOnTop = false; + } + if (labelTop + labelRect.height > window.innerHeight) { + labelTop = rect.bottom - labelRect.height; + isLabelOnTop = false; + if (labelTop < 0) { + labelTop = rect.top; + isLabelOnTop = true; + } + } + if (labelLeft + labelRect.width > window.innerWidth) { + labelLeft = window.innerWidth - labelRect.width; + } + if (labelLeft < 0) { + labelLeft = 0; + } + if (isLabelOnTop) { + elementTypeLabel.classList.add('label-top'); + } else { + elementTypeLabel.classList.add('label-bottom'); + } + + elementTypeLabel.style.cssText = \` + left: \${labelLeft}px !important; + top: \${labelTop}px !important; + transform: none !important; + \`; + }; + + const removeElementTypeLabel = () => { + if (elementTypeLabel) { + elementTypeLabel.remove(); + elementTypeLabel = null; + } + }; + + const handleMouseOver = (e) => { + if (!isActive) return; + + lastMouseX = e.clientX; + lastMouseY = e.clientY; + + const target = getMostSpecificElement(e.clientX, e.clientY) || e.target; + + if (!isValidElement(target) || target === hoveredElement || target === selectedElement) { + return; + } + + if (hoveredElement && hoveredElement !== selectedElement) { + hoveredElement.classList.remove(hoverClass); + if (hoveredElement.dataset.webildOriginalPosition) { + hoveredElement.style.position = hoveredElement.dataset.webildOriginalPosition === 'none' ? '' : hoveredElement.dataset.webildOriginalPosition; + delete hoveredElement.dataset.webildOriginalPosition; + } + removeHoverOverlay(); + removeElementTypeLabel(); + } + + hoveredElement = target; + + const computedStyle = window.getComputedStyle(target); + const currentPosition = computedStyle.position; + + if (currentPosition === 'static' || currentPosition === '') { + hoveredElement.dataset.webildOriginalPosition = currentPosition || 'none'; + hoveredElement.style.position = 'relative'; + } + + hoveredElement.classList.add(hoverClass); + + if ((!selectedElement || selectedElement !== target) && !isScrolling) { + hoverOverlay = createHoverOverlay(target); + } + + const elementType = getElementType(target); + showElementTypeLabel(target, elementType); + + window.parent.postMessage({ + type: 'webild-element-hover', + data: getElementInfo(target, false) + }, '*'); + }; + + const handleMouseOut = (e) => { + if (!isActive) return; + + if (hoveredElement && hoveredElement !== selectedElement) { + hoveredElement.classList.remove(hoverClass); + + if (hoveredElement.dataset.webildOriginalPosition) { + hoveredElement.style.position = hoveredElement.dataset.webildOriginalPosition === 'none' ? '' : hoveredElement.dataset.webildOriginalPosition; + delete hoveredElement.dataset.webildOriginalPosition; + } + + removeHoverOverlay(); + removeElementTypeLabel(); + + hoveredElement = null; + + window.parent.postMessage({ + type: 'webild-element-hover', + data: null + }, '*'); + } + }; + + const handleClick = (e) => { + if (!isActive) return; + + if (isEditing) { + e.stopPropagation(); + return; + } + + e.preventDefault(); + e.stopPropagation(); + + const target = getMostSpecificElement(e.clientX, e.clientY) || e.target; + if (!isValidElement(target)) return; + + if (selectedElement && selectedElement !== target) { + makeUneditable(selectedElement, false); + selectedElement.classList.remove(selectedClass); + selectedElement.classList.remove(hoverClass); + + if (selectedElement.dataset.webildOriginalPosition) { + selectedElement.style.position = selectedElement.dataset.webildOriginalPosition === 'none' ? '' : selectedElement.dataset.webildOriginalPosition; + delete selectedElement.dataset.webildOriginalPosition; + } + + removeHoverOverlay(); + removeElementTypeLabel(); + } + + if (selectedElement === target) { + if (target.dataset.webildOriginalPosition) { + target.style.position = target.dataset.webildOriginalPosition === 'none' ? '' : target.dataset.webildOriginalPosition; + delete target.dataset.webildOriginalPosition; + } + + removeHoverOverlay(); + removeElementTypeLabel(); + + selectedElement = null; + window.parent.postMessage({ + type: 'webild-element-selected', + data: null + }, '*'); + return; + } + + selectedElement = target; + selectedElement.classList.add(selectedClass); + + removeHoverOverlay(); + removeElementTypeLabel(); + + if (hoveredElement === target) { + hoveredElement.classList.remove(hoverClass); + hoveredElement = null; + } + + const elementInfo = getElementInfo(target, true); + selectedElement.dataset.webildSelector = elementInfo.selector; + showElementTypeLabel(target, elementInfo.elementType); + + window.parent.postMessage({ + type: 'webild-element-selected', + data: elementInfo + }, '*'); + + if (isTextElement(target)) { + setTimeout(() => makeEditable(target, e), 50); + } + }; + + const handleKeyDown = (e) => { + if (!isActive) return; + if (!isEditing || !selectedElement) return; + + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + makeUneditable(selectedElement, true); + } else if (e.key === 'Escape') { + e.preventDefault(); + makeUneditable(selectedElement, false); + } + }; + + const handleBlur = (e) => { + if (!isActive) return; + if (isEditing && selectedElement && e.target === selectedElement) { + makeUneditable(selectedElement, true); + } + }; + + let lastMouseX = 0; + let lastMouseY = 0; + + const handleScroll = () => { + if (!isActive) return; + + if (isEditing) return; + + if (selectedElement) { + makeUneditable(selectedElement, false); + selectedElement.classList.remove(selectedClass); + if (selectedElement.dataset.webildOriginalPosition) { + selectedElement.style.position = selectedElement.dataset.webildOriginalPosition === 'none' ? '' : selectedElement.dataset.webildOriginalPosition; + delete selectedElement.dataset.webildOriginalPosition; + } + selectedElement = null; + + window.parent.postMessage({ + type: 'webild-element-selected', + data: null + }, '*'); + } + + if (hoveredElement) { + hoveredElement.classList.remove(hoverClass); + if (hoveredElement.dataset.webildOriginalPosition) { + hoveredElement.style.position = hoveredElement.dataset.webildOriginalPosition === 'none' ? '' : hoveredElement.dataset.webildOriginalPosition; + delete hoveredElement.dataset.webildOriginalPosition; + } + hoveredElement = null; + + window.parent.postMessage({ + type: 'webild-element-hover', + data: null + }, '*'); + } + + removeHoverOverlay(); + removeElementTypeLabel(); + + isScrolling = true; + + if (scrollTimeout) { + clearTimeout(scrollTimeout); + } + + scrollTimeout = setTimeout(() => { + isScrolling = false; + + if (lastMouseX > 0 && lastMouseY > 0) { + const target = getMostSpecificElement(lastMouseX, lastMouseY); + if (target && isValidElement(target) && target !== selectedElement) { + hoveredElement = target; + + const computedStyle = window.getComputedStyle(target); + const currentPosition = computedStyle.position; + + if (currentPosition === 'static' || currentPosition === '') { + hoveredElement.dataset.webildOriginalPosition = currentPosition || 'none'; + hoveredElement.style.position = 'relative'; + } + + hoveredElement.classList.add(hoverClass); + hoverOverlay = createHoverOverlay(target); + + const elementType = getElementType(target); + showElementTypeLabel(target, elementType); + + window.parent.postMessage({ + type: 'webild-element-hover', + data: getElementInfo(target, false) + }, '*'); + } + } + }, 150); + + window.parent.postMessage({ + type: 'webild-iframe-scroll' + }, '*'); + }; + + const getStorageKey = () => { + const url = new URL(window.location.href); + const pathParts = url.pathname.split('/').filter(Boolean); + return \`webild-changes-\${pathParts.join('-')}\`; + }; + + const saveChangeToStorage = (change) => { + try { + const storageKey = getStorageKey(); + const existingChanges = JSON.parse(localStorage.getItem(storageKey) || '[]'); + + const filteredChanges = existingChanges.filter(c => { + return !(c.oldValue === change.oldValue && c.sectionId === change.sectionId); + }); + filteredChanges.push(change); + + localStorage.setItem(storageKey, JSON.stringify(filteredChanges)); + + window.parent.postMessage({ + type: 'webild-change-saved-locally', + data: { change, allChanges: filteredChanges } + }, '*'); + } catch (error) { + console.error('Failed to save change to localStorage:', error); + } + }; + + const clearLocalChanges = () => { + try { + const storageKey = getStorageKey(); + localStorage.removeItem(storageKey); + window.parent.postMessage({ + type: 'webild-local-changes-cleared', + data: {} + }, '*'); + } catch (error) { + console.error('Failed to clear local changes:', error); + } + }; + + const handleMessage = (e) => { + if (!e.data || !e.data.type) return; + + if (e.data.type === 'webild-activate-editor') { + if (!isActive) { + isActive = true; + window.parent.postMessage({ type: 'webild-editor-activated' }, '*'); + } + return; + } + + if (e.data.type === 'webild-deactivate-editor') { + if (isActive) { + isActive = false; + + if (selectedElement) { + makeUneditable(selectedElement, false); + selectedElement.classList.remove(selectedClass); + selectedElement = null; + } + if (hoveredElement) { + hoveredElement.classList.remove(hoverClass); + hoveredElement = null; + } + + removeHoverOverlay(); + removeElementTypeLabel(); + window.parent.postMessage({ type: 'webild-editor-deactivated' }, '*'); + } + return; + } + + if (e.data.type === 'webild-clear-local-changes') { + clearLocalChanges(); + return; + } + + if (e.data.type === 'webild-cancel-changes') { + try { + const storageKey = getStorageKey(); + const savedChanges = localStorage.getItem(storageKey); + if (savedChanges) { + const changes = JSON.parse(savedChanges); + changes.forEach(change => { + try { + const element = document.querySelector(change.selector); + if (!element) return; + + if (change.type === 'updateText') { + if (isTextElement(element)) { + element.textContent = change.oldValue; + } + } else if (change.type === 'updateButton') { + if (isButtonElement(element)) { + updateButtonText(element, change.oldValue); + } + } else if (change.type === 'replaceImage') { + const revertTag = element.tagName.toLowerCase(); + const isBackground = revertTag !== 'img' && revertTag !== 'video'; + if (isBackground) { + element.style.backgroundImage = change.oldValue ? 'url(' + change.oldValue + ')' : ''; + } else { + 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) { + console.warn('[North Star Marketing Lab ] Failed to revert change:', err); + } + }); + } + clearLocalChanges(); + } catch (error) { + console.error('[North Star Marketing Lab ] Failed to cancel changes:', error); + } + return; + } + + if (e.data.type === 'webild-update-text') { + const { selector, newValue, oldValue, sectionId } = e.data.data; + try { + let element = null; + + if (selectedElement && isTextElement(selectedElement)) { + element = selectedElement; + } + else if (selector) { + try { + element = document.querySelector(selector); + } catch (err) { + console.warn('[North Star Marketing Lab ] Invalid selector:', selector); + } + } + + if (!element && sectionId) { + const sectionElement = document.querySelector('[data-section="' + sectionId + '"]'); + if (sectionElement) { + const textElements = sectionElement.querySelectorAll('h1, h2, h3, h4, h5, h6, p, span, a, button, div'); + for (let i = 0; i < textElements.length; i++) { + const el = textElements[i]; + if (isTextElement(el) && el.textContent.trim() === (oldValue || '').trim()) { + element = el; + const newSelector = getUniqueSelector(element, true); + if (newSelector) { + element.dataset.webildSelector = newSelector; + } + break; + } + } + } + } + + if (element && isTextElement(element)) { + element.textContent = newValue; + const finalSelector = element.dataset.webildSelector || getUniqueSelector(element, true); + + window.parent.postMessage({ + type: 'webild-text-update-success', + data: { + selector: finalSelector, + newValue: newValue + } + }, '*'); + } else { + window.parent.postMessage({ + type: 'webild-text-update-failed', + data: { selector, newValue } + }, '*'); + } + } catch (error) { + window.parent.postMessage({ + type: 'webild-text-update-failed', + data: { selector, newValue, error: error.message } + }, '*'); + } + return; + } + + if (e.data.type === 'webild-update-button') { + const { selector, text, href } = e.data.data; + try { + const element = document.querySelector(selector); + if (element && isButtonElement(element)) { + if (text !== undefined) { + updateButtonText(element, text); + } + if (href !== undefined) { + if (element.tagName.toLowerCase() === 'a') { + element.href = href; + } else { + element.setAttribute('data-href', href); + } + } + } + } catch (error) { + console.error('[North Star Marketing Lab ] Invalid selector for button update:', selector, error); + } + return; + } + + if (!isActive) return; + + if (e.data.type === 'webild-replace-image') { + const { selector, newSrc, isBackground, allowMediaTypeSwap } = e.data.data; + let element = null; + + try { + element = document.querySelector(selector); + } catch { + window.parent.postMessage({ + type: 'webild-image-replacement-error', + data: { selector, message: 'Invalid selector: ' + error.message, success: false } + }, '*'); + return; + } + + if (!element) { + window.parent.postMessage({ + type: 'webild-image-replacement-error', + data: { selector, message: 'Element not found', success: false } + }, '*'); + return; + } + + try { + let replaced = false; + let oldValue = ''; + + if (isBackground) { + oldValue = window.getComputedStyle(element).backgroundImage; + element.style.backgroundImage = \`url('\${newSrc}')\`; + replaced = true; + } else if (element.tagName.toLowerCase() === 'img') { + oldValue = element.src; + 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'; + if (hasBackgroundImage) { + oldValue = window.getComputedStyle(element).backgroundImage; + element.style.backgroundImage = \`url('\${newSrc}')\`; + replaced = true; + } + } + + if (replaced) { + const elementInfo = getElementInfo(element); + + let cleanOldValue = oldValue; + if (oldValue.includes('url(')) { + const urlMatch = oldValue.match(/url(['"]?([^'")]+)['"]?)/); + if (urlMatch) { + cleanOldValue = urlMatch[1]; + } + } + + cleanOldValue = extractOriginalUrl(cleanOldValue); + + const change = { + type: 'replaceImage', + selector: selector, + oldValue: cleanOldValue, + newValue: newSrc, + elementType: elementInfo.elementType, + sectionId: elementInfo.sectionId, + timestamp: Date.now() + }; + + saveChangeToStorage(change); + + window.parent.postMessage({ + type: 'webild-element-changed', + data: change + }, '*'); + + window.parent.postMessage({ + type: 'webild-image-replaced', + data: { selector, newSrc, success: true } + }, '*'); + } else { + window.parent.postMessage({ + type: 'webild-image-replacement-error', + data: { selector, message: 'Could not determine how to replace image', success: false } + }, '*'); + } + } catch (error) { + window.parent.postMessage({ + type: 'webild-image-replacement-error', + data: { selector, message: error.message || 'Failed to replace image', success: false } + }, '*'); + } + } + }; + + document.addEventListener('mouseover', handleMouseOver, true); + document.addEventListener('mouseout', handleMouseOut, true); + document.addEventListener('click', handleClick, true); + document.addEventListener('keydown', handleKeyDown, true); + document.addEventListener('blur', handleBlur, true); + window.addEventListener('scroll', handleScroll, true); + window.addEventListener('message', handleMessage, true); + + let lastPathname = window.location.pathname; + + const notifyPageChange = () => { + window.parent.postMessage({ + type: 'webild-page-changed', + data: { pathname: window.location.pathname } + }, '*'); + }; + + window.addEventListener('popstate', () => { + if (lastPathname !== window.location.pathname) { + lastPathname = window.location.pathname; + notifyPageChange(); + } + }, true); + + const urlCheckInterval = setInterval(() => { + if (lastPathname !== window.location.pathname) { + lastPathname = window.location.pathname; + notifyPageChange(); + } + }, 500); + + notifyPageChange(); + + window.webildCleanup = () => { + isActive = false; + + if (selectedElement) { + makeUneditable(selectedElement, false); + } + + removeHoverOverlay(); + removeElementTypeLabel(); + + if (urlCheckInterval) { + clearInterval(urlCheckInterval); + } + + document.removeEventListener('mouseover', handleMouseOver, true); + document.removeEventListener('mouseout', handleMouseOut, true); + document.removeEventListener('click', handleClick, true); + document.removeEventListener('keydown', handleKeyDown, true); + document.removeEventListener('blur', handleBlur, true); + window.removeEventListener('scroll', handleScroll, true); + window.removeEventListener('message', handleMessage, true); + + document.querySelectorAll('.' + hoverClass).forEach(el => { + el.classList.remove(hoverClass); + }); + document.querySelectorAll('.' + selectedClass).forEach(el => { + el.classList.remove(selectedClass); + }); + + const styleEl = document.getElementById('webild-inspector-styles'); + if (styleEl) styleEl.remove(); + + hoveredElement = null; + selectedElement = null; + }; + + window.parent.postMessage({ type: 'webild-editor-ready' }, '*'); +})(); +` + }} + /> + +