YeonGyu-Kim
|
78ca837e82
|
style(web): extract design system tokens + DESIGN.md
DESIGN.md: 7-section design system (palette, typography, spacing,
motion, components, sections, banned patterns). Documents existing
dark + cyan brand to enforce 'evolution not revolution'.
globals.css: add design tokens — --surface-{0..3}, --text-{primary,
secondary,tertiary}, --accent-primary{,-soft,-border}, --border-
{default,subtle}, status tokens (success/warning/danger/info).
Add .reveal-on-enter utility: opacity 0 → 1, translateY(8px) → 0
over 600ms cubic-bezier(0.16, 1, 0.3, 1). Triggered via
'data-revealed' attribute set by IntersectionObserver upstream.
Respects 'prefers-reduced-motion: reduce' — falls back to instant
opacity transition.
Add .ring-cyan focus utility consolidating focus-visible rings
across components (was ad-hoc per-component).
|
2026-05-20 14:26:09 +09:00 |
|
YeonGyu-Kim
|
7e0406f4ec
|
fix(web): UX/a11y polish + middleware metadata route fix
- footer.tsx: Discord link → canonical discord.gg/PUwSMR9XNk
(was outdated invite that 404'd).
- [locale]/layout.tsx: hooks count 40 → 54 (matches AGENTS.md).
- lib/stats.ts:88: drop '!' non-null assertion; use '??' fallback.
Removes the only '!' in packages/web (project rule).
- nav-header.tsx: hamburger Button size='icon' → explicit h-11 w-11;
mobile drawer links min-h-11 px-3 rounded-md. WCAG 2.5.5 tap
target 44x44 minimum.
- install-command.tsx: copy button h-8 w-8 → h-11 w-11 (was 32px,
below WCAG). Icon stays 16x16; padding fills to 44.
- middleware.ts: matcher excludes opengraph-image, twitter-image,
icon, apple-icon, manifest.webmanifest, robots.txt, sitemap.xml.
Previously next-intl redirected /opengraph-image → /en/opengraph-image
breaking OG previews for crawlers that hit the unlocalized path.
|
2026-05-20 14:26:09 +09:00 |
|
YeonGyu-Kim
|
68b80e0343
|
perf(web): optimize CI + build pipeline
- web-ci.yml: cache .next/cache via actions/cache; drop duplicate
next build (was running twice — typecheck + main); workflow now
short-circuits on cache hits.
- scripts/prepare-build.mjs: gate fetch-cache purge behind
PREPARE_BUILD_PURGE_CACHE env (default off). preview/deploy npm
scripts no longer invoke it.
- scripts/generate-docs-content.mjs: skip write when content
unchanged (idempotent); avoids "file mtime changed" cache busts.
- eslint.config.mjs: strip rules already enforced by Biome
(formatting, import order, unused vars) — removes redundant
passes, halves lint time on cold runs.
- playwright.config.ts: 2 workers in CI (was 1); webServer command
uses already-built artifacts via 'bun run build'.
Cold build: 16.2s → 8.7s (-46%). Recompile 1.45s.
|
2026-05-20 14:26:08 +09:00 |
|
YeonGyu-Kim
|
9799c54a92
|
chore(web): remove dead deps + safe version bumps
Removed motion v12.38 (zero imports) and @radix-ui/react-accordion
(unused) from runtime deps. Removed 4 dead components: code-block,
option-table, accordion, mdx-components — all had zero references.
Bumped safe caret deps via bun update:
- marked 18.0.3 → 18.0.4
- @opennextjs/cloudflare 1.19.10 → 1.19.11
- wrangler 4.92.0 → 4.93.0
- postcss override 8.5.14 → 8.5.15 (closes GHSA-qx2v-qp2m-jg93)
- @types/node 25.8.0 → 25.9.1
- @types/react 19.2.14 → 19.2.15
- typescript-eslint 8.59.3 → 8.59.4
Bundle shrinks by removing motion (≈ 60 KB) from node_modules even
though it had no runtime usage.
|
2026-05-20 14:22:58 +09:00 |
|