{"id":43054,"date":"2026-09-08T19:54:21","date_gmt":"2026-09-08T23:54:21","guid":{"rendered":"https:\/\/dormalab.com\/magasin-de-sommeil-dorma\/"},"modified":"2026-09-08T20:09:29","modified_gmt":"2026-09-09T00:09:29","slug":"magasin-de-sommeil-dorma","status":"publish","type":"page","link":"https:\/\/dormalab.com\/fr\/magasin-de-sommeil-dorma\/","title":{"rendered":"Boutique du sommeil Dorma"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"43054\" class=\"elementor elementor-43054 elementor-bc-flex-widget\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-dormashop e-con-full e-flex e-con e-parent\" data-id=\"dormashop\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-dormacat elementor-widget elementor-widget-html\" data-id=\"dormacat\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\" \/>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin \/>\n<link\n      href=\"https:\/\/fonts.googleapis.com\/css2?family=Barlow:wght@400;500;600;700&family=Lato:wght@400;700&display=swap\"\n      rel=\"stylesheet\"\n    \/>\n<style>\n      \/* Dorma sleep shop \u2014 standalone catalogue for dormalab.com.\n         Type and palette are sampled from the live site so this page sits\n         inside the theme rather than beside it: Barlow carries every heading\n         and product name (uppercase, as on \/shop), Lato carries body copy,\n         and #1F73BE \/ #112C51 are the site's own blue and navy.\n\n         Prices are never rendered here. The public API returns no price data\n         at all; each card sends the customer to the portal to sign in. *\/\n      .dlc {\n        --dlc-blue: #1f73be;\n        --dlc-blue-700: #175a96;\n        --dlc-navy: #112c51;\n        --dlc-navy-900: #0b1e39;\n        --dlc-ink: #1b1b1b;\n        --dlc-ink-60: #5a6270;\n        --dlc-ink-40: #8b93a0;\n        --dlc-line: #e4e7ea;\n        --dlc-panel: #f7f7f7;\n        --dlc-panel-2: #f1f2f3;\n        --dlc-white: #fff;\n        --dlc-ember: #ef8354;\n        --dlc-shadow: 0 1px 2px rgba(17, 44, 81, 0.06);\n        --dlc-shadow-lift: 0 18px 40px rgba(17, 44, 81, 0.13);\n\n        --dlc-display: \"Barlow\", \"Helvetica Neue\", Arial, sans-serif;\n        --dlc-body: \"Lato\", \"Helvetica Neue\", Arial, sans-serif;\n\n        color: var(--dlc-ink);\n        background: var(--dlc-white);\n        font-family: var(--dlc-body);\n        font-size: 16px;\n        line-height: 1.6;\n        -webkit-font-smoothing: antialiased;\n      }\n\n      .dlc *,\n      .dlc *::before,\n      .dlc *::after {\n        box-sizing: border-box;\n      }\n\n      .dlc button,\n      .dlc input,\n      .dlc select,\n      .dlc a {\n        font: inherit;\n      }\n\n      .dlc-shell {\n        width: min(1240px, calc(100% - 40px));\n        margin: 0 auto;\n        padding: 28px 0 88px;\n      }\n\n      \/* ---------- Hero ---------------------------------------------------- *\/\n\n      .dlc-hero {\n        position: relative;\n        overflow: hidden;\n        border-radius: 4px;\n        padding: clamp(34px, 5vw, 62px);\n        color: var(--dlc-white);\n        background:\n          radial-gradient(\n            120% 140% at 88% 8%,\n            rgba(31, 115, 190, 0.95),\n            transparent 62%\n          ),\n          linear-gradient(\n            118deg,\n            var(--dlc-navy-900) 4%,\n            var(--dlc-navy) 52%,\n            #17457a 100%\n          );\n        display: grid;\n        grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);\n        gap: clamp(24px, 4vw, 56px);\n        align-items: center;\n      }\n\n      \/* A single hairline arc, echoing the CPAP tubing curve on the live\n         banner. Decorative only, and it never overlaps the copy column. *\/\n      .dlc-hero::after {\n        content: \"\";\n        position: absolute;\n        right: -14%;\n        top: -46%;\n        width: 62%;\n        aspect-ratio: 1;\n        border-radius: 50%;\n        border: 1px solid rgba(255, 255, 255, 0.16);\n        pointer-events: none;\n      }\n\n      .dlc-hero-copy {\n        position: relative;\n        z-index: 1;\n        max-width: 30rem;\n      }\n\n      .dlc-wordmark {\n        display: inline-flex;\n        align-items: center;\n        gap: 9px;\n        font-family: var(--dlc-display);\n        font-weight: 700;\n        font-size: 19px;\n        letter-spacing: 0.24em;\n        text-transform: uppercase;\n        margin-bottom: clamp(20px, 4vw, 38px);\n      }\n\n      .dlc-wordmark span {\n        width: 9px;\n        height: 9px;\n        border-radius: 50%;\n        background: var(--dlc-ember);\n      }\n\n      .dlc-kicker {\n        display: block;\n        font-family: var(--dlc-display);\n        font-weight: 600;\n        font-size: 12.5px;\n        letter-spacing: 0.2em;\n        text-transform: uppercase;\n        color: #9ccbf1;\n        margin-bottom: 14px;\n      }\n\n      .dlc-hero h1 {\n        font-family: var(--dlc-display);\n        font-weight: 700;\n        font-size: clamp(32px, 4.6vw, 52px);\n        line-height: 1.06;\n        letter-spacing: 0.4px;\n        margin: 0 0 16px;\n      }\n\n      .dlc-hero p {\n        margin: 0 0 26px;\n        font-size: 17px;\n        line-height: 1.6;\n        color: rgba(255, 255, 255, 0.86);\n      }\n\n      .dlc-cta {\n        display: inline-flex;\n        align-items: center;\n        gap: 10px;\n        padding: 14px 26px;\n        border: 0;\n        border-radius: 2px;\n        cursor: pointer;\n        text-decoration: none;\n        background: var(--dlc-white);\n        color: var(--dlc-navy);\n        font-family: var(--dlc-display);\n        font-weight: 600;\n        font-size: 15px;\n        letter-spacing: 0.1em;\n        text-transform: uppercase;\n        transition:\n          transform 0.18s ease,\n          box-shadow 0.18s ease;\n      }\n\n      .dlc-cta:hover,\n      .dlc-cta:focus-visible {\n        transform: translateY(-2px);\n        box-shadow: 0 14px 30px rgba(0, 0, 0, 0.24);\n      }\n\n      .dlc-cta svg {\n        flex: none;\n      }\n\n      \/* Product cluster. Three real catalogue photographs, staggered so the\n         banner shows the actual equipment rather than stock imagery. *\/\n      .dlc-hero-art {\n        position: relative;\n        z-index: 1;\n        min-height: 232px;\n        \/* Capped so the banner stays a banner: without it the wide lead tile\n           grows with the viewport and pushes the catalogue below the fold. *\/\n        max-height: 336px;\n        display: grid;\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        grid-template-rows: 1.06fr 1fr;\n        gap: 14px;\n      }\n\n      .dlc-art-tile {\n        position: relative;\n        overflow: hidden;\n        border-radius: 3px;\n        background: #f2f5f8;\n        box-shadow: 0 16px 38px rgba(4, 18, 36, 0.34);\n        opacity: 0;\n        animation: dlc-rise 0.62s cubic-bezier(0.22, 0.7, 0.3, 1) forwards;\n      }\n\n      .dlc-art-tile:nth-child(1) {\n        grid-column: span 2;\n        animation-delay: 0.04s;\n      }\n      .dlc-art-tile:nth-child(2) {\n        animation-delay: 0.13s;\n      }\n      .dlc-art-tile:nth-child(3) {\n        animation-delay: 0.22s;\n      }\n\n      .dlc-art-tile img {\n        width: 100%;\n        height: 100%;\n        object-fit: contain;\n        padding: 14px;\n        display: block;\n        mix-blend-mode: multiply;\n      }\n\n      @keyframes dlc-rise {\n        from {\n          opacity: 0;\n          transform: translateY(16px) scale(0.97);\n        }\n        to {\n          opacity: 1;\n          transform: none;\n        }\n      }\n\n      \/* ---------- Layout -------------------------------------------------- *\/\n\n      .dlc-main {\n        display: grid;\n        grid-template-columns: 246px minmax(0, 1fr);\n        gap: clamp(24px, 3.4vw, 46px);\n        margin-top: clamp(34px, 5vw, 58px);\n        align-items: start;\n      }\n\n      .dlc-rail {\n        position: sticky;\n        top: 24px;\n        background: var(--dlc-panel);\n        padding: 26px 22px;\n        border-radius: 3px;\n      }\n\n      .dlc-rail h2 {\n        margin: 0 0 18px;\n        font-family: var(--dlc-display);\n        font-weight: 700;\n        font-size: 21px;\n        letter-spacing: 0.4px;\n      }\n\n      .dlc-cats {\n        list-style: none;\n        margin: 0;\n        padding: 0;\n        display: flex;\n        flex-direction: column;\n        gap: 2px;\n      }\n\n      .dlc-cat {\n        appearance: none;\n        width: 100%;\n        text-align: left;\n        background: transparent;\n        border: 0;\n        border-left: 2px solid transparent;\n        padding: 9px 12px;\n        cursor: pointer;\n        font-weight: 700;\n        font-size: 15px;\n        letter-spacing: 0.4px;\n        color: var(--dlc-ink-60);\n        border-radius: 0 2px 2px 0;\n        transition:\n          color 0.15s ease,\n          background 0.15s ease,\n          border-color 0.15s ease;\n      }\n\n      .dlc-cat:hover {\n        color: var(--dlc-blue);\n        background: rgba(31, 115, 190, 0.07);\n      }\n\n      .dlc-cat[aria-pressed=\"true\"] {\n        color: var(--dlc-navy);\n        background: var(--dlc-white);\n        border-left-color: var(--dlc-blue);\n        box-shadow: var(--dlc-shadow);\n      }\n\n      .dlc-cat .n {\n        float: right;\n        font-family: var(--dlc-display);\n        font-weight: 600;\n        font-size: 13px;\n        color: var(--dlc-ink-40);\n      }\n\n      .dlc-toolbar {\n        display: flex;\n        flex-wrap: wrap;\n        align-items: center;\n        justify-content: space-between;\n        gap: 16px;\n        padding-bottom: 18px;\n        margin-bottom: 26px;\n        border-bottom: 1px solid var(--dlc-line);\n      }\n\n      .dlc-search {\n        position: relative;\n        flex: 1 1 320px;\n        max-width: 420px;\n      }\n\n      .dlc-search svg {\n        position: absolute;\n        left: 14px;\n        top: 50%;\n        transform: translateY(-50%);\n        color: var(--dlc-ink-40);\n        pointer-events: none;\n      }\n\n      .dlc-search input {\n        width: 100%;\n        padding: 12px 14px 12px 42px;\n        border: 1px solid var(--dlc-line);\n        border-radius: 2px;\n        background: var(--dlc-white);\n        font-size: 15px;\n        transition:\n          border-color 0.15s ease,\n          box-shadow 0.15s ease;\n      }\n\n      .dlc-search input:focus {\n        outline: 0;\n        border-color: var(--dlc-blue);\n        box-shadow: 0 0 0 3px rgba(31, 115, 190, 0.16);\n      }\n\n      .dlc-count {\n        font-family: var(--dlc-display);\n        font-weight: 600;\n        font-size: 14px;\n        letter-spacing: 0.06em;\n        text-transform: uppercase;\n        color: var(--dlc-ink-40);\n      }\n\n      \/* ---------- Product grid -------------------------------------------- *\/\n\n      .dlc-grid {\n        display: grid;\n        grid-template-columns: repeat(auto-fill, minmax(232px, 1fr));\n        gap: clamp(18px, 2.4vw, 34px) clamp(16px, 2vw, 28px);\n      }\n\n      .dlc-card {\n        display: flex;\n        flex-direction: column;\n        text-align: center;\n        opacity: 0;\n        animation: dlc-fade 0.42s ease forwards;\n      }\n\n      @keyframes dlc-fade {\n        to {\n          opacity: 1;\n        }\n      }\n\n      .dlc-thumb {\n        position: relative;\n        aspect-ratio: 1;\n        background: var(--dlc-panel);\n        border-radius: 3px;\n        overflow: hidden;\n        margin-bottom: 16px;\n        transition:\n          transform 0.24s ease,\n          box-shadow 0.24s ease;\n      }\n\n      .dlc-card:hover .dlc-thumb {\n        transform: translateY(-4px);\n        box-shadow: var(--dlc-shadow-lift);\n      }\n\n      .dlc-thumb img {\n        width: 100%;\n        height: 100%;\n        object-fit: contain;\n        padding: 20px;\n        display: block;\n        mix-blend-mode: multiply;\n      }\n\n      .dlc-thumb .dlc-noimg {\n        position: absolute;\n        inset: 0;\n        display: grid;\n        place-items: center;\n        color: var(--dlc-ink-40);\n      }\n\n      .dlc-brand {\n        font-family: var(--dlc-display);\n        font-weight: 600;\n        font-size: 11.5px;\n        letter-spacing: 0.18em;\n        text-transform: uppercase;\n        color: var(--dlc-blue);\n        margin-bottom: 7px;\n      }\n\n      .dlc-name {\n        font-family: var(--dlc-display);\n        font-weight: 600;\n        font-size: 16px;\n        line-height: 1.32;\n        letter-spacing: 0.1px;\n        text-transform: uppercase;\n        color: var(--dlc-ink);\n        margin: 0 0 6px;\n      }\n\n      .dlc-desc {\n        font-size: 14px;\n        line-height: 1.5;\n        color: var(--dlc-ink-60);\n        margin: 0 0 12px;\n        display: -webkit-box;\n        -webkit-line-clamp: 2;\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n      }\n\n      .dlc-price {\n        margin-top: auto;\n        display: inline-block;\n        font-family: var(--dlc-display);\n        font-weight: 600;\n        font-size: 17px;\n        color: var(--dlc-ink);\n        text-decoration: none;\n        border-bottom: 2px solid transparent;\n        padding-bottom: 2px;\n        align-self: center;\n        transition:\n          color 0.15s ease,\n          border-color 0.15s ease;\n      }\n\n      .dlc-price:hover,\n      .dlc-price:focus-visible {\n        color: var(--dlc-blue);\n        border-bottom-color: var(--dlc-blue);\n      }\n\n      .dlc-oos {\n        margin-top: auto;\n        font-family: var(--dlc-display);\n        font-weight: 600;\n        font-size: 15px;\n        color: var(--dlc-ink-40);\n      }\n\n      \/* ---------- States --------------------------------------------------- *\/\n\n      .dlc-state {\n        padding: 64px 24px;\n        text-align: center;\n        border: 1px solid var(--dlc-line);\n        border-radius: 3px;\n        background: var(--dlc-white);\n      }\n\n      .dlc-state h3 {\n        margin: 0 0 8px;\n        font-family: var(--dlc-display);\n        font-weight: 700;\n        font-size: 22px;\n        letter-spacing: 0.3px;\n      }\n\n      .dlc-state p {\n        margin: 0;\n        color: var(--dlc-ink-60);\n      }\n\n      .dlc-skeleton {\n        display: grid;\n        grid-template-columns: repeat(auto-fill, minmax(232px, 1fr));\n        gap: clamp(18px, 2.4vw, 34px) clamp(16px, 2vw, 28px);\n      }\n\n      .dlc-skeleton div {\n        aspect-ratio: 0.78;\n        border-radius: 3px;\n        background: linear-gradient(\n          100deg,\n          var(--dlc-panel) 28%,\n          var(--dlc-panel-2) 46%,\n          var(--dlc-panel) 64%\n        );\n        background-size: 220% 100%;\n        animation: dlc-shimmer 1.25s linear infinite;\n      }\n\n      @keyframes dlc-shimmer {\n        to {\n          background-position: -220% 0;\n        }\n      }\n\n      .dlc-sr {\n        position: absolute;\n        width: 1px;\n        height: 1px;\n        padding: 0;\n        margin: -1px;\n        overflow: hidden;\n        clip: rect(0, 0, 0, 0);\n        white-space: nowrap;\n        border: 0;\n      }\n\n      .dlc :focus-visible {\n        outline: 2px solid var(--dlc-blue);\n        outline-offset: 3px;\n      }\n\n      \/* ---------- Responsive ----------------------------------------------- *\/\n\n      @media (max-width: 980px) {\n        .dlc-hero {\n          grid-template-columns: minmax(0, 1fr);\n        }\n        .dlc-hero-art {\n          min-height: 0;\n          max-height: none;\n          height: clamp(112px, 30vw, 150px);\n          grid-template-rows: 1fr;\n          grid-template-columns: repeat(3, minmax(0, 1fr));\n        }\n        .dlc-art-tile img {\n          padding: 9px;\n        }\n        .dlc-art-tile:nth-child(1) {\n          grid-column: span 1;\n        }\n        .dlc-main {\n          grid-template-columns: minmax(0, 1fr);\n        }\n        .dlc-rail {\n          position: static;\n          padding: 20px 18px;\n        }\n        .dlc-cats {\n          flex-direction: row;\n          flex-wrap: wrap;\n          gap: 8px;\n        }\n        .dlc-cat {\n          width: auto;\n          border-left: 0;\n          border-radius: 2px;\n          background: var(--dlc-white);\n          padding: 9px 14px;\n        }\n        .dlc-cat[aria-pressed=\"true\"] {\n          background: var(--dlc-navy);\n          color: var(--dlc-white);\n        }\n        .dlc-cat[aria-pressed=\"true\"] .n {\n          color: rgba(255, 255, 255, 0.7);\n        }\n        .dlc-cat .n {\n          float: none;\n          margin-left: 7px;\n        }\n      }\n\n      @media (max-width: 560px) {\n        .dlc-shell {\n          width: calc(100% - 24px);\n        }\n        .dlc-hero-art {\n          grid-template-columns: repeat(3, minmax(0, 1fr));\n        }\n        .dlc-grid,\n        .dlc-skeleton {\n          grid-template-columns: repeat(2, minmax(0, 1fr));\n        }\n      }\n\n      @media (prefers-reduced-motion: reduce) {\n        .dlc *,\n        .dlc *::before,\n        .dlc *::after {\n          animation-duration: 0.001ms !important;\n          animation-iteration-count: 1 !important;\n          transition-duration: 0.001ms !important;\n        }\n        .dlc-art-tile,\n        .dlc-card {\n          opacity: 1;\n        }\n      }\n    <\/style>\n\n    <!--\n      Dorma standalone product discovery for dormalab.com.\n\n      Reads GET \/v2\/public\/dorma\/catalog with no credentials. That endpoint is\n      gated on the default-off `dorma_public_catalog` setting and returns no\n      price, offer, cart, or checkout data of any kind, so this page cannot\n      become a second price surface. Every purchase path goes through the\n      portal, where a signed-in Dorma-affiliated patient sees their pricing.\n\n      Language follows WordPress: the WPML <html lang> attribute first, then\n      the WPML cookie, then a \/fr\/ path prefix. There is no language toggle\n      here on purpose, so the page always agrees with the site's own switcher.\n\n      The API allowlists CORS to dormalab.com and www.dormalab.com only, so a\n      preview must live on dormalab.com itself (an unlisted page), not on a\n      separate staging or WP Engine preview hostname.\n    -->\n    <main\n      id=\"dorma-catalog-root\"\n      class=\"dlc\"\n      data-api-path=\"\/dorma\/catalog\"\n      data-portal-url=\"https:\/\/portal.dormalab.com\"\n      data-default-category=\"cpap\"\n    >\n      <div class=\"dlc-shell\">\n        <section class=\"dlc-hero\" aria-labelledby=\"dlc-title\">\n          <div class=\"dlc-hero-copy\">\n            <div class=\"dlc-wordmark\">\n              <span aria-hidden=\"true\"><\/span>Dorma\n            <\/div>\n            <span id=\"dlc-kicker\" class=\"dlc-kicker\"\n              >Sleep better, equipped better<\/span\n            >\n            <h1 id=\"dlc-title\">\n              Sleep-care essentials, selected for real life.\n            <\/h1>\n            <p id=\"dlc-lede\">\n              <a href=\"https:\/\/dormalab.com\/continuous-positive-airflow-pressure-cpap\/\" data-internallinksmanager029f6b8e52c=\"1\" title=\"Continuous Positive Airflow Pressure (CPAP)\">CPAP<\/a> machines, masks, cushions, and accessories supported by the\n              Dorma sleep-care team.\n            <\/p>\n            <a class=\"dlc-cta\" id=\"dlc-hero-cta\" href=\"#dlc-results\">\n              <span id=\"dlc-hero-cta-text\">Browse the shop<\/span>\n              <svg\n                width=\"15\"\n                height=\"15\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                stroke-width=\"2.2\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                aria-hidden=\"true\"\n              >\n                <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" \/>\n                <polyline points=\"13 6 19 12 13 18\" \/>\n              <\/svg>\n            <\/a>\n          <\/div>\n          <div class=\"dlc-hero-art\" id=\"dlc-hero-art\" aria-hidden=\"true\"><\/div>\n        <\/section>\n\n        <div class=\"dlc-main\">\n          <aside class=\"dlc-rail\" aria-labelledby=\"dlc-rail-title\">\n            <h2 id=\"dlc-rail-title\">Shop products by category<\/h2>\n            <ul class=\"dlc-cats\" id=\"dlc-cats\"><\/ul>\n          <\/aside>\n\n          <section id=\"dlc-results\" aria-live=\"polite\" aria-busy=\"true\">\n            <div class=\"dlc-toolbar\">\n              <div class=\"dlc-search\">\n                <svg\n                  width=\"17\"\n                  height=\"17\"\n                  viewBox=\"0 0 24 24\"\n                  fill=\"none\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"2\"\n                  stroke-linecap=\"round\"\n                  aria-hidden=\"true\"\n                >\n                  <circle cx=\"11\" cy=\"11\" r=\"7\" \/>\n                  <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\" \/>\n                <\/svg>\n                <label class=\"dlc-sr\" for=\"dlc-search\">Search products<\/label>\n                <input\n                  id=\"dlc-search\"\n                  type=\"search\"\n                  autocomplete=\"off\"\n                  placeholder=\"Try mask, AirSense, filters\u2026\"\n                \/>\n              <\/div>\n              <div class=\"dlc-count\" id=\"dlc-count\"><\/div>\n            <\/div>\n            <div id=\"dlc-grid\"><\/div>\n          <\/section>\n        <\/div>\n      <\/div>\n    <\/main>\n\n    <script data-nowprocket>\n      (function () {\n        \"use strict\";\n\n        var PROD_BASE = \"https:\/\/api.ascentemr.com\/v2\";\n        var DEV_BASE = \"https:\/\/dev.ascentemr.com\/v2\";\n        var STAGING_BASE = \"https:\/\/staging.ascentemr.com\/v2\";\n        var LOCAL_BASE = \"http:\/\/localhost:4010\/dev\/v2\";\n\n        function asSearchParams(input) {\n          if (typeof URLSearchParams === \"undefined\") {\n            return {\n              get: function () {\n                return null;\n              },\n            };\n          }\n          if (!input && typeof window.location.search === \"string\") {\n            return new URLSearchParams(window.location.search);\n          }\n          if (input instanceof URLSearchParams) return input;\n          return new URLSearchParams(String(input || \"\"));\n        }\n\n        function normalize(value) {\n          return String(value || \"\")\n            .trim()\n            .toLowerCase();\n        }\n\n        function currentOrigin() {\n          var origin = String(window.location.origin || \"\").replace(\/\\\/$\/, \"\");\n          return \/^https?:\\\/\\\/\/i.test(origin) ? origin : \"\";\n        }\n\n        function isProductionWordpressHost() {\n          var hostname = normalize(window.location.hostname);\n          return (\n            hostname === \"dormalab.com\" ||\n            hostname === \"www.dormalab.com\" ||\n            hostname === \"summithealth.ca\" ||\n            hostname === \"www.summithealth.ca\" ||\n            hostname === \"cliniquevoyageur.ca\" ||\n            hostname === \"www.cliniquevoyageur.ca\"\n          );\n        }\n\n        function resolveApiBase(searchLike) {\n          var params = asSearchParams(searchLike);\n          var requestedStage = normalize(params.get(\"stage\"));\n          var testMode = normalize(params.get(\"test\"));\n          var hostname = normalize(window.location.hostname);\n\n          if (requestedStage === \"local\" || testMode === \"true\") {\n            return LOCAL_BASE;\n          }\n          if (requestedStage === \"dev\") return DEV_BASE;\n          if (requestedStage === \"staging\") return STAGING_BASE;\n          if (\n            requestedStage === \"prod\" ||\n            requestedStage === \"production\" ||\n            isProductionWordpressHost()\n          ) {\n            return PROD_BASE;\n          }\n          if (\n            !hostname ||\n            hostname === \"localhost\" ||\n            hostname === \"127.0.0.1\" ||\n            hostname === \"::1\"\n          ) {\n            return LOCAL_BASE;\n          }\n          if (\n            hostname === \"staging.ascentemr.com\" ||\n            hostname.indexOf(\"staging.\") === 0 ||\n            hostname.indexOf(\"staging-\") === 0 ||\n            hostname.indexOf(\".staging.\") >= 0\n          ) {\n            return STAGING_BASE;\n          }\n          if (\n            hostname === \"dev.ascentemr.com\" ||\n            hostname === \"dev.ascent.summithealth.ca\" ||\n            hostname.indexOf(\"dev.\") === 0 ||\n            hostname.indexOf(\"dev-\") === 0 ||\n            hostname.indexOf(\".vercel.app\") >= 0\n          ) {\n            return DEV_BASE;\n          }\n          return currentOrigin() ? currentOrigin() + \"\/api\/v2\" : DEV_BASE;\n        }\n\n        function resolvePublicApiBase(searchLike) {\n          return resolveApiBase(searchLike).replace(\/\\\/$\/, \"\") + \"\/public\";\n        }\n\n        \/* Language comes from WordPress, never from a control on this page.\n           WPML writes the <html lang> attribute and the cookie, and localised\n           pages sit under \/fr\/. Checking all three means the catalogue agrees\n           with the site's own switcher however the visitor arrived. *\/\n        function resolveLocale() {\n          \/\/ An explicit ?lang wins so the page can be previewed in either\n          \/\/ language before WPML is wired to it. On the live site nothing\n          \/\/ passes it and the WPML signals below decide.\n          var requested = normalize(asSearchParams().get(\"lang\"));\n          if (requested.indexOf(\"fr\") === 0) return \"fr\";\n          if (requested.indexOf(\"en\") === 0) return \"en\";\n\n          var htmlLang = normalize(document.documentElement.lang);\n          if (htmlLang.indexOf(\"fr\") === 0) return \"fr\";\n          if (htmlLang.indexOf(\"en\") === 0) return \"en\";\n\n          var match = String(document.cookie || \"\").match(\n            \/(?:^|;\\s*)wp-wpml_current_language=([^;]+)\/,\n          );\n          if (\n            match &&\n            normalize(decodeURIComponent(match[1])).indexOf(\"fr\") === 0\n          ) {\n            return \"fr\";\n          }\n\n          return \/^\\\/fr(?:[\/?#]|$)\/i.test(window.location.pathname)\n            ? \"fr\"\n            : \"en\";\n        }\n\n        var COPY = {\n          en: {\n            kicker: \"Sleep better, equipped better\",\n            title: \"Sleep-care essentials, selected for real life.\",\n            lede: \"CPAP machines, masks, cushions, and accessories supported by the Dorma sleep-care team.\",\n            heroCta: \"Browse the shop\",\n            searchLabel: \"Search products\",\n            searchPlaceholder: \"Try mask, AirSense, filters\u2026\",\n            railTitle: \"Shop products by category\",\n            all: \"All products\",\n            count: function (n) {\n              return n + (n === 1 ? \" product\" : \" products\");\n            },\n            viewPrice: \"Login to view price\",\n            unavailable: \"Out of stock\",\n            emptyTitle: \"No products match\",\n            emptyCopy: \"Try a different search, or choose another category.\",\n            errorTitle: \"The catalogue could not load\",\n            errorCopy:\n              \"Please refresh this page, or contact the Dorma care team for product help.\",\n          },\n          fr: {\n            kicker: \"Mieux dormir, mieux \u00e9quip\u00e9\",\n            title: \"L\u2019essentiel du sommeil, choisi pour la vraie vie.\",\n            lede: \"Appareils PPC, masques, coussins et accessoires soutenus par l\u2019\u00e9quipe de soins du sommeil Dorma.\",\n            heroCta: \"Parcourir la boutique\",\n            searchLabel: \"Rechercher des produits\",\n            searchPlaceholder: \"Essayez masque, AirSense, filtres\u2026\",\n            railTitle: \"Magasiner par cat\u00e9gorie\",\n            all: \"Tous les produits\",\n            count: function (n) {\n              return n + (n === 1 ? \" produit\" : \" produits\");\n            },\n            viewPrice: \"Connectez-vous pour voir le prix\",\n            unavailable: \"Rupture de stock\",\n            emptyTitle: \"Aucun produit ne correspond\",\n            emptyCopy: \"Essayez une autre recherche ou une autre cat\u00e9gorie.\",\n            errorTitle: \"Impossible de charger le catalogue\",\n            errorCopy:\n              \"Actualisez cette page ou communiquez avec l\u2019\u00e9quipe Dorma pour obtenir de l\u2019aide.\",\n          },\n        };\n\n        var root = document.getElementById(\"dorma-catalog-root\");\n        if (!root) return;\n\n        var grid = document.getElementById(\"dlc-grid\");\n        var cats = document.getElementById(\"dlc-cats\");\n        var countEl = document.getElementById(\"dlc-count\");\n        var searchEl = document.getElementById(\"dlc-search\");\n        var resultsEl = document.getElementById(\"dlc-results\");\n        var heroArt = document.getElementById(\"dlc-hero-art\");\n        var heroCta = document.getElementById(\"dlc-hero-cta\");\n\n        var apiPath = String(root.dataset.apiPath || \"\");\n        if (apiPath.charAt(0) !== \"\/\" || apiPath.indexOf(\"\/\/\") === 0) {\n          apiPath = \"\/dorma\/catalog\";\n        }\n        var apiUrl =\n          resolvePublicApiBase(window.location.search).replace(\/\\\/+$\/, \"\") +\n          apiPath;\n        var portalUrl = String(root.dataset.portalUrl || \"\").replace(\n          \/\\\/+$\/,\n          \"\",\n        );\n        var defaultCategory = normalize(root.dataset.defaultCategory) || \"cpap\";\n\n        var locale = resolveLocale();\n        var copy = COPY[locale];\n        var items = [];\n        var categories = [];\n        var activeCategory = null;\n        var query = \"\";\n        var loginHref = \"\";\n        var debounce = null;\n\n        function setText(id, value) {\n          var node = document.getElementById(id);\n          if (node) node.textContent = value;\n        }\n\n        \/* The login path arrives from the API, so it is never trusted to place\n           this link. It must be a plain absolute path and must still resolve\n           onto the configured portal origin, or the customer goes to the\n           portal root instead. *\/\n        function portalHref(loginPath) {\n          if (!portalUrl) return \"\";\n          var candidate = String(loginPath || \"\");\n          if (!candidate) return \"\";\n          if (candidate.charAt(0) !== \"\/\" || candidate.indexOf(\"\/\/\") === 0) {\n            return portalUrl;\n          }\n          try {\n            var portalOrigin = new URL(portalUrl).origin;\n            var resolved = new URL(candidate, portalUrl);\n            return resolved.origin === portalOrigin ? resolved.href : portalUrl;\n          } catch (_error) {\n            return portalUrl;\n          }\n        }\n\n        function safeUrl(value) {\n          try {\n            var parsed = new URL(String(value || \"\"), window.location.href);\n            return parsed.protocol === \"https:\" ? parsed.href : \"\";\n          } catch (_error) {\n            return \"\";\n          }\n        }\n\n        function applyStaticCopy() {\n          document.documentElement.lang = locale === \"fr\" ? \"fr\" : \"en\";\n          setText(\"dlc-kicker\", copy.kicker);\n          setText(\"dlc-title\", copy.title);\n          setText(\"dlc-lede\", copy.lede);\n          setText(\"dlc-hero-cta-text\", copy.heroCta);\n          setText(\"dlc-rail-title\", copy.railTitle);\n          var label = document.querySelector('label[for=\"dlc-search\"]');\n          if (label) label.textContent = copy.searchLabel;\n          if (searchEl) searchEl.placeholder = copy.searchPlaceholder;\n        }\n\n        function skeleton() {\n          var wrap = document.createElement(\"div\");\n          wrap.className = \"dlc-skeleton\";\n          for (var i = 0; i < 8; i += 1)\n            wrap.appendChild(document.createElement(\"div\"));\n          grid.replaceChildren(wrap);\n        }\n\n        function stateBlock(title, body) {\n          var box = document.createElement(\"div\");\n          box.className = \"dlc-state\";\n          var h = document.createElement(\"h3\");\n          h.textContent = title;\n          var p = document.createElement(\"p\");\n          p.textContent = body;\n          box.append(h, p);\n          grid.replaceChildren(box);\n        }\n\n        function visibleItems() {\n          var q = normalize(query);\n          return items.filter(function (item) {\n            if (activeCategory) {\n              if (normalize(item.category.key) !== activeCategory) {\n                return false;\n              }\n            }\n            if (!q) return true;\n            return (\n              normalize(item.name).indexOf(q) >= 0 ||\n              normalize(item.brandLabel).indexOf(q) >= 0 ||\n              normalize(item.category.label).indexOf(q) >= 0 ||\n              normalize(item.shortDescription).indexOf(q) >= 0\n            );\n          });\n        }\n\n        function countIn(key) {\n          return items.filter(function (item) {\n            return !key || normalize(item.category.key) === key;\n          }).length;\n        }\n\n        function renderCategories() {\n          cats.replaceChildren();\n          var entries = [{ key: null, label: copy.all }].concat(\n            categories.map(function (c) {\n              return { key: normalize(c.key), label: c.label };\n            }),\n          );\n          entries.forEach(function (entry) {\n            var li = document.createElement(\"li\");\n            var button = document.createElement(\"button\");\n            button.type = \"button\";\n            button.className = \"dlc-cat\";\n            button.setAttribute(\n              \"aria-pressed\",\n              String(entry.key === activeCategory),\n            );\n            button.appendChild(document.createTextNode(entry.label));\n            var n = document.createElement(\"span\");\n            n.className = \"n\";\n            n.textContent = String(countIn(entry.key));\n            button.appendChild(n);\n            button.addEventListener(\"click\", function () {\n              activeCategory = entry.key;\n              renderCategories();\n              renderGrid();\n            });\n            li.appendChild(button);\n            cats.appendChild(li);\n          });\n        }\n\n        function renderCard(item, index) {\n          var card = document.createElement(\"article\");\n          card.className = \"dlc-card\";\n          card.style.animationDelay = Math.min(index, 12) * 0.03 + \"s\";\n\n          var thumb = document.createElement(\"div\");\n          thumb.className = \"dlc-thumb\";\n          var image = (item.images || [])[0];\n          var src = image ? safeUrl(image.url) : \"\";\n          if (src) {\n            var img = document.createElement(\"img\");\n            img.src = src;\n            img.alt = image.altText || item.name;\n            img.loading = \"lazy\";\n            img.decoding = \"async\";\n            thumb.appendChild(img);\n          } else {\n            var ph = document.createElement(\"div\");\n            ph.className = \"dlc-noimg\";\n            ph.textContent = \"\u2014\";\n            thumb.appendChild(ph);\n          }\n          card.appendChild(thumb);\n\n          if (item.brandLabel) {\n            var brand = document.createElement(\"div\");\n            brand.className = \"dlc-brand\";\n            brand.textContent = item.brandLabel;\n            card.appendChild(brand);\n          }\n\n          var name = document.createElement(\"h3\");\n          name.className = \"dlc-name\";\n          name.textContent = item.name;\n          card.appendChild(name);\n\n          if (item.shortDescription) {\n            var desc = document.createElement(\"p\");\n            desc.className = \"dlc-desc\";\n            desc.textContent = item.shortDescription;\n            card.appendChild(desc);\n          }\n\n          if (item.available === false) {\n            var oos = document.createElement(\"div\");\n            oos.className = \"dlc-oos\";\n            oos.textContent = copy.unavailable;\n            card.appendChild(oos);\n          } else if (loginHref) {\n            var price = document.createElement(\"a\");\n            price.className = \"dlc-price\";\n            price.textContent = copy.viewPrice;\n            var productPath =\n              typeof item.portalPath === \"string\"\n                ? item.portalPath\n                : \"\/me\/shop\";\n            var productLogin = new URL(loginHref);\n            productLogin.searchParams.set(\"lang\", locale);\n            productLogin.searchParams.set(\n              \"callbackUrl\",\n              productPath.startsWith(\"\/me\/shop\") && !productPath.includes(\"\\\\\")\n                ? productPath\n                : \"\/me\/shop\",\n            );\n            price.href = productLogin.href;\n            card.appendChild(price);\n          }\n\n          return card;\n        }\n\n        function renderGrid() {\n          var visible = visibleItems();\n          countEl.textContent = copy.count(visible.length);\n          resultsEl.setAttribute(\"aria-busy\", \"false\");\n\n          if (!visible.length) {\n            stateBlock(copy.emptyTitle, copy.emptyCopy);\n            return;\n          }\n          var wrap = document.createElement(\"div\");\n          wrap.className = \"dlc-grid\";\n          visible.forEach(function (item, index) {\n            wrap.appendChild(renderCard(item, index));\n          });\n          grid.replaceChildren(wrap);\n        }\n\n        \/* The banner shows real catalogue photography. CPAP machines read best\n           at banner size, so they are preferred, with any other imaged product\n           filling the remaining tiles. *\/\n        function renderHeroArt() {\n          var preferred = items.filter(function (item) {\n            return (\n              normalize(item.category.key) === defaultCategory &&\n              (item.images || []).length\n            );\n          });\n          var rest = items.filter(function (item) {\n            return (\n              normalize(item.category.key) !== defaultCategory &&\n              (item.images || []).length\n            );\n          });\n          var picks = preferred.concat(rest).slice(0, 3);\n          if (!picks.length) return;\n\n          heroArt.replaceChildren();\n          picks.forEach(function (item) {\n            var src = safeUrl((item.images || [])[0].url);\n            if (!src) return;\n            var tile = document.createElement(\"div\");\n            tile.className = \"dlc-art-tile\";\n            var img = document.createElement(\"img\");\n            img.src = src;\n            img.alt = \"\";\n            img.decoding = \"async\";\n            tile.appendChild(img);\n            heroArt.appendChild(tile);\n          });\n        }\n\n        function load() {\n          resultsEl.setAttribute(\"aria-busy\", \"true\");\n          skeleton();\n          var url = apiUrl + \"?locale=\" + encodeURIComponent(locale);\n          fetch(url, {\n            credentials: \"omit\",\n            headers: { Accept: \"application\/json\" },\n          })\n            .then(function (response) {\n              if (!response.ok)\n                throw new Error(\"catalog_http_\" + response.status);\n              return response.json();\n            })\n            .then(function (payload) {\n              items = Array.isArray(payload.items) ? payload.items : [];\n              categories = Array.isArray(payload.categories)\n                ? payload.categories\n                : [];\n              loginHref =\n                payload.shopAvailable === true && payload.loginRequired === true\n                  ? portalHref(payload.loginPath)\n                  : \"\";\n\n              \/\/ Open on CPAP when it exists, so the first screen shows the\n              \/\/ machines rather than an undifferentiated wall of accessories.\n              var hasDefault = categories.some(function (c) {\n                return normalize(c.key) === defaultCategory;\n              });\n              activeCategory = hasDefault ? defaultCategory : null;\n\n              renderHeroArt();\n              renderCategories();\n              renderGrid();\n            })\n            .catch(function () {\n              resultsEl.setAttribute(\"aria-busy\", \"false\");\n              countEl.textContent = \"\";\n              cats.replaceChildren();\n              stateBlock(copy.errorTitle, copy.errorCopy);\n            });\n        }\n\n        if (searchEl) {\n          searchEl.addEventListener(\"input\", function (event) {\n            query = event.target.value || \"\";\n            window.clearTimeout(debounce);\n            debounce = window.setTimeout(function () {\n              renderCategories();\n              renderGrid();\n            }, 140);\n          });\n        }\n\n        if (heroCta) {\n          heroCta.addEventListener(\"click\", function (event) {\n            event.preventDefault();\n            var target = document.getElementById(\"dlc-results\");\n            if (target && target.scrollIntoView) {\n              target.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n            }\n            if (searchEl) searchEl.focus({ preventScroll: true });\n          });\n        }\n\n        applyStaticCopy();\n        load();\n      })();\n    <\/script>\n  \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\/* Dorma sleep shop \u2014 standalone catalogue for dormalab.com. Type and palette are sampled from the live site so this page sits inside the theme rather than beside it: Barlow carries every heading and product name (uppercase, as on \/shop), Lato carries body copy, and #1F73BE \/ #112C51 are the site&rsquo;s own blue and navy. &#8230; <a title=\"Boutique du sommeil Dorma\" class=\"read-more\" href=\"https:\/\/dormalab.com\/fr\/magasin-de-sommeil-dorma\/\" aria-label=\"En savoir plus sur Boutique du sommeil Dorma\">Lire la suite<\/a><\/p>\n","protected":false},"author":24,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-43054","page","type-page","status-publish"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Boutique du sommeil Dorma - Dorma Sleep Clinics<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dormalab.com\/fr\/magasin-de-sommeil-dorma\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Boutique du sommeil Dorma - Dorma Sleep Clinics\" \/>\n<meta property=\"og:description\" content=\"\/* Dorma sleep shop \u2014 standalone catalogue for dormalab.com. Type and palette are sampled from the live site so this page sits inside the theme rather than beside it: Barlow carries every heading and product name (uppercase, as on \/shop), Lato carries body copy, and #1F73BE \/ #112C51 are the site&rsquo;s own blue and navy. ... Lire la suite\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dormalab.com\/fr\/magasin-de-sommeil-dorma\/\" \/>\n<meta property=\"og:site_name\" content=\"Dorma Sleep Clinics\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-09T00:09:29+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"15 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/magasin-de-sommeil-dorma\\\/\",\"url\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/magasin-de-sommeil-dorma\\\/\",\"name\":\"Boutique du sommeil Dorma - Dorma Sleep Clinics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#website\"},\"datePublished\":\"2026-09-08T23:54:21+00:00\",\"dateModified\":\"2026-09-09T00:09:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/magasin-de-sommeil-dorma\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/dormalab.com\\\/fr\\\/magasin-de-sommeil-dorma\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/magasin-de-sommeil-dorma\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Boutique du sommeil Dorma\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/\",\"name\":\"Dorma Sleep Clinics\",\"description\":\"Sleep Well Live Well\",\"publisher\":{\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#organization\",\"name\":\"Dorma Clinique Du Sommeil\",\"url\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/dormalab.com\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Dorma-Logotype-RGB-Black-scaled-e1578787470924.png\",\"contentUrl\":\"https:\\\/\\\/dormalab.com\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Dorma-Logotype-RGB-Black-scaled-e1578787470924.png\",\"width\":120,\"height\":25,\"caption\":\"Dorma Clinique Du Sommeil\"},\"image\":{\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Boutique du sommeil Dorma - Dorma Sleep Clinics","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/dormalab.com\/fr\/magasin-de-sommeil-dorma\/","og_locale":"fr_FR","og_type":"article","og_title":"Boutique du sommeil Dorma - Dorma Sleep Clinics","og_description":"\/* Dorma sleep shop \u2014 standalone catalogue for dormalab.com. Type and palette are sampled from the live site so this page sits inside the theme rather than beside it: Barlow carries every heading and product name (uppercase, as on \/shop), Lato carries body copy, and #1F73BE \/ #112C51 are the site&rsquo;s own blue and navy. ... Lire la suite","og_url":"https:\/\/dormalab.com\/fr\/magasin-de-sommeil-dorma\/","og_site_name":"Dorma Sleep Clinics","article_modified_time":"2026-09-09T00:09:29+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"15 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/dormalab.com\/fr\/magasin-de-sommeil-dorma\/","url":"https:\/\/dormalab.com\/fr\/magasin-de-sommeil-dorma\/","name":"Boutique du sommeil Dorma - Dorma Sleep Clinics","isPartOf":{"@id":"https:\/\/dormalab.com\/fr\/#website"},"datePublished":"2026-09-08T23:54:21+00:00","dateModified":"2026-09-09T00:09:29+00:00","breadcrumb":{"@id":"https:\/\/dormalab.com\/fr\/magasin-de-sommeil-dorma\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dormalab.com\/fr\/magasin-de-sommeil-dorma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/dormalab.com\/fr\/magasin-de-sommeil-dorma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/dormalab.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Boutique du sommeil Dorma"}]},{"@type":"WebSite","@id":"https:\/\/dormalab.com\/fr\/#website","url":"https:\/\/dormalab.com\/fr\/","name":"Dorma Sleep Clinics","description":"Sleep Well Live Well","publisher":{"@id":"https:\/\/dormalab.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dormalab.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/dormalab.com\/fr\/#organization","name":"Dorma Clinique Du Sommeil","url":"https:\/\/dormalab.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/dormalab.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/dormalab.com\/wp-content\/uploads\/2019\/10\/Dorma-Logotype-RGB-Black-scaled-e1578787470924.png","contentUrl":"https:\/\/dormalab.com\/wp-content\/uploads\/2019\/10\/Dorma-Logotype-RGB-Black-scaled-e1578787470924.png","width":120,"height":25,"caption":"Dorma Clinique Du Sommeil"},"image":{"@id":"https:\/\/dormalab.com\/fr\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/pages\/43054","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/users\/24"}],"replies":[{"embeddable":true,"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/comments?post=43054"}],"version-history":[{"count":4,"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/pages\/43054\/revisions"}],"predecessor-version":[{"id":43058,"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/pages\/43054\/revisions\/43058"}],"wp:attachment":[{"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/media?parent=43054"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}