Project design system and style guide
When working on the frontend or creating design elements, you must never disrupt the overall mood of the project (color palette, typography system, dark mode tone).
- When adding new components or styles, always follow the design tokens and patterns defined below
- Do not use arbitrary colors outside the approved color list
- Do not use fonts other than the defined typography
- Maintain the dark, dark-mode-based tone, and avoid bright backgrounds or excessive use of color
Core tokens defined in :root of app/ui/global.css:
| Variable | Value | Purpose |
|---|---|---|
--background |
#111113 |
App background (near black) |
--foreground |
#ededed |
Default text (near white) |
--highlight |
#a3ff0c |
Brand accent color (yellow green) |
--border |
#323234 |
Default border |
--min-width |
375px |
Minimum viewport width |
--max-width |
600px |
Maximum viewport width |
--font-size |
14px |
Default font size |
--vh |
1vh |
iOS Safari viewport height unit |
| Color | HEX | Purpose |
|---|---|---|
| Highlight (Green) | #A3FF0C |
Active state, selected state, genre tags, brand accent |
| Blue | #0C7CFF |
Switch active, secondary accent |
| Location Blue | #3994FF |
Location tags |
| Pink | #FF3773 |
Position tags |
| Red | #FF3E2F |
Delete, warning |
| Color | HEX | Purpose |
|---|---|---|
| Background | #111113 |
App background |
| Deep BG | #242426 |
Card background, level tag background |
| Border / Inactive BG | #323234 |
Border, inactive button background, select background |
| Dark Gray | #444447 |
Inactive border, switch inactive background |
| Mid Gray (Border) | #535355 |
Button border |
| Mid Gray (Text) | #9F9FA2 |
Inactive text, secondary text, switch inactive thumb |
| Light Gray | #c0c0c5 |
Default English font color |
| Near White | #E5E5E9 |
Default Korean font color, level tag text |
| Foreground | #ededed |
Default text |
Semi-transparent backgrounds used for tags and interactions:
| Purpose | Value |
|---|---|
| Genre tag background | rgba(163, 255, 12, 0.16) |
| Hover/Tap effect | rgba(163, 255, 12, 0.12) |
| Active button background | #304313 |
| Position tag background | rgba(255, 55, 115, 0.24) |
| Location tag background | rgba(12, 124, 255, 0.20) |
| Level tag background | #242426 |
| Font | Weight | Purpose |
|---|---|---|
SBAggroL |
Light | Large text, branding |
SBAggroM |
Medium | General UI elements |
SBAggroB |
Bold | Emphasis |
Recommended styles (applied in actual use):
- Text color:
#c0c0c5 - Letter spacing:
0 - Line height:
140%
Font loading strategy: All fonts are set with font-display: swap.
| Font | Weight | Purpose |
|---|---|---|
SUIT-TITLE |
SemiBold | Titles, labels |
SUIT-BODY |
Regular | Body text, buttons, tags |
Common properties: color: #e5e5e9, letter-spacing: -2.5%, line-height: 140~150%
Consolidated into a single font-family, with weight controlled via font-weight.
| font-weight | Weight | Purpose |
|---|---|---|
400 |
Regular | Material UI calendar, secondary text |
500 |
Medium | General UI |
600 |
SemiBold | Emphasis |
Usage example: font-family: "Pretendard"; font-weight: 500;
| Size | Purpose |
|---|---|
1rem (16px) |
Button text, input fields |
0.875rem (14px) |
Labels, select items |
0.75rem (12px) |
Tags, secondary text |
- Minimum width: 375px (based on iPhone SE)
- Maximum width: 600px (mobile web only)
- Horizontal centering:
margin: 0 auto - Full height:
height: 100%
/* Scrollbar hiding utility */
.overflow-without-scroll {
overflow: auto;
-ms-overflow-style: none; /* IE/Edge */
scrollbar-width: none; /* Firefox */
}
.overflow-without-scroll::-webkit-scrollbar {
display: none; /* Chrome, Safari */
}Common styles:
| Property | Value |
|---|---|
width |
100% |
borderRadius |
8px |
padding |
10px 12px |
fontFamily |
SUIT-BODY |
fontSize |
1rem |
Styles by state:
| State | Text Color | Border | Background |
|---|---|---|---|
| Inactive | #9F9FA2 |
1px solid #444447 |
#323234 |
| Active | #A3FF0C |
1px solid #A3FF0C |
#304313 |
Common styles:
| Property | Value |
|---|---|
fontFamily |
SUIT-BODY |
fontSize |
0.75rem |
borderRadius |
2px |
padding |
px-1.5 py-0.5 |
whiteSpace |
nowrap |
Colors by tag type:
| Type | Text Color | Background |
|---|---|---|
| Position | #FF3773 |
rgba(255, 55, 115, 0.24) |
| Genre | #A3FF0C |
rgba(163, 255, 12, 0.16) |
| Location | #3994FF |
rgba(12, 124, 255, 0.20) |
| Level | #E5E5E9 |
#242426 |
Tag display order: Location → Position → Genre → Level
Based on Radix UI Switch:
| Property | Value |
|---|---|
| Root size | 51px × 26px |
| Thumb size | 22px × 22px |
borderRadius |
9999px |
| Transition | transform 200ms |
Styles by state:
| State | Root Background | Thumb Color | Thumb Position |
|---|---|---|---|
| Off | #444447 |
#9F9FA2 |
translateX(2px) |
| On | #0C7CFF |
#FFF |
translateX(27px) |
Based on Radix UI Select:
| Property | Value |
|---|---|
| Size | 164px × 33px |
backgroundColor |
#323234 |
borderRadius |
3px |
| Item border | 1px solid #9F9FA2 |
fontFamily |
SUIT-BODY |
fontSize |
0.875rem |
Framer Motion is used for interaction effects:
// Hover effect
whileHover={{ background: "rgba(163, 255, 12, 0.12)" }}
// Tap effect
whileTap={{ background: "rgba(163, 255, 12, 0.12)" }}Switch transition:
transition: transform 200ms;
will-change: transform;Applied to all input, textarea, and select elements (app/ui/global.css):
input, textarea, select {
font-size: 16px; /* Must be at least 16px */
-webkit-appearance: none;
appearance: none;
box-sizing: border-box;
}
input::placeholder, textarea::placeholder {
font-size: 16px;
opacity: 0.6;
}Uses the --vh CSS variable to handle iOS Safari address bar height changes.
Radix UI primitives are used for accessibility:
| Package | Purpose |
|---|---|
@radix-ui/react-avatar |
Avatar |
@radix-ui/react-switch |
Toggle switch |
@radix-ui/react-select |
Select dropdown |
@radix-ui/react-checkbox |
Checkbox |
| File | Description |
|---|---|
app/ui/global.css |
CSS variables, font definitions, global styles |
tailwind.config.ts |
Tailwind theme extensions (background, foreground) |
app/ui/templates/buttons.tsx |
Button template |
app/ui/tags/category-tag.tsx |
Tag component (4 types) |
app/ui/templates/switch.tsx |
Switch component |
app/ui/templates/select.tsx |
Select component |
- Context - Project context
- Architecture - System structure
- Patterns - Code patterns