@potenlab/ui 0.1.2 → 0.2.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/dist/cli.js +756 -0
- package/package.json +8 -3
- package/template/admin/README.md +36 -0
- package/template/admin/_gitignore +41 -0
- package/template/admin/components.json +23 -0
- package/template/admin/docs/changes.json +295 -0
- package/template/admin/docs/dev-plan.md +822 -0
- package/template/admin/docs/frontend-plan.md +874 -0
- package/template/admin/docs/prd.md +408 -0
- package/template/admin/docs/progress.json +777 -0
- package/template/admin/docs/test-plan.md +790 -0
- package/template/admin/docs/ui-ux-plan.md +1664 -0
- package/template/admin/eslint.config.mjs +18 -0
- package/template/admin/next.config.ts +7 -0
- package/template/admin/package.json +43 -0
- package/template/admin/postcss.config.mjs +7 -0
- package/template/admin/public/avatars/user1.svg +4 -0
- package/template/admin/public/avatars/user2.svg +4 -0
- package/template/admin/public/avatars/user3.svg +4 -0
- package/template/admin/public/avatars/user4.svg +4 -0
- package/template/admin/public/avatars/user5.svg +4 -0
- package/template/admin/public/file.svg +1 -0
- package/template/admin/public/globe.svg +1 -0
- package/template/admin/public/next.svg +1 -0
- package/template/admin/public/profile/img1.svg +7 -0
- package/template/admin/public/profile/img2.svg +7 -0
- package/template/admin/public/profile/img3.svg +7 -0
- package/template/admin/public/vercel.svg +1 -0
- package/template/admin/public/window.svg +1 -0
- package/template/admin/src/app/favicon.ico +0 -0
- package/template/admin/src/app/layout.tsx +38 -0
- package/template/admin/src/app/page.tsx +5 -0
- package/template/admin/src/app/users/[id]/page.tsx +10 -0
- package/template/admin/src/components/layouts/app-sidebar.tsx +152 -0
- package/template/admin/src/components/user-management/profile-images.tsx +69 -0
- package/template/admin/src/components/user-management/user-detail-form.tsx +143 -0
- package/template/admin/src/features/user-management/components/user-columns.tsx +101 -0
- package/template/admin/src/features/user-management/components/user-detail.tsx +79 -0
- package/template/admin/src/features/user-management/components/user-list.tsx +74 -0
- package/template/admin/src/features/user-management/types/index.ts +113 -0
- package/template/admin/src/features/user-management/utils/format.ts +2 -0
- package/template/admin/src/lib/mock-data.ts +131 -0
- package/template/admin/src/styles/globals.css +26 -0
- package/template/admin/tsconfig.json +34 -0
|
@@ -0,0 +1,777 @@
|
|
|
1
|
+
{
|
|
2
|
+
"projectName": "Admin User Management UI",
|
|
3
|
+
"generatedAt": "2026-03-04T00:00:00Z",
|
|
4
|
+
"summary": {
|
|
5
|
+
"totalPhases": 6,
|
|
6
|
+
"totalTasks": 35,
|
|
7
|
+
"lowComplexity": 18,
|
|
8
|
+
"highComplexity": 17,
|
|
9
|
+
"completedTasks": 35,
|
|
10
|
+
"remainingTasks": 0
|
|
11
|
+
},
|
|
12
|
+
"phases": [
|
|
13
|
+
{
|
|
14
|
+
"id": "phase-0",
|
|
15
|
+
"name": "Foundation",
|
|
16
|
+
"description": "Project setup, design tokens, fonts, Tailwind config, shadcn/ui initialization",
|
|
17
|
+
"tasks": [
|
|
18
|
+
{
|
|
19
|
+
"id": "P0-T1",
|
|
20
|
+
"title": "Initialize shadcn/ui",
|
|
21
|
+
"description": "Run `bunx --bun shadcn@latest init` in the template directory. Select 'New York' style, CSS variables enabled. This generates the base config and the cn() utility.",
|
|
22
|
+
"status": "completed",
|
|
23
|
+
"complexity": "low",
|
|
24
|
+
"complexityReason": "Single CLI command execution that scaffolds config files automatically; no custom code required",
|
|
25
|
+
"agent": "potenlab-small-coder",
|
|
26
|
+
"outputFiles": [
|
|
27
|
+
"components.json",
|
|
28
|
+
"src/lib/utils.ts",
|
|
29
|
+
"src/components/ui/"
|
|
30
|
+
],
|
|
31
|
+
"dependencies": [],
|
|
32
|
+
"verifySteps": [
|
|
33
|
+
"components.json exists at project root",
|
|
34
|
+
"src/lib/utils.ts exists and exports cn()",
|
|
35
|
+
"bun run build completes without errors"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "P0-T2",
|
|
40
|
+
"title": "Configure design tokens in globals.css",
|
|
41
|
+
"description": "Replace/extend the generated globals.css with the full set of Tailwind CSS 4 @theme custom properties and shadcn CSS variable overrides. Include @theme block with all custom colors (primary, primary-hover, primary-active, primary-light, background, surface, border, divider, table-header, sidebar-selected, placeholder, subtitle, muted-fg, table-cell, inactive-tab, inactive-tab-text, badge-green-bg, badge-green-text, toggle-on, toggle-off, delete-text), font family tokens (--font-pretendard, --font-inter, --font-mono), :root CSS variables for shadcn overrides (--primary, --primary-foreground, --border, --background, --card, --muted, --muted-foreground, --accent, --accent-foreground, --radius), and base body styles (background-color: #FCFCFC, default font family Pretendard).",
|
|
42
|
+
"status": "completed",
|
|
43
|
+
"complexity": "high",
|
|
44
|
+
"complexityReason": "Multi-token design system configuration requiring coordination between Tailwind CSS 4 @theme, shadcn CSS variables, and :root overrides across 20+ color tokens and font families",
|
|
45
|
+
"agent": "potenlab-high-coder",
|
|
46
|
+
"outputFiles": [
|
|
47
|
+
"src/styles/globals.css"
|
|
48
|
+
],
|
|
49
|
+
"dependencies": [],
|
|
50
|
+
"verifySteps": [
|
|
51
|
+
"Open app in browser; page background is #FCFCFC",
|
|
52
|
+
"Inspect :root in dev tools; all CSS variables are present",
|
|
53
|
+
"Tailwind utility classes like bg-primary, text-primary, bg-table-header, text-placeholder resolve to correct hex values"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "P0-T3",
|
|
58
|
+
"title": "Load fonts (Pretendard Variable + Inter)",
|
|
59
|
+
"description": "Use next/font/google to load Inter with subsets: ['latin'], variable: '--font-inter', display: 'swap'. Add Pretendard Variable via CDN <link> tag in layout <head>. Apply font CSS variables to <html> or <body> element. Set <html lang='ko'> for Korean platform.",
|
|
60
|
+
"status": "completed",
|
|
61
|
+
"complexity": "low",
|
|
62
|
+
"complexityReason": "Single file modification with standard Next.js font loading pattern and a CDN link addition",
|
|
63
|
+
"agent": "potenlab-small-coder",
|
|
64
|
+
"outputFiles": [
|
|
65
|
+
"src/app/layout.tsx"
|
|
66
|
+
],
|
|
67
|
+
"dependencies": [],
|
|
68
|
+
"verifySteps": [
|
|
69
|
+
"Inspect computed font-family in dev tools for heading text",
|
|
70
|
+
"Pretendard Variable renders for heading text",
|
|
71
|
+
"Inter renders for button/input elements",
|
|
72
|
+
"No FOUT (flash of unstyled text) -- fonts load with swap strategy"
|
|
73
|
+
]
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": "P0-T4",
|
|
77
|
+
"title": "Create shared TypeScript types",
|
|
78
|
+
"description": "Define User interface with all fields (id, nickname, grade, avatar, phone, age, gender, region, joinDate, withdrawalDate, role, exerciseStyle, gymRelocation, bench, deadlift, squat, intro, profileImages: string[], settings: { profilePublic, matchChatNotification, marketingNotification }). Define UserSettings interface. Define UserTableColumn type and USER_TABLE_COLUMNS constant. Define PaginationState and DEFAULT_PAGINATION. Define FormFieldType, FormField, and BASIC_INFO_ROW_1/2/3 constants. Define SidebarNavItem and SidebarSubItem in shared types.",
|
|
79
|
+
"status": "completed",
|
|
80
|
+
"complexity": "low",
|
|
81
|
+
"complexityReason": "Type definition files with interfaces and constants; no logic or multi-file coordination required",
|
|
82
|
+
"agent": "potenlab-small-coder",
|
|
83
|
+
"outputFiles": [
|
|
84
|
+
"src/features/user-management/types/index.ts",
|
|
85
|
+
"src/types/index.ts"
|
|
86
|
+
],
|
|
87
|
+
"dependencies": [],
|
|
88
|
+
"verifySteps": [
|
|
89
|
+
"Import User type in a test file; TypeScript compiles without errors",
|
|
90
|
+
"All fields from the PRD mock data structure are represented"
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": "P0-T5",
|
|
95
|
+
"title": "Create mock data",
|
|
96
|
+
"description": "Export mockUsers: User[] with 5 user objects following the PRD sample data pattern (nickname 'NicknameHere', grade 'Mania', phone '010-1234-1234', age 'Born 1999', gender 'Male', region 'Gangnam-gu', joinDate 'Nov 1, 2022', withdrawalDate 'Nov 1, 2022', etc.). Each user gets a unique id ('1' through '5'). Export totalUserCount = 100000. Profile images use placeholder paths: /profile/img1.jpg through /profile/img3.jpg. Avatar paths: /avatars/user1.jpg through /avatars/user5.jpg.",
|
|
97
|
+
"status": "completed",
|
|
98
|
+
"complexity": "low",
|
|
99
|
+
"complexityReason": "Single file with hardcoded mock data arrays; straightforward data creation with no logic",
|
|
100
|
+
"agent": "potenlab-small-coder",
|
|
101
|
+
"outputFiles": [
|
|
102
|
+
"src/lib/mock-data.ts"
|
|
103
|
+
],
|
|
104
|
+
"dependencies": [],
|
|
105
|
+
"verifySteps": [
|
|
106
|
+
"Import mockUsers and totalUserCount in a test; values are correct",
|
|
107
|
+
"mockUsers.length === 5",
|
|
108
|
+
"Each user has all required fields populated"
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"id": "P0-T6",
|
|
113
|
+
"title": "Create utility functions",
|
|
114
|
+
"description": "Create formatNumber(n: number): string that formats numbers with comma separators (e.g., 100000 -> '100,000') using n.toLocaleString('en-US'). Add any other string/date format helpers needed for display.",
|
|
115
|
+
"status": "completed",
|
|
116
|
+
"complexity": "low",
|
|
117
|
+
"complexityReason": "Single utility file with one simple formatting function; no dependencies or complex logic",
|
|
118
|
+
"agent": "potenlab-small-coder",
|
|
119
|
+
"outputFiles": [
|
|
120
|
+
"src/features/user-management/utils/format.ts"
|
|
121
|
+
],
|
|
122
|
+
"dependencies": [],
|
|
123
|
+
"verifySteps": [
|
|
124
|
+
"formatNumber(100000) returns '100,000'",
|
|
125
|
+
"formatNumber(0) returns '0'"
|
|
126
|
+
]
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "P0-T7",
|
|
130
|
+
"title": "Add placeholder images to public directory",
|
|
131
|
+
"description": "Create placeholder images or use placeholder service URLs in mock data. Avatar images: 44x44px source (renders at 22x22). Profile images: 232x232px source (renders at 116x116). Alternative: use placeholder URLs like https://placehold.co/44x44/EEF2F6/5A5E6A?text=U1 in mock data.",
|
|
132
|
+
"status": "completed",
|
|
133
|
+
"complexity": "low",
|
|
134
|
+
"complexityReason": "Simple file creation or URL placeholder setup; no code logic involved",
|
|
135
|
+
"agent": "potenlab-small-coder",
|
|
136
|
+
"outputFiles": [
|
|
137
|
+
"public/avatars/user1.jpg",
|
|
138
|
+
"public/avatars/user2.jpg",
|
|
139
|
+
"public/avatars/user3.jpg",
|
|
140
|
+
"public/avatars/user4.jpg",
|
|
141
|
+
"public/avatars/user5.jpg",
|
|
142
|
+
"public/profile/img1.jpg",
|
|
143
|
+
"public/profile/img2.jpg",
|
|
144
|
+
"public/profile/img3.jpg"
|
|
145
|
+
],
|
|
146
|
+
"dependencies": [],
|
|
147
|
+
"verifySteps": [
|
|
148
|
+
"Images load without 404 errors when referenced in components",
|
|
149
|
+
"Avatar images render as small circles; profile images render at 116x116 with 8px radius"
|
|
150
|
+
]
|
|
151
|
+
}
|
|
152
|
+
]
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"id": "phase-1",
|
|
156
|
+
"name": "Shared UI Components",
|
|
157
|
+
"description": "Install and customize all shadcn/ui components under src/components/ui/ and build reusable common components",
|
|
158
|
+
"tasks": [
|
|
159
|
+
{
|
|
160
|
+
"id": "P1-T1",
|
|
161
|
+
"title": "Install shadcn/ui components (batch)",
|
|
162
|
+
"description": "Run `bunx --bun shadcn@latest add card button table input select badge avatar switch tabs separator accordion sidebar label tooltip` to install all 14 shadcn/ui components into src/components/ui/.",
|
|
163
|
+
"status": "completed",
|
|
164
|
+
"complexity": "low",
|
|
165
|
+
"complexityReason": "Single CLI batch command to install pre-built components; no custom code required",
|
|
166
|
+
"agent": "potenlab-small-coder",
|
|
167
|
+
"outputFiles": [
|
|
168
|
+
"src/components/ui/button.tsx",
|
|
169
|
+
"src/components/ui/card.tsx",
|
|
170
|
+
"src/components/ui/table.tsx",
|
|
171
|
+
"src/components/ui/input.tsx",
|
|
172
|
+
"src/components/ui/select.tsx",
|
|
173
|
+
"src/components/ui/badge.tsx",
|
|
174
|
+
"src/components/ui/avatar.tsx",
|
|
175
|
+
"src/components/ui/switch.tsx",
|
|
176
|
+
"src/components/ui/tabs.tsx",
|
|
177
|
+
"src/components/ui/separator.tsx",
|
|
178
|
+
"src/components/ui/accordion.tsx",
|
|
179
|
+
"src/components/ui/sidebar.tsx",
|
|
180
|
+
"src/components/ui/label.tsx",
|
|
181
|
+
"src/components/ui/tooltip.tsx"
|
|
182
|
+
],
|
|
183
|
+
"dependencies": [],
|
|
184
|
+
"verifySteps": [
|
|
185
|
+
"All 14 .tsx files exist in src/components/ui/",
|
|
186
|
+
"bun run build completes without errors",
|
|
187
|
+
"Each component can be imported without TypeScript errors"
|
|
188
|
+
]
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"id": "P1-T2",
|
|
192
|
+
"title": "Customize Button component with design variants",
|
|
193
|
+
"description": "Add custom variants to Button component's cva config: primary (bg-primary, hover, active, scale, disabled), secondary (bg-sidebar-selected), pagination (bg-primary-light, 40x40px), ghost (bg-transparent, text-delete-text, underline on hover), outline (border, bg-transparent). Focus ring on all variants. Include size variants: default (h-10), secondary (h-12), pagination (h-10 w-10), ghost (h-auto p-0).",
|
|
194
|
+
"status": "completed",
|
|
195
|
+
"complexity": "high",
|
|
196
|
+
"complexityReason": "Multi-variant component customization with 5 variant styles, 4 size presets, hover/active/focus/disabled states, and cva configuration",
|
|
197
|
+
"agent": "potenlab-high-coder",
|
|
198
|
+
"outputFiles": [
|
|
199
|
+
"src/components/ui/button.tsx"
|
|
200
|
+
],
|
|
201
|
+
"dependencies": [],
|
|
202
|
+
"verifySteps": [
|
|
203
|
+
"Render each variant in a test page; colors match design tokens",
|
|
204
|
+
"Hover state changes background on primary buttons to #3F7A79",
|
|
205
|
+
"Active state applies scale(0.98) on primary buttons",
|
|
206
|
+
"Disabled state shows 50% opacity and cursor: not-allowed",
|
|
207
|
+
"Focus ring appears on Tab focus"
|
|
208
|
+
]
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"id": "P1-T3",
|
|
212
|
+
"title": "Customize Table component",
|
|
213
|
+
"description": "Override default shadcn/ui table styles: Table wrapper (border border-border bg-white, no border-radius), TableHeader (bg-table-header), TableHead (h-14, 14px SemiBold, text-table-cell, px-4), TableRow (h-[60px], border-b, hover:bg-table-header, cursor-pointer, transition 150ms), TableCell (px-4, 14px, text-table-cell).",
|
|
214
|
+
"status": "completed",
|
|
215
|
+
"complexity": "high",
|
|
216
|
+
"complexityReason": "Multi-sub-component customization (Table, TableHeader, TableHead, TableRow, TableCell) with specific sizing, colors, hover states, and transitions",
|
|
217
|
+
"agent": "potenlab-high-coder",
|
|
218
|
+
"outputFiles": [
|
|
219
|
+
"src/components/ui/table.tsx"
|
|
220
|
+
],
|
|
221
|
+
"dependencies": [],
|
|
222
|
+
"verifySteps": [
|
|
223
|
+
"Render a test table with 2 columns and 2 rows",
|
|
224
|
+
"Table header background is #F9FAFC",
|
|
225
|
+
"Row hover changes background",
|
|
226
|
+
"Row height is 60px; header row height is 56px",
|
|
227
|
+
"Cell text color is #3B3F4A"
|
|
228
|
+
]
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"id": "P1-T4",
|
|
232
|
+
"title": "Customize Input component",
|
|
233
|
+
"description": "Override default input styles: base (border, rounded-md, font-inter 18px, placeholder:text-placeholder, bg-white, px-4), hover (border-[#CBD5E0]), focus (border-primary, ring-2 ring-primary/20, transition 150ms), disabled (bg-table-header, text-placeholder, cursor-not-allowed). Height set at call site: dashboard search h-12 (48px), detail form h-[52px] (52px).",
|
|
234
|
+
"status": "completed",
|
|
235
|
+
"complexity": "low",
|
|
236
|
+
"complexityReason": "Single component style override with standard input states (hover, focus, disabled); no variant system needed",
|
|
237
|
+
"agent": "potenlab-small-coder",
|
|
238
|
+
"outputFiles": [
|
|
239
|
+
"src/components/ui/input.tsx"
|
|
240
|
+
],
|
|
241
|
+
"dependencies": [],
|
|
242
|
+
"verifySteps": [
|
|
243
|
+
"Render input with placeholder 'Enter search keyword'; placeholder text is #A0AEC0",
|
|
244
|
+
"Focus the input; border turns #509594 with subtle ring shadow",
|
|
245
|
+
"Hover border changes to #CBD5E0"
|
|
246
|
+
]
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"id": "P1-T5",
|
|
250
|
+
"title": "Customize Select component",
|
|
251
|
+
"description": "Override SelectTrigger (h-[52px], border, rounded-md, px-4 pr-12, font-inter 18px, text-[#2D3748], hover/focus states), SelectContent (bg-white, border, shadow-md), SelectItem (hover:bg-sidebar-selected, px-4 py-2, 18px). Chevron rotates 180deg on open (300ms ease-in-out). Chevron color: default #A0AEC0, on focus/open #509594.",
|
|
252
|
+
"status": "completed",
|
|
253
|
+
"complexity": "high",
|
|
254
|
+
"complexityReason": "Multi-sub-component customization (SelectTrigger, SelectContent, SelectItem) with animated chevron rotation and dynamic color changes on open/focus",
|
|
255
|
+
"agent": "potenlab-high-coder",
|
|
256
|
+
"outputFiles": [
|
|
257
|
+
"src/components/ui/select.tsx"
|
|
258
|
+
],
|
|
259
|
+
"dependencies": [],
|
|
260
|
+
"verifySteps": [
|
|
261
|
+
"Render select with 3 options; trigger shows chevron down icon",
|
|
262
|
+
"Click opens dropdown with white bg and shadow",
|
|
263
|
+
"Hover on item shows #EEF2F6 background",
|
|
264
|
+
"Focus/open state border is primary color"
|
|
265
|
+
]
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"id": "P1-T6",
|
|
269
|
+
"title": "Customize Badge component",
|
|
270
|
+
"description": "Add a 'green' variant: bg-badge-green-bg text-badge-green-text font-inter text-[18px] font-bold px-3 py-1 rounded-full. Used for the count badge on the dashboard header ('100,000').",
|
|
271
|
+
"status": "completed",
|
|
272
|
+
"complexity": "low",
|
|
273
|
+
"complexityReason": "Single variant addition to existing component; minimal style configuration with no complex logic",
|
|
274
|
+
"agent": "potenlab-small-coder",
|
|
275
|
+
"outputFiles": [
|
|
276
|
+
"src/components/ui/badge.tsx"
|
|
277
|
+
],
|
|
278
|
+
"dependencies": [],
|
|
279
|
+
"verifySteps": [
|
|
280
|
+
"Render <Badge variant='green'>100,000</Badge>",
|
|
281
|
+
"Background is #C6F6D5, text is #22543D, pill shape (fully rounded)"
|
|
282
|
+
]
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"id": "P1-T7",
|
|
286
|
+
"title": "Customize Avatar component",
|
|
287
|
+
"description": "Table avatar: w-[22px] h-[22px] rounded-full. AvatarFallback: first letter of nickname, bg-sidebar-selected text-muted-fg text-[10px]. Ensure AvatarImage has alt text for accessibility.",
|
|
288
|
+
"status": "completed",
|
|
289
|
+
"complexity": "low",
|
|
290
|
+
"complexityReason": "Simple style overrides on a single component with straightforward fallback logic",
|
|
291
|
+
"agent": "potenlab-small-coder",
|
|
292
|
+
"outputFiles": [
|
|
293
|
+
"src/components/ui/avatar.tsx"
|
|
294
|
+
],
|
|
295
|
+
"dependencies": [],
|
|
296
|
+
"verifySteps": [
|
|
297
|
+
"Render avatar with an image src; displays 22px circle",
|
|
298
|
+
"Render avatar without image; shows fallback letter in gray circle",
|
|
299
|
+
"Inspect: alt attribute present on <img>"
|
|
300
|
+
]
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"id": "P1-T8",
|
|
304
|
+
"title": "Customize Switch component",
|
|
305
|
+
"description": "Track size: w-[44px] h-[24px] rounded-full. OFF state: track bg-toggle-off, thumb white positioned left. ON state: track bg-toggle-on (#3B82F6), thumb white positioned right. Hover OFF: track #B0BEC5; hover ON: track #2563EB. Thumb size: 20px with 2px inset. Transition: 200ms ease-in-out for thumb translation and track color. Disabled: 50% opacity. aria-checked managed by Radix Switch.",
|
|
306
|
+
"status": "completed",
|
|
307
|
+
"complexity": "high",
|
|
308
|
+
"complexityReason": "Complex state-dependent styling with ON/OFF/hover states, animated thumb translation, track color transitions, and precise sizing constraints",
|
|
309
|
+
"agent": "potenlab-high-coder",
|
|
310
|
+
"outputFiles": [
|
|
311
|
+
"src/components/ui/switch.tsx"
|
|
312
|
+
],
|
|
313
|
+
"dependencies": [],
|
|
314
|
+
"verifySteps": [
|
|
315
|
+
"Render switch in OFF state; track is gray, thumb is left",
|
|
316
|
+
"Click switch; animates to ON -- track turns blue, thumb slides right",
|
|
317
|
+
"Keyboard: Space toggles state",
|
|
318
|
+
"Inspect: aria-checked toggles between true/false"
|
|
319
|
+
]
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"id": "P1-T9",
|
|
323
|
+
"title": "Customize Tabs component",
|
|
324
|
+
"description": "TabsList: gap-2 bg-transparent p-0. TabsTrigger active: data-[state=active]:bg-primary data-[state=active]:text-white font-pretendard font-semibold h-[52px] px-4 rounded-md. TabsTrigger inactive: bg-inactive-tab text-inactive-tab-text font-pretendard font-medium h-[52px] px-4 rounded-md hover:bg-border. Transition: 200ms ease-in-out on background-color and color.",
|
|
325
|
+
"status": "completed",
|
|
326
|
+
"complexity": "low",
|
|
327
|
+
"complexityReason": "Style overrides on TabsList and TabsTrigger with active/inactive states handled by Radix data attributes",
|
|
328
|
+
"agent": "potenlab-small-coder",
|
|
329
|
+
"outputFiles": [
|
|
330
|
+
"src/components/ui/tabs.tsx"
|
|
331
|
+
],
|
|
332
|
+
"dependencies": [],
|
|
333
|
+
"verifySteps": [
|
|
334
|
+
"Render 3 tabs: 'All' (active), 'Tab', 'Tab'",
|
|
335
|
+
"Active tab is teal with white text",
|
|
336
|
+
"Inactive tabs are light gray with dark text",
|
|
337
|
+
"Click inactive tab; it becomes active (color swap)",
|
|
338
|
+
"Keyboard: Arrow Left/Right switches tabs"
|
|
339
|
+
]
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
"id": "P1-T10",
|
|
343
|
+
"title": "Customize Separator component",
|
|
344
|
+
"description": "Default color: bg-divider (#EFF1F4). Height: 1px (horizontal). Full width of parent container.",
|
|
345
|
+
"status": "completed",
|
|
346
|
+
"complexity": "low",
|
|
347
|
+
"complexityReason": "Minimal single-property style override on a simple component",
|
|
348
|
+
"agent": "potenlab-small-coder",
|
|
349
|
+
"outputFiles": [
|
|
350
|
+
"src/components/ui/separator.tsx"
|
|
351
|
+
],
|
|
352
|
+
"dependencies": [],
|
|
353
|
+
"verifySteps": [
|
|
354
|
+
"Render separator; visible as a thin light gray line",
|
|
355
|
+
"Inspect: background color is #EFF1F4"
|
|
356
|
+
]
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
"id": "P1-T11",
|
|
360
|
+
"title": "Customize Accordion component",
|
|
361
|
+
"description": "Trigger: chevron icon rotates 180deg on expand (300ms ease-in-out). Content: animated height expand/collapse (300ms ease-in-out). Trigger text: font-inter text-[16px] text-muted-fg. aria-expanded on trigger handled by Radix Accordion.",
|
|
362
|
+
"status": "completed",
|
|
363
|
+
"complexity": "low",
|
|
364
|
+
"complexityReason": "Style overrides with animation timing; Radix handles the expand/collapse logic and ARIA attributes",
|
|
365
|
+
"agent": "potenlab-small-coder",
|
|
366
|
+
"outputFiles": [
|
|
367
|
+
"src/components/ui/accordion.tsx"
|
|
368
|
+
],
|
|
369
|
+
"dependencies": [],
|
|
370
|
+
"verifySteps": [
|
|
371
|
+
"Render accordion with one section; click trigger, content expands with animation",
|
|
372
|
+
"Chevron rotates on expand",
|
|
373
|
+
"Keyboard: Enter/Space toggles"
|
|
374
|
+
]
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"id": "P1-T12",
|
|
378
|
+
"title": "Customize Label component",
|
|
379
|
+
"description": "Style: font-pretendard text-[20px] font-semibold text-[#101010]. Margin bottom: mb-2 (8px below label, above input). Uses htmlFor attribute to associate with input id.",
|
|
380
|
+
"status": "completed",
|
|
381
|
+
"complexity": "low",
|
|
382
|
+
"complexityReason": "Simple style override on a single component with no complex logic",
|
|
383
|
+
"agent": "potenlab-small-coder",
|
|
384
|
+
"outputFiles": [
|
|
385
|
+
"src/components/ui/label.tsx"
|
|
386
|
+
],
|
|
387
|
+
"dependencies": [],
|
|
388
|
+
"verifySteps": [
|
|
389
|
+
"Render label above an input; label text is 20px SemiBold, nearly black",
|
|
390
|
+
"Click label; associated input receives focus (via htmlFor/id pairing)"
|
|
391
|
+
]
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
"id": "P1-T13",
|
|
395
|
+
"title": "Build PageHeader common component",
|
|
396
|
+
"description": "Props: title (string), subtitle (string), badgeCount? (number), actionLabel (string), actionIcon? (LucideIcon), onAction? (() => void). Layout: Flex row. Left side: title (32px SemiBold Pretendard, black) + Badge (only if badgeCount provided, formatted with formatNumber) on same line. Subtitle below (18px Medium Pretendard, #9DA0A8). Right side: action Button (primary variant) with optional icon. Below the header content, render a <Separator /> with vertical margin.",
|
|
397
|
+
"status": "completed",
|
|
398
|
+
"complexity": "high",
|
|
399
|
+
"complexityReason": "Layout composition combining Badge, Button, Separator components with conditional rendering, flex layout, and multiple typography styles",
|
|
400
|
+
"agent": "potenlab-high-coder",
|
|
401
|
+
"outputFiles": [
|
|
402
|
+
"src/components/common/page-header.tsx"
|
|
403
|
+
],
|
|
404
|
+
"dependencies": [],
|
|
405
|
+
"verifySteps": [
|
|
406
|
+
"Render <PageHeader title='User Management' subtitle='User list management page' badgeCount={100000} actionLabel='Write' />",
|
|
407
|
+
"Title 'User Management' in 32px SemiBold",
|
|
408
|
+
"Badge '100,000' in green pill beside title",
|
|
409
|
+
"Subtitle below in gray",
|
|
410
|
+
"'Write' button top-right in teal",
|
|
411
|
+
"Separator line beneath"
|
|
412
|
+
]
|
|
413
|
+
}
|
|
414
|
+
]
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
"id": "phase-2",
|
|
418
|
+
"name": "Layout & Navigation",
|
|
419
|
+
"description": "Sidebar, root layout, content area structure",
|
|
420
|
+
"tasks": [
|
|
421
|
+
{
|
|
422
|
+
"id": "P2-T1",
|
|
423
|
+
"title": "Build AppSidebar component",
|
|
424
|
+
"description": "Fixed position left, 300px width, full viewport height, white background, right border #E2E8F0. Header section: 'ADMIN' title (Pretendard 24px SemiBold, letter-spacing 0.05em), admin email subtitle (14px Regular #9DA0A8), 32px bottom spacing. Navigation section using Accordion: Home item (Home icon, links to /), User accordion (Users icon, 'User Management' sub-item), Match accordion (Gamepad2 icon, 'Match Management' sub-item), Admin accordion (Shield icon, 'Notice Management', 'Report Management', 'Terms Management' sub-items). Menu items: 48px height, Inter 16px Regular #5A5E6A, 20px icons. Hover: #F9FAFC bg. Sub-items: 40px indent, 44px height. Active sub-item: #EEF2F6 bg, #509594 text, dot indicator. Active state from usePathname(). Footer: Separator + Logout button (LogOut icon + text, hover turns red).",
|
|
425
|
+
"status": "completed",
|
|
426
|
+
"complexity": "high",
|
|
427
|
+
"complexityReason": "Multi-section layout composition with accordion navigation, active route detection via usePathname(), multiple icon imports, hover/active states, and keyboard navigation requirements",
|
|
428
|
+
"agent": "potenlab-high-coder",
|
|
429
|
+
"outputFiles": [
|
|
430
|
+
"src/components/layouts/app-sidebar.tsx"
|
|
431
|
+
],
|
|
432
|
+
"dependencies": [],
|
|
433
|
+
"verifySteps": [
|
|
434
|
+
"Sidebar renders at 300px width on left side of viewport",
|
|
435
|
+
"'ADMIN' title visible with correct font",
|
|
436
|
+
"Click 'User' accordion; 'User Management' sub-item appears with animation",
|
|
437
|
+
"'User Management' has active highlight when on / route",
|
|
438
|
+
"Logout button visible at bottom with separator above",
|
|
439
|
+
"Hover logout; text turns red",
|
|
440
|
+
"Keyboard: Tab through sidebar items; focus visible on each"
|
|
441
|
+
]
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
"id": "P2-T2",
|
|
445
|
+
"title": "Build ContentLayout wrapper component",
|
|
446
|
+
"description": "Wraps page content with correct offset: ml-[324px] pt-5 pr-8 pb-8. Content area offset: 300px sidebar + 24px gap = 324px from left. Top padding: 20px. Receives children as prop. Background: inherits from body (#FCFCFC).",
|
|
447
|
+
"status": "completed",
|
|
448
|
+
"complexity": "low",
|
|
449
|
+
"complexityReason": "Simple wrapper component with fixed CSS margins/padding and children pass-through; no state or logic",
|
|
450
|
+
"agent": "potenlab-small-coder",
|
|
451
|
+
"outputFiles": [
|
|
452
|
+
"src/components/layouts/content-layout.tsx"
|
|
453
|
+
],
|
|
454
|
+
"dependencies": [],
|
|
455
|
+
"verifySteps": [
|
|
456
|
+
"Wrap test content with <ContentLayout>; content appears to the right of the sidebar",
|
|
457
|
+
"Inspect: margin-left is 324px, padding-top is 20px"
|
|
458
|
+
]
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
"id": "P2-T3",
|
|
462
|
+
"title": "Build root layout (app/layout.tsx)",
|
|
463
|
+
"description": "<html lang='ko'> with font CSS variables applied. Loads Inter via next/font/google with variable: '--font-inter'. Loads Pretendard Variable via CDN link in <head>. Renders <AppSidebar /> persistent on all pages. Renders <ContentLayout>{children}</ContentLayout> as main content area. Skip link: <a href='#main-content'> as first element. <main id='main-content'> wraps content area for skip link target. Imports globals.css.",
|
|
464
|
+
"status": "completed",
|
|
465
|
+
"complexity": "high",
|
|
466
|
+
"complexityReason": "Layout composition integrating AppSidebar, ContentLayout, font loading, skip link accessibility, and persistent navigation across all routes",
|
|
467
|
+
"agent": "potenlab-high-coder",
|
|
468
|
+
"outputFiles": [
|
|
469
|
+
"src/app/layout.tsx"
|
|
470
|
+
],
|
|
471
|
+
"dependencies": [],
|
|
472
|
+
"verifySteps": [
|
|
473
|
+
"Open app; sidebar visible on left, content on right",
|
|
474
|
+
"Navigate between pages; sidebar persists",
|
|
475
|
+
"Tab key first focuses 'Skip to main content' link (visible on focus)",
|
|
476
|
+
"Press Enter on skip link; focus moves to main content area",
|
|
477
|
+
"Inspect <html>: lang='ko' attribute present",
|
|
478
|
+
"Fonts loaded: Pretendard and Inter visible in Network tab"
|
|
479
|
+
]
|
|
480
|
+
}
|
|
481
|
+
]
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
"id": "phase-3",
|
|
485
|
+
"name": "Features -- User Management List Page (Dashboard)",
|
|
486
|
+
"description": "Dashboard page components: tabs, search, pagination, user table, and page assembly",
|
|
487
|
+
"tasks": [
|
|
488
|
+
{
|
|
489
|
+
"id": "P3-T1",
|
|
490
|
+
"title": "Build TabNavigation component",
|
|
491
|
+
"description": "Uses shadcn/ui Tabs, TabsList, TabsTrigger. 3 tabs: 'All' (default active), 'Tab', 'Tab'. Active tab: teal bg, white text. Inactive: light gray bg, dark text. defaultValue='all'. Tab switching updates local state (UI only, no filtering). Arrow Left/Right keyboard navigation between tabs. Props: defaultValue?, onTabChange?.",
|
|
492
|
+
"status": "completed",
|
|
493
|
+
"complexity": "low",
|
|
494
|
+
"complexityReason": "Simple component composing existing Tabs primitives with static tab data and no complex state management",
|
|
495
|
+
"agent": "potenlab-small-coder",
|
|
496
|
+
"outputFiles": [
|
|
497
|
+
"src/components/user-management/tab-navigation.tsx"
|
|
498
|
+
],
|
|
499
|
+
"dependencies": [],
|
|
500
|
+
"verifySteps": [
|
|
501
|
+
"Render component; 'All' tab is active (teal)",
|
|
502
|
+
"Click 'Tab'; it becomes active, 'All' becomes inactive",
|
|
503
|
+
"Keyboard: Arrow Right moves focus and activates next tab"
|
|
504
|
+
]
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
"id": "P3-T2",
|
|
508
|
+
"title": "Build SearchBar component",
|
|
509
|
+
"description": "Full-width Input component. Height: 48px (h-12), border radius 6px. Placeholder: 'Enter search keyword'. Placeholder color: #A0AEC0. Accepts text input (state managed locally, no actual search). Focus highlights border to primary. Props: value, onChange, placeholder?.",
|
|
510
|
+
"status": "completed",
|
|
511
|
+
"complexity": "low",
|
|
512
|
+
"complexityReason": "Simple wrapper around Input component with fixed styling and controlled input props",
|
|
513
|
+
"agent": "potenlab-small-coder",
|
|
514
|
+
"outputFiles": [
|
|
515
|
+
"src/components/user-management/search-bar.tsx"
|
|
516
|
+
],
|
|
517
|
+
"dependencies": [],
|
|
518
|
+
"verifySteps": [
|
|
519
|
+
"Render search bar; full width with placeholder text in gray",
|
|
520
|
+
"Click/focus; border changes to teal",
|
|
521
|
+
"Type text; placeholder disappears, text visible"
|
|
522
|
+
]
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
"id": "P3-T3",
|
|
526
|
+
"title": "Build PaginationControls component",
|
|
527
|
+
"description": "Flex row with justify-between. Left group: 4 pagination buttons (<<, <, >, >> using ChevronsLeft, ChevronLeft, ChevronRight, ChevronsRight Lucide icons), pagination variant (40x40px, #B9D5D4 bg), each with aria-label. Page indicator between < and >: '1 / 1' (current page 20px Bold, separator 16px Regular #5A5E6A). Right group: page jump Input (100px width, 48px height, placeholder 'Page'), 'Go' button (secondary variant, 48px), items per page Select (96px width, 48px, default '10 items', options: 10/20/50). State: currentPage, itemsPerPage managed locally. aria-live='polite' on page indicator.",
|
|
528
|
+
"status": "completed",
|
|
529
|
+
"complexity": "high",
|
|
530
|
+
"complexityReason": "Multi-component composition with Button, Input, Select, multiple icon imports, flex layout with two groups, local state management, and ARIA live region",
|
|
531
|
+
"agent": "potenlab-high-coder",
|
|
532
|
+
"outputFiles": [
|
|
533
|
+
"src/components/user-management/pagination-controls.tsx"
|
|
534
|
+
],
|
|
535
|
+
"dependencies": [],
|
|
536
|
+
"verifySteps": [
|
|
537
|
+
"Render component; all 4 nav buttons visible in #B9D5D4",
|
|
538
|
+
"'1 / 1' displayed between < and >",
|
|
539
|
+
"Page jump input visible with 'Page' placeholder",
|
|
540
|
+
"'Go' button renders in gray",
|
|
541
|
+
"Items per page dropdown shows '10 items'",
|
|
542
|
+
"Click dropdown; opens with 3 options",
|
|
543
|
+
"All icon buttons have aria-label (inspect DOM)"
|
|
544
|
+
]
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
"id": "P3-T4",
|
|
548
|
+
"title": "Build UserTable component",
|
|
549
|
+
"description": "Uses shadcn/ui Table, TableHeader, TableHead, TableBody, TableRow, TableCell. 10 columns: Nickname (flex-1), Grade (flex-1), Avatar (80px fixed, centered), Phone Number (flex-1), Age (flex-1), Gender (flex-1), Region (flex-1), Join Date (flex-1, sort icon), Withdrawal Date (flex-1, sort icon), Delete (57px fixed). Renders 5 rows from mockUsers. Avatar column: Avatar component (22px circular). Delete column: ghost button with teal text 'Delete', underline on hover. Sort icons on Join Date/Withdrawal Date (visual only). Row onClick: navigates to /users/[id] via useRouter().push(). Delete onClick: event.stopPropagation(). Row hover: #F9FAFC bg, cursor pointer. Uses React.memo for row rendering. Props: users: User[].",
|
|
550
|
+
"status": "completed",
|
|
551
|
+
"complexity": "high",
|
|
552
|
+
"complexityReason": "Complex data table with 10 columns, row click navigation via useRouter, stopPropagation on delete, Avatar integration, sort icons, React.memo optimization, and multiple sub-components",
|
|
553
|
+
"agent": "potenlab-high-coder",
|
|
554
|
+
"outputFiles": [
|
|
555
|
+
"src/components/user-management/user-table.tsx"
|
|
556
|
+
],
|
|
557
|
+
"dependencies": [],
|
|
558
|
+
"verifySteps": [
|
|
559
|
+
"Table renders with 10 column headers and 5 data rows",
|
|
560
|
+
"Avatar column shows small circular image (or fallback initial)",
|
|
561
|
+
"Hover over row; background changes, cursor is pointer",
|
|
562
|
+
"Click row; navigates to /users/1 (check URL bar)",
|
|
563
|
+
"Click 'Delete' on a row; does NOT navigate (stopPropagation works)",
|
|
564
|
+
"Sort icons visible on Join Date and Withdrawal Date columns",
|
|
565
|
+
"Table container has border but no rounded corners"
|
|
566
|
+
]
|
|
567
|
+
},
|
|
568
|
+
{
|
|
569
|
+
"id": "P3-T5",
|
|
570
|
+
"title": "Assemble Dashboard page (app/page.tsx)",
|
|
571
|
+
"description": "Uses Card as main container (white, 8px radius, #E2E8F0 border, 32px padding). Composes inside Card top to bottom: 1) PageHeader with title 'User Management', subtitle 'User list management page', badgeCount totalUserCount (formatted to '100,000'), actionLabel 'Write', actionIcon Pencil. 2) TabNavigation (3 tabs, 'All' active). 3) SearchBar (full-width input). 4) PaginationControls. 5) UserTable (5 rows of mock data). Manages local state: searchValue, activeTab, currentPage, itemsPerPage. Imports mockUsers and totalUserCount from lib/mock-data.ts. Route: / (app/page.tsx). Client component ('use client').",
|
|
572
|
+
"status": "completed",
|
|
573
|
+
"complexity": "high",
|
|
574
|
+
"complexityReason": "Page assembly composing 5+ child components with local state management for search/tabs/pagination, data imports, and proper prop passing across all composed elements",
|
|
575
|
+
"agent": "potenlab-high-coder",
|
|
576
|
+
"outputFiles": [
|
|
577
|
+
"src/app/page.tsx"
|
|
578
|
+
],
|
|
579
|
+
"dependencies": [],
|
|
580
|
+
"verifySteps": [
|
|
581
|
+
"Open / in browser; full dashboard visible inside white card",
|
|
582
|
+
"Header shows 'User Management' + green badge '100,000' + subtitle + 'Write' button",
|
|
583
|
+
"Separator line below header",
|
|
584
|
+
"Tabs render below separator",
|
|
585
|
+
"Search bar below tabs",
|
|
586
|
+
"Pagination controls below search",
|
|
587
|
+
"Data table with 5 rows below pagination",
|
|
588
|
+
"All spacing looks correct against Figma wireframe",
|
|
589
|
+
"'Write' button click: no-op (UI only)"
|
|
590
|
+
]
|
|
591
|
+
}
|
|
592
|
+
]
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
"id": "phase-4",
|
|
596
|
+
"name": "Features -- User Detail Page",
|
|
597
|
+
"description": "User detail page components: profile images, detail form, and page assembly",
|
|
598
|
+
"tasks": [
|
|
599
|
+
{
|
|
600
|
+
"id": "P4-T1",
|
|
601
|
+
"title": "Build ProfileImages component",
|
|
602
|
+
"description": "Props: images: string[] (array of 3 image URLs). Renders 3 images in horizontal flex row with 16px gap. Each image: 116x116px, 8px border-radius, object-cover. Uses <img> or Next.js <Image> with appropriate alt text ('Profile photo 1', 'Profile photo 2', 'Profile photo 3'). Fallback: if image fails to load, show gray placeholder block (116x116, #EEF2F6 bg).",
|
|
603
|
+
"status": "completed",
|
|
604
|
+
"complexity": "low",
|
|
605
|
+
"complexityReason": "Simple presentational component rendering a flex row of images with basic error fallback; few props and minimal logic",
|
|
606
|
+
"agent": "potenlab-small-coder",
|
|
607
|
+
"outputFiles": [
|
|
608
|
+
"src/components/user-management/profile-images.tsx"
|
|
609
|
+
],
|
|
610
|
+
"dependencies": [],
|
|
611
|
+
"verifySteps": [
|
|
612
|
+
"Render with 3 placeholder images; 3 boxes appear horizontally",
|
|
613
|
+
"Each image is 116x116 with rounded corners",
|
|
614
|
+
"Alt text present on each <img> tag"
|
|
615
|
+
]
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
"id": "P4-T2",
|
|
619
|
+
"title": "Build UserDetailForm component",
|
|
620
|
+
"description": "Props: user: User. Basic Info section: section label 'Basic Info' (Pretendard 20px Bold, #A0AEC0), ProfileImages with user's 3 profile images (mb-24px), 'One-Line Intro' full-width Input (52px), Row 1 grid-cols-4 gap-6 (Role Select, Nickname Input, Phone Input, Age Input), Row 2 grid-cols-4 gap-6 (Gender Select, Exercise Style Select, Gym Relocation Select, Region Select), Row 3 grid-cols-3 gap-6 (Bench Input, Deadlift Input, Squat Input). All inputs 52px height, 6px radius. All fields pre-filled with mock data. Separator between sections. Other Settings section: section label 'Other Settings', horizontal flex with 100px gap, 3 toggles (Profile Public OFF, Match & Chat Notification ON, Marketing Notification OFF). All form fields editable. No validation. Uses Label, Input, Select, Switch, Separator components. Manages local formValues and toggleStates state.",
|
|
621
|
+
"status": "completed",
|
|
622
|
+
"complexity": "high",
|
|
623
|
+
"complexityReason": "Complex form with multi-section layout, CSS Grid rows, 11+ form fields mixing Input and Select, 3 toggle switches, local state management for form values and toggle states, ProfileImages integration",
|
|
624
|
+
"agent": "potenlab-high-coder",
|
|
625
|
+
"outputFiles": [
|
|
626
|
+
"src/components/user-management/user-detail-form.tsx"
|
|
627
|
+
],
|
|
628
|
+
"dependencies": [],
|
|
629
|
+
"verifySteps": [
|
|
630
|
+
"Render with mock user data; all fields pre-filled correctly",
|
|
631
|
+
"'Basic Info' section label visible in gray",
|
|
632
|
+
"3 profile images displayed",
|
|
633
|
+
"'One-Line Intro' input shows 'This is the one-line intro content.'",
|
|
634
|
+
"Row 1: 4 fields in equal columns with 24px gap",
|
|
635
|
+
"Row 2: 4 fields, dropdowns open on click",
|
|
636
|
+
"Row 3: 3 fields in equal columns",
|
|
637
|
+
"Separator between sections",
|
|
638
|
+
"'Other Settings' label visible",
|
|
639
|
+
"3 toggles in a row with 100px gap",
|
|
640
|
+
"'Match & Chat Notification' toggle is ON (blue); others are OFF (gray)",
|
|
641
|
+
"Click a toggle; it switches state with animation"
|
|
642
|
+
]
|
|
643
|
+
},
|
|
644
|
+
{
|
|
645
|
+
"id": "P4-T3",
|
|
646
|
+
"title": "Assemble User Detail page (app/users/[id]/page.tsx)",
|
|
647
|
+
"description": "Reads params.id from route (Next.js dynamic route). Looks up user from mockUsers by id (falls back to first user if not found). Uses Card as main container (same styling as dashboard). Composes inside Card: 1) PageHeader with title 'User Management', subtitle 'You can edit user information.', actionLabel 'Save Changes', actionIcon Pencil. 2) UserDetailForm with the selected user. 'Save Changes' button click: no-op. Route: /users/[id]. Client component ('use client').",
|
|
648
|
+
"status": "completed",
|
|
649
|
+
"complexity": "high",
|
|
650
|
+
"complexityReason": "Page assembly with dynamic route parameter reading, mock data lookup with fallback, composition of PageHeader and UserDetailForm inside Card",
|
|
651
|
+
"agent": "potenlab-high-coder",
|
|
652
|
+
"outputFiles": [
|
|
653
|
+
"src/app/users/[id]/page.tsx"
|
|
654
|
+
],
|
|
655
|
+
"dependencies": [],
|
|
656
|
+
"verifySteps": [
|
|
657
|
+
"Navigate to /users/1; detail page loads in white card",
|
|
658
|
+
"Header shows 'User Management' + subtitle 'You can edit user information.' + 'Save Changes' button",
|
|
659
|
+
"No badge on this page (badgeCount not passed)",
|
|
660
|
+
"Form renders with all user fields pre-filled",
|
|
661
|
+
"Sidebar shows 'User Management' as active",
|
|
662
|
+
"Click 'Save Changes': no error (UI only)",
|
|
663
|
+
"Navigate back via sidebar 'User Management' link; returns to dashboard"
|
|
664
|
+
]
|
|
665
|
+
}
|
|
666
|
+
]
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
"id": "phase-5",
|
|
670
|
+
"name": "Polish",
|
|
671
|
+
"description": "Accessibility, animations, micro-interactions, keyboard navigation, final QA",
|
|
672
|
+
"tasks": [
|
|
673
|
+
{
|
|
674
|
+
"id": "P5-T1",
|
|
675
|
+
"title": "Accessibility audit -- keyboard navigation",
|
|
676
|
+
"description": "Verify and fix keyboard navigation across all components: skip link (Tab first, Enter jumps), sidebar (Tab/Shift+Tab, Enter/Space accordion, Arrow Up/Down), tabs (Arrow Left/Right, Enter/Space), table rows (Tab focus, Enter navigate), delete action (Enter/Space, Tab separately), pagination buttons (Tab + Enter, aria-label), inputs (Tab focus), selects (Enter/Space open, Arrow navigate, Escape close), toggles (Space toggle), buttons (Enter/Space). Focus ring: 2px #509594 outline with 2px offset on ALL interactive elements. No keyboard traps.",
|
|
677
|
+
"status": "completed",
|
|
678
|
+
"complexity": "high",
|
|
679
|
+
"complexityReason": "Cross-component audit requiring updates to multiple files, testing keyboard interactions across sidebar, table, pagination, forms, and ensuring consistent focus ring styling",
|
|
680
|
+
"agent": "potenlab-high-coder",
|
|
681
|
+
"outputFiles": [
|
|
682
|
+
"src/components/layouts/app-sidebar.tsx",
|
|
683
|
+
"src/components/user-management/user-table.tsx",
|
|
684
|
+
"src/components/user-management/pagination-controls.tsx",
|
|
685
|
+
"src/components/user-management/tab-navigation.tsx",
|
|
686
|
+
"src/components/user-management/user-detail-form.tsx"
|
|
687
|
+
],
|
|
688
|
+
"dependencies": [],
|
|
689
|
+
"verifySteps": [
|
|
690
|
+
"Tab through every interactive element without mouse from top of page",
|
|
691
|
+
"Focus ring visible on each element",
|
|
692
|
+
"No keyboard traps (can always Tab out or Escape out)",
|
|
693
|
+
"All actions achievable via keyboard alone",
|
|
694
|
+
"Skip link works on both pages"
|
|
695
|
+
]
|
|
696
|
+
},
|
|
697
|
+
{
|
|
698
|
+
"id": "P5-T2",
|
|
699
|
+
"title": "Accessibility audit -- ARIA and screen reader",
|
|
700
|
+
"description": "Verify and fix ARIA attributes: Badge aria-label='Total users: 100,000', active tab aria-selected='true', table semantic elements, sort columns aria-label, delete buttons aria-label='Delete user NicknameHere', toggle switches aria-checked, accordion aria-expanded, pagination aria-live='polite', all icon-only buttons aria-label, heading hierarchy (h1 page title, h2 section labels), form fields label htmlFor paired with input id.",
|
|
701
|
+
"status": "completed",
|
|
702
|
+
"complexity": "high",
|
|
703
|
+
"complexityReason": "Cross-component ARIA audit requiring updates to multiple files, dynamic aria-label generation, heading hierarchy verification, and screen reader testing",
|
|
704
|
+
"agent": "potenlab-high-coder",
|
|
705
|
+
"outputFiles": [
|
|
706
|
+
"src/components/common/page-header.tsx",
|
|
707
|
+
"src/components/user-management/user-table.tsx",
|
|
708
|
+
"src/components/user-management/pagination-controls.tsx",
|
|
709
|
+
"src/components/user-management/user-detail-form.tsx",
|
|
710
|
+
"src/components/layouts/app-sidebar.tsx"
|
|
711
|
+
],
|
|
712
|
+
"dependencies": [],
|
|
713
|
+
"verifySteps": [
|
|
714
|
+
"Use browser accessibility inspector (Chrome DevTools Accessibility tab)",
|
|
715
|
+
"VoiceOver (macOS): navigate through page; all elements announced correctly",
|
|
716
|
+
"Page title reads 'User Management, heading level 1'",
|
|
717
|
+
"Badge reads 'Total users: 100,000'",
|
|
718
|
+
"Toggle reads 'Profile Public, switch, off'",
|
|
719
|
+
"No accessibility warnings in browser dev tools"
|
|
720
|
+
]
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
"id": "P5-T3",
|
|
724
|
+
"title": "Micro-interactions and transitions",
|
|
725
|
+
"description": "Ensure all transitions from ui-ux-plan are implemented: button hover (bg-color 150ms ease-out), button active (scale 0.98, bg-color 100ms), table row hover (bg-color 150ms), toggle switch (thumb transform 200ms, track bg-color 200ms), accordion expand/collapse (height 300ms, opacity 200ms, chevron rotate 300ms), tab switch (bg-color 200ms, color 200ms), input focus (border-color 150ms, box-shadow 150ms), delete text hover (color 150ms, underline), sidebar menu hover (bg-color 150ms), logout hover (text color transition to red).",
|
|
726
|
+
"status": "completed",
|
|
727
|
+
"complexity": "high",
|
|
728
|
+
"complexityReason": "Cross-component transition audit requiring style updates across 10+ interaction points in multiple files with specific timing and easing values",
|
|
729
|
+
"agent": "potenlab-high-coder",
|
|
730
|
+
"outputFiles": [
|
|
731
|
+
"src/components/ui/button.tsx",
|
|
732
|
+
"src/components/ui/table.tsx",
|
|
733
|
+
"src/components/ui/switch.tsx",
|
|
734
|
+
"src/components/ui/accordion.tsx",
|
|
735
|
+
"src/components/ui/tabs.tsx",
|
|
736
|
+
"src/components/ui/input.tsx",
|
|
737
|
+
"src/components/layouts/app-sidebar.tsx",
|
|
738
|
+
"src/components/user-management/user-table.tsx"
|
|
739
|
+
],
|
|
740
|
+
"dependencies": [],
|
|
741
|
+
"verifySteps": [
|
|
742
|
+
"Visually test each interaction; animations are smooth, not janky",
|
|
743
|
+
"No transitions are instant (all have appropriate duration)",
|
|
744
|
+
"Toggle thumb slides smoothly",
|
|
745
|
+
"Accordion content height animates (not instant appear/disappear)"
|
|
746
|
+
]
|
|
747
|
+
},
|
|
748
|
+
{
|
|
749
|
+
"id": "P5-T4",
|
|
750
|
+
"title": "Final visual QA against design specs",
|
|
751
|
+
"description": "Systematic check of every visual element against Figma design specs and PRD: colors (verify every token matches hex), typography (font family, size, weight, line-height), spacing (paddings, margins, gaps), sizing (sidebar 300px, button heights, input heights, avatar 22px, profile images 116px, toggle 44x24px, table row heights), border radius (cards 8px, inputs/tabs/selects 6px, avatars full-round, table 0px), borders (card #E2E8F0, dividers #EFF1F4, table #E2E8F0), shadows (shadow-md on dropdown menus only), layout (sidebar 300px fixed, content offset 324px, 20px top padding), dashboard and detail page match wireframes, empty/edge states.",
|
|
752
|
+
"status": "completed",
|
|
753
|
+
"complexity": "high",
|
|
754
|
+
"complexityReason": "Full visual audit across all components and pages requiring pixel-level comparison with design specs and potential bug fixes across multiple files",
|
|
755
|
+
"agent": "potenlab-high-coder",
|
|
756
|
+
"outputFiles": [
|
|
757
|
+
"src/styles/globals.css",
|
|
758
|
+
"src/components/ui/button.tsx",
|
|
759
|
+
"src/components/ui/table.tsx",
|
|
760
|
+
"src/components/ui/input.tsx",
|
|
761
|
+
"src/components/ui/select.tsx",
|
|
762
|
+
"src/components/ui/card.tsx",
|
|
763
|
+
"src/components/layouts/app-sidebar.tsx",
|
|
764
|
+
"src/components/layouts/content-layout.tsx"
|
|
765
|
+
],
|
|
766
|
+
"dependencies": [],
|
|
767
|
+
"verifySteps": [
|
|
768
|
+
"Side-by-side comparison with Figma designs at 1920px viewport",
|
|
769
|
+
"No visual regressions or misalignments",
|
|
770
|
+
"All hover/focus states match spec",
|
|
771
|
+
"Build succeeds: bun run build completes without errors"
|
|
772
|
+
]
|
|
773
|
+
}
|
|
774
|
+
]
|
|
775
|
+
}
|
|
776
|
+
]
|
|
777
|
+
}
|