/* Design tokens
   ==============

   Source: Figma file NU1oF2CrE9RggFQxkqLZ35, frame "Entity Pages"
   (node 10:651) — read via get_screenshot + get_design_context per
   .superpowers/sdd/2026-08-29-front-end/design-procedure.md, Steps A and B.
   That file defines no Figma variables (get_variable_defs returned {} for
   this node, as for every node in the file), so every value below was read
   by inspecting the reference code's inline colours, sizes, radii and
   shadows rather than a token layer.

   Colours actually found on the Entity Pages frame:
     #4362ef  vivid blue  — "Sign In" / "Submit Review" button fills, and the
                            text colour of inline links ("View on map",
                            "Discover other aquariums in Sydney")
     #1d2a62  dark navy   — every heading, the logo wordmark, table headers
                            and bold labels; this is the design's one "ink"
                            colour, there is no separate near-black
     #555555  grey        — secondary/body copy (almost exactly the old
                            --muted: #5a5a5a this file replaces)
     #e9e9e9  light grey  — hairline borders and rule dividers
     #fefefe  near white  — page and card background
     #f7f8fd  pale blue   — alternate surface used for callouts, badges and
                            FAQ/"no upcoming events" boxes

   Font sizes actually used (px, deduplicated; 17px merged into 18px — see
   judgement calls below): 12, 14, 16, 18, 24, 30, 48.

   Typeface: the frame sets headings in "filson-pro" and body copy in
   "ff-tisa-sans-web-pro". Neither is licensed to this project, so both are
   mapped to a system font stack instead — no webfont file, no Google Fonts
   link, no external request of any kind. The site stays a directory of
   files.

   Judgement calls (no directly-read value existed, or two close readings
   had to be collapsed):
     - --colour-ink and --colour-brand-ink share one read value (#1d2a62).
       The design uses a single branded navy for all heading-weight text
       instead of a separate neutral near-black, so both tokens are that
       navy on purpose, not a copy/paste mistake.
     - --text-lg (18px) absorbs the frame's 17px sizes; a 1px difference
       between two headings reads as export rounding, not a deliberate
       second size.
     - --radius-md is 8px, rounding the frame's 6.8px card-image radius to a
       clean value.
     - --radius-lg reuses the frame's pill/full radius (rounded-[100px] /
       rounded-[9999px]) as the largest of the three required radius steps;
       the frame has no separate "large but not full" radius.
     - --shadow-card is the frame's recurring subtle card treatment
       (0 1px 1px rgba(0,0,0,.05), paired with a --colour-surface fill and a
       --colour-rule border on every bordered panel), not the one-off
       stronger two-layer shadow seen on a single floating element.
     - --measure is not a pixel value Figma can express (a fixed-width frame
       has no reflowing prose column); 65ch is a standard readable-line-
       length default, chosen rather than read.
     - --page-max is read directly: max-w-[1360px] / w-[1360px] recur
       throughout the frame as the overall content width.

   Spacing and radius steps are the frame's own recurring 4px-based rhythm
   (4, 8, 12, 16, 24, 32, 40, 64 were all observed directly as gap/padding
   values); one-off section paddings like 33px, 41px or 81px are treated as
   frame-specific rounding of these steps, not new tokens, per Step C of the
   design procedure ("if a value is close to an existing token, use the
   token; do not add a near-duplicate").
*/

:root {
  /* Colour */
  --colour-ink: #1d2a62;
  /* design.md 2.3 gives --ink as #555555 for body copy, measured there at
     7.46:1 on white. Darkened at the owner's instruction (2026-09-03): #555
     read as washed out against the navy headings at the sizes this site
     actually uses. #444 is 9.66:1 on --colour-surface and 9.18:1 on
     --colour-surface-alt, so the change only ever improves contrast -- the
     accessibility table in 2.7 stays true, with more headroom than it claims.
     A deliberate deviation from the doc, recorded per CLAUDE.md. */
  --colour-muted: #444444;
  /* 2.3's --ink-80. Secondary meta beside a primary value -- the review count
     next to a rating, the alias under ALSO KNOWN AS. Not a third grey: it is
     --colour-muted at 80%, and stays defined in terms of that value. */
  --colour-muted-80: rgba(68, 68, 68, 0.8);
  --colour-brand: #4362ef;
  --colour-brand-ink: #1d2a62;
  --colour-rule: #e9e9e9;
  --colour-surface: #fefefe;
  --colour-surface-alt: #f7f8fd;
  --colour-link: #4362ef;
  /* design.md §2.3 --green-400: the eyebrow badge's "live" dot, and the only
     flat green in the system. The doc calls it decorative only -- it must
     never be the sole carrier of a state, because at 8px it is below every
     contrast threshold there is. Value read from design.md, not sampled. */
  --colour-accent: #4de587;
  /* design.md §10, fix 4. --colour-brand on white measures 4.96:1 there:
     it passes AA for normal text and fails for small bold, and the doc
     names the remedy -- "darken to #3450d0 (6.55:1)". So this is the blue
     that carries small bold text (the header's `ui`-sized links) and the
     hover/darkened state of a --colour-brand fill, NOT a second brand
     colour. Anything at body size or larger still uses --colour-brand. */
  --colour-brand-dark: #3450d0;
  /* design.md §10, fix 3: the doc's --ink-60 input placeholder measures
     2.85:1 and fails outright, and the remedy it gives is "darken to
     #6b6b6b (5.33:1)".
     Named --colour-input-placeholder, NOT --colour-placeholder: that name
     is already taken further down this file by the red that marks mock
     content, and the comment there says in as many words that the moment
     the red means two things a placeholder stops being obvious. These two
     senses of "placeholder" -- filler content, and the grey hint inside an
     empty field -- must never share a token.
     §10 pairs this fix with "never use placeholder text as the only
     label", which is a markup rule the token cannot enforce on its own;
     see the visually-hidden <label> in nav.js. */
  --colour-input-placeholder: #6b6b6b;

  /* Typefaces -- design.md §2.1.
     ------------------------------------------------------------------
     Two Adobe Fonts (Typekit) families: Filson Pro for anything structural
     (headings, nav, buttons, badges, labels, numbers) and FF Tisa Sans Pro
     for anything read as prose. The families are NAMED here so that the day
     a kit is wired into base.html every rule below picks them up with no
     further edit; until then each stack falls through to the system font,
     which is what renders today.

     Nothing loads them yet. design.md §2.1 says "confirm the kit before
     build; there is no free fallback that matches", and this project has no
     kit ID -- so no <link> to use.typekit.net is emitted and the site still
     makes no external request. §11.4 (font-display: swap, preconnect,
     fallback metrics for the 60px H1) is the work that lands with the kit.

     design.md writes --font-body's fallback as "Georgia, serif" and then
     immediately notes "it is a sans; keep a sans fallback". The note wins:
     dropping to a serif would change the page's whole voice on any machine
     where the kit fails, which is every machine right now.

     --font-sans is kept as the pre-design.md name so nothing that still
     reads it breaks; it is --font-body's stack. */
  --font-display: "filson-pro", "Filson Pro", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --font-body: "ff-tisa-sans-web-pro", "FF Tisa Sans Pro", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --font-sans: var(--font-body);

  /* Type roles -- design.md §2.2, as size / leading / tracking triples.
     Only the three roles the reworked home hero actually uses are here;
     §2.2 defines seventeen, and the rest get added as each template is
     moved off the --text-* scale below. Tracking is in em rather than the
     doc's px so it survives the responsive size steps in §9 (a -1.5px
     track tuned for 60px is far too tight at 32px). */
  --display-1-size: 3.75rem;      /* 60px */
  --display-1-leading: 1;         /* 60 / 60 */
  --display-1-tracking: -0.025em; /* -1.5px at 60px */
  --display-2-size: 3rem;         /* 48px */
  --display-2-leading: 1;         /* 48 / 48 */
  --display-2-tracking: -0.025em; /* -1.2px at 48px */
  --lede-size: 1.3125rem;         /* 21px */
  --lede-leading: 1.5;            /* 31.5 / 21 */
  --label-size: 0.75rem;          /* 12px */
  --label-leading: 1.3333;        /* 16 / 12 */
  --label-tracking: -0.025em;     /* -0.3px at 12px */
  --heading-1-size: 2.25rem;      /* 36px */
  --heading-1-leading: 1.1111;    /* 40 / 36 */
  --heading-1-tracking: -0.025em; /* -0.9px at 36px */
  --heading-2-size: 1.875rem;     /* 30px */
  --heading-2-leading: 1.2;       /* 36 / 30 */
  --heading-2-tracking: -0.025em; /* -0.75px at 30px */
  --heading-3-size: 1.5rem;       /* 24px */
  --heading-3-leading: 1.3333;    /* 32 / 24 */
  --heading-3-tracking: -0.025em; /* -0.6px at 24px */
  --heading-4-size: 1.125rem;     /* 18px */
  --heading-4-leading: 1.5556;    /* 28 / 18 */
  --heading-4-tracking: -0.025em; /* -0.45px at 18px */
  --heading-5-size: 1.0625rem;    /* 17px */
  --heading-5-leading: 1.5;       /* 25.5 / 17 */
  /* 2.2 gives heading-5 no tracking, unlike every heading above it. */
  --label-caps-size: 0.75rem;     /* 12px */
  --label-caps-leading: 1.3333;   /* 16 / 12 */
  --label-caps-tracking: 0.05em;  /* +0.6px at 12px -- positive, unlike label */
  --ui-size: 0.875rem;            /* 14px */
  --ui-leading: 1.4286;           /* 20 / 14 */
  --ui-tracking: -0.025em;        /* -0.35px at 14px */
  --caption-size: 0.75rem;        /* 12px */
  --caption-leading: 1.3333;      /* 16 / 12 */
  --body-size: 1rem;              /* 16px */
  --body-leading: 1.5;            /* 24 / 16 */
  --body-sm-size: 0.875rem;       /* 14px */
  --body-sm-leading: 1.4286;      /* 20 / 14 */
  /* §2.2 `body-lg`, 17/25.5/0. The doc assigns it to exactly two things:
     the search input and a large button label. The header's search field
     (§5.14) is the first of those to be built. */
  --body-lg-size: 1.0625rem;      /* 17px */
  --body-lg-leading: 1.5;         /* 25.5 / 17 */

  /* The pre-design.md size-only scale, read off the Entity Pages frame by
     eye. Every value in it coincides with a design.md §2.2 size, but it
     carries no leading, tracking or family -- which is why it is being
     retired role by role rather than kept in parallel. Everything except
     the home hero still reads it. */
  --text-xs: 0.75rem;    /* 12px */
  --text-sm: 0.875rem;   /* 14px */
  --text-base: 1rem;     /* 16px */
  --text-lg: 1.125rem;   /* 18px */
  --text-xl: 1.5rem;     /* 24px */
  --text-2xl: 1.875rem;  /* 30px */
  --text-3xl: 3rem;      /* 48px */

  /* Spacing */
  --space-1: 0.25rem;  /* 4px */
  --space-2: 0.5rem;   /* 8px */
  --space-3: 0.75rem;  /* 12px */
  --space-4: 1rem;     /* 16px */
  --space-5: 1.5rem;   /* 24px */
  --space-6: 2rem;     /* 32px */
  --space-7: 2.5rem;   /* 40px */
  --space-8: 4rem;     /* 64px */

  /* Spacing -- design.md §2.4's base-4 ladder: 4 8 12 16 20 24 32 40 48 64
     80 96. The ordinal --space-1..8 names above predate the doc and cover
     only eight of those twelve steps, skipping 20, 48, 80 and 96; renaming
     them would rewrite every rule in components.css, so the full ladder is
     spelled by VALUE here instead and the ordinals stay as the legacy
     subset. New work reads --sp-*; a rule being touched for another reason
     moves with it. The two sets are the same ladder, not two systems --
     --sp-16 and --space-4 are both 16px on purpose. */
  --sp-4: 0.25rem;
  --sp-8: 0.5rem;
  --sp-12: 0.75rem;
  --sp-16: 1rem;
  --sp-20: 1.25rem;
  --sp-24: 1.5rem;
  --sp-32: 2rem;
  --sp-40: 2.5rem;
  --sp-48: 3rem;
  --sp-64: 4rem;
  --sp-80: 5rem;
  --sp-96: 6rem;

  /* Radius -- design.md §2.5. The doc's rule is that radius signals
     register: directory surfaces are square, marketing surfaces are
     rounded, controls are pills. Note --radius-lg is 20px here, NOT the
     9999px it meant before design.md landed; its three former users (the
     rank-banner pills and the hero eyebrow) moved to --radius-pill and
     --radius-full, which is what they always were.
     --radius-sm/--radius-md are the pre-design.md names: -sm is exactly
     --radius-xs, and -md (8px) is a value §2.5 does not have at all. Every
     surface still on --radius-md is a directory surface the doc wants at
     --radius-none; that migration is per-template, not a token edit. */
  --radius-none: 0;
  --radius-xs: 0.125rem;   /* 2px */
  --radius-lg: 1.25rem;    /* 20px -- marketing surfaces */
  --radius-pill: 6.25rem;  /* 100px */
  --radius-full: 9999px;   /* circles */
  --radius-sm: var(--radius-xs);
  --radius-md: 0.5rem;     /* 8px -- legacy, no design.md equivalent */

  /* Elevation -- design.md §2.6. --shadow-card is the pre-design.md name
     for what the doc calls --shadow-xs; it is kept pointing at the same
     value rather than replaced, since every card in components.css reads
     it. */
  --shadow-xs: 0 1px 1px rgba(0, 0, 0, 0.05);
  --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
  --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.06), 0 2px 4px -1px rgba(0, 0, 0, 0.03);
  --shadow-card: var(--shadow-xs);

  /* Layout -- design.md §2.7's four content widths. Which one a template
     uses is meaningful, so all four are named even though only two are
     wired up today: Home is marketing (1128), everything else is app
     (1360). --container is the one components.css reads; base.html stamps
     a page-{marketing,app} class on <body> and that class re-points it.
     --page-max is the pre-design.md name for the app width. */
  --container-prose: 768px;
  --container-article: 1024px;
  --container-marketing: 1128px;
  --container-app: 1360px;
  --container: var(--container-app);
  --page-max: var(--container-app);
  /* §2.7: "Inner horizontal padding inside every container: 16px." */
  --container-pad: var(--sp-16);
  --measure: 65ch;
  --aside-toc: 16rem;             /* 256px -- design.md 2.7: "Article Guide: 256px sticky ToC aside + 720px prose" */
  --card-track: 20rem;             /* one guide card's width in a row -- matches the home page's four-across venue card at the app container (`.venue-cards` renders ~314px per card at the 1328px container width; 20rem/320px is the nearest round figure, a judgement call per CLAUDE.md) */

  /* Colour: footer-on-dark text, read off the Footer frame (node 2:1797,
     Task 3) via get_screenshot + get_design_context. Every other colour
     token above is written for text on the light --colour-surface fill;
     the footer is the first surface in the file that flips to a dark
     fill, and it reuses --colour-ink itself as that fill (the frame's
     footer background, #1d2a62, is exactly the ink colour used for
     headings everywhere else) and --colour-brand as its top accent rule
     (the frame's 6px top border is #4362ef). What has no equivalent yet
     is on-dark TEXT: the frame draws it at three opacities against white
     -- 50% for the column eyebrows, 70% for the brand blurb, 80% for the
     link list -- plus a 10%-opacity hairline for the divider above the
     copyright row. Those four are genuinely new, so they are named
     tokens rather than a bare `opacity` on `.site-footer` text, which
     would dim any element nested inside a dimmed one a second time.  */
  --colour-on-dark-faint: rgba(255, 255, 255, 0.5);
  --colour-on-dark-muted: rgba(255, 255, 255, 0.7);
  --colour-on-dark-body: rgba(255, 255, 255, 0.8);
  --colour-on-dark-rule: rgba(255, 255, 255, 0.1);
  /* The category card's icon badge: a disc of the card's own fill lightened
     rather than a second colour, which is how the frame keeps three
     differently-coloured cards looking like one component. 0.2 is its own
     step -- the four opacities above were read off the footer, where
     nothing needed a fill this strong. */
  --colour-on-dark-badge: rgba(255, 255, 255, 0.2);

  /* design.md 2.6, the Country Hub hero: a photograph under
     `rgba(255,255,255,0.8)` and `backdrop-blur(1px)`. It is not
     --colour-on-dark-body despite sharing a value -- that one is TEXT on a
     dark fill, this one is a wash over an image, and a later tweak to one
     has no business moving the other. */
  --colour-hero-veil: rgba(255, 255, 255, 0.8);

  /* Scaffolding, and the one colour in this file that is deliberately NOT
     from design.md. 2.3's palette is navy, one blue, one green and a gold,
     and it says outright to resist adding hues -- so a red that belongs to
     none of them is exactly right for marking the parts of a page that are
     not real yet. It must never be reused for product UI: the moment this
     red means two things, a placeholder stops being obvious. */
  /* 2.3's semantic pair. --colour-open is the doc's `--open`; the two washes
     are the 10% fills the About page's methodology icons sit on (node
     14:3495 and 14:3514), and are the only place either is used so far. */
  --colour-open: #10b981;
  --colour-brand-wash: rgba(67, 98, 239, 0.1);
  --colour-open-wash: rgba(16, 185, 129, 0.1);
  --colour-placeholder: #d92d20;

  /* Tile fills, read off the Home frame (node 2:215) by sampling its own
     exported pixels rather than a variable layer, which this file does not
     have. Three of them are gradients rather than flat colours, so they are
     whole `background` values instead of a colour each: a caller writing
     `background: var(--gradient-tile)` cannot get the stops wrong, and
     components.css stays free of raw hex (a test enforces that, and a
     gradient's stops are exactly the kind of value that would otherwise
     have to break the rule).

     --gradient-tile is the frame's OWN empty state for a missing tile
     photograph: "Best Zoos in Japan" and three of the four Best Aquariums
     tiles are drawn as this pale-to-navy wash with no image behind them.
     Reusing it is why a country with no photograph on file still reads as
     designed rather than as a hole. Sampled down the Japan tile at
     #f6f7fc / #cacddc / #354173.

     --gradient-zoo and --gradient-aquarium are the "Explore by Category"
     tiles: the frame's green "Safari Parks" and blue "Marine Aquariums"
     fills, reused for this build's two real categories.

     --scrim is the dark wash under a tile's caption. It is built from
     --colour-ink's own channels so a photo tile and the ink it sits on
     stay the same family; it must stay transparent at the top or it would
     grey out the whole photograph rather than just the text band. */
  --gradient-tile: linear-gradient(180deg, #f7f8fd 0%, #cacddc 48%, #354173 100%);
  --gradient-zoo: linear-gradient(135deg, #47d182 0%, #20b25f 100%);
  --gradient-aquarium: linear-gradient(135deg, #3f5ae0 0%, #4409d1 100%);
  --scrim: linear-gradient(180deg, rgba(29, 42, 98, 0) 38%, rgba(29, 42, 98, 0.82) 100%);
}
