{"id":123,"date":"2026-01-08T18:17:08","date_gmt":"2026-01-08T18:17:08","guid":{"rendered":"http:\/\/localhost:10010\/?page_id=123"},"modified":"2026-02-09T11:36:20","modified_gmt":"2026-02-09T11:36:20","slug":"groothandel","status":"publish","type":"page","link":"https:\/\/kampaoutdoors.com\/nl\/stockists\/","title":{"rendered":"Verkooppunten"},"content":{"rendered":"\n<div class=\"wp-block-group is-layout-constrained wp-container-core-group-is-layout-6e3a06a9 wp-block-group-is-layout-constrained\" style=\"margin-top:0\">\n<p class=\"has-text-align-center is-style-lead\" style=\"margin-bottom:var(--wp--preset--spacing--medium)\">Our partners are not about shopping experiences as we know it; they are about a living experience. Come to us with ideas of what you enjoy and tell us stories of adventure.<\/p>\n<\/div>\n\n\n    <div class=\"align wp-block-acf-dynamic-stockists-list\" id=\"dynamic-stockists-list-block_6c4206cdbd8a9e136441e55dfcbc899d\" data-no-translation>\r\n        <div class=\"not-prose scroll-m-6 sm:scroll-m-36\" x-data=\"stockistsList()\" x-init=\"init()\" x-ref=\"listTop\">\r\n            <div class=\"sm:flex flex-wrap items-center gap-4 mb-4 sm:mb-6 space-y-3 sm:space-y-0\">\r\n                <!-- <label class=\"inline-flex items-center gap-2 text-sm\">\r\n                    <input type=\"checkbox\" class=\"rounded border checked:bg-black\" x-model=\"ambassadorsOnly\" x-on:change=\"setPage(1)\" \/>\r\n                    <span>Show ambassadors only<\/span>\r\n                <\/label> -->\r\n                <label class=\"block sm:inline-flex items-center gap-2\">\r\n                    <span class=\"sr-only\">Country<\/span>\r\n                    <select class=\"rounded bg-secondary\/10 px-4 py-2 pr-8 w-full disabled:text-foreground\/50 min-w-60\" x-model=\"country\" x-on:change=\"county=''; setPage(1)\">\r\n                        <option value=\"\">All countries<\/option>\r\n                        <template x-for=\"option in countries\" :key=\"option\">\r\n                            <option :value=\"option\" :selected=\"country === option\" x-text=\"option\"><\/option>\r\n                        <\/template>\r\n                    <\/select>\r\n                <\/label>\r\n                <label class=\"block sm:inline-flex items-center gap-2\">\r\n                    <span class=\"sr-only\">County<\/span>\r\n                    <select class=\"rounded bg-secondary\/10 px-4 py-2 pr-8 w-full disabled:text-foreground\/50 min-w-60\" x-model=\"county\" x-on:change=\"setPage(1)\" :disabled=\"!country\">\r\n                        <option value=\"\">All counties<\/option>\r\n                        <template x-for=\"option in counties\" :key=\"option\">\r\n                            <option :value=\"option\" x-text=\"option\"><\/option>\r\n                        <\/template>\r\n                    <\/select>\r\n                <\/label>\r\n\r\n                <p class=\"text-sm text-foreground\/75 mt-6 sm:mt-0\" x-text=\"total + ' stockists found'\"><\/p>\r\n            <\/div>\r\n\r\n            <div class=\"text-center\" x-show=\"isLoading\" role=\"status\">\r\n                <span class=\"sr-only\">Loading stockists&#8230;<\/span>\r\n                <div class=\"space-y-2\">\r\n                    <template x-for=\"i in 20\" :key=\"i\">\r\n                        <div class=\"rounded-xl bg-secondary\/10 p-4 space-y-2.5\">\r\n                            <div class=\"animate-pulse h-2.5 bg-secondary\/20 rounded-full w-1\/3\"><\/div>\r\n                            <div class=\"animate-pulse h-2.5 bg-secondary\/20 rounded-full w-1\/2\"><\/div>\r\n                            <div class=\"animate-pulse h-2.5 bg-secondary\/20 rounded-full w-1\/5\" ><\/div>                 \r\n                        <\/div>\r\n                    <\/template>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"text-center text-red-600\" x-show=\"error\" x-text=\"error\"><\/div>\r\n            <ul class=\"stockists-list list-none text-center sm:text-left grid gap-2\" x-show=\"!isLoading &#038;&#038; !error\">\r\n                <template x-for=\"stockist in stockists\" :key=\"stockist.id\">\r\n                    <li class=\"stockist-item rounded-xl p-4 py-3 sm:flex gap-x-4 justify-between\" :class=\"stockist.is_ambassador ? 'bg-secondary\/10' : 'bg-secondary\/10'\">\r\n                        <div class=\"flex gap-x-4 sm:gap-x-5 mb-1 sm:mb-0\">\r\n                            <template x-if=\"stockist.logo &#038;&#038; stockist.is_ambassador\">\r\n                                <div class=\"size-32 bg-white rounded-md overflow-hidden flex items-center justify-center shrink-0 my-1\">\r\n                                    <img :src=\"stockist.logo\" :alt=\"stockist.title + ' logo'\" class=\"w-full h-auto object-contain mb-2 max-h-24\" \/>\r\n                                <\/div>\r\n                            <\/template>\r\n                            <div class=\"leading-tight flex flex-col items-start text-left pt-1\">                                \r\n                                <div>\r\n                                    <template x-if=\"stockist.is_ambassador\">\r\n                                        <p class=\"bg-quiz-primary text-white inline-block rounded px-2 py-1 text-xs mb-2\">Ambassador<\/p>\r\n                                    <\/template>\r\n                                    <h3 class=\"text-base sm:text-lg font-medium\" x-html=\"stockist.title\"><\/h3>                                \r\n                                    <template x-if=\"stockist.address\">\r\n                                        <p x-html=\"stockist.address\" class=\"text-xs sm:text-sm opacity-75\"><\/p>\r\n                                    <\/template>\r\n                                <\/div>\r\n                                <template x-if=\"stockist.phone_number\">\r\n                                    <p class=\"text-xs sm:text-sm flex items-center gap-0.5 mt-3 font-medium\">\r\n                                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"size-4 stroke-none fill-foreground -ml-0.5\"><path d=\"M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384\"\/><\/svg>    \r\n                                        <a class=\"hover:underline\" :href=\"'tel:' + stockist.phone_number\" x-html=\"stockist.phone_number\"><\/a>\r\n                                    <\/p>\r\n                                <\/template>\r\n                            <\/div>\r\n                        <\/div>                        \r\n                        <template x-if=\"stockist.website_url\">\r\n                            <div class=\"flex items-center mt-3 sm:mt-0 mb-1 sm:mb-0\">\r\n                                <a class=\"flex items-center justify-center text-sm w-full sm:w-auto text-center uppercase bg-primary text-white rounded-full px-6 py-3 transition font-medium hover:bg-primary\/90 whitespace-nowrap\" :href=\"stockist.website_url\" target=\"_blank\" rel=\"noopener noreferrer\">Visit website<\/a>\r\n                            <\/div>\r\n                        <\/template>\r\n                    <\/li>\r\n                <\/template>\r\n            <\/ul>\r\n            <div class=\"flex flex-wrap items-center justify-center gap-3 mt-12\" x-show=\"showPager\">\r\n                <button class=\"rounded-md size-12 inline-flex items-center justify-center bg-secondary\/15 disabled:hover:bg-secondary\/15 disabled:opacity-50 transition-colors hover:bg-secondary\/30 cursor-pointer disabled:cursor-default text-lg\" type=\"button\" x-on:click=\"setPage(page - 1)\" :disabled=\"!canPrev\">\r\n                    <span class=\"sr-only\">Previous<\/span>\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"size-6\"><path d=\"M15 18l-6-6 6-6\"\/><\/svg>\r\n                <\/button>\r\n                <button\r\n                    class=\"rounded-md size-12 inline-flex items-center justify-center text-lg font-medium transition-colors bg-secondary\/15 hover:bg-secondary\/30 cursor-pointer\"\r\n                    type=\"button\"\r\n                    x-show=\"showFirstPage\"\r\n                    x-on:click=\"setPage(1)\"\r\n                >\r\n                    1\r\n                <\/button>\r\n                <span class=\"text-sm text-foreground\/60\" x-show=\"showLeadingEllipsis\">&hellip;<\/span>\r\n                <template x-for=\"pageNumber in pagerPages\" :key=\"pageNumber\">\r\n                    <button\r\n                        class=\"rounded-md size-12 inline-flex items-center justify-center text-lg font-medium transition-colors cursor-pointer\"\r\n                        :class=\"pageNumber === page ? 'bg-quiz-primary text-white' : 'bg-secondary\/15 hover:bg-secondary\/30'\"\r\n                        type=\"button\"\r\n                        x-on:click=\"setPage(pageNumber)\"\r\n                    >\r\n                        <span x-text=\"pageNumber\"><\/span>\r\n                    <\/button>\r\n                <\/template>\r\n                <span class=\"text-sm text-foreground\/60\" x-show=\"showTrailingEllipsis\">&hellip;<\/span>\r\n                <button\r\n                    class=\"rounded-md size-12 inline-flex items-center justify-center text-lg font-medium transition-colors bg-secondary\/15 hover:bg-secondary\/30 cursor-pointer\"\r\n                    type=\"button\"\r\n                    x-show=\"showLastPage\"\r\n                    x-on:click=\"setPage(totalPages)\"\r\n                    x-text=\"totalPages\"\r\n                ><\/button>\r\n                <button class=\"rounded-md size-12 inline-flex items-center justify-center bg-secondary\/15 disabled:hover:bg-secondary\/ disabled:opacity-50 transition-colors hover:bg-secondary\/30 cursor-pointer disabled:cursor-default text-lg\" type=\"button\" x-on:click=\"setPage(page + 1)\" :disabled=\"!canNext\">\r\n                    <span class=\"sr-only\">Next<\/span>\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"size-6\"><path d=\"M9 18l6-6-6-6\"\/><\/svg>\r\n                <\/button>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <script>\r\n        \r\n        document.addEventListener('alpine:init', () => {\r\n            Alpine.data('stockistsList', () => ({\r\n                stockists: [],\r\n                countries: [],\r\n                country: 'Netherlands',\r\n                counties: [],\r\n                county: '',\r\n                ambassadorsOnly: false,\r\n                total: 0,\r\n                page: 1,\r\n                perPage: 20,\r\n                totalPages: 1,\r\n                isLoading: true,\r\n                error: '',\r\n\r\n                get showPager() {\r\n                    return !this.isLoading && !this.error && this.totalPages > 1;\r\n                },\r\n\r\n                get canPrev() {\r\n                    return this.page > 1;\r\n                },\r\n\r\n                get canNext() {\r\n                    return this.page < this.totalPages;\r\n                },\r\n\r\n                get pagerPages() {\r\n                    const windowSize = 4;\r\n                    if (this.totalPages <= windowSize) {\r\n                        return Array.from({ length: this.totalPages }, (_, index) => index + 1);\r\n                    }\r\n\r\n                    let start = Math.max(1, this.page - 1);\r\n                    let end = start + windowSize - 1;\r\n\r\n                    if (end > this.totalPages) {\r\n                        end = this.totalPages;\r\n                        start = Math.max(1, end - windowSize + 1);\r\n                    }\r\n\r\n                    return Array.from({ length: end - start + 1 }, (_, index) => start + index);\r\n                },\r\n\r\n                get showFirstPage() {\r\n                    return (this.pagerPages[0] || 1) > 1;\r\n                },\r\n\r\n                get showLeadingEllipsis() {\r\n                    return (this.pagerPages[0] || 1) > 2;\r\n                },\r\n\r\n                get showTrailingEllipsis() {\r\n                    const lastShown = this.pagerPages[this.pagerPages.length - 1] || 0;\r\n                    return lastShown + 1 < this.totalPages;\r\n                },\r\n\r\n                get showLastPage() {\r\n                    const lastShown = this.pagerPages[this.pagerPages.length - 1] || 0;\r\n                    return lastShown < this.totalPages;\r\n                },\r\n\r\n                init() {\r\n                    this.loadStockists();\r\n                },\r\n\r\n                setPage(newPage) {\r\n                    this.page = newPage;\r\n                    this.scrollToList();\r\n                    this.loadStockists();\r\n                },\r\n\r\n                scrollToList() {\r\n                    if (!this.$refs.listTop) {\r\n                        return;\r\n                    }\r\n\r\n                    this.$refs.listTop.scrollIntoView({\r\n                        behavior: 'auto',\r\n                        block: 'start'\r\n                    });\r\n                },\r\n\r\n                async loadStockists() {\r\n\r\n                    this.isLoading = true;\r\n                    this.error = '';\r\n\r\n                    const url = new URL(\"https:\/\/kampaoutdoors.com\/nl\/wp-json\/kampa\/v1\/stockists\", window.location.origin);\r\n                    if (this.ambassadorsOnly) {\r\n                        url.searchParams.set('ambassadors_only', '1');\r\n                    }\r\n                    if (this.country) {\r\n                        url.searchParams.set('country', this.country);\r\n                    }\r\n                    if (this.county) {\r\n                        url.searchParams.set('county', this.county);\r\n                    }\r\n                    url.searchParams.set('page', this.page.toString());\r\n                    url.searchParams.set('per_page', this.perPage.toString());\r\n\r\n                    try {\r\n                        const response = await fetch(url.toString(), {\r\n                            headers: {\r\n                                'Accept': 'application\/json'\r\n                            }\r\n                        });\r\n\r\n                        if (!response.ok) {\r\n                            throw new Error('Unable to load stockists.');\r\n                        }\r\n\r\n                        const payload = await response.json();\r\n                        this.stockists = payload.items || [];\r\n                        this.totalPages = payload.total_pages || 1;\r\n                        this.total = payload.total || 0;\r\n                        if (Array.isArray(payload.countries)) {\r\n                            this.countries = payload.countries;\r\n                        }\r\n                        if (Array.isArray(payload.counties)) {\r\n                            this.counties = payload.counties;\r\n                        }\r\n                    } catch (error) {\r\n                        this.error = error?.message || 'Unable to load stockists.';\r\n                        this.stockists = [];\r\n                        this.totalPages = 1;\r\n                        this.total = 0;\r\n                    } finally {\r\n                        this.isLoading = false;\r\n                    }\r\n                }\r\n            }));\r\n        });\r\n    <\/script>\r\n\n\n\r\n    <div style=\"margin-top:var(--wp--preset--spacing--large);\" class=\"alignwide wp-block-acf-stockist-logos\" id=\"stockist-logos-block_549f6cce831770888b19e721436bfd17\">\r\n    <div class=\"not-prose\">\r\n        <div class=\"rounded-xl px-4 py-0 sm:px-6 sm:py-3 overflow-x-auto flex justify-between items-center gap-3 bg-primary\">\r\n            \r\n                            \r\n                <a href=\"https:\/\/www.outdoorxl.com\/kampa.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"block mix-blend-multiply\"><img loading=\"lazy\" decoding=\"async\" width=\"267\" height=\"71\" src=\"https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/outdoorxl.png\" class=\"min-w-24 max-w-24 sm:max-w-56 w-full mix-blend-multiply\" alt=\"\" srcset=\"https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/outdoorxl.png 267w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/outdoorxl-18x5.png 18w\" sizes=\"auto, (max-width: 267px) 100vw, 267px\" \/><\/a><a href=\"https:\/\/www.baxrecreatieshop.nl\/tenten\/kampa-tenten.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"block mix-blend-multiply\"><img loading=\"lazy\" decoding=\"async\" width=\"155\" height=\"155\" src=\"https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/bax.png\" class=\"min-w-24 max-w-24 sm:max-w-56 w-full mix-blend-multiply\" alt=\"\" srcset=\"https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/bax.png 155w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/bax-150x150.png 150w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/bax-12x12.png 12w\" sizes=\"auto, (max-width: 155px) 100vw, 155px\" \/><\/a><a href=\"https:\/\/www.kampeerhalroden.nl\/merken-tenten\/kampa\/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"block mix-blend-multiply\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"71\" src=\"https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeerhal-300x71.png\" class=\"min-w-24 max-w-24 sm:max-w-56 w-full mix-blend-multiply\" alt=\"\" srcset=\"https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeerhal-300x71.png 300w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeerhal-768x182.png 768w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeerhal-18x4.png 18w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeerhal.png 879w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"72\" src=\"https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeer-300x72.png\" class=\"min-w-24 max-w-24 sm:max-w-56 w-full mix-blend-multiply\" alt=\"\" srcset=\"https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeer-300x72.png 300w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeer-1024x247.png 1024w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeer-768x185.png 768w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeer-1536x370.png 1536w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeer-2048x493.png 2048w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeer-18x4.png 18w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeer-1880x453.png 1880w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeer-2000x482.png 2000w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/kampeer-1000x241.png 1000w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><a href=\"https:\/\/www.tevelde.nl\/kamperen\/voortenten-en-luifels\/kampa-opblaasbare-voortenten.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"block mix-blend-multiply\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"67\" src=\"https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/tevelde-300x67.png\" class=\"min-w-24 max-w-24 sm:max-w-56 w-full mix-blend-multiply\" alt=\"\" srcset=\"https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/tevelde-300x67.png 300w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/tevelde-18x4.png 18w, https:\/\/kampaoutdoors.com\/wp-content\/uploads\/2026\/04\/tevelde.png 381w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>                \r\n        <\/div>\r\n            <\/div>\r\n    <\/div>\r\n","protected":false},"excerpt":{"rendered":"<p>Bij onze partners gaat het niet om winkelervaringen zoals wij die kennen; het gaat om een levende ervaring. Kom naar ons met idee\u00ebn over wat je leuk vindt en vertel ons verhalen over avontuur.<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":true,"_seopress_robots_primary_cat":"","_seopress_titles_title":"Find you nearest KAMPA stockist","_seopress_titles_desc":"Our partners are not about shopping experiences as we know it; they are about a living experience.","_seopress_robots_index":"","footnotes":""},"class_list":["post-123","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/kampaoutdoors.com\/nl\/wp-json\/wp\/v2\/pages\/123","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kampaoutdoors.com\/nl\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/kampaoutdoors.com\/nl\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/kampaoutdoors.com\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kampaoutdoors.com\/nl\/wp-json\/wp\/v2\/comments?post=123"}],"version-history":[{"count":0,"href":"https:\/\/kampaoutdoors.com\/nl\/wp-json\/wp\/v2\/pages\/123\/revisions"}],"wp:attachment":[{"href":"https:\/\/kampaoutdoors.com\/nl\/wp-json\/wp\/v2\/media?parent=123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}