{"product_id":"20-piece-assorted-brass-wire-brush-wheel-pack","title":"20 Piece Assorted Brass Wire Brush \u0026 Wheel Pack","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\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    border-top: 4px solid var(--pts-accent);\n    border-bottom: 1px solid var(--pts-line);\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    margin-bottom: 18px;\n    color: var(--pts-accent);\n    font-size: 9px;\n    font-weight: 800;\n    line-height: 1;\n    letter-spacing: 0.16em;\n    text-transform: uppercase;\n  }\n\n  .pts-eyebrow::before {\n    content: \"\";\n    width: 34px;\n    height: 2px;\n    background: var(--pts-accent);\n  }\n\n  .pts-product-title {\n    width: 100%;\n    max-width: 980px;\n    margin: 0 0 24px !important;\n    color: var(--pts-text);\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    color: var(--pts-muted);\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    width: 100%;\n    border-top: 1px solid var(--pts-line);\n    background: var(--pts-accent-soft);\n  }\n\n  .pts-stat {\n    position: relative;\n    min-width: 0;\n    min-height: 126px;\n    padding: 20px;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n    border-right: 1px solid var(--pts-line);\n    background: var(--pts-accent-soft);\n    overflow: hidden;\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    position: absolute;\n    left: 0;\n    bottom: 0;\n    width: 0;\n    height: 3px;\n    background: var(--pts-accent);\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    color: var(--pts-muted);\n    font-size: 9px;\n    font-weight: 800;\n    line-height: 1.4;\n    letter-spacing: 0.14em;\n    text-transform: uppercase;\n  }\n\n  .pts-stat-value {\n    display: block;\n    margin-top: 22px;\n    color: var(--pts-text);\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    margin-top: 8px;\n    color: var(--pts-muted);\n    font-size: 11px;\n    font-weight: 600;\n    line-height: 1.4;\n  }\n\n  \/* =========================================================\n     PURCHASE PANEL\n  ========================================================= *\/\n\n  .pts-purchase-panel {\n    width: 100%;\n    padding: 20px;\n    border-bottom: 1px solid var(--pts-line);\n    background: var(--pts-soft);\n  }\n\n  .pts-purchase-card {\n    width: 100%;\n    border: 1px solid var(--pts-line);\n    background: #ffffff;\n  }\n\n  .pts-purchase-main {\n    display: grid;\n    grid-template-columns:\n      minmax(220px, 0.9fr)\n      minmax(190px, 0.75fr)\n      minmax(280px, 1.2fr);\n    width: 100%;\n  }\n\n  \/* =========================================================\n     QUANTITY\n  ========================================================= *\/\n\n  .pts-purchase-quantity {\n    min-width: 0;\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    padding: 22px;\n    border-right: 1px solid var(--pts-line);\n    background: #ffffff;\n  }\n\n  .pts-purchase-label {\n    display: block;\n    margin-bottom: 12px;\n    color: var(--pts-muted);\n    font-size: 9px;\n    font-weight: 800;\n    line-height: 1.4;\n    letter-spacing: 0.13em;\n    text-transform: uppercase;\n  }\n\n  .pts-quantity-selector {\n    display: grid;\n    grid-template-columns: 50px 88px 50px;\n    width: max-content;\n    height: 52px;\n    border: 1px solid var(--pts-line);\n    background: #ffffff;\n  }\n\n  .pts-quantity-button {\n    appearance: none;\n    -webkit-appearance: none;\n    width: 50px;\n    height: 50px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    margin: 0;\n    padding: 0;\n    border: 0;\n    border-radius: 0;\n    background: #ffffff;\n    color: #111111;\n    cursor: pointer;\n    font-size: 22px;\n    font-weight: 500;\n    line-height: 1;\n    user-select: none;\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    background: var(--pts-soft);\n    color: #b9b9b5;\n  }\n\n  .pts-quantity-input {\n    appearance: textfield;\n    -moz-appearance: textfield;\n    width: 88px;\n    height: 50px;\n    margin: 0;\n    padding: 0 5px;\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    border-radius: 0;\n    outline: none;\n    background: #ffffff;\n    color: var(--pts-text);\n    text-align: center;\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    margin-top: 10px;\n    color: var(--pts-muted);\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    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    padding: 22px;\n    border-right: 1px solid var(--pts-line);\n    background: var(--pts-accent-soft);\n  }\n\n  .pts-order-total-value {\n    display: block;\n    color: var(--pts-text);\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    margin-top: 9px;\n    color: var(--pts-muted);\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    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    gap: 14px;\n    padding: 14px;\n    background: #ffffff;\n  }\n\n  .pts-buy-button {\n    appearance: none;\n    -webkit-appearance: none;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    width: 100%;\n    min-height: 54px;\n    margin: 0;\n    padding: 14px 18px;\n    border-radius: 0;\n    cursor: pointer;\n    font-size: 12px;\n    font-weight: 800;\n    line-height: 1.35;\n    letter-spacing: 0.055em;\n    text-align: center;\n    text-transform: uppercase;\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    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    background: #000000;\n    border-color: #000000;\n  }\n\n  .pts-buy-now {\n    border: 1px solid var(--pts-accent);\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    gap: 18px;\n    min-height: 46px;\n    padding: 10px 18px;\n    border-top: 1px solid var(--pts-line);\n    background: #ffffff;\n  }\n\n  .pts-purchase-footer-text {\n    color: var(--pts-muted);\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    color: var(--pts-muted);\n    font-size: 10px;\n    line-height: 1.5;\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    width: 100%;\n    border-bottom: 1px solid var(--pts-line);\n    background: var(--pts-soft);\n  }\n\n  .pts-index-item {\n    min-width: 0;\n    padding: 16px 18px;\n    border-right: 1px solid var(--pts-line);\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    background: var(--pts-accent-soft);\n  }\n\n  .pts-index-number {\n    display: block;\n    margin-bottom: 6px;\n    color: var(--pts-accent);\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    color: var(--pts-text);\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    background: var(--pts-bg);\n  }\n\n  .pts-section {\n    width: 100%;\n    border-bottom: 1px solid var(--pts-line);\n  }\n\n  .pts-section details {\n    display: block;\n    width: 100%;\n  }\n\n  .pts-section summary {\n    display: grid;\n    grid-template-columns:\n      82px\n      minmax(0, 1fr)\n      64px;\n    align-items: stretch;\n    width: 100%;\n    min-height: 86px;\n    padding: 0;\n    background: var(--pts-surface);\n    cursor: pointer;\n    list-style: none;\n    user-select: none;\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    border-right: 1px solid var(--pts-line);\n    color: var(--pts-accent);\n    font-size: 11px;\n    font-weight: 850;\n    line-height: 1;\n    letter-spacing: 0.12em;\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    display: flex;\n    align-items: center;\n    padding: 18px 24px;\n    color: var(--pts-text);\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    display: flex;\n    align-items: center;\n    justify-content: center;\n    min-width: 64px;\n    border-left: 1px solid var(--pts-line);\n    background: var(--pts-surface);\n    overflow: hidden;\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    display: block;\n    width: 26px;\n    height: 34px;\n    transform: rotate(0deg);\n    transform-origin: 50% 50%;\n    transition:\n      transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n  }\n\n  .pts-hammer::before {\n    content: \"\";\n    position: absolute;\n    left: 50%;\n    top: 11px;\n    width: 5px;\n    height: 23px;\n    background: var(--pts-accent);\n    transform: translateX(-50%);\n  }\n\n  .pts-hammer::after {\n    content: \"\";\n    position: absolute;\n    top: 4px;\n    left: 50%;\n    width: 24px;\n    height: 9px;\n    background: var(--pts-accent);\n    transform: translateX(-50%);\n  }\n\n  .pts-hammer-neck {\n    position: absolute;\n    top: 9px;\n    left: 50%;\n    width: 9px;\n    height: 8px;\n    background: var(--pts-accent);\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    grid-template-columns:\n      82px\n      minmax(0, 1fr);\n    width: 100%;\n    background: var(--pts-bg);\n  }\n\n  .pts-body-rail {\n    border-right: 1px solid var(--pts-line);\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    padding: clamp(22px, 4cqw, 42px);\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    width: 100%;\n    margin-top: 28px;\n    border-top: 1px solid var(--pts-line);\n    border-bottom: 1px solid var(--pts-line);\n    background: var(--pts-surface);\n  }\n\n  .pts-feature {\n    position: relative;\n    min-width: 0;\n    min-height: 100px;\n    padding: 18px;\n    border-right: 1px solid var(--pts-line);\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n    background: var(--pts-surface);\n    overflow: hidden;\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    position: absolute;\n    top: 0;\n    left: 0;\n    width: 3px;\n    height: 0;\n    background: var(--pts-accent);\n    transition: height 0.3s ease;\n  }\n\n  .pts-feature:hover {\n    padding-left: 23px;\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    font-size: 9px;\n    font-weight: 800;\n    line-height: 1.4;\n    letter-spacing: 0.12em;\n    text-transform: uppercase;\n  }\n\n  .pts-feature-value {\n    margin-top: 17px;\n    color: var(--pts-text);\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    width: 100%;\n    margin: 0;\n    padding: 0;\n    border-top: 1px solid var(--pts-line);\n    list-style: none;\n  }\n\n  .pts-spec-list li {\n    position: relative;\n    min-width: 0;\n    min-height: 84px;\n    padding: 17px 20px;\n    border-right: 1px solid var(--pts-line);\n    border-bottom: 1px solid var(--pts-line);\n    background: var(--pts-surface);\n    overflow: hidden;\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    position: absolute;\n    left: 0;\n    top: 0;\n    width: 3px;\n    height: 0;\n    background: var(--pts-accent);\n    transition: height 0.25s ease;\n  }\n\n  .pts-spec-list li:hover {\n    padding-left: 25px;\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    margin-bottom: 6px;\n    color: var(--pts-text);\n    font-size: 9px;\n    font-weight: 800;\n    line-height: 1.4;\n    letter-spacing: 0.1em;\n    text-transform: uppercase;\n  }\n\n  .pts-spec-list span {\n    display: block;\n    color: var(--pts-muted);\n    font-size: 13px;\n    line-height: 1.55;\n  }\n\n  \/* =========================================================\n     NOTE\n  ========================================================= *\/\n\n  .pts-note {\n    display: grid;\n    grid-template-columns:\n      46px\n      minmax(0, 1fr);\n    width: 100%;\n    margin-top: 20px;\n    border-top: 1px solid var(--pts-line);\n    border-bottom: 1px solid var(--pts-line);\n    background: var(--pts-accent-soft);\n  }\n\n  .pts-note-icon {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    border-right: 1px solid var(--pts-line);\n    color: var(--pts-accent);\n    font-family: Georgia, serif;\n    font-size: 15px;\n    font-weight: 700;\n  }\n\n  .pts-note-copy {\n    min-width: 0;\n    padding: 14px 16px;\n    color: var(--pts-muted);\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    grid-template-columns:\n      minmax(0, 1.3fr)\n      minmax(230px, 0.7fr);\n    width: 100%;\n    margin-top: 28px;\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    background: var(--pts-surface);\n  }\n\n  .pts-wholesale-row {\n    display: grid;\n    grid-template-columns:\n      minmax(120px, 38%)\n      minmax(0, 1fr);\n    min-height: 54px;\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    padding: 11px 15px;\n    border-right: 1px solid var(--pts-line);\n    background: var(--pts-soft);\n    color: var(--pts-muted);\n    font-size: 9px;\n    font-weight: 800;\n    line-height: 1.4;\n    letter-spacing: 0.1em;\n    text-transform: uppercase;\n  }\n\n  .pts-wholesale-value {\n    min-width: 0;\n    display: flex;\n    align-items: center;\n    padding: 11px 16px;\n    background: var(--pts-surface);\n    color: var(--pts-text);\n    font-size: 13px;\n    font-weight: 700;\n    line-height: 1.5;\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    background: var(--pts-accent-soft);\n  }\n\n  .pts-wholesale-summary {\n    min-width: 0;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n    padding: 28px;\n    background: #111111;\n    color: #ffffff;\n  }\n\n  .pts-summary-topline {\n    color: rgba(255, 255, 255, 0.64);\n    font-size: 9px;\n    font-weight: 800;\n    line-height: 1.4;\n    letter-spacing: 0.14em;\n    text-transform: uppercase;\n  }\n\n  .pts-summary-large {\n    margin: 30px 0;\n    color: #ffffff;\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    display: block;\n    width: 42px;\n    height: 3px;\n    margin-top: 18px;\n    background: var(--pts-accent);\n  }\n\n  .pts-summary-large small {\n    display: block;\n    margin-top: 11px;\n    color: rgba(255, 255, 255, 0.7);\n    font-size: 11px;\n    font-weight: 600;\n    line-height: 1.4;\n  }\n\n  .pts-summary-lines {\n    color: rgba(255, 255, 255, 0.8);\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      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 14px;\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      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      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      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      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      border-top: 0;\n    }\n\n    .pts-purchase-footer {\n      align-items: flex-start;\n      flex-direction: column;\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      min-height: 72px;\n    }\n\n    .pts-section-no {\n      font-size: 9px;\n    }\n\n    .pts-section-title {\n      padding: 13px 14px;\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      border-right: 0;\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-wire-brush-wheel-set-card\" data-box-size=\"24\" data-unit-price=\"71.41\" data-pieces-per-unit=\"20\"\u003e\n\u003cinput type=\"hidden\" class=\"pts-current-variant\" value=\"{{ product.selected_or_first_available_variant.id }}\"\u003e \u003c!-- =======================================================\n       PRODUCT OVERVIEW\n  ======================================================== --\u003e\n\u003cdiv class=\"pts-hero\"\u003e\n\u003cdiv class=\"pts-hero-copy\"\u003e\n\u003cspan class=\"pts-eyebrow\"\u003e 20-piece surface preparation accessory set \u003c\/span\u003e\n\u003ch2 class=\"pts-product-title\"\u003e20-Piece Assorted Wire Brush \u0026amp; Wheel Set\u003c\/h2\u003e\n\u003cp class=\"pts-intro\"\u003ePractical mixed wire-brush assortment supplied as one 20-piece set for general workshop cleaning, surface preparation and maintenance tasks. Each selling unit contains ten 3-inch brass wire cup brushes and ten 4-inch brass wire wheels, giving users two useful brush formats in one organised assortment. The mixed configuration is suitable for stocking within workshop, maintenance and general-purpose tool-accessory ranges.\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 Set contents \u003c\/span\u003e \u003cspan class=\"pts-stat-value\"\u003e 20 \u003csmall\u003e Wire brush accessories \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 £71.41 \u003csmall\u003e Per 20-piece set \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 1 box \u003csmall\u003e 24 sets \/ 480 accessories \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 £1,713.84 \u003csmall\u003e 24 sets \u003c\/small\u003e \u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- =======================================================\n       PURCHASE\n  ========================================================= --\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\"\u003e 1 box = \u003cstrong\u003e24 complete sets \/ 480 accessories\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 £1,713.84 \u003c\/span\u003e \u003cspan class=\"pts-order-total-meta\"\u003e 1 box · 24 sets \/ 480 accessories × £71.41 \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\"\u003e ADD BOX · 24 SETS \u003c\/button\u003e \u003cbutton type=\"button\" class=\"pts-buy-button pts-buy-now\"\u003e BUY NOW · £1,713.84 \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\"\u003e Minimum order: \u003cstrong\u003e1 box = 24 sets \/ 480 accessories\u003c\/strong\u003e · £71.41 per set · £1,713.84 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\u003c!-- =======================================================\n       SECTION INDEX\n  ========================================================= --\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 Mixed brush formats \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 Set specification \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\u003c!-- =======================================================\n       SECTIONS\n  ========================================================= --\u003e\n\u003cdiv class=\"pts-sections\"\u003e\n\u003c!-- SECTION 01 --\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 Mixed Wire Brush Formats \u0026amp; Workshop 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\u003eThis 20-piece assortment combines cup-brush and wheel-brush formats in one convenient selling unit. The mixed configuration gives users a practical choice of brush shapes for appropriate workshop cleaning, maintenance and surface-preparation tasks.\u003c\/p\u003e\n\u003cp\u003eEach set contains equal quantities of the two supplied formats: ten 3-inch brass wire cup brushes and ten 4-inch brass wire wheels. Keeping both formats together makes the assortment practical for workshop storage, trade counters and general tool-accessory ranges.\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 Cup brushes \u003c\/span\u003e \u003cspan class=\"pts-feature-value\"\u003e 10 × 3-inch brass wire cup brushes \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-feature\"\u003e\n\u003cspan class=\"pts-feature-label\"\u003e Wire wheels \u003c\/span\u003e \u003cspan class=\"pts-feature-value\"\u003e 10 × 4-inch brass wire wheels \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-feature\"\u003e\n\u003cspan class=\"pts-feature-label\"\u003e Total contents \u003c\/span\u003e \u003cspan class=\"pts-feature-value\"\u003e 20 accessories per set \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\u003c!-- SECTION 02 --\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 Set Specification \u0026amp; General 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 Assorted wire brush and wire wheel set. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Quantity per set \u003c\/strong\u003e\u003cspan\u003e 20 individual brush accessories. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Cup brush quantity \u003c\/strong\u003e\u003cspan\u003e 10 pieces. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Cup brush size \u003c\/strong\u003e\u003cspan\u003e 3 inches. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Wire wheel quantity \u003c\/strong\u003e\u003cspan\u003e 10 pieces. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Wire wheel size \u003c\/strong\u003e\u003cspan\u003e 4 inches. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Brush description \u003c\/strong\u003e\u003cspan\u003e Brass wire construction as stated for the supplied assortment. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e General use \u003c\/strong\u003e\u003cspan\u003e Appropriate workshop cleaning and surface-preparation applications. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Storage format \u003c\/strong\u003e\u003cspan\u003e Mixed accessories supplied together as one 20-piece assortment. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Equipment compatibility \u003c\/strong\u003e\u003cspan\u003e Use only with compatible equipment suitable for the individual brush fitting and operating requirements. \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\u003e The source listing confirms 10 × 3-inch brass wire cup brushes and 10 × 4-inch brass wire wheels. Exact spindle or shank fitting, wire gauge, maximum RPM and detailed material specification are not confirmed, so unsupported technical figures are not included.\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!-- SECTION 03 --\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, Handling \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 selected brush for loose, bent, damaged or excessively worn wire. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Compatibility \u003c\/strong\u003e\u003cspan\u003e Confirm that the brush size and fitting are suitable for the equipment being used. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Workpiece \u003c\/strong\u003e\u003cspan\u003e Secure the workpiece and confirm that wire brushing is appropriate for the surface. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Operation \u003c\/strong\u003e\u003cspan\u003e Apply controlled contact and avoid excessive pressure during use. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Personal protection \u003c\/strong\u003e\u003cspan\u003e Use suitable eye, face and hand protection for the task and equipment. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Work area \u003c\/strong\u003e\u003cspan\u003e Keep bystanders clear of the operating area and possible wire or debris ejection. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Cleaning \u003c\/strong\u003e\u003cspan\u003e Remove loose debris from the accessory and surrounding equipment after use. \u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e Storage \u003c\/strong\u003e\u003cspan\u003e Store unused accessories in a clean, dry location protected from impact and moisture. \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 Safety note: \u003c\/strong\u003e Wire brushes can release wire fragments and debris during operation. Always use suitable protective equipment, follow the operating instructions for the compatible power tool and do not use a damaged or incorrectly fitted brush.\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!-- SECTION 04 --\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 complete 20-piece assorted wire brush and wheel set. Each wholesale box contains 24 complete sets, equivalent to 480 individual brush accessories in total: 240 × 3-inch brass wire cup brushes and 240 × 4-inch brass wire wheels. Each set is priced at £71.41, giving a wholesale box value of £1,713.84.\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\"\u003e20-piece assorted wire brush \u0026amp; wheel set\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-row\"\u003e\n\u003cdiv class=\"pts-wholesale-key\"\u003eSet contents\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-value\"\u003e10 × 3-inch cup brushes + 10 × 4-inch wire wheels\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-row\"\u003e\n\u003cdiv class=\"pts-wholesale-key\"\u003ePieces per set\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-value\"\u003e20 accessories\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-row\"\u003e\n\u003cdiv class=\"pts-wholesale-key\"\u003eApplication\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-value\"\u003eWorkshop cleaning \u0026amp; surface preparation\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-row\"\u003e\n\u003cdiv class=\"pts-wholesale-key\"\u003eSet price\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-value\"\u003e£71.41\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 complete sets\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-row\"\u003e\n\u003cdiv class=\"pts-wholesale-key\"\u003eMinimum order\u003c\/div\u003e\n\u003cdiv class=\"pts-wholesale-value\"\u003e1 wholesale box\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£1,713.84\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£1,713.84\u003csmall\u003e 24 sets \/ 480 accessories \u003c\/small\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"pts-summary-lines\"\u003e\n\u003cstrong\u003e £71.41 \u003c\/strong\u003e per complete set\u003cbr\u003e\u003cstrong\u003e 24 sets \u003c\/strong\u003e per box\u003cbr\u003e\u003cstrong\u003e 480 accessories \u003c\/strong\u003e total\u003cbr\u003e\u003cstrong class=\"pts-orange\"\u003e £1,713.84 \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\u003e 1 box = 24 complete sets × £71.41 per set = £1,713.84. Each set contains 20 brush accessories, so one wholesale box contains 480 individual accessories.\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\n  function initProductCard(){\n\n    var card =\n      document.getElementById(\n        \"pts-wire-brush-wheel-set-card\"\n      );\n\n    if(\n      !card ||\n      card.dataset.ptsBound === \"true\"\n    ){\n      return;\n    }\n\n    card.dataset.ptsBound = \"true\";\n\n\n    var minus =\n      card.querySelector(\n        \".pts-quantity-minus\"\n      );\n\n    var plus =\n      card.querySelector(\n        \".pts-quantity-plus\"\n      );\n\n    var input =\n      card.querySelector(\n        \".pts-quantity-input\"\n      );\n\n    var addButton =\n      card.querySelector(\n        \".pts-add-cart\"\n      );\n\n    var buyButton =\n      card.querySelector(\n        \".pts-buy-now\"\n      );\n\n    var totalValue =\n      card.querySelector(\n        \".pts-order-total-value\"\n      );\n\n    var totalMeta =\n      card.querySelector(\n        \".pts-order-total-meta\"\n      );\n\n    var status =\n      card.querySelector(\n        \".pts-purchase-status\"\n      );\n\n    var variantField =\n      card.querySelector(\n        \".pts-current-variant\"\n      );\n\n\n    var boxSize =\n      parseInt(\n        card.dataset.boxSize || \"24\",\n        10\n      );\n\n    var unitPrice =\n      parseFloat(\n        card.dataset.unitPrice || \"71.41\"\n      );\n\n    var piecesPerUnit =\n      parseInt(\n        card.dataset.piecesPerUnit || \"20\",\n        10\n      );\n\n\n    function money(value){\n\n      return \"£\" +\n        Number(value).toLocaleString(\n          \"en-GB\",\n          {\n            minimumFractionDigits:2,\n            maximumFractionDigits:2\n          }\n        );\n\n    }\n\n\n    function getBoxes(){\n\n      var boxes =\n        parseInt(\n          input.value,\n          10\n        );\n\n      if(\n        isNaN(boxes) ||\n        boxes \u003c 1\n      ){\n        boxes = 1;\n      }\n\n      return boxes;\n\n    }\n\n\n    function setStatus(\n      message,\n      type\n    ){\n\n      if(!status){\n        return;\n      }\n\n      status.className =\n        \"pts-purchase-status\";\n\n      if(type){\n        status.classList.add(\n          \"is-\" + type\n        );\n      }\n\n      status.textContent =\n        message || \"\";\n\n    }\n\n\n    function refresh(){\n\n      var boxes =\n        getBoxes();\n\n      var sets =\n        boxes * boxSize;\n\n      var accessories =\n        sets * piecesPerUnit;\n\n      var total =\n        sets * unitPrice;\n\n\n      input.value =\n        boxes;\n\n      minus.disabled =\n        boxes \u003c= 1;\n\n\n      totalValue.textContent =\n        money(total);\n\n\n      totalMeta.textContent =\n        boxes +\n        (\n          boxes === 1\n            ? \" box\"\n            : \" boxes\"\n        ) +\n        \" · \" +\n        sets +\n        \" sets \/ \" +\n        accessories +\n        \" accessories × \" +\n        money(unitPrice);\n\n\n      addButton.textContent =\n        boxes === 1\n          ? \"ADD BOX · \" +\n            sets +\n            \" SETS\"\n          : \"ADD \" +\n            boxes +\n            \" BOXES · \" +\n            sets +\n            \" SETS\";\n\n\n      buyButton.textContent =\n        \"BUY NOW · \" +\n        money(total);\n\n    }\n\n\n    function isValidVariantId(value){\n\n      if(\n        value === undefined ||\n        value === null\n      ){\n        return false;\n      }\n\n      var clean =\n        String(value).trim();\n\n      if(\n        !\/^\\d+$\/.test(clean)\n      ){\n        return false;\n      }\n\n      var number =\n        Number(clean);\n\n      return(\n        Number.isFinite(number) \u0026\u0026\n        number \u003e 0\n      );\n\n    }\n\n\n    function readVariantFromField(field){\n\n      if(!field){\n        return null;\n      }\n\n      if(\n        isValidVariantId(\n          field.value\n        )\n      ){\n        return Number(\n          field.value\n        );\n      }\n\n      return null;\n\n    }\n\n\n    async function getVariantId(){\n\n      var directId =\n        readVariantFromField(\n          variantField\n        );\n\n      if(directId){\n        return directId;\n      }\n\n\n      var urlVariant =\n        new URLSearchParams(\n          window.location.search\n        ).get(\"variant\");\n\n      if(\n        isValidVariantId(\n          urlVariant\n        )\n      ){\n        return Number(\n          urlVariant\n        );\n      }\n\n\n      var section =\n        card.closest(\n          \".shopify-section\"\n        );\n\n      if(section){\n\n        var sectionFields =\n          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(\n          var i = 0;\n          i \u003c sectionFields.length;\n          i++\n        ){\n\n          var sectionId =\n            readVariantFromField(\n              sectionFields[i]\n            );\n\n          if(sectionId){\n            return sectionId;\n          }\n\n        }\n\n      }\n\n\n      var globalFields =\n        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(\n        var j = 0;\n        j \u003c globalFields.length;\n        j++\n      ){\n\n        var globalId =\n          readVariantFromField(\n            globalFields[j]\n          );\n\n        if(globalId){\n          return globalId;\n        }\n\n      }\n\n\n      try{\n\n        if(\n          window.ShopifyAnalytics \u0026\u0026\n          ShopifyAnalytics.meta \u0026\u0026\n          isValidVariantId(\n            ShopifyAnalytics.meta.selectedVariantId\n          )\n        ){\n\n          return Number(\n            ShopifyAnalytics.meta.selectedVariantId\n          );\n\n        }\n\n      }catch(error){}\n\n\n      try{\n\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\n          for(\n            var m = 0;\n            m \u003c meta.product.variants.length;\n            m++\n          ){\n\n            if(\n              isValidVariantId(\n                meta.product.variants[m].id\n              )\n            ){\n\n              return Number(\n                meta.product.variants[m].id\n              );\n\n            }\n\n          }\n\n        }\n\n      }catch(error){}\n\n\n      try{\n\n        var productPath =\n          window.location.pathname;\n\n\n        var canonical =\n          document.querySelector(\n            'link[rel=\"canonical\"]'\n          );\n\n\n        if(\n          canonical \u0026\u0026\n          canonical.href\n        ){\n\n          try{\n\n            productPath =\n              new URL(\n                canonical.href,\n                window.location.origin\n              ).pathname;\n\n          }catch(error){}\n\n        }\n\n\n        productPath =\n          productPath.replace(\n            \/\\\/$\/,\n            \"\"\n          );\n\n\n        if(\n          productPath.indexOf(\n            \"\/products\/\"\n          ) !== -1\n        ){\n\n          var productResponse =\n            await fetch(\n              productPath + \".js\",\n              {\n                method:\"GET\",\n\n                headers:{\n                  \"Accept\":\n                    \"application\/json\"\n                },\n\n                credentials:\n                  \"same-origin\"\n              }\n            );\n\n\n          if(productResponse.ok){\n\n            var productData =\n              await productResponse.json();\n\n\n            if(\n              productData \u0026\u0026\n              productData.variants \u0026\u0026\n              productData.variants.length\n            ){\n\n              for(\n                var p = 0;\n                p \u003c productData.variants.length;\n                p++\n              ){\n\n                if(\n                  productData.variants[p].available \u0026\u0026\n                  isValidVariantId(\n                    productData.variants[p].id\n                  )\n                ){\n\n                  return Number(\n                    productData.variants[p].id\n                  );\n\n                }\n\n              }\n\n\n              if(\n                isValidVariantId(\n                  productData.variants[0].id\n                )\n              ){\n\n                return Number(\n                  productData.variants[0].id\n                );\n\n              }\n\n            }\n\n          }\n\n        }\n\n      }catch(error){\n\n        console.error(\n          \"PTS product JSON variant lookup failed:\",\n          error\n        );\n\n      }\n\n\n      return null;\n\n    }\n\n\n    async function addToCart(\n      goToCheckout\n    ){\n\n      setStatus(\n        \"Detecting product variant...\"\n      );\n\n\n      var variantId =\n        await getVariantId();\n\n\n      if(!variantId){\n\n        setStatus(\n          \"Unable to detect the Shopify product variant.\",\n          \"error\"\n        );\n\n        return;\n\n      }\n\n\n      var boxes =\n        getBoxes();\n\n      \/*\n        1 Shopify selling unit =\n        1 complete 20-piece wire brush \u0026 wheel set.\n\n        1 wholesale box =\n        24 Shopify selling units.\n\n        Internal accessory count is display-only:\n        24 sets × 20 accessories = 480 accessories.\n      *\/\n\n      var sets =\n        boxes * boxSize;\n\n\n      addButton.disabled =\n        true;\n\n      buyButton.disabled =\n        true;\n\n\n      setStatus(\n        \"Adding \" +\n        sets +\n        \" wire brush sets to cart...\"\n      );\n\n\n      try{\n\n        var root =\n          window.Shopify \u0026\u0026\n          Shopify.routes \u0026\u0026\n          Shopify.routes.root\n            ? Shopify.routes.root\n            : \"\/\";\n\n\n        var response =\n          await fetch(\n            root + \"cart\/add.js\",\n            {\n              method:\"POST\",\n\n              headers:{\n                \"Content-Type\":\n                  \"application\/json\",\n\n                \"Accept\":\n                  \"application\/json\"\n              },\n\n              body:\n                JSON.stringify({\n                  items:[\n                    {\n                      id:\n                        Number(\n                          variantId\n                        ),\n\n                      quantity:\n                        sets\n                    }\n                  ]\n                })\n            }\n          );\n\n\n        var result =\n          await response.json();\n\n\n        if(!response.ok){\n\n          throw new Error(\n            result.description ||\n            result.message ||\n            \"Unable to add the product.\"\n          );\n\n        }\n\n\n        setStatus(\n          sets +\n          \" wire brush sets added successfully.\",\n          \"success\"\n        );\n\n\n        document.dispatchEvent(\n          new CustomEvent(\n            \"cart:refresh\",\n            {\n              bubbles:true,\n              detail:result\n            }\n          )\n        );\n\n\n        document.dispatchEvent(\n          new CustomEvent(\n            \"cart:updated\",\n            {\n              bubbles:true,\n              detail:result\n            }\n          )\n        );\n\n\n        window.location.href =\n          goToCheckout\n            ? root + \"checkout\"\n            : root + \"cart\";\n\n\n      }catch(error){\n\n        console.error(\n          \"PTS cart error:\",\n          error\n        );\n\n\n        setStatus(\n          error \u0026\u0026\n          error.message\n            ? error.message\n            : \"Unable to add the product.\",\n          \"error\"\n        );\n\n\n      }finally{\n\n        addButton.disabled =\n          false;\n\n        buyButton.disabled =\n          false;\n\n      }\n\n    }\n\n\n    minus.addEventListener(\n      \"click\",\n      function(){\n\n        input.value =\n          Math.max(\n            1,\n            getBoxes() - 1\n          );\n\n        refresh();\n\n      }\n    );\n\n\n    plus.addEventListener(\n      \"click\",\n      function(){\n\n        input.value =\n          getBoxes() + 1;\n\n        refresh();\n\n      }\n    );\n\n\n    input.addEventListener(\n      \"input\",\n      function(){\n\n        if(\n          input.value === \"\"\n        ){\n          return;\n        }\n\n        refresh();\n\n      }\n    );\n\n\n    input.addEventListener(\n      \"change\",\n      refresh\n    );\n\n\n    input.addEventListener(\n      \"blur\",\n      refresh\n    );\n\n\n    addButton.addEventListener(\n      \"click\",\n      function(){\n\n        addToCart(false);\n\n      }\n    );\n\n\n    buyButton.addEventListener(\n      \"click\",\n      function(){\n\n        addToCart(true);\n\n      }\n    );\n\n\n    refresh();\n\n  }\n\n\n  if(\n    document.readyState ===\n    \"loading\"\n  ){\n\n    document.addEventListener(\n      \"DOMContentLoaded\",\n      initProductCard\n    );\n\n  }else{\n\n    initProductCard();\n\n  }\n\n\n  document.addEventListener(\n    \"shopify:section:load\",\n    initProductCard\n  );\n\n})();\n\u003c\/script\u003e\n","brand":"My Store","offers":[{"title":"Default Title","offer_id":56824289263956,"sku":null,"price":71.41,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1063\/3117\/7300\/files\/987656789.png?v=1786982003","url":"https:\/\/buildpro-wholesale.com\/products\/20-piece-assorted-brass-wire-brush-wheel-pack","provider":"BUILDPRO WHOLESALE","version":"1.0","type":"link"}