Children’s ParkGwangjin-gu · 200m
DESIGN SYSTEM CASE STUDY · 2023
Photorage
Design System
Turn repeated decisions
into shared rules.
A design system that replaced repeated UI decisions with shared components, rules, and documentation.
Children’s ParkGwangjin-gu · 200m
01 · The problem
As Photorage grew,
the lack of a shared system became harder to ignore.
The problem wasn’t just visual. Inconsistent patterns made communication, implementation, and onboarding harder.
I’m adding a new page. Which button should I use this time?
10:11 ✓✓Can you send the button specs again—size, color, radius, and disabled state?
10:13Same as the last screen—except this one is orange.
10:15 ✓✓The same decision, explained again.No shared component reference
- 01
const primaryButton = { - 02
background: "#F68B1F",hardcoded - 03
color: "#FFFFFF",hardcoded - 04
padding: "12px 24px",local value - 05
borderRadius: "8px",local value - 06
fontWeight: 600, - 07
} - 08
- 09
const detailButton = { - 10
background: "#FF9417",conflict - 11
borderRadius: "14px",conflict - 12
}
Same button, different valuesNo shared token or state definition
Communication loops
Button specs had to be explained again for every new screen.
Hardcoded decisions
Hex values and spacing lived inside individual screens instead of shared tokens.
Interface drift
Small differences added up across screens, making the interface inconsistent.
Add tags to describe this moment.
48px · black · 8px radius02 · Building the system
Turn repeated decisions
into reusable rules.
I documented how each component should look, behave, and be implemented so the team could use it consistently.
- 01
Audit
Map every live screen.
- 02
Extract
Turn repeated patterns into components.
- 03
Define
Standardize type, color, spacing, and states.
- 04
Document
Document when and how each component should be used.
CORE COMPONENT
Buttons
Primary, secondary, outlined, key-color, loading, disabled, compact, service, hashtag, sharing, and plan variants.
- Status
- Stable
- Source
- Figma 1.4.0
- Updated
- Sep 2026
Usage
Rules clarify when the documented element supports the product—and when it does not.
Live example
Interact with a code-based reference adapted from the real Figma component family.
Structure & behavior
Each part has a named responsibility that stays consistent across features.
Color, size, radius, and state
One-line action statement
Loading, service, or category cue
Specifications
Values below follow the dimensions and tokens represented in the 1.4.0 library.
- Height
- 47 px
- Radius
- 12 px
- Label
- 16 / 21
button.heightbutton.radiustype.buttonAccessibility
Interaction and visual rules ship together.
- ✓KeyboardEvery action remains reachable and visibly focused.
- ✓LabelsControls describe their purpose and outcome.
- ✓ContrastText and state changes remain legible.
COMPONENT · ACTION
Button
Buttons trigger a single action. Their hierarchy should make the next step obvious without competing with the content around it.
- Status
- Stable
- Owner
- Product Design
- Updated
- Jun 2023
Usage
Use one primary action per view. Secondary actions support, but never compete with, the main task.
Use “1개월 무료 체험하기” instead of a generic “확인”.
Equal emphasis makes the intended next step ambiguous.
Anatomy
A button has four controlled parts. All spacing is tokenized rather than set screen by screen.
- Container
Defines size, color, and interaction state.
- Leading icon
Optional. Use only when it clarifies the action.
- Label
Verb-led and limited to one line.
- Safe area
Maintains the minimum touch target.
Variants
Choose hierarchy by action priority, not visual preference.
One high-priority action moves the task forward.
An alternative supports the primary action.
Low-priority actions should remain available but quiet.
External brand styling is preserved only for authentication.
States
Every state communicates whether an action is available and what the system is doing.
Specifications
Base measurements are shared across product teams and mapped to implementation tokens.
- Height
- 48 px
- Radius
- 12 px
- Horizontal padding
- 20 px
- Icon gap
- 8 px
- Label
- 16 / 600
- Touch target
- 48 px min
size.control.lgradius.controlspace.20space.08type.buttona11y.targetAccessibility
Interaction rules are documented alongside visual rules.
- ✓Clear labelsDescribe the result of the action, not the control itself.
- ✓ContrastMaintain at least 4.5:1 for labels in every state.
- ✓FocusPreserve a visible 2 px focus indicator.
RELATED COMPONENT
Search field
Use search when users know what they are looking for. Pair it with filters only when the result set needs meaningful narrowing.PATTERN
Bottom sheet
Bottom sheets keep a short decision in context. They are reserved for focused selections, confirmations, and temporary actions.브랜드 선택
- 01 · Handle
Signals the sheet can be dismissed.
- 02 · Title
Names one focused decision.
- 03 · Content
Uses a list, grid, or picker—never all three.
- 04 · Safe area
Protects controls above the home indicator.
FOUNDATION REFERENCE
Tokens connect design to code.
Every documented value resolves to one shared source, so new components inherit the same visual language.Title 1HeadlineBody text explains behavior and guidance.Caption · supporting metadata
03 · Component architecture
Build components once.
Reuse them across the product.
I organized the library using Atomic Design so the team could find and reuse components from basic controls to complete pages.
ATOM · MOLECULE · ORGANISM
TEMPLATE · PAGE
04 · Impact
Design-related comments
dropped 40% after rollout.
Reduction in design-related comments per screen after rollout.
“Fewer handoff questions made delivery timelines easier to predict.”Product manager
“Clear component guidance made implementation faster and more consistent.”Front-end developer
WHAT CHANGED
Rules made the team freer.
The system reduced decision fatigue instead of limiting designers.
Maintenance became part of design.
Scalability and implementation context moved into the design process.
PHOTORAGE DESIGN SYSTEM · 2023