{"id":8,"date":"2026-09-26T18:06:42","date_gmt":"2026-09-26T18:06:42","guid":{"rendered":"https:\/\/thewebxite.ink\/?page_id=8"},"modified":"2026-09-30T10:38:57","modified_gmt":"2026-09-30T10:38:57","slug":"thara-royal-spa-home-spa-in-kl","status":"publish","type":"page","link":"https:\/\/thararoyalespa.com\/","title":{"rendered":"Thara Royal Spa &#8211; Home Spa in KL"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"8\" class=\"elementor elementor-8\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5a84238 e-con-full e-flex e-con e-parent\" data-id=\"5a84238\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3dc6e35 elementor-widget elementor-widget-html\" data-id=\"3dc6e35\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!--\n  THARA ROYALE SPA - landing page for one Elementor HTML widget\n  Paste this whole file into a single HTML widget.\n  Images load from the Media Library at https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09.\n  If the site moves to another domain, find-and-replace that folder URL with the new one.\n  Everything is scoped to #trs-app; nothing here styles or scripts the rest of the site.\n-->\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;1,400&family=Jost:wght@300;400;500&display=swap\">\n\n<style>\n\/* =====================================================================\n   0. TOKENS AND ROOT\n   Every inherited property is set here so theme rules on body, html\n   or * cannot creep in. No rem, no 100vw, nothing on :root.\n   ===================================================================== *\/\n#trs-app {\n  --trs-ivory: #FAF6F0;\n  --trs-beige: #F1E9DD;\n  --trs-stone: #DFD4C3;\n  --trs-paper: #FFFDF9;\n  --trs-jade: #1E4A42;\n  --trs-jade-dk: #153832;\n  --trs-ink: #221C17;\n  --trs-mute: #6E6157;\n  --trs-line: rgba(34, 28, 23, .14);\n  --trs-line-strong: rgba(34, 28, 23, .32);\n  --trs-line-lt: rgba(250, 246, 240, .26);\n  --trs-error: #9B2C1F;\n  --trs-star: #E09A12;\n\n  --trs-serif: \"Cormorant Garamond\", Georgia, \"Times New Roman\", serif;\n  --trs-sans: \"Jost\", \"Helvetica Neue\", Arial, sans-serif;\n\n  --trs-gut: clamp(20px, 5vw, 96px);\n  --trs-sec: clamp(56px, 7vw, 112px);\n  --trs-ease: cubic-bezier(.2, .7, .2, 1);\n  --trs-hdr-h: 76px;\n  --trs-admin: 0px;\n  --trs-fast: 180ms;\n\n  display: block;\n  position: relative;\n  width: 100%;\n  max-width: none;\n  margin: 0;\n  padding: 0;\n  overflow-x: clip;\n  background: var(--trs-ivory);\n  color: var(--trs-ink);\n  font-family: var(--trs-sans);\n  font-size: 16px;\n  font-weight: 400;\n  font-style: normal;\n  font-variant: normal;\n  font-feature-settings: normal;\n  line-height: 1.7;\n  letter-spacing: 0;\n  word-spacing: normal;\n  text-transform: none;\n  text-align: left;\n  text-indent: 0;\n  text-decoration: none;\n  text-shadow: none;\n  white-space: normal;\n  direction: ltr;\n  overflow-wrap: break-word;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n  text-size-adjust: 100%;\n}\n\n\/* WordPress admin bar: read-only use of body.admin-bar (the one allowed outside class) *\/\nbody.admin-bar #trs-app { --trs-admin: 32px; }\n@media (max-width: 782px) { body.admin-bar #trs-app { --trs-admin: 46px; } }\n@media (max-width: 600px) { body.admin-bar #trs-app { --trs-admin: 0px; } }\n\n\/* =====================================================================\n   1. SCOPED RESET\n   ID specificity beats theme and Elementor kit selectors without !important.\n   ===================================================================== *\/\n#trs-app *,\n#trs-app *::before,\n#trs-app *::after {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  border: 0 solid currentColor;\n  border-radius: 0;\n  font: inherit;\n  color: inherit;\n  letter-spacing: inherit;\n  word-spacing: inherit;\n  text-transform: inherit;\n  text-align: inherit;\n  text-indent: 0;\n  text-decoration: none;\n  text-shadow: none;\n  box-shadow: none;\n  background: transparent;\n  float: none;\n  max-width: none;\n  opacity: 1;\n  filter: none;\n  outline: 0;\n  transition: none;\n  animation: none;\n  vertical-align: baseline;\n}\n#trs-app *::before,\n#trs-app *::after { content: none; }\n\n#trs-app h1, #trs-app h2, #trs-app h3, #trs-app h4, #trs-app h5, #trs-app h6 { font-weight: 400; line-height: 1.15; }\n#trs-app p { max-width: none; }\n#trs-app ul, #trs-app ol { list-style: none; }\n#trs-app li { display: list-item; list-style: none; }\n#trs-app a { color: inherit; cursor: pointer; background: none; }\n#trs-app strong, #trs-app b { font-weight: 500; }\n#trs-app img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n  border: 0;\n  border-radius: 0;\n  box-shadow: none;\n}\n#trs-app svg { display: inline-block; flex: none; overflow: visible; vertical-align: middle; }\n#trs-app button,\n#trs-app input,\n#trs-app select,\n#trs-app textarea {\n  -webkit-appearance: none;\n  appearance: none;\n  width: auto;\n  height: auto;\n  min-height: 0;\n  min-width: 0;\n  border-radius: 0;\n  background: none;\n  color: inherit;\n  font: inherit;\n  line-height: inherit;\n  text-transform: none;\n}\n#trs-app button { cursor: pointer; user-select: none; -webkit-tap-highlight-color: transparent; }\n#trs-app label { display: block; cursor: default; }\n#trs-app fieldset { min-width: 0; }\n#trs-app table { border-collapse: collapse; border-spacing: 0; width: 100%; }\n#trs-app details { display: block; }\n#trs-app summary { display: block; list-style: none; cursor: pointer; }\n#trs-app summary::-webkit-details-marker { display: none; }\n#trs-app :focus-visible { outline: 2px solid var(--trs-jade); outline-offset: 3px; }\n#trs-app ::selection { background: var(--trs-jade); color: var(--trs-ivory); }\n\n\/* Anchor targets land below the sticky header (works without JS) *\/\n#trs-app [id^=\"trs-\"] { scroll-margin-top: calc(var(--trs-hdr-h) + var(--trs-admin) + 12px); }\n\n\/* =====================================================================\n   2. SHARED PIECES: layout, type, buttons, icons\n   ===================================================================== *\/\n#trs-app .trs-wrap {\n  width: 100%;\n  max-width: 1600px;\n  margin: 0 auto;\n  padding: 0 var(--trs-gut);\n}\n#trs-app .trs-section { padding: var(--trs-sec) 0; }\n#trs-app .trs-section--beige { background: var(--trs-beige); }\n\n#trs-app .trs-h2 {\n  font-family: var(--trs-serif);\n  font-size: clamp(34px, 4vw, 54px);\n  font-weight: 300;\n  line-height: 1.08;\n  letter-spacing: -.005em;\n  color: var(--trs-ink);\n}\n#trs-app .trs-h3 {\n  font-family: var(--trs-serif);\n  font-size: clamp(26px, 2.6vw, 36px);\n  font-weight: 300;\n  line-height: 1.12;\n}\n#trs-app .trs-lead {\n  font-size: clamp(17px, 1.3vw, 19px);\n  font-weight: 300;\n  line-height: 1.7;\n  color: var(--trs-mute);\n  max-width: 60ch;\n}\n#trs-app .trs-note {\n  font-size: 14px;\n  line-height: 1.65;\n  color: var(--trs-mute);\n  max-width: 70ch;\n}\n#trs-app .trs-sr {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0 0 0 0);\n  clip-path: inset(50%);\n  white-space: nowrap;\n}\n\n\/* Icons: one line set, 1.5 stroke *\/\n#trs-app .trs-ico {\n  width: 20px;\n  height: 20px;\n  fill: none;\n  stroke: currentColor;\n  stroke-width: 1.5;\n  stroke-linecap: round;\n  stroke-linejoin: round;\n}\n#trs-app .trs-ico--fill { fill: currentColor; stroke: none; }\n\n\/* Buttons *\/\n#trs-app .trs-btn {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: 10px;\n  min-height: 50px;\n  padding: 12px 28px;\n  border: 1px solid var(--trs-jade);\n  background: var(--trs-jade);\n  color: var(--trs-ivory);\n  font-family: var(--trs-sans);\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.2;\n  letter-spacing: .01em;\n  text-align: center;\n  white-space: nowrap;\n  cursor: pointer;\n  transition: background-color var(--trs-fast) ease, color var(--trs-fast) ease, border-color var(--trs-fast) ease;\n}\n#trs-app .trs-btn .trs-ico { width: 19px; height: 19px; }\n#trs-app .trs-btn--light { background: var(--trs-ivory); border-color: var(--trs-ivory); color: var(--trs-jade); }\n#trs-app .trs-btn--small { min-height: 42px; padding: 8px 20px; font-size: 14px; }\n@media (hover: hover) {\n  #trs-app .trs-btn:hover { background: var(--trs-jade-dk); border-color: var(--trs-jade-dk); }\n  #trs-app .trs-btn--light:hover { background: transparent; border-color: var(--trs-ivory); color: var(--trs-ivory); }\n}\n\n\/* Text link with a hairline underline *\/\n#trs-app .trs-link {\n  color: var(--trs-jade);\n  border-bottom: 1px solid currentColor;\n  padding-bottom: 2px;\n  transition: color var(--trs-fast) ease, border-color var(--trs-fast) ease;\n}\n@media (hover: hover) {\n  #trs-app .trs-link:hover { color: var(--trs-ink); }\n}\n\n\/* Photos share one quiet warm grade, as in the approved demo *\/\n#trs-app .trs-photo { width: 100%; height: 100%; object-fit: cover; filter: saturate(.9) contrast(1.02); }\n\n\/* =====================================================================\n   3. HEADER (removable)\n   Sticky inside #trs-app. Solid by default; with JS it is see-through\n   over the hero and turns solid once the page scrolls.\n   ===================================================================== *\/\n#trs-app .trs-header {\n  position: sticky;\n  top: var(--trs-admin);\n  z-index: 80;\n  height: var(--trs-hdr-h);\n  background: var(--trs-ivory);\n  color: var(--trs-ink);\n  box-shadow: 0 1px 0 var(--trs-line);\n  transition: background-color 240ms ease, color 240ms ease, box-shadow 240ms ease;\n}\n#trs-app .trs-header__in {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 24px;\n  height: 100%;\n}\n#trs-app .trs-brand { display: flex; align-items: center; gap: 12px; line-height: 1.1; flex: none; }\n#trs-app .trs-brand__mark {\n  display: block;\n  flex: none;\n  width: 46px;\n  height: 46px;\n  border-radius: 50%;\n  box-shadow: 0 0 0 1px rgba(34, 28, 23, .08);\n}\n#trs-app .trs-brand__text { display: block; }\n#trs-app .trs-brand__name {\n  display: block;\n  font-family: var(--trs-serif);\n  font-size: 25px;\n  font-weight: 500;\n  letter-spacing: .005em;\n}\n#trs-app .trs-brand__tag {\n  display: block;\n  margin-top: 3px;\n  font-size: 12px;\n  letter-spacing: .05em;\n  color: var(--trs-mute);\n  transition: color 240ms ease;\n}\n\/* DOM order is brand, actions, nav (so Tab reaches the open panel after the menu button);\n   on desktop the nav is shown between them with flex order *\/\n#trs-app .trs-brand { order: 1; }\n#trs-app .trs-nav { order: 2; }\n#trs-app .trs-header__right { order: 3; }\n#trs-app .trs-nav__list { display: flex; align-items: center; gap: clamp(20px, 2.4vw, 36px); }\n#trs-app .trs-nav__link {\n  display: inline-block;\n  padding: 6px 0 4px;\n  font-size: 15px;\n  border-bottom: 1px solid transparent;\n  transition: border-color var(--trs-fast) ease;\n}\n@media (hover: hover) {\n  #trs-app .trs-nav__link:hover { border-color: currentColor; }\n}\n#trs-app .trs-header__right { display: flex; align-items: center; gap: 14px; }\n#trs-app .trs-menu-btn {\n  display: none;\n  align-items: center;\n  gap: 8px;\n  min-height: 44px;\n  padding: 0 4px;\n  font-size: 15px;\n}\n#trs-app .trs-menu-btn .trs-ico { width: 22px; height: 22px; }\n#trs-app .trs-menu-btn .trs-ico--close { display: none; }\n#trs-app .trs-menu-btn[aria-expanded=\"true\"] .trs-ico--open { display: none; }\n#trs-app .trs-menu-btn[aria-expanded=\"true\"] .trs-ico--close { display: inline-block; }\n\n\/* See-through state (JS only, while the hero is under the header) *\/\n#trs-app.trs-js .trs-header.trs-is-clear { background: transparent; color: var(--trs-ivory); box-shadow: none; }\n#trs-app.trs-js .trs-header.trs-is-clear .trs-brand__tag { color: rgba(250, 246, 240, .78); }\n#trs-app.trs-js .trs-header.trs-is-clear .trs-btn { background: transparent; border-color: var(--trs-line-lt); color: var(--trs-ivory); }\n@media (hover: hover) {\n  #trs-app.trs-js .trs-header.trs-is-clear .trs-btn:hover { background: var(--trs-ivory); border-color: var(--trs-ivory); color: var(--trs-jade); }\n}\n\n\/* Tablet and mobile: menu button with a drop-down panel *\/\n@media (max-width: 1024px) {\n  #trs-app { --trs-hdr-h: 68px; }\n  #trs-app .trs-brand__name { font-size: 22px; }\n  #trs-app .trs-brand__tag { font-size: 11px; }\n  #trs-app .trs-brand__mark { width: 42px; height: 42px; }\n\n  \/* Without JS the links sit in a scrollable row under the wordmark *\/\n  #trs-app:not(.trs-js) .trs-header { height: auto; }\n  #trs-app:not(.trs-js) .trs-header__in { flex-wrap: wrap; height: auto; padding-top: 12px; padding-bottom: 8px; row-gap: 4px; }\n  #trs-app:not(.trs-js) .trs-nav { order: 3; width: 100%; overflow-x: auto; }\n  #trs-app:not(.trs-js) .trs-nav__list { gap: 20px; }\n\n  #trs-app.trs-js .trs-menu-btn { display: inline-flex; }\n  #trs-app.trs-js .trs-nav {\n    display: none;\n    position: absolute;\n    top: 100%;\n    left: 0;\n    right: 0;\n    background: var(--trs-ivory);\n    color: var(--trs-ink);\n    border-top: 1px solid var(--trs-line);\n    box-shadow: 0 12px 24px -16px rgba(34, 28, 23, .35);\n  }\n  #trs-app.trs-js .trs-nav.trs-is-open { display: block; }\n  #trs-app.trs-js .trs-nav__list {\n    display: block;\n    max-width: 1600px;\n    margin: 0 auto;\n    padding: 8px var(--trs-gut) 20px;\n  }\n  #trs-app.trs-js .trs-nav__list li { border-bottom: 1px solid var(--trs-line); }\n  #trs-app.trs-js .trs-nav__link {\n    display: block;\n    padding: 14px 0;\n    font-family: var(--trs-serif);\n    font-size: 24px;\n    font-weight: 400;\n    border: 0;\n  }\n}\n@media (max-width: 767px) {\n  #trs-app { --trs-hdr-h: 64px; }\n  #trs-app .trs-brand__name { font-size: 19px; }\n  #trs-app .trs-brand { gap: 9px; }\n  #trs-app .trs-brand__mark { width: 38px; height: 38px; }\n  #trs-app .trs-header .trs-btn { min-height: 40px; padding: 6px 14px; font-size: 14px; }\n  #trs-app .trs-menu-btn__label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }\n  #trs-app .trs-header__right { gap: 6px; }\n}\n@media (max-width: 359px) {\n  #trs-app .trs-brand__tag { display: none; }\n}\n\n\/* =====================================================================\n   4. HERO\n   Pulled up under the header only when the header is present\n   (.trs-header + .trs-hero), so deleting the header needs no CSS edit.\n   ===================================================================== *\/\n#trs-app .trs-hero {\n  position: relative;\n  isolation: isolate;\n  display: flex;\n  align-items: flex-end;\n  min-height: 680px;\n  min-height: min(100vh, 980px);\n  min-height: min(100svh, 980px);\n  overflow: hidden;\n  background: #2B231D;\n  color: var(--trs-ivory);\n}\n#trs-app .trs-header + .trs-hero { margin-top: calc(-1 * var(--trs-hdr-h)); }\n#trs-app .trs-hero__img {\n  position: absolute;\n  inset: 0;\n  z-index: -2;\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n  object-position: 40% 35%;\n  animation: trs-hero-in 2.4s cubic-bezier(.2, .8, .25, 1) both;\n}\n@keyframes trs-hero-in {\n  from { transform: scale(1.06); }\n  to { transform: scale(1); }\n}\n\/* Legibility scrim: darkens the left and the bottom where the text sits *\/\n#trs-app .trs-hero__scrim {\n  position: absolute;\n  inset: 0;\n  z-index: -1;\n  background:\n    linear-gradient(90deg, rgba(24, 19, 15, .72) 0%, rgba(24, 19, 15, .45) 45%, rgba(24, 19, 15, .08) 80%),\n    linear-gradient(180deg, rgba(24, 19, 15, .45) 0%, rgba(24, 19, 15, 0) 30%, rgba(24, 19, 15, .55) 100%);\n}\n\/* Headline on the left, an ivory booking card on the right *\/\n#trs-app .trs-hero__in {\n  display: grid;\n  grid-template-columns: minmax(0, 7fr) minmax(320px, 4fr);\n  gap: 40px clamp(40px, 5vw, 96px);\n  align-items: end;\n  padding-top: calc(var(--trs-hdr-h) + 72px);\n  padding-bottom: clamp(44px, 6vw, 88px);\n}\n#trs-app .trs-hero__h1 { display: block; }\n#trs-app .trs-hero__title {\n  display: block;\n  max-width: 13ch;\n  font-family: var(--trs-serif);\n  font-size: clamp(44px, 6.2vw, 92px);\n  text-wrap: balance;\n  font-weight: 300;\n  line-height: 1.02;\n  letter-spacing: -.012em;\n}\n#trs-app .trs-hero__tagline {\n  display: block;\n  margin-top: 14px;\n  font-family: var(--trs-serif);\n  font-size: clamp(24px, 2.5vw, 36px);\n  font-style: italic;\n  font-weight: 400;\n  line-height: 1.15;\n  color: #E9DCC4;\n}\n#trs-app .trs-hero__sub {\n  max-width: 42ch;\n  margin-top: 22px;\n  font-size: clamp(17px, 1.35vw, 19px);\n  font-weight: 300;\n  line-height: 1.6;\n  color: rgba(250, 246, 240, .92);\n}\n#trs-app .trs-hero__card {\n  justify-self: end;\n  width: 100%;\n  max-width: 420px;\n  padding: 26px 28px 24px;\n  background: rgba(250, 246, 240, .97);\n  color: var(--trs-ink);\n  border-top: 3px solid var(--trs-jade);\n  box-shadow: 0 30px 60px -30px rgba(0, 0, 0, .55);\n}\n#trs-app .trs-hero__open { display: flex; align-items: center; gap: 8px; font-size: 14px; color: var(--trs-mute); }\n#trs-app .trs-hero__open .trs-ico { width: 18px; height: 18px; color: var(--trs-jade); }\n#trs-app .trs-hero__hours {\n  margin-top: 4px;\n  font-family: var(--trs-serif);\n  font-size: clamp(32px, 2.8vw, 40px);\n  font-weight: 400;\n  line-height: 1.1;\n  font-variant-numeric: lining-nums;\n  color: var(--trs-ink);\n}\n#trs-app .trs-values { margin-top: 18px; border-top: 1px solid var(--trs-line); }\n#trs-app .trs-values li {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 11px 0;\n  border-bottom: 1px solid var(--trs-line);\n  font-size: 15px;\n  line-height: 1.35;\n}\n#trs-app .trs-values .trs-ico { width: 20px; height: 20px; color: var(--trs-jade); }\n#trs-app .trs-hero__cta { display: flex; width: 100%; margin-top: 20px; }\n#trs-app .trs-hero__wa { margin-top: 12px; text-align: center; font-size: 14px; color: var(--trs-mute); }\n#trs-app .trs-hero__wa a { color: var(--trs-jade); border-bottom: 1px solid currentColor; }\n\n@media (max-width: 1024px) {\n  #trs-app:not(.trs-js) .trs-header + .trs-hero { margin-top: 0; }\n  #trs-app .trs-hero__in { grid-template-columns: 1fr; }\n  #trs-app .trs-hero__card { justify-self: start; max-width: 460px; }\n}\n@media (max-width: 767px) {\n  #trs-app .trs-hero { min-height: 0; }\n  #trs-app .trs-hero__img { object-position: 30% 30%; }\n  #trs-app .trs-hero__scrim {\n    background: linear-gradient(180deg, rgba(24, 19, 15, .55) 0%, rgba(24, 19, 15, .45) 35%, rgba(24, 19, 15, .7) 60%, rgba(24, 19, 15, .85) 100%);\n  }\n  \/* Mobile: headline centred in the photo, booking card below *\/\n  #trs-app .trs-hero__in { gap: 32px; padding-top: calc(var(--trs-hdr-h) + 72px); padding-bottom: 28px; }\n  #trs-app .trs-hero__text { text-align: center; }\n  #trs-app .trs-hero__title { max-width: none; margin: 0 auto; font-size: clamp(44px, 12.5vw, 60px); }\n  #trs-app .trs-hero__tagline { font-size: clamp(24px, 7vw, 30px); }\n  #trs-app .trs-hero__sub { max-width: 34ch; margin-left: auto; margin-right: auto; font-size: 17px; }\n  #trs-app .trs-hero__card { max-width: none; padding: 22px 20px 20px; }\n  #trs-app .trs-hero__hours { font-size: 32px; }\n}\n\n\/* =====================================================================\n   5. WHAT WE DO\n   Two offset photo and text rows, carried over from the demo.\n   ===================================================================== *\/\n#trs-app .trs-services__intro { max-width: 680px; margin-bottom: clamp(32px, 4vw, 56px); }\n#trs-app .trs-services__intro .trs-lead { margin-top: 16px; }\n#trs-app .trs-spec {\n  display: grid;\n  grid-template-columns: repeat(12, minmax(0, 1fr));\n  gap: clamp(20px, 2.4vw, 36px);\n  align-items: center;\n}\n#trs-app .trs-spec + .trs-spec { margin-top: clamp(40px, 5vw, 80px); }\n\/* Landscape photos keep the text column and the photo close in height *\/\n#trs-app .trs-spec__ph { grid-column: 1 \/ 8; aspect-ratio: 16 \/ 11; overflow: hidden; }\n#trs-app .trs-spec__ph img { object-position: 50% 40%; transition: transform 900ms var(--trs-ease); }\n#trs-app .trs-spec__tx { grid-column: 8 \/ 13; padding-left: clamp(0px, 2vw, 32px); }\n#trs-app .trs-spec--flip .trs-spec__ph { grid-column: 6 \/ 13; order: 2; }\n#trs-app .trs-spec--flip .trs-spec__tx { grid-column: 1 \/ 6; padding-left: 0; padding-right: clamp(0px, 2vw, 32px); }\n@media (hover: hover) {\n  #trs-app .trs-spec__ph:hover img { transform: scale(1.04); }\n}\n#trs-app .trs-spec__tx .trs-lead { margin-top: 16px; }\n#trs-app .trs-tags { display: flex; flex-wrap: wrap; gap: 8px; margin: 24px 0 28px; }\n#trs-app .trs-tags li {\n  padding: 5px 14px;\n  border: 1px solid var(--trs-line-strong);\n  font-size: 14px;\n  line-height: 1.5;\n  color: var(--trs-ink);\n}\n@media (max-width: 1024px) {\n  #trs-app .trs-spec__ph { grid-column: 1 \/ 7; }\n  #trs-app .trs-spec__tx { grid-column: 7 \/ 13; }\n  #trs-app .trs-spec--flip .trs-spec__ph { grid-column: 7 \/ 13; }\n  #trs-app .trs-spec--flip .trs-spec__tx { grid-column: 1 \/ 7; padding-right: 0; }\n  #trs-app .trs-spec__tx { padding-left: 0; }\n  #trs-app .trs-spec__ph,\n  #trs-app .trs-spec--flip .trs-spec__ph { aspect-ratio: 4 \/ 5; }\n}\n@media (max-width: 767px) {\n  #trs-app .trs-spec__ph,\n  #trs-app .trs-spec__tx,\n  #trs-app .trs-spec--flip .trs-spec__ph,\n  #trs-app .trs-spec--flip .trs-spec__tx { grid-column: 1 \/ -1; order: 0; }\n  #trs-app .trs-spec__ph,\n  #trs-app .trs-spec--flip .trs-spec__ph { aspect-ratio: 4 \/ 3; }\n  #trs-app .trs-spec__tx { margin-top: 8px; }\n}\n\n\/* =====================================================================\n   6. TREATMENTS AND PRICES\n   Laid out like a printed spa menu. Each row carries data-trs-service\n   and data-trs-prices; the booking form reads prices from here only.\n   ===================================================================== *\/\n#trs-app .trs-menu-head {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n  gap: 24px 48px;\n  align-items: end;\n  margin-bottom: clamp(40px, 5vw, 72px);\n}\n#trs-app .trs-menu-head .trs-lead { justify-self: end; max-width: 44ch; }\n#trs-app .trs-menu-cat {\n  font-family: var(--trs-serif);\n  font-size: clamp(26px, 2.4vw, 32px);\n  font-weight: 400;\n  line-height: 1.2;\n}\n#trs-app .trs-mlist { border-bottom: 1px solid var(--trs-line); }\n#trs-app .trs-mhead,\n#trs-app .trs-mrow {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) repeat(3, 112px);\n  column-gap: 8px;\n  align-items: baseline;\n}\n#trs-app .trs-mhead { padding-bottom: 14px; border-bottom: 1px solid var(--trs-ink); }\n#trs-app .trs-mhead__dur { text-align: right; font-size: 14px; color: var(--trs-mute); }\n#trs-app .trs-mrow { position: relative; padding: 22px 0; border-top: 1px solid var(--trs-line); }\n#trs-app .trs-mrow::before {\n  content: \"\";\n  position: absolute;\n  inset: 0 calc(-1 * clamp(8px, 1.2vw, 20px));\n  z-index: -1;\n  background: var(--trs-beige);\n  opacity: 0;\n  transition: opacity 240ms ease;\n}\n#trs-app .trs-mlist { position: relative; z-index: 0; }\n@media (hover: hover) {\n  #trs-app .trs-mrow:hover::before { opacity: .7; }\n  #trs-app .trs-mrow:hover .trs-mrow__name { color: var(--trs-jade); }\n}\n#trs-app .trs-mrow__name { transition: color 240ms ease; }\n#trs-app .trs-mhead + .trs-mlist .trs-mrow:first-child { border-top: 0; }\n#trs-app .trs-mrow__name {\n  font-family: var(--trs-serif);\n  font-size: clamp(21px, 1.9vw, 25px);\n  font-weight: 500;\n  line-height: 1.2;\n}\n#trs-app .trs-mrow__desc { margin-top: 4px; max-width: 52ch; font-size: 15px; line-height: 1.6; color: var(--trs-mute); }\n#trs-app .trs-mrow__as { margin-top: 8px; font-size: 14px; color: var(--trs-mute); }\n#trs-app .trs-mrow__as a { margin-left: 10px; color: var(--trs-jade); border-bottom: 1px solid currentColor; }\n#trs-app .trs-mrow__prices { display: contents; }\n#trs-app .trs-price {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-end;\n  justify-self: end;\n  min-height: 44px;\n  padding: 2px 0;\n  text-align: right;\n  font-size: 19px;\n  line-height: 1.3;\n  font-variant-numeric: tabular-nums lining-nums;\n  color: var(--trs-ink);\n  transition: color var(--trs-fast) ease;\n}\n#trs-app .trs-price__dur { display: none; font-size: 13px; color: var(--trs-mute); }\n#trs-app .trs-price__amt { border-bottom: 1px solid transparent; transition: border-color var(--trs-fast) ease; }\n#trs-app .trs-price__cta { font-size: 13px; color: var(--trs-jade); }\n@media (hover: hover) {\n  #trs-app .trs-price:hover { color: var(--trs-jade); }\n  #trs-app .trs-price:hover .trs-price__amt { border-color: currentColor; }\n}\n\n\/* Mobile price switch (shown only with JS, on mobile) *\/\n#trs-app .trs-pswitch { display: none; }\n#trs-app .trs-pswitch__opts { display: flex; border: 1px solid var(--trs-jade); }\n#trs-app .trs-pswitch__opt { position: relative; flex: 1 1 0; }\n#trs-app .trs-pswitch__opt input {\n  position: absolute;\n  inset: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  margin: 0;\n  cursor: pointer;\n}\n#trs-app .trs-pswitch__opt span {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  min-height: 46px;\n  font-size: 15px;\n  color: var(--trs-jade);\n  transition: background-color var(--trs-fast) ease, color var(--trs-fast) ease;\n}\n#trs-app .trs-pswitch__opt + .trs-pswitch__opt span { border-left: 1px solid var(--trs-jade); }\n#trs-app .trs-pswitch__opt input:checked + span { background: var(--trs-jade); color: var(--trs-ivory); }\n#trs-app .trs-pswitch__opt input:focus-visible + span { outline: 2px solid var(--trs-jade); outline-offset: 3px; }\n\n\/* Face, body and nails: photo cards in a native scroll-snap track *\/\n#trs-app .trs-scards { margin-top: clamp(48px, 6vw, 88px); }\n#trs-app .trs-scards__head {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: 16px 32px;\n  margin-bottom: 24px;\n}\n#trs-app .trs-scards__lead { margin-top: 6px; font-size: 16px; color: var(--trs-mute); max-width: 52ch; }\n#trs-app .trs-scards__track {\n  display: grid;\n  grid-auto-flow: column;\n  grid-auto-columns: calc((100% - 60px) \/ 4);\n  gap: 20px;\n  overflow-x: auto;\n  overscroll-behavior-x: contain;\n  scroll-snap-type: x mandatory;\n  scroll-behavior: smooth;\n  scrollbar-width: none;\n  padding: 2px;\n  margin: -2px;\n}\n#trs-app .trs-scards__track::-webkit-scrollbar { display: none; }\n#trs-app .trs-scard {\n  position: relative;\n  isolation: isolate;\n  display: flex;\n  align-items: flex-end;\n  aspect-ratio: 3 \/ 4;\n  overflow: hidden;\n  scroll-snap-align: start;\n  background: #3A2E26;\n  color: var(--trs-ivory);\n}\n#trs-app .trs-scard__img {\n  position: absolute;\n  inset: 0;\n  z-index: -2;\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n  filter: saturate(.9) contrast(1.02);\n  transition: transform 900ms var(--trs-ease);\n}\n\/* Legibility scrim behind the text at the bottom of each card *\/\n#trs-app .trs-scard::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  z-index: -1;\n  background: linear-gradient(180deg, rgba(24, 19, 15, 0) 35%, rgba(24, 19, 15, .55) 62%, rgba(24, 19, 15, .88) 100%);\n}\n#trs-app .trs-scard__body { width: 100%; padding: 22px; }\n#trs-app .trs-scard__meta { display: flex; gap: 14px; font-size: 13px; letter-spacing: .03em; color: rgba(250, 246, 240, .82); }\n#trs-app .trs-scard__name {\n  margin-top: 6px;\n  font-family: var(--trs-serif);\n  font-size: clamp(23px, 1.9vw, 27px);\n  font-weight: 500;\n  line-height: 1.15;\n}\n#trs-app .trs-scard__desc { min-height: 3em; margin-top: 6px; font-size: 14px; line-height: 1.5; color: rgba(250, 246, 240, .88); }\n#trs-app .trs-scard__foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 16px; }\n#trs-app .trs-scard__price { font-size: 20px; font-variant-numeric: tabular-nums lining-nums; }\n#trs-app .trs-scard__book {\n  display: inline-flex;\n  align-items: center;\n  min-height: 40px;\n  padding: 6px 20px;\n  border-radius: 999px;\n  background: var(--trs-ivory);\n  color: var(--trs-jade);\n  font-size: 14px;\n  line-height: 1.2;\n  transition: background-color var(--trs-fast) ease, color var(--trs-fast) ease;\n}\n#trs-app .trs-scard__book:focus-visible { outline-color: var(--trs-ivory); }\n@media (hover: hover) {\n  #trs-app .trs-scard:hover .trs-scard__img { transform: scale(1.05); }\n  #trs-app .trs-scard__book:hover { background: var(--trs-jade); color: var(--trs-ivory); }\n}\n#trs-app .trs-menu-notes {\n  margin-top: clamp(32px, 4vw, 48px);\n  padding-left: 18px;\n  border-left: 2px solid var(--trs-jade);\n}\n#trs-app .trs-menu-notes p { font-size: 15px; color: var(--trs-ink); line-height: 1.6; }\n\n@media (max-width: 1024px) {\n  #trs-app .trs-mhead,\n  #trs-app .trs-mrow { grid-template-columns: minmax(0, 1fr) repeat(3, 84px); }\n  #trs-app .trs-scards__track { grid-auto-columns: calc((100% - 40px) \/ 3); }\n}\n@media (max-width: 767px) {\n  #trs-app .trs-menu-head { grid-template-columns: 1fr; }\n  #trs-app .trs-menu-head .trs-lead { justify-self: start; }\n  #trs-app .trs-mhead { grid-template-columns: 1fr; }\n  #trs-app .trs-mhead__dur { display: none; }\n  #trs-app .trs-mrow { grid-template-columns: 1fr; row-gap: 12px; }\n  #trs-app .trs-mrow__prices { display: flex; gap: 8px; }\n  #trs-app .trs-price {\n    flex: 1 1 0;\n    align-items: flex-start;\n    justify-self: stretch;\n    padding: 8px 10px;\n    border: 1px solid var(--trs-line);\n    text-align: left;\n    font-size: 17px;\n  }\n  #trs-app .trs-price__dur { display: block; }\n  #trs-app .trs-scards__track { grid-auto-columns: 78%; gap: 14px; }\n  #trs-app .trs-scards__head .trs-carousel-nav { display: none; }\n\n  \/* With JS: one 60 \/ 90 \/ 120 switch drives every massage price *\/\n  #trs-app.trs-js .trs-pswitch { display: block; margin: 20px 0 8px; }\n  #trs-app.trs-js .trs-mrow { grid-template-columns: minmax(0, 1fr) auto; align-items: start; }\n  #trs-app.trs-js .trs-mrow__prices { display: block; }\n  #trs-app.trs-js .trs-price { align-items: flex-end; padding: 0; border: 0; text-align: right; font-size: 19px; }\n  #trs-app.trs-js .trs-price__dur { display: none; }\n  #trs-app.trs-js .trs-menu[data-trs-dur=\"60\"] .trs-price:not([data-trs-dur=\"60\"]),\n  #trs-app.trs-js .trs-menu[data-trs-dur=\"90\"] .trs-price:not([data-trs-dur=\"90\"]),\n  #trs-app.trs-js .trs-menu[data-trs-dur=\"120\"] .trs-price:not([data-trs-dur=\"120\"]) { display: none; }\n}\n@media (min-width: 768px) {\n  #trs-app .trs-price__cta { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }\n}\n\n\/* =====================================================================\n   7. HOW IT WORKS\n   A real sequence, so the numbers carry meaning.\n   ===================================================================== *\/\n#trs-app .trs-how__head { max-width: 620px; margin-bottom: clamp(36px, 4vw, 56px); }\n#trs-app .trs-how__head .trs-lead { margin-top: 16px; }\n#trs-app .trs-steps {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  border-top: 1px solid var(--trs-line-strong);\n}\n#trs-app .trs-step { padding: 28px 32px 0 0; }\n#trs-app .trs-step + .trs-step { padding-left: 32px; border-left: 1px solid var(--trs-line); }\n#trs-app .trs-step__n {\n  display: block;\n  font-family: var(--trs-serif);\n  font-size: 56px;\n  font-weight: 300;\n  line-height: 1;\n  font-variant-numeric: lining-nums;\n  color: var(--trs-jade);\n}\n#trs-app .trs-step__t { margin-top: 18px; font-family: var(--trs-serif); font-size: 25px; font-weight: 500; line-height: 1.2; }\n#trs-app .trs-step p { margin-top: 8px; font-size: 15px; line-height: 1.65; color: var(--trs-mute); max-width: 34ch; }\n@media (max-width: 767px) {\n  #trs-app .trs-steps { grid-template-columns: 1fr; }\n  #trs-app .trs-step,\n  #trs-app .trs-step + .trs-step { display: grid; grid-template-columns: 56px 1fr; column-gap: 12px; padding: 24px 0; border-left: 0; }\n  #trs-app .trs-step + .trs-step { border-top: 1px solid var(--trs-line); }\n  #trs-app .trs-step__n { font-size: 44px; grid-row: 1 \/ 3; }\n  #trs-app .trs-step__t { margin-top: 2px; }\n}\n\n\/* =====================================================================\n   8. AREAS WE COVER\n   A directory list. KLCC and Bukit Bintang set large as the home base.\n   ===================================================================== *\/\n#trs-app .trs-areas__top {\n  display: grid;\n  grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);\n  gap: 32px clamp(32px, 5vw, 80px);\n  align-items: end;\n  padding-bottom: clamp(32px, 4vw, 48px);\n}\n#trs-app .trs-areas__top .trs-lead { margin-top: 16px; }\n#trs-app .trs-home { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }\n#trs-app .trs-home li { border-top: 2px solid var(--trs-jade); padding-top: 14px; }\n#trs-app .trs-home__name {\n  display: block;\n  font-family: var(--trs-serif);\n  font-size: clamp(34px, 3.5vw, 52px);\n  font-weight: 400;\n  line-height: 1.02;\n}\n#trs-app .trs-home__cap { display: block; margin-top: 8px; font-size: 14px; color: var(--trs-mute); }\n\/* Columns read top to bottom, so the client's order is kept and the last column simply ends shorter *\/\n#trs-app .trs-alist {\n  columns: 4;\n  column-gap: clamp(20px, 2.4vw, 36px);\n  border-top: 1px solid var(--trs-line-strong);\n}\n#trs-app .trs-alist li {\n  break-inside: avoid;\n  padding: 16px 0 14px;\n  border-bottom: 1px solid var(--trs-line);\n  font-size: 17px;\n  line-height: 1.35;\n}\n#trs-app .trs-alist small { display: block; margin-top: 2px; font-size: 14px; color: var(--trs-mute); }\n#trs-app .trs-areas__foot {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: 12px 32px;\n  margin-top: 32px;\n}\n#trs-app .trs-areas__foot .trs-link { font-size: 17px; }\n@media (max-width: 1024px) {\n  #trs-app .trs-areas__top { grid-template-columns: 1fr; }\n  #trs-app .trs-alist { columns: 3; }\n}\n@media (max-width: 767px) {\n  #trs-app .trs-home { grid-template-columns: 1fr; gap: 16px; }\n  #trs-app .trs-alist { columns: 2; column-gap: 16px; }\n  #trs-app .trs-alist li { font-size: 16px; }\n}\n\n\/* =====================================================================\n   9. HOTELS AND SERVICED SUITES\n   Searchable directory. Groups stay visible; on mobile each group\n   shows six names until \"Show all\" (JS only).\n   ===================================================================== *\/\n#trs-app .trs-hotels__top {\n  display: grid;\n  grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);\n  gap: 32px clamp(32px, 5vw, 80px);\n  align-items: end;\n  margin-bottom: clamp(40px, 5vw, 64px);\n}\n#trs-app .trs-hotels__top .trs-lead { margin-top: 16px; }\n#trs-app .trs-hotels__ph { aspect-ratio: 3 \/ 2; overflow: hidden; }\n#trs-app .trs-search { margin-top: 28px; max-width: 520px; }\n#trs-app .trs-search__label { font-size: 14px; color: var(--trs-mute); margin-bottom: 8px; }\n#trs-app .trs-search__box { position: relative; }\n#trs-app .trs-search__box .trs-ico {\n  position: absolute;\n  left: 16px;\n  top: 50%;\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  color: var(--trs-mute);\n  pointer-events: none;\n}\n#trs-app .trs-search__input {\n  display: block;\n  width: 100%;\n  min-height: 52px;\n  padding: 12px 16px 12px 48px;\n  border: 1px solid var(--trs-line-strong);\n  background: var(--trs-paper);\n  color: var(--trs-ink);\n  font-size: 16px;\n  line-height: 1.4;\n  transition: border-color var(--trs-fast) ease;\n}\n#trs-app .trs-search__input::placeholder { color: #8A7D72; opacity: 1; }\n#trs-app .trs-search__input:focus { border-color: var(--trs-jade); box-shadow: 0 0 0 1px var(--trs-jade); }\n#trs-app .trs-search__input::-webkit-search-cancel-button { -webkit-appearance: none; }\n#trs-app .trs-search__status { margin-top: 8px; min-height: 22px; font-size: 14px; color: var(--trs-mute); }\n\n#trs-app .trs-hgroup + .trs-hgroup { margin-top: clamp(40px, 5vw, 64px); }\n#trs-app .trs-hgroup__title {\n  display: flex;\n  align-items: baseline;\n  gap: 12px;\n  padding-bottom: 12px;\n  border-bottom: 1px solid var(--trs-ink);\n  font-family: var(--trs-serif);\n  font-size: clamp(24px, 2.2vw, 30px);\n  font-weight: 400;\n}\n#trs-app .trs-hgroup__count { font-family: var(--trs-sans); font-size: 14px; color: var(--trs-mute); }\n#trs-app .trs-hlist {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  column-gap: clamp(20px, 2.4vw, 36px);\n}\n#trs-app .trs-hlist li {\n  padding: 13px 0 12px;\n  border-bottom: 1px solid var(--trs-line);\n  font-size: 16px;\n  line-height: 1.4;\n  overflow-wrap: anywhere;\n}\n#trs-app .trs-hgroup__more {\n  display: none;\n  align-items: center;\n  min-height: 44px;\n  margin-top: 8px;\n  color: var(--trs-jade);\n  font-size: 15px;\n}\n#trs-app .trs-hgroup__more span { border-bottom: 1px solid currentColor; }\n#trs-app .trs-hnone { padding: 24px 0; font-size: 17px; }\n#trs-app .trs-hnone p + p { margin-top: 6px; }\n#trs-app .trs-hotels__disc { margin-top: clamp(32px, 4vw, 48px); font-size: 13px; }\n@media (max-width: 1024px) {\n  #trs-app .trs-hotels__top { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }\n  #trs-app .trs-hlist { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n}\n@media (max-width: 767px) {\n  #trs-app .trs-hotels__top { grid-template-columns: 1fr; }\n  #trs-app .trs-hotels__ph { order: -1; aspect-ratio: 16 \/ 9; }\n  #trs-app .trs-search { max-width: none; }\n  #trs-app .trs-hlist { grid-template-columns: 1fr; }\n  #trs-app.trs-js .trs-hgroup__more { display: inline-flex; }\n  #trs-app.trs-js .trs-hotels:not(.trs-is-searching) .trs-hgroup:not(.trs-is-expanded) .trs-hlist li:nth-child(n+7) { display: none; }\n  #trs-app.trs-js .trs-hotels.trs-is-searching .trs-hgroup__more { display: none; }\n}\n\n\/* =====================================================================\n   10. LATE-NIGHT PHOTO BAND\n   ===================================================================== *\/\n#trs-app .trs-band {\n  position: relative;\n  isolation: isolate;\n  overflow: hidden;\n  background: #1B1A1C;\n  color: var(--trs-ivory);\n}\n#trs-app .trs-band__img {\n  position: absolute;\n  inset: 0;\n  z-index: -2;\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n  object-position: 50% 45%;\n}\n#trs-app .trs-band__scrim {\n  position: absolute;\n  inset: 0;\n  z-index: -1;\n  background: linear-gradient(90deg, rgba(18, 16, 18, .78) 0%, rgba(18, 16, 18, .5) 50%, rgba(18, 16, 18, .2) 100%);\n}\n#trs-app .trs-band__in { padding-top: clamp(80px, 11vw, 168px); padding-bottom: clamp(80px, 11vw, 168px); }\n#trs-app .trs-band .trs-h2 { color: var(--trs-ivory); max-width: 14ch; }\n#trs-app .trs-band p { margin-top: 16px; max-width: 40ch; font-size: clamp(17px, 1.4vw, 19px); font-weight: 300; color: rgba(250, 246, 240, .9); }\n#trs-app .trs-band .trs-btn { margin-top: 28px; }\n@media (max-width: 767px) {\n  #trs-app .trs-band__scrim { background: rgba(18, 16, 18, .62); }\n  #trs-app .trs-band .trs-btn { display: flex; width: 100%; }\n}\n\n\/* =====================================================================\n   11. REVIEWS (placeholder content)\n   Native scroll-snap track: swipe, trackpad, arrow keys, or the buttons.\n   ===================================================================== *\/\n#trs-app .trs-rev__top {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: 24px 48px;\n  margin-bottom: clamp(32px, 4vw, 48px);\n}\n#trs-app .trs-rev__sum { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 16px; font-size: 15px; }\n#trs-app .trs-rev__score { display: flex; align-items: center; gap: 10px; }\n#trs-app .trs-rev__score strong { font-size: 17px; font-weight: 500; }\n#trs-app .trs-gmark { width: 20px; height: 20px; }\n#trs-app .trs-stars { display: inline-flex; gap: 2px; color: var(--trs-star); }\n#trs-app .trs-stars .trs-ico { width: 16px; height: 16px; }\n#trs-app .trs-stars .trs-star--off { color: var(--trs-stone); }\n#trs-app .trs-rev__viewport { position: relative; }\n#trs-app .trs-rev__track {\n  display: grid;\n  grid-auto-flow: column;\n  grid-auto-columns: calc((100% - 48px) \/ 3);\n  gap: 24px;\n  overflow-x: auto;\n  overscroll-behavior-x: contain;\n  scroll-snap-type: x mandatory;\n  scroll-behavior: smooth;\n  scrollbar-width: none;\n  padding: 4px 2px 8px;\n  margin: -4px -2px 0;\n}\n#trs-app .trs-rev__track::-webkit-scrollbar { display: none; }\n#trs-app .trs-rev__track:focus-visible { outline-offset: 2px; }\n#trs-app .trs-card {\n  display: flex;\n  flex-direction: column;\n  scroll-snap-align: start;\n  padding: 24px;\n  background: var(--trs-paper);\n  border: 1px solid var(--trs-line);\n  transition: transform 300ms var(--trs-ease), box-shadow 300ms var(--trs-ease), border-color 300ms ease;\n}\n#trs-app .trs-card__head { display: flex; align-items: center; gap: 12px; }\n#trs-app .trs-avatar {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex: none;\n  width: 42px;\n  height: 42px;\n  border-radius: 50%;\n  background: var(--trs-jade);\n  color: #fff;\n  font-size: 18px;\n  font-weight: 500;\n  line-height: 1;\n}\n#trs-app .trs-avatar--b { background: #7A5A46; }\n#trs-app .trs-avatar--c { background: #4E5E56; }\n#trs-app .trs-avatar--d { background: #8C6A3F; }\n#trs-app .trs-card__who { flex: 1 1 auto; min-width: 0; line-height: 1.3; }\n#trs-app .trs-card__name { display: block; font-size: 16px; font-weight: 500; }\n#trs-app .trs-card__src { display: block; font-size: 13px; color: var(--trs-mute); }\n#trs-app .trs-card .trs-stars { margin-top: 16px; }\n#trs-app .trs-card__text { margin-top: 10px; font-size: 15px; line-height: 1.65; }\n#trs-app .trs-rev__nav { display: flex; gap: 8px; }\n#trs-app .trs-rev__btn {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 46px;\n  height: 46px;\n  border: 1px solid var(--trs-line-strong);\n  color: var(--trs-ink);\n  transition: border-color var(--trs-fast) ease, color var(--trs-fast) ease, opacity var(--trs-fast) ease;\n}\n#trs-app .trs-rev__btn:disabled { opacity: .35; cursor: default; }\n@media (hover: hover) {\n  #trs-app .trs-rev__btn:not(:disabled):hover { border-color: var(--trs-jade); color: var(--trs-jade); }\n  #trs-app .trs-card:hover { transform: translateY(-4px); box-shadow: 0 18px 32px -24px rgba(34, 28, 23, .45); border-color: var(--trs-line-strong); }\n}\n#trs-app .trs-rev__foot { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 16px; margin-top: 24px; }\n#trs-app .trs-carousel-nav { display: flex; gap: 8px; visibility: hidden; }\n#trs-app.trs-js .trs-carousel-nav { visibility: visible; }\n@media (max-width: 1024px) {\n  #trs-app .trs-rev__track { grid-auto-columns: calc((100% - 24px) \/ 2); }\n}\n@media (max-width: 767px) {\n  #trs-app .trs-rev__track { grid-auto-columns: 86%; gap: 14px; }\n  #trs-app .trs-card { padding: 20px; }\n}\n\n\/* =====================================================================\n   12. BOOKING AND ENQUIRY\n   ===================================================================== *\/\n#trs-app .trs-book__grid {\n  display: grid;\n  grid-template-columns: minmax(0, 7fr) minmax(0, 4fr);\n  gap: 48px clamp(40px, 6vw, 96px);\n  align-items: start;\n}\n#trs-app .trs-book__head { margin-bottom: 32px; }\n#trs-app .trs-book__head .trs-lead { margin-top: 14px; }\n#trs-app .trs-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px 20px; }\n#trs-app .trs-field { min-width: 0; }\n#trs-app .trs-field--full { grid-column: 1 \/ -1; }\n#trs-app .trs-label { margin-bottom: 7px; font-size: 15px; font-weight: 400; line-height: 1.4; color: var(--trs-ink); }\n#trs-app .trs-label .trs-req { color: var(--trs-error); margin-left: 2px; }\n#trs-app .trs-label .trs-opt { color: var(--trs-mute); font-size: 14px; }\n#trs-app .trs-input {\n  display: block;\n  width: 100%;\n  min-height: 52px;\n  padding: 12px 14px;\n  border: 1px solid var(--trs-line-strong);\n  background-color: var(--trs-paper);\n  color: var(--trs-ink);\n  font-family: var(--trs-sans);\n  font-size: 16px;\n  font-weight: 400;\n  line-height: 1.4;\n  color-scheme: light;\n  transition: border-color var(--trs-fast) ease, box-shadow var(--trs-fast) ease;\n}\n#trs-app .trs-input::placeholder { color: #8A7D72; opacity: 1; }\n#trs-app .trs-input:focus { border-color: var(--trs-jade); box-shadow: 0 0 0 1px var(--trs-jade); }\n#trs-app select.trs-input {\n  padding-right: 44px;\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23221C17' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'\/%3E%3C\/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: right 16px center;\n  background-size: 14px 14px;\n  cursor: pointer;\n}\n#trs-app input[type=\"date\"].trs-input { cursor: pointer; }\n#trs-app input[type=\"date\"].trs-input::-webkit-date-and-time-value { text-align: left; }\n#trs-app input[type=\"date\"].trs-input::-webkit-calendar-picker-indicator { opacity: .7; cursor: pointer; }\n#trs-app textarea.trs-input { min-height: 112px; resize: vertical; }\n#trs-app .trs-input[aria-invalid=\"true\"] { border-color: var(--trs-error); box-shadow: 0 0 0 1px var(--trs-error); }\n#trs-app .trs-hint { margin-top: 6px; font-size: 14px; line-height: 1.5; color: var(--trs-mute); }\n#trs-app .trs-err { margin-top: 6px; font-size: 14px; line-height: 1.5; color: var(--trs-error); }\n#trs-app .trs-err:empty { display: none; }\n#trs-app .trs-fixed {\n  display: flex;\n  align-items: center;\n  min-height: 52px;\n  padding: 12px 14px;\n  border: 1px dashed var(--trs-line-strong);\n  font-size: 16px;\n  color: var(--trs-ink);\n}\n#trs-app .trs-pricebox {\n  grid-column: 1 \/ -1;\n  padding: 14px 16px;\n  border-left: 2px solid var(--trs-jade);\n  background: rgba(255, 253, 249, .6);\n  font-size: 15px;\n  line-height: 1.55;\n}\n#trs-app .trs-pricebox strong { font-size: 17px; }\n#trs-app .trs-form__submit { grid-column: 1 \/ -1; }\n#trs-app .trs-form__submit .trs-btn { width: 100%; min-height: 56px; font-size: 16px; }\n#trs-app .trs-sent {\n  padding: 16px 18px;\n  border: 1px solid var(--trs-jade);\n  background: var(--trs-paper);\n  font-size: 16px;\n}\n#trs-app .trs-sent a { color: var(--trs-jade); border-bottom: 1px solid currentColor; }\n#trs-app .trs-form__alt { grid-column: 1 \/ -1; font-size: 15px; color: var(--trs-mute); }\n#trs-app .trs-form__alt a { color: var(--trs-jade); border-bottom: 1px solid currentColor; }\n\n\/* Contact column *\/\n#trs-app .trs-contact { padding-top: 6px; }\n#trs-app .trs-contact__title { font-family: var(--trs-serif); font-size: 28px; font-weight: 400; margin-bottom: 8px; }\n#trs-app .trs-clist li {\n  display: grid;\n  grid-template-columns: 24px minmax(0, 1fr);\n  gap: 14px;\n  padding: 18px 0;\n  border-bottom: 1px solid var(--trs-line);\n}\n#trs-app .trs-clist .trs-ico { width: 22px; height: 22px; margin-top: 2px; color: var(--trs-jade); }\n#trs-app .trs-clist__k { display: block; font-size: 14px; color: var(--trs-mute); line-height: 1.4; }\n#trs-app .trs-clist__v { display: block; margin-top: 2px; font-size: 17px; line-height: 1.45; overflow-wrap: anywhere; }\n#trs-app .trs-clist a.trs-clist__v { color: var(--trs-ink); }\n#trs-app .trs-clist a.trs-clist__v span { border-bottom: 1px solid var(--trs-line-strong); transition: border-color var(--trs-fast) ease; }\n@media (hover: hover) {\n  #trs-app .trs-clist a.trs-clist__v:hover span { border-color: var(--trs-jade); }\n}\n@media (max-width: 1024px) {\n  #trs-app .trs-book__grid { grid-template-columns: 1fr; }\n}\n@media (max-width: 767px) {\n  #trs-app .trs-form { grid-template-columns: 1fr; gap: 18px; }\n}\n\n\/* =====================================================================\n   13. FAQ (native details \/ summary)\n   ===================================================================== *\/\n#trs-app .trs-faq__in {\n  display: grid;\n  grid-template-columns: minmax(0, 4fr) minmax(0, 7fr);\n  gap: 32px clamp(40px, 6vw, 112px);\n  align-items: start;\n}\n#trs-app .trs-faq__aside { position: sticky; top: calc(var(--trs-hdr-h) + var(--trs-admin) + 32px); }\n#trs-app .trs-faq__aside .trs-lead { margin-top: 16px; max-width: 34ch; }\n#trs-app .trs-faq__cta { margin-top: 28px; }\n#trs-app .trs-faq__contact { margin-top: 20px; font-size: 15px; color: var(--trs-mute); }\n#trs-app .trs-faq__contact a { color: var(--trs-ink); border-bottom: 1px solid var(--trs-line-strong); }\n@media (max-width: 1024px) {\n  #trs-app .trs-faq__in { grid-template-columns: 1fr; }\n  #trs-app .trs-faq__aside { position: static; }\n}\n#trs-app .trs-faq__list { border-top: 1px solid var(--trs-line-strong); }\n#trs-app .trs-faq__item { border-bottom: 1px solid var(--trs-line); }\n#trs-app .trs-faq__q {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 20px;\n  min-height: 64px;\n  padding: 16px 0;\n  font-family: var(--trs-serif);\n  font-size: clamp(20px, 1.8vw, 23px);\n  font-weight: 500;\n  line-height: 1.3;\n  transition: color var(--trs-fast) ease;\n}\n#trs-app .trs-faq__q .trs-ico { width: 20px; height: 20px; color: var(--trs-jade); transition: transform var(--trs-fast) ease; }\n#trs-app .trs-faq__item[open] > .trs-faq__q .trs-ico { transform: rotate(45deg); }\n@media (hover: hover) {\n  #trs-app .trs-faq__q:hover { color: var(--trs-jade); }\n}\n#trs-app .trs-faq__a { padding: 0 40px 22px 0; font-size: 16px; line-height: 1.7; color: var(--trs-ink); }\n#trs-app .trs-faq__a a { color: var(--trs-jade); border-bottom: 1px solid currentColor; }\n\n\n\/* =====================================================================\n   14. FOOTER (removable)\n   ===================================================================== *\/\n#trs-app .trs-footer {\n  background: var(--trs-jade);\n  color: rgba(250, 246, 240, .82);\n  padding: clamp(56px, 6vw, 88px) 0 28px;\n  font-size: 15px;\n  line-height: 1.7;\n}\n#trs-app .trs-footer__grid {\n  display: grid;\n  grid-template-columns: 1.6fr 1fr 1.2fr 1.3fr;\n  gap: 40px clamp(24px, 3vw, 48px);\n}\n#trs-app .trs-footer__mark { width: 72px; height: 72px; margin-bottom: 16px; border-radius: 50%; }\n#trs-app .trs-footer .trs-brand__name { font-size: 30px; font-weight: 400; color: var(--trs-ivory); }\n#trs-app .trs-footer .trs-brand__tag { color: rgba(250, 246, 240, .72); }\n#trs-app .trs-footer__desc { margin-top: 16px; max-width: 34ch; }\n#trs-app .trs-footer__desc + .trs-footer__desc { margin-top: 10px; color: rgba(250, 246, 240, .72); }\n#trs-app .trs-footer__title { margin-bottom: 12px; font-size: 14px; color: rgba(250, 246, 240, .72); }\n#trs-app .trs-footer__list li + li { margin-top: 8px; }\n#trs-app .trs-footer a { color: var(--trs-ivory); border-bottom: 1px solid transparent; transition: border-color var(--trs-fast) ease; }\n@media (hover: hover) {\n  #trs-app .trs-footer a:hover { border-color: rgba(250, 246, 240, .6); }\n}\n#trs-app .trs-footer :focus-visible { outline-color: var(--trs-ivory); }\n#trs-app .trs-footer address { font-style: normal; }\n#trs-app .trs-footer__base {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  gap: 8px 24px;\n  margin-top: clamp(40px, 5vw, 64px);\n  padding-top: 20px;\n  border-top: 1px solid var(--trs-line-lt);\n  font-size: 14px;\n  color: rgba(250, 246, 240, .72);\n}\n@media (max-width: 1024px) {\n  #trs-app .trs-footer__grid { grid-template-columns: 1fr 1fr; }\n}\n@media (max-width: 767px) {\n  #trs-app .trs-footer__grid { grid-template-columns: 1fr; gap: 32px; }\n  #trs-app .trs-footer__base { padding-bottom: 72px; }\n}\n\n\/* =====================================================================\n   15. FLOATING WHATSAPP BUTTON (removable)\n   Hidden while the booking form is on screen (JS).\n   ===================================================================== *\/\n#trs-app .trs-float {\n  position: fixed;\n  right: 16px;\n  bottom: calc(16px + env(safe-area-inset-bottom, 0px));\n  z-index: 90;\n  display: inline-flex;\n  align-items: center;\n  gap: 10px;\n  min-height: 50px;\n  padding: 10px 20px 10px 16px;\n  background: var(--trs-jade);\n  color: var(--trs-ivory);\n  font-size: 15px;\n  line-height: 1.2;\n  box-shadow: 0 8px 24px -10px rgba(21, 56, 50, .6);\n  transition: background-color var(--trs-fast) ease, opacity 200ms ease, transform 200ms ease, visibility 0s linear 0s;\n}\n#trs-app .trs-float .trs-ico { width: 22px; height: 22px; }\n#trs-app .trs-float.trs-is-hidden {\n  opacity: 0;\n  visibility: hidden;\n  transform: translateY(12px);\n  transition: opacity 200ms ease, transform 200ms ease, visibility 0s linear 200ms;\n}\n@media (hover: hover) {\n  #trs-app .trs-float:hover { background: var(--trs-jade-dk); }\n}\n@media (max-width: 767px) {\n  #trs-app .trs-float { right: 12px; bottom: calc(12px + env(safe-area-inset-bottom, 0px)); padding: 10px 16px 10px 14px; }\n}\n\n\/* =====================================================================\n   16. MOTION\n   - Hero: text rises in on load (pure CSS).\n   - Sections: blocks and list items rise in as they scroll into view.\n     Hidden states apply only under .trs-motion, which the script adds when\n     it runs and the visitor has not asked for reduced motion. Without JS\n     (or with delayed JS) everything is simply visible.\n   - Photos: soft clip reveal; the late-night band drifts slightly on scroll.\n   ===================================================================== *\/\n@keyframes trs-rise {\n  from { opacity: 0; transform: translateY(22px); }\n  to { opacity: 1; transform: none; }\n}\n@keyframes trs-fade {\n  from { opacity: 0; }\n  to { opacity: 1; }\n}\n@keyframes trs-drop {\n  from { opacity: 0; transform: translateY(-8px); }\n  to { opacity: 1; transform: none; }\n}\n#trs-app .trs-hero__title,\n#trs-app .trs-hero__tagline,\n#trs-app .trs-hero__sub,\n#trs-app .trs-hero__card { animation: trs-rise 900ms var(--trs-ease) both; }\n#trs-app .trs-hero__title { animation-delay: 150ms; }\n#trs-app .trs-hero__tagline { animation-delay: 300ms; }\n#trs-app .trs-hero__sub { animation-delay: 440ms; }\n#trs-app .trs-hero__card { animation-delay: 620ms; }\n\n#trs-app.trs-motion [data-trs-reveal] {\n  transition: opacity 800ms var(--trs-ease), transform 800ms var(--trs-ease), clip-path 1100ms var(--trs-ease);\n  transition-delay: var(--trs-delay, 0ms);\n}\n#trs-app.trs-motion [data-trs-reveal]:not(.trs-in) { opacity: 0; transform: translateY(28px); }\n#trs-app.trs-motion [data-trs-reveal=\"photo\"]:not(.trs-in) { opacity: 1; transform: none; clip-path: inset(14% 0 0 0); }\n#trs-app.trs-motion [data-trs-reveal=\"photo\"] img { transition: transform 1400ms var(--trs-ease); }\n#trs-app.trs-motion [data-trs-reveal=\"photo\"]:not(.trs-in) img { transform: scale(1.1); }\n#trs-app.trs-motion [data-trs-reveal=\"photo\"] { clip-path: inset(0 0 0 0); }\n\n\/* Late-night band: the photo is taller than the band so it can drift *\/\n#trs-app.trs-motion .trs-band__img { top: -12%; height: 124%; will-change: transform; }\n\n\/* Floating button slides in once the page has settled *\/\n#trs-app .trs-float:not(.trs-is-hidden) { animation: trs-rise 600ms var(--trs-ease) 800ms both; }\n\n\/* Mobile price switch: new prices fade in *\/\n@media (max-width: 767px) {\n  #trs-app.trs-js .trs-price { animation: trs-fade 260ms ease both; }\n}\n\n\/* FAQ answer and mobile menu open softly *\/\n#trs-app .trs-faq__item[open] > .trs-faq__a { animation: trs-drop 260ms var(--trs-ease) both; }\n#trs-app.trs-js .trs-nav.trs-is-open { animation: trs-drop 220ms var(--trs-ease) both; }\n\n\/* =====================================================================\n   17. REDUCED MOTION AND UTILITIES (keep last)\n   ===================================================================== *\/\n@media (prefers-reduced-motion: reduce) {\n  #trs-app .trs-hero__img,\n  #trs-app .trs-hero__title,\n  #trs-app .trs-hero__tagline,\n  #trs-app .trs-hero__sub,\n  #trs-app .trs-hero__card,\n  #trs-app .trs-float,\n  #trs-app .trs-price,\n  #trs-app .trs-faq__a,\n  #trs-app .trs-nav { animation: none; }\n  #trs-app .trs-spec__ph img,\n  #trs-app .trs-card { transition: none; }\n  #trs-app .trs-rev__track { scroll-behavior: auto; }\n  #trs-app *,\n  #trs-app *::before,\n  #trs-app *::after { transition-duration: 1ms; }\n}\n#trs-app [hidden][hidden] { display: none; }\n<\/style>\n\n<div id=\"trs-app\" class=\"trs-app\">\n\n  <!-- Icon sprite: one line set, 1.5 stroke. WhatsApp and Google marks are filled logos. -->\n  <svg width=\"0\" height=\"0\" style=\"position:absolute;width:0;height:0;overflow:hidden\" aria-hidden=\"true\" focusable=\"false\">\n    <symbol id=\"trs-i-check\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M8.5 12.3l2.4 2.4 4.6-5\"\/><\/symbol>\n    <symbol id=\"trs-i-shield\" viewBox=\"0 0 24 24\"><path d=\"M12 3l7 2.8v5.4c0 4.4-2.9 8.2-7 9.8-4.1-1.6-7-5.4-7-9.8V5.8L12 3z\"\/><path d=\"M9 12l2.1 2.1L15.2 10\"\/><\/symbol>\n    <symbol id=\"trs-i-star\" viewBox=\"0 0 24 24\"><path d=\"M12 3.6l2.6 5.3 5.8.8-4.2 4.1 1 5.8L12 16.9l-5.2 2.7 1-5.8-4.2-4.1 5.8-.8L12 3.6z\"\/><\/symbol>\n    <symbol id=\"trs-i-chat\" viewBox=\"0 0 24 24\"><path d=\"M20 11.5a7.5 7.5 0 0 1-10.9 6.7L4.5 19.5l1.3-4.2A7.5 7.5 0 1 1 20 11.5z\"\/><\/symbol>\n    <symbol id=\"trs-i-calendar\" viewBox=\"0 0 24 24\"><rect x=\"3.5\" y=\"5\" width=\"17\" height=\"15.5\" rx=\"1.5\"\/><path d=\"M3.5 10h17M8 3v4M16 3v4\"\/><\/symbol>\n    <symbol id=\"trs-i-phone\" viewBox=\"0 0 24 24\"><path d=\"M5.2 4h3.2l1.6 4-2.1 1.3a11 11 0 0 0 6.8 6.8L16 14l4 1.6v3.2a1.7 1.7 0 0 1-1.8 1.7A15.6 15.6 0 0 1 3.5 5.8 1.7 1.7 0 0 1 5.2 4z\"\/><\/symbol>\n    <symbol id=\"trs-i-mail\" viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"1.5\"\/><path d=\"M3.8 6.2L12 12.5l8.2-6.3\"\/><\/symbol>\n    <symbol id=\"trs-i-pin\" viewBox=\"0 0 24 24\"><path d=\"M12 21s-6.5-5.9-6.5-11a6.5 6.5 0 0 1 13 0c0 5.1-6.5 11-6.5 11z\"\/><circle cx=\"12\" cy=\"10\" r=\"2.4\"\/><\/symbol>\n    <symbol id=\"trs-i-clock\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 7.5V12l3 2\"\/><\/symbol>\n    <symbol id=\"trs-i-search\" viewBox=\"0 0 24 24\"><circle cx=\"11\" cy=\"11\" r=\"6.5\"\/><path d=\"M20 20l-4.3-4.3\"\/><\/symbol>\n    <symbol id=\"trs-i-left\" viewBox=\"0 0 24 24\"><path d=\"M14.5 5.5L8 12l6.5 6.5\"\/><\/symbol>\n    <symbol id=\"trs-i-right\" viewBox=\"0 0 24 24\"><path d=\"M9.5 5.5L16 12l-6.5 6.5\"\/><\/symbol>\n    <symbol id=\"trs-i-plus\" viewBox=\"0 0 24 24\"><path d=\"M12 5v14M5 12h14\"\/><\/symbol>\n    <symbol id=\"trs-i-menu\" viewBox=\"0 0 24 24\"><path d=\"M4 7h16M4 12h16M4 17h16\"\/><\/symbol>\n    <symbol id=\"trs-i-close\" viewBox=\"0 0 24 24\"><path d=\"M6 6l12 12M18 6L6 18\"\/><\/symbol>\n    <symbol id=\"trs-i-whatsapp\" viewBox=\"0 0 24 24\"><path d=\"M17.47 14.38c-.3-.15-1.76-.87-2.03-.97-.27-.1-.47-.15-.67.15-.2.3-.77.97-.94 1.16-.17.2-.35.22-.64.08-.3-.15-1.26-.46-2.39-1.48-.88-.79-1.48-1.76-1.65-2.06-.17-.3-.02-.46.13-.6.13-.14.3-.35.45-.52.15-.17.2-.3.3-.5.1-.2.05-.37-.03-.52-.07-.15-.67-1.61-.92-2.2-.24-.58-.49-.5-.67-.51h-.57c-.2 0-.52.07-.79.37-.27.3-1.04 1.02-1.04 2.48 0 1.46 1.07 2.88 1.21 3.07.15.2 2.1 3.2 5.08 4.49.71.3 1.26.49 1.7.63.71.22 1.36.19 1.87.12.57-.09 1.76-.72 2-1.41.25-.7.25-1.29.18-1.41-.08-.13-.28-.2-.57-.35zm-5.42 7.4h-.01a9.87 9.87 0 0 1-5.03-1.38l-.36-.21-3.74.98 1-3.65-.24-.37a9.86 9.86 0 0 1-1.51-5.26c0-5.45 4.44-9.88 9.89-9.88 2.64 0 5.12 1.03 6.99 2.9a9.83 9.83 0 0 1 2.89 6.99c0 5.45-4.44 9.88-9.88 9.88zm8.41-18.3A11.82 11.82 0 0 0 12.05 0C5.5 0 .16 5.34.16 11.89c0 2.1.55 4.14 1.59 5.95L.06 24l6.3-1.65a11.88 11.88 0 0 0 5.68 1.45h.01c6.55 0 11.89-5.34 11.89-11.89 0-3.18-1.24-6.16-3.48-8.41z\"\/><\/symbol>\n    <symbol id=\"trs-i-google\" viewBox=\"0 0 48 48\"><path fill=\"#FFC107\" d=\"M43.6 20.5H42V20H24v8h11.3C33.7 32.7 29.2 36 24 36c-6.6 0-12-5.4-12-12s5.4-12 12-12c3.1 0 5.8 1.2 7.9 3.1l5.7-5.7C34 6.1 29.3 4 24 4 12.9 4 4 12.9 4 24s8.9 20 20 20 20-8.9 20-20c0-1.3-.1-2.4-.4-3.5z\"\/><path fill=\"#FF3D00\" d=\"M6.3 14.7l6.6 4.8C14.7 15.1 19 12 24 12c3.1 0 5.8 1.2 7.9 3.1l5.7-5.7C34 6.1 29.3 4 24 4 16.3 4 9.7 8.3 6.3 14.7z\"\/><path fill=\"#4CAF50\" d=\"M24 44c5.2 0 9.9-2 13.4-5.2l-6.2-5.2C29.2 35.1 26.7 36 24 36c-5.2 0-9.6-3.3-11.3-8l-6.5 5C9.5 39.6 16.2 44 24 44z\"\/><path fill=\"#1976D2\" d=\"M43.6 20.5H42V20H24v8h11.3c-.8 2.2-2.2 4.2-4.1 5.6l6.2 5.2C37 39.2 44 34 44 24c0-1.3-.1-2.4-.4-3.5z\"\/><\/symbol>\n  <\/svg>\n\n  <!-- TRS HEADER START -->\n  <header class=\"trs-header\" data-trs-header>\n    <div class=\"trs-wrap trs-header__in\">\n      <a class=\"trs-brand\" href=\"#trs-top\" aria-label=\"Thara Royale Spa, back to top\">\n        <img fetchpriority=\"high\" class=\"trs-brand__mark\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-logo-badge.png\" width=\"240\" height=\"240\" alt=\"\" loading=\"eager\" decoding=\"async\">\n        <span class=\"trs-brand__text\">\n          <span class=\"trs-brand__name\">Thara Royale Spa<\/span>\n          <span class=\"trs-brand__tag\">Outcall spa, Kuala Lumpur<\/span>\n        <\/span>\n      <\/a>\n      <div class=\"trs-header__right\">\n        <a class=\"trs-btn trs-btn--small\" href=\"#trs-book\">Book now<\/a>\n        <button class=\"trs-menu-btn\" type=\"button\" aria-expanded=\"false\" aria-controls=\"trs-nav\">\n          <svg class=\"trs-ico trs-ico--open\" aria-hidden=\"true\"><use href=\"#trs-i-menu\"\/><\/svg>\n          <svg class=\"trs-ico trs-ico--close\" aria-hidden=\"true\"><use href=\"#trs-i-close\"\/><\/svg>\n          <span class=\"trs-menu-btn__label\">Menu<\/span>\n        <\/button>\n      <\/div>\n      <nav class=\"trs-nav\" id=\"trs-nav\" aria-label=\"Page sections\">\n        <ul class=\"trs-nav__list\">\n          <li><a class=\"trs-nav__link\" href=\"#trs-treatments\">Treatments<\/a><\/li>\n          <li><a class=\"trs-nav__link\" href=\"#trs-areas\">Areas<\/a><\/li>\n          <li><a class=\"trs-nav__link\" href=\"#trs-hotels\">Hotels<\/a><\/li>\n          <li><a class=\"trs-nav__link\" href=\"#trs-reviews\">Reviews<\/a><\/li>\n          <li><a class=\"trs-nav__link\" href=\"#trs-faq\">FAQ<\/a><\/li>\n        <\/ul>\n      <\/nav>\n    <\/div>\n  <\/header>\n  <!-- TRS HEADER END -->\n\n  <!-- ============================ HERO ============================ -->\n  <section class=\"trs-hero\" id=\"trs-top\" aria-labelledby=\"trs-hero-title\">\n    <img fetchpriority=\"high\" class=\"trs-hero__img trs-photo\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-hero-outcall-massage-kl.webp\" width=\"2000\" height=\"1333\" alt=\"A massage therapist's hands working along a guest's back during an outcall massage, next to a bright window\" loading=\"eager\" fetchpriority=\"high\" decoding=\"async\">\n    <div class=\"trs-hero__scrim\" aria-hidden=\"true\"><\/div>\n    <div class=\"trs-wrap trs-hero__in\">\n      <div class=\"trs-hero__text\">\n        <h1 class=\"trs-hero__h1\" id=\"trs-hero-title\">\n          <span class=\"trs-hero__title\">Where The Spa Comes To You<\/span>\n          <span class=\"trs-hero__tagline\">Professional Massage in KL<\/span>\n        <\/h1>\n        <p class=\"trs-hero__sub\">Outcall massage, facials and body treatments in your home, condo or hotel room across Kuala Lumpur, from KLCC and Bukit Bintang to Mont Kiara and Bangsar.<\/p>\n      <\/div>\n\n      <div class=\"trs-hero__card\">\n        <p class=\"trs-hero__open\"><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-calendar\"\/><\/svg>Open every day<\/p>\n        <p class=\"trs-hero__hours\">10 AM \u2013 2 AM<\/p>\n        <ul class=\"trs-values\">\n          <li><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-check\"\/><\/svg>Independent therapists who come to you<\/li>\n          <li><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-shield\"\/><\/svg>Strictly professional wellness care<\/li>\n          <li><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg>Trusted by KL locals and visitors<\/li>\n        <\/ul>\n        <a class=\"trs-btn trs-hero__cta\" href=\"#trs-book\"><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-chat\"\/><\/svg>Book your session<\/a>\n        <p class=\"trs-hero__wa\">Or WhatsApp <a href=\"https:\/\/wa.me\/601163907115?text=Hi%20Thara%20Royale%20Spa%2C%20I%27d%20like%20to%20make%20a%20booking.\" target=\"_blank\" rel=\"noopener\" data-trs-wa=\"hero\">+60 11-6390 7115<\/a><\/p>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- ========================= WHAT WE DO ========================= -->\n  <section class=\"trs-section trs-section--beige\" id=\"trs-services\" aria-labelledby=\"trs-services-title\">\n    <div class=\"trs-wrap\">\n      <div class=\"trs-services__intro\">\n        <h2 class=\"trs-h2\" id=\"trs-services-title\">Home and hotel spa treatments in KL<\/h2>\n        <p class=\"trs-lead\">Massage, facials, body scrubs and nail care, done in the room you are already in: your home, your condo or your hotel room.<\/p>\n      <\/div>\n\n      <div class=\"trs-spec\">\n        <div class=\"trs-spec__ph\">\n          <img loading=\"lazy\" class=\"trs-photo\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-massage.webp\" width=\"2000\" height=\"3000\" alt=\"A massage therapist's hands working across a guest's shoulder in soft window light\" loading=\"lazy\" decoding=\"async\">\n        <\/div>\n        <div class=\"trs-spec__tx\">\n          <h3 class=\"trs-h3\">Massage at home or in your hotel room<\/h3>\n          <p class=\"trs-lead\">Body and foot massage, from relaxing aromatherapy and Balinese to deep tissue, Thai and traditional urut. Choose 60, 90 or 120 minutes, from RM160.<\/p>\n          <ul class=\"trs-tags\" aria-label=\"Massage treatments\">\n            <li>Relaxing massage<\/li>\n            <li>Aromatherapy massage<\/li>\n            <li>Balinese massage<\/li>\n            <li>Deep tissue massage<\/li>\n            <li>Dry massage<\/li>\n            <li>Thai massage<\/li>\n            <li>Traditional massage<\/li>\n            <li>Foot massage<\/li>\n          <\/ul>\n          <a class=\"trs-link\" href=\"#trs-treatments\">See massage prices<\/a>\n        <\/div>\n      <\/div>\n\n      <div class=\"trs-spec trs-spec--flip\">\n        <div class=\"trs-spec__ph\">\n          <img loading=\"lazy\" class=\"trs-photo\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-facial.webp\" width=\"2000\" height=\"1333\" alt=\"A therapist brushes a clay mask onto a guest's face during a facial\" loading=\"lazy\" decoding=\"async\">\n        <\/div>\n        <div class=\"trs-spec__tx\">\n          <h3 class=\"trs-h3\">Facials, body scrubs and nail care at home<\/h3>\n          <p class=\"trs-lead\">From a 30-minute basic facial to a 90-minute lifting facial, plus body scrub, body bleaching, manicure and pedicure, at your home or hotel.<\/p>\n          <ul class=\"trs-tags\" aria-label=\"Face, body and nail treatments\">\n            <li>Basic facial<\/li>\n            <li>Double cleansing facial<\/li>\n            <li>Lifting facial<\/li>\n            <li>Body scrub<\/li>\n            <li>Body bleaching<\/li>\n            <li>Manicure<\/li>\n            <li>Pedicure<\/li>\n          <\/ul>\n          <a class=\"trs-link\" href=\"#trs-menu-singles\">See face, body and nail prices<\/a>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- ===================== TREATMENTS & PRICES ===================== -->\n  <!-- Prices live ONLY in the data-trs-prices attributes and the visible text beside them.\n       The booking form reads data-trs-prices, so edit both here when a price changes. -->\n  <!-- CONFIRM: the one-line treatment descriptions were written for the page; ask the client to check them. -->\n  <section class=\"trs-section\" id=\"trs-treatments\" aria-labelledby=\"trs-treatments-title\">\n    <div class=\"trs-wrap\">\n      <div class=\"trs-menu-head\">\n        <h2 class=\"trs-h2\" id=\"trs-treatments-title\">Massage and spa prices<\/h2>\n        <p class=\"trs-lead\">Outcall massage in KL from RM160 for 60 minutes. Prices are per session; choose a price to book that treatment and length.<\/p>\n      <\/div>\n\n      <div class=\"trs-menu\" data-trs-dur=\"60\">\n        <h3 class=\"trs-menu-cat\" id=\"trs-menu-massage\">Massage<\/h3>\n\n        <fieldset class=\"trs-pswitch\">\n          <legend class=\"trs-sr\">Show massage prices for<\/legend>\n          <div class=\"trs-pswitch__opts\">\n            <label class=\"trs-pswitch__opt\"><input type=\"radio\" name=\"trs-price-dur\" value=\"60\" checked><span>60 min<\/span><\/label>\n            <label class=\"trs-pswitch__opt\"><input type=\"radio\" name=\"trs-price-dur\" value=\"90\"><span>90 min<\/span><\/label>\n            <label class=\"trs-pswitch__opt\"><input type=\"radio\" name=\"trs-price-dur\" value=\"120\"><span>120 min<\/span><\/label>\n          <\/div>\n        <\/fieldset>\n\n        <div class=\"trs-mhead\" aria-hidden=\"true\">\n          <span><\/span>\n          <span class=\"trs-mhead__dur\">60 min<\/span>\n          <span class=\"trs-mhead__dur\">90 min<\/span>\n          <span class=\"trs-mhead__dur\">120 min<\/span>\n        <\/div>\n\n        <ul class=\"trs-mlist\" aria-labelledby=\"trs-menu-massage\">\n          <li class=\"trs-mrow\" data-trs-service=\"Relaxing \/ Aromatherapy \/ Balinese Massage\" data-trs-prices='{\"60\":160,\"90\":230,\"120\":260}'>\n            <div>\n              <h4 class=\"trs-mrow__name\">Relaxing \/ Aromatherapy \/ Balinese Massage<\/h4>\n              <p class=\"trs-mrow__desc\">Oil massage at an easy pace. Aromatherapy adds scented oil; Balinese adds kneading and gentle stretches.<\/p>\n              <p class=\"trs-mrow__as\">Book as:<a href=\"#trs-book\" data-trs-book=\"Relaxing Massage\">Relaxing<\/a><a href=\"#trs-book\" data-trs-book=\"Aromatherapy Massage\">Aromatherapy<\/a><a href=\"#trs-book\" data-trs-book=\"Balinese Massage\">Balinese<\/a><\/p>\n            <\/div>\n            <div class=\"trs-mrow__prices\">\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Relaxing Massage\" data-trs-dur=\"60\" aria-label=\"Book Relaxing Massage, 60 minutes, RM160\"><span class=\"trs-price__dur\">60 min<\/span><span class=\"trs-price__amt\">RM160<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Relaxing Massage\" data-trs-dur=\"90\" aria-label=\"Book Relaxing Massage, 90 minutes, RM230\"><span class=\"trs-price__dur\">90 min<\/span><span class=\"trs-price__amt\">RM230<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Relaxing Massage\" data-trs-dur=\"120\" aria-label=\"Book Relaxing Massage, 120 minutes, RM260\"><span class=\"trs-price__dur\">120 min<\/span><span class=\"trs-price__amt\">RM260<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n            <\/div>\n          <\/li>\n          <li class=\"trs-mrow\" data-trs-service=\"Deep Tissue Massage\" data-trs-prices='{\"60\":190,\"90\":250,\"120\":300}'>\n            <div>\n              <h4 class=\"trs-mrow__name\">Deep Tissue Massage<\/h4>\n              <p class=\"trs-mrow__desc\">Slow, firm pressure worked into the shoulders, back and legs.<\/p>\n            <\/div>\n            <div class=\"trs-mrow__prices\">\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Deep Tissue Massage\" data-trs-dur=\"60\" aria-label=\"Book Deep Tissue Massage, 60 minutes, RM190\"><span class=\"trs-price__dur\">60 min<\/span><span class=\"trs-price__amt\">RM190<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Deep Tissue Massage\" data-trs-dur=\"90\" aria-label=\"Book Deep Tissue Massage, 90 minutes, RM250\"><span class=\"trs-price__dur\">90 min<\/span><span class=\"trs-price__amt\">RM250<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Deep Tissue Massage\" data-trs-dur=\"120\" aria-label=\"Book Deep Tissue Massage, 120 minutes, RM300\"><span class=\"trs-price__dur\">120 min<\/span><span class=\"trs-price__amt\">RM300<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n            <\/div>\n          <\/li>\n          <li class=\"trs-mrow\" data-trs-service=\"Dry Massage\" data-trs-prices='{\"60\":200,\"90\":260,\"120\":300}'>\n            <div>\n              <h4 class=\"trs-mrow__name\">Dry Massage<\/h4>\n              <p class=\"trs-mrow__desc\">No oil, so nothing to wash off afterwards. Firm kneading and pressure.<\/p>\n            <\/div>\n            <div class=\"trs-mrow__prices\">\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Dry Massage\" data-trs-dur=\"60\" aria-label=\"Book Dry Massage, 60 minutes, RM200\"><span class=\"trs-price__dur\">60 min<\/span><span class=\"trs-price__amt\">RM200<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Dry Massage\" data-trs-dur=\"90\" aria-label=\"Book Dry Massage, 90 minutes, RM260\"><span class=\"trs-price__dur\">90 min<\/span><span class=\"trs-price__amt\">RM260<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Dry Massage\" data-trs-dur=\"120\" aria-label=\"Book Dry Massage, 120 minutes, RM300\"><span class=\"trs-price__dur\">120 min<\/span><span class=\"trs-price__amt\">RM300<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n            <\/div>\n          <\/li>\n          <li class=\"trs-mrow\" data-trs-service=\"Thai Massage\" data-trs-prices='{\"60\":220,\"90\":260,\"120\":300}'>\n            <div>\n              <h4 class=\"trs-mrow__name\">Thai Massage<\/h4>\n              <p class=\"trs-mrow__desc\">No oil. Assisted stretching and rhythmic pressure.<\/p>\n            <\/div>\n            <div class=\"trs-mrow__prices\">\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Thai Massage\" data-trs-dur=\"60\" aria-label=\"Book Thai Massage, 60 minutes, RM220\"><span class=\"trs-price__dur\">60 min<\/span><span class=\"trs-price__amt\">RM220<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Thai Massage\" data-trs-dur=\"90\" aria-label=\"Book Thai Massage, 90 minutes, RM260\"><span class=\"trs-price__dur\">90 min<\/span><span class=\"trs-price__amt\">RM260<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Thai Massage\" data-trs-dur=\"120\" aria-label=\"Book Thai Massage, 120 minutes, RM300\"><span class=\"trs-price__dur\">120 min<\/span><span class=\"trs-price__amt\">RM300<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n            <\/div>\n          <\/li>\n          <li class=\"trs-mrow\" data-trs-service=\"Traditional Massage\" data-trs-prices='{\"60\":190,\"90\":240,\"120\":290}'>\n            <div>\n              <h4 class=\"trs-mrow__name\">Traditional Massage<\/h4>\n              <p class=\"trs-mrow__desc\">Urut tradisional: firm, rhythmic strokes with oil, in the Malay style.<\/p>\n            <\/div>\n            <div class=\"trs-mrow__prices\">\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Traditional Massage\" data-trs-dur=\"60\" aria-label=\"Book Traditional Massage, 60 minutes, RM190\"><span class=\"trs-price__dur\">60 min<\/span><span class=\"trs-price__amt\">RM190<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Traditional Massage\" data-trs-dur=\"90\" aria-label=\"Book Traditional Massage, 90 minutes, RM240\"><span class=\"trs-price__dur\">90 min<\/span><span class=\"trs-price__amt\">RM240<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Traditional Massage\" data-trs-dur=\"120\" aria-label=\"Book Traditional Massage, 120 minutes, RM290\"><span class=\"trs-price__dur\">120 min<\/span><span class=\"trs-price__amt\">RM290<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n            <\/div>\n          <\/li>\n          <li class=\"trs-mrow\" data-trs-service=\"Foot Massage\" data-trs-prices='{\"60\":190,\"90\":250,\"120\":280}'>\n            <div>\n              <h4 class=\"trs-mrow__name\">Foot Massage<\/h4>\n              <p class=\"trs-mrow__desc\">Pressure and kneading through the feet and lower legs.<\/p>\n            <\/div>\n            <div class=\"trs-mrow__prices\">\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Foot Massage\" data-trs-dur=\"60\" aria-label=\"Book Foot Massage, 60 minutes, RM190\"><span class=\"trs-price__dur\">60 min<\/span><span class=\"trs-price__amt\">RM190<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Foot Massage\" data-trs-dur=\"90\" aria-label=\"Book Foot Massage, 90 minutes, RM250\"><span class=\"trs-price__dur\">90 min<\/span><span class=\"trs-price__amt\">RM250<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n              <a class=\"trs-price\" href=\"#trs-book\" data-trs-book=\"Foot Massage\" data-trs-dur=\"120\" aria-label=\"Book Foot Massage, 120 minutes, RM280\"><span class=\"trs-price__dur\">120 min<\/span><span class=\"trs-price__amt\">RM280<\/span><span class=\"trs-price__cta\">Book<\/span><\/a>\n            <\/div>\n          <\/li>\n        <\/ul>\n      <\/div>\n\n      <!-- Face, body and nails: swipeable photo cards. Each card carries its own data-trs-prices. -->\n      <div class=\"trs-scards\" id=\"trs-menu-singles\">\n        <div class=\"trs-scards__head\">\n          <div>\n            <h3 class=\"trs-menu-cat\" id=\"trs-menu-more\">Face, body and nails<\/h3>\n            <p class=\"trs-scards__lead\">Facials, body treatments, manicure and pedicure at home, each with a set length.<\/p>\n          <\/div>\n          <div class=\"trs-carousel-nav\">\n            <button class=\"trs-rev__btn\" type=\"button\" data-trs-step=\"-1\" aria-controls=\"trs-scard-track\" aria-label=\"Previous treatments\"><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-left\"\/><\/svg><\/button>\n            <button class=\"trs-rev__btn\" type=\"button\" data-trs-step=\"1\" aria-controls=\"trs-scard-track\" aria-label=\"Next treatments\"><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-right\"\/><\/svg><\/button>\n          <\/div>\n        <\/div>\n        <ul class=\"trs-scards__track\" id=\"trs-scard-track\" tabindex=\"0\" aria-labelledby=\"trs-menu-more\">\n          <li class=\"trs-scard\" data-trs-service=\"Basic Facial\" data-trs-prices='{\"30\":120}'>\n            <img loading=\"lazy\" class=\"trs-scard__img\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-basic-facial.webp\" width=\"1200\" height=\"800\" style=\"object-position:72% 50%\" alt=\"A therapist applies a cream mask during a basic facial\" loading=\"lazy\" decoding=\"async\">\n            <div class=\"trs-scard__body\">\n              <p class=\"trs-scard__meta\"><span>Face<\/span><span>30 min<\/span><\/p>\n              <h4 class=\"trs-scard__name\">Basic Facial<\/h4>\n              <p class=\"trs-scard__desc\">Cleanse, gentle exfoliation and a mask.<\/p>\n              <div class=\"trs-scard__foot\">\n                <span class=\"trs-scard__price\">RM120<\/span>\n                <a class=\"trs-scard__book\" href=\"#trs-book\" data-trs-book=\"Basic Facial\" aria-label=\"Book Basic Facial, 30 minutes, RM120\">Book<\/a>\n              <\/div>\n            <\/div>\n          <\/li>\n          <li class=\"trs-scard\" data-trs-service=\"Double Cleansing Facial\" data-trs-prices='{\"60\":220}'>\n            <img loading=\"lazy\" class=\"trs-scard__img\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-double-cleansing.webp\" width=\"1200\" height=\"1800\" style=\"object-position:50% 40%\" alt=\"A guest's face covered in cleansing foam during a double cleansing facial\" loading=\"lazy\" decoding=\"async\">\n            <div class=\"trs-scard__body\">\n              <p class=\"trs-scard__meta\"><span>Face<\/span><span>60 min<\/span><\/p>\n              <h4 class=\"trs-scard__name\">Double Cleansing Facial<\/h4>\n              <p class=\"trs-scard__desc\">Oil-based then water-based cleanse, finished with a mask.<\/p>\n              <div class=\"trs-scard__foot\">\n                <span class=\"trs-scard__price\">RM220<\/span>\n                <a class=\"trs-scard__book\" href=\"#trs-book\" data-trs-book=\"Double Cleansing Facial\" aria-label=\"Book Double Cleansing Facial, 60 minutes, RM220\">Book<\/a>\n              <\/div>\n            <\/div>\n          <\/li>\n          <li class=\"trs-scard\" data-trs-service=\"Lifting Facial\" data-trs-prices='{\"90\":260}'>\n            <img loading=\"lazy\" class=\"trs-scard__img\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-lifting-facial.webp\" width=\"1200\" height=\"1800\" style=\"object-position:50% 30%\" alt=\"A therapist massages a guest's temples during a lifting facial\" loading=\"lazy\" decoding=\"async\">\n            <div class=\"trs-scard__body\">\n              <p class=\"trs-scard__meta\"><span>Face<\/span><span>90 min<\/span><\/p>\n              <h4 class=\"trs-scard__name\">Lifting Facial<\/h4>\n              <p class=\"trs-scard__desc\">A longer facial with massage along the face and neck.<\/p>\n              <div class=\"trs-scard__foot\">\n                <span class=\"trs-scard__price\">RM260<\/span>\n                <a class=\"trs-scard__book\" href=\"#trs-book\" data-trs-book=\"Lifting Facial\" aria-label=\"Book Lifting Facial, 90 minutes, RM260\">Book<\/a>\n              <\/div>\n            <\/div>\n          <\/li>\n          <li class=\"trs-scard\" data-trs-service=\"Body Scrub\" data-trs-prices='{\"40\":80}'>\n            <img loading=\"lazy\" class=\"trs-scard__img\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-body-scrub.webp\" width=\"1200\" height=\"1800\" style=\"object-position:50% 55%\" alt=\"Body scrub jars and a natural bristle body brush on a wooden bench\" loading=\"lazy\" decoding=\"async\">\n            <div class=\"trs-scard__body\">\n              <p class=\"trs-scard__meta\"><span>Body<\/span><span>40 min<\/span><\/p>\n              <h4 class=\"trs-scard__name\">Body Scrub<\/h4>\n              <p class=\"trs-scard__desc\">Full-body exfoliation that leaves skin feeling smooth.<\/p>\n              <div class=\"trs-scard__foot\">\n                <span class=\"trs-scard__price\">RM80<\/span>\n                <a class=\"trs-scard__book\" href=\"#trs-book\" data-trs-book=\"Body Scrub\" aria-label=\"Book Body Scrub, 40 minutes, RM80\">Book<\/a>\n              <\/div>\n            <\/div>\n          <\/li>\n          <li class=\"trs-scard\" data-trs-service=\"Body Bleaching\" data-trs-prices='{\"30\":160}'>\n            <img loading=\"lazy\" class=\"trs-scard__img\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-body-bleaching.webp\" width=\"1200\" height=\"779\" style=\"object-position:55% 50%\" alt=\"A brightening body cream being applied to the legs\" loading=\"lazy\" decoding=\"async\">\n            <div class=\"trs-scard__body\">\n              <p class=\"trs-scard__meta\"><span>Body<\/span><span>30 min<\/span><\/p>\n              <h4 class=\"trs-scard__name\">Body Bleaching<\/h4>\n              <p class=\"trs-scard__desc\">A skin-brightening body treatment for the areas you choose.<\/p>\n              <div class=\"trs-scard__foot\">\n                <span class=\"trs-scard__price\">RM160<\/span>\n                <a class=\"trs-scard__book\" href=\"#trs-book\" data-trs-book=\"Body Bleaching\" aria-label=\"Book Body Bleaching, 30 minutes, RM160\">Book<\/a>\n              <\/div>\n            <\/div>\n          <\/li>\n          <li class=\"trs-scard\" data-trs-service=\"Basic Manicure\" data-trs-prices='{\"40\":90}'>\n            <img loading=\"lazy\" class=\"trs-scard__img\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-manicure.webp\" width=\"1200\" height=\"800\" style=\"object-position:45% 50%\" alt=\"A manicurist tidies a guest's nails during a manicure\" loading=\"lazy\" decoding=\"async\">\n            <div class=\"trs-scard__body\">\n              <p class=\"trs-scard__meta\"><span>Nails<\/span><span>40 min<\/span><\/p>\n              <h4 class=\"trs-scard__name\">Basic Manicure<\/h4>\n              <p class=\"trs-scard__desc\">Nails shaped and tidied, with cuticle care.<\/p>\n              <div class=\"trs-scard__foot\">\n                <span class=\"trs-scard__price\">RM90<\/span>\n                <a class=\"trs-scard__book\" href=\"#trs-book\" data-trs-book=\"Basic Manicure\" aria-label=\"Book Basic Manicure, 40 minutes, RM90\">Book<\/a>\n              <\/div>\n            <\/div>\n          <\/li>\n          <li class=\"trs-scard\" data-trs-service=\"Basic Pedicure\" data-trs-prices='{\"40\":100}'>\n            <img loading=\"lazy\" class=\"trs-scard__img\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-pedicure.webp\" width=\"1200\" height=\"800\" style=\"object-position:50% 55%\" alt=\"Feet soaking in clear water before a pedicure\" loading=\"lazy\" decoding=\"async\">\n            <div class=\"trs-scard__body\">\n              <p class=\"trs-scard__meta\"><span>Nails<\/span><span>40 min<\/span><\/p>\n              <h4 class=\"trs-scard__name\">Basic Pedicure<\/h4>\n              <p class=\"trs-scard__desc\">Toenails shaped and tidied, with cuticle care.<\/p>\n              <div class=\"trs-scard__foot\">\n                <span class=\"trs-scard__price\">RM100<\/span>\n                <a class=\"trs-scard__book\" href=\"#trs-book\" data-trs-book=\"Basic Pedicure\" aria-label=\"Book Basic Pedicure, 40 minutes, RM100\">Book<\/a>\n              <\/div>\n            <\/div>\n          <\/li>\n        <\/ul>\n      <\/div>\n\n      <div class=\"trs-menu-notes\">\n        <p>All prices are subject to availability.<\/p>\n        <p>Additional charges may apply for locations outside Kuala Lumpur.<\/p>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- ========================= HOW IT WORKS ========================= -->\n  <section class=\"trs-section trs-section--beige\" id=\"trs-how\" aria-labelledby=\"trs-how-title\">\n    <div class=\"trs-wrap\">\n      <div class=\"trs-how__head\">\n        <h2 class=\"trs-h2\" id=\"trs-how-title\">How to book a home massage<\/h2>\n        <p class=\"trs-lead\">Three steps, all on this page and in WhatsApp.<\/p>\n      <\/div>\n      <ol class=\"trs-steps\">\n        <li class=\"trs-step\">\n          <span class=\"trs-step__n\" aria-hidden=\"true\">1<\/span>\n          <h3 class=\"trs-step__t\">Choose your treatment<\/h3>\n          <p>Pick a treatment, date and time in the booking form below.<\/p>\n        <\/li>\n        <li class=\"trs-step\">\n          <span class=\"trs-step__n\" aria-hidden=\"true\">2<\/span>\n          <h3 class=\"trs-step__t\">Send it on WhatsApp<\/h3>\n          <p>The form opens WhatsApp with your details filled in. Send it, and we reply to confirm.<\/p>\n        <\/li>\n        <li class=\"trs-step\">\n          <span class=\"trs-step__n\" aria-hidden=\"true\">3<\/span>\n          <h3 class=\"trs-step__t\">Your therapist comes to you<\/h3>\n          <p>To your home, condo or hotel room in Kuala Lumpur, at the time we confirmed.<\/p>\n        <\/li>\n      <\/ol>\n    <\/div>\n  <\/section>\n\n  <!-- ======================== AREAS WE COVER ======================== -->\n  <section class=\"trs-section\" id=\"trs-areas\" aria-labelledby=\"trs-areas-title\">\n    <div class=\"trs-wrap\">\n      <div class=\"trs-areas__top\">\n        <div>\n          <h2 class=\"trs-h2\" id=\"trs-areas-title\">Outcall massage areas in Kuala Lumpur<\/h2>\n          <p class=\"trs-lead\">We're based around KLCC and Bukit Bintang, and bring massage and spa treatments to 20 areas across Kuala Lumpur and nearby, including Bangsar, Mont Kiara and Petaling Jaya.<\/p>\n        <\/div>\n        <ul class=\"trs-home\" aria-label=\"Home base\">\n          <li><span class=\"trs-home__name\">KLCC<\/span><span class=\"trs-home__cap\">Our home base<\/span><\/li>\n          <li><span class=\"trs-home__name\">Bukit Bintang<\/span><span class=\"trs-home__cap\">Our home base<\/span><\/li>\n        <\/ul>\n      <\/div>\n\n      <ul class=\"trs-alist\" aria-label=\"Other areas we cover\">\n        <li>Bangsar<\/li>\n        <li>Mont Kiara<\/li>\n        <li>Sri Hartamas<\/li>\n        <li>Damansara Heights<small>Bukit Damansara<\/small><\/li>\n        <li>Bukit Tunku<small>Kenny Hills<\/small><\/li>\n        <li>Titiwangsa<\/li>\n        <li>Ampang<\/li>\n        <li>Bangsar South<\/li>\n        <li>Brickfields \/ KL Sentral<\/li>\n        <li>TRX<small>Tun Razak Exchange<\/small><\/li>\n        <li>Petaling Jaya<\/li>\n        <li>Cheras<\/li>\n        <li>Setapak<\/li>\n        <li>Seputeh<\/li>\n        <li>Damansara Utama<\/li>\n        <li>Melawati<\/li>\n        <li>Gombak<\/li>\n        <li>Segambut<\/li>\n      <\/ul>\n\n      <div class=\"trs-areas__foot\">\n        <a class=\"trs-link\" href=\"https:\/\/wa.me\/601163907115?text=Hi%20Thara%20Royale%20Spa%2C%20do%20you%20cover%20my%20area%3F\" target=\"_blank\" rel=\"noopener\" data-trs-wa=\"areas\">Not on the list? Ask us on WhatsApp<\/a>\n        <!-- CONFIRM: which listed areas (Petaling Jaya, Damansara Utama, Gombak, parts of Melawati are in Selangor) carry the outside-KL charge, and how much -->\n        <p class=\"trs-note\">Additional charges may apply for locations outside Kuala Lumpur.<\/p>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- ==================== HOTELS & SERVICED SUITES ==================== -->\n  <section class=\"trs-section trs-section--beige trs-hotels\" id=\"trs-hotels\" aria-labelledby=\"trs-hotels-title\">\n    <div class=\"trs-wrap\">\n      <div class=\"trs-hotels__top\">\n        <div>\n          <h2 class=\"trs-h2\" id=\"trs-hotels-title\">Hotel massage in Kuala Lumpur<\/h2>\n          <p class=\"trs-lead\">Staying in KL for work or a staycation? Your therapist comes to your room. These are the hotels and serviced suites we visit; search for yours below.<\/p>\n          <div class=\"trs-search\" role=\"search\">\n            <label class=\"trs-search__label\" for=\"trs-hotel-search\">Search hotels and serviced suites<\/label>\n            <div class=\"trs-search__box\">\n              <svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-search\"\/><\/svg>\n              <input class=\"trs-search__input\" id=\"trs-hotel-search\" name=\"trs-hotel-search\" type=\"search\" placeholder=\"For example, Ritz or Pavilion\" autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\" aria-describedby=\"trs-hotel-status\">\n            <\/div>\n            <p class=\"trs-search__status\" id=\"trs-hotel-status\" aria-live=\"polite\">50 hotels and serviced suites<\/p>\n          <\/div>\n        <\/div>\n        <div class=\"trs-hotels__ph\">\n          <img loading=\"lazy\" class=\"trs-photo\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-hotel-room.webp\" width=\"2000\" height=\"1333\" alt=\"A hotel room at night with a made bed and warm bedside lamps\" loading=\"lazy\" decoding=\"async\">\n        <\/div>\n      <\/div>\n\n      <div class=\"trs-hgroup\" data-trs-hgroup>\n        <h3 class=\"trs-hgroup__title\">Hotels <span class=\"trs-hgroup__count\">22<\/span><\/h3>\n        <ul class=\"trs-hlist\">\n          <li>Alila Bangsar Kuala Lumpur<\/li>\n          <li>Amari Kuala Lumpur<\/li>\n          <li>Banyan Tree Kuala Lumpur<\/li>\n          <li>EQ Kuala Lumpur<\/li>\n          <li>Four Seasons Hotel Kuala Lumpur<\/li>\n          <li>Hilton Kuala Lumpur<\/li>\n          <li>Hotel Stripes Kuala Lumpur, Autograph Collection<\/li>\n          <li>InterContinental Kuala Lumpur, an IHG Hotel<\/li>\n          <li>JW Marriott Hotel Kuala Lumpur<\/li>\n          <li>Le M\u00e9ridien Kuala Lumpur<\/li>\n          <li>Mandarin Oriental, Kuala Lumpur<\/li>\n          <li>Pavilion Hotel Kuala Lumpur<\/li>\n          <li>Pullman Kuala Lumpur Bangsar<\/li>\n          <li>Pullman Kuala Lumpur City Centre \u2013 Hotel &amp; Residences<\/li>\n          <li>Shangri-La Kuala Lumpur<\/li>\n          <li>Sofitel Kuala Lumpur Damansara<\/li>\n          <li>St. Regis Kuala Lumpur<\/li>\n          <li>The Majestic Hotel Kuala Lumpur, Autograph Collection<\/li>\n          <li>The Ritz-Carlton, Kuala Lumpur<\/li>\n          <li>The RuMa Hotel and Residences<\/li>\n          <li>The Westin Kuala Lumpur<\/li>\n          <li>W Kuala Lumpur<\/li>\n        <\/ul>\n        <button class=\"trs-hgroup__more\" type=\"button\" aria-expanded=\"false\"><span>Show all 22<\/span><\/button>\n      <\/div>\n\n      <div class=\"trs-hgroup\" data-trs-hgroup>\n        <h3 class=\"trs-hgroup__title\">Hotels &amp; serviced suites <span class=\"trs-hgroup__count\">24<\/span><\/h3>\n        <ul class=\"trs-hlist\">\n          <li>7 Stonez Platinum Suites<\/li>\n          <li>8 Kia Peng Suites<\/li>\n          <li>Ascott Kuala Lumpur<\/li>\n          <li>Banyan Signatures Pavilion Kuala Lumpur by Opus Hospitality<\/li>\n          <li>Berjaya Times Square Hotel, Kuala Lumpur<\/li>\n          <li>Capri by Fraser, Bukit Bintang<\/li>\n          <li>Ceylonz Five Senses<\/li>\n          <li>DoubleTree by Hilton Kuala Lumpur<\/li>\n          <li>Grand Millennium Hotel Kuala Lumpur<\/li>\n          <li>Hotel Istana Kuala Lumpur City Centre<\/li>\n          <li>Hotel Maya Kuala Lumpur<\/li>\n          <li>KLo\u00e9 Hotel<\/li>\n          <li>Lanson Place Bukit Ceylon Serviced Residences<\/li>\n          <li>Pan Pacific Serviced Suites Kuala Lumpur<\/li>\n          <li>PARKROYAL COLLECTION Kuala Lumpur<\/li>\n          <li>PARKROYAL Serviced Suites Kuala Lumpur<\/li>\n          <li>Platinum 2 by DM Suites<\/li>\n          <li>Royale Chulan Kuala Lumpur<\/li>\n          <li>Sfera Residence Kuala Lumpur City Centre<\/li>\n          <li>Sheraton Imperial Kuala Lumpur Hotel<\/li>\n          <li>Sunway Putra Hotel<\/li>\n          <li>THE FACE Suites<\/li>\n          <li>THE FACE Style<\/li>\n          <li>Traders Hotel Kuala Lumpur<\/li>\n        <\/ul>\n        <button class=\"trs-hgroup__more\" type=\"button\" aria-expanded=\"false\"><span>Show all 24<\/span><\/button>\n      <\/div>\n\n      <div class=\"trs-hgroup\" data-trs-hgroup>\n        <h3 class=\"trs-hgroup__title\">Also visited <span class=\"trs-hgroup__count\">4<\/span><\/h3>\n        <ul class=\"trs-hlist\">\n          <li>Pavilion Bukit Bintang Modern Suites<\/li>\n          <li>The Gardens \u2013 A St Giles Signature Hotel &amp; Residences<\/li>\n          <!-- CONFIRM: The Lobby Lounge is a lounge, not a hotel -->\n          <li>The Lobby Lounge<\/li>\n          <li>Renaissance Kuala Lumpur Hotel &amp; Convention Centre<\/li>\n        <\/ul>\n        <button class=\"trs-hgroup__more\" type=\"button\" aria-expanded=\"false\" hidden><span>Show all 4<\/span><\/button>\n      <\/div>\n\n      <div class=\"trs-hnone\" hidden>\n        <p>No match for \"<span data-trs-hquery><\/span>\".<\/p>\n        <p><a class=\"trs-link\" href=\"https:\/\/wa.me\/601163907115\" target=\"_blank\" rel=\"noopener\" data-trs-wa=\"hotel-search\" data-trs-hnone-link>Not on the list? Ask us on WhatsApp<\/a><\/p>\n      <\/div>\n\n      <p class=\"trs-note trs-hotels__disc\">Hotel and property names are listed for reference only. Thara Royale Spa is an independent outcall service and is not affiliated with these properties.<\/p>\n    <\/div>\n  <\/section>\n\n  <!-- ======================= LATE-NIGHT PHOTO BAND ======================= -->\n  <section class=\"trs-band\" aria-labelledby=\"trs-band-title\">\n    <img loading=\"lazy\" class=\"trs-band__img trs-photo\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-kl-night.webp\" width=\"2000\" height=\"1125\" alt=\"The Kuala Lumpur skyline and Petronas Twin Towers lit up at night\" loading=\"lazy\" decoding=\"async\">\n    <div class=\"trs-band__scrim\" aria-hidden=\"true\"><\/div>\n    <div class=\"trs-wrap trs-band__in\">\n      <h2 class=\"trs-h2\" id=\"trs-band-title\">Late-night massage in KL, until 2 AM<\/h2>\n      <p>Late meeting, late flight or a long day in the city. Book a massage at your home or hotel from 10 AM to 2 AM, Monday to Sunday.<\/p>\n      <a class=\"trs-btn trs-btn--light\" href=\"#trs-book\"><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-chat\"\/><\/svg>Book a massage<\/a>\n    <\/div>\n  <\/section>\n\n  <!-- PLACEHOLDER REVIEWS: replace with real Google reviews before launch -->\n  <!-- ============================ REVIEWS ============================ -->\n  <section class=\"trs-section\" id=\"trs-reviews\" aria-labelledby=\"trs-reviews-title\">\n    <div class=\"trs-wrap\">\n      <div class=\"trs-rev__top\">\n        <h2 class=\"trs-h2\" id=\"trs-reviews-title\">What our guests say<\/h2>\n        <!-- CONFIRM: 4.9 is a placeholder rating; replace with the real Google Business Profile rating -->\n        <div class=\"trs-rev__sum\">\n          <span class=\"trs-rev__score\">\n            <svg class=\"trs-gmark\" viewBox=\"0 0 48 48\" aria-hidden=\"true\"><use href=\"#trs-i-google\"\/><\/svg>\n            <strong>4.9 on Google<\/strong>\n          <\/span>\n          <span class=\"trs-stars\" role=\"img\" aria-label=\"Rated 4.9 out of 5\">\n            <svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg>\n          <\/span>\n          <!-- CONFIRM: swap for the Google Business Profile reviews link when available -->\n          <a class=\"trs-link\" href=\"https:\/\/www.google.com\/search?q=Thara+Royale+Spa+KL+Outcall\" target=\"_blank\" rel=\"noopener\">See all reviews on Google<\/a>\n        <\/div>\n      <\/div>\n\n      <div class=\"trs-rev__viewport\">\n        <ul class=\"trs-rev__track\" id=\"trs-rev-track\" tabindex=\"0\" aria-label=\"Guest reviews, scroll sideways for more\">\n          <li class=\"trs-card\">\n            <div class=\"trs-card__head\">\n              <span class=\"trs-avatar\" aria-hidden=\"true\">N<\/span>\n              <span class=\"trs-card__who\"><span class=\"trs-card__name\">Nurul Aisyah<\/span><span class=\"trs-card__src\">Google review<\/span><\/span>\n              <svg class=\"trs-gmark\" viewBox=\"0 0 48 48\" aria-hidden=\"true\"><use href=\"#trs-i-google\"\/><\/svg>\n            <\/div>\n            <span class=\"trs-stars\" role=\"img\" aria-label=\"Rated 5 out of 5\"><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><\/span>\n            <p class=\"trs-card__text\" lang=\"ms\">Booking senang je, isi form terus masuk WhatsApp. Therapist sampai ikut masa dan sangat profesional. Saya ambil Traditional Massage 90 minit, badan rasa ringan sangat lepas tu. Confirm repeat!<\/p>\n          <\/li>\n          <li class=\"trs-card\">\n            <div class=\"trs-card__head\">\n              <span class=\"trs-avatar trs-avatar--b\" aria-hidden=\"true\">H<\/span>\n              <span class=\"trs-card__who\"><span class=\"trs-card__name\">Hafiz Rahman<\/span><span class=\"trs-card__src\">Google review<\/span><\/span>\n              <svg class=\"trs-gmark\" viewBox=\"0 0 48 48\" aria-hidden=\"true\"><use href=\"#trs-i-google\"\/><\/svg>\n            <\/div>\n            <span class=\"trs-stars\" role=\"img\" aria-label=\"Rated 5 out of 5\"><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><\/span>\n            <p class=\"trs-card__text\">Booked a deep tissue massage after a long week at work. The therapist found every tight spot and kept checking if the pressure was okay. She came to my condo in Mont Kiara at 11pm, which suited me perfectly.<\/p>\n          <\/li>\n          <li class=\"trs-card\">\n            <div class=\"trs-card__head\">\n              <span class=\"trs-avatar trs-avatar--c\" aria-hidden=\"true\">J<\/span>\n              <span class=\"trs-card__who\"><span class=\"trs-card__name\">Jessica Tan<\/span><span class=\"trs-card__src\">Google review<\/span><\/span>\n              <svg class=\"trs-gmark\" viewBox=\"0 0 48 48\" aria-hidden=\"true\"><use href=\"#trs-i-google\"\/><\/svg>\n            <\/div>\n            <span class=\"trs-stars\" role=\"img\" aria-label=\"Rated 5 out of 5\"><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><\/span>\n            <p class=\"trs-card__text\">Had the lifting facial and a manicure at home the night before my sister's wedding. Very gentle and neat, and my skin looked fresh the next morning. Will book again for sure.<\/p>\n          <\/li>\n          <li class=\"trs-card\">\n            <div class=\"trs-card__head\">\n              <span class=\"trs-avatar trs-avatar--d\" aria-hidden=\"true\">S<\/span>\n              <span class=\"trs-card__who\"><span class=\"trs-card__name\">Siti Nur Farhana<\/span><span class=\"trs-card__src\">Google review<\/span><\/span>\n              <svg class=\"trs-gmark\" viewBox=\"0 0 48 48\" aria-hidden=\"true\"><use href=\"#trs-i-google\"\/><\/svg>\n            <\/div>\n            <span class=\"trs-stars\" role=\"img\" aria-label=\"Rated 5 out of 5\"><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><\/span>\n            <p class=\"trs-card__text\" lang=\"ms\">Ambil aromatherapy massage masa staycation kat KL. Therapist peramah, minyak pun wangi sangat. Harga berpatutan untuk servis yang datang terus ke bilik hotel. Terima kasih Thara Royale!<\/p>\n          <\/li>\n          <li class=\"trs-card\">\n            <div class=\"trs-card__head\">\n              <span class=\"trs-avatar\" aria-hidden=\"true\">A<\/span>\n              <span class=\"trs-card__who\"><span class=\"trs-card__name\">Amirul Hakim<\/span><span class=\"trs-card__src\">Google review<\/span><\/span>\n              <svg class=\"trs-gmark\" viewBox=\"0 0 48 48\" aria-hidden=\"true\"><use href=\"#trs-i-google\"\/><\/svg>\n            <\/div>\n            <span class=\"trs-stars\" role=\"img\" aria-label=\"Rated 4 out of 5\"><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill trs-star--off\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><\/span>\n            <p class=\"trs-card__text\">Therapist was about 15 minutes late because of the jam in Cheras, but she messaged me ahead. The Thai massage itself was excellent, good stretching and strong hands. Would book again.<\/p>\n          <\/li>\n          <li class=\"trs-card\">\n            <div class=\"trs-card__head\">\n              <span class=\"trs-avatar trs-avatar--c\" aria-hidden=\"true\">K<\/span>\n              <span class=\"trs-card__who\"><span class=\"trs-card__name\">Kenneth Lim<\/span><span class=\"trs-card__src\">Google review<\/span><\/span>\n              <svg class=\"trs-gmark\" viewBox=\"0 0 48 48\" aria-hidden=\"true\"><use href=\"#trs-i-google\"\/><\/svg>\n            <\/div>\n            <span class=\"trs-stars\" role=\"img\" aria-label=\"Rated 5 out of 5\"><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><\/span>\n            <p class=\"trs-card__text\">In Bukit Bintang for a work trip and needed something after a 12-hour day. They replied on WhatsApp quickly and the therapist came to my hotel the same evening. The foot massage was exactly what I needed.<\/p>\n          <\/li>\n          <li class=\"trs-card\">\n            <div class=\"trs-card__head\">\n              <span class=\"trs-avatar trs-avatar--b\" aria-hidden=\"true\">F<\/span>\n              <span class=\"trs-card__who\"><span class=\"trs-card__name\">Farah Nabila<\/span><span class=\"trs-card__src\">Google review<\/span><\/span>\n              <svg class=\"trs-gmark\" viewBox=\"0 0 48 48\" aria-hidden=\"true\"><use href=\"#trs-i-google\"\/><\/svg>\n            <\/div>\n            <span class=\"trs-stars\" role=\"img\" aria-label=\"Rated 5 out of 5\"><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><\/span>\n            <p class=\"trs-card__text\">First time try home massage and honestly very satisfied. Booking process simple, therapist very sopan and professional. Body scrub + relaxing massage combo memang best!<\/p>\n          <\/li>\n          <li class=\"trs-card\">\n            <div class=\"trs-card__head\">\n              <span class=\"trs-avatar trs-avatar--d\" aria-hidden=\"true\">S<\/span>\n              <span class=\"trs-card__who\"><span class=\"trs-card__name\">Syafiq Aiman<\/span><span class=\"trs-card__src\">Google review<\/span><\/span>\n              <svg class=\"trs-gmark\" viewBox=\"0 0 48 48\" aria-hidden=\"true\"><use href=\"#trs-i-google\"\/><\/svg>\n            <\/div>\n            <span class=\"trs-stars\" role=\"img\" aria-label=\"Rated 5 out of 5\"><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-star\"\/><\/svg><\/span>\n            <p class=\"trs-card__text\" lang=\"ms\">Servis terbaik! Urut tradisional memang padu, badan rasa segar balik. Therapist datang ke rumah kat Setapak, tak payah keluar lepas penat kerja. Recommended.<\/p>\n          <\/li>\n        <\/ul>\n      <\/div>\n      <div class=\"trs-rev__foot\">\n        <p class=\"trs-note\">Swipe or scroll sideways to read more.<\/p>\n        <div class=\"trs-rev__nav trs-carousel-nav\">\n          <button class=\"trs-rev__btn\" type=\"button\" data-trs-step=\"-1\" aria-controls=\"trs-rev-track\" aria-label=\"Previous reviews\"><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-left\"\/><\/svg><\/button>\n          <button class=\"trs-rev__btn\" type=\"button\" data-trs-step=\"1\" aria-controls=\"trs-rev-track\" aria-label=\"Next reviews\"><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-right\"\/><\/svg><\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n  <!-- END PLACEHOLDER REVIEWS -->\n\n  <!-- ======================= BOOKING & ENQUIRY ======================= -->\n  <section class=\"trs-section trs-section--beige\" id=\"trs-book\" aria-labelledby=\"trs-book-title\">\n    <div class=\"trs-wrap trs-book__grid\">\n      <div>\n        <div class=\"trs-book__head\">\n          <h2 class=\"trs-h2\" id=\"trs-book-title\">Booking &amp; enquiry<\/h2>\n          <p class=\"trs-lead\">Fill in the form below and we'll get back to you via WhatsApp.<\/p>\n        <\/div>\n\n        <!-- Without JS the form still opens WhatsApp with a greeting (the \"text\" field is WhatsApp's own parameter). -->\n        <form class=\"trs-form\" id=\"trs-form\" action=\"https:\/\/wa.me\/601163907115\" method=\"get\" target=\"_blank\" data-trs-form>\n          <input type=\"hidden\" name=\"text\" value=\"Hi Thara Royale Spa, I'd like to book a session.\">\n\n          <div class=\"trs-field\">\n            <label class=\"trs-label\" for=\"trs-f-name\">Name<span class=\"trs-req\" aria-hidden=\"true\">*<\/span><\/label>\n            <input class=\"trs-input\" id=\"trs-f-name\" name=\"trs-name\" type=\"text\" autocomplete=\"name\" required aria-describedby=\"trs-e-name\">\n            <p class=\"trs-err\" id=\"trs-e-name\"><\/p>\n          <\/div>\n\n          <div class=\"trs-field\">\n            <label class=\"trs-label\" for=\"trs-f-phone\">Phone number<span class=\"trs-req\" aria-hidden=\"true\">*<\/span><\/label>\n            <input class=\"trs-input\" id=\"trs-f-phone\" name=\"trs-phone\" type=\"tel\" autocomplete=\"tel\" inputmode=\"tel\" placeholder=\"+60 12 345 6789\" required aria-describedby=\"trs-h-phone trs-e-phone\">\n            <p class=\"trs-hint\" id=\"trs-h-phone\">Malaysian or international number, for WhatsApp.<\/p>\n            <p class=\"trs-err\" id=\"trs-e-phone\"><\/p>\n          <\/div>\n\n          <div class=\"trs-field\">\n            <label class=\"trs-label\" for=\"trs-f-service\">Type of service<span class=\"trs-req\" aria-hidden=\"true\">*<\/span><\/label>\n            <select class=\"trs-input\" id=\"trs-f-service\" name=\"trs-service\" required aria-describedby=\"trs-e-service\">\n              <option value=\"\">Choose a treatment<\/option>\n              <optgroup label=\"Massage\">\n                <option value=\"Relaxing Massage\" data-trs-ref=\"Relaxing \/ Aromatherapy \/ Balinese Massage\">Relaxing Massage<\/option>\n                <option value=\"Aromatherapy Massage\" data-trs-ref=\"Relaxing \/ Aromatherapy \/ Balinese Massage\">Aromatherapy Massage<\/option>\n                <option value=\"Balinese Massage\" data-trs-ref=\"Relaxing \/ Aromatherapy \/ Balinese Massage\">Balinese Massage<\/option>\n                <option value=\"Deep Tissue Massage\">Deep Tissue Massage<\/option>\n                <option value=\"Dry Massage\">Dry Massage<\/option>\n                <option value=\"Thai Massage\">Thai Massage<\/option>\n                <option value=\"Traditional Massage\">Traditional Massage<\/option>\n                <option value=\"Foot Massage\">Foot Massage<\/option>\n              <\/optgroup>\n              <optgroup label=\"Face\">\n                <option value=\"Basic Facial\">Basic Facial<\/option>\n                <option value=\"Double Cleansing Facial\">Double Cleansing Facial<\/option>\n                <option value=\"Lifting Facial\">Lifting Facial<\/option>\n              <\/optgroup>\n              <optgroup label=\"Body\">\n                <option value=\"Body Scrub\">Body Scrub<\/option>\n                <option value=\"Body Bleaching\">Body Bleaching<\/option>\n              <\/optgroup>\n              <optgroup label=\"Nails\">\n                <option value=\"Basic Manicure\">Basic Manicure<\/option>\n                <option value=\"Basic Pedicure\">Basic Pedicure<\/option>\n              <\/optgroup>\n              <option value=\"Not sure, please recommend\">Not sure, please recommend<\/option>\n            <\/select>\n            <p class=\"trs-err\" id=\"trs-e-service\"><\/p>\n          <\/div>\n\n          <!-- CONFIRM: Duration is an added field (not in the client's form) -->\n          <div class=\"trs-field\" data-trs-dur-field>\n            <label class=\"trs-label\" for=\"trs-f-duration\" data-trs-dur-label>Duration<\/label>\n            <select class=\"trs-input\" id=\"trs-f-duration\" name=\"trs-duration\" aria-describedby=\"trs-h-duration trs-e-duration\">\n              <option value=\"\">Choose a length<\/option>\n              <option value=\"60\">60 min<\/option>\n              <option value=\"90\">90 min<\/option>\n              <option value=\"120\">120 min<\/option>\n            <\/select>\n            <p class=\"trs-fixed\" data-trs-dur-fixed hidden><\/p>\n            <p class=\"trs-hint\" id=\"trs-h-duration\" data-trs-dur-hint>For massages. Other treatments have a set length.<\/p>\n            <p class=\"trs-err\" id=\"trs-e-duration\"><\/p>\n          <\/div>\n\n          <div class=\"trs-field\">\n            <label class=\"trs-label\" for=\"trs-f-date\">Date<span class=\"trs-req\" aria-hidden=\"true\">*<\/span><\/label>\n            <input class=\"trs-input\" id=\"trs-f-date\" name=\"trs-date\" type=\"date\" required aria-describedby=\"trs-e-date\">\n            <p class=\"trs-err\" id=\"trs-e-date\"><\/p>\n          <\/div>\n\n          <div class=\"trs-field\">\n            <label class=\"trs-label\" for=\"trs-f-time\">Time<span class=\"trs-req\" aria-hidden=\"true\">*<\/span><\/label>\n            <!-- CONFIRM: is 2 AM the closing time or the last start time? Remove late slots if needed. -->\n            <select class=\"trs-input\" id=\"trs-f-time\" name=\"trs-time\" required aria-describedby=\"trs-e-time\">\n              <option value=\"\">Choose a time<\/option>\n              <option value=\"10:00\">10:00 AM<\/option>\n              <option value=\"10:30\">10:30 AM<\/option>\n              <option value=\"11:00\">11:00 AM<\/option>\n              <option value=\"11:30\">11:30 AM<\/option>\n              <option value=\"12:00\">12:00 PM<\/option>\n              <option value=\"12:30\">12:30 PM<\/option>\n              <option value=\"13:00\">1:00 PM<\/option>\n              <option value=\"13:30\">1:30 PM<\/option>\n              <option value=\"14:00\">2:00 PM<\/option>\n              <option value=\"14:30\">2:30 PM<\/option>\n              <option value=\"15:00\">3:00 PM<\/option>\n              <option value=\"15:30\">3:30 PM<\/option>\n              <option value=\"16:00\">4:00 PM<\/option>\n              <option value=\"16:30\">4:30 PM<\/option>\n              <option value=\"17:00\">5:00 PM<\/option>\n              <option value=\"17:30\">5:30 PM<\/option>\n              <option value=\"18:00\">6:00 PM<\/option>\n              <option value=\"18:30\">6:30 PM<\/option>\n              <option value=\"19:00\">7:00 PM<\/option>\n              <option value=\"19:30\">7:30 PM<\/option>\n              <option value=\"20:00\">8:00 PM<\/option>\n              <option value=\"20:30\">8:30 PM<\/option>\n              <option value=\"21:00\">9:00 PM<\/option>\n              <option value=\"21:30\">9:30 PM<\/option>\n              <option value=\"22:00\">10:00 PM<\/option>\n              <option value=\"22:30\">10:30 PM<\/option>\n              <option value=\"23:00\">11:00 PM<\/option>\n              <option value=\"23:30\">11:30 PM<\/option>\n              <option value=\"24:00\">12:00 AM (late night)<\/option>\n              <option value=\"24:30\">12:30 AM (late night)<\/option>\n              <option value=\"25:00\">1:00 AM (late night)<\/option>\n              <option value=\"25:30\">1:30 AM (late night)<\/option>\n              <option value=\"26:00\">2:00 AM (late night)<\/option>\n            <\/select>\n            <p class=\"trs-hint\">Late-night times belong to the night of the date you picked.<\/p>\n            <p class=\"trs-err\" id=\"trs-e-time\"><\/p>\n          <\/div>\n\n          <!-- CONFIRM: Location is an added field (not in the client's form) -->\n          <div class=\"trs-field trs-field--full\">\n            <label class=\"trs-label\" for=\"trs-f-location\">Location <span class=\"trs-opt\">(optional)<\/span><\/label>\n            <input class=\"trs-input\" id=\"trs-f-location\" name=\"trs-location\" type=\"text\" list=\"trs-locations\" placeholder=\"Area, or hotel name and room number\" autocomplete=\"off\">\n            <datalist id=\"trs-locations\">\n              <option value=\"KLCC\"><\/option>\n              <option value=\"Bukit Bintang\"><\/option>\n              <option value=\"Bangsar\"><\/option>\n              <option value=\"Mont Kiara\"><\/option>\n              <option value=\"Sri Hartamas\"><\/option>\n              <option value=\"Damansara Heights (Bukit Damansara)\"><\/option>\n              <option value=\"Bukit Tunku (Kenny Hills)\"><\/option>\n              <option value=\"Titiwangsa\"><\/option>\n              <option value=\"Ampang\"><\/option>\n              <option value=\"Bangsar South\"><\/option>\n              <option value=\"Brickfields \/ KL Sentral\"><\/option>\n              <option value=\"TRX (Tun Razak Exchange)\"><\/option>\n              <option value=\"Petaling Jaya\"><\/option>\n              <option value=\"Cheras\"><\/option>\n              <option value=\"Setapak\"><\/option>\n              <option value=\"Seputeh\"><\/option>\n              <option value=\"Damansara Utama\"><\/option>\n              <option value=\"Melawati\"><\/option>\n              <option value=\"Gombak\"><\/option>\n              <option value=\"Segambut\"><\/option>\n              <option value=\"Alila Bangsar Kuala Lumpur\"><\/option>\n              <option value=\"Amari Kuala Lumpur\"><\/option>\n              <option value=\"Banyan Tree Kuala Lumpur\"><\/option>\n              <option value=\"EQ Kuala Lumpur\"><\/option>\n              <option value=\"Four Seasons Hotel Kuala Lumpur\"><\/option>\n              <option value=\"Hilton Kuala Lumpur\"><\/option>\n              <option value=\"Hotel Stripes Kuala Lumpur, Autograph Collection\"><\/option>\n              <option value=\"InterContinental Kuala Lumpur, an IHG Hotel\"><\/option>\n              <option value=\"JW Marriott Hotel Kuala Lumpur\"><\/option>\n              <option value=\"Le M\u00e9ridien Kuala Lumpur\"><\/option>\n              <option value=\"Mandarin Oriental, Kuala Lumpur\"><\/option>\n              <option value=\"Pavilion Hotel Kuala Lumpur\"><\/option>\n              <option value=\"Pullman Kuala Lumpur Bangsar\"><\/option>\n              <option value=\"Pullman Kuala Lumpur City Centre \u2013 Hotel &amp; Residences\"><\/option>\n              <option value=\"Shangri-La Kuala Lumpur\"><\/option>\n              <option value=\"Sofitel Kuala Lumpur Damansara\"><\/option>\n              <option value=\"St. Regis Kuala Lumpur\"><\/option>\n              <option value=\"The Majestic Hotel Kuala Lumpur, Autograph Collection\"><\/option>\n              <option value=\"The Ritz-Carlton, Kuala Lumpur\"><\/option>\n              <option value=\"The RuMa Hotel and Residences\"><\/option>\n              <option value=\"The Westin Kuala Lumpur\"><\/option>\n              <option value=\"W Kuala Lumpur\"><\/option>\n              <option value=\"7 Stonez Platinum Suites\"><\/option>\n              <option value=\"8 Kia Peng Suites\"><\/option>\n              <option value=\"Ascott Kuala Lumpur\"><\/option>\n              <option value=\"Banyan Signatures Pavilion Kuala Lumpur by Opus Hospitality\"><\/option>\n              <option value=\"Berjaya Times Square Hotel, Kuala Lumpur\"><\/option>\n              <option value=\"Capri by Fraser, Bukit Bintang\"><\/option>\n              <option value=\"Ceylonz Five Senses\"><\/option>\n              <option value=\"DoubleTree by Hilton Kuala Lumpur\"><\/option>\n              <option value=\"Grand Millennium Hotel Kuala Lumpur\"><\/option>\n              <option value=\"Hotel Istana Kuala Lumpur City Centre\"><\/option>\n              <option value=\"Hotel Maya Kuala Lumpur\"><\/option>\n              <option value=\"KLo\u00e9 Hotel\"><\/option>\n              <option value=\"Lanson Place Bukit Ceylon Serviced Residences\"><\/option>\n              <option value=\"Pan Pacific Serviced Suites Kuala Lumpur\"><\/option>\n              <option value=\"PARKROYAL COLLECTION Kuala Lumpur\"><\/option>\n              <option value=\"PARKROYAL Serviced Suites Kuala Lumpur\"><\/option>\n              <option value=\"Platinum 2 by DM Suites\"><\/option>\n              <option value=\"Royale Chulan Kuala Lumpur\"><\/option>\n              <option value=\"Sfera Residence Kuala Lumpur City Centre\"><\/option>\n              <option value=\"Sheraton Imperial Kuala Lumpur Hotel\"><\/option>\n              <option value=\"Sunway Putra Hotel\"><\/option>\n              <option value=\"THE FACE Suites\"><\/option>\n              <option value=\"THE FACE Style\"><\/option>\n              <option value=\"Traders Hotel Kuala Lumpur\"><\/option>\n              <option value=\"Pavilion Bukit Bintang Modern Suites\"><\/option>\n              <option value=\"The Gardens \u2013 A St Giles Signature Hotel &amp; Residences\"><\/option>\n              <option value=\"The Lobby Lounge\"><\/option>\n              <option value=\"Renaissance Kuala Lumpur Hotel &amp; Convention Centre\"><\/option>\n            <\/datalist>\n          <\/div>\n\n          <div class=\"trs-field trs-field--full\">\n            <label class=\"trs-label\" for=\"trs-f-notes\">Additional notes <span class=\"trs-opt\">(optional)<\/span><\/label>\n            <textarea class=\"trs-input\" id=\"trs-f-notes\" name=\"trs-notes\" rows=\"4\" placeholder=\"Anything we should know, such as pressure preference or a therapist preference\"><\/textarea>\n          <\/div>\n\n          <p class=\"trs-pricebox\" data-trs-pricebox aria-live=\"polite\">Choose a treatment to see the price. Additional charges may apply outside Kuala Lumpur.<\/p>\n\n          <div class=\"trs-form__submit\" data-trs-submit-wrap>\n            <button class=\"trs-btn\" type=\"submit\"><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-whatsapp\"\/><\/svg>Send via WhatsApp<\/button>\n          <\/div>\n          <div class=\"trs-form__submit\" data-trs-sent hidden>\n            <p class=\"trs-sent\" role=\"status\">Opening WhatsApp\u2026 If it didn't open, <a href=\"https:\/\/wa.me\/601163907115\" target=\"_blank\" rel=\"noopener\" data-trs-sent-link data-trs-wa=\"booking-fallback\">tap here<\/a>.<\/p>\n          <\/div>\n\n          <p class=\"trs-form__alt\">Or <a href=\"https:\/\/wa.me\/601163907115?text=Hi%20Thara%20Royale%20Spa%2C%20I%27d%20like%20to%20make%20a%20booking.\" target=\"_blank\" rel=\"noopener\" data-trs-wa=\"booking-alt\">message us on WhatsApp<\/a> directly.<\/p>\n        <\/form>\n      <\/div>\n\n      <aside class=\"trs-contact\" aria-labelledby=\"trs-contact-title\">\n        <h3 class=\"trs-contact__title\" id=\"trs-contact-title\">Contact details<\/h3>\n        <ul class=\"trs-clist\">\n          <li>\n            <svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-phone\"\/><\/svg>\n            <div><span class=\"trs-clist__k\">Phone<\/span><a class=\"trs-clist__v\" href=\"tel:+601163907115\" data-trs-call=\"contact\"><span>+60 11-6390 7115<\/span><\/a><\/div>\n          <\/li>\n          <li>\n            <svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-whatsapp\"\/><\/svg>\n            <div><span class=\"trs-clist__k\">WhatsApp<\/span><a class=\"trs-clist__v\" href=\"https:\/\/wa.me\/601163907115?text=Hi%20Thara%20Royale%20Spa%2C%20I%27d%20like%20to%20make%20a%20booking.\" target=\"_blank\" rel=\"noopener\" data-trs-wa=\"contact\"><span>Chat with us for instant booking<\/span><\/a><\/div>\n          <\/li>\n          <li>\n            <svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-mail\"\/><\/svg>\n            <div><span class=\"trs-clist__k\">Email<\/span><a class=\"trs-clist__v\" href=\"mailto:info@thararoyalespa.com\"><span>info@thararoyalespa.com<\/span><\/a><\/div>\n          <\/li>\n          <li>\n            <svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-pin\"\/><\/svg>\n            <div><span class=\"trs-clist__k\">Service area<\/span><span class=\"trs-clist__v\">KLCC, Bukit Bintang, and surrounding areas in Kuala Lumpur<\/span><\/div>\n          <\/li>\n          <li>\n            <svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-clock\"\/><\/svg>\n            <div><span class=\"trs-clist__k\">Hours<\/span><span class=\"trs-clist__v\">Open daily, Monday to Sunday<br>10 AM \u2013 2 AM<\/span><\/div>\n          <\/li>\n        <\/ul>\n      <\/aside>\n    <\/div>\n  <\/section>\n\n  <!-- ============================== FAQ ============================== -->\n  <section class=\"trs-section\" id=\"trs-faq\" aria-labelledby=\"trs-faq-title\">\n    <div class=\"trs-wrap\">\n      <div class=\"trs-faq__in\">\n        <div class=\"trs-faq__aside\">\n          <h2 class=\"trs-h2\" id=\"trs-faq-title\">Outcall massage FAQ<\/h2>\n          <p class=\"trs-lead\">Answers about booking a home or hotel massage in Kuala Lumpur: areas, hotels, prices and payment.<\/p>\n          <a class=\"trs-btn trs-faq__cta\" href=\"https:\/\/wa.me\/601163907115?text=Hi%20Thara%20Royale%20Spa%2C%20I%20have%20a%20question.\" target=\"_blank\" rel=\"noopener\" data-trs-wa=\"faq\"><svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-whatsapp\"\/><\/svg>Still have a question? WhatsApp us<\/a>\n          <p class=\"trs-faq__contact\">Or call <a href=\"tel:+601163907115\" data-trs-call=\"faq-aside\">+60 11-6390 7115<\/a>, daily 10 AM \u2013 2 AM.<\/p>\n        <\/div>\n        <div class=\"trs-faq__list\">\n          <details class=\"trs-faq__item\">\n            <summary class=\"trs-faq__q\"><span>How do I book an outcall massage?<\/span><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-plus\"\/><\/svg><\/summary>\n            <div class=\"trs-faq__a\"><p>Fill in the <a href=\"#trs-book\">booking form<\/a> on this page and tap \"Send via WhatsApp\". Your details arrive in our WhatsApp and we'll reply to confirm your booking. You can also WhatsApp or call us on <a href=\"tel:+601163907115\" data-trs-call=\"faq\">+60 11-6390 7115<\/a>.<\/p><\/div>\n          <\/details>\n          <details class=\"trs-faq__item\">\n            <summary class=\"trs-faq__q\"><span>Which areas in Kuala Lumpur do you cover?<\/span><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-plus\"\/><\/svg><\/summary>\n            <div class=\"trs-faq__a\"><p>We're based around KLCC and Bukit Bintang and travel across Kuala Lumpur, including Bangsar, Mont Kiara, Cheras, Ampang and Petaling Jaya. The <a href=\"#trs-areas\">full list<\/a> is above. Additional charges may apply for locations outside Kuala Lumpur.<\/p><\/div>\n          <\/details>\n          <details class=\"trs-faq__item\">\n            <summary class=\"trs-faq__q\"><span>Can you come to my hotel room in KL?<\/span><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-plus\"\/><\/svg><\/summary>\n            <div class=\"trs-faq__a\"><p>Yes. We visit hotels and serviced suites across KL; see the <a href=\"#trs-hotels\">list above<\/a>. Send us your hotel name and room number when you book. Some hotels ask visitors to register at reception, so it helps to tell the front desk you're expecting a therapist.<\/p><\/div>\n          <\/details>\n          <details class=\"trs-faq__item\">\n            <summary class=\"trs-faq__q\"><span>What are your opening hours?<\/span><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-plus\"\/><\/svg><\/summary>\n            <div class=\"trs-faq__a\"><p>Every day, 10 AM \u2013 2 AM.<\/p><\/div>\n          <\/details>\n          <details class=\"trs-faq__item\">\n            <summary class=\"trs-faq__q\"><span>How much does a home massage cost? Are there extra charges?<\/span><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-plus\"\/><\/svg><\/summary>\n            <!-- CONFIRM: \"We'll confirm your total on WhatsApp before your session.\" -->\n            <div class=\"trs-faq__a\"><p>Prices depend on the treatment and duration and are listed in our <a href=\"#trs-treatments\">menu<\/a>; massages start from RM160 for 60 minutes. All prices are subject to availability, and additional charges may apply for locations outside Kuala Lumpur. We'll confirm your total on WhatsApp before your session.<\/p><\/div>\n          <\/details>\n          <details class=\"trs-faq__item\">\n            <summary class=\"trs-faq__q\"><span>How far in advance should I book?<\/span><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-plus\"\/><\/svg><\/summary>\n            <!-- CONFIRM: booking lead time and whether same-day bookings work -->\n            <div class=\"trs-faq__a\"><p>A few hours ahead is best, especially for evenings and weekends. Same-day bookings depend on therapist availability.<\/p><\/div>\n          <\/details>\n          <details class=\"trs-faq__item\">\n            <summary class=\"trs-faq__q\"><span>What do I need to prepare?<\/span><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-plus\"\/><\/svg><\/summary>\n            <!-- CONFIRM: what the guest prepares and what the therapist brings -->\n            <div class=\"trs-faq__a\"><p>A clean, quiet and private space with room to lie down, such as your bed.<\/p><\/div>\n          <\/details>\n          <details class=\"trs-faq__item\">\n            <summary class=\"trs-faq__q\"><span>How do I pay?<\/span><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-plus\"\/><\/svg><\/summary>\n            <!-- CONFIRM: payment methods, and whether payment is before or after the session -->\n            <div class=\"trs-faq__a\"><p>We'll confirm payment options with you on WhatsApp when you book.<\/p><\/div>\n          <\/details>\n          <details class=\"trs-faq__item\">\n            <summary class=\"trs-faq__q\"><span>Can I request a male or female therapist?<\/span><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-plus\"\/><\/svg><\/summary>\n            <!-- CONFIRM: therapist gender preference policy -->\n            <div class=\"trs-faq__a\"><p>Add your preference in the notes and we'll let you know what's available when we reply.<\/p><\/div>\n          <\/details>\n          <details class=\"trs-faq__item\">\n            <summary class=\"trs-faq__q\"><span>Is this a professional service?<\/span><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-plus\"\/><\/svg><\/summary>\n            <!-- CONFIRM: wording with the client -->\n            <div class=\"trs-faq__a\"><p>Yes. All our treatments are strictly professional, non-sexual wellness services.<\/p><\/div>\n          <\/details>\n          <details class=\"trs-faq__item\">\n            <summary class=\"trs-faq__q\"><span>Can I change or cancel my booking?<\/span><svg class=\"trs-ico\" aria-hidden=\"true\"><use href=\"#trs-i-plus\"\/><\/svg><\/summary>\n            <!-- CONFIRM: cancellation and rescheduling policy -->\n            <div class=\"trs-faq__a\"><p>Message us on WhatsApp as early as you can and we'll help you reschedule.<\/p><\/div>\n          <\/details>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- TRS FOOTER START -->\n  <footer class=\"trs-footer\">\n    <div class=\"trs-wrap\">\n      <div class=\"trs-footer__grid\">\n        <div>\n          <img loading=\"lazy\" class=\"trs-footer__mark\" src=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-logo-badge.png\" width=\"240\" height=\"240\" alt=\"Thara Royale Spa logo\" loading=\"lazy\" decoding=\"async\">\n          <span class=\"trs-brand__name\">Thara Royale Spa<\/span>\n          <span class=\"trs-brand__tag\">Outcall spa, Kuala Lumpur<\/span>\n          <p class=\"trs-footer__desc\">Outcall massage and home spa in Kuala Lumpur: massage, facials, body treatments and nail care at your home, condo or hotel room.<\/p>\n          <p class=\"trs-footer__desc\" lang=\"ms\">Urut panggilan dan spa di rumah, kondo dan hotel sekitar Kuala Lumpur.<\/p>\n        <\/div>\n        <nav aria-label=\"Footer\">\n          <p class=\"trs-footer__title\">On this page<\/p>\n          <ul class=\"trs-footer__list\">\n            <li><a href=\"#trs-treatments\">Massage and spa prices<\/a><\/li>\n            <li><a href=\"#trs-areas\">Outcall massage areas<\/a><\/li>\n            <li><a href=\"#trs-hotels\">Hotel massage in KL<\/a><\/li>\n            <li><a href=\"#trs-reviews\">Reviews<\/a><\/li>\n            <li><a href=\"#trs-faq\">FAQ<\/a><\/li>\n            <li><a href=\"#trs-book\">Book now<\/a><\/li>\n          <\/ul>\n        <\/nav>\n        <div>\n          <p class=\"trs-footer__title\">Contact<\/p>\n          <ul class=\"trs-footer__list\">\n            <li><a href=\"tel:+601163907115\" data-trs-call=\"footer\">+60 11-6390 7115<\/a><\/li>\n            <li><a href=\"https:\/\/wa.me\/601163907115?text=Hi%20Thara%20Royale%20Spa%2C%20I%27d%20like%20to%20make%20a%20booking.\" target=\"_blank\" rel=\"noopener\" data-trs-wa=\"footer\">WhatsApp<\/a><\/li>\n            <li><a href=\"mailto:info@thararoyalespa.com\">info@thararoyalespa.com<\/a><\/li>\n          <\/ul>\n        <\/div>\n        <div>\n          <p class=\"trs-footer__title\">Hours<\/p>\n          <p>Open daily, 10 AM \u2013 2 AM<\/p>\n          <p class=\"trs-footer__title\" style=\"margin-top:20px\">Company address<\/p>\n          <!-- CONFIRM: company address only, or does it take walk-ins? -->\n          <address>150, Jalan Bukit Bintang, Bukit Bintang, 55100 Kuala Lumpur, Wilayah Persekutuan Kuala Lumpur<\/address>\n        <\/div>\n      <\/div>\n      <div class=\"trs-footer__base\">\n        <span>\u00a9 <span data-trs-year>2026<\/span> Thara Royale Spa. All rights reserved.<\/span>\n        <span>Strictly professional wellness services.<\/span>\n      <\/div>\n    <\/div>\n  <\/footer>\n  <!-- TRS FOOTER END -->\n\n  <!-- TRS WHATSAPP START -->\n  <a class=\"trs-float\" href=\"https:\/\/wa.me\/601163907115?text=Hi%20Thara%20Royale%20Spa%2C%20I%27d%20like%20to%20make%20a%20booking.\" target=\"_blank\" rel=\"noopener\" data-trs-wa=\"floating\" data-trs-float aria-label=\"Chat with us on WhatsApp\">\n    <svg class=\"trs-ico trs-ico--fill\" aria-hidden=\"true\"><use href=\"#trs-i-whatsapp\"\/><\/svg><span>WhatsApp<\/span>\n  <\/a>\n  <!-- TRS WHATSAPP END -->\n\n<\/div>\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"DaySpa\",\n  \"name\": \"Thara Royale Spa\",\n  \"alternateName\": \"Thara Royale Spa KL Outcall\",\n  \"description\": \"Outcall massage and home spa in Kuala Lumpur. Massage, facials, body treatments, manicure and pedicure at your home, condo or hotel room, based around KLCC and Bukit Bintang. Open daily 10 AM to 2 AM.\",\n  \"url\": \"https:\/\/thararoyalespa.com\/\",\n  \"telephone\": \"+60 11-6390 7115\",\n  \"email\": \"info@thararoyalespa.com\",\n  \"image\": \"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-share-outcall-massage-kl.jpg\",\n  \"logo\": \"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-site-icon.png\",\n  \"priceRange\": \"RM80\u2013RM300\",\n  \"currenciesAccepted\": \"MYR\",\n  \"address\": {\n    \"@type\": \"PostalAddress\",\n    \"streetAddress\": \"150, Jalan Bukit Bintang\",\n    \"addressLocality\": \"Kuala Lumpur\",\n    \"postalCode\": \"55100\",\n    \"addressRegion\": \"Wilayah Persekutuan Kuala Lumpur\",\n    \"addressCountry\": \"MY\"\n  },\n  \"openingHoursSpecification\": [\n    {\n      \"@type\": \"OpeningHoursSpecification\",\n      \"dayOfWeek\": [\n        \"Monday\",\n        \"Tuesday\",\n        \"Wednesday\",\n        \"Thursday\",\n        \"Friday\",\n        \"Saturday\",\n        \"Sunday\"\n      ],\n      \"opens\": \"10:00\",\n      \"closes\": \"02:00\"\n    }\n  ],\n  \"areaServed\": [\n    {\n      \"@type\": \"Place\",\n      \"name\": \"KLCC, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Bukit Bintang, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Bangsar, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Mont Kiara, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Sri Hartamas, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Damansara Heights (Bukit Damansara), Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Bukit Tunku (Kenny Hills), Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Titiwangsa, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Ampang, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Bangsar South, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Brickfields \/ KL Sentral, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"TRX (Tun Razak Exchange), Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Petaling Jaya, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Cheras, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Setapak, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Seputeh, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Damansara Utama, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Melawati, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Gombak, Kuala Lumpur\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Segambut, Kuala Lumpur\"\n    }\n  ],\n  \"hasOfferCatalog\": {\n    \"@type\": \"OfferCatalog\",\n    \"name\": \"Outcall massage and spa treatments\",\n    \"itemListElement\": [\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"160\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Relaxing Massage\",\n          \"description\": \"Outcall service at your home or hotel, 60 minutes (90 and 120 minutes also available)\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"160\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Aromatherapy Massage\",\n          \"description\": \"Outcall service at your home or hotel, 60 minutes (90 and 120 minutes also available)\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"160\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Balinese Massage\",\n          \"description\": \"Outcall service at your home or hotel, 60 minutes (90 and 120 minutes also available)\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"190\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Deep Tissue Massage\",\n          \"description\": \"Outcall service at your home or hotel, 60 minutes (90 and 120 minutes also available)\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"200\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Dry Massage\",\n          \"description\": \"Outcall service at your home or hotel, 60 minutes (90 and 120 minutes also available)\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"220\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Thai Massage\",\n          \"description\": \"Outcall service at your home or hotel, 60 minutes (90 and 120 minutes also available)\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"190\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Traditional Massage\",\n          \"description\": \"Outcall service at your home or hotel, 60 minutes (90 and 120 minutes also available)\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"190\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Foot Massage\",\n          \"description\": \"Outcall service at your home or hotel, 60 minutes (90 and 120 minutes also available)\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"120\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Basic Facial\",\n          \"description\": \"Outcall service at your home or hotel, 30 minutes\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"220\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Double Cleansing Facial\",\n          \"description\": \"Outcall service at your home or hotel, 60 minutes\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"260\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Lifting Facial\",\n          \"description\": \"Outcall service at your home or hotel, 90 minutes\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"80\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Body Scrub\",\n          \"description\": \"Outcall service at your home or hotel, 40 minutes\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"160\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Body Bleaching\",\n          \"description\": \"Outcall service at your home or hotel, 30 minutes\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"90\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Basic Manicure\",\n          \"description\": \"Outcall service at your home or hotel, 40 minutes\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      },\n      {\n        \"@type\": \"Offer\",\n        \"price\": \"100\",\n        \"priceCurrency\": \"MYR\",\n        \"itemOffered\": {\n          \"@type\": \"Service\",\n          \"name\": \"Basic Pedicure\",\n          \"description\": \"Outcall service at your home or hotel, 40 minutes\",\n          \"areaServed\": \"Kuala Lumpur\"\n        }\n      }\n    ]\n  }\n}\n<\/script>\n\n<script>\n\/* =====================================================================\n   THARA ROYALE SPA - page behaviour\n   One IIFE, no globals (only window.dataLayer), queries stay inside #trs-app.\n   ===================================================================== *\/\n(function () {\n  'use strict';\n\n  var root = document.getElementById('trs-app');\n  if (!root || root.dataset.trsReady) { return; }\n  root.dataset.trsReady = '1';\n  root.classList.add('trs-js');\n\n  var WA_NUMBER = '601163907115';\n  var TZ = 'Asia\/Kuala_Lumpur';\n  var reduceMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  var DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n  var MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n  function $(sel) { return root.querySelector(sel); }\n  function $$(sel) { return Array.prototype.slice.call(root.querySelectorAll(sel)); }\n\n  \/* ---------- Analytics: dataLayer events for GA4 \/ Meta later ---------- *\/\n  window.dataLayer = window.dataLayer || [];\n  function track(name, data) {\n    var ev = { event: name };\n    if (data) { for (var k in data) { if (Object.prototype.hasOwnProperty.call(data, k)) { ev[k] = data[k]; } } }\n    window.dataLayer.push(ev);\n  }\n\n  \/* ---------- Copyright year ---------- *\/\n  $$('[data-trs-year]').forEach(function (el) { el.textContent = String(new Date().getFullYear()); });\n\n  \/* ---------- Header: see-through over the hero, solid after scrolling ---------- *\/\n  var header = $('[data-trs-header]');\n  var hero = $('.trs-hero');\n  var nav = $('#trs-nav');\n  var menuBtn = $('.trs-menu-btn');\n\n  function setMenu(open) {\n    if (!nav || !menuBtn) { return; }\n    nav.classList.toggle('trs-is-open', open);\n    menuBtn.setAttribute('aria-expanded', open ? 'true' : 'false');\n    updateHeader();\n  }\n  function updateHeader() {\n    if (!header) { return; }\n    var overHero = hero && header.nextElementSibling === hero && hero.getBoundingClientRect().top > -40;\n    var menuOpen = nav && nav.classList.contains('trs-is-open');\n    header.classList.toggle('trs-is-clear', !!overHero && !menuOpen);\n  }\n  if (header) {\n    updateHeader();\n    window.addEventListener('scroll', updateHeader, { passive: true });\n    window.addEventListener('resize', updateHeader, { passive: true });\n  }\n  if (menuBtn) {\n    menuBtn.addEventListener('click', function () {\n      setMenu(menuBtn.getAttribute('aria-expanded') !== 'true');\n    });\n    root.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape' && menuBtn.getAttribute('aria-expanded') === 'true') {\n        setMenu(false);\n        menuBtn.focus();\n      }\n    });\n    \/\/ Close when tapping outside the header. Listens only; never cancels the event.\n    document.addEventListener('click', function (e) {\n      if (menuBtn.getAttribute('aria-expanded') === 'true' && header && !header.contains(e.target)) { setMenu(false); }\n    });\n  }\n\n  \/* ---------- Smooth scroll to our own sections, offset for header and admin bar ---------- *\/\n  function scrollOffset() {\n    var off = 0;\n    if (header && getComputedStyle(header).position === 'sticky') { off += header.offsetHeight; }\n    var bar = document.getElementById('wpadminbar');\n    if (bar && getComputedStyle(bar).position === 'fixed') { off += bar.offsetHeight; }\n    return off + 12;\n  }\n  function scrollToEl(el) {\n    var behavior = reduceMotion ? 'auto' : 'smooth';\n    var go = function (b) {\n      var top = el.getBoundingClientRect().top + window.pageYOffset - scrollOffset();\n      window.scrollTo({ top: Math.max(0, top), behavior: b });\n    };\n    go(behavior);\n    \/\/ If web fonts or images change the layout mid-scroll, settle on the right spot afterwards\n    var tries = 0;\n    var settle = function () {\n      var off = el.getBoundingClientRect().top - scrollOffset();\n      if (Math.abs(off) > 4 && tries++ < 3) { go(behavior); setTimeout(settle, 700); }\n    };\n    setTimeout(settle, 900);\n  }\n\n  \/* ---------- Menu prices: data-trs-prices is the single source ---------- *\/\n  function priceRow(ref) {\n    var rows = $$('[data-trs-service]');\n    for (var i = 0; i < rows.length; i++) { if (rows[i].getAttribute('data-trs-service') === ref) { return rows[i]; } }\n    return null;\n  }\n  function pricesFor(ref) {\n    var row = priceRow(ref);\n    if (!row) { return null; }\n    try { return JSON.parse(row.getAttribute('data-trs-prices')); } catch (err) { return null; }\n  }\n\n  \/* ---------- Mobile price switch ---------- *\/\n  var menu = $('.trs-menu');\n  $$('input[name=\"trs-price-dur\"]').forEach(function (r) {\n    r.addEventListener('change', function () { if (r.checked && menu) { menu.setAttribute('data-trs-dur', r.value); } });\n  });\n\n  \/* ---------- Hotel search (case and accent insensitive) ---------- *\/\n  function norm(s) {\n    return String(s).normalize('NFD').replace(\/[\u0300-\u036f]\/g, '').toLowerCase()\n      .replace(\/[^a-z0-9]+\/g, ' ').trim();\n  }\n  var hotels = $('.trs-hotels');\n  var hInput = $('#trs-hotel-search');\n  var hStatus = $('#trs-hotel-status');\n  var hNone = $('.trs-hnone');\n  var hGroups = $$('[data-trs-hgroup]');\n  var hTotal = $$('.trs-hlist li').length;\n\n  hGroups.forEach(function (g) {\n    var btn = g.querySelector('.trs-hgroup__more');\n    var count = g.querySelectorAll('.trs-hlist li').length;\n    if (!btn) { return; }\n    if (count <= 6) { btn.hidden = true; return; }\n    btn.addEventListener('click', function () {\n      var open = !g.classList.contains('trs-is-expanded');\n      g.classList.toggle('trs-is-expanded', open);\n      btn.setAttribute('aria-expanded', open ? 'true' : 'false');\n      btn.firstElementChild.textContent = open ? 'Show fewer' : 'Show all ' + count;\n    });\n  });\n\n  function filterHotels() {\n    var q = norm(hInput.value);\n    var shown = 0;\n    hotels.classList.toggle('trs-is-searching', q.length > 0);\n    hGroups.forEach(function (g) {\n      var n = 0;\n      Array.prototype.forEach.call(g.querySelectorAll('.trs-hlist li'), function (li) {\n        var match = !q || norm(li.textContent).indexOf(q) !== -1;\n        li.hidden = !match;\n        if (match) { n++; }\n      });\n      g.hidden = n === 0;\n      shown += n;\n    });\n    if (hNone) {\n      hNone.hidden = shown > 0;\n      if (shown === 0) {\n        var typed = hInput.value.trim();\n        hNone.querySelector('[data-trs-hquery]').textContent = typed;\n        hNone.querySelector('[data-trs-hnone-link]').href = 'https:\/\/wa.me\/' + WA_NUMBER + '?text=' +\n          encodeURIComponent('Hi Thara Royale Spa, do you visit ' + typed + '?');\n      }\n    }\n    if (hStatus) {\n      hStatus.textContent = !q ? hTotal + ' hotels and serviced suites'\n        : shown === 0 ? 'No matches' : 'Showing ' + shown + ' of ' + hTotal;\n    }\n  }\n  if (hInput && hotels) { hInput.addEventListener('input', filterHotels); }\n\n  \/* ---------- Carousels: treatment cards and reviews (buttons only, no autoplay) ---------- *\/\n  $$('[data-trs-step]').map(function (b) { return b.getAttribute('aria-controls'); })\n    .filter(function (id, i, all) { return all.indexOf(id) === i; })\n    .forEach(function (id) {\n      var track = root.querySelector('#' + id);\n      if (!track) { return; }\n      var btns = $$('[data-trs-step][aria-controls=\"' + id + '\"]');\n      var update = function () {\n        var max = track.scrollWidth - track.clientWidth - 2;\n        btns.forEach(function (b) {\n          b.disabled = b.getAttribute('data-trs-step') === '-1' ? track.scrollLeft <= 2 : track.scrollLeft >= max;\n        });\n      };\n      btns.forEach(function (b) {\n        b.addEventListener('click', function () {\n          var item = track.firstElementChild;\n          var step = item ? item.getBoundingClientRect().width + parseFloat(getComputedStyle(track).columnGap || 0) : track.clientWidth;\n          track.scrollBy({ left: step * Number(b.getAttribute('data-trs-step')), behavior: reduceMotion ? 'auto' : 'smooth' });\n        });\n      });\n      track.addEventListener('scroll', update, { passive: true });\n      window.addEventListener('resize', update, { passive: true });\n      update();\n    });\n\n  \/* ---------- Booking form ---------- *\/\n  var form = $('[data-trs-form]');\n  var formPrefill = null;\n  if (form) {\n    form.noValidate = true;\n    var f = {\n      name: $('#trs-f-name'),\n      phone: $('#trs-f-phone'),\n      service: $('#trs-f-service'),\n      duration: $('#trs-f-duration'),\n      date: $('#trs-f-date'),\n      time: $('#trs-f-time'),\n      location: $('#trs-f-location'),\n      notes: $('#trs-f-notes')\n    };\n    var durFixed = $('[data-trs-dur-fixed]');\n    var durHint = $('[data-trs-dur-hint]');\n    var durLabel = $('[data-trs-dur-label]');\n    var priceBox = $('[data-trs-pricebox]');\n    var submitWrap = $('[data-trs-submit-wrap]');\n    var sentWrap = $('[data-trs-sent]');\n    var sentLink = $('[data-trs-sent-link]');\n    var allSlots = Array.prototype.map.call(f.time.options, function (o) { return { value: o.value, label: o.text }; });\n\n    \/\/ Malaysia date and time, whatever the visitor's own time zone\n    function nowMY() {\n      var parts = {};\n      new Intl.DateTimeFormat('en-GB', {\n        timeZone: TZ, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hourCycle: 'h23'\n      }).formatToParts(new Date()).forEach(function (p) { parts[p.type] = p.value; });\n      return { ymd: parts.year + '-' + parts.month + '-' + parts.day, mins: Number(parts.hour) * 60 + Number(parts.minute) };\n    }\n    function ymdToUTC(ymd) { var p = ymd.split('-'); return Date.UTC(+p[0], +p[1] - 1, +p[2]); }\n    function addDays(ymd, n) {\n      var d = new Date(ymdToUTC(ymd) + n * 86400000);\n      return d.getUTCFullYear() + '-' + String(d.getUTCMonth() + 1).padStart(2, '0') + '-' + String(d.getUTCDate()).padStart(2, '0');\n    }\n    function fmtDate(ymd, withYear) {\n      var d = new Date(ymdToUTC(ymd));\n      return DAYS[d.getUTCDay()] + (withYear ? ', ' : ' ') + d.getUTCDate() + ' ' + MONTHS[d.getUTCMonth()] + (withYear ? ' ' + d.getUTCFullYear() : '');\n    }\n    function slotMins(v) { var p = v.split(':'); return Number(p[0]) * 60 + Number(p[1]); }\n\n    \/\/ Earliest date: today in Malaysia. Between 12 AM and 2 AM it is still \"tonight\"\n    \/\/ for the previous date, so yesterday stays open for its remaining late-night slots.\n    function minDate() {\n      var n = nowMY();\n      return n.mins < 120 ? addDays(n.ymd, -1) : n.ymd;\n    }\n    function refreshSlots() {\n      var keep = f.time.value;\n      var cutoff = -1;\n      if (f.date.value) {\n        var n = nowMY();\n        var dayDiff = Math.round((ymdToUTC(n.ymd) - ymdToUTC(f.date.value)) \/ 86400000);\n        if (dayDiff >= 0) { cutoff = dayDiff * 1440 + n.mins; }\n      }\n      while (f.time.options.length) { f.time.remove(0); }\n      var count = 0;\n      allSlots.forEach(function (s) {\n        if (s.value && slotMins(s.value) <= cutoff) { return; }\n        var o = document.createElement('option');\n        o.value = s.value;\n        o.text = s.label;\n        f.time.add(o);\n        if (s.value) { count++; }\n      });\n      f.time.value = keep;\n      if (f.time.value !== keep) { f.time.value = ''; }\n      f.time.options[0].text = count ? 'Choose a time' : 'No times left on this date';\n    }\n    f.date.min = minDate();\n    f.date.addEventListener('change', function () { refreshSlots(); clearErr(f.date); });\n    f.date.addEventListener('focus', function () { f.date.min = minDate(); });\n\n    \/\/ Service, duration and live price\n    function selectedOption() { return f.service.options[f.service.selectedIndex]; }\n    function currentService() {\n      var o = selectedOption();\n      var val = f.service.value;\n      if (!val) { return { kind: 'none' }; }\n      if (val === 'Not sure, please recommend') { return { kind: 'unsure', name: val }; }\n      var ref = (o && o.getAttribute('data-trs-ref')) || val;\n      var prices = pricesFor(ref) || {};\n      var keys = Object.keys(prices);\n      var massage = keys.length > 1;\n      return { kind: massage ? 'massage' : 'fixed', name: val, prices: prices, fixedDur: massage ? null : keys[0] };\n    }\n    function updateService() {\n      var s = currentService();\n      var isMassage = s.kind === 'massage';\n      f.duration.hidden = s.kind === 'fixed';\n      durFixed.hidden = s.kind !== 'fixed';\n      durHint.hidden = s.kind !== 'none';\n      durLabel.innerHTML = isMassage ? 'Duration<span class=\"trs-req\" aria-hidden=\"true\">*<\/span>' : 'Duration';\n      f.duration.required = isMassage;\n      f.duration.disabled = s.kind === 'unsure';\n      if (s.kind === 'fixed') { durFixed.textContent = s.fixedDur + ' min (set length)'; clearErr(f.duration); }\n      if (s.kind === 'unsure') { f.duration.value = ''; clearErr(f.duration); }\n      updatePrice();\n    }\n    function updatePrice() {\n      var s = currentService();\n      var note = ' Additional charges may apply outside Kuala Lumpur.';\n      var txt;\n      if (s.kind === 'none') { txt = 'Choose a treatment to see the price.' + note; }\n      else if (s.kind === 'unsure') { txt = \"Tell us what you'd like in the notes and we'll recommend a treatment and confirm the price on WhatsApp.\"; }\n      else if (s.kind === 'fixed') { txt = '<strong>Price: RM' + s.prices[s.fixedDur] + '<\/strong> for ' + s.fixedDur + ' min.' + note; }\n      else if (f.duration.value && s.prices[f.duration.value]) { txt = '<strong>Price: RM' + s.prices[f.duration.value] + '<\/strong> for ' + f.duration.value + ' min.' + note; }\n      else { txt = 'From RM' + s.prices['60'] + ' for 60 min. Choose a duration to see the price.' + note; }\n      priceBox.innerHTML = txt;\n    }\n    f.service.addEventListener('change', function () { updateService(); clearErr(f.service); });\n    f.duration.addEventListener('change', function () { updatePrice(); clearErr(f.duration); });\n    updateService();\n\n    \/\/ Validation: specific messages under each field, no alerts\n    function setErr(el, msg) {\n      var err = root.querySelector('#' + el.getAttribute('aria-describedby').split(' ').pop());\n      el.setAttribute('aria-invalid', 'true');\n      if (err) { err.textContent = msg; }\n    }\n    function clearErr(el) {\n      var ids = el.getAttribute('aria-describedby');\n      if (!ids) { return; }\n      var err = root.querySelector('#' + ids.split(' ').pop());\n      el.removeAttribute('aria-invalid');\n      if (err) { err.textContent = ''; }\n    }\n    [f.name, f.phone].forEach(function (el) { el.addEventListener('input', function () { clearErr(el); }); });\n    f.time.addEventListener('change', function () { clearErr(f.time); });\n\n    function validate() {\n      var bad = [];\n      var s = currentService();\n      if (!f.name.value.trim()) { setErr(f.name, 'Enter your name.'); bad.push(f.name); }\n      var phone = f.phone.value.trim();\n      var digits = phone.replace(\/\\D\/g, '');\n      if (!phone) { setErr(f.phone, 'Enter a phone number we can WhatsApp.'); bad.push(f.phone); }\n      else if (!\/^[+\\d\\s\\-().]+$\/.test(phone) || digits.length < 8 || digits.length > 15) {\n        setErr(f.phone, 'Enter a phone number we can WhatsApp, with at least 8 digits.'); bad.push(f.phone);\n      }\n      if (s.kind === 'none') { setErr(f.service, 'Choose a treatment, or \"Not sure, please recommend\".'); bad.push(f.service); }\n      if (s.kind === 'massage' && !f.duration.value) { setErr(f.duration, 'Choose 60, 90 or 120 minutes.'); bad.push(f.duration); }\n      if (!f.date.value) { setErr(f.date, 'Choose a date.'); bad.push(f.date); }\n      else if (f.date.value < minDate()) { setErr(f.date, 'Choose today or a later date.'); bad.push(f.date); }\n      if (!f.time.value) {\n        setErr(f.time, f.time.options.length > 1 ? 'Choose a time.' : 'No times left on this date. Choose another date.');\n        bad.push(f.time);\n      }\n      if (bad.length) { bad[0].focus(); }\n      return !bad.length;\n    }\n\n    function buildMessage() {\n      var s = currentService();\n      var lines = [\"Hi Thara Royale Spa, I'd like to book a session.\", ''];\n      lines.push('Name: ' + f.name.value.trim());\n      lines.push('Phone: ' + f.phone.value.trim());\n      if (s.kind === 'unsure') { lines.push('Service: Not sure, please recommend'); }\n      else {\n        var dur = s.kind === 'fixed' ? s.fixedDur : f.duration.value;\n        lines.push('Service: ' + s.name + ' (' + dur + ' min), RM' + s.prices[dur]);\n      }\n      lines.push('Date: ' + fmtDate(f.date.value, true));\n      var opt = f.time.options[f.time.selectedIndex];\n      var mins = slotMins(f.time.value);\n      var timeTxt = opt.text.replace(' (late night)', '');\n      if (mins >= 1440) { timeTxt += ' (late night, early ' + fmtDate(addDays(f.date.value, 1), false) + ')'; }\n      lines.push('Time: ' + timeTxt);\n      lines.push('Location: ' + (f.location.value.trim() || 'Not given'));\n      lines.push('Notes: ' + (f.notes.value.trim() || 'None'));\n      return lines.join('\\n');\n    }\n\n    form.addEventListener('submit', function (e) {\n      e.preventDefault();\n      if (!validate()) { return; }\n      var url = 'https:\/\/wa.me\/' + WA_NUMBER + '?text=' + encodeURIComponent(buildMessage());\n      track('booking_submit', { trs_service: f.service.value, trs_duration: f.duration.value || currentService().fixedDur || '' });\n      track('whatsapp_click', { trs_location: 'booking-form' });\n      sentLink.href = url;\n      submitWrap.hidden = true;\n      sentWrap.hidden = false;\n      var touch = window.matchMedia && window.matchMedia('(hover: none) and (pointer: coarse)').matches;\n      if (touch) { window.location.href = url; }\n      else { window.open(url, '_blank', 'noopener'); }\n    });\n    \/\/ Editing the form after sending brings the button back\n    form.addEventListener('input', function () { if (!sentWrap.hidden) { sentWrap.hidden = true; submitWrap.hidden = false; } });\n    form.addEventListener('change', function () { if (!sentWrap.hidden) { sentWrap.hidden = true; submitWrap.hidden = false; } });\n\n    \/\/ Menu \"Book\" links: pre-fill service (and duration), then scroll to the form\n    formPrefill = function (service, dur) {\n      f.service.value = service;\n      updateService();\n      var s = currentService();\n      if (s.kind === 'massage') {\n        var d = dur || (menu && window.matchMedia('(max-width: 767px)').matches ? menu.getAttribute('data-trs-dur') : '');\n        f.duration.value = d || '';\n      }\n      updatePrice();\n      clearErr(f.service);\n      clearErr(f.duration);\n    };\n  }\n\n  \/* ---------- One click handler on the root: in-page links, Book links, tracking ---------- *\/\n  root.addEventListener('click', function (e) {\n    var a = e.target.closest ? e.target.closest('a') : null;\n    if (!a || !root.contains(a)) { return; }\n\n    if (a.hasAttribute('data-trs-wa')) { track('whatsapp_click', { trs_location: a.getAttribute('data-trs-wa') }); }\n    if (a.hasAttribute('data-trs-call')) { track('call_click', { trs_location: a.getAttribute('data-trs-call') }); }\n\n    var href = a.getAttribute('href') || '';\n    if (href.charAt(0) !== '#' || href.length < 2) { return; }\n    var target = document.getElementById(href.slice(1));\n    if (!target || !root.contains(target)) { return; }\n\n    e.preventDefault();\n    if (nav && nav.classList.contains('trs-is-open')) { setMenu(false); }\n    if (a.hasAttribute('data-trs-book') && formPrefill) {\n      formPrefill(a.getAttribute('data-trs-book'), a.getAttribute('data-trs-dur'));\n    }\n    scrollToEl(target);\n    \/\/ Move focus for keyboard and screen reader users without a second jump\n    var focusEl = target;\n    if (a.hasAttribute('data-trs-book')) {\n      var firstEmpty = root.querySelector('#trs-f-name');\n      ['#trs-f-name', '#trs-f-phone', '#trs-f-date', '#trs-f-time'].some(function (sel) {\n        var el = root.querySelector(sel);\n        if (el && !el.value) { firstEmpty = el; return true; }\n        return false;\n      });\n      focusEl = firstEmpty || target;\n    } else if (!target.hasAttribute('tabindex')) {\n      target.setAttribute('tabindex', '-1');\n    }\n    try { focusEl.focus({ preventScroll: true }); } catch (err) { focusEl.focus(); }\n  });\n\n  \/* ---------- Motion: blocks rise in as they scroll into view ---------- *\/\n  \/\/ Only when the visitor allows motion. Hidden states live under .trs-motion,\n  \/\/ so if this never runs, every block is simply visible.\n  if (!reduceMotion && 'IntersectionObserver' in window) {\n    root.classList.add('trs-motion');\n    var REVEAL = [\n      '.trs-section .trs-h2', '.trs-section .trs-lead', '.trs-h3', '.trs-tags', '.trs-spec__tx .trs-link',\n      '.trs-menu-cat', '.trs-mrow', '.trs-scards__lead', '.trs-scards__track', '.trs-menu-notes', '.trs-step',\n      '.trs-home li', '.trs-alist li', '.trs-areas__foot', '.trs-search', '.trs-hgroup__title', '.trs-hlist li', '.trs-hotels__disc',\n      '.trs-band__in > *', '.trs-rev__sum', '.trs-rev__viewport', '.trs-rev__foot',\n      '.trs-form', '.trs-contact__title', '.trs-clist li', '.trs-faq__aside > *', '.trs-faq__item', '.trs-footer__grid > *'\n    ];\n    \/\/ Review cards are revealed as one track: cards scrolled sideways out of view\n    \/\/ would otherwise never count as visible.\n    var PHOTOS = ['.trs-spec__ph', '.trs-hotels__ph'];\n    var revealIO = new IntersectionObserver(function (entries) {\n      var n = 0;\n      entries.forEach(function (en) {\n        if (!en.isIntersecting) { return; }\n        var el = en.target;\n        var delay = Math.min(n++, 8) * 70;\n        revealIO.unobserve(el);\n        el.style.setProperty('--trs-delay', delay + 'ms');\n        el.classList.add('trs-in');\n        \/\/ Hand the element back to its own transitions (hover states) once it has settled\n        setTimeout(function () {\n          el.removeAttribute('data-trs-reveal');\n          el.classList.remove('trs-in');\n          el.style.removeProperty('--trs-delay');\n        }, delay + 1500);\n      });\n    }, { rootMargin: '0px 0px -8% 0px', threshold: 0.01 });\n    $$(REVEAL.join(',')).forEach(function (el) { el.setAttribute('data-trs-reveal', ''); revealIO.observe(el); });\n    $$(PHOTOS.join(',')).forEach(function (el) { el.setAttribute('data-trs-reveal', 'photo'); revealIO.observe(el); });\n\n    \/\/ Late-night band: the photo drifts a little slower than the page\n    var band = $('.trs-band');\n    var bandImg = $('.trs-band__img');\n    if (band && bandImg) {\n      var ticking = false;\n      var drift = function () {\n        ticking = false;\n        var r = band.getBoundingClientRect();\n        var vh = window.innerHeight;\n        if (r.bottom < 0 || r.top > vh) { return; }\n        var p = (r.top + r.height \/ 2 - vh \/ 2) \/ (vh \/ 2 + r.height \/ 2);\n        bandImg.style.transform = 'translate3d(0,' + (p * -8).toFixed(2) + '%,0)';\n      };\n      window.addEventListener('scroll', function () {\n        if (!ticking) { ticking = true; window.requestAnimationFrame(drift); }\n      }, { passive: true });\n      drift();\n    }\n  }\n\n  \/* ---------- Floating WhatsApp: hide while the hero booking card or the form is on screen ---------- *\/\n  \/\/ Both already carry their own WhatsApp link, and the button would cover them on phones.\n  var floatBtn = $('[data-trs-float]');\n  var floatCovers = [$('.trs-hero__card'), form].filter(Boolean);\n  if (floatBtn && floatCovers.length && 'IntersectionObserver' in window) {\n    var onScreen = [];\n    var floatIO = new IntersectionObserver(function (entries) {\n      entries.forEach(function (en) {\n        var i = onScreen.indexOf(en.target);\n        if (en.isIntersecting && i === -1) { onScreen.push(en.target); }\n        if (!en.isIntersecting && i !== -1) { onScreen.splice(i, 1); }\n      });\n      floatBtn.classList.toggle('trs-is-hidden', onScreen.length > 0);\n    }, { rootMargin: '0px 0px -10% 0px', threshold: 0 });\n    floatCovers.forEach(function (el) { floatIO.observe(el); });\n  }\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Thara Royale Spa Outcall spa, Kuala Lumpur Book now Menu Treatments Areas Hotels Reviews FAQ Where The Spa Comes To [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-8","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Outcall Massage Kuala Lumpur | Thara Royale Spa<\/title>\n<meta name=\"description\" content=\"Outcall massage in Kuala Lumpur at your home, condo or hotel room. Thai, deep tissue, urut, facials and nails. KLCC and Bukit Bintang. Daily 10 AM\u20132 AM.\" \/>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Outcall Massage Kuala Lumpur | Thara Royale Spa\" \/>\n<meta property=\"og:description\" content=\"Outcall massage in Kuala Lumpur at your home, condo or hotel room. Thai, deep tissue, urut, facials and nails. KLCC and Bukit Bintang. Daily 10 AM\u20132 AM.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/thararoyalespa.com\/\" \/>\n<meta property=\"og:site_name\" content=\"Thara Royal Spa\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-30T10:38:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-logo-badge.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/thararoyalespa.com\\\/\",\"url\":\"https:\\\/\\\/thararoyalespa.com\\\/\",\"name\":\"Outcall Massage Kuala Lumpur | Thara Royale Spa\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thararoyalespa.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/thararoyalespa.com\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/thararoyalespa.com\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thararoyalespa.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/trs-logo-badge.png\",\"datePublished\":\"2026-09-26T18:06:42+00:00\",\"dateModified\":\"2026-09-30T10:38:57+00:00\",\"description\":\"Outcall massage in Kuala Lumpur at your home, condo or hotel room. Thai, deep tissue, urut, facials and nails. KLCC and Bukit Bintang. Daily 10 AM\u20132 AM.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/thararoyalespa.com\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thararoyalespa.com\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/thararoyalespa.com\\\/#primaryimage\",\"url\":\"https:\\\/\\\/thararoyalespa.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/trs-logo-badge.png\",\"contentUrl\":\"https:\\\/\\\/thararoyalespa.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/trs-logo-badge.png\",\"width\":240,\"height\":240},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/thararoyalespa.com\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/thararoyalespa.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Thara Royal Spa &#8211; Home Spa in KL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/thararoyalespa.com\\\/#website\",\"url\":\"https:\\\/\\\/thararoyalespa.com\\\/\",\"name\":\"Thara Royal Spa\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/thararoyalespa.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Outcall Massage Kuala Lumpur | Thara Royale Spa","description":"Outcall massage in Kuala Lumpur at your home, condo or hotel room. Thai, deep tissue, urut, facials and nails. KLCC and Bukit Bintang. Daily 10 AM\u20132 AM.","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"Outcall Massage Kuala Lumpur | Thara Royale Spa","og_description":"Outcall massage in Kuala Lumpur at your home, condo or hotel room. Thai, deep tissue, urut, facials and nails. KLCC and Bukit Bintang. Daily 10 AM\u20132 AM.","og_url":"https:\/\/thararoyalespa.com\/","og_site_name":"Thara Royal Spa","article_modified_time":"2026-09-30T10:38:57+00:00","og_image":[{"url":"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-logo-badge.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/thararoyalespa.com\/","url":"https:\/\/thararoyalespa.com\/","name":"Outcall Massage Kuala Lumpur | Thara Royale Spa","isPartOf":{"@id":"https:\/\/thararoyalespa.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/thararoyalespa.com\/#primaryimage"},"image":{"@id":"https:\/\/thararoyalespa.com\/#primaryimage"},"thumbnailUrl":"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-logo-badge.png","datePublished":"2026-09-26T18:06:42+00:00","dateModified":"2026-09-30T10:38:57+00:00","description":"Outcall massage in Kuala Lumpur at your home, condo or hotel room. Thai, deep tissue, urut, facials and nails. KLCC and Bukit Bintang. Daily 10 AM\u20132 AM.","breadcrumb":{"@id":"https:\/\/thararoyalespa.com\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thararoyalespa.com\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/thararoyalespa.com\/#primaryimage","url":"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-logo-badge.png","contentUrl":"https:\/\/thararoyalespa.com\/wp-content\/uploads\/2026\/09\/trs-logo-badge.png","width":240,"height":240},{"@type":"BreadcrumbList","@id":"https:\/\/thararoyalespa.com\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/thararoyalespa.com\/"},{"@type":"ListItem","position":2,"name":"Thara Royal Spa &#8211; Home Spa in KL"}]},{"@type":"WebSite","@id":"https:\/\/thararoyalespa.com\/#website","url":"https:\/\/thararoyalespa.com\/","name":"Thara Royal Spa","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/thararoyalespa.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/thararoyalespa.com\/index.php?rest_route=\/wp\/v2\/pages\/8","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thararoyalespa.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/thararoyalespa.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/thararoyalespa.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thararoyalespa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8"}],"version-history":[{"count":32,"href":"https:\/\/thararoyalespa.com\/index.php?rest_route=\/wp\/v2\/pages\/8\/revisions"}],"predecessor-version":[{"id":67,"href":"https:\/\/thararoyalespa.com\/index.php?rest_route=\/wp\/v2\/pages\/8\/revisions\/67"}],"wp:attachment":[{"href":"https:\/\/thararoyalespa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}