@potenlab/ui 0.1.2 → 0.2.1

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.
Files changed (45) hide show
  1. package/README.md +18 -1
  2. package/dist/cli.js +756 -0
  3. package/package.json +8 -3
  4. package/template/admin/README.md +36 -0
  5. package/template/admin/_gitignore +41 -0
  6. package/template/admin/components.json +23 -0
  7. package/template/admin/docs/changes.json +295 -0
  8. package/template/admin/docs/dev-plan.md +822 -0
  9. package/template/admin/docs/frontend-plan.md +874 -0
  10. package/template/admin/docs/prd.md +408 -0
  11. package/template/admin/docs/progress.json +777 -0
  12. package/template/admin/docs/test-plan.md +790 -0
  13. package/template/admin/docs/ui-ux-plan.md +1664 -0
  14. package/template/admin/eslint.config.mjs +18 -0
  15. package/template/admin/next.config.ts +7 -0
  16. package/template/admin/package.json +43 -0
  17. package/template/admin/postcss.config.mjs +7 -0
  18. package/template/admin/public/avatars/user1.svg +4 -0
  19. package/template/admin/public/avatars/user2.svg +4 -0
  20. package/template/admin/public/avatars/user3.svg +4 -0
  21. package/template/admin/public/avatars/user4.svg +4 -0
  22. package/template/admin/public/avatars/user5.svg +4 -0
  23. package/template/admin/public/file.svg +1 -0
  24. package/template/admin/public/globe.svg +1 -0
  25. package/template/admin/public/next.svg +1 -0
  26. package/template/admin/public/profile/img1.svg +7 -0
  27. package/template/admin/public/profile/img2.svg +7 -0
  28. package/template/admin/public/profile/img3.svg +7 -0
  29. package/template/admin/public/vercel.svg +1 -0
  30. package/template/admin/public/window.svg +1 -0
  31. package/template/admin/src/app/favicon.ico +0 -0
  32. package/template/admin/src/app/layout.tsx +38 -0
  33. package/template/admin/src/app/page.tsx +5 -0
  34. package/template/admin/src/app/users/[id]/page.tsx +10 -0
  35. package/template/admin/src/components/layouts/app-sidebar.tsx +152 -0
  36. package/template/admin/src/components/user-management/profile-images.tsx +69 -0
  37. package/template/admin/src/components/user-management/user-detail-form.tsx +143 -0
  38. package/template/admin/src/features/user-management/components/user-columns.tsx +101 -0
  39. package/template/admin/src/features/user-management/components/user-detail.tsx +79 -0
  40. package/template/admin/src/features/user-management/components/user-list.tsx +74 -0
  41. package/template/admin/src/features/user-management/types/index.ts +113 -0
  42. package/template/admin/src/features/user-management/utils/format.ts +2 -0
  43. package/template/admin/src/lib/mock-data.ts +131 -0
  44. package/template/admin/src/styles/globals.css +26 -0
  45. package/template/admin/tsconfig.json +34 -0
@@ -0,0 +1,408 @@
1
+ # PRD: Admin User Management UI
2
+
3
+ ## Overview
4
+
5
+ An admin dashboard for managing users of a fitness/workout matching platform. The application consists of a **User Management List** page (dashboard) and a **User Detail** page. This PRD covers **UI implementation only** — no backend integration, API calls, or database connectivity.
6
+
7
+ All data displayed will be **static/mock data** hardcoded in the frontend.
8
+
9
+ ## Tech Stack
10
+
11
+ - **Framework:** Next.js 16 (App Router)
12
+ - **Language:** TypeScript
13
+ - **UI Library:** shadcn/ui (built on Radix UI primitives)
14
+ - **Styling:** Tailwind CSS 4 (used by shadcn/ui)
15
+ - **Icons:** Lucide React (bundled with shadcn/ui)
16
+ - **Package Manager:** Bun
17
+ - **Fonts:** Pretendard Variable, Inter
18
+
19
+ ## Design References
20
+
21
+ | Page | Figma Link |
22
+ |------|------------|
23
+ | User Management List (Dashboard) | [Figma - Dashboard](https://www.figma.com/design/zBw8h8Qv20EnLw0sx4s7si/Admin-Design-System?node-id=503-4639&t=VNcT2c5KRyZDdwR1-4) |
24
+ | User Detail | [Figma - User Detail](https://www.figma.com/design/zBw8h8Qv20EnLw0sx4s7si/Admin-Design-System?node-id=503-4813&t=VNcT2c5KRyZDdwR1-4) |
25
+
26
+ ## Design Tokens
27
+
28
+ ### Colors
29
+
30
+ | Token | Hex | Usage |
31
+ |-------|-----|-------|
32
+ | Primary | `#509594` | Buttons, active tab, action text |
33
+ | Primary Light | `#B9D5D4` | Pagination buttons |
34
+ | Background | `#FCFCFC` | Page background |
35
+ | White | `#FFFFFF` | Card background, sidebar |
36
+ | Gray/200 | `#E2E8F0` | Borders, table dividers |
37
+ | Gray/400 | `#A0AEC0` | Placeholder text, section labels |
38
+ | Gray/700 | `#2D3748` | Select text |
39
+ | Gray/800 | `#1A202C` | Inactive tab text |
40
+ | Grayscale/600 | `#9DA0A8` | Subtitle text |
41
+ | Grayscale/800 | `#5A5E6A` | Sidebar menu text |
42
+ | Grayscale/900 | `#3B3F4A` | Table cell text |
43
+ | Black | `#000000` | Headings, body text |
44
+ | Gray/2 | `#EFF1F4` | Dividers, inactive tab bg |
45
+ | Table Header BG | `#F9FAFC` | Table header row |
46
+ | Sidebar Selected BG | `#EEF2F6` | Active sidebar sub-menu |
47
+ | Badge Green BG | `#C6F6D5` | Count badge background |
48
+ | Badge Green Text | `#22543D` | Count badge text |
49
+
50
+ ### Typography
51
+
52
+ | Style | Font | Weight | Size |
53
+ |-------|------|--------|------|
54
+ | Page Title | Pretendard Variable | SemiBold (600) | 32px |
55
+ | Section Label | Pretendard Variable | Bold (700) | 20px |
56
+ | Field Label | Pretendard Variable | SemiBold (600) | 20px |
57
+ | Subtitle | Pretendard Variable | Medium (500) | 18px |
58
+ | Body | Pretendard Variable | Regular (400) | 14px |
59
+ | Sidebar Title | Pretendard Variable | SemiBold (600) | 24px |
60
+ | Sidebar Menu | Inter / Noto Sans KR | Regular (400) | 16px |
61
+ | Button Text | Inter | SemiBold (600) | 18px |
62
+ | Input Text | Inter / Noto Sans KR | Regular (400) | 18px |
63
+ | Badge | Inter | Bold (700) | 18px |
64
+
65
+ ## Layout Structure
66
+
67
+ ### Global Layout
68
+
69
+ The application uses a fixed **sidebar + content area** layout:
70
+
71
+ - **Sidebar:** Fixed left, 300px wide, full viewport height
72
+ - **Content Area:** Offset 324px from left, padded 20px from top
73
+
74
+ ### Sidebar (Shared Across Pages)
75
+
76
+ **Header:**
77
+ - Title: "ADMIN" (24px, SemiBold)
78
+ - Subtitle: Admin user ID displayed below
79
+
80
+ **Navigation Menu:**
81
+ - Home (with icon)
82
+ - User section (expandable accordion)
83
+ - Sub-menu: "User Management" (highlighted when active with `#EEF2F6` background)
84
+ - Match section (expandable accordion)
85
+ - Sub-menu: "Match Management"
86
+ - Admin section (expandable accordion)
87
+ - Sub-menu: "Notice Management"
88
+ - Sub-menu: "Report Management"
89
+ - Sub-menu: "Terms Management"
90
+
91
+ **Footer:**
92
+ - Logout button with icon, centered, border-top separator
93
+
94
+ **Behavior:**
95
+ - Accordion sections expand/collapse to show sub-menus
96
+ - Active sub-menu has teal highlight background with icon
97
+ - Chevron icons indicate expand/collapse state
98
+
99
+ ---
100
+
101
+ ## Page 1: User Management List (Dashboard)
102
+
103
+ **Route:** `/`
104
+
105
+ ### Card Container
106
+
107
+ White card with 8px border-radius, 1px `#E2E8F0` border, 32px padding.
108
+
109
+ ### Header Section
110
+
111
+ - **Title:** "User Management" (32px, SemiBold, black)
112
+ - **Badge:** Total count (e.g. "100,000") in green badge (`#C6F6D5` bg, `#22543D` text, uppercase)
113
+ - **Subtitle:** "User list management page" (18px, Medium, `#9DA0A8`)
114
+ - **Action Button:** "Write" button, teal (`#509594`), white text, edit icon, 8px border-radius, 40px height — positioned top-right
115
+
116
+ ### Divider
117
+
118
+ 1px horizontal line (`#EFF1F4`), full width.
119
+
120
+ ### Tab Navigation
121
+
122
+ - Tabs: "All", "Tab", "Tab" (placeholder labels)
123
+ - Active tab: Teal (`#509594`) background, white text, SemiBold
124
+ - Inactive tabs: Light gray (`#EEF2F6`) background, dark text, Medium
125
+ - 6px border-radius, 52px height, 16px horizontal padding
126
+
127
+ ### Search Bar
128
+
129
+ - Full-width text input
130
+ - Placeholder: "Enter search keyword"
131
+ - 48px height, 6px border-radius, `#E2E8F0` border
132
+ - Placeholder color: `#A0AEC0`
133
+
134
+ ### Pagination Controls (Above Table)
135
+
136
+ **Left side:**
137
+ - Navigation buttons: First (`<<`), Previous (`<`), Next (`>`), Last (`>>`)
138
+ - Button style: `#B9D5D4` background, 40px height, 6px border-radius
139
+ - Page indicator: "1 / 1" (current page bold 20px, separator and total 16px `#5A5E6A`)
140
+
141
+ **Right side:**
142
+ - Page jump input (100px wide, 48px height, placeholder "Page")
143
+ - "Go" button (`#EEF2F6` background, 48px height)
144
+ - Items per page dropdown: "10 items" (96px wide, 48px height, `#E2E8F0` border, with chevron icon)
145
+
146
+ ### Data Table
147
+
148
+ **Table Container:** White background, 1px `#E2E8F0` border, no border-radius.
149
+
150
+ **Table Headers:** (56px row height, `#F9FAFC` background)
151
+
152
+ | Column | Width | Sortable | Alignment |
153
+ |--------|-------|----------|-----------|
154
+ | Nickname | flex-1 | No | Left |
155
+ | Grade | flex-1 | No | Left |
156
+ | Avatar | 80px (fixed) | No | Center |
157
+ | Phone Number | flex-1 | No | Left |
158
+ | Age | flex-1 | No | Left |
159
+ | Gender | flex-1 | No | Left |
160
+ | Region | flex-1 | No | Left |
161
+ | Join Date | flex-1 | Yes (sort icon) | Left |
162
+ | Withdrawal Date | flex-1 | Yes (sort icon) | Left |
163
+ | Delete | 57px (fixed) | No | Left |
164
+
165
+ **Table Rows:** (60px row height)
166
+ - Text: 14px, Regular, `#3B3F4A`
167
+ - Avatar column: 22px circular avatar image, centered
168
+ - Delete column: Teal text (`#509594`), clickable
169
+ - Bottom border per row: 1px `#E2E8F0`
170
+
171
+ **Mock Data (5 rows):**
172
+
173
+ | Nickname | Grade | Avatar | Phone | Age | Gender | Region | Join Date | Withdrawal Date |
174
+ |----------|-------|--------|-------|-----|--------|--------|-----------|-----------------|
175
+ | NicknameHere | Mania | (avatar) | 010-1234-1234 | Born 1999 | Male | Gangnam-gu | Nov 1, 2022 | Nov 1, 2022 |
176
+ | *(repeat for 5 rows with same sample data)* |
177
+
178
+ ---
179
+
180
+ ## Page 2: User Detail
181
+
182
+ **Route:** `/users/[id]`
183
+
184
+ ### Card Container
185
+
186
+ Same card style as dashboard (white, 8px radius, border, 32px padding).
187
+
188
+ ### Header Section
189
+
190
+ - **Title:** "User Management" (32px, SemiBold, black)
191
+ - **Subtitle:** "You can edit user information." (18px, Medium, `#9DA0A8`)
192
+ - **Action Button:** "Save Changes" button, teal (`#509594`), white text, edit icon
193
+
194
+ ### Divider
195
+
196
+ 1px horizontal line (`#EFF1F4`).
197
+
198
+ ### Section: Basic Info
199
+
200
+ **Section Label:** "Basic Info" (20px, Bold, `#A0AEC0`)
201
+
202
+ **Profile Images:**
203
+ - 3 images displayed in a horizontal row
204
+ - Each: 116px x 116px, 8px border-radius
205
+ - Placeholder images showing workout/fitness photos
206
+
207
+ **One-Line Intro:**
208
+ - Label: "One-Line Intro" (20px, SemiBold, `#101010`)
209
+ - Full-width text input (52px height)
210
+ - Value: "This is the one-line intro content."
211
+
212
+ **Row 1 (4 columns, equal width, 24px gap):**
213
+
214
+ | Field | Type | Value |
215
+ |-------|------|-------|
216
+ | Role | Dropdown (with chevron) | "User" |
217
+ | Nickname | Text Input | "AttackingHealthPerson" |
218
+ | Phone | Text Input | "01012341234" |
219
+ | Age | Text Input | "24 years old" |
220
+
221
+ **Row 2 (4 columns, equal width, 24px gap):**
222
+
223
+ | Field | Type | Value |
224
+ |-------|------|-------|
225
+ | Gender | Dropdown (with chevron) | "Male" |
226
+ | Exercise Style | Dropdown (with chevron) | "Bodybuilding" |
227
+ | Gym Relocation | Dropdown (with chevron) | "Available" |
228
+ | Region | Dropdown (with chevron) | "Seoul Mapo-gu" |
229
+
230
+ **Row 3 (3 columns, equal width, 24px gap):**
231
+
232
+ | Field | Type | Value |
233
+ |-------|------|-------|
234
+ | Bench | Text Input | "100kg" |
235
+ | Deadlift | Text Input | "100kg" |
236
+ | Squat | Text Input | "100kg" |
237
+
238
+ ### Divider
239
+
240
+ 1px horizontal line (`#EFF1F4`).
241
+
242
+ ### Section: Other Settings
243
+
244
+ **Section Label:** "Other Settings" (20px, Bold, `#A0AEC0`)
245
+
246
+ **Toggle Settings (horizontal layout, 100px gap between items):**
247
+
248
+ | Setting | Toggle State |
249
+ |---------|-------------|
250
+ | Profile Public | OFF |
251
+ | Match & Chat Notification | ON (blue) |
252
+ | Marketing Notification | OFF |
253
+
254
+ **Toggle Component:**
255
+ - 44px x 24px toggle switch
256
+ - ON state: Blue filled with white circle right
257
+ - OFF state: Gray outline with white circle left
258
+
259
+ ### Form Field Specs
260
+
261
+ **Text Input:**
262
+ - Height: 52px
263
+ - Border: 1px `#E2E8F0`
264
+ - Border-radius: 6px
265
+ - Padding: 16px horizontal
266
+ - Font: Inter Regular 18px, black
267
+
268
+ **Dropdown (Select):**
269
+ - Same as text input but with 48px right padding for chevron icon
270
+ - Chevron positioned in 48px-wide right element area
271
+
272
+ ---
273
+
274
+ ## shadcn/ui Component Mapping
275
+
276
+ The following shadcn/ui components should be installed and used. Custom styling via Tailwind overrides will match the Figma design tokens.
277
+
278
+ ### Required shadcn/ui Components
279
+
280
+ | shadcn/ui Component | Used In | Figma Element | Customization Notes |
281
+ |---------------------|---------|---------------|---------------------|
282
+ | `Card` | Both pages | Card container | Override border color to `#E2E8F0`, padding 32px |
283
+ | `Button` | Both pages | Primary/Secondary buttons | Primary variant: bg `#509594`, text white. Secondary variant: bg `#EEF2F6`, text black |
284
+ | `Table` | Dashboard | Data table | Header bg `#F9FAFC`, row height 60px, cell text `#3B3F4A` |
285
+ | `Input` | Both pages | Search bar, text inputs | Height 48-52px, border `#E2E8F0`, placeholder `#A0AEC0` |
286
+ | `Select` | User Detail | Dropdown fields | With chevron trigger, border `#E2E8F0` |
287
+ | `Badge` | Dashboard | Count badge | Custom green variant: bg `#C6F6D5`, text `#22543D` |
288
+ | `Avatar` | Dashboard | User avatar in table | 22px size, circular |
289
+ | `Switch` | User Detail | Toggle settings | 44x24px, ON state styled blue |
290
+ | `Tabs` | Dashboard | Tab navigation | Active: bg `#509594` white text. Inactive: bg `#EEF2F6` |
291
+ | `Separator` | Both pages | Dividers | Color `#EFF1F4` |
292
+ | `Accordion` | Sidebar | Navigation menu | Expand/collapse sections with chevron |
293
+ | `Sidebar` | Both pages | Left navigation | 300px fixed, uses shadcn/ui sidebar layout |
294
+ | `Pagination` | Dashboard | Page navigation | Custom styled with `#B9D5D4` buttons |
295
+ | `Label` | User Detail | Form field labels | 20px SemiBold `#101010` |
296
+ | `Tooltip` | Both pages | Optional hover hints | For icon-only buttons if needed |
297
+
298
+ ### shadcn/ui Installation Commands
299
+
300
+ ```bash
301
+ bunx --bun shadcn@latest init
302
+ bunx --bun shadcn@latest add card button table input select badge avatar switch tabs separator accordion sidebar pagination label tooltip
303
+ ```
304
+
305
+ ### Component Customization Strategy
306
+
307
+ shadcn/ui components are copy-pasted into the project (`src/components/ui/`) and fully editable. Apply the following global customizations:
308
+
309
+ 1. **Theme Variables** — Override CSS variables in `globals.css` to match Figma design tokens:
310
+ - `--primary`: `#509594` (teal)
311
+ - `--primary-foreground`: `#FFFFFF`
312
+ - `--border`: `#E2E8F0`
313
+ - `--muted`: `#EEF2F6`
314
+ - `--muted-foreground`: `#5A5E6A`
315
+ - `--background`: `#FCFCFC`
316
+ - `--card`: `#FFFFFF`
317
+ - `--accent`: `#B9D5D4`
318
+
319
+ 2. **Custom Variants** — Add to `Button` component:
320
+ - `primary`: bg `#509594`, hover darker, text white
321
+ - `secondary`: bg `#EEF2F6`, text black
322
+ - `pagination`: bg `#B9D5D4`, icon only, 40px square
323
+
324
+ 3. **Table Styling** — Override `TableHeader` bg to `#F9FAFC`, row heights, and font sizes per the Figma spec.
325
+
326
+ 4. **Icons** — Use Lucide React icons (included with shadcn/ui) for all UI icons:
327
+ - `ChevronsLeft`, `ChevronLeft`, `ChevronRight`, `ChevronsRight` for pagination
328
+ - `ChevronDown`, `ChevronUp` for accordion/sort
329
+ - `Pencil` / `Edit` for edit button
330
+ - `Home`, `Users`, `Gamepad2`, `Shield`, `Bell`, `AlertTriangle`, `FileText`, `LogOut` for sidebar navigation
331
+
332
+ ## User Stories
333
+
334
+ ### US-1: View User List
335
+ As an admin, I can see a paginated table of all users with their key information (nickname, grade, avatar, phone, age, gender, region, dates) so that I can quickly scan the user base.
336
+
337
+ ### US-2: Navigate with Sidebar
338
+ As an admin, I can use the sidebar to navigate between different admin sections (Users, Matches, Admin management) with expandable accordion menus.
339
+
340
+ ### US-3: Search Users
341
+ As an admin, I can type a search keyword in the search bar to filter the user list (UI only — no actual filtering logic needed).
342
+
343
+ ### US-4: Filter by Tabs
344
+ As an admin, I can switch between tabs ("All" and other filter tabs) to categorize users (UI only — tab switching state).
345
+
346
+ ### US-5: Paginate User List
347
+ As an admin, I can navigate between pages using pagination buttons, jump to a specific page, and change items per page count.
348
+
349
+ ### US-6: View User Detail
350
+ As an admin, I can click on a user row to navigate to their detail page where I see their full profile information.
351
+
352
+ ### US-7: Edit User Detail
353
+ As an admin, I can modify user fields (text inputs, dropdowns, toggles) on the detail page and click "Save Changes" (UI only — no actual save).
354
+
355
+ ### US-8: Delete User
356
+ As an admin, I can click the "Delete" action in the table row (UI only — no actual deletion).
357
+
358
+ ### US-9: Logout
359
+ As an admin, I can click the logout button at the bottom of the sidebar (UI only — no auth logic).
360
+
361
+ ## Project Structure
362
+
363
+ ```
364
+ src/
365
+ ├── app/
366
+ │ ├── layout.tsx # Root layout with sidebar
367
+ │ ├── page.tsx # User Management List (Dashboard)
368
+ │ └── users/
369
+ │ └── [id]/
370
+ │ └── page.tsx # User Detail page
371
+ ├── components/
372
+ │ ├── ui/ # shadcn/ui components (auto-generated)
373
+ │ │ ├── accordion.tsx
374
+ │ │ ├── avatar.tsx
375
+ │ │ ├── badge.tsx
376
+ │ │ ├── button.tsx
377
+ │ │ ├── card.tsx
378
+ │ │ ├── input.tsx
379
+ │ │ ├── label.tsx
380
+ │ │ ├── pagination.tsx
381
+ │ │ ├── select.tsx
382
+ │ │ ├── separator.tsx
383
+ │ │ ├── sidebar.tsx
384
+ │ │ ├── switch.tsx
385
+ │ │ ├── table.tsx
386
+ │ │ ├── tabs.tsx
387
+ │ │ └── tooltip.tsx
388
+ │ ├── app-sidebar.tsx # Sidebar navigation with accordion menu
389
+ │ ├── page-header.tsx # Reusable page title + subtitle + action
390
+ │ ├── user-table.tsx # Data table with pagination
391
+ │ └── user-detail-form.tsx # Detail page form fields
392
+ ├── lib/
393
+ │ ├── utils.ts # shadcn/ui cn() utility
394
+ │ └── mock-data.ts # Static mock user data
395
+ └── styles/
396
+ └── globals.css # Tailwind + shadcn/ui theme overrides
397
+ ```
398
+
399
+ ## Out of Scope
400
+
401
+ - Backend API integration
402
+ - Authentication / Authorization
403
+ - Real data fetching
404
+ - Form validation logic
405
+ - Actual search/filter functionality
406
+ - Database operations
407
+ - User session management
408
+ - Responsive/mobile layout (design is desktop-only at 1920px)