@potenlab/ui 0.1.1 → 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/README.md +361 -0
- package/dist/cli.js +756 -0
- package/package.json +8 -5
- 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,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)
|