Figma Passport — Pricing
The fifth landing screen, #pricing.
- Source: file
Agent(9gjEinYPK6zby7CkShjxTm) · pageUI Pages· frame1:76139"Main frame" (the Pricing screen). - Reference: 1920 × 1080. The component keeps its existing
vh()layout — the user's decision for landing sections is to correct values, not rewrite the layout.vh($px) = $px/1080 * 100vh, so at 1920×1080vh(24)= 24px. - Extracted: 2026-08-03. Source: the Figma REST call
/v1/files/.../nodes?ids=1:76139(depth 3) for card geometry, layout, fills, and effects, plus the Properties panel (design mode, claude-in-chrome) for text-node typography. The values below are direct reads, not estimates. - Code target:
frontend/src/sections/Pricing/Pricing.section.tsx+Prising.section.module.scss; i18npricing.
Frame
Main frame1:76139 — 1920×1080, vertical Auto Layout, padding 64, gap 64, counter-axis CENTER,clipsContent: true.- No fill (
fills: []) — the background comes from the landing page. - Children: [
Texts1:76140,Frame 1861:76142]. This frame contains no top or bottom nav bar.
Heading
Texts1:76140 — 1792×64, horizontal, gap 84, padding L/R 128, space-between, counter CENTER. Its only child is the heading, effectively centred (x = 778 within the 1920 frame).- TEXT "Pricing" 1:76141 — box 364×78 Hug, Alexandria 400 Regular 64px, LH 100 %, LS 0 %, H-align Center, V-align Middle.
- Fill: Logo Gradient =
rgba(255,255,255,1)→rgba(255,255,255,0.5)(project token$grad-whiteHalf). - Effect: Meddium Shadow =
12 / 12 / blur 12 / spread 0 rgba(0,0,0,0.25).
- Fill: Logo Gradient =
Card row
Frame 1861:76142 — 1792×824, horizontal, gap 32, padding L/R 64, primary CENTER, counter CENTER.- Four cards:
1 block1:76143 396×740 ·2 block1:76151 396×740 ·2 block1:76159 394×740 ·4 block1:76167 396×740. - The row's total width is 1678, which exceeds the inner 1664 and is therefore centred: within the 1920 frame the row spans x 121…1799, leaving 121 on each side. Vertically the row is centred in the 824 band, so the cards sit at y 234…974.
- Deliberate deviation: the third card is 394 in Figma, an evident mockup error. In code all four are 396, making the row 1680 with 120/120 margins. The difference is ≤ 1 px per side.
Card — all four share the same material
- Vertical Auto Layout, FIXED 396 × 740, radius 20, padding 24 / 12 / 24 / 12, gap 64, primary SPACE_BETWEEN, counter CENTER.
- Fill = style "Pricing gradient" (
1:75194): LINEAR top to bottom (handles (0.5,0) → (0.5,1)), colour#6192C7=rgba(97,146,199), stopsa0 @0%·a0.45 @40%·a0.5 @50%·a0.45 @60%·a0 @100%. - No strokes (
strokes: []) — there is no border in the mockup. - Effects = style "Glass tameplate" (
1:72422):GLASS(visible) +NOISE(visible: false) +DROP_SHADOW16 / 16 / blur 24 / spread 0rgba(0,0,0,0.16).- Browser mapping:
backdrop-filter: blur(16px)plus the 16/16/24 @ .16 shadow (as in@mixin fs-glass) plus a thin 1px light rim. Figma's GLASS draws that rim as part of the material and CSS has no equivalent, so this is a browser material mapping, not a layer export.
- Browser mapping:
Upper group — Frame 189 (1:76144 / …52 / …60 / 1:76168)
Vertical, width FILL 372, height HUG, counter CENTER, gap 64; in the fourth card the gap is 51, an explicit designer value rather than a derived one. The heights 339 / 401 / 432 / 437 are fully explained by the sum of the rows — see line metrics.
| Node | Geometry | Typography | Fill / effect |
|---|---|---|---|
Plan title 1:76145 ("Explorer" + span "(Free Demo)") | Hug 131×56 | Alexandria 300 Light 32px, LH 100 %, LS 0 %, center/middle; the span is 16px in the same family and weight | Lemon Chiffon #FFF2C2; Text Shadow (Gold) 2/2/4 rgba(0,0,0,0.5) |
Price 1:76146 ("Price: $0") | FILL 372 × 31 Hug | Space Grotesk 400 24px, LH 100 %, LS 0 %, center | "Linear text gradient" rgba(14,37,65,1) → rgba(14,37,65,0.66); no shadow |
List 1:76147 | FILL 372 × 124 Hug (4 rows) | Space Grotesk 400 24px, LH 100 %, LS 0 %, left | "Text Linear gradient (White)" rgba(231,240,250,1) → rgba(231,240,250,0.66); no shadow |
The list is a native Figma bullet list: the "•" marker is the same colour as the text, not gold, and there is no extra spacing between items — the rows run continuously at 31 px each.
Lower group — Frame 189 (1:76148 and its analogues)
Vertical, HUG 310 × 171, counter CENTER, gap 32.
| Node | Geometry | Typography | Fill |
|---|---|---|---|
Description 1:76149 | 310×93 (3 rows) | Space Grotesk 400 24px, LH 100 %, LS 0 %, center | "Linear text gradient" rgba(14,37,65,1) → rgba(14,37,65,0.66) |
CTA 1:76150 ("Select Plan") | Hug 194×46 | Space Grotesk 400 36px, LH 100 %, LS 0 %, center/middle | Logo Gradient white 1 → white 0.5; no shadow |
Line metrics
Measured, not guessed. The Figma panel reports LH "100 %", but the actual boxes match the font's automatic leading. Verified arithmetically against the heights of all four cards:
- Space Grotesk → a 31px line at 24px (1.2917): price 31 · description 93 = 3×31 · lists 124 = 4×31 / 186 = 6×31 / 217 = 7×31 / 248 = 8×31 ✓
- The upper-group sums match exactly: 56 + 64 + 31 + 64 + 124 = 339 · +6 rows = 401 · +7 = 432 · card 4: 56 + 51 + 31 + 51 + 248 = 437 ✓
- Alexandria in the plan title → block 56 = 32 × 1.1667 + 16 × 1.1667 ✓
- CTA 36px → 46 (≈ 36 × 1.29) · section heading 64px → 78.
Content 1:1 (EN) and the i18n delta
| Card | Field | Was in code | Figma |
|---|---|---|---|
| Explorer | features[2] | "Avatar switching" | "Agent Switching" |
| Individual | features[4] | "All avatars available" | "All agents available" |
| Pro / Organizations | tag | "(Easy Access)" | "(Early Access)" |
| all four | cta | "click cart to select" | "Select Plan" |
The remaining strings — names, tags, prices, descriptions, and other list items — already match the mockup.
Pitfall: gradient-text clips glyphs
Fixed 2026-08-03.
The "Pricing" heading was first built as an h2 with line-height: 1 and height: vh(64). Visually the bottoms of the letters (the tail of the "g") were cut off along a straight horizontal line, while the shadow remained — the signature of this specific defect.
- Cause:
@mixin gradient-text=background-clip: textplus-webkit-text-fill-color: transparent. The gradient paints only within the element's background box. Alexandria's natural line is 1.21875 (64px → 78px, and 78 is exactly what Figma shows), while the box atline-height: 1is 64px — leaving 7px of glyph at the top and bottom with nothing to paint them. The shadow is drawn from the full glyph outline, so it stays visible. - Rule: for any text using
gradient-text, the background box must cover the whole line. Aline-heightbelow the font's natural value means clipped glyphs. - Fix here: the text was moved into
span.titleText(display:inline-block,line-height: 1.21875= the Figma box of 78) inside anh2.titleof fixed heightvh(64)= theTextsrow. The 78 box overhangs the 64 row symmetrically by 7px top and bottom — exactly as in Figma, where the text spans 57…135 within the row 64…128 — and the layout does not shift.padding: vh(6) 0was added because at 1920×1080 the ink margin at the bottom was exactly 0px, so antialiasing would still have eaten the edge; the padding is symmetric, so the glyphs do not move. - Checked across the whole page with a detector comparing canvas
actualBoundingBox*metrics against the background box for every element usingbackground-clip:text: at the reference 1920×1080 there are no other real clips — only sub-pixel (≤ 0.5px) trims at the top where there are no glyphs. This section's Space Grotesk texts (1.29167) have a −0.5px margin, meaning the box is larger than the line.
QA / open
- Hover is not defined in Figma (a static frame). The product hover stays in the code, unified to
scale(1.05)as in the other landing sections (Hero / Demo / All Services / Uniqueness). That is a product decision, not a mockup one. - The mobile and tablet versions (< 1400px) are out of scope for this port, as in the previous sections.
- The Figma REST API hard-blocked again after a single request (
retry-after ≈ 30 h,x-figma-rate-limit-type: low), so the deeper nodes were captured through the Properties panel.