← all branches

content/auto-draft

needs attentionviewing older commit
f0c337c · incrementalPR #304reviewed 2026-07-14 17:15 UTC1H · 1M · 5L · 2I
The branch
Purpose
Auto-generated content branch shipping a new blog post (tarifa-gdmth) plus UX polish for the marketing blog
Goal
Ship tarifa-gdmth blog post with TOC, on-brand CTAs, de-greened text, and improved chart color legibility
Sub-goals
  • SG-1: New tarifa-gdmth.mdx blog post (200 lines of content)
  • SG-2: Table of Contents for long blog posts (h2 headings, threshold >= 4)
  • SG-3: Replace inline CTA <a> tags with Button component (brand consistency)
  • SG-4: Remove brand-heliotrope from non-decorative body text (contrast/accessibility)
  • SG-5: Chart color fixes — VIOLET for punta TOU block, AMBER for callouts
The changes (whole branch)
What
Added 200-line tarifa-gdmth.mdx; added getToc() to extract h2 headings for a TOC nav; replaced two hardcoded CTA anchors with Button components; stripped text-[hsl(var(--brand-heliotrope))] from body text on blog index and post pages; adjusted chart colors (TOU punta HELIOTROPE→VIOLET, crossover/callout HELIOTROPE→AMBER); updated blog-content.css
Why
Brand polish: CTAs use the design system, body text meets contrast requirements, chart colors have clearer role separation
Areas
apps/web/content/blog/tarifa-gdmth.mdx+2000apps/web/src/components/blog/charts.tsx+43846apps/web/src/app/(marketing)/blog/[slug]/page.tsx+5115apps/web/src/styles/blog-content.css+82apps/web/src/app/(marketing)/blog/page.tsx+44apps/web/content/calendar.yml+11
Blast
6 files, +702/−68 lines. All changes in apps/web marketing area — no platform, no backend, no schema. Risk limited to marketing site rendering.
no-ci content-plus-ux-polish
ci· No checks registered on this PRcoderabbit· No .coderabbit.yaml present

Findings · 9

correctness2

medium

getToc does not handle tilde (~~~) code fences

apps/web/src/app/(marketing)/blog/[slug]/page.tsx

Fence-detection regex /^\s*```/ only toggles inFence on backtick fences. GFM/MDX also allows ~~~ fences. Headings inside a ~~~ block are not suppressed: they produce spurious TOC entries anchoring to non-existent IDs. Worse, slugger.slug() is called on them advancing the counter out of step with rehypeHeadingIds — all subsequent duplicate-named headings then get different numeric suffixes in the TOC vs rendered HTML, breaking anchors. Fix: if (/^\s*(```|~~~)/.test(line)) inFence = !inFence;

low

Heading text stripping incomplete for paired inline-code backtick spans

apps/web/src/app/(marketing)/blog/[slug]/page.tsx

`.replace(/[*`_]/g, '')` strips individual backtick characters but rehypeHeadingIds operates on rendered text nodes where inline-code is already unwrapped. In most cases this produces the same slug, but headings with MDX expressions could diverge, producing broken anchors.

conventions2

low

TOC uses bare <a> for in-page anchors, inconsistent with rest of file

apps/web/src/app/(marketing)/blog/[slug]/page.tsx

In-page anchor hrefs (#id) don't trigger Next.js router navigation, so bare <a> is functionally correct. But the rest of this file uses <Link>. Minor inconsistency; not a defect.

low

Magic number 4 in `toc.length >= 4` undocumented

apps/web/src/app/(marketing)/blog/[slug]/page.tsx

Minimum heading count to display the TOC is unexplained. Extract to a named constant or add an inline comment: /* show TOC only for longer posts */.

tests2

high

getToc has no unit tests despite multiple real edge cases

apps/web/src/app/(marketing)/blog/[slug]/page.tsx

getToc is a pure function with real parsing edge cases: headings inside code fences, consecutive same-text headings (GithubSlugger dedup), inline-format stripping, ATX-only (setext headings silently ignored). None tested. Function is pure + dep-free, so tests are zero-setup — add a co-located getToc.test.ts.

low

No visual regression coverage for TOU.punta and callout color changes

apps/web/src/components/blog/charts.tsx

TOU.punta changed HELIOTROPE→VIOLET; two callout colors changed HELIOTROPE→AMBER. No snapshot or visual-regression tests exist for chart components. Color-correctness is permanently manual without coverage.

improvement3

low

Dead `?? ""` fallbacks after guaranteed `.exec()` match

apps/web/src/app/(marketing)/blog/[slug]/page.tsx

After successful `.exec()` with required capture groups, m[1] and m[2] are always strings. The ?? "" guards are unreachable dead code. Remove them.

info

`hashes` variable only used for length — inline it

apps/web/src/app/(marketing)/blog/[slug]/page.tsx

Replace `const hashes = m[1] ?? ""; if (hashes.length === 2)` with `if (m[1].length === 2)` — removes unnecessary intermediate binding.

info

Inline className overrides on Button variant='cancel' reduce variant encapsulation

apps/web/src/app/(marketing)/blog/[slug]/page.tsx

className="font-medium text-foreground hover:bg-muted" overrides the cancel variant's own styles at every call site. If these are the intended styles, they belong in the variant definition; otherwise add a comment explaining why they diverge.

History · 14 commits

  1. c27ea57needs attentionincremental3H · 5M · 4L2026-08-04 17:46
  2. ff69645needs attentionincremental0H · 6M · 8L2026-07-28 18:21
  3. 0257d74safeincremental0H · 0M · 0L2026-07-20 23:00
  4. 0795a9dsafeincremental0H · 0M · 2L2026-07-20 22:42
  5. 5c57414needs attentionincremental2H · 7M · 10L2026-07-20 22:29
  6. 5a57a8fneeds attentionincremental0H · 5M · 8L2026-07-20 17:14
  7. cc9056eneeds attentionfull1H · 3M · 9L2026-07-20 16:40
  8. 8b79d33needs attentionincremental5H · 7M · 11L2026-07-14 18:10
  9. f0c337cneeds attentionincremental1H · 1M · 5L2026-07-14 17:15current
  10. 5c9de97needs attentionincremental0H · 5M · 7L2026-07-14 17:02
  11. 92cce08needs attentionincremental1H · 4M · 3L2026-07-14 02:00
  12. b7dd610needs attentionincremental0H · 6M · 7L2026-07-14 01:43
  13. 8c43554needs attentionfull0H · 2M · 1L2026-07-14 01:15
  14. 2149391blockedfull8H · 6M · 7L2026-07-10 17:30