Skip to content

feat(press): add /press/brand — brand and asset subpage - #2811

Open
0xkkonrad wants to merge 5 commits into
devfrom
feat/press-brand-subpage
Open

feat(press): add /press/brand — brand and asset subpage#2811
0xkkonrad wants to merge 5 commits into
devfrom
feat/press-brand-subpage

Conversation

@0xkkonrad

Copy link
Copy Markdown
Contributor

What

Adds /press/brand, a companion page to /press, linked from the Brand assets section there.

The press kit shipped vector logos and the brand PDF, but nothing a journalist or a directory submission actually needs: no raster marks, no social image at a standard size, no product screenshots, and no written statement of the palette or the type rules. (The old Notion kit's UI Kit section was an empty stub.)

What's on the page

  • The mark — logotype preview plus logo do/don't, from Brand Guidelines v1.2 p.5–7
  • Downloads — every file in one place: logotype / icon / wordmark in SVG, EPS, AI and PNG; social images; KNERD woff2 + otf; the guidelines PDF
  • Colour — the six brand hexes with their roles, from tailwind.config.js + guidelines p.25
  • Type — Roboto Flex for titles and body, KNERD as accent lettering only (the three-layer offset rule stated explicitly, since that's the one people get wrong)
  • Product screenshots — full resolution 1080×1920, in English, Portuguese (BR) and Spanish (AR)
  • Mascot — the five press WebPs

New files in public/press/assets/

Path What
raster/ icon 1024 transparent, icon 1024 on #FF90E8, icon 512, logotype 1200×292, wordmark 1200×248
social/ 1200×630 and 1200×1200, derived from the shipped metadata-img.png on exact brand pink
screenshots/{en,pt-BR,es-AR}/ five screens each, the 2026-07-08 store composites

Deliberately excluded

The card screen is not included. Public card mentions need Rain pre-publication review (14-day window, submissions on hold per Konrad 2026-07-05), so the card stays off this page entirely.

Why the data is in src/data and not the content mirror

/press renders prose — boilerplate, taglines, team, company facts — from content/press/{lang}.md in the mono mirror, and that stays exactly as it is. This page is design-system reference data (hexes, type roles, file manifests) that describes files living in public/, so it sits next to them in code.

Notes

  • Adds 13 i18n keys across all four locales + types.ts.
  • No sitemap change: /press isn't in sitemap.ts either, so verify-content's sitemap-route gate is unaffected.

The press kit had vector logos and a PDF but nothing a journalist or a
directory submission actually needs: no raster marks, no social image at a
standard size, no product screenshots, and no statement of the palette or
type rules. The UI Kit section of the old Notion kit was an empty stub.

Adds /press/brand covering the design side, linked from /press:
- logo usage do/don't, from Brand Guidelines v1.2 p.5-7
- every downloadable file in one place, vector and raster
- raster marks (icon 1024 transparent + on pink, 512, logotype, wordmark)
- social images at 1200x630 and 1200x1200
- product screenshots, full resolution 1080x1920, EN + pt-BR + es-AR
- palette hexes and the type roles, incl. the KNERD accent-only rule

Screenshots are the 2026-07-08 store composites. The card screen is
deliberately excluded — public card mentions need Rain pre-publication
review and submissions are on hold.

/press keeps rendering the prose kit from the mono content mirror; this page
carries design-system reference data, so it lives in src/data next to the
files it describes.
@vercel

vercel Bot commented Aug 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
peanut-wallet Ready Ready Preview Sep 1, 2026 8:18am UTC

Request Review

@coderabbitai

coderabbitai Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Team

Run ID: 7d5f33bc-3c5b-4b9e-838f-687a7832c507

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Code-analysis diff

Painscore total: 7151.08 → 7161.48 (+10.4)
Findings: +6 net (+11 new, -5 resolved)

🆕 New findings (11)

  • high complexity — src/app/[locale]/(marketing)/press/page.tsx — CC 42, MI 61.57, SLOC 97
  • high complexity — src/data/press-brand.ts — CC 1, MI 32.58, SLOC 145
  • medium high-mdd — src/app/[locale]/(marketing)/press/page.tsx:103 — PressPage: MDD 65.4 (uses across many lines from declarations)
  • medium high-mdd — src/app/[locale]/(marketing)/press/brand/page.tsx:57 — PressBrandPage: MDD 41.1 (uses across many lines from declarations)
  • medium method-complexity — src/app/[locale]/(marketing)/press/page.tsx:103 — PressPage CC 20 SLOC 33
  • medium complexity — src/app/[locale]/(marketing)/press/brand/page.tsx — CC 17, MI 69.15, SLOC 64
  • low structural-dup — app/[locale]/(marketing)/press/brand/page.tsx:28 — 14 duplicate lines / 94 tokens with app/[locale]/(marketing)/press/page.tsx:70
  • low missing-return-type — src/app/[locale]/(marketing)/press/brand/page.tsx:32 — generateStaticParams: exported fn missing return type annotation
  • low missing-return-type — src/app/[locale]/(marketing)/press/brand/page.tsx:57 — PressBrandPage: exported fn missing return type annotation
  • low missing-return-type — src/app/[locale]/(marketing)/press/page.tsx:74 — generateStaticParams: exported fn missing return type annotation
  • low missing-return-type — src/app/[locale]/(marketing)/press/page.tsx:103 — PressPage: exported fn missing return type annotation

✅ Resolved (5)

  • src/app/[locale]/(marketing)/press/page.tsx — CC 42, MI 61.59, SLOC 97
  • src/app/[locale]/(marketing)/press/page.tsx:102 — PressPage: MDD 63.8 (uses across many lines from declarations)
  • src/app/[locale]/(marketing)/press/page.tsx:102 — PressPage CC 20 SLOC 33
  • src/app/[locale]/(marketing)/press/page.tsx:73 — generateStaticParams: exported fn missing return type annotation
  • src/app/[locale]/(marketing)/press/page.tsx:102 — PressPage: exported fn missing return type annotation

📈 Painscore deltas (top movers)

File Before After Δ
src/data/press-brand.ts 0.0 5.9 +5.9
src/app/[locale]/(marketing)/press/brand/page.tsx 0.0 4.2 +4.2

@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

🧪 UI test report — ✅ all green

Suites

  • unit: 4991 ran, 0 failed, 0 skipped, 1.7m

📊 Coverage (unit)

metric %
statements 73.5%
branches 58.9%
functions 64.7%
lines 74.5%
⏱ 10 slowest test cases
time test
4.2s src/components/Card/share-asset/__tests__/shareAssetLayout.test.ts › never places two stickers in heavy overlap (broad seed sweep)
1.8s src/components/Profile/views/__tests__/ResidenceChangeModal.test.tsx › the change cooldown shows its date and blocks changing to another country, not re-saving
1.7s src/components/Profile/views/__tests__/ResidenceChangeModal.test.tsx › prefers the server value over a stale device mirror
1.5s src/components/Profile/views/__tests__/ResidenceChangeModal.test.tsx › saves the declared residence, refetches, and closes
1.5s src/components/Profile/views/__tests__/ResidenceChangeModal.test.tsx › moving to a country in neither slot leaves the second document alone
1.4s src/components/Profile/views/__tests__/ResidenceChangeModal.test.tsx › promoting the second document country swaps the pair instead of dropping one
1.2s src/components/Setup/Views/__tests__/Residence.test.tsx › lists sanctioned countries in the selector so residents can answer truthfully
1.1s src/components/Setup/Views/__tests__/Residence.test.tsx › reveals the second selector via the multi-doc link
1.1s src/components/Setup/Views/__tests__/Residence.test.tsx › shows the per-country availability comparison with the truth-first guidance
1.1s src/components/Profile/views/__tests__/ResidenceChangeModal.test.tsx › swaps from the server value with no device mirror at all
📍 Inline annotations are in the **Unit test report** check above. Coverage artifact: `coverage-unit`. Generated by `.github/workflows/tests.yml`.

@chip-peanut-bot chip-peanut-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Chip review: Changes requested

The new localized brand page is structurally sound, but most of its user-facing guidance remains English on the Spanish and Portuguese routes.

Findings

  • MAJOR · src/data/press-brand.ts:72 · Localize the brand reference data
    Opening /es-419/press/brand, /es-ar/press/brand, or /pt-br/press/brand translates the section headings, but BRAND_FILE_GROUPS, BRAND_COLORS, BRAND_TYPE, LOGO_RULES, and the asset labels all come from this single English-only dataset. Consequently most of each advertised localized page still renders English text such as download descriptions and all logo do/don't guidance. Move these user-facing strings into the locale dictionaries (or key this data by locale) before publishing hreflang alternates for these routes.

Checked clean

  • Verified the detached worktree HEAD, trusted PR author, base ref, base SHA, and merge base against the supplied values.
  • Reviewed the full page, press-page link, brand-data manifest, and all four locale dictionary changes for correctness, security, adversarial failure paths, and slop.
  • Verified every referenced static download exists in the exact-head Git tree and all new PNG dimensions and transparency modes match their declared metadata.
  • Visually inspected the English screenshot set plus representative Spanish (AR) and Portuguese (BR) assets; the stated card-screen exclusion is preserved.
  • Checked locale validation, canonical and hreflang generation, same-origin download handling, and static asset trust boundaries.
  • All exact-head CI gates reported success, including typecheck, lint, format, unit, e2e, analysis, and preview deployment.

Second opinion by moonshotai/kimi-k3: 0 finding(s), marked with the model name. It reads the diff only, so treat its findings as advice.

Exact head: 6773638458ab · Context: repo

Comment thread src/data/press-brand.ts

export const BRAND_FILE_GROUPS: BrandFileGroup[] = [
{
label: 'Logotype',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MAJOR: Localize the brand reference data

Opening /es-419/press/brand, /es-ar/press/brand, or /pt-br/press/brand translates the section headings, but BRAND_FILE_GROUPS, BRAND_COLORS, BRAND_TYPE, LOGO_RULES, and the asset labels all come from this single English-only dataset. Consequently most of each advertised localized page still renders English text such as download descriptions and all logo do/don't guidance. Move these user-facing strings into the locale dictionaries (or key this data by locale) before publishing hreflang alternates for these routes.

@innolope-dev

Copy link
Copy Markdown
Collaborator

@0xkkonrad — this is green on CI but can't merge: dev has required_review_thread_resolution, and there's one unresolved MAJOR from Chip on src/data/press-brand.ts:72 — the localized routes render translated headings over an English-only BRAND_FILE_GROUPS / BRAND_COLORS / BRAND_TYPE / LOGO_RULES dataset, so most of each advertised localized page is still English. Either localizing the data or a note on the thread about why English is intended for brand reference material will clear the gate.

#2836 is stacked on this and clean, so it retargets to dev once this merges.

Good news on sequencing: this pair is the only work in the current queue that's genuinely independent of the design system. Everything under app/[locale]/(marketing)/ is allowlisted by the DS lint ratchet on purpose, so it has zero interaction with #2876 and can go in before or after it, with no migration pass ever needed.

dev moved the theme from tailwind.config.js into src/styles/globals.css.
Repoint the palette's source comment, and drop the cream swatch — it is no
longer a theme token and the brand book's main/secondary set doesn't carry it.

@chip-peanut-bot chip-peanut-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Chip review — changes requested

The earlier localization defect remains, and the exact head now also fails the required design-system lint ratchet.

Findings

  • MAJOR · src/data/press-brand.ts:72 · Localize the brand reference data
    This remains present after the earlier review. Opening /es-419/press/brand, /es-ar/press/brand, or /pt-br/press/brand translates the section headings, but BRAND_FILE_GROUPS, BRAND_COLORS, BRAND_TYPE, LOGO_RULES, screenshot labels, and mascot labels still come from this English-only dataset. Most of each advertised localized page therefore renders English guidance. Move these user-facing strings into the locale dictionaries (or key the reference data by locale) before publishing hreflang alternates for these routes.

  • MAJOR · src/app/[locale]/(marketing)/press/brand/page.tsx:142 · Make the new page pass the ds-lint ratchet
    The required ds-lint check fails at this exact head: inlineStyle rises from 50 to 51 and stockTextSize from 362 to 386. The added page accounts for exactly one style={{ ... }} swatch and 24 text-xs/text-sm/text-xl utilities, so this is introduced by the PR rather than a base failure. Use token-backed swatch classes and the design-system text scale/recipes; do not raise the debt baseline for a new page.

Checked clean

  • Verified the detached worktree HEAD, trusted PR author, base ref, base SHA, and merge base against the supplied values.
  • Re-evaluated the earlier localization finding against the current code; it is still present and was not answered by the intervening diff.
  • Reviewed the full page, press-page link, brand-data manifest, and all four locale dictionary changes for correctness, security, adversarial failure paths, and slop.
  • Verified every referenced static download and mascot asset exists in the exact-head tree; locale validation, canonical/hreflang generation, and same-origin download paths are otherwise sound.
  • Ran the exact repository ds-lint command locally and confirmed the PR page contributes the full failing deltas: one inline style and 24 stock text-size usages.
  • At review time unit, typecheck, eslint, format, analysis, human-authors, and baseline checks were green; ds-lint and aggregate ci-success were failed, while ds-shots and preview deployment were still running.

Second opinion by moonshotai/kimi-k3: 0 finding(s), marked with the model name. It reads the diff only, so treat its findings as advice.

Exact head: 072141772472 · Context: repo

Comment thread src/data/press-brand.ts
export const BRAND_FILE_GROUPS: BrandFileGroup[] = [
{
label: 'Logotype',
description: 'Icon and wordmark locked up together. The default mark.',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MAJOR: Localize the brand reference data

This remains present after the earlier review. Opening /es-419/press/brand, /es-ar/press/brand, or /pt-br/press/brand translates the section headings, but BRAND_FILE_GROUPS, BRAND_COLORS, BRAND_TYPE, LOGO_RULES, screenshot labels, and mascot labels still come from this English-only dataset. Most of each advertised localized page therefore renders English guidance. Move these user-facing strings into the locale dictionaries (or key the reference data by locale) before publishing hreflang alternates for these routes.

<span
aria-hidden
className="size-10 shrink-0 rounded-sm border border-n-1"
style={{ backgroundColor: color.hex }}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MAJOR: Make the new page pass the ds-lint ratchet

The required ds-lint check fails at this exact head: inlineStyle rises from 50 to 51 and stockTextSize from 362 to 386. The added page accounts for exactly one style={{ ... }} swatch and 24 text-xs/text-sm/text-xl utilities, so this is introduced by the PR rather than a base failure. Use token-backed swatch classes and the design-system text scale/recipes; do not raise the debt baseline for a new page.

ds-lint ratchets inline styles and stock tailwind text sizes; the page added
one of the former and 24 of the latter, so CI went red on the merge.

- swatches paint with the token whose value IS that colour
  (bg-background-brand, bg-background-icon-bubble-yellow/blue,
  bg-foreground-primary/inverse) instead of style={{ backgroundColor }}
- type moves to the semantic scale: text-heading-xs, text-label-l/m,
  text-body-s/xs — each carries its own weight, so font-bold/font-medium go
- colours move to text-foreground-primary/secondary and border-border-default

@chip-peanut-bot chip-peanut-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Chip review — changes requested

Request changes: the recurring localization defect remains, and two downloadable screenshots overstate local-rail availability. The previous ds-lint issue is fixed.

Findings

  • MAJOR · src/data/press-brand.ts:79 · Localize the remaining brand reference data
    This remains from both earlier reviews. On /pt-br/press/brand (and both Spanish routes), translated section headings still wrap English-only labels and guidance from BRAND_FILE_GROUPS, BRAND_COLORS, BRAND_TYPE, LOGO_RULES, SCREENSHOTS, and MASCOTS; for example this card renders “Logotype” and its English description. Move every user-facing field into the locale data (or return these collections by Locale), including alt/caption strings, so each localized route renders one language.

  • MAJOR · src/data/press-brand.ts:143 · Scope the local-rail claims in the screenshots
    Publishing 05-add-money.png and 06-withdraw.png exposes ready-to-reuse copy saying Pix and Mercado Pago deposits/withdrawals work “from/to anywhere.” Current eligibility allows non-residents to make QR payments, but ARS and BRL deposits/withdrawals require residence in the corresponding country, so a non-resident journalist can download and repeat an unavailable capability. Replace these images with product-accurate, rail-scoped copy or omit them until the claims are verified.

Checked clean

  • Exact head, base, merge base, trusted author, and clean detached worktree verified.
  • Earlier findings reassessed: localization is still present and re-reported; ds-lint is fixed with semantic tokens.
  • All exact-head CI checks completed successfully, including unit, eslint, typecheck, ds-lint, ds-shots, analyze, and preview.
  • Every referenced logo, font, PDF, raster, social, screenshot, and mascot asset exists; PNG dimensions match the manifests.
  • Security pass found only static same-origin download paths and no new user-input or executable-URL boundary.
  • Brand palette and typography were cross-checked against the bundled v1.2 guidelines; screenshot claims were checked against the live Lexicon and current product eligibility rules.

Second opinion by moonshotai/kimi-k3: 0 finding(s), marked with the model name. It reads the diff only, so treat its findings as advice.

Exact head: 88f86ac895ed · Context: repo, product

Comment thread src/data/press-brand.ts

export const BRAND_FILE_GROUPS: BrandFileGroup[] = [
{
label: 'Logotype',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MAJOR: Localize the remaining brand reference data

This remains from both earlier reviews. On /pt-br/press/brand (and both Spanish routes), translated section headings still wrap English-only labels and guidance from BRAND_FILE_GROUPS, BRAND_COLORS, BRAND_TYPE, LOGO_RULES, SCREENSHOTS, and MASCOTS; for example this card renders “Logotype” and its English description. Move every user-facing field into the locale data (or return these collections by Locale), including alt/caption strings, so each localized route renders one language.

Comment thread src/data/press-brand.ts
{ slug: '01-hero', label: 'Balance' },
{ slug: '02-qr-pay-local', label: 'Pay by QR' },
{ slug: '04-send', label: 'Send' },
{ slug: '05-add-money', label: 'Add money' },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MAJOR: Scope the local-rail claims in the screenshots

Publishing 05-add-money.png and 06-withdraw.png exposes ready-to-reuse copy saying Pix and Mercado Pago deposits/withdrawals work “from/to anywhere.” Current eligibility allows non-residents to make QR payments, but ARS and BRL deposits/withdrawals require residence in the corresponding country, so a non-resident journalist can download and repeat an unavailable capability. Replace these images with product-accurate, rail-scoped copy or omit them until the claims are verified.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants