{"product_id":"6-150mm-wall-brush-wooden-handle","title":"6″ \/ 150mm Wall Brush – Wooden Handle","description":"\u003cstyle\u003e\n  .product-trade-sheet {\n    --pts-bg: #ffffff;\n    --pts-surface: #ffffff;\n    --pts-soft: #f6f6f4;\n    --pts-text: #111111;\n    --pts-muted: #5a5a5a;\n    --pts-accent: #f26522;\n    --pts-accent-dark: #d95316;\n    --pts-accent-soft: #fff2e8;\n    --pts-line: #dfdfdb;\n    --pts-white: #ffffff;\n\n    width: 100%;\n    max-width: 100%;\n    color: var(--pts-text);\n    background: var(--pts-bg);\n\n    font-family:\n      -apple-system,\n      BlinkMacSystemFont,\n      \"Segoe UI\",\n      Arial,\n      sans-serif;\n\n    font-size: 14px;\n    line-height: 1.7;\n\n    container-type: inline-size;\n  }\n\n  .product-trade-sheet *,\n  .product-trade-sheet *::before,\n  .product-trade-sheet *::after {\n    box-sizing: border-box;\n  }\n\n  .product-trade-sheet h2,\n  .product-trade-sheet p {\n    margin: 0;\n  }\n\n  .product-trade-sheet button,\n  .product-trade-sheet input {\n    font: inherit;\n  }\n\n  \/* =========================================================\n     PRODUCT OVERVIEW\n  ========================================================= *\/\n\n  .pts-hero {\n    width: 100%;\n\n    border-top: 4px solid var(--pts-accent);\n    border-bottom: 1px solid var(--pts-line);\n\n    background: var(--pts-surface);\n  }\n\n  .pts-hero-copy {\n    width: 100%;\n    padding: clamp(30px, 5cqw, 58px);\n  }\n\n  .pts-eyebrow {\n    display: inline-flex;\n    align-items: center;\n    gap: 10px;\n\n    margin-bottom: 18px;\n\n    color: var(--pts-accent);\n\n    font-size: 9px;\n    font-weight: 800;\n    line-height: 1;\n    letter-spacing: 0.16em;\n\n    text-transform: uppercase;\n  }\n\n  .pts-eyebrow::before {\n    content: \"\";\n\n    width: 34px;\n    height: 2px;\n\n    background: var(--pts-accent);\n  }\n\n  .pts-product-title {\n    width: 100%;\n    max-width: 980px;\n\n    margin: 0 0 24px !important;\n\n    color: var(--pts-text);\n\n    font-size: clamp(30px, 5.2cqw, 48px);\n    font-weight: 800;\n    line-height: 1.07;\n    letter-spacing: -0.045em;\n  }\n\n  .pts-intro {\n    width: 100%;\n    max-width: 980px;\n\n    color: var(--pts-muted);\n\n    font-size: clamp(15px, 2cqw, 18px);\n    line-height: 1.85;\n  }\n\n  \/* =========================================================\n     TOP STATS\n  ========================================================= *\/\n\n  .pts-hero-aside {\n    display: grid;\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n\n    width: 100%;\n\n    border-top: 1px solid var(--pts-line);\n\n    background: var(--pts-accent-soft);\n  }\n\n  .pts-stat {\n    position: relative;\n\n    min-width: 0;\n    min-height: 126px;\n\n    padding: 20px;\n\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n\n    border-right: 1px solid var(--pts-line);\n\n    background: var(--pts-accent-soft);\n\n    overflow: hidden;\n\n    transition:\n      background-color 0.25s ease,\n      padding-left 0.25s ease;\n  }\n\n  .pts-stat:last-child {\n    border-right: 0;\n  }\n\n  .pts-stat::after {\n    content: \"\";\n\n    position: absolute;\n\n    left: 0;\n    bottom: 0;\n\n    width: 0;\n    height: 3px;\n\n    background: var(--pts-accent);\n\n    transition: width 0.3s ease;\n  }\n\n  .pts-stat:hover {\n    padding-left: 24px;\n    background: #ffffff;\n  }\n\n  .pts-stat:hover::after {\n    width: 100%;\n  }\n\n  .pts-stat-label {\n    display: block;\n\n    color: var(--pts-muted);\n\n    font-size: 9px;\n    font-weight: 800;\n    line-height: 1.4;\n    letter-spacing: 0.14em;\n\n    text-transform: uppercase;\n  }\n\n  .pts-stat-value {\n    display: block;\n\n    margin-top: 22px;\n\n    color: var(--pts-text);\n\n    font-size: clamp(22px, 4cqw, 32px);\n    font-weight: 780;\n    line-height: 1;\n    letter-spacing: -0.035em;\n  }\n\n  .pts-stat-value small {\n    display: block;\n\n    margin-top: 8px;\n\n    color: var(--pts-muted);\n\n    font-size: 11px;\n    font-weight: 600;\n    line-height: 1.4;\n    letter-spacing: 0;\n  }\n\n  \/* =========================================================\n     PURCHASE PANEL\n  ========================================================= *\/\n\n  .pts-purchase-panel {\n    width: 100%;\n\n    padding: 20px;\n\n    border-bottom: 1px solid var(--pts-line);\n\n    background: var(--pts-soft);\n  }\n\n  .pts-purchase-card {\n    width: 100%;\n\n    border: 1px solid var(--pts-line);\n\n    background: #ffffff;\n  }\n\n  .pts-purchase-main {\n    display: grid;\n\n    grid-template-columns:\n      minmax(220px, 0.9fr)\n      minmax(190px, 0.75fr)\n      minmax(280px, 1.2fr);\n\n    width: 100%;\n  }\n\n  \/* =========================================================\n     QUANTITY\n  ========================================================= *\/\n\n  .pts-purchase-quantity {\n    min-width: 0;\n\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n\n    padding: 22px;\n\n    border-right: 1px solid var(--pts-line);\n\n    background: #ffffff;\n  }\n\n  .pts-purchase-label {\n    display: block;\n\n    margin-bottom: 12px;\n\n    color: var(--pts-muted);\n\n    font-size: 9px;\n    font-weight: 800;\n    line-height: 1.4;\n    letter-spacing: 0.13em;\n\n    text-transform: uppercase;\n  }\n\n  .pts-quantity-selector {\n    display: grid;\n\n    grid-template-columns:\n      50px\n      88px\n      50px;\n\n    width: max-content;\n    height: 52px;\n\n    border: 1px solid var(--pts-line);\n\n    background: #ffffff;\n  }\n\n  .pts-quantity-button {\n    appearance: none;\n    -webkit-appearance: none;\n\n    width: 50px;\n    height: 50px;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    margin: 0;\n    padding: 0;\n\n    border: 0;\n    border-radius: 0;\n\n    background: #ffffff;\n    color: #111111;\n\n    cursor: pointer;\n\n    font-size: 22px;\n    font-weight: 500;\n    line-height: 1;\n\n    user-select: none;\n\n    transition:\n      background-color 0.2s ease,\n      color 0.2s ease;\n  }\n\n  .pts-quantity-button:hover:not(:disabled) {\n    background: var(--pts-accent);\n    color: #ffffff;\n  }\n\n  .pts-quantity-button:active:not(:disabled) {\n    background: var(--pts-accent-dark);\n  }\n\n  .pts-quantity-button:disabled {\n    cursor: not-allowed;\n\n    background: var(--pts-soft);\n    color: #b9b9b5;\n  }\n\n  .pts-quantity-input {\n    appearance: textfield;\n    -moz-appearance: textfield;\n\n    width: 88px;\n    height: 50px;\n\n    margin: 0;\n    padding: 0 5px;\n\n    border-top: 0;\n    border-bottom: 0;\n    border-left: 1px solid var(--pts-line);\n    border-right: 1px solid var(--pts-line);\n\n    border-radius: 0;\n    outline: none;\n\n    background: #ffffff;\n    color: var(--pts-text);\n\n    text-align: center;\n\n    font-size: 17px;\n    font-weight: 800;\n    line-height: 50px;\n  }\n\n  .pts-quantity-input:focus {\n    background: var(--pts-accent-soft);\n  }\n\n  .pts-quantity-input::-webkit-inner-spin-button,\n  .pts-quantity-input::-webkit-outer-spin-button {\n    margin: 0;\n    -webkit-appearance: none;\n  }\n\n  .pts-minimum-note {\n    display: block;\n\n    margin-top: 10px;\n\n    color: var(--pts-muted);\n\n    font-size: 10px;\n    line-height: 1.45;\n  }\n\n  .pts-minimum-note strong {\n    color: var(--pts-text);\n  }\n\n  \/* =========================================================\n     ORDER TOTAL\n  ========================================================= *\/\n\n  .pts-purchase-total {\n    min-width: 0;\n\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n\n    padding: 22px;\n\n    border-right: 1px solid var(--pts-line);\n\n    background: var(--pts-accent-soft);\n  }\n\n  .pts-order-total-value {\n    display: block;\n\n    color: var(--pts-text);\n\n    font-size: clamp(28px, 4.4cqw, 38px);\n    font-weight: 800;\n    line-height: 1;\n    letter-spacing: -0.04em;\n  }\n\n  .pts-order-total-meta {\n    display: block;\n\n    margin-top: 9px;\n\n    color: var(--pts-muted);\n\n    font-size: 11px;\n    line-height: 1.5;\n  }\n\n  \/* =========================================================\n     BUY BUTTONS\n  ========================================================= *\/\n\n  .pts-purchase-actions {\n    min-width: 0;\n\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n\n    gap: 14px;\n\n    padding: 14px;\n\n    background: #ffffff;\n  }\n\n  .pts-buy-button {\n    appearance: none;\n    -webkit-appearance: none;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    width: 100%;\n    min-height: 54px;\n\n    margin: 0;\n    padding: 14px 18px;\n\n    border-radius: 0;\n\n    cursor: pointer;\n\n    font-size: 12px;\n    font-weight: 800;\n    line-height: 1.35;\n    letter-spacing: 0.055em;\n\n    text-align: center;\n    text-transform: uppercase;\n\n    transition:\n      background-color 0.2s ease,\n      color 0.2s ease,\n      border-color 0.2s ease,\n      transform 0.12s ease;\n  }\n\n  .pts-add-cart {\n    border: 1px solid #111111;\n\n    background: #111111;\n    color: #ffffff;\n  }\n\n  .pts-add-cart:hover {\n    background: #292929;\n    border-color: #292929;\n  }\n\n  .pts-add-cart:active {\n    transform: translateY(1px);\n\n    background: #000000;\n    border-color: #000000;\n  }\n\n  .pts-buy-now {\n    border: 1px solid var(--pts-accent);\n\n    background: var(--pts-accent);\n    color: #ffffff;\n  }\n\n  .pts-buy-now:hover {\n    background: var(--pts-accent-dark);\n    border-color: var(--pts-accent-dark);\n  }\n\n  .pts-buy-now:active {\n    transform: translateY(1px);\n  }\n\n  .pts-buy-button:disabled {\n    cursor: wait;\n    opacity: 0.6;\n  }\n\n  \/* =========================================================\n     PURCHASE FOOTER\n  ========================================================= *\/\n\n  .pts-purchase-footer {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n\n    gap: 18px;\n\n    min-height: 46px;\n\n    padding: 10px 18px;\n\n    border-top: 1px solid var(--pts-line);\n\n    background: #ffffff;\n  }\n\n  .pts-purchase-footer-text {\n    color: var(--pts-muted);\n\n    font-size: 10px;\n    line-height: 1.5;\n  }\n\n  .pts-purchase-footer-text strong {\n    color: var(--pts-text);\n  }\n\n  .pts-purchase-status {\n    min-height: 15px;\n\n    color: var(--pts-muted);\n\n    font-size: 10px;\n    line-height: 1.5;\n\n    text-align: right;\n  }\n\n  .pts-purchase-status.is-error {\n    color: #b42318;\n  }\n\n  .pts-purchase-status.is-success {\n    color: #111111;\n  }\n\n  \/* =========================================================\n     SECTION INDEX\n  ========================================================= *\/\n\n  .pts-section-index {\n    display: grid;\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n\n    width: 100%;\n\n    border-bottom: 1px solid var(--pts-line);\n\n    background: var(--pts-soft);\n  }\n\n  .pts-index-item {\n    min-width: 0;\n\n    padding: 16px 18px;\n\n    border-right: 1px solid var(--pts-line);\n\n    transition:\n      background-color 0.25s ease,\n      padding-left 0.25s ease;\n  }\n\n  .pts-index-item:last-child {\n    border-right: 0;\n  }\n\n  .pts-index-item:hover {\n    padding-left: 23px;\n\n    background: var(--pts-accent-soft);\n  }\n\n  .pts-index-number {\n    display: block;\n\n    margin-bottom: 6px;\n\n    color: var(--pts-accent);\n\n    font-size: 9px;\n    font-weight: 850;\n    line-height: 1;\n    letter-spacing: 0.12em;\n  }\n\n  .pts-index-label {\n    display: block;\n\n    color: var(--pts-text);\n\n    font-size: 11px;\n    font-weight: 700;\n    line-height: 1.4;\n  }\n\n  \/* =========================================================\n     ACCORDION\n  ========================================================= *\/\n\n  .pts-sections {\n    width: 100%;\n\n    background: var(--pts-bg);\n  }\n\n  .pts-section {\n    width: 100%;\n\n    border-bottom: 1px solid var(--pts-line);\n  }\n\n  .pts-section details {\n    display: block;\n\n    width: 100%;\n  }\n\n  .pts-section summary {\n    display: grid;\n\n    grid-template-columns:\n      82px\n      minmax(0, 1fr)\n      64px;\n\n    align-items: stretch;\n\n    width: 100%;\n    min-height: 86px;\n\n    padding: 0;\n\n    background: var(--pts-surface);\n\n    cursor: pointer;\n    list-style: none;\n    user-select: none;\n\n    transition: background-color 0.25s ease;\n  }\n\n  .pts-section summary::-webkit-details-marker {\n    display: none;\n  }\n\n  .pts-section summary::marker {\n    content: \"\";\n  }\n\n  .pts-section summary:hover,\n  .pts-section details[open] \u003e summary {\n    background: var(--pts-soft);\n  }\n\n  .pts-section-no {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    border-right: 1px solid var(--pts-line);\n\n    color: var(--pts-accent);\n\n    font-size: 11px;\n    font-weight: 850;\n    line-height: 1;\n    letter-spacing: 0.12em;\n\n    transition:\n      background-color 0.3s ease,\n      color 0.3s ease;\n  }\n\n  .pts-section details[open] .pts-section-no {\n    background: var(--pts-accent);\n    color: #ffffff;\n  }\n\n  .pts-section-title {\n    min-width: 0;\n\n    display: flex;\n    align-items: center;\n\n    padding: 18px 24px;\n\n    color: var(--pts-text);\n\n    font-size: clamp(14px, 2.1cqw, 18px);\n    font-weight: 750;\n    line-height: 1.4;\n  }\n\n  \/* =========================================================\n     HAMMER\n  ========================================================= *\/\n\n  .pts-section-toggle {\n    position: relative;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    min-width: 64px;\n\n    border-left: 1px solid var(--pts-line);\n\n    background: var(--pts-surface);\n\n    overflow: hidden;\n\n    transition: background-color 0.25s ease;\n  }\n\n  .pts-section summary:hover .pts-section-toggle,\n  .pts-section details[open] .pts-section-toggle {\n    background: var(--pts-accent-soft);\n  }\n\n  .pts-hammer {\n    position: relative;\n\n    display: block;\n\n    width: 26px;\n    height: 34px;\n\n    transform: rotate(0deg);\n    transform-origin: 50% 50%;\n\n    transition:\n      transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n  }\n\n  .pts-hammer::before {\n    content: \"\";\n\n    position: absolute;\n\n    left: 50%;\n    top: 11px;\n\n    width: 5px;\n    height: 23px;\n\n    background: var(--pts-accent);\n\n    transform: translateX(-50%);\n  }\n\n  .pts-hammer::after {\n    content: \"\";\n\n    position: absolute;\n\n    top: 4px;\n    left: 50%;\n\n    width: 24px;\n    height: 9px;\n\n    background: var(--pts-accent);\n\n    transform: translateX(-50%);\n  }\n\n  .pts-hammer-neck {\n    position: absolute;\n\n    top: 9px;\n    left: 50%;\n\n    width: 9px;\n    height: 8px;\n\n    background: var(--pts-accent);\n\n    transform: translateX(-50%);\n  }\n\n  .pts-section details[open] .pts-hammer {\n    transform: rotate(90deg);\n  }\n\n  .pts-section summary:hover .pts-hammer {\n    transform: rotate(-7deg);\n  }\n\n  .pts-section details[open] summary:hover .pts-hammer {\n    transform: rotate(97deg);\n  }\n\n  \/* =========================================================\n     SECTION BODY\n  ========================================================= *\/\n\n  .pts-section-body {\n    display: grid;\n\n    grid-template-columns:\n      82px\n      minmax(0, 1fr);\n\n    width: 100%;\n\n    background: var(--pts-bg);\n  }\n\n  .pts-body-rail {\n    border-right: 1px solid var(--pts-line);\n\n    background:\n      repeating-linear-gradient(\n        to bottom,\n        transparent 0,\n        transparent 17px,\n        rgba(242, 101, 34, 0.07) 17px,\n        rgba(242, 101, 34, 0.07) 18px\n      );\n  }\n\n  .pts-body-content {\n    min-width: 0;\n\n    padding: clamp(22px, 4cqw, 42px);\n\n    color: var(--pts-muted);\n  }\n\n  .pts-copy {\n    width: 100%;\n    max-width: 950px;\n  }\n\n  .pts-copy p {\n    margin-bottom: 18px;\n  }\n\n  .pts-copy p:last-child {\n    margin-bottom: 0;\n  }\n\n  \/* =========================================================\n     FEATURES\n  ========================================================= *\/\n\n  .pts-feature-band {\n    display: grid;\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n\n    width: 100%;\n\n    margin-top: 28px;\n\n    border-top: 1px solid var(--pts-line);\n    border-bottom: 1px solid var(--pts-line);\n\n    background: var(--pts-surface);\n  }\n\n  .pts-feature {\n    position: relative;\n\n    min-width: 0;\n    min-height: 100px;\n\n    padding: 18px;\n\n    border-right: 1px solid var(--pts-line);\n\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n\n    background: var(--pts-surface);\n\n    overflow: hidden;\n\n    transition:\n      background-color 0.25s ease,\n      padding-left 0.25s ease;\n  }\n\n  .pts-feature:last-child {\n    border-right: 0;\n  }\n\n  .pts-feature::before {\n    content: \"\";\n\n    position: absolute;\n\n    top: 0;\n    left: 0;\n\n    width: 3px;\n    height: 0;\n\n    background: var(--pts-accent);\n\n    transition: height 0.3s ease;\n  }\n\n  .pts-feature:hover {\n    padding-left: 23px;\n\n    background: var(--pts-accent-soft);\n  }\n\n  .pts-feature:hover::before {\n    height: 100%;\n  }\n\n  .pts-feature-label {\n    color: var(--pts-muted);\n\n    font-size: 9px;\n    font-weight: 800;\n    line-height: 1.4;\n    letter-spacing: 0.12em;\n\n    text-transform: uppercase;\n  }\n\n  .pts-feature-value {\n    margin-top: 17px;\n\n    color: var(--pts-text);\n\n    font-size: 13px;\n    font-weight: 750;\n    line-height: 1.45;\n  }\n\n  \/* =========================================================\n     SPECIFICATIONS\n  ========================================================= *\/\n\n  .pts-spec-list {\n    display: grid;\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n\n    width: 100%;\n\n    margin: 0;\n    padding: 0;\n\n    border-top: 1px solid var(--pts-line);\n\n    list-style: none;\n  }\n\n  .pts-spec-list li {\n    position: relative;\n\n    min-width: 0;\n    min-height: 84px;\n\n    padding: 17px 20px;\n\n    border-right: 1px solid var(--pts-line);\n    border-bottom: 1px solid var(--pts-line);\n\n    background: var(--pts-surface);\n\n    overflow: hidden;\n\n    transition:\n      background-color 0.22s ease,\n      padding-left 0.22s ease;\n  }\n\n  .pts-spec-list li:nth-child(2n) {\n    border-right: 0;\n  }\n\n  .pts-spec-list li::before {\n    content: \"\";\n\n    position: absolute;\n\n    left: 0;\n    top: 0;\n\n    width: 3px;\n    height: 0;\n\n    background: var(--pts-accent);\n\n    transition: height 0.25s ease;\n  }\n\n  .pts-spec-list li:hover {\n    padding-left: 25px;\n\n    background: var(--pts-soft);\n  }\n\n  .pts-spec-list li:hover::before {\n    height: 100%;\n  }\n\n  .pts-spec-list strong {\n    display: block;\n\n    margin-bottom: 6px;\n\n    color: var(--pts-text);\n\n    font-size: 9px;\n    font-weight: 800;\n    line-height: 1.4;\n    letter-spacing: 0.1em;\n\n    text-transform: uppercase;\n  }\n\n  .pts-spec-list span {\n    display: block;\n\n    color: var(--pts-muted);\n\n    font-size: 13px;\n    line-height: 1.55;\n  }\n\n  \/* =========================================================\n     NOTE\n  ========================================================= *\/\n\n  .pts-note {\n    display: grid;\n\n    grid-template-columns:\n      46px\n      minmax(0, 1fr);\n\n    width: 100%;\n\n    margin-top: 20px;\n\n    border-top: 1px solid var(--pts-line);\n    border-bottom: 1px solid var(--pts-line);\n\n    background: var(--pts-accent-soft);\n  }\n\n  .pts-note-icon {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    border-right: 1px solid var(--pts-line);\n\n    color: var(--pts-accent);\n\n    font-family: Georgia, serif;\n    font-size: 15px;\n    font-weight: 700;\n  }\n\n  .pts-note-copy {\n    min-width: 0;\n\n    padding: 14px 16px;\n\n    color: var(--pts-muted);\n\n    font-size: 12px;\n    line-height: 1.7;\n  }\n\n  .pts-note-copy strong {\n    color: var(--pts-text);\n  }\n\n  \/* =========================================================\n     WHOLESALE\n  ========================================================= *\/\n\n  .pts-wholesale-layout {\n    display: grid;\n\n    grid-template-columns:\n      minmax(0, 1.3fr)\n      minmax(230px, 0.7fr);\n\n    width: 100%;\n\n    margin-top: 28px;\n\n    border-top: 1px solid var(--pts-line);\n    border-bottom: 1px solid var(--pts-line);\n  }\n\n  .pts-wholesale-data {\n    min-width: 0;\n\n    background: var(--pts-surface);\n  }\n\n  .pts-wholesale-row {\n    display: grid;\n\n    grid-template-columns:\n      minmax(120px, 38%)\n      minmax(0, 1fr);\n\n    min-height: 54px;\n\n    border-bottom: 1px solid var(--pts-line);\n  }\n\n  .pts-wholesale-row:last-child {\n    border-bottom: 0;\n  }\n\n  .pts-wholesale-key {\n    display: flex;\n    align-items: center;\n\n    padding: 11px 15px;\n\n    border-right: 1px solid var(--pts-line);\n\n    background: var(--pts-soft);\n\n    color: var(--pts-muted);\n\n    font-size: 9px;\n    font-weight: 800;\n    line-height: 1.4;\n    letter-spacing: 0.1em;\n\n    text-transform: uppercase;\n  }\n\n  .pts-wholesale-value {\n    min-width: 0;\n\n    display: flex;\n    align-items: center;\n\n    padding: 11px 16px;\n\n    background: var(--pts-surface);\n\n    color: var(--pts-text);\n\n    font-size: 13px;\n    font-weight: 700;\n    line-height: 1.5;\n\n    transition:\n      background-color 0.22s ease,\n      padding-left 0.22s ease;\n  }\n\n  .pts-wholesale-row:hover .pts-wholesale-value {\n    padding-left: 21px;\n\n    background: var(--pts-accent-soft);\n  }\n\n  .pts-wholesale-summary {\n    min-width: 0;\n\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n\n    padding: 28px;\n\n    background: #111111;\n    color: #ffffff;\n  }\n\n  .pts-summary-topline {\n    color: rgba(255, 255, 255, 0.64);\n\n    font-size: 9px;\n    font-weight: 800;\n    line-height: 1.4;\n    letter-spacing: 0.14em;\n\n    text-transform: uppercase;\n  }\n\n  .pts-summary-large {\n    margin: 30px 0;\n\n    color: #ffffff;\n\n    font-size: clamp(34px, 7cqw, 54px);\n    font-weight: 760;\n    line-height: 0.95;\n    letter-spacing: -0.05em;\n  }\n\n  .pts-summary-large::after {\n    content: \"\";\n\n    display: block;\n\n    width: 42px;\n    height: 3px;\n\n    margin-top: 18px;\n\n    background: var(--pts-accent);\n  }\n\n  .pts-summary-large small {\n    display: block;\n\n    margin-top: 11px;\n\n    color: rgba(255, 255, 255, 0.7);\n\n    font-size: 11px;\n    font-weight: 600;\n    line-height: 1.4;\n    letter-spacing: 0;\n  }\n\n  .pts-summary-lines {\n    color: rgba(255, 255, 255, 0.8);\n\n    font-size: 12px;\n    line-height: 1.85;\n  }\n\n  .pts-summary-lines strong {\n    color: #ffffff;\n  }\n\n  .pts-orange {\n    color: var(--pts-accent) !important;\n  }\n\n  \/* =========================================================\n     TABLET\n  ========================================================= *\/\n\n  @container (max-width: 760px) {\n    .pts-hero-copy {\n      padding: 30px 24px;\n    }\n\n    .pts-product-title {\n      font-size: 34px;\n    }\n\n    .pts-intro {\n      font-size: 15px;\n    }\n\n    .pts-hero-aside {\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n    }\n\n    .pts-stat {\n      border-bottom: 1px solid var(--pts-line);\n    }\n\n    .pts-stat:nth-child(2) {\n      border-right: 0;\n    }\n\n    .pts-stat:nth-child(3),\n    .pts-stat:nth-child(4) {\n      border-bottom: 0;\n    }\n\n    .pts-purchase-main {\n      grid-template-columns: 1fr 1fr;\n    }\n\n    .pts-purchase-total {\n      border-right: 0;\n    }\n\n    .pts-purchase-actions {\n      grid-column: 1 \/ -1;\n\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n\n      gap: 14px;\n\n      border-top: 1px solid var(--pts-line);\n    }\n\n    .pts-section-index {\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n    }\n\n    .pts-index-item:nth-child(2) {\n      border-right: 0;\n    }\n\n    .pts-index-item:nth-child(-n + 2) {\n      border-bottom: 1px solid var(--pts-line);\n    }\n\n    .pts-feature-band {\n      grid-template-columns: 1fr;\n    }\n\n    .pts-feature {\n      min-height: auto;\n\n      border-right: 0;\n      border-bottom: 1px solid var(--pts-line);\n    }\n\n    .pts-feature:last-child {\n      border-bottom: 0;\n    }\n\n    .pts-wholesale-layout {\n      grid-template-columns: 1fr;\n    }\n  }\n\n  \/* =========================================================\n     MOBILE\n  ========================================================= *\/\n\n  @container (max-width: 540px) {\n    .pts-hero-copy {\n      padding: 26px 18px;\n    }\n\n    .pts-product-title {\n      margin-bottom: 18px !important;\n\n      font-size: 29px;\n      line-height: 1.1;\n    }\n\n    .pts-eyebrow {\n      margin-bottom: 16px;\n    }\n\n    .pts-intro {\n      font-size: 14px;\n      line-height: 1.8;\n    }\n\n    .pts-stat {\n      min-height: 108px;\n      padding: 16px;\n    }\n\n    .pts-stat-value {\n      margin-top: 17px;\n\n      font-size: 22px;\n    }\n\n    .pts-purchase-panel {\n      padding: 12px;\n    }\n\n    .pts-purchase-main {\n      grid-template-columns: 1fr;\n    }\n\n    .pts-purchase-quantity,\n    .pts-purchase-total {\n      border-right: 0;\n      border-bottom: 1px solid var(--pts-line);\n    }\n\n    .pts-purchase-actions {\n      grid-column: auto;\n\n      display: flex;\n      flex-direction: column;\n\n      gap: 10px;\n\n      border-top: 0;\n    }\n\n    .pts-purchase-footer {\n      align-items: flex-start;\n      flex-direction: column;\n\n      gap: 4px;\n    }\n\n    .pts-purchase-status {\n      text-align: left;\n    }\n\n    .pts-section-index {\n      display: none;\n    }\n\n    .pts-section summary {\n      grid-template-columns:\n        52px\n        minmax(0, 1fr)\n        50px;\n\n      min-height: 72px;\n    }\n\n    .pts-section-no {\n      font-size: 9px;\n    }\n\n    .pts-section-title {\n      padding: 13px 14px;\n\n      font-size: 13px;\n    }\n\n    .pts-section-toggle {\n      min-width: 50px;\n    }\n\n    .pts-hammer {\n      transform: scale(0.86);\n    }\n\n    .pts-section details[open] .pts-hammer {\n      transform:\n        scale(0.86)\n        rotate(90deg);\n    }\n\n    .pts-section summary:hover .pts-hammer {\n      transform:\n        scale(0.86)\n        rotate(-7deg);\n    }\n\n    .pts-section details[open] summary:hover .pts-hammer {\n      transform:\n        scale(0.86)\n        rotate(97deg);\n    }\n\n    .pts-section-body {\n      grid-template-columns: 1fr;\n    }\n\n    .pts-body-rail {\n      display: none;\n    }\n\n    .pts-body-content {\n      padding: 22px 14px 27px;\n    }\n\n    .pts-spec-list {\n      grid-template-columns: 1fr;\n    }\n\n    .pts-spec-list li,\n    .pts-spec-list li:nth-child(2n) {\n      border-right: 0;\n    }\n\n    .pts-wholesale-row {\n      grid-template-columns: 1fr;\n    }\n\n    .pts-wholesale-key {\n      padding: 11px 13px 3px;\n\n      border-right: 0;\n\n      background: var(--pts-surface);\n    }\n\n    .pts-wholesale-value {\n      padding: 3px 13px 13px;\n    }\n\n    .pts-wholesale-summary {\n      padding: 24px 19px;\n    }\n  }\n\n  @container (max-width: 360px) {\n    .pts-hero-aside {\n      grid-template-columns: 1fr;\n    }\n\n    .pts-stat {\n      border-right: 0;\n      border-bottom: 1px solid var(--pts-line);\n    }\n\n    .pts-stat:last-child {\n      border-bottom: 0;\n    }\n  }\n\u003c\/style\u003e\n\u003cdiv class=\"product-trade-sheet\" id=\"pts-6in-150mm-wall-brush-card\" data-box-size=\"24\" data-unit-price=\"17.44\"\u003e\n\u003cinput type=\"hidden\" class=\"pts-current-variant\" value=\"{{ product.selected_or_first_available_variant.id }}\"\u003e\n\u003cdiv class=\"pts-hero\"\u003e\n\u003cdiv class=\"pts-hero-copy\"\u003e\n\u003cspan class=\"pts-eyebrow\"\u003e Decorating \u0026amp; painting tool \u003c\/span\u003e\n\u003ch2 class=\"pts-product-title\"\u003e6″ \/ 150mm Wall Brush – Wooden Handle\u003c\/h2\u003e\n\u003cp class=\"pts-intro\"\u003ePractical 6-inch \/ 150mm wall brush for interior and exterior decorating work. Suitable for paints, emulsion, stains and varnishes across smooth, rough and textured surfaces. The shaped wooden handle includes a hanging hole for convenient storage, and the brush can also be used as a splash brush.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-hero-aside\"\u003e\n\u003cdiv class=\"pts-stat\"\u003e\n\u003cspan class=\"pts-stat-label\"\u003e Brush width \u003c\/span\u003e\u003cspan class=\"pts-stat-value\"\u003e 150mm \u003csmall\u003e Approx. 6 inches \u003c\/small\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-stat\"\u003e\n\u003cspan class=\"pts-stat-label\"\u003e Unit price \u003c\/span\u003e\u003cspan class=\"pts-stat-value\"\u003e £17.44 \u003csmall\u003e Per wall brush \u003c\/small\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-stat\"\u003e\n\u003cspan class=\"pts-stat-label\"\u003e Minimum order \u003c\/span\u003e\u003cspan class=\"pts-stat-value\"\u003e 24 \u003csmall\u003e Wall brushes \u003c\/small\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-stat\"\u003e\n\u003cspan class=\"pts-stat-label\"\u003e MOQ total \u003c\/span\u003e\u003cspan class=\"pts-stat-value\"\u003e £418.56 \u003csmall\u003e 24 units \u003c\/small\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-purchase-panel\"\u003e\n\u003cdiv class=\"pts-purchase-card\"\u003e\n\u003cdiv class=\"pts-purchase-main\"\u003e\n\u003cdiv class=\"pts-purchase-quantity\"\u003e\n\u003cspan class=\"pts-purchase-label\"\u003e Boxes \u003c\/span\u003e\n\u003cdiv class=\"pts-quantity-selector\"\u003e\n\u003cbutton type=\"button\" class=\"pts-quantity-button pts-quantity-minus\" aria-label=\"Decrease box quantity\"\u003e−\u003c\/button\u003e \u003cinput type=\"number\" class=\"pts-quantity-input\" value=\"1\" min=\"1\" step=\"1\" inputmode=\"numeric\" aria-label=\"Box quantity\"\u003e \u003cbutton type=\"button\" class=\"pts-quantity-button pts-quantity-plus\" aria-label=\"Increase box quantity\"\u003e+\u003c\/button\u003e\n\u003c\/div\u003e\n\u003cspan class=\"pts-minimum-note\"\u003e1 box = \u003cstrong\u003e24 individual wall brushes\u003c\/strong\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-purchase-total\"\u003e\n\u003cspan class=\"pts-purchase-label\"\u003e Order total \u003c\/span\u003e\u003cspan class=\"pts-order-total-value\"\u003e £418.56 \u003c\/span\u003e\u003cspan class=\"pts-order-total-meta\"\u003e 1 box · 24 brushes × £17.44 \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-purchase-actions\"\u003e\n\u003cbutton type=\"button\" class=\"pts-buy-button pts-add-cart\"\u003eADD BOX · 24 UNITS\u003c\/button\u003e \u003cbutton type=\"button\" class=\"pts-buy-button pts-buy-now\"\u003eBUY NOW · £418.56\u003c\/button\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-purchase-footer\"\u003e\n\u003cspan class=\"pts-purchase-footer-text\"\u003eMinimum order: \u003cstrong\u003e1 box = 24 wall brushes\u003c\/strong\u003e · £17.44 per unit · £418.56 per box\u003c\/span\u003e\u003cspan class=\"pts-purchase-status\" aria-live=\"polite\"\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-section-index\"\u003e\n\u003cdiv class=\"pts-index-item\"\u003e\n\u003cspan class=\"pts-index-number\"\u003e01\u003c\/span\u003e\u003cspan class=\"pts-index-label\"\u003e Broad coverage \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-index-item\"\u003e\n\u003cspan class=\"pts-index-number\"\u003e02\u003c\/span\u003e\u003cspan class=\"pts-index-label\"\u003e Paint \u0026amp; surface use \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-index-item\"\u003e\n\u003cspan class=\"pts-index-number\"\u003e03\u003c\/span\u003e\u003cspan class=\"pts-index-label\"\u003e Use \u0026amp; care \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-index-item\"\u003e\n\u003cspan class=\"pts-index-number\"\u003e04\u003c\/span\u003e\u003cspan class=\"pts-index-label\"\u003e Wholesale supply \u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-sections\"\u003e\n\u003cdiv class=\"pts-section\"\u003e\n\u003cdetails open\u003e\n\u003csummary\u003e\u003cspan class=\"pts-section-no\"\u003e01\u003c\/span\u003e\u003cspan class=\"pts-section-title\"\u003e Broad Wall Coverage \u0026amp; General Decorating Use \u003c\/span\u003e\u003cspan class=\"pts-section-toggle\"\u003e\u003cspan class=\"pts-hammer\"\u003e\u003cspan class=\"pts-hammer-neck\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003c\/span\u003e\u003c\/summary\u003e\n\u003cdiv class=\"pts-section-body\"\u003e\n\u003cdiv class=\"pts-body-rail\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003cdiv class=\"pts-body-content\"\u003e\n\u003cdiv class=\"pts-copy\"\u003e\n\u003cp\u003eThe 150mm \/ 6-inch width provides a broad application area for general wall and decorating work. It is suitable for interior and exterior painting tasks and can be used with paints, emulsion, stains and varnishes.\u003c\/p\u003e\n\u003cp\u003eThe brush is intended for smooth, rough and textured surfaces and can also be used as a splash brush where that format is appropriate.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-feature-band\"\u003e\n\u003cdiv class=\"pts-feature\"\u003e\n\u003cspan class=\"pts-feature-label\"\u003e Brush width \u003c\/span\u003e\u003cspan class=\"pts-feature-value\"\u003e 6″ \/ 150mm \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-feature\"\u003e\n\u003cspan class=\"pts-feature-label\"\u003e Use \u003c\/span\u003e\u003cspan class=\"pts-feature-value\"\u003e Interior \u0026amp; exterior \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-feature\"\u003e\n\u003cspan class=\"pts-feature-label\"\u003e Surfaces \u003c\/span\u003e\u003cspan class=\"pts-feature-value\"\u003e Smooth, rough \u0026amp; textured \u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-section\"\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cspan class=\"pts-section-no\"\u003e02\u003c\/span\u003e\u003cspan class=\"pts-section-title\"\u003e Paint Compatibility, Handle \u0026amp; Surface Applications \u003c\/span\u003e\u003cspan class=\"pts-section-toggle\"\u003e\u003cspan class=\"pts-hammer\"\u003e\u003cspan class=\"pts-hammer-neck\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003c\/span\u003e\u003c\/summary\u003e\n\u003cdiv class=\"pts-section-body\"\u003e\n\u003cdiv class=\"pts-body-rail\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003cdiv class=\"pts-body-content\"\u003e\n\u003cul class=\"pts-spec-list\"\u003e\n\u003cli\u003e\n\u003cstrong\u003e Product type \u003c\/strong\u003e\u003cspan\u003e General-purpose wall brush. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Brush width \u003c\/strong\u003e\u003cspan\u003e 150mm \/ approximately 6 inches. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Interior use \u003c\/strong\u003e\u003cspan\u003e Suitable for interior decorating applications. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Exterior use \u003c\/strong\u003e\u003cspan\u003e Suitable for exterior decorating applications. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Paint compatibility \u003c\/strong\u003e\u003cspan\u003e Paints, emulsion, stains and varnishes. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Surface compatibility \u003c\/strong\u003e\u003cspan\u003e Smooth, rough and textured surfaces. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Handle \u003c\/strong\u003e\u003cspan\u003e Shaped wooden handle. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Storage feature \u003c\/strong\u003e\u003cspan\u003e Hanging hole in the handle. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Additional use \u003c\/strong\u003e\u003cspan\u003e Can also be used as a splash brush. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Operation \u003c\/strong\u003e\u003cspan\u003e Fully manual decorating tool. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cdiv class=\"pts-note\"\u003e\n\u003cdiv class=\"pts-note-icon\"\u003ei\u003c\/div\u003e\n\u003cdiv class=\"pts-note-copy\"\u003e\n\u003cstrong\u003e Specification note: \u003c\/strong\u003eThe source confirms the size, coating applications, surface types, shaped wooden handle with hanging hole and splash-brush use. Bristle and ferrule materials are not stated, so they are not claimed here.\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-section\"\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cspan class=\"pts-section-no\"\u003e03\u003c\/span\u003e\u003cspan class=\"pts-section-title\"\u003e Use, Cleaning \u0026amp; Product Care \u003c\/span\u003e\u003cspan class=\"pts-section-toggle\"\u003e\u003cspan class=\"pts-hammer\"\u003e\u003cspan class=\"pts-hammer-neck\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003c\/span\u003e\u003c\/summary\u003e\n\u003cdiv class=\"pts-section-body\"\u003e\n\u003cdiv class=\"pts-body-rail\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003cdiv class=\"pts-body-content\"\u003e\n\u003cul class=\"pts-spec-list\"\u003e\n\u003cli\u003e\n\u003cstrong\u003e Before use \u003c\/strong\u003e\u003cspan\u003e Inspect the brush, handle and bristles for visible damage or excessive wear. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Surface preparation \u003c\/strong\u003e\u003cspan\u003e Ensure the work surface is suitably prepared for the selected coating. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Application \u003c\/strong\u003e\u003cspan\u003e Load the brush evenly and apply the coating using controlled strokes. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Textured surfaces \u003c\/strong\u003e\u003cspan\u003e Work the brush carefully into uneven areas without unnecessary force. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Paint selection \u003c\/strong\u003e\u003cspan\u003e Follow the coating manufacturer's application and drying instructions. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Cleaning \u003c\/strong\u003e\u003cspan\u003e Clean promptly after use using the method appropriate to the coating applied. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Drying \u003c\/strong\u003e\u003cspan\u003e Allow the brush to dry thoroughly before storage. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Storage \u003c\/strong\u003e\u003cspan\u003e Store in a clean, dry location and use the hanging hole where convenient. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cdiv class=\"pts-note\"\u003e\n\u003cdiv class=\"pts-note-icon\"\u003e!\u003c\/div\u003e\n\u003cdiv class=\"pts-note-copy\"\u003e\n\u003cstrong\u003e Use note: \u003c\/strong\u003eFollow all safety, ventilation and handling instructions supplied with the paint, stain, varnish or other coating being applied.\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-section\"\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cspan class=\"pts-section-no\"\u003e04\u003c\/span\u003e\u003cspan class=\"pts-section-title\"\u003e Packaging \u0026amp; Wholesale Supply \u003c\/span\u003e\u003cspan class=\"pts-section-toggle\"\u003e\u003cspan class=\"pts-hammer\"\u003e\u003cspan class=\"pts-hammer-neck\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003c\/span\u003e\u003c\/summary\u003e\n\u003cdiv class=\"pts-section-body\"\u003e\n\u003cdiv class=\"pts-body-rail\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003cdiv class=\"pts-body-content\"\u003e\n\u003cdiv class=\"pts-copy\"\u003e\n\u003cp\u003eOne Shopify selling unit is one individual 6-inch \/ 150mm wall brush. Each wholesale box contains 24 brushes. Each unit is priced at £17.44, giving a wholesale box value of £418.56. Additional boxes can be selected directly using the box quantity control above.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-layout\"\u003e\n\u003cdiv class=\"pts-wholesale-data\"\u003e\n\u003cdiv class=\"pts-wholesale-row\"\u003e\n\u003cdiv class=\"pts-wholesale-key\"\u003eProduct\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-value\"\u003e6″ \/ 150mm wall brush\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-row\"\u003e\n\u003cdiv class=\"pts-wholesale-key\"\u003eBrush width\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-value\"\u003e150mm \/ approximately 6″\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-row\"\u003e\n\u003cdiv class=\"pts-wholesale-key\"\u003eHandle\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-value\"\u003eShaped wooden handle with hanging hole\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-row\"\u003e\n\u003cdiv class=\"pts-wholesale-key\"\u003eSuitable coatings\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-value\"\u003ePaints, emulsion, stains \u0026amp; varnishes\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-row\"\u003e\n\u003cdiv class=\"pts-wholesale-key\"\u003eUnit price\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-value\"\u003e£17.44\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-row\"\u003e\n\u003cdiv class=\"pts-wholesale-key\"\u003eBox quantity\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-value\"\u003e24 wall brushes\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-row\"\u003e\n\u003cdiv class=\"pts-wholesale-key\"\u003eBox total\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-value\"\u003e£418.56\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003caside class=\"pts-wholesale-summary\"\u003e\n\u003cdiv\u003e\n\u003cspan class=\"pts-summary-topline\"\u003e Wholesale box \u003c\/span\u003e\n\u003cdiv class=\"pts-summary-large\"\u003e£418.56\u003csmall\u003e 24 wall brushes \u003c\/small\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-summary-lines\"\u003e\n\u003cstrong\u003e £17.44 \u003c\/strong\u003e per wall brush\u003cbr\u003e\u003cstrong\u003e 6″ \/ 150mm \u003c\/strong\u003e brush width\u003cbr\u003e\u003cstrong\u003e 24 units \u003c\/strong\u003e per box\u003cbr\u003e\u003cstrong class=\"pts-orange\"\u003e £418.56 \u003c\/strong\u003e per wholesale box\u003c\/div\u003e\n\u003c\/aside\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-note\"\u003e\n\u003cdiv class=\"pts-note-icon\"\u003ei\u003c\/div\u003e\n\u003cdiv class=\"pts-note-copy\"\u003e\n\u003cstrong\u003e Wholesale calculation: \u003c\/strong\u003e1 box = 24 wall brushes × £17.44 per unit = £418.56.\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n(function() {\n  function initWallBrushCard() {\n    var card = document.getElementById(\"pts-6in-150mm-wall-brush-card\");\n\n    if (!card || card.dataset.ptsBound === \"true\") return;\n\n    card.dataset.ptsBound = \"true\";\n\n    var minus = card.querySelector(\".pts-quantity-minus\");\n    var plus = card.querySelector(\".pts-quantity-plus\");\n    var input = card.querySelector(\".pts-quantity-input\");\n    var addButton = card.querySelector(\".pts-add-cart\");\n    var buyButton = card.querySelector(\".pts-buy-now\");\n    var totalValue = card.querySelector(\".pts-order-total-value\");\n    var totalMeta = card.querySelector(\".pts-order-total-meta\");\n    var status = card.querySelector(\".pts-purchase-status\");\n    var variantField = card.querySelector(\".pts-current-variant\");\n\n    var boxSize = parseInt(card.dataset.boxSize || \"24\", 10);\n    var unitPrice = parseFloat(card.dataset.unitPrice || \"17.44\");\n\n    function money(value) {\n      return \"£\" + Number(value).toLocaleString(\"en-GB\", {\n        minimumFractionDigits: 2,\n        maximumFractionDigits: 2\n      });\n    }\n\n    function getBoxes() {\n      var boxes = parseInt(input.value, 10);\n\n      if (isNaN(boxes) || boxes \u003c 1) {\n        boxes = 1;\n      }\n\n      return boxes;\n    }\n\n    function setStatus(message, type) {\n      if (!status) return;\n\n      status.className = \"pts-purchase-status\";\n\n      if (type) {\n        status.classList.add(\"is-\" + type);\n      }\n\n      status.textContent = message || \"\";\n    }\n\n    function refresh() {\n      var boxes = getBoxes();\n      var units = boxes * boxSize;\n      var total = units * unitPrice;\n\n      input.value = boxes;\n      minus.disabled = boxes \u003c= 1;\n\n      totalValue.textContent = money(total);\n\n      totalMeta.textContent =\n        boxes +\n        (boxes === 1 ? \" box\" : \" boxes\") +\n        \" · \" +\n        units +\n        \" brushes × \" +\n        money(unitPrice);\n\n      addButton.textContent =\n        boxes === 1\n          ? \"ADD BOX · \" + units + \" UNITS\"\n          : \"ADD \" + boxes + \" BOXES · \" + units + \" UNITS\";\n\n      buyButton.textContent =\n        \"BUY NOW · \" + money(total);\n    }\n\n    function isValidVariantId(value) {\n      if (value === undefined || value === null) {\n        return false;\n      }\n\n      var clean = String(value).trim();\n\n      if (!\/^\\d+$\/.test(clean)) {\n        return false;\n      }\n\n      var number = Number(clean);\n\n      return Number.isFinite(number) \u0026\u0026 number \u003e 0;\n    }\n\n    function readVariantFromField(field) {\n      if (!field) {\n        return null;\n      }\n\n      if (isValidVariantId(field.value)) {\n        return Number(field.value);\n      }\n\n      return null;\n    }\n\n    async function getVariantId() {\n      \/*\n        1. Hidden variant field inside this card.\n        Works when Shopify actually renders the Liquid value.\n      *\/\n      var directId = readVariantFromField(variantField);\n\n      if (directId) {\n        return directId;\n      }\n\n      \/*\n        2. Explicit ?variant=123456... parameter.\n      *\/\n      var urlVariant = new URLSearchParams(\n        window.location.search\n      ).get(\"variant\");\n\n      if (isValidVariantId(urlVariant)) {\n        return Number(urlVariant);\n      }\n\n      \/*\n        3. Native Shopify product form in the same section.\n      *\/\n      var section = card.closest(\".shopify-section\");\n\n      if (section) {\n        var sectionFields = section.querySelectorAll(\n          'form[action*=\"\/cart\/add\"] [name=\"id\"], ' +\n          'product-form [name=\"id\"], ' +\n          'input[name=\"id\"], select[name=\"id\"]'\n        );\n\n        for (var i = 0; i \u003c sectionFields.length; i++) {\n          var sectionId = readVariantFromField(sectionFields[i]);\n\n          if (sectionId) {\n            return sectionId;\n          }\n        }\n      }\n\n      \/*\n        4. Any native Shopify product form on this page.\n\n        Some themes render Product Description and the native\n        Add to Cart form in different Shopify sections, so limiting\n        the search to card.closest(\".shopify-section\") can fail.\n      *\/\n      var globalFields = document.querySelectorAll(\n        'form[action*=\"\/cart\/add\"] [name=\"id\"], ' +\n        'product-form [name=\"id\"], ' +\n        'input[name=\"id\"], select[name=\"id\"]'\n      );\n\n      for (var j = 0; j \u003c globalFields.length; j++) {\n        var globalId = readVariantFromField(globalFields[j]);\n\n        if (globalId) {\n          return globalId;\n        }\n      }\n\n      \/*\n        5. Common Shopify theme globals.\n      *\/\n      try {\n        if (\n          window.ShopifyAnalytics \u0026\u0026\n          ShopifyAnalytics.meta \u0026\u0026\n          isValidVariantId(ShopifyAnalytics.meta.selectedVariantId)\n        ) {\n          return Number(ShopifyAnalytics.meta.selectedVariantId);\n        }\n      } catch (error) {}\n\n      try {\n        if (\n          window.meta \u0026\u0026\n          meta.product \u0026\u0026\n          meta.product.variants \u0026\u0026\n          meta.product.variants.length\n        ) {\n          for (var m = 0; m \u003c meta.product.variants.length; m++) {\n            if (isValidVariantId(meta.product.variants[m].id)) {\n              return Number(meta.product.variants[m].id);\n            }\n          }\n        }\n      } catch (error) {}\n\n      \/*\n        6. FINAL FALLBACK:\n        Load the current Shopify product JSON directly.\n\n        This does NOT depend on Liquid being available in the card.\n        It therefore also works when the visual card is stored inside\n        Product Description, provided the script itself is allowed to run.\n\n        On a normal one-variant product such as this wall brush,\n        Shopify returns the exact variant ID we need.\n      *\/\n      try {\n        var productPath = window.location.pathname;\n\n        var canonical = document.querySelector(\n          'link[rel=\"canonical\"]'\n        );\n\n        if (canonical \u0026\u0026 canonical.href) {\n          try {\n            productPath = new URL(\n              canonical.href,\n              window.location.origin\n            ).pathname;\n          } catch (error) {}\n        }\n\n        productPath = productPath.replace(\/\\\/$\/, \"\");\n\n        if (productPath.indexOf(\"\/products\/\") !== -1) {\n          var productResponse = await fetch(\n            productPath + \".js\",\n            {\n              method: \"GET\",\n              headers: {\n                \"Accept\": \"application\/json\"\n              },\n              credentials: \"same-origin\"\n            }\n          );\n\n          if (productResponse.ok) {\n            var productData = await productResponse.json();\n\n            if (\n              productData \u0026\u0026\n              productData.variants \u0026\u0026\n              productData.variants.length\n            ) {\n              \/*\n                If the URL already had a variant ID we would have\n                returned it above. Otherwise use the first available\n                variant, falling back to the first variant.\n              *\/\n              for (var p = 0; p \u003c productData.variants.length; p++) {\n                if (\n                  productData.variants[p].available \u0026\u0026\n                  isValidVariantId(productData.variants[p].id)\n                ) {\n                  return Number(productData.variants[p].id);\n                }\n              }\n\n              if (isValidVariantId(productData.variants[0].id)) {\n                return Number(productData.variants[0].id);\n              }\n            }\n          }\n        }\n      } catch (error) {\n        console.error(\n          \"PTS product JSON variant lookup failed:\",\n          error\n        );\n      }\n\n      return null;\n    }\n\n    async function addToCart(goToCheckout) {\n      setStatus(\"Detecting product variant...\");\n\n      var variantId = await getVariantId();\n\n      if (!variantId) {\n        setStatus(\n          \"Unable to detect the Shopify product variant. Make sure this code is used on the actual product page.\",\n          \"error\"\n        );\n        return;\n      }\n\n      var boxes = getBoxes();\n      var units = boxes * boxSize;\n\n      addButton.disabled = true;\n      buyButton.disabled = true;\n\n      setStatus(\"Adding \" + units + \" wall brushes to cart...\");\n\n      try {\n        var root =\n          window.Shopify \u0026\u0026\n          Shopify.routes \u0026\u0026\n          Shopify.routes.root\n            ? Shopify.routes.root\n            : \"\/\";\n\n        var response = await fetch(root + \"cart\/add.js\", {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": \"application\/json\",\n            \"Accept\": \"application\/json\"\n          },\n          body: JSON.stringify({\n            items: [\n              {\n                id: variantId,\n                quantity: units\n              }\n            ]\n          })\n        });\n\n        var result = await response.json();\n\n        if (!response.ok) {\n          throw new Error(\n            result.description ||\n            result.message ||\n            \"Unable to add the product.\"\n          );\n        }\n\n        setStatus(\n          units + \" wall brushes added successfully.\",\n          \"success\"\n        );\n\n        document.dispatchEvent(\n          new CustomEvent(\"cart:refresh\", {\n            bubbles: true,\n            detail: result\n          })\n        );\n\n        document.dispatchEvent(\n          new CustomEvent(\"cart:updated\", {\n            bubbles: true,\n            detail: result\n          })\n        );\n\n        window.location.href =\n          goToCheckout\n            ? root + \"checkout\"\n            : root + \"cart\";\n\n      } catch (error) {\n        console.error(\"PTS cart error:\", error);\n\n        setStatus(\n          error \u0026\u0026 error.message\n            ? error.message\n            : \"Unable to add the product.\",\n          \"error\"\n        );\n\n      } finally {\n        addButton.disabled = false;\n        buyButton.disabled = false;\n      }\n    }\n\n    minus.addEventListener(\"click\", function() {\n      input.value = Math.max(1, getBoxes() - 1);\n      refresh();\n    });\n\n    plus.addEventListener(\"click\", function() {\n      input.value = getBoxes() + 1;\n      refresh();\n    });\n\n    input.addEventListener(\"input\", function() {\n      if (input.value === \"\") return;\n      refresh();\n    });\n\n    input.addEventListener(\"change\", function() {\n      refresh();\n    });\n\n    input.addEventListener(\"blur\", function() {\n      refresh();\n    });\n\n    addButton.addEventListener(\"click\", function() {\n      addToCart(false);\n    });\n\n    buyButton.addEventListener(\"click\", function() {\n      addToCart(true);\n    });\n\n    refresh();\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", initWallBrushCard);\n  } else {\n    initWallBrushCard();\n  }\n\n  document.addEventListener(\"shopify:section:load\", initWallBrushCard);\n})();\n\u003c\/script\u003e\n","brand":"My Store","offers":[{"title":"Default Title","offer_id":56825051382100,"sku":null,"price":17.44,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1063\/3117\/7300\/files\/03026_1.png?v=1786988723","url":"https:\/\/buildpro-wholesale.com\/products\/6-150mm-wall-brush-wooden-handle","provider":"BUILDPRO WHOLESALE","version":"1.0","type":"link"}