{"id":21922,"date":"2026-04-12T09:56:57","date_gmt":"2026-04-12T01:56:57","guid":{"rendered":"https:\/\/believeindustry.company\/?page_id=21922"},"modified":"2026-10-14T17:42:17","modified_gmt":"2026-10-14T09:42:17","slug":"construcao-e-estrutura-de-aco","status":"publish","type":"page","link":"https:\/\/believeindustry.company\/pt\/construction-and-steel-structure\/","title":{"rendered":"Constru\u00e7\u00e3o e Estrutura Met\u00e1lica"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"21922\" class=\"elementor elementor-21922\" data-elementor-post-type=\"page\">\n\t\t\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-269f057 e-con-full e-flex e-con e-parent\" data-id=\"269f057\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-17aa41c elementor-widget elementor-widget-spacer\" data-id=\"17aa41c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-89c5dd9 elementor-widget elementor-widget-html\" data-id=\"89c5dd9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Construction & Steel Structure \u2013 All Products | Believe Industry<\/title>\n<meta name=\"description\" content=\"Browse all Construction & Steel Structure roll forming machines including purlin machines, deck machines, tile machines, and custom profile systems. All machines are custom-built to your specifications.\">\n<style>\n\/* ============================================\n   Design System \u2014 Clean Minimal (Matching Site Style)\n   ============================================ *\/\n:root {\n    --orange:    #E8720C;\n    --orange-lt:  #f97316;\n    --gray-50:    #f9fafb;\n    --gray-100:   #f3f4f6;\n    --gray-200:   #e5e7eb;\n    --gray-300:   #d1d5db;\n    --gray-400:   #9ca3af;\n    --gray-500:   #6b7280;\n    --gray-600:   #4b5563;\n    --gray-700:   #374151;\n    --gray-800:   #1f2937;\n    --gray-900:   #111827;\n    --font-head:   'Segoe UI', system-ui, -apple-system, sans-serif;\n    --font-body:   'Segoe UI', system-ui, -apple-system, sans-serif;\n    --radius-sm:   8px;\n    --radius-md:   12px;\n    --radius-lg:   16px;\n    --shadow-sm:    0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);\n    --shadow-md:    0 4px 12px rgba(0,0,0,0.07);\n    --shadow-lg:    0 10px 30px rgba(0,0,0,0.10);\n    --transition:   0.22s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n\/* ============================================\n   Reset & Base\n   ============================================ *\/\n*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\nbody {\n    font-family: var(--font-body);\n    color: var(--gray-800);\n    background: #fff;\n    line-height: 1.6;\n    -webkit-font-smoothing: antialiased;\n}\n\na { color: inherit; text-decoration: none; }\nimg { max-width: 100%; display: block; }\n\n\/* ============================================\n   Hero Section \u2014 Clean & Minimal\n   ============================================ *\/\n.cat-hero {\n    background: linear-gradient(180deg, #fff 0%, var(--gray-50) 100%);\n    padding: 72px 24px 56px;\n    text-align: center;\n    border-bottom: 3px solid var(--orange);\n}\n\n.cat-hero__tag {\n    display: inline-block;\n    font-size: 11px;\n    font-weight: 700;\n    letter-spacing: 0.14em;\n    text-transform: uppercase;\n    color: var(--orange);\n    background: rgba(232,114,12,0.08);\n    border: 1px solid rgba(232,114,12,0.18);\n    padding: 5px 16px;\n    border-radius: 100px;\n    margin-bottom: 20px;\n}\n\n.cat-hero__title {\n    font-family: var(--font-head);\n    font-size: clamp(28px, 4.5vw, 42px);\n    font-weight: 800;\n    color: var(--gray-900);\n    line-height: 1.15;\n    margin-bottom: 16px;\n    letter-spacing: -0.02em;\n}\n\n.cat-hero__desc {\n    font-size: 15px;\n    color: var(--gray-500);\n    line-height: 1.75;\n    max-width: 560px;\n    margin: 0 auto 32px;\n}\n\n.cat-hero__btns {\n    display: flex;\n    gap: 12px;\n    justify-content: center;\n    flex-wrap: wrap;\n}\n\n.cat-hero__btn {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    font-size: 14px;\n    font-weight: 600;\n    padding: 11px 28px;\n    border-radius: 100px;\n    border: 1.5px solid var(--gray-300);\n    color: var(--gray-700);\n    background: #fff;\n    transition: var(--transition);\n    cursor: pointer;\n}\n.cat-hero__btn:hover {\n    border-color: var(--gray-400);\n    background: var(--gray-50);\n    box-shadow: var(--shadow-sm);\n}\n.cat-hero__btn--primary {\n    background: var(--orange);\n    color: #fff;\n    border-color: var(--orange);\n}\n.cat-hero__btn--primary:hover {\n    background: var(--orange-lt);\n    border-color: var(--orange-lt);\n    box-shadow: 0 4px 16px rgba(232,114,12,0.25);\n}\n\n\/* ============================================\n   Section (Product Grid Area)\n   ============================================ *\/\n.cat-section {\n    max-width: 1200px;\n    margin: 0 auto;\n    padding: 48px 24px 64px;\n}\n\n.cat-section__header {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    margin-bottom: 32px;\n    flex-wrap: wrap;\n    gap: 12px;\n}\n\n.cat-section__count {\n    font-size: 13px;\n    font-weight: 600;\n    color: var(--gray-500);\n    letter-spacing: 0.02em;\n}\n.cat-section__count em {\n    font-style: normal;\n    color: var(--gray-900);\n    font-weight: 800;\n}\n\n\/* ============================================\n   Search Bar \u2014 Clean Style\n   ============================================ *\/\n.cat-search {\n    margin-bottom: 40px;\n    position: relative;\n}\n\n.cat-search__inner {\n    display: flex;\n    align-items: stretch;\n    border: 1.5px solid var(--gray-200);\n    border-radius: var(--radius-sm);\n    background: #fff;\n    transition: border-color 0.22s, box-shadow 0.22s;\n}\n.cat-search__inner:focus-within {\n    border-color: var(--orange);\n    box-shadow: 0 0 0 3px rgba(232,114,12,0.1), var(--shadow-sm);\n}\n\n.cat-search__icon {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    width: 48px;\n    min-width: 48px;\n    background: var(--gray-50);\n    border-right: 1px solid var(--gray-200);\n    border-radius: var(--radius-sm) 0 0 var(--radius-sm);\n}\n.cat-search__icon svg { opacity: 0.4; }\n\n.cat-search__input {\n    flex: 1;\n    border: none;\n    outline: none;\n    font-family: var(--font-body);\n    font-size: 14px;\n    font-weight: 500;\n    color: var(--gray-800);\n    padding: 12px 14px;\n    background: transparent;\n}\n.cat-search__input::placeholder {\n    color: var(--gray-400);\n    font-weight: 400;\n}\n\n.cat-search__clear {\n    display: none;\n    align-items: center;\n    justify-content: center;\n    width: 40px;\n    min-width: 40px;\n    background: none;\n    border: none;\n    cursor: pointer;\n    color: var(--gray-400);\n    font-size: 18px;\n    transition: color 0.2s;\n}\n.cat-search__clear:hover { color: var(--orange); }\n.cat-search__clear.visible { display: flex; }\n\n.cat-search__match {\n    font-size: 12px;\n    color: var(--gray-500);\n    margin-top: 10px;\n    min-height: 18px;\n    font-weight: 500;\n}\n.cat-search__match em {\n    font-style: normal;\n    color: var(--orange);\n    font-weight: 700;\n}\n\n\/* ============================================\n   Product Grid\n   ============================================ *\/\n.cat-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));\n    gap: 24px;\n}\n\n\/* ============================================\n   Product Card\n   ============================================ *\/\n.cat-card {\n    background: #fff;\n    border: 1px solid var(--gray-200);\n    border-radius: var(--radius-md);\n    overflow: hidden;\n    transition: transform var(--transition), box-shadow var(--transition), border-color var(--transition);\n    display: flex;\n    flex-direction: column;\n}\n.cat-card:hover {\n    transform: translateY(-4px);\n    box-shadow: var(--shadow-lg);\n    border-color: var(--gray-300);\n}\n\n.cat-grid .cat-card__img {\n    width: 100% !important;\n    height: 220px !important;\n    object-fit: cover !important;\n    display: block;\n    background: var(--gray-100);\n}\n\n.cat-grid .cat-card__img-placeholder {\n    width: 100% !important;\n    height: 220px !important;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    background: linear-gradient(135deg, var(--gray-100), var(--gray-200));\n    color: var(--gray-400);\n    font-size: 36px;\n    font-weight: 800;\n    font-family: var(--font-head);\n}\n\n.cat-card__body {\n    padding: 24px;\n    display: flex;\n    flex-direction: column;\n    flex: 1;\n}\n\n.cat-card__badge {\n    display: inline-block;\n    font-size: 10px;\n    font-weight: 700;\n    letter-spacing: 0.1em;\n    text-transform: uppercase;\n    color: var(--gray-600);\n    background: var(--gray-100);\n    border-radius: 100px;\n    padding: 3px 10px;\n    margin-bottom: 12px;\n    align-self: flex-start;\n}\n\n.cat-card__title {\n    font-family: var(--font-head);\n    font-size: 17px;\n    font-weight: 700;\n    color: var(--gray-900);\n    line-height: 1.35;\n    margin-bottom: 10px;\n    transition: color 0.2s;\n}\n.cat-card:hover .cat-card__title {\n    color: var(--orange);\n}\n\n.cat-card__excerpt {\n    font-size: 13px;\n    color: var(--gray-500);\n    line-height: 1.7;\n    margin-bottom: 20px;\n    flex: 1;\n}\n\n.cat-card__link {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    font-size: 13px;\n    font-weight: 600;\n    color: var(--orange);\n    transition: gap 0.2s;\n}\n.cat-card__link:hover {\n    gap: 10px;\n}\n.cat-card__link svg {\n    transition: transform 0.2s;\n}\n.cat-card__link:hover svg {\n    transform: translateX(3px);\n}\n\n\/* Highlight match *\/\n.cat-card__title mark,\n.cat-card__excerpt mark {\n    background: rgba(232,114,12,0.15);\n    color: var(--orange);\n    border-radius: 2px;\n    padding: 0 2px;\n}\n\n\/* Empty state *\/\n.cat-grid__empty {\n    display: none;\n    grid-column: 1 \/ -1;\n    text-align: center;\n    padding: 80px 20px;\n    border: 1px solid var(--gray-200);\n    border-radius: var(--radius-md);\n    background: var(--gray-50);\n}\n.cat-grid__empty.visible { display: block; }\n.cat-grid__empty-icon { font-size: 48px; margin-bottom: 16px; opacity: 0.25; }\n.cat-grid__empty-title {\n    font-size: 17px;\n    font-weight: 700;\n    color: var(--gray-700);\n    margin-bottom: 8px;\n}\n.cat-grid__empty-desc {\n    font-size: 14px;\n    color: var(--gray-400);\n    line-height: 1.7;\n}\n\n\/* ============================================\n   Loading Skeleton\n   ============================================ *\/\n.cat-skeleton {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));\n    gap: 24px;\n}\n.cat-skeleton__card {\n    background: #fff;\n    border: 1px solid var(--gray-200);\n    border-radius: var(--radius-md);\n    overflow: hidden;\n}\n.cat-skeleton__img {\n    width: 100%;\n    height: 220px;\n    background: linear-gradient(90deg, var(--gray-100) 25%, var(--gray-200) 50%, var(--gray-100) 75%);\n    background-size: 200% 100%;\n    animation: shimmer 1.4s infinite;\n}\n.cat-skeleton__body {\n    padding: 24px;\n}\n.cat-skeleton__line {\n    height: 12px;\n    border-radius: 6px;\n    background: linear-gradient(90deg, var(--gray-100) 25%, var(--gray-200) 50%, var(--gray-100) 75%);\n    background-size: 200% 100%;\n    animation: shimmer 1.4s infinite;\n    margin-bottom: 10px;\n}\n.cat-skeleton__line--short { width: 60%; }\n.cat-skeleton__line--long  { width: 100%; }\n\n@keyframes shimmer {\n    0%   { background-position: 200% 0; }\n    100% { background-position: -200% 0; }\n}\n\n\/* Loading badge *\/\n.cat-loading-badge {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    font-size: 12px;\n    font-weight: 600;\n    color: var(--gray-500);\n}\n.cat-loading-badge .dot {\n    width: 6px;\n    height: 6px;\n    border-radius: 50%;\n    background: var(--orange);\n    animation: pulse 1s infinite;\n}\n@keyframes pulse {\n    0%, 100% { opacity: 0.3; }\n    50%      { opacity: 1; }\n}\n\n\/* Error state *\/\n.cat-error {\n    display: none;\n    grid-column: 1 \/ -1;\n    text-align: center;\n    padding: 60px 20px;\n    border: 1px solid var(--gray-200);\n    border-radius: var(--radius-md);\n    background: var(--gray-50);\n}\n.cat-error.visible { display: block; }\n.cat-error__icon { font-size: 40px; margin-bottom: 16px; opacity: 0.3; }\n.cat-error__title {\n    font-size: 17px;\n    font-weight: 700;\n    color: var(--gray-700);\n    margin-bottom: 8px;\n}\n.cat-error__desc {\n    font-size: 14px;\n    color: var(--gray-400);\n    line-height: 1.7;\n    margin-bottom: 16px;\n}\n.cat-error__retry {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    font-size: 13px;\n    font-weight: 600;\n    color: #fff;\n    background: var(--orange);\n    border: 1.5px solid var(--orange);\n    padding: 9px 24px;\n    border-radius: 100px;\n    cursor: pointer;\n    transition: var(--transition);\n}\n.cat-error__retry:hover {\n    background: var(--orange-lt);\n    border-color: var(--orange-lt);\n}\n\n\/* ============================================\n   CTA Section\n   ============================================ *\/\n.cat-cta {\n    max-width: 800px;\n    margin: 64px auto 0;\n    text-align: center;\n    background: var(--gray-50);\n    border: 1px solid var(--gray-200);\n    border-radius: var(--radius-lg);\n    padding: 48px 32px;\n}\n\n.cat-cta__title {\n    font-family: var(--font-head);\n    font-size: 22px;\n    font-weight: 800;\n    color: var(--gray-900);\n    margin-bottom: 12px;\n}\n\n.cat-cta__desc {\n    font-size: 14px;\n    color: var(--gray-500);\n    line-height: 1.75;\n    margin-bottom: 28px;\n    max-width: 480px;\n    margin-left: auto;\n    margin-right: auto;\n}\n\n.cat-cta__btns {\n    display: flex;\n    gap: 12px;\n    justify-content: center;\n    flex-wrap: wrap;\n}\n\n.cat-cta__btn {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    font-size: 14px;\n    font-weight: 600;\n    padding: 11px 28px;\n    border-radius: 100px;\n    transition: var(--transition);\n    cursor: pointer;\n}\n.cat-cta__btn--outline {\n    border: 1.5px solid var(--gray-300);\n    color: var(--gray-700);\n    background: #fff;\n}\n.cat-cta__btn--outline:hover {\n    border-color: var(--gray-400);\n    box-shadow: var(--shadow-sm);\n}\n.cat-cta__btn--primary {\n    background: var(--orange);\n    color: #fff;\n    border: 1.5px solid var(--orange);\n}\n.cat-cta__btn--primary:hover {\n    background: var(--orange-lt);\n    border-color: var(--orange-lt);\n    box-shadow: 0 4px 16px rgba(232,114,12,0.25);\n}\n\n\/* ============================================\n   Responsive\n   ============================================ *\/\n@media (max-width: 768px) {\n    .cat-hero { padding: 48px 16px 40px; }\n    .cat-section { padding: 32px 16px 48px; }\n    .cat-grid, .cat-skeleton {\n        grid-template-columns: 1fr;\n        gap: 16px;\n    }\n    .cat-grid .cat-card__img,\n    .cat-grid .cat-card__img-placeholder,\n    .cat-skeleton .cat-skeleton__img { height: 180px !important; }\n    .cat-hero__btns { flex-direction: column; align-items: center; }\n    .cat-cta { padding: 32px 20px; }\n    .cat-cta__btns { flex-direction: column; align-items: center; }\n}\n<\/style>\n<\/head>\n<body>\n\n<!-- ============================================\n     Hero Section\n     ============================================ -->\n<section class=\"cat-hero\">\n    <div class=\"cat-hero__tag\">Product Catalog<\/div>\n    <h1 class=\"cat-hero__title\">Construction &amp; Steel Structure<\/h1>\n    <p class=\"cat-hero__desc\">\n        Explore our full range of roll forming machines for construction and steel structure applications \u2014 including purlin, deck, tile, and custom profile systems. All machines are custom-built to your profile drawings and production requirements.\n    <\/p>\n    <div class=\"cat-hero__btns\">\n        <a href=\"https:\/\/believeindustry.company\/contact\/\" class=\"cat-hero__btn cat-hero__btn--outline\">About Us<\/a>\n        <a href=\"https:\/\/believeindustry.company\/contact\/\" class=\"cat-hero__btn cat-hero__btn--primary\">Email Us<\/a>\n    <\/div>\n<\/section>\n\n<!-- ============================================\n     Product Section\n     ============================================ -->\n<section class=\"cat-section\">\n\n    <div class=\"cat-section__header\">\n        <div><\/div>\n        <span class=\"cat-section__count\" id=\"catCount\">\n            <span class=\"cat-loading-badge\"><span class=\"dot\"><\/span> Loading products...<\/span>\n        <\/span>\n    <\/div>\n\n    <!-- Search Bar -->\n    <div class=\"cat-search\">\n        <div class=\"cat-search__inner\">\n            <div class=\"cat-search__icon\">\n                <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#666\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"M16 16l5 5\"\/><\/svg>\n            <\/div>\n            <input\n                type=\"text\"\n                class=\"cat-search__input\"\n                id=\"catSearchInput\"\n                placeholder=\"Search machines... e.g. purlin, deck, tile, roof...\"\n                autocomplete=\"off\"\n                spellcheck=\"false\"\n                disabled\n            >\n            <button class=\"cat-search__clear\" id=\"catSearchClear\" type=\"button\" aria-label=\"Clear search\">&times;<\/button>\n        <\/div>\n        <div class=\"cat-search__match\" id=\"catSearchMatch\"><\/div>\n    <\/div>\n\n    <!-- Loading skeleton -->\n    <div class=\"cat-skeleton\" id=\"catSkeleton\">\n        <div class=\"cat-skeleton__card\">\n            <div class=\"cat-skeleton__img\"><\/div>\n            <div class=\"cat-skeleton__body\">\n                <div class=\"cat-skeleton__line cat-skeleton__line--short\"><\/div>\n                <div class=\"cat-skeleton__line cat-skeleton__line--long\"><\/div>\n                <div class=\"cat-skeleton__line cat-skeleton__line--long\"><\/div>\n                <div class=\"cat-skeleton__line cat-skeleton__line--short\"><\/div>\n            <\/div>\n        <\/div>\n        <div class=\"cat-skeleton__card\">\n            <div class=\"cat-skeleton__img\"><\/div>\n            <div class=\"cat-skeleton__body\">\n                <div class=\"cat-skeleton__line cat-skeleton__line--short\"><\/div>\n                <div class=\"cat-skeleton__line cat-skeleton__line--long\"><\/div>\n                <div class=\"cat-skeleton__line cat-skeleton__line--long\"><\/div>\n                <div class=\"cat-skeleton__line cat-skeleton__line--short\"><\/div>\n            <\/div>\n        <\/div>\n        <div class=\"cat-skeleton__card\">\n            <div class=\"cat-skeleton__img\"><\/div>\n            <div class=\"cat-skeleton__body\">\n                <div class=\"cat-skeleton__line cat-skeleton__line--short\"><\/div>\n                <div class=\"cat-skeleton__line cat-skeleton__line--long\"><\/div>\n                <div class=\"cat-skeleton__line cat-skeleton__line--long\"><\/div>\n                <div class=\"cat-skeleton__line cat-skeleton__line--short\"><\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Product grid (populated dynamically) -->\n    <div class=\"cat-grid\" id=\"catGrid\" style=\"display:none;\">\n\n        <!-- Empty state -->\n        <div class=\"cat-grid__empty\" id=\"catGridEmpty\">\n            <div class=\"cat-grid__empty-icon\">&#8981;<\/div>\n            <div class=\"cat-grid__empty-title\">No Machines Found<\/div>\n            <div class=\"cat-grid__empty-desc\">Try a different keyword. Search covers machine names and descriptions.<\/div>\n        <\/div>\n\n        <!-- Error state -->\n        <div class=\"cat-error\" id=\"catError\">\n            <div class=\"cat-error__icon\">&#9888;<\/div>\n            <div class=\"cat-error__title\">Failed to Load Products<\/div>\n            <div class=\"cat-error__desc\">There was a problem fetching the latest products. Please check your connection and try again.<\/div>\n            <button class=\"cat-error__retry\" id=\"catRetry\" type=\"button\">Retry<\/button>\n        <\/div>\n    <\/div><!-- \/cat-grid -->\n\n    <!-- CTA -->\n    <div class=\"cat-cta\">\n        <h2 class=\"cat-cta__title\">Can't Find The Machine You Need?<\/h2>\n        <p class=\"cat-cta__desc\">All our machines are custom-built to your profile drawings and production requirements. Contact our engineering team today to discuss your project and get a tailored solution.<\/p>\n        <div class=\"cat-cta__btns\">\n            <a href=\"https:\/\/believeindustry.company\/contact\/\" class=\"cat-cta__btn cat-cta__btn--outline\">About Us<\/a>\n            <a href=\"https:\/\/believeindustry.company\/contact\/\" class=\"cat-cta__btn cat-cta__btn--primary\">Email Us<\/a>\n        <\/div>\n    <\/div>\n\n<\/section>\n\n<script>\n\/* ============================================\n   Dynamic Product Loader\n   Fetches latest products from WordPress REST API\n   ============================================ *\/\n(function () {\n    'use strict';\n\n    \/* ===== Configuration ===== *\/\n    var TAG_SLUG = 'construction-and-steel-structure';\n    var API_BASE = 'https:\/\/believeindustry.company\/wp-json\/wp\/v2';\n\n    \/* ===== Cached \/ fallback products (rendered instantly \u2014 never waits) ===== *\/\n    var STATIC_PRODUCTS = [\n      {\"title\": \"B Deck Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/customized-profile-roll-forming-machine\/b-deck-roll-forming-machine\/\", \"excerpt\": \"B Deck Roll Forming Machine( also named as B deck roll former) is for producing B Deck. Which is the most common structural metal decking in the industry in US market.. What\u2019s B Deck? B Deck is an...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2021\/08\/B-Deck-Roll-Forming-Machine.jpg\"},\n      {\"title\": \"Klip-Lok Roof Sheet Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/klip-lok-roof-sheet-roll-forming-machine\/\", \"excerpt\": \"Klip-Lok Roof Sheet Roll Forming Machine also named Clip Lock Roof Sheet Roll Forming Machine, which is for producing klip-lok 700 or klip-lok 406 roof sheets as desired length. Klip-Lok Roof Sheet...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2019\/07\/cropped-klip-lok-roof-sheet-roll-forming-machine.jpg\"},\n      {\"title\": \"Multibeam Purlin Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/purlin-roll-forming-machine\/multibeam-purlin-roll-forming-machine\/\", \"excerpt\": \"Multibeam Purlin Roll Forming Machine Multibeam Purlin Roll Forming Machine is for producing Omega Purlin with web size from 100-450 mm, flange from 60-100 mm. And with simple adjustment, the machine...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2019\/06\/cropped-multibeam-roll-forming-machine.jpg\"},\n      {\"title\": \"AG Panel Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/ag-panel-roll-forming-machine\/\", \"excerpt\": \"An AG Panel Roll Forming Machine is an industrial machine that continuously shapes flat metal coils (typically steel or aluminum) into the finished, ribbed profile known as the AG (Agricultural)...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2023\/06\/AG-Panel-Roll-Forming-Machine.jpg\"},\n      {\"title\": \"Multibeam Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/purlin-roll-forming-machine\/multibeam-roll-forming-machine\/\", \"excerpt\": \"Multibeam Roll Forming Machine is for producing series sizes of multi beams as per requirements. Multibeam Roll Forming Machine What\u2019s Multibeam? Multibeam is a range of purlin and cladding rail...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2019\/03\/multibeam-roll-forming-machine.png\"},\n      {\"title\": \"Ceiling Channel Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/customized-profile-roll-forming-machine\/ceiling-channel-roll-forming-machine\/\", \"excerpt\": \"Believe Industry Company\u2019s Ceiling Chanel Roll Forming Machine can manufacturing C Channel, Wall Angle, POP Channel, False Ceiling, Furring Channel as per requirements.\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2019\/01\/ceiling-channel-roll-forming-machine-supplier.jpg\"},\n      {\"title\": \"Interchangeable C\/Z Purlin Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/interchangeable-c-z-purlin-roll-forming-machine-2\/\", \"excerpt\": \"Interchangeable c\/z purlin roll forming machine produce cee and zed purlins with various sizes. And the size adjustment is whole automatic A traditional c or z purlin roll forming machine only can...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2018\/10\/cutoff-device-of-c-and-z-purlin-machine.png\"},\n      {\"title\": \"Glazed Tile Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/glazed-tile-roll-forming-machine\/\", \"excerpt\": \"Glazed Tile Roll Forming Machine is for produce metal glazed tiles as desired drawings. Believe Industry Company new design tile machine speed can be up to 6m per minute. Glazed Tile Roll Forming...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2018\/10\/glazed-tile-roll-forming-machine-line-.jpg\"},\n      {\"title\": \"Stud And Track Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/customized-profile-roll-forming-machine\/metal-stud-and-track-roll-forming-machine\/\", \"excerpt\": \"What Is a Stud and Track Roll Forming Machine? A stud and track roll forming machine is a cold roll forming system that manufactures steel studs and U-shaped tracks for light steel frame (LSF)...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2026\/05\/c-stud-machine-puncher-and-cutter1.webp\"},\n      {\"title\": \"Steel Tile Profile Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/steel-tile-profile-roll-forming-machine\/\", \"excerpt\": \"Steel Tile Profile Roll Forming Machine is for producing steel tile profiles as desired design.  The latest design depth is up to 30mm.\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2018\/08\/Tile-Profile-Roll-Forming-Machine.jpg\"},\n      {\"title\": \"Box Profile Roofing Sheets Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/box-profile-roofing-sheets-roll-forming-machine\/\", \"excerpt\": \"Box Profile Roofing Sheets Roll Forming Machine is for producing Box Profile Roofing Sheets which are widely used in GBR. Believe Industry have a full range of roll forming machines for Box profiles...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2018\/07\/box-profile-roofing-sheets-roll-forming-machine.jpg\"},\n      {\"title\": \"Monterey V1100 Tile Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/monterey-v1100-tile-roll-forming-machine-for-sale\/\", \"excerpt\": \"Believe Industry have different design of  Monterey V1100 Tile Roll Forming Machine for sale  and all the machines are fully customized.\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2018\/06\/The-Monterey-V1100-Tile-Roll-Forming-Machine.jpg\"},\n      {\"title\": \"Widespan Roof Sheeting Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/widespan-roof-sheeting-roll-forming-machine\/\", \"excerpt\": \"A Widespan Roof Sheeting Roll Forming Machine is an industrial manufacturing system built to continuously shape flat metal coils into durable roofing sheets. Furthermore, this heavy-duty equipment...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2025\/12\/widespan-roofing-sheet-roll-former.webp\"},\n      {\"title\": \"Standing Seam Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/standing-seam-roll-forming-machine\/\", \"excerpt\": \"A Standing Seam Roll Forming Machine is an automated production line that shapes metal coils (aluminum, steel, or copper) into roofing panels with vertical ribs and concealed fasteners. By utilizing...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2025\/12\/Standing-Seaming-Roll-Forming-Machine.webp\"},\n      {\"title\": \"Steel Floor Deck Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/customized-profile-roll-forming-machine\/steel-floor-deck-roll-forming-machine\/\", \"excerpt\": \"Steel Floor Deck Roll Forming Machine is for producing Metal Floor Decks with the thickness up to 2.0mm, yield strength 550 MPA\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2018\/06\/composite-floor-deck-roll-forming-machine-2.jpg\"},\n      {\"title\": \"Bemo Sheet Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/bemo-sheet-roll-forming-machine\/\", \"excerpt\": \"A Bemo sheet roll forming machine is a large, powerful system that bends flat metal coils into special Bemo roof panels. This fast machine stops the need for slow hand-bending. It uses hard steel...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2026\/04\/bemo-sheet-roll-forming-machine.webp\"},\n      {\"title\": \"Roof Ridge Cap Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/roof-ridge-cap-roll-forming-machine\/\", \"excerpt\": \"The Ridge Cap Roll Forming Machine is an essential piece of equipment for producing high-quality roof ridge caps used in modern steel building systems. At Beli RollForming, we specialize in...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2025\/12\/ridge-cap-roll-forming-machine.webp\"},\n      {\"title\": \"Z Purlin Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/purlin-roll-forming-machine\/z-purlin-roll-forming-machine\/\", \"excerpt\": \"Z  Purlin Roll Forming Machine is used to produce Z Purlins, which webs width is 80-350mm, flange width is 35-80mm, thickness is 1.5-5mm.\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2018\/04\/z-purlin-roll-forming-machine-e1522733510258.jpg\"},\n      {\"title\": \"C Purlin Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/purlin-roll-forming-machine\/c-purlin-roll-forming-machine\/\", \"excerpt\": \"C Purlin Roll Forming Machine is the primary solution for manufacturing high-quality structural steel profiles used in modern industrial buildings. At Beli RollForming, we take pride in being a...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2025\/12\/cee-purlin-roll-former.webp\"},\n      {\"title\": \"Metal Roof Tile Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/metal-roof-tile-roll-forming-machine\/\", \"excerpt\": \"Metal Roof Tile Roll Forming Machine is for producing the metal tiles which is similar to traditional tiles. While the quality and life is better.\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2018\/04\/roof-tile-roll-forming-machine-e1522726193554.jpg\"},\n      {\"title\": \"Double Layer Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/double-layer-roll-forming-machine\/\", \"excerpt\": \"A Double Layer Roll Forming Machine is an advanced industrial manufacturing system designed to produce two distinct metal profiles on a single machine base. Consequently, this innovative equipment...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2025\/12\/Double-Layer-Machine-.webp\"},\n      {\"title\": \"Corrugated Sheet Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/corrugated-sheet-roll-forming-machine\/\", \"excerpt\": \"Corrugated Sheet Roll Forming Machine is a special which can produce various width of sheets without any mould change, only adjusting the feeding guiding. What\u2019s Corrugated Sheet? Corrugated sheet is...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2018\/05\/corrugated-roofing-sheet-roll-former.webp\"},\n      {\"title\": \"C Z Purlin Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/purlin-roll-forming-machine\/c-z-purlin-roll-forming-machine\/\", \"excerpt\": \"C  Z Purlin Roll Forming Machine is for producing C and Z Purlins with less change over time.  BELI\u00ae new technology design, exchange time is only 2 minutes. Our latest design c and z purlin machine...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2025\/12\/high-speed-c-z-purlin-roll-forming-machine.webp\"},\n      {\"title\": \"IBR Sheet Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/ibr-sheet-roll-forming-machine\/\", \"excerpt\": \"IBR Sheet Roll Forming Machine is for producing IBR sheets for South African Market.  IBR Sheet Roll Forming Machine What\u2019s IBR  Sheets? Since it was first introduced to South Africa in 1958, IBR has...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2018\/06\/ibr-roof-sheet-making-machine-line.jpg\"},\n      {\"title\": \"Roofing Sheet Roll Forming Machine\", \"link\": \"https:\/\/believeindustry.company\/roll-forming-machine\/metal-sheet-roll-forming-machine\/roofing-sheet-roll-forming-machine\/\", \"excerpt\": \"Roofing Sheet Roll Forming Machine is designed to produce various kinds of roofing sheets, wall cladding as per design drawing with desired length. The thickness is normal from 0.2 to 0.8mm and the...\", \"image\": \"https:\/\/believeindustry.company\/wp-content\/uploads\/2018\/06\/roof-sheet-roll-forming-machine_\u526f\u672c.jpg\"}\n    ];\n\n    \/* ===== DOM References ===== *\/\n    var skeleton = document.getElementById('catSkeleton');\n    var grid     = document.getElementById('catGrid');\n    var countEl  = document.getElementById('catCount');\n    var errorEl  = document.getElementById('catError');\n    var retryBtn = document.getElementById('catRetry');\n    var emptyEl  = document.getElementById('catGridEmpty');\n    var input    = document.getElementById('catSearchInput');\n    var clearBtn = document.getElementById('catSearchClear');\n    var matchEl  = document.getElementById('catSearchMatch');\n\n    var products = [];\n    var total    = 0;\n    var lastRendered = null; \/\/ last product set rendered, to skip no-op background re-render\n\n    \/* ===== Utility Functions ===== *\/\n\n    \/* Debounce *\/\n    function debounce(fn, ms) {\n        var timer;\n        return function () {\n            clearTimeout(timer);\n            timer = setTimeout(fn, ms);\n        };\n    }\n\n    \/* Strip HTML tags *\/\n    function stripHtml(html) {\n        var tmp = document.createElement('div');\n        tmp.innerHTML = html;\n        return (tmp.textContent || '').trim();\n    }\n\n    \/* Truncate text *\/\n    function truncate(text, max) {\n        if (text.length <= max) return text;\n        return text.slice(0, max).replace(\/\\s+\\S*$\/, '') + '...';\n    }\n\n    \/* Extract a badge\/category label from title *\/\n    function getBadge(title) {\n        var t = title.toLowerCase();\n        if (t.indexOf('purlin') !== -1 && t.indexOf('c\/z') !== -1) return 'C\/Z Purlin';\n        if (t.indexOf('purlin') !== -1 && t.indexOf('c ') !== -1)   return 'C Purlin';\n        if (t.indexOf('purlin') !== -1 && t.indexOf('z ') !== -1)   return 'Z Purlin';\n        if (t.indexOf('purlin') !== -1)                              return 'Purlin';\n        if (t.indexOf('deck') !== -1)                                return 'Deck';\n        if (t.indexOf('tile') !== -1)                                return 'Tile';\n        if (t.indexOf('roof') !== -1 && t.indexOf('sheet') !== -1)   return 'Roof Sheet';\n        if (t.indexOf('roof') !== -1)                                return 'Roof';\n        if (t.indexOf('standing seam') !== -1)                       return 'Standing Seam';\n        if (t.indexOf('ibr') !== -1)                                 return 'IBR Sheet';\n        if (t.indexOf('corrugated') !== -1)                          return 'Corrugated';\n        if (t.indexOf('box profile') !== -1)                         return 'Box Profile';\n        if (t.indexOf('glazed') !== -1)                              return 'Glazed Tile';\n        if (t.indexOf('monterey') !== -1)                            return 'Monterey';\n        if (t.indexOf('double layer') !== -1)                        return 'Double Layer';\n        if (t.indexOf('b deck') !== -1)                              return 'B Deck';\n        if (t.indexOf('klip') !== -1)                                return 'Klip-Lok';\n        if (t.indexOf('ag panel') !== -1)                            return 'AG Panel';\n        if (t.indexOf('bemo') !== -1)                                return 'Bemo Sheet';\n        if (t.indexOf('widespan') !== -1)                            return 'Widespan';\n        if (t.indexOf('stud') !== -1)                                return 'Stud & Track';\n        if (t.indexOf('ceiling') !== -1)                             return 'Ceiling Channel';\n        if (t.indexOf('ridge') !== -1)                               return 'Ridge Cap';\n        if (t.indexOf('steel') !== -1)                               return 'Steel Profile';\n        return 'Machine';\n    }\n\n    \/* Fetch with timeout *\/\n    function fetchJSON(url, timeoutMs) {\n        return new Promise(function (resolve, reject) {\n            var controller = new AbortController();\n            var timer = setTimeout(function () {\n                controller.abort();\n                reject(new Error('Request timeout'));\n            }, timeoutMs || 10000);\n\n            fetch(url, { signal: controller.signal })\n                .then(function (res) {\n                    clearTimeout(timer);\n                    if (!res.ok) throw new Error('HTTP ' + res.status);\n                    return res.json();\n                })\n                .then(function (data) {\n                    clearTimeout(timer);\n                    resolve(data);\n                })\n                .catch(function (err) {\n                    clearTimeout(timer);\n                    reject(err);\n                });\n        });\n    }\n\n    \/* ===== Main Loading Logic ===== *\/\n\n    function showSkeleton() {\n        skeleton.style.display = '';\n        grid.style.display = 'none';\n        countEl.innerHTML = '<span class=\"cat-loading-badge\"><span class=\"dot\"><\/span> Loading products...<\/span>';\n        input.disabled = true;\n    }\n\n    function hideSkeleton() {\n        skeleton.style.display = 'none';\n        grid.style.display = '';\n        input.disabled = false;\n    }\n\n    function showError(msg) {\n        hideSkeleton();\n        errorEl.classList.add('visible');\n        countEl.innerHTML = '<em style=\"color:#ef4444;\">Error<\/em>';\n    }\n\n    \/* Step 1: Get tag ID by slug *\/\n    function getTagId() {\n        return fetchJSON(API_BASE + '\/tags?slug=' + TAG_SLUG).then(function (tags) {\n            if (!tags || tags.length === 0) throw new Error('Tag not found: ' + TAG_SLUG);\n            return tags[0].id;\n        });\n    }\n\n    \/* Step 2: Get all posts with that tag *\/\n    function getPosts(tagId) {\n        return fetchJSON(\n            API_BASE + '\/posts?tags=' + tagId +\n            '&per_page=100&_fields=id,title,link,excerpt,featured_media'\n        ).then(function (posts) {\n            if (!posts || posts.length === 0) throw new Error('No posts found');\n            return posts;\n        });\n    }\n\n    \/* Step 3: Batch get featured media URLs *\/\n    function getMediaUrls(posts) {\n        var mediaIds = posts\n            .map(function (p) { return p.featured_media; })\n            .filter(function (id) { return id && id > 0; });\n\n        if (mediaIds.length === 0) {\n            return Promise.resolve({});\n        }\n\n        return fetchJSON(\n            API_BASE + '\/media?include=' + mediaIds.join(',') +\n            '&per_page=100&_fields=id,source_url'\n        ).then(function (media) {\n            var map = {};\n            media.forEach(function (m) { map[m.id] = m.source_url; });\n            return map;\n        }).catch(function () {\n            return {};\n        });\n    }\n\n    \/* Normalise WP posts + media map into plain product objects *\/\n    function normalize(posts, mediaMap) {\n        return posts.map(function (p) {\n            return {\n                title:   stripHtml(p.title && p.title.rendered || ''),\n                link:    p.link || '#',\n                excerpt: truncate(stripHtml(p.excerpt && p.excerpt.rendered || ''), 200),\n                image:   (mediaMap && mediaMap[p.featured_media]) || ''\n            };\n        });\n    }\n\n    \/* Compare two product sets by link (order-independent) \u2014 skip DOM re-render when identical *\/\n    function sameProducts(a, b) {\n        if (!a || !b || a.length !== b.length) return false;\n        var la = a.map(function (x) { return x.link || ''; }).sort();\n        var lb = b.map(function (x) { return x.link || ''; }).sort();\n        for (var i = 0; i < la.length; i++) {\n            if (la[i] !== lb[i]) return false;\n        }\n        return true;\n    }\n\n    \/* Render from normalised product objects (static or live) *\/\n    function renderProducts(items) {\n        if (!items || !items.length) return;\n\n        var html = '';\n\n        var errorHtml = errorEl.outerHTML;\n        var emptyHtml = emptyEl.outerHTML;\n\n        items.forEach(function (item) {\n            var title   = item.title || '';\n            var excerpt = item.excerpt || '';\n            var link    = item.link || '#';\n            var imgUrl  = item.image || '';\n            var badge   = getBadge(title);\n\n            var imgHtml = imgUrl\n                ? '<img decoding=\"async\" class=\"cat-card__img\" src=\"' + escapeAttr(imgUrl) + '\" alt=\"' + escapeAttr(title) + '\" loading=\"lazy\">'\n                : '<div class=\"cat-card__img-placeholder\">' + escapeHtml(title.charAt(0) || '?') + '<\/div>';\n\n            html += '' +\n                '<div class=\"cat-card\">' +\n                    imgHtml +\n                    '<div class=\"cat-card__body\">' +\n                        '<span class=\"cat-card__badge\">' + escapeHtml(badge) + '<\/span>' +\n                        '<h3 class=\"cat-card__title\">' + escapeHtml(title) + '<\/h3>' +\n                        '<p class=\"cat-card__excerpt\">' + escapeHtml(excerpt) + '<\/p>' +\n                        '<a href=\"' + escapeAttr(link) + '\" class=\"cat-card__link\">' +\n                            'View Details' +\n                            '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>' +\n                        '<\/a>' +\n                    '<\/div>' +\n                '<\/div>';\n        });\n\n        html += emptyHtml;\n        html += errorHtml;\n\n        grid.innerHTML = html;\n\n        errorEl = document.getElementById('catError');\n        emptyEl = document.getElementById('catGridEmpty');\n    }\n\n    function escapeHtml(str) {\n        var div = document.createElement('div');\n        div.textContent = str;\n        return div.innerHTML;\n    }\n\n    function escapeAttr(str) {\n        return escapeHtml(str).replace(\/\"\/g, '&quot;');\n    }\n\n    \/* Step 5: Update count + init search *\/\n    function finalize(posts) {\n        total = posts.length;\n        countEl.innerHTML = '<em>' + total + '<\/em> &nbsp;Machines Available';\n\n        initSearch();\n    }\n\n    \/* ===== Search Logic ===== *\/\n    function initSearch() {\n        function highlightText(node, keyword) {\n            if (!keyword || !node) return;\n            var text = node.textContent;\n            var idx  = text.toLowerCase().indexOf(keyword.toLowerCase());\n            if (idx === -1) return;\n            var before = text.slice(0, idx);\n            var match  = text.slice(idx, idx + keyword.length);\n            var after  = text.slice(idx + keyword.length);\n            node.innerHTML = '';\n            node.appendChild(document.createTextNode(before));\n            var mark = document.createElement('mark');\n            mark.textContent = match;\n            node.appendChild(mark);\n            node.appendChild(document.createTextNode(after));\n        }\n\n        function clearHighlights() {\n            grid.querySelectorAll('mark').forEach(function (m) {\n                m.outerHTML = m.textContent;\n            });\n        }\n\n        function doSearch() {\n            var keyword = input.value.trim();\n            var kw      = keyword.toLowerCase();\n            var visible = 0;\n            var cards   = grid.querySelectorAll('.cat-card');\n\n            clearBtn.classList.toggle('visible', keyword.length > 0);\n\n            if (!kw) {\n                cards.forEach(function (c) { c.style.display = ''; });\n                clearHighlights();\n                matchEl.innerHTML = '';\n                emptyEl.classList.remove('visible');\n                countEl.querySelector('em').textContent = total;\n                return;\n            }\n\n            cards.forEach(function (card) {\n                var title   = card.querySelector('.cat-card__title');\n                var excerpt = card.querySelector('.cat-card__excerpt');\n                var badge   = card.querySelector('.cat-card__badge');\n\n                var hay = [\n                    title   ? title.textContent : '',\n                    excerpt ? stripHtml(excerpt.innerHTML) : '',\n                    badge   ? badge.textContent : ''\n                ].join(' ').toLowerCase();\n\n                if (hay.indexOf(kw) !== -1) {\n                    card.style.display = '';\n                    visible++;\n                    clearHighlights();\n                    if (title)   highlightText(title, keyword);\n                    if (excerpt) highlightText(excerpt, keyword);\n                } else {\n                    card.style.display = 'none';\n                }\n            });\n\n            countEl.querySelector('em').textContent = visible;\n\n            if (visible === 0) {\n                matchEl.innerHTML = '<em>0<\/em> &nbsp;MATCHES \u2014 Try another keyword';\n                emptyEl.classList.add('visible');\n            } else if (visible === total) {\n                matchEl.innerHTML = '<em>' + visible + '<\/em> &nbsp;MATCHES \u2014 All machines';\n            } else {\n                matchEl.innerHTML = '<em>' + visible + '<\/em> &nbsp;MATCHES found';\n            }\n\n            if (visible > 0) emptyEl.classList.remove('visible');\n        }\n\n        var newInput = input.cloneNode(true);\n        input.parentNode.replaceChild(newInput, input);\n        input = newInput;\n\n        input.addEventListener('input', debounce(doSearch, 160));\n\n        clearBtn.addEventListener('click', function () {\n            input.value = '';\n            doSearch();\n            input.focus();\n        });\n\n        document.addEventListener('keydown', function (e) {\n            if (e.key === '\/' && document.activeElement !== input) {\n                e.preventDefault();\n                input.focus();\n            }\n            if (e.key === 'Escape' && document.activeElement === input) {\n                input.blur();\n                if (input.value) { input.value = ''; doSearch(); }\n            }\n        });\n    }\n\n    \/* ===== Main Load Function =====\n       Background-only refresh: never blocks the first paint.\n       `manual` = true is only used by the Retry button (shows skeleton). *\/\n    function loadProducts(manual) {\n        if (manual) {\n            skeleton.style.display = '';\n            grid.style.display = 'none';\n            input.disabled = true;\n            countEl.innerHTML = '<span class=\"cat-loading-badge\"><span class=\"dot\"><\/span> Checking for new products...<\/span>';\n            errorEl.classList.remove('visible');\n            emptyEl.classList.remove('visible');\n        }\n\n        getTagId()\n            .then(function (tagId) {\n                return getPosts(tagId);\n            })\n            .then(function (posts) {\n                return getMediaUrls(posts).then(function (mediaMap) {\n                    return normalize(posts, mediaMap);\n                });\n            })\n            .then(function (items) {\n                if (!items || !items.length) throw new Error('No posts');\n                \/\/ Only re-render when the live set actually differs \u2014 avoids a flash on no-op\n                if (!sameProducts(items, lastRendered)) {\n                    renderProducts(items);\n                    lastRendered = items;\n                    total = items.length;\n                    countEl.innerHTML = '<em>' + total + '<\/em> &nbsp;Machines Available';\n                }\n                skeleton.style.display = 'none';\n                grid.style.display = '';\n                input.disabled = false;\n                errorEl.classList.remove('visible');\n            })\n            .catch(function (err) {\n                if (manual) {\n                    hideSkeleton();\n                    showError();\n                }\n                \/\/ Auto background pass: keep cached content visible, no error screen\n                console.warn('[Construction & Steel Structure] background refresh issue:', err && err.message);\n            });\n    }\n\n    \/* Retry button \u2192 manual load (shows skeleton) *\/\n    if (retryBtn) {\n        retryBtn.addEventListener('click', function () { loadProducts(true); });\n    }\n\n    \/* ============================================================\n       BOOT \u2014 render cached products instantly, then refresh in background\n       ============================================================ *\/\n    renderProducts(STATIC_PRODUCTS);      \/\/ instant paint, zero wait\n    lastRendered = STATIC_PRODUCTS;\n    finalize(STATIC_PRODUCTS);            \/\/ sets count + binds search\n    skeleton.style.display = 'none';\n    grid.style.display = '';\n    input.disabled = false;\n    loadProducts(false);                  \/\/ background only; never blocks the view\n\n})();\n<\/script>\n\n<\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-ea984a2 e-flex e-con-boxed e-con e-parent\" data-id=\"ea984a2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Construction &#038; Steel Structure \u2013 All Products | Believe Industry Product Catalog Construction &amp; Steel Structure Explore our full range of roll forming machines for construction and steel structure applications \u2014 including purlin, deck, tile, and custom profile systems. All machines are custom-built to your profile drawings and production requirements. About Us Email Us Loading [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_wpcom_ai_launchpad_about_page":false,"_wpcom_ai_launchpad_gallery_page":false,"_wpcom_ai_launchpad_contact_page":false,"_wpcom_ai_launchpad_events_page":false,"_wpcom_ai_launchpad_video_page":false,"_wpcom_ai_launchpad_portfolio_piece":false,"_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"footnotes":"","big_sky_generated":false},"tags":[],"class_list":["post-21922","page","type-page","status-publish","hentry"],"blocksy_meta":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/P9K5n8-5HA","jetpack_likes_enabled":false,"jetpack-related-posts":[{"id":22033,"url":"https:\/\/believeindustry.company\/pt\/door-and-window\/","url_meta":{"origin":21922,"position":0},"title":"Portas e Janelas","author":"Believe Industry Group","date":"Abril 12, 2026","format":false,"excerpt":"Linhas de Portas \u2013 Todos os Produtos | Cat\u00e1logo de Produtos da Believe Industry Linhas de Portas Explore nossa linha completa de m\u00e1quinas de perfilagem para produ\u00e7\u00e3o de portas \u2014 incluindo perfiladeiras de caixilhos de portas de a\u00e7o, linhas de pain\u00e9is para portas de garagem, m\u00e1quinas para trilhos de portas de enrolar e perfiladeiras de l\u00e2minas para portas de enrolar. Todas as m\u00e1quinas s\u00e3o fabricadas sob medida para o seu projeto\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"door and window","src":"https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/door-and-window.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/door-and-window.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/door-and-window.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/door-and-window.webp?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/door-and-window.webp?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/door-and-window.webp?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":21970,"url":"https:\/\/believeindustry.company\/pt\/material-storage\/","url_meta":{"origin":21922,"position":1},"title":"Armazenamento de Materiais","author":"Believe Industry Group","date":"Abril 12, 2026","format":false,"excerpt":"Storage Lines \u2013 All Products | Believe Industry Product Catalog Storage Lines Explore our full range of roll forming machines for pallet racking and storage systems \u2014 including beam lines, upright machines, box beam welders, and shelving panel formers. All machines are custom-built to your profile drawings and production requirements.\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"Automated Warehouse Racking Machinery","src":"https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/03\/pallet-Racking-System.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/03\/pallet-Racking-System.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/03\/pallet-Racking-System.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/03\/pallet-Racking-System.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/03\/pallet-Racking-System.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/03\/pallet-Racking-System.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":22002,"url":"https:\/\/believeindustry.company\/pt\/energy-and-electric\/","url_meta":{"origin":21922,"position":2},"title":"Energia e Eletricidade","author":"Believe Industry Group","date":"Abril 12, 2026","format":false,"excerpt":"Energia e El\u00e9trica \u2013 Todos os Produtos | Cat\u00e1logo de Produtos da Believe Industry Energia e El\u00e9trica Explore nossa linha completa de m\u00e1quinas de perfilagem para aplica\u00e7\u00f5es em energia e el\u00e9trica \u2014 incluindo sistemas para trilhos DIN, bandejas de cabos e perfis estruturais. Todas as m\u00e1quinas s\u00e3o fabricadas sob medida, de acordo com suas especifica\u00e7\u00f5es. Sobre N\u00f3s Envie-nos um e-mail Carregando produtos...\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"engery and electric","src":"https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/engery-and-electric.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/engery-and-electric.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/engery-and-electric.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/engery-and-electric.webp?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/engery-and-electric.webp?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/engery-and-electric.webp?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":22021,"url":"https:\/\/believeindustry.company\/pt\/downspout-and-gutter\/","url_meta":{"origin":21922,"position":3},"title":"Tubos de Queda e Calhas","author":"Believe Industry Group","date":"Abril 12, 2026","format":false,"excerpt":"Linhas de Calhas e Tubos de Descida \u2013 Todos os Produtos | Cat\u00e1logo de Produtos da Believe Industry Explore nossa linha completa de m\u00e1quinas de perfilagem para produ\u00e7\u00e3o de calhas e tubos de descida \u2014 incluindo m\u00e1quinas para fabrica\u00e7\u00e3o de calhas, m\u00e1quinas para tubos de descida, linhas de produ\u00e7\u00e3o port\u00e1teis para tubos de descida e sistemas hidrop\u00f4nicos de calhas suspensas. Todas as m\u00e1quinas s\u00e3o fabricadas sob medida, de acordo com seus desenhos de perfil e requisitos de produ\u00e7\u00e3o.","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"downspout and gutter","src":"https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/downspout-and-gutter.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/downspout-and-gutter.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/downspout-and-gutter.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/downspout-and-gutter.webp?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/downspout-and-gutter.webp?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2026\/04\/downspout-and-gutter.webp?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":22047,"url":"https:\/\/believeindustry.company\/pt\/customized-profiles\/","url_meta":{"origin":21922,"position":4},"title":"Perfis Personalizados","author":"Believe Industry Group","date":"Abril 12, 2026","format":false,"excerpt":"Projetos Personalizados \u2013 Todos os Produtos | Cat\u00e1logo de Produtos da Believe Industry Projetos Personalizados Explore nossa linha completa de m\u00e1quinas de perfilagem e equipamentos auxiliares projetados sob medida \u2014 incluindo m\u00e1quinas para defensas met\u00e1licas de rodovias, linhas de perfilagem para estufas, m\u00e1quinas para pranchas de andaimes, m\u00e1quinas para perfilagem de silos de a\u00e7o, linhas de estampagem de metal, prensas de puncionamento e empilhadeiras autom\u00e1ticas. Todas as m\u00e1quinas s\u00e3o\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"custom roll forming machine","src":"https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2018\/05\/custom-roll-forming-machine.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2018\/05\/custom-roll-forming-machine.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2018\/05\/custom-roll-forming-machine.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2018\/05\/custom-roll-forming-machine.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/believeindustry.company\/wp-content\/uploads\/2018\/05\/custom-roll-forming-machine.jpg?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":23163,"url":"https:\/\/believeindustry.company\/pt\/beli-blog\/","url_meta":{"origin":21922,"position":5},"title":"Nosso blog","author":"Believe Industry Group","date":"Junho 22, 2026","format":false,"excerpt":"Blog | Believe Industry Company \u2014 Centro de Conhecimento com Informa\u00e7\u00f5es e Guias sobre M\u00e1quinas de Conforma\u00e7\u00e3o a Frio Informa\u00e7\u00f5es e Guias sobre Conforma\u00e7\u00e3o a Frio Artigos de especialistas sobre m\u00e1quinas de conforma\u00e7\u00e3o a frio, fabrica\u00e7\u00e3o de perfis met\u00e1licos, sele\u00e7\u00e3o de equipamentos e melhores pr\u00e1ticas do setor \u2014 da equipe da Believe Industry. \u2014 Artigos Publicados \u2014 Categorias Mais de 15 anos de experi\u00eancia \u00d7\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/believeindustry.company\/pt\/wp-json\/wp\/v2\/pages\/21922","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/believeindustry.company\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/believeindustry.company\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/believeindustry.company\/pt\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/believeindustry.company\/pt\/wp-json\/wp\/v2\/comments?post=21922"}],"version-history":[{"count":38,"href":"https:\/\/believeindustry.company\/pt\/wp-json\/wp\/v2\/pages\/21922\/revisions"}],"predecessor-version":[{"id":24654,"href":"https:\/\/believeindustry.company\/pt\/wp-json\/wp\/v2\/pages\/21922\/revisions\/24654"}],"wp:attachment":[{"href":"https:\/\/believeindustry.company\/pt\/wp-json\/wp\/v2\/media?parent=21922"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/believeindustry.company\/pt\/wp-json\/wp\/v2\/tags?post=21922"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}