ui-mirror-skill 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +95 -0
- package/bin/cli.mjs +121 -0
- package/package.json +34 -0
- package/skill/SKILL.md +751 -0
- package/skill/references/analysis-dimensions.md +382 -0
- package/skill/references/component-catalog.md +758 -0
- package/skill/references/css-token-mapping.md +359 -0
- package/skill/references/output-template.md +249 -0
- package/skill/scripts/compare_tokens.py +741 -0
- package/skill/scripts/download_screenshot.py +125 -0
- package/skill/scripts/extract_design_tokens.py +617 -0
- package/skill/scripts/generate_migration.py +580 -0
- package/skill/scripts/generate_radar_chart.py +267 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
# UI Mirror: CSS Token Mapping (Reference Example)
|
|
2
|
+
|
|
3
|
+
> **NOTE**: This file contains example token values from a shadcn/ui project as a reference template.
|
|
4
|
+
> When using this skill, replace these values with the actual tokens from your project's `globals.css`.
|
|
5
|
+
> Auto-detect source of truth: project's global CSS file and design system documentation.
|
|
6
|
+
> All token values should be in OKLCH format for accurate comparison.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. Core Palette (`:root` tokens)
|
|
11
|
+
|
|
12
|
+
### Primary
|
|
13
|
+
|
|
14
|
+
| Token | OKLCH Value | Approx HEX | Usage |
|
|
15
|
+
|-------|-------------|------------|-------|
|
|
16
|
+
| `--primary` | `oklch(0.575 0.215 276)` | #6866F1 | Brand purple. Buttons (default), links, active states, sidebar active |
|
|
17
|
+
| `--primary-foreground` | `oklch(1 0 0)` | #FFFFFF | Text on primary backgrounds |
|
|
18
|
+
|
|
19
|
+
### Background & Foreground
|
|
20
|
+
|
|
21
|
+
| Token | OKLCH Value | Approx HEX | Usage |
|
|
22
|
+
|-------|-------------|------------|-------|
|
|
23
|
+
| `--background` | `oklch(0.97 0.003 276)` | #F6F6F8 | Page background (purple-tinted light gray) |
|
|
24
|
+
| `--foreground` | `oklch(0.145 0 0)` | #1A1A1A | Primary text color (near-black) |
|
|
25
|
+
|
|
26
|
+
### Card & Popover
|
|
27
|
+
|
|
28
|
+
| Token | OKLCH Value | Approx HEX | Usage |
|
|
29
|
+
|-------|-------------|------------|-------|
|
|
30
|
+
| `--card` | `oklch(1 0 0)` | #FFFFFF | Card surfaces |
|
|
31
|
+
| `--card-foreground` | `oklch(0.145 0 0)` | #1A1A1A | Text on cards |
|
|
32
|
+
| `--popover` | `oklch(1 0 0)` | #FFFFFF | Dropdown/popover surfaces |
|
|
33
|
+
| `--popover-foreground` | `oklch(0.145 0 0)` | #1A1A1A | Text in popovers |
|
|
34
|
+
|
|
35
|
+
### Secondary & Muted
|
|
36
|
+
|
|
37
|
+
| Token | OKLCH Value | Approx HEX | Usage |
|
|
38
|
+
|-------|-------------|------------|-------|
|
|
39
|
+
| `--secondary` | `oklch(0.97 0.003 276)` | #F6F6F8 | Secondary button bg, subtle backgrounds |
|
|
40
|
+
| `--secondary-foreground` | `oklch(0.205 0 0)` | #2E2E2E | Text on secondary backgrounds |
|
|
41
|
+
| `--muted` | `oklch(0.955 0.005 276)` | #F0F0F4 | Muted backgrounds, disabled states |
|
|
42
|
+
| `--muted-foreground` | `oklch(0.52 0.01 276)` | #7B7B8E | Placeholder text, descriptions, timestamps |
|
|
43
|
+
|
|
44
|
+
### Accent
|
|
45
|
+
|
|
46
|
+
| Token | OKLCH Value | Approx HEX | Usage |
|
|
47
|
+
|-------|-------------|------------|-------|
|
|
48
|
+
| `--accent` | `oklch(0.965 0.005 276)` | #F3F3F7 | Hover backgrounds, accent surfaces |
|
|
49
|
+
| `--accent-foreground` | `oklch(0.205 0 0)` | #2E2E2E | Text on accent backgrounds |
|
|
50
|
+
|
|
51
|
+
### Destructive
|
|
52
|
+
|
|
53
|
+
| Token | OKLCH Value | Approx HEX | Usage |
|
|
54
|
+
|-------|-------------|------------|-------|
|
|
55
|
+
| `--destructive` | `oklch(0.577 0.245 27.325)` | #E53E3E | Destructive buttons, error states |
|
|
56
|
+
|
|
57
|
+
### Border, Input & Ring
|
|
58
|
+
|
|
59
|
+
| Token | OKLCH Value | Approx HEX | Usage |
|
|
60
|
+
|-------|-------------|------------|-------|
|
|
61
|
+
| `--border` | `oklch(0.91 0.005 276)` | #E4E4E9 | Default borders (cards, dividers) |
|
|
62
|
+
| `--input` | `oklch(0.92 0.005 276)` | #E7E7EC | Input field borders |
|
|
63
|
+
| `--ring` | `oklch(0.575 0.215 276 / 0.5)` | #6866F1 @ 50% | Focus ring color |
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 2. Chart Colors
|
|
68
|
+
|
|
69
|
+
| Token | OKLCH Value | Approx HEX |
|
|
70
|
+
|-------|-------------|------------|
|
|
71
|
+
| `--chart-1` | `oklch(0.646 0.222 41.116)` | Orange |
|
|
72
|
+
| `--chart-2` | `oklch(0.6 0.118 184.704)` | Teal |
|
|
73
|
+
| `--chart-3` | `oklch(0.398 0.07 227.392)` | Dark blue |
|
|
74
|
+
| `--chart-4` | `oklch(0.828 0.189 84.429)` | Yellow |
|
|
75
|
+
| `--chart-5` | `oklch(0.769 0.188 70.08)` | Amber |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 3. Shadow Tokens
|
|
80
|
+
|
|
81
|
+
| Token | Value | Usage |
|
|
82
|
+
|-------|-------|-------|
|
|
83
|
+
| `--shadow-primary-glow` | `0 2px 10px -3px oklch(0.575 0.215 276 / 0.5)` | Purple glow on primary buttons |
|
|
84
|
+
|
|
85
|
+
### Shadow Scale (Tailwind classes)
|
|
86
|
+
|
|
87
|
+
| Class | Usage | Rule |
|
|
88
|
+
|-------|-------|------|
|
|
89
|
+
| `shadow-xs` | Input fields, outline buttons | SH1 |
|
|
90
|
+
| `shadow-sm` | Cards (via `<Card>` component) | SH2 |
|
|
91
|
+
| `shadow-md` + `shadow-primary/20` | Default buttons, dropdowns, popovers | SH3 |
|
|
92
|
+
| `shadow-lg` | Dialogs, sheets | SH4 |
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 4. Sidebar Tokens
|
|
97
|
+
|
|
98
|
+
| Token | OKLCH Value | Approx HEX | Usage |
|
|
99
|
+
|-------|-------------|------------|-------|
|
|
100
|
+
| `--sidebar` | `oklch(1 0 0)` | #FFFFFF | Sidebar background |
|
|
101
|
+
| `--sidebar-foreground` | `oklch(0.145 0 0)` | #1A1A1A | Sidebar text |
|
|
102
|
+
| `--sidebar-primary` | `oklch(0.575 0.215 276)` | #6866F1 | Active sidebar item |
|
|
103
|
+
| `--sidebar-primary-foreground` | `oklch(1 0 0)` | #FFFFFF | Text on active item |
|
|
104
|
+
| `--sidebar-accent` | `oklch(0.965 0.005 276)` | #F3F3F7 | Hover/active background |
|
|
105
|
+
| `--sidebar-accent-foreground` | `oklch(0.205 0 0)` | #2E2E2E | Text on hover |
|
|
106
|
+
| `--sidebar-border` | `oklch(0.91 0.005 276)` | #E4E4E9 | Sidebar borders |
|
|
107
|
+
| `--sidebar-ring` | `oklch(0.575 0.215 276 / 0.5)` | #6866F1 @ 50% | Sidebar focus ring |
|
|
108
|
+
|
|
109
|
+
### Sidebar Dimensions
|
|
110
|
+
| Property | Value |
|
|
111
|
+
|----------|-------|
|
|
112
|
+
| `--sidebar-width` | `16rem` (256px) |
|
|
113
|
+
| `--sidebar-width-mobile` | `18rem` (288px) |
|
|
114
|
+
| `--sidebar-width-icon` | `3rem` (48px) |
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 5. BoXa M3 Autumn Theme Tokens
|
|
119
|
+
|
|
120
|
+
> Used exclusively within `[data-boxa]` scoped elements for the ecology wiki.
|
|
121
|
+
|
|
122
|
+
| Token | OKLCH Value | Approx HEX | Usage |
|
|
123
|
+
|-------|-------------|------------|-------|
|
|
124
|
+
| `--boxa-primary` | `oklch(0.45 0.14 42)` | #6D5044 | Autumn brown primary |
|
|
125
|
+
| `--boxa-primary-container` | `oklch(0.52 0.16 42)` | -- | Primary container (M3) |
|
|
126
|
+
| `--boxa-on-primary` | `oklch(1 0 0)` | #FFFFFF | Text on primary |
|
|
127
|
+
| `--boxa-on-primary-container` | `oklch(0.99 0.002 0)` | -- | Text on primary container |
|
|
128
|
+
| `--boxa-primary-fixed` | `oklch(0.91 0.05 42)` | -- | Fixed primary tint |
|
|
129
|
+
| `--boxa-secondary` | `oklch(0.48 0.13 240)` | -- | Blue secondary |
|
|
130
|
+
| `--boxa-on-secondary` | `oklch(1 0 0)` | #FFFFFF | Text on secondary |
|
|
131
|
+
| `--boxa-secondary-fixed` | `oklch(0.92 0.04 240)` | -- | Fixed secondary tint |
|
|
132
|
+
| `--boxa-tertiary` | `oklch(0.47 0.14 255)` | -- | Purple tertiary |
|
|
133
|
+
| `--boxa-surface` | `oklch(0.98 0.01 85)` | -- | Warm white surface |
|
|
134
|
+
| `--boxa-surface-dim` | `oklch(0.88 0.01 85)` | -- | Dimmed surface |
|
|
135
|
+
| `--boxa-surface-container` | `oklch(0.95 0.01 85)` | -- | Container surface |
|
|
136
|
+
| `--boxa-surface-container-high` | `oklch(0.93 0.01 85)` | -- | High-emphasis container |
|
|
137
|
+
| `--boxa-surface-container-low` | `oklch(0.96 0.01 85)` | -- | Low-emphasis container |
|
|
138
|
+
| `--boxa-on-surface` | `oklch(0.18 0.02 85)` | -- | Dark text on surface |
|
|
139
|
+
| `--boxa-on-surface-variant` | `oklch(0.40 0.06 42)` | -- | Variant text |
|
|
140
|
+
| `--boxa-outline` | `oklch(0.55 0.05 42)` | -- | Outline/border |
|
|
141
|
+
| `--boxa-outline-variant` | `oklch(0.82 0.04 42)` | -- | Light outline |
|
|
142
|
+
| `--boxa-error` | `oklch(0.44 0.2 27)` | -- | Error color |
|
|
143
|
+
| `--boxa-background` | `oklch(0.98 0.01 85)` | -- | Page background |
|
|
144
|
+
|
|
145
|
+
### Wiki Alias Tokens (v1 redesign)
|
|
146
|
+
| Alias Token | Maps To |
|
|
147
|
+
|-------------|---------|
|
|
148
|
+
| `--wiki-primary` | `var(--boxa-primary)` |
|
|
149
|
+
| `--wiki-primary-light` | `var(--boxa-primary-container)` |
|
|
150
|
+
| `--wiki-secondary` | `var(--boxa-secondary)` |
|
|
151
|
+
| `--wiki-accent` | `var(--boxa-tertiary)` |
|
|
152
|
+
| `--wiki-surface` | `var(--boxa-surface)` |
|
|
153
|
+
| `--wiki-surface-alt` | `var(--boxa-surface-container-low)` |
|
|
154
|
+
| `--wiki-text` | `var(--boxa-on-surface)` |
|
|
155
|
+
| `--wiki-text-muted` | `var(--boxa-on-surface-variant)` |
|
|
156
|
+
| `--wiki-border` | `var(--boxa-outline)` |
|
|
157
|
+
| `--wiki-border-light` | `var(--boxa-outline-variant)` |
|
|
158
|
+
|
|
159
|
+
### BoXa Radius Override
|
|
160
|
+
```css
|
|
161
|
+
[data-boxa] {
|
|
162
|
+
--radius: 0.25rem; /* Tighter radius than core project's 0.375rem */
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 6. BlockLab Mode Tokens
|
|
169
|
+
|
|
170
|
+
### Batch Mode (`[data-blocklab-mode="batch"]`)
|
|
171
|
+
| Token | OKLCH Value |
|
|
172
|
+
|-------|-------------|
|
|
173
|
+
| `--bl-primary` | `oklch(0.575 0.215 276)` (same as core primary) |
|
|
174
|
+
| `--bl-primary-fg` | `oklch(1 0 0)` |
|
|
175
|
+
| `--bl-accent-bg` | `oklch(0.97 0.003 276)` |
|
|
176
|
+
| `--bl-accent-subtle` | `oklch(0.955 0.01 276)` |
|
|
177
|
+
| `--bl-ring` | `oklch(0.575 0.215 276 / 0.5)` |
|
|
178
|
+
|
|
179
|
+
### Interactive Mode (`[data-blocklab-mode="interactive"]`)
|
|
180
|
+
| Token | OKLCH Value |
|
|
181
|
+
|-------|-------------|
|
|
182
|
+
| `--bl-primary` | `oklch(0.6 0.155 175)` (teal-green) |
|
|
183
|
+
| `--bl-primary-fg` | `oklch(1 0 0)` |
|
|
184
|
+
| `--bl-accent-bg` | `oklch(0.97 0.01 175)` |
|
|
185
|
+
| `--bl-accent-subtle` | `oklch(0.955 0.02 175)` |
|
|
186
|
+
| `--bl-ring` | `oklch(0.6 0.155 175 / 0.5)` |
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 7. Radius System
|
|
191
|
+
|
|
192
|
+
### Base Value
|
|
193
|
+
```css
|
|
194
|
+
:root {
|
|
195
|
+
--radius: 0.375rem; /* 6px */
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Computed Scale
|
|
200
|
+
| Tailwind Class | CSS Variable | Computed Value | Usage |
|
|
201
|
+
|---------------|-------------|---------------|-------|
|
|
202
|
+
| `rounded-sm` | `--radius-sm` | `calc(0.375rem - 4px)` = ~2px | Close buttons, tiny elements |
|
|
203
|
+
| `rounded-md` | `--radius-md` | `calc(0.375rem - 2px)` = ~4px | Buttons, inputs (R1) |
|
|
204
|
+
| `rounded-lg` | `--radius-lg` | `0.375rem` = 6px | Cards, tabs, calendar (R2) |
|
|
205
|
+
| `rounded-xl` | `--radius-xl` | `calc(0.375rem + 4px)` = ~10px | FORBIDDEN per R4 (homeroom exception) |
|
|
206
|
+
| `rounded-2xl` | `--radius-2xl` | `calc(0.375rem + 8px)` = ~14px | FORBIDDEN per R4 |
|
|
207
|
+
| `rounded-3xl` | `--radius-3xl` | `calc(0.375rem + 12px)` = ~18px | FORBIDDEN per R4 |
|
|
208
|
+
| `rounded-4xl` | `--radius-4xl` | `calc(0.375rem + 16px)` = ~22px | FORBIDDEN per R4 |
|
|
209
|
+
| `rounded-full` | -- | 9999px | Avatars, badges, status dots (R3) |
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 8. Typography System
|
|
214
|
+
|
|
215
|
+
### Font Stack
|
|
216
|
+
```css
|
|
217
|
+
--font-sans: var(--font-pretendard), "Pretendard Variable", "Pretendard",
|
|
218
|
+
var(--font-inter), Inter, ui-sans-serif, system-ui, sans-serif;
|
|
219
|
+
--font-mono: var(--font-mono); /* System monospace */
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Size Scale (Tailwind)
|
|
223
|
+
| Class | Size | Usage |
|
|
224
|
+
|-------|------|-------|
|
|
225
|
+
| `text-xs` | 0.75rem (12px) | Badge text, timestamps, metadata |
|
|
226
|
+
| `text-sm` | 0.875rem (14px) | Body text, descriptions, inputs (md:) |
|
|
227
|
+
| `text-base` | 1rem (16px) | Mobile input text, emphasis body |
|
|
228
|
+
| `text-lg` | 1.125rem (18px) | Dialog titles, section headers |
|
|
229
|
+
| `text-xl` | 1.25rem (20px) | Page sub-headers |
|
|
230
|
+
| `text-2xl` | 1.5rem (24px) | Page titles |
|
|
231
|
+
| `text-3xl` | 1.875rem (30px) | Hero/large titles |
|
|
232
|
+
| `text-4xl` | 2.25rem (36px) | Maximum heading size |
|
|
233
|
+
|
|
234
|
+
### Weight Scale
|
|
235
|
+
| Class | Weight | Usage |
|
|
236
|
+
|-------|--------|-------|
|
|
237
|
+
| `font-normal` | 400 | Body text |
|
|
238
|
+
| `font-medium` | 500 | Labels, table headers, button text |
|
|
239
|
+
| `font-semibold` | 600 | Card titles, dialog titles, emphasis |
|
|
240
|
+
| `font-bold` | 700 | Strong emphasis (rare) |
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## 9. State Colors (Semantic)
|
|
245
|
+
|
|
246
|
+
| State | Background | Text | Usage |
|
|
247
|
+
|-------|-----------|------|-------|
|
|
248
|
+
| Success | `bg-emerald-50` | `text-emerald-700` | Completed, approved, online |
|
|
249
|
+
| Warning | `bg-amber-50` | `text-amber-700` | Pending, needs attention |
|
|
250
|
+
| Error | `bg-red-50` | `text-red-700` | Failed, blocked, error |
|
|
251
|
+
| Info | `bg-primary/10` | `text-primary` | Informational highlights |
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## 10. Design Rules Reference (design system rules)
|
|
256
|
+
|
|
257
|
+
### Colors (C1-C5)
|
|
258
|
+
| ID | Rule |
|
|
259
|
+
|----|------|
|
|
260
|
+
| C1 | Semantic tokens only -- no hardcoded HEX/RGB |
|
|
261
|
+
| C2 | Light mode only -- `dark:` prefix forbidden |
|
|
262
|
+
| C3 | State colors: emerald/amber/red + 50/700 |
|
|
263
|
+
| C4 | Opacity via slash notation: `bg-primary/10` |
|
|
264
|
+
| C5 | globals.css tokens in OKLCH format |
|
|
265
|
+
|
|
266
|
+
### Typography (T1-T4)
|
|
267
|
+
| ID | Rule |
|
|
268
|
+
|----|------|
|
|
269
|
+
| T1 | `--font-sans` (Pretendard+Inter) -- no hardcoded font-family |
|
|
270
|
+
| T2 | Tailwind size scale only (xs-4xl) -- no `text-[13px]` |
|
|
271
|
+
| T3 | Weight 4 steps: normal(400)/medium(500)/semibold(600)/bold(700) |
|
|
272
|
+
| T4 | Monospace: `font-mono` system variable |
|
|
273
|
+
|
|
274
|
+
### Spacing (S1-S3)
|
|
275
|
+
| ID | Rule |
|
|
276
|
+
|----|------|
|
|
277
|
+
| S1 | 4px base unit -- Tailwind scale only |
|
|
278
|
+
| S2 | Page padding `p-6`, card padding `px-4 pt-4`/`px-4 pb-4` |
|
|
279
|
+
| S3 | Section gap `gap-4`, internal element gap `gap-2` |
|
|
280
|
+
|
|
281
|
+
### Border Radius (R1-R4)
|
|
282
|
+
| ID | Rule |
|
|
283
|
+
|----|------|
|
|
284
|
+
| R1 | Buttons/inputs: `rounded-md` (6px) |
|
|
285
|
+
| R2 | Cards/tabs/calendar: `rounded-lg` (8px) |
|
|
286
|
+
| R3 | Avatars/status dots: `rounded-full` |
|
|
287
|
+
| R4 | `rounded-xl` and above FORBIDDEN (homeroom exception) |
|
|
288
|
+
|
|
289
|
+
### Shadows (SH1-SH4)
|
|
290
|
+
| ID | Rule |
|
|
291
|
+
|----|------|
|
|
292
|
+
| SH1 | Inputs/outline buttons: `shadow-xs` |
|
|
293
|
+
| SH2 | Cards: `shadow-sm` (via Card component) -- no additional shadow |
|
|
294
|
+
| SH3 | Dropdowns/popovers/default buttons: `shadow-md` |
|
|
295
|
+
| SH4 | Dialogs/sheets: `shadow-lg` |
|
|
296
|
+
|
|
297
|
+
### Animations (A1-A3)
|
|
298
|
+
| ID | Rule |
|
|
299
|
+
|----|------|
|
|
300
|
+
| A1 | `tw-animate-css` only -- `framer-motion` forbidden |
|
|
301
|
+
| A2 | `transition-all` + duration allowed |
|
|
302
|
+
| A3 | Custom keyframes in `globals.css` only |
|
|
303
|
+
|
|
304
|
+
### Components (CP1-CP6)
|
|
305
|
+
| ID | Rule |
|
|
306
|
+
|----|------|
|
|
307
|
+
| CP1 | CVA + `cn()` + `data-slot` pattern required |
|
|
308
|
+
| CP2 | Cards: shadcn `<Card>` component (no raw div) |
|
|
309
|
+
| CP3 | Icons: `lucide-react`, default `size-4` |
|
|
310
|
+
| CP4 | Empty state: icon + title + description |
|
|
311
|
+
| CP5 | Toast: shadcn Sonner |
|
|
312
|
+
| CP6 | Status badge: shadcn `<Badge>` variant |
|
|
313
|
+
|
|
314
|
+
### Accessibility (AC1-AC4)
|
|
315
|
+
| ID | Rule |
|
|
316
|
+
|----|------|
|
|
317
|
+
| AC1 | `focus-visible` ring style: `ring-ring/50 ring-[3px]` |
|
|
318
|
+
| AC2 | Form error: `aria-invalid` |
|
|
319
|
+
| AC3 | Visually hidden text: `sr-only` |
|
|
320
|
+
| AC4 | UI components: `data-slot` attribute required |
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## 11. Scrollbar Styling
|
|
325
|
+
|
|
326
|
+
```css
|
|
327
|
+
::-webkit-scrollbar { width: 6px; }
|
|
328
|
+
::-webkit-scrollbar-track { background: transparent; }
|
|
329
|
+
::-webkit-scrollbar-thumb {
|
|
330
|
+
background-color: oklch(0.575 0.215 276 / 0.2); /* Primary @ 20% */
|
|
331
|
+
border-radius: 20px;
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Hide Scrollbar Utility
|
|
336
|
+
```css
|
|
337
|
+
.no-scrollbar::-webkit-scrollbar { display: none; }
|
|
338
|
+
.no-scrollbar { -ms-overflow-style: none; scrollbar-width: none; }
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## 12. Custom Animations (globals.css)
|
|
344
|
+
|
|
345
|
+
| Class | Keyframe | Duration | Easing |
|
|
346
|
+
|-------|----------|----------|--------|
|
|
347
|
+
| `.animate-slot-spin` | `slot-spin` (translateY 0 -> -480px) | 2.5s | cubic-bezier(0.33, 1, 0.68, 1) |
|
|
348
|
+
| `.animate-fade-in` | `fade-in` (opacity 0 -> 1) | 0.3s | ease-in |
|
|
349
|
+
| `.cursor-blink` | `cursor-blink` (opacity toggle) | 1s | step-end infinite |
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## 13. Privacy Masking System
|
|
354
|
+
|
|
355
|
+
| Attribute | Selector | Effect |
|
|
356
|
+
|-----------|----------|--------|
|
|
357
|
+
| `data-masking-names="true"` | `[data-sensitive="name"]` | blur(8px) + no-select |
|
|
358
|
+
| `data-masking-scores="true"` | `[data-sensitive="score"]` | blur(8px) + no-select |
|
|
359
|
+
| `data-masking-photos="true"` | `[data-sensitive="photo"]` | blur(12px) + no-select |
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# UI Mirror: Analysis Report Template
|
|
2
|
+
|
|
3
|
+
> Copy this template for each benchmark analysis. Replace all `{{placeholder}}` values.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
```markdown
|
|
8
|
+
# UI Mirror Analysis: {{BENCHMARK_NAME}}
|
|
9
|
+
|
|
10
|
+
**Benchmark URL**: {{URL}}
|
|
11
|
+
**Date Analyzed**: {{YYYY-MM-DD}}
|
|
12
|
+
**Pages Analyzed**: {{list of specific pages/routes examined}}
|
|
13
|
+
**Analyzer**: UI Mirror Skill (automated)
|
|
14
|
+
**Project Version**: current `main` branch
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Executive Summary
|
|
19
|
+
|
|
20
|
+
{{3-5 sentences summarizing the overall comparison. Include:
|
|
21
|
+
- Overall similarity score (X.X / 5.0)
|
|
22
|
+
- The most similar axis and least similar axis
|
|
23
|
+
- Whether migration is feasible within the project's design rules
|
|
24
|
+
- Key blockers or conflicts with existing design system rules
|
|
25
|
+
- Recommended approach (token swap / component override / hybrid)}}
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Visual Comparison
|
|
30
|
+
|
|
31
|
+
### Benchmark Screenshots
|
|
32
|
+
| Page | Screenshot |
|
|
33
|
+
|------|-----------|
|
|
34
|
+
| {{page_name}} |  |
|
|
35
|
+
|
|
36
|
+
### Current Project State
|
|
37
|
+
| Page | Screenshot |
|
|
38
|
+
|------|-----------|
|
|
39
|
+
| {{equivalent_page}} |  |
|
|
40
|
+
|
|
41
|
+
### Side-by-Side Overlay
|
|
42
|
+
| Element | Benchmark | Current | Delta |
|
|
43
|
+
|---------|-----------|-------|-------|
|
|
44
|
+
| {{element}} |  |  | {{description}} |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 7-Axis Comparison
|
|
49
|
+
|
|
50
|
+
### Axis 1: Layout (Score: {{X}}/5)
|
|
51
|
+
|
|
52
|
+
| Property | Benchmark Value | Current Value | Gap | Action |
|
|
53
|
+
|----------|----------------|-------------|-----|--------|
|
|
54
|
+
| Grid system | {{value}} | Sidebar + SidebarInset (flex) | {{description}} | {{KEEP / ADOPT / HYBRID}} |
|
|
55
|
+
| Max-width | {{value}} | No fixed max-width (flex-1) | {{description}} | {{action}} |
|
|
56
|
+
| Sidebar width | {{value}} | 16rem (--sidebar-width) | {{description}} | {{action}} |
|
|
57
|
+
| Header position | {{value}} | Per-page (not global sticky) | {{description}} | {{action}} |
|
|
58
|
+
| Breakpoints | {{values}} | sm:640 md:768 lg:1024 xl:1280 | {{description}} | {{action}} |
|
|
59
|
+
| Column structure | {{value}} | 2-col (sidebar + main) | {{description}} | {{action}} |
|
|
60
|
+
| Responsive collapse | {{value}} | Sheet on mobile | {{description}} | {{action}} |
|
|
61
|
+
|
|
62
|
+
### Axis 2: Color (Score: {{X}}/5)
|
|
63
|
+
|
|
64
|
+
| Token | Benchmark OKLCH | Current OKLCH | Delta-E | Action |
|
|
65
|
+
|-------|-----------------|-------------|---------|--------|
|
|
66
|
+
| Primary | {{oklch(L C H)}} | oklch(0.575 0.215 276) | {{value}} | {{action}} |
|
|
67
|
+
| Primary foreground | {{oklch(L C H)}} | oklch(1 0 0) | {{value}} | {{action}} |
|
|
68
|
+
| Background | {{oklch(L C H)}} | oklch(0.97 0.003 276) | {{value}} | {{action}} |
|
|
69
|
+
| Foreground | {{oklch(L C H)}} | oklch(0.145 0 0) | {{value}} | {{action}} |
|
|
70
|
+
| Card | {{oklch(L C H)}} | oklch(1 0 0) | {{value}} | {{action}} |
|
|
71
|
+
| Secondary | {{oklch(L C H)}} | oklch(0.97 0.003 276) | {{value}} | {{action}} |
|
|
72
|
+
| Muted | {{oklch(L C H)}} | oklch(0.955 0.005 276) | {{value}} | {{action}} |
|
|
73
|
+
| Muted foreground | {{oklch(L C H)}} | oklch(0.52 0.01 276) | {{value}} | {{action}} |
|
|
74
|
+
| Accent | {{oklch(L C H)}} | oklch(0.965 0.005 276) | {{value}} | {{action}} |
|
|
75
|
+
| Destructive | {{oklch(L C H)}} | oklch(0.577 0.245 27.325) | {{value}} | {{action}} |
|
|
76
|
+
| Border | {{oklch(L C H)}} | oklch(0.91 0.005 276) | {{value}} | {{action}} |
|
|
77
|
+
| Input | {{oklch(L C H)}} | oklch(0.92 0.005 276) | {{value}} | {{action}} |
|
|
78
|
+
| Ring | {{oklch(L C H / A)}} | oklch(0.575 0.215 276 / 0.5) | {{value}} | {{action}} |
|
|
79
|
+
|
|
80
|
+
**Gradient usage**: {{yes/no, details}}
|
|
81
|
+
**Dark mode**: {{yes/no -- check project design rules}}
|
|
82
|
+
**State colors**: {{mapping to emerald/amber/red per C3}}
|
|
83
|
+
|
|
84
|
+
### Axis 3: Typography (Score: {{X}}/5)
|
|
85
|
+
|
|
86
|
+
| Property | Benchmark Value | Current Value | Gap | Action |
|
|
87
|
+
|----------|----------------|-------------|-----|--------|
|
|
88
|
+
| Primary font | {{font-name}} | Pretendard + Inter (font-sans) | {{description}} | {{action}} |
|
|
89
|
+
| Mono font | {{font-name}} | System mono (font-mono) | {{description}} | {{action}} |
|
|
90
|
+
| Body size | {{size}} | text-sm (14px) | {{description}} | {{action}} |
|
|
91
|
+
| Heading scale | {{sizes}} | text-lg to text-4xl | {{description}} | {{action}} |
|
|
92
|
+
| Weight 400 | {{usage}} | font-normal (body) | {{description}} | {{action}} |
|
|
93
|
+
| Weight 500 | {{usage}} | font-medium (labels) | {{description}} | {{action}} |
|
|
94
|
+
| Weight 600 | {{usage}} | font-semibold (titles) | {{description}} | {{action}} |
|
|
95
|
+
| Weight 700 | {{usage}} | font-bold (emphasis) | {{description}} | {{action}} |
|
|
96
|
+
| Line-height | {{value}} | Tailwind defaults | {{description}} | {{action}} |
|
|
97
|
+
| Letter-spacing | {{value}} | None (default) | {{description}} | {{action}} |
|
|
98
|
+
|
|
99
|
+
**Google Font to install**: {{font-name or "none needed"}}
|
|
100
|
+
|
|
101
|
+
### Axis 4: Icons & Graphics (Score: {{X}}/5)
|
|
102
|
+
|
|
103
|
+
| Property | Benchmark Value | Current Value | Gap | Action |
|
|
104
|
+
|----------|----------------|-------------|-----|--------|
|
|
105
|
+
| Icon library | {{library}} | lucide-react | {{description}} | {{action}} |
|
|
106
|
+
| Default icon size | {{size}} | size-4 (16px) | {{description}} | {{action}} |
|
|
107
|
+
| Icon style | {{stroke/fill}} | Stroke (Lucide) | {{description}} | {{action}} |
|
|
108
|
+
| Stroke width | {{value}} | 2 (Lucide default) | {{description}} | {{action}} |
|
|
109
|
+
| Icon color | {{approach}} | Inherits currentColor | {{description}} | {{action}} |
|
|
110
|
+
| Illustrations | {{yes/no, style}} | None (icons only) | {{description}} | {{action}} |
|
|
111
|
+
| Decorative elements | {{details}} | Minimal | {{description}} | {{action}} |
|
|
112
|
+
|
|
113
|
+
**Icon mapping table** (benchmark icon -> Lucide equivalent):
|
|
114
|
+
| Benchmark Icon | Lucide Equivalent | Notes |
|
|
115
|
+
|----------------|-------------------|-------|
|
|
116
|
+
| {{icon_name}} | {{lucide_name}} | {{notes}} |
|
|
117
|
+
|
|
118
|
+
### Axis 5: Spacing (Score: {{X}}/5)
|
|
119
|
+
|
|
120
|
+
| Context | Benchmark Value | Current Value | On 4px Grid? | Action |
|
|
121
|
+
|---------|----------------|-------------|-------------|--------|
|
|
122
|
+
| Page padding | {{value}} | p-6 (24px) | {{yes/no}} | {{action}} |
|
|
123
|
+
| Card header padding | {{value}} | px-4 pt-4 | {{yes/no}} | {{action}} |
|
|
124
|
+
| Card content padding | {{value}} | px-4 pb-4 | {{yes/no}} | {{action}} |
|
|
125
|
+
| Section gap | {{value}} | gap-4 (16px) | {{yes/no}} | {{action}} |
|
|
126
|
+
| Internal element gap | {{value}} | gap-2 (8px) | {{yes/no}} | {{action}} |
|
|
127
|
+
| Button padding | {{value}} | px-4 py-2 (h-9) | {{yes/no}} | {{action}} |
|
|
128
|
+
| Input padding | {{value}} | px-3 py-1 (h-9) | {{yes/no}} | {{action}} |
|
|
129
|
+
| Icon-text gap | {{value}} | gap-2 (8px) | {{yes/no}} | {{action}} |
|
|
130
|
+
|
|
131
|
+
**Off-grid values found**: {{list of values not on 4px grid}}
|
|
132
|
+
|
|
133
|
+
### Axis 6: Components (Score: {{X}}/5)
|
|
134
|
+
|
|
135
|
+
| Component | Benchmark Styling | Current Styling | Differences | Action |
|
|
136
|
+
|-----------|------------------|---------------|-------------|--------|
|
|
137
|
+
| Card | {{radius, shadow, border, bg}} | rounded-lg, shadow-sm, border, bg-card | {{list}} | {{action}} |
|
|
138
|
+
| Button (primary) | {{radius, height, shadow, bg}} | rounded-md, h-9, shadow-md shadow-primary/20, bg-primary | {{list}} | {{action}} |
|
|
139
|
+
| Button (secondary) | {{styling}} | bg-secondary text-secondary-foreground | {{list}} | {{action}} |
|
|
140
|
+
| Button (ghost) | {{styling}} | hover:bg-accent | {{list}} | {{action}} |
|
|
141
|
+
| Input | {{radius, height, border, shadow}} | rounded-md, h-9, border-input, shadow-sm | {{list}} | {{action}} |
|
|
142
|
+
| Badge | {{radius, padding, size}} | rounded-full, px-2 py-0.5, text-xs | {{list}} | {{action}} |
|
|
143
|
+
| Dialog | {{radius, shadow, max-width}} | rounded-lg, shadow-lg, max-w-lg | {{list}} | {{action}} |
|
|
144
|
+
| Table | {{border, padding, hover}} | border-b rows, h-10 head, hover:bg-muted/50 | {{list}} | {{action}} |
|
|
145
|
+
| Navigation | {{pattern}} | Sidebar component (16rem fixed) | {{list}} | {{action}} |
|
|
146
|
+
|
|
147
|
+
### Axis 7: Interaction (Score: {{X}}/5)
|
|
148
|
+
|
|
149
|
+
| Interaction | Benchmark Pattern | Current Pattern | Gap | Action |
|
|
150
|
+
|-------------|------------------|---------------|-----|--------|
|
|
151
|
+
| Hover (button) | {{effect}} | bg-primary/90 | {{description}} | {{action}} |
|
|
152
|
+
| Hover (card) | {{effect}} | None (default Card) | {{description}} | {{action}} |
|
|
153
|
+
| Hover (table row) | {{effect}} | bg-muted/50 | {{description}} | {{action}} |
|
|
154
|
+
| Focus ring | {{style}} | ring-ring/50 ring-[3px] | {{description}} | {{action}} |
|
|
155
|
+
| Transition duration | {{ms}} | 200ms | {{description}} | {{action}} |
|
|
156
|
+
| Transition easing | {{function}} | ease (default) | {{description}} | {{action}} |
|
|
157
|
+
| Dialog enter | {{animation}} | zoom-in-95 + fade-in-0 | {{description}} | {{action}} |
|
|
158
|
+
| Dialog exit | {{animation}} | zoom-out-95 + fade-out-0 | {{description}} | {{action}} |
|
|
159
|
+
| Page transitions | {{yes/no, type}} | None | {{description}} | {{action}} |
|
|
160
|
+
| Animation library | {{library}} | tw-animate-css only (A1) | {{description}} | {{action}} |
|
|
161
|
+
| Reduced motion | {{support}} | @media prefers-reduced-motion | {{description}} | {{action}} |
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Score Summary
|
|
166
|
+
|
|
167
|
+
| Axis | Score | Weight | Weighted |
|
|
168
|
+
|------|-------|--------|----------|
|
|
169
|
+
| 1. Layout | {{X}}/5 | 1.0 | {{X}} |
|
|
170
|
+
| 2. Color | {{X}}/5 | 1.0 | {{X}} |
|
|
171
|
+
| 3. Typography | {{X}}/5 | 1.0 | {{X}} |
|
|
172
|
+
| 4. Icons & Graphics | {{X}}/5 | 1.0 | {{X}} |
|
|
173
|
+
| 5. Spacing | {{X}}/5 | 1.0 | {{X}} |
|
|
174
|
+
| 6. Components | {{X}}/5 | 1.0 | {{X}} |
|
|
175
|
+
| 7. Interaction | {{X}}/5 | 1.0 | {{X}} |
|
|
176
|
+
| **Overall** | | | **{{X.X}}/5.0** |
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Design Token Mapping
|
|
181
|
+
|
|
182
|
+
Complete mapping from benchmark tokens to project CSS custom properties.
|
|
183
|
+
|
|
184
|
+
| Benchmark Token | Benchmark Value | Project Token | Current Value | Override Value | Notes |
|
|
185
|
+
|----------------|----------------|-------------|-------------|----------------|-------|
|
|
186
|
+
| {{token_name}} | {{value}} | {{--project-token}} | {{current_value}} | {{new_value or "KEEP"}} | {{notes}} |
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Conflicts with Existing Design Rules
|
|
191
|
+
|
|
192
|
+
| Rule ID | Rule Description | Conflict | Proposed Resolution |
|
|
193
|
+
|---------|-----------------|----------|-------------------|
|
|
194
|
+
| {{C1-C5}} | {{rule text}} | {{what the benchmark does differently}} | {{KEEP project rule / ADOPT benchmark / EXCEPTION for X}} |
|
|
195
|
+
| {{T1-T4}} | {{rule text}} | {{conflict}} | {{resolution}} |
|
|
196
|
+
| {{S1-S3}} | {{rule text}} | {{conflict}} | {{resolution}} |
|
|
197
|
+
| {{R1-R4}} | {{rule text}} | {{conflict}} | {{resolution}} |
|
|
198
|
+
| {{SH1-SH4}} | {{rule text}} | {{conflict}} | {{resolution}} |
|
|
199
|
+
| {{A1-A3}} | {{rule text}} | {{conflict}} | {{resolution}} |
|
|
200
|
+
| {{CP1-CP6}} | {{rule text}} | {{conflict}} | {{resolution}} |
|
|
201
|
+
| {{AC1-AC4}} | {{rule text}} | {{conflict}} | {{resolution}} |
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Migration Plan Summary
|
|
206
|
+
|
|
207
|
+
| Phase | Scope | Risk | Effort | Impact |
|
|
208
|
+
|-------|-------|------|--------|--------|
|
|
209
|
+
| 1. Token Swap | Override CSS custom properties in `:root` | Low | 1-2 hours | Color + typography alignment |
|
|
210
|
+
| 2. Component Override | CVA variant additions or CSS overrides | Medium | 4-8 hours | Button/Card/Input visual parity |
|
|
211
|
+
| 3. Layout Adaptation | Grid/flex restructuring if needed | High | 8-16 hours | Structural alignment |
|
|
212
|
+
| 4. Icon Migration | Icon library swap or mapping | Low-Medium | 2-4 hours | Visual consistency |
|
|
213
|
+
| 5. Interaction Polish | Transition/animation adjustments | Low | 1-2 hours | Feel alignment |
|
|
214
|
+
|
|
215
|
+
**Total estimated effort**: {{X-Y hours}}
|
|
216
|
+
**Recommended priority**: Phase {{N}} first (highest impact/lowest risk)
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## Generated Artifacts
|
|
221
|
+
|
|
222
|
+
| Artifact | Path | Description |
|
|
223
|
+
|----------|------|-------------|
|
|
224
|
+
| Token override CSS | `./output/{{slug}}-tokens.css` | CSS custom property overrides for `:root` |
|
|
225
|
+
| Component overrides | `./output/{{slug}}-components.css` | Tailwind `@layer components` overrides |
|
|
226
|
+
| Color palette | `./output/{{slug}}-palette.json` | Extracted OKLCH color palette |
|
|
227
|
+
| Typography scale | `./output/{{slug}}-typography.json` | Font family, sizes, weights mapping |
|
|
228
|
+
| Spacing map | `./output/{{slug}}-spacing.json` | Spacing values mapped to Tailwind scale |
|
|
229
|
+
| Icon mapping | `./output/{{slug}}-icons.json` | Benchmark icon -> Lucide icon mapping |
|
|
230
|
+
| Screenshot archive | `./output/screenshots/` | All captured screenshots |
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Appendix: Raw Extracted Styles
|
|
235
|
+
|
|
236
|
+
<details>
|
|
237
|
+
<summary>Click to expand raw CSS extraction</summary>
|
|
238
|
+
|
|
239
|
+
```css
|
|
240
|
+
/* Paste full extracted CSS here for reference */
|
|
241
|
+
{{raw_css}}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
</details>
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
*Generated by UI Mirror Skill on {{YYYY-MM-DD HH:mm}} KST*
|
|
249
|
+
```
|