From d5b1b1168281016c554919a3135990b86748cd43 Mon Sep 17 00:00:00 2001 From: Gaurav Kumar Date: Wed, 23 Apr 2025 14:29:10 +0530 Subject: [PATCH] sitebuilder --- .../realnet/OpenAi/Services/HtmlBuilder3.java | 2811 ++++++++++++++++- .../realnet/vpspack/Entity/SiteBuilder.java | 5 +- .../vpspack/Services/SiteBuilderService.java | 4 + 3 files changed, 2714 insertions(+), 106 deletions(-) diff --git a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/OpenAi/Services/HtmlBuilder3.java b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/OpenAi/Services/HtmlBuilder3.java index 971049d..d93892a 100644 --- a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/OpenAi/Services/HtmlBuilder3.java +++ b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/OpenAi/Services/HtmlBuilder3.java @@ -2,10 +2,14 @@ package com.realnet.OpenAi.Services; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Function; +import java.util.stream.Collectors; + +import com.realnet.OpenAi.Renders.HtmlRenderer; public class HtmlBuilder3 { @@ -19,14 +23,120 @@ public class HtmlBuilder3 { for (Map.Entry entry : map.entrySet()) { String sectionName = entry.getKey(); Object sectionContent = entry.getValue(); - - + + if ("teamSlider".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderTeamSlider((Map) sectionContent)); + continue; + } + + if ("teamSectionTemplate".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderTeamSectionTemplate((Map) sectionContent)); + continue; + } + + if ("teamSection".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderTeamSection((Map) sectionContent)); + continue; + } + + if ("logoGuidelines".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderLogoGuidelines((Map) sectionContent)); + continue; + } + + if ("logoGrid".equalsIgnoreCase(sectionName) && sectionContent instanceof List) { + html.append(renderLogoGrid((List>) sectionContent)); + continue; + } + + if ("brandGuideline".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderBrandGuideline((Map) sectionContent)); + continue; + } + + if ("logoShowcase".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderLogoShowcase((Map) sectionContent)); + continue; + } + + if ("logoCloud".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderLogoCloud((Map) sectionContent)); + continue; + } + + if ("ecommerceFAQs".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderEcommerceFAQs((Map) sectionContent)); + continue; + } + + if ("dashboardLayout".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderDashboardLayout((Map) sectionContent)); + continue; + } + + if ("FAQIllustratedSection".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderFaqIllustrated((Map) sectionContent)); + continue; + } + + if ("FAQSection".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderFaqSection((Map) sectionContent)); + continue; + } + if ("FAQTwoColumn".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderFaqTwoColumn((Map) sectionContent)); + continue; + } + + if ("TestimonialLanding".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderTestimonialLanding((Map) sectionContent)); + continue; + } + + if ("ClientTestimonialSection".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderClientTestimonial((Map) sectionContent)); + continue; + } + if ("TestimonialSection".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderSimpleTestimonial((Map) sectionContent)); + continue; + } + + if ("SubSection".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + html.append(renderSubSectionCentered((Map) sectionContent)); + continue; + } + if ("HeroSection".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { + Map heroMap = (Map) sectionContent; + + if ("centered".equalsIgnoreCase(getString(heroMap, "layout", "")) + && heroMap.containsKey("artwork")) { + html.append(renderHeroCenteredWithArt(heroMap)); + continue; + } + if ("left-text-right-cards".equalsIgnoreCase(getString(heroMap, "layout", ""))) { + html.append(renderHeroLeftCards(heroMap)); + continue; + } + // Smart internal layout-based routing to correct renderer + String layout = getString(heroMap, "layout", "").toLowerCase(); + + if (layout.equals("two-column") || heroMap.containsKey("leftColumn")) { + html.append(renderTwoColumnHeroSection(heroMap)); + } else if (layout.equals("centered") || heroMap.containsKey("heading")) { + html.append(renderCenteredHeroSection(heroMap)); + } else { + // fallback to older generic renderHeroSection + html.append(renderHeroSection(heroMap)); + } + continue; + } + if ("Blog".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { html.append(renderBlogCardSection((Map) sectionContent)); continue; } - if ("blogPage".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { html.append(renderBlogPage((Map) sectionContent)); continue; @@ -73,7 +183,7 @@ public class HtmlBuilder3 { html.append(renderHowToBlogPost(map)); return html.toString(); } - + if ("blogThumbnailGrid".equalsIgnoreCase(sectionName) && sectionContent instanceof Map) { html.append(renderBlogThumbnailGrid((Map) sectionContent)); continue; @@ -95,8 +205,6 @@ public class HtmlBuilder3 { continue; } - - // Wrap each section in a
tag with class derived from key html.append("
"); @@ -161,6 +269,9 @@ public class HtmlBuilder3 { TYPE_RENDERERS.put("feature-carousel", HtmlBuilder3::renderFeatureCarousel); TYPE_RENDERERS.put("feature-with-image", HtmlBuilder3::renderFeatureWithImage); TYPE_RENDERERS.put("feature-numbered-steps", HtmlBuilder3::renderFeatureNumberedSteps); + TYPE_RENDERERS.put("feature-section", HtmlBuilder3::renderFeatureAuto); + TYPE_RENDERERS.put("section-centered-card-grid", HtmlBuilder3::renderCenteredCardGrid); + TYPE_RENDERERS.put("feature-card-list", HtmlBuilder3::renderFeatureCardList); // Interactive TYPE_RENDERERS.put("faq-accordion", HtmlBuilder3::renderFaqAccordion); @@ -188,12 +299,32 @@ public class HtmlBuilder3 { TYPE_RENDERERS.put("contact-form", HtmlBuilder3::renderContactForm); TYPE_RENDERERS.put("contact-map", HtmlBuilder3::renderContactMap); TYPE_RENDERERS.put("contact-grid", HtmlBuilder3::renderContactGrid); + TYPE_RENDERERS.put("contactformsection", HtmlBuilder3::renderContactFormSection); + TYPE_RENDERERS.put("contactinfosection", HtmlBuilder3::renderContactInfoSection); + TYPE_RENDERERS.put("contactsplitsection", HtmlBuilder3::renderContactSplitSection); + TYPE_RENDERERS.put("contactpage", HtmlBuilder3::renderContactPage); + TYPE_RENDERERS.put("contactussection", HtmlBuilder3::renderContactUsSection); // Footer TYPE_RENDERERS.put("footer-minimal", HtmlBuilder3::renderFooterMinimal); TYPE_RENDERERS.put("footer-centered", HtmlBuilder3::renderFooterCentered); TYPE_RENDERERS.put("footer-columns", HtmlBuilder3::renderFooterColumns); +// Subscription + TYPE_RENDERERS.put("subscription-form", HtmlBuilder3::renderSubscriptionForm); + TYPE_RENDERERS.put("cta-block", HtmlBuilder3::renderCtaBlock); + TYPE_RENDERERS.put("cta-gradient", HtmlBuilder3::renderCtaGradientSection); + TYPE_RENDERERS.put("contact-signup", HtmlBuilder3::renderContactSignupSection); + TYPE_RENDERERS.put("hero-banner", HtmlBuilder3::renderHeroBanner); + +// Pricing + + TYPE_RENDERERS.put("pricing-section", HtmlBuilder3::renderPricingSection); + TYPE_RENDERERS.put("pricingsectiondark", HtmlBuilder3::renderPricingSectionDark); + TYPE_RENDERERS.put("pricingsection", HtmlBuilder3::renderPricingHubPlans); + TYPE_RENDERERS.put("pricingsection", HtmlBuilder3::renderTogglePricingSection); + TYPE_RENDERERS.put("singleplansection", HtmlBuilder3::renderSinglePlanSection); + // Utility Elements TYPE_RENDERERS.put("icon-button", HtmlBuilder3::renderIconButton); TYPE_RENDERERS.put("label", HtmlBuilder3::renderLabel); @@ -203,8 +334,99 @@ public class HtmlBuilder3 { TYPE_RENDERERS.put("list-post", HtmlBuilder3::renderListPost); TYPE_RENDERERS.put("perfect-blog-post", HtmlBuilder3::renderPerfectBlogPost); TYPE_RENDERERS.put("blog-thumbnail-grid", HtmlBuilder3::renderBlogThumbnailGrid); + TYPE_RENDERERS.put("teamShowcase", HtmlBuilder3::renderTeamShowcase); + TYPE_RENDERERS.put("herosection", HtmlBuilder3::renderHeroCenteredHeadingSplit); + TYPE_RENDERERS.put("header", HtmlBuilder3::renderSmartHeader); + TYPE_RENDERERS.put("centered-section-with-image", HtmlBuilder3::renderCenteredSectionWithImage); + TYPE_RENDERERS.put("Header Section", HtmlBuilder3::renderHeaderSection); + TYPE_RENDERERS.put("herosection", HtmlBuilder3::renderSmartHeroSection); + TYPE_RENDERERS.put("hero-section", HtmlBuilder3::renderSmartHeroSection); + + TYPE_RENDERERS.put("page", (node) -> buildHtml(node.get("children"))); + TYPE_RENDERERS.put("heading", (node) -> "

" + + get(node, "content") + "

"); + TYPE_RENDERERS.put("paragraph", (node) -> "

" + + get(node, "content") + "

"); + TYPE_RENDERERS.put("button-group", (node) -> wrapTag("div", "button-group", node)); + TYPE_RENDERERS.put("image-grid", (node) -> wrapTag("div", "image-grid", node)); + TYPE_RENDERERS.put("image-tile", (node) -> "
\"image\"/
"); + TYPE_RENDERERS.put("logo", + (node) -> "
" + get(node, "content") + "
"); + + TYPE_RENDERERS.put("nav", (node) -> { + StringBuilder b = new StringBuilder(); + b.append(""); + return b.toString(); + }); + TYPE_RENDERERS.put("link", (node) -> ""); // handled above in nav + TYPE_RENDERERS.put("button", (node) -> ""); + + } + + private static String wrapTag(String tag, String className, Map node) { + StringBuilder html = new StringBuilder(); + html.append("<").append(tag); + if (className != null) { + html.append(" class=\"").append(className).append("\""); + } + html.append(">"); + + if (node.containsKey("children")) { + List> children = (List>) node.get("children"); + for (Map child : children) { + html.append(buildHtml(child)); // ✅ Use universal method + } + } + + html.append(""); + return html.toString(); + } + + private static String get(Map map, String key) { + Object val = map.get(key); + return val instanceof String ? (String) val : ""; + } + + public static String get(Map map, String key, String defaultValue) { + Object value = map.get(key); + return value != null ? value.toString() : defaultValue; + } + + @SuppressWarnings("unchecked") + public static List> getList(Map map, String key) { + Object value = map.get(key); + if (value instanceof List) { + return (List>) value; + } + return Collections.emptyList(); + } + + @SuppressWarnings("unchecked") + public static List getStringList(Map map, String key) { + Object value = map.get(key); + if (value instanceof List) { + return ((List) value).stream().filter(String.class::isInstance).map(String.class::cast) + .collect(Collectors.toList()); + } + return Collections.emptyList(); + } + + @SuppressWarnings("unchecked") + public static Map getMap(Map map, String key) { + Object value = map.get(key); + if (value instanceof Map) { + return (Map) value; + } + return Collections.emptyMap(); } // ---------------- Placeholder Functions ---------------- @@ -236,6 +458,384 @@ public class HtmlBuilder3 { return ""; } + private static String renderPricingSectionDark(Map data) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + html.append("
").append(get(data, "badge")).append("
"); + html.append("

").append(get(data, "title")).append("

"); + html.append("

").append(get(data, "description")).append("

"); + + html.append("
"); + List> cards = getList(data, "cards"); + for (Map card : cards) { + String cardClass = "pricing-card" + (getBoolean(card, "highlight") ? " highlight" : ""); + html.append("
"); + html.append("
").append(get(card, "badge")).append("
"); + html.append("

").append(get(card, "price")).append("

"); + html.append("
    "); + List features = (List) card.get("features"); + for (String feature : features) { + html.append("
  • ").append(feature).append("
  • "); + } + html.append("
"); + Map btn = getMap(card, "button"); + String btnClass = "filled"; + if ("outline".equals(btn.get("style"))) + btnClass = "outline"; + else if ("light".equals(btn.get("style"))) + btnClass = "light"; + + html.append(""); + + html.append("
"); + } + html.append("
"); + return html.toString(); + } + + private static String renderSinglePlanSection(Map data) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Header + html.append("
").append("

") + .append(getText(data, "title")).append("

").append("

") + .append(getText(data, "subtitle")).append("

").append("
"); + + // Features + List> features = getList(data, "features"); + html.append("
"); + for (Map feature : features) { + html.append("
").append("") + .append(getText(feature, "icon")).append("").append("

") + .append(getText(feature, "title")).append("

").append("

") + .append(getText(feature, "description")).append("

").append("
"); + } + html.append("
"); + + // Plan Card + Map planCard = getMap(data, "planCard"); + Map cta = getMap(planCard, "cta"); + html.append("
").append("

").append(getText(planCard, "title")) + .append("

").append("

").append(getText(planCard, "price")).append(" / ") + .append(getText(planCard, "frequency")).append("

").append("

") + .append(getText(planCard, "description")).append("

").append("") + .append(getText(cta, "label")).append("").append("
"); + + html.append("
"); + return html.toString(); + } + + private static String renderTogglePricingSection(Map data) { + StringBuilder html = new StringBuilder(); + + html.append("
"); + + html.append("
").append("

").append(get(data, "title")).append("

") + .append("

").append(get(data, "subtitle")).append("

").append("
"); + + Map toggle = getMap(data, "toggle"); + List options = getStringList(toggle, "options"); + String def = get(toggle, "default"); + + html.append("
"); + for (String option : options) { + String active = option.equalsIgnoreCase(def) ? "active" : ""; + html.append(""); + } + html.append("
"); + + html.append("
"); + List> plans = getList(data, "plans"); + for (Map plan : plans) { + boolean highlight = getBoolean(plan, "highlight"); + html.append("
").append("

") + .append(get(plan, "name")).append("

").append("
") + .append(get(plan, "price")).append("
").append("
") + .append(get(plan, "savings")).append("
").append("
") + .append(get(plan, "bonus")).append("
").append("
    "); + List features = getStringList(plan, "features"); + for (String feat : features) { + html.append("
  • ").append(feat).append("
  • "); + } + html.append("
").append("") + .append("
"); + } + html.append("
"); + + return html.toString(); + } + + private static String renderPricingHubPlans(Map data) { + StringBuilder html = new StringBuilder(); + + Map header = getMap(data, "header"); + html.append("
"); + + html.append("
").append("

").append(get(header, "title")).append("

") + .append("

").append(get(header, "subtitle")).append("

").append("
"); + + List tabs = (List) data.get("tabs"); + if (tabs != null && !tabs.isEmpty()) { + html.append("
"); + for (String tab : tabs) { + html.append("
").append(tab).append("
"); + } + html.append("
"); + } + + Map hub = getMap(data, "hub"); + html.append("
").append("

").append(get(hub, "name")).append("

").append("

") + .append(get(hub, "description")).append("

").append("").append(get(hub, "link")) + .append("").append("
"); + + html.append("
"); + List> plans = getList(data, "plans"); + for (Map plan : plans) { + html.append("
").append("

").append(get(plan, "name")).append("

") + .append("

").append(get(plan, "priceMonthly")).append(" / ").append(get(plan, "priceYearly")) + .append("

").append("

Contacts: ").append(get(plan, "contacts")).append("

").append("

") + .append(get(plan, "notes")).append("

").append("").append("
"); + } + html.append("
"); + + return html.toString(); + } + + public static boolean getBoolean(Map data, String key) { + Object value = data.get(key); + return value instanceof Boolean ? (Boolean) value : false; + } + + private static String renderPricingSection(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("
"); + + sb.append("

").append(getText(data, "tagline.text")).append("

"); + sb.append("

").append(getText(data, "title.text")).append("

"); + sb.append("

").append(getText(data, "description.text")).append("

"); + + sb.append("
"); + List> cards = getList(data, "cards"); + for (Map card : cards) { + sb.append("
"); + + sb.append("

").append(card.get("plan")).append("

"); + sb.append("

").append(card.get("monthly")).append(" / mo

"); + sb.append("

").append(card.get("yearly")).append(" / yr

"); + + sb.append("
    "); + List features = (List) card.get("features"); + for (String feature : features) { + sb.append("
  • ").append(feature).append("
  • "); + } + sb.append("
"); + + Map button = getMap(card, "button"); + sb.append("").append(button.get("label")) + .append(""); + + sb.append("
"); + } + sb.append("
"); + return sb.toString(); + } + + @SuppressWarnings("unchecked") + public static String getText(Map data, String path) { + String[] keys = path.split("\\."); + Object current = data; + for (String key : keys) { + if (current instanceof Map) { + current = ((Map) current).get(key); + } else { + return ""; // return blank if path breaks + } + } + return current != null ? current.toString() : ""; + } + + private static String renderHeroBanner(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("
"); + + Map headline = getMap(data, "headline"); + Map subheading = getMap(data, "subheading"); + Map button = getMap(data, "ctaButton"); + List> images = getList(data, "decorativeImages"); + + sb.append("

").append(headline.get("text")) + .append("

"); + + sb.append("

").append(subheading.get("text")) + .append("

"); + + sb.append("").append(button.get("text")) + .append(""); + + for (Map img : images) { + sb.append("\"decorative\""); + } + + sb.append("
"); + return sb.toString(); + } + + private static String renderContactSignupSection(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append(""); + return sb.toString(); + } + + private static String renderCtaGradientSection(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("
"); + + Map title = getMap(data, "title"); + sb.append("

").append(title.get("text")).append("

"); + + Map desc = getMap(data, "description"); + sb.append("

").append(desc.get("text")).append("

"); + + Map button = getMap(data, "button"); + sb.append("").append(button.get("label")) + .append(""); + + sb.append("
"); + return sb.toString(); + } + + private static String renderCtaBlock(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("
"); + + // Heading + Map heading = getMap(data, "heading"); + sb.append("

").append(heading.get("text")) + .append("

"); + + // Description + Map description = getMap(data, "description"); + sb.append("

").append(description.get("text")) + .append("

"); + + // Buttons + List> buttons = getList(data, "buttons"); + sb.append("
"); + for (Map button : buttons) { + sb.append("").append(button.get("label")) + .append(""); + } + sb.append("
"); + + sb.append("
"); + return sb.toString(); + } + + private static String renderSubscriptionForm(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("
"); + + // Left side: Heading + Description + sb.append("
"); + sb.append("

").append(getMap(data, "heading").get("text")).append("

"); + sb.append("

").append(getMap(data, "description").get("text")) + .append("

"); + sb.append("
"); + + // Right side: Form + sb.append("
"); + + List> fields = getList(getMap(data, "form"), "fields"); + for (Map field : fields) { + sb.append(""); + } + + Map button = getMap(getMap(data, "form"), "button"); + sb.append(""); + + // Disclaimer + Map disclaimer = getMap(getMap(data, "form"), "disclaimer"); + Map link = getMap(disclaimer, "link"); + sb.append("

").append(disclaimer.get("text")).append(" ").append(link.get("label")) + .append("

"); + + sb.append(""); + sb.append("
"); + return sb.toString(); + } + + private static String renderFeatureCardList(Map data) { + StringBuilder sb = new StringBuilder(); + + sb.append("
"); + + // Heading + Map heading = getMap(data, "heading"); + sb.append("

").append(get(heading, "text")).append("

"); + + // Features grid + List> features = getList(data, "features"); + sb.append("
"); + + for (Map feature : features) { + sb.append("
"); + + // Icon + Map icon = getMap(feature, "icon"); + sb.append("\"").append(get(icon,"); + + // Title + sb.append("

").append(get(feature, "title")).append("

"); + + // Description + sb.append("

").append(get(feature, "description")).append("

"); + + // Button + Map button = getMap(feature, "button"); + String arrow = Boolean.TRUE.equals(button.get("arrow")) ? " →" : ""; + sb.append(""); + + sb.append("
"); + } + + sb.append("
"); + return sb.toString(); + } + private static String renderTestimonialCarousel(Map node) { return ""; } @@ -244,6 +844,120 @@ public class HtmlBuilder3 { return "
Brand Logos
"; } + private static String renderCenteredCardGrid(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("
"); + + sb.append(p("hero-label", get(data, "tagline", "text"))); + sb.append(h("h2", "hero-heading", get(data, "heading", "text"))); + sb.append(p("hero-description", get(data, "description", "text"))); + + List> cards = getList(data, "cards"); + if (!cards.isEmpty()) { + sb.append("
"); + for (Map card : cards) { + sb.append("
"); + Map image = getMap(card, "image"); + sb.append(img("card-img", image.get("src"), image.get("alt"))); + sb.append(h("h3", "card-title", card.get("title"))); + sb.append(p("card-description", card.get("description"))); + sb.append("
"); + } + sb.append("
"); + } + + List> buttons = getList(data, "buttons"); + if (!buttons.isEmpty()) { + sb.append("
"); + for (Map button : buttons) { + String btnClass = getBtnClass(button); + sb.append(a(btnClass, "#", button.get("label"))); + } + sb.append("
"); + } + + sb.append("
"); + return sb.toString(); + } + + private static String p(String cls, Object content) { + return "

" + content + "

"; + } + + private static String h(String tag, String cls, Object content) { + return "<" + tag + " class=\"" + cls + "\">" + content + ""; + } + + private static String img(String cls, Object src, Object alt) { + return "\"""; + } + + private static String a(String cls, String href, Object content) { + return "" + content + ""; + } + + private static String getBtnClass(Map btn) { + String style = String.valueOf(btn.get("style")); + return "filled".equals(style) ? "btn-filled" : "btn-outlined"; + } + + private static String renderFeatureAuto(Map data) { + // Smart detection based on structure + List> children = getChildren(data); + + for (Map child : children) { + if ("img".equalsIgnoreCase(get(child, "type")) && "feature-image".equalsIgnoreCase(get(child, "class"))) { + return renderFeatureWithImage(data); // This is the new one + } + } + + return renderFeatureSection(data); // This is the old one + } + + private static String renderFeatureWithImage(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("
"); + + List> children = getChildren(data); + + for (Map child : children) { + String type = get(child, "type"); + + if ("img".equalsIgnoreCase(type)) { + sb.append("\"")"); + } else if ("div".equalsIgnoreCase(type)) { + sb.append("
"); + List> contentChildren = getChildren(child); + for (Map c : contentChildren) { + String innerType = get(c, "type"); + String content = get(c, "content"); + + switch (innerType) { + case "p": + case "h2": + sb.append("<").append(innerType).append(" class=\"").append(get(c, "class")).append("\">") + .append(content).append(""); + break; + case "div": + sb.append("
"); + List> buttons = getChildren(c); + for (Map b : buttons) { + sb.append("").append(get(b, "content")).append(""); + } + sb.append("
"); + break; + } + } + sb.append("
"); + } + } + + sb.append("
"); + return sb.toString(); + } + private static String renderFeatureGrid(Map node) { return "
Features
"; } @@ -252,10 +966,6 @@ public class HtmlBuilder3 { return ""; } - private static String renderFeatureWithImage(Map node) { - return "
Feature Image
"; - } - private static String renderFeatureNumberedSteps(Map node) { return "
  1. Step 1
"; } @@ -292,8 +1002,45 @@ public class HtmlBuilder3 { return "
Promo
"; } - private static String renderTeamGrid(Map node) { - return "
Team Members
"; + private static String renderTeamGrid(Map section) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Tag + if (section.containsKey("tag")) { + html.append("
").append(section.get("tag")).append("
"); + } + + // Heading + if (section.containsKey("title")) { + html.append("

").append(section.get("title")).append("

"); + } + + // Description + if (section.containsKey("description")) { + html.append("

").append(section.get("description")).append("

"); + } + + // Grid + List> members = (List>) section.get("members"); + html.append("
"); + + for (Map member : members) { + html.append("
"); + + html.append("\"").append(member.get("name"))"); + + html.append("
").append(member.get("name")).append("
"); + html.append("
").append(member.get("description")).append("
"); + + html.append("
"); // .team-member + } + + html.append("
"); // #team-member-grid + html.append("
"); + + return html.toString(); } private static String renderTeamProfileList(Map node) { @@ -328,6 +1075,297 @@ public class HtmlBuilder3 { return "
Grid
"; } + private static String renderContactPage(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("
"); + + // Hero + Map hero = getMap(data, "hero"); + sb.append("
"); + sb.append("
").append(getText(hero, "logo")).append("
"); + + List navLinks = getStringList(hero, "navLinks"); + sb.append("
    "); + for (String link : navLinks) { + sb.append("
  • ").append(link).append("
  • "); + } + sb.append("
"); + + sb.append("

").append(getText(hero, "title")).append("

"); + sb.append("
"); + + // Three-column layout + sb.append("
"); + List> sections = getListMap(data, "sections"); + + for (Map sec : sections) { + String type = getText(sec, "type"); + + if ("map".equalsIgnoreCase(type)) { + sb.append(""); + } + + else if ("info".equalsIgnoreCase(type)) { + Map details = getMap(sec, "details"); + sb.append("
").append("

") + .append(getText(sec, "heading")).append("

").append("

") + .append(getText(details, "phone")).append("

").append("

") + .append(getText(details, "email")).append("

").append("

") + .append(getText(details, "address")).append("

").append("
"); + } + + else if ("form".equalsIgnoreCase(type)) { + sb.append("
").append("

") + .append(getText(sec, "heading")).append("

"); + + List> fields = getListMap(sec, "fields"); + for (Map field : fields) { + String inputType = getText(field, "type"); + if ("textarea".equalsIgnoreCase(inputType)) { + sb.append(""); + } else { + sb.append(""); + } + } + + Map button = getMap(sec, "button"); + sb.append("") + .append(""); + } + } + + sb.append("
"); + return sb.toString(); + } + + public static String getText(Map map, String key, String defaultValue) { + Object val = map.get(key); + return (val instanceof String) ? (String) val : defaultValue; + } + + private static String renderContactUsSection(Map data) { + StringBuilder sb = new StringBuilder(); + + Map getInTouch = getMap(data, "getInTouch"); + List> columns = getListMap(getInTouch, "columns"); + + sb.append("
"); + sb.append("

").append(getText(getInTouch, "heading")).append("

"); + sb.append("
"); + for (Map col : columns) { + sb.append("
"); + sb.append("
").append(getText(col, "icon")).append("
"); + sb.append("

").append(getText(col, "title")).append("

"); + List lines = getStringList(col, "lines"); + for (String line : lines) { + sb.append("

").append(line).append("

"); + } + sb.append("
"); + } + sb.append("
"); + + Map messageUs = getMap(data, "messageUs"); + Map leftColumn = getMap(messageUs, "leftColumn"); + Map form = getMap(messageUs, "form"); + List> fields = getListMap(form, "fields"); + Map submit = getMap(form, "submit"); + + sb.append("
"); + sb.append("
"); + sb.append("

").append(getText(leftColumn, "heading")).append("

"); + sb.append("

").append(getText(leftColumn, "description")).append("

"); + sb.append("

").append(getText(leftColumn, "awardText")).append("

"); + sb.append("
"); + + sb.append("
"); + sb.append("
"); + for (Map field : fields) { + String type = getText(field, "type"); + String name = getText(field, "name", type); + String placeholder = getText(field, "placeholder"); + if ("textarea".equals(type)) { + int rows = getInt(field, "rows", 4); + sb.append(""); + } else { + sb.append(""); + } + } + sb.append(""); + sb.append("
"); + + return sb.toString(); + } + + @SuppressWarnings("unchecked") + public static int getInt(Map map, String key, int defaultValue) { + Object value = map.get(key); + if (value instanceof Number) { + return ((Number) value).intValue(); + } + try { + return Integer.parseInt(String.valueOf(value)); + } catch (Exception e) { + return defaultValue; + } + } + + private static String renderContactSplitSection(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("
"); + + // LEFT PANEL + Map left = getMap(data, "leftPanel"); + sb.append("
"); + + List> sections = getListMap(left, "sections"); + for (Map sec : sections) { + sb.append("
"); + sb.append("

").append(getText(sec, "heading")).append("

"); + if (sec.containsKey("highlightColor")) { + sb.append("

").append(getText(sec, "content")).append("

"); + } else { + sb.append("

").append(getText(sec, "content")).append("

"); + } + sb.append("
"); + } + sb.append("
"); + + // RIGHT PANEL + Map right = getMap(data, "rightPanel"); + sb.append("
"); + sb.append("

").append(getText(right, "heading")).append("

"); + + sb.append("
"); + Map form = getMap(right, "form"); + List> fields = getListMap(form, "fields"); + + for (Map field : fields) { + String type = getText(field, "type"); + if ("textarea".equalsIgnoreCase(type)) { + sb.append(""); + } else { + sb.append(""); + } + } + + Map btn = getMap(form, "button"); + sb.append(""); + + sb.append("
"); // end right panel + sb.append("
"); + return sb.toString(); + } + + private static String renderContactInfoSection(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("
"); + + // Profile Image + Map image = getMap(data, "profileImage"); + if (!image.isEmpty()) { + sb.append("\"")"); + } + + // Heading + Map heading = getMap(data, "heading"); + sb.append("

").append(getText(heading, "text")).append("

"); + + // Description + Map desc = getMap(data, "description"); + sb.append("

").append(getText(desc, "text")).append("

"); + + // Columns + List> columns = getListMap(data, "columns"); + if (!columns.isEmpty()) { + sb.append("
"); + for (Map col : columns) { + sb.append("
"); + sb.append("").append(getText(col, "icon")).append(""); + sb.append("

").append(getText(col, "title")).append("

"); + sb.append("

").append(getText(col, "text")).append("

"); + sb.append("
"); + } + sb.append("
"); + } + + sb.append("
"); + return sb.toString(); + } + + private static String renderContactFormSection(Map data) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + html.append("
").append("

") + .append(getText(data, "tagline")).append("

").append("

") + .append(getTextMap(data, "heading", "text")).append("

").append("

") + .append(getTextMap(data, "description", "text")).append("

").append("
"); + + html.append("
"); + List> fields = getListMap(getMap(data, "form"), "fields"); + + for (Map field : fields) { + String type = getText(field, "type"); + String name = getText(field, "name"); + String label = getText(field, "label"); + String placeholder = getText(field, "placeholder"); + + switch (type) { + case "text": + case "email": + html.append(""); + break; + case "textarea": + html.append(""); + break; + case "checkbox": + html.append(""); + break; + } + } + + Map button = getMap(getMap(data, "form"), "button"); + html.append(""); + html.append(""); + + html.append("
"); + return html.toString(); + } + + @SuppressWarnings("unchecked") + public static String getTextMap(Map map, String key, String innerKey) { + Object inner = map.get(key); + if (inner instanceof Map) { + Object value = ((Map) inner).get(innerKey); + return value != null ? value.toString() : ""; + } + return ""; + } + + @SuppressWarnings("unchecked") + public static List> getListMap(Map map, String key) { + Object value = map.get(key); + if (value instanceof List) { + return (List>) value; + } + return new ArrayList<>(); + } + private static String renderFooterMinimal(Map node) { return "
Minimal Footer
"; } @@ -484,6 +1522,86 @@ public class HtmlBuilder3 { return html.toString(); } + private static String renderHeroCenteredSection(Map section) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Tagline + Map tagline = (Map) section.get("tagline"); + if (tagline != null) { + html.append("
").append(tagline.get("text")).append("
"); + } + + // Heading + Map heading = (Map) section.get("heading"); + if (heading != null) { + html.append("

").append(heading.get("text")).append("

"); + } + + // Description + Map description = (Map) section.get("description"); + if (description != null) { + html.append("

").append(description.get("text")).append("

"); + } + + // Buttons + List> buttons = (List>) section.get("buttons"); + if (buttons != null && !buttons.isEmpty()) { + html.append("
"); + for (Map btn : buttons) { + html.append("") + .append(btn.getOrDefault("label", "Click")).append(""); + } + html.append("
"); + } + + html.append("
"); + return html.toString(); + } + + private static String renderHeaderSection(Map section) { + StringBuilder html = new StringBuilder(); + String sectionClass = getString(section, "class", "hero-header"); + + html.append("
"); + + for (Map.Entry entry : section.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + + if ("class".equalsIgnoreCase(key)) + continue; + + if (value instanceof String) { + if (key.toLowerCase().contains("heading")) { + html.append("

").append(value).append("

"); + } else if (key.toLowerCase().contains("subheading") || key.toLowerCase().contains("paragraph")) { + html.append("

").append(value).append("

"); + } else { + html.append("
").append(value) + .append("
"); + } + } else if (value instanceof Map) { + Map nested = (Map) value; + String nestedClass = getString(nested, "class", key.toLowerCase().replace(" ", "-")); + html.append("
"); + + Object items = nested.get("items"); + if (items instanceof List) { + for (Object item : (List) items) { + html.append(""); + } + } + + html.append("
"); + } + } + + html.append("
"); + return html.toString(); + } + private static String renderFromMap(Map node) { StringBuilder html = new StringBuilder(); @@ -623,14 +1741,35 @@ public class HtmlBuilder3 { private static String renderButtons(Object obj) { StringBuilder html = new StringBuilder(); - if (obj instanceof Map) { + // Case 1: Simple list of string labels + if (obj instanceof List) { + List btns = (List) obj; + html.append("
"); + for (Object item : btns) { + if (item instanceof String) { + html.append(""); + } else if (item instanceof Map) { + html.append(renderSingleButton((Map) item)); + } + } + html.append("
"); + } + + // Case 2: Object with "items" list and optional class + else if (obj instanceof Map) { Map btnMap = (Map) obj; - List items = (List) btnMap.get("items"); - String btnClass = getString(btnMap, "class", "btn-group"); + List items = (List) btnMap.get("items"); + String btnClass = getString(btnMap, "class", "cta-buttons"); html.append("
"); - for (String label : items) { - html.append(""); + if (items != null) { + for (Object btn : items) { + if (btn instanceof String) { + html.append(""); + } else if (btn instanceof Map) { + html.append(renderSingleButton((Map) btn)); + } + } } html.append("
"); } @@ -638,6 +1777,20 @@ public class HtmlBuilder3 { return html.toString(); } + private static String renderSingleButton(Map btn) { + String label = getString(btn, "label", "Button"); + String href = getString(btn, "action", "#"); + String style = getString(btn, "style", "filled"); + String bg = getString(btn, "backgroundColor", style.equals("outlined") ? "white" : "black"); + String color = getString(btn, "textColor", style.equals("outlined") ? "black" : "white"); + String border = style.equals("outlined") ? "1px solid " + getString(btn, "borderColor", "#000") : "none"; + + return new StringBuilder().append("").append(label).append("").toString(); + } + private static String renderColumns(Object obj) { StringBuilder html = new StringBuilder(); html.append("
"); @@ -1340,7 +2493,8 @@ public class HtmlBuilder3 { // Header if (data.containsKey("header")) { Map header = (Map) data.get("header"); - html.append("
"); + html.append( + "
"); // Logo html.append("

").append(getString(header, "logo", "Logo")).append("

"); @@ -1350,7 +2504,8 @@ public class HtmlBuilder3 { List menu = (List) header.get("menu"); html.append(""); } @@ -1384,10 +2539,13 @@ public class HtmlBuilder3 { if (hero.containsKey("mainPost")) { Map main = (Map) hero.get("mainPost"); html.append("
"); - html.append(""); - html.append("

").append(getString(main, "category", "")).append("

"); + html.append(""); + html.append("

").append(getString(main, "category", "")) + .append("

"); html.append("

").append(getString(main, "title", "")).append("

"); - html.append("

By ").append(getString(main, "author", "")).append("

"); + html.append("

By ").append(getString(main, "author", "")) + .append("

"); html.append("
"); } @@ -1397,7 +2555,8 @@ public class HtmlBuilder3 { html.append("
"); for (Map post : side) { html.append("
"); - html.append(""); + html.append(""); html.append("

").append(getString(post, "title", "")).append("

"); html.append("
"); } @@ -1410,10 +2569,12 @@ public class HtmlBuilder3 { // Post Grid if (data.containsKey("postGrid")) { List> posts = (List>) data.get("postGrid"); - html.append("
"); + html.append( + "
"); for (Map post : posts) { html.append("
"); - html.append(""); + html.append(""); html.append("

").append(getString(post, "title", "")).append("

"); html.append("
"); } @@ -1423,7 +2584,7 @@ public class HtmlBuilder3 { html.append("
"); return html.toString(); } - + private static String renderBlogCardSection(Map blog) { StringBuilder html = new StringBuilder(); @@ -1435,7 +2596,7 @@ public class HtmlBuilder3 { html.append("
"); html.append("

").append(getString(heading, "title", "My Blog")).append("

"); html.append("

") - .append(getString(heading, "description", "")).append("

"); + .append(getString(heading, "description", "")).append("

"); html.append("
"); } @@ -1443,19 +2604,24 @@ public class HtmlBuilder3 { if (blog.containsKey("posts")) { List> posts = (List>) blog.get("posts"); - html.append("
"); + html.append( + "
"); for (Map post : posts) { - html.append("
"); + html.append( + "
"); - html.append(""); + html.append(""); html.append("
"); - html.append("

") - .append(getString(post, "date", "")).append(" | ").append(getString(post, "category", "")).append("

"); + html.append("

").append(getString(post, "date", "")) + .append(" | ").append(getString(post, "category", "")).append("

"); html.append("

").append(getString(post, "title", "")).append("

"); - html.append("

").append(getString(post, "description", "")).append("

"); - html.append("") - .append(getString(post, "cta", "Read More")).append(""); + html.append("

").append(getString(post, "description", "")) + .append("

"); + html.append( + "") + .append(getString(post, "cta", "Read More")).append(""); html.append("
"); html.append("
"); @@ -1467,8 +2633,6 @@ public class HtmlBuilder3 { return html.toString(); } - - private static String renderBlogThumbnailGrid(Map data) { StringBuilder html = new StringBuilder(); @@ -1482,7 +2646,8 @@ public class HtmlBuilder3 { html.append("

").append(title).append("

"); // Grid - html.append("
"); + html.append("
"); for (Map card : cards) { String image = getString(card, "image", ""); @@ -1490,17 +2655,19 @@ public class HtmlBuilder3 { String cardTitle = getString(card, "title", ""); String link = getString(card, "link", "#"); - html.append("
"); + html.append( + "
"); html.append(""); - html.append("\"").append(cardTitle).append("\""); + html.append("\"").append(cardTitle)"); html.append(""); html.append("
"); - html.append("

").append(category).append("

"); - html.append("

") - .append("") - .append(cardTitle).append("

"); + html.append("

").append(category) + .append("

"); + html.append("

").append("").append(cardTitle).append("

"); html.append("
"); html.append("
"); @@ -1511,7 +2678,7 @@ public class HtmlBuilder3 { return html.toString(); } - + private static String renderBlogSection(Map section) { StringBuilder html = new StringBuilder(); html.append("
"); @@ -1521,10 +2688,12 @@ public class HtmlBuilder3 { html.append("
"); if (section.containsKey("sectionLabel")) { - html.append("

").append(section.get("sectionLabel")).append("

"); + html.append("

").append(section.get("sectionLabel")) + .append("

"); } if (section.containsKey("breadcrumb")) { - html.append("

").append(section.get("breadcrumb")).append("

"); + html.append("

").append(section.get("breadcrumb")) + .append("

"); } if (section.containsKey("heading")) { @@ -1532,8 +2701,8 @@ public class HtmlBuilder3 { if (headingObj instanceof Map) { Map heading = (Map) headingObj; html.append("

").append(heading.getOrDefault("title", "")) - .append(" ") - .append(heading.getOrDefault("highlighted", "")).append("

"); + .append(" ").append(heading.getOrDefault("highlighted", "")) + .append(""); html.append("

").append(heading.getOrDefault("description", "")).append("

"); } else { html.append("

").append(section.get("heading")).append("

"); @@ -1559,7 +2728,8 @@ public class HtmlBuilder3 { } if (posts != null && !posts.isEmpty()) { - html.append("
"); + html.append( + "
"); for (Map post : posts) { String title = getString(post, "title", "Untitled"); @@ -1570,24 +2740,30 @@ public class HtmlBuilder3 { String readTime = getString(post, "readTime", ""); String description = getString(post, "description", getString(post, "excerpt", "")); - html.append("
"); + html.append( + "
"); if (!image.isEmpty()) { html.append(""); } html.append("
"); - if (!category.isEmpty()) html.append("

").append(category).append("

"); - html.append("

").append(title).append("

"); - if (!description.isEmpty()) html.append("

").append(description).append("

"); + if (!category.isEmpty()) + html.append("

").append(category).append("

"); + html.append("

").append(title).append("

"); + if (!description.isEmpty()) + html.append("

").append(description).append("

"); if (!date.isEmpty() || !readTime.isEmpty()) { - html.append("

") - .append(date).append(" ").append(readTime).append("

"); + html.append("

").append(date).append(" ").append(readTime) + .append("

"); } if (post.containsKey("cta")) { - html.append("") - .append(post.get("cta")).append(""); + html.append("") + .append(post.get("cta")).append(""); } if (post.containsKey("readMoreLink")) { - html.append("Read more"); + html.append("Read more"); } html.append("
"); } @@ -1600,35 +2776,40 @@ public class HtmlBuilder3 { String text = getString(viewAll, "text", "View All"); String link = getString(viewAll, "link", "#"); html.append(""); + .append("\" style=\"color:#007BFF; text-decoration:underline; font-weight:bold;\">").append(text) + .append("
"); } html.append("
"); return html.toString(); } + private static String renderArticlePage(Map articlePage) { StringBuilder html = new StringBuilder(); - html.append("
"); + html.append( + "
"); // Title & Subtitle html.append("
"); html.append("

").append(getString(articlePage, "title", "Untitled")).append("

"); - html.append("

").append(getString(articlePage, "subtitle", "")).append("

"); + html.append("

").append(getString(articlePage, "subtitle", "")) + .append("

"); html.append("
"); // Cover Image String coverImage = getString(articlePage, "coverImage", ""); if (!coverImage.isEmpty()) { - html.append("\"cover\""); + html.append("\"cover\""); } // Author + Metadata if (articlePage.containsKey("author")) { Map author = (Map) articlePage.get("author"); html.append("
"); - html.append(""); + html.append(""); html.append("
"); html.append("").append(getString(author, "name", "")).append("
"); html.append("").append(getString(author, "role", "")).append(""); @@ -1638,7 +2819,7 @@ public class HtmlBuilder3 { // Publish Date html.append("

Published on ") - .append(getString(articlePage, "publishedDate", "")).append("

"); + .append(getString(articlePage, "publishedDate", "")).append("

"); // Main Content if (articlePage.containsKey("content")) { @@ -1647,24 +2828,26 @@ public class HtmlBuilder3 { for (Map block : content) { String type = getString(block, "type", ""); switch (type) { - case "paragraph": - html.append("

") + case "paragraph": + html.append("

") .append(getString(block, "text", "")).append("

"); - break; - case "image": - html.append("
"); - html.append(""); - String caption = getString(block, "caption", ""); - if (!caption.isEmpty()) { - html.append("
") + break; + case "image": + html.append("
"); + html.append(""); + String caption = getString(block, "caption", ""); + if (!caption.isEmpty()) { + html.append( + "
") .append(caption).append("
"); - } - html.append("
"); - break; - case "heading": - html.append("

") + } + html.append("

"); + break; + case "heading": + html.append("

") .append(getString(block, "text", "")).append("

"); - break; + break; } } } @@ -1687,8 +2870,9 @@ public class HtmlBuilder3 { html.append("

Tags

"); List tags = (List) sidebar.get("tags"); for (String tag : tags) { - html.append("") - .append(tag).append(""); + html.append( + "") + .append(tag).append(""); } html.append("
"); } @@ -1699,11 +2883,12 @@ public class HtmlBuilder3 { html.append("
"); return html.toString(); } - + private static String renderTemplateLibrary(Map lib) { StringBuilder html = new StringBuilder(); - html.append("
"); + html.append( + "
"); // Title and subtitle html.append("
"); @@ -1713,18 +2898,20 @@ public class HtmlBuilder3 { // Search input html.append("
"); - html.append(""); + html.append(""); html.append("
"); // Categories if (lib.containsKey("categories")) { List categories = (List) lib.get("categories"); - html.append("
"); + html.append( + "
"); for (String cat : categories) { - html.append(""); + html.append( + ""); } html.append("
"); } @@ -1733,14 +2920,20 @@ public class HtmlBuilder3 { if (lib.containsKey("templates")) { List> templates = (List>) lib.get("templates"); - html.append("
"); + html.append( + "
"); for (Map template : templates) { - html.append("
"); + html.append( + "
"); - html.append("\"icon\""); - html.append("

").append(getString(template, "title", "")).append("

"); - html.append("

").append(getString(template, "description", "")).append("

"); - html.append("").append(getString(template, "category", "")).append(""); + html.append("\"icon\""); + html.append("

").append(getString(template, "title", "")) + .append("

"); + html.append("

").append(getString(template, "description", "")) + .append("

"); + html.append("").append(getString(template, "category", "")) + .append(""); html.append("
"); } @@ -1750,6 +2943,7 @@ public class HtmlBuilder3 { html.append("
"); return html.toString(); } + private static String renderBlogHeader(Map header) { StringBuilder html = new StringBuilder(); @@ -1764,17 +2958,18 @@ public class HtmlBuilder3 { String topBg = getString(background, "top", ""); String bottomBg = getString(background, "bottom", ""); - html.append("
"); + html.append("
"); if (!topBg.isEmpty()) { - html.append(""); + html.append(""); } if (header.containsKey("date")) { html.append("

") - .append(header.get("date")).append("

"); + .append(header.get("date")).append("

"); } if (header.containsKey("title")) { @@ -1783,19 +2978,1424 @@ public class HtmlBuilder3 { if (header.containsKey("subtitle")) { html.append("

") - .append(header.get("subtitle")).append("

"); + .append(header.get("subtitle")).append("

"); } if (!bottomBg.isEmpty()) { - html.append(""); + html.append(""); } html.append("
"); return html.toString(); } + private static String renderHeroSection(Map section) { + String layout = getString(section, "layout", "centered").toLowerCase(); + switch (layout) { + case "two-column": + return renderTwoColumnHeroV2(section); + case "centered": + default: + return renderCenteredHeroSection(section); // fallback + } + } + private static String renderCenteredHeroSection(Map section) { + StringBuilder html = new StringBuilder(); + html.append("
"); + // Heading + if (section.containsKey("heading")) { + Map heading = (Map) section.get("heading"); + html.append("

") + .append(getString(heading, "text", "")).append("

"); + } + + // Description + if (section.containsKey("description")) { + Map desc = (Map) section.get("description"); + html.append("

").append(getString(desc, "text", "")) + .append("

"); + } + + // Buttons + if (section.containsKey("buttons")) { + List> buttons = (List>) section.get("buttons"); + html.append( + "
"); + for (Map btn : buttons) { + String style = getString(btn, "style", "filled"); + String bg = getString(btn, "backgroundColor", "#000"); + String color = getString(btn, "textColor", "#fff"); + String border = "outlined".equals(style) ? "1px solid " + getString(btn, "borderColor", "#000") + : "none"; + html.append("") + .append(getString(btn, "label", "Button")).append(""); + } + html.append("
"); + } + + // Image + if (section.containsKey("image")) { + Map img = (Map) section.get("image"); + html.append("\"")"); + } + + html.append("
"); + return html.toString(); + } + + private static String renderTwoColumnHeroV2(Map section) { + String bg = getString(section, "backgroundColor", "#fff"); + String font = getString(section, "fontFamily", "sans-serif"); + + Map left = (Map) section.get("leftColumn"); + Map right = (Map) section.get("rightColumn"); + + StringBuilder html = new StringBuilder(); + html.append("
"); + + // --- LEFT COLUMN --- + html.append("
"); + + // Heading + if (left.containsKey("heading")) { + Map heading = (Map) left.get("heading"); + String text = getString(heading, "text", ""); + String highlight = getString(heading, "highlight", ""); + if (!highlight.isEmpty()) { + text = text.replace(highlight, "" + highlight + ""); + } + html.append("

").append(text).append("

"); + } + + // Subheading + if (left.containsKey("subheading")) { + Map sub = (Map) left.get("subheading"); + html.append("

").append(getString(sub, "text", "")) + .append("

"); + } + + // Buttons + if (left.containsKey("buttons")) { + html.append("
"); + List> buttons = (List>) left.get("buttons"); + for (Map btn : buttons) { + String style = getString(btn, "style", "filled"); + String bgCol = getString(btn, "backgroundColor", "#000"); + String txtCol = getString(btn, "textColor", "#fff"); + String brdCol = getString(btn, "borderColor", ""); + String borderRadius = getString(btn, "borderRadius", "4px"); + String label = getString(btn, "label", "Button"); + + html.append("").append(label).append(""); + } + html.append("
"); + } + + // Partners + if (left.containsKey("partners")) { + Map partners = (Map) left.get("partners"); + html.append("
").append(getString(partners, "label", "")) + .append("
"); + + List> logos = (List>) partners.get("logos"); + for (Map logo : logos) { + html.append("\"")"); + } + html.append("
"); + } + + html.append("
"); // end left + + // --- RIGHT COLUMN --- + html.append("
"); + if (right.containsKey("illustration")) { + Map illus = (Map) right.get("illustration"); + Map styleMap = (Map) illus.get("style"); + + StringBuilder style = new StringBuilder(); + if (styleMap != null) { + style.append("border-radius:").append(getString(styleMap, "borderRadius", "0")).append("; "); + style.append("background:").append(getString(styleMap, "backgroundColor", "#fff")).append("; "); + style.append("padding:").append(getString(styleMap, "padding", "0")).append(";"); + } + + html.append("\"")"); + } + + if (right.containsKey("caption")) { + Map cap = (Map) right.get("caption"); + html.append("

") + .append(getString(cap, "text", "")).append("

"); + } + html.append("
"); // end right + + html.append("
"); + + // Decorations + if (section.containsKey("decorations")) { + List> shapes = (List>) section.get("decorations"); + for (Map shape : shapes) { + html.append("
"); + } + } + + // Scroll Indicator + if (section.containsKey("scrollIndicator")) { + Map si = (Map) section.get("scrollIndicator"); + html.append("
"); + } + + return html.toString(); + } + + private static String renderTwoColumnHeroSection(Map section) { + String bg = getString(section, "background", "#fff"); + String font = getString(section, "fontFamily", "sans-serif"); + + Map left = (Map) section.get("leftColumn"); + Map right = (Map) section.get("rightColumn"); + + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Left Column + html.append("
"); + + if (left.containsKey("heading")) { + html.append("

") + .append(getString(left, "heading", "")).append("

"); + } + + if (left.containsKey("description")) { + html.append("

") + .append(getString(left, "description", "")).append("

"); + } + + if (left.containsKey("buttons")) { + html.append(renderButtons(left.get("buttons"))); + } + html.append("
"); + + // Right Column + html.append("
"); + if (right != null && "image".equalsIgnoreCase(getString(right, "type", ""))) { + html.append("\"")"); + } + html.append("
"); + + html.append("
"); + return html.toString(); + } + + private static String renderHeroLeftCards(Map section) { + StringBuilder html = new StringBuilder(); + html.append("
"); + html.append("
"); + + // Left Column + if (section.containsKey("leftColumn")) { + Map left = (Map) section.get("leftColumn"); + html.append("
"); + + if (left.containsKey("logo")) { + Map logo = (Map) left.get("logo"); + html.append("\"").append(logo.get("alt"))"); + } + + if (left.containsKey("label")) { + html.append("").append(left.get("label")).append(""); + } + + if (left.containsKey("title")) { + Map title = (Map) left.get("title"); + html.append("

").append(title.get("text")).append("

"); + } + + html.append("
"); + } + + // Right Column + if (section.containsKey("rightColumn")) { + Map right = (Map) section.get("rightColumn"); + List> cards = (List>) right.get("cards"); + + html.append("
"); + for (Map card : cards) { + html.append("
"); + + if (card.containsKey("title")) { + html.append("

").append(card.get("title")).append("

"); + } + + if (card.containsKey("image")) { + Map img = (Map) card.get("image"); + html.append("\"").append(img.get("alt"))"); + } + + if (card.containsKey("buttons")) { + html.append("
"); + List> buttons = (List>) card.get("buttons"); + for (Map btn : buttons) { + String btnClass = getString(btn, "class", "btn"); + html.append("").append(btn.get("label")).append(""); + } + html.append("
"); + } + + html.append("
"); + } + html.append("
"); + } + + html.append("
"); + return html.toString(); + } + + private static String renderHeroCenteredWithArt(Map section) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Artworks + if (section.containsKey("artwork")) { + Map art = (Map) section.get("artwork"); + + if (art.containsKey("left")) { + Map left = (Map) art.get("left"); + html.append("\"")"); + } + if (art.containsKey("right")) { + Map right = (Map) art.get("right"); + html.append("\"")"); + } + } + + // Heading + if (section.containsKey("heading")) { + Map heading = (Map) section.get("heading"); + html.append("

").append(getString(heading, "text", "").replace("\n", "
")) + .append("

"); + } + + // CTA + if (section.containsKey("ctaButton")) { + Map btn = (Map) section.get("ctaButton"); + html.append("") + .append(btn.get("label")).append(""); + } + + html.append("
"); + return html.toString(); + } + + private static String renderSubSectionCentered(Map section) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + if (section.containsKey("title")) { + html.append("

").append(section.get("title")).append("

"); + } + + if (section.containsKey("description")) { + html.append("

").append(section.get("description")).append("

"); + } + + html.append("
"); + return html.toString(); + } + + private static String renderSimpleTestimonial(Map data) { + StringBuilder html = new StringBuilder(); + String theme = getString(data, "theme", "light"); + html.append("
"); + + // Heading + if (data.containsKey("heading")) { + html.append("

").append(data.get("heading")).append("

"); + } + + // Check for multiple cards + if (data.containsKey("cards")) { + List> cards = (List>) data.get("cards"); + html.append("
"); + + for (Map card : cards) { + html.append("
"); + html.append("
★★★★★
"); + html.append("

").append(card.get("quote")).append("

"); + + if (card.containsKey("author")) { + Map author = (Map) card.get("author"); + html.append("
"); + + if (author.containsKey("image")) { + html.append("\"")"); + } + + html.append("").append(author.get("name")).append(""); + html.append("

").append(author.get("position")).append("

"); + html.append("
"); + } + + html.append("
"); + } + + html.append("
"); + } + // Fallback: single quote + author + optional logo + else { + if (data.containsKey("logo")) { + Map logo = (Map) data.get("logo"); + html.append("
").append("\"").append(logo.get("alt")).append("\"").append("
"); + } + + html.append("
").append(data.getOrDefault("quote", "")) + .append("
"); + + if (data.containsKey("author")) { + Map author = (Map) data.get("author"); + html.append("
"); + + if (author.containsKey("image")) { + html.append("\"author\""); + } + + html.append("
").append("").append(author.get("name")) + .append("
").append("").append(author.get("position")).append("") + .append("
").append("
"); + } + } + + html.append("
"); + return html.toString(); + } + + private static String renderClientTestimonial(Map data) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Background image + if (data.containsKey("backgroundImage")) { + html.append("
"); + } + + // Logo + if (data.containsKey("logo")) { + html.append("\"logo\"/"); + } + + // Title + html.append("

").append(data.get("title")).append("

"); + + // Cards + if (data.containsKey("testimonials")) { + List> testimonials = (List>) data.get("testimonials"); + html.append("
"); + for (Map t : testimonials) { + html.append("
"); + html.append("\"")"); + html.append("
").append(t.get("quote")).append("
"); + html.append("
"); + html.append("").append(t.get("name")).append("
"); + html.append("").append("★★★★★".substring(0, (int) t.get("rating"))) + .append(""); + html.append("
"); + } + html.append("
"); + } + + // CTA + if (data.containsKey("cta")) { + Map cta = (Map) data.get("cta"); + html.append(""); + } + + // Contact Info + if (data.containsKey("contactInfo")) { + Map contact = (Map) data.get("contactInfo"); + html.append("
").append("

").append(contact.get("phone")).append("

") + .append("

") + .append(contact.get("email")).append("

").append("

").append(contact.get("website")) + .append("

").append("
"); + } + + html.append("
"); + return html.toString(); + } + + private static String renderTestimonialLanding(Map data) { + StringBuilder html = new StringBuilder(); + String theme = getString(data, "theme", "orange"); + + html.append("
"); + + // Title + html.append("

").append(data.get("title")).append("

"); + + // Description + if (data.containsKey("description")) { + html.append("

").append(data.get("description")).append("

"); + } + + // Testimonials + if (data.containsKey("testimonials")) { + List> testimonials = (List>) data.get("testimonials"); + html.append("
"); + for (Map t : testimonials) { + boolean highlight = Boolean.TRUE.equals(t.get("highlight")); + html.append("
"); + html.append("
").append(t.get("quote")).append("
"); + html.append("

— ").append(t.get("name")).append("

"); + html.append("
"); + } + html.append("
"); + } + + html.append("
"); + return html.toString(); + } + + private static String renderFaqSection(Map section) { + StringBuilder html = new StringBuilder(); + + html.append("
"); + + // Title + if (section.containsKey("title")) { + html.append("

").append(section.get("title")).append("

"); + } + + // Subtitle + if (section.containsKey("subtitle")) { + html.append("

") + .append(section.get("subtitle")).append("

"); + } + + // Questions + if (section.containsKey("questions")) { + List> questions = (List>) section.get("questions"); + html.append("
"); + + for (Map qa : questions) { + html.append("
"); + html.append("

").append(qa.get("question")).append("

"); + html.append("

").append(qa.get("answer")).append("

"); + html.append("
"); + } + + html.append("
"); + } + + // CTA + if (section.containsKey("cta")) { + Map cta = (Map) section.get("cta"); + + html.append("
"); + html.append("

").append(cta.get("title")).append("

"); + html.append("

").append(cta.get("subtitle")).append("

"); + + if (cta.containsKey("button")) { + Map btn = (Map) cta.get("button"); + html.append("") + .append(btn.get("label")).append(""); + } + + html.append("
"); + } + + html.append("
"); + return html.toString(); + } + + private static String renderFaqTwoColumn(Map section) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Title + html.append("

").append(getString(section, "title", "FAQs")).append("

"); + + // Description + html.append("

") + .append(getString(section, "description", "")).append("

"); + + // FAQ Grid + List> questions = (List>) section.get("questions"); + html.append( + "
"); + + for (Map qa : questions) { + html.append("
") + .append("

").append(qa.get("question")).append("

") + .append("

").append(qa.get("answer")).append("

").append("
"); + } + + html.append("
"); + + // CTA + if (section.containsKey("cta")) { + Map cta = (Map) section.get("cta"); + html.append(""); + } + + html.append("
"); + return html.toString(); + } + + private static String renderFaqIllustrated(Map section) { + StringBuilder html = new StringBuilder(); + html.append( + "
"); + + // Title + html.append("

") + .append(getString(section, "title", "FAQs")).append("

"); + + // Search + if (section.containsKey("searchPlaceholder")) { + html.append("
") + .append("") + .append("
"); + } + + // Illustration + if (section.containsKey("illustration")) { + html.append("
").append("\"FAQ").append("
"); + } + + // Questions + List> questions = (List>) section.get("questions"); + html.append("
"); + + for (Map qa : questions) { + html.append("
") + .append("

").append(qa.get("question")).append("

") + .append("

").append(qa.get("answer")).append("

").append("
"); + } + + html.append("
"); + html.append("
"); + return html.toString(); + } + + private static String renderDashboardLayout(Map section) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Sidebar + if (section.containsKey("sidebar")) { + Map sidebar = (Map) section.get("sidebar"); + List items = (List) sidebar.get("items"); + int active = (int) sidebar.getOrDefault("activeIndex", 0); + + html.append(""); + } + + // Main content + if (section.containsKey("mainContent")) { + List> main = (List>) section.get("mainContent"); + html.append("
"); + for (Map item : main) { + html.append("
").append("

") + .append(item.get("title")).append("

").append("
"); + } + html.append("
"); + } + + // Right panel + if (section.containsKey("rightPanel")) { + Map right = (Map) section.get("rightPanel"); + List> sections = (List>) right.get("sections"); + html.append(""); + } + + html.append("
"); + return html.toString(); + } + + private static String renderEcommerceFAQs(Map data) { + StringBuilder html = new StringBuilder(); + + html.append("
"); + + // Title + html.append("

").append(getString(data, "title", "FAQs")) + .append("

"); + + // Categories + List> categories = (List>) data.get("categories"); + html.append( + "
"); + + for (Map category : categories) { + html.append("
"); + html.append("

").append(category.get("title")).append("

"); + + List questions = (List) category.get("questions"); + html.append("
    "); + for (String q : questions) { + html.append("
  • ").append(q).append("
  • "); + } + html.append("
"); + + html.append("
"); + } + + html.append("
"); + html.append("
"); + return html.toString(); + } + + private static String renderLogoCloud(Map data) { + StringBuilder html = new StringBuilder(); + + html.append( + "
"); + + // Heading + String heading = getString(data, "heading", "Trusted by companies"); + html.append("

").append(heading).append("

"); + + // Logo grid + List> logos = (List>) data.get("logos"); + html.append( + "
"); + + for (Map logo : logos) { + String src = getString(logo, "src", ""); + String alt = getString(logo, "alt", "Logo"); + + html.append("\"").append(alt)"); + } + + html.append("
"); + html.append("
"); + + return html.toString(); + } + + private static String renderLogoShowcase(Map data) { + StringBuilder html = new StringBuilder(); + + String theme = getString(data, "theme", "default"); + + html.append("
"); + + // Logo Grid + List> logos = (List>) data.get("logos"); + html.append( + "
"); + + for (Map logo : logos) { + html.append("
"); + html.append("\"")"); + html.append("

") + .append(getString(logo, "name", "")).append("

"); + html.append("
"); + } + + html.append("
"); + + // CTA + if (data.containsKey("cta")) { + Map cta = (Map) data.get("cta"); + html.append(""); + } + + html.append("
"); + + return html.toString(); + } + + private static String renderBrandGuideline(Map data) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Project Info + Map project = (Map) data.get("project"); + html.append("
") + .append("

").append(getString(project, "name", "")).append("

") + .append("

Designer: ").append(getString(project, "designer", "")).append("

") + .append("

Client: ").append(getString(project, "client", "")).append("

") + .append("

Website: ").append(getString(project, "website", "")).append("

") + .append("

Logo Date: ").append(getString(project, "logoDate", "")).append("

") + .append("
"); + + // Logos + Map logo = (Map) data.get("logo"); + html.append("
").append("

Logo Variants

"); + + html.append("

Primary Logo:

\"Primary

"); + + html.append("

Icon Logo:

\"Icon

"); + + List mono = (List) logo.get("monochrome"); + if (mono != null && mono.size() == 2) { + html.append("

Monochrome Logos:

").append("\"Black").append("\"White

"); + } + + Map social = (Map) logo.get("social"); + html.append("

Social Logos:

").append("\"Social").append("\"Social") + .append("
"); + + // Colors + List> colors = (List>) data.get("colors"); + html.append("
").append("

Brand Colors

") + .append("
"); + + for (Map color : colors) { + String hex = getString(color, "hex", "#000"); + html.append("
").append("
") + .append("

").append(getString(color, "name", "")) + .append("

").append("

") + .append(getString(color, "usage", "")).append("

").append("
"); + } + html.append("
"); + + // Typography + Map typography = (Map) data.get("typography"); + html.append("
").append("

Typography

"); + + Map headline = (Map) typography.get("headline"); + html.append("

Headline: ").append(getString(headline, "fontFamily", "")).append(" - ") + .append(getString(headline, "weight", "")).append("

"); + + Map body = (Map) typography.get("body"); + html.append("

Body: ").append(getString(body, "fontFamily", "")).append(" - ") + .append(getString(body, "weight", "")).append("

"); + + html.append("
"); + return html.toString(); + } + + private static String renderLogoGrid(List> data) { + StringBuilder html = new StringBuilder(); + html.append("
") + .append("

Logo Grid

") + .append("
"); + + for (Map logo : data) { + html.append( + "
") + .append("

").append(getString(logo, "title", "")) + .append("

").append("

Category: ") + .append(getString(logo, "category", "")).append("

") + .append("

Style: ") + .append(getString(logo, "style", "")).append("

").append("
"); + } + + html.append("
"); + return html.toString(); + } + + private static String renderLogoGuidelines(Map data) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Header info + html.append("

").append(getString(data, "templateName", "Logo Guidelines")) + .append("

").append("

Created in ") + .append(getString(data, "createdIn", "")).append(" • ").append(getString(data, "date", "")) + .append("

"); + + // Sections + List> sections = (List>) data.get("sections"); + if (sections != null) { + for (Map section : sections) { + html.append("
").append("

") + .append(getString(section, "title", "")).append("

").append("

") + .append(getString(section, "description", "")).append("

"); + + // If Cover section + if ("Cover".equalsIgnoreCase(getString(section, "title", "")) && section.containsKey("content")) { + Map content = (Map) section.get("content"); + html.append( + "
") + .append("

Version: ").append(getString(content, "version", "")) + .append("

").append("

").append(getString(content, "title", "")).append("

") + .append("

").append(getString(content, "subtitle", "")).append("

").append("
"); + } + + // If Typography section + if ("Typography".equalsIgnoreCase(getString(section, "title", "")) && section.containsKey("font")) { + Map font = (Map) section.get("font"); + html.append("
Aa
") + .append("

") + .append(getString(font, "name", "")).append(" - ") + .append(getString(font, "usage", "")).append("

"); + } + + html.append("
"); + } + } + + html.append("
"); + return html.toString(); + } + + private static String renderTeamSection(Map data) { + StringBuilder html = new StringBuilder(); + html.append( + "
"); + + // Title & Description + html.append("

").append(getString(data, "title", "Our Team")).append("

"); + html.append("

") + .append(getString(data, "description", "")).append("

"); + + // Team Members + List> members = (List>) data.get("members"); + if (members != null && !members.isEmpty()) { + html.append( + "
"); + for (Map member : members) { + html.append("
") + .append("\"")") + .append("

").append(getString(member, "name", "")) + .append("

").append("

") + .append(getString(member, "role", "")).append("

"); + + // Socials + List socials = (List) member.get("socials"); + if (socials != null && !socials.isEmpty()) { + html.append( + "
"); + for (String social : socials) { + html.append("") + .append(""); + } + html.append("
"); + } + + html.append("
"); + } + html.append("
"); + } + + // CTA Button + if (data.containsKey("button")) { + Map button = (Map) data.get("button"); + html.append(""); + } + + html.append("
"); + return html.toString(); + } + + private static String renderTeamSectionTemplate(Map data) { + StringBuilder html = new StringBuilder(); + String title = getString(data, "title", "Team"); + html.append("
") + .append("

").append(title).append("

"); + + List> variations = (List>) data.get("variations"); + if (variations != null) { + for (Map variation : variations) { + String layout = getString(variation, "layout", "grid"); + String sectionTitle = getString(variation, "sectionTitle", ""); + + html.append("
"); + html.append("

").append(sectionTitle).append("

"); + + if ("highlighted-center".equals(layout)) { + // Highlighted member at top + Map highlighted = (Map) variation.get("highlightedMember"); + if (highlighted != null) { + html.append( + "
") + .append("\"")").append("

") + .append(highlighted.get("name")).append("

").append("

") + .append(highlighted.get("role")).append("

") + .append("

") + .append(highlighted.get("bio")).append("

"); + + List socials = (List) highlighted.get("socials"); + if (socials != null) { + html.append("
"); + for (String soc : socials) { + html.append(""); + } + html.append("
"); + } + + html.append("
"); + } + } + + // Team grid + List> members = (List>) variation.get("members"); + if (members != null && !members.isEmpty()) { + html.append( + "
"); + for (Map member : members) { + html.append("
") + .append("\"")") + .append("

").append(member.get("name")).append("

") + .append("

").append(member.get("role")) + .append("

").append("
"); + } + html.append("
"); + } + + html.append("
"); + } + } + + html.append("
"); + return html.toString(); + } + + private static String renderTeamSlider(Map data) { + StringBuilder html = new StringBuilder(); + String title = getString(data, "title", "Our Team"); + String subtitle = getString(data, "subtitle", ""); + + html.append("
").append("

").append(title).append("

") + .append("

").append(subtitle).append("

").append("
"); + + List> members = (List>) data.get("members"); + if (members != null) { + for (Map member : members) { + html.append("
").append("\"").append(member.get("name")).append("\"").append("

") + .append(member.get("name")).append("

").append("

").append(member.get("role")) + .append("

").append("

").append(member.get("bio")).append("

"); + + List> socials = (List>) member.get("socials"); + if (socials != null) { + html.append("
"); + for (Map soc : socials) { + String platform = getString(soc, "platform", ""); + String link = getString(soc, "link", "#"); + html.append("") + .append(""); + } + html.append("
"); + } + + String profileLink = getString(member, "profileLink", ""); + if (!profileLink.isEmpty()) { + html.append(""); + } + + html.append("
"); + } + } + + html.append("
"); + return html.toString(); + } + + private static String renderSmartHeader(Map node) { + if (node.containsKey("buttons")) { + return renderHeaderWithButtons(node); // Case: logo + nav + buttons + } else if (node.containsKey("navMenu") || node.containsKey("icons")) { + return renderCustomHeader(node); // Case: navMenu with dropdowns/icons + } else { + return wrapTag("header", "navbar-1", node); // Fallback to generic header wrapper + } + } + + private static String renderSmartHeroSection(Map node) { + String layout = getString(node, "layout", "").toLowerCase(); + + if ((layout.contains("centered") || layout.equals("")) && node.containsKey("heading")) { + return renderHeroCenteredSection(node); // hero-centered + } + + if (layout.contains("left-text-right-cards")) { + return renderHeroLeftCards(node); + } + + if (layout.contains("two-column") || node.containsKey("rightImage") || node.containsKey("leftColumn")) { + return renderHeroTwoColumn(node); // 🔁 Standardized to use this one + } + + return wrapTag("section", "hero-section", node); // fallback + } + + private static String renderHeroTwoColumn(Map data) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Left Content + html.append("
"); + + Map heading = (Map) data.get("heading"); + html.append("

").append(heading.get("text")) + .append("

"); + + Map subheading = (Map) data.get("subheading"); + html.append("

").append(subheading.get("text")) + .append("

"); + + List> ctaButtons = (List>) data.get("ctaButtons"); + html.append("
"); + for (Map btn : ctaButtons) { + html.append(""); + } + html.append("
"); + + // Right Image + Map image = (Map) data.get("rightImage"); + html.append("
").append("\"").append(image.get("alt")).append("\"").append("
"); + + html.append("
"); + return html.toString(); + } + + private static String renderCenteredSectionWithImage(Map data) { + StringBuilder html = new StringBuilder(); + html.append("
\n"); + + // Tagline + Map tagline = (Map) data.get("tagline"); + if (tagline != null) { + html.append("

" + tagline.get("text") + "

\n"); + } + + // Heading + Map heading = (Map) data.get("heading"); + if (heading != null) { + html.append("

" + heading.get("text") + "

\n"); + } + + // Description + Map desc = (Map) data.get("description"); + if (desc != null) { + html.append("

" + desc.get("text") + "

\n"); + } + + // Buttons + List> buttons = (List>) data.get("buttons"); + if (buttons != null && !buttons.isEmpty()) { + html.append("
\n"); + for (Map btn : buttons) { + String label = (String) btn.get("label"); + String style = (String) btn.get("style"); + String cssClass = "filled".equalsIgnoreCase(style) ? "btn-filled" : "btn-outlined"; + html.append("" + label + "\n"); + } + html.append("
\n"); + } + + // Image + Map image = (Map) data.get("image"); + if (image != null) { + html.append("\""\n"); + } + + html.append("
\n"); + return html.toString(); + } + + @SuppressWarnings("unchecked") + private static List> getChildren(Map node) { + Object children = node.get("children"); + if (children instanceof List) { + return (List>) children; + } + return Collections.emptyList(); + } + + private static String renderFeatureSection(Map node) { + StringBuilder sb = new StringBuilder(); + sb.append("
"); + + List> children = getChildren(node); + + for (Map child : children) { + String type = getString(child, "type", ""); + + if ("img".equalsIgnoreCase(type)) { + sb.append("\"")"); + } else if ("div".equalsIgnoreCase(type)) { + sb.append("
"); + + List> divChildren = getChildren(child); + for (Map inner : divChildren) { + String innerType = getString(inner, "type", ""); + + if ("h2".equalsIgnoreCase(innerType)) { + sb.append("

").append(getString(inner, "content", "")) + .append("

"); + } else if ("p".equalsIgnoreCase(innerType)) { + sb.append("

").append(getString(inner, "content", "")) + .append("

"); + } else if ("ul".equalsIgnoreCase(innerType)) { + sb.append("
    "); + List> items = getChildren(inner); + for (Map li : items) { + sb.append("
  • ").append(getString(li, "content", "")).append("
  • "); + } + sb.append("
"); + } + } + + sb.append("
"); + } + } + + sb.append("
"); + return sb.toString(); + } + + private static String renderHeroCenteredHeadingSplit(Map section) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Heading with split text + Map heading = (Map) section.get("heading"); + if (heading != null && heading.containsKey("textParts")) { + html.append("

"); + List> parts = (List>) heading.get("textParts"); + for (Map part : parts) { + String text = (String) part.getOrDefault("text", ""); + String spanClass = (String) part.getOrDefault("class", ""); + html.append("").append(text).append(" "); + } + html.append("

"); + } + + // Description + Map description = (Map) section.get("description"); + if (description != null) { + html.append("

").append(description.get("text")).append("

"); + } + + html.append("
"); + return html.toString(); + } + + private static String renderHeaderWithButtons(Map data) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Logo + Map logo = (Map) data.get("logo"); + html.append("
\"")
"); + + // Nav Links + Map navLinks = (Map) data.get("navLinks"); + List> items = (List>) navLinks.get("items"); + html.append(""); + + // Buttons + html.append("
"); + List> buttons = (List>) data.get("buttons"); + for (Map btn : buttons) { + html.append(""); + } + html.append("
"); + + html.append("
"); + return html.toString(); + } + + private static String renderCustomHeader(Map data) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + // Logo + if (data.containsKey("logo")) { + Map logo = (Map) data.get("logo"); + html.append("
").append(logo.get("text")).append("
"); + } + + // Site Info + if (data.containsKey("siteInfo")) { + Map site = (Map) data.get("siteInfo"); + html.append("
"); + html.append("

").append(site.get("title")).append("

"); + html.append("

").append(site.get("description")).append("

"); + html.append("
"); + } + + // Navigation + if (data.containsKey("navMenu")) { + Map nav = (Map) data.get("navMenu"); + List> links = (List>) nav.get("links"); + + html.append("
    "); + for (Map link : links) { + boolean isActive = Boolean.TRUE.equals(link.get("active")); + boolean isDropdown = Boolean.TRUE.equals(link.get("dropdown")); + String label = (String) link.get("label"); + String href = (String) link.getOrDefault("href", "#"); + + if (isDropdown) { + html.append("
  • ").append(label) + .append("
    ") + .append("

    Menu

    • 📦Dropdown

      Sample

    ") + .append("
  • "); + } else { + html.append("
  • ") + .append(label).append("
  • "); + } + } + html.append("
"); + } + + // Icons + if (data.containsKey("icons")) { + html.append("
"); + List> icons = (List>) data.get("icons"); + for (Map icon : icons) { + html.append("").append(icon.get("symbol")).append(" "); + } + html.append("
"); + } + + html.append("
"); + return html.toString(); + } + + private static String renderTeamShowcase(Map data) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + html.append("

").append(data.get("title")).append("

"); + html.append("

").append(data.get("subtitle")).append("

"); + + List> groups = (List>) data.get("groups"); + for (Map group : groups) { + html.append("
"); + html.append("

").append(group.get("groupName")).append("

"); + html.append("
"); + + List> members = (List>) group.get("members"); + for (Map member : members) { + html.append("
"); + html.append("\"").append(member.get("name"))"); + html.append("
").append(member.get("name")).append("
"); + html.append("
").append(member.get("role")).append("
"); + html.append("
"); + } + + html.append("
"); + } + + html.append("
"); + return html.toString(); + } private static String formatKey(String key) { key = key.replaceAll("([a-z])([A-Z])", "$1 $2"); // camelCase to space @@ -1815,7 +4415,8 @@ public class HtmlBuilder3 { return "🔍"; if (label.contains("profile")) return "👤"; - if (label.contains("twitter")) return "🐦"; + if (label.contains("twitter")) + return "🐦"; if (label.contains("linkedin")) return "🔗"; diff --git a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/vpspack/Entity/SiteBuilder.java b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/vpspack/Entity/SiteBuilder.java index 766f004..14931b4 100644 --- a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/vpspack/Entity/SiteBuilder.java +++ b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/vpspack/Entity/SiteBuilder.java @@ -29,7 +29,10 @@ public class SiteBuilder extends Extension { private boolean active; - @Column(length = 10000) + @Column(columnDefinition = "TEXT") private String model; + @Column(columnDefinition = "TEXT") + private String prompt; + } diff --git a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/vpspack/Services/SiteBuilderService.java b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/vpspack/Services/SiteBuilderService.java index 1401589..7314be2 100644 --- a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/vpspack/Services/SiteBuilderService.java +++ b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/vpspack/Services/SiteBuilderService.java @@ -72,6 +72,10 @@ public class SiteBuilderService { old.setActive(data.isActive()); } + if (data.getPrompt() != null) { + old.setPrompt(data.getPrompt()); + } + old.setUpdatedBy(getUser().getUserId()); final SiteBuilder test = Repository.save(old);