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.
@@ -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}} | ![{{page_name}}](./screenshots/benchmark-{{slug}}.png) |
35
+
36
+ ### Current Project State
37
+ | Page | Screenshot |
38
+ |------|-----------|
39
+ | {{equivalent_page}} | ![{{equivalent_page}}](./screenshots/current-{{slug}}.png) |
40
+
41
+ ### Side-by-Side Overlay
42
+ | Element | Benchmark | Current | Delta |
43
+ |---------|-----------|-------|-------|
44
+ | {{element}} | ![](./screenshots/detail-benchmark-{{n}}.png) | ![](./screenshots/detail-current-{{n}}.png) | {{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
+ ```