PageSourceSearch

https://terminus-beta.netlify.app/assets/Help-Bkw1tcIO.js

js terminus-beta.netlify.app collected 2026-10-03 11:29:38 UTC 29,802 bytes, 459 lines download raw bytes

1import{t as e}from"./react-vendor-DdkjEHWj.js";import{c as r,l as t,n as o,u as s}from"./index-BLaD1eTW.js";var a=t`
2  from { opacity: 0; transform: translateY(16px); }
3  to   { opacity: 1; transform: translateY(0); }
4`,n=e(),i=[{id:"start",label:"Getting Started"},{id:"story",label:"The Story"},{id:"live",label:"Live Tracking"},{id:"terrain",label:"Terrain & Pace"},{id:"checkpoints",label:"Checkpoints"},{id:"end",label:"End of Line"},{id:"follower",label:"Follower"},{id:"install",label:"Install"}];var l=s(function({className:e}){const[,t]=r();return(0,n.jsxs)("div",{className:e,children:[(0,n.jsxs)("header",{className:"help-header",children:[(0,n.jsx)("button",{className:"back-btn",onClick:()=>{window.history.length>1?window.history.back():t("/")},children:"← Back"}),(0,n.jsx)("nav",{className:"section-nav",children:i.map(e=>(0,n.jsx)("button",{className:"nav-btn",onClick:()=>{return r=e.id,void document.getElementById(r)?.scrollIntoView({behavior:"smooth"});var r},children:e.label},e.id))})]}),(0,n.jsxs)("main",{className:"help-main",children:[(0,n.jsxs)("div",{className:"hero",children:[(0,n.jsx)("p",{className:"hero-eyebrow",children:"Documentation"}),(0,n.jsx)("h1",{className:"hero-title",children:"Terminus"}),(0,n.jsx)("p",{className:"hero-sub",children:"GPS trail visualization for runners and their crew."})]}),(0,n.jsxs)("section",{id:"start",className:"section",children:[(0,n.jsx)("p",{className:"sec-label",children:"01 — Getting Started"}),(0,n.jsx)("h2",{className:"sec-title",children:"Pick your race"}),(0,n.jsx)("p",{className:"sec-body",children:"Open Terminus and pick your race — you are in as the runner. Followers never see this screen: a runner sends them a link from End of Line, and tapping it drops them straight into the same story, no picking or typing required."}),(0,n.jsxs)("div",{className:"role-grid",children:[(0,n.jsxs)("div",{className:"role-card rn",children:[(0,n.jsx)("div",{className:"role-icon",children:(0,n.jsx)("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,n.jsx)("polyline",{points:"22 12 18 12 15 21 9 3 6 12 2 12"})})}),(0,n.jsx)("h3",{children:"Runner"}),(0,n.jsx)("p",{children:"You are on the course. Terminus turns your race into a scroll-driven story — pace, terrain, checkpoints, and a live position feed — and lets you invite your crew with a link."})]}),(0,n.jsxs)("div",{className:"role-card fo",children:[(0,n.jsx)("div",{className:"role-icon",children:(0,n.jsxs)("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,n.jsx)("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),(0,n.jsx)("circle",{cx:"12",cy:"12",r:"3"})]})}),(0,n.jsx)("h3",{children:"Follower"}),(0,n.jsx)("p",{children:"You are watching from the sidelines. Tap the link a runner shares with you to join their session and read the exact same story, updated live as they move."})]})]})]}),(0,n.jsx)("hr",{className:"divider"}),(0,n.jsxs)("section",{id:"story",className:"section",children:[(0,n.jsx)("p",{className:"sec-label",children:"02 — The Story"}),(0,n.jsx)("h2",{className:"sec-title",children:"One continuous scroll"}),(0,n.jsx)("p",{className:"sec-body",children:"There is no map view, no bottom sheet, no floating command dock. Terminus reads like a longform article about the route — every section below lives on that same page, in this order. The only control that persists is a small theme toggle pinned to the top corner."}),(0,n.jsxs)("div",{className:"feat-grid",children:[(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot"}),"The route"]}),(0,n.jsx)("p",{children:"Trail name, distance, elevation gain/loss, total estimated time, and a start/elapsed clock."})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot t"}),"The place"]}),(0,n.jsx)("p",{children:"An interactive map tracing the course on the ground."})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot g"}),"Right now"]}),(0,n.jsx)("p",{children:"Live km left, ETA, and time remaining — updates as the GPS position moves."})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot"}),"The climbs"]}),(0,n.jsx)("p",{children:"Every climb, graded 4 (easiest) to 1, then HC (hors catégorie) by length and steepne
4ss."})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot t"}),"The profile"]}),(0,n.jsx)("p",{children:"Full elevation chart, a slope-intensity strip, and an effort-intensity chart, all marked with the current position."})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot g"}),"The pace"]}),(0,n.jsx)("p",{children:"Required pace and effort per kilometer, plus the runner profile and life base stop controls that drive every estimate on the page."})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot"}),"The stages"]}),(0,n.jsx)("p",{children:"Milestones — start, life bases, and the finish — with cutoffs."})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot t"}),"The checkpoints"]}),(0,n.jsx)("p",{children:"ETA, cutoff, and weather forecast for every checkpoint and life base."})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot g"}),"End of line"]}),(0,n.jsx)("p",{children:"Share a trail card, invite someone to follow, switch theme, and leave."})]})]})]}),(0,n.jsx)("hr",{className:"divider"}),(0,n.jsxs)("section",{id:"live",className:"section",children:[(0,n.jsx)("p",{className:"sec-label",children:"03 — Live Tracking"}),(0,n.jsx)("h2",{className:"sec-title",children:"Where you are, right now"}),(0,n.jsx)("p",{className:"sec-body",children:'The "Right now" section is the one part of the story that updates on its own — km left, ETA, and time remaining, based on the pace run so far against the terrain ahead. The map above it traces the course on an interactive, lazy-loaded map.'}),(0,n.jsxs)("div",{className:"role-grid",children:[(0,n.jsxs)("div",{className:"role-card rn",children:[(0,n.jsx)("h3",{children:"Runner"}),(0,n.jsx)("p",{children:'A "Spot me" button starts your device\'s GPS fix and broadcasts your position to anyone following every 30 minutes — it is the only control that starts the live numbers this whole page depends on.'})]}),(0,n.jsxs)("div",{className:"role-card fo",children:[(0,n.jsx)("h3",{children:"Follower"}),(0,n.jsx)("p",{children:'No "Spot me" button — there is nothing of your own to broadcast. The numbers instead update automatically from the runner\'s own GPS broadcast.'})]})]})]}),(0,n.jsx)("hr",{className:"divider"}),(0,n.jsxs)("section",{id:"terrain",className:"section",children:[(0,n.jsx)("p",{className:"sec-label",children:"04 — Terrain & Pace"}),(0,n.jsx)("h2",{className:"sec-title",children:"Climbs, profile & pace"}),(0,n.jsx)("p",{className:"sec-body",children:"Together these sections tell you what the route demands and how fast you can expect to move through it."}),(0,n.jsxs)("div",{className:"panel-list",children:[(0,n.jsxs)("div",{className:"pi",children:[(0,n.jsx)("div",{className:"pi-icon primary",children:(0,n.jsx)("svg",{width:"15",height:"15",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",children:(0,n.jsx)("path",{d:"M3 17l4-8 4 5 3-3 4 6H3z"})})}),(0,n.jsxs)("div",{children:[(0,n.jsx)("p",{className:"pi-name",children:"Climbs"}),(0,n.jsx)("p",{className:"pi-desc",children:'Category (HC, then 1 to 4), summit elevation, average grade, and length for every climb — the one you are currently on is marked "In progress".'})]})]}),(0,n.jsxs)("div",{className:"pi",children:[(0,n.jsx)("div",{className:"pi-icon primary",children:(0,n.jsxs)("svg",{width:"15",height:"15",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,n.jsx)("polyline",{points:"23 6 13.5 15.5 8.5 10.5 1 18"}),(0,n.jsx)("polyline",{points:"17 6 23 6 23 12"})]})}),(0,n.jsxs)("div",{children:[(0,n.jsx)("p",{className:"pi-name",children:"Profile"}),(0,n.jsx)("p",{className:"pi-desc",children:"The full elevation chart for the route, with your position marked on the current climb or descent."})]})]}),(0,n.jsxs)("div",{className:"pi",children:[(0,n.jsx)("div",{className:"pi-icon secondary",children:(0,n.jsxs)("svg",{width:"15",height:"15",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,n.jsx)("path",{d:"M18 20V10"}),(0,n.jsx)("path",{d:"M12 20V4"}),(0,n.jsx)("path",{d:"M6 20v-6"})]})}),(0,n.jsxs)("div",{children:[(0,n.jsx)("p",{className:"pi-name",children:"Slope & effort intensity"}),(0,n.jsx)("p",{className:"pi-desc",children:"A gradient strip and an effort chart along the whole route — both dim the portion already covered, doubling as a progress indicator."})]})]})]}),(0,n.jsx)("p",{className:"sec-body pace-intro",children:"The pace chart shows the slowest pace still allowed at every point on the course, and the effort multiplier it represents. Two controls beneath it drive every ETA, cutoff, and estimate on the page:"}),(0,n.jsxs)("div",{className:"role-grid",children:[(0,n.jsxs)("div",{className:"role-card rn",children:[(0,n.jsx)("h3",{children:"Runner profile & life base stops"}),(0,n.jsx)("p",{children:"Pick a runner profile (Casual, Trail, Athlete, Elite) and how long you plan to rest at each life base (none, 30 min, 1 hour, 2 hours). Changing either instantly recalculates every estimate on the page."})]}),(0,n.jsxs)("div",{className:"role-card fo",children:[(0,n.jsx)("h3",{children:"Synced from the runner"}
4),(0,n.jsx)("p",{children:'Followers see the same two pickers, disabled, with a "Synced from the runner you\'re following" note — they update automatically whenever the runner changes theirs.'})]})]})]}),(0,n.jsx)("hr",{className:"divider"}),(0,n.jsxs)("section",{id:"checkpoints",className:"section",children:[(0,n.jsx)("p",{className:"sec-label",children:"05 — Checkpoints & Stages"}),(0,n.jsx)("h2",{className:"sec-title",children:"Every stop, with a forecast"}),(0,n.jsx)("p",{className:"sec-body",children:"The stages list is the big picture — start, every life base, and the finish. The checkpoints list is the detailed one: every named waypoint, in order, each with distance, ETA, and cutoff. A checkpoint whose ETA is past its cutoff is flagged in accent colour."}),(0,n.jsxs)("div",{className:"feat-grid",children:[(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot"}),"Distance & elevation"]}),(0,n.jsx)("p",{children:"Distance, gain/loss, estimated time, and the maximum allotted time for the leg leading to each stop."})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot t"}),"Difficulty"]}),(0,n.jsx)("p",{children:"A colour-coded rating for how demanding each leg is, from easy to very hard."})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot g"}),"Weather forecast"]}),(0,n.jsx)("p",{children:"Temperature, chance of precipitation, and wind speed forecast for your predicted arrival time, via Open-Meteo — cold, wet, or windy conditions are flagged."})]})]}),(0,n.jsxs)("div",{className:"info-box",children:[(0,n.jsx)("strong",{children:"Forecasts refresh automatically"})," — as your estimated pace shifts, predicted arrival times move, and the weather forecast for each stop is re-fetched to match."]})]}),(0,n.jsx)("hr",{className:"divider"}),(0,n.jsxs)("section",{id:"end",className:"section",children:[(0,n.jsx)("p",{className:"sec-label",children:"06 — End of Line"}),(0,n.jsx)("h2",{className:"sec-title",children:"Actions"}),(0,n.jsx)("p",{className:"sec-body",children:"The bottom of the story is also where the only exit affordance lives, alongside a handful of utility actions."}),(0,n.jsxs)("table",{className:"gtable",children:[(0,n.jsx)("thead",{children:(0,n.jsxs)("tr",{children:[(0,n.jsx)("th",{children:"Action"}),(0,n.jsx)("th",{children:"Description"})]})}),(0,n.jsxs)("tbody",{children:[(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{children:"Share this trail"}),(0,n.jsx)("td",{children:"Generates a shareable card — route name, distance, elevation, and estimated time — and opens the native share sheet, or downloads it."})]}),(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{children:"Invite someone to follow"}),(0,n.jsx)("td",{children:"Runner only. Generates and shares a follow link so others can track you live."})]}),(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{children:"Switch theme"}),(0,n.jsx)("td",{children:"Toggle between light and dark mode."})]}),(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{children:"Flush saved locations"}),(0,n.jsx)("td",{children:"Runner only. Erases this device's buffered GPS fixes."})]}),(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{children:"User guide"}),(0,n.jsx)("td",{children:"Open this documentation page."})]}),(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{children:"Leave trail"}),(0,n.jsx)("td",{children:"Exit the current race and return to the start screen. Your saved route data is preserved."})]})]})]})]}),(0,n.jsx)("hr",{className:"divider"}),(0,n.jsxs)("section",{id:"follower",className:"section",children:[(0,n.jsx)("p",{className:"sec-label secondary",children:"07 — Follower Mode"}),(0,n.jsx)("h2",{className:"sec-title",children:"Follow a runner live"}),(0,n.jsx)("p",{className:"sec-body",children:"Follower mode lets crew, family, or fans read a runner's story in real time from any device — no GPS permission needed."}),(0,n.jsxs)("div",{className:"feat-grid",children:[(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot t"}),"Invite link"]}),(0,n.jsx)("p",{children:'The runner shares a link from "Invite someone to follow". Opening it connects you straight to their session — no picking a race or entering a code.'})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot t"}),"Live sync"]}),(0,n.jsx)("p",{children:"The runner's position, pace profile, and life base settings are pushed to every connected follower in real time."})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot t"}),"Same story"]}),(0,n.jsx)("p",{children:"Followers read the identical scroll — hero, map, climbs, terrain, pace, checkpoints — locked to the runner's live position."})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot t"}),"Read-only"]}),(0,n.jsx)("p",{children:"Spot me, invite-to-follow, the runner profile / life base pickers, and flush saved locations are hidden or disabled — nothing here can change what the runner set."})]})]}),(0,n.jsxs)("div",{className:"info-box",children:[(0,n.jsx)("strong",{children:"Runner vs. Follower"})," — the runner's device holds the GPS fix and broadcasts position and pace settings over the room; the follower's device only receives them. Both read the same story, but only the runner's actions are active."]})]}),(0,n.jsx)("hr",{className:"divider"}),(0,n.jsxs)("section",{id:"install",className:"section",children:[(0,n.jsx)("p",{className:"sec-label",children:"08 — Install"}),(0,n.jsx)("h2",{className:"sec-title",children:"Add to Home Screen"}),(0,n.jsx)("p",{className:"sec-body",children:"Terminus is a Progressive Web App (PWA). You can install it on your phone like a native app — it runs full-screen with no browser chrome, loads instantly, and keeps working offline."}),(0,n.jsxs)("div",{className:"feat-grid",children:[(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot"}),"Android (Chrome)"]}),(0,n.jsxs)("p",{children:["Open Terminus in Chrome. Tap the ",(0,n.jsx)("strong",{children:"⋮ menu"})," in the top-right corner, then tap"," ",(0,n.jsx)("strong",{children:"Add to Home screen"}
vendor: 2,704 bytes, lines 4-62
4),". Confirm by tapping"," ",(0,n.jsx)("strong",{children:"Add"})," — the app icon appears on your home screen."]})]}),(0,n.jsxs)("div",{className:"feat",children:[(0,n.jsxs)("h4",{children:[(0,n.jsx)("span",{className:"dot"}),"iPhone / iPad (Safari)"]}),(0,n.jsxs)("p",{children:["Open Terminus in Safari. Tap the ",(0,n.jsx)("strong",{children:"Share button"})," ","(the square with an arrow pointing up) at the bottom of the screen, then tap ",(0,n.jsx)("strong",{children:"Add to Home Screen"}),". Tap"," ",(0,n.jsx)("strong",{children:"Add"})," to confirm."]})]})]}),(0,n.jsxs)("div",{className:"info-box",children:[(0,n.jsx)("strong",{children:"Safari required on iPhone"})," — iOS only allows PWA installation from Safari. If you are using Chrome or another browser on iPhone, open the same URL in Safari first."]})]}),(0,n.jsx)("footer",{className:"help-footer",children:"© 2026 Terminus — La Vallée"})]})]})})`
5  position: fixed;
6  inset: 0;
7  overflow-y: auto;
8  background: ${e=>e.theme.colors[e.theme.currentVariant]["--color-background"]};
9  color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-text"]};
10  font-family: ${e=>e.theme.font.family["--font-family-base"]};
11
12  /* ── HEADER ── */
13  .help-header {
14    position: sticky;
15    top: 0;
16    z-index: 50;
17    display: flex;
18    align-items: center;
19    gap: 1rem;
20    padding: calc(env(safe-area-inset-top) + 0.75rem) 1.5rem 0.75rem;
21    background: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-background"],.88)};
22    backdrop-filter: blur(16px);
23    -webkit-backdrop-filter: blur(16px);
24    border-bottom: 1px solid
25      ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.07)};
26  }
27
28  .back-btn {
29    flex-shrink: 0;
30    background: none;
31    border: none;
32    cursor: pointer;
33    font-family: ${e=>e.theme.font.family["--font-family-mono"]};
34    font-size: 0.8125rem;
35    color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.85)};
36    padding: 0;
37    transition: color ${e=>e.theme.transitions["--transition-fast"]};
38    -webkit-tap-highlight-color: transparent;
39
40    &:hover {
41      color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-text"]};
42    }
43  }
44
45  .help-title {
46    font-family: ${e=>e.theme.font.family["--font-family-mono"]};
47    font-size: 0.8125rem;
48    font-weight: ${e=>e.theme.font.weights["--font-weight-bold"]};
49    color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.5)};
50    letter-spacing: 0.06em;
51    text-transform: uppercase;
52  }
53
54  .section-nav {
55    margin-left: auto;
56    display: flex;
57    gap: 2px;
58    overflow-x: auto;
59    -webkit-overflow-scrolling: touch;
60    scrollbar-width: none;
61
62    &::-webkit-scrollbar {
63      display: none;
64    }
65  }
66
67  .nav-btn {
68    flex-shrink: 0;
69    background: none;
70    border: none;
71    cursor: pointer;
72    font-size: 0.75rem;
73    font-weight: 500;
74    padding: 0.3rem 0.75rem;
75    border-radius: 100px;
76    color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.85)};
77    transition: all ${e=>e.theme.transitions["--transition-fast"]};
78    -webkit-tap-highlight-color: transparent;
79
80    &:hover {
81      color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-text"]};
82      background: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.06)};
83    }
84  }
85
86  /* ── MAIN ── */
87  .help-main {
88    max-width: 800px;
89    margin: 0 auto;
90    padding: 0 1.5rem 4rem;
91  }
92
93  /* ── HERO ── */
94  .hero {
95    text-align: center;
96    padding: 5rem 0 4rem;
97    animation: ${a} 0.45s ease both;
98
99    @media (prefers-reduced-motion: reduce) {
100      animation: none;
101    }
102  }
103
104  .hero-eyebrow {
105    font-size: 0.6875rem;
106    font-weight: 700;
107    letter-spacing: 0.22em;
108    text-transform: uppercase;
109    color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-secondary-text"]};
110    margin-bottom: 1rem;
111  }
112
113  .hero-title {
114    font-family: ${e=>e.theme.font.family["--font-family-mono"]};
115    font-size: clamp(3rem, 12vw, 6rem);
116    font-weight: 900;
117    letter-spacing: -0.05em;
118    line-height: 1;
119    margin: 0 0 1.25rem;
120    color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-text"]};
121  }
122
123  .hero-sub {
124    font-size: 1rem;
125    color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.85)};
126    max-width: 400px;
127    margin: 0 auto;
128  }
129
130  /* ── SECTIONS ── */
131  .section {
132    margin-bottom: 5rem;
133    animation: ${a} 0.45s ease both;
134
135    @media (prefers-reduced-motion: reduce) {
136      animation: none;
137    }
138  }
139
140  .sec-label {
141    font-size: 0.6875rem;
142    font-weight: 700;
143    letter-spacing: 0.2em;
144    text-transform: uppercase;
145    color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-primary-text"]};
146    margin-bottom: 0.4rem;
147
148    &.secondary {
149      color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-secondary-text"]};
150    }
151  }
152
153  .sec-title {
154    font-family: ${e=>e.theme.font.family["--font-family-mono"]};
155    font-size: clamp(1.5rem, 4vw, 2.25rem);
156    font-weight: 800;
157    letter-spacing: -0.03em;
158    line-height: 1.1;
159    margin: 0 0 1rem;
160    color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-text"]};
161  }
162
163  .sec-body {
164    font-size: 0.9375rem;
165    color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.85)};
166    line-height: 1.72;
167    max-width: 640px;
168
169    &.pace-intro {
170      margin-top: 1.75rem;
171    }
172  }
173
174  .divider {
175    border: none;
176    height: 1px;
177    background: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.07)};
178    margin: 0 0 5rem;
179  }
180
181  /* ── ROLE CARDS ── */
182  .role-grid {
183    display: grid;
184    grid-template-columns: 1fr 1fr;
185    gap: 0.875rem;
186    margin-top: 1.75rem;
187
188    @media (max-width: 540px) {
189      grid-template-columns: 1fr;
190    }
191  }
192
193  .role-card {
194    background: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-surface"],.6)};
195    border: 1px solid
196      ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.08)};
197    border-radius: ${e=>e.theme.borderRadius["--border-radius-lg"]};
198    padding: 1.75rem 1.5rem;
199    position: relative;
200    overflow: hidden;
201    transition: all ${e=>e.theme.transitions["--transition-base"]};
202
203    &::after {
204      content: "";
205      position: absolute;
206      bottom: 0;
207      left: 0;
208      right: 0;
209      height: 2px;
210      opacity: 0;
211      transition: opacity 0.3s;
212    }
213
214    &.rn::after {
215      background: ${e=>e.theme.colors[e.theme.currentVariant]["--color-primary"]};
216    }
217    &.fo::after {
218      background: ${e=>e.theme.colors[e.theme.currentVariant]["--color-secondary"]};
219    }
220
221    &:hover {
222      transform: translateY(-3px);
223      border-color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.16)};
224
225      &::after {
226        opacity: 1;
227      }
228    }
229
230    &.rn:hover {
231      box-shadow: 0 16px 40px
232        ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-primary"],.18)};
233    }
234
235    &.fo:hover {
236      box-shadow: 0 16px 40px
237        ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-secondary"],.2)};
238    }
239
240    h3 {
241      font-family: ${e=>e.theme.font.family["--font-family-mono"]};
242      font-size: 1.0625rem;
243      font-weight: 700;
244      letter-spacing: -0.02em;
245      margin-bottom: 0.5rem;
246      color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-text"]};
247    }
248
249    p {
250      font-size: 0.8125rem;
251      color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.85)};
252      line-height: 1.6;
253    }
254  }
255
256  .role-icon {
257    width: 44px;
258    height: 44px;
259    border-radius: 11px;
260    display: flex;
261    align-items: center;
262    justify-content: center;
263    margin-bottom: 1.125rem;
264
265    .role-card.rn & {
266      background: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-primary"],.12)};
267      color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-primary"]};
268    }
269
270    .role-card.fo & {
271      background: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-secondary"],.12)};
272      color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-secondary"]};
273    }
274  }
275
276  /* ── FEAT GRID ── */
277  .feat-grid {
278    display: grid;
279    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
280    gap: 0.625rem;
281    margin-top: 1.5rem;
282  }
283
284  .feat {
285    background: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-surface"],.5)};
286    border: 1px solid
287      ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.07)};
288    border-radius: ${e=>e.theme.borderRadius["--border-radius-base"]};
289    padding: 1rem 1.125rem;
290    transition: all ${e=>e.theme.transitions["--transition-fast"]};
291
292    &:hover {
293      border-color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.14)};
294      transform: translateY(-1px);
295    }
296
297    h4 {
298      font-size: 0.8125rem;
299      font-weight: 700;
300      color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-text"]};
301      margin-bottom: 0.3rem;
302      display: flex;
303      align-items: center;
304      gap: 0.4rem;
305    }
306
307    p {
308      font-size: 0.75rem;
309      color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.5)};
310      line-height: 1.55;
311    }
312  }
313
314  .dot {
315    width: 5px;
316    height: 5px;
317    border-radius: 50%;
318    flex-shrink: 0;
319    background: ${e=>e.theme.colors[e.theme.currentVariant]["--color-primary"]};
320
321    &.t {
322      background: ${e=>e.theme.colors[e.theme.currentVariant]["--color-secondary"]};
323    }
324
325    &.g {
326      background: ${e=>e.theme.colors[e.theme.currentVariant]["--color-success"]};
327    }
328  }
329
330  /* ── PANEL LIST ── */
331  .panel-list {
332    display: flex;
333    flex-direction: column;
334    gap: 0.5rem;
335    margin-top: 1.5rem;
336  }
337
338  .pi {
339    display: flex;
340    align-items: flex-start;
341    gap: 0.875rem;
342    padding: 0.875rem 1rem;
343    background: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-surface"],.5)};
344    border: 1px solid
345      ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.07)};
346    border-radius: ${e=>e.theme.borderRadius["--border-radius-base"]};
347    transition: all ${e=>e.theme.transitions["--transition-fast"]};
348
349    &:hover {
350      border-color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.14)};
351      background: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-surface"],.7)};
352    }
353  }
354
355  .pi-icon {
356    flex-shrink: 0;
357    width: 32px;
358    height: 32px;
359    border-radius: 8px;
360    display: flex;
361    align-items: center;
362    justify-content: center;
363    margin-top: 1px;
364
365    &.primary {
366      background: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-primary"],.12)};
367      color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-primary"]};
368    }
369
370    &.secondary {
371      background: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-secondary"],.12)};
372      color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-secondary"]};
373    }
374  }
375
376  .pi-name {
377    font-size: 0.8125rem;
378    font-weight: 700;
379    color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-text"]};
380    margin-bottom: 0.2rem;
381  }
382
383  .pi-desc {
384    font-size: 0.75rem;
385    color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.48)};
386    line-height: 1.5;
387  }
388
389  /* ── TABLE ── */
390  .gtable {
391    width: 100%;
392    border-collapse: collapse;
393    margin-top: 1.25rem;
394    font-size: 0.875rem;
395
396    thead th {
397      text-align: left;
398      font-size: 0.6875rem;
399      font-weight: 700;
400      letter-spacing: 0.14em;
401      text-transform: uppercase;
402      color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.3)};
403      padding: 0.5rem 1rem;
404      border-bottom: 1px solid
405        ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.08)};
406    }
407
408    td {
409      padding: 0.7rem 1rem;
410      border-bottom: 1px solid
411        ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.05)};
412      color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.55)};
413      vertical-align: top;
414    }
415
416    td:first-child {
417      color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-text"]};
418      font-weight: 600;
419      white-space: nowrap;
420    }
421
422    tr:last-child td {
423      border-bottom: none;
424    }
425
426    tr:hover td {
427      background: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-surface"],.4)};
428    }
429  }
430
431  /* ── INFO BOX ── */
432  .info-box {
433    margin-top: 1.25rem;
434    padding: 1rem 1.25rem;
435    background: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-secondary"],.08)};
436    border: 1px solid
437      ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-secondary"],.2)};
438    border-radius: ${e=>e.theme.borderRadius["--border-radius-base"]};
439    font-size: 0.8125rem;
440    color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.6)};
441    line-height: 1.6;
442
443    strong {
444      color: ${e=>e.theme.colors[e.theme.currentVariant]["--color-secondary"]};
445    }
446  }
447
448  /* ── FOOTER ── */
449  .help-footer {
450    text-align: center;
451    font-family: ${e=>e.theme.font.family["--font-family-mono"]};
452    font-size: 0.6875rem;
453    letter-spacing: 0.04em;
454    color: ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.2)};
455    padding-top: 2rem;
456    border-top: 1px solid
457      ${e=>o(e.theme.colors[e.theme.currentVariant]["--color-text"],.06)};
458  }
459`;export{l as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.