{"id":20051,"date":"2026-09-05T11:58:41","date_gmt":"2026-09-05T04:58:41","guid":{"rendered":"https:\/\/domreyhospital.com\/app\/"},"modified":"2026-10-09T15:17:30","modified_gmt":"2026-10-09T08:17:30","slug":"app","status":"publish","type":"page","link":"https:\/\/domreyhospital.com\/kh\/app\/","title":{"rendered":"\u1780\u1798\u17d2\u1798\u179c\u17b7\u1792\u17b8 Domrey Hospital \u179f\u1798\u17d2\u179a\u17b6\u1794\u17cb\u17a2\u17d2\u1793\u1780\u1787\u17c6\u1784\u17ba \u1793\u17c5\u179a\u17b6\u1787\u1792\u17b6\u1793\u17b8\u1797\u17d2\u1793\u17c6\u1796\u17c1\u1789"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"20051\" class=\"elementor elementor-20051\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9a575cb e-con-full e-flex e-con e-parent\" data-id=\"9a575cb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-71e1d5b elementor-widget elementor-widget-html\" data-id=\"71e1d5b\" 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<style>\n.dmrh-nav{position:sticky;top:0;z-index:50;background:color-mix(in oklab,var(--bg) 88%,transparent);backdrop-filter:saturate(180%) blur(14px);-webkit-backdrop-filter:saturate(180%) blur(14px);border-bottom:1px solid var(--line)}\n.dmrh-nav .dmrh-wrap{display:flex;align-items:center;justify-content:space-between;height:76px;max-width:1320px;margin:0 auto;padding:0 36px}\n.dmrh-brand img{height:46px;width:auto;display:block}\n.dmrh-links{display:flex;align-items:center;gap:2px}\n.dmrh-links a{color:var(--ink-2);font-size:14px;font-weight:500;padding:10px 13px;border-radius:8px;text-decoration:none;white-space:nowrap;transition:color .15s,background .15s}\n.dmrh-links a:hover{color:var(--ink);background:var(--bg-soft)}\n.dmrh-links a.on{color:var(--ink)}\n.dmrh-links a.on::after{content:'';display:block;height:2px;background:var(--accent);margin-top:4px;border-radius:2px}\n.dmrh-cta{display:flex;gap:10px;align-items:center}\n.dmrh-book{display:inline-flex;align-items:center;gap:8px;padding:10px 18px;font-size:13px;font-weight:600;background:var(--accent);color:#fff;border-radius:999px;text-decoration:none;white-space:nowrap;border:1px solid var(--accent);transition:transform .2s}\n.dmrh-book:hover{transform:translateY(-1px)}\n.dmrh-lang{display:inline-flex;border:1px solid var(--line-strong);border-radius:999px;overflow:hidden}\n.dmrh-lang button{background:transparent;border:0;color:var(--ink-3);padding:6px 13px;font-size:11px;font-weight:600;letter-spacing:.08em;cursor:pointer;font-family:inherit}\n.dmrh-lang button.on{background:var(--ink);color:var(--bg)}\n.dmrh-burger{display:none;width:42px;height:42px;background:transparent;border:1px solid var(--line-strong);border-radius:50%;align-items:center;justify-content:center;cursor:pointer}\n@media(max-width:1024px){.dmrh-links{display:none}.dmrh-burger{display:inline-flex}}\n@media(max-width:600px){.dmrh-lang{display:none}}\n.dmrh-mob{display:none;position:fixed;inset:0;z-index:80;background:var(--bg);padding:80px 36px 40px;flex-direction:column;gap:4px;overflow-y:auto;-webkit-overflow-scrolling:touch}\n.dmrh-mob.open{display:flex}\n.dmrh-mob a{font-family:var(--font-display);font-size:30px;color:var(--ink);padding:13px 0;border-bottom:1px solid var(--line);font-weight:500;text-decoration:none}\n.dmrh-x{position:absolute;top:24px;right:24px;width:42px;height:42px;border-radius:50%;background:var(--card);border:1px solid var(--line);display:grid;place-items:center;cursor:pointer}\n\n\/* Short viewports. The panel is fixed and the page is scroll-locked behind it,\n   so anything past the fold used to be unreachable: on a 640px-tall phone that\n   was News & Events, About and Contact. overflow-y:auto on .dmrh-mob above is\n   the backstop; this block shrinks the list so all 8 items fit without any\n   scrolling. It has to sit at the END of this stylesheet, because\n   `.dmrh-mob a` is declared above at the same (0,1,1) specificity and would\n   otherwise win on source order. *\/\n@media (max-height:760px){\n  .dmrh-mob{padding-top:56px;padding-bottom:20px}\n  .dmrh-mob a{font-size:22px;padding:8px 0;line-height:1.25}\n}\n\n\/* Header brand sizing. The theme's image script stamps width\/height attributes\n   onto images from their measured size; with max-width:100% that locks the logo\n   into a squashed box. Pin the intrinsic sizing so the mark keeps its ratio, and\n   stop the anchor shrinking. Must stay after the .dmrh-brand img rule above. *\/\n#dmrh-brand-fit{display:none}\n.dmrh-nav .dmrh-brand{flex:0 0 auto}\n.dmrh-nav .dmrh-brand img{height:46px;width:auto;max-width:none}\n\/* Match .wrap, which drops to 20px at 720px. The plugin got this on 27 Aug;\n   the Elementor nav widgets did not. *\/\n@media(max-width:720px){.dmrh-nav .dmrh-wrap{padding:0 20px}}\n\/* Below ~360px the full-size mark plus the lang toggle and burger no longer\n   fit on one row, so scale the logo rather than let anything squash. *\/\n@media(max-width:360px){.dmrh-nav .dmrh-brand img{height:36px}}\n<\/style>\n<header class=\"dmrh-nav\">\n  <div class=\"dmrh-wrap\">\n    <a class=\"dmrh-brand\" href=\"\/\"><img decoding=\"async\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/08\/domrey-logo-aaci-300x83.png\" srcset=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/08\/domrey-logo-aaci-300x83.png 300w, https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/08\/domrey-logo-aaci-768x212.png 768w\" sizes=\"166px\" width=\"300\" height=\"83\" alt=\"Domrey Mother &amp; Child Clinic, AACI accredited\"><\/a>\n    <nav class=\"dmrh-links\">\n      <a href=\"\/\"><span class=\"en\">Home<\/span><span class=\"km\">&#x1791;&#x17c6;&#x1796;&#x17d0;&#x179a;&#x178a;&#x17be;&#x1798;<\/span><\/a>\n      <a href=\"\/our-doctors\/\"><span class=\"en\">Doctors<\/span><span class=\"km\">&#x179c;&#x17c1;&#x1787;&#x17d2;&#x1787;&#x1794;&#x178e;&#x17d2;&#x178c;&#x17b7;&#x178f;<\/span><\/a>\n      <a href=\"\/our-services\/\"><span class=\"en\">Services<\/span><span class=\"km\">&#x179f;&#x17c1;&#x179c;&#x17b6;&#x1780;&#x1798;&#x17d2;&#x1798;<\/span><\/a>\n      <a href=\"\/rooms-facilities\/\"><span class=\"en\">Rooms &amp; Facilities<\/span><span class=\"km\">&#x1794;&#x1793;&#x17d2;&#x1791;&#x1794;&#x17cb; &#x1793;&#x17b7;&#x1784;&#x1780;&#x1793;&#x17d2;&#x179b;&#x17c2;&#x1784;<\/span><\/a>\n      <a href=\"\/promotions-packages\/\"><span class=\"en\">Promotions<\/span><span class=\"km\">&#x1780;&#x17b6;&#x179a;&#x1795;&#x17d2;&#x178f;&#x179b;&#x17cb;&#x1787;&#x17bc;&#x1793;&#x1796;&#x17b7;&#x179f;&#x17c1;&#x179f;<\/span><\/a>\n      <a href=\"\/events-announcements\/\"><span class=\"en\">News &amp; Events<\/span><span class=\"km\">&#x1796;&#x17d0;&#x178f;&#x17cc;&#x1798;&#x17b6;&#x1793; &#x1793;&#x17b7;&#x1784;&#x1796;&#x17d2;&#x179a;&#x17b9;&#x178f;&#x17d2;&#x178f;&#x17b7;&#x1780;&#x17b6;&#x179a;&#x178e;&#x17cd;<\/span><\/a>\n      <a href=\"\/about-us\/\"><span class=\"en\">About<\/span><span class=\"km\">&#x17a2;&#x17c6;&#x1796;&#x17b8;&#x1799;&#x17be;&#x1784;<\/span><\/a>\n      <a href=\"\/contact\/\"><span class=\"en\">Contact<\/span><span class=\"km\">&#x1791;&#x17c6;&#x1793;&#x17b6;&#x1780;&#x17cb;&#x1791;&#x17c6;&#x1793;&#x1784;<\/span><\/a>\n    <\/nav>\n    <div class=\"dmrh-cta\">\n      <div class=\"dmrh-lang\">\n        <button class=\"on\" onclick=\"document.documentElement.setAttribute('data-lang','en');this.classList.add('on');this.nextElementSibling.classList.remove('on')\">EN<\/button>\n        <button onclick=\"document.documentElement.setAttribute('data-lang','km');this.classList.add('on');this.previousElementSibling.classList.remove('on')\">KH<\/button>\n      <\/div>\n      <button class=\"dmrh-burger\" onclick=\"document.getElementById('dmrhmob').classList.add('open')\" aria-label=\"Open menu\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" width=\"20\" height=\"20\"><path d=\"M3 6h18M3 12h18M3 18h18\"\/><\/svg><\/button>\n    <\/div>\n  <\/div>\n<\/header>\n<div class=\"dmrh-mob\" id=\"dmrhmob\">\n  <button class=\"dmrh-x\" onclick=\"document.getElementById('dmrhmob').classList.remove('open')\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" width=\"20\" height=\"20\"><path d=\"M18 6 6 18M6 6l12 12\"\/><\/svg><\/button>\n  <a href=\"\/\"><span class=\"en\">Home<\/span><span class=\"km\">&#x1791;&#x17c6;&#x1796;&#x17d0;&#x179a;&#x178a;&#x17be;&#x1798;<\/span><\/a>\n  <a href=\"\/our-doctors\/\"><span class=\"en\">Doctors<\/span><span class=\"km\">&#x179c;&#x17c1;&#x1787;&#x17d2;&#x1787;&#x1794;&#x178e;&#x17d2;&#x178c;&#x17b7;&#x178f;<\/span><\/a>\n  <a href=\"\/our-services\/\"><span class=\"en\">Services<\/span><span class=\"km\">&#x179f;&#x17c1;&#x179c;&#x17b6;&#x1780;&#x1798;&#x17d2;&#x1798;<\/span><\/a>\n  <a href=\"\/rooms-facilities\/\"><span class=\"en\">Rooms &amp; Facilities<\/span><span class=\"km\">&#x1794;&#x1793;&#x17d2;&#x1791;&#x1794;&#x17cb; &#x1793;&#x17b7;&#x1784;&#x1780;&#x1793;&#x17d2;&#x179b;&#x17c2;&#x1784;<\/span><\/a>\n  <a href=\"\/promotions-packages\/\"><span class=\"en\">Promotions<\/span><span class=\"km\">&#x1780;&#x17b6;&#x179a;&#x1795;&#x17d2;&#x178f;&#x179b;&#x17cb;&#x1787;&#x17bc;&#x1793;&#x1796;&#x17b7;&#x179f;&#x17c1;&#x179f;<\/span><\/a>\n  <a href=\"\/events-announcements\/\"><span class=\"en\">News &amp; Events<\/span><span class=\"km\">&#x1796;&#x17d0;&#x178f;&#x17cc;&#x1798;&#x17b6;&#x1793; &#x1793;&#x17b7;&#x1784;&#x1796;&#x17d2;&#x179a;&#x17b9;&#x178f;&#x17d2;&#x178f;&#x17b7;&#x1780;&#x17b6;&#x179a;&#x178e;&#x17cd;<\/span><\/a>\n      <a href=\"\/about-us\/\"><span class=\"en\">About<\/span><span class=\"km\">&#x17a2;&#x17c6;&#x1796;&#x17b8;&#x1799;&#x17be;&#x1784;<\/span><\/a>\n  <a href=\"\/contact\/\"><span class=\"en\">Contact<\/span><span class=\"km\">&#x1791;&#x17c6;&#x1793;&#x17b6;&#x1780;&#x17cb;&#x1791;&#x17c6;&#x1793;&#x1784;<\/span><\/a>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f2c0ffa elementor-widget elementor-widget-html\" data-id=\"f2c0ffa\" 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<!-- Gap fix: root container gap setting reads 0 but Elementor renders ~20px (kit default fallback). Force sections flush. -->\n<style>.elementor-element-9a575cb{gap:0 !important}\n\/* Header spacing: cut .page-hero nav-clearance to 56px (nav is sticky\/in-flow, no clearance needed). *\/\n.page-hero{padding-top:56px !important}\n\/* Section spacing: tighten full sections from 120px to 48px top+bottom. *\/\n.section{padding-top:48px !important;padding-bottom:48px !important}\n\/* Hero title on one line: lift the design system's 18ch width cap. *\/\n.page-hero .display-lg{max-width:none !important}<\/style>\n<style id=\"dmrh-btn-unify\">.btn-primary,.promo-cta,.dmrh-book,.dmrh-hi-primary,.footer-tg{background:#229ED9 !important;border-color:#229ED9 !important;color:#fff !important}.btn-primary:hover,.promo-cta:hover,.dmrh-book:hover,.dmrh-hi-primary:hover,.footer-tg:hover{background:#1b8cc2 !important;border-color:#1b8cc2 !important}<\/style>\n<style id=\"dmrh-nav-fit\">\/* \"News & Events\" is 53px wider than the old \"Events\" label. The desktop nav only collapses to the hamburger at <=1024px, so tighten link padding above that to keep the whole header row on one line. Min viewport needed: 1196px (was 1231px before the rename). *\/\n@media (min-width:1025px){.dmrh-nav .dmrh-links a{padding-left:8px !important;padding-right:8px !important}.dmrh-nav .dmrh-book{padding-left:14px !important;padding-right:14px !important}}<\/style>\n<style id=\"dmrh-mobile-layout\">\/* Mobile overlap fixes.\n   1. Elementor's root container is a flex column. A flex item resolves its\n      height from its max-content width, not the width it actually renders at,\n      so on a narrow viewport a tall widget reports a box shorter than its\n      content and the widget after it is positioned too high: the two collide.\n      \/our-doctors\/ was rendering its last two cards below the footer. Giving\n      every child a definite width makes the height resolve against the real\n      width. Above the point where the two widths agree this changes nothing,\n      so desktop is untouched.\n   2. The floating Telegram pill is 224px wide, about 60% of a 375px screen,\n      and covers the footer links and the footer's own Telegram button. Below\n      600px it becomes a 56px circle. The label is a bare text node with no\n      wrapper, so font-size:0 is what hides it; the svg carries width\/height\n      attributes so it keeps its size. *\/\n.elementor-element-9a575cb > .elementor-element{width:100%}\n@media (max-width:600px){\n  .tg-float{width:56px;height:56px;padding:0;gap:0;font-size:0;justify-content:center;border-radius:50%}\n  .tg-float svg{width:22px;height:22px;flex:0 0 auto}\n}<\/style>\n<style id=\"dmrh-rev-0829\">\/* Site revision, 29 Aug 2026 (client review).\n   G1. Page titles down ~25%. .page-hero .display-lg was clamp(40px,5.4vw,76px)\n       and the home hero .display-xl was clamp(48px,7.4vw,108px).\n       \/accreditation\/ and \/sen-sok-phnom-penh-thmey\/ are deliberately absent:\n       their H1 carries no display class and already renders at 40px, so a\n       shared rule would have made those two BIGGER, not smaller.\n   G2. The kicker above a page title is gone sitewide. On five of the eight\n       pages it repeated the H1 word for word, so it carried no information.\n       The H1's inline margin-top:12px was there to clear that kicker, so it\n       is zeroed at the same time or the title floats.\n   Appended last in this widget, and the widget prints in the body while\n   design-system.css is in the head, so these win ties on source order. *\/\n.page-hero .display-lg{font-size:clamp(30px,4.05vw,57px) !important;margin-top:0 !important}\n.dmrh-hero-intro .display-xl{font-size:clamp(36px,5.55vw,81px) !important;margin-top:0 !important}\n.page-hero .eyebrow,.dmrh-hero-intro .eyebrow{display:none !important}<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4b9e4ea elementor-widget elementor-widget-html\" data-id=\"4b9e4ea\" 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<!-- Google Fonts. Normally emitted by domrey_inject_design_system() in the\n     plugin, but that only fires for page ids listed in its $design_pages\n     array and this page is not one of them. Without these links the page\n     renders in fallback serif. Same href as the plugin uses, so it is one\n     cache entry, not two. Remove these if the id is ever added to\n     $design_pages. -->\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;0,600;1,300;1,400;1,500&family=Plus+Jakarta+Sans:wght@300;400;500;600;700&family=Lora:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600&family=Manrope:wght@400;500;600;700;800&family=Noto+Serif+Khmer:wght@400;600&family=Noto+Sans+Khmer:wght@400;600&display=swap\" crossorigin>\n\n<style>\n\/* ============================================================\n   \/app: \"Get the App\" landing page.\n\n   Everything here is scoped to .appdl so nothing can reach another\n   page. Colours, fonts, radii, shadows, breakpoints and components\n   all come from design-system.css: no new hex value is introduced\n   except inside the phone mockup, which is the one component the\n   site has no equivalent for.\n\n   Reused from the site rather than rebuilt:\n     .wrap .section .divider          layout\n     .display-lg .display-md .lede    type scale\n     .eyebrow                         accent kicker\n     .filters .filter-chip            the segmented switcher\n     .svc-card-grid                   the 3-up card grid\n     .footer-badges .footer-badge     the App Store \/ Google Play badges\n   ============================================================ *\/\n\n\/* --- shared --- *\/\n\/* design-system.css defines no focus style anywhere, so the page brings\n   its own, scoped, using the site accent. *\/\n.appdl a:focus-visible,\n.appdl button:focus-visible {\n  outline: 2px solid var(--accent);\n  outline-offset: 2px;\n  border-radius: var(--r-sm);\n}\n\n\/* ---------- BLOCK 1: hero ---------- *\/\n\/* 960px and the 64px gap are the site's own .hero-grid values. *\/\n\/* 420px, not 320: the guide bubble needs room beside the phone and the phone\n   itself went to 300px. The stack point moves with the column, 960 to 1060. *\/\n.appdl-hero-grid { display: grid; grid-template-columns: minmax(0, 1fr) 420px; gap: 48px; align-items: center; }\n@media (max-width: 1060px) { .appdl-hero-grid { grid-template-columns: 1fr; gap: 40px; } }\n\n.appdl-left { display: flex; flex-direction: column; gap: 22px; align-items: flex-start; }\n.appdl-meta { display: flex; align-items: center; gap: 14px; }\n\n\/* The app icon, on a white tile with the site's own hairline and radius.\n   The artwork is a transparent PNG with an irregular silhouette, so it gets\n   no padding: at 52px the elephant needs every pixel to stay readable. *\/\n.appdl-appicon {\n  flex: 0 0 auto; width: 52px; height: 52px;\n  border-radius: var(--r-md);\n  background: var(--card);\n  border: 1px solid var(--line);\n  object-fit: contain;\n}\n.appdl-meta-txt { font-size: 13px; font-weight: 600; letter-spacing: .02em; color: var(--ink-3); }\n\n\/* The page title at the size every other page title renders at after the\n   29 Aug 2026 revision: .display-lg scaled by 0.75. In the accent, so the\n   H1 carries the brand colour the way .hero-headline .underline does. *\/\n.appdl-h1 { font-size: clamp(30px, 4.05vw, 57px); color: var(--accent); text-transform: none; max-width: 18ch; }\n.appdl-lede { font-size: 19px; }\n\n.appdl-badges { margin-top: 4px; }\n\n\/* --- the phone. These values are literal: the site has no equivalent\n       component, so nothing here is derived from a token. --- *\/\n.appdl-right { display: flex; flex-direction: column; gap: 22px; align-items: center; }\n.appdl-phone { position: relative; perspective: 1400px; width: 300px; max-width: 100%; animation: appdl-float 7.5s ease-in-out infinite; }\n\/* 300px of phone inside the 320px .wrap leaves on a small screen would scroll\n   sideways, so the phone gives before the page does *\/\n@media (max-width: 520px) { .appdl-phone { width: 268px; } }\n\/* The float is on .appdl-phone and the tilt on .appdl-phone-inner, two\n   elements because they are two transforms: one animation and one live value.\n   On a single element the animation wins and the tilt never shows. *\/\n@keyframes appdl-float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-11px); } }\n.appdl-phone-inner {\n  position: relative;\n  transform-style: preserve-3d;\n  filter: drop-shadow(0 22px 34px rgba(38, 51, 63, 0.24));\n  \/* --rx\/--ry are written by the pointer handler and stay 0 otherwise, so no\n     rule has to be conditional and a touch device simply never sets them *\/\n  transform: rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg));\n  transition: transform .45s cubic-bezier(.2, .7, .3, 1);\n}\n.appdl-slab {\n  position: absolute; inset: 0;\n  border-radius: 44px;\n  background: linear-gradient(150deg, #3A4550, #171E25 60%, #2A333C);\n  transform: translateZ(-15px);\n}\n.appdl-side { position: absolute; width: 4px; transform: translateZ(-8px); }\n.appdl-side.l { left: -4px; background: linear-gradient(90deg, #7C8894, #4A555F); border-radius: 3px 0 0 3px; }\n.appdl-side.r { right: -4px; background: linear-gradient(270deg, #7C8894, #4A555F); border-radius: 0 3px 3px 0; }\n.appdl-side.l1 { top: 17%; height: 5%; }\n.appdl-side.l2 { top: 25%; height: 9%; }\n.appdl-side.l3 { top: 36%; height: 9%; }\n.appdl-side.r1 { top: 28%; height: 13%; }\n.appdl-rail {\n  position: relative;\n  padding: 10px;\n  border-radius: 44px;\n  background: linear-gradient(135deg, #98A3AE 0%, #55606B 22%, #2E3740 50%, #6D7883 78%, #39424B 100%);\n  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.22), inset 0 -1px 2px rgba(0, 0, 0, 0.5);\n}\n\/* aspect-ratio holds the shape before the screenshots load. *\/\n.appdl-screen {\n  position: relative;\n  border-radius: 33px;\n  overflow: hidden;\n  background: #000;\n  box-shadow: inset 0 0 0 2px #0B0F13;\n  aspect-ratio: 1188 \/ 2532;\n}\n.appdl-shot {\n  position: absolute; inset: 0;\n  width: 100%; height: 100%;\n  object-fit: cover; object-position: top;\n  opacity: 0; z-index: 0;\n}\n.appdl-shot.is-on { opacity: 1; z-index: 1; }\n.appdl-notch {\n  position: absolute; top: 9px; left: 50%; transform: translateX(-50%);\n  width: 27%; height: 22px; border-radius: 999px;\n  background: #07090B; pointer-events: none; z-index: 3;\n}\n.appdl-glare {\n  position: absolute; inset: 0; z-index: 4; pointer-events: none;\n  background: linear-gradient(118deg, rgba(255,255,255,0.26) 0%, rgba(255,255,255,0.05) 22%, rgba(255,255,255,0) 42%);\n}\n\n\/* --- tap hotspots. The script below builds them per screen from a measured\n       table and positions them in percentages, so they scale with the phone.\n       The layer must not eat the taps it is not carrying, hence the\n       pointer-events pair. --- *\/\n.appdl-hots { position: absolute; inset: 0; z-index: 5; pointer-events: none; }\n.appdl-hot {\n  position: absolute;\n  padding: 0; border: 0; background: transparent;\n  border-radius: var(--r-sm);\n  cursor: pointer;\n  pointer-events: auto;\n  \/* box-shadow is in the transition so the ring hands over from one area to\n     the next as the guide moves on, instead of cutting *\/\n  transition: background .18s, box-shadow .26s;\n}\n.appdl-hot:hover,\n.appdl-hot:focus-visible { background: color-mix(in oklab, var(--accent) 20%, transparent); }\n\/* the current tab: a real control, just not one that goes anywhere *\/\n.appdl-hot[disabled] { cursor: default; background: transparent; pointer-events: none; }\n\n\/* --- control strip under the phone --- *\/\n.appdl-controls { display: flex; flex-direction: column; align-items: center; gap: 10px; }\n.appdl-switch { margin: 0; justify-content: center; }\n\/* The screen name still reaches a screen reader, it just is not painted. The\n   visible strip that used to carry it is gone, and the callout speaks only\n   while a nudge or the tour is running, so without this a change of screen\n   would be silent. *\/\n.appdl-sr {\n  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;\n  overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%);\n  white-space: nowrap; border: 0;\n}\n\n\/* --- the beacon: one pulsing dot, on whichever area the guide is naming, and\n       it exists ONLY while a nudge is running. It used to sit there\n       permanently, which is furniture rather than a prompt, and one dot\n       cannot stand for the five different things a screen lets you tap. It\n       sits dead centre of its hotspot and takes no pointer events, so it can\n       never eat the tap it is advertising. --- *\/\n.appdl-beacon {\n  position: absolute; left: 50%; top: 50%;\n  width: 12px; height: 12px; margin: -6px 0 0 -6px;\n  border-radius: 999px;\n  background: var(--accent);\n  box-shadow: 0 0 0 2px #fff, 0 1px 4px rgba(0, 0, 0, .35);\n  pointer-events: none;\n  z-index: 2;\n}\n.appdl-beacon::after {\n  content: \"\"; position: absolute; inset: -4px;\n  border-radius: 999px;\n  border: 2px solid var(--accent);\n  animation: appdl-ping 1900ms cubic-bezier(.2, .6, .3, 1) infinite;\n}\n@keyframes appdl-ping {\n  0%   { transform: scale(.7);  opacity: .85; }\n  70%  { transform: scale(2.2); opacity: 0; }\n  100% { transform: scale(2.2); opacity: 0; }\n}\n\n\/* --- the guide card, in the LEFT column. It sits under the store badges on\n       desktop and directly above the phone once the grid stacks at 1060px,\n       which is the order it should be read in either way: what this is, then\n       the thing itself. --- *\/\n.appdl-guide {\n  width: 100%; max-width: 52ch;\n  background: var(--card);\n  border: 1px solid var(--line);\n  border-radius: var(--r-md);\n  padding: 18px 20px;\n  display: flex; flex-direction: column; gap: 13px;\n}\n.appdl-guide-head { margin: 0; font-size: 14px; line-height: 1.55; color: var(--ink-2); }\n.appdl-guide-badge {\n  display: inline-block; margin-right: 8px;\n  padding: 3px 9px; border-radius: 999px;\n  background: color-mix(in oklab, var(--accent) 12%, transparent);\n  color: var(--accent);\n  font-size: 10.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;\n  vertical-align: 1px;\n}\n\/* scoped at (0,2,0) throughout: the theme styles bare list elements and its\n   sheet loads after this page's compiled CSS, so (0,1,0) would lose *\/\n.appdl .appdl-guide-list {\n  margin: 0; padding: 0; list-style: none;\n  counter-reset: appdl-g;\n  display: flex; flex-direction: column; gap: 9px;\n}\n.appdl .appdl-guide-list li {\n  counter-increment: appdl-g;\n  position: relative; padding-left: 29px;\n  margin: 0; list-style: none;\n  font-size: 14px; line-height: 1.5; color: var(--ink-3);\n}\n.appdl .appdl-guide-list li::before {\n  content: counter(appdl-g);\n  position: absolute; left: 0; top: 1px;\n  width: 20px; height: 20px; border-radius: 999px;\n  background: var(--ink); color: var(--bg);\n  font-family: var(--font-body); font-size: 11px; font-weight: 700;\n  display: flex; align-items: center; justify-content: center;\n}\n.appdl-guide-note {\n  margin: 0; padding-top: 12px;\n  border-top: 1px solid var(--line);\n  font-size: 12.5px; line-height: 1.55; color: var(--subtle);\n}\n\n\/* while the tour is narrating, ring the hotspot the callout points at, so\n   the bubble and its subject read as one thing rather than two *\/\n.appdl-callout.plain::after { display: none; }\n.appdl-hots.is-guiding .appdl-hot.is-target {\n  background: color-mix(in oklab, var(--accent) 18%, transparent);\n  box-shadow: inset 0 0 0 2px var(--accent), 0 0 0 3px color-mix(in oklab, var(--accent) 25%, transparent);\n}\n\n\/* --- the idle nudge outlines EVERY tappable area at once, because there is\n       never only one thing you are allowed to tap and a single dot said\n       otherwise. The area the callout is currently naming is brighter and\n       stops breathing, so at any moment the screen reads as \"all of these,\n       and this one in particular\".\n\n       These sit AFTER the .is-guiding rule on purpose. Both selectors are\n       four classes, and during a nudge both classes are on the layer, so\n       source order is what decides which wins: the nudge's own treatment\n       should. --- *\/\n.appdl-hots.is-hinting .appdl-hot:not([disabled]) {\n  background: color-mix(in oklab, var(--accent) 10%, transparent);\n  box-shadow: inset 0 0 0 2px color-mix(in oklab, var(--accent) 42%, transparent),\n              0 0 10px 1px color-mix(in oklab, var(--accent) 20%, transparent);\n  animation: appdl-glow 2200ms ease-in-out infinite;\n}\n.appdl-hots.is-hinting .appdl-hot.is-target {\n  background: color-mix(in oklab, var(--accent) 26%, transparent);\n  box-shadow: inset 0 0 0 2px var(--accent),\n              0 0 16px 3px color-mix(in oklab, var(--accent) 45%, transparent);\n}\n@keyframes appdl-glow { 0%, 100% { opacity: .5; } 50% { opacity: 1; } }\n\n\/* ---------- the beacon ---------- *\/\n.appdl-beacon {\n  position: absolute; left: 50%; top: 50%; width: 12px; height: 12px; margin: -6px 0 0 -6px;\n  border-radius: 999px; background: var(--accent);\n  box-shadow: 0 0 0 2px #fff, 0 1px 4px rgba(0,0,0,.35);\n  pointer-events: none; z-index: 2;\n}\n.appdl-beacon::after {\n  content: \"\"; position: absolute; inset: -4px; border-radius: 999px; border: 2px solid var(--accent);\n  animation: appdl-ping 1900ms cubic-bezier(.2,.6,.3,1) infinite;\n}\n@keyframes appdl-ping {\n  0% { transform: scale(.7); opacity: .85; }\n  70% { transform: scale(2.2); opacity: 0; }\n  100% { transform: scale(2.2); opacity: 0; }\n}\n\n\/* ---------- the callout, anchored to the tap target ----------\n   Raised by the tour, and by the idle nudge. Never while the visitor is\n   actually using the phone: a clean screenshot is the default state.\n   Positioned in percentages of the screen box by JS, so it tracks the phone\n   at any size. *\/\n.appdl-callout {\n  position: absolute; z-index: 8; width: 68%;\n  background: rgba(14, 20, 28, .95);\n  border: 1px solid rgba(255,255,255,.16);\n  border-radius: 13px; padding: 10px 12px;\n  color: #fff; font-family: var(--font-body); font-size: 12px; font-weight: 500; line-height: 1.45;\n  box-shadow: 0 16px 34px -10px rgba(0,0,0,.7);\n  backdrop-filter: blur(3px);\n  opacity: 0; transform: translateY(7px) scale(.95); transform-origin: 50% 0;\n  transition: opacity .3s, transform .3s cubic-bezier(.2,.85,.3,1);\n  pointer-events: none;\n}\n.appdl-callout.is-on { opacity: 1; transform: none; }\n.appdl-callout b { color: #FFB08C; font-weight: 700; }\n.appdl-callout::after {\n  content: \"\"; position: absolute; left: var(--ax, 50%); width: 12px; height: 12px;\n  background: rgba(14,20,28,.95); border: 1px solid rgba(255,255,255,.16);\n  transform: translateX(-50%) rotate(45deg);\n}\n.appdl-callout.below::after { top: -7px; border-right: 0; border-bottom: 0; }\n.appdl-callout.above::after { bottom: -7px; border-left: 0; border-top: 0; }\n\n\/* ---------- the tour bar ---------- *\/\n.appdl-tour { display: flex; width: 100%; max-width: 320px; flex-direction: column; gap: 10px; align-items: center; }\n.appdl-tourrow { display: flex; align-items: center; gap: 12px; width: 100%; }\n.appdl-play {\n  display: inline-flex; align-items: center; gap: 8px; flex: 0 0 auto;\n  padding: 10px 18px; border-radius: 999px; border: 1px solid var(--accent);\n  background: var(--accent); color: #fff !important;\n  font-family: var(--font-body); font-size: 13px; font-weight: 700; line-height: 1.2;\n  text-transform: none; letter-spacing: normal; width: auto; cursor: pointer;\n  box-shadow: 0 8px 20px -8px rgba(217,84,43,.8);\n  transition: transform .18s, box-shadow .18s, background .18s;\n}\n.appdl-play:hover { transform: translateY(-1px); box-shadow: 0 12px 26px -8px rgba(217,84,43,.9); }\n.appdl-play svg { flex: 0 0 auto; }\n.appdl-prog { flex: 1 1 auto; height: 4px; border-radius: 999px; background: var(--line); overflow: hidden; }\n.appdl-prog i { display: block; height: 100%; width: 0; background: var(--accent); border-radius: 999px; transition: width .35s linear; }\n.appdl-stepno { flex: 0 0 auto; font-family: var(--font-mono); font-size: 11px; font-weight: 500; letter-spacing: .06em; color: var(--ink-3); min-width: 34px; text-align: right; }\n\n\/* the store badges pulse on the tour's last step *\/\n@keyframes appdl-badgepulse {\n  0%, 100% { box-shadow: 0 0 0 0 rgba(217,84,43,0); }\n  50% { box-shadow: 0 0 0 7px rgba(217,84,43,.22); }\n}\n.appdl-badges.is-calling .footer-badge { animation: appdl-badgepulse 1400ms ease-in-out 3; border-color: var(--accent); }\n\n\/* ---------- BLOCK 2: getting started ---------- *\/\n.appdl-steps-inner { display: flex; flex-direction: column; gap: 34px; align-items: flex-start; }\n.appdl-h2 { text-transform: none; }\n.appdl-grid { width: 100%; }\n.appdl-step {\n  background: var(--card);\n  border: 1px solid var(--line);\n  border-radius: var(--r-md);\n  padding: var(--pad-card);\n  display: flex; flex-direction: column; gap: 10px;\n}\n.appdl-step h3 {\n  margin: 0;\n  font-family: var(--font-display);\n  font-size: 22px; font-weight: 500;\n  letter-spacing: var(--display-tracking); line-height: 1.18;\n  color: var(--ink); text-transform: none;\n}\n.appdl-step p { margin: 0; font-size: 15px; line-height: 1.55; color: var(--ink-3); }\n.appdl-help { margin: 0; font-size: 15px; line-height: 1.6; color: var(--ink-3); max-width: 68ch; }\n.appdl-help a { font-weight: 700; color: var(--ink); white-space: nowrap; border-bottom: 1px solid var(--line-strong); }\n.appdl-help a:hover { color: var(--accent); border-color: var(--accent); }\n\n\/* ---------- holding the line against the live theme ----------\n   Three collisions that only appear on the real page, because the preview\n   loads design-system.css on its own and the live page loads it underneath\n   the Medicate theme and Elementor's frontend CSS.\n\n   1. `.footer-badge` and `.footer-badges` are defined in design-system.css,\n      but the copy that actually reaches a page comes from the footer widget's\n      own <style> block, scoped to `#dmrh-footer`. Outside the footer the\n      badges got no chrome at all and fell back to `a, .button {color:\n      var(--primary-color)}`, so they rendered as bare blue text. Same values\n      as design-system.css:2107-2111, restated at (0,2,0).\n\n   2. The theme styles `[type=\"button\"], [type=\"reset\"], [type=\"submit\"]` with\n      its own background, 12px 30px padding and uppercase. That is (0,1,0),\n      the same as `.filter-chip`, and the theme sheet loads after the page's\n      compiled CSS, so it wins on source order. Every one of these buttons\n      carries type=\"button\", which is correct and is exactly what the selector\n      catches. Restated at (0,2,0).\n\n   3. Elementor's `.elementor img {border-radius:0;border-width:medium}` is\n      (0,1,1) and outranks `.appdl-appicon`, which flattened the icon tile.\n      Needs (0,2,1) to beat it.\n\n   And one of those three needs !important, which specificity alone could not\n   fix: the theme's button rule sets `color: var(--white-color) !important`, so\n   the two inactive chips rendered as white text on a transparent pill, i.e.\n   invisible. Only the colour is !important there, which is why the background\n   and the padding came right from specificity alone. Marked !important on both\n   chip states and nowhere else.\n\n   The lesson for the next page: a rule that holds in the preview can still\n   lose here. Check the computed value on the live page, not the draft. *\/\n\n.appdl-badges { display: flex; flex-wrap: wrap; gap: 10px; }\n.appdl-badges .footer-badge {\n  display: inline-flex; align-items: center; gap: 9px;\n  padding: 8px 14px;\n  border: 1px solid var(--line-strong);\n  border-radius: var(--r-md);\n  background: var(--card);\n  color: var(--ink-2);\n  text-decoration: none;\n  font-family: var(--font-body);\n  font-size: 13px; font-weight: 600; line-height: 1.15;\n  text-transform: none; letter-spacing: normal;\n  white-space: nowrap;\n  transition: transform .2s, border-color .2s, color .2s;\n}\n.appdl-badges .footer-badge:hover { transform: translateY(-1px); border-color: var(--accent); color: var(--accent); }\n.appdl-badges .footer-badge span { display: flex; flex-direction: column; }\n.appdl-badges .footer-badge small { font-size: 9.5px; font-weight: 500; letter-spacing: .06em; text-transform: uppercase; color: var(--subtle); }\n\/* The hover recolours the badge, and the Apple mark is fill=\"currentColor\",\n   so it would go orange while the four-colour Play mark stayed put. Pin both:\n   hover moves the label and the border only. *\/\n.appdl-badges .footer-badge svg { color: var(--ink); flex: 0 0 auto; }\n\n.appdl-switch .filter-chip {\n  padding: 9px 18px;\n  border-radius: 999px;\n  border: 1px solid var(--line-strong);\n  background: transparent;\n  color: var(--ink-2) !important;\n  font-family: var(--font-body);\n  font-size: 13px; font-weight: 600; line-height: 1.4;\n  text-transform: none; letter-spacing: normal;\n  width: auto;\n  transition: background .18s, color .18s, border-color .18s;\n}\n.appdl-switch .filter-chip.active { background: var(--ink); color: var(--bg) !important; border-color: var(--ink); }\n\n.appdl img.appdl-appicon { border-radius: var(--r-md); border: 1px solid var(--line); }\n\n@media (prefers-reduced-motion: reduce) {\n  .appdl-shot, .appdl-hot, .appdl-switch .filter-chip, .appdl-badges .footer-badge { transition: none !important; }\n  .appdl-badges .footer-badge:hover { transform: none; }\n  \/* the beacon keeps its dot and loses its halo: the mark still says \"tap\n     here\", which is information, and only the motion goes *\/\n  .appdl-beacon::after { animation: none; opacity: 0; }\n  \/* the boxes stay, at full strength; only the breathing goes *\/\n  .appdl-hots.is-hinting .appdl-hot:not([disabled]) { animation: none; opacity: 1; }\n  .appdl-phone { animation: none !important; }\n  .appdl-phone-inner { transition: none !important; }\n  .appdl-callout { transition: none; }\n  .appdl-badges.is-calling .footer-badge { animation: none; }\n}\n<\/style>\n\n<main class=\"appdl\">\n\n  <section class=\"section appdl-hero\">\n    <div class=\"wrap\">\n      <div class=\"appdl-hero-grid\">\n\n        <div class=\"appdl-left\">\n          <div class=\"appdl-meta\">\n            <img decoding=\"async\" class=\"appdl-appicon\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-icon.png\" width=\"52\" height=\"52\"\n                 alt=\"Domrey Hospital app icon\">\n            <span class=\"appdl-meta-txt\">Free &middot; iOS &amp; Android &middot; for Domrey patients<\/span>\n          <\/div>\n\n          <h1 class=\"display-lg appdl-h1\">Everything from your visit, on your phone<\/h1>\n\n          <p class=\"lede appdl-lede\">The Domrey Hospital app is where you book appointments and read your own results. No paper to carry, no calling to ask if a result is ready.<\/p>\n\n          <!-- Badge markup from domrey_site_footer(), with two icon fixes: the\n               Apple mark is drawn full-bleed in its viewBox (the footer's copy\n               sits small and thins out at 18px), and the Play mark carries its\n               four brand colours instead of one ink colour at four opacities,\n               which rendered as a grey wedge. Geometry is unchanged. The\n               plugin's own footer still has the old pair.\n\n               Store URLs taken from the live Elementor footer widgets, where\n               they were already filled in, and both checked for a 200 and for\n               the right listing: \"Domrey Hospital App\" on the App Store,\n               \"Domrey Hospital\" on Google Play. NOTE the plugin copy of the\n               footer, domrey_site_footer(), still has href=\"#\" for both, so on\n               the CPT detail pages the whole block is still self-hidden. That\n               needs a plugin release, not a page edit. -->\n          <div class=\"footer-badges appdl-badges\" id=\"appdlBadges\">\n            <a class=\"footer-badge\" href=\"https:\/\/apps.apple.com\/us\/app\/domrey-hospital\/id6758605441\" target=\"_blank\" rel=\"noopener\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\" aria-hidden=\"true\"><path d=\"M17.564 12.717c-.026-2.63 2.147-3.892 2.245-3.953-1.222-1.788-3.123-2.033-3.8-2.061-1.618-.163-3.157.952-3.977.952-.82 0-2.083-.928-3.425-.903-1.763.026-3.386 1.024-4.293 2.602-1.831 3.175-.468 7.877 1.314 10.456.872 1.262 1.911 2.68 3.274 2.629 1.313-.052 1.81-.851 3.398-.851 1.588 0 2.035.851 3.425.824 1.414-.023 2.309-1.286 3.173-2.552 1.001-1.464 1.413-2.881 1.438-2.954-.031-.013-2.757-1.058-2.784-4.19zM14.994 5.03c.725-.879 1.214-2.102 1.08-3.32-1.045.042-2.311.696-3.06 1.573-.672.778-1.26 2.023-1.102 3.217 1.167.09 2.357-.593 3.082-1.47z\"\/><\/svg><span><small>Download on the<\/small>App Store<\/span><\/a>\n            <a class=\"footer-badge\" href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.anzer.patientportal.domrey\" target=\"_blank\" rel=\"noopener\"><svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\"><path fill=\"#00A0FF\" d=\"M3.6 2.4c-.3.24-.5.62-.5 1.12v16.96c0 .5.2.88.5 1.12l.1.08 9.5-9.6v-.16L3.7 2.32l-.1.08z\"\/><path fill=\"#FFBC00\" d=\"m16.4 15.4-3.2-3.32v-.16l3.2-3.32.08.04 3.8 2.2c1.08.62 1.08 1.64 0 2.26l-3.8 2.2-.08.1z\"\/><path fill=\"#FF3A44\" d=\"m16.48 15.36-3.28-3.4-9.6 9.68c.36.38.94.42 1.6.04l11.28-6.32z\"\/><path fill=\"#00C853\" d=\"M16.48 8.64 5.2 2.32c-.66-.38-1.24-.34-1.6.04l9.6 9.6 3.28-3.32z\"\/><\/svg><span><small>Get it on<\/small>Google Play<\/span><\/a>\n          <\/div>\n\n          <!-- What the phone is, and how to drive it. The client asked for\n               both: people were looking at a picture of a phone and not\n               realising it answers a tap.\n\n               In the left column on purpose. The right column is 320px wide\n               and the phone already fills about 620px of it, so hanging a\n               card off the bottom of that would have pushed the hero past\n               900px tall while the left column sat half empty. Here it reads\n               before the phone at every width: beside it on desktop, and\n               directly above it once the grid stacks at 960. -->\n          <div class=\"appdl-guide\">\n            <p class=\"appdl-guide-head\"><span class=\"appdl-guide-badge\">Interactive preview<\/span>The phone beside this is a working preview of the real Domrey Hospital app. Every screen on it is an actual screenshot, and you can move around it right here in your browser.<\/p>\n            <ol class=\"appdl-guide-list\">\n              <li>Press <b>Play the tour<\/b> and the app walks you through itself.<\/li>\n              <li>Or start tapping. Pause for a moment and the phone lights up what you can press.<\/li>\n              <li>Tap the back arrow at the top left of a screen to step back.<\/li>\n            <\/ol>\n            <p class=\"appdl-guide-note\">Not every part of the preview is tappable. Download the app to book a real appointment and open your own results.<\/p>\n          <\/div>\n        <\/div>\n\n        <div class=\"appdl-right\">\n          <div class=\"appdl-phone\">\n            <div class=\"appdl-phone-inner\" id=\"appdlTilt\">\n              <div class=\"appdl-slab\" aria-hidden=\"true\"><\/div>\n              <div class=\"appdl-side l l1\" aria-hidden=\"true\"><\/div>\n              <div class=\"appdl-side l l2\" aria-hidden=\"true\"><\/div>\n              <div class=\"appdl-side l l3\" aria-hidden=\"true\"><\/div>\n              <div class=\"appdl-side r r1\" aria-hidden=\"true\"><\/div>\n\n              <div class=\"appdl-rail\">\n                <!-- loading=\"eager\" on every one of these is load-bearing.\n                     WordPress adds loading=\"lazy\" to content images it thinks are\n                     below the fold, and it picked two of the original three, so\n                     they never fetched at all and the screen went black on the\n                     first tap. Setting the attribute ourselves stops the filter\n                     touching it. They are one control, not twelve pictures: a tap\n                     has to show the next screen, not start a download.\n                     fetchpriority=\"low\" on the eleven that are not showing yet\n                     keeps them eager without letting them race the hero.\n                     WebP, not PNG: 12 screens come to 655 KB where the original\n                     3 PNGs were about 800 KB, so the page got lighter as it\n                     gained nine screens. -->\n                <div class=\"appdl-screen\" id=\"appdlScreen\">\n                  <img fetchpriority=\"high\" class=\"appdl-shot is-on\" data-screen=\"home\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-scr-home.webp\" width=\"560\" height=\"1214\" loading=\"eager\"\n                       alt=\"Domrey Hospital app: the Home screen, with imaging results, lab results, medication, promotions, news and educational articles.\" decoding=\"async\">\n                  <img class=\"appdl-shot\" data-screen=\"doctors\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-scr-doctors.webp\" width=\"560\" height=\"1214\" loading=\"eager\"\n                       alt=\"Domrey Hospital app: the doctor list, with a Book button beside each doctor.\" decoding=\"async\" fetchpriority=\"low\" aria-hidden=\"true\">\n                  <img class=\"appdl-shot\" data-screen=\"drSokheang\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-scr-dr-sokheang.webp\" width=\"560\" height=\"1214\" loading=\"eager\"\n                       alt=\"Domrey Hospital app: Dr. Hong Sokheang's profile and booking screen.\" decoding=\"async\" fetchpriority=\"low\" aria-hidden=\"true\">\n                  <img class=\"appdl-shot\" data-screen=\"drBunkea\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-scr-dr-bunkea.webp\" width=\"560\" height=\"1214\" loading=\"eager\"\n                       alt=\"Domrey Hospital app: Dr. Eang Bunkea's profile and booking screen.\" decoding=\"async\" fetchpriority=\"low\" aria-hidden=\"true\">\n                  <img class=\"appdl-shot\" data-screen=\"drBoth\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-scr-dr-both.webp\" width=\"560\" height=\"1214\" loading=\"eager\"\n                       alt=\"Domrey Hospital app: Dr. Soeung Seitaboth's profile and booking screen.\" decoding=\"async\" fetchpriority=\"low\" aria-hidden=\"true\">\n                  <img class=\"appdl-shot\" data-screen=\"drSarngkorng\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-scr-dr-sarngkorng.webp\" width=\"560\" height=\"1214\" loading=\"eager\"\n                       alt=\"Domrey Hospital app: Dr. Lim Sarngkorng's profile and booking screen.\" decoding=\"async\" fetchpriority=\"low\" aria-hidden=\"true\">\n                  <img class=\"appdl-shot\" data-screen=\"drSonita\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-scr-dr-sonita.webp\" width=\"560\" height=\"1214\" loading=\"eager\"\n                       alt=\"Domrey Hospital app: Dr. Sun Sonita's profile and booking screen.\" decoding=\"async\" fetchpriority=\"low\" aria-hidden=\"true\">\n                  <img class=\"appdl-shot\" data-screen=\"promotions\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-scr-promotions.webp\" width=\"560\" height=\"1214\" loading=\"eager\"\n                       alt=\"Domrey Hospital app: the promotions list, showing the current Domrey packages and offers.\" decoding=\"async\" fetchpriority=\"low\" aria-hidden=\"true\">\n                  <img class=\"appdl-shot\" data-screen=\"promoDetail\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-scr-promo-detail.webp\" width=\"560\" height=\"1214\" loading=\"eager\"\n                       alt=\"Domrey Hospital app: the safe delivery package in full, with its three price tiers.\" decoding=\"async\" fetchpriority=\"low\" aria-hidden=\"true\">\n                  <img class=\"appdl-shot\" data-screen=\"articles\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-scr-articles.webp\" width=\"560\" height=\"1214\" loading=\"eager\"\n                       alt=\"Domrey Hospital app: the educational articles list, with videos and guides from Domrey doctors.\" decoding=\"async\" fetchpriority=\"low\" aria-hidden=\"true\">\n                  <img class=\"appdl-shot\" data-screen=\"apptUpcoming\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-scr-appt-upcoming.webp\" width=\"560\" height=\"1214\" loading=\"eager\"\n                       alt=\"Domrey Hospital app: the Upcoming tab of the appointments screen.\" decoding=\"async\" fetchpriority=\"low\" aria-hidden=\"true\">\n                  <img class=\"appdl-shot\" data-screen=\"apptHistory\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-scr-appt-history.webp\" width=\"560\" height=\"1214\" loading=\"eager\"\n                       alt=\"Domrey Hospital app: the History tab of the appointments screen, listing past visits and their status.\" decoding=\"async\" fetchpriority=\"low\" aria-hidden=\"true\">\n\n                  <div class=\"appdl-notch\" aria-hidden=\"true\"><\/div>\n                  <div class=\"appdl-glare\" aria-hidden=\"true\"><\/div>\n\n                  <div class=\"appdl-hots\" id=\"appdlHots\"><\/div>\n                  <div class=\"appdl-callout\" id=\"appdlCallout\" role=\"status\"><\/div>\n                <\/div>\n              <\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"appdl-controls\">\n            <div class=\"appdl-tour\">\n              <div class=\"appdl-tourrow\">\n                <button type=\"button\" class=\"appdl-play\" id=\"appdlPlay\">\n                  <svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M8 5.5v13l11-6.5z\"\/><\/svg>\n                  <span id=\"appdlPlayTxt\">Play the tour<\/span>\n                <\/button>\n                <div class=\"appdl-prog\"><i id=\"appdlProg\"><\/i><\/div>\n                <span class=\"appdl-stepno\" id=\"appdlStepNo\">0\/8<\/span>\n              <\/div>\n            <\/div>\n\n            <div class=\"filters appdl-switch\" role=\"group\" aria-label=\"Choose an app screen\">\n              <button type=\"button\" class=\"filter-chip active\" data-screen=\"home\" aria-pressed=\"true\">Home<\/button>\n              <button type=\"button\" class=\"filter-chip\" data-screen=\"doctors\" aria-pressed=\"false\">Doctors<\/button>\n              <button type=\"button\" class=\"filter-chip\" data-screen=\"apptUpcoming\" aria-pressed=\"false\">Appointments<\/button>\n              <button type=\"button\" class=\"filter-chip\" data-screen=\"promotions\" aria-pressed=\"false\">Promotions<\/button>\n              <button type=\"button\" class=\"filter-chip\" data-screen=\"articles\" aria-pressed=\"false\">Articles<\/button>\n            <\/div>\n            <!-- The visible strip that used to sit here is gone. With every\n                 tappable area glowing and the guide naming them in turn, a\n                 running commentary under the phone said the same thing twice.\n                 What stays is the announcement, for a screen reader only: the\n                 callout speaks only while a nudge or the tour is running, so\n                 without this a blind visitor is never told the phone moved. -->\n            <div class=\"appdl-sr\" aria-live=\"polite\" id=\"appdlWhere\">Home<\/div>\n          <\/div>\n        <\/div>\n\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <div class=\"wrap\"><div class=\"divider\"><\/div><\/div>\n\n  <section class=\"section appdl-steps\">\n    <div class=\"wrap\">\n      <div class=\"appdl-steps-inner\">\n\n        <h2 class=\"display-md appdl-h2\">Getting started takes a minute<\/h2>\n\n        <div class=\"svc-card-grid appdl-grid\">\n          <div class=\"appdl-step\">\n            <span class=\"eyebrow\">Step 1<\/span>\n            <h3>Install the app<\/h3>\n            <p>Search &ldquo;Domrey Hospital&rdquo; in the App Store or Google Play.<\/p>\n          <\/div>\n          <div class=\"appdl-step\">\n            <span class=\"eyebrow\">Step 2<\/span>\n            <h3>Sign in with your phone number<\/h3>\n            <p>Use the number you gave us at reception so your records connect automatically.<\/p>\n          <\/div>\n          <div class=\"appdl-step\">\n            <span class=\"eyebrow\">Step 3<\/span>\n            <h3>Book or check a result<\/h3>\n            <p>Choose a doctor and time, or open Results to see what&rsquo;s ready.<\/p>\n          <\/div>\n        <\/div>\n\n        <p class=\"appdl-help\">Trouble signing in? Call <a href=\"tel:023902279\">023 902 279<\/a> or message us on <a href=\"https:\/\/t.me\/domreymcc\" target=\"_blank\" rel=\"noopener\">Telegram<\/a>: reception can link your record.<\/p>\n\n      <\/div>\n    <\/div>\n  <\/section>\n\n<\/main>\n\n<script>\n(function () {\n  var screenEl = document.getElementById('appdlScreen');\n  var hotsEl   = document.getElementById('appdlHots');\n\n  var TAB_Y = 91.7, TAB_H = 6.3, TAB_W = 24.1;\n  var TAB_X = [1.9, 26.0, 50.1];\n\n  \/* hotspot = [left, top, width, height, target, label, say]\n\n     `say` is the sentence the idle nudge uses when it is pointing at this\n     hotspot, and carrying it ON the hotspot is what stops the two drifting:\n     a hotspot with a sentence is exactly the set the nudge rotates through,\n     so there is no second list to keep in step. A hotspot with no sentence\n     still works, it is just never featured. That is how the doctor list\n     features ONE Book button instead of cycling through five identical\n     \"tap Book\" cards. *\/\n  function tab(i, to, label, say) { return [TAB_X[i], TAB_Y, TAB_W, TAB_H, to, label, say]; }\n  function backHot(say) { return [1.5, 5.5, 13, 6.5, 'back', 'Back', say]; }\n  function book(top, to, who, say) { return [81.8, top, 14.2, 3.3, to, 'Book ' + who, say]; }\n\n  var SAY_BACK = 'Tap the <b>back arrow<\/b> to go back.';\n  var SAY_HOME = 'Tap <b>Home<\/b> to go back to the start.';\n  var SAY_DOCS = 'Tap <b>Doctors<\/b> to browse every doctor.';\n  var SAY_APPT = 'Tap <b>Appointments<\/b> to see your visits.';\n\n  function profile(who) {\n    return { parent: 'doctors', chip: 'doctors',\n             title: who,\n             hots: [backHot(SAY_BACK)] };\n  }\n\n  var SCREENS = {\n    home: { chip: 'home', title: 'Home',\n      \/* said once, the first time the nudge ever runs: the only moment whose\n         job is to establish that the phone is live at all *\/\n      lead: 'This phone is live. Tap any glowing area to try it.',\n      hots: [\n        [ 1.6, 38.8, 47.7,  7.1, 'promotions',  'Promotions',\n          'Tap <b>Promotions<\/b> to see the current packages.' ],\n        [ 1.6, 48.0, 47.7,  7.1, 'articles',    'Educational articles',\n          'Tap <b>Educational Articles<\/b> for guides from our doctors.' ],\n        [ 3.5, 61.3, 93.1, 20.3, 'promoDetail', 'The featured safe delivery package',\n          'Tap the featured banner to open the delivery package.' ],\n        tab(0, 'doctors',      'Doctors tab',      SAY_DOCS),\n        tab(1, 'apptUpcoming', 'Appointments tab', SAY_APPT),\n        tab(2, null,           'Home tab')\n      ]},\n\n    doctors: { chip: 'doctors', title: 'Doctors',\n      hots: [\n        \/* only the first pill carries a sentence: all five do the same thing,\n           and rotating through five identical prompts would read as a fault *\/\n        book(27.1, 'drSokheang',   'Dr. Hong Sokheang', 'Tap <b>Book<\/b> beside any doctor to see their times.'),\n        book(38.9, 'drBunkea',     'Dr. Eang Bunkea'),\n        book(50.7, 'drBoth',       'Dr. Soeung Seitaboth'),\n        book(62.5, 'drSarngkorng', 'Dr. Lim Sarngkorng'),\n        book(74.3, 'drSonita',     'Dr. Sun Sonita'),\n        tab(0, null,           'Doctors tab'),\n        tab(1, 'apptUpcoming', 'Appointments tab', SAY_APPT),\n        tab(2, 'home',         'Home tab',         SAY_HOME)\n      ]},\n\n    drSokheang:   profile('Dr. Hong Sokheang'),\n    drBunkea:     profile('Dr. Eang Bunkea'),\n    drBoth:       profile('Dr. Soeung Seitaboth'),\n    drSarngkorng: profile('Dr. Lim Sarngkorng'),\n    drSonita:     profile('Dr. Sun Sonita'),\n\n    promotions: { parent: 'home', chip: 'promotions', title: 'Promotions',\n      hots: [\n        backHot(SAY_BACK),\n        [ 2.5, 21.8, 95.0, 34.4, 'promoDetail', 'The safe delivery package',\n          'Tap the package to open it in full.' ]\n      ]},\n    promoDetail: { parent: 'promotions', chip: 'promotions', title: 'Delivery package',\n      hots: [backHot(SAY_BACK)] },\n    articles: { parent: 'home', chip: 'articles', title: 'Educational articles',\n      hots: [backHot(SAY_BACK)] },\n\n    apptUpcoming: { chip: 'apptUpcoming', title: 'Appointments: upcoming',\n      hots: [\n        [29.6, 11.5, 21.0, 5.2, 'apptHistory', 'History', 'Tap <b>History<\/b> to see past visits.'],\n        tab(0, 'doctors', 'Doctors tab', SAY_DOCS),\n        tab(1, null,      'Appointments tab'),\n        tab(2, 'home',    'Home tab', SAY_HOME)\n      ]},\n    apptHistory: { chip: 'apptUpcoming', title: 'Appointments: history',\n      hots: [\n        [ 3.0, 11.5, 25.1, 5.2, 'apptUpcoming', 'Upcoming', 'Tap <b>Upcoming<\/b> to go back to your next visits.'],\n        tab(0, 'doctors', 'Doctors tab', SAY_DOCS),\n        tab(1, null,      'Appointments tab'),\n        tab(2, 'home',    'Home tab', SAY_HOME)\n      ]}\n  };\n\n  \/* The scripted tour. `at` is the hotspot a step points at, given as the\n     screen that hotspot leads to. A step with no `at` is about the screen as\n     a whole: the bubble drops its arrow and sits at the foot of the screen,\n     and nothing is ringed. Without that rule the steps narrating a detail\n     page ended up ringing the back arrow, which is the one thing they were\n     not talking about. *\/\n  var TOUR = [\n    { to: 'home',         at: 'promotions',  say: 'This is <b>Home<\/b>. Results, promotions and articles, one tap away.' },\n    { to: 'promotions',   at: 'promoDetail', say: 'Every package Domrey is running. Open one for the detail.' },\n    { to: 'promoDetail',                     say: 'The whole package, with all three price tiers.' },\n    { to: 'doctors',      at: 'drSokheang',  say: 'Every doctor at the clinic, with <b>Book<\/b> beside each one.' },\n    { to: 'drSokheang',                      say: 'Pick a date and a time. That is the whole booking.' },\n    { to: 'apptUpcoming', at: 'apptHistory', say: 'Your next visits live here. <b>History<\/b> holds the past ones.' },\n    { to: 'apptHistory',                     say: 'Every past visit, and how each one ended.' },\n    { to: 'home',                            say: 'That is the app. Get it free on iOS and Android.', call: true }\n  ];\n\n  var shots = {}, names = [];\n  [].forEach.call(screenEl.querySelectorAll('.appdl-shot'), function (img) {\n    shots[img.getAttribute('data-screen')] = img; names.push(img.getAttribute('data-screen'));\n  });\n\n  var chips    = document.querySelectorAll('.appdl-switch .filter-chip');\n  var whereEl  = document.getElementById('appdlWhere');\n  var callout  = document.getElementById('appdlCallout');\n  var playBtn  = document.getElementById('appdlPlay');\n  var playTxt  = document.getElementById('appdlPlayTxt');\n  var progEl   = document.getElementById('appdlProg');\n  var stepNoEl = document.getElementById('appdlStepNo');\n  var badges   = document.getElementById('appdlBadges');\n  var tiltEl   = document.getElementById('appdlTilt');\n  var stageEl  = document.querySelector('.appdl-right');\n\n  var stack = ['home'], timer = null;\n  function cur() { return stack[stack.length - 1]; }\n  function pathTo(n) { var p = [], s = n, g = 0; while (s && g++ < 12) { p.unshift(s); s = (SCREENS[s] || {}).parent; } return p; }\n  function reduced() { return window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; }\n\n  function hide(el) {\n    el.style.transition = 'none'; el.style.opacity = '0'; el.style.transform = 'none';\n    el.style.zIndex = '0'; el.classList.remove('is-on'); el.setAttribute('aria-hidden', 'true');\n  }\n\n  \/* Reads cur() and never a captured node, so a timer clamped by a background\n     tab cannot blank the screen that is current by the time it fires. *\/\n  function collapse() {\n    timer = null;\n    var c = shots[cur()];\n    if (!c) return;\n    for (var i = 0; i < names.length; i++) if (names[i] !== cur()) hide(shots[names[i]]);\n    c.style.transition = 'none'; c.style.opacity = '1'; c.style.transform = 'none';\n    c.style.zIndex = '1'; c.classList.add('is-on'); c.removeAttribute('aria-hidden');\n  }\n\n  \/* dir  1 = deeper (push, in from the right), -1 = back (pop, in from the\n     left), 0 = a sideways jump, which crossfades. The push\/pop is what makes\n     it read as an app rather than a slideshow. *\/\n  function move(prev, next, dir) {\n    var out = shots[prev], inn = shots[next];\n    if (!out || !inn) { collapse(); return; }\n    if (timer) { clearTimeout(timer); timer = null; }\n    for (var i = 0; i < names.length; i++) if (names[i] !== prev && names[i] !== next) hide(shots[names[i]]);\n\n    out.style.transition = 'none'; out.style.opacity = '1'; out.style.transform = 'none'; out.style.zIndex = '1';\n    out.classList.remove('is-on'); out.setAttribute('aria-hidden', 'true');\n    inn.classList.add('is-on'); inn.removeAttribute('aria-hidden'); inn.style.zIndex = '2';\n\n    if (reduced()) { inn.style.transition = 'none'; inn.style.opacity = '1'; inn.style.transform = 'none'; collapse(); return; }\n\n    var slide = dir !== 0;\n    inn.style.transition = 'none';\n    inn.style.opacity = slide ? '1' : '0';\n    inn.style.transform = slide ? 'translateX(' + (dir > 0 ? 100 : -100) + '%)' : 'none';\n    void inn.offsetWidth;\n    inn.style.transition = 'opacity 420ms cubic-bezier(.3,.6,.2,1), transform 420ms cubic-bezier(.3,.6,.2,1)';\n    inn.style.opacity = '1'; inn.style.transform = 'none';\n    if (slide) {\n      out.style.transition = 'transform 420ms cubic-bezier(.3,.6,.2,1)';\n      out.style.transform = 'translateX(' + (dir > 0 ? -26 : 26) + '%)';\n    }\n    timer = setTimeout(collapse, 460);\n  }\n\n  function buildHots() {\n    var wasInside = hotsEl.contains(document.activeElement);\n    var here = SCREENS[cur()] || {}, list = here.hots || [], first = null;\n\n    hotsEl.innerHTML = '';\n    for (var i = 0; i < list.length; i++) {\n      var h = list[i], b = document.createElement('button');\n      b.type = 'button'; b.className = 'appdl-hot';\n      b.style.left = h[0] + '%'; b.style.top = h[1] + '%'; b.style.width = h[2] + '%'; b.style.height = h[3] + '%';\n      b.title = h[5]; b.setAttribute('aria-label', h[5]);\n      if (h[4]) {\n        b.setAttribute('data-to', h[4]);\n        if (!first) first = b;\n      } else { b.disabled = true; }\n      hotsEl.appendChild(b);\n    }\n    if (wasInside && first) first.focus();\n  }\n\n  function syncChips() {\n    var want = (SCREENS[cur()] || {}).chip;\n    for (var i = 0; i < chips.length; i++) {\n      var on = chips[i].getAttribute('data-screen') === want;\n      chips[i].classList.toggle('active', on);\n      chips[i].setAttribute('aria-pressed', on ? 'true' : 'false');\n    }\n  }\n\n  \/* Nothing visible: this writes the screen name into an off-screen live\n     region so a screen reader is told the phone moved. The callout only\n     speaks while a nudge or the tour is running, so without this a change of\n     screen would be silent. *\/\n  function announce() {\n    whereEl.textContent = (SCREENS[cur()] || {}).title || '';\n  }\n\n  \/* The callout is placed from the beacon hotspot's own percentages, so it\n     tracks the phone at any size and never needs re-measuring. It flips to\n     the other side of the target when the target is low on the screen. *\/\n  function dropDots() {\n    [].forEach.call(hotsEl.querySelectorAll('.appdl-beacon'), function (d) {\n      if (d.parentNode) d.parentNode.removeChild(d);\n    });\n  }\n\n  function showCallout(html, at) {\n    callout.innerHTML = html;\n    callout.classList.remove('above', 'below', 'plain');\n    hotsEl.classList.remove('is-guiding');\n    dropDots();\n    [].forEach.call(hotsEl.querySelectorAll('.is-target'), function (n) { n.classList.remove('is-target'); });\n\n    var host = at ? hotsEl.querySelector('.appdl-hot[data-to=\"' + at + '\"]') : null;\n    if (!host) {\n      \/* about the screen, not about one control: no arrow, no ring, and it\n         sits at the foot of the screen where it covers the least *\/\n      callout.classList.add('plain');\n      callout.style.left = '16%'; callout.style.right = 'auto';\n      callout.style.bottom = '7%'; callout.style.top = 'auto';\n      void callout.offsetWidth;\n      callout.classList.add('is-on');\n      return;\n    }\n    var cx = parseFloat(host.style.left) + parseFloat(host.style.width) \/ 2;\n    var cy = parseFloat(host.style.top);\n    var below = cy < 55;\n    callout.classList.add(below ? 'below' : 'above');\n\n    var left = Math.min(Math.max(cx - 34, 3), 97 - 68);      \/* width is 68% *\/\n    callout.style.left = left + '%';\n    callout.style.right = 'auto';\n    if (below) { callout.style.top = (cy + parseFloat(host.style.height) + 2.4) + '%'; callout.style.bottom = 'auto'; }\n    else { callout.style.bottom = (100 - cy + 2.4) + '%'; callout.style.top = 'auto'; }\n    callout.style.setProperty('--ax', (cx - left) \/ 68 * 100 + '%');\n    void callout.offsetWidth;\n    callout.classList.add('is-on');\n    host.classList.add('is-target');\n    hotsEl.classList.add('is-guiding');\n    \/* the dot marks the one area the words are about, and exists only while\n       the nudge is running: during the tour the ring alone is the marker *\/\n    if (hinting) {\n      var dot = document.createElement('span');\n      dot.className = 'appdl-beacon';\n      dot.setAttribute('aria-hidden', 'true');\n      host.appendChild(dot);\n    }\n  }\n  \/* Move the guide from one area to the next without it jumping: fade the\n     bubble out where it is, then place and fade in the new one. The bubble\n     never travels, because between two areas it would have to cross the\n     screenshot and flip its arrow mid-flight, which looks worse than a fade.\n\n     One timer, always cleared before another is set. The ring is deliberately\n     left alone until the second half, so the highlight hands over from one\n     area to the next rather than going dark in between. *\/\n  var swapT = null;\n\n  function swapCallout(html, at) {\n    if (swapT) { clearTimeout(swapT); swapT = null; }\n    if (!callout.classList.contains('is-on') || reduced()) { showCallout(html, at); return; }\n    callout.classList.remove('is-on');\n    swapT = setTimeout(function () { swapT = null; showCallout(html, at); }, 240);\n  }\n\n  function hideCallout() {\n    if (swapT) { clearTimeout(swapT); swapT = null; }\n    callout.classList.remove('is-on');\n    hotsEl.classList.remove('is-guiding');\n    dropDots();\n    [].forEach.call(hotsEl.querySelectorAll('.is-target'), function (n) { n.classList.remove('is-target'); });\n  }\n\n  function navigate(mutate, dir) {\n    var prev = cur();\n    mutate();\n    if (cur() !== prev) move(prev, cur(), dir === undefined ? 0 : dir);\n    buildHots(); syncChips(); announce();\n  }\n\n  function goTo(name) {\n    var prev = cur();\n    if (name === prev) return;\n    var dir = pathTo(name).length > pathTo(prev).length ? 1 : (pathTo(name).length < pathTo(prev).length ? -1 : 0);\n    navigate(function () { stack = pathTo(name); }, dir);\n  }\n\n  hotsEl.addEventListener('click', function (e) {\n    var b = e.target;\n    while (b && b !== hotsEl && !b.classList.contains('appdl-hot')) b = b.parentNode;\n    if (!b || b === hotsEl || b.disabled) return;\n    var to = b.getAttribute('data-to');\n    if (!to) return;\n    stopTour();\n    noteActivity();\n    navigate(function () {\n      if (to === 'back') {\n        if (stack.length > 1) stack.pop();\n        else stack = pathTo((SCREENS[cur()] || {}).parent || 'home');\n        return;\n      }\n      if (!(SCREENS[to] || {}).parent) stack = [to];\n      else if (to !== cur()) stack.push(to);\n    }, to === 'back' ? -1 : 1);\n  });\n\n  for (var i = 0; i < chips.length; i++) {\n    chips[i].addEventListener('click', function () {\n      var to = this.getAttribute('data-screen');\n      stopTour();\n      noteActivity();\n      navigate(function () { if (to !== cur()) stack = pathTo(to); }, 0);\n    });\n  }\n\n  \/* ---------------- the idle nudge ----------------\n     Somebody who does not press Play, and does not realise the phone answers\n     a tap at all, gets shown. After a few seconds of doing nothing EVERY\n     tappable area on the current screen lights up as a glowing box, and the\n     callout walks around them one at a time saying what each one does.\n\n     It used to be a single pulsing dot sitting there permanently. Two things\n     were wrong with that and the client named both: one dot cannot represent\n     five different things you are allowed to tap, and a marker that never\n     goes away stops being a prompt and becomes furniture. So the dot now\n     exists ONLY while the nudge is up, on whichever box the callout is\n     currently naming.\n\n     Four rules, each one there to stop it nagging:\n\n       1. the clock only runs while the phone is on screen and the tab is in\n          front, so the first nudge cannot be spent while the visitor is still\n          reading the top of the page,\n       2. any tap cancels it and resets the count: someone who has understood\n          is not told again,\n       3. after a tap the wait gets longer, because the next nudge is for\n          being stuck rather than for not having started,\n       4. it gives up after three unanswered rounds, so a tab left open does\n          not blink forever.\n\n     It polls a rect once a second rather than watching the element, and that\n     is deliberate. An observer is the tidier tool, but its first callback\n     needs a rendering update and a tab sitting behind another window never\n     gets one: measured here, neither the observer NOR scroll events fired\n     while the window was in the background, so the nudge never armed at all.\n     A rect check once a second cannot miss it, costs nothing, and only ticks\n     while a nudge is pending. *\/\n  var HINT_FIRST = 5000;   \/* never interacted: they may not know it is live *\/\n  var HINT_AGAIN = 9000;   \/* has interacted: this one means \"stuck\" *\/\n  var HINT_SLOT  = 4500;   \/* how long the callout rests on each area *\/\n  var HINT_MAX   = 3;      \/* unanswered rounds before it stops asking *\/\n\n  var pollT = null, cycleT = null, idleSince = 0;\n  var nudges = 0, engaged = false, hinting = false, everHinted = false;\n  var ring = [], ringAt = 0, ringLeft = 0;\n\n  function inView() {\n    var r = screenEl.getBoundingClientRect();\n    var vh = window.innerHeight || document.documentElement.clientHeight;\n    if (!r.height) return false;\n    return (Math.min(r.bottom, vh) - Math.max(r.top, 0)) \/ r.height >= 0.45;\n  }\n\n  function stopPoll() { if (pollT) { clearInterval(pollT); pollT = null; } }\n\n  \/* The areas worth featuring: every live hotspot that carries a sentence,\n     with the back arrow pushed to the end. Back is first in the markup on\n     the screens that have it, and leading a nudge with \"go back\" tells\n     somebody who has just arrived to leave: the thing they came for should\n     be offered first. *\/\n  function hintable() {\n    var list = (SCREENS[cur()] || {}).hots || [], out = [], back = [];\n    for (var i = 0; i < list.length; i++) {\n      if (!list[i][4] || !list[i][6]) continue;\n      (list[i][4] === 'back' ? back : out).push(list[i]);\n    }\n    return out.concat(back);\n  }\n\n  function armIdle() {\n    idleSince = Date.now();\n    if (pollT) return;\n    if (playing || nudges >= HINT_MAX) return;\n    pollT = setInterval(poll, 1000);\n  }\n\n  function poll() {\n    if (playing || hinting || nudges >= HINT_MAX) { stopPoll(); return; }\n    \/* off screen, or tabbed away: hold the clock at zero rather than let the\n       wait run down somewhere the visitor cannot see it *\/\n    if (document.hidden || !inView()) { idleSince = Date.now(); return; }\n    if (Date.now() - idleSince >= (engaged ? HINT_AGAIN : HINT_FIRST)) startHint();\n  }\n\n  function startHint() {\n    ring = hintable();\n    if (!ring.length) { stopPoll(); return; }\n    hinting = true;\n    nudges++;\n    stopPoll();\n    hotsEl.classList.add('is-hinting');\n    ringAt = 0;\n    ringLeft = ring.length;\n    showSlot(true);\n  }\n\n  function showSlot(first) {\n    var h = ring[ringAt % ring.length];\n    var lead = (SCREENS[cur()] || {}).lead;\n    var say = (first && !everHinted && lead) ? lead : h[6];\n    everHinted = true;\n    swapCallout(say, h[4]);\n    if (cycleT) clearTimeout(cycleT);\n    cycleT = setTimeout(function () {\n      cycleT = null;\n      ringAt++;\n      ringLeft--;\n      if (ringLeft <= 0) { endHint(); armIdle(); return; }\n      showSlot(false);\n    }, HINT_SLOT);\n  }\n\n  function endHint() {\n    if (cycleT) { clearTimeout(cycleT); cycleT = null; }\n    if (!hinting) return;\n    hinting = false;\n    hotsEl.classList.remove('is-hinting');\n    if (!playing) hideCallout();        \/* never pull a callout the tour owns *\/\n  }\n\n  \/* Called from the real controls only, never from navigate(): the tour drives\n     navigate() too, and the tour is not the visitor doing something. *\/\n  function noteActivity() {\n    engaged = true;\n    nudges = 0;\n    endHint();\n    armIdle();\n  }\n\n  \/* ---------------- the tour ---------------- *\/\n  var tourAt = -1, tourT = null, playing = false;\n\n  function setProgress() {\n    progEl.style.width = (tourAt < 0 ? 0 : (tourAt + 1) \/ TOUR.length * 100) + '%';\n    stepNoEl.textContent = (tourAt < 0 ? 0 : tourAt + 1) + '\/' + TOUR.length;\n  }\n  function setPlayLabel() {\n    playTxt.textContent = playing ? 'Pause' : (tourAt >= TOUR.length - 1 ? 'Play again' : (tourAt < 0 ? 'Play the tour' : 'Resume'));\n    playBtn.querySelector('svg').innerHTML = playing\n      ? '<path d=\"M7 5h3.4v14H7zM13.6 5H17v14h-3.4z\"\/>'\n      : '<path d=\"M8 5.5v13l11-6.5z\"\/>';\n  }\n  function stopTour() {\n    if (tourT) { clearTimeout(tourT); tourT = null; }\n    if (playing) { playing = false; setPlayLabel(); }\n    endHint();\n    hideCallout();\n    badges.classList.remove('is-calling');\n  }\n  function step(i) {\n    tourAt = i;\n    var s = TOUR[i];\n    \/* Drop the previous step's bubble BEFORE the screen moves. It points at a\n       hotspot on the outgoing screen, so leaving it up meant a stale arrow\n       riding over the slide, which was the jump between steps. *\/\n    hideCallout();\n    goTo(s.to);\n    setProgress();\n    \/* Then let the push\/pop finish before the new one arrives: 480ms is the\n       420ms slide plus its settle. The tourAt guard is what stops a timer\n       belonging to a step you have already left from raising its bubble over\n       a later one, the same rule collapse() follows for the screens. *\/\n    setTimeout(function () {\n      if (playing && tourAt === i) showCallout(s.say, s.at);\n    }, reduced() ? 0 : 480);\n    badges.classList.toggle('is-calling', !!s.call);\n    \/* 4200, not 3600: the 480ms hand-over comes out of the step, so the bubble\n       is now readable for 3.7s where it used to be 3.3s *\/\n    if (i < TOUR.length - 1) {\n      tourT = setTimeout(function () { if (playing) step(i + 1); }, 4200);\n    } else {\n      tourT = setTimeout(function () { playing = false; setPlayLabel(); armIdle(); }, 4800);\n    }\n  }\n  playBtn.addEventListener('click', function () {\n    noteActivity();\n    if (playing) { stopTour(); armIdle(); return; }\n    stopPoll();\n    playing = true; setPlayLabel();\n    var next = (tourAt < 0 || tourAt >= TOUR.length - 1) ? 0 : tourAt + 1;\n    step(next);\n  });\n\n  \/* ---------------- parallax tilt ---------------- *\/\n  var canTilt = window.matchMedia && window.matchMedia('(hover:hover) and (pointer:fine)').matches;\n  function tiltFrom(e) {\n    if (!canTilt || reduced()) return;\n    var r = stageEl.getBoundingClientRect();\n    var px = (e.clientX - r.left) \/ r.width - .5, py = (e.clientY - r.top) \/ r.height - .5;\n    tiltEl.style.setProperty('--ry', (px * 13).toFixed(2) + 'deg');\n    tiltEl.style.setProperty('--rx', (-py * 9).toFixed(2) + 'deg');\n  }\n  stageEl.addEventListener('mousemove', tiltFrom);\n  stageEl.addEventListener('mouseleave', function () {\n    tiltEl.style.setProperty('--ry', '0deg'); tiltEl.style.setProperty('--rx', '0deg');\n  });\n\n  document.addEventListener('visibilitychange', function () {\n    if (document.hidden) {\n      stopTour();\n      endHint();\n    } else {\n      if (timer) { clearTimeout(timer); collapse(); }\n      armIdle();\n    }\n  });\n\n  collapse(); buildHots(); syncChips(); announce(); setProgress(); setPlayLabel();\n  armIdle();\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ac84d03 elementor-widget elementor-widget-html\" data-id=\"ac84d03\" 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<style>\n#dmrh-footer { background: var(--bg) !important; color: var(--ink-3) !important; border-top: 1px solid var(--line); padding-top: clamp(24px, 2.2vw, 34px); }#dmrh-footer .footer-top { display: grid; grid-template-columns: 1.4fr 1fr 1.5fr; gap: clamp(28px, 3.4vw, 56px); align-items: start; padding-bottom: clamp(16px, 1.8vw, 24px); }@media (max-width: 900px) {#dmrh-footer .footer-top { grid-template-columns: 1fr 1fr; }#dmrh-footer .footer-visit { grid-column: 1 \/ -1; } }@media (max-width: 560px) {#dmrh-footer .footer-top { grid-template-columns: 1fr; } }#dmrh-footer .footer-brand-logo { height: 42px; width: auto; display: block; margin-bottom: 12px; }#dmrh-footer .footer-tagline { font-size: 13.5px; line-height: 1.55; color: var(--ink-3); max-width: 42ch; margin: 0 0 16px; }#dmrh-footer .footer-actions { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }#dmrh-footer .footer-tg { display: inline-flex; align-items: center; gap: 8px; background: #17568C; color: #fff !important; font-size: 13.5px; font-weight: 600; padding: 10px 18px; border-radius: 10px; text-decoration: none; transition: transform .2s, background .2s; }#dmrh-footer .footer-tg:hover { transform: translateY(-1px); background: #124876; }#dmrh-footer .footer-social { display: flex; gap: 10px; }\n\/* --- Revision 29 Aug 2026: app download + Telegram channel --- *\/\n#dmrh-footer .footer-app { margin-top: 20px; }\n#dmrh-footer .footer-tgch { display: inline-flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: 600; color: var(--ink-2); text-decoration: none; border-bottom: 1px solid var(--line-strong); padding-bottom: 2px; transition: color .2s, border-color .2s; }\n#dmrh-footer .footer-tgch:hover { color: #229ED9; border-color: #229ED9; }\n#dmrh-footer .footer-badges { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 14px; }\n#dmrh-footer .footer-badge { display: inline-flex; align-items: center; gap: 9px; padding: 8px 14px; border: 1px solid var(--line-strong); border-radius: 10px; background: var(--card); color: var(--ink-2); text-decoration: none; font-size: 13px; font-weight: 600; line-height: 1.15; transition: transform .2s, border-color .2s, color .2s; }\n#dmrh-footer .footer-badge:hover { transform: translateY(-1px); border-color: var(--accent); color: var(--accent); }\n#dmrh-footer .footer-badge span { display: flex; flex-direction: column; }\n#dmrh-footer .footer-badge small { font-size: 9.5px; font-weight: 500; letter-spacing: .06em; text-transform: uppercase; color: var(--subtle); }\n\/* Self-clearing placeholders. Scoped to .footer-app on purpose: the social row\n   uses href=\"#\" too and a blanket rule would hide Facebook, TikTok, YouTube. *\/\n#dmrh-footer .footer-app a[href=\"#\"] { display: none; }\n#dmrh-footer .footer-app:not(:has(a:not([href=\"#\"]))) { display: none; }#dmrh-footer .footer-social a { width: 36px; height: 36px; border-radius: 50%; background: var(--card); border: 1px solid var(--line); display: grid; place-items: center; color: var(--ink-2); text-decoration: none; transition: transform .2s, color .2s, border-color .2s; }#dmrh-footer .footer-social a:hover { transform: translateY(-2px); color: var(--accent); border-color: var(--line-strong); }#dmrh-footer .footer-col-h { font-size: 11px; text-transform: uppercase; letter-spacing: 0.16em; font-weight: 700; color: var(--subtle); margin: 0 0 12px; }#dmrh-footer .footer-nav { display: grid; grid-template-columns: 1fr 1fr; gap: 9px 24px; }#dmrh-footer .footer-nav a { color: var(--ink-2); font-size: 14px; line-height: 1.25; text-decoration: none; width: fit-content; padding: 0; transition: color .15s; }#dmrh-footer .footer-nav a:hover { color: var(--accent); }#dmrh-footer .footer-card { background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 14px 16px; box-shadow: var(--shadow-sm); }#dmrh-footer .footer-card-h { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 700; color: var(--accent); margin: 0 0 8px; }#dmrh-footer .footer-addr-row { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px 16px; flex-wrap: wrap; }#dmrh-footer .footer-addr { display: flex; gap: 9px; font-size: 13px; line-height: 1.4; color: var(--ink-2); }#dmrh-footer .footer-addr svg { flex: none; margin-top: 1px; color: var(--accent-3); }#dmrh-footer .footer-phones { display: flex; align-items: center; gap: 9px; margin-top: 8px; font-size: 13px; color: var(--ink); }#dmrh-footer .footer-phones svg { flex: none; color: var(--accent-3); }#dmrh-footer .footer-phones a { color: var(--ink); text-decoration: none; display: inline; padding: 0; }#dmrh-footer .footer-phones a:hover { color: var(--accent); }#dmrh-footer .footer-phones .sep { color: var(--subtle); display: inline; }#dmrh-footer .footer-emerg { display: flex; align-items: center; gap: 10px; margin-top: 10px; padding: 7px 12px; background: var(--accent); border-radius: 10px; text-decoration: none; }#dmrh-footer .footer-emerg .ic { flex: none; width: 30px; height: 30px; border-radius: 50%; background: rgba(255,255,255,0.2); display: grid; place-items: center; color: #fff; }#dmrh-footer .footer-emerg-label { font-size: 10px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: rgba(255,255,255,0.85); }#dmrh-footer .footer-emerg-num { font-size: 15px; font-weight: 700; color: #fff; letter-spacing: 0.01em; margin-left: auto; }#dmrh-footer .footer-bot { border-top: 1px solid var(--line); margin-top: clamp(14px, 1.6vw, 20px); padding: 14px 0 16px; display: flex; align-items: center; justify-content: space-between; gap: 10px 20px; flex-wrap: wrap; }#dmrh-footer .footer-legal { display: flex; align-items: center; gap: 14px; font-size: 12.5px; }#dmrh-footer .footer-legal a { color: var(--ink-2); text-decoration: none; font-size: 12.5px; padding: 0; }#dmrh-footer .footer-legal a:hover { color: var(--accent); }#dmrh-footer .footer-legal .div { color: var(--line-strong); }#dmrh-footer .footer-copy { font-size: 12.5px; color: var(--subtle); }@media (max-width: 560px) {#dmrh-footer .footer-bot { flex-direction: column; text-align: center; } }\n\n\/* --- 8 Sep 2026 footer update --------------------------------------------\n   The address carries the Google Maps link now that the Get directions button\n   is gone, so it has to read as clickable. And the app card sits up under the\n   columns: that gap was .footer-top's padding-bottom PLUS the band's\n   margin-top, and band.css takes the second one to 0. --------------------- *\/\n#dmrh-footer a.footer-addr { text-decoration: none; transition: color .15s; }\n#dmrh-footer a.footer-addr:hover { color: var(--accent); }\n#dmrh-footer a.footer-addr:hover svg { color: var(--accent); }\n#dmrh-footer .footer-top { padding-bottom: clamp(8px, 1vw, 14px); }\n\n\/* ============ footer app band, 7 Sep 2026 ============\n   A full-width row between .footer-top and .footer-bot. Nothing above it\n   changes: it is a sibling of the three-column grid, not a fourth column.\n\n   Every value here is an existing token or an existing footer clamp. No new\n   hex, no new radius, no new shadow:\n     surface \/ border \/ radius \/ shadow  = the .footer-card convention\n     --fab-pad-y                         = .footer-top's own padding clamp\n     margin-top                          = .footer-bot's own margin clamp\n     dots + title                        = var(--accent)\n     divider                             = var(--line-strong), the same colour\n                                           .footer-legal .div already uses\n   ------------------------------------------------------------------ *\/\n#dmrh-footer .footer-appband {\n  \/* One property drives both the card's vertical padding and the phone's\n     negative bottom margin, so the phone lands exactly on the card's bottom\n     edge however the clamp resolves. Two hand-matched numbers would drift. *\/\n  --fab-pad-y: clamp(16px, 1.8vw, 24px);\n  --fab-pad-x: clamp(18px, 2vw, 26px);\n  --fab-gap: clamp(16px, 1.8vw, 28px);\n  \/* 8 Sep 2026: the client asked for the card to sit up under the columns.\n     The gap was two values, not one: this margin plus .footer-top's own\n     padding-bottom, which the footer update takes from 24px to 14px. *\/\n  margin-top: 0;\n}\n\/* Grid, not flex, and the reason is the phone.\n   With flex, the tablet rule below puts .fab-get on a second LINE, and\n   align-self:end then aligns the phone to the bottom of the FIRST line\n   rather than the card: measured, it stopped 93px short of the bottom edge\n   and the crop read as a mistake. A flex item cannot span lines. A grid item\n   can span rows, so on tablet the phone occupies both of them and keeps\n   meeting the card's bottom edge at every width. *\/\n#dmrh-footer .fab-card {\n  display: grid;\n  grid-template-columns: auto minmax(0, 1fr) auto;\n  grid-template-areas: \"phone text get\";\n  align-items: center;\n  gap: var(--fab-gap);\n  padding: var(--fab-pad-y) var(--fab-pad-x);\n  background: var(--card);\n  border: 1px solid var(--line);\n  border-radius: var(--r-lg);\n  box-shadow: var(--shadow-sm);\n  \/* this is what crops the phone *\/\n  overflow: hidden;\n}\n\n\/* --- 1. the phone, cropped by the card ------------------------------ *\/\n\/* The frame is a padded box with rounded TOP corners only, so it reads as a\n   phone with a top and sides and no bottom. The screenshot is 560x1214, so at\n   104px wide it is 225px tall and the fixed height below clips it: what shows\n   is the top of the screen, cut off flush with the card's bottom border.\n   The height is fixed rather than intrinsic on purpose. A flex item still\n   contributes its full height to the line even when align-self moves it, so\n   an unclipped 225px image would have made the card 225px tall. *\/\n#dmrh-footer .fab-phone {\n  grid-area: phone;\n  align-self: end;\n  width: 104px;\n  height: clamp(88px, 9vw, 112px);\n  margin-bottom: calc(var(--fab-pad-y) * -1);\n  padding: 4px 4px 0;\n  background: var(--accent-3);\n  border-radius: 16px 16px 0 0;\n  overflow: hidden;\n}\n\/* (1,1,1) beats Elementor's own `.elementor img {border-radius:0}` at (0,1,1).\n   width\/height are set here as well as on the attributes because the Medicate\n   image script stamps measured dimensions onto images and has squashed a\n   hand-written <img> on this site before. *\/\n#dmrh-footer .fab-phone img {\n  display: block;\n  width: 100%;\n  height: auto;\n  max-width: none;\n  border: 0;\n  border-radius: 13px 13px 0 0;\n}\n\n\/* --- 2. title + benefits -------------------------------------------- *\/\n#dmrh-footer .fab-text {\n  grid-area: text;\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n  min-width: 0;\n}\n#dmrh-footer .fab-title {\n  margin: 0;\n  font-family: var(--font-body);\n  font-size: 16px;\n  font-weight: 700;\n  line-height: 1.25;\n  color: var(--accent);\n  text-transform: none;\n}\n#dmrh-footer .fab-benefits {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 6px 20px;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n#dmrh-footer .fab-benefits li {\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  margin: 0;\n  font-size: 13px;\n  line-height: 1.35;\n  color: var(--ink-2);\n}\n#dmrh-footer .fab-benefits li::before {\n  content: '';\n  flex: none;\n  width: 5px;\n  height: 5px;\n  border-radius: 50%;\n  background: var(--accent);\n}\n\n\/* --- 3. the download group ------------------------------------------ *\/\n#dmrh-footer .fab-get {\n  grid-area: get;\n  display: flex;\n  align-items: center;\n  gap: var(--fab-gap);\n}\n\/* .footer-badges is reused verbatim from the column above, where its\n   margin-top:14px is the right offset under a row. Inside the band the gap\n   does that job, so the margin is zeroed in this scope only: the component\n   itself is untouched. *\/\n#dmrh-footer .fab-get .footer-badges {\n  margin-top: 0;\n  flex-wrap: nowrap;\n}\n#dmrh-footer .fab-get .footer-badge {\n  white-space: nowrap;\n}\n\/* --- focus. design-system.css defines no focus style anywhere, so the band\n       carries the one the site does use, scoped, from \/app\/. ------------ *\/\n#dmrh-footer .footer-appband a:focus-visible {\n  outline: 2px solid var(--accent);\n  outline-offset: 2px;\n  border-radius: var(--r-sm);\n}\n\n\/* --- collapse. Both breakpoints are the footer's own, so the band reflows on\n       the same widths as the three columns above it. -------------------- *\/\n@media (max-width: 900px) {\n  \/* tablet: the download group drops onto its own row under the text, and the\n     phone spans both rows so it still reaches the card's bottom edge *\/\n  #dmrh-footer .fab-card {\n    grid-template-columns: auto minmax(0, 1fr);\n    grid-template-areas:\n      \"phone text\"\n      \"phone get\";\n  }\n  #dmrh-footer .fab-get { justify-self: start; }\n}\n@media (max-width: 560px) {\n  \/* phone: the screenshot goes, the badges stack full width *\/\n  #dmrh-footer .fab-card {\n    grid-template-columns: minmax(0, 1fr);\n    grid-template-areas:\n      \"text\"\n      \"get\";\n  }\n  #dmrh-footer .fab-phone { display: none; }\n  \/* justify-self:start from the tablet rule above is still in force here, and\n     it shrinks this grid item to fit-content: the \"full width\" badges stopped\n     at 254px inside a 320px card. Stretch has to be restated. *\/\n  #dmrh-footer .fab-get { justify-self: stretch; flex-wrap: wrap; align-items: flex-start; }\n  #dmrh-footer .fab-get .footer-badges { width: 100%; flex-direction: column; flex-wrap: wrap; }\n  #dmrh-footer .fab-get .footer-badge { width: 100%; justify-content: flex-start; }\n}\n<\/style>\n<footer class=\"footer\" id=\"dmrh-footer\"><div class=\"wrap\">\n  <div class=\"footer-top\">\n\n    <div class=\"footer-brand\">\n      <a href=\"\/\"><img decoding=\"async\" class=\"footer-brand-logo\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/08\/domrey-logo-aaci-300x83.png\" srcset=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/08\/domrey-logo-aaci-300x83.png 300w, https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/08\/domrey-logo-aaci-768x212.png 768w\" sizes=\"152px\" width=\"300\" height=\"83\" alt=\"Domrey Mother &amp; Child Clinic, AACI accredited\"><\/a>\n      <p class=\"footer-tagline\"><span class=\"en\">Warm, dependable care for every mother and child, any hour of the day. Our team is always a message away.<\/span><span class=\"km\">\u1780\u17b6\u179a\u1790\u17c2\u1791\u17b6\u17c6\u1780\u1780\u17cb\u1780\u17d2\u178a\u17c5 \u1793\u17b7\u1784\u17a2\u17b6\u1785\u1791\u17bb\u1780\u1785\u17b7\u178f\u17d2\u178f\u1794\u17b6\u1793\u179f\u1798\u17d2\u179a\u17b6\u1794\u17cb\u1798\u17d2\u178a\u17b6\u1799 \u1793\u17b7\u1784\u1780\u17bc\u1793\u1782\u17d2\u179a\u1794\u17cb\u179a\u17bc\u1794 \u1782\u17d2\u179a\u1794\u17cb\u1798\u17c9\u17c4\u1784\u17d4 \u1780\u17d2\u179a\u17bb\u1798\u1780\u17b6\u179a\u1784\u17b6\u179a\u179a\u1794\u179f\u17cb\u1799\u17be\u1784\u1793\u17c5\u1787\u17b7\u178f\u17a2\u17d2\u1793\u1780\u1787\u17b6\u1793\u17b7\u1785\u17d2\u1785\u17d4<\/span><\/p>\n      <div class=\"footer-actions\">\n        <a class=\"footer-tg\" href=\"https:\/\/t.me\/+ymjBfVV_QTE4NTY1\" target=\"_blank\" rel=\"noopener\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"15\" height=\"15\"><path d=\"M9.04 15.32 8.83 18.5c.43 0 .61-.18.84-.4l2-1.92 4.16 3.04c.76.42 1.31.2 1.51-.7l2.74-12.85c.27-1.13-.41-1.57-1.16-1.3L2.65 9.4c-1.1.43-1.08 1.05-.18 1.33l4.45 1.39 10.32-6.5c.49-.32.93-.14.57.18Z\"\/><\/svg><span class=\"en\">Join our Telegram Channel<\/span><span class=\"km\">\u1785\u17bc\u179b\u179a\u17bd\u1798\u1786\u17b6\u1793\u17c2\u179b\u178f\u17c1\u17a1\u17c1\u1780\u17d2\u179a\u17b6\u1798<\/span><\/a>\n        <div class=\"footer-social\">\n          <a href=\"https:\/\/www.facebook.com\/Domreypediatricclinic\" target=\"_blank\" rel=\"noopener\" aria-label=\"Domrey Mother &amp; Child Clinic on Facebook\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"16\" height=\"16\"><path d=\"M15.12 5.32H17V2.14A26.11 26.11 0 0 0 14.26 2c-2.72 0-4.58 1.66-4.58 4.7v2.6H6.6v3.56h3.08V22h3.7v-9.14h3.06l.46-3.56h-3.52V7.05c0-1.03.28-1.73 1.74-1.73z\"\/><\/svg><\/a>\n          <a href=\"https:\/\/www.tiktok.com\/@domreymotherchildclinic\" target=\"_blank\" rel=\"noopener\" aria-label=\"Domrey Mother &amp; Child Clinic on TikTok\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"16\" height=\"16\"><path d=\"M16.5 2h2.62c.2 1.86 1.27 3.55 3.38 3.86v2.66c-1.28.09-2.5-.28-3.6-.98v6.83a5.6 5.6 0 1 1-5.6-5.6c.3 0 .6.02.9.08v2.73a2.87 2.87 0 1 0 2 2.73V2z\"\/><\/svg><\/a>\n          <a href=\"https:\/\/www.youtube.com\/@domreypediatricclinic\" target=\"_blank\" rel=\"noopener\" aria-label=\"Domrey Mother &amp; Child Clinic on YouTube\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"17\" height=\"17\"><path d=\"M23 7.5a3 3 0 0 0-2.1-2.1C19 4.9 12 4.9 12 4.9s-7 0-8.9.5A3 3 0 0 0 1 7.5 31 31 0 0 0 .5 12 31 31 0 0 0 1 16.5a3 3 0 0 0 2.1 2.1c1.9.5 8.9.5 8.9.5s7 0 8.9-.5a3 3 0 0 0 2.1-2.1 31 31 0 0 0 .5-4.5 31 31 0 0 0-.5-4.5zM9.75 15.5v-7l6 3.5-6 3.5z\"\/><\/svg><\/a>\n          <a href=\"https:\/\/www.instagram.com\/domreymotherandchildclinic\/\" target=\"_blank\" rel=\"noopener\" aria-label=\"Domrey Mother &amp; Child Clinic on Instagram\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" width=\"16\" height=\"16\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\"\/><circle cx=\"12\" cy=\"12\" r=\"3.8\"\/><circle cx=\"17.4\" cy=\"6.6\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"\/><\/svg><\/a>\n        <\/div>\n      <\/div>\n\n      <!-- 31 Aug 2026: the two store badges were moved OUT of this block, up\n           into .footer-actions, so the app buttons sit with the social icons\n           as the client asked. They kept their .footer-badges wrapper, whose\n           margin-top:14px was already the right offset for sitting under a\n           row rather than in a stacked column, so no CSS changed.\n           What is left here is the heading and the Telegram channel link,\n           whose href is still \"#\". That is deliberate and it is why you do\n           not see this column: the rule\n           .footer-app:not(:has(a:not([href=\"#\"]))) hides the whole block\n           while every link inside it is dead, and the only link left is dead.\n           The link is also redundant now, because the main .footer-tg button\n           above IS the channel. Removing this block entirely is safe and is\n           the tidier end state; it was left in place rather than deleted\n           unasked, since the \"Stay connected\" heading may still be wanted. -->\n      <div class=\"footer-app\" id=\"dmrh-footer-app\">\n        <h4 class=\"footer-col-h\"><span class=\"en\">Stay connected<\/span><span class=\"km\">\u179a\u1780\u17d2\u179f\u17b6\u1791\u17c6\u1793\u17b6\u1780\u17cb\u1791\u17c6\u1793\u1784\u1787\u17b6\u1798\u17bd\u1799\u1799\u17be\u1784<\/span><\/h4>\n        <a class=\"footer-tgch\" href=\"#\" target=\"_blank\" rel=\"noopener\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"15\" height=\"15\"><path d=\"M9.04 15.32 8.83 18.5c.43 0 .61-.18.84-.4l2-1.92 4.16 3.04c.76.42 1.31.2 1.51-.7l2.74-12.85c.27-1.13-.41-1.57-1.16-1.3L2.65 9.4c-1.1.43-1.08 1.05-.18 1.33l4.45 1.39 10.32-6.5c.49-.32.93-.14.57.18Z\"\/><\/svg><span class=\"en\">Join our Telegram channel<\/span><span class=\"km\">\u1785\u17bc\u179b\u179a\u17bd\u1798\u1786\u17b6\u1793\u17c2\u179b\u178f\u17c1\u17a1\u17c1\u1780\u17d2\u179a\u17b6\u1798<\/span><\/a>\n\n      <\/div>\n    <\/div>\n\n    <div class=\"footer-explore\">\n      <h4 class=\"footer-col-h\"><span class=\"en\">Explore<\/span><span class=\"km\">\u179a\u17bb\u1780\u179a\u1780<\/span><\/h4>\n      <nav class=\"footer-nav\">\n        <a href=\"\/\"><span class=\"en\">Home<\/span><span class=\"km\">\u1791\u17c6\u1796\u17d0\u179a\u178a\u17be\u1798<\/span><\/a>\n        <a href=\"\/our-doctors\/\"><span class=\"en\">Doctors<\/span><span class=\"km\">\u179c\u17c1\u1787\u17d2\u1787\u1794\u178e\u17d2\u178c\u17b7\u178f<\/span><\/a>\n        <a href=\"\/our-services\/\"><span class=\"en\">Services<\/span><span class=\"km\">\u179f\u17c1\u179c\u17b6\u1780\u1798\u17d2\u1798<\/span><\/a>\n        <a href=\"\/rooms-facilities\/\"><span class=\"en\">Rooms &amp; Facilities<\/span><span class=\"km\">\u1794\u1793\u17d2\u1791\u1794\u17cb \u1793\u17b7\u1784\u1780\u1793\u17d2\u179b\u17c2\u1784<\/span><\/a>\n        <a href=\"\/promotions-packages\/\"><span class=\"en\">Promotions<\/span><span class=\"km\">\u1780\u17b6\u179a\u1795\u17d2\u178f\u179b\u17cb\u1787\u17bc\u1793\u1796\u17b7\u179f\u17c1\u179f<\/span><\/a>\n        <a href=\"\/events-announcements\/\"><span class=\"en\">News &amp; Events<\/span><span class=\"km\">\u1796\u17d0\u178f\u17cc\u1798\u17b6\u1793 \u1793\u17b7\u1784\u1796\u17d2\u179a\u17b9\u178f\u17d2\u178f\u17b7\u1780\u17b6\u179a\u178e\u17cd<\/span><\/a>\n        <a href=\"\/about-us\/\"><span class=\"en\">About<\/span><span class=\"km\">\u17a2\u17c6\u1796\u17b8\u1799\u17be\u1784<\/span><\/a>\n        <a href=\"\/contact\/\"><span class=\"en\">Contact<\/span><span class=\"km\">\u1791\u17c6\u1793\u17b6\u1780\u17cb\u1791\u17c6\u1793\u1784<\/span><\/a>\n      <\/nav>\n    <\/div>\n\n    <div class=\"footer-visit\">\n      <div class=\"footer-card\">\n        <h4 class=\"footer-card-h\"><span class=\"en\">Visit &amp; Reach Us<\/span><span class=\"km\">\u1791\u17b8\u178f\u17b6\u17c6\u1784 \u1793\u17b7\u1784\u1791\u17c6\u1793\u17b6\u1780\u17cb\u1791\u17c6\u1793\u1784<\/span><\/h4>\n        <div class=\"footer-addr-row\">\n          <a class=\"footer-addr\" href=\"https:\/\/maps.app.goo.gl\/5CbvCd4KmLBzaHmV9\" target=\"_blank\" rel=\"noopener\" aria-label=\"Open Domrey Mother &amp; Child Clinic in Google Maps\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" width=\"17\" height=\"17\"><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"\/><circle cx=\"12\" cy=\"10\" r=\"3\"\/><\/svg>\n            <span><span class=\"en\">No.19C, St.1986, Sangkat Phnom Penh Thmey, Khan Sen Sok, Phnom Penh<\/span><span class=\"km\">\u1795\u17d2\u1791\u17c7 \u17e1\u17e9C \u1795\u17d2\u179b\u17bc\u179c \u17e1\u17e9\u17e8\u17e6 \u1797\u17d2\u1793\u17c6\u1796\u17c1\u1789\u1790\u17d2\u1798\u17b8 \u179f\u17c2\u1793\u179f\u17bb\u1781<\/span><\/span>\n          <\/a>\n        <\/div>\n        <div class=\"footer-phones\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" width=\"16\" height=\"16\"><path d=\"M22 16.9v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.5 19.5 0 0 1-6-6 19.8 19.8 0 0 1-3.1-8.7A2 2 0 0 1 4.1 2h3a2 2 0 0 1 2 1.7c.1 1 .4 2 .7 2.9a2 2 0 0 1-.5 2.1L8.1 9.9a16 16 0 0 0 6 6l1.2-1.2a2 2 0 0 1 2.1-.5c.9.3 1.9.6 2.9.7a2 2 0 0 1 1.7 2z\"\/><\/svg>\n          <span><a href=\"tel:023902279\">023 902 279<\/a><span class=\"sep\"> &middot; <\/span><a href=\"tel:092377000\">092 377 000<\/a><span class=\"sep\"> &middot; <\/span><a href=\"tel:093377000\">093 377 000<\/a><\/span>\n        <\/div>\n        <a class=\"footer-emerg\" href=\"tel:023902279\">\n          <span class=\"ic\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" width=\"16\" height=\"16\"><path d=\"M22 16.9v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.5 19.5 0 0 1-6-6 19.8 19.8 0 0 1-3.1-8.7A2 2 0 0 1 4.1 2h3a2 2 0 0 1 2 1.7c.1 1 .4 2 .7 2.9a2 2 0 0 1-.5 2.1L8.1 9.9a16 16 0 0 0 6 6l1.2-1.2a2 2 0 0 1 2.1-.5c.9.3 1.9.6 2.9.7a2 2 0 0 1 1.7 2z\"\/><\/svg><\/span>\n          <span class=\"footer-emerg-label\"><span class=\"en\">24\/7 Emergency<\/span><span class=\"km\">\u179f\u1784\u17d2\u1782\u17d2\u179a\u17c4\u17c7\u1794\u1793\u17d2\u1791\u17b6\u1793\u17cb \u17e2\u17e4\u1798\u17c9\u17c4\u1784<\/span><\/span>\n          <span class=\"footer-emerg-num\">023 902 279<\/span>\n        <\/a>\n      <\/div>\n    <\/div>\n\n  <\/div>\n\n  <!-- App band, added 7 Sep 2026. A full-width row BETWEEN .footer-top and\n     .footer-bot. It is a sibling of the three-column grid, not a fourth\n     column, so the columns above keep their widths, heights and content.\n\n     The store badges are carried in this file now. They used to be lifted out\n     of the brand column at apply time, which stopped working the moment that\n     column pair was removed. -->\n<div class=\"footer-appband\">\n  <div class=\"fab-card\">\n\n    <div class=\"fab-phone\">\n      <!-- No loading attribute here on purpose. WordPress's content filter adds\n           loading=\"lazy\" to below-the-fold content images, and when this tag\n           declared it too the served markup carried the attribute TWICE. The\n           footer is genuinely below the fold on every page, so letting the\n           filter own it gives exactly one. (Note the opposite call was right on\n           \/app\/, where a tap has to show a screen instantly and the attribute\n           is declared eagerly to stop the filter touching it.) -->\n      <img loading=\"lazy\" src=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2026\/09\/domrey-app-scr-home.webp\" width=\"560\" height=\"1214\" decoding=\"async\"\n           alt=\"Domrey Hospital app home screen, showing lab and imaging results, promotions and educational articles\">\n    <\/div>\n\n    <div class=\"fab-text\">\n      <p class=\"fab-title\">Domrey Hospital app<\/p>\n      <ul class=\"fab-benefits\">\n        <li>Book appointments<\/li>\n        <li>Lab &amp; imaging results<\/li>\n        <li>Medical history &amp; records<\/li>\n      <\/ul>\n    <\/div>\n\n    <!-- The QR placeholder and the hairline that separated it from the badges\n         were removed on 8 Sep 2026 at the client's request. .fab-get is kept as\n         the wrapper even though it now holds only the badges: it is the grid\n         area, and it is what the mobile rule stretches. Putting a QR back is\n         this element plus its rules, nothing else. -->\n    <!-- The store badges live HERE and nowhere else on the page. Until 8 Sep\n         2026 they also sat in the brand column and this block was copied out of\n         that one at apply time; the client removed the column pair because the\n         card already offers both stores, so this is now the only copy and it is\n         written out in full rather than lifted. -->\n    <div class=\"fab-get\">\n      <div class=\"footer-badges\">\n        <a class=\"footer-badge\" href=\"https:\/\/apps.apple.com\/us\/app\/domrey-hospital\/id6758605441\" target=\"_blank\" rel=\"noopener\" aria-label=\"Download the Domrey Hospital app on the Apple App Store\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\" aria-hidden=\"true\"><path d=\"M16.36 12.72c.02-2.2 1.8-3.26 1.88-3.31-1.02-1.5-2.62-1.7-3.19-1.72-1.36-.14-2.65.8-3.34.8-.69 0-1.75-.78-2.88-.76-1.48.02-2.85.86-3.61 2.18-1.54 2.67-.39 6.62 1.11 8.79.73 1.06 1.6 2.25 2.75 2.21 1.1-.04 1.52-.71 2.85-.71 1.33 0 1.71.71 2.88.69 1.19-.02 1.94-1.08 2.67-2.14.84-1.23 1.19-2.42 1.21-2.48-.03-.01-2.32-.89-2.34-3.55zM14.2 6.2c.6-.74 1.01-1.76.9-2.78-.87.04-1.93.58-2.56 1.31-.56.65-1.05 1.69-.92 2.69.97.07 1.96-.49 2.58-1.22z\"\/><\/svg><span><small>Download on the<\/small>App Store<\/span><\/a>\n        <a class=\"footer-badge\" href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.anzer.patientportal.domrey\" target=\"_blank\" rel=\"noopener\" aria-label=\"Get the Domrey Hospital app on Google Play\"><svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\"><path fill=\"currentColor\" d=\"M3.6 2.4c-.3.24-.5.62-.5 1.12v16.96c0 .5.2.88.5 1.12l.1.08 9.5-9.6v-.16L3.7 2.32l-.1.08z\" opacity=\".85\"\/><path fill=\"currentColor\" d=\"m16.4 15.4-3.2-3.32v-.16l3.2-3.32.08.04 3.8 2.2c1.08.62 1.08 1.64 0 2.26l-3.8 2.2-.08.1z\"\/><path fill=\"currentColor\" d=\"m16.48 15.36-3.28-3.4-9.6 9.68c.36.38.94.42 1.6.04l11.28-6.32z\" opacity=\".7\"\/><path fill=\"currentColor\" d=\"M16.48 8.64 5.2 2.32c-.66-.38-1.24-.34-1.6.04l9.6 9.6 3.28-3.32z\" opacity=\".55\"\/><\/svg><span><small>Get it on<\/small>Google Play<\/span><\/a>\n      <\/div>\n    <\/div>\n\n  <\/div>\n<\/div>\n\n  <div class=\"footer-bot\">\n    <span class=\"footer-copy\"><span class=\"en\">&copy; 2026 Domrey Mother &amp; Child Clinic. All rights reserved.<\/span><span class=\"km\">&copy; \u17e2\u17e0\u17e2\u17e6 \u178a\u17c6\u179a\u17b8\u1798\u1793\u17d2\u1791\u17b8\u179a\u1796\u17c1\u1791\u17d2\u1799\u179f\u17d2\u178f\u17d2\u179a\u17b8 \u1793\u17b7\u1784\u1780\u17bb\u1798\u17b6\u179a\u17d4 \u179a\u1780\u17d2\u179f\u17b6\u179f\u17b7\u1791\u17d2\u1792\u17b7\u17d4<\/span><\/span>\n    <div class=\"footer-legal\">\n      <a href=\"\/privacy-policy\/\"><span class=\"en\">Privacy Policy<\/span><span class=\"km\">\u1782\u17c4\u179b\u1780\u17b6\u179a\u178e\u17cd\u17af\u1780\u1787\u1793\u1797\u17b6\u1796<\/span><\/a>\n      <span class=\"div\">|<\/span>\n      <a href=\"\/terms-of-service\"><span class=\"en\">Terms of Service<\/span><span class=\"km\">\u179b\u1780\u17d2\u1781\u1781\u178e\u17d2\u178c\u1793\u17c3\u179f\u17c1\u179c\u17b6\u1780\u1798\u17d2\u1798<\/span><\/a>\n    <\/div>\n  <\/div>\n<\/div><\/footer>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b7c6c37 elementor-widget elementor-widget-html\" data-id=\"b7c6c37\" 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<!-- Mobile refinements (phone polish): surgical, max-width only -->\n<style>\n\/* 1. Promo cards: stack image over text instead of a cramped 2-col split *\/\n@media (max-width: 560px) {\n  .promo-card { grid-template-columns: 1fr; gap: 18px; padding: 24px; }\n  .promo-card .img { aspect-ratio: 16\/10; }\n}\n\/* 2. Contact panel: reclaim width lost to the 56px desktop padding *\/\n@media (max-width: 600px) {\n  .contact-info { padding: 32px 22px; gap: 24px; }\n}\n\/* 3. Overlay hero: tighten padding + size the headline for narrow screens *\/\n@media (max-width: 560px) {\n  [data-hero=\"overlay\"] .hero-overlay-content { padding: 48px 20px; }\n  .hero-headline { font-size: clamp(34px, 9vw, 52px); }\n}\n\/* 4. Header: keep EN\/KH switch reachable on phones (was hidden < 600px);\n      collapse the Book button to its icon so the single row still fits *\/\n@media (max-width: 600px) {\n  .dmrh-lang { display: inline-flex !important; }\n}\n@media (max-width: 460px) {\n  .dmrh-book span { display: none; }\n  .dmrh-book { padding: 10px 12px; }\n}\n<\/style>\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":"","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-20051","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Domrey Hospital App for Patients in Phnom Penh - Domrey Hospital<\/title>\n<meta name=\"robots\" content=\"noindex, nofollow\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Domrey Hospital App for Patients in Phnom Penh - Domrey Hospital\" \/>\n<meta property=\"og:url\" content=\"https:\/\/domreyhospital.com\/kh\/app\/\" \/>\n<meta property=\"og:site_name\" content=\"Domrey Hospital\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Domreypediatricclinic\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-09T08:17:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/domreyhospital.com\/wp-content\/uploads\/2024\/09\/site.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@domrey\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/domreyhospital.com\\\/app\\\/\",\"url\":\"https:\\\/\\\/domreyhospital.com\\\/app\\\/\",\"name\":\"Domrey Hospital App for Patients in Phnom Penh - Domrey Hospital\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/domreyhospital.com\\\/#website\"},\"datePublished\":\"2026-09-05T04:58:41+00:00\",\"dateModified\":\"2026-10-09T08:17:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/domreyhospital.com\\\/app\\\/#breadcrumb\"},\"inLanguage\":\"km\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/domreyhospital.com\\\/app\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/domreyhospital.com\\\/app\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/domreyhospital.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Domrey Hospital App for Patients in Phnom Penh\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/domreyhospital.com\\\/#website\",\"url\":\"https:\\\/\\\/domreyhospital.com\\\/\",\"name\":\"Domrey Hospital\",\"description\":\"Domrey Hospital\",\"publisher\":{\"@id\":\"https:\\\/\\\/domreyhospital.com\\\/#organization\"},\"alternateName\":\"Domrey Mother & Child Clinic\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/domreyhospital.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"km\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/domreyhospital.com\\\/#organization\",\"name\":\"Domrey Mother & Child Clinic\",\"url\":\"https:\\\/\\\/domreyhospital.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"km\",\"@id\":\"https:\\\/\\\/domreyhospital.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/domreyhospital.com\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/domrey_hospital_logo.png\",\"contentUrl\":\"https:\\\/\\\/domreyhospital.com\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/domrey_hospital_logo.png\",\"width\":1715,\"height\":474,\"caption\":\"Domrey Mother & Child Clinic\"},\"image\":{\"@id\":\"https:\\\/\\\/domreyhospital.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Domreypediatricclinic\",\"https:\\\/\\\/x.com\\\/domrey\",\"https:\\\/\\\/t.me\\\/+9VlvNEGTimozMjRl\",\"https:\\\/\\\/www.youtube.com\\\/@domreypediatricclinic\",\"https:\\\/\\\/www.tiktok.com\\\/@domreymotherchildclinic\",\"https:\\\/\\\/www.instagram.com\\\/domreymotherandchildclinic\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Domrey Hospital App for Patients in Phnom Penh - Domrey Hospital","robots":{"index":"noindex","follow":"nofollow"},"og_locale":"en_US","og_type":"article","og_title":"Domrey Hospital App for Patients in Phnom Penh - Domrey Hospital","og_url":"https:\/\/domreyhospital.com\/kh\/app\/","og_site_name":"Domrey Hospital","article_publisher":"https:\/\/www.facebook.com\/Domreypediatricclinic","article_modified_time":"2026-10-09T08:17:30+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/domreyhospital.com\/wp-content\/uploads\/2024\/09\/site.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@domrey","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/domreyhospital.com\/app\/","url":"https:\/\/domreyhospital.com\/app\/","name":"Domrey Hospital App for Patients in Phnom Penh - Domrey Hospital","isPartOf":{"@id":"https:\/\/domreyhospital.com\/#website"},"datePublished":"2026-09-05T04:58:41+00:00","dateModified":"2026-10-09T08:17:30+00:00","breadcrumb":{"@id":"https:\/\/domreyhospital.com\/app\/#breadcrumb"},"inLanguage":"km","potentialAction":[{"@type":"ReadAction","target":["https:\/\/domreyhospital.com\/app\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/domreyhospital.com\/app\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/domreyhospital.com\/"},{"@type":"ListItem","position":2,"name":"Domrey Hospital App for Patients in Phnom Penh"}]},{"@type":"WebSite","@id":"https:\/\/domreyhospital.com\/#website","url":"https:\/\/domreyhospital.com\/","name":"Domrey Hospital","description":"Domrey Hospital","publisher":{"@id":"https:\/\/domreyhospital.com\/#organization"},"alternateName":"Domrey Mother & Child Clinic","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/domreyhospital.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"km"},{"@type":"Organization","@id":"https:\/\/domreyhospital.com\/#organization","name":"Domrey Mother & Child Clinic","url":"https:\/\/domreyhospital.com\/","logo":{"@type":"ImageObject","inLanguage":"km","@id":"https:\/\/domreyhospital.com\/#\/schema\/logo\/image\/","url":"https:\/\/domreyhospital.com\/wp-content\/uploads\/2024\/08\/domrey_hospital_logo.png","contentUrl":"https:\/\/domreyhospital.com\/wp-content\/uploads\/2024\/08\/domrey_hospital_logo.png","width":1715,"height":474,"caption":"Domrey Mother & Child Clinic"},"image":{"@id":"https:\/\/domreyhospital.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Domreypediatricclinic","https:\/\/x.com\/domrey","https:\/\/t.me\/+9VlvNEGTimozMjRl","https:\/\/www.youtube.com\/@domreypediatricclinic","https:\/\/www.tiktok.com\/@domreymotherchildclinic","https:\/\/www.instagram.com\/domreymotherandchildclinic\/"]}]}},"_links":{"self":[{"href":"https:\/\/domreyhospital.com\/kh\/wp-json\/wp\/v2\/pages\/20051","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/domreyhospital.com\/kh\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/domreyhospital.com\/kh\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/domreyhospital.com\/kh\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/domreyhospital.com\/kh\/wp-json\/wp\/v2\/comments?post=20051"}],"version-history":[{"count":1,"href":"https:\/\/domreyhospital.com\/kh\/wp-json\/wp\/v2\/pages\/20051\/revisions"}],"predecessor-version":[{"id":20053,"href":"https:\/\/domreyhospital.com\/kh\/wp-json\/wp\/v2\/pages\/20051\/revisions\/20053"}],"wp:attachment":[{"href":"https:\/\/domreyhospital.com\/kh\/wp-json\/wp\/v2\/media?parent=20051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}