/* =========================================================================
   SIRINAPA — styles for the new pages only.

   Every rule below starts with .page-catalog or .page-object. Both
   classes sit on <body>, so the wrapper styles the page without a single
   bare `body`, `h1`, `p`, `a` or `:root` rule. index.html does not link
   this file and cannot be affected by it.

   success.html carries class="page-object page-success" — it reuses the
   object palette and adds a couple of rules of its own.

   Palette, fonts and numeral settings are copied from index.html, not
   invented: same dark ground, same gold, same Cormorant Garamond + Inter.
   Cinzel is not used because index.html does not use it and does not
   load it.
   ========================================================================= */

/* ---------------- base ---------------- */
.page-catalog,
.page-object {
  --ink: #0d1013;
  --ink-2: #151a1f;
  --ink-3: #1d242b;
  --gold: #c9a227;
  --gold-soft: #e0c265;
  --paper: #f4f1ec;
  --muted: #9aa3ab;
  --line: rgba(201, 162, 39, .28);
  --maxw: 1180px;

  /* Serif fallbacks so a Chinese or Thai heading does not drop to a
     system sans and make the page look like a different, cheaper site. */
  --font-display: 'Cormorant Garamond', 'Noto Serif SC', 'Songti SC', 'SimSun',
                  'Noto Serif Thai', 'Thonburi', Georgia, serif;
  /* System Chinese fonts ahead of the web one. The web build of Noto CJK
     ships without hinting and blurs on an ordinary screen under Windows;
     PingFang SC and Microsoft YaHei are made for the screen. Latin still
     comes from Inter and Thai from Noto Sans Thai — neither PingFang nor
     YaHei carries Thai, and the order guarantees it. Noto Sans SC stays
     for Android and Linux, which have neither system face. */
  --font-body: Inter, 'Noto Sans Thai', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC',
               system-ui, -apple-system, sans-serif;

  margin: 0;
  padding: 0;
  background: var(--ink);
  color: var(--paper);
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 17px;
  line-height: 1.7;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;

  /* Old-style figures turn 131 into I3I. Straight figures everywhere. */
  font-variant-numeric: lining-nums;
  -webkit-font-feature-settings: "lnum" 1, "onum" 0;
  font-feature-settings: "lnum" 1, "onum" 0;
}

/* Thai vowel and tone marks stack above and below the line and collide
   at the Latin default leading. */
html[lang="th"] .page-catalog,
html[lang="th"] .page-object { line-height: 1.75; }

/* Thai and letter-spacing do not go together. Spacing pushes apart more
   than letters: the vowel signs and tone marks that sit above and below a
   letter come loose and hang in the gap, and a word reads as debris. In
   Thai the spacing goes off the whole page, with one exception — the
   language buttons, or the header would jump on every switch.
   !important because several of the rules that set letter-spacing are
   more specific than this selector. The wrapper class sits on <body>, so
   this stays scoped to the new pages. */
html[lang="th"] .page-catalog *:not([data-lang]),
html[lang="th"] .page-object *:not([data-lang]) { letter-spacing: 0 !important; }

/* A floor on the size for Chinese and Thai.
   A Latin capital has two or three strokes and reads fine at 11px. A
   Chinese character has ten to fifteen and they merge into a blot at that
   size; Thai vowel signs and tone marks become impossible to tell apart.
   13px, and only for the selectors that measurement found below it. The
   extra attribute selector outweighs the originals, media queries
   included. */
html[lang="zh-CN"] .page-catalog .eyebrow,
html[lang="zh-CN"] .page-object .eyebrow,
html[lang="th"] .page-catalog .eyebrow,
html[lang="th"] .page-object .eyebrow,
html[lang="zh-CN"] .page-catalog .mini,
html[lang="zh-CN"] .page-object .mini,
html[lang="th"] .page-catalog .mini,
html[lang="th"] .page-object .mini,
html[lang="zh-CN"] .page-catalog label,
html[lang="zh-CN"] .page-object label,
html[lang="th"] .page-catalog label,
html[lang="th"] .page-object label,
html[lang="zh-CN"] .page-catalog .langs button,
html[lang="zh-CN"] .page-object .langs button,
html[lang="th"] .page-catalog .langs button,
html[lang="th"] .page-object .langs button,
html[lang="zh-CN"] .page-object .tag,
html[lang="th"] .page-object .tag,
html[lang="zh-CN"] .page-object .spec .k,
html[lang="th"] .page-object .spec .k,
html[lang="zh-CN"] .page-object .crumb,
html[lang="th"] .page-object .crumb,
html[lang="zh-CN"] .page-object .aerial-cap,
html[lang="th"] .page-object .aerial-cap,
html[lang="zh-CN"] .page-object .price small,
html[lang="th"] .page-object .price small,
html[lang="zh-CN"] .page-catalog .pcard-type,
html[lang="th"] .page-catalog .pcard-type,
html[lang="zh-CN"] .page-catalog .pcard-badge,
html[lang="th"] .page-catalog .pcard-badge,
html[lang="zh-CN"] .page-catalog .ph,
html[lang="th"] .page-catalog .ph,
html[lang="zh-CN"] .page-catalog .filters button,
html[lang="th"] .page-catalog .filters button { font-size: 13px; }

/* Wide letter-spacing is a Latin device. Chinese does not use it: the
   characters already sit on their own square grid and the extra gap pulls
   the line apart. The language buttons keep theirs, or the header would
   jump on every switch. */
html[lang="zh-CN"] .page-catalog *:not([data-lang]),
html[lang="zh-CN"] .page-object *:not([data-lang]) { letter-spacing: .05em !important; }

/* Capitals are a Latin device too, and characters ignore them — but the
   Latin inside the same caption does not. In Chinese the key facts read
   «平方哇 · 524 M²» instead of «m²». Capitals are cancelled for Chinese
   only; English and Thai keep them. */
html[lang="zh-CN"] .page-object .spec .k { text-transform: none; }

/* Weights in Chinese.
   The light 300 comes from the wrapper and from the form fields. It suits
   Latin, but thin Chinese strokes at 13-16px in grey read as washed out,
   so Chinese gets the regular weight. The display face must not move, and
   only .spec .v declares a weight of its own — .price, .pcard-price and
   .loc-place inherit 300 from the wrapper and would have been dragged up
   with it, so they are given their 300 back by name. The small print
   inside them is set in Inter and stays at 400.
   The 600 on badges, buttons and the active filter welds the ten to
   fifteen strokes of a character into a blot at 13px. 500 gives Microsoft
   YaHei Regular on Windows, PingFang SC Medium on iPhone and Noto Sans SC
   500 on Android. The language buttons keep what they have. */
html[lang="zh-CN"] .page-catalog,
html[lang="zh-CN"] .page-object,
html[lang="zh-CN"] .page-catalog input, html[lang="zh-CN"] .page-catalog select,
html[lang="zh-CN"] .page-catalog textarea,
html[lang="zh-CN"] .page-object input, html[lang="zh-CN"] .page-object select,
html[lang="zh-CN"] .page-object textarea { font-weight: 400; }

html[lang="zh-CN"] .page-object .tag,
html[lang="zh-CN"] .page-catalog .pcard-badge,
html[lang="zh-CN"] .page-catalog .btn,
html[lang="zh-CN"] .page-object .btn,
html[lang="zh-CN"] .page-catalog .filters button[aria-pressed="true"] { font-weight: 500; }

html[lang="zh-CN"] .page-object .price,
html[lang="zh-CN"] .page-catalog .pcard-price,
html[lang="zh-CN"] .page-object .loc-place { font-weight: 300; }
html[lang="zh-CN"] .page-object .price small { font-weight: 400; }

.page-catalog *,
.page-object * { box-sizing: border-box; }

.page-catalog img,
.page-object img { max-width: 100%; height: auto; display: block; }

/* <picture> is only a wrapper that offers the WebP files; it must not
   become a box of its own, or the <img> inside would size itself against
   the wrapper instead of .shot / .hero-media as it always has. */
.page-catalog picture,
.page-object picture { display: contents; }

.page-catalog a,
.page-object a { color: inherit; }

.page-catalog h1, .page-catalog h2, .page-catalog h3,
.page-object h1, .page-object h2, .page-object h3 {
  font-family: var(--font-display);
  font-weight: 400;
  line-height: 1.15;
  margin: 0;
}

.page-catalog a:focus-visible,
.page-catalog button:focus-visible,
.page-catalog input:focus-visible,
.page-catalog select:focus-visible,
.page-catalog textarea:focus-visible,
.page-object a:focus-visible,
.page-object button:focus-visible,
.page-object input:focus-visible,
.page-object select:focus-visible,
.page-object textarea:focus-visible {
  outline: 2px solid var(--gold-soft);
  outline-offset: 2px;
}

.page-catalog .wrap,
.page-object .wrap {
  width: 100%;
  max-width: var(--maxw);
  margin: 0 auto;
  padding: 0 30px;
}

.page-catalog .eyebrow,
.page-object .eyebrow {
  font-size: 11px;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--gold);
  font-weight: 500;
  margin-bottom: 18px;
}

.page-catalog section,
.page-object section { padding: 78px 0; }

.page-catalog .sec-head,
.page-object .sec-head { margin-bottom: 42px; max-width: 760px; }

.page-catalog .sec-head h2,
.page-object .sec-head h2 { font-size: clamp(26px, 4.6vw, 42px); margin-bottom: 14px; }

.page-catalog .sec-head p,
.page-object .sec-head p { color: var(--muted); font-size: 18px; margin: 0; }

.page-catalog .btn,
.page-object .btn {
  display: inline-block;
  background: var(--gold);
  color: #0d1013;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 13px;
  letter-spacing: .12em;
  text-transform: uppercase;
  padding: 15px 30px;
  border-radius: 2px;
  text-decoration: none;
  border: 1px solid var(--gold);
  transition: .2s;
  cursor: pointer;
  min-height: 48px;
}
.page-catalog .btn:hover,
.page-object .btn:hover { background: transparent; color: var(--gold); }
.page-catalog .btn.ghost,
.page-object .btn.ghost { background: transparent; color: var(--gold); }
.page-catalog .btn.ghost:hover,
.page-object .btn.ghost:hover { background: var(--gold); color: #0d1013; }

/* ---------------- header (copied from index.html) ---------------- */
.page-catalog header,
.page-object header {
  position: sticky;
  top: 0;
  z-index: 60;
  background: rgba(13, 16, 19, .86);
  backdrop-filter: blur(14px);
  border-bottom: 1px solid rgba(255, 255, 255, .06);
}
.page-catalog .bar,
.page-object .bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  height: 68px;
}
.page-catalog .brand,
.page-object .brand { display: flex; align-items: center; min-width: 0; }
.page-catalog .brand img,
.page-object .brand img { height: 40px; width: auto; }
.page-catalog .langs,
.page-object .langs { display: flex; gap: 2px; flex: none; }
.page-catalog .langs button,
.page-object .langs button {
  background: none;
  border: 1px solid transparent;
  color: var(--muted);
  font-family: inherit;
  font-size: 13px;
  letter-spacing: .06em;
  padding: 8px 11px;
  border-radius: 2px;
  cursor: pointer;
  transition: .2s;
}
.page-catalog .langs button:hover,
.page-object .langs button:hover { color: var(--paper); }
.page-catalog .langs button[aria-pressed="true"],
.page-object .langs button[aria-pressed="true"] {
  color: var(--ink);
  background: var(--gold);
  border-color: var(--gold);
  font-weight: 500;
}

/* A 44px tap area where the text is small. It is grown with an
   invisible overlay rather than with padding, so the button and the
   link look exactly as they do on index.html — only the area a thumb
   can hit changes. The same rules live in the <style> block of
   index.html, so the two headers stay identical. */
.page-catalog .langs button::after,
.page-object .langs button::after,
.page-catalog .contacts a::after,
.page-object .contacts a::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
}
.page-catalog .langs button,
.page-object .langs button { position: relative; }
/* A fixed height, not offsets from the edges: the button carries a
   transparent 1px border, an absolutely positioned child is laid out
   against the padding box, and the offsets came out at 42px. */
.page-catalog .langs button::after,
.page-object .langs button::after { top: 50%; transform: translateY(-50%); height: 48px; }
.page-catalog .contacts a,
.page-object .contacts a { position: relative; }
.page-catalog .contacts a::after,
.page-object .contacts a::after { top: 50%; transform: translateY(-50%); height: 48px; }

/* ---------------- catalog: intro and filter ---------------- */
.page-catalog .cat-top { padding: 62px 0 0; }
.page-catalog .cat-top h1 { font-size: clamp(34px, 6.4vw, 58px); margin-bottom: 14px; }
.page-catalog .cat-top p { color: var(--muted); font-size: 18px; margin: 0; max-width: 640px; }

.page-catalog .filters {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 34px 0 0;
  padding: 0 0 34px;
  border-bottom: 1px solid rgba(255, 255, 255, .07);
}
.page-catalog .filters button {
  background: none;
  border: 1px solid rgba(255, 255, 255, .16);
  color: var(--muted);
  font-family: inherit;
  font-size: 12px;
  font-weight: 500;
  letter-spacing: .12em;
  text-transform: uppercase;
  padding: 13px 18px;
  min-height: 46px;
  border-radius: 2px;
  cursor: pointer;
  transition: .2s;
}
.page-catalog .filters button:hover { color: var(--paper); border-color: var(--line); }
.page-catalog .filters button[aria-pressed="true"] {
  color: var(--ink);
  background: var(--gold);
  border-color: var(--gold);
  font-weight: 600;
}

.page-catalog .cat-list { padding-top: 44px; }
.page-catalog .empty {
  color: var(--muted);
  font-size: 18px;
  border-left: 2px solid var(--line);
  padding: 6px 0 6px 20px;
  margin: 0;
  max-width: 560px;
}

/* ---------------- catalog: cards ---------------- */
/* A card is a flex column, never a grid item that stretches its rows:
   in a grid the inner rows grow with the tallest card and the
   proportions break. The bottom block is pushed down with margin-top
   auto so the buttons line up across cards of different length. */
.page-catalog .cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(290px, 100%), 1fr));
  gap: 20px;
}
.page-catalog .pcard {
  display: flex;
  flex-direction: column;
  min-width: 0;
  background: var(--ink-2);
  border: 1px solid rgba(255, 255, 255, .08);
  overflow: hidden;
  transition: border-color .25s;
}
.page-catalog .pcard:hover { border-color: var(--line); }

/* A filtered-out card must actually disappear. The browser's own
   [hidden]{display:none} loses to any author rule, and .pcard sets
   display:flex — so the rule has to be written out here. */
.page-catalog .pcard[hidden] { display: none; }

.page-catalog .pcard-thumb {
  display: block;
  position: relative;
  aspect-ratio: 3/2;
  max-width: 100%;
  overflow: hidden;
  background: var(--ink-3);
}
.page-catalog .pcard-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform .8s ease;
}
.page-catalog .pcard:hover .pcard-thumb img { transform: scale(1.04); }

/* «Reserved» over the picture: the solid gold badge of the first screen
   (.tag.solid on index.html), declaration for declaration, pinned to the
   top-left corner of the thumbnail. Thai loses its tracking and Chinese
   and Thai get the 13px floor from the rules above, like every other
   badge on the site. */
.page-catalog .pcard-badge {
  position: absolute;
  top: 12px;
  left: 12px;
  z-index: 1;
  display: inline-flex;
  align-items: center;
  border: 1px solid var(--gold);
  background: var(--gold);
  color: #0d1013;
  font-size: 11px;
  letter-spacing: .18em;
  text-transform: uppercase;
  font-weight: 600;
  line-height: 1;
  padding: 10px 14px;
  border-radius: 2px;
}

/* No photograph yet: the slot stays, and the hatching of the main page
   goes into it. Same box, same proportion, so the three cards keep one
   line — and the visitor is told the photographs are on their way
   rather than left wondering what is missing. */
.page-catalog .pcard-thumb--ph { background: var(--ink-3); }
.page-catalog .pcard-thumb--ph .ph {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 18px;
  color: var(--muted);
  font-size: 12px;
  letter-spacing: .1em;
  text-transform: uppercase;
  background: repeating-linear-gradient(45deg, #1d242b, #1d242b 12px, #202830 12px, #202830 24px);
}

/* A gold hairline at the top and a little more air: the card without a
   photograph still reads as its own kind of card. */
.page-catalog .pcard--plain {
  border-top: 2px solid var(--gold);
  background: linear-gradient(165deg, #1a2128 0%, var(--ink-2) 62%);
}
.page-catalog .pcard--plain .pcard-body { padding-top: 34px; }

.page-catalog .pcard-body {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-width: 0;
  padding: 24px 22px 26px;
}
.page-catalog .pcard-type {
  font-size: 11px;
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--gold);
  font-weight: 500;
  margin-bottom: 12px;
}
.page-catalog .pcard-body h2 {
  font-size: clamp(23px, 3.4vw, 28px);
  margin-bottom: 8px;
  overflow-wrap: break-word;
}
.page-catalog .pcard-place {
  color: var(--muted);
  font-size: 13px;
  letter-spacing: .1em;
  text-transform: uppercase;
  margin-bottom: 18px;
}
.page-catalog .pcard-price {
  font-family: var(--font-display);
  font-size: clamp(26px, 4.4vw, 32px);
  color: #f4e09a;
  line-height: 1.1;
  padding-bottom: 18px;
  border-bottom: 1px solid rgba(255, 255, 255, .08);
  margin-bottom: 18px;
}
.page-catalog .pcard-specs {
  list-style: none;
  margin: 0 0 18px;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 6px 18px;
  font-size: 15px;
  color: var(--paper);
}
.page-catalog .pcard-specs li { white-space: nowrap; }
.page-catalog .pcard-feat {
  list-style: none;
  margin: 0;
  padding: 0;
  color: var(--muted);
  font-size: 15px;
  line-height: 1.65;
}
.page-catalog .pcard-feat li { position: relative; padding-left: 18px; }
.page-catalog .pcard-feat li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 12px;
  width: 9px;
  height: 1px;
  background: var(--gold);
}
.page-catalog .pcard-foot { margin-top: auto; padding-top: 24px; }
.page-catalog .pcard-foot .btn { display: block; text-align: center; width: 100%; }

.page-catalog .cat-note {
  color: var(--muted);
  font-size: 15px;
  margin: 40px 0 0;
  max-width: 620px;
}

/* ---------------- object: hero ---------------- */
.page-object .hero {
  position: relative;
  min-height: 88vh;
  display: flex;
  align-items: flex-end;
  overflow: hidden;
}
.page-object .hero-media { position: absolute; inset: 0; }
.page-object .hero-media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
  transform: scale(1.07);
  transition: opacity 1.6s ease;
  will-change: opacity, transform;
}
.page-object .hero-media img.on { opacity: 1; animation: pgkb 8.6s ease-out forwards; }
@keyframes pgkb { from { transform: scale(1); } to { transform: scale(1.07); } }
@media (prefers-reduced-motion: reduce) {
  .page-object .hero-media img { transition: opacity .4s ease; transform: none; }
  .page-object .hero-media img.on { animation: none; transform: none; }
}
.page-object .hero::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(13, 16, 19, .55) 0%, rgba(13, 16, 19, .25) 35%, rgba(13, 16, 19, .92) 100%);
}
.page-object .hero-in { position: relative; z-index: 2; width: 100%; padding: 0 0 58px; }
.page-object .tags { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 22px; }
.page-object .tag {
  display: inline-flex;
  align-items: center;
  border: 1px solid var(--gold);
  color: #f7e6a8;
  background: rgba(10, 13, 16, .66);
  font-size: 11px;
  letter-spacing: .18em;
  text-transform: uppercase;
  font-weight: 600;
  line-height: 1;
  padding: 10px 14px;
  border-radius: 2px;
}
.page-object .tag.solid { background: var(--gold); color: #0d1013; }
.page-object .hero h1 {
  font-size: clamp(36px, 8.6vw, 78px);
  letter-spacing: -.015em;
  margin-bottom: 14px;
  text-shadow: 0 3px 14px rgba(0, 0, 0, .5);
}
.page-object .place {
  color: #cbd3da;
  font-size: 14px;
  letter-spacing: .16em;
  text-transform: uppercase;
  margin-bottom: 26px;
  text-shadow: 0 2px 8px rgba(0, 0, 0, .75);
}
.page-object .price {
  display: block;
  width: max-content;
  max-width: 100%;
  font-family: var(--font-display);
  font-size: clamp(30px, 6.8vw, 56px);
  color: #f4e09a;
  line-height: 1.05;
  background: rgba(10, 13, 16, .58);
  border-left: 3px solid var(--gold);
  padding: 12px 22px 14px;
  margin-bottom: 26px;
  text-shadow: 0 2px 10px rgba(0, 0, 0, .55);
  overflow-wrap: break-word;
}
.page-object .price small {
  display: block;
  font-family: var(--font-body);
  font-size: 12px;
  letter-spacing: .12em;
  color: #b9c1c8;
  margin-top: 8px;
  text-transform: uppercase;
}
.page-object .crumb {
  display: inline-block;
  position: relative;
  margin-bottom: 20px;
  font-size: 12px;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--gold);
  text-decoration: none;
  border-bottom: 1px solid var(--line);
  padding: 6px 0 4px;
}

/* A small text link is a small target on a phone. The hit area is grown
   to 44px with an invisible overlay instead of padding, so the gold
   underline stays where it belongs. */
.page-object .crumb::after,
.page-object .map-link::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
  height: 48px;
}
.page-object .map-link { position: relative; }

/* ---------------- object: key facts ---------------- */
.page-object .specs { background: var(--ink-2); }
/* index.html paints the hairlines by showing the container background
   through 1px gaps. That only works while the tiles fill the grid
   exactly: here the number of tiles depends on how many fields the
   property actually has, and three tiles in a two-column grid left the
   empty fourth cell glowing gold. The lines are drawn by the tiles
   themselves instead, so a missing tile leaves nothing behind. */
.page-object .grid-specs {
  display: flex;
  flex-wrap: wrap;
  gap: 1px;
  background: transparent;
}
/* Flex, not grid, on purpose: the number of tiles depends on how many
   fields the property actually has, and in a grid a short last row
   leaves a hole. Flex stretches the last row across the full width, so
   three tiles or five tiles both look deliberate. */
.page-object .spec {
  flex: 1 1 150px;
  background: var(--ink-2);
  outline: 1px solid var(--line);
  padding: 42px 18px;
  text-align: center;
  min-width: 0;
}
.page-object .spec .v {
  font-family: var(--font-display);
  font-size: 44px;
  font-weight: 300;
  color: var(--gold);
  margin-bottom: 10px;
  line-height: 1;
  overflow-wrap: break-word;
}
.page-object .spec .k { font-size: 11px; letter-spacing: .2em; text-transform: uppercase; color: var(--muted); }

/* ---------------- object: features ---------------- */
.page-object .feat-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 0 46px;
  list-style: none;
  margin: 0;
  padding: 0;
}
.page-object .feat-grid li {
  position: relative;
  padding: 16px 0 16px 24px;
  border-bottom: 1px solid rgba(255, 255, 255, .07);
  font-size: 17px;
  line-height: 1.6;
}
.page-object .feat-grid li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 27px;
  width: 11px;
  height: 1px;
  background: var(--gold);
}
.page-object .feat-note { color: var(--muted); font-size: 15px; margin: 24px 0 0; max-width: 640px; }

/* ---------------- object: floor plans ----------------
   Not one of the twelve competitor pages we checked publishes a floor
   plan. It gets its own section above the gallery, on a white sheet:
   a drawing must not be cropped. */
.page-object .plans { background: var(--ink-2); }
.page-object .plan-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr));
  gap: 16px;
}
.page-object .plan { background: #fff; border: 1px solid var(--line); padding: 10px; min-width: 0; }
.page-object .plan img { width: 100%; height: auto; cursor: zoom-in; }

/* ---------------- object: gallery ---------------- */
.page-object .gal {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr));
  gap: 14px;
}

/* Phones: two columns instead of one.
   In a single column the twenty-four photographs are twenty-four screens
   of scrolling, and nobody reaches the enquiry form underneath them.
   Only the track count changes: the 4:3 box stays, so every frame keeps
   exactly the crop it had, and the tile is still far wider than a thumb.
   From 600px up nothing here applies — the grid is left as it was. */
@media (max-width: 599px) {
  .page-object .gal { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
.page-object .shot {
  position: relative;
  aspect-ratio: 4/3;
  max-width: 100%;
  overflow: hidden;
  background: var(--ink-3);
  border: 1px solid rgba(255, 255, 255, .05);
}
.page-object .shot img { width: 100%; height: 100%; object-fit: cover; transition: transform .8s ease; cursor: zoom-in; }
.page-object .shot:hover img { transform: scale(1.04); }

/* ---------------- object: location ---------------- */
.page-object .loc { background: var(--ink-2); }
.page-object .loc-grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: 34px; }
.page-object .aerial {
  position: relative;
  margin-bottom: 34px;
  border: 1px solid rgba(255, 255, 255, .06);
  overflow: hidden;
}
.page-object .aerial img { width: 100%; aspect-ratio: 16/9; max-width: 100%; object-fit: cover; cursor: zoom-in; }
.page-object .aerial-cap {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 52px 18px 16px;
  background: linear-gradient(180deg, rgba(13, 16, 19, 0), rgba(13, 16, 19, .55) 45%, rgba(13, 16, 19, .92));
  font-size: 12px;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: #cfd6dc;
  text-shadow: 0 1px 3px rgba(0, 0, 0, .8);
}
.page-object .loc-place {
  font-family: var(--font-display);
  font-size: clamp(22px, 3.6vw, 30px);
  color: var(--paper);
  margin: 0 0 10px;
}
.page-object .loc-sub { color: var(--muted); font-size: 15px; margin: 0; }
.page-object .map {
  aspect-ratio: 4/3;
  background: var(--ink-3);
  border: 1px solid var(--line);
  position: relative;
  overflow: hidden;
}
.page-object .map iframe { width: 100%; height: 100%; border: 0; filter: saturate(1.25) contrast(1.06); }
.page-object .map-tap { position: absolute; inset: 0; background: transparent; border: 0; cursor: zoom-in; }
.page-object .map-link {
  display: inline-block;
  margin-top: 14px;
  font-size: 13px;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--gold);
  text-decoration: none;
  border-bottom: 1px solid var(--line);
  padding-bottom: 3px;
}
.page-object .mapfull { position: fixed; inset: 0; background: var(--ink); z-index: 210; display: none; flex-direction: column; }
.page-object .mapfull.on { display: flex; }
.page-object .mapfull iframe { flex: 1; width: 100%; border: 0; }
.page-object .mapfull-bar { display: flex; justify-content: flex-end; padding: 8px 10px; background: var(--ink); }
.page-object .mapfull-bar button {
  background: none; border: 0; color: var(--paper);
  font-size: 34px; line-height: 1; cursor: pointer; padding: 4px 12px;
}

/* ---------------- object: who pays what ---------------- */
.page-object .costs-list { list-style: none; margin: 0; padding: 0; max-width: 760px; }
.page-object .costs-list li {
  position: relative;
  padding: 18px 0 18px 26px;
  border-bottom: 1px solid rgba(255, 255, 255, .07);
  font-size: 17px;
}
.page-object .costs-list li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 29px;
  width: 11px;
  height: 1px;
  background: var(--gold);
}
.page-object .costs-note { color: var(--muted); font-size: 15px; margin: 22px 0 0; max-width: 700px; }

/* Contact buttons inside the page, under the key facts and under the
   floor plans. Deliberately quiet: the same ghost button as everywhere
   else, on a hairline, with no pulsing, floating or blinking. The only
   movement is the 0.2s colour change every button on this site has. */
.page-object .contact-cta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  margin-top: 40px;
  padding-top: 30px;
  border-top: 1px solid rgba(255, 255, 255, .07);
}
/* WeChat QR, shown only when assets/data.js holds a picture for it.
   The button that opens it now stands in the footer as well, so the
   overlay has to work on the catalogue too, not only on object pages.
   index.html keeps its own copy of these rules inline, as it does with
   every other style: it loads no stylesheet of the site's own. */
.page-catalog .qr,
.page-object .qr {
  position: fixed;
  inset: 0;
  z-index: 220;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 20px;
  background: rgba(8, 10, 12, .95);
}
.page-catalog .qr.on,
.page-object .qr.on { display: flex; }
.page-catalog .qr-box,
.page-object .qr-box { background: #fff; padding: 18px; max-width: 320px; }
.page-catalog .qr-box img,
.page-object .qr-box img { width: 100%; height: auto; }
.page-catalog .qr-close,
.page-object .qr-close {
  position: absolute;
  top: 8px;
  right: 14px;
  background: none;
  border: 0;
  color: var(--paper);
  font-size: 38px;
  line-height: 1;
  cursor: pointer;
  padding: 6px 10px;
}

/* ---------------- form ---------------- */
.page-catalog .form,
.page-object .form { background: var(--ink-2); }
.page-catalog form,
.page-object form {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr));
  gap: 16px;
  max-width: 820px;
}
.page-catalog .field,
.page-object .field { display: flex; flex-direction: column; gap: 7px; min-width: 0; }
.page-catalog .field.full,
.page-object .field.full { grid-column: 1/-1; }
.page-catalog label,
.page-object label { font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: var(--muted); }
.page-catalog input, .page-catalog select, .page-catalog textarea,
.page-object input, .page-object select, .page-object textarea {
  background: var(--ink);
  border: 1px solid rgba(255, 255, 255, .12);
  color: var(--paper);
  font-family: inherit;
  font-size: 16px;
  font-weight: 300;
  padding: 13px 14px;
  border-radius: 2px;
  transition: border-color .2s;
  width: 100%;
  min-height: 48px;
}
.page-catalog input:focus, .page-catalog select:focus, .page-catalog textarea:focus,
.page-object input:focus, .page-object select:focus, .page-object textarea:focus {
  outline: none;
  border-color: var(--gold);
}
/* Autofill on an iPhone or in Chrome paints the field its own yellow and
   picks its own text colour — a bright patch on a dark page. The
   background can only be overridden with an inset shadow, the text with
   -webkit-text-fill-color, and the transition is pushed out to 9999s or
   the browser animates the yellow back. Same colours as a plain field. */
.page-catalog input:-webkit-autofill, .page-catalog input:-webkit-autofill:hover, .page-catalog input:-webkit-autofill:focus,
.page-catalog select:-webkit-autofill, .page-catalog select:-webkit-autofill:hover, .page-catalog select:-webkit-autofill:focus,
.page-catalog textarea:-webkit-autofill, .page-catalog textarea:-webkit-autofill:hover, .page-catalog textarea:-webkit-autofill:focus,
.page-object input:-webkit-autofill, .page-object input:-webkit-autofill:hover, .page-object input:-webkit-autofill:focus,
.page-object select:-webkit-autofill, .page-object select:-webkit-autofill:hover, .page-object select:-webkit-autofill:focus,
.page-object textarea:-webkit-autofill, .page-object textarea:-webkit-autofill:hover, .page-object textarea:-webkit-autofill:focus {
  -webkit-text-fill-color: var(--paper);
  caret-color: var(--paper);
  -webkit-box-shadow: 0 0 0 1000px var(--ink) inset;
  transition: background-color 9999s ease-out 0s;
}

.page-catalog textarea,
.page-object textarea { resize: vertical; min-height: 104px; }
.page-catalog .hp,
.page-object .hp { position: absolute; left: -9999px; }
.page-catalog .note,
.page-object .note { color: var(--muted); font-size: 13px; margin-top: 16px; }

/* ---------------- footer (copied from index.html) ---------------- */
.page-catalog footer,
.page-object footer {
  background: var(--ink);
  border-top: 1px solid rgba(255, 255, 255, .07);
  padding: 52px 0 40px;
}
.page-catalog .f-grid,
.page-object .f-grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: 28px; }
.page-catalog .f-brand,
.page-object .f-brand { margin-bottom: 14px; }
/* The same mark as in the header. The full version of the mark carries a
   line of small print under the word SIRINAPA which is unreadable on a
   phone; that file stays in assets for business cards, but no page links
   to it any more. 54px, not 56px: the diamond here is 120 of 200 units
   tall and there 172 of 300, so on screen it keeps the size it had —
   25.92px against 25.69px, a quarter of a pixel apart. */
.page-catalog .f-brand img,
.page-object .f-brand img { height: 54px; width: auto; }
.page-catalog .f-tag,
.page-object .f-tag { color: var(--muted); font-size: 14px; }
.page-catalog .f-addr,
.page-object .f-addr { color: var(--muted); font-size: 14px; line-height: 1.8; }
.page-catalog .contacts,
.page-object .contacts { list-style: none; margin: 0; padding: 0; }
/* 20px, not 11px. Two links stacked 11px apart cannot both have a 44px
   tap area — the areas would overlap and the upper link would lose part
   of its own. This is the one place where the look changes a little, and
   it changes on index.html by exactly the same amount. */
.page-catalog .contacts li,
.page-object .contacts li { margin-bottom: 20px; }
.page-catalog .contacts a,
.page-object .contacts a {
  color: var(--paper);
  text-decoration: none;
  border-bottom: 1px solid var(--line);
  padding-bottom: 2px;
}
.page-catalog .contacts a:hover,
.page-object .contacts a:hover { color: var(--gold); }
.page-catalog .cta-row,
.page-object .cta-row { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }
.page-catalog .mini,
.page-object .mini { font-size: 12px; color: var(--muted); margin-top: 30px; line-height: 1.7; }

/* ---------------- lightbox (behaviour copied from index.html) ----------------
   The lightbox node is appended to <body>, and <body> carries
   .page-object, so these selectors reach it. */
.page-object .lb {
  position: fixed;
  inset: 0;
  background: rgba(8, 10, 12, .95);
  z-index: 200;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 16px;
  cursor: zoom-out;
}
.page-object .lb.on { display: flex; }
.page-object .lb::before {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 34px;
  height: 34px;
  margin: -17px 0 0 -17px;
  border: 2px solid rgba(201, 162, 39, .25);
  border-top-color: var(--gold);
  border-radius: 50%;
  opacity: 0;
  transition: opacity .2s;
  pointer-events: none;
  z-index: 3;
}
.page-object .lb.loading::before { opacity: 1; animation: pglbspin .8s linear infinite; }
@keyframes pglbspin { to { transform: rotate(360deg); } }
.page-object .lb.fade img { opacity: 0; }
.page-object .lb.loading img { opacity: .35; }
.page-object .lb img {
  max-width: 100%;
  max-height: 92vh;
  height: auto;
  object-fit: contain;
  cursor: zoom-in;
  touch-action: none;
  user-select: none;
  -webkit-user-drag: none;
  transition: transform .18s ease;
  will-change: transform;
}
.page-object .lb.zoomed img { cursor: grab; }
.page-object .lb.zoomed .lb-nav { display: none; }
.page-object .lb-hint {
  position: absolute;
  top: 14px;
  left: 0;
  right: 0;
  text-align: center;
  color: var(--muted);
  font-size: 11px;
  letter-spacing: .14em;
  text-transform: uppercase;
  pointer-events: none;
  opacity: .75;
}
.page-object .lb-close {
  position: absolute;
  top: 8px;
  right: 14px;
  background: none;
  border: 0;
  color: var(--paper);
  font-size: 38px;
  line-height: 1;
  cursor: pointer;
  padding: 6px 10px;
  z-index: 2;
}
.page-object .lb-nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  background: rgba(255, 255, 255, .07);
  border: 1px solid rgba(255, 255, 255, .16);
  color: var(--paper);
  font-size: 34px;
  line-height: 1;
  cursor: pointer;
  width: 48px;
  height: 64px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 3px;
}
.page-object .lb-nav:hover { background: rgba(255, 255, 255, .16); }
.page-object .lb-nav.prev { left: 10px; }
.page-object .lb-nav.next { right: 10px; }
.page-object .lb-count {
  position: absolute;
  bottom: 16px;
  left: 0;
  right: 0;
  text-align: center;
  color: var(--muted);
  font-size: 13px;
  letter-spacing: .14em;
}

/* ---------------- success page ---------------- */
.page-success .suc { padding: 96px 0 110px; }
.page-success .suc-box {
  max-width: 720px;
  border: 1px solid var(--line);
  background: rgba(201, 162, 39, .06);
  padding: 54px 40px 48px;
}
.page-success .suc-box h1 { font-size: clamp(34px, 6.2vw, 54px); color: var(--gold); margin-bottom: 18px; }
.page-success .suc-box p { color: var(--paper); font-size: 19px; margin: 0 0 14px; line-height: 1.65; }
.page-success .suc-box .btn { margin-top: 26px; }

/* ---------------- wide screens ---------------- */
@media (min-width: 820px) {
  .page-catalog section,
  .page-object section { padding: 100px 0; }
  .page-object .loc-grid { grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr); gap: 52px; }
  .page-object .feat-grid { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .page-catalog .f-grid,
  .page-object .f-grid { grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr) minmax(0, 1fr); }
}

/* ---------------- phones ---------------- */
@media (max-width: 520px) {
  .page-catalog .bar,
  .page-object .bar { height: 62px; }
  .page-catalog .brand img,
  .page-object .brand img { height: 32px; }
  .page-catalog .langs button,
  .page-object .langs button { padding: 6px 8px; font-size: 12px; }
  .page-object .lb-nav { width: 40px; height: 56px; font-size: 28px; }
  .page-object .lb-nav.prev { left: 4px; }
  .page-object .lb-nav.next { right: 4px; }
  .page-success .suc-box { padding: 38px 24px 34px; }
}

@media (max-width: 374px) {
  .page-catalog .wrap,
  .page-object .wrap { padding: 0 20px; }
  .page-catalog .brand img,
  .page-object .brand img { height: 27px; }
  .page-object .price { font-size: 26px; padding: 11px 16px 13px; }
  .page-object .price small { font-size: 11px; letter-spacing: .08em; }
  .page-object .spec .v { font-size: 36px; }
  .page-catalog .pcard-body { padding: 20px 18px 22px; }
}

/* First screen on a phone.
   On a wide monitor a 4:3 photograph fills the viewport height well. On
   a phone the viewport is tall and narrow and the same photograph gets
   cropped almost in half — the house is visible in pieces. So on narrow
   screens the frame is shown whole in its own 4:3 ratio and the text
   moves below it onto the dark ground. */
@media (max-width: 760px), (max-width: 1024px) and (orientation: portrait) {
  .page-object .hero { display: block; min-height: 0; }
  .page-object .hero::after { display: none; }
  .page-object .hero-media { position: relative; inset: auto; width: 100%; aspect-ratio: 4/3; overflow: hidden; }
  .page-object .hero-in { padding: 26px 0 44px; background: var(--ink); }
  .page-object .hero h1 { text-shadow: none; margin-bottom: 12px; }
  .page-object .place { text-shadow: none; margin-bottom: 22px; }
  .page-object .price {
    text-shadow: none;
    background: var(--ink-2);
    border-left: 3px solid var(--gold);
    width: 100%;
    max-width: none;
  }
  .page-object .hero .btn { display: block; text-align: center; }
}
