/* ==========================================================================
   NEXT GEO — page stylesheet for the PRIVACY PAIR
     TR  26208  /gizlilik-politikasi/     EN  26210  /en/privacy-policy/
   One authored sheet for both; ng-page-apply.php --css-from copies it to
   privacy-policy.css so the pair cannot drift.

   Loads last:
     ng-foundation → ng-components → ng-mobile → ng-shared → THIS FILE
   so a rule here at equal specificity beats all four.

   ---------------------------------------------------------------------------
   WHAT WAS ACTUALLY WRONG, MEASURED BEFORE ANYTHING WAS WRITTEN

   ng-page-check /gizlilik-politikasi/ and /en/privacy-policy/ at
   1440 / 1024 / 768 / 390, post-JS:

     VISIBLE h1                0 at every width, on BOTH pages
                               (one hidden: "Gizlilik Politikası" / "Privacy Policy")
     dead air                  TR 12.2% @1440 (2 bands), 17.2% @1024 (3 bands),
                               11.6% @390 · EN 12.2% / 17.4% / 11.6%
     tap targets under 44px    1 at 1024, 768 AND 390 — `a` in `.breadcrumbs`
                               at 39x27px, the theme banner's own trail
     headings                  h2:0  h3:0 on both pages. The six section titles
                               were <p><strong>…</strong></p>, so the document
                               outline of the site's only privacy notice was
                               EMPTY: nothing to jump between, nothing to cite.
     post_content              237 words TR / 203 EN, classic editor
     _elementor_data           none — this pair is one of the few with no
                               imported demo payload, so nothing had to be
                               unpicked here. No `artureanec` hotlink, no
                               orphan _oembed, no base64 svg_icon blobs.

   Above all of it sat the theme's 500px page-title banner carrying the same
   stock 3D-city render the homepage pass deleted, with the page's only h1
   inside it — hidden by the site's own Additional CSS. That is the whole
   `VISIBLE h1 = 0` finding, and it is why page_title_status is set to `off`
   on both posts (old value on both: `default`; the generated rollback does
   not capture that meta key, so it is recorded here).

   ---------------------------------------------------------------------------
   WHAT THIS PAGE IS FOR

   It is not a leaf in the tranche-2 sense and it deliberately does NOT copy
   the five-section leaf pattern. There is no hub question (this entry has no
   hub_card), there is no artefact to show without inventing product output on
   a privacy notice, and there is no method ladder to write without inventing a
   data-subject request process the company has not published.

   THE CONSTRAINT THAT SHAPED EVERYTHING: the brief forbids drafting or
   amending legal text. So the page cannot be made longer by writing more
   policy — it can only be made FINDABLE. Every decision below follows from
   that: a document record, numbered clauses with ids, a contents rail, and one
   way to reach the controller.

   THE READER IS SPECIFIC, WHICH IS NEW. This URL was orphaned until this
   tranche — in no menu, linked from nothing. It is now linked from
   /bize-ulasin/, /en/contact-us/, /kariyer/ and /en/career/, and it is the
   site's only privacy notice while GA4 runs with no consent banner. So it is
   read under stress by somebody looking for ONE fact: what do you collect, how
   long do you keep it, who do I write to. Everything here is optimised for
   that, not for reading top to bottom.

   THREE SECTIONS, NOT FIVE. A short dense document beats a padded one, and
   there is no honest fifth section. The growth is structure and labels, not new
   claims, and it is deliberately small: this page cannot be lengthened without
   drafting policy, which the brief forbids.

   ---------------------------------------------------------------------------
   THE WORD COUNTS IN inventory.json AND tranche2.json ARE WRONG FOR TURKISH,
   and this pair is where it shows. They come from PHP `str_word_count()`, whose
   default character class is [A-Za-z'-]: every ş, ğ, ı, İ, ç, ö, ü SPLITS a
   Turkish word into two or three. "kullanırken" counts as two words,
   "verilerinizin gizliliğini" as four. So the inventory's "237 TR / 203 EN"
   described one language honestly and inflated the other by ~40%.

   Counted the same way in both languages (Unicode word characters, tags and
   authoring comments stripped):

       TR   169  ->  280 authored words
       EN   204  ->  327 authored words

   The English page is the longer one, which is the correct result and the
   opposite of what the inventory implied: Turkish is agglutinative and says the
   same six clauses in fewer tokens. Anyone comparing a Turkish page's before
   and after with str_word_count is measuring diacritics, not content.

   ---------------------------------------------------------------------------
   SECOND PASS (2026-08-17). Both pages already reported `clean` at
   1440/1024/768/390 before this pass; the two changes came out of re-reading
   the 1440 screenshot, which is where every remaining defect on this site has
   been found:

     - CLAUSE 6 PRINTED ITS OWN E-MAIL ADDRESS TWICE, once as the value of the
       E-posta / Email field and again 40px below as the label of a mailto pill.
       The pill is now the field's value. See §2 "key/value rows".
     - "BÖLÜM" IN THE TURKISH RECORD CARD became "MADDE SAYISI". The clause
       anchors are #madde-1..6 and the English card says CLAUSES; "BÖLÜM" left
       the page numbered 01-06 with no name on it for what a number refers to,
       on the one page whose whole purpose is being cited a clause at a time.
   ========================================================================== */


/* ==========================================================================
   1. MASTHEAD
   The two-column shell, the crumbs and the sunken plate are ng-shared's
   (§4, §3, §13a). Only the column ratio and the record card are this page's.
   ========================================================================== */

@media (min-width:960px){
  /* 62/38 rather than ng-shared's 58/42. The record card holds four short
     key/value rows, not a quote or a chip row, and at 42% the value column
     ("Lokasyon Analizi uygulaması") had room to spare while the h1 — two words
     — sat in a column narrower than it needed. The copy side is the one with
     the long Turkish lede, so it takes the extra. */
  .ng-v2 .ngp-lead .ng-masthead__inner{
    grid-template-columns:minmax(0,62fr) minmax(0,38fr);
    column-gap:48px;
  }
}

/* ---- the record card ------------------------------------------------------
   A DEFINITION LIST, NOT THREE PARAGRAPHS. These are fields OF a document —
   who published it, when, what it says it covers, how many clauses — and a
   reader looks them up rather than reads them. <dl> says that in the markup as
   well as in the render.

   THE DATE IS THE ONE THING ON THIS PAGE THAT COULD HAVE BEEN FABRICATED. The
   text carries no effective date, no version and no "last updated" line, so
   the only date that exists anywhere is the post's publication date
   (post_date 2025-07-24, identical on both languages). It is labelled YAYIM
   TARİHİ / PUBLISHED, never "Son güncelleme" / "Last updated", and __note
   spells out in one sentence what it is. On a legal page a wrong date is worse
   than no date, because it is the first thing a reader trusts.
   -------------------------------------------------------------------------- */
.ng-v2 .ngp-rec__list{ margin:0; padding:0; }

/* Rows, not a two-column table: at 320px of aside width a real table column
   for the address would leave the value 120px wide. The key sits above its
   value at every width and the hairline is what groups the pair. */
.ng-v2 .ngp-rec__row{
  padding:12px 0;
  border-top:1px solid var(--ng-hairline);
}
.ng-v2 .ngp-rec__row:first-child{ border-top:0; padding-top:0; }
.ng-v2 .ngp-rec__row:last-child{ padding-bottom:0; }

/* 12px at 0.1em tracking = ratio 0.083, over the 0.08 that buys the tracked-
   label exception in PATTERNS.md and in ng-page-check's own measurement. These
   are glanced-at field names, authored ALREADY UPPERCASE with
   text-transform:none — "METNİN BELİRTTİĞİ KAPSAM" through a CSS uppercase
   would print "METNIN BELIRTTIĞI KAPSAM". */
.ng-v2 .ngp-rec__k{
  margin:0;
  font-family:var(--ng-font-label); font-weight:600;
  font-size:12px; line-height:1.35; letter-spacing:.1em;
  text-transform:none;
  color:var(--ng-muted);              /* 5.42:1 on mist */
}
/* The value is READ — it is a date, a company name, a scope — so it takes the
   reading floor and the ink colour, and the <dd> margin the browser and the
   theme both add has to go. */
.ng-v2 .ngp-rec__v{
  margin:6px 0 0;
  font-family:var(--ng-font-display); font-weight:600;
  font-size:16px; line-height:1.45;
  color:var(--ng-ink);                /* 13.04:1 on mist */
}
.ng-v2 .ngp-rec__note{ margin-top:16px; }


/* ==========================================================================
   2. THE DOCUMENT — rail + clauses
   ========================================================================== */

.ng-v2 .ngp-doc__inner{
  display:grid;
  grid-template-columns:minmax(0,1fr);
  gap:28px;
}
@media (min-width:960px){
  /* 260px is the width at which the longest Turkish rail label — "Verilerin
     Saklanma Süresi" — sits on two lines rather than three next to its number.
     A percentage column was the alternative and was rejected: the rail holds
     six fixed strings, so it wants a fixed measure, and everything the reader
     is actually here for belongs to the clause column. */
  .ng-v2 .ngp-doc__inner{
    grid-template-columns:260px minmax(0,1fr);
    column-gap:56px;
    align-items:start;
  }
}

/* ---- the contents rail ----------------------------------------------------
   THE ONE PIECE OF NAVIGATION ON THE PAGE, and the answer to "read under
   stress by someone looking for a specific fact". The old page made that
   person read 237 unbroken words with no headings to find out how long data is
   kept.

   IT IS NOT DUPLICATED IN THE MASTHEAD. A second copy in the aside was the
   first shape tried; it would have put every clause link on the page twice —
   twelve tap targets for six destinations, and a screen reader hearing the
   same six names in two lists. The aside holds the record instead, which is
   different information rather than the same information twice.

   SUNKEN PLATE at every width, per the two-surface rule: it is chrome, not
   prose, and an untethered tint on the #FAFBFF ground reads as a smudge, which
   is the finding that produced .ng-aside.
   -------------------------------------------------------------------------- */
.ng-v2 .ngp-toc{
  padding:20px 18px;
  background:var(--ng-surface-sunken);
  border:1px solid var(--ng-hairline);
  border-radius:var(--ng-radius);
}
@media (min-width:960px){
  /* Sticky, so the six clause names stay reachable through a 1,600px document
     without a scroll back to the top. top:104px clears the theme's sticky
     header (measured post-JS at 1440: the header settles at 88px, plus 16px of
     air). align-self:start is what makes a sticky child possible at all inside
     a grid whose default is stretch — without it the rail is as tall as the
     clause column and never sticks. */
  .ng-v2 .ngp-doc__rail{ position:sticky; top:104px; align-self:start; }
}
.ng-v2 .ngp-toc__label{ margin:0 0 12px; }
.ng-v2 .ngp-toc__list{
  list-style:none; margin:0; padding:0;
}
/* The whole row is the link, the same reasoning as .ng-card--link: a 44px
   full-width row is the tap target instead of a 130x20px run of text, and the
   accessible name is the clause title rather than a repeated verb. */
.ng-v2 .ngp-toc__link{
  display:flex; align-items:baseline; gap:10px;
  min-height:44px;                    /* 2.5.5 at every width, not just <=1024 */
  padding:9px 0;
  text-decoration:none;
  border-top:1px solid transparent;
}
.ng-v2 .ngp-toc__list > li + li > .ngp-toc__link{
  border-top-color:var(--ng-hairline);
}
.ng-v2 .ngp-toc__n{
  flex:none;
  font-family:var(--ng-font-label); font-weight:600;
  font-size:12px; line-height:1.5; letter-spacing:.1em;
  text-transform:none;
  color:var(--ng-accent);             /* 4.87:1 on mist — a label, not body */
}
.ng-v2 .ngp-toc__t{
  font-family:var(--ng-font-display); font-weight:600;
  font-size:15px; line-height:1.4;
  color:var(--ng-ink);
}
@media (any-hover:hover){
  .ng-v2 .ngp-toc__link:hover .ngp-toc__t{ color:var(--ng-accent); }
}
.ng-v2 .ngp-toc__link:focus-visible{ border-radius:var(--ng-radius-sm); }


/* ---- the clauses ----------------------------------------------------------
   NUMBERED, AND THE NUMBERS ARE RECOVERED RATHER THAN INVENTED. The classic-
   editor source carries six EMPTY ordered lists between its bold headings —
   `<ol class="wp-block-list"></ol>`, then `start="2"`, `start="5"`, `start="6"`.
   The author numbered these sections 1..6 and every marker rendered as
   nothing, because an <ol> with no <li> prints none: six invisible blocks
   contributing margin and no information. They are also part of the 12-17%
   dead air the checker measured.

   A 2px rule over each clause rather than six cards: this is one document read
   in sequence, not six options, and it is the same treatment ng-shared §13c
   gives .ng-steps. Cards would also have imported the .ng-anim blur reveal
   onto legal text, which is the one thing on this site that must be readable
   the instant the page paints.
   -------------------------------------------------------------------------- */
.ng-v2 .ngp-clauses{
  list-style:none; margin:0; padding:0;
}
.ng-v2 .ngp-clause{
  min-width:0;
  padding-top:26px;
  border-top:2px solid var(--ng-hairline);
  /* Anchor landings sit under the theme's sticky header without this. 104px is
     the same measured header height the rail uses. */
  scroll-margin-top:104px;
}
.ng-v2 .ngp-clause + .ngp-clause{ margin-top:36px; }

/* ARRIVING BY LINK SHOULD BE VISIBLE. A reader sent to "madde 3" in an e-mail
   lands mid-document with no idea which block was meant. Colouring the rule
   and filling the number chip marks it with ZERO layout shift — padding or a
   border-width change here would move every clause below it and re-flow the
   page under the reader's eyes. */
.ng-v2 .ngp-clause:target{ border-top-color:var(--ng-accent); }
.ng-v2 .ngp-clause:target .ngp-clause__n{
  background:var(--ng-accent-wash);
  border-radius:var(--ng-radius-pill);
  padding:3px 9px; margin-left:-9px;
}

/* (0,3,0) via the doubled class, per ng-shared §11: the theme's
   `body .content-wrapper h2:not(:first-child){margin-top:50px}` at (0,2,2)
   would otherwise put a 50px hole above five of the six clause titles.
   26px sits between the 44px section title and the 19px card title — these are
   document clauses inside one page, not six sections of their own. */
.ng-v2 .ngp-clause__h.ngp-clause__h{
  margin:0;
  font-size:26px; line-height:1.25;
  letter-spacing:-0.015em;
  color:var(--ng-ink);
  max-width:24ch;
}
/* Block, so the number sits over the title rather than inside its first line:
   a hanging inline number pushes the second line under the digits and the
   title stops looking like a title. */
.ng-v2 .ngp-clause__n{
  /* block for the line break, width:max-content so the :target pill below
     hugs the two digits. As a plain block it inherited the full column width
     and the accent-wash pill painted an 830px bar across the clause — visible
     only in a screenshot taken WITH the fragment applied, which no page-level
     check does for you. */
  display:block; width:max-content; margin:0 0 8px;
  font-family:var(--ng-font-label); font-weight:600;
  font-size:12px; line-height:1.3; letter-spacing:.1em;
  text-transform:none;
  color:var(--ng-accent);             /* 5.35:1 on ground */
}
.ng-v2 .ngp-clause__body{ margin-top:16px; }
/* 17px/1.7 is ng-shared's .ng-prose measure, reused deliberately: this IS
   prose, it is just prose that must not inherit .ng-prose's `ul>li` disc,
   which would fight the accent dot .ng-list draws (prose's list rule is
   (0,2,2) and .ng-list's is (0,2,1), so prose would win and the page would
   show a disc AND a dot). Declaring the two type rules here is cheaper than
   unpicking that collision. */
.ng-v2 .ngp-clause__p{
  margin:0;
  font-size:17px; line-height:1.7;
  color:var(--ng-muted);              /* 6.01:1 on ground */
  max-width:66ch;
}
.ng-v2 .ngp-clause__list{ margin-top:14px; }


/* ---- key/value rows inside a clause ---------------------------------------
   The source stores the controller's details as one paragraph with <br> in it,
   which is how an address ends up unreadable at 390: three facts, one block,
   no labels. As a <dl> the name, the address and the mailbox are three
   look-up-able fields.

   The e-mail is plain text in clause 1 and a live chip in clause 6. Clause 1
   is the controller's RECORD; clause 6 is where a reader acts. Two links to
   one mailbox with the same label is a choice nobody can make, and the site's
   own rule from the leaf pattern is that no label and no URL repeats on a page.

   THAT RULE WAS BEING BROKEN INSIDE CLAUSE 6 ITSELF, and it took a second
   reading of the 1440 screenshot to see it: the clause printed
   `info@nextgeography.com` as the value of its E-posta row and then again, 40px
   lower, as the label of a mailto pill. One clause, the same 22-character
   string twice — the "14 identical links" defect at clause scale, on the one
   page a reader is scanning for exactly one fact. ng-page-check reported the
   page clean before and after; nothing automated can see it, because both
   strings are legitimate content and only one of them is a link.

   The pill is now the row's VALUE rather than a second row under the list, so
   the field label still says which fact this is, the address is printed once,
   and the 44x44 target survives. --act exists only to centre that row: the
   list aligns keys and values on their baselines, and a pill's text baseline
   sits ~9px below a plain value's, so on a baseline grid the label floated
   above the middle of the chip.
   -------------------------------------------------------------------------- */
/* Same 66ch measure as .ngp-clause__p. Without it the address row ran the full
   830px clause column at 1440 while every paragraph above it stopped at 66
   characters, and the two read as different columns of the same document. */
.ng-v2 .ngp-fields{ margin:0; padding:0; max-width:66ch; }
.ng-v2 .ngp-fields__row{
  padding:12px 0;
  border-bottom:1px solid var(--ng-hairline);
}
.ng-v2 .ngp-fields__row:first-child{ padding-top:0; }
/* THE LAST ROW DROPS ITS RULE. Found in the 390 and 1440 screenshots, not by
   any assertion: the closing hairline of clause 1's field list sat ~14px above
   clause 2's own 2px opening rule, so the document appeared to have a stray
   double line between clauses. The clause rule is the divider; a field list
   ends where its last value ends. */
.ng-v2 .ngp-fields__row:last-child{ border-bottom:0; padding-bottom:0; }
@media (min-width:620px){
  /* Two columns once there is room for the address to keep a sane measure.
     150px holds "Şirket Adı" and "Company Name" on one line; below 620 the key
     sits above its value instead, which is the only shape that survives a
     14-word Turkish address at 342px. */
  .ng-v2 .ngp-fields__row{
    display:grid; grid-template-columns:150px minmax(0,1fr); gap:4px 20px;
    align-items:baseline;
  }
  /* The one row whose value is a 44px chip rather than a run of text. */
  .ng-v2 .ngp-fields__row--act{ align-items:center; }
}
/* The chip is a block-level affordance inside a <dd>, so it needs the dd's
   own top margin back to zero below 620 where key and value stack: the pill
   already carries 10px of its own padding and 4px more read as a misalignment
   against the row above it. */
.ng-v2 .ngp-fields__row--act .ngp-fields__v{ margin-top:8px; }
@media (min-width:620px){
  .ng-v2 .ngp-fields__row--act .ngp-fields__v{ margin-top:0; }
}
/* The pill inside a field row must not inherit .ng-actions' full-bleed stacking
   (ng-shared §12) — it is one chip beside a label, not a stacked CTA pair — so
   it is deliberately NOT wrapped in .ng-actions any more. Nothing to declare;
   recorded so the next person does not re-add the wrapper for symmetry. */
.ng-v2 .ngp-fields__k{
  margin:0;
  font-family:var(--ng-font-label); font-weight:600;
  font-size:14px; line-height:1.5;    /* the reading floor: this is a word, not
                                         a tracked label, so it takes 14 rather
                                         than the 12px label exception */
  color:var(--ng-muted);
}
.ng-v2 .ngp-fields__v{
  margin:4px 0 0;
  font-size:16px; line-height:1.6;
  color:var(--ng-ink);
  overflow-wrap:anywhere;             /* info@nextgeography.com in a 150px grid
                                         column at 620px is wider than its
                                         track; without this it overflows */
}
@media (min-width:620px){
  .ng-v2 .ngp-fields__v{ margin-top:0; }
}


/* ---- the two data sets in clause 2 ----------------------------------------
   "Konum Verileri" and "Cihaz Bilgileri" were bare paragraphs sitting above
   two bulleted lists and looking exactly like the sentence above them. They
   are the two CATEGORIES this document collects, so they are two labelled
   plates and two h3s — the only sub-structure the source actually has.

   MIST PLATES, NOT WHITE CARDS. Two raised cards here would have read as two
   product options in a grid, which is the visual language the rest of the site
   uses for things you can choose between. Nobody chooses between the data an
   app collects. Sunken chrome inside a document says "this is a quoted set",
   and it is the same surface the record card and the rail already use.

   NO PURPOSE, DATE OR LEGAL BASIS IS ATTACHED TO ANY FIELD. The source states
   purposes collectively in clause 3; mapping them per field would be new legal
   text, which this pass may not write. It is in the report as needs_human.
   -------------------------------------------------------------------------- */
.ng-v2 .ngp-sets{
  display:grid; grid-template-columns:minmax(0,1fr); gap:16px;
  margin-top:18px;
}
@media (min-width:620px){
  .ng-v2 .ngp-sets{ grid-template-columns:repeat(2,minmax(0,1fr)); gap:18px; }
}
.ng-v2 .ngp-set{
  min-width:0;
  padding:20px 18px;
  background:var(--ng-surface-sunken);
  border:1px solid var(--ng-hairline);
  border-radius:var(--ng-radius-sm);
}
/* Doubled class again — an h3 hits the same (0,2,2) theme rule as an h2. */
.ng-v2 .ngp-set__h.ngp-set__h{
  margin:0 0 12px;
  font-size:17px; line-height:1.3;
  color:var(--ng-ink);
}
/* .ng-list draws its dot in --ng-accent on white; on mist the same dot is
   4.87:1, still over the 3:1 that 1.4.11 asks of a graphical object. Nothing
   to change — recorded so the next person does not re-check it. */


/* ==========================================================================
   3. MOBILE AND TOUCH
   ng-shared §12 already covers .ng-crumbs, .ng-btn, .ng-actions and the
   reading floors for its own primitives. Only this page's classes are here.
   ========================================================================== */
@media (max-width:767px){
  /* 16px reading floor for everything a visitor reads on this page. The two
     tracked 12px labels (.ngp-rec__k at 0.1em, .ngp-clause__n at 0.1em) stay:
     they are glanced at and their ratio clears the 0.08 exception. */
  .ng-v2 .ngp-clause__p{ font-size:17px; }
  .ng-v2 .ngp-fields__k{ font-size:16px; }
  .ng-v2 .ngp-fields__v{ font-size:16px; }
  .ng-v2 .ngp-rec__v{ font-size:16px; }
  .ng-v2 .ngp-toc__t{ font-size:16px; }

  .ng-v2 .ngp-toc{ padding:18px 16px; }
  .ng-v2 .ngp-set{ padding:18px 16px; }

  /* The clause title steps down but not below the 22px that keeps a numbered
     heading reading as a heading next to 17px body copy. */
  .ng-v2 .ngp-clause__h.ngp-clause__h{ font-size:22px; max-width:none; }
  .ng-v2 .ngp-clause{ padding-top:22px; scroll-margin-top:84px; }
  .ng-v2 .ngp-clause + .ngp-clause{ margin-top:30px; }
}

@media (min-width:768px) and (max-width:1023px){
  /* 768-1023 is a TOUCH width served desktop sizes — the gap that hid thirteen
     undersized targets on every converted page until ng-page-check's ceiling
     was raised to 1024. .ngp-toc__link is 44px by construction above, so there
     is nothing to repair here; the clause title only steps down. */
  .ng-v2 .ngp-clause__h.ngp-clause__h{ font-size:24px; }
}
