Skip to content

feat: 디자인 시스템 에셋 및 폰트 추가#6

Merged
choihooo merged 6 commits into
mainfrom
feature/3-design-system-assets
Jun 27, 2026
Merged

feat: 디자인 시스템 에셋 및 폰트 추가#6
choihooo merged 6 commits into
mainfrom
feature/3-design-system-assets

Conversation

@choihooo

@choihooo choihooo commented Jun 27, 2026

Copy link
Copy Markdown
Collaborator

Summary

Figma 기반 디자인 시스템 토큰, 로고 에셋, 폰트 로딩, Storybook 카탈로그를 추가합니다. 실기기 확인 흐름도 Expo Go 기준으로 정리했습니다.

Closes #3

Changes

  • 디자인 시스템 색상/타이포그래피 토큰 정리
  • 로고 PNG 에셋과 designAssets manifest 추가
  • Pretendard, Outfit, Kepler Std 폰트 파일 저장 및 @font-face 등록
  • Storybook에 Tokens/Assets 카탈로그 반영
  • pnpm dev:device로 웹 서버와 Expo Go 서버를 함께 실행하도록 정리
  • dev-client 관련 스크립트와 의존성 제거
  • Expo SDK 54 호환성 반영 및 모바일 쉘 엔트리 수정
  • README 실행 명령과 에셋/폰트 사용 방법 문서화

Verification

  • pnpm lint
  • pnpm typecheck
  • pnpm build --filter=@comma/web
  • pnpm build:storybook
  • pnpm --filter @comma/mobile-shell exec expo install --check

Notes

  • .gitignore에는 기존 로컬 변경이 남아 있어 이 PR 커밋 범위에서는 제외했습니다.
  • Kepler Std는 사용자가 제공한 로컬 webfont 파일을 디자인 시스템 폰트 에셋으로 포함했습니다.

Summary by CodeRabbit

  • New Features

    • Added a unified “device” development mode for web and mobile, making it easier to preview the app on real devices.
    • Expanded Storybook with dedicated views for design assets and updated design tokens.
  • Bug Fixes

    • Improved app startup and root registration for the mobile experience.
    • Updated design-system styling and token usage for more consistent colors, typography, spacing, and shadows.
  • Documentation

    • Refreshed developer docs for asset locations, font handling, and the recommended command list.

@vercel

vercel Bot commented Jun 27, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
comma-front-web Ready Ready Preview, Comment Jun 27, 2026 6:20am

@coderabbitai

coderabbitai Bot commented Jun 27, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@choihooo, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 35 minutes and 5 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b0475e15-a215-46a9-8edb-230b6eff3256

📥 Commits

Reviewing files that changed from the base of the PR and between 65dba06 and f89825a.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (6)
  • apps/mobile-shell/App.tsx
  • apps/mobile-shell/metro.config.js
  • apps/mobile-shell/package.json
  • apps/mobile-shell/src/env.d.ts
  • apps/mobile-shell/tsconfig.json
  • scripts/dev-device.sh
📝 Walkthrough

Walkthrough

Design-system asset typing, manifest exports, font declarations, theme tokens, and component styles were updated. Storybook now renders the new assets and revised tokens. Mobile, web, and root package scripts were changed to use a new device-oriented dev flow, and the README command docs were rewritten.

Changes

Design system, Storybook, and device dev flow

Layer / File(s) Summary
Asset registry and font modules
packages/design-system/src/assets.ts, packages/design-system/src/font-assets.d.ts, README.md
DesignAsset typing, designAssets, and font asset module declarations are added, and the README documents asset storage plus local font loading.
Theme tokens and component styles
packages/design-system/src/theme.css.ts, packages/design-system/src/components.css.ts, packages/design-system/src/index.ts
primitiveColors, semanticColors, grid, spacing, radii, shadows, typography, and font-face wiring replace the old theme set, component styles move to the new tokens, and the barrel re-exports the expanded theme surface.
Storybook asset and token views
apps/storybook/src/Assets.stories.tsx, apps/storybook/src/DesignTokens.stories.tsx, apps/storybook/src/Button.stories.tsx
Storybook adds a design-assets gallery, splits token rendering into primitive and semantic color sections, renders explicit typography and grid token names, and updates button story backgrounds.
App entrypoints and package scripts
apps/mobile-shell/index.ts, apps/mobile-shell/package.json, apps/web/package.json, package.json
Mobile shell registers App, switches to index.ts, updates scripts and dependencies, apps/web replaces dev:lan, and the root manifest adds dev:device.
Device shell script and command docs
scripts/dev-device.sh, README.md
The device shell script sources .env, derives EXPO_PUBLIC_WEB_URL, traps cleanup, launches the web and mobile dev processes, and the README command section removes the old LAN and dev-client instructions.

Sequence Diagram(s)

sequenceDiagram
  participant Developer
  participant RootPackage as root package.json
  participant DevScript as scripts/dev-device.sh
  participant WebApp as `@comma/web`
  participant MobileShell as `@comma/mobile-shell`

  Developer->>RootPackage: pnpm dev:device
  RootPackage->>DevScript: run ./scripts/dev-device.sh
  DevScript->>DevScript: source .env and set EXPO_PUBLIC_WEB_URL
  DevScript->>WebApp: pnpm --filter `@comma/web` dev
  DevScript->>MobileShell: pnpm --filter `@comma/mobile-shell` dev
  DevScript-->>Developer: wait for both processes to exit
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~30 minutes

Poem

🐇 Hop-hop, the tokens shine so bright,
My carrot nose found assets tucked just right.
I bounce through Storybook, crisp and new,
Then dev-device hums the web and mobile too.

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (2 warnings, 1 inconclusive)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The PR includes broad token, font, dev-device, and mobile-shell changes that are unrelated to the asset-storage scope in issue #3. Split unrelated token/dev-script/mobile-shell work into separate PRs, or link the additional issues that justify those changes.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Linked Issues check ❓ Inconclusive Issue #3 is mostly implemented, but the actual asset files were filtered out (!**/*.png, !**/*.woff, !**/*.woff2), so audit and naming can't be fully verified. Provide reviewable access to packages/design-system/assets/** or a non-filtered summary of the Figma audit and kebab-case naming to confirm compliance.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and matches the PR’s main change: adding design-system assets and fonts.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/3-design-system-assets

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@choihooo choihooo force-pushed the feature/3-design-system-assets branch from 9bee84c to 65dba06 Compare June 27, 2026 05:53
@choihooo choihooo marked this pull request as ready for review June 27, 2026 05:55

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/storybook/src/DesignTokens.stories.tsx (1)

124-167: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Render the radius tokens or rename this section.

This section advertises Radius, and radii is imported, but the story never iterates those tokens. That leaves one token group missing from the catalog this PR is adding.

Proposed fix
           <div style={gridStyle}>
             {Object.entries(grid).map(([name, value]) => (
               <div
                 key={name}
                 style={{
                   padding: 16,
                   borderRadius: radii.md,
                   background: vars.color.backgroundFill,
                   border: `1px solid ${vars.color.lineTertiary}`
                 }}
               >
                 <strong style={typography.labelNormalB}>{name}</strong>
                 <div style={{ ...typography.captionR, color: vars.color.textSecondary }}>
                   {value}
                 </div>
               </div>
             ))}
+            {Object.entries(radii).map(([name, value]) => (
+              <div
+                key={name}
+                style={{
+                  padding: 16,
+                  borderRadius: radii.md,
+                  background: vars.color.backgroundFill,
+                  border: `1px solid ${vars.color.lineTertiary}`
+                }}
+              >
+                <strong style={typography.labelNormalB}>{name}</strong>
+                <div style={{ ...typography.captionR, color: vars.color.textSecondary }}>
+                  {value}
+                </div>
+              </div>
+            ))}
             {Object.entries(spacing).map(([name, value]) => (
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/storybook/src/DesignTokens.stories.tsx` around lines 124 - 167, The
“Grid / Spacing / Radius / Shadow” story is missing the Radius token group even
though `radii` is imported and the section title advertises it. Update the
`DesignTokens.stories.tsx` story by adding a `radii` iteration alongside the
existing `grid`, `spacing`, and `shadows` mappings, using `radii` values to
render each token; if you don’t want to display them here, rename the section
title to remove Radius.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/design-system/src/components.css.ts`:
- Around line 21-25: The `eyebrow`/system text styles are only copying a few
typography fields, so they miss the full `typography.systemSection` token set
and keep inheriting the body font. Update the affected style blocks in
`components.css.ts` to apply the complete typography token object for
`typography.systemSection` (and the other affected variants at the referenced
sections) instead of cherry-picking individual fields, so `fontFamily`,
`letterSpacing`, and the Outfit face are all preserved.

In `@scripts/dev-device.sh`:
- Around line 35-43: The dev-device launcher currently waits for both background
jobs, which keeps the script alive even if one child exits early. Update the
control flow in the dev-device script around the WEB_PID and MOBILE_PID handling
so it exits as soon as either `@comma/web` or `@comma/mobile-shell` stops, then
ensure the other process is terminated and the existing cleanup trap still runs.

---

Outside diff comments:
In `@apps/storybook/src/DesignTokens.stories.tsx`:
- Around line 124-167: The “Grid / Spacing / Radius / Shadow” story is missing
the Radius token group even though `radii` is imported and the section title
advertises it. Update the `DesignTokens.stories.tsx` story by adding a `radii`
iteration alongside the existing `grid`, `spacing`, and `shadows` mappings,
using `radii` values to render each token; if you don’t want to display them
here, rename the section title to remove Radius.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 337c36d6-612c-45f8-80bb-3e91c884f4f6

📥 Commits

Reviewing files that changed from the base of the PR and between 54d3715 and 65dba06.

⛔ Files ignored due to path filters (13)
  • packages/design-system/assets/fonts/kepler-std/KeplerStd-BoldScnDisp.woff is excluded by !**/*.woff
  • packages/design-system/assets/fonts/kepler-std/KeplerStd-BoldScnItDisp.woff is excluded by !**/*.woff
  • packages/design-system/assets/fonts/outfit/Outfit-latin-variable.woff2 is excluded by !**/*.woff2
  • packages/design-system/assets/fonts/pretendard/Pretendard-ExtraLight.woff2 is excluded by !**/*.woff2
  • packages/design-system/assets/fonts/pretendard/Pretendard-Light.woff2 is excluded by !**/*.woff2
  • packages/design-system/assets/fonts/pretendard/Pretendard-Medium.woff2 is excluded by !**/*.woff2
  • packages/design-system/assets/fonts/pretendard/Pretendard-Regular.woff2 is excluded by !**/*.woff2
  • packages/design-system/assets/fonts/pretendard/Pretendard-SemiBold.woff2 is excluded by !**/*.woff2
  • packages/design-system/assets/logos/symbol-default.png is excluded by !**/*.png
  • packages/design-system/assets/logos/symbol-glass.png is excluded by !**/*.png
  • packages/design-system/assets/logos/type-default.png is excluded by !**/*.png
  • packages/design-system/assets/logos/type-glass.png is excluded by !**/*.png
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (14)
  • README.md
  • apps/mobile-shell/index.ts
  • apps/mobile-shell/package.json
  • apps/storybook/src/Assets.stories.tsx
  • apps/storybook/src/Button.stories.tsx
  • apps/storybook/src/DesignTokens.stories.tsx
  • apps/web/package.json
  • package.json
  • packages/design-system/src/assets.ts
  • packages/design-system/src/components.css.ts
  • packages/design-system/src/font-assets.d.ts
  • packages/design-system/src/index.ts
  • packages/design-system/src/theme.css.ts
  • scripts/dev-device.sh

Comment on lines +21 to 25
color: vars.color.textTertiary,
fontSize: vars.typography.systemSection.fontSize,
fontWeight: vars.typography.systemSection.fontWeight,
lineHeight: vars.typography.systemSection.lineHeight,
textTransform: 'uppercase'

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Apply the full typography tokens here.

These styles cherry-pick only fontSize/fontWeight/lineHeight, so they drop token fields like fontFamily and letterSpacing. Most visibly, eyebrow still inherits vars.font.body, so the new Outfit face from typography.systemSection never applies.

Proposed fix
 export const eyebrow = style({
   margin: `0 0 ${vars.space[3]}`,
   color: vars.color.textTertiary,
-  fontSize: vars.typography.systemSection.fontSize,
-  fontWeight: vars.typography.systemSection.fontWeight,
-  lineHeight: vars.typography.systemSection.lineHeight,
+  ...vars.typography.systemSection,
   textTransform: 'uppercase'
 });
 
 export const title = style({
   margin: 0,
-  fontSize: vars.typography.engNum.fontSize,
-  lineHeight: vars.typography.engNum.lineHeight,
-  fontFamily: vars.typography.engNum.fontFamily,
-  fontWeight: vars.typography.engNum.fontWeight
+  ...vars.typography.engNum
 });
 
 export const description = style({
   margin: `${vars.space[6]} 0 ${vars.space[7]}`,
   color: vars.color.textSecondary,
-  fontSize: vars.typography.bodyNormalR.fontSize,
-  fontWeight: vars.typography.bodyNormalR.fontWeight,
-  lineHeight: vars.typography.bodyNormalR.lineHeight
+  ...vars.typography.bodyNormalR
 });
 
 export const actionButton = recipe({
   base: {
     minHeight: 44,
     border: 0,
     borderRadius: vars.radius.control,
     padding: '0 18px',
     font: 'inherit',
-    fontSize: vars.typography.bodyNormalB.fontSize,
-    fontWeight: vars.typography.bodyNormalB.fontWeight,
-    lineHeight: vars.typography.bodyNormalB.lineHeight,
+    ...vars.typography.bodyNormalB,

Also applies to: 30-41, 51-53

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/design-system/src/components.css.ts` around lines 21 - 25, The
`eyebrow`/system text styles are only copying a few typography fields, so they
miss the full `typography.systemSection` token set and keep inheriting the body
font. Update the affected style blocks in `components.css.ts` to apply the
complete typography token object for `typography.systemSection` (and the other
affected variants at the referenced sections) instead of cherry-picking
individual fields, so `fontFamily`, `letterSpacing`, and the Outfit face are all
preserved.

Comment thread scripts/dev-device.sh
Comment on lines +35 to +43
trap cleanup INT TERM EXIT

pnpm --filter @comma/web dev:device &
WEB_PID=$!

pnpm --filter @comma/mobile-shell dev:device &
MOBILE_PID=$!

wait "$WEB_PID" "$MOBILE_PID"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
sed -n '25,60p' scripts/dev-device.sh
printf '\n--- related script contract ---\n'
sed -n '1,20p' package.json
sed -n '1,20p' apps/web/package.json
sed -n '1,20p' apps/mobile-shell/package.json

Repository: Central-MakeUs/comma-Front

Length of output: 2366


🏁 Script executed:

python3 - <<'PY'
import subprocess, time, textwrap, os, tempfile, sys

script = r'''
#!/bin/sh
sleep 1 &
p1=$!
sleep 5 &
p2=$!
start=$(date +%s)
wait "$p1" "$p2"
rc=$?
end=$(date +%s)
echo "rc=$rc elapsed=$((end-start))"
'''
p = subprocess.run(["/bin/sh", "-c", script], capture_output=True, text=True)
print(p.stdout.strip())
print(p.stderr.strip(), file=sys.stderr)
PY

Repository: Central-MakeUs/comma-Front

Length of output: 180


Exit when the first child exits

wait "$WEB_PID" "$MOBILE_PID" blocks until both processes stop. If @comma/web exits early, @comma/mobile-shell keeps running and the EXIT trap never fires, leaving dev:device stuck in a half-broken state.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/dev-device.sh` around lines 35 - 43, The dev-device launcher
currently waits for both background jobs, which keeps the script alive even if
one child exits early. Update the control flow in the dev-device script around
the WEB_PID and MOBILE_PID handling so it exits as soon as either `@comma/web` or
`@comma/mobile-shell` stops, then ensure the other process is terminated and the
existing cleanup trap still runs.

@choihooo choihooo merged commit ef28d51 into main Jun 27, 2026
4 checks passed
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.

[Feature] Figma 기반 디자인 시스템 에셋 저장 구조 추가

2 participants