Compare commits
110 Commits
8ca03ed7ac
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2c8524485b | ||
|
|
4c0207c6e6 | ||
|
|
5b8d6610ab | ||
|
|
a036b10641 | ||
|
|
c1a7118d35 | ||
|
|
f27bbacb1e | ||
|
|
acda0d82c8 | ||
| 99de03604d | |||
| 1baa6d87cf | |||
| f604791c69 | |||
| cfb6b52cc2 | |||
| 0c3065f970 | |||
|
|
ebf9739f06 | ||
|
|
d3b5f55c64 | ||
| 866a2587b3 | |||
| 85d158dfec | |||
| 2a8f4e40d6 | |||
|
|
908367ba5d | ||
|
|
2ecab976f5 | ||
|
|
e04a283319 | ||
|
|
d23e896f97 | ||
|
|
c5e4082c26 | ||
|
|
0c737a30c1 | ||
|
|
c5dae2993b | ||
|
|
3e6b3981f4 | ||
|
|
e563b81b6e | ||
|
|
322cd0dca5 | ||
|
|
ad56b82944 | ||
|
|
f62a8d98a4 | ||
|
|
76a526643e | ||
|
|
9ce48f1714 | ||
|
|
a162dcc650 | ||
|
|
868a3352ad | ||
|
|
61e575194d | ||
|
|
69b024b5cc | ||
|
|
6654972ddb | ||
|
|
fe0093972f | ||
|
|
878d93a865 | ||
|
|
b364fb4aec | ||
|
|
a69f972766 | ||
|
|
dfb78006ac | ||
|
|
893921007a | ||
|
|
59167d2630 | ||
|
|
14832f5c6f | ||
|
|
894aea0e74 | ||
|
|
877c741d72 | ||
|
|
aeb08f2cc1 | ||
|
|
c7e2d6fe53 | ||
|
|
f3b5444dd8 | ||
|
|
38cf7d12e9 | ||
|
|
1690252740 | ||
|
|
471d1196b3 | ||
|
|
5d20d7dd3f | ||
|
|
1990a3ccba | ||
|
|
766497dc31 | ||
|
|
e59c75bf9e | ||
|
|
eeeef931b1 | ||
|
|
73ce9af11a | ||
|
|
3c71ae0004 | ||
|
|
43de0e3e9e | ||
|
|
78fe35da01 | ||
|
|
90d415cfb9 | ||
|
|
304a5de1d6 | ||
|
|
8832150562 | ||
|
|
950520635d | ||
|
|
81155fd8e4 | ||
|
|
78a41513bd | ||
|
|
57ddbe5f85 | ||
|
|
044c07fae6 | ||
|
|
1a4eb00440 | ||
|
|
1141b6c92d | ||
|
|
9b4d956032 | ||
|
|
175fe55be7 | ||
|
|
3d34040bcc | ||
|
|
1dc4701540 | ||
|
|
686bddad79 | ||
|
|
b6625748ac | ||
|
|
55515410ae | ||
|
|
c80ff80bf0 | ||
|
|
317afd2d23 | ||
|
|
a48ce0cb54 | ||
|
|
1ba662de0a | ||
|
|
fb10b72760 | ||
|
|
b88f2d185e | ||
|
|
4f1cab6149 | ||
|
|
ffdc6e2bbb | ||
|
|
af3f38aba0 | ||
|
|
030195d609 | ||
|
|
d0c1f1622c | ||
|
|
d5c5e07f77 | ||
|
|
a402f2329a | ||
|
|
d52efaadcb | ||
|
|
a055ff166a | ||
|
|
853c87b8a2 | ||
|
|
6c9b29c53b | ||
|
|
2a33434005 | ||
|
|
819fe9080a | ||
|
|
f0f054390a | ||
|
|
a770984ef7 | ||
|
|
9247001643 | ||
|
|
17c299e4ce | ||
|
|
2d6b5d7903 | ||
|
|
ceecc07ffc | ||
|
|
e4ed3784e3 | ||
|
|
62851342c3 | ||
|
|
aaa648a86d | ||
|
|
cd2ca96873 | ||
|
|
719db517f2 | ||
|
|
2140efbacf | ||
|
|
8cc86369a2 |
@@ -19,7 +19,9 @@
|
|||||||
"Bash(findstr:*)",
|
"Bash(findstr:*)",
|
||||||
"Bash(npm run:*)",
|
"Bash(npm run:*)",
|
||||||
"Bash(find src/views -name *.vue -type f -exec grep -l \"device.*detail\\\\|设备详情\" {})",
|
"Bash(find src/views -name *.vue -type f -exec grep -l \"device.*detail\\\\|设备详情\" {})",
|
||||||
"Bash(2)"
|
"Bash(2)",
|
||||||
|
"Bash(grep -E \"\\\\.\\(vue|ts\\)$\")",
|
||||||
|
"Bash(xargs grep:*)"
|
||||||
],
|
],
|
||||||
"deny": [],
|
"deny": [],
|
||||||
"ask": []
|
"ask": []
|
||||||
|
|||||||
292
.codex/skills/ui-ux-pro-max/SKILL.md
Normal file
292
.codex/skills/ui-ux-pro-max/SKILL.md
Normal file
@@ -0,0 +1,292 @@
|
|||||||
|
---
|
||||||
|
name: ui-ux-pro-max
|
||||||
|
description: UI/UX design intelligence with searchable database
|
||||||
|
---
|
||||||
|
# ui-ux-pro-max
|
||||||
|
|
||||||
|
Comprehensive design guide for web and mobile applications. Contains 67 styles, 96 color palettes, 57 font pairings, 99 UX guidelines, and 25 chart types across 13 technology stacks. Searchable database with priority-based recommendations.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
Check if Python is installed:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 --version || python --version
|
||||||
|
```
|
||||||
|
|
||||||
|
If Python is not installed, install it based on user's OS:
|
||||||
|
|
||||||
|
**macOS:**
|
||||||
|
```bash
|
||||||
|
brew install python3
|
||||||
|
```
|
||||||
|
|
||||||
|
**Ubuntu/Debian:**
|
||||||
|
```bash
|
||||||
|
sudo apt update && sudo apt install python3
|
||||||
|
```
|
||||||
|
|
||||||
|
**Windows:**
|
||||||
|
```powershell
|
||||||
|
winget install Python.Python.3.12
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## How to Use This Skill
|
||||||
|
|
||||||
|
When user requests UI/UX work (design, build, create, implement, review, fix, improve), follow this workflow:
|
||||||
|
|
||||||
|
### Step 1: Analyze User Requirements
|
||||||
|
|
||||||
|
Extract key information from user request:
|
||||||
|
- **Product type**: SaaS, e-commerce, portfolio, dashboard, landing page, etc.
|
||||||
|
- **Style keywords**: minimal, playful, professional, elegant, dark mode, etc.
|
||||||
|
- **Industry**: healthcare, fintech, gaming, education, etc.
|
||||||
|
- **Stack**: React, Vue, Next.js, or default to `html-tailwind`
|
||||||
|
|
||||||
|
### Step 2: Generate Design System (REQUIRED)
|
||||||
|
|
||||||
|
**Always start with `--design-system`** to get comprehensive recommendations with reasoning:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 skills/ui-ux-pro-max/scripts/search.py "<product_type> <industry> <keywords>" --design-system [-p "Project Name"]
|
||||||
|
```
|
||||||
|
|
||||||
|
This command:
|
||||||
|
1. Searches 5 domains in parallel (product, style, color, landing, typography)
|
||||||
|
2. Applies reasoning rules from `ui-reasoning.csv` to select best matches
|
||||||
|
3. Returns complete design system: pattern, style, colors, typography, effects
|
||||||
|
4. Includes anti-patterns to avoid
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```bash
|
||||||
|
python3 skills/ui-ux-pro-max/scripts/search.py "beauty spa wellness service" --design-system -p "Serenity Spa"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2b: Persist Design System (Master + Overrides Pattern)
|
||||||
|
|
||||||
|
To save the design system for hierarchical retrieval across sessions, add `--persist`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 skills/ui-ux-pro-max/scripts/search.py "<query>" --design-system --persist -p "Project Name"
|
||||||
|
```
|
||||||
|
|
||||||
|
This creates:
|
||||||
|
- `design-system/MASTER.md` — Global Source of Truth with all design rules
|
||||||
|
- `design-system/pages/` — Folder for page-specific overrides
|
||||||
|
|
||||||
|
**With page-specific override:**
|
||||||
|
```bash
|
||||||
|
python3 skills/ui-ux-pro-max/scripts/search.py "<query>" --design-system --persist -p "Project Name" --page "dashboard"
|
||||||
|
```
|
||||||
|
|
||||||
|
This also creates:
|
||||||
|
- `design-system/pages/dashboard.md` — Page-specific deviations from Master
|
||||||
|
|
||||||
|
**How hierarchical retrieval works:**
|
||||||
|
1. When building a specific page (e.g., "Checkout"), first check `design-system/pages/checkout.md`
|
||||||
|
2. If the page file exists, its rules **override** the Master file
|
||||||
|
3. If not, use `design-system/MASTER.md` exclusively
|
||||||
|
|
||||||
|
### Step 3: Supplement with Detailed Searches (as needed)
|
||||||
|
|
||||||
|
After getting the design system, use domain searches to get additional details:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 skills/ui-ux-pro-max/scripts/search.py "<keyword>" --domain <domain> [-n <max_results>]
|
||||||
|
```
|
||||||
|
|
||||||
|
**When to use detailed searches:**
|
||||||
|
|
||||||
|
| Need | Domain | Example |
|
||||||
|
|------|--------|---------|
|
||||||
|
| More style options | `style` | `--domain style "glassmorphism dark"` |
|
||||||
|
| Chart recommendations | `chart` | `--domain chart "real-time dashboard"` |
|
||||||
|
| UX best practices | `ux` | `--domain ux "animation accessibility"` |
|
||||||
|
| Alternative fonts | `typography` | `--domain typography "elegant luxury"` |
|
||||||
|
| Landing structure | `landing` | `--domain landing "hero social-proof"` |
|
||||||
|
|
||||||
|
### Step 4: Stack Guidelines (Default: html-tailwind)
|
||||||
|
|
||||||
|
Get implementation-specific best practices. If user doesn't specify a stack, **default to `html-tailwind`**.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 skills/ui-ux-pro-max/scripts/search.py "<keyword>" --stack html-tailwind
|
||||||
|
```
|
||||||
|
|
||||||
|
Available stacks: `html-tailwind`, `react`, `nextjs`, `vue`, `svelte`, `swiftui`, `react-native`, `flutter`, `shadcn`, `jetpack-compose`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Search Reference
|
||||||
|
|
||||||
|
### Available Domains
|
||||||
|
|
||||||
|
| Domain | Use For | Example Keywords |
|
||||||
|
|--------|---------|------------------|
|
||||||
|
| `product` | Product type recommendations | SaaS, e-commerce, portfolio, healthcare, beauty, service |
|
||||||
|
| `style` | UI styles, colors, effects | glassmorphism, minimalism, dark mode, brutalism |
|
||||||
|
| `typography` | Font pairings, Google Fonts | elegant, playful, professional, modern |
|
||||||
|
| `color` | Color palettes by product type | saas, ecommerce, healthcare, beauty, fintech, service |
|
||||||
|
| `landing` | Page structure, CTA strategies | hero, hero-centric, testimonial, pricing, social-proof |
|
||||||
|
| `chart` | Chart types, library recommendations | trend, comparison, timeline, funnel, pie |
|
||||||
|
| `ux` | Best practices, anti-patterns | animation, accessibility, z-index, loading |
|
||||||
|
| `react` | React/Next.js performance | waterfall, bundle, suspense, memo, rerender, cache |
|
||||||
|
| `web` | Web interface guidelines | aria, focus, keyboard, semantic, virtualize |
|
||||||
|
| `prompt` | AI prompts, CSS keywords | (style name) |
|
||||||
|
|
||||||
|
### Available Stacks
|
||||||
|
|
||||||
|
| Stack | Focus |
|
||||||
|
|-------|-------|
|
||||||
|
| `html-tailwind` | Tailwind utilities, responsive, a11y (DEFAULT) |
|
||||||
|
| `react` | State, hooks, performance, patterns |
|
||||||
|
| `nextjs` | SSR, routing, images, API routes |
|
||||||
|
| `vue` | Composition API, Pinia, Vue Router |
|
||||||
|
| `svelte` | Runes, stores, SvelteKit |
|
||||||
|
| `swiftui` | Views, State, Navigation, Animation |
|
||||||
|
| `react-native` | Components, Navigation, Lists |
|
||||||
|
| `flutter` | Widgets, State, Layout, Theming |
|
||||||
|
| `shadcn` | shadcn/ui components, theming, forms, patterns |
|
||||||
|
| `jetpack-compose` | Composables, Modifiers, State Hoisting, Recomposition |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Example Workflow
|
||||||
|
|
||||||
|
**User request:** "Làm landing page cho dịch vụ chăm sóc da chuyên nghiệp"
|
||||||
|
|
||||||
|
### Step 1: Analyze Requirements
|
||||||
|
- Product type: Beauty/Spa service
|
||||||
|
- Style keywords: elegant, professional, soft
|
||||||
|
- Industry: Beauty/Wellness
|
||||||
|
- Stack: html-tailwind (default)
|
||||||
|
|
||||||
|
### Step 2: Generate Design System (REQUIRED)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 skills/ui-ux-pro-max/scripts/search.py "beauty spa wellness service elegant" --design-system -p "Serenity Spa"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Output:** Complete design system with pattern, style, colors, typography, effects, and anti-patterns.
|
||||||
|
|
||||||
|
### Step 3: Supplement with Detailed Searches (as needed)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get UX guidelines for animation and accessibility
|
||||||
|
python3 skills/ui-ux-pro-max/scripts/search.py "animation accessibility" --domain ux
|
||||||
|
|
||||||
|
# Get alternative typography options if needed
|
||||||
|
python3 skills/ui-ux-pro-max/scripts/search.py "elegant luxury serif" --domain typography
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Stack Guidelines
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 skills/ui-ux-pro-max/scripts/search.py "layout responsive form" --stack html-tailwind
|
||||||
|
```
|
||||||
|
|
||||||
|
**Then:** Synthesize design system + detailed searches and implement the design.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Output Formats
|
||||||
|
|
||||||
|
The `--design-system` flag supports two output formats:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ASCII box (default) - best for terminal display
|
||||||
|
python3 skills/ui-ux-pro-max/scripts/search.py "fintech crypto" --design-system
|
||||||
|
|
||||||
|
# Markdown - best for documentation
|
||||||
|
python3 skills/ui-ux-pro-max/scripts/search.py "fintech crypto" --design-system -f markdown
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tips for Better Results
|
||||||
|
|
||||||
|
1. **Be specific with keywords** - "healthcare SaaS dashboard" > "app"
|
||||||
|
2. **Search multiple times** - Different keywords reveal different insights
|
||||||
|
3. **Combine domains** - Style + Typography + Color = Complete design system
|
||||||
|
4. **Always check UX** - Search "animation", "z-index", "accessibility" for common issues
|
||||||
|
5. **Use stack flag** - Get implementation-specific best practices
|
||||||
|
6. **Iterate** - If first search doesn't match, try different keywords
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Common Rules for Professional UI
|
||||||
|
|
||||||
|
These are frequently overlooked issues that make UI look unprofessional:
|
||||||
|
|
||||||
|
### Icons & Visual Elements
|
||||||
|
|
||||||
|
| Rule | Do | Don't |
|
||||||
|
|------|----|----- |
|
||||||
|
| **No emoji icons** | Use SVG icons (Heroicons, Lucide, Simple Icons) | Use emojis like 🎨 🚀 ⚙️ as UI icons |
|
||||||
|
| **Stable hover states** | Use color/opacity transitions on hover | Use scale transforms that shift layout |
|
||||||
|
| **Correct brand logos** | Research official SVG from Simple Icons | Guess or use incorrect logo paths |
|
||||||
|
| **Consistent icon sizing** | Use fixed viewBox (24x24) with w-6 h-6 | Mix different icon sizes randomly |
|
||||||
|
|
||||||
|
### Interaction & Cursor
|
||||||
|
|
||||||
|
| Rule | Do | Don't |
|
||||||
|
|------|----|----- |
|
||||||
|
| **Cursor pointer** | Add `cursor-pointer` to all clickable/hoverable cards | Leave default cursor on interactive elements |
|
||||||
|
| **Hover feedback** | Provide visual feedback (color, shadow, border) | No indication element is interactive |
|
||||||
|
| **Smooth transitions** | Use `transition-colors duration-200` | Instant state changes or too slow (>500ms) |
|
||||||
|
|
||||||
|
### Light/Dark Mode Contrast
|
||||||
|
|
||||||
|
| Rule | Do | Don't |
|
||||||
|
|------|----|----- |
|
||||||
|
| **Glass card light mode** | Use `bg-white/80` or higher opacity | Use `bg-white/10` (too transparent) |
|
||||||
|
| **Text contrast light** | Use `#0F172A` (slate-900) for text | Use `#94A3B8` (slate-400) for body text |
|
||||||
|
| **Muted text light** | Use `#475569` (slate-600) minimum | Use gray-400 or lighter |
|
||||||
|
| **Border visibility** | Use `border-gray-200` in light mode | Use `border-white/10` (invisible) |
|
||||||
|
|
||||||
|
### Layout & Spacing
|
||||||
|
|
||||||
|
| Rule | Do | Don't |
|
||||||
|
|------|----|----- |
|
||||||
|
| **Floating navbar** | Add `top-4 left-4 right-4` spacing | Stick navbar to `top-0 left-0 right-0` |
|
||||||
|
| **Content padding** | Account for fixed navbar height | Let content hide behind fixed elements |
|
||||||
|
| **Consistent max-width** | Use same `max-w-6xl` or `max-w-7xl` | Mix different container widths |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pre-Delivery Checklist
|
||||||
|
|
||||||
|
Before delivering UI code, verify these items:
|
||||||
|
|
||||||
|
### Visual Quality
|
||||||
|
- [ ] No emojis used as icons (use SVG instead)
|
||||||
|
- [ ] All icons from consistent icon set (Heroicons/Lucide)
|
||||||
|
- [ ] Brand logos are correct (verified from Simple Icons)
|
||||||
|
- [ ] Hover states don't cause layout shift
|
||||||
|
- [ ] Use theme colors directly (bg-primary) not var() wrapper
|
||||||
|
|
||||||
|
### Interaction
|
||||||
|
- [ ] All clickable elements have `cursor-pointer`
|
||||||
|
- [ ] Hover states provide clear visual feedback
|
||||||
|
- [ ] Transitions are smooth (150-300ms)
|
||||||
|
- [ ] Focus states visible for keyboard navigation
|
||||||
|
|
||||||
|
### Light/Dark Mode
|
||||||
|
- [ ] Light mode text has sufficient contrast (4.5:1 minimum)
|
||||||
|
- [ ] Glass/transparent elements visible in light mode
|
||||||
|
- [ ] Borders visible in both modes
|
||||||
|
- [ ] Test both modes before delivery
|
||||||
|
|
||||||
|
### Layout
|
||||||
|
- [ ] Floating elements have proper spacing from edges
|
||||||
|
- [ ] No content hidden behind fixed navbars
|
||||||
|
- [ ] Responsive at 375px, 768px, 1024px, 1440px
|
||||||
|
- [ ] No horizontal scroll on mobile
|
||||||
|
|
||||||
|
### Accessibility
|
||||||
|
- [ ] All images have alt text
|
||||||
|
- [ ] Form inputs have labels
|
||||||
|
- [ ] Color is not the only indicator
|
||||||
|
- [ ] `prefers-reduced-motion` respected
|
||||||
26
.codex/skills/ui-ux-pro-max/data/charts.csv
Normal file
26
.codex/skills/ui-ux-pro-max/data/charts.csv
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
No,Data Type,Keywords,Best Chart Type,Secondary Options,Color Guidance,Performance Impact,Accessibility Notes,Library Recommendation,Interactive Level
|
||||||
|
1,Trend Over Time,"trend, time-series, line, growth, timeline, progress",Line Chart,"Area Chart, Smooth Area",Primary: #0080FF. Multiple series: use distinct colors. Fill: 20% opacity,⚡ Excellent (optimized),✓ Clear line patterns for colorblind users. Add pattern overlays.,"Chart.js, Recharts, ApexCharts",Hover + Zoom
|
||||||
|
2,Compare Categories,"compare, categories, bar, comparison, ranking",Bar Chart (Horizontal or Vertical),"Column Chart, Grouped Bar",Each bar: distinct color. Category: grouped same color. Sorted: descending order,⚡ Excellent,✓ Easy to compare. Add value labels on bars for clarity.,"Chart.js, Recharts, D3.js",Hover + Sort
|
||||||
|
3,Part-to-Whole,"part-to-whole, pie, donut, percentage, proportion, share",Pie Chart or Donut,"Stacked Bar, Treemap",Colors: 5-6 max. Contrasting palette. Large slices first. Use labels.,⚡ Good (limit 6 slices),⚠ Hard for accessibility. Better: Stacked bar with legend. Avoid pie if >5 items.,"Chart.js, Recharts, D3.js",Hover + Drill
|
||||||
|
4,Correlation/Distribution,"correlation, distribution, scatter, relationship, pattern",Scatter Plot or Bubble Chart,"Heat Map, Matrix",Color axis: gradient (blue-red). Size: relative. Opacity: 0.6-0.8 to show density,⚠ Moderate (many points),⚠ Provide data table alternative. Use pattern + color distinction.,"D3.js, Plotly, Recharts",Hover + Brush
|
||||||
|
5,Heatmap/Intensity,"heatmap, heat-map, intensity, density, matrix",Heat Map or Choropleth,"Grid Heat Map, Bubble Heat",Gradient: Cool (blue) to Hot (red). Scale: clear legend. Divergent for ±data,⚡ Excellent (color CSS),⚠ Colorblind: Use pattern overlay. Provide numerical legend.,"D3.js, Plotly, ApexCharts",Hover + Zoom
|
||||||
|
6,Geographic Data,"geographic, map, location, region, geo, spatial","Choropleth Map, Bubble Map",Geographic Heat Map,Regional: single color gradient or categorized colors. Legend: clear scale,⚠ Moderate (rendering),⚠ Include text labels for regions. Provide data table alternative.,"D3.js, Mapbox, Leaflet",Pan + Zoom + Drill
|
||||||
|
7,Funnel/Flow,funnel/flow,"Funnel Chart, Sankey",Waterfall (for flows),Stages: gradient (starting color → ending color). Show conversion %,⚡ Good,✓ Clear stage labels + percentages. Good for accessibility if labeled.,"D3.js, Recharts, Custom SVG",Hover + Drill
|
||||||
|
8,Performance vs Target,performance-vs-target,Gauge Chart or Bullet Chart,"Dial, Thermometer",Performance: Red→Yellow→Green gradient. Target: marker line. Threshold colors,⚡ Good,✓ Add numerical value + percentage label beside gauge.,"D3.js, ApexCharts, Custom SVG",Hover
|
||||||
|
9,Time-Series Forecast,time-series-forecast,Line with Confidence Band,Ribbon Chart,Actual: solid line #0080FF. Forecast: dashed #FF9500. Band: light shading,⚡ Good,✓ Clearly distinguish actual vs forecast. Add legend.,"Chart.js, ApexCharts, Plotly",Hover + Toggle
|
||||||
|
10,Anomaly Detection,anomaly-detection,Line Chart with Highlights,Scatter with Alert,Normal: blue #0080FF. Anomaly: red #FF0000 circle/square marker + alert,⚡ Good,✓ Circle/marker for anomalies. Add text alert annotation.,"D3.js, Plotly, ApexCharts",Hover + Alert
|
||||||
|
11,Hierarchical/Nested Data,hierarchical/nested-data,Treemap,"Sunburst, Nested Donut, Icicle",Parent: distinct hues. Children: lighter shades. White borders 2-3px.,⚠ Moderate,⚠ Poor - provide table alternative. Label large areas.,"D3.js, Recharts, ApexCharts",Hover + Drilldown
|
||||||
|
12,Flow/Process Data,flow/process-data,Sankey Diagram,"Alluvial, Chord Diagram",Gradient from source to target. Opacity 0.4-0.6 for flows.,⚠ Moderate,⚠ Poor - provide flow table alternative.,"D3.js (d3-sankey), Plotly",Hover + Drilldown
|
||||||
|
13,Cumulative Changes,cumulative-changes,Waterfall Chart,"Stacked Bar, Cascade",Increases: #4CAF50. Decreases: #F44336. Start: #2196F3. End: #0D47A1.,⚡ Good,✓ Good - clear directional colors with labels.,"ApexCharts, Highcharts, Plotly",Hover
|
||||||
|
14,Multi-Variable Comparison,multi-variable-comparison,Radar/Spider Chart,"Parallel Coordinates, Grouped Bar",Single: #0080FF 20% fill. Multiple: distinct colors per dataset.,⚡ Good,⚠ Moderate - limit 5-8 axes. Add data table.,"Chart.js, Recharts, ApexCharts",Hover + Toggle
|
||||||
|
15,Stock/Trading OHLC,stock/trading-ohlc,Candlestick Chart,"OHLC Bar, Heikin-Ashi",Bullish: #26A69A. Bearish: #EF5350. Volume: 40% opacity below.,⚡ Good,⚠ Moderate - provide OHLC data table.,"Lightweight Charts (TradingView), ApexCharts",Real-time + Hover + Zoom
|
||||||
|
16,Relationship/Connection Data,relationship/connection-data,Network Graph,"Hierarchical Tree, Adjacency Matrix",Node types: categorical colors. Edges: #90A4AE 60% opacity.,❌ Poor (500+ nodes struggles),❌ Very Poor - provide adjacency list alternative.,"D3.js (d3-force), Vis.js, Cytoscape.js",Drilldown + Hover + Drag
|
||||||
|
17,Distribution/Statistical,distribution/statistical,Box Plot,"Violin Plot, Beeswarm",Box: #BBDEFB. Border: #1976D2. Median: #D32F2F. Outliers: #F44336.,⚡ Excellent,"✓ Good - include stats table (min, Q1, median, Q3, max).","Plotly, D3.js, Chart.js (plugin)",Hover
|
||||||
|
18,Performance vs Target (Compact),performance-vs-target-(compact),Bullet Chart,"Gauge, Progress Bar","Ranges: #FFCDD2, #FFF9C4, #C8E6C9. Performance: #1976D2. Target: black 3px.",⚡ Excellent,✓ Excellent - compact with clear values.,"D3.js, Plotly, Custom SVG",Hover
|
||||||
|
19,Proportional/Percentage,proportional/percentage,Waffle Chart,"Pictogram, Stacked Bar 100%",10x10 grid. 3-5 categories max. 2-3px spacing between squares.,⚡ Good,✓ Good - better than pie for accessibility.,"D3.js, React-Waffle, Custom CSS Grid",Hover
|
||||||
|
20,Hierarchical Proportional,hierarchical-proportional,Sunburst Chart,"Treemap, Icicle, Circle Packing",Center to outer: darker to lighter. 15-20% lighter per level.,⚠ Moderate,⚠ Poor - provide hierarchy table alternative.,"D3.js (d3-hierarchy), Recharts, ApexCharts",Drilldown + Hover
|
||||||
|
21,Root Cause Analysis,"root cause, decomposition, tree, hierarchy, drill-down, ai-split",Decomposition Tree,"Decision Tree, Flow Chart",Nodes: #2563EB (Primary) vs #EF4444 (Negative impact). Connectors: Neutral grey.,⚠ Moderate (calculation heavy),✓ clear hierarchy. Allow keyboard navigation for nodes.,"Power BI (native), React-Flow, Custom D3.js",Drill + Expand
|
||||||
|
22,3D Spatial Data,"3d, spatial, immersive, terrain, molecular, volumetric",3D Scatter/Surface Plot,"Volumetric Rendering, Point Cloud",Depth cues: lighting/shading. Z-axis: color gradient (cool to warm).,❌ Heavy (WebGL required),❌ Poor - requires alternative 2D view or data table.,"Three.js, Deck.gl, Plotly 3D",Rotate + Zoom + VR
|
||||||
|
23,Real-Time Streaming,"streaming, real-time, ticker, live, velocity, pulse",Streaming Area Chart,"Ticker Tape, Moving Gauge",Current: Bright Pulse (#00FF00). History: Fading opacity. Grid: Dark.,⚡ Optimized (canvas/webgl),⚠ Flashing elements - provide pause button. High contrast.,Smoothed D3.js, CanvasJS
|
||||||
|
24,Sentiment/Emotion,"sentiment, emotion, nlp, opinion, feeling",Word Cloud with Sentiment,"Sentiment Arc, Radar Chart",Positive: #22C55E. Negative: #EF4444. Neutral: #94A3B8. Size = Frequency.,⚡ Good,⚠ Word clouds poor for screen readers. Use list view.,"D3-cloud, Highcharts, Nivo",Hover + Filter
|
||||||
|
25,Process Mining,"process, mining, variants, path, bottleneck, log",Process Map / Graph,"Directed Acyclic Graph (DAG), Petri Net",Happy path: #10B981 (Thick). Deviations: #F59E0B (Thin). Bottlenecks: #EF4444.,⚠ Moderate to Heavy,⚠ Complex graphs hard to navigate. Provide path summary.,"React-Flow, Cytoscape.js, Recharts",Drag + Node-Click
|
||||||
|
97
.codex/skills/ui-ux-pro-max/data/colors.csv
Normal file
97
.codex/skills/ui-ux-pro-max/data/colors.csv
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
No,Product Type,Primary (Hex),Secondary (Hex),CTA (Hex),Background (Hex),Text (Hex),Border (Hex),Notes
|
||||||
|
1,SaaS (General),#2563EB,#3B82F6,#F97316,#F8FAFC,#1E293B,#E2E8F0,Trust blue + orange CTA contrast
|
||||||
|
2,Micro SaaS,#6366F1,#818CF8,#10B981,#F5F3FF,#1E1B4B,#E0E7FF,Indigo primary + emerald CTA
|
||||||
|
3,E-commerce,#059669,#10B981,#F97316,#ECFDF5,#064E3B,#A7F3D0,Success green + urgency orange
|
||||||
|
4,E-commerce Luxury,#1C1917,#44403C,#CA8A04,#FAFAF9,#0C0A09,#D6D3D1,Premium dark + gold accent
|
||||||
|
5,Service Landing Page,#0EA5E9,#38BDF8,#F97316,#F0F9FF,#0C4A6E,#BAE6FD,Sky blue trust + warm CTA
|
||||||
|
6,B2B Service,#0F172A,#334155,#0369A1,#F8FAFC,#020617,#E2E8F0,Professional navy + blue CTA
|
||||||
|
7,Financial Dashboard,#0F172A,#1E293B,#22C55E,#020617,#F8FAFC,#334155,Dark bg + green positive indicators
|
||||||
|
8,Analytics Dashboard,#1E40AF,#3B82F6,#F59E0B,#F8FAFC,#1E3A8A,#DBEAFE,Blue data + amber highlights
|
||||||
|
9,Healthcare App,#0891B2,#22D3EE,#059669,#ECFEFF,#164E63,#A5F3FC,Calm cyan + health green
|
||||||
|
10,Educational App,#4F46E5,#818CF8,#F97316,#EEF2FF,#1E1B4B,#C7D2FE,Playful indigo + energetic orange
|
||||||
|
11,Creative Agency,#EC4899,#F472B6,#06B6D4,#FDF2F8,#831843,#FBCFE8,Bold pink + cyan accent
|
||||||
|
12,Portfolio/Personal,#18181B,#3F3F46,#2563EB,#FAFAFA,#09090B,#E4E4E7,Monochrome + blue accent
|
||||||
|
13,Gaming,#7C3AED,#A78BFA,#F43F5E,#0F0F23,#E2E8F0,#4C1D95,Neon purple + rose action
|
||||||
|
14,Government/Public Service,#0F172A,#334155,#0369A1,#F8FAFC,#020617,#E2E8F0,High contrast navy + blue
|
||||||
|
15,Fintech/Crypto,#F59E0B,#FBBF24,#8B5CF6,#0F172A,#F8FAFC,#334155,Gold trust + purple tech
|
||||||
|
16,Social Media App,#E11D48,#FB7185,#2563EB,#FFF1F2,#881337,#FECDD3,Vibrant rose + engagement blue
|
||||||
|
17,Productivity Tool,#0D9488,#14B8A6,#F97316,#F0FDFA,#134E4A,#99F6E4,Teal focus + action orange
|
||||||
|
18,Design System/Component Library,#4F46E5,#6366F1,#F97316,#EEF2FF,#312E81,#C7D2FE,Indigo brand + doc hierarchy
|
||||||
|
19,AI/Chatbot Platform,#7C3AED,#A78BFA,#06B6D4,#FAF5FF,#1E1B4B,#DDD6FE,AI purple + cyan interactions
|
||||||
|
20,NFT/Web3 Platform,#8B5CF6,#A78BFA,#FBBF24,#0F0F23,#F8FAFC,#4C1D95,Purple tech + gold value
|
||||||
|
21,Creator Economy Platform,#EC4899,#F472B6,#F97316,#FDF2F8,#831843,#FBCFE8,Creator pink + engagement orange
|
||||||
|
22,Sustainability/ESG Platform,#059669,#10B981,#0891B2,#ECFDF5,#064E3B,#A7F3D0,Nature green + ocean blue
|
||||||
|
23,Remote Work/Collaboration Tool,#6366F1,#818CF8,#10B981,#F5F3FF,#312E81,#E0E7FF,Calm indigo + success green
|
||||||
|
24,Mental Health App,#8B5CF6,#C4B5FD,#10B981,#FAF5FF,#4C1D95,#EDE9FE,Calming lavender + wellness green
|
||||||
|
25,Pet Tech App,#F97316,#FB923C,#2563EB,#FFF7ED,#9A3412,#FED7AA,Playful orange + trust blue
|
||||||
|
26,Smart Home/IoT Dashboard,#1E293B,#334155,#22C55E,#0F172A,#F8FAFC,#475569,Dark tech + status green
|
||||||
|
27,EV/Charging Ecosystem,#0891B2,#22D3EE,#22C55E,#ECFEFF,#164E63,#A5F3FC,Electric cyan + eco green
|
||||||
|
28,Subscription Box Service,#D946EF,#E879F9,#F97316,#FDF4FF,#86198F,#F5D0FE,Excitement purple + urgency orange
|
||||||
|
29,Podcast Platform,#1E1B4B,#312E81,#F97316,#0F0F23,#F8FAFC,#4338CA,Dark audio + warm accent
|
||||||
|
30,Dating App,#E11D48,#FB7185,#F97316,#FFF1F2,#881337,#FECDD3,Romantic rose + warm orange
|
||||||
|
31,Micro-Credentials/Badges Platform,#0369A1,#0EA5E9,#CA8A04,#F0F9FF,#0C4A6E,#BAE6FD,Trust blue + achievement gold
|
||||||
|
32,Knowledge Base/Documentation,#475569,#64748B,#2563EB,#F8FAFC,#1E293B,#E2E8F0,Neutral grey + link blue
|
||||||
|
33,Hyperlocal Services,#059669,#10B981,#F97316,#ECFDF5,#064E3B,#A7F3D0,Location green + action orange
|
||||||
|
34,Beauty/Spa/Wellness Service,#EC4899,#F9A8D4,#8B5CF6,#FDF2F8,#831843,#FBCFE8,Soft pink + lavender luxury
|
||||||
|
35,Luxury/Premium Brand,#1C1917,#44403C,#CA8A04,#FAFAF9,#0C0A09,#D6D3D1,Premium black + gold accent
|
||||||
|
36,Restaurant/Food Service,#DC2626,#F87171,#CA8A04,#FEF2F2,#450A0A,#FECACA,Appetizing red + warm gold
|
||||||
|
37,Fitness/Gym App,#F97316,#FB923C,#22C55E,#1F2937,#F8FAFC,#374151,Energy orange + success green
|
||||||
|
38,Real Estate/Property,#0F766E,#14B8A6,#0369A1,#F0FDFA,#134E4A,#99F6E4,Trust teal + professional blue
|
||||||
|
39,Travel/Tourism Agency,#0EA5E9,#38BDF8,#F97316,#F0F9FF,#0C4A6E,#BAE6FD,Sky blue + adventure orange
|
||||||
|
40,Hotel/Hospitality,#1E3A8A,#3B82F6,#CA8A04,#F8FAFC,#1E40AF,#BFDBFE,Luxury navy + gold service
|
||||||
|
41,Wedding/Event Planning,#DB2777,#F472B6,#CA8A04,#FDF2F8,#831843,#FBCFE8,Romantic pink + elegant gold
|
||||||
|
42,Legal Services,#1E3A8A,#1E40AF,#B45309,#F8FAFC,#0F172A,#CBD5E1,Authority navy + trust gold
|
||||||
|
43,Insurance Platform,#0369A1,#0EA5E9,#22C55E,#F0F9FF,#0C4A6E,#BAE6FD,Security blue + protected green
|
||||||
|
44,Banking/Traditional Finance,#0F172A,#1E3A8A,#CA8A04,#F8FAFC,#020617,#E2E8F0,Trust navy + premium gold
|
||||||
|
45,Online Course/E-learning,#0D9488,#2DD4BF,#F97316,#F0FDFA,#134E4A,#5EEAD4,Progress teal + achievement orange
|
||||||
|
46,Non-profit/Charity,#0891B2,#22D3EE,#F97316,#ECFEFF,#164E63,#A5F3FC,Compassion blue + action orange
|
||||||
|
47,Music Streaming,#1E1B4B,#4338CA,#22C55E,#0F0F23,#F8FAFC,#312E81,Dark audio + play green
|
||||||
|
48,Video Streaming/OTT,#0F0F23,#1E1B4B,#E11D48,#000000,#F8FAFC,#312E81,Cinema dark + play red
|
||||||
|
49,Job Board/Recruitment,#0369A1,#0EA5E9,#22C55E,#F0F9FF,#0C4A6E,#BAE6FD,Professional blue + success green
|
||||||
|
50,Marketplace (P2P),#7C3AED,#A78BFA,#22C55E,#FAF5FF,#4C1D95,#DDD6FE,Trust purple + transaction green
|
||||||
|
51,Logistics/Delivery,#2563EB,#3B82F6,#F97316,#EFF6FF,#1E40AF,#BFDBFE,Tracking blue + delivery orange
|
||||||
|
52,Agriculture/Farm Tech,#15803D,#22C55E,#CA8A04,#F0FDF4,#14532D,#BBF7D0,Earth green + harvest gold
|
||||||
|
53,Construction/Architecture,#64748B,#94A3B8,#F97316,#F8FAFC,#334155,#E2E8F0,Industrial grey + safety orange
|
||||||
|
54,Automotive/Car Dealership,#1E293B,#334155,#DC2626,#F8FAFC,#0F172A,#E2E8F0,Premium dark + action red
|
||||||
|
55,Photography Studio,#18181B,#27272A,#F8FAFC,#000000,#FAFAFA,#3F3F46,Pure black + white contrast
|
||||||
|
56,Coworking Space,#F59E0B,#FBBF24,#2563EB,#FFFBEB,#78350F,#FDE68A,Energetic amber + booking blue
|
||||||
|
57,Cleaning Service,#0891B2,#22D3EE,#22C55E,#ECFEFF,#164E63,#A5F3FC,Fresh cyan + clean green
|
||||||
|
58,Home Services (Plumber/Electrician),#1E40AF,#3B82F6,#F97316,#EFF6FF,#1E3A8A,#BFDBFE,Professional blue + urgent orange
|
||||||
|
59,Childcare/Daycare,#F472B6,#FBCFE8,#22C55E,#FDF2F8,#9D174D,#FCE7F3,Soft pink + safe green
|
||||||
|
60,Senior Care/Elderly,#0369A1,#38BDF8,#22C55E,#F0F9FF,#0C4A6E,#E0F2FE,Calm blue + reassuring green
|
||||||
|
61,Medical Clinic,#0891B2,#22D3EE,#22C55E,#F0FDFA,#134E4A,#CCFBF1,Medical teal + health green
|
||||||
|
62,Pharmacy/Drug Store,#15803D,#22C55E,#0369A1,#F0FDF4,#14532D,#BBF7D0,Pharmacy green + trust blue
|
||||||
|
63,Dental Practice,#0EA5E9,#38BDF8,#FBBF24,#F0F9FF,#0C4A6E,#BAE6FD,Fresh blue + smile yellow
|
||||||
|
64,Veterinary Clinic,#0D9488,#14B8A6,#F97316,#F0FDFA,#134E4A,#99F6E4,Caring teal + warm orange
|
||||||
|
65,Florist/Plant Shop,#15803D,#22C55E,#EC4899,#F0FDF4,#14532D,#BBF7D0,Natural green + floral pink
|
||||||
|
66,Bakery/Cafe,#92400E,#B45309,#F8FAFC,#FEF3C7,#78350F,#FDE68A,Warm brown + cream white
|
||||||
|
67,Coffee Shop,#78350F,#92400E,#FBBF24,#FEF3C7,#451A03,#FDE68A,Coffee brown + warm gold
|
||||||
|
68,Brewery/Winery,#7C2D12,#B91C1C,#CA8A04,#FEF2F2,#450A0A,#FECACA,Deep burgundy + craft gold
|
||||||
|
69,Airline,#1E3A8A,#3B82F6,#F97316,#EFF6FF,#1E40AF,#BFDBFE,Sky blue + booking orange
|
||||||
|
70,News/Media Platform,#DC2626,#EF4444,#1E40AF,#FEF2F2,#450A0A,#FECACA,Breaking red + link blue
|
||||||
|
71,Magazine/Blog,#18181B,#3F3F46,#EC4899,#FAFAFA,#09090B,#E4E4E7,Editorial black + accent pink
|
||||||
|
72,Freelancer Platform,#6366F1,#818CF8,#22C55E,#EEF2FF,#312E81,#C7D2FE,Creative indigo + hire green
|
||||||
|
73,Consulting Firm,#0F172A,#334155,#CA8A04,#F8FAFC,#020617,#E2E8F0,Authority navy + premium gold
|
||||||
|
74,Marketing Agency,#EC4899,#F472B6,#06B6D4,#FDF2F8,#831843,#FBCFE8,Bold pink + creative cyan
|
||||||
|
75,Event Management,#7C3AED,#A78BFA,#F97316,#FAF5FF,#4C1D95,#DDD6FE,Excitement purple + action orange
|
||||||
|
76,Conference/Webinar Platform,#1E40AF,#3B82F6,#22C55E,#EFF6FF,#1E3A8A,#BFDBFE,Professional blue + join green
|
||||||
|
77,Membership/Community,#7C3AED,#A78BFA,#22C55E,#FAF5FF,#4C1D95,#DDD6FE,Community purple + join green
|
||||||
|
78,Newsletter Platform,#0369A1,#0EA5E9,#F97316,#F0F9FF,#0C4A6E,#BAE6FD,Trust blue + subscribe orange
|
||||||
|
79,Digital Products/Downloads,#6366F1,#818CF8,#22C55E,#EEF2FF,#312E81,#C7D2FE,Digital indigo + buy green
|
||||||
|
80,Church/Religious Organization,#7C3AED,#A78BFA,#CA8A04,#FAF5FF,#4C1D95,#DDD6FE,Spiritual purple + warm gold
|
||||||
|
81,Sports Team/Club,#DC2626,#EF4444,#FBBF24,#FEF2F2,#7F1D1D,#FECACA,Team red + championship gold
|
||||||
|
82,Museum/Gallery,#18181B,#27272A,#F8FAFC,#FAFAFA,#09090B,#E4E4E7,Gallery black + white space
|
||||||
|
83,Theater/Cinema,#1E1B4B,#312E81,#CA8A04,#0F0F23,#F8FAFC,#4338CA,Dramatic dark + spotlight gold
|
||||||
|
84,Language Learning App,#4F46E5,#818CF8,#22C55E,#EEF2FF,#312E81,#C7D2FE,Learning indigo + progress green
|
||||||
|
85,Coding Bootcamp,#0F172A,#1E293B,#22C55E,#020617,#F8FAFC,#334155,Terminal dark + success green
|
||||||
|
86,Cybersecurity Platform,#00FF41,#0D0D0D,#FF3333,#000000,#E0E0E0,#1F1F1F,Matrix green + alert red
|
||||||
|
87,Developer Tool / IDE,#1E293B,#334155,#22C55E,#0F172A,#F8FAFC,#475569,Code dark + run green
|
||||||
|
88,Biotech / Life Sciences,#0EA5E9,#0284C7,#10B981,#F0F9FF,#0C4A6E,#BAE6FD,DNA blue + life green
|
||||||
|
89,Space Tech / Aerospace,#F8FAFC,#94A3B8,#3B82F6,#0B0B10,#F8FAFC,#1E293B,Star white + launch blue
|
||||||
|
90,Architecture / Interior,#171717,#404040,#D4AF37,#FFFFFF,#171717,#E5E5E5,Minimal black + accent gold
|
||||||
|
91,Quantum Computing,#00FFFF,#7B61FF,#FF00FF,#050510,#E0E0FF,#333344,Quantum cyan + interference purple
|
||||||
|
92,Biohacking / Longevity,#FF4D4D,#4D94FF,#00E676,#F5F5F7,#1C1C1E,#E5E5EA,Bio red/blue + vitality green
|
||||||
|
93,Autonomous Systems,#00FF41,#008F11,#FF3333,#0D1117,#E6EDF3,#30363D,Terminal green + alert red
|
||||||
|
94,Generative AI Art,#18181B,#3F3F46,#EC4899,#FAFAFA,#09090B,#E4E4E7,Canvas neutral + creative pink
|
||||||
|
95,Spatial / Vision OS,#FFFFFF,#E5E5E5,#007AFF,#888888,#000000,#CCCCCC,Glass white + system blue
|
||||||
|
96,Climate Tech,#059669,#10B981,#FBBF24,#ECFDF5,#064E3B,#A7F3D0,Nature green + solar gold
|
||||||
|
101
.codex/skills/ui-ux-pro-max/data/icons.csv
Normal file
101
.codex/skills/ui-ux-pro-max/data/icons.csv
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
No,Category,Icon Name,Keywords,Library,Import Code,Usage,Best For,Style
|
||||||
|
1,Navigation,menu,hamburger menu navigation toggle bars,Lucide,import { Menu } from 'lucide-react',<Menu />,Mobile navigation drawer toggle sidebar,Outline
|
||||||
|
2,Navigation,arrow-left,back previous return navigate,Lucide,import { ArrowLeft } from 'lucide-react',<ArrowLeft />,Back button breadcrumb navigation,Outline
|
||||||
|
3,Navigation,arrow-right,next forward continue navigate,Lucide,import { ArrowRight } from 'lucide-react',<ArrowRight />,Forward button next step CTA,Outline
|
||||||
|
4,Navigation,chevron-down,dropdown expand accordion select,Lucide,import { ChevronDown } from 'lucide-react',<ChevronDown />,Dropdown toggle accordion header,Outline
|
||||||
|
5,Navigation,chevron-up,collapse close accordion minimize,Lucide,import { ChevronUp } from 'lucide-react',<ChevronUp />,Accordion collapse minimize,Outline
|
||||||
|
6,Navigation,home,homepage main dashboard start,Lucide,import { Home } from 'lucide-react',<Home />,Home navigation main page,Outline
|
||||||
|
7,Navigation,x,close cancel dismiss remove exit,Lucide,import { X } from 'lucide-react',<X />,Modal close dismiss button,Outline
|
||||||
|
8,Navigation,external-link,open new tab external link,Lucide,import { ExternalLink } from 'lucide-react',<ExternalLink />,External link indicator,Outline
|
||||||
|
9,Action,plus,add create new insert,Lucide,import { Plus } from 'lucide-react',<Plus />,Add button create new item,Outline
|
||||||
|
10,Action,minus,remove subtract decrease delete,Lucide,import { Minus } from 'lucide-react',<Minus />,Remove item quantity decrease,Outline
|
||||||
|
11,Action,trash-2,delete remove discard bin,Lucide,import { Trash2 } from 'lucide-react',<Trash2 />,Delete action destructive,Outline
|
||||||
|
12,Action,edit,pencil modify change update,Lucide,import { Edit } from 'lucide-react',<Edit />,Edit button modify content,Outline
|
||||||
|
13,Action,save,disk store persist save,Lucide,import { Save } from 'lucide-react',<Save />,Save button persist changes,Outline
|
||||||
|
14,Action,download,export save file download,Lucide,import { Download } from 'lucide-react',<Download />,Download file export,Outline
|
||||||
|
15,Action,upload,import file attach upload,Lucide,import { Upload } from 'lucide-react',<Upload />,Upload file import,Outline
|
||||||
|
16,Action,copy,duplicate clipboard paste,Lucide,import { Copy } from 'lucide-react',<Copy />,Copy to clipboard,Outline
|
||||||
|
17,Action,share,social distribute send,Lucide,import { Share } from 'lucide-react',<Share />,Share button social,Outline
|
||||||
|
18,Action,search,find lookup filter query,Lucide,import { Search } from 'lucide-react',<Search />,Search input bar,Outline
|
||||||
|
19,Action,filter,sort refine narrow options,Lucide,import { Filter } from 'lucide-react',<Filter />,Filter dropdown sort,Outline
|
||||||
|
20,Action,settings,gear cog preferences config,Lucide,import { Settings } from 'lucide-react',<Settings />,Settings page configuration,Outline
|
||||||
|
21,Status,check,success done complete verified,Lucide,import { Check } from 'lucide-react',<Check />,Success state checkmark,Outline
|
||||||
|
22,Status,check-circle,success verified approved complete,Lucide,import { CheckCircle } from 'lucide-react',<CheckCircle />,Success badge verified,Outline
|
||||||
|
23,Status,x-circle,error failed cancel rejected,Lucide,import { XCircle } from 'lucide-react',<XCircle />,Error state failed,Outline
|
||||||
|
24,Status,alert-triangle,warning caution attention danger,Lucide,import { AlertTriangle } from 'lucide-react',<AlertTriangle />,Warning message caution,Outline
|
||||||
|
25,Status,alert-circle,info notice information help,Lucide,import { AlertCircle } from 'lucide-react',<AlertCircle />,Info notice alert,Outline
|
||||||
|
26,Status,info,information help tooltip details,Lucide,import { Info } from 'lucide-react',<Info />,Information tooltip help,Outline
|
||||||
|
27,Status,loader,loading spinner processing wait,Lucide,import { Loader } from 'lucide-react',<Loader className="animate-spin" />,Loading state spinner,Outline
|
||||||
|
28,Status,clock,time schedule pending wait,Lucide,import { Clock } from 'lucide-react',<Clock />,Pending time schedule,Outline
|
||||||
|
29,Communication,mail,email message inbox letter,Lucide,import { Mail } from 'lucide-react',<Mail />,Email contact inbox,Outline
|
||||||
|
30,Communication,message-circle,chat comment bubble conversation,Lucide,import { MessageCircle } from 'lucide-react',<MessageCircle />,Chat comment message,Outline
|
||||||
|
31,Communication,phone,call mobile telephone contact,Lucide,import { Phone } from 'lucide-react',<Phone />,Phone contact call,Outline
|
||||||
|
32,Communication,send,submit dispatch message airplane,Lucide,import { Send } from 'lucide-react',<Send />,Send message submit,Outline
|
||||||
|
33,Communication,bell,notification alert ring reminder,Lucide,import { Bell } from 'lucide-react',<Bell />,Notification bell alert,Outline
|
||||||
|
34,User,user,profile account person avatar,Lucide,import { User } from 'lucide-react',<User />,User profile account,Outline
|
||||||
|
35,User,users,team group people members,Lucide,import { Users } from 'lucide-react',<Users />,Team group members,Outline
|
||||||
|
36,User,user-plus,add invite new member,Lucide,import { UserPlus } from 'lucide-react',<UserPlus />,Add user invite,Outline
|
||||||
|
37,User,log-in,signin authenticate enter,Lucide,import { LogIn } from 'lucide-react',<LogIn />,Login signin,Outline
|
||||||
|
38,User,log-out,signout exit leave logout,Lucide,import { LogOut } from 'lucide-react',<LogOut />,Logout signout,Outline
|
||||||
|
39,Media,image,photo picture gallery thumbnail,Lucide,import { Image } from 'lucide-react',<Image />,Image photo gallery,Outline
|
||||||
|
40,Media,video,movie film play record,Lucide,import { Video } from 'lucide-react',<Video />,Video player media,Outline
|
||||||
|
41,Media,play,start video audio media,Lucide,import { Play } from 'lucide-react',<Play />,Play button video audio,Outline
|
||||||
|
42,Media,pause,stop halt video audio,Lucide,import { Pause } from 'lucide-react',<Pause />,Pause button media,Outline
|
||||||
|
43,Media,volume-2,sound audio speaker music,Lucide,import { Volume2 } from 'lucide-react',<Volume2 />,Volume audio sound,Outline
|
||||||
|
44,Media,mic,microphone record voice audio,Lucide,import { Mic } from 'lucide-react',<Mic />,Microphone voice record,Outline
|
||||||
|
45,Media,camera,photo capture snapshot picture,Lucide,import { Camera } from 'lucide-react',<Camera />,Camera photo capture,Outline
|
||||||
|
46,Commerce,shopping-cart,cart checkout basket buy,Lucide,import { ShoppingCart } from 'lucide-react',<ShoppingCart />,Shopping cart e-commerce,Outline
|
||||||
|
47,Commerce,shopping-bag,purchase buy store bag,Lucide,import { ShoppingBag } from 'lucide-react',<ShoppingBag />,Shopping bag purchase,Outline
|
||||||
|
48,Commerce,credit-card,payment card checkout stripe,Lucide,import { CreditCard } from 'lucide-react',<CreditCard />,Payment credit card,Outline
|
||||||
|
49,Commerce,dollar-sign,money price currency cost,Lucide,import { DollarSign } from 'lucide-react',<DollarSign />,Price money currency,Outline
|
||||||
|
50,Commerce,tag,label price discount sale,Lucide,import { Tag } from 'lucide-react',<Tag />,Price tag label,Outline
|
||||||
|
51,Commerce,gift,present reward bonus offer,Lucide,import { Gift } from 'lucide-react',<Gift />,Gift reward offer,Outline
|
||||||
|
52,Commerce,percent,discount sale offer promo,Lucide,import { Percent } from 'lucide-react',<Percent />,Discount percentage sale,Outline
|
||||||
|
53,Data,bar-chart,analytics statistics graph metrics,Lucide,import { BarChart } from 'lucide-react',<BarChart />,Bar chart analytics,Outline
|
||||||
|
54,Data,pie-chart,statistics distribution breakdown,Lucide,import { PieChart } from 'lucide-react',<PieChart />,Pie chart distribution,Outline
|
||||||
|
55,Data,trending-up,growth increase positive trend,Lucide,import { TrendingUp } from 'lucide-react',<TrendingUp />,Growth trend positive,Outline
|
||||||
|
56,Data,trending-down,decline decrease negative trend,Lucide,import { TrendingDown } from 'lucide-react',<TrendingDown />,Decline trend negative,Outline
|
||||||
|
57,Data,activity,pulse heartbeat monitor live,Lucide,import { Activity } from 'lucide-react',<Activity />,Activity monitor pulse,Outline
|
||||||
|
58,Data,database,storage server data backend,Lucide,import { Database } from 'lucide-react',<Database />,Database storage,Outline
|
||||||
|
59,Files,file,document page paper doc,Lucide,import { File } from 'lucide-react',<File />,File document,Outline
|
||||||
|
60,Files,file-text,document text page article,Lucide,import { FileText } from 'lucide-react',<FileText />,Text document article,Outline
|
||||||
|
61,Files,folder,directory organize group files,Lucide,import { Folder } from 'lucide-react',<Folder />,Folder directory,Outline
|
||||||
|
62,Files,folder-open,expanded browse files view,Lucide,import { FolderOpen } from 'lucide-react',<FolderOpen />,Open folder browse,Outline
|
||||||
|
63,Files,paperclip,attachment attach file link,Lucide,import { Paperclip } from 'lucide-react',<Paperclip />,Attachment paperclip,Outline
|
||||||
|
64,Files,link,url hyperlink chain connect,Lucide,import { Link } from 'lucide-react',<Link />,Link URL hyperlink,Outline
|
||||||
|
65,Files,clipboard,paste copy buffer notes,Lucide,import { Clipboard } from 'lucide-react',<Clipboard />,Clipboard paste,Outline
|
||||||
|
66,Layout,grid,tiles gallery layout dashboard,Lucide,import { Grid } from 'lucide-react',<Grid />,Grid layout gallery,Outline
|
||||||
|
67,Layout,list,rows table lines items,Lucide,import { List } from 'lucide-react',<List />,List view rows,Outline
|
||||||
|
68,Layout,columns,layout split dual sidebar,Lucide,import { Columns } from 'lucide-react',<Columns />,Column layout split,Outline
|
||||||
|
69,Layout,maximize,fullscreen expand enlarge zoom,Lucide,import { Maximize } from 'lucide-react',<Maximize />,Fullscreen maximize,Outline
|
||||||
|
70,Layout,minimize,reduce shrink collapse exit,Lucide,import { Minimize } from 'lucide-react',<Minimize />,Minimize reduce,Outline
|
||||||
|
71,Layout,sidebar,panel drawer navigation menu,Lucide,import { Sidebar } from 'lucide-react',<Sidebar />,Sidebar panel,Outline
|
||||||
|
72,Social,heart,like love favorite wishlist,Lucide,import { Heart } from 'lucide-react',<Heart />,Like favorite love,Outline
|
||||||
|
73,Social,star,rating review favorite bookmark,Lucide,import { Star } from 'lucide-react',<Star />,Star rating favorite,Outline
|
||||||
|
74,Social,thumbs-up,like approve agree positive,Lucide,import { ThumbsUp } from 'lucide-react',<ThumbsUp />,Like approve thumb,Outline
|
||||||
|
75,Social,thumbs-down,dislike disapprove disagree negative,Lucide,import { ThumbsDown } from 'lucide-react',<ThumbsDown />,Dislike disapprove,Outline
|
||||||
|
76,Social,bookmark,save later favorite mark,Lucide,import { Bookmark } from 'lucide-react',<Bookmark />,Bookmark save,Outline
|
||||||
|
77,Social,flag,report mark important highlight,Lucide,import { Flag } from 'lucide-react',<Flag />,Flag report,Outline
|
||||||
|
78,Device,smartphone,mobile phone device touch,Lucide,import { Smartphone } from 'lucide-react',<Smartphone />,Mobile smartphone,Outline
|
||||||
|
79,Device,tablet,ipad device touch screen,Lucide,import { Tablet } from 'lucide-react',<Tablet />,Tablet device,Outline
|
||||||
|
80,Device,monitor,desktop screen computer display,Lucide,import { Monitor } from 'lucide-react',<Monitor />,Desktop monitor,Outline
|
||||||
|
81,Device,laptop,notebook computer portable device,Lucide,import { Laptop } from 'lucide-react',<Laptop />,Laptop computer,Outline
|
||||||
|
82,Device,printer,print document output paper,Lucide,import { Printer } from 'lucide-react',<Printer />,Printer print,Outline
|
||||||
|
83,Security,lock,secure password protected private,Lucide,import { Lock } from 'lucide-react',<Lock />,Lock secure,Outline
|
||||||
|
84,Security,unlock,open access unsecure public,Lucide,import { Unlock } from 'lucide-react',<Unlock />,Unlock open,Outline
|
||||||
|
85,Security,shield,protection security safe guard,Lucide,import { Shield } from 'lucide-react',<Shield />,Shield protection,Outline
|
||||||
|
86,Security,key,password access unlock login,Lucide,import { Key } from 'lucide-react',<Key />,Key password,Outline
|
||||||
|
87,Security,eye,view show visible password,Lucide,import { Eye } from 'lucide-react',<Eye />,Show password view,Outline
|
||||||
|
88,Security,eye-off,hide invisible password hidden,Lucide,import { EyeOff } from 'lucide-react',<EyeOff />,Hide password,Outline
|
||||||
|
89,Location,map-pin,location marker place address,Lucide,import { MapPin } from 'lucide-react',<MapPin />,Location pin marker,Outline
|
||||||
|
90,Location,map,directions navigate geography location,Lucide,import { Map } from 'lucide-react',<Map />,Map directions,Outline
|
||||||
|
91,Location,navigation,compass direction pointer arrow,Lucide,import { Navigation } from 'lucide-react',<Navigation />,Navigation compass,Outline
|
||||||
|
92,Location,globe,world international global web,Lucide,import { Globe } from 'lucide-react',<Globe />,Globe world,Outline
|
||||||
|
93,Time,calendar,date schedule event appointment,Lucide,import { Calendar } from 'lucide-react',<Calendar />,Calendar date,Outline
|
||||||
|
94,Time,refresh-cw,reload sync update refresh,Lucide,import { RefreshCw } from 'lucide-react',<RefreshCw />,Refresh reload,Outline
|
||||||
|
95,Time,rotate-ccw,undo back revert history,Lucide,import { RotateCcw } from 'lucide-react',<RotateCcw />,Undo revert,Outline
|
||||||
|
96,Time,rotate-cw,redo forward repeat history,Lucide,import { RotateCw } from 'lucide-react',<RotateCw />,Redo forward,Outline
|
||||||
|
97,Development,code,develop programming syntax html,Lucide,import { Code } from 'lucide-react',<Code />,Code development,Outline
|
||||||
|
98,Development,terminal,console cli command shell,Lucide,import { Terminal } from 'lucide-react',<Terminal />,Terminal console,Outline
|
||||||
|
99,Development,git-branch,version control branch merge,Lucide,import { GitBranch } from 'lucide-react',<GitBranch />,Git branch,Outline
|
||||||
|
100,Development,github,repository code open source,Lucide,import { Github } from 'lucide-react',<Github />,GitHub repository,Outline
|
||||||
|
Can't render this file because it contains an unexpected character in line 28 and column 113.
|
31
.codex/skills/ui-ux-pro-max/data/landing.csv
Normal file
31
.codex/skills/ui-ux-pro-max/data/landing.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
No,Pattern Name,Keywords,Section Order,Primary CTA Placement,Color Strategy,Recommended Effects,Conversion Optimization
|
||||||
|
1,Hero + Features + CTA,"hero, hero-centric, features, feature-rich, cta, call-to-action","1. Hero with headline/image, 2. Value prop, 3. Key features (3-5), 4. CTA section, 5. Footer",Hero (sticky) + Bottom,Hero: Brand primary or vibrant. Features: Card bg #FAFAFA. CTA: Contrasting accent color,"Hero parallax, feature card hover lift, CTA glow on hover",Deep CTA placement. Use contrasting color (at least 7:1 contrast ratio). Sticky navbar CTA.
|
||||||
|
2,Hero + Testimonials + CTA,"hero, testimonials, social-proof, trust, reviews, cta","1. Hero, 2. Problem statement, 3. Solution overview, 4. Testimonials carousel, 5. CTA",Hero (sticky) + Post-testimonials,"Hero: Brand color. Testimonials: Light bg #F5F5F5. Quotes: Italic, muted color #666. CTA: Vibrant","Testimonial carousel slide animations, quote marks animations, avatar fade-in",Social proof before CTA. Use 3-5 testimonials. Include photo + name + role. CTA after social proof.
|
||||||
|
3,Product Demo + Features,"demo, product-demo, features, showcase, interactive","1. Hero, 2. Product video/mockup (center), 3. Feature breakdown per section, 4. Comparison (optional), 5. CTA",Video center + CTA right/bottom,Video surround: Brand color overlay. Features: Icon color #0080FF. Text: Dark #222,"Video play button pulse, feature scroll reveals, demo interaction highlights",Embedded product demo increases engagement. Use interactive mockup if possible. Auto-play video muted.
|
||||||
|
4,Minimal Single Column,"minimal, simple, direct, single-column, clean","1. Hero headline, 2. Short description, 3. Benefit bullets (3 max), 4. CTA, 5. Footer","Center, large CTA button",Minimalist: Brand + white #FFFFFF + accent. Buttons: High contrast 7:1+. Text: Black/Dark grey,Minimal hover effects. Smooth scroll. CTA scale on hover (subtle),Single CTA focus. Large typography. Lots of whitespace. No nav clutter. Mobile-first.
|
||||||
|
5,Funnel (3-Step Conversion),"funnel, conversion, steps, wizard, onboarding","1. Hero, 2. Step 1 (problem), 3. Step 2 (solution), 4. Step 3 (action), 5. CTA progression",Each step: mini-CTA. Final: main CTA,"Step colors: 1 (Red/Problem), 2 (Orange/Process), 3 (Green/Solution). CTA: Brand color","Step number animations, progress bar fill, step transitions smooth scroll",Progressive disclosure. Show only essential info per step. Use progress indicators. Multiple CTAs.
|
||||||
|
6,Comparison Table + CTA,"comparison, table, compare, versus, cta","1. Hero, 2. Problem intro, 3. Comparison table (product vs competitors), 4. Pricing (optional), 5. CTA",Table: Right column. CTA: Below table,Table: Alternating rows (white/light grey). Your product: Highlight #FFFACD (light yellow) or green. Text: Dark,"Table row hover highlight, price toggle animations, feature checkmark animations",Use comparison to show unique value. Highlight your product row. Include 'free trial' in pricing row.
|
||||||
|
7,Lead Magnet + Form,"lead, form, signup, capture, email, magnet","1. Hero (benefit headline), 2. Lead magnet preview (ebook cover, checklist, etc), 3. Form (minimal fields), 4. CTA submit",Form CTA: Submit button,Lead magnet: Professional design. Form: Clean white bg. Inputs: Light border #CCCCCC. CTA: Brand color,"Form focus state animations, input validation animations, success confirmation animation",Form fields ≤ 3 for best conversion. Offer valuable lead magnet preview. Show form submission progress.
|
||||||
|
8,Pricing Page + CTA,"pricing, plans, tiers, comparison, cta","1. Hero (pricing headline), 2. Price comparison cards, 3. Feature comparison table, 4. FAQ section, 5. Final CTA",Each card: CTA button. Sticky CTA in nav,"Free: Grey, Starter: Blue, Pro: Green/Gold, Enterprise: Dark. Cards: 1px border, shadow","Price toggle animation (monthly/yearly), card comparison highlight, FAQ accordion open/close",Recommend starter plan (pre-select/highlight). Show annual discount (20-30%). Use FAQs to address concerns.
|
||||||
|
9,Video-First Hero,"video, hero, media, visual, engaging","1. Hero with video background, 2. Key features overlay, 3. Benefits section, 4. CTA",Overlay on video (center/bottom) + Bottom section,Dark overlay 60% on video. Brand accent for CTA. White text on dark.,"Video autoplay muted, parallax scroll, text fade-in on scroll",86% higher engagement with video. Add captions for accessibility. Compress video for performance.
|
||||||
|
10,Scroll-Triggered Storytelling,"storytelling, scroll, narrative, story, immersive","1. Intro hook, 2. Chapter 1 (problem), 3. Chapter 2 (journey), 4. Chapter 3 (solution), 5. Climax CTA",End of each chapter (mini) + Final climax CTA,Progressive reveal. Each chapter has distinct color. Building intensity.,"ScrollTrigger animations, parallax layers, progressive disclosure, chapter transitions",Narrative increases time-on-page 3x. Use progress indicator. Mobile: simplify animations.
|
||||||
|
11,AI Personalization Landing,"ai, personalization, smart, recommendation, dynamic","1. Dynamic hero (personalized), 2. Relevant features, 3. Tailored testimonials, 4. Smart CTA",Context-aware placement based on user segment,Adaptive based on user data. A/B test color variations per segment.,"Dynamic content swap, fade transitions, personalized product recommendations",20%+ conversion with personalization. Requires analytics integration. Fallback for new users.
|
||||||
|
12,Waitlist/Coming Soon,"waitlist, coming-soon, launch, early-access, notify","1. Hero with countdown, 2. Product teaser/preview, 3. Email capture form, 4. Social proof (waitlist count)",Email form prominent (above fold) + Sticky form on scroll,Anticipation: Dark + accent highlights. Countdown in brand color. Urgency indicators.,"Countdown timer animation, email validation feedback, success confetti, social share buttons",Scarcity + exclusivity. Show waitlist count. Early access benefits. Referral program.
|
||||||
|
13,Comparison Table Focus,"comparison, table, versus, compare, features","1. Hero (problem statement), 2. Comparison matrix (you vs competitors), 3. Feature deep-dive, 4. Winner CTA",After comparison table (highlighted row) + Bottom,Your product column highlighted (accent bg or green). Competitors neutral. Checkmarks green.,"Table row hover highlight, feature checkmark animations, sticky comparison header",Show value vs competitors. 35% higher conversion. Be factual. Include pricing if favorable.
|
||||||
|
14,Pricing-Focused Landing,"pricing, price, cost, plans, subscription","1. Hero (value proposition), 2. Pricing cards (3 tiers), 3. Feature comparison, 4. FAQ, 5. Final CTA",Each pricing card + Sticky CTA in nav + Bottom,Popular plan highlighted (brand color border/bg). Free: grey. Enterprise: dark/premium.,"Price toggle monthly/annual animation, card hover lift, FAQ accordion smooth open",Annual discount 20-30%. Recommend mid-tier (most popular badge). Address objections in FAQ.
|
||||||
|
15,App Store Style Landing,"app, mobile, download, store, install","1. Hero with device mockup, 2. Screenshots carousel, 3. Features with icons, 4. Reviews/ratings, 5. Download CTAs",Download buttons prominent (App Store + Play Store) throughout,Dark/light matching app store feel. Star ratings in gold. Screenshots with device frames.,"Device mockup rotations, screenshot slider, star rating animations, download button pulse",Show real screenshots. Include ratings (4.5+ stars). QR code for mobile. Platform-specific CTAs.
|
||||||
|
16,FAQ/Documentation Landing,"faq, documentation, help, support, questions","1. Hero with search bar, 2. Popular categories, 3. FAQ accordion, 4. Contact/support CTA",Search bar prominent + Contact CTA for unresolved questions,"Clean, high readability. Minimal color. Category icons in brand color. Success green for resolved.","Search autocomplete, smooth accordion open/close, category hover, helpful feedback buttons",Reduce support tickets. Track search analytics. Show related articles. Contact escalation path.
|
||||||
|
17,Immersive/Interactive Experience,"immersive, interactive, experience, 3d, animation","1. Full-screen interactive element, 2. Guided product tour, 3. Key benefits revealed, 4. CTA after completion",After interaction complete + Skip option for impatient users,Immersive experience colors. Dark background for focus. Highlight interactive elements.,"WebGL, 3D interactions, gamification elements, progress indicators, reward animations",40% higher engagement. Performance trade-off. Provide skip option. Mobile fallback essential.
|
||||||
|
18,Event/Conference Landing,"event, conference, meetup, registration, schedule","1. Hero (date/location/countdown), 2. Speakers grid, 3. Agenda/schedule, 4. Sponsors, 5. Register CTA",Register CTA sticky + After speakers + Bottom,Urgency colors (countdown). Event branding. Speaker cards professional. Sponsor logos neutral.,"Countdown timer, speaker hover cards with bio, agenda tabs, early bird countdown",Early bird pricing with deadline. Social proof (past attendees). Speaker credibility. Multi-ticket discounts.
|
||||||
|
19,Product Review/Ratings Focused,"reviews, ratings, testimonials, social-proof, stars","1. Hero (product + aggregate rating), 2. Rating breakdown, 3. Individual reviews, 4. Buy/CTA",After reviews summary + Buy button alongside reviews,Trust colors. Star ratings gold. Verified badge green. Review sentiment colors.,"Star fill animations, review filtering, helpful vote interactions, photo lightbox",User-generated content builds trust. Show verified purchases. Filter by rating. Respond to negative reviews.
|
||||||
|
20,Community/Forum Landing,"community, forum, social, members, discussion","1. Hero (community value prop), 2. Popular topics/categories, 3. Active members showcase, 4. Join CTA",Join button prominent + After member showcase,"Warm, welcoming. Member photos add humanity. Topic badges in brand colors. Activity indicators green.","Member avatars animation, activity feed live updates, topic hover previews, join success celebration","Show active community (member count, posts today). Highlight benefits. Preview content. Easy onboarding."
|
||||||
|
21,Before-After Transformation,"before-after, transformation, results, comparison","1. Hero (problem state), 2. Transformation slider/comparison, 3. How it works, 4. Results CTA",After transformation reveal + Bottom,Contrast: muted/grey (before) vs vibrant/colorful (after). Success green for results.,"Slider comparison interaction, before/after reveal animations, result counters, testimonial videos",Visual proof of value. 45% higher conversion. Real results. Specific metrics. Guarantee offer.
|
||||||
|
22,Marketplace / Directory,"marketplace, directory, search, listing","1. Hero (Search focused), 2. Categories, 3. Featured Listings, 4. Trust/Safety, 5. CTA (Become a host/seller)",Hero Search Bar + Navbar 'List your item',Search: High contrast. Categories: Visual icons. Trust: Blue/Green.,Search autocomplete animation," map hover pins, card carousel, Search bar is the CTA. Reduce friction to search. Popular searches suggestions."
|
||||||
|
23,Newsletter / Content First,"newsletter, content, writer, blog, subscribe","1. Hero (Value Prop + Form), 2. Recent Issues/Archives, 3. Social Proof (Subscriber count), 4. About Author",Hero inline form + Sticky header form,Minimalist. Paper-like background. Text focus. Accent color for Subscribe.,Text highlight animations," typewriter effect, subtle fade-in, Single field form (Email only). Show 'Join X, 000 readers'. Read sample link."
|
||||||
|
24,Webinar Registration,"webinar, registration, event, training, live","1. Hero (Topic + Timer + Form), 2. What you'll learn, 3. Speaker Bio, 4. Urgency/Bonuses, 5. Form (again)",Hero (Right side form) + Bottom anchor,Urgency: Red/Orange. Professional: Blue/Navy. Form: High contrast white.,Countdown timer," speaker avatar float, urgent ticker, Limited seats logic. 'Live' indicator. Auto-fill timezone."
|
||||||
|
25,Enterprise Gateway,"enterprise, corporate, gateway, solutions, portal","1. Hero (Video/Mission), 2. Solutions by Industry, 3. Solutions by Role, 4. Client Logos, 5. Contact Sales",Contact Sales (Primary) + Login (Secondary),Corporate: Navy/Grey. High integrity. Conservative accents.,Slow video background," logo carousel, tab switching for industries, Path selection (I am a...). Mega menu navigation. Trust signals prominent."
|
||||||
|
26,Portfolio Grid,"portfolio, grid, showcase, gallery, masonry","1. Hero (Name/Role), 2. Project Grid (Masonry), 3. About/Philosophy, 4. Contact",Project Card Hover + Footer Contact,Neutral background (let work shine). Text: Black/White. Accent: Minimal.,Image lazy load reveal," hover overlay info, lightbox view, Visuals first. Filter by category. Fast loading essential."
|
||||||
|
27,Horizontal Scroll Journey,"horizontal, scroll, journey, gallery, storytelling, panoramic","1. Intro (Vertical), 2. The Journey (Horizontal Track), 3. Detail Reveal, 4. Vertical Footer",Floating Sticky CTA or End of Horizontal Track,Continuous palette transition. Chapter colors. Progress bar #000000.,"Scroll-jacking (careful), parallax layers, horizontal slide, progress indicator","Immersive product discovery. High engagement. Keep navigation visible.
|
||||||
|
28,Bento Grid Showcase,bento, grid, features, modular, apple-style, showcase"", 1. Hero, 2. Bento Grid (Key Features), 3. Detail Cards, 4. Tech Specs, 5. CTA, Floating Action Button or Bottom of Grid, Card backgrounds: #F5F5F7 or Glass. Icons: Vibrant brand colors. Text: Dark., Hover card scale (1.02), video inside cards, tilt effect, staggered reveal, Scannable value props. High information density without clutter. Mobile stack.
|
||||||
|
29,Interactive 3D Configurator,3d, configurator, customizer, interactive, product"", 1. Hero (Configurator), 2. Feature Highlight (synced), 3. Price/Specs, 4. Purchase, Inside Configurator UI + Sticky Bottom Bar, Neutral studio background. Product: Realistic materials. UI: Minimal overlay., Real-time rendering, material swap animation, camera rotate/zoom, light reflection, Increases ownership feeling. 360 view reduces return rates. Direct add-to-cart.
|
||||||
|
30,AI-Driven Dynamic Landing,ai, dynamic, personalized, adaptive, generative"", 1. Prompt/Input Hero, 2. Generated Result Preview, 3. How it Works, 4. Value Prop, Input Field (Hero) + 'Try it' Buttons, Adaptive to user input. Dark mode for compute feel. Neon accents., Typing text effects, shimmering generation loaders, morphing layouts, Immediate value demonstration. 'Show, don't tell'. Low friction start."
|
||||||
|
97
.codex/skills/ui-ux-pro-max/data/products.csv
Normal file
97
.codex/skills/ui-ux-pro-max/data/products.csv
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
No,Product Type,Keywords,Primary Style Recommendation,Secondary Styles,Landing Page Pattern,Dashboard Style (if applicable),Color Palette Focus,Key Considerations
|
||||||
|
1,SaaS (General),"app, b2b, cloud, general, saas, software, subscription",Glassmorphism + Flat Design,"Soft UI Evolution, Minimalism",Hero + Features + CTA,Data-Dense + Real-Time Monitoring,Trust blue + accent contrast,Balance modern feel with clarity. Focus on CTAs.
|
||||||
|
2,Micro SaaS,"app, b2b, cloud, indie, micro, micro-saas, niche, saas, small, software, solo, subscription",Flat Design + Vibrant & Block,"Motion-Driven, Micro-interactions",Minimal & Direct + Demo,Executive Dashboard,Vibrant primary + white space,"Keep simple, show product quickly. Speed is key."
|
||||||
|
3,E-commerce,"buy, commerce, e, ecommerce, products, retail, sell, shop, store",Vibrant & Block-based,"Aurora UI, Motion-Driven",Feature-Rich Showcase,Sales Intelligence Dashboard,Brand primary + success green,Engagement & conversions. High visual hierarchy.
|
||||||
|
4,E-commerce Luxury,"buy, commerce, e, ecommerce, elegant, exclusive, high-end, luxury, premium, products, retail, sell, shop, store",Liquid Glass + Glassmorphism,"3D & Hyperrealism, Aurora UI",Feature-Rich Showcase,Sales Intelligence Dashboard,Premium colors + minimal accent,Elegance & sophistication. Premium materials.
|
||||||
|
5,Service Landing Page,"appointment, booking, consultation, conversion, landing, marketing, page, service",Hero-Centric + Trust & Authority,"Social Proof-Focused, Storytelling",Hero-Centric Design,N/A - Analytics for conversions,Brand primary + trust colors,Social proof essential. Show expertise.
|
||||||
|
6,B2B Service,"appointment, b, b2b, booking, business, consultation, corporate, enterprise, service",Trust & Authority + Minimal,"Feature-Rich, Conversion-Optimized",Feature-Rich Showcase,Sales Intelligence Dashboard,Professional blue + neutral grey,Credibility essential. Clear ROI messaging.
|
||||||
|
7,Financial Dashboard,"admin, analytics, dashboard, data, financial, panel",Dark Mode (OLED) + Data-Dense,"Minimalism, Accessible & Ethical",N/A - Dashboard focused,Financial Dashboard,Dark bg + red/green alerts + trust blue,"High contrast, real-time updates, accuracy paramount."
|
||||||
|
8,Analytics Dashboard,"admin, analytics, dashboard, data, panel",Data-Dense + Heat Map & Heatmap,"Minimalism, Dark Mode (OLED)",N/A - Analytics focused,Drill-Down Analytics + Comparative,Cool→Hot gradients + neutral grey,Clarity > aesthetics. Color-coded data priority.
|
||||||
|
9,Healthcare App,"app, clinic, health, healthcare, medical, patient",Neumorphism + Accessible & Ethical,"Soft UI Evolution, Claymorphism (for patients)",Social Proof-Focused,User Behavior Analytics,Calm blue + health green + trust,Accessibility mandatory. Calming aesthetic.
|
||||||
|
10,Educational App,"app, course, education, educational, learning, school, training",Claymorphism + Micro-interactions,"Vibrant & Block-based, Flat Design",Storytelling-Driven,User Behavior Analytics,Playful colors + clear hierarchy,Engagement & ease of use. Age-appropriate design.
|
||||||
|
11,Creative Agency,"agency, creative, design, marketing, studio",Brutalism + Motion-Driven,"Retro-Futurism, Storytelling-Driven",Storytelling-Driven,N/A - Portfolio focused,Bold primaries + artistic freedom,Differentiation key. Wow-factor necessary.
|
||||||
|
12,Portfolio/Personal,"creative, personal, portfolio, projects, showcase, work",Motion-Driven + Minimalism,"Brutalism, Aurora UI",Storytelling-Driven,N/A - Personal branding,Brand primary + artistic interpretation,Showcase work. Personality shine through.
|
||||||
|
13,Gaming,"entertainment, esports, game, gaming, play",3D & Hyperrealism + Retro-Futurism,"Motion-Driven, Vibrant & Block",Feature-Rich Showcase,N/A - Game focused,Vibrant + neon + immersive colors,Immersion priority. Performance critical.
|
||||||
|
14,Government/Public Service,"appointment, booking, consultation, government, public, service",Accessible & Ethical + Minimalism,"Flat Design, Inclusive Design",Minimal & Direct,Executive Dashboard,Professional blue + high contrast,WCAG AAA mandatory. Trust paramount.
|
||||||
|
15,Fintech/Crypto,"banking, blockchain, crypto, defi, finance, fintech, money, nft, payment, web3",Glassmorphism + Dark Mode (OLED),"Retro-Futurism, Motion-Driven",Conversion-Optimized,Real-Time Monitoring + Predictive,Dark tech colors + trust + vibrant accents,Security perception. Real-time data critical.
|
||||||
|
16,Social Media App,"app, community, content, entertainment, media, network, sharing, social, streaming, users, video",Vibrant & Block-based + Motion-Driven,"Aurora UI, Micro-interactions",Feature-Rich Showcase,User Behavior Analytics,Vibrant + engagement colors,Engagement & retention. Addictive design ethics.
|
||||||
|
17,Productivity Tool,"collaboration, productivity, project, task, tool, workflow",Flat Design + Micro-interactions,"Minimalism, Soft UI Evolution",Interactive Product Demo,Drill-Down Analytics,Clear hierarchy + functional colors,Ease of use. Speed & efficiency focus.
|
||||||
|
18,Design System/Component Library,"component, design, library, system",Minimalism + Accessible & Ethical,"Flat Design, Zero Interface",Feature-Rich Showcase,N/A - Dev focused,Clear hierarchy + code-like structure,Consistency. Developer-first approach.
|
||||||
|
19,AI/Chatbot Platform,"ai, artificial-intelligence, automation, chatbot, machine-learning, ml, platform",AI-Native UI + Minimalism,"Zero Interface, Glassmorphism",Interactive Product Demo,AI/ML Analytics Dashboard,Neutral + AI Purple (#6366F1),Conversational UI. Streaming text. Context awareness. Minimal chrome.
|
||||||
|
20,NFT/Web3 Platform,"nft, platform, web",Cyberpunk UI + Glassmorphism,"Aurora UI, 3D & Hyperrealism",Feature-Rich Showcase,Crypto/Blockchain Dashboard,Dark + Neon + Gold (#FFD700),Wallet integration. Transaction feedback. Gas fees display. Dark mode essential.
|
||||||
|
21,Creator Economy Platform,"creator, economy, platform",Vibrant & Block-based + Bento Box Grid,"Motion-Driven, Aurora UI",Social Proof-Focused,User Behavior Analytics,Vibrant + Brand colors,Creator profiles. Monetization display. Engagement metrics. Social proof.
|
||||||
|
22,Sustainability/ESG Platform,"ai, artificial-intelligence, automation, esg, machine-learning, ml, platform, sustainability",Organic Biophilic + Minimalism,"Accessible & Ethical, Flat Design",Trust & Authority,Energy/Utilities Dashboard,Green (#228B22) + Earth tones,Carbon footprint visuals. Progress indicators. Certification badges. Eco-friendly imagery.
|
||||||
|
23,Remote Work/Collaboration Tool,"collaboration, remote, tool, work",Soft UI Evolution + Minimalism,"Glassmorphism, Micro-interactions",Feature-Rich Showcase,Drill-Down Analytics,Calm Blue + Neutral grey,Real-time collaboration. Status indicators. Video integration. Notification management.
|
||||||
|
24,Mental Health App,"app, health, mental",Neumorphism + Accessible & Ethical,"Claymorphism, Soft UI Evolution",Social Proof-Focused,Healthcare Analytics,Calm Pastels + Trust colors,Calming aesthetics. Privacy-first. Crisis resources. Progress tracking. Accessibility mandatory.
|
||||||
|
25,Pet Tech App,"app, pet, tech",Claymorphism + Vibrant & Block-based,"Micro-interactions, Flat Design",Storytelling-Driven,User Behavior Analytics,Playful + Warm colors,Pet profiles. Health tracking. Playful UI. Photo galleries. Vet integration.
|
||||||
|
26,Smart Home/IoT Dashboard,"admin, analytics, dashboard, data, home, iot, panel, smart",Glassmorphism + Dark Mode (OLED),"Minimalism, AI-Native UI",Interactive Product Demo,Real-Time Monitoring,Dark + Status indicator colors,Device status. Real-time controls. Energy monitoring. Automation rules. Quick actions.
|
||||||
|
27,EV/Charging Ecosystem,"charging, ecosystem, ev",Minimalism + Aurora UI,"Glassmorphism, Organic Biophilic",Hero-Centric Design,Energy/Utilities Dashboard,Electric Blue (#009CD1) + Green,Charging station maps. Range estimation. Cost calculation. Environmental impact.
|
||||||
|
28,Subscription Box Service,"appointment, booking, box, consultation, membership, plan, recurring, service, subscription",Vibrant & Block-based + Motion-Driven,"Claymorphism, Aurora UI",Feature-Rich Showcase,E-commerce Analytics,Brand + Excitement colors,Unboxing experience. Personalization quiz. Subscription management. Product reveals.
|
||||||
|
29,Podcast Platform,"platform, podcast",Dark Mode (OLED) + Minimalism,"Motion-Driven, Vibrant & Block-based",Storytelling-Driven,Media/Entertainment Dashboard,Dark + Audio waveform accents,Audio player UX. Episode discovery. Creator tools. Analytics for podcasters.
|
||||||
|
30,Dating App,"app, dating",Vibrant & Block-based + Motion-Driven,"Aurora UI, Glassmorphism",Social Proof-Focused,User Behavior Analytics,Warm + Romantic (Pink/Red gradients),Profile cards. Swipe interactions. Match animations. Safety features. Video chat.
|
||||||
|
31,Micro-Credentials/Badges Platform,"badges, credentials, micro, platform",Minimalism + Flat Design,"Accessible & Ethical, Swiss Modernism 2.0",Trust & Authority,Education Dashboard,Trust Blue + Gold (#FFD700),Credential verification. Badge display. Progress tracking. Issuer trust. LinkedIn integration.
|
||||||
|
32,Knowledge Base/Documentation,"base, documentation, knowledge",Minimalism + Accessible & Ethical,"Swiss Modernism 2.0, Flat Design",FAQ/Documentation,N/A - Documentation focused,Clean hierarchy + minimal color,Search-first. Clear navigation. Code highlighting. Version switching. Feedback system.
|
||||||
|
33,Hyperlocal Services,"appointment, booking, consultation, hyperlocal, service, services",Minimalism + Vibrant & Block-based,"Micro-interactions, Flat Design",Conversion-Optimized,Drill-Down Analytics + Map,Location markers + Trust colors,Map integration. Service categories. Provider profiles. Booking system. Reviews.
|
||||||
|
34,Beauty/Spa/Wellness Service,"appointment, beauty, booking, consultation, service, spa, wellness",Soft UI Evolution + Neumorphism,"Glassmorphism, Minimalism",Hero-Centric Design + Social Proof,User Behavior Analytics,Soft pastels (Pink #FFB6C1 Sage #90EE90) + Cream + Gold accents,Calming aesthetic. Booking system. Service menu. Before/after gallery. Testimonials. Relaxing imagery.
|
||||||
|
35,Luxury/Premium Brand,"brand, elegant, exclusive, high-end, luxury, premium",Liquid Glass + Glassmorphism,"Minimalism, 3D & Hyperrealism",Storytelling-Driven + Feature-Rich,Sales Intelligence Dashboard,Black + Gold (#FFD700) + White + Minimal accent,Elegance paramount. Premium imagery. Storytelling. High-quality visuals. Exclusive feel.
|
||||||
|
36,Restaurant/Food Service,"appointment, booking, consultation, delivery, food, menu, order, restaurant, service",Vibrant & Block-based + Motion-Driven,"Claymorphism, Flat Design",Hero-Centric Design + Conversion,N/A - Booking focused,Warm colors (Orange Red Brown) + appetizing imagery,Menu display. Online ordering. Reservation system. Food photography. Location/hours prominent.
|
||||||
|
37,Fitness/Gym App,"app, exercise, fitness, gym, health, workout",Vibrant & Block-based + Dark Mode (OLED),"Motion-Driven, Neumorphism",Feature-Rich Showcase,User Behavior Analytics,Energetic (Orange #FF6B35 Electric Blue) + Dark bg,Progress tracking. Workout plans. Community features. Achievements. Motivational design.
|
||||||
|
38,Real Estate/Property,"buy, estate, housing, property, real, real-estate, rent",Glassmorphism + Minimalism,"Motion-Driven, 3D & Hyperrealism",Hero-Centric Design + Feature-Rich,Sales Intelligence Dashboard,Trust Blue (#0077B6) + Gold accents + White,Property listings. Virtual tours. Map integration. Agent profiles. Mortgage calculator. High-quality imagery.
|
||||||
|
39,Travel/Tourism Agency,"agency, booking, creative, design, flight, hotel, marketing, studio, tourism, travel, vacation",Aurora UI + Motion-Driven,"Vibrant & Block-based, Glassmorphism",Storytelling-Driven + Hero-Centric,Booking Analytics,Vibrant destination colors + Sky Blue + Warm accents,Destination showcase. Booking system. Itinerary builder. Reviews. Inspiration galleries. Mobile-first.
|
||||||
|
40,Hotel/Hospitality,"hospitality, hotel",Liquid Glass + Minimalism,"Glassmorphism, Soft UI Evolution",Hero-Centric Design + Social Proof,Revenue Management Dashboard,Warm neutrals + Gold (#D4AF37) + Brand accent,Room booking. Amenities showcase. Location maps. Guest reviews. Seasonal pricing. Luxury imagery.
|
||||||
|
41,Wedding/Event Planning,"conference, event, meetup, planning, registration, ticket, wedding",Soft UI Evolution + Aurora UI,"Glassmorphism, Motion-Driven",Storytelling-Driven + Social Proof,N/A - Planning focused,Soft Pink (#FFD6E0) + Gold + Cream + Sage,Portfolio gallery. Vendor directory. Planning tools. Timeline. Budget tracker. Romantic aesthetic.
|
||||||
|
42,Legal Services,"appointment, attorney, booking, compliance, consultation, contract, law, legal, service, services",Trust & Authority + Minimalism,"Accessible & Ethical, Swiss Modernism 2.0",Trust & Authority + Minimal,Case Management Dashboard,Navy Blue (#1E3A5F) + Gold + White,Credibility paramount. Practice areas. Attorney profiles. Case results. Contact forms. Professional imagery.
|
||||||
|
43,Insurance Platform,"insurance, platform",Trust & Authority + Flat Design,"Accessible & Ethical, Minimalism",Conversion-Optimized + Trust,Claims Analytics Dashboard,Trust Blue (#0066CC) + Green (security) + Neutral,Quote calculator. Policy comparison. Claims process. Trust signals. Clear pricing. Security badges.
|
||||||
|
44,Banking/Traditional Finance,"banking, finance, traditional",Minimalism + Accessible & Ethical,"Trust & Authority, Dark Mode (OLED)",Trust & Authority + Feature-Rich,Financial Dashboard,Navy (#0A1628) + Trust Blue + Gold accents,Security-first. Account overview. Transaction history. Mobile banking. Accessibility critical. Trust paramount.
|
||||||
|
45,Online Course/E-learning,"course, e, learning, online",Claymorphism + Vibrant & Block-based,"Motion-Driven, Flat Design",Feature-Rich Showcase + Social Proof,Education Dashboard,Vibrant learning colors + Progress green,Course catalog. Progress tracking. Video player. Quizzes. Certificates. Community forums. Gamification.
|
||||||
|
46,Non-profit/Charity,"charity, non, profit",Accessible & Ethical + Organic Biophilic,"Minimalism, Storytelling-Driven",Storytelling-Driven + Trust,Donation Analytics Dashboard,Cause-related colors + Trust + Warm,Impact stories. Donation flow. Transparency reports. Volunteer signup. Event calendar. Emotional connection.
|
||||||
|
47,Music Streaming,"music, streaming",Dark Mode (OLED) + Vibrant & Block-based,"Motion-Driven, Aurora UI",Feature-Rich Showcase,Media/Entertainment Dashboard,Dark (#121212) + Vibrant accents + Album art colors,Audio player. Playlist management. Artist pages. Personalization. Social features. Waveform visualizations.
|
||||||
|
48,Video Streaming/OTT,"ott, streaming, video",Dark Mode (OLED) + Motion-Driven,"Glassmorphism, Vibrant & Block-based",Hero-Centric Design + Feature-Rich,Media/Entertainment Dashboard,Dark bg + Content poster colors + Brand accent,Video player. Content discovery. Watchlist. Continue watching. Personalized recommendations. Thumbnail-heavy.
|
||||||
|
49,Job Board/Recruitment,"board, job, recruitment",Flat Design + Minimalism,"Vibrant & Block-based, Accessible & Ethical",Conversion-Optimized + Feature-Rich,HR Analytics Dashboard,Professional Blue + Success Green + Neutral,Job listings. Search/filter. Company profiles. Application tracking. Resume upload. Salary insights.
|
||||||
|
50,Marketplace (P2P),"buyers, listings, marketplace, p, platform, sellers",Vibrant & Block-based + Flat Design,"Micro-interactions, Trust & Authority",Feature-Rich Showcase + Social Proof,E-commerce Analytics,Trust colors + Category colors + Success green,Seller/buyer profiles. Listings. Reviews/ratings. Secure payment. Messaging. Search/filter. Trust badges.
|
||||||
|
51,Logistics/Delivery,"delivery, logistics",Minimalism + Flat Design,"Dark Mode (OLED), Micro-interactions",Feature-Rich Showcase + Conversion,Real-Time Monitoring + Route Analytics,Blue (#2563EB) + Orange (tracking) + Green (delivered),Real-time tracking. Delivery scheduling. Route optimization. Driver management. Status updates. Map integration.
|
||||||
|
52,Agriculture/Farm Tech,"agriculture, farm, tech",Organic Biophilic + Flat Design,"Minimalism, Accessible & Ethical",Feature-Rich Showcase + Trust,IoT Sensor Dashboard,Earth Green (#4A7C23) + Brown + Sky Blue,Crop monitoring. Weather data. IoT sensors. Yield tracking. Market prices. Sustainable imagery.
|
||||||
|
53,Construction/Architecture,"architecture, construction",Minimalism + 3D & Hyperrealism,"Brutalism, Swiss Modernism 2.0",Hero-Centric Design + Feature-Rich,Project Management Dashboard,Grey (#4A4A4A) + Orange (safety) + Blueprint Blue,Project portfolio. 3D renders. Timeline. Material specs. Team collaboration. Blueprint aesthetic.
|
||||||
|
54,Automotive/Car Dealership,"automotive, car, dealership",Motion-Driven + 3D & Hyperrealism,"Dark Mode (OLED), Glassmorphism",Hero-Centric Design + Feature-Rich,Sales Intelligence Dashboard,Brand colors + Metallic accents + Dark/Light,Vehicle showcase. 360° views. Comparison tools. Financing calculator. Test drive booking. High-quality imagery.
|
||||||
|
55,Photography Studio,"photography, studio",Motion-Driven + Minimalism,"Aurora UI, Glassmorphism",Storytelling-Driven + Hero-Centric,N/A - Portfolio focused,Black + White + Minimal accent,Portfolio gallery. Before/after. Service packages. Booking system. Client galleries. Full-bleed imagery.
|
||||||
|
56,Coworking Space,"coworking, space",Vibrant & Block-based + Glassmorphism,"Minimalism, Motion-Driven",Hero-Centric Design + Feature-Rich,Occupancy Dashboard,Energetic colors + Wood tones + Brand accent,Space tour. Membership plans. Booking system. Amenities. Community events. Virtual tour.
|
||||||
|
57,Cleaning Service,"appointment, booking, cleaning, consultation, service",Soft UI Evolution + Flat Design,"Minimalism, Micro-interactions",Conversion-Optimized + Trust,Service Analytics,Fresh Blue (#00B4D8) + Clean White + Green,Service packages. Booking system. Price calculator. Before/after gallery. Reviews. Trust badges.
|
||||||
|
58,Home Services (Plumber/Electrician),"appointment, booking, consultation, electrician, home, plumber, service, services",Flat Design + Trust & Authority,"Minimalism, Accessible & Ethical",Conversion-Optimized + Trust,Service Analytics,Trust Blue + Safety Orange + Professional grey,Service list. Emergency contact. Booking. Price transparency. Certifications. Local trust signals.
|
||||||
|
59,Childcare/Daycare,"childcare, daycare",Claymorphism + Vibrant & Block-based,"Soft UI Evolution, Accessible & Ethical",Social Proof-Focused + Trust,Parent Dashboard,Playful pastels + Safe colors + Warm accents,Programs. Staff profiles. Safety certifications. Parent portal. Activity updates. Cheerful imagery.
|
||||||
|
60,Senior Care/Elderly,"care, elderly, senior",Accessible & Ethical + Soft UI Evolution,"Minimalism, Neumorphism",Trust & Authority + Social Proof,Healthcare Analytics,Calm Blue + Warm neutrals + Large text,Care services. Staff qualifications. Facility tour. Family portal. Large touch targets. High contrast. Accessibility-first.
|
||||||
|
61,Medical Clinic,"clinic, medical",Accessible & Ethical + Minimalism,"Neumorphism, Trust & Authority",Trust & Authority + Conversion,Healthcare Analytics,Medical Blue (#0077B6) + Trust White + Calm Green,Services. Doctor profiles. Online booking. Patient portal. Insurance info. HIPAA compliant. Trust signals.
|
||||||
|
62,Pharmacy/Drug Store,"drug, pharmacy, store",Flat Design + Accessible & Ethical,"Minimalism, Trust & Authority",Conversion-Optimized + Trust,Inventory Dashboard,Pharmacy Green + Trust Blue + Clean White,Product catalog. Prescription upload. Refill reminders. Health info. Store locator. Safety certifications.
|
||||||
|
63,Dental Practice,"dental, practice",Soft UI Evolution + Minimalism,"Accessible & Ethical, Trust & Authority",Social Proof-Focused + Conversion,Patient Analytics,Fresh Blue + White + Smile Yellow accent,Services. Dentist profiles. Before/after. Online booking. Insurance. Patient testimonials. Friendly imagery.
|
||||||
|
64,Veterinary Clinic,"clinic, veterinary",Claymorphism + Accessible & Ethical,"Soft UI Evolution, Flat Design",Social Proof-Focused + Trust,Pet Health Dashboard,Caring Blue + Pet-friendly colors + Warm accents,Pet services. Vet profiles. Online booking. Pet portal. Emergency info. Friendly animal imagery.
|
||||||
|
65,Florist/Plant Shop,"florist, plant, shop",Organic Biophilic + Vibrant & Block-based,"Aurora UI, Motion-Driven",Hero-Centric Design + Conversion,E-commerce Analytics,Natural Green + Floral pinks/purples + Earth tones,Product catalog. Occasion categories. Delivery scheduling. Care guides. Seasonal collections. Beautiful imagery.
|
||||||
|
66,Bakery/Cafe,"bakery, cafe",Vibrant & Block-based + Soft UI Evolution,"Claymorphism, Motion-Driven",Hero-Centric Design + Conversion,N/A - Order focused,Warm Brown + Cream + Appetizing accents,Menu display. Online ordering. Location/hours. Catering. Seasonal specials. Appetizing photography.
|
||||||
|
67,Coffee Shop,"coffee, shop",Minimalism + Organic Biophilic,"Soft UI Evolution, Flat Design",Hero-Centric Design + Conversion,N/A - Order focused,Coffee Brown (#6F4E37) + Cream + Warm accents,Menu. Online ordering. Loyalty program. Location. Story/origin. Cozy aesthetic.
|
||||||
|
68,Brewery/Winery,"brewery, winery",Motion-Driven + Storytelling-Driven,"Dark Mode (OLED), Organic Biophilic",Storytelling-Driven + Hero-Centric,N/A - E-commerce focused,Deep amber/burgundy + Gold + Craft aesthetic,Product showcase. Story/heritage. Tasting notes. Events. Club membership. Artisanal imagery.
|
||||||
|
69,Airline,"ai, airline, artificial-intelligence, automation, machine-learning, ml",Minimalism + Glassmorphism,"Motion-Driven, Accessible & Ethical",Conversion-Optimized + Feature-Rich,Operations Dashboard,Sky Blue + Brand colors + Trust accents,Flight search. Booking. Check-in. Boarding pass. Loyalty program. Route maps. Mobile-first.
|
||||||
|
70,News/Media Platform,"content, entertainment, media, news, platform, streaming, video",Minimalism + Flat Design,"Dark Mode (OLED), Accessible & Ethical",Hero-Centric Design + Feature-Rich,Media Analytics Dashboard,Brand colors + High contrast + Category colors,Article layout. Breaking news. Categories. Search. Subscription. Mobile reading. Fast loading.
|
||||||
|
71,Magazine/Blog,"articles, blog, content, magazine, posts, writing",Swiss Modernism 2.0 + Motion-Driven,"Minimalism, Aurora UI",Storytelling-Driven + Hero-Centric,Content Analytics,Editorial colors + Brand primary + Clean white,Article showcase. Category navigation. Author profiles. Newsletter signup. Related content. Typography-focused.
|
||||||
|
72,Freelancer Platform,"freelancer, platform",Flat Design + Minimalism,"Vibrant & Block-based, Micro-interactions",Feature-Rich Showcase + Conversion,Marketplace Analytics,Professional Blue + Success Green + Neutral,Profile creation. Portfolio. Skill matching. Messaging. Payment. Reviews. Project management.
|
||||||
|
73,Consulting Firm,"consulting, firm",Trust & Authority + Minimalism,"Swiss Modernism 2.0, Accessible & Ethical",Trust & Authority + Feature-Rich,N/A - Lead generation,Navy + Gold + Professional grey,Service areas. Case studies. Team profiles. Thought leadership. Contact. Professional credibility.
|
||||||
|
74,Marketing Agency,"agency, creative, design, marketing, studio",Brutalism + Motion-Driven,"Vibrant & Block-based, Aurora UI",Storytelling-Driven + Feature-Rich,Campaign Analytics,Bold brand colors + Creative freedom,Portfolio. Case studies. Services. Team. Creative showcase. Results-focused. Bold aesthetic.
|
||||||
|
75,Event Management,"conference, event, management, meetup, registration, ticket",Vibrant & Block-based + Motion-Driven,"Glassmorphism, Aurora UI",Hero-Centric Design + Feature-Rich,Event Analytics,Event theme colors + Excitement accents,Event showcase. Registration. Agenda. Speakers. Sponsors. Ticket sales. Countdown timer.
|
||||||
|
76,Conference/Webinar Platform,"conference, platform, webinar",Glassmorphism + Minimalism,"Motion-Driven, Flat Design",Feature-Rich Showcase + Conversion,Attendee Analytics,Professional Blue + Video accent + Brand,Registration. Agenda. Speaker profiles. Live stream. Networking. Recording access. Virtual event features.
|
||||||
|
77,Membership/Community,"community, membership",Vibrant & Block-based + Soft UI Evolution,"Bento Box Grid, Micro-interactions",Social Proof-Focused + Conversion,Community Analytics,Community brand colors + Engagement accents,Member benefits. Pricing tiers. Community showcase. Events. Member directory. Exclusive content.
|
||||||
|
78,Newsletter Platform,"newsletter, platform",Minimalism + Flat Design,"Swiss Modernism 2.0, Accessible & Ethical",Minimal & Direct + Conversion,Email Analytics,Brand primary + Clean white + CTA accent,Subscribe form. Archive. About. Social proof. Sample content. Simple conversion.
|
||||||
|
79,Digital Products/Downloads,"digital, downloads, products",Vibrant & Block-based + Motion-Driven,"Glassmorphism, Bento Box Grid",Feature-Rich Showcase + Conversion,E-commerce Analytics,Product category colors + Brand + Success green,Product showcase. Preview. Pricing. Instant delivery. License management. Customer reviews.
|
||||||
|
80,Church/Religious Organization,"church, organization, religious",Accessible & Ethical + Soft UI Evolution,"Minimalism, Trust & Authority",Hero-Centric Design + Social Proof,N/A - Community focused,Warm Gold + Deep Purple/Blue + White,Service times. Events. Sermons. Community. Giving. Location. Welcoming imagery.
|
||||||
|
81,Sports Team/Club,"club, sports, team",Vibrant & Block-based + Motion-Driven,"Dark Mode (OLED), 3D & Hyperrealism",Hero-Centric Design + Feature-Rich,Performance Analytics,Team colors + Energetic accents,Schedule. Roster. News. Tickets. Merchandise. Fan engagement. Action imagery.
|
||||||
|
82,Museum/Gallery,"gallery, museum",Minimalism + Motion-Driven,"Swiss Modernism 2.0, 3D & Hyperrealism",Storytelling-Driven + Feature-Rich,Visitor Analytics,Art-appropriate neutrals + Exhibition accents,Exhibitions. Collections. Tickets. Events. Virtual tours. Educational content. Art-focused design.
|
||||||
|
83,Theater/Cinema,"cinema, theater",Dark Mode (OLED) + Motion-Driven,"Vibrant & Block-based, Glassmorphism",Hero-Centric Design + Conversion,Booking Analytics,Dark + Spotlight accents + Gold,Showtimes. Seat selection. Trailers. Coming soon. Membership. Dramatic imagery.
|
||||||
|
84,Language Learning App,"app, language, learning",Claymorphism + Vibrant & Block-based,"Micro-interactions, Flat Design",Feature-Rich Showcase + Social Proof,Learning Analytics,Playful colors + Progress indicators + Country flags,Lesson structure. Progress tracking. Gamification. Speaking practice. Community. Achievement badges.
|
||||||
|
85,Coding Bootcamp,"bootcamp, coding",Dark Mode (OLED) + Minimalism,"Cyberpunk UI, Flat Design",Feature-Rich Showcase + Social Proof,Student Analytics,Code editor colors + Brand + Success green,Curriculum. Projects. Career outcomes. Alumni. Pricing. Application. Terminal aesthetic.
|
||||||
|
86,Cybersecurity Platform,"cyber, security, platform",Cyberpunk UI + Dark Mode (OLED),"Neubrutalism, Minimal & Direct",Trust & Authority + Real-Time,Real-Time Monitoring + Heat Map,Matrix Green + Deep Black + Terminal feel,Data density. Threat visualization. Dark mode default.
|
||||||
|
87,Developer Tool / IDE,"dev, developer, tool, ide",Dark Mode (OLED) + Minimalism,"Flat Design, Bento Box Grid",Minimal & Direct + Documentation,Real-Time Monitor + Terminal,Dark syntax theme colors + Blue focus,Keyboard shortcuts. Syntax highlighting. Fast performance.
|
||||||
|
88,Biotech / Life Sciences,"biotech, biology, science",Glassmorphism + Clean Science,"Minimalism, Organic Biophilic",Storytelling-Driven + Research,Data-Dense + Predictive,Sterile White + DNA Blue + Life Green,Data accuracy. Cleanliness. Complex data viz.
|
||||||
|
89,Space Tech / Aerospace,"aerospace, space, tech",Holographic / HUD + Dark Mode,"Glassmorphism, 3D & Hyperrealism",Immersive Experience + Hero,Real-Time Monitoring + 3D,Deep Space Black + Star White + Metallic,High-tech feel. Precision. Telemetry data.
|
||||||
|
90,Architecture / Interior,"architecture, design, interior",Exaggerated Minimalism + High Imagery,"Swiss Modernism 2.0, Parallax",Portfolio Grid + Visuals,Project Management + Gallery,Monochrome + Gold Accent + High Imagery,High-res images. Typography. Space.
|
||||||
|
91,Quantum Computing Interface,"quantum, computing, physics, qubit, future, science",Holographic / HUD + Dark Mode,"Glassmorphism, Spatial UI",Immersive/Interactive Experience,3D Spatial Data + Real-Time Monitor,Quantum Blue #00FFFF + Deep Black + Interference patterns,Visualize complexity. Qubit states. Probability clouds. High-tech trust.
|
||||||
|
92,Biohacking / Longevity App,"biohacking, health, longevity, tracking, wellness, science",Biomimetic / Organic 2.0,"Minimalism, Dark Mode (OLED)",Data-Dense + Storytelling,Real-Time Monitor + Biological Data,Cellular Pink/Red + DNA Blue + Clean White,Personal data privacy. Scientific credibility. Biological visualizations.
|
||||||
|
93,Autonomous Drone Fleet Manager,"drone, autonomous, fleet, aerial, logistics, robotics",HUD / Sci-Fi FUI,"Real-Time Monitor, Spatial UI",Real-Time Monitor,Geographic + Real-Time,Tactical Green #00FF00 + Alert Red + Map Dark,Real-time telemetry. 3D spatial awareness. Latency indicators. Safety alerts.
|
||||||
|
94,Generative Art Platform,"art, generative, ai, creative, platform, gallery",Minimalism (Frame) + Gen Z Chaos,"Masonry Grid, Dark Mode",Bento Grid Showcase,Gallery / Portfolio,Neutral #F5F5F5 (Canvas) + User Content,Content is king. Fast loading. Creator attribution. Minting flow.
|
||||||
|
95,Spatial Computing OS / App,"spatial, vr, ar, vision, os, immersive, mixed-reality",Spatial UI (VisionOS),"Glassmorphism, 3D & Hyperrealism",Immersive/Interactive Experience,Spatial Dashboard,Frosted Glass + System Colors + Depth,Gaze/Pinch interaction. Depth hierarchy. Environment awareness.
|
||||||
|
96,Sustainable Energy / Climate Tech,"climate, energy, sustainable, green, tech, carbon",Organic Biophilic + E-Ink / Paper,"Data-Dense, Swiss Modernism",Interactive Demo + Data,Energy/Utilities Dashboard,Earth Green + Sky Blue + Solar Yellow,Data transparency. Impact visualization. Low-carbon web design.
|
||||||
|
45
.codex/skills/ui-ux-pro-max/data/react-performance.csv
Normal file
45
.codex/skills/ui-ux-pro-max/data/react-performance.csv
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
No,Category,Issue,Keywords,Platform,Description,Do,Don't,Code Example Good,Code Example Bad,Severity
|
||||||
|
1,Async Waterfall,Defer Await,async await defer branch,React/Next.js,Move await into branches where actually used to avoid blocking unused code paths,Move await operations into branches where they're needed,Await at top of function blocking all branches,"if (skip) return { skipped: true }; const data = await fetch()","const data = await fetch(); if (skip) return { skipped: true }",Critical
|
||||||
|
2,Async Waterfall,Promise.all Parallel,promise all parallel concurrent,React/Next.js,Execute independent async operations concurrently using Promise.all(),Use Promise.all() for independent operations,Sequential await for independent operations,"const [user, posts] = await Promise.all([fetchUser(), fetchPosts()])","const user = await fetchUser(); const posts = await fetchPosts()",Critical
|
||||||
|
3,Async Waterfall,Dependency Parallelization,better-all dependency parallel,React/Next.js,Use better-all for operations with partial dependencies to maximize parallelism,Use better-all to start each task at earliest possible moment,Wait for unrelated data before starting dependent fetch,"await all({ user() {}, config() {}, profile() { return fetch((await this.$.user).id) } })","const [user, config] = await Promise.all([...]); const profile = await fetchProfile(user.id)",Critical
|
||||||
|
4,Async Waterfall,API Route Optimization,api route waterfall promise,React/Next.js,In API routes start independent operations immediately even if not awaited yet,Start promises early and await late,Sequential awaits in API handlers,"const sessionP = auth(); const configP = fetchConfig(); const session = await sessionP","const session = await auth(); const config = await fetchConfig()",Critical
|
||||||
|
5,Async Waterfall,Suspense Boundaries,suspense streaming boundary,React/Next.js,Use Suspense to show wrapper UI faster while data loads,Wrap async components in Suspense boundaries,Await data blocking entire page render,"<Suspense fallback={<Skeleton />}><DataDisplay /></Suspense>","const data = await fetchData(); return <DataDisplay data={data} />",High
|
||||||
|
6,Bundle Size,Barrel Imports,barrel import direct path,React/Next.js,Import directly from source files instead of barrel files to avoid loading unused modules,Import directly from source path,Import from barrel/index files,"import Check from 'lucide-react/dist/esm/icons/check'","import { Check } from 'lucide-react'",Critical
|
||||||
|
7,Bundle Size,Dynamic Imports,dynamic import lazy next,React/Next.js,Use next/dynamic to lazy-load large components not needed on initial render,Use dynamic() for heavy components,Import heavy components at top level,"const Monaco = dynamic(() => import('./monaco'), { ssr: false })","import { MonacoEditor } from './monaco-editor'",Critical
|
||||||
|
8,Bundle Size,Defer Third Party,analytics defer third-party,React/Next.js,Load analytics and logging after hydration since they don't block interaction,Load non-critical scripts after hydration,Include analytics in main bundle,"const Analytics = dynamic(() => import('@vercel/analytics'), { ssr: false })","import { Analytics } from '@vercel/analytics/react'",Medium
|
||||||
|
9,Bundle Size,Conditional Loading,conditional module lazy,React/Next.js,Load large data or modules only when a feature is activated,Dynamic import when feature enabled,Import large modules unconditionally,"useEffect(() => { if (enabled) import('./heavy.js') }, [enabled])","import { heavyData } from './heavy.js'",High
|
||||||
|
10,Bundle Size,Preload Intent,preload hover focus intent,React/Next.js,Preload heavy bundles on hover/focus before they're needed,Preload on user intent signals,Load only on click,"onMouseEnter={() => import('./editor')}","onClick={() => import('./editor')}",Medium
|
||||||
|
11,Server,React.cache Dedup,react cache deduplicate request,React/Next.js,Use React.cache() for server-side request deduplication within single request,Wrap data fetchers with cache(),Fetch same data multiple times in tree,"export const getUser = cache(async () => await db.user.find())","export async function getUser() { return await db.user.find() }",Medium
|
||||||
|
12,Server,LRU Cache Cross-Request,lru cache cross request,React/Next.js,Use LRU cache for data shared across sequential requests,Use LRU for cross-request caching,Refetch same data on every request,"const cache = new LRUCache({ max: 1000, ttl: 5*60*1000 })","Always fetch from database",High
|
||||||
|
13,Server,Minimize Serialization,serialization rsc boundary,React/Next.js,Only pass fields that client actually uses across RSC boundaries,Pass only needed fields to client components,Pass entire objects to client,"<Profile name={user.name} />","<Profile user={user} /> // 50 fields serialized",High
|
||||||
|
14,Server,Parallel Fetching,parallel fetch component composition,React/Next.js,Restructure components to parallelize data fetching in RSC,Use component composition for parallel fetches,Sequential fetches in parent component,"<Header /><Sidebar /> // both fetch in parallel","const header = await fetchHeader(); return <><div>{header}</div><Sidebar /></>",Critical
|
||||||
|
15,Server,After Non-blocking,after non-blocking logging,React/Next.js,Use Next.js after() to schedule work after response is sent,Use after() for logging/analytics,Block response for non-critical operations,"after(async () => { await logAction() }); return Response.json(data)","await logAction(); return Response.json(data)",Medium
|
||||||
|
16,Client,SWR Deduplication,swr dedup cache revalidate,React/Next.js,Use SWR for automatic request deduplication and caching,Use useSWR for client data fetching,Manual fetch in useEffect,"const { data } = useSWR('/api/users', fetcher)","useEffect(() => { fetch('/api/users').then(setUsers) }, [])",Medium-High
|
||||||
|
17,Client,Event Listener Dedup,event listener deduplicate global,React/Next.js,Share global event listeners across component instances,Use useSWRSubscription for shared listeners,Register listener per component instance,"useSWRSubscription('global-keydown', () => { window.addEventListener... })","useEffect(() => { window.addEventListener('keydown', handler) }, [])",Low
|
||||||
|
18,Rerender,Defer State Reads,state read callback subscription,React/Next.js,Don't subscribe to state only used in callbacks,Read state on-demand in callbacks,Subscribe to state used only in handlers,"const handleClick = () => { const params = new URLSearchParams(location.search) }","const params = useSearchParams(); const handleClick = () => { params.get('ref') }",Medium
|
||||||
|
19,Rerender,Memoized Components,memo extract expensive,React/Next.js,Extract expensive work into memoized components for early returns,Extract to memo() components,Compute expensive values before early return,"const UserAvatar = memo(({ user }) => ...); if (loading) return <Skeleton />","const avatar = useMemo(() => compute(user)); if (loading) return <Skeleton />",Medium
|
||||||
|
20,Rerender,Narrow Dependencies,effect dependency primitive,React/Next.js,Specify primitive dependencies instead of objects in effects,Use primitive values in dependency arrays,Use object references as dependencies,"useEffect(() => { console.log(user.id) }, [user.id])","useEffect(() => { console.log(user.id) }, [user])",Low
|
||||||
|
21,Rerender,Derived State,derived boolean subscription,React/Next.js,Subscribe to derived booleans instead of continuous values,Use derived boolean state,Subscribe to continuous values,"const isMobile = useMediaQuery('(max-width: 767px)')","const width = useWindowWidth(); const isMobile = width < 768",Medium
|
||||||
|
22,Rerender,Functional setState,functional setstate callback,React/Next.js,Use functional setState updates for stable callbacks and no stale closures,Use functional form: setState(curr => ...),Reference state directly in setState,"setItems(curr => [...curr, newItem])","setItems([...items, newItem]) // items in deps",Medium
|
||||||
|
23,Rerender,Lazy State Init,usestate lazy initialization,React/Next.js,Pass function to useState for expensive initial values,Use function form for expensive init,Compute expensive value directly,"useState(() => buildSearchIndex(items))","useState(buildSearchIndex(items)) // runs every render",Medium
|
||||||
|
24,Rerender,Transitions,starttransition non-urgent,React/Next.js,Mark frequent non-urgent state updates as transitions,Use startTransition for non-urgent updates,Block UI on every state change,"startTransition(() => setScrollY(window.scrollY))","setScrollY(window.scrollY) // blocks on every scroll",Medium
|
||||||
|
25,Rendering,SVG Animation Wrapper,svg animation wrapper div,React/Next.js,Wrap SVG in div and animate wrapper for hardware acceleration,Animate div wrapper around SVG,Animate SVG element directly,"<div class='animate-spin'><svg>...</svg></div>","<svg class='animate-spin'>...</svg>",Low
|
||||||
|
26,Rendering,Content Visibility,content-visibility auto,React/Next.js,Apply content-visibility: auto to defer off-screen rendering,Use content-visibility for long lists,Render all list items immediately,".item { content-visibility: auto; contain-intrinsic-size: 0 80px }","Render 1000 items without optimization",High
|
||||||
|
27,Rendering,Hoist Static JSX,hoist static jsx element,React/Next.js,Extract static JSX outside components to avoid re-creation,Hoist static elements to module scope,Create static elements inside components,"const skeleton = <div class='animate-pulse' />; function C() { return skeleton }","function C() { return <div class='animate-pulse' /> }",Low
|
||||||
|
28,Rendering,Hydration No Flicker,hydration mismatch flicker,React/Next.js,Use inline script to set client-only data before hydration,Inject sync script for client-only values,Use useEffect causing flash,"<script dangerouslySetInnerHTML={{ __html: 'el.className = localStorage.theme' }} />","useEffect(() => setTheme(localStorage.theme), []) // flickers",Medium
|
||||||
|
29,Rendering,Conditional Render,conditional render ternary,React/Next.js,Use ternary instead of && when condition can be 0 or NaN,Use explicit ternary for conditionals,Use && with potentially falsy numbers,"{count > 0 ? <Badge>{count}</Badge> : null}","{count && <Badge>{count}</Badge>} // renders '0'",Low
|
||||||
|
30,Rendering,Activity Component,activity show hide preserve,React/Next.js,Use Activity component to preserve state/DOM for toggled components,Use Activity for expensive toggle components,Unmount/remount on visibility toggle,"<Activity mode={isOpen ? 'visible' : 'hidden'}><Menu /></Activity>","{isOpen && <Menu />} // loses state",Medium
|
||||||
|
31,JS Perf,Batch DOM CSS,batch dom css reflow,React/Next.js,Group CSS changes via classes or cssText to minimize reflows,Use class toggle or cssText,Change styles one property at a time,"element.classList.add('highlighted')","el.style.width='100px'; el.style.height='200px'",Medium
|
||||||
|
32,JS Perf,Index Map Lookup,map index lookup find,React/Next.js,Build Map for repeated lookups instead of multiple .find() calls,Build index Map for O(1) lookups,Use .find() in loops,"const byId = new Map(users.map(u => [u.id, u])); byId.get(id)","users.find(u => u.id === order.userId) // O(n) each time",Low-Medium
|
||||||
|
33,JS Perf,Cache Property Access,cache property loop,React/Next.js,Cache object property lookups in hot paths,Cache values before loops,Access nested properties in loops,"const val = obj.config.settings.value; for (...) process(val)","for (...) process(obj.config.settings.value)",Low-Medium
|
||||||
|
34,JS Perf,Cache Function Results,memoize cache function,React/Next.js,Use module-level Map to cache repeated function results,Use Map cache for repeated calls,Recompute same values repeatedly,"const cache = new Map(); if (cache.has(x)) return cache.get(x)","slugify(name) // called 100 times same input",Medium
|
||||||
|
35,JS Perf,Cache Storage API,localstorage cache read,React/Next.js,Cache localStorage/sessionStorage reads in memory,Cache storage reads in Map,Read storage on every call,"if (!cache.has(key)) cache.set(key, localStorage.getItem(key))","localStorage.getItem('theme') // every call",Low-Medium
|
||||||
|
36,JS Perf,Combine Iterations,combine filter map loop,React/Next.js,Combine multiple filter/map into single loop,Single loop for multiple categorizations,Chain multiple filter() calls,"for (u of users) { if (u.isAdmin) admins.push(u); if (u.isTester) testers.push(u) }","users.filter(admin); users.filter(tester); users.filter(inactive)",Low-Medium
|
||||||
|
37,JS Perf,Length Check First,length check array compare,React/Next.js,Check array lengths before expensive comparisons,Early return if lengths differ,Always run expensive comparison,"if (a.length !== b.length) return true; // then compare","a.sort().join() !== b.sort().join() // even when lengths differ",Medium-High
|
||||||
|
38,JS Perf,Early Return,early return exit function,React/Next.js,Return early when result is determined to skip processing,Return immediately on first error,Process all items then check errors,"for (u of users) { if (!u.email) return { error: 'Email required' } }","let hasError; for (...) { if (!email) hasError=true }; if (hasError)...",Low-Medium
|
||||||
|
39,JS Perf,Hoist RegExp,regexp hoist module,React/Next.js,Don't create RegExp inside render - hoist or memoize,Hoist RegExp to module scope,Create RegExp every render,"const EMAIL_RE = /^[^@]+@[^@]+$/; function validate() { EMAIL_RE.test(x) }","function C() { const re = new RegExp(pattern); re.test(x) }",Low-Medium
|
||||||
|
40,JS Perf,Loop Min Max,loop min max sort,React/Next.js,Use loop for min/max instead of sort - O(n) vs O(n log n),Single pass loop for min/max,Sort array to find min/max,"let max = arr[0]; for (x of arr) if (x > max) max = x","arr.sort((a,b) => b-a)[0] // O(n log n)",Low
|
||||||
|
41,JS Perf,Set Map Lookups,set map includes has,React/Next.js,Use Set/Map for O(1) lookups instead of array.includes(),Convert to Set for membership checks,Use .includes() for repeated checks,"const allowed = new Set(['a','b']); allowed.has(id)","const allowed = ['a','b']; allowed.includes(id)",Low-Medium
|
||||||
|
42,JS Perf,toSorted Immutable,tosorted sort immutable,React/Next.js,Use toSorted() instead of sort() to avoid mutating arrays,Use toSorted() for immutability,Mutate arrays with sort(),"users.toSorted((a,b) => a.name.localeCompare(b.name))","users.sort((a,b) => a.name.localeCompare(b.name)) // mutates",Medium-High
|
||||||
|
43,Advanced,Event Handler Refs,useeffectevent ref handler,React/Next.js,Store callbacks in refs for stable effect subscriptions,Use useEffectEvent for stable handlers,Re-subscribe on every callback change,"const onEvent = useEffectEvent(handler); useEffect(() => { listen(onEvent) }, [])","useEffect(() => { listen(handler) }, [handler]) // re-subscribes",Low
|
||||||
|
44,Advanced,useLatest Hook,uselatest ref callback,React/Next.js,Access latest values in callbacks without adding to dependency arrays,Use useLatest for fresh values in stable callbacks,Add callback to effect dependencies,"const cbRef = useLatest(cb); useEffect(() => { setTimeout(() => cbRef.current()) }, [])","useEffect(() => { setTimeout(() => cb()) }, [cb]) // re-runs",Low
|
||||||
|
54
.codex/skills/ui-ux-pro-max/data/stacks/astro.csv
Normal file
54
.codex/skills/ui-ux-pro-max/data/stacks/astro.csv
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
||||||
|
1,Architecture,Use Islands Architecture,Astro's partial hydration only loads JS for interactive components,Interactive components with client directives,Hydrate entire page like traditional SPA,<Counter client:load />,Everything as client component,High,https://docs.astro.build/en/concepts/islands/
|
||||||
|
2,Architecture,Default to zero JS,Astro ships zero JS by default - add only when needed,Static components without client directive,Add client:load to everything,<Header /> (static),<Header client:load /> (unnecessary),High,https://docs.astro.build/en/basics/astro-components/
|
||||||
|
3,Architecture,Choose right client directive,Different directives for different hydration timing,client:visible for below-fold client:idle for non-critical,client:load for everything,<Comments client:visible />,<Comments client:load />,Medium,https://docs.astro.build/en/reference/directives-reference/#client-directives
|
||||||
|
4,Architecture,Use content collections,Type-safe content management for blogs docs,Content collections for structured content,Loose markdown files without schema,const posts = await getCollection('blog'),import.meta.glob('./posts/*.md'),High,https://docs.astro.build/en/guides/content-collections/
|
||||||
|
5,Architecture,Define collection schemas,Zod schemas for content validation,Schema with required fields and types,No schema validation,"defineCollection({ schema: z.object({...}) })",defineCollection({}),High,https://docs.astro.build/en/guides/content-collections/#defining-a-collection-schema
|
||||||
|
6,Routing,Use file-based routing,Create routes by adding .astro files in pages/,pages/ directory for routes,Manual route configuration,src/pages/about.astro,Custom router setup,Medium,https://docs.astro.build/en/basics/astro-pages/
|
||||||
|
7,Routing,Dynamic routes with brackets,Use [param] for dynamic routes,Bracket notation for params,Query strings for dynamic content,pages/blog/[slug].astro,pages/blog.astro?slug=x,Medium,https://docs.astro.build/en/guides/routing/#dynamic-routes
|
||||||
|
8,Routing,Use getStaticPaths for SSG,Generate static pages at build time,getStaticPaths for known dynamic routes,Fetch at runtime for static content,"export async function getStaticPaths() { return [...] }",No getStaticPaths with dynamic route,High,https://docs.astro.build/en/reference/api-reference/#getstaticpaths
|
||||||
|
9,Routing,Enable SSR when needed,Server-side rendering for dynamic content,output: 'server' or 'hybrid' for dynamic,SSR for purely static sites,"export const prerender = false;",SSR for static blog,Medium,https://docs.astro.build/en/guides/server-side-rendering/
|
||||||
|
10,Components,Keep .astro for static,Use .astro components for static content,Astro components for layout structure,React/Vue for static markup,<Layout><slot /></Layout>,<ReactLayout>{children}</ReactLayout>,High,
|
||||||
|
11,Components,Use framework components for interactivity,React Vue Svelte for complex interactivity,Framework component with client directive,Astro component with inline scripts,<ReactCounter client:load />,<script> in .astro for complex state,Medium,https://docs.astro.build/en/guides/framework-components/
|
||||||
|
12,Components,Pass data via props,Astro components receive props in frontmatter,Astro.props for component data,Global state for simple data,"const { title } = Astro.props;",Import global store,Low,https://docs.astro.build/en/basics/astro-components/#component-props
|
||||||
|
13,Components,Use slots for composition,Named and default slots for flexible layouts,<slot /> for child content,Props for HTML content,<slot name="header" />,<Component header={<div>...</div>} />,Medium,https://docs.astro.build/en/basics/astro-components/#slots
|
||||||
|
14,Components,Colocate component styles,Scoped styles in component file,<style> in same .astro file,Separate CSS files for component styles,<style> .card { } </style>,import './Card.css',Low,
|
||||||
|
15,Styling,Use scoped styles by default,Astro scopes styles to component automatically,<style> for component-specific styles,Global styles for everything,<style> h1 { } </style> (scoped),<style is:global> for everything,Medium,https://docs.astro.build/en/guides/styling/#scoped-styles
|
||||||
|
16,Styling,Use is:global sparingly,Global styles only when truly needed,is:global for base styles or overrides,is:global for component styles,<style is:global> body { } </style>,<style is:global> .card { } </style>,Medium,
|
||||||
|
17,Styling,Integrate Tailwind properly,Use @astrojs/tailwind integration,Official Tailwind integration,Manual Tailwind setup,npx astro add tailwind,Manual PostCSS config,Low,https://docs.astro.build/en/guides/integrations-guide/tailwind/
|
||||||
|
18,Styling,Use CSS variables for theming,Define tokens in :root,CSS custom properties for themes,Hardcoded colors everywhere,:root { --primary: #3b82f6; },color: #3b82f6; everywhere,Medium,
|
||||||
|
19,Data,Fetch in frontmatter,Data fetching in component frontmatter,Top-level await in frontmatter,useEffect for initial data,const data = await fetch(url),client-side fetch on mount,High,https://docs.astro.build/en/guides/data-fetching/
|
||||||
|
20,Data,Use Astro.glob for local files,Import multiple local files,Astro.glob for markdown/data files,Manual imports for each file,const posts = await Astro.glob('./posts/*.md'),"import post1; import post2;",Medium,
|
||||||
|
21,Data,Prefer content collections over glob,Type-safe collections for structured content,getCollection() for blog/docs,Astro.glob for structured content,await getCollection('blog'),await Astro.glob('./blog/*.md'),High,
|
||||||
|
22,Data,Use environment variables correctly,Import.meta.env for env vars,PUBLIC_ prefix for client vars,Expose secrets to client,import.meta.env.PUBLIC_API_URL,import.meta.env.SECRET in client,High,https://docs.astro.build/en/guides/environment-variables/
|
||||||
|
23,Performance,Preload critical assets,Use link preload for important resources,Preload fonts above-fold images,No preload hints,"<link rel=""preload"" href=""font.woff2"" as=""font"">",No preload for critical assets,Medium,
|
||||||
|
24,Performance,Optimize images with astro:assets,Built-in image optimization,<Image /> component for optimization,<img> for local images,"import { Image } from 'astro:assets';","<img src=""./image.jpg"">",High,https://docs.astro.build/en/guides/images/
|
||||||
|
25,Performance,Use picture for responsive images,Multiple formats and sizes,<Picture /> for art direction,Single image size for all screens,<Picture /> with multiple sources,<Image /> with single size,Medium,
|
||||||
|
26,Performance,Lazy load below-fold content,Defer loading non-critical content,loading=lazy for images client:visible for components,Load everything immediately,"<img loading=""lazy"">",No lazy loading,Medium,
|
||||||
|
27,Performance,Minimize client directives,Each directive adds JS bundle,Audit client: usage regularly,Sprinkle client:load everywhere,Only interactive components hydrated,Every component with client:load,High,
|
||||||
|
28,ViewTransitions,Enable View Transitions,Smooth page transitions,<ViewTransitions /> in head,Full page reloads,"import { ViewTransitions } from 'astro:transitions';",No transition API,Medium,https://docs.astro.build/en/guides/view-transitions/
|
||||||
|
29,ViewTransitions,Use transition:name,Named elements for morphing,transition:name for persistent elements,Unnamed transitions,"<header transition:name=""header"">",<header> without name,Low,
|
||||||
|
30,ViewTransitions,Handle transition:persist,Keep state across navigations,transition:persist for media players,Re-initialize on every navigation,"<video transition:persist id=""player"">",Video restarts on navigation,Medium,
|
||||||
|
31,ViewTransitions,Add fallback for no-JS,Graceful degradation,Content works without JS,Require JS for basic navigation,Static content accessible,Broken without ViewTransitions JS,High,
|
||||||
|
32,SEO,Use built-in SEO component,Head management for meta tags,Astro SEO integration or manual head,No meta tags,"<title>{title}</title><meta name=""description"">",No SEO tags,High,
|
||||||
|
33,SEO,Generate sitemap,Automatic sitemap generation,@astrojs/sitemap integration,Manual sitemap maintenance,npx astro add sitemap,Hand-written sitemap.xml,Medium,https://docs.astro.build/en/guides/integrations-guide/sitemap/
|
||||||
|
34,SEO,Add RSS feed for content,RSS for blogs and content sites,@astrojs/rss for feed generation,No RSS feed,rss() helper in pages/rss.xml.js,No feed for blog,Low,https://docs.astro.build/en/guides/rss/
|
||||||
|
35,SEO,Use canonical URLs,Prevent duplicate content issues,Astro.url for canonical generation,"<link rel=""canonical"" href={Astro.url}>",No canonical tags,Medium,
|
||||||
|
36,Integrations,Use official integrations,Astro's integration system,npx astro add for integrations,Manual configuration,npx astro add react,Manual React setup,Medium,https://docs.astro.build/en/guides/integrations-guide/
|
||||||
|
37,Integrations,Configure integrations in astro.config,Centralized configuration,integrations array in config,Scattered configuration,"integrations: [react(), tailwind()]",Multiple config files,Low,
|
||||||
|
38,Integrations,Use adapter for deployment,Platform-specific adapters,Correct adapter for host,Wrong or no adapter,@astrojs/vercel for Vercel,No adapter for SSR,High,https://docs.astro.build/en/guides/deploy/
|
||||||
|
39,TypeScript,Enable TypeScript,Type safety for Astro projects,tsconfig.json with astro types,No TypeScript,Astro TypeScript template,JavaScript only,Medium,https://docs.astro.build/en/guides/typescript/
|
||||||
|
40,TypeScript,Type component props,Define prop interfaces,Props interface in frontmatter,Untyped props,"interface Props { title: string }",No props typing,Medium,
|
||||||
|
41,TypeScript,Use strict mode,Catch errors early,strict: true in tsconfig,Loose TypeScript config,strictest template,base template,Low,
|
||||||
|
42,Markdown,Use MDX for components,Components in markdown content,@astrojs/mdx for interactive docs,Plain markdown with workarounds,<Component /> in .mdx,HTML in .md files,Medium,https://docs.astro.build/en/guides/integrations-guide/mdx/
|
||||||
|
43,Markdown,Configure markdown plugins,Extend markdown capabilities,remarkPlugins rehypePlugins in config,Manual HTML for features,remarkPlugins: [remarkToc],Manual TOC in every post,Low,
|
||||||
|
44,Markdown,Use frontmatter for metadata,Structured post metadata,Frontmatter with typed schema,Inline metadata,title date in frontmatter,# Title as first line,Medium,
|
||||||
|
45,API,Use API routes for endpoints,Server endpoints in pages/api,pages/api/[endpoint].ts for APIs,External API for simple endpoints,pages/api/posts.json.ts,Separate Express server,Medium,https://docs.astro.build/en/guides/endpoints/
|
||||||
|
46,API,Return proper responses,Use Response object,new Response() with headers,Plain objects,return new Response(JSON.stringify(data)),return data,Medium,
|
||||||
|
47,API,Handle methods correctly,Export named method handlers,export GET POST handlers,Single default export,export const GET = async () => {},export default async () => {},Low,
|
||||||
|
48,Security,Sanitize user content,Prevent XSS in dynamic content,set:html only for trusted content,set:html with user input,"<Fragment set:html={sanitized} />","<div set:html={userInput} />",High,
|
||||||
|
49,Security,Use HTTPS in production,Secure connections,HTTPS for all production sites,HTTP in production,https://example.com,http://example.com,High,
|
||||||
|
50,Security,Validate API input,Check and sanitize all input,Zod validation for API routes,Trust all input,const body = schema.parse(data),const body = await request.json(),High,
|
||||||
|
51,Build,Use hybrid rendering,Mix static and dynamic pages,output: 'hybrid' for flexibility,All SSR or all static,prerender per-page basis,Single rendering mode,Medium,https://docs.astro.build/en/guides/server-side-rendering/#hybrid-rendering
|
||||||
|
52,Build,Analyze bundle size,Monitor JS bundle impact,Build output shows bundle sizes,Ignore bundle growth,Check astro build output,No size monitoring,Medium,
|
||||||
|
53,Build,Use prefetch,Preload linked pages,prefetch integration,No prefetch for navigation,npx astro add prefetch,Manual prefetch,Low,https://docs.astro.build/en/guides/prefetch/
|
||||||
|
Can't render this file because it contains an unexpected character in line 14 and column 147.
|
53
.codex/skills/ui-ux-pro-max/data/stacks/flutter.csv
Normal file
53
.codex/skills/ui-ux-pro-max/data/stacks/flutter.csv
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
||||||
|
1,Widgets,Use StatelessWidget when possible,Immutable widgets are simpler,StatelessWidget for static UI,StatefulWidget for everything,class MyWidget extends StatelessWidget,class MyWidget extends StatefulWidget (static),Medium,https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html
|
||||||
|
2,Widgets,Keep widgets small,Single responsibility principle,Extract widgets into smaller pieces,Large build methods,Column(children: [Header() Content()]),500+ line build method,Medium,
|
||||||
|
3,Widgets,Use const constructors,Compile-time constants for performance,const MyWidget() when possible,Non-const for static widgets,const Text('Hello'),Text('Hello') for literals,High,https://dart.dev/guides/language/language-tour#constant-constructors
|
||||||
|
4,Widgets,Prefer composition over inheritance,Combine widgets using children,Compose widgets,Extend widget classes,Container(child: MyContent()),class MyContainer extends Container,Medium,
|
||||||
|
5,State,Use setState correctly,Minimal state in StatefulWidget,setState for UI state changes,setState for business logic,setState(() { _counter++; }),Complex logic in setState,Medium,https://api.flutter.dev/flutter/widgets/State/setState.html
|
||||||
|
6,State,Avoid setState in build,Never call setState during build,setState in callbacks only,setState in build method,onPressed: () => setState(() {}),build() { setState(); },High,
|
||||||
|
7,State,Use state management for complex apps,Provider Riverpod BLoC,State management for shared state,setState for global state,Provider.of<MyState>(context),Global setState calls,Medium,
|
||||||
|
8,State,Prefer Riverpod or Provider,Recommended state solutions,Riverpod for new projects,InheritedWidget manually,ref.watch(myProvider),Custom InheritedWidget,Medium,https://riverpod.dev/
|
||||||
|
9,State,Dispose resources,Clean up controllers and subscriptions,dispose() for cleanup,Memory leaks from subscriptions,@override void dispose() { controller.dispose(); },No dispose implementation,High,
|
||||||
|
10,Layout,Use Column and Row,Basic layout widgets,Column Row for linear layouts,Stack for simple layouts,"Column(children: [Text(), Button()])",Stack for vertical list,Medium,https://api.flutter.dev/flutter/widgets/Column-class.html
|
||||||
|
11,Layout,Use Expanded and Flexible,Control flex behavior,Expanded to fill space,Fixed sizes in flex containers,Expanded(child: Container()),Container(width: 200) in Row,Medium,
|
||||||
|
12,Layout,Use SizedBox for spacing,Consistent spacing,SizedBox for gaps,Container for spacing only,SizedBox(height: 16),Container(height: 16),Low,
|
||||||
|
13,Layout,Use LayoutBuilder for responsive,Respond to constraints,LayoutBuilder for adaptive layouts,Fixed sizes for responsive,LayoutBuilder(builder: (context constraints) {}),Container(width: 375),Medium,https://api.flutter.dev/flutter/widgets/LayoutBuilder-class.html
|
||||||
|
14,Layout,Avoid deep nesting,Keep widget tree shallow,Extract deeply nested widgets,10+ levels of nesting,Extract widget to method or class,Column(Row(Column(Row(...)))),Medium,
|
||||||
|
15,Lists,Use ListView.builder,Lazy list building,ListView.builder for long lists,ListView with children for large lists,"ListView.builder(itemCount: 100, itemBuilder: ...)",ListView(children: items.map(...).toList()),High,https://api.flutter.dev/flutter/widgets/ListView-class.html
|
||||||
|
16,Lists,Provide itemExtent when known,Skip measurement,itemExtent for fixed height items,No itemExtent for uniform lists,ListView.builder(itemExtent: 50),ListView.builder without itemExtent,Medium,
|
||||||
|
17,Lists,Use keys for stateful items,Preserve widget state,Key for stateful list items,No key for dynamic lists,ListTile(key: ValueKey(item.id)),ListTile without key,High,
|
||||||
|
18,Lists,Use SliverList for custom scroll,Custom scroll effects,CustomScrollView with Slivers,Nested ListViews,CustomScrollView(slivers: [SliverList()]),ListView inside ListView,Medium,https://api.flutter.dev/flutter/widgets/SliverList-class.html
|
||||||
|
19,Navigation,Use Navigator 2.0 or GoRouter,Declarative routing,go_router for navigation,Navigator.push for complex apps,GoRouter(routes: [...]),Navigator.push everywhere,Medium,https://pub.dev/packages/go_router
|
||||||
|
20,Navigation,Use named routes,Organized navigation,Named routes for clarity,Anonymous routes,Navigator.pushNamed(context '/home'),Navigator.push(context MaterialPageRoute()),Low,
|
||||||
|
21,Navigation,Handle back button (PopScope),Android back behavior and predictive back (Android 14+),Use PopScope widget (WillPopScope is deprecated),Use WillPopScope,"PopScope(canPop: false, onPopInvoked: (didPop) => ...)",WillPopScope(onWillPop: ...),High,https://api.flutter.dev/flutter/widgets/PopScope-class.html
|
||||||
|
22,Navigation,Pass typed arguments,Type-safe route arguments,Typed route arguments,Dynamic arguments,MyRoute(id: '123'),arguments: {'id': '123'},Medium,
|
||||||
|
23,Async,Use FutureBuilder,Async UI building,FutureBuilder for async data,setState for async,FutureBuilder(future: fetchData()),fetchData().then((d) => setState()),Medium,https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html
|
||||||
|
24,Async,Use StreamBuilder,Stream UI building,StreamBuilder for streams,Manual stream subscription,StreamBuilder(stream: myStream),stream.listen in initState,Medium,https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html
|
||||||
|
25,Async,Handle loading and error states,Complete async UI states,ConnectionState checks,Only success state,if (snapshot.connectionState == ConnectionState.waiting),No loading indicator,High,
|
||||||
|
26,Async,Cancel subscriptions,Clean up stream subscriptions,Cancel in dispose,Memory leaks,subscription.cancel() in dispose,No subscription cleanup,High,
|
||||||
|
27,Theming,Use ThemeData,Consistent theming,ThemeData for app theme,Hardcoded colors,Theme.of(context).primaryColor,Color(0xFF123456) everywhere,Medium,https://api.flutter.dev/flutter/material/ThemeData-class.html
|
||||||
|
28,Theming,Use ColorScheme,Material 3 color system,ColorScheme for colors,Individual color properties,colorScheme: ColorScheme.fromSeed(),primaryColor: Colors.blue,Medium,
|
||||||
|
29,Theming,Access theme via context,Dynamic theme access,Theme.of(context),Static theme reference,Theme.of(context).textTheme.bodyLarge,TextStyle(fontSize: 16),Medium,
|
||||||
|
30,Theming,Support dark mode,Respect system theme,darkTheme in MaterialApp,Light theme only,"MaterialApp(theme: light, darkTheme: dark)",MaterialApp(theme: light),Medium,
|
||||||
|
31,Animation,Use implicit animations,Simple animations,AnimatedContainer AnimatedOpacity,Explicit for simple transitions,AnimatedContainer(duration: Duration()),AnimationController for fade,Low,https://api.flutter.dev/flutter/widgets/AnimatedContainer-class.html
|
||||||
|
32,Animation,Use AnimationController for complex,Fine-grained control,AnimationController with Ticker,Implicit for complex sequences,AnimationController(vsync: this),AnimatedContainer for staggered,Medium,
|
||||||
|
33,Animation,Dispose AnimationControllers,Clean up animation resources,dispose() for controllers,Memory leaks,controller.dispose() in dispose,No controller disposal,High,
|
||||||
|
34,Animation,Use Hero for transitions,Shared element transitions,Hero for navigation animations,Manual shared element,Hero(tag: 'image' child: Image()),Custom shared element animation,Low,https://api.flutter.dev/flutter/widgets/Hero-class.html
|
||||||
|
35,Forms,Use Form widget,Form validation,Form with GlobalKey,Individual validation,Form(key: _formKey child: ...),TextField without Form,Medium,https://api.flutter.dev/flutter/widgets/Form-class.html
|
||||||
|
36,Forms,Use TextEditingController,Control text input,Controller for text fields,onChanged for all text,final controller = TextEditingController(),onChanged: (v) => setState(),Medium,
|
||||||
|
37,Forms,Validate on submit,Form validation flow,_formKey.currentState!.validate(),Skip validation,if (_formKey.currentState!.validate()),Submit without validation,High,
|
||||||
|
38,Forms,Dispose controllers,Clean up text controllers,dispose() for controllers,Memory leaks,controller.dispose() in dispose,No controller disposal,High,
|
||||||
|
39,Performance,Use const widgets,Reduce rebuilds,const for static widgets,No const for literals,const Icon(Icons.add),Icon(Icons.add),High,
|
||||||
|
40,Performance,Avoid rebuilding entire tree,Minimal rebuild scope,Isolate changing widgets,setState on parent,Consumer only around changing widget,setState on root widget,High,
|
||||||
|
41,Performance,Use RepaintBoundary,Isolate repaints,RepaintBoundary for animations,Full screen repaints,RepaintBoundary(child: AnimatedWidget()),Animation without boundary,Medium,https://api.flutter.dev/flutter/widgets/RepaintBoundary-class.html
|
||||||
|
42,Performance,Profile with DevTools,Measure before optimizing,Flutter DevTools profiling,Guess at performance,DevTools performance tab,Optimize without measuring,Medium,https://docs.flutter.dev/tools/devtools
|
||||||
|
43,Accessibility,Use Semantics widget,Screen reader support,Semantics for accessibility,Missing accessibility info,Semantics(label: 'Submit button'),GestureDetector without semantics,High,https://api.flutter.dev/flutter/widgets/Semantics-class.html
|
||||||
|
44,Accessibility,Support large fonts,MediaQuery text scaling,MediaQuery.textScaleFactor,Fixed font sizes,style: Theme.of(context).textTheme,TextStyle(fontSize: 14),High,
|
||||||
|
45,Accessibility,Test with screen readers,TalkBack and VoiceOver,Test accessibility regularly,Skip accessibility testing,Regular TalkBack testing,No screen reader testing,High,
|
||||||
|
46,Testing,Use widget tests,Test widget behavior,WidgetTester for UI tests,Unit tests only,testWidgets('...' (tester) async {}),Only test() for UI,Medium,https://docs.flutter.dev/testing
|
||||||
|
47,Testing,Use integration tests,Full app testing,integration_test package,Manual testing only,IntegrationTestWidgetsFlutterBinding,Manual E2E testing,Medium,
|
||||||
|
48,Testing,Mock dependencies,Isolate tests,Mockito or mocktail,Real dependencies in tests,when(mock.method()).thenReturn(),Real API calls in tests,Medium,
|
||||||
|
49,Platform,Use Platform checks,Platform-specific code,Platform.isIOS Platform.isAndroid,Same code for all platforms,if (Platform.isIOS) {},Hardcoded iOS behavior,Medium,
|
||||||
|
50,Platform,Use kIsWeb for web,Web platform detection,kIsWeb for web checks,Platform for web,if (kIsWeb) {},Platform.isWeb (doesn't exist),Medium,
|
||||||
|
51,Packages,Use pub.dev packages,Community packages,Popular maintained packages,Custom implementations,cached_network_image,Custom image cache,Medium,https://pub.dev/
|
||||||
|
52,Packages,Check package quality,Quality before adding,Pub points and popularity,Any package without review,100+ pub points,Unmaintained packages,Medium,
|
||||||
|
56
.codex/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv
Normal file
56
.codex/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
||||||
|
1,Animation,Use Tailwind animate utilities,Built-in animations are optimized and respect reduced-motion,Use animate-pulse animate-spin animate-ping,Custom @keyframes for simple effects,animate-pulse,@keyframes pulse {...},Medium,https://tailwindcss.com/docs/animation
|
||||||
|
2,Animation,Limit bounce animations,Continuous bounce is distracting and causes motion sickness,Use animate-bounce sparingly on CTAs only,Multiple bounce animations on page,Single CTA with animate-bounce,5+ elements with animate-bounce,High,
|
||||||
|
3,Animation,Transition duration,Use appropriate transition speeds for UI feedback,duration-150 to duration-300 for UI,duration-1000 or longer for UI elements,transition-all duration-200,transition-all duration-1000,Medium,https://tailwindcss.com/docs/transition-duration
|
||||||
|
4,Animation,Hover transitions,Add smooth transitions on hover state changes,Add transition class with hover states,Instant hover changes without transition,hover:bg-gray-100 transition-colors,hover:bg-gray-100 (no transition),Low,
|
||||||
|
5,Z-Index,Use Tailwind z-* scale,Consistent stacking context with predefined scale,z-0 z-10 z-20 z-30 z-40 z-50,Arbitrary z-index values,z-50 for modals,z-[9999],Medium,https://tailwindcss.com/docs/z-index
|
||||||
|
6,Z-Index,Fixed elements z-index,Fixed navigation and modals need explicit z-index,z-50 for nav z-40 for dropdowns,Relying on DOM order for stacking,fixed top-0 z-50,fixed top-0 (no z-index),High,
|
||||||
|
7,Z-Index,Negative z-index for backgrounds,Use negative z-index for decorative backgrounds,z-[-1] for background elements,Positive z-index for backgrounds,-z-10 for decorative,z-10 for background,Low,
|
||||||
|
8,Layout,Container max-width,Limit content width for readability,max-w-7xl mx-auto for main content,Full-width content on large screens,max-w-7xl mx-auto px-4,w-full (no max-width),Medium,https://tailwindcss.com/docs/container
|
||||||
|
9,Layout,Responsive padding,Adjust padding for different screen sizes,px-4 md:px-6 lg:px-8,Same padding all sizes,px-4 sm:px-6 lg:px-8,px-8 (same all sizes),Medium,
|
||||||
|
10,Layout,Grid gaps,Use consistent gap utilities for spacing,gap-4 gap-6 gap-8,Margins on individual items,grid gap-6,grid with mb-4 on each item,Medium,https://tailwindcss.com/docs/gap
|
||||||
|
11,Layout,Flexbox alignment,Use flex utilities for alignment,items-center justify-between,Multiple nested wrappers,flex items-center justify-between,Nested divs for alignment,Low,
|
||||||
|
12,Images,Aspect ratio,Maintain consistent image aspect ratios,aspect-video aspect-square,No aspect ratio on containers,aspect-video rounded-lg,No aspect control,Medium,https://tailwindcss.com/docs/aspect-ratio
|
||||||
|
13,Images,Object fit,Control image scaling within containers,object-cover object-contain,Stretched distorted images,object-cover w-full h-full,No object-fit,Medium,https://tailwindcss.com/docs/object-fit
|
||||||
|
14,Images,Lazy loading,Defer loading of off-screen images,loading='lazy' on images,All images eager load,<img loading='lazy'>,<img> without lazy,High,
|
||||||
|
15,Images,Responsive images,Serve appropriate image sizes,srcset and sizes attributes,Same large image all devices,srcset with multiple sizes,4000px image everywhere,High,
|
||||||
|
16,Typography,Prose plugin,Use @tailwindcss/typography for rich text,prose prose-lg for article content,Custom styles for markdown,prose prose-lg max-w-none,Custom text styling,Medium,https://tailwindcss.com/docs/typography-plugin
|
||||||
|
17,Typography,Line height,Use appropriate line height for readability,leading-relaxed for body text,Default tight line height,leading-relaxed (1.625),leading-none or leading-tight,Medium,https://tailwindcss.com/docs/line-height
|
||||||
|
18,Typography,Font size scale,Use consistent text size scale,text-sm text-base text-lg text-xl,Arbitrary font sizes,text-lg,text-[17px],Low,https://tailwindcss.com/docs/font-size
|
||||||
|
19,Typography,Text truncation,Handle long text gracefully,truncate or line-clamp-*,Overflow breaking layout,line-clamp-2,No overflow handling,Medium,https://tailwindcss.com/docs/text-overflow
|
||||||
|
20,Colors,Opacity utilities,Use color opacity utilities,bg-black/50 text-white/80,Separate opacity class,bg-black/50,bg-black opacity-50,Low,https://tailwindcss.com/docs/background-color
|
||||||
|
21,Colors,Dark mode,Support dark mode with dark: prefix,dark:bg-gray-900 dark:text-white,No dark mode support,dark:bg-gray-900,Only light theme,Medium,https://tailwindcss.com/docs/dark-mode
|
||||||
|
22,Colors,Semantic colors,Use semantic color naming in config,primary secondary danger success,Generic color names in components,bg-primary,bg-blue-500 everywhere,Medium,
|
||||||
|
23,Spacing,Consistent spacing scale,Use Tailwind spacing scale consistently,p-4 m-6 gap-8,Arbitrary pixel values,p-4 (1rem),p-[15px],Low,https://tailwindcss.com/docs/customizing-spacing
|
||||||
|
24,Spacing,Negative margins,Use sparingly for overlapping effects,-mt-4 for overlapping elements,Negative margins for layout fixing,-mt-8 for card overlap,-m-2 to fix spacing issues,Medium,
|
||||||
|
25,Spacing,Space between,Use space-y-* for vertical lists,space-y-4 on flex/grid column,Margin on each child,space-y-4,Each child has mb-4,Low,https://tailwindcss.com/docs/space
|
||||||
|
26,Forms,Focus states,Always show focus indicators,focus:ring-2 focus:ring-blue-500,Remove focus outline,focus:ring-2 focus:ring-offset-2,focus:outline-none (no replacement),High,
|
||||||
|
27,Forms,Input sizing,Consistent input dimensions,h-10 px-3 for inputs,Inconsistent input heights,h-10 w-full px-3,Various heights per input,Medium,
|
||||||
|
28,Forms,Disabled states,Clear disabled styling,disabled:opacity-50 disabled:cursor-not-allowed,No disabled indication,disabled:opacity-50,Same style as enabled,Medium,
|
||||||
|
29,Forms,Placeholder styling,Style placeholder text appropriately,placeholder:text-gray-400,Dark placeholder text,placeholder:text-gray-400,Default dark placeholder,Low,
|
||||||
|
30,Responsive,Mobile-first approach,Start with mobile styles and add breakpoints,Default mobile + md: lg: xl:,Desktop-first approach,text-sm md:text-base,text-base max-md:text-sm,Medium,https://tailwindcss.com/docs/responsive-design
|
||||||
|
31,Responsive,Breakpoint testing,Test at standard breakpoints,320 375 768 1024 1280 1536,Only test on development device,Test all breakpoints,Single device testing,High,
|
||||||
|
32,Responsive,Hidden/shown utilities,Control visibility per breakpoint,hidden md:block,Different content per breakpoint,hidden md:flex,Separate mobile/desktop components,Low,https://tailwindcss.com/docs/display
|
||||||
|
33,Buttons,Button sizing,Consistent button dimensions,px-4 py-2 or px-6 py-3,Inconsistent button sizes,px-4 py-2 text-sm,Various padding per button,Medium,
|
||||||
|
34,Buttons,Touch targets,Minimum 44px touch target on mobile,min-h-[44px] on mobile,Small buttons on mobile,min-h-[44px] min-w-[44px],h-8 w-8 on mobile,High,
|
||||||
|
35,Buttons,Loading states,Show loading feedback,disabled + spinner icon,Clickable during loading,<Button disabled><Spinner/></Button>,Button without loading state,High,
|
||||||
|
36,Buttons,Icon buttons,Accessible icon-only buttons,aria-label on icon buttons,Icon button without label,<button aria-label='Close'><XIcon/></button>,<button><XIcon/></button>,High,
|
||||||
|
37,Cards,Card structure,Consistent card styling,rounded-lg shadow-md p-6,Inconsistent card styles,rounded-2xl shadow-lg p-6,Mixed card styling,Low,
|
||||||
|
38,Cards,Card hover states,Interactive cards should have hover feedback,hover:shadow-lg transition-shadow,No hover on clickable cards,hover:shadow-xl transition-shadow,Static cards that are clickable,Medium,
|
||||||
|
39,Cards,Card spacing,Consistent internal card spacing,space-y-4 for card content,Inconsistent internal spacing,space-y-4 or p-6,Mixed mb-2 mb-4 mb-6,Low,
|
||||||
|
40,Accessibility,Screen reader text,Provide context for screen readers,sr-only for hidden labels,Missing context for icons,<span class='sr-only'>Close menu</span>,No label for icon button,High,https://tailwindcss.com/docs/screen-readers
|
||||||
|
41,Accessibility,Focus visible,Show focus only for keyboard users,focus-visible:ring-2,Focus on all interactions,focus-visible:ring-2,focus:ring-2 (shows on click too),Medium,
|
||||||
|
42,Accessibility,Reduced motion,Respect user motion preferences,motion-reduce:animate-none,Ignore motion preferences,motion-reduce:transition-none,No reduced motion support,High,https://tailwindcss.com/docs/hover-focus-and-other-states#prefers-reduced-motion
|
||||||
|
43,Performance,Configure content paths,Tailwind needs to know where classes are used,Use 'content' array in config,Use deprecated 'purge' option (v2),"content: ['./src/**/*.{js,ts,jsx,tsx}']",purge: [...],High,https://tailwindcss.com/docs/content-configuration
|
||||||
|
44,Performance,JIT mode,Use JIT for faster builds and smaller bundles,JIT enabled (default in v3),Full CSS in development,Tailwind v3 defaults,Tailwind v2 without JIT,Medium,
|
||||||
|
45,Performance,Avoid @apply bloat,Use @apply sparingly,Direct utilities in HTML,Heavy @apply usage,class='px-4 py-2 rounded',@apply px-4 py-2 rounded;,Low,https://tailwindcss.com/docs/reusing-styles
|
||||||
|
46,Plugins,Official plugins,Use official Tailwind plugins,@tailwindcss/forms typography aspect-ratio,Custom implementations,@tailwindcss/forms,Custom form reset CSS,Medium,https://tailwindcss.com/docs/plugins
|
||||||
|
47,Plugins,Custom utilities,Create utilities for repeated patterns,Custom utility in config,Repeated arbitrary values,Custom shadow utility,"shadow-[0_4px_20px_rgba(0,0,0,0.1)] everywhere",Medium,
|
||||||
|
48,Layout,Container Queries,Use @container for component-based responsiveness,Use @container and @lg: etc.,Media queries for component internals,@container @lg:grid-cols-2,@media (min-width: ...) inside component,Medium,https://github.com/tailwindlabs/tailwindcss-container-queries
|
||||||
|
49,Interactivity,Group and Peer,Style based on parent/sibling state,group-hover peer-checked,JS for simple state interactions,group-hover:text-blue-500,onMouseEnter={() => setHover(true)},Low,https://tailwindcss.com/docs/hover-focus-and-other-states#styling-based-on-parent-state
|
||||||
|
50,Customization,Arbitrary Values,Use [] for one-off values,w-[350px] for specific needs,Creating config for single use,top-[117px] (if strictly needed),style={{ top: '117px' }},Low,https://tailwindcss.com/docs/adding-custom-styles#using-arbitrary-values
|
||||||
|
51,Colors,Theme color variables,Define colors in Tailwind theme and use directly,bg-primary text-success border-cta,bg-[var(--color-primary)] text-[var(--color-success)],bg-primary,bg-[var(--color-primary)],Medium,https://tailwindcss.com/docs/customizing-colors
|
||||||
|
52,Colors,Use bg-linear-to-* for gradients,Tailwind v4 uses bg-linear-to-* syntax for gradients,bg-linear-to-r bg-linear-to-b,bg-gradient-to-* (deprecated in v4),bg-linear-to-r from-blue-500 to-purple-500,bg-gradient-to-r from-blue-500 to-purple-500,Medium,https://tailwindcss.com/docs/background-image
|
||||||
|
53,Layout,Use shrink-0 shorthand,Shorter class name for flex-shrink-0,shrink-0 shrink,flex-shrink-0 flex-shrink,shrink-0,flex-shrink-0,Low,https://tailwindcss.com/docs/flex-shrink
|
||||||
|
54,Layout,Use size-* for square dimensions,Single utility for equal width and height,size-4 size-8 size-12,Separate h-* w-* for squares,size-6,h-6 w-6,Low,https://tailwindcss.com/docs/size
|
||||||
|
55,Images,SVG explicit dimensions,Add width/height attributes to SVGs to prevent layout shift before CSS loads,<svg class='size-6' width='24' height='24'>,SVG without explicit dimensions,<svg class='size-6' width='24' height='24'>,<svg class='size-6'>,High,
|
||||||
|
53
.codex/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv
Normal file
53
.codex/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
||||||
|
1,Composable,Pure UI composables,Composable functions should only render UI,Accept state and callbacks,Calling usecase/repo,Pure UI composable,Business logic in UI,High,https://developer.android.com/jetpack/compose/mental-model
|
||||||
|
2,Composable,Small composables,Each composable has single responsibility,Split into components,Huge composable,Reusable UI,Monolithic UI,Medium,
|
||||||
|
3,Composable,Stateless by default,Prefer stateless composables,Hoist state,Local mutable state,Stateless UI,Hidden state,High,https://developer.android.com/jetpack/compose/state#state-hoisting
|
||||||
|
4,State,Single source of truth,UI state comes from one source,StateFlow from VM,Multiple states,Unified UiState,Scattered state,High,https://developer.android.com/topic/architecture/ui-layer
|
||||||
|
5,State,Model UI State,Use sealed interface/data class,UiState.Loading,Boolean flags,Explicit state,Flag hell,High,
|
||||||
|
6,State,remember only UI state,remember for UI-only state,"Scroll, animation",Business state,Correct remember,Misuse remember,High,https://developer.android.com/jetpack/compose/state
|
||||||
|
7,State,rememberSaveable,Persist state across config,rememberSaveable,remember,State survives,State lost,High,https://developer.android.com/jetpack/compose/state#restore-ui-state
|
||||||
|
8,State,derivedStateOf,Optimize recomposition,derivedStateOf,Recompute always,Optimized,Jank,Medium,https://developer.android.com/jetpack/compose/performance
|
||||||
|
9,SideEffect,LaunchedEffect keys,Use correct keys,LaunchedEffect(id),LaunchedEffect(Unit),Scoped effect,Infinite loop,High,https://developer.android.com/jetpack/compose/side-effects
|
||||||
|
10,SideEffect,rememberUpdatedState,Avoid stale lambdas,rememberUpdatedState,Capture directly,Safe callback,Stale state,Medium,https://developer.android.com/jetpack/compose/side-effects
|
||||||
|
11,SideEffect,DisposableEffect,Clean up resources,onDispose,No cleanup,No leak,Memory leak,High,
|
||||||
|
12,Architecture,Unidirectional data flow,UI → VM → State,onEvent,Two-way binding,Predictable flow,Hard debug,High,https://developer.android.com/topic/architecture
|
||||||
|
13,Architecture,No business logic in UI,Logic belongs to VM,Collect state,Call repo,Clean UI,Fat UI,High,
|
||||||
|
14,Architecture,Expose immutable state,Expose StateFlow,asStateFlow,Mutable exposed,Safe API,State mutation,High,
|
||||||
|
15,Lifecycle,Lifecycle-aware collect,Use collectAsStateWithLifecycle,Lifecycle aware,collectAsState,No leak,Leak,High,https://developer.android.com/jetpack/compose/lifecycle
|
||||||
|
16,Navigation,Event-based navigation,VM emits navigation event,"VM: Channel + receiveAsFlow(), V: Collect with Dispatchers.Main.immediate",Nav in UI,Decoupled nav,Using State / SharedFlow for navigation -> event is replayed and navigation fires again (StateFlow),High,https://developer.android.com/jetpack/compose/navigation
|
||||||
|
17,Navigation,Typed routes,Use sealed routes,sealed class Route,String routes,Type-safe,Runtime crash,Medium,
|
||||||
|
18,Performance,Stable parameters,Prefer immutable/stable params,@Immutable,Mutable params,Stable recomposition,Extra recomposition,High,https://developer.android.com/jetpack/compose/performance
|
||||||
|
19,Performance,Use key in Lazy,Provide stable keys,key=id,No key,Stable list,Item jump,High,
|
||||||
|
20,Performance,Avoid heavy work,No heavy computation in UI,Precompute in VM,Compute in UI,Smooth UI,Jank,High,
|
||||||
|
21,Performance,Remember expensive objects,remember heavy objects,remember,Recreate each recomposition,Efficient,Wasteful,Medium,
|
||||||
|
22,Theming,Design system,Centralized theme,Material3 tokens,Hardcoded values,Consistent UI,Inconsistent,High,https://developer.android.com/jetpack/compose/themes
|
||||||
|
23,Theming,Dark mode support,Theme-based colors,colorScheme,Fixed color,Adaptive UI,Broken dark,Medium,
|
||||||
|
24,Layout,Prefer Modifier over extra layouts,Use Modifier to adjust layout instead of adding wrapper composables,Use Modifier.padding(),Wrap content with extra Box,Padding via modifier,Box just for padding,High,https://developer.android.com/jetpack/compose/modifiers
|
||||||
|
25,Layout,Avoid deep layout nesting,Deep layout trees increase measure & layout cost,Keep layout flat,Box ? Column ? Box ? Row,Flat hierarchy,Deep nested tree,High,
|
||||||
|
26,Layout,Use Row/Column for linear layout,Linear layouts are simpler and more performant,Use Row / Column,Custom layout for simple cases,Row/Column usage,Over-engineered layout,High,
|
||||||
|
27,Layout,Use Box only for overlapping content,Box should be used only when children overlap,Stack elements,Use Box as Column,Proper overlay,Misused Box,Medium,
|
||||||
|
28,Layout,Prefer LazyColumn over Column scroll,Lazy layouts are virtualized and efficient,LazyColumn,Column.verticalScroll(),Lazy list,Scrollable Column,High,https://developer.android.com/jetpack/compose/lists
|
||||||
|
29,Layout,Avoid nested scroll containers,Nested scrolling causes UX & performance issues,Single scroll container,Scroll inside scroll,One scroll per screen,Nested scroll,High,
|
||||||
|
30,Layout,Avoid fillMaxSize by default,fillMaxSize may break parent constraints,Use exact size,Fill max everywhere,Constraint-aware size,Overfilled layout,Medium,
|
||||||
|
31,Layout,Avoid intrinsic size unless necessary,Intrinsic measurement is expensive,Explicit sizing,IntrinsicSize.Min,Predictable layout,Expensive measure,High,https://developer.android.com/jetpack/compose/layout/intrinsics
|
||||||
|
32,Layout,Use Arrangement and Alignment APIs,Declare layout intent explicitly,Use Arrangement / Alignment,Manual spacing hacks,Declarative spacing,Magic spacing,High,
|
||||||
|
33,Layout,Extract reusable layout patterns,Repeated layouts should be shared,Create layout composable,Copy-paste layouts,Reusable scaffold,Duplicated layout,High,
|
||||||
|
34,Theming,No hardcoded text style,Use typography,MaterialTheme.typography,Hardcode sp,Scalable,Inconsistent,Medium,
|
||||||
|
35,Testing,Stateless UI testing,Composable easy to test,Pass state,Hidden state,Testable,Hard test,High,https://developer.android.com/jetpack/compose/testing
|
||||||
|
36,Testing,Use testTag,Stable UI selectors,Modifier.testTag,Find by text,Stable tests,Flaky tests,Medium,
|
||||||
|
37,Preview,Multiple previews,Preview multiple states,@Preview,Single preview,Better dev UX,Misleading,Low,https://developer.android.com/jetpack/compose/tooling/preview
|
||||||
|
38,DI,Inject VM via Hilt,Use hiltViewModel,@HiltViewModel,Manual VM,Clean DI,Coupling,High,https://developer.android.com/training/dependency-injection/hilt-jetpack
|
||||||
|
39,DI,No DI in UI,Inject in VM,Constructor inject,Inject composable,Proper scope,Wrong scope,High,
|
||||||
|
40,Accessibility,Content description,Accessible UI,contentDescription,Ignore a11y,Inclusive,A11y fail,Medium,https://developer.android.com/jetpack/compose/accessibility
|
||||||
|
41,Accessibility,Semantics,Use semantics API,Modifier.semantics,None,Testable a11y,Invisible,Medium,
|
||||||
|
42,Animation,Compose animation APIs,Use animate*AsState,AnimatedVisibility,Manual anim,Smooth,Jank,Medium,https://developer.android.com/jetpack/compose/animation
|
||||||
|
43,Animation,Avoid animation logic in VM,Animation is UI concern,Animate in UI,Animate in VM,Correct layering,Mixed concern,Low,
|
||||||
|
44,Modularization,Feature-based UI modules,UI per feature,:feature:ui,God module,Scalable,Tight coupling,High,https://developer.android.com/topic/modularization
|
||||||
|
45,Modularization,Public UI contracts,Expose minimal UI API,Interface/Route,Expose impl,Encapsulated,Leaky module,Medium,
|
||||||
|
46,State,Snapshot state only,Use Compose state,mutableStateOf,Custom observable,Compose aware,Buggy UI,Medium,
|
||||||
|
47,State,Avoid mutable collections,Immutable list/map,PersistentList,MutableList,Stable UI,Silent bug,High,
|
||||||
|
48,Lifecycle,RememberCoroutineScope usage,Only for UI jobs,UI coroutine,Long jobs,Scoped job,Leak,Medium,https://developer.android.com/jetpack/compose/side-effects#remembercoroutinescope
|
||||||
|
49,Interop,Interop View carefully,Use AndroidView,Isolated usage,Mix everywhere,Safe interop,Messy UI,Low,https://developer.android.com/jetpack/compose/interop
|
||||||
|
50,Interop,Avoid legacy patterns,No LiveData in UI,StateFlow,LiveData,Modern stack,Legacy debt,Medium,
|
||||||
|
51,Debug,Use layout inspector,Inspect recomposition,Tools,Blind debug,Fast debug,Guessing,Low,https://developer.android.com/studio/debug/layout-inspector
|
||||||
|
52,Debug,Enable recomposition counts,Track recomposition,Debug flags,Ignore,Performance aware,Hidden jank,Low,
|
||||||
|
53
.codex/skills/ui-ux-pro-max/data/stacks/nextjs.csv
Normal file
53
.codex/skills/ui-ux-pro-max/data/stacks/nextjs.csv
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
||||||
|
1,Routing,Use App Router for new projects,App Router is the recommended approach in Next.js 14+,app/ directory with page.tsx,pages/ for new projects,app/dashboard/page.tsx,pages/dashboard.tsx,Medium,https://nextjs.org/docs/app
|
||||||
|
2,Routing,Use file-based routing,Create routes by adding files in app directory,page.tsx for routes layout.tsx for layouts,Manual route configuration,app/blog/[slug]/page.tsx,Custom router setup,Medium,https://nextjs.org/docs/app/building-your-application/routing
|
||||||
|
3,Routing,Colocate related files,Keep components styles tests with their routes,Component files alongside page.tsx,Separate components folder,app/dashboard/_components/,components/dashboard/,Low,
|
||||||
|
4,Routing,Use route groups for organization,Group routes without affecting URL,Parentheses for route groups,Nested folders affecting URL,(marketing)/about/page.tsx,marketing/about/page.tsx,Low,https://nextjs.org/docs/app/building-your-application/routing/route-groups
|
||||||
|
5,Routing,Handle loading states,Use loading.tsx for route loading UI,loading.tsx alongside page.tsx,Manual loading state management,app/dashboard/loading.tsx,useState for loading in page,Medium,https://nextjs.org/docs/app/building-your-application/routing/loading-ui-and-streaming
|
||||||
|
6,Routing,Handle errors with error.tsx,Catch errors at route level,error.tsx with reset function,try/catch in every component,app/dashboard/error.tsx,try/catch in page component,High,https://nextjs.org/docs/app/building-your-application/routing/error-handling
|
||||||
|
7,Rendering,Use Server Components by default,Server Components reduce client JS bundle,Keep components server by default,Add 'use client' unnecessarily,export default function Page(),('use client') for static content,High,https://nextjs.org/docs/app/building-your-application/rendering/server-components
|
||||||
|
8,Rendering,Mark Client Components explicitly,'use client' for interactive components,Add 'use client' only when needed,Server Component with hooks/events,('use client') for onClick useState,No directive with useState,High,https://nextjs.org/docs/app/building-your-application/rendering/client-components
|
||||||
|
9,Rendering,Push Client Components down,Keep Client Components as leaf nodes,Client wrapper for interactive parts only,Mark page as Client Component,<InteractiveButton/> in Server Page,('use client') on page.tsx,High,
|
||||||
|
10,Rendering,Use streaming for better UX,Stream content with Suspense boundaries,Suspense for slow data fetches,Wait for all data before render,<Suspense><SlowComponent/></Suspense>,await allData then render,Medium,https://nextjs.org/docs/app/building-your-application/routing/loading-ui-and-streaming
|
||||||
|
11,Rendering,Choose correct rendering strategy,SSG for static SSR for dynamic ISR for semi-static,generateStaticParams for known paths,SSR for static content,export const revalidate = 3600,fetch without cache config,Medium,
|
||||||
|
12,DataFetching,Fetch data in Server Components,Fetch directly in async Server Components,async function Page() { const data = await fetch() },useEffect for initial data,const data = await fetch(url),useEffect(() => fetch(url)),High,https://nextjs.org/docs/app/building-your-application/data-fetching
|
||||||
|
13,DataFetching,Configure caching explicitly (Next.js 15+),Next.js 15 changed defaults to uncached for fetch,Explicitly set cache: 'force-cache' for static data,Assume default is cached (it's not in Next.js 15),fetch(url { cache: 'force-cache' }),fetch(url) // Uncached in v15,High,https://nextjs.org/docs/app/building-your-application/upgrading/version-15
|
||||||
|
14,DataFetching,Deduplicate fetch requests,React and Next.js dedupe same requests,Same fetch call in multiple components,Manual request deduplication,Multiple components fetch same URL,Custom cache layer,Low,
|
||||||
|
15,DataFetching,Use Server Actions for mutations,Server Actions for form submissions,action={serverAction} in forms,API route for every mutation,<form action={createPost}>,<form onSubmit={callApiRoute}>,Medium,https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations
|
||||||
|
16,DataFetching,Revalidate data appropriately,Use revalidatePath/revalidateTag after mutations,Revalidate after Server Action,'use client' with manual refetch,revalidatePath('/posts'),router.refresh() everywhere,Medium,https://nextjs.org/docs/app/building-your-application/caching#revalidating
|
||||||
|
17,Images,Use next/image for optimization,Automatic image optimization and lazy loading,<Image> component for all images,<img> tags directly,<Image src={} alt={} width={} height={}>,<img src={}/>,High,https://nextjs.org/docs/app/building-your-application/optimizing/images
|
||||||
|
18,Images,Provide width and height,Prevent layout shift with dimensions,width and height props or fill,Missing dimensions,<Image width={400} height={300}/>,<Image src={url}/>,High,
|
||||||
|
19,Images,Use fill for responsive images,Fill container with object-fit,fill prop with relative parent,Fixed dimensions for responsive,"<Image fill className=""object-cover""/>",<Image width={window.width}/>,Medium,
|
||||||
|
20,Images,Configure remote image domains,Whitelist external image sources,remotePatterns in next.config.js,Allow all domains,remotePatterns: [{ hostname: 'cdn.example.com' }],domains: ['*'],High,https://nextjs.org/docs/app/api-reference/components/image#remotepatterns
|
||||||
|
21,Images,Use priority for LCP images,Mark above-fold images as priority,priority prop on hero images,All images with priority,<Image priority src={hero}/>,<Image priority/> on every image,Medium,
|
||||||
|
22,Fonts,Use next/font for fonts,Self-hosted fonts with zero layout shift,next/font/google or next/font/local,External font links,import { Inter } from 'next/font/google',"<link href=""fonts.googleapis.com""/>",Medium,https://nextjs.org/docs/app/building-your-application/optimizing/fonts
|
||||||
|
23,Fonts,Apply font to layout,Set font in root layout for consistency,className on body in layout.tsx,Font in individual pages,<body className={inter.className}>,Each page imports font,Low,
|
||||||
|
24,Fonts,Use variable fonts,Variable fonts reduce bundle size,Single variable font file,Multiple font weights as files,Inter({ subsets: ['latin'] }),Inter_400 Inter_500 Inter_700,Low,
|
||||||
|
25,Metadata,Use generateMetadata for dynamic,Generate metadata based on params,export async function generateMetadata(),Hardcoded metadata everywhere,generateMetadata({ params }),export const metadata = {},Medium,https://nextjs.org/docs/app/building-your-application/optimizing/metadata
|
||||||
|
26,Metadata,Include OpenGraph images,Add OG images for social sharing,opengraph-image.tsx or og property,Missing social preview images,opengraph: { images: ['/og.png'] },No OG configuration,Medium,
|
||||||
|
27,Metadata,Use metadata API,Export metadata object for static metadata,export const metadata = {},Manual head tags,export const metadata = { title: 'Page' },<head><title>Page</title></head>,Medium,
|
||||||
|
28,API,Use Route Handlers for APIs,app/api routes for API endpoints,app/api/users/route.ts,pages/api for new projects,export async function GET(request),export default function handler,Medium,https://nextjs.org/docs/app/building-your-application/routing/route-handlers
|
||||||
|
29,API,Return proper Response objects,Use NextResponse for API responses,NextResponse.json() for JSON,Plain objects or res.json(),return NextResponse.json({ data }),return { data },Medium,
|
||||||
|
30,API,Handle HTTP methods explicitly,Export named functions for methods,Export GET POST PUT DELETE,Single handler for all methods,export async function POST(),switch(req.method),Low,
|
||||||
|
31,API,Validate request body,Validate input before processing,Zod or similar for validation,Trust client input,const body = schema.parse(await req.json()),const body = await req.json(),High,
|
||||||
|
32,Middleware,Use middleware for auth,Protect routes with middleware.ts,middleware.ts at root,Auth check in every page,export function middleware(request),if (!session) redirect in page,Medium,https://nextjs.org/docs/app/building-your-application/routing/middleware
|
||||||
|
33,Middleware,Match specific paths,Configure middleware matcher,config.matcher for specific routes,Run middleware on all routes,matcher: ['/dashboard/:path*'],No matcher config,Medium,
|
||||||
|
34,Middleware,Keep middleware edge-compatible,Middleware runs on Edge runtime,Edge-compatible code only,Node.js APIs in middleware,Edge-compatible auth check,fs.readFile in middleware,High,
|
||||||
|
35,Environment,Use NEXT_PUBLIC prefix,Client-accessible env vars need prefix,NEXT_PUBLIC_ for client vars,Server vars exposed to client,NEXT_PUBLIC_API_URL,API_SECRET in client code,High,https://nextjs.org/docs/app/building-your-application/configuring/environment-variables
|
||||||
|
36,Environment,Validate env vars,Check required env vars exist,Validate on startup,Undefined env at runtime,if (!process.env.DATABASE_URL) throw,process.env.DATABASE_URL (might be undefined),High,
|
||||||
|
37,Environment,Use .env.local for secrets,Local env file for development secrets,.env.local gitignored,Secrets in .env committed,.env.local with secrets,.env with DATABASE_PASSWORD,High,
|
||||||
|
38,Performance,Analyze bundle size,Use @next/bundle-analyzer,Bundle analyzer in dev,Ship large bundles blindly,ANALYZE=true npm run build,No bundle analysis,Medium,https://nextjs.org/docs/app/building-your-application/optimizing/bundle-analyzer
|
||||||
|
39,Performance,Use dynamic imports,Code split with next/dynamic,dynamic() for heavy components,Import everything statically,const Chart = dynamic(() => import('./Chart')),import Chart from './Chart',Medium,https://nextjs.org/docs/app/building-your-application/optimizing/lazy-loading
|
||||||
|
40,Performance,Avoid layout shifts,Reserve space for dynamic content,Skeleton loaders aspect ratios,Content popping in,"<Skeleton className=""h-48""/>",No placeholder for async content,High,
|
||||||
|
41,Performance,Use Partial Prerendering,Combine static and dynamic in one route,Static shell with Suspense holes,Full dynamic or static pages,Static header + dynamic content,Entire page SSR,Low,https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering
|
||||||
|
42,Link,Use next/link for navigation,Client-side navigation with prefetching,"<Link href=""""> for internal links",<a> for internal navigation,"<Link href=""/about"">About</Link>","<a href=""/about"">About</a>",High,https://nextjs.org/docs/app/api-reference/components/link
|
||||||
|
43,Link,Prefetch strategically,Control prefetching behavior,prefetch={false} for low-priority,Prefetch all links,<Link prefetch={false}>,Default prefetch on every link,Low,
|
||||||
|
44,Link,Use scroll option appropriately,Control scroll behavior on navigation,scroll={false} for tabs pagination,Always scroll to top,<Link scroll={false}>,Manual scroll management,Low,
|
||||||
|
45,Config,Use next.config.js correctly,Configure Next.js behavior,Proper config options,Deprecated or wrong options,images: { remotePatterns: [] },images: { domains: [] },Medium,https://nextjs.org/docs/app/api-reference/next-config-js
|
||||||
|
46,Config,Enable strict mode,Catch potential issues early,reactStrictMode: true,Strict mode disabled,reactStrictMode: true,reactStrictMode: false,Medium,
|
||||||
|
47,Config,Configure redirects and rewrites,Use config for URL management,redirects() rewrites() in config,Manual redirect handling,redirects: async () => [...],res.redirect in pages,Medium,https://nextjs.org/docs/app/api-reference/next-config-js/redirects
|
||||||
|
48,Deployment,Use Vercel for easiest deploy,Vercel optimized for Next.js,Deploy to Vercel,Self-host without knowledge,vercel deploy,Complex Docker setup for simple app,Low,https://nextjs.org/docs/app/building-your-application/deploying
|
||||||
|
49,Deployment,Configure output for self-hosting,Set output option for deployment target,output: 'standalone' for Docker,Default output for containers,output: 'standalone',No output config for Docker,Medium,https://nextjs.org/docs/app/building-your-application/deploying#self-hosting
|
||||||
|
50,Security,Sanitize user input,Never trust user input,Escape sanitize validate all input,Direct interpolation of user data,DOMPurify.sanitize(userInput),dangerouslySetInnerHTML={{ __html: userInput }},High,
|
||||||
|
51,Security,Use CSP headers,Content Security Policy for XSS protection,Configure CSP in next.config.js,No security headers,headers() with CSP,No CSP configuration,High,https://nextjs.org/docs/app/building-your-application/configuring/content-security-policy
|
||||||
|
52,Security,Validate Server Action input,Server Actions are public endpoints,Validate and authorize in Server Action,Trust Server Action input,Auth check + validation in action,Direct database call without check,High,
|
||||||
|
51
.codex/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv
Normal file
51
.codex/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
||||||
|
1,Installation,Add Nuxt UI module,Install and configure Nuxt UI in your Nuxt project,pnpm add @nuxt/ui and add to modules,Manual component imports,"modules: ['@nuxt/ui']","import { UButton } from '@nuxt/ui'",High,https://ui.nuxt.com/docs/getting-started/installation/nuxt
|
||||||
|
2,Installation,Import Tailwind and Nuxt UI CSS,Required CSS imports in main.css file,@import tailwindcss and @import @nuxt/ui,Skip CSS imports,"@import ""tailwindcss""; @import ""@nuxt/ui"";",No CSS imports,High,https://ui.nuxt.com/docs/getting-started/installation/nuxt
|
||||||
|
3,Installation,Wrap app with UApp component,UApp provides global configs for Toast Tooltip and overlays,<UApp> wrapper in app.vue,Skip UApp wrapper,<UApp><NuxtPage/></UApp>,<NuxtPage/> without wrapper,High,https://ui.nuxt.com/docs/components/app
|
||||||
|
4,Components,Use U prefix for components,All Nuxt UI components use U prefix by default,UButton UInput UModal,Button Input Modal,<UButton>Click</UButton>,<Button>Click</Button>,Medium,https://ui.nuxt.com/docs/getting-started/installation/nuxt
|
||||||
|
5,Components,Use semantic color props,Use semantic colors like primary secondary error,color="primary" color="error",Hardcoded colors,"<UButton color=""primary"">","<UButton class=""bg-green-500"">",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system
|
||||||
|
6,Components,Use variant prop for styling,Nuxt UI provides solid outline soft subtle ghost link variants,variant="soft" variant="outline",Custom button classes,"<UButton variant=""soft"">","<UButton class=""border bg-transparent"">",Medium,https://ui.nuxt.com/docs/components/button
|
||||||
|
7,Components,Use size prop consistently,Components support xs sm md lg xl sizes,size="sm" size="lg",Arbitrary sizing classes,"<UButton size=""lg"">","<UButton class=""text-xl px-6"">",Low,https://ui.nuxt.com/docs/components/button
|
||||||
|
8,Icons,Use icon prop with Iconify format,Nuxt UI supports Iconify icons via icon prop,icon="lucide:home" icon="heroicons:user",i-lucide-home format,"<UButton icon=""lucide:home"">","<UButton icon=""i-lucide-home"">",Medium,https://ui.nuxt.com/docs/getting-started/integrations/icons/nuxt
|
||||||
|
9,Icons,Use leadingIcon and trailingIcon,Position icons with dedicated props for clarity,leadingIcon="lucide:plus" trailingIcon="lucide:arrow-right",Manual icon positioning,"<UButton leadingIcon=""lucide:plus"">","<UButton><Icon name=""lucide:plus""/>Add</UButton>",Low,https://ui.nuxt.com/docs/components/button
|
||||||
|
10,Theming,Configure colors in app.config.ts,Runtime color configuration without restart,ui.colors.primary in app.config.ts,Hardcoded colors in components,"defineAppConfig({ ui: { colors: { primary: 'blue' } } })","<UButton class=""bg-blue-500"">",High,https://ui.nuxt.com/docs/getting-started/theme/design-system
|
||||||
|
11,Theming,Use @theme directive for custom colors,Define design tokens in CSS with Tailwind @theme,@theme { --color-brand-500: #xxx },Inline color definitions,@theme { --color-brand-500: #ef4444; },:style="{ color: '#ef4444' }",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system
|
||||||
|
12,Theming,Extend semantic colors in nuxt.config,Register new colors like tertiary in theme.colors,theme.colors array in ui config,Use undefined colors,"ui: { theme: { colors: ['primary', 'tertiary'] } }","<UButton color=""tertiary""> without config",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system
|
||||||
|
13,Forms,Use UForm with schema validation,UForm supports Zod Yup Joi Valibot schemas,:schema prop with validation schema,Manual form validation,"<UForm :schema=""schema"" :state=""state"">",Manual @blur validation,High,https://ui.nuxt.com/docs/components/form
|
||||||
|
14,Forms,Use UFormField for field wrapper,Provides label error message and validation display,UFormField with name prop,Manual error handling,"<UFormField name=""email"" label=""Email"">",<div><label>Email</label><UInput/><span>error</span></div>,Medium,https://ui.nuxt.com/docs/components/form-field
|
||||||
|
15,Forms,Handle form submit with @submit,UForm emits submit event with validated data,@submit handler on UForm,@click on submit button,"<UForm @submit=""onSubmit"">","<UButton @click=""onSubmit"">",Medium,https://ui.nuxt.com/docs/components/form
|
||||||
|
16,Forms,Use validateOn prop for validation timing,Control when validation triggers (blur change input),validateOn="['blur']" for performance,Always validate on input,"<UForm :validateOn=""['blur', 'change']"">","<UForm> (validates on every keystroke)",Low,https://ui.nuxt.com/docs/components/form
|
||||||
|
17,Overlays,Use v-model:open for overlay control,Modal Slideover Drawer use v-model:open,v-model:open for controlled state,Manual show/hide logic,"<UModal v-model:open=""isOpen"">",<UModal v-if="isOpen">,Medium,https://ui.nuxt.com/docs/components/modal
|
||||||
|
18,Overlays,Use useOverlay composable for programmatic overlays,Open overlays programmatically without template refs,useOverlay().open(MyModal),Template ref and manual control,"const overlay = useOverlay(); overlay.open(MyModal, { props })","const modal = ref(); modal.value.open()",Medium,https://ui.nuxt.com/docs/components/modal
|
||||||
|
19,Overlays,Use title and description props,Built-in header support for overlays,title="Confirm" description="Are you sure?",Manual header content,"<UModal title=""Confirm"" description=""Are you sure?"">","<UModal><template #header><h2>Confirm</h2></template>",Low,https://ui.nuxt.com/docs/components/modal
|
||||||
|
20,Dashboard,Use UDashboardSidebar for navigation,Provides collapsible resizable sidebar with mobile support,UDashboardSidebar with header default footer slots,Custom sidebar implementation,<UDashboardSidebar><template #header>...</template></UDashboardSidebar>,<aside class="w-64 border-r">,Medium,https://ui.nuxt.com/docs/components/dashboard-sidebar
|
||||||
|
21,Dashboard,Use UDashboardGroup for layout,Wraps dashboard components with sidebar state management,UDashboardGroup > UDashboardSidebar + UDashboardPanel,Manual layout flex containers,<UDashboardGroup><UDashboardSidebar/><UDashboardPanel/></UDashboardGroup>,"<div class=""flex""><aside/><main/></div>",Medium,https://ui.nuxt.com/docs/components/dashboard-group
|
||||||
|
22,Dashboard,Use UDashboardNavbar for top navigation,Responsive navbar with mobile menu support,UDashboardNavbar in dashboard layout,Custom navbar implementation,<UDashboardNavbar :links="navLinks"/>,<nav class="border-b">,Low,https://ui.nuxt.com/docs/components/dashboard-navbar
|
||||||
|
23,Tables,Use UTable with data and columns props,Powered by TanStack Table with built-in features,:data and :columns props,Manual table markup,"<UTable :data=""users"" :columns=""columns""/>","<table><tr v-for=""user in users"">",High,https://ui.nuxt.com/docs/components/table
|
||||||
|
24,Tables,Define columns with accessorKey,Column definitions use accessorKey for data binding,accessorKey: 'email' in column def,String column names only,"{ accessorKey: 'email', header: 'Email' }","['name', 'email']",Medium,https://ui.nuxt.com/docs/components/table
|
||||||
|
25,Tables,Use cell slot for custom rendering,Customize cell content with scoped slots,#cell-columnName slot,Override entire table,<template #cell-status="{ row }">,Manual column render function,Medium,https://ui.nuxt.com/docs/components/table
|
||||||
|
26,Tables,Enable sorting with sortable column option,Add sortable: true to column definition,sortable: true in column,Manual sort implementation,"{ accessorKey: 'name', sortable: true }",@click="sortBy('name')",Low,https://ui.nuxt.com/docs/components/table
|
||||||
|
27,Navigation,Use UNavigationMenu for nav links,Horizontal or vertical navigation with dropdown support,UNavigationMenu with items array,Manual nav with v-for,"<UNavigationMenu :items=""navItems""/>","<nav><a v-for=""item in items"">",Medium,https://ui.nuxt.com/docs/components/navigation-menu
|
||||||
|
28,Navigation,Use UBreadcrumb for page hierarchy,Automatic breadcrumb with NuxtLink support,:items array with label and to,Manual breadcrumb links,"<UBreadcrumb :items=""breadcrumbs""/>","<nav><span v-for=""crumb in crumbs"">",Low,https://ui.nuxt.com/docs/components/breadcrumb
|
||||||
|
29,Navigation,Use UTabs for tabbed content,Tab navigation with content panels,UTabs with items containing slot content,Manual tab state,"<UTabs :items=""tabs""/>","<div><button @click=""tab=1"">",Medium,https://ui.nuxt.com/docs/components/tabs
|
||||||
|
30,Feedback,Use useToast for notifications,Composable for toast notifications,useToast().add({ title description }),Alert components for toasts,"const toast = useToast(); toast.add({ title: 'Saved' })",<UAlert v-if="showSuccess">,High,https://ui.nuxt.com/docs/components/toast
|
||||||
|
31,Feedback,Use UAlert for inline messages,Static alert messages with icon and actions,UAlert with title description color,Toast for static messages,"<UAlert title=""Warning"" color=""warning""/>",useToast for inline alerts,Medium,https://ui.nuxt.com/docs/components/alert
|
||||||
|
32,Feedback,Use USkeleton for loading states,Placeholder content during data loading,USkeleton with appropriate size,Spinner for content loading,<USkeleton class="h-4 w-32"/>,<UIcon name="lucide:loader" class="animate-spin"/>,Low,https://ui.nuxt.com/docs/components/skeleton
|
||||||
|
33,Color Mode,Use UColorModeButton for theme toggle,Built-in light/dark mode toggle button,UColorModeButton component,Manual color mode logic,<UColorModeButton/>,"<button @click=""toggleColorMode"">",Low,https://ui.nuxt.com/docs/components/color-mode-button
|
||||||
|
34,Color Mode,Use UColorModeSelect for theme picker,Dropdown to select system light or dark mode,UColorModeSelect component,Custom select for theme,<UColorModeSelect/>,"<USelect v-model=""colorMode"" :items=""modes""/>",Low,https://ui.nuxt.com/docs/components/color-mode-select
|
||||||
|
35,Customization,Use ui prop for component styling,Override component styles via ui prop,ui prop with slot class overrides,Global CSS overrides,"<UButton :ui=""{ base: 'rounded-full' }""/>",<UButton class="!rounded-full"/>,Medium,https://ui.nuxt.com/docs/getting-started/theme/components
|
||||||
|
36,Customization,Configure default variants in nuxt.config,Set default color and size for all components,theme.defaultVariants in ui config,Repeat props on every component,"ui: { theme: { defaultVariants: { color: 'neutral' } } }","<UButton color=""neutral""> everywhere",Medium,https://ui.nuxt.com/docs/getting-started/installation/nuxt
|
||||||
|
37,Customization,Use app.config.ts for theme overrides,Runtime theme customization,defineAppConfig with ui key,nuxt.config for runtime values,"defineAppConfig({ ui: { button: { defaultVariants: { size: 'sm' } } } })","nuxt.config ui.button.size: 'sm'",Medium,https://ui.nuxt.com/docs/getting-started/theme/components
|
||||||
|
38,Performance,Enable component detection,Tree-shake unused component CSS,experimental.componentDetection: true,Include all component CSS,"ui: { experimental: { componentDetection: true } }","ui: {} (includes all CSS)",Low,https://ui.nuxt.com/docs/getting-started/installation/nuxt
|
||||||
|
39,Performance,Use UTable virtualize for large data,Enable virtualization for 1000+ rows,:virtualize prop on UTable,Render all rows,"<UTable :data=""largeData"" virtualize/>","<UTable :data=""largeData""/>",Medium,https://ui.nuxt.com/docs/components/table
|
||||||
|
40,Accessibility,Use semantic component props,Components have built-in ARIA support,Use title description label props,Skip accessibility props,"<UModal title=""Settings"">","<UModal><h2>Settings</h2>",Medium,https://ui.nuxt.com/docs/components/modal
|
||||||
|
41,Accessibility,Use UFormField for form accessibility,Automatic label-input association,UFormField wraps inputs,Manual id and for attributes,"<UFormField label=""Email""><UInput/></UFormField>","<label for=""email"">Email</label><UInput id=""email""/>",High,https://ui.nuxt.com/docs/components/form-field
|
||||||
|
42,Content,Use UContentToc for table of contents,Automatic TOC with active heading highlight,UContentToc with :links,Manual TOC implementation,"<UContentToc :links=""toc""/>","<nav><a v-for=""heading in headings"">",Low,https://ui.nuxt.com/docs/components/content-toc
|
||||||
|
43,Content,Use UContentSearch for docs search,Command palette for documentation search,UContentSearch with Nuxt Content,Custom search implementation,<UContentSearch/>,<UCommandPalette :groups="searchResults"/>,Low,https://ui.nuxt.com/docs/components/content-search
|
||||||
|
44,AI/Chat,Use UChatMessages for chat UI,Designed for Vercel AI SDK integration,UChatMessages with messages array,Custom chat message list,"<UChatMessages :messages=""messages""/>","<div v-for=""msg in messages"">",Medium,https://ui.nuxt.com/docs/components/chat-messages
|
||||||
|
45,AI/Chat,Use UChatPrompt for input,Enhanced textarea for AI prompts,UChatPrompt with v-model,Basic textarea,<UChatPrompt v-model="prompt"/>,<UTextarea v-model="prompt"/>,Medium,https://ui.nuxt.com/docs/components/chat-prompt
|
||||||
|
46,Editor,Use UEditor for rich text,TipTap-based editor with toolbar support,UEditor with v-model:content,Custom TipTap setup,"<UEditor v-model:content=""content""/>",Manual TipTap initialization,Medium,https://ui.nuxt.com/docs/components/editor
|
||||||
|
47,Links,Use to prop for navigation,UButton and ULink support NuxtLink to prop,to="/dashboard" for internal links,href for internal navigation,"<UButton to=""/dashboard"">","<UButton href=""/dashboard"">",Medium,https://ui.nuxt.com/docs/components/button
|
||||||
|
48,Links,Use external prop for outside links,Explicitly mark external links,target="_blank" with external URLs,Forget rel="noopener","<UButton to=""https://example.com"" target=""_blank"">","<UButton href=""https://..."">",Low,https://ui.nuxt.com/docs/components/link
|
||||||
|
49,Loading,Use loadingAuto on buttons,Automatic loading state from @click promise,loadingAuto prop on UButton,Manual loading state,"<UButton loadingAuto @click=""async () => await save()"">","<UButton :loading=""isLoading"" @click=""save"">",Low,https://ui.nuxt.com/docs/components/button
|
||||||
|
50,Loading,Use UForm loadingAuto,Auto-disable form during submit,loadingAuto on UForm (default true),Manual form disabled state,"<UForm @submit=""handleSubmit"">","<UForm :disabled=""isSubmitting"">",Low,https://ui.nuxt.com/docs/components/form
|
||||||
|
Can't render this file because it contains an unexpected character in line 6 and column 94.
|
59
.codex/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv
Normal file
59
.codex/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
||||||
|
1,Routing,Use file-based routing,Create routes by adding files in pages directory,pages/ directory with index.vue,Manual route configuration,pages/dashboard/index.vue,Custom router setup,Medium,https://nuxt.com/docs/getting-started/routing
|
||||||
|
2,Routing,Use dynamic route parameters,Create dynamic routes with bracket syntax,[id].vue for dynamic params,Hardcoded routes for dynamic content,pages/posts/[id].vue,pages/posts/post1.vue,Medium,https://nuxt.com/docs/getting-started/routing
|
||||||
|
3,Routing,Use catch-all routes,Handle multiple path segments with [...slug],[...slug].vue for catch-all,Multiple nested dynamic routes,pages/[...slug].vue,pages/[a]/[b]/[c].vue,Low,https://nuxt.com/docs/getting-started/routing
|
||||||
|
4,Routing,Define page metadata with definePageMeta,Set page-level configuration and middleware,definePageMeta for layout middleware title,Manual route meta configuration,"definePageMeta({ layout: 'admin', middleware: 'auth' })",router.beforeEach for page config,High,https://nuxt.com/docs/api/utils/define-page-meta
|
||||||
|
5,Routing,Use validate for route params,Validate dynamic route parameters before rendering,validate function in definePageMeta,Manual validation in setup,"definePageMeta({ validate: (route) => /^\d+$/.test(route.params.id) })",if (!valid) navigateTo('/404'),Medium,https://nuxt.com/docs/api/utils/define-page-meta
|
||||||
|
6,Rendering,Use SSR by default,Server-side rendering is enabled by default,Keep ssr: true (default),Disable SSR unnecessarily,ssr: true (default),ssr: false for all pages,High,https://nuxt.com/docs/guide/concepts/rendering
|
||||||
|
7,Rendering,Use .client suffix for client-only components,Mark components to render only on client,ComponentName.client.vue suffix,v-if with process.client check,Comments.client.vue,<div v-if="process.client"><Comments/></div>,Medium,https://nuxt.com/docs/guide/directory-structure/components
|
||||||
|
8,Rendering,Use .server suffix for server-only components,Mark components to render only on server,ComponentName.server.vue suffix,Manual server check,HeavyMarkdown.server.vue,v-if="process.server",Low,https://nuxt.com/docs/guide/directory-structure/components
|
||||||
|
9,DataFetching,Use useFetch for simple data fetching,Wrapper around useAsyncData for URL fetching,useFetch for API calls,$fetch in onMounted,"const { data } = await useFetch('/api/posts')","onMounted(async () => { data.value = await $fetch('/api/posts') })",High,https://nuxt.com/docs/api/composables/use-fetch
|
||||||
|
10,DataFetching,Use useAsyncData for complex fetching,Fine-grained control over async data,useAsyncData for CMS or custom fetching,useFetch for non-URL data sources,"const { data } = await useAsyncData('posts', () => cms.getPosts())","const { data } = await useFetch(() => cms.getPosts())",Medium,https://nuxt.com/docs/api/composables/use-async-data
|
||||||
|
11,DataFetching,Use $fetch for non-reactive requests,$fetch for event handlers and non-component code,$fetch in event handlers or server routes,useFetch in click handlers,"async function submit() { await $fetch('/api/submit', { method: 'POST' }) }","async function submit() { await useFetch('/api/submit') }",High,https://nuxt.com/docs/api/utils/dollarfetch
|
||||||
|
12,DataFetching,Use lazy option for non-blocking fetch,Defer data fetching for better initial load,lazy: true for below-fold content,Blocking fetch for non-critical data,"useFetch('/api/comments', { lazy: true })",await useFetch('/api/comments') for footer,Medium,https://nuxt.com/docs/api/composables/use-fetch
|
||||||
|
13,DataFetching,Use server option to control fetch location,Choose where data is fetched,server: false for client-only data,Server fetch for user-specific client data,"useFetch('/api/user-preferences', { server: false })",useFetch for localStorage-dependent data,Medium,https://nuxt.com/docs/api/composables/use-fetch
|
||||||
|
14,DataFetching,Use pick to reduce payload size,Select only needed fields from response,pick option for large responses,Fetching entire objects when few fields needed,"useFetch('/api/user', { pick: ['id', 'name'] })",useFetch('/api/user') then destructure,Low,https://nuxt.com/docs/api/composables/use-fetch
|
||||||
|
15,DataFetching,Use transform for data manipulation,Transform data before storing in state,transform option for data shaping,Manual transformation after fetch,"useFetch('/api/posts', { transform: (posts) => posts.map(p => p.title) })",const titles = data.value.map(p => p.title),Low,https://nuxt.com/docs/api/composables/use-fetch
|
||||||
|
16,DataFetching,Handle loading and error states,Always handle pending and error states,Check status pending error refs,Ignoring loading states,"<div v-if=""status === 'pending'"">Loading...</div>",No loading indicator,High,https://nuxt.com/docs/getting-started/data-fetching
|
||||||
|
17,Lifecycle,Avoid side effects in script setup root,Move side effects to lifecycle hooks,Side effects in onMounted,setInterval in root script setup,"onMounted(() => { interval = setInterval(...) })","<script setup>setInterval(...)</script>",High,https://nuxt.com/docs/guide/concepts/nuxt-lifecycle
|
||||||
|
18,Lifecycle,Use onMounted for DOM access,Access DOM only after component is mounted,onMounted for DOM manipulation,Direct DOM access in setup,"onMounted(() => { document.getElementById('el') })","<script setup>document.getElementById('el')</script>",High,https://nuxt.com/docs/api/composables/on-mounted
|
||||||
|
19,Lifecycle,Use nextTick for post-render access,Wait for DOM updates before accessing elements,await nextTick() after state changes,Immediate DOM access after state change,"count.value++; await nextTick(); el.value.focus()","count.value++; el.value.focus()",Medium,https://nuxt.com/docs/api/utils/next-tick
|
||||||
|
20,Lifecycle,Use onPrehydrate for pre-hydration logic,Run code before Nuxt hydrates the page,onPrehydrate for client setup,onMounted for hydration-critical code,"onPrehydrate(() => { console.log(window) })",onMounted for pre-hydration needs,Low,https://nuxt.com/docs/api/composables/on-prehydrate
|
||||||
|
21,Server,Use server/api for API routes,Create API endpoints in server/api directory,server/api/users.ts for /api/users,Manual Express setup,server/api/hello.ts -> /api/hello,app.get('/api/hello'),High,https://nuxt.com/docs/guide/directory-structure/server
|
||||||
|
22,Server,Use defineEventHandler for handlers,Define server route handlers,defineEventHandler for all handlers,export default function,"export default defineEventHandler((event) => { return { hello: 'world' } })","export default function(req, res) {}",High,https://nuxt.com/docs/guide/directory-structure/server
|
||||||
|
23,Server,Use server/routes for non-api routes,Routes without /api prefix,server/routes for custom paths,server/api for non-api routes,server/routes/sitemap.xml.ts,server/api/sitemap.xml.ts,Medium,https://nuxt.com/docs/guide/directory-structure/server
|
||||||
|
24,Server,Use getQuery and readBody for input,Access query params and request body,getQuery(event) readBody(event),Direct event access,"const { id } = getQuery(event)",event.node.req.query,Medium,https://nuxt.com/docs/guide/directory-structure/server
|
||||||
|
25,Server,Validate server input,Always validate input in server handlers,Zod or similar for validation,Trust client input,"const body = await readBody(event); schema.parse(body)",const body = await readBody(event),High,https://nuxt.com/docs/guide/directory-structure/server
|
||||||
|
26,State,Use useState for shared reactive state,SSR-friendly shared state across components,useState for cross-component state,ref for shared state,"const count = useState('count', () => 0)",const count = ref(0) in composable,High,https://nuxt.com/docs/api/composables/use-state
|
||||||
|
27,State,Use unique keys for useState,Prevent state conflicts with unique keys,Descriptive unique keys for each state,Generic or duplicate keys,"useState('user-preferences', () => ({}))",useState('data') in multiple places,Medium,https://nuxt.com/docs/api/composables/use-state
|
||||||
|
28,State,Use Pinia for complex state,Pinia for advanced state management,@pinia/nuxt for complex apps,Custom state management,useMainStore() with Pinia,Custom reactive store implementation,Medium,https://nuxt.com/docs/getting-started/state-management
|
||||||
|
29,State,Use callOnce for one-time async operations,Ensure async operations run only once,callOnce for store initialization,Direct await in component,"await callOnce(store.fetch)",await store.fetch() on every render,Medium,https://nuxt.com/docs/api/utils/call-once
|
||||||
|
30,SEO,Use useSeoMeta for SEO tags,Type-safe SEO meta tag management,useSeoMeta for meta tags,useHead for simple meta,"useSeoMeta({ title: 'Home', ogTitle: 'Home', description: '...' })","useHead({ meta: [{ name: 'description', content: '...' }] })",High,https://nuxt.com/docs/api/composables/use-seo-meta
|
||||||
|
31,SEO,Use reactive values in useSeoMeta,Dynamic SEO tags with refs or getters,Computed getters for dynamic values,Static values for dynamic content,"useSeoMeta({ title: () => post.value.title })","useSeoMeta({ title: post.value.title })",Medium,https://nuxt.com/docs/api/composables/use-seo-meta
|
||||||
|
32,SEO,Use useHead for non-meta head elements,Scripts styles links in head,useHead for scripts and links,useSeoMeta for scripts,"useHead({ script: [{ src: '/analytics.js' }] })","useSeoMeta({ script: '...' })",Medium,https://nuxt.com/docs/api/composables/use-head
|
||||||
|
33,SEO,Include OpenGraph tags,Add OG tags for social sharing,ogTitle ogDescription ogImage,Missing social preview,"useSeoMeta({ ogImage: '/og.png', twitterCard: 'summary_large_image' })",No OG configuration,Medium,https://nuxt.com/docs/api/composables/use-seo-meta
|
||||||
|
34,Middleware,Use defineNuxtRouteMiddleware,Define route middleware properly,defineNuxtRouteMiddleware wrapper,export default function,"export default defineNuxtRouteMiddleware((to, from) => {})","export default function(to, from) {}",High,https://nuxt.com/docs/guide/directory-structure/middleware
|
||||||
|
35,Middleware,Use navigateTo for redirects,Redirect in middleware with navigateTo,return navigateTo('/login'),router.push in middleware,"if (!auth) return navigateTo('/login')","if (!auth) router.push('/login')",High,https://nuxt.com/docs/api/utils/navigate-to
|
||||||
|
36,Middleware,Reference middleware in definePageMeta,Apply middleware to specific pages,middleware array in definePageMeta,Global middleware for page-specific,definePageMeta({ middleware: ['auth'] }),Global auth check for one page,Medium,https://nuxt.com/docs/guide/directory-structure/middleware
|
||||||
|
37,Middleware,Use .global suffix for global middleware,Apply middleware to all routes,auth.global.ts for app-wide auth,Manual middleware on every page,middleware/auth.global.ts,middleware: ['auth'] on every page,Medium,https://nuxt.com/docs/guide/directory-structure/middleware
|
||||||
|
38,ErrorHandling,Use createError for errors,Create errors with proper status codes,createError with statusCode,throw new Error,"throw createError({ statusCode: 404, statusMessage: 'Not Found' })",throw new Error('Not Found'),High,https://nuxt.com/docs/api/utils/create-error
|
||||||
|
39,ErrorHandling,Use NuxtErrorBoundary for local errors,Handle errors within component subtree,NuxtErrorBoundary for component errors,Global error page for local errors,"<NuxtErrorBoundary @error=""log""><template #error=""{ error }"">",error.vue for component errors,Medium,https://nuxt.com/docs/getting-started/error-handling
|
||||||
|
40,ErrorHandling,Use clearError to recover from errors,Clear error state and optionally redirect,clearError({ redirect: '/' }),Manual error state reset,clearError({ redirect: '/home' }),error.value = null,Medium,https://nuxt.com/docs/api/utils/clear-error
|
||||||
|
41,ErrorHandling,Use short statusMessage,Keep statusMessage brief for security,Short generic messages,Detailed error info in statusMessage,"createError({ statusCode: 400, statusMessage: 'Bad Request' })","createError({ statusMessage: 'Invalid user ID: 123' })",High,https://nuxt.com/docs/getting-started/error-handling
|
||||||
|
42,Link,Use NuxtLink for internal navigation,Client-side navigation with prefetching,<NuxtLink to> for internal links,<a href> for internal links,<NuxtLink to="/about">About</NuxtLink>,<a href="/about">About</a>,High,https://nuxt.com/docs/api/components/nuxt-link
|
||||||
|
43,Link,Configure prefetch behavior,Control when prefetching occurs,prefetchOn for interaction-based,Default prefetch for low-priority,"<NuxtLink prefetch-on=""interaction"">",Always default prefetch,Low,https://nuxt.com/docs/api/components/nuxt-link
|
||||||
|
44,Link,Use useRouter for programmatic navigation,Navigate programmatically,useRouter().push() for navigation,Direct window.location,"const router = useRouter(); router.push('/dashboard')",window.location.href = '/dashboard',Medium,https://nuxt.com/docs/api/composables/use-router
|
||||||
|
45,Link,Use navigateTo in composables,Navigate outside components,navigateTo() in middleware or plugins,useRouter in non-component code,return navigateTo('/login'),router.push in middleware,Medium,https://nuxt.com/docs/api/utils/navigate-to
|
||||||
|
46,AutoImports,Leverage auto-imports,Use auto-imported composables directly,Direct use of ref computed useFetch,Manual imports for Nuxt composables,"const count = ref(0)","import { ref } from 'vue'; const count = ref(0)",Medium,https://nuxt.com/docs/guide/concepts/auto-imports
|
||||||
|
47,AutoImports,Use #imports for explicit imports,Explicit imports when needed,#imports for clarity or disabled auto-imports,"import from 'vue' when auto-import enabled","import { ref } from '#imports'","import { ref } from 'vue'",Low,https://nuxt.com/docs/guide/concepts/auto-imports
|
||||||
|
48,AutoImports,Configure third-party auto-imports,Add external package auto-imports,imports.presets in nuxt.config,Manual imports everywhere,"imports: { presets: [{ from: 'vue-i18n', imports: ['useI18n'] }] }",import { useI18n } everywhere,Low,https://nuxt.com/docs/guide/concepts/auto-imports
|
||||||
|
49,Plugins,Use defineNuxtPlugin,Define plugins properly,defineNuxtPlugin wrapper,export default function,"export default defineNuxtPlugin((nuxtApp) => {})","export default function(ctx) {}",High,https://nuxt.com/docs/guide/directory-structure/plugins
|
||||||
|
50,Plugins,Use provide for injection,Provide helpers across app,return { provide: {} } for type safety,nuxtApp.provide without types,"return { provide: { hello: (name) => `Hello ${name}!` } }","nuxtApp.provide('hello', fn)",Medium,https://nuxt.com/docs/guide/directory-structure/plugins
|
||||||
|
51,Plugins,Use .client or .server suffix,Control plugin execution environment,plugin.client.ts for client-only,if (process.client) checks,analytics.client.ts,"if (process.client) { // analytics }",Medium,https://nuxt.com/docs/guide/directory-structure/plugins
|
||||||
|
52,Environment,Use runtimeConfig for env vars,Access environment variables safely,runtimeConfig in nuxt.config,process.env directly,"runtimeConfig: { apiSecret: '', public: { apiBase: '' } }",process.env.API_SECRET in components,High,https://nuxt.com/docs/guide/going-further/runtime-config
|
||||||
|
53,Environment,Use NUXT_ prefix for env override,Override config with environment variables,NUXT_API_SECRET NUXT_PUBLIC_API_BASE,Custom env var names,NUXT_PUBLIC_API_BASE=https://api.example.com,API_BASE=https://api.example.com,High,https://nuxt.com/docs/guide/going-further/runtime-config
|
||||||
|
54,Environment,Access public config with useRuntimeConfig,Get public config in components,useRuntimeConfig().public,Direct process.env access,const config = useRuntimeConfig(); config.public.apiBase,process.env.NUXT_PUBLIC_API_BASE,High,https://nuxt.com/docs/api/composables/use-runtime-config
|
||||||
|
55,Environment,Keep secrets in private config,Server-only secrets in runtimeConfig root,runtimeConfig.apiSecret (server only),Secrets in public config,runtimeConfig: { dbPassword: '' },runtimeConfig: { public: { dbPassword: '' } },High,https://nuxt.com/docs/guide/going-further/runtime-config
|
||||||
|
56,Performance,Use Lazy prefix for code splitting,Lazy load components with Lazy prefix,<LazyComponent> for below-fold,Eager load all components,<LazyMountainsList v-if="show"/>,<MountainsList/> for hidden content,Medium,https://nuxt.com/docs/guide/directory-structure/components
|
||||||
|
57,Performance,Use useLazyFetch for non-blocking data,Alias for useFetch with lazy: true,useLazyFetch for secondary data,useFetch for all requests,"const { data } = useLazyFetch('/api/comments')",await useFetch for comments section,Medium,https://nuxt.com/docs/api/composables/use-lazy-fetch
|
||||||
|
58,Performance,Use lazy hydration for interactivity,Delay component hydration until needed,LazyComponent with hydration strategy,Immediate hydration for all,<LazyModal hydrate-on-visible/>,<Modal/> in footer,Low,https://nuxt.com/docs/guide/going-further/experimental-features
|
||||||
|
Can't render this file because it contains an unexpected character in line 8 and column 193.
|
52
.codex/skills/ui-ux-pro-max/data/stacks/react-native.csv
Normal file
52
.codex/skills/ui-ux-pro-max/data/stacks/react-native.csv
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
||||||
|
1,Components,Use functional components,Hooks-based components are standard,Functional components with hooks,Class components,const App = () => { },class App extends Component,Medium,https://reactnative.dev/docs/intro-react
|
||||||
|
2,Components,Keep components small,Single responsibility principle,Split into smaller components,Large monolithic components,<Header /><Content /><Footer />,500+ line component,Medium,
|
||||||
|
3,Components,Use TypeScript,Type safety for props and state,TypeScript for new projects,JavaScript without types,const Button: FC<Props> = () => { },const Button = (props) => { },Medium,
|
||||||
|
4,Components,Colocate component files,Keep related files together,Component folder with styles,Flat structure,components/Button/index.tsx styles.ts,components/Button.tsx styles/button.ts,Low,
|
||||||
|
5,Styling,Use StyleSheet.create,Optimized style objects,StyleSheet for all styles,Inline style objects,StyleSheet.create({ container: {} }),style={{ margin: 10 }},High,https://reactnative.dev/docs/stylesheet
|
||||||
|
6,Styling,Avoid inline styles,Prevent object recreation,Styles in StyleSheet,Inline style objects in render,style={styles.container},"style={{ margin: 10, padding: 5 }}",Medium,
|
||||||
|
7,Styling,Use flexbox for layout,React Native uses flexbox,flexDirection alignItems justifyContent,Absolute positioning everywhere,flexDirection: 'row',position: 'absolute' everywhere,Medium,https://reactnative.dev/docs/flexbox
|
||||||
|
8,Styling,Handle platform differences,Platform-specific styles,Platform.select or .ios/.android files,Same styles for both platforms,"Platform.select({ ios: {}, android: {} })",Hardcoded iOS values,Medium,https://reactnative.dev/docs/platform-specific-code
|
||||||
|
9,Styling,Use responsive dimensions,Scale for different screens,Dimensions or useWindowDimensions,Fixed pixel values,useWindowDimensions(),width: 375,Medium,
|
||||||
|
10,Navigation,Use React Navigation,Standard navigation library,React Navigation for routing,Manual navigation management,createStackNavigator(),Custom navigation state,Medium,https://reactnavigation.org/
|
||||||
|
11,Navigation,Type navigation params,Type-safe navigation,Typed navigation props,Untyped navigation,"navigation.navigate<RootStackParamList>('Home', { id })","navigation.navigate('Home', { id })",Medium,
|
||||||
|
12,Navigation,Use deep linking,Support URL-based navigation,Configure linking prop,No deep link support,linking: { prefixes: [] },No linking configuration,Medium,https://reactnavigation.org/docs/deep-linking/
|
||||||
|
13,Navigation,Handle back button,Android back button handling,useFocusEffect with BackHandler,Ignore back button,BackHandler.addEventListener,No back handler,High,
|
||||||
|
14,State,Use useState for local state,Simple component state,useState for UI state,Class component state,"const [count, setCount] = useState(0)",this.state = { count: 0 },Medium,
|
||||||
|
15,State,Use useReducer for complex state,Complex state logic,useReducer for related state,Multiple useState for related values,useReducer(reducer initialState),5+ useState calls,Medium,
|
||||||
|
16,State,Use context sparingly,Context for global state,Context for theme auth locale,Context for frequently changing data,ThemeContext for app theme,Context for list item data,Medium,
|
||||||
|
17,State,Consider Zustand or Redux,External state management,Zustand for simple Redux for complex,useState for global state,create((set) => ({ })),Prop drilling global state,Medium,
|
||||||
|
18,Lists,Use FlatList for long lists,Virtualized list rendering,FlatList for 50+ items,ScrollView with map,<FlatList data={items} />,<ScrollView>{items.map()}</ScrollView>,High,https://reactnative.dev/docs/flatlist
|
||||||
|
19,Lists,Provide keyExtractor,Unique keys for list items,keyExtractor with stable ID,Index as key,keyExtractor={(item) => item.id},"keyExtractor={(_, index) => index}",High,
|
||||||
|
20,Lists,Optimize renderItem,Memoize list item components,React.memo for list items,Inline render function,renderItem={({ item }) => <MemoizedItem item={item} />},renderItem={({ item }) => <View>...</View>},High,
|
||||||
|
21,Lists,Use getItemLayout for fixed height,Skip measurement for performance,getItemLayout when height known,Dynamic measurement for fixed items,"getItemLayout={(_, index) => ({ length: 50, offset: 50 * index, index })}",No getItemLayout for fixed height,Medium,
|
||||||
|
22,Lists,Implement windowSize,Control render window,Smaller windowSize for memory,Default windowSize for large lists,windowSize={5},windowSize={21} for huge lists,Medium,
|
||||||
|
23,Performance,Use React.memo,Prevent unnecessary re-renders,memo for pure components,No memoization,export default memo(MyComponent),export default MyComponent,Medium,
|
||||||
|
24,Performance,Use useCallback for handlers,Stable function references,useCallback for props,New function on every render,"useCallback(() => {}, [deps])",() => handlePress(),Medium,
|
||||||
|
25,Performance,Use useMemo for expensive ops,Cache expensive calculations,useMemo for heavy computations,Recalculate every render,"useMemo(() => expensive(), [deps])",const result = expensive(),Medium,
|
||||||
|
26,Performance,Avoid anonymous functions in JSX,Prevent re-renders,Named handlers or useCallback,Inline arrow functions,onPress={handlePress},onPress={() => doSomething()},Medium,
|
||||||
|
27,Performance,Use Hermes engine,Improved startup and memory,Enable Hermes in build,JavaScriptCore for new projects,hermes_enabled: true,hermes_enabled: false,Medium,https://reactnative.dev/docs/hermes
|
||||||
|
28,Images,Use expo-image,Modern performant image component for React Native,"Use expo-image for caching, blurring, and performance",Use default Image for heavy lists or unmaintained libraries,<Image source={url} cachePolicy='memory-disk' /> (expo-image),<FastImage source={url} />,Medium,https://docs.expo.dev/versions/latest/sdk/image/
|
||||||
|
29,Images,Specify image dimensions,Prevent layout shifts,width and height for remote images,No dimensions for network images,<Image style={{ width: 100 height: 100 }} />,<Image source={{ uri }} /> no size,High,
|
||||||
|
30,Images,Use resizeMode,Control image scaling,resizeMode cover contain,Stretch images,"resizeMode=""cover""",No resizeMode,Low,
|
||||||
|
31,Forms,Use controlled inputs,State-controlled form fields,value + onChangeText,Uncontrolled inputs,<TextInput value={text} onChangeText={setText} />,<TextInput defaultValue={text} />,Medium,
|
||||||
|
32,Forms,Handle keyboard,Manage keyboard visibility,KeyboardAvoidingView,Content hidden by keyboard,"<KeyboardAvoidingView behavior=""padding"">",No keyboard handling,High,https://reactnative.dev/docs/keyboardavoidingview
|
||||||
|
33,Forms,Use proper keyboard types,Appropriate keyboard for input,keyboardType for input type,Default keyboard for all,"keyboardType=""email-address""","keyboardType=""default"" for email",Low,
|
||||||
|
34,Touch,Use Pressable,Modern touch handling,Pressable for touch interactions,TouchableOpacity for new code,<Pressable onPress={} />,<TouchableOpacity onPress={} />,Low,https://reactnative.dev/docs/pressable
|
||||||
|
35,Touch,Provide touch feedback,Visual feedback on press,Ripple or opacity change,No feedback on press,android_ripple={{ color: 'gray' }},No press feedback,Medium,
|
||||||
|
36,Touch,Set hitSlop for small targets,Increase touch area,hitSlop for icons and small buttons,Tiny touch targets,hitSlop={{ top: 10 bottom: 10 }},44x44 with no hitSlop,Medium,
|
||||||
|
37,Animation,Use Reanimated,High-performance animations,react-native-reanimated,Animated API for complex,useSharedValue useAnimatedStyle,Animated.timing for gesture,Medium,https://docs.swmansion.com/react-native-reanimated/
|
||||||
|
38,Animation,Run on UI thread,worklets for smooth animation,Run animations on UI thread,JS thread animations,runOnUI(() => {}),Animated on JS thread,High,
|
||||||
|
39,Animation,Use gesture handler,Native gesture recognition,react-native-gesture-handler,JS-based gesture handling,<GestureDetector>,<View onTouchMove={} />,Medium,https://docs.swmansion.com/react-native-gesture-handler/
|
||||||
|
40,Async,Handle loading states,Show loading indicators,ActivityIndicator during load,Empty screen during load,{isLoading ? <ActivityIndicator /> : <Content />},No loading state,Medium,
|
||||||
|
41,Async,Handle errors gracefully,Error boundaries and fallbacks,Error UI for failed requests,Crash on error,{error ? <ErrorView /> : <Content />},No error handling,High,
|
||||||
|
42,Async,Cancel async operations,Cleanup on unmount,AbortController or cleanup,Memory leaks from async,useEffect cleanup,No cleanup for subscriptions,High,
|
||||||
|
43,Accessibility,Add accessibility labels,Describe UI elements,accessibilityLabel for all interactive,Missing labels,"accessibilityLabel=""Submit form""",<Pressable> without label,High,https://reactnative.dev/docs/accessibility
|
||||||
|
44,Accessibility,Use accessibility roles,Semantic meaning,accessibilityRole for elements,Wrong roles,"accessibilityRole=""button""",No role for button,Medium,
|
||||||
|
45,Accessibility,Support screen readers,Test with TalkBack/VoiceOver,Test with screen readers,Skip accessibility testing,Regular TalkBack testing,No screen reader testing,High,
|
||||||
|
46,Testing,Use React Native Testing Library,Component testing,render and fireEvent,Enzyme or manual testing,render(<Component />),shallow(<Component />),Medium,https://callstack.github.io/react-native-testing-library/
|
||||||
|
47,Testing,Test on real devices,Real device behavior,Test on iOS and Android devices,Simulator only,Device testing in CI,Simulator only testing,High,
|
||||||
|
48,Testing,Use Detox for E2E,End-to-end testing,Detox for critical flows,Manual E2E testing,detox test,Manual testing only,Medium,https://wix.github.io/Detox/
|
||||||
|
49,Native,Use native modules carefully,Bridge has overhead,Batch native calls,Frequent bridge crossing,Batch updates,Call native on every keystroke,High,
|
||||||
|
50,Native,Use Expo when possible,Simplified development,Expo for standard features,Bare RN for simple apps,expo install package,react-native link package,Low,https://docs.expo.dev/
|
||||||
|
51,Native,Handle permissions,Request permissions properly,Check and request permissions,Assume permissions granted,PermissionsAndroid.request(),Access without permission check,High,https://reactnative.dev/docs/permissionsandroid
|
||||||
|
54
.codex/skills/ui-ux-pro-max/data/stacks/react.csv
Normal file
54
.codex/skills/ui-ux-pro-max/data/stacks/react.csv
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
||||||
|
1,State,Use useState for local state,Simple component state should use useState hook,useState for form inputs toggles counters,Class components this.state,"const [count, setCount] = useState(0)",this.state = { count: 0 },Medium,https://react.dev/reference/react/useState
|
||||||
|
2,State,Lift state up when needed,Share state between siblings by lifting to parent,Lift shared state to common ancestor,Prop drilling through many levels,Parent holds state passes down,Deep prop chains,Medium,https://react.dev/learn/sharing-state-between-components
|
||||||
|
3,State,Use useReducer for complex state,Complex state logic benefits from reducer pattern,useReducer for state with multiple sub-values,Multiple useState for related values,useReducer with action types,5+ useState calls that update together,Medium,https://react.dev/reference/react/useReducer
|
||||||
|
4,State,Avoid unnecessary state,Derive values from existing state when possible,Compute derived values in render,Store derivable values in state,const total = items.reduce(...),"const [total, setTotal] = useState(0)",High,https://react.dev/learn/choosing-the-state-structure
|
||||||
|
5,State,Initialize state lazily,Use function form for expensive initial state,useState(() => computeExpensive()),useState(computeExpensive()),useState(() => JSON.parse(data)),useState(JSON.parse(data)),Medium,https://react.dev/reference/react/useState#avoiding-recreating-the-initial-state
|
||||||
|
6,Effects,Clean up effects,Return cleanup function for subscriptions timers,Return cleanup function in useEffect,No cleanup for subscriptions,useEffect(() => { sub(); return unsub; }),useEffect(() => { subscribe(); }),High,https://react.dev/reference/react/useEffect#connecting-to-an-external-system
|
||||||
|
7,Effects,Specify dependencies correctly,Include all values used inside effect in deps array,All referenced values in dependency array,Empty deps with external references,[value] when using value in effect,[] when using props/state in effect,High,https://react.dev/reference/react/useEffect#specifying-reactive-dependencies
|
||||||
|
8,Effects,Avoid unnecessary effects,Don't use effects for transforming data or events,Transform data during render handle events directly,useEffect for derived state or event handling,const filtered = items.filter(...),useEffect(() => setFiltered(items.filter(...))),High,https://react.dev/learn/you-might-not-need-an-effect
|
||||||
|
9,Effects,Use refs for non-reactive values,Store values that don't trigger re-renders in refs,useRef for interval IDs DOM elements,useState for values that don't need render,const intervalRef = useRef(null),"const [intervalId, setIntervalId] = useState()",Medium,https://react.dev/reference/react/useRef
|
||||||
|
10,Rendering,Use keys properly,Stable unique keys for list items,Use stable IDs as keys,Array index as key for dynamic lists,key={item.id},key={index},High,https://react.dev/learn/rendering-lists#keeping-list-items-in-order-with-key
|
||||||
|
11,Rendering,Memoize expensive calculations,Use useMemo for costly computations,useMemo for expensive filtering/sorting,Recalculate every render,"useMemo(() => expensive(), [deps])",const result = expensiveCalc(),Medium,https://react.dev/reference/react/useMemo
|
||||||
|
12,Rendering,Memoize callbacks passed to children,Use useCallback for functions passed as props,useCallback for handlers passed to memoized children,New function reference every render,"useCallback(() => {}, [deps])",const handler = () => {},Medium,https://react.dev/reference/react/useCallback
|
||||||
|
13,Rendering,Use React.memo wisely,Wrap components that render often with same props,memo for pure components with stable props,memo everything or nothing,memo(ExpensiveList),memo(SimpleButton),Low,https://react.dev/reference/react/memo
|
||||||
|
14,Rendering,Avoid inline object/array creation in JSX,Create objects outside render or memoize,Define style objects outside component,Inline objects in props,<div style={styles.container}>,<div style={{ margin: 10 }}>,Medium,
|
||||||
|
15,Components,Keep components small and focused,Single responsibility for each component,One concern per component,Large multi-purpose components,<UserAvatar /><UserName />,<UserCard /> with 500 lines,Medium,
|
||||||
|
16,Components,Use composition over inheritance,Compose components using children and props,Use children prop for flexibility,Inheritance hierarchies,<Card>{content}</Card>,class SpecialCard extends Card,Medium,https://react.dev/learn/thinking-in-react
|
||||||
|
17,Components,Colocate related code,Keep related components and hooks together,Related files in same directory,Flat structure with many files,components/User/UserCard.tsx,components/UserCard.tsx + hooks/useUser.ts,Low,
|
||||||
|
18,Components,Use fragments to avoid extra DOM,Fragment or <> for multiple elements without wrapper,<> for grouping without DOM node,Extra div wrappers,<>{items.map(...)}</>,<div>{items.map(...)}</div>,Low,https://react.dev/reference/react/Fragment
|
||||||
|
19,Props,Destructure props,Destructure props for cleaner component code,Destructure in function signature,props.name props.value throughout,"function User({ name, age })",function User(props),Low,
|
||||||
|
20,Props,Provide default props values,Use default parameters or defaultProps,Default values in destructuring,Undefined checks throughout,function Button({ size = 'md' }),if (size === undefined) size = 'md',Low,
|
||||||
|
21,Props,Avoid prop drilling,Use context or composition for deeply nested data,Context for global data composition for UI,Passing props through 5+ levels,<UserContext.Provider>,<A user={u}><B user={u}><C user={u}>,Medium,https://react.dev/learn/passing-data-deeply-with-context
|
||||||
|
22,Props,Validate props with TypeScript,Use TypeScript interfaces for prop types,interface Props { name: string },PropTypes or no validation,interface ButtonProps { onClick: () => void },Button.propTypes = {},Medium,
|
||||||
|
23,Events,Use synthetic events correctly,React normalizes events across browsers,e.preventDefault() e.stopPropagation(),Access native event unnecessarily,onClick={(e) => e.preventDefault()},onClick={(e) => e.nativeEvent.preventDefault()},Low,https://react.dev/reference/react-dom/components/common#react-event-object
|
||||||
|
24,Events,Avoid binding in render,Use arrow functions in class or hooks,Arrow functions in functional components,bind in render or constructor,const handleClick = () => {},this.handleClick.bind(this),Medium,
|
||||||
|
25,Events,Pass event handlers not call results,Pass function reference not invocation,onClick={handleClick},onClick={handleClick()} causing immediate call,onClick={handleClick},onClick={handleClick()},High,
|
||||||
|
26,Forms,Controlled components for forms,Use state to control form inputs,value + onChange for inputs,Uncontrolled inputs with refs,<input value={val} onChange={setVal}>,<input ref={inputRef}>,Medium,https://react.dev/reference/react-dom/components/input#controlling-an-input-with-a-state-variable
|
||||||
|
27,Forms,Handle form submission properly,Prevent default and handle in submit handler,onSubmit with preventDefault,onClick on submit button only,<form onSubmit={handleSubmit}>,<button onClick={handleSubmit}>,Medium,
|
||||||
|
28,Forms,Debounce rapid input changes,Debounce search/filter inputs,useDeferredValue or debounce for search,Filter on every keystroke,useDeferredValue(searchTerm),useEffect filtering on every change,Medium,https://react.dev/reference/react/useDeferredValue
|
||||||
|
29,Hooks,Follow rules of hooks,Only call hooks at top level and in React functions,Hooks at component top level,Hooks in conditions loops or callbacks,"const [x, setX] = useState()","if (cond) { const [x, setX] = useState() }",High,https://react.dev/reference/rules/rules-of-hooks
|
||||||
|
30,Hooks,Custom hooks for reusable logic,Extract shared stateful logic to custom hooks,useCustomHook for reusable patterns,Duplicate hook logic across components,const { data } = useFetch(url),Duplicate useEffect/useState in components,Medium,https://react.dev/learn/reusing-logic-with-custom-hooks
|
||||||
|
31,Hooks,Name custom hooks with use prefix,Custom hooks must start with use,useFetch useForm useAuth,fetchData or getData for hook,function useFetch(url),function fetchData(url),High,
|
||||||
|
32,Context,Use context for global data,Context for theme auth locale,Context for app-wide state,Context for frequently changing data,<ThemeContext.Provider>,Context for form field values,Medium,https://react.dev/learn/passing-data-deeply-with-context
|
||||||
|
33,Context,Split contexts by concern,Separate contexts for different domains,ThemeContext + AuthContext,One giant AppContext,<ThemeProvider><AuthProvider>,<AppProvider value={{theme user...}}>,Medium,
|
||||||
|
34,Context,Memoize context values,Prevent unnecessary re-renders with useMemo,useMemo for context value object,New object reference every render,"value={useMemo(() => ({...}), [])}","value={{ user, theme }}",High,
|
||||||
|
35,Performance,Use React DevTools Profiler,Profile to identify performance bottlenecks,Profile before optimizing,Optimize without measuring,React DevTools Profiler,Guessing at bottlenecks,Medium,https://react.dev/learn/react-developer-tools
|
||||||
|
36,Performance,Lazy load components,Use React.lazy for code splitting,lazy() for routes and heavy components,Import everything upfront,const Page = lazy(() => import('./Page')),import Page from './Page',Medium,https://react.dev/reference/react/lazy
|
||||||
|
37,Performance,Virtualize long lists,Use windowing for lists over 100 items,react-window or react-virtual,Render thousands of DOM nodes,<VirtualizedList items={items}/>,{items.map(i => <Item />)},High,
|
||||||
|
38,Performance,Batch state updates,React 18 auto-batches but be aware,Let React batch related updates,Manual batching with flushSync,setA(1); setB(2); // batched,flushSync(() => setA(1)),Low,https://react.dev/learn/queueing-a-series-of-state-updates
|
||||||
|
39,ErrorHandling,Use error boundaries,Catch JavaScript errors in component tree,ErrorBoundary wrapping sections,Let errors crash entire app,<ErrorBoundary><App/></ErrorBoundary>,No error handling,High,https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary
|
||||||
|
40,ErrorHandling,Handle async errors,Catch errors in async operations,try/catch in async handlers,Unhandled promise rejections,try { await fetch() } catch(e) {},await fetch() // no catch,High,
|
||||||
|
41,Testing,Test behavior not implementation,Test what user sees and does,Test renders and interactions,Test internal state or methods,expect(screen.getByText('Hello')),expect(component.state.name),Medium,https://testing-library.com/docs/react-testing-library/intro/
|
||||||
|
42,Testing,Use testing-library queries,Use accessible queries,getByRole getByLabelText,getByTestId for everything,getByRole('button'),getByTestId('submit-btn'),Medium,https://testing-library.com/docs/queries/about#priority
|
||||||
|
43,Accessibility,Use semantic HTML,Proper HTML elements for their purpose,button for clicks nav for navigation,div with onClick for buttons,<button onClick={...}>,<div onClick={...}>,High,https://react.dev/reference/react-dom/components#all-html-components
|
||||||
|
44,Accessibility,Manage focus properly,Handle focus for modals dialogs,Focus trap in modals return focus on close,No focus management,useEffect to focus input,Modal without focus trap,High,
|
||||||
|
45,Accessibility,Announce dynamic content,Use ARIA live regions for updates,aria-live for dynamic updates,Silent updates to screen readers,"<div aria-live=""polite"">{msg}</div>",<div>{msg}</div>,Medium,
|
||||||
|
46,Accessibility,Label form controls,Associate labels with inputs,htmlFor matching input id,Placeholder as only label,"<label htmlFor=""email"">Email</label>","<input placeholder=""Email""/>",High,
|
||||||
|
47,TypeScript,Type component props,Define interfaces for all props,interface Props with all prop types,any or missing types,interface Props { name: string },function Component(props: any),High,
|
||||||
|
48,TypeScript,Type state properly,Provide types for useState,useState<Type>() for complex state,Inferred any types,useState<User | null>(null),useState(null),Medium,
|
||||||
|
49,TypeScript,Type event handlers,Use React event types,React.ChangeEvent<HTMLInputElement>,Generic Event type,onChange: React.ChangeEvent<HTMLInputElement>,onChange: Event,Medium,
|
||||||
|
50,TypeScript,Use generics for reusable components,Generic components for flexible typing,Generic props for list components,Union types for flexibility,<List<T> items={T[]}>,<List items={any[]}>,Medium,
|
||||||
|
51,Patterns,Container/Presentational split,Separate data logic from UI,Container fetches presentational renders,Mixed data and UI in one,<UserContainer><UserView/></UserContainer>,<User /> with fetch and render,Low,
|
||||||
|
52,Patterns,Render props for flexibility,Share code via render prop pattern,Render prop for customizable rendering,Duplicate logic across components,<DataFetcher render={data => ...}/>,Copy paste fetch logic,Low,https://react.dev/reference/react/cloneElement#passing-data-with-a-render-prop
|
||||||
|
53,Patterns,Compound components,Related components sharing state,Tab + TabPanel sharing context,Prop drilling between related,<Tabs><Tab/><TabPanel/></Tabs>,<Tabs tabs={[]} panels={[...]}/>,Low,
|
||||||
|
61
.codex/skills/ui-ux-pro-max/data/stacks/shadcn.csv
Normal file
61
.codex/skills/ui-ux-pro-max/data/stacks/shadcn.csv
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
||||||
|
1,Setup,Use CLI for installation,Install components via shadcn CLI for proper setup,npx shadcn@latest add component-name,Manual copy-paste from docs,npx shadcn@latest add button,Copy component code manually,High,https://ui.shadcn.com/docs/cli
|
||||||
|
2,Setup,Initialize project properly,Run init command to set up components.json and globals.css,npx shadcn@latest init before adding components,Skip init and add components directly,npx shadcn@latest init,npx shadcn@latest add button (without init),High,https://ui.shadcn.com/docs/installation
|
||||||
|
3,Setup,Configure path aliases,Set up proper import aliases in tsconfig and components.json,Use @/components/ui path aliases,Relative imports like ../../components,import { Button } from "@/components/ui/button",import { Button } from "../../components/ui/button",Medium,https://ui.shadcn.com/docs/installation
|
||||||
|
4,Theming,Use CSS variables for colors,Define colors as CSS variables in globals.css for theming,CSS variables in :root and .dark,Hardcoded color values in components,bg-primary text-primary-foreground,bg-blue-500 text-white,High,https://ui.shadcn.com/docs/theming
|
||||||
|
5,Theming,Follow naming convention,Use semantic color names with foreground pattern,primary/primary-foreground secondary/secondary-foreground,Generic color names,--primary --primary-foreground,--blue --light-blue,Medium,https://ui.shadcn.com/docs/theming
|
||||||
|
6,Theming,Support dark mode,Include .dark class styles for all custom CSS,Define both :root and .dark color schemes,Only light mode colors,.dark { --background: 240 10% 3.9%; },No .dark class styles,High,https://ui.shadcn.com/docs/dark-mode
|
||||||
|
7,Components,Use component variants,Leverage cva variants for consistent styling,Use variant prop for different styles,Inline conditional classes,<Button variant="destructive">,<Button className={isError ? "bg-red-500" : "bg-blue-500"}>,Medium,https://ui.shadcn.com/docs/components/button
|
||||||
|
8,Components,Compose with className,Add custom classes via className prop for overrides,Extend with className for one-off customizations,Modify component source directly,<Button className="w-full">,Edit button.tsx to add w-full,Medium,https://ui.shadcn.com/docs/components/button
|
||||||
|
9,Components,Use size variants consistently,Apply size prop for consistent sizing across components,size="sm" size="lg" for sizing,Mix size classes inconsistently,<Button size="lg">,<Button className="text-lg px-8 py-4">,Medium,https://ui.shadcn.com/docs/components/button
|
||||||
|
10,Components,Prefer compound components,Use provided sub-components for complex UI,Card + CardHeader + CardContent pattern,Single component with many props,<Card><CardHeader><CardTitle>,<Card title="x" content="y" footer="z">,Medium,https://ui.shadcn.com/docs/components/card
|
||||||
|
11,Dialog,Use Dialog for modal content,Dialog component for overlay modal windows,Dialog for confirmations forms details,Alert for modal content,<Dialog><DialogContent>,<Alert> styled as modal,High,https://ui.shadcn.com/docs/components/dialog
|
||||||
|
12,Dialog,Handle dialog state properly,Use open and onOpenChange for controlled dialogs,Controlled state with useState,Uncontrolled with default open only,"<Dialog open={open} onOpenChange={setOpen}>","<Dialog defaultOpen={true}>",Medium,https://ui.shadcn.com/docs/components/dialog
|
||||||
|
13,Dialog,Include proper dialog structure,Use DialogHeader DialogTitle DialogDescription,Complete semantic structure,Missing title or description,<DialogHeader><DialogTitle><DialogDescription>,<DialogContent><p>Content</p></DialogContent>,High,https://ui.shadcn.com/docs/components/dialog
|
||||||
|
14,Sheet,Use Sheet for side panels,Sheet component for slide-out panels and drawers,Sheet for navigation filters settings,Dialog for side content,<Sheet side="right">,<Dialog> with slide animation,Medium,https://ui.shadcn.com/docs/components/sheet
|
||||||
|
15,Sheet,Specify sheet side,Set side prop for sheet slide direction,Explicit side="left" or side="right",Default side without consideration,<Sheet><SheetContent side="left">,<Sheet><SheetContent>,Low,https://ui.shadcn.com/docs/components/sheet
|
||||||
|
16,Form,Use Form with react-hook-form,Integrate Form component with react-hook-form for validation,useForm + Form + FormField pattern,Custom form handling without Form,<Form {...form}><FormField control={form.control}>,<form onSubmit={handleSubmit}>,High,https://ui.shadcn.com/docs/components/form
|
||||||
|
17,Form,Use FormField for inputs,Wrap inputs in FormField for proper labeling and errors,FormField + FormItem + FormLabel + FormControl,Input without FormField wrapper,<FormField><FormItem><FormLabel><FormControl><Input>,<Input onChange={...}>,High,https://ui.shadcn.com/docs/components/form
|
||||||
|
18,Form,Display form messages,Use FormMessage for validation error display,FormMessage after FormControl,Custom error text without FormMessage,<FormControl><Input/></FormControl><FormMessage/>,<Input/>{error && <span>{error}</span>},Medium,https://ui.shadcn.com/docs/components/form
|
||||||
|
19,Form,Use Zod for validation,Define form schema with Zod for type-safe validation,zodResolver with form schema,Manual validation logic,zodResolver(formSchema),validate: (values) => { if (!values.email) },Medium,https://ui.shadcn.com/docs/components/form
|
||||||
|
20,Select,Use Select for dropdowns,Select component for option selection,Select for choosing from list,Native select element,<Select><SelectTrigger><SelectContent>,<select><option>,Medium,https://ui.shadcn.com/docs/components/select
|
||||||
|
21,Select,Structure Select properly,Include Trigger Value Content and Items,Complete Select structure,Missing SelectValue or SelectContent,<SelectTrigger><SelectValue/></SelectTrigger><SelectContent><SelectItem>,<Select><option>,High,https://ui.shadcn.com/docs/components/select
|
||||||
|
22,Command,Use Command for search,Command component for searchable lists and palettes,Command for command palette search,Input with custom dropdown,<Command><CommandInput><CommandList>,<Input><div className="dropdown">,Medium,https://ui.shadcn.com/docs/components/command
|
||||||
|
23,Command,Group command items,Use CommandGroup for categorized items,CommandGroup with heading for sections,Flat list without grouping,<CommandGroup heading="Suggestions"><CommandItem>,<CommandItem> without groups,Low,https://ui.shadcn.com/docs/components/command
|
||||||
|
24,Table,Use Table for data display,Table component for structured data,Table for tabular data display,Div grid for table-like layouts,<Table><TableHeader><TableBody><TableRow>,<div className="grid">,Medium,https://ui.shadcn.com/docs/components/table
|
||||||
|
25,Table,Include proper table structure,Use TableHeader TableBody TableRow TableCell,Semantic table structure,Missing thead or tbody,<TableHeader><TableRow><TableHead>,<Table><TableRow> without header,High,https://ui.shadcn.com/docs/components/table
|
||||||
|
26,DataTable,Use DataTable for complex tables,Combine Table with TanStack Table for features,DataTable pattern for sorting filtering pagination,Custom table implementation,useReactTable + Table components,Custom sort filter pagination logic,Medium,https://ui.shadcn.com/docs/components/data-table
|
||||||
|
27,Tabs,Use Tabs for content switching,Tabs component for tabbed interfaces,Tabs for related content sections,Custom tab implementation,<Tabs><TabsList><TabsTrigger><TabsContent>,<div onClick={() => setTab(...)},Medium,https://ui.shadcn.com/docs/components/tabs
|
||||||
|
28,Tabs,Set default tab value,Specify defaultValue for initial tab,defaultValue on Tabs component,No default leaving first tab,<Tabs defaultValue="account">,<Tabs> without defaultValue,Low,https://ui.shadcn.com/docs/components/tabs
|
||||||
|
29,Accordion,Use Accordion for collapsible,Accordion for expandable content sections,Accordion for FAQ settings panels,Custom collapse implementation,<Accordion><AccordionItem><AccordionTrigger>,<div onClick={() => setOpen(!open)}>,Medium,https://ui.shadcn.com/docs/components/accordion
|
||||||
|
30,Accordion,Choose accordion type,Use type="single" or type="multiple" appropriately,type="single" for one open type="multiple" for many,Default type without consideration,<Accordion type="single" collapsible>,<Accordion> without type,Low,https://ui.shadcn.com/docs/components/accordion
|
||||||
|
31,Toast,Use Sonner for toasts,Sonner integration for toast notifications,toast() from sonner for notifications,Custom toast implementation,toast("Event created"),setShowToast(true),Medium,https://ui.shadcn.com/docs/components/sonner
|
||||||
|
32,Toast,Add Toaster to layout,Include Toaster component in root layout,<Toaster /> in app layout,Toaster in individual pages,app/layout.tsx: <Toaster />,page.tsx: <Toaster />,High,https://ui.shadcn.com/docs/components/sonner
|
||||||
|
33,Toast,Use toast variants,Apply toast.success toast.error for context,Semantic toast methods,Generic toast for all messages,toast.success("Saved!") toast.error("Failed"),toast("Saved!") toast("Failed"),Medium,https://ui.shadcn.com/docs/components/sonner
|
||||||
|
34,Popover,Use Popover for floating content,Popover for dropdown menus and floating panels,Popover for contextual actions,Absolute positioned divs,<Popover><PopoverTrigger><PopoverContent>,<div className="relative"><div className="absolute">,Medium,https://ui.shadcn.com/docs/components/popover
|
||||||
|
35,Popover,Handle popover alignment,Use align and side props for positioning,Explicit alignment configuration,Default alignment for all,<PopoverContent align="start" side="bottom">,<PopoverContent>,Low,https://ui.shadcn.com/docs/components/popover
|
||||||
|
36,DropdownMenu,Use DropdownMenu for actions,DropdownMenu for action lists and context menus,DropdownMenu for user menu actions,Popover for action lists,<DropdownMenu><DropdownMenuTrigger><DropdownMenuContent>,<Popover> for menu actions,Medium,https://ui.shadcn.com/docs/components/dropdown-menu
|
||||||
|
37,DropdownMenu,Group menu items,Use DropdownMenuGroup and DropdownMenuSeparator,Organized menu with separators,Flat list of items,<DropdownMenuGroup><DropdownMenuItem><DropdownMenuSeparator>,<DropdownMenuItem> without organization,Low,https://ui.shadcn.com/docs/components/dropdown-menu
|
||||||
|
38,Tooltip,Use Tooltip for hints,Tooltip for icon buttons and truncated text,Tooltip for additional context,Title attribute for tooltips,<Tooltip><TooltipTrigger><TooltipContent>,<button title="Delete">,Medium,https://ui.shadcn.com/docs/components/tooltip
|
||||||
|
39,Tooltip,Add TooltipProvider,Wrap app or section in TooltipProvider,TooltipProvider at app level,TooltipProvider per tooltip,<TooltipProvider><App/></TooltipProvider>,<Tooltip><TooltipProvider>,High,https://ui.shadcn.com/docs/components/tooltip
|
||||||
|
40,Skeleton,Use Skeleton for loading,Skeleton component for loading placeholders,Skeleton matching content layout,Spinner for content loading,<Skeleton className="h-4 w-[200px]"/>,<Spinner/> for card loading,Medium,https://ui.shadcn.com/docs/components/skeleton
|
||||||
|
41,Skeleton,Match skeleton dimensions,Size skeleton to match loaded content,Skeleton same size as expected content,Generic skeleton size,<Skeleton className="h-12 w-12 rounded-full"/>,<Skeleton/> without sizing,Medium,https://ui.shadcn.com/docs/components/skeleton
|
||||||
|
42,AlertDialog,Use AlertDialog for confirms,AlertDialog for destructive action confirmation,AlertDialog for delete confirmations,Dialog for confirmations,<AlertDialog><AlertDialogTrigger><AlertDialogContent>,<Dialog> for delete confirmation,High,https://ui.shadcn.com/docs/components/alert-dialog
|
||||||
|
43,AlertDialog,Include action buttons,Use AlertDialogAction and AlertDialogCancel,Standard confirm/cancel pattern,Custom buttons in AlertDialog,<AlertDialogCancel>Cancel</AlertDialogCancel><AlertDialogAction>,<Button>Cancel</Button><Button>Confirm</Button>,Medium,https://ui.shadcn.com/docs/components/alert-dialog
|
||||||
|
44,Sidebar,Use Sidebar for navigation,Sidebar component for app navigation,Sidebar for main app navigation,Custom sidebar implementation,<SidebarProvider><Sidebar><SidebarContent>,<div className="w-64 fixed">,Medium,https://ui.shadcn.com/docs/components/sidebar
|
||||||
|
45,Sidebar,Wrap in SidebarProvider,Use SidebarProvider for sidebar state management,SidebarProvider at layout level,Sidebar without provider,<SidebarProvider><Sidebar></SidebarProvider>,<Sidebar> without provider,High,https://ui.shadcn.com/docs/components/sidebar
|
||||||
|
46,Sidebar,Use SidebarTrigger,Include SidebarTrigger for mobile toggle,SidebarTrigger for responsive toggle,Custom toggle button,<SidebarTrigger/>,<Button onClick={() => toggleSidebar()}>,Medium,https://ui.shadcn.com/docs/components/sidebar
|
||||||
|
47,Chart,Use Chart for data viz,Chart component with Recharts integration,Chart component for dashboards,Direct Recharts without wrapper,<ChartContainer config={chartConfig}>,<ResponsiveContainer><BarChart>,Medium,https://ui.shadcn.com/docs/components/chart
|
||||||
|
48,Chart,Define chart config,Create chartConfig for consistent theming,chartConfig with color definitions,Inline colors in charts,"{ desktop: { label: ""Desktop"", color: ""#2563eb"" } }",<Bar fill="#2563eb"/>,Medium,https://ui.shadcn.com/docs/components/chart
|
||||||
|
49,Chart,Use ChartTooltip,Apply ChartTooltip for interactive charts,ChartTooltip with ChartTooltipContent,Recharts Tooltip directly,<ChartTooltip content={<ChartTooltipContent/>}/>,<Tooltip/> from recharts,Low,https://ui.shadcn.com/docs/components/chart
|
||||||
|
50,Blocks,Use blocks for scaffolding,Start from shadcn blocks for common layouts,npx shadcn@latest add dashboard-01,Build dashboard from scratch,npx shadcn@latest add login-01,Custom login page from scratch,Medium,https://ui.shadcn.com/blocks
|
||||||
|
51,Blocks,Customize block components,Modify copied block code to fit needs,Edit block files after installation,Use blocks without modification,Customize dashboard-01 layout,Use dashboard-01 as-is,Low,https://ui.shadcn.com/blocks
|
||||||
|
52,A11y,Use semantic components,Shadcn components have built-in ARIA,Rely on component accessibility,Override ARIA attributes,<Button> has button role,<div role="button">,High,https://ui.shadcn.com/docs/components/button
|
||||||
|
53,A11y,Maintain focus management,Dialog Sheet handle focus automatically,Let components manage focus,Custom focus handling,<Dialog> traps focus,document.querySelector().focus(),High,https://ui.shadcn.com/docs/components/dialog
|
||||||
|
54,A11y,Provide labels,Use FormLabel and aria-label appropriately,FormLabel for form inputs,Placeholder as only label,<FormLabel>Email</FormLabel><Input/>,<Input placeholder="Email"/>,High,https://ui.shadcn.com/docs/components/form
|
||||||
|
55,Performance,Import components individually,Import only needed components,Named imports from component files,Import all from index,import { Button } from "@/components/ui/button",import { Button Card Dialog } from "@/components/ui",Medium,
|
||||||
|
56,Performance,Lazy load dialogs,Dynamic import for heavy dialog content,React.lazy for dialog content,Import all dialogs upfront,const HeavyContent = lazy(() => import('./Heavy')),import HeavyContent from './Heavy',Medium,
|
||||||
|
57,Customization,Extend variants with cva,Add new variants using class-variance-authority,Extend buttonVariants for new styles,Inline classes for variants,"variants: { size: { xl: ""h-14 px-8"" } }",className="h-14 px-8",Medium,https://ui.shadcn.com/docs/components/button
|
||||||
|
58,Customization,Create custom components,Build new components following shadcn patterns,Use cn() and cva for custom components,Different patterns for custom,const Custom = ({ className }) => <div className={cn("base" className)}>,const Custom = ({ style }) => <div style={style}>,Medium,
|
||||||
|
59,Patterns,Use asChild for composition,asChild prop for component composition,Slot pattern with asChild,Wrapper divs for composition,<Button asChild><Link href="/">,<Button><Link href="/"></Link></Button>,Medium,https://ui.shadcn.com/docs/components/button
|
||||||
|
60,Patterns,Combine with React Hook Form,Form + useForm for complete forms,RHF Controller with shadcn inputs,Custom form state management,<FormField control={form.control} name="email">,<Input value={email} onChange={(e) => setEmail(e.target.value)},High,https://ui.shadcn.com/docs/components/form
|
||||||
|
Can't render this file because it contains an unexpected character in line 4 and column 188.
|
54
.codex/skills/ui-ux-pro-max/data/stacks/svelte.csv
Normal file
54
.codex/skills/ui-ux-pro-max/data/stacks/svelte.csv
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
||||||
|
1,Reactivity,Use $: for reactive statements,Automatic dependency tracking,$: for derived values,Manual recalculation,$: doubled = count * 2,let doubled; count && (doubled = count * 2),Medium,https://svelte.dev/docs/svelte-components#script-3-$-marks-a-statement-as-reactive
|
||||||
|
2,Reactivity,Trigger reactivity with assignment,Svelte tracks assignments not mutations,Reassign arrays/objects to trigger update,Mutate without reassignment,"items = [...items, newItem]",items.push(newItem),High,https://svelte.dev/docs/svelte-components#script-2-assignments-are-reactive
|
||||||
|
3,Reactivity,Use $state in Svelte 5,Runes for explicit reactivity,let count = $state(0),Implicit reactivity in Svelte 5,let count = $state(0),let count = 0 (Svelte 5),Medium,https://svelte.dev/blog/runes
|
||||||
|
4,Reactivity,Use $derived for computed values,$derived replaces $: in Svelte 5,let doubled = $derived(count * 2),$: in Svelte 5,let doubled = $derived(count * 2),$: doubled = count * 2 (Svelte 5),Medium,
|
||||||
|
5,Reactivity,Use $effect for side effects,$effect replaces $: side effects,Use $effect for subscriptions,$: for side effects in Svelte 5,$effect(() => console.log(count)),$: console.log(count) (Svelte 5),Medium,
|
||||||
|
6,Props,Export let for props,Declare props with export let,export let propName,Props without export,export let count = 0,let count = 0,High,https://svelte.dev/docs/svelte-components#script-1-export-creates-a-component-prop
|
||||||
|
7,Props,Use $props in Svelte 5,$props rune for prop access,let { name } = $props(),export let in Svelte 5,"let { name, age = 0 } = $props()",export let name; export let age = 0,Medium,
|
||||||
|
8,Props,Provide default values,Default props with assignment,export let count = 0,Required props without defaults,export let count = 0,export let count,Low,
|
||||||
|
9,Props,Use spread props,Pass through unknown props,{...$$restProps} on elements,Manual prop forwarding,<button {...$$restProps}>,<button class={$$props.class}>,Low,https://svelte.dev/docs/basic-markup#attributes-and-props
|
||||||
|
10,Bindings,Use bind: for two-way binding,Simplified input handling,bind:value for inputs,on:input with manual update,<input bind:value={name}>,<input value={name} on:input={e => name = e.target.value}>,Low,https://svelte.dev/docs/element-directives#bind-property
|
||||||
|
11,Bindings,Bind to DOM elements,Reference DOM nodes,bind:this for element reference,querySelector in onMount,<div bind:this={el}>,onMount(() => el = document.querySelector()),Medium,
|
||||||
|
12,Bindings,Use bind:group for radios/checkboxes,Simplified group handling,bind:group for radio/checkbox groups,Manual checked handling,"<input type=""radio"" bind:group={selected}>","<input type=""radio"" checked={selected === value}>",Low,
|
||||||
|
13,Events,Use on: for event handlers,Event directive syntax,on:click={handler},addEventListener in onMount,<button on:click={handleClick}>,onMount(() => btn.addEventListener()),Medium,https://svelte.dev/docs/element-directives#on-eventname
|
||||||
|
14,Events,Forward events with on:event,Pass events to parent,on:click without handler,createEventDispatcher for DOM events,<button on:click>,"dispatch('click', event)",Low,
|
||||||
|
15,Events,Use createEventDispatcher,Custom component events,dispatch for custom events,on:event for custom events,"dispatch('save', { data })",on:save without dispatch,Medium,https://svelte.dev/docs/svelte#createeventdispatcher
|
||||||
|
16,Lifecycle,Use onMount for initialization,Run code after component mounts,onMount for setup and data fetching,Code in script body for side effects,onMount(() => fetchData()),fetchData() in script body,High,https://svelte.dev/docs/svelte#onmount
|
||||||
|
17,Lifecycle,Return cleanup from onMount,Automatic cleanup on destroy,Return function from onMount,Separate onDestroy for paired cleanup,onMount(() => { sub(); return unsub }),onMount(sub); onDestroy(unsub),Medium,
|
||||||
|
18,Lifecycle,Use onDestroy sparingly,Only when onMount cleanup not possible,onDestroy for non-mount cleanup,onDestroy for mount-related cleanup,onDestroy for store unsubscribe,onDestroy(() => clearInterval(id)),Low,
|
||||||
|
19,Lifecycle,Avoid beforeUpdate/afterUpdate,Usually not needed,Reactive statements instead,beforeUpdate for derived state,$: if (x) doSomething(),beforeUpdate(() => doSomething()),Low,
|
||||||
|
20,Stores,Use writable for mutable state,Basic reactive store,writable for shared mutable state,Local variables for shared state,const count = writable(0),let count = 0 in module,Medium,https://svelte.dev/docs/svelte-store#writable
|
||||||
|
21,Stores,Use readable for read-only state,External data sources,readable for derived/external data,writable for read-only data,"readable(0, set => interval(set))",writable(0) for timer,Low,https://svelte.dev/docs/svelte-store#readable
|
||||||
|
22,Stores,Use derived for computed stores,Combine or transform stores,derived for computed values,Manual subscription for derived,"derived(count, $c => $c * 2)",count.subscribe(c => doubled = c * 2),Medium,https://svelte.dev/docs/svelte-store#derived
|
||||||
|
23,Stores,Use $ prefix for auto-subscription,Automatic subscribe/unsubscribe,$storeName in components,Manual subscription,{$count},count.subscribe(c => value = c),High,
|
||||||
|
24,Stores,Clean up custom subscriptions,Unsubscribe when component destroys,Return unsubscribe from onMount,Leave subscriptions open,onMount(() => store.subscribe(fn)),store.subscribe(fn) in script,High,
|
||||||
|
25,Slots,Use slots for composition,Content projection,<slot> for flexible content,Props for all content,<slot>Default</slot>,"<Component content=""text""/>",Medium,https://svelte.dev/docs/special-elements#slot
|
||||||
|
26,Slots,Name slots for multiple areas,Multiple content areas,"<slot name=""header"">",Single slot for complex layouts,"<slot name=""header""><slot name=""footer"">",<slot> with complex conditionals,Low,
|
||||||
|
27,Slots,Check slot content with $$slots,Conditional slot rendering,$$slots.name for conditional rendering,Always render slot wrapper,"{#if $$slots.footer}<slot name=""footer""/>{/if}","<div><slot name=""footer""/></div>",Low,
|
||||||
|
28,Styling,Use scoped styles by default,Styles scoped to component,<style> for component styles,Global styles for component,:global() only when needed,<style> all global,Medium,https://svelte.dev/docs/svelte-components#style
|
||||||
|
29,Styling,Use :global() sparingly,Escape scoping when needed,:global for third-party styling,Global for all styles,:global(.external-lib),<style> without scoping,Medium,
|
||||||
|
30,Styling,Use CSS variables for theming,Dynamic styling,CSS custom properties,Inline styles for themes,"style=""--color: {color}""","style=""color: {color}""",Low,
|
||||||
|
31,Transitions,Use built-in transitions,Svelte transition directives,transition:fade for simple effects,Manual CSS transitions,<div transition:fade>,<div class:fade={visible}>,Low,https://svelte.dev/docs/element-directives#transition-fn
|
||||||
|
32,Transitions,Use in: and out: separately,Different enter/exit animations,in:fly out:fade for asymmetric,Same transition for both,<div in:fly out:fade>,<div transition:fly>,Low,
|
||||||
|
33,Transitions,Add local modifier,Prevent ancestor trigger,transition:fade|local,Global transitions for lists,<div transition:slide|local>,<div transition:slide>,Medium,
|
||||||
|
34,Actions,Use actions for DOM behavior,Reusable DOM logic,use:action for DOM enhancements,onMount for each usage,<div use:clickOutside>,onMount(() => setupClickOutside(el)),Medium,https://svelte.dev/docs/element-directives#use-action
|
||||||
|
35,Actions,Return update and destroy,Lifecycle methods for actions,"Return { update, destroy }",Only initial setup,"return { update(params) {}, destroy() {} }",return destroy only,Medium,
|
||||||
|
36,Actions,Pass parameters to actions,Configure action behavior,use:action={params},Hardcoded action behavior,<div use:tooltip={options}>,<div use:tooltip>,Low,
|
||||||
|
37,Logic,Use {#if} for conditionals,Template conditionals,{#if} {:else if} {:else},Ternary in expressions,{#if cond}...{:else}...{/if},{cond ? a : b} for complex,Low,https://svelte.dev/docs/logic-blocks#if
|
||||||
|
38,Logic,Use {#each} for lists,List rendering,{#each} with key,Map in expression,{#each items as item (item.id)},{items.map(i => `<div>${i}</div>`)},Medium,
|
||||||
|
39,Logic,Always use keys in {#each},Proper list reconciliation,(item.id) for unique key,Index as key or no key,{#each items as item (item.id)},"{#each items as item, i (i)}",High,
|
||||||
|
40,Logic,Use {#await} for promises,Handle async states,{#await} for loading/error states,Manual promise handling,{#await promise}...{:then}...{:catch},{#if loading}...{#if error},Medium,https://svelte.dev/docs/logic-blocks#await
|
||||||
|
41,SvelteKit,Use +page.svelte for routes,File-based routing,+page.svelte for route components,Custom routing setup,routes/about/+page.svelte,routes/About.svelte,Medium,https://kit.svelte.dev/docs/routing
|
||||||
|
42,SvelteKit,Use +page.js for data loading,Load data before render,load function in +page.js,onMount for data fetching,export function load() {},onMount(() => fetchData()),High,https://kit.svelte.dev/docs/load
|
||||||
|
43,SvelteKit,Use +page.server.js for server-only,Server-side data loading,+page.server.js for sensitive data,+page.js for API keys,+page.server.js with DB access,+page.js with DB access,High,
|
||||||
|
44,SvelteKit,Use form actions,Server-side form handling,+page.server.js actions,API routes for forms,export const actions = { default },fetch('/api/submit'),Medium,https://kit.svelte.dev/docs/form-actions
|
||||||
|
45,SvelteKit,Use $app/stores for app state,$page $navigating $updated,$page for current page data,Manual URL parsing,import { page } from '$app/stores',window.location.pathname,Medium,https://kit.svelte.dev/docs/modules#$app-stores
|
||||||
|
46,Performance,Use {#key} for forced re-render,Reset component state,{#key id} for fresh instance,Manual destroy/create,{#key item.id}<Component/>{/key},on:change={() => component = null},Low,https://svelte.dev/docs/logic-blocks#key
|
||||||
|
47,Performance,Avoid unnecessary reactivity,Not everything needs $:,$: only for side effects,$: for simple assignments,$: if (x) console.log(x),$: y = x (when y = x works),Low,
|
||||||
|
48,Performance,Use immutable compiler option,Skip equality checks,immutable: true for large lists,Default for all components,<svelte:options immutable/>,Default without immutable,Low,
|
||||||
|
49,TypeScript,"Use lang=""ts"" in script",TypeScript support,"<script lang=""ts"">",JavaScript for typed projects,"<script lang=""ts"">",<script> with JSDoc,Medium,https://svelte.dev/docs/typescript
|
||||||
|
50,TypeScript,Type props with interface,Explicit prop types,interface $$Props for types,Untyped props,interface $$Props { name: string },export let name,Medium,
|
||||||
|
51,TypeScript,Type events with createEventDispatcher,Type-safe events,createEventDispatcher<Events>(),Untyped dispatch,createEventDispatcher<{ save: Data }>(),createEventDispatcher(),Medium,
|
||||||
|
52,Accessibility,Use semantic elements,Proper HTML in templates,button nav main appropriately,div for everything,<button on:click>,<div on:click>,High,
|
||||||
|
53,Accessibility,Add aria to dynamic content,Accessible state changes,aria-live for updates,Silent dynamic updates,"<div aria-live=""polite"">{message}</div>",<div>{message}</div>,Medium,
|
||||||
|
51
.codex/skills/ui-ux-pro-max/data/stacks/swiftui.csv
Normal file
51
.codex/skills/ui-ux-pro-max/data/stacks/swiftui.csv
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
||||||
|
1,Views,Use struct for views,SwiftUI views are value types,struct MyView: View,class MyView: View,struct ContentView: View { var body: some View },class ContentView: View,High,https://developer.apple.com/documentation/swiftui/view
|
||||||
|
2,Views,Keep views small and focused,Single responsibility for each view,Extract subviews for complex layouts,Large monolithic views,Extract HeaderView FooterView,500+ line View struct,Medium,
|
||||||
|
3,Views,Use body computed property,body returns the view hierarchy,var body: some View { },func body() -> some View,"var body: some View { Text(""Hello"") }",func body() -> Text,High,
|
||||||
|
4,Views,Prefer composition over inheritance,Compose views using ViewBuilder,Combine smaller views,Inheritance hierarchies,VStack { Header() Content() },class SpecialView extends BaseView,Medium,
|
||||||
|
5,State,Use @State for local state,Simple value types owned by view,@State for view-local primitives,@State for shared data,@State private var count = 0,@State var sharedData: Model,High,https://developer.apple.com/documentation/swiftui/state
|
||||||
|
6,State,Use @Binding for two-way data,Pass mutable state to child views,@Binding for child input,@State in child for parent data,@Binding var isOn: Bool,$isOn to pass binding,Medium,https://developer.apple.com/documentation/swiftui/binding
|
||||||
|
7,State,Use @StateObject for reference types,ObservableObject owned by view,@StateObject for view-created objects,@ObservedObject for owned objects,@StateObject private var vm = ViewModel(),@ObservedObject var vm = ViewModel(),High,https://developer.apple.com/documentation/swiftui/stateobject
|
||||||
|
8,State,Use @ObservedObject for injected objects,Reference types passed from parent,@ObservedObject for injected dependencies,@StateObject for injected objects,@ObservedObject var vm: ViewModel,@StateObject var vm: ViewModel (injected),High,https://developer.apple.com/documentation/swiftui/observedobject
|
||||||
|
9,State,Use @EnvironmentObject for shared state,App-wide state injection,@EnvironmentObject for global state,Prop drilling through views,@EnvironmentObject var settings: Settings,Pass settings through 5 views,Medium,https://developer.apple.com/documentation/swiftui/environmentobject
|
||||||
|
10,State,Use @Published in ObservableObject,Automatically publish property changes,@Published for observed properties,Manual objectWillChange calls,@Published var items: [Item] = [],var items: [Item] { didSet { objectWillChange.send() } },Medium,
|
||||||
|
11,Observable,Use @Observable macro (iOS 17+),Modern observation without Combine,@Observable class for view models,ObservableObject for new projects,@Observable class ViewModel { },class ViewModel: ObservableObject,Medium,https://developer.apple.com/documentation/observation
|
||||||
|
12,Observable,Use @Bindable for @Observable,Create bindings from @Observable,@Bindable var vm for bindings,@Binding with @Observable,@Bindable var viewModel,$viewModel.name with @Observable,Medium,
|
||||||
|
13,Layout,Use VStack HStack ZStack,Standard stack-based layouts,Stacks for linear arrangements,GeometryReader for simple layouts,VStack { Text() Image() },GeometryReader for vertical list,Medium,https://developer.apple.com/documentation/swiftui/vstack
|
||||||
|
14,Layout,Use LazyVStack LazyHStack for lists,Lazy loading for performance,Lazy stacks for long lists,Regular stacks for 100+ items,LazyVStack { ForEach(items) },VStack { ForEach(largeArray) },High,https://developer.apple.com/documentation/swiftui/lazyvstack
|
||||||
|
15,Layout,Use GeometryReader sparingly,Only when needed for sizing,GeometryReader for responsive layouts,GeometryReader everywhere,GeometryReader for aspect ratio,GeometryReader wrapping everything,Medium,
|
||||||
|
16,Layout,Use spacing and padding consistently,Consistent spacing throughout app,Design system spacing values,Magic numbers for spacing,.padding(16) or .padding(),".padding(13), .padding(17)",Low,
|
||||||
|
17,Layout,Use frame modifiers correctly,Set explicit sizes when needed,.frame(maxWidth: .infinity),Fixed sizes for responsive content,.frame(maxWidth: .infinity),.frame(width: 375),Medium,
|
||||||
|
18,Modifiers,Order modifiers correctly,Modifier order affects rendering,Background before padding for full coverage,Wrong modifier order,.padding().background(Color.red),.background(Color.red).padding(),High,
|
||||||
|
19,Modifiers,Create custom ViewModifiers,Reusable modifier combinations,ViewModifier for repeated styling,Duplicate modifier chains,struct CardStyle: ViewModifier,.shadow().cornerRadius() everywhere,Medium,https://developer.apple.com/documentation/swiftui/viewmodifier
|
||||||
|
20,Modifiers,Use conditional modifiers carefully,Avoid changing view identity,if-else with same view type,Conditional that changes view identity,Text(title).foregroundColor(isActive ? .blue : .gray),if isActive { Text().bold() } else { Text() },Medium,
|
||||||
|
21,Navigation,Use NavigationStack (iOS 16+),Modern navigation with type-safe paths,NavigationStack with navigationDestination,NavigationView for new projects,NavigationStack { },NavigationView { } (deprecated),Medium,https://developer.apple.com/documentation/swiftui/navigationstack
|
||||||
|
22,Navigation,Use navigationDestination,Type-safe navigation destinations,.navigationDestination(for:),NavigationLink(destination:),.navigationDestination(for: Item.self),NavigationLink(destination: DetailView()),Medium,
|
||||||
|
23,Navigation,Use @Environment for dismiss,Programmatic navigation dismissal,@Environment(\.dismiss) var dismiss,presentationMode (deprecated),@Environment(\.dismiss) var dismiss,@Environment(\.presentationMode),Low,
|
||||||
|
24,Lists,Use List for scrollable content,Built-in scrolling and styling,List for standard scrollable content,ScrollView + VStack for simple lists,List { ForEach(items) { } },ScrollView { VStack { ForEach } },Low,https://developer.apple.com/documentation/swiftui/list
|
||||||
|
25,Lists,Provide stable identifiers,Use Identifiable or explicit id,Identifiable protocol or id parameter,Index as identifier,ForEach(items) where Item: Identifiable,"ForEach(items.indices, id: \.self)",High,
|
||||||
|
26,Lists,Use onDelete and onMove,Standard list editing,onDelete for swipe to delete,Custom delete implementation,.onDelete(perform: delete),.onTapGesture for delete,Low,
|
||||||
|
27,Forms,Use Form for settings,Grouped input controls,Form for settings screens,Manual grouping for forms,Form { Section { Toggle() } },VStack { Toggle() },Low,https://developer.apple.com/documentation/swiftui/form
|
||||||
|
28,Forms,Use @FocusState for keyboard,Manage keyboard focus,@FocusState for text field focus,Manual first responder handling,@FocusState private var isFocused: Bool,UIKit first responder,Medium,https://developer.apple.com/documentation/swiftui/focusstate
|
||||||
|
29,Forms,Validate input properly,Show validation feedback,Real-time validation feedback,Submit without validation,TextField with validation state,TextField without error handling,Medium,
|
||||||
|
30,Async,Use .task for async work,Automatic cancellation on view disappear,.task for view lifecycle async,onAppear with Task,.task { await loadData() },onAppear { Task { await loadData() } },Medium,https://developer.apple.com/documentation/swiftui/view/task(priority:_:)
|
||||||
|
31,Async,Handle loading states,Show progress during async operations,ProgressView during loading,Empty view during load,if isLoading { ProgressView() },No loading indicator,Medium,
|
||||||
|
32,Async,Use @MainActor for UI updates,Ensure UI updates on main thread,@MainActor on view models,Manual DispatchQueue.main,@MainActor class ViewModel,DispatchQueue.main.async,Medium,
|
||||||
|
33,Animation,Use withAnimation,Animate state changes,withAnimation for state transitions,No animation for state changes,withAnimation { isExpanded.toggle() },isExpanded.toggle(),Low,https://developer.apple.com/documentation/swiftui/withanimation(_:_:)
|
||||||
|
34,Animation,Use .animation modifier,Apply animations to views,.animation(.spring()) on view,Manual animation timing,.animation(.easeInOut),CABasicAnimation equivalent,Low,
|
||||||
|
35,Animation,Respect reduced motion,Check accessibility settings,Check accessibilityReduceMotion,Ignore motion preferences,@Environment(\.accessibilityReduceMotion),Always animate regardless,High,
|
||||||
|
36,Preview,Use #Preview macro (Xcode 15+),Modern preview syntax,#Preview for view previews,PreviewProvider protocol,#Preview { ContentView() },struct ContentView_Previews: PreviewProvider,Low,
|
||||||
|
37,Preview,Create multiple previews,Test different states and devices,Multiple previews for states,Single preview only,"#Preview(""Light"") { } #Preview(""Dark"") { }",Single preview configuration,Low,
|
||||||
|
38,Preview,Use preview data,Dedicated preview mock data,Static preview data,Production data in previews,Item.preview for preview,Fetch real data in preview,Low,
|
||||||
|
39,Performance,Avoid expensive body computations,Body should be fast to compute,Precompute in view model,Heavy computation in body,vm.computedValue in body,Complex calculation in body,High,
|
||||||
|
40,Performance,Use Equatable views,Skip unnecessary view updates,Equatable for complex views,Default equality for all views,struct MyView: View Equatable,No Equatable conformance,Medium,
|
||||||
|
41,Performance,Profile with Instruments,Measure before optimizing,Use SwiftUI Instruments,Guess at performance issues,Profile with Instruments,Optimize without measuring,Medium,
|
||||||
|
42,Accessibility,Add accessibility labels,Describe UI elements,.accessibilityLabel for context,Missing labels,".accessibilityLabel(""Close button"")",Button without label,High,https://developer.apple.com/documentation/swiftui/view/accessibilitylabel(_:)-1d7jv
|
||||||
|
43,Accessibility,Support Dynamic Type,Respect text size preferences,Scalable fonts and layouts,Fixed font sizes,.font(.body) with Dynamic Type,.font(.system(size: 16)),High,
|
||||||
|
44,Accessibility,Use semantic views,Proper accessibility traits,Correct accessibilityTraits,Wrong semantic meaning,Button for actions Image for display,Image that acts like button,Medium,
|
||||||
|
45,Testing,Use ViewInspector for testing,Third-party view testing,ViewInspector for unit tests,UI tests only,ViewInspector assertions,Only XCUITest,Medium,
|
||||||
|
46,Testing,Test view models,Unit test business logic,XCTest for view model,Skip view model testing,Test ViewModel methods,No unit tests,Medium,
|
||||||
|
47,Testing,Use preview as visual test,Previews catch visual regressions,Multiple preview configurations,No visual verification,Preview different states,Single preview only,Low,
|
||||||
|
48,Architecture,Use MVVM pattern,Separate view and logic,ViewModel for business logic,Logic in View,ObservableObject ViewModel,@State for complex logic,Medium,
|
||||||
|
49,Architecture,Keep views dumb,Views display view model state,View reads from ViewModel,Business logic in View,view.items from vm.items,Complex filtering in View,Medium,
|
||||||
|
50,Architecture,Use dependency injection,Inject dependencies for testing,Initialize with dependencies,Hard-coded dependencies,init(service: ServiceProtocol),let service = RealService(),Medium,
|
||||||
|
50
.codex/skills/ui-ux-pro-max/data/stacks/vue.csv
Normal file
50
.codex/skills/ui-ux-pro-max/data/stacks/vue.csv
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
||||||
|
1,Composition,Use Composition API for new projects,Composition API offers better TypeScript support and logic reuse,<script setup> for components,Options API for new projects,<script setup>,export default { data() },Medium,https://vuejs.org/guide/extras/composition-api-faq.html
|
||||||
|
2,Composition,Use script setup syntax,Cleaner syntax with automatic exports,<script setup> with defineProps,setup() function manually,<script setup>,<script> setup() { return {} },Low,https://vuejs.org/api/sfc-script-setup.html
|
||||||
|
3,Reactivity,Use ref for primitives,ref() for primitive values that need reactivity,ref() for strings numbers booleans,reactive() for primitives,const count = ref(0),const count = reactive(0),Medium,https://vuejs.org/guide/essentials/reactivity-fundamentals.html
|
||||||
|
4,Reactivity,Use reactive for objects,reactive() for complex objects and arrays,reactive() for objects with multiple properties,ref() for complex objects,const state = reactive({ user: null }),const state = ref({ user: null }),Medium,
|
||||||
|
5,Reactivity,Access ref values with .value,Remember .value in script unwrap in template,Use .value in script,Forget .value in script,count.value++,count++ (in script),High,
|
||||||
|
6,Reactivity,Use computed for derived state,Computed properties cache and update automatically,computed() for derived values,Methods for derived values,const doubled = computed(() => count.value * 2),const doubled = () => count.value * 2,Medium,https://vuejs.org/guide/essentials/computed.html
|
||||||
|
7,Reactivity,Use shallowRef for large objects,Avoid deep reactivity for performance,shallowRef for large data structures,ref for large nested objects,const bigData = shallowRef(largeObject),const bigData = ref(largeObject),Medium,https://vuejs.org/api/reactivity-advanced.html#shallowref
|
||||||
|
8,Watchers,Use watchEffect for simple cases,Auto-tracks dependencies,watchEffect for simple reactive effects,watch with explicit deps when not needed,watchEffect(() => console.log(count.value)),"watch(count, (val) => console.log(val))",Low,https://vuejs.org/guide/essentials/watchers.html
|
||||||
|
9,Watchers,Use watch for specific sources,Explicit control over what to watch,watch with specific refs,watchEffect for complex conditional logic,"watch(userId, fetchUser)",watchEffect with conditionals,Medium,
|
||||||
|
10,Watchers,Clean up side effects,Return cleanup function in watchers,Return cleanup in watchEffect,Leave subscriptions open,watchEffect((onCleanup) => { onCleanup(unsub) }),watchEffect without cleanup,High,
|
||||||
|
11,Props,Define props with defineProps,Type-safe prop definitions,defineProps with TypeScript,Props without types,defineProps<{ msg: string }>(),defineProps(['msg']),Medium,https://vuejs.org/guide/typescript/composition-api.html#typing-component-props
|
||||||
|
12,Props,Use withDefaults for default values,Provide defaults for optional props,withDefaults with defineProps,Defaults in destructuring,"withDefaults(defineProps<Props>(), { count: 0 })",const { count = 0 } = defineProps(),Medium,
|
||||||
|
13,Props,Avoid mutating props,Props should be read-only,Emit events to parent for changes,Direct prop mutation,"emit('update:modelValue', newVal)",props.modelValue = newVal,High,
|
||||||
|
14,Emits,Define emits with defineEmits,Type-safe event emissions,defineEmits with types,Emit without definition,defineEmits<{ change: [id: number] }>(),"emit('change', id) without define",Medium,https://vuejs.org/guide/typescript/composition-api.html#typing-component-emits
|
||||||
|
15,Emits,Use v-model for two-way binding,Simplified parent-child data flow,v-model with modelValue prop,:value + @input manually,"<Child v-model=""value""/>","<Child :value=""value"" @input=""value = $event""/>",Low,https://vuejs.org/guide/components/v-model.html
|
||||||
|
16,Lifecycle,Use onMounted for DOM access,DOM is ready in onMounted,onMounted for DOM operations,Access DOM in setup directly,onMounted(() => el.value.focus()),el.value.focus() in setup,High,https://vuejs.org/api/composition-api-lifecycle.html
|
||||||
|
17,Lifecycle,Clean up in onUnmounted,Remove listeners and subscriptions,onUnmounted for cleanup,Leave listeners attached,onUnmounted(() => window.removeEventListener()),No cleanup on unmount,High,
|
||||||
|
18,Lifecycle,Avoid onBeforeMount for data,Use onMounted or setup for data fetching,Fetch in onMounted or setup,Fetch in onBeforeMount,onMounted(async () => await fetchData()),onBeforeMount(async () => await fetchData()),Low,
|
||||||
|
19,Components,Use single-file components,Keep template script style together,.vue files for components,Separate template/script files,Component.vue with all parts,Component.js + Component.html,Low,
|
||||||
|
20,Components,Use PascalCase for components,Consistent component naming,PascalCase in imports and templates,kebab-case in script,<MyComponent/>,<my-component/>,Low,https://vuejs.org/style-guide/rules-strongly-recommended.html
|
||||||
|
21,Components,Prefer composition over mixins,Composables replace mixins,Composables for shared logic,Mixins for code reuse,const { data } = useApi(),mixins: [apiMixin],Medium,
|
||||||
|
22,Composables,Name composables with use prefix,Convention for composable functions,useFetch useAuth useForm,getData or fetchApi,export function useFetch(),export function fetchData(),Medium,https://vuejs.org/guide/reusability/composables.html
|
||||||
|
23,Composables,Return refs from composables,Maintain reactivity when destructuring,Return ref values,Return reactive objects that lose reactivity,return { data: ref(null) },return reactive({ data: null }),Medium,
|
||||||
|
24,Composables,Accept ref or value params,Use toValue for flexible inputs,toValue() or unref() for params,Only accept ref or only value,const val = toValue(maybeRef),const val = maybeRef.value,Low,https://vuejs.org/api/reactivity-utilities.html#tovalue
|
||||||
|
25,Templates,Use v-bind shorthand,Cleaner template syntax,:prop instead of v-bind:prop,Full v-bind syntax,"<div :class=""cls"">","<div v-bind:class=""cls"">",Low,
|
||||||
|
26,Templates,Use v-on shorthand,Cleaner event binding,@event instead of v-on:event,Full v-on syntax,"<button @click=""handler"">","<button v-on:click=""handler"">",Low,
|
||||||
|
27,Templates,Avoid v-if with v-for,v-if has higher priority causes issues,Wrap in template or computed filter,v-if on same element as v-for,<template v-for><div v-if>,<div v-for v-if>,High,https://vuejs.org/style-guide/rules-essential.html#avoid-v-if-with-v-for
|
||||||
|
28,Templates,Use key with v-for,Proper list rendering and updates,Unique key for each item,Index as key for dynamic lists,"v-for=""item in items"" :key=""item.id""","v-for=""(item, i) in items"" :key=""i""",High,
|
||||||
|
29,State,Use Pinia for global state,Official state management for Vue 3,Pinia stores for shared state,Vuex for new projects,const store = useCounterStore(),Vuex with mutations,Medium,https://pinia.vuejs.org/
|
||||||
|
30,State,Define stores with defineStore,Composition API style stores,Setup stores with defineStore,Options stores for complex state,"defineStore('counter', () => {})","defineStore('counter', { state })",Low,
|
||||||
|
31,State,Use storeToRefs for destructuring,Maintain reactivity when destructuring,storeToRefs(store),Direct destructuring,const { count } = storeToRefs(store),const { count } = store,High,https://pinia.vuejs.org/core-concepts/#destructuring-from-a-store
|
||||||
|
32,Routing,Use useRouter and useRoute,Composition API router access,useRouter() useRoute() in setup,this.$router this.$route,const router = useRouter(),this.$router.push(),Medium,https://router.vuejs.org/guide/advanced/composition-api.html
|
||||||
|
33,Routing,Lazy load route components,Code splitting for routes,() => import() for components,Static imports for all routes,component: () => import('./Page.vue'),component: Page,Medium,https://router.vuejs.org/guide/advanced/lazy-loading.html
|
||||||
|
34,Routing,Use navigation guards,Protect routes and handle redirects,beforeEach for auth checks,Check auth in each component,router.beforeEach((to) => {}),Check auth in onMounted,Medium,
|
||||||
|
35,Performance,Use v-once for static content,Skip re-renders for static elements,v-once on never-changing content,v-once on dynamic content,<div v-once>{{ staticText }}</div>,<div v-once>{{ dynamicText }}</div>,Low,https://vuejs.org/api/built-in-directives.html#v-once
|
||||||
|
36,Performance,Use v-memo for expensive lists,Memoize list items,v-memo with dependency array,Re-render entire list always,"<div v-for v-memo=""[item.id]"">",<div v-for> without memo,Medium,https://vuejs.org/api/built-in-directives.html#v-memo
|
||||||
|
37,Performance,Use shallowReactive for flat objects,Avoid deep reactivity overhead,shallowReactive for flat state,reactive for simple objects,shallowReactive({ count: 0 }),reactive({ count: 0 }),Low,
|
||||||
|
38,Performance,Use defineAsyncComponent,Lazy load heavy components,defineAsyncComponent for modals dialogs,Import all components eagerly,defineAsyncComponent(() => import()),import HeavyComponent from,Medium,https://vuejs.org/guide/components/async.html
|
||||||
|
39,TypeScript,Use generic components,Type-safe reusable components,Generic with defineComponent,Any types in components,"<script setup lang=""ts"" generic=""T"">",<script setup> without types,Medium,https://vuejs.org/guide/typescript/composition-api.html
|
||||||
|
40,TypeScript,Type template refs,Proper typing for DOM refs,ref<HTMLInputElement>(null),ref(null) without type,const input = ref<HTMLInputElement>(null),const input = ref(null),Medium,
|
||||||
|
41,TypeScript,Use PropType for complex props,Type complex prop types,PropType<User> for object props,Object without type,type: Object as PropType<User>,type: Object,Medium,
|
||||||
|
42,Testing,Use Vue Test Utils,Official testing library,mount shallowMount for components,Manual DOM testing,import { mount } from '@vue/test-utils',document.createElement,Medium,https://test-utils.vuejs.org/
|
||||||
|
43,Testing,Test component behavior,Focus on inputs and outputs,Test props emit and rendered output,Test internal implementation,expect(wrapper.text()).toContain(),expect(wrapper.vm.internalState),Medium,
|
||||||
|
44,Forms,Use v-model modifiers,Built-in input handling,.lazy .number .trim modifiers,Manual input parsing,"<input v-model.number=""age"">","<input v-model=""age""> then parse",Low,https://vuejs.org/guide/essentials/forms.html#modifiers
|
||||||
|
45,Forms,Use VeeValidate or FormKit,Form validation libraries,VeeValidate for complex forms,Manual validation logic,useField useForm from vee-validate,Custom validation in each input,Medium,
|
||||||
|
46,Accessibility,Use semantic elements,Proper HTML elements in templates,button nav main for purpose,div for everything,<button @click>,<div @click>,High,
|
||||||
|
47,Accessibility,Bind aria attributes dynamically,Keep ARIA in sync with state,":aria-expanded=""isOpen""",Static ARIA values,":aria-expanded=""menuOpen""","aria-expanded=""true""",Medium,
|
||||||
|
48,SSR,Use Nuxt for SSR,Full-featured SSR framework,Nuxt 3 for SSR apps,Manual SSR setup,npx nuxi init my-app,Custom SSR configuration,Medium,https://nuxt.com/
|
||||||
|
49,SSR,Handle hydration mismatches,Client/server content must match,ClientOnly for browser-only content,Different content server/client,<ClientOnly><BrowserWidget/></ClientOnly>,<div>{{ Date.now() }}</div>,High,
|
||||||
|
68
.codex/skills/ui-ux-pro-max/data/styles.csv
Normal file
68
.codex/skills/ui-ux-pro-max/data/styles.csv
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
No,Style Category,Type,Keywords,Primary Colors,Secondary Colors,Effects & Animation,Best For,Do Not Use For,Light Mode ✓,Dark Mode ✓,Performance,Accessibility,Mobile-Friendly,Conversion-Focused,Framework Compatibility,Era/Origin,Complexity,AI Prompt Keywords,CSS/Technical Keywords,Implementation Checklist,Design System Variables
|
||||||
|
1,Minimalism & Swiss Style,General,"Clean, simple, spacious, functional, white space, high contrast, geometric, sans-serif, grid-based, essential","Monochromatic, Black #000000, White #FFFFFF","Neutral (Beige #F5F1E8, Grey #808080, Taupe #B38B6D), Primary accent","Subtle hover (200-250ms), smooth transitions, sharp shadows if any, clear type hierarchy, fast loading","Enterprise apps, dashboards, documentation sites, SaaS platforms, professional tools","Creative portfolios, entertainment, playful brands, artistic experiments",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AAA,✓ High,◐ Medium,"Tailwind 10/10, Bootstrap 9/10, MUI 9/10",1950s Swiss,Low,"Design a minimalist landing page. Use: white space, geometric layouts, sans-serif fonts, high contrast, grid-based structure, essential elements only. Avoid shadows and gradients. Focus on clarity and functionality.","display: grid, gap: 2rem, font-family: sans-serif, color: #000 or #FFF, max-width: 1200px, clean borders, no box-shadow unless necessary","☐ Grid-based layout 12-16 columns, ☐ Typography hierarchy clear, ☐ No unnecessary decorations, ☐ WCAG AAA contrast verified, ☐ Mobile responsive grid","--spacing: 2rem, --border-radius: 0px, --font-weight: 400-700, --shadow: none, --accent-color: single primary only"
|
||||||
|
2,Neumorphism,General,"Soft UI, embossed, debossed, convex, concave, light source, subtle depth, rounded (12-16px), monochromatic","Light pastels: Soft Blue #C8E0F4, Soft Pink #F5E0E8, Soft Grey #E8E8E8","Tints/shades (±30%), gradient subtlety, color harmony","Soft box-shadow (multiple: -5px -5px 15px, 5px 5px 15px), smooth press (150ms), inner subtle shadow","Health/wellness apps, meditation platforms, fitness trackers, minimal interaction UIs","Complex apps, critical accessibility, data-heavy dashboards, high-contrast required",✓ Full,◐ Partial,⚡ Good,⚠ Low contrast,✓ Good,◐ Medium,"Tailwind 8/10, CSS-in-JS 9/10",2020s Modern,Medium,"Create a neumorphic UI with soft 3D effects. Use light pastels, rounded corners (12-16px), subtle soft shadows (multiple layers), no hard lines, monochromatic color scheme with light/dark variations. Embossed/debossed effect on interactive elements.","border-radius: 12-16px, box-shadow: -5px -5px 15px rgba(0,0,0,0.1), 5px 5px 15px rgba(255,255,255,0.8), background: linear-gradient(145deg, color1, color2), transform: scale on press","☐ Rounded corners 12-16px consistent, ☐ Multiple shadow layers (2-3), ☐ Pastel color verified, ☐ Monochromatic palette checked, ☐ Press animation smooth 150ms","--border-radius: 14px, --shadow-soft-1: -5px -5px 15px, --shadow-soft-2: 5px 5px 15px, --color-light: #F5F5F5, --color-primary: single pastel"
|
||||||
|
3,Glassmorphism,General,"Frosted glass, transparent, blurred background, layered, vibrant background, light source, depth, multi-layer","Translucent white: rgba(255,255,255,0.1-0.3)","Vibrant: Electric Blue #0080FF, Neon Purple #8B00FF, Vivid Pink #FF1493, Teal #20B2AA","Backdrop blur (10-20px), subtle border (1px solid rgba white 0.2), light reflection, Z-depth","Modern SaaS, financial dashboards, high-end corporate, lifestyle apps, modal overlays, navigation","Low-contrast backgrounds, critical accessibility, performance-limited, dark text on dark",✓ Full,✓ Full,⚠ Good,⚠ Ensure 4.5:1,✓ Good,✓ High,"Tailwind 9/10, MUI 8/10, Chakra 8/10",2020s Modern,Medium,"Design a glassmorphic interface with frosted glass effect. Use backdrop blur (10-20px), translucent overlays (rgba 10-30% opacity), vibrant background colors, subtle borders, light source reflection, layered depth. Perfect for modern overlays and cards.","backdrop-filter: blur(15px), background: rgba(255, 255, 255, 0.15), border: 1px solid rgba(255,255,255,0.2), -webkit-backdrop-filter: blur(15px), z-index layering for depth","☐ Backdrop-filter blur 10-20px, ☐ Translucent white 15-30% opacity, ☐ Subtle border 1px light, ☐ Vibrant background verified, ☐ Text contrast 4.5:1 checked","--blur-amount: 15px, --glass-opacity: 0.15, --border-color: rgba(255,255,255,0.2), --background: vibrant color, --text-color: light/dark based on BG"
|
||||||
|
4,Brutalism,General,"Raw, unpolished, stark, high contrast, plain text, default fonts, visible borders, asymmetric, anti-design","Primary: Red #FF0000, Blue #0000FF, Yellow #FFFF00, Black #000000, White #FFFFFF","Limited: Neon Green #00FF00, Hot Pink #FF00FF, minimal secondary","No smooth transitions (instant), sharp corners (0px), bold typography (700+), visible grid, large blocks","Design portfolios, artistic projects, counter-culture brands, editorial/media sites, tech blogs","Corporate environments, conservative industries, critical accessibility, customer-facing professional",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AAA,◐ Medium,✗ Low,"Tailwind 10/10, Bootstrap 7/10",1950s Brutalist,Low,"Create a brutalist design with raw, unpolished, stark aesthetic. Use pure primary colors (red, blue, yellow), black & white, no smooth transitions (instant), sharp corners, bold large typography, visible grid lines, default system fonts, intentional 'broken' design elements.","border-radius: 0px, transition: none or 0s, font-family: system-ui or monospace, font-weight: 700+, border: visible 2-4px, colors: #FF0000, #0000FF, #FFFF00, #000000, #FFFFFF","☐ No border-radius (0px), ☐ No transitions (instant), ☐ Bold typography (700+), ☐ Pure primary colors used, ☐ Visible grid/borders, ☐ Asymmetric layout intentional","--border-radius: 0px, --transition-duration: 0s, --font-weight: 700-900, --colors: primary only, --border-style: visible, --grid-visible: true"
|
||||||
|
5,3D & Hyperrealism,General,"Depth, realistic textures, 3D models, spatial navigation, tactile, skeuomorphic elements, rich detail, immersive","Deep Navy #001F3F, Forest Green #228B22, Burgundy #800020, Gold #FFD700, Silver #C0C0C0","Complex gradients (5-10 stops), realistic lighting, shadow variations (20-40% darker)","WebGL/Three.js 3D, realistic shadows (layers), physics lighting, parallax (3-5 layers), smooth 3D (300-400ms)","Gaming, product showcase, immersive experiences, high-end e-commerce, architectural viz, VR/AR","Low-end mobile, performance-limited, critical accessibility, data tables/forms",◐ Partial,◐ Partial,❌ Poor,⚠ Not accessible,✗ Low,◐ Medium,"Three.js 10/10, R3F 10/10, Babylon.js 10/10",2020s Modern,High,"Build an immersive 3D interface using realistic textures, 3D models (Three.js/Babylon.js), complex shadows, realistic lighting, parallax scrolling (3-5 layers), physics-based motion. Include skeuomorphic elements with tactile detail.","transform: translate3d, perspective: 1000px, WebGL canvas, Three.js/Babylon.js library, box-shadow: complex multi-layer, background: complex gradients, filter: drop-shadow()","☐ WebGL/Three.js integrated, ☐ 3D models loaded, ☐ Parallax 3-5 layers, ☐ Realistic lighting verified, ☐ Complex shadows rendered, ☐ Physics animation smooth 300-400ms","--perspective: 1000px, --parallax-layers: 5, --lighting-intensity: realistic, --shadow-depth: 20-40%, --animation-duration: 300-400ms"
|
||||||
|
6,Vibrant & Block-based,General,"Bold, energetic, playful, block layout, geometric shapes, high color contrast, duotone, modern, energetic","Neon Green #39FF14, Electric Purple #BF00FF, Vivid Pink #FF1493, Bright Cyan #00FFFF, Sunburst #FFAA00","Complementary: Orange #FF7F00, Shocking Pink #FF006E, Lime #CCFF00, triadic schemes","Large sections (48px+ gaps), animated patterns, bold hover (color shift), scroll-snap, large type (32px+), 200-300ms","Startups, creative agencies, gaming, social media, youth-focused, entertainment, consumer","Financial institutions, healthcare, formal business, government, conservative, elderly",✓ Full,✓ Full,⚡ Good,◐ Ensure WCAG,✓ High,✓ High,"Tailwind 10/10, Chakra 9/10, Styled 9/10",2020s Modern,Medium,"Design an energetic, vibrant interface with bold block layouts, geometric shapes, high color contrast, large typography (32px+), animated background patterns, duotone effects. Perfect for startups and youth-focused apps. Use 4-6 contrasting colors from complementary/triadic schemes.","display: flex/grid with large gaps (48px+), font-size: 32px+, background: animated patterns (CSS), color: neon/vibrant colors, animation: continuous pattern movement","☐ Block layout with 48px+ gaps, ☐ Large typography 32px+, ☐ 4-6 vibrant colors max, ☐ Animated patterns active, ☐ Scroll-snap enabled, ☐ High contrast verified (7:1+)","--block-gap: 48px, --typography-size: 32px+, --color-palette: 4-6 vibrant colors, --animation: continuous pattern, --contrast-ratio: 7:1+"
|
||||||
|
7,Dark Mode (OLED),General,"Dark theme, low light, high contrast, deep black, midnight blue, eye-friendly, OLED, night mode, power efficient","Deep Black #000000, Dark Grey #121212, Midnight Blue #0A0E27","Vibrant accents: Neon Green #39FF14, Electric Blue #0080FF, Gold #FFD700, Plasma Purple #BF00FF","Minimal glow (text-shadow: 0 0 10px), dark-to-light transitions, low white emission, high readability, visible focus","Night-mode apps, coding platforms, entertainment, eye-strain prevention, OLED devices, low-light","Print-first content, high-brightness outdoor, color-accuracy-critical",✗ No,✓ Only,⚡ Excellent,✓ WCAG AAA,✓ High,◐ Low,"Tailwind 10/10, MUI 10/10, Chakra 10/10",2020s Modern,Low,"Create an OLED-optimized dark interface with deep black (#000000), dark grey (#121212), midnight blue accents. Use minimal glow effects, vibrant neon accents (green, blue, gold, purple), high contrast text. Optimize for eye comfort and OLED power saving.","background: #000000 or #121212, color: #FFFFFF or #E0E0E0, text-shadow: 0 0 10px neon-color (sparingly), filter: brightness(0.8) if needed, color-scheme: dark","☐ Deep black #000000 or #121212, ☐ Vibrant neon accents used, ☐ Text contrast 7:1+, ☐ Minimal glow effects, ☐ OLED power optimization, ☐ No white (#FFFFFF) background","--bg-black: #000000, --bg-dark-grey: #121212, --text-primary: #FFFFFF, --accent-neon: neon colors, --glow-effect: minimal, --oled-optimized: true"
|
||||||
|
8,Accessible & Ethical,General,"High contrast, large text (16px+), keyboard navigation, screen reader friendly, WCAG compliant, focus state, semantic","WCAG AA/AAA (4.5:1 min), simple primary, clear secondary, high luminosity (7:1+)","Symbol-based colors (not color-only), supporting patterns, inclusive combinations","Clear focus rings (3-4px), ARIA labels, skip links, responsive design, reduced motion, 44x44px touch targets","Government, healthcare, education, inclusive products, large audience, legal compliance, public",None - accessibility universal,✓ Full,✓ Full,⚡ Excellent,✓ WCAG AAA,✓ High,✓ High,All frameworks 10/10,Universal,Low,"Design with WCAG AAA compliance. Include: high contrast (7:1+), large text (16px+), keyboard navigation, screen reader compatibility, focus states visible (3-4px ring), semantic HTML, ARIA labels, skip links, reduced motion support (prefers-reduced-motion), 44x44px touch targets.","color-contrast: 7:1+, font-size: 16px+, outline: 3-4px on :focus-visible, aria-label, role attributes, @media (prefers-reduced-motion), touch-target: 44x44px, cursor: pointer","☐ WCAG AAA verified, ☐ 7:1+ contrast checked, ☐ Keyboard navigation tested, ☐ Screen reader tested, ☐ Focus visible 3-4px, ☐ Semantic HTML used, ☐ Touch targets 44x44px","--contrast-ratio: 7:1, --font-size-min: 16px, --focus-ring: 3-4px, --touch-target: 44x44px, --wcag-level: AAA, --keyboard-accessible: true, --sr-tested: true"
|
||||||
|
9,Claymorphism,General,"Soft 3D, chunky, playful, toy-like, bubbly, thick borders (3-4px), double shadows, rounded (16-24px)","Pastel: Soft Peach #FDBCB4, Baby Blue #ADD8E6, Mint #98FF98, Lilac #E6E6FA, light BG","Soft gradients (pastel-to-pastel), light/dark variations (20-30%), gradient subtle","Inner+outer shadows (subtle, no hard lines), soft press (200ms ease-out), fluffy elements, smooth transitions","Educational apps, children's apps, SaaS platforms, creative tools, fun-focused, onboarding, casual games","Formal corporate, professional services, data-critical, serious/medical, legal apps, finance",✓ Full,◐ Partial,⚡ Good,⚠ Ensure 4.5:1,✓ High,✓ High,"Tailwind 9/10, CSS-in-JS 9/10",2020s Modern,Medium,"Design a playful, toy-like interface with soft 3D, chunky elements, bubbly aesthetic, rounded edges (16-24px), thick borders (3-4px), double shadows (inner + outer), pastel colors, smooth animations. Perfect for children's apps and creative tools.","border-radius: 16-24px, border: 3-4px solid, box-shadow: inset -2px -2px 8px, 4px 4px 8px, background: pastel-gradient, animation: soft bounce (cubic-bezier 0.34, 1.56)","☐ Border-radius 16-24px, ☐ Thick borders 3-4px, ☐ Double shadows (inner+outer), ☐ Pastel colors used, ☐ Soft bounce animations, ☐ Playful interactions","--border-radius: 20px, --border-width: 3-4px, --shadow-inner: inset -2px -2px 8px, --shadow-outer: 4px 4px 8px, --color-palette: pastels, --animation: bounce"
|
||||||
|
10,Aurora UI,General,"Vibrant gradients, smooth blend, Northern Lights effect, mesh gradient, luminous, atmospheric, abstract","Complementary: Blue-Orange, Purple-Yellow, Electric Blue #0080FF, Magenta #FF1493, Cyan #00FFFF","Smooth transitions (Blue→Purple→Pink→Teal), iridescent effects, blend modes (screen, multiply)","Large flowing CSS/SVG gradients, subtle 8-12s animations, depth via color layering, smooth morph","Modern SaaS, creative agencies, branding, music platforms, lifestyle, premium products, hero sections","Data-heavy dashboards, critical accessibility, content-heavy where distraction issues",✓ Full,✓ Full,⚠ Good,⚠ Text contrast,✓ Good,✓ High,"Tailwind 9/10, CSS-in-JS 10/10",2020s Modern,Medium,"Create a vibrant gradient interface inspired by Northern Lights with mesh gradients, smooth color blends, flowing animations. Use complementary color pairs (blue-orange, purple-yellow), flowing background gradients, subtle continuous animations (8-12s loops), iridescent effects.","background: conic-gradient or radial-gradient with multiple stops, animation: @keyframes gradient (8-12s), background-size: 200% 200%, filter: saturate(1.2), blend-mode: screen or multiply","☐ Mesh/flowing gradients applied, ☐ 8-12s animation loop, ☐ Complementary colors used, ☐ Smooth color transitions, ☐ Iridescent effect subtle, ☐ Text contrast verified","--gradient-colors: complementary pairs, --animation-duration: 8-12s, --blend-mode: screen, --color-saturation: 1.2, --effect: iridescent, --loop-smooth: true"
|
||||||
|
11,Retro-Futurism,General,"Vintage sci-fi, 80s aesthetic, neon glow, geometric patterns, CRT scanlines, pixel art, cyberpunk, synthwave","Neon Blue #0080FF, Hot Pink #FF006E, Cyan #00FFFF, Deep Black #1A1A2E, Purple #5D34D0","Metallic Silver #C0C0C0, Gold #FFD700, duotone, 80s Pink #FF10F0, neon accents","CRT scanlines (::before overlay), neon glow (text-shadow+box-shadow), glitch effects (skew/offset keyframes)","Gaming, entertainment, music platforms, tech brands, artistic projects, nostalgic, cyberpunk","Conservative industries, critical accessibility, professional/corporate, elderly, legal/finance",✓ Full,✓ Dark focused,⚠ Moderate,⚠ High contrast/strain,◐ Medium,◐ Medium,"Tailwind 8/10, CSS-in-JS 9/10",1980s Retro,Medium,"Build a retro-futuristic (cyberpunk/vaporwave) interface with neon colors (blue, pink, cyan), deep black background, 80s aesthetic, CRT scanlines, glitch effects, neon glow text/borders, monospace fonts, geometric patterns. Use neon text-shadow and animated glitch effects.","color: neon colors (#0080FF, #FF006E, #00FFFF), text-shadow: 0 0 10px neon, background: #000 or #1A1A2E, font-family: monospace, animation: glitch (skew+offset), filter: hue-rotate","☐ Neon colors used, ☐ CRT scanlines effect, ☐ Glitch animations active, ☐ Monospace font, ☐ Deep black background, ☐ Glow effects applied, ☐ 80s patterns present","--neon-colors: #0080FF #FF006E #00FFFF, --background: #000000, --font-family: monospace, --effect: glitch+glow, --scanline-opacity: 0.3, --crt-effect: true"
|
||||||
|
12,Flat Design,General,"2D, minimalist, bold colors, no shadows, clean lines, simple shapes, typography-focused, modern, icon-heavy","Solid bright: Red, Orange, Blue, Green, limited palette (4-6 max)","Complementary colors, muted secondaries, high saturation, clean accents","No gradients/shadows, simple hover (color/opacity shift), fast loading, clean transitions (150-200ms ease), minimal icons","Web apps, mobile apps, cross-platform, startup MVPs, user-friendly, SaaS, dashboards, corporate","Complex 3D, premium/luxury, artistic portfolios, immersive experiences, high-detail",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AAA,✓ High,✓ High,"Tailwind 10/10, Bootstrap 10/10, MUI 9/10",2010s Modern,Low,"Create a flat, 2D interface with bold colors, no shadows/gradients, clean lines, simple geometric shapes, icon-heavy, typography-focused, minimal ornamentation. Use 4-6 solid, bright colors in a limited palette with high saturation.","box-shadow: none, background: solid color, border-radius: 0-4px, color: solid (no gradients), fill: solid, stroke: 1-2px, font: bold sans-serif, icons: simplified SVG","☐ No shadows/gradients, ☐ 4-6 solid colors max, ☐ Clean lines consistent, ☐ Simple shapes used, ☐ Icon-heavy layout, ☐ High saturation colors, ☐ Fast loading verified","--shadow: none, --color-palette: 4-6 solid, --border-radius: 2px, --gradient: none, --icons: simplified SVG, --animation: minimal 150-200ms"
|
||||||
|
13,Skeuomorphism,General,"Realistic, texture, depth, 3D appearance, real-world metaphors, shadows, gradients, tactile, detailed, material","Rich realistic: wood, leather, metal colors, detailed gradients (8-12 stops), metallic effects","Realistic lighting gradients, shadow variations (30-50% darker), texture overlays, material colors","Realistic shadows (layers), depth (perspective), texture details (noise, grain), realistic animations (300-500ms)","Legacy apps, gaming, immersive storytelling, premium products, luxury, realistic simulations, education","Modern enterprise, critical accessibility, low-performance, web (use Flat/Modern)",◐ Partial,◐ Partial,❌ Poor,⚠ Textures reduce readability,✗ Low,◐ Medium,"CSS-in-JS 7/10, Custom 8/10",2007-2012 iOS,High,"Design a realistic, textured interface with 3D depth, real-world metaphors (leather, wood, metal), complex gradients (8-12 stops), realistic shadows, grain/texture overlays, tactile press animations. Perfect for premium/luxury products.","background: complex gradient (8-12 stops), box-shadow: realistic multi-layer, background-image: texture overlay (noise, grain), filter: drop-shadow, transform: scale on press (300-500ms)","☐ Realistic textures applied, ☐ Complex gradients 8-12 stops, ☐ Multi-layer shadows, ☐ Texture overlays present, ☐ Tactile animations smooth, ☐ Depth effect pronounced","--gradient-stops: 8-12, --texture-overlay: noise+grain, --shadow-layers: 3+, --animation-duration: 300-500ms, --depth-effect: pronounced, --tactile: true"
|
||||||
|
14,Liquid Glass,General,"Flowing glass, morphing, smooth transitions, fluid effects, translucent, animated blur, iridescent, chromatic aberration","Vibrant iridescent (rainbow spectrum), translucent base with opacity shifts, gradient fluidity","Chromatic aberration (Red-Cyan), iridescent oil-spill, fluid gradient blends, holographic effects","Morphing elements (SVG/CSS), fluid animations (400-600ms curves), dynamic blur (backdrop-filter), color transitions","Premium SaaS, high-end e-commerce, creative platforms, branding experiences, luxury portfolios","Performance-limited, critical accessibility, complex data, budget projects",✓ Full,✓ Full,⚠ Moderate-Poor,⚠ Text contrast,◐ Medium,✓ High,"Framer Motion 10/10, GSAP 10/10",2020s Modern,High,"Create a premium liquid glass effect with morphing shapes, flowing animations, chromatic aberration, iridescent gradients, smooth 400-600ms transitions. Use SVG morphing for shape changes, dynamic blur, smooth color transitions creating a fluid, premium feel.","animation: morphing SVG paths (400-600ms), backdrop-filter: blur + saturate, filter: hue-rotate + brightness, blend-mode: screen, background: iridescent gradient","☐ Morphing animations 400-600ms, ☐ Chromatic aberration applied, ☐ Dynamic blur active, ☐ Iridescent gradients, ☐ Smooth color transitions, ☐ Premium feel achieved","--morph-duration: 400-600ms, --blur-amount: 15px, --chromatic-aberration: true, --iridescent: true, --blend-mode: screen, --smooth-transitions: true"
|
||||||
|
15,Motion-Driven,General,"Animation-heavy, microinteractions, smooth transitions, scroll effects, parallax, entrance anim, page transitions","Bold colors emphasize movement, high contrast animated, dynamic gradients, accent action colors","Transitional states, success (Green #22C55E), error (Red #EF4444), neutral feedback","Scroll anim (Intersection Observer), hover (300-400ms), entrance, parallax (3-5 layers), page transitions","Portfolio sites, storytelling platforms, interactive experiences, entertainment apps, creative, SaaS","Data dashboards, critical accessibility, low-power devices, content-heavy, motion-sensitive",✓ Full,✓ Full,⚠ Good,⚠ Prefers-reduced-motion,✓ Good,✓ High,"GSAP 10/10, Framer Motion 10/10",2020s Modern,High,"Build an animation-heavy interface with scroll-triggered animations, microinteractions, parallax scrolling (3-5 layers), smooth transitions (300-400ms), entrance animations, page transitions. Use Intersection Observer for scroll effects, transform for performance, GPU acceleration.","animation: @keyframes scroll-reveal, transform: translateY/X, Intersection Observer API, will-change: transform, scroll-behavior: smooth, animation-duration: 300-400ms","☐ Scroll animations active, ☐ Parallax 3-5 layers, ☐ Entrance animations smooth, ☐ Page transitions fluid, ☐ GPU accelerated, ☐ Prefers-reduced-motion respected","--animation-duration: 300-400ms, --parallax-layers: 5, --scroll-behavior: smooth, --gpu-accelerated: true, --entrance-animation: true, --page-transition: smooth"
|
||||||
|
16,Micro-interactions,General,"Small animations, gesture-based, tactile feedback, subtle animations, contextual interactions, responsive","Subtle color shifts (10-20%), feedback: Green #22C55E, Red #EF4444, Amber #F59E0B","Accent feedback, neutral supporting, clear action indicators","Small hover (50-100ms), loading spinners, success/error state anim, gesture-triggered (swipe/pinch), haptic","Mobile apps, touchscreen UIs, productivity tools, user-friendly, consumer apps, interactive components","Desktop-only, critical performance, accessibility-first (alternatives needed)",✓ Full,✓ Full,⚡ Excellent,✓ Good,✓ High,✓ High,"Framer Motion 10/10, React Spring 9/10",2020s Modern,Medium,"Design with delightful micro-interactions: small 50-100ms animations, gesture-based responses, tactile feedback, loading spinners, success/error states, subtle hover effects, haptic feedback triggers for mobile. Focus on responsive, contextual interactions.","animation: short 50-100ms, transition: hover states, @media (hover: hover) for desktop, :active for press, haptic-feedback CSS/API, loading animation smooth loop","☐ Micro-animations 50-100ms, ☐ Gesture-responsive, ☐ Tactile feedback visual/haptic, ☐ Loading spinners smooth, ☐ Success/error states clear, ☐ Hover effects subtle","--micro-animation-duration: 50-100ms, --gesture-responsive: true, --haptic-feedback: true, --loading-animation: smooth, --state-feedback: success+error"
|
||||||
|
17,Inclusive Design,General,"Accessible, color-blind friendly, high contrast, haptic feedback, voice interaction, screen reader, WCAG AAA, universal","WCAG AAA (7:1+ contrast), avoid red-green only, symbol-based indicators, high contrast primary","Supporting patterns (stripes, dots, hatch), symbols, combinations, clear non-color indicators","Haptic feedback (vibration), voice guidance, focus indicators (4px+ ring), motion options, alt content, semantic","Public services, education, healthcare, finance, government, accessible consumer, inclusive",None - accessibility universal,✓ Full,✓ Full,⚡ Excellent,✓ WCAG AAA,✓ High,✓ High,All frameworks 10/10,Universal,Low,"Design for universal accessibility: high contrast (7:1+), large text (16px+), keyboard-only navigation, screen reader optimization, WCAG AAA compliance, symbol-based color indicators (not color-only), haptic feedback, voice interaction support, reduced motion options.","aria-* attributes complete, role attributes semantic, focus-visible: 3-4px ring, color-contrast: 7:1+, @media (prefers-reduced-motion), alt text on all images, form labels properly associated","☐ WCAG AAA verified, ☐ 7:1+ contrast all text, ☐ Keyboard accessible (Tab/Enter), ☐ Screen reader tested, ☐ Focus visible 3-4px, ☐ No color-only indicators, ☐ Haptic fallback","--contrast-ratio: 7:1, --font-size: 16px+, --keyboard-accessible: true, --sr-compatible: true, --wcag-level: AAA, --color-symbols: true, --haptic: enabled"
|
||||||
|
18,Zero Interface,General,"Minimal visible UI, voice-first, gesture-based, AI-driven, invisible controls, predictive, context-aware, ambient","Neutral backgrounds: Soft white #FAFAFA, light grey #F0F0F0, warm off-white #F5F1E8","Subtle feedback: light green, light red, minimal UI elements, soft accents","Voice recognition UI, gesture detection, AI predictions (smooth reveal), progressive disclosure, smart suggestions","Voice assistants, AI platforms, future-forward UX, smart home, contextual computing, ambient experiences","Complex workflows, data-entry heavy, traditional systems, legacy support, explicit control",✓ Full,✓ Full,⚡ Excellent,✓ Excellent,✓ High,✓ High,"Tailwind 10/10, Custom 10/10",2020s AI-Era,Low,"Create a voice-first, gesture-based, AI-driven interface with minimal visible UI, progressive disclosure, voice recognition UI, gesture detection, AI predictions, smart suggestions, context-aware actions. Hide controls until needed.","voice-commands: Web Speech API, gesture-detection: touch events, AI-predictions: hidden by default (reveal on hover), progressive-disclosure: show on demand, minimal UI visible","☐ Voice commands responsive, ☐ Gesture detection active, ☐ AI predictions hidden/revealed, ☐ Progressive disclosure working, ☐ Minimal visible UI, ☐ Smart suggestions contextual","--voice-ui: enabled, --gesture-detection: active, --ai-predictions: smart, --progressive-disclosure: true, --visible-ui: minimal, --context-aware: true"
|
||||||
|
19,Soft UI Evolution,General,"Evolved soft UI, better contrast, modern aesthetics, subtle depth, accessibility-focused, improved shadows, hybrid","Improved contrast pastels: Soft Blue #87CEEB, Soft Pink #FFB6C1, Soft Green #90EE90, better hierarchy","Better combinations, accessible secondary, supporting with improved contrast, modern accents","Improved shadows (softer than flat, clearer than neumorphism), modern (200-300ms), focus visible, WCAG AA/AAA","Modern enterprise apps, SaaS platforms, health/wellness, modern business tools, professional, hybrid","Extreme minimalism, critical performance, systems without modern OS",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AA+,✓ High,✓ High,"Tailwind 9/10, MUI 9/10, Chakra 9/10",2020s Modern,Medium,"Design evolved neumorphism with improved contrast (WCAG AA+), modern aesthetics, subtle depth, accessibility focus. Use soft shadows (softer than flat but clearer than pure neumorphism), better color hierarchy, improved focus states, modern 200-300ms animations.","box-shadow: softer multi-layer (0 2px 4px), background: improved contrast pastels, border-radius: 8-12px, animation: 200-300ms smooth, outline: 2-3px on focus, contrast: 4.5:1+","☐ Improved contrast AA/AAA, ☐ Soft shadows modern, ☐ Border-radius 8-12px, ☐ Animations 200-300ms, ☐ Focus states visible, ☐ Color hierarchy clear","--shadow-soft: modern blend, --border-radius: 10px, --animation-duration: 200-300ms, --contrast-ratio: 4.5:1+, --color-hierarchy: improved, --wcag-level: AA+"
|
||||||
|
20,Hero-Centric Design,Landing Page,"Large hero section, compelling headline, high-contrast CTA, product showcase, value proposition, hero image/video, dramatic visual","Brand primary color, white/light backgrounds for contrast, accent color for CTA","Supporting colors for secondary CTAs, accent highlights, trust elements (testimonials, logos)","Smooth scroll reveal, fade-in animations on hero, subtle background parallax, CTA glow/pulse effect","SaaS landing pages, product launches, service landing pages, B2B platforms, tech companies","Complex navigation, multi-page experiences, data-heavy applications",✓ Full,✓ Full,⚡ Good,✓ WCAG AA,✓ Full,✓ Very High,"Tailwind 10/10, Bootstrap 9/10",2020s Modern,Medium,"Design a hero-centric landing page. Use: full-width hero section, compelling headline (60-80 chars), high-contrast CTA button, product screenshot or video, value proposition above fold, gradient or image background, clear visual hierarchy.","min-height: 100vh, display: flex, align-items: center, background: linear-gradient or image, text-shadow for readability, max-width: 800px for text, button with hover scale (1.05)","☐ Hero section full viewport height, ☐ Headline visible above fold, ☐ CTA button high contrast, ☐ Background image optimized (WebP), ☐ Text readable on background, ☐ Mobile responsive layout","--hero-min-height: 100vh, --headline-size: clamp(2rem, 5vw, 4rem), --cta-padding: 1rem 2rem, --overlay-opacity: 0.5, --text-shadow: 0 2px 4px rgba(0,0,0,0.3)"
|
||||||
|
21,Conversion-Optimized,Landing Page,"Form-focused, minimalist design, single CTA focus, high contrast, urgency elements, trust signals, social proof, clear value","Primary brand color, high-contrast white/light backgrounds, warning/urgency colors for time-limited offers","Secondary CTA color (muted), trust element colors (testimonial highlights), accent for key benefits","Hover states on CTA (color shift, slight scale), form field focus animations, loading spinner, success feedback","E-commerce product pages, free trial signups, lead generation, SaaS pricing pages, limited-time offers","Complex feature explanations, multi-product showcases, technical documentation",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AA,✓ Full (mobile-optimized),✓ Very High,"Tailwind 10/10, Bootstrap 9/10",2020s Modern,Medium,"Design a conversion-optimized landing page. Use: single primary CTA, minimal distractions, trust badges, urgency elements (limited time), social proof (testimonials), clear value proposition, form above fold, progress indicators.","form with focus states, input:focus ring, button: primary color high contrast, position: sticky for CTA, max-width: 600px for form, loading spinner, success/error states","☐ Single primary CTA visible, ☐ Form fields minimal (3-5), ☐ Trust badges present, ☐ Social proof above fold, ☐ Mobile form optimized, ☐ Loading states implemented, ☐ A/B test ready","--cta-color: high contrast primary, --form-max-width: 600px, --input-height: 48px, --focus-ring: 3px solid accent, --success-color: #22C55E, --error-color: #EF4444"
|
||||||
|
22,Feature-Rich Showcase,Landing Page,"Multiple feature sections, grid layout, benefit cards, visual feature demonstrations, interactive elements, problem-solution pairs","Primary brand, bright secondary colors for feature cards, contrasting accent for CTAs","Supporting colors for: benefits (green), problems (red/orange), features (blue/purple), social proof (neutral)","Card hover effects (lift/scale), icon animations on scroll, feature toggle animations, smooth section transitions","Enterprise SaaS, software tools landing pages, platform services, complex product explanations, B2B products","Simple product pages, early-stage startups with few features, entertainment landing pages",✓ Full,✓ Full,⚡ Good,✓ WCAG AA,✓ Good,✓ High,"Tailwind 10/10, Bootstrap 9/10",2020s Modern,Medium,"Design a feature showcase landing page. Use: grid layout for features (3-4 columns), feature cards with icons, benefit-focused copy, alternating sections, comparison tables, interactive demos, problem-solution pairs.","display: grid, grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)), gap: 2rem, card hover effects (translateY -4px), icon containers, alternating background colors","☐ Feature grid responsive, ☐ Icons consistent style, ☐ Card hover effects smooth, ☐ Alternating sections contrast, ☐ Benefits clearly stated, ☐ Mobile stacks properly","--card-padding: 2rem, --card-radius: 12px, --icon-size: 48px, --grid-gap: 2rem, --section-padding: 4rem 0, --hover-transform: translateY(-4px)"
|
||||||
|
23,Minimal & Direct,Landing Page,"Minimal text, white space heavy, single column layout, direct messaging, clean typography, visual-centric, fast-loading","Monochromatic primary, white background, single accent color for CTA, black/dark grey text","Minimal secondary colors, reserved for critical CTAs only, neutral supporting elements","Very subtle hover effects, minimal animations, fast page load (no heavy animations), smooth scroll","Simple service landing pages, indie products, consulting services, micro SaaS, freelancer portfolios","Feature-heavy products, complex explanations, multi-product showcases",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AAA,✓ Full,✓ High,"Tailwind 10/10, Bootstrap 9/10",2020s Modern,Medium,"Design a minimal direct landing page. Use: single column layout, maximum white space, essential content only, one CTA, clean typography, no decorative elements, fast loading, direct messaging.","max-width: 680px, margin: 0 auto, padding: 4rem 2rem, font-size: 18-20px, line-height: 1.6, minimal animations, no box-shadow, clean borders only","☐ Single column centered, ☐ White space generous, ☐ One primary CTA only, ☐ No decorative images, ☐ Page weight < 500KB, ☐ Load time < 2s","--content-max-width: 680px, --spacing-large: 4rem, --font-size-body: 18px, --line-height: 1.6, --color-text: #1a1a1a, --color-bg: #ffffff"
|
||||||
|
24,Social Proof-Focused,Landing Page,"Testimonials prominent, client logos displayed, case studies sections, reviews/ratings, user avatars, success metrics, credibility markers","Primary brand, trust colors (blue), success/growth colors (green), neutral backgrounds","Testimonial highlight colors, logo grid backgrounds (light grey), badge/achievement colors","Testimonial carousel animations, logo grid fade-in, stat counter animations (number count-up), review star ratings","B2B SaaS, professional services, premium products, e-commerce conversion pages, established brands","Startup MVPs, products without users, niche/experimental products",✓ Full,✓ Full,⚡ Good,✓ WCAG AA,✓ Full,✓ High,"Tailwind 10/10, Bootstrap 9/10",2020s Modern,Medium,"Design a social proof landing page. Use: testimonials with photos, client logos grid, case study cards, review ratings (stars), user count metrics, success stories, trust indicators, before/after comparisons.","testimonial cards with avatar, logo grid (grayscale filter), star rating SVGs, counter animations (count-up), blockquote styling, carousel for testimonials, metric cards","☐ Testimonials with real photos, ☐ Logo grid 6-12 logos, ☐ Star ratings accessible, ☐ Metrics animated on scroll, ☐ Case studies linked, ☐ Mobile carousel works","--avatar-size: 64px, --logo-height: 40px, --star-color: #FBBF24, --metric-font-size: 3rem, --testimonial-bg: #F9FAFB, --blockquote-border: 4px solid accent"
|
||||||
|
25,Interactive Product Demo,Landing Page,"Embedded product mockup/video, interactive elements, product walkthrough, step-by-step guides, hover-to-reveal features, embedded demos","Primary brand, interface colors matching product, demo highlight colors for interactive elements","Product UI colors, tutorial step colors (numbered progression), hover state indicators","Product animation playback, step progression animations, hover reveal effects, smooth zoom on interaction","SaaS platforms, tool/software products, productivity apps landing pages, developer tools, productivity software","Simple services, consulting, non-digital products, complexity-averse audiences",✓ Full,✓ Full,⚠ Good (video/interactive),✓ WCAG AA,✓ Good,✓ Very High,"Tailwind 10/10, Bootstrap 9/10",2020s Modern,Medium,"Design an interactive demo landing page. Use: embedded product mockup, video walkthrough, step-by-step guide, hover-to-reveal features, live demo button, screenshot carousel, feature highlights on interaction.","video element with controls, position: relative for overlays, hover reveal (opacity transition), step indicators, modal for full demo, screenshot lightbox, play button overlay","☐ Demo video loads fast, ☐ Fallback for no-JS, ☐ Step indicators clear, ☐ Hover states obvious, ☐ Mobile touch friendly, ☐ Demo CTA prominent","--video-aspect-ratio: 16/9, --overlay-bg: rgba(0,0,0,0.7), --step-indicator-size: 32px, --play-button-size: 80px, --transition-duration: 300ms"
|
||||||
|
26,Trust & Authority,Landing Page,"Certificates/badges displayed, expert credentials, case studies with metrics, before/after comparisons, industry recognition, security badges","Professional colors (blue/grey), trust colors, certification badge colors (gold/silver accents)","Certificate highlight colors, metric showcase colors, comparison highlight (success green)","Badge hover effects, metric pulse animations, certificate carousel, smooth stat reveal","Healthcare/medical landing pages, financial services, enterprise software, premium/luxury products, legal services","Casual products, entertainment, viral/social-first products",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AAA,✓ Full,✓ High,"Tailwind 10/10, Bootstrap 9/10",2020s Modern,Medium,"Design a trust-focused landing page. Use: certification badges, security indicators, expert credentials, industry awards, case study metrics, compliance logos (GDPR, SOC2), guarantee badges, professional photography.","badge grid layout, shield icons, lock icons for security, certificate styling, metric cards with icons, professional color scheme (blue/grey), subtle shadows for depth","☐ Security badges visible, ☐ Certifications verified, ☐ Metrics with sources, ☐ Professional imagery, ☐ Guarantee clearly stated, ☐ Contact info accessible","--badge-height: 48px, --trust-color: #1E40AF, --security-green: #059669, --card-shadow: 0 4px 6px rgba(0,0,0,0.1), --metric-highlight: #F59E0B"
|
||||||
|
27,Storytelling-Driven,Landing Page,"Narrative flow, visual story progression, section transitions, consistent character/brand voice, emotional messaging, journey visualization","Brand primary, warm/emotional colors, varied accent colors per story section, high visual variety","Story section color coding, emotional state colors (calm, excitement, success), transitional gradients","Section-to-section animations, scroll-triggered reveals, character/icon animations, morphing transitions, parallax narrative","Brand/startup stories, mission-driven products, premium/lifestyle brands, documentary-style products, educational","Technical/complex products (unless narrative-driven), traditional enterprise software",✓ Full,✓ Full,⚠ Moderate (animations),✓ WCAG AA,✓ Good,✓ High,"Tailwind 10/10, Bootstrap 9/10",2020s Modern,Medium,"Design a storytelling landing page. Use: narrative flow sections, scroll-triggered reveals, chapter-like structure, emotional imagery, brand journey visualization, founder story, mission statement, timeline progression.","scroll-snap sections, Intersection Observer for reveals, parallax backgrounds, section transitions, timeline CSS, narrative typography (varied sizes), image-text alternating","☐ Story flows naturally, ☐ Scroll reveals smooth, ☐ Sections timed well, ☐ Emotional hooks present, ☐ Mobile story readable, ☐ Skip option available","--section-min-height: 100vh, --reveal-duration: 600ms, --narrative-font: serif, --chapter-spacing: 8rem, --timeline-color: accent, --parallax-speed: 0.5"
|
||||||
|
28,Data-Dense Dashboard,BI/Analytics,"Multiple charts/widgets, data tables, KPI cards, minimal padding, grid layout, space-efficient, maximum data visibility","Neutral primary (light grey/white #F5F5F5), data colors (blue/green/red), dark text #333333","Chart colors: success (green #22C55E), warning (amber #F59E0B), alert (red #EF4444), neutral (grey)","Hover tooltips, chart zoom on click, row highlighting on hover, smooth filter animations, data loading spinners","Business intelligence dashboards, financial analytics, enterprise reporting, operational dashboards, data warehousing","Marketing dashboards, consumer-facing analytics, simple reporting",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AA,◐ Medium,✗ Not applicable,"Recharts 9/10, Chart.js 9/10, D3.js 10/10",2020s Modern,Medium,"Design a data-dense dashboard. Use: multiple chart widgets, KPI cards row, data tables with sorting, minimal padding (8-12px), efficient grid layout, filter sidebar, dense but readable typography, maximum information density.","display: grid, grid-template-columns: repeat(12, 1fr), gap: 8px, padding: 12px, font-size: 12-14px, overflow: auto for tables, compact card design, sticky headers","☐ Grid layout 12 columns, ☐ KPI cards responsive, ☐ Tables sortable, ☐ Filters functional, ☐ Loading states for data, ☐ Export functionality","--grid-gap: 8px, --card-padding: 12px, --font-size-small: 12px, --table-row-height: 36px, --sidebar-width: 240px, --header-height: 56px"
|
||||||
|
29,Heat Map & Heatmap Style,BI/Analytics,"Color-coded grid/matrix, data intensity visualization, geographical heat maps, correlation matrices, cell-based representation, gradient coloring","Gradient scale: Cool (blue #0080FF) to hot (red #FF0000), neutral middle (white/yellow)","Support gradients: Light (cool blue) to dark (warm red), divergent for positive/negative data, monochromatic options","Color gradient transitions on data change, cell highlighting on hover, tooltip reveal on click, smooth color animation","Geographical analysis, performance matrices, correlation analysis, user behavior heatmaps, temperature/intensity data","Linear data representation, categorical comparisons (use bar charts), small datasets",✓ Full,✓ Full (with adjustments),⚡ Excellent,⚠ Colorblind considerations,◐ Medium,✗ Not applicable,"Recharts 9/10, Chart.js 9/10, D3.js 10/10",2020s Modern,Medium,"Design a heatmap visualization. Use: color gradient scale (cool to hot), cell-based grid, intensity legend, hover tooltips, geographic or matrix layout, divergent color scheme for +/- values, accessible color alternatives.","display: grid, background: linear-gradient for legend, cell hover states, tooltip positioning, color scale (blue→white→red), SVG for geographic, canvas for large datasets","☐ Color scale clear, ☐ Legend visible, ☐ Tooltips informative, ☐ Colorblind alternatives, ☐ Zoom/pan for geo, ☐ Performance for large data","--heatmap-cool: #0080FF, --heatmap-neutral: #FFFFFF, --heatmap-hot: #FF0000, --cell-size: 24px, --legend-width: 200px, --tooltip-bg: rgba(0,0,0,0.9)"
|
||||||
|
30,Executive Dashboard,BI/Analytics,"High-level KPIs, large key metrics, minimal detail, summary view, trend indicators, at-a-glance insights, executive summary","Brand colors, professional palette (blue/grey/white), accent for KPIs, red for alerts/concerns","KPI highlight colors: positive (green), negative (red), neutral (grey), trend arrow colors","KPI value animations (count-up), trend arrow direction animations, metric card hover lift, alert pulse effect","C-suite dashboards, business summary reports, decision-maker dashboards, strategic planning views","Detailed analyst dashboards, technical deep-dives, operational monitoring",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AA,✗ Low (not mobile-optimized),✗ Not applicable,"Recharts 9/10, Chart.js 9/10, D3.js 10/10",2020s Modern,Medium,"Design an executive dashboard. Use: large KPI cards (4-6 max), trend sparklines, high-level summary only, clean layout with white space, traffic light indicators (red/yellow/green), at-a-glance insights, minimal detail.","display: flex for KPI row, large font-size (24-48px) for metrics, sparkline SVG inline, status indicators (border-left color), card shadows for hierarchy, responsive breakpoints","☐ KPIs 4-6 maximum, ☐ Trends visible, ☐ Status colors clear, ☐ One-page view, ☐ Mobile simplified, ☐ Print-friendly layout","--kpi-font-size: 48px, --sparkline-height: 32px, --status-green: #22C55E, --status-yellow: #F59E0B, --status-red: #EF4444, --card-min-width: 280px"
|
||||||
|
31,Real-Time Monitoring,BI/Analytics,"Live data updates, status indicators, alert notifications, streaming data visualization, active monitoring, streaming charts","Alert colors: critical (red #FF0000), warning (orange #FFA500), normal (green #22C55E), updating (blue animation)","Status indicator colors, chart line colors varying by metric, streaming data highlight colors","Real-time chart animations, alert pulse/glow, status indicator blink animation, smooth data stream updates, loading effect","System monitoring dashboards, DevOps dashboards, real-time analytics, stock market dashboards, live event tracking","Historical analysis, long-term trend reports, archived data dashboards",✓ Full,✓ Full,⚡ Good (real-time load),✓ WCAG AA,◐ Medium,✗ Not applicable,"Recharts 9/10, Chart.js 9/10, D3.js 10/10",2020s Modern,Medium,"Design a real-time monitoring dashboard. Use: live status indicators (pulsing), streaming charts, alert notifications, connection status, auto-refresh indicators, critical alerts prominent, system health overview.","animation: pulse for live, WebSocket for streaming, position: fixed for alerts, status-dot with animation, chart real-time updates, notification toast, connection indicator","☐ Live updates working, ☐ Alert sounds optional, ☐ Connection status shown, ☐ Auto-refresh indicated, ☐ Critical alerts prominent, ☐ Offline fallback","--pulse-animation: pulse 2s infinite, --alert-z-index: 1000, --live-indicator: #22C55E, --critical-color: #DC2626, --update-interval: 5s, --toast-duration: 5s"
|
||||||
|
32,Drill-Down Analytics,BI/Analytics,"Hierarchical data exploration, expandable sections, interactive drill-down paths, summary-to-detail flow, context preservation","Primary brand, breadcrumb colors, drill-level indicator colors, hierarchy depth colors","Drill-down path indicator colors, level-specific colors, highlight colors for selected level, transition colors","Drill-down expand animations, breadcrumb click transitions, smooth detail reveal, level change smooth, data reload animation","Sales analytics, product analytics, funnel analysis, multi-dimensional data exploration, business intelligence","Simple linear data, single-metric dashboards, streaming real-time dashboards",✓ Full,✓ Full,⚡ Good,✓ WCAG AA,◐ Medium,✗ Not applicable,"Recharts 9/10, Chart.js 9/10, D3.js 10/10",2020s Modern,Medium,"Design a drill-down analytics dashboard. Use: breadcrumb navigation, expandable sections, summary-to-detail flow, back button prominent, level indicators, context preservation, hierarchical data display.","breadcrumb nav with separators, details/summary for expand, transition for drill animation, position: sticky breadcrumb, nested grid layouts, smooth scroll to detail","☐ Breadcrumbs clear, ☐ Back navigation easy, ☐ Expand animation smooth, ☐ Context preserved, ☐ Mobile drill works, ☐ Deep links supported","--breadcrumb-separator: /, --expand-duration: 300ms, --level-indent: 24px, --back-button-size: 40px, --context-bar-height: 48px, --drill-transition: 300ms ease"
|
||||||
|
33,Comparative Analysis Dashboard,BI/Analytics,"Side-by-side comparisons, period-over-period metrics, A/B test results, regional comparisons, performance benchmarks","Comparison colors: primary (blue), comparison (orange/purple), delta indicator (green/red)","Winning metric color (green), losing metric color (red), neutral comparison (grey), benchmark colors","Comparison bar animations (grow to value), delta indicator animations (direction arrows), highlight on compare","Period-over-period reporting, A/B test dashboards, market comparison, competitive analysis, regional performance","Single metric dashboards, future projections (use forecasting), real-time only (no historical)",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AA,◐ Medium,✗ Not applicable,"Recharts 9/10, Chart.js 9/10, D3.js 10/10",2020s Modern,Medium,"Design a comparison dashboard. Use: side-by-side metrics, period selectors (vs last month), delta indicators (+/-), benchmark lines, A/B comparison tables, winning/losing highlights, percentage change badges.","display: flex for side-by-side, gap for comparison spacing, color coding (green up, red down), arrow indicators, diff highlighting, comparison table zebra striping","☐ Period selector works, ☐ Deltas calculated, ☐ Colors meaningful, ☐ Benchmarks shown, ☐ Mobile stacks properly, ☐ Export comparison","--positive-color: #22C55E, --negative-color: #EF4444, --neutral-color: #6B7280, --comparison-gap: 2rem, --arrow-size: 16px, --badge-padding: 4px 8px"
|
||||||
|
34,Predictive Analytics,BI/Analytics,"Forecast lines, confidence intervals, trend projections, scenario modeling, AI-driven insights, anomaly detection visualization","Forecast line color (distinct from actual), confidence interval shading, anomaly highlight (red alert), trend colors","High confidence (dark color), low confidence (light color), anomaly colors (red/orange), normal trend (green/blue)","Forecast line animation on draw, confidence band fade-in, anomaly pulse alert, smoothing function animations","Forecasting dashboards, anomaly detection systems, trend prediction dashboards, AI-powered analytics, budget planning","Historical-only dashboards, simple reporting, real-time operational dashboards",✓ Full,✓ Full,⚠ Good (computation),✓ WCAG AA,◐ Medium,✗ Not applicable,"Recharts 9/10, Chart.js 9/10, D3.js 10/10",2020s Modern,Medium,"Design a predictive analytics dashboard. Use: forecast lines (dashed), confidence intervals (shaded bands), trend projections, anomaly highlights, scenario toggles, AI insight cards, probability indicators.","stroke-dasharray for forecast lines, fill-opacity for confidence bands, anomaly markers (circles), tooltip for predictions, toggle switches for scenarios, gradient for probability","☐ Forecast line distinct, ☐ Confidence bands visible, ☐ Anomalies highlighted, ☐ Scenarios switchable, ☐ Predictions dated, ☐ Accuracy shown","--forecast-dash: 5 5, --confidence-opacity: 0.2, --anomaly-color: #F59E0B, --prediction-color: #8B5CF6, --scenario-toggle-width: 48px, --ai-accent: #6366F1"
|
||||||
|
35,User Behavior Analytics,BI/Analytics,"Funnel visualization, user flow diagrams, conversion tracking, engagement metrics, user journey mapping, cohort analysis","Funnel stage colors: high engagement (green), drop-off (red), conversion (blue), user flow arrows (grey)","Stage completion colors (success), abandonment colors (warning), engagement levels (gradient), cohort colors","Funnel animation (fill-down), flow diagram animations (connection draw), conversion pulse, engagement bar fill","Conversion funnel analysis, user journey tracking, engagement analytics, cohort analysis, retention tracking","Real-time operational metrics, technical system monitoring, financial transactions",✓ Full,✓ Full,⚡ Good,✓ WCAG AA,✓ Good,✗ Not applicable,"Recharts 9/10, Chart.js 9/10, D3.js 10/10",2020s Modern,Medium,"Design a user behavior analytics dashboard. Use: funnel visualization, user flow diagrams (Sankey), conversion metrics, engagement heatmaps, cohort tables, retention curves, session replay indicators.","SVG funnel with gradients, Sankey diagram library, percentage labels, cohort grid cells, retention chart (line/area), click heatmap overlay, session timeline","☐ Funnel stages clear, ☐ Flow diagram readable, ☐ Conversions calculated, ☐ Cohorts comparable, ☐ Retention trends visible, ☐ Privacy compliant","--funnel-width: 100%, --stage-colors: gradient, --flow-opacity: 0.6, --cohort-cell-size: 40px, --retention-line-color: #3B82F6, --engagement-scale: 5 levels"
|
||||||
|
36,Financial Dashboard,BI/Analytics,"Revenue metrics, profit/loss visualization, budget tracking, financial ratios, portfolio performance, cash flow, audit trail","Financial colors: profit (green #22C55E), loss (red #EF4444), neutral (grey), trust (dark blue #003366)","Revenue highlight (green), expenses (red), budget variance (orange/red), balance (grey), accuracy (blue)","Number animations (count-up), trend direction indicators, percentage change animations, profit/loss color transitions","Financial reporting, accounting dashboards, portfolio tracking, budget monitoring, banking analytics","Simple business dashboards, entertainment/social metrics, non-financial data",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AAA,✗ Low,✗ Not applicable,"Recharts 9/10, Chart.js 9/10, D3.js 10/10",2020s Modern,Medium,"Design a financial dashboard. Use: revenue/expense charts, profit margins, budget vs actual, cash flow waterfall, financial ratios, audit trail table, currency formatting, period comparisons.","number formatting (Intl.NumberFormat), waterfall chart (positive/negative bars), variance coloring, table with totals row, sparkline for trends, sticky column headers","☐ Currency formatted, ☐ Decimals consistent, ☐ P&L clear, ☐ Budget variance shown, ☐ Audit trail complete, ☐ Export to Excel","--currency-symbol: $, --decimal-places: 2, --profit-color: #22C55E, --loss-color: #EF4444, --variance-threshold: 10%, --table-header-bg: #F3F4F6"
|
||||||
|
37,Sales Intelligence Dashboard,BI/Analytics,"Deal pipeline, sales metrics, territory performance, sales rep leaderboard, win-loss analysis, quota tracking, forecast accuracy","Sales colors: won (green), lost (red), in-progress (blue), blocked (orange), quota met (gold), quota missed (grey)","Pipeline stage colors, rep performance colors, quota achievement colors, forecast accuracy colors","Deal movement animations, metric updates, leaderboard ranking changes, gauge needle movements, status change highlights","CRM dashboards, sales management, opportunity tracking, performance management, quota planning","Marketing analytics, customer support metrics, HR dashboards",✓ Full,✓ Full,⚡ Good,✓ WCAG AA,◐ Medium,✗ Not applicable,"Recharts 9/10, Chart.js 9/10",2020s Modern,Medium,"Design a sales intelligence dashboard. Use: pipeline funnel, deal cards (kanban), quota gauges, leaderboard table, territory map, win/loss ratios, forecast accuracy, activity timeline.","kanban columns (flex), gauge chart (SVG arc), leaderboard ranking styles, map integration (Mapbox/Google), timeline vertical, deal card with status border","☐ Pipeline stages shown, ☐ Deals draggable, ☐ Quotas visualized, ☐ Rankings updated, ☐ Territory clickable, ☐ CRM integration","--pipeline-colors: stage gradient, --gauge-track: #E5E7EB, --gauge-fill: primary, --rank-1-color: #FFD700, --rank-2-color: #C0C0C0, --rank-3-color: #CD7F32"
|
||||||
|
38,Neubrutalism,General,"Bold borders, black outlines, primary colors, thick shadows, no gradients, flat colors, 45° shadows, playful, Gen Z","#FFEB3B (Yellow), #FF5252 (Red), #2196F3 (Blue), #000000 (Black borders)","Limited accent colors, high contrast combinations, no gradients allowed","box-shadow: 4px 4px 0 #000, border: 3px solid #000, no gradients, sharp corners (0px), bold typography","Gen Z brands, startups, creative agencies, Figma-style apps, Notion-style interfaces, tech blogs","Luxury brands, finance, healthcare, conservative industries (too playful)",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AAA,✓ High,✓ High,"Tailwind 10/10, Bootstrap 8/10",2020s Modern,Low,"Design a neubrutalist interface. Use: high contrast, hard black borders (3px+), bright pop colors, no blur, sharp or slightly rounded corners, bold typography, hard shadows (offset 4px 4px), raw aesthetic but functional.","border: 3px solid black, box-shadow: 5px 5px 0px black, colors: #FFDB58 #FF6B6B #4ECDC4, font-weight: 700, no gradients","☐ Hard borders (2-4px), ☐ Hard offset shadows, ☐ High saturation colors, ☐ Bold typography, ☐ No blurs/gradients, ☐ Distinctive 'ugly-cute' look","--border-width: 3px, --shadow-offset: 4px, --shadow-color: #000, --colors: high saturation, --font: bold sans"
|
||||||
|
39,Bento Box Grid,General,"Modular cards, asymmetric grid, varied sizes, Apple-style, dashboard tiles, negative space, clean hierarchy, cards","Neutral base + brand accent, #FFFFFF, #F5F5F5, brand primary","Subtle gradients, shadow variations, accent highlights for interactive cards","grid-template with varied spans, rounded-xl (16px), subtle shadows, hover scale (1.02), smooth transitions","Dashboards, product pages, portfolios, Apple-style marketing, feature showcases, SaaS","Dense data tables, text-heavy content, real-time monitoring",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AA,✓ High,✓ High,"Tailwind 10/10, CSS Grid 10/10",2020s Apple,Low,"Design a Bento Box grid layout. Use: modular cards with varied sizes (1x1, 2x1, 2x2), Apple-style aesthetic, rounded corners (16-24px), soft shadows, clean hierarchy, asymmetric grid, neutral backgrounds (#F5F5F7), hover effects.","display: grid, grid-template-columns: repeat(4, 1fr), grid-auto-rows: 200px, gap: 16px, border-radius: 24px, background: #FFFFFF, box-shadow: 0 4px 6px rgba(0,0,0,0.05)","☐ Grid responsive (4→2→1 cols), ☐ Card spans varied, ☐ Rounded corners consistent, ☐ Shadows subtle, ☐ Content fits cards, ☐ Hover scale (1.02)","--grid-gap: 16px, --card-radius: 24px, --card-bg: #FFFFFF, --page-bg: #F5F5F7, --shadow: 0 4px 6px rgba(0,0,0,0.05), --hover-scale: 1.02"
|
||||||
|
40,Y2K Aesthetic,General,"Neon pink, chrome, metallic, bubblegum, iridescent, glossy, retro-futurism, 2000s, futuristic nostalgia","#FF69B4 (Hot Pink), #00FFFF (Cyan), #C0C0C0 (Silver), #9400D3 (Purple)","Metallic gradients, glossy overlays, iridescent effects, chrome textures","linear-gradient metallic, glossy buttons, 3D chrome effects, glow animations, bubble shapes","Fashion brands, music platforms, Gen Z brands, nostalgia marketing, entertainment, youth-focused","B2B enterprise, healthcare, finance, conservative industries, elderly users",✓ Full,◐ Partial,⚠ Good,⚠ Check contrast,✓ Good,✓ High,"Tailwind 8/10, CSS-in-JS 9/10",Y2K 2000s,Medium,"Design a Y2K aesthetic interface. Use: neon pink/cyan colors, chrome/metallic textures, bubblegum gradients, glossy buttons, iridescent effects, 2000s futurism, star/sparkle decorations, bubble shapes, tech-optimistic vibe.","background: linear-gradient(135deg, #FF69B4, #00FFFF), filter: drop-shadow for glow, border-radius: 50% for bubbles, metallic gradients (silver/chrome), text-shadow: neon glow, ::before for sparkles","☐ Neon colors balanced, ☐ Chrome effects visible, ☐ Glossy buttons styled, ☐ Bubble shapes decorative, ☐ Sparkle animations, ☐ Retro fonts loaded","--neon-pink: #FF69B4, --neon-cyan: #00FFFF, --chrome-silver: #C0C0C0, --glossy-gradient: linear-gradient(180deg, white 0%, transparent 50%), --glow-blur: 10px"
|
||||||
|
41,Cyberpunk UI,General,"Neon, dark mode, terminal, HUD, sci-fi, glitch, dystopian, futuristic, matrix, tech noir","#00FF00 (Matrix Green), #FF00FF (Magenta), #00FFFF (Cyan), #0D0D0D (Dark)","Neon gradients, scanline overlays, glitch colors, terminal green accents","Neon glow (text-shadow), glitch animations (skew/offset), scanlines (::before overlay), terminal fonts","Gaming platforms, tech products, crypto apps, sci-fi applications, developer tools, entertainment","Corporate enterprise, healthcare, family apps, conservative brands, elderly users",✗ No,✓ Only,⚠ Moderate,⚠ Limited (dark+neon),◐ Medium,◐ Medium,"Tailwind 8/10, Custom CSS 10/10",2020s Cyberpunk,Medium,"Design a cyberpunk interface. Use: neon colors on dark (#0D0D0D), terminal/HUD aesthetic, glitch effects, scanlines overlay, matrix green accents, monospace fonts, angular shapes, dystopian tech feel.","background: #0D0D0D, color: #00FF00 or #FF00FF, font-family: monospace, text-shadow: 0 0 10px neon, animation: glitch (transform skew), ::before scanlines (repeating-linear-gradient)","☐ Dark background only, ☐ Neon accents visible, ☐ Glitch effect subtle, ☐ Scanlines optional, ☐ Monospace font, ☐ Terminal aesthetic","--bg-dark: #0D0D0D, --neon-green: #00FF00, --neon-magenta: #FF00FF, --neon-cyan: #00FFFF, --scanline-opacity: 0.1, --glitch-duration: 0.3s"
|
||||||
|
42,Organic Biophilic,General,"Nature, organic shapes, green, sustainable, rounded, flowing, wellness, earthy, natural textures","#228B22 (Forest Green), #8B4513 (Earth Brown), #87CEEB (Sky Blue), #F5F5DC (Beige)","Natural gradients, earth tones, sky blues, organic textures, wood/stone colors","Rounded corners (16-24px), organic curves (border-radius variations), natural shadows, flowing SVG shapes","Wellness apps, sustainability brands, eco products, health apps, meditation, organic food brands","Tech-focused products, gaming, industrial, urban brands",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AA,✓ High,✓ High,"Tailwind 10/10, CSS 10/10",2020s Sustainable,Low,"Design a biophilic organic interface. Use: nature-inspired colors (greens, browns), organic curved shapes, rounded corners (16-24px), natural textures (wood, stone), flowing SVG elements, wellness aesthetic, earthy palette.","border-radius: 16-24px (varied), background: earth tones, SVG organic shapes (blob), box-shadow: natural soft, color: #228B22 #8B4513 #87CEEB, texture overlays (subtle)","☐ Earth tones dominant, ☐ Organic curves present, ☐ Natural textures subtle, ☐ Green accents, ☐ Rounded everywhere, ☐ Calming feel","--forest-green: #228B22, --earth-brown: #8B4513, --sky-blue: #87CEEB, --cream-bg: #F5F5DC, --organic-radius: 24px, --shadow-soft: 0 8px 32px rgba(0,0,0,0.08)"
|
||||||
|
43,AI-Native UI,General,"Chatbot, conversational, voice, assistant, agentic, ambient, minimal chrome, streaming text, AI interactions","Neutral + single accent, #6366F1 (AI Purple), #10B981 (Success), #F5F5F5 (Background)","Status indicators, streaming highlights, context card colors, subtle accent variations","Typing indicators (3-dot pulse), streaming text animations, pulse animations, context cards, smooth reveals","AI products, chatbots, voice assistants, copilots, AI-powered tools, conversational interfaces","Traditional forms, data-heavy dashboards, print-first content",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AA,✓ High,✓ High,"Tailwind 10/10, React 10/10",2020s AI-Era,Low,"Design an AI-native interface. Use: minimal chrome, conversational layout, streaming text area, typing indicators (3-dot pulse), context cards, subtle AI accent color (#6366F1), clean input field, response bubbles.","chat bubble layout (flex-direction: column), typing animation (3 dots pulse), streaming text (overflow: hidden + animation), input: sticky bottom, context cards (border-left accent), minimal borders","☐ Chat layout responsive, ☐ Typing indicator smooth, ☐ Input always visible, ☐ Context cards styled, ☐ AI responses distinct, ☐ User messages aligned right","--ai-accent: #6366F1, --user-bubble-bg: #E0E7FF, --ai-bubble-bg: #F9FAFB, --input-height: 48px, --typing-dot-size: 8px, --message-gap: 16px"
|
||||||
|
44,Memphis Design,General,"80s, geometric, playful, postmodern, shapes, patterns, squiggles, triangles, neon, abstract, bold","#FF71CE (Hot Pink), #FFCE5C (Yellow), #86CCCA (Teal), #6A7BB4 (Blue Purple)","Complementary geometric colors, pattern fills, contrasting accent shapes","transform: rotate(), clip-path: polygon(), mix-blend-mode, repeating patterns, bold shapes","Creative agencies, music sites, youth brands, event promotion, artistic portfolios, entertainment","Corporate finance, healthcare, legal, elderly users, conservative brands",✓ Full,✓ Full,⚡ Excellent,⚠ Check contrast,✓ Good,◐ Medium,"Tailwind 9/10, CSS 10/10",1980s Postmodern,Medium,"Design a Memphis style interface. Use: bold geometric shapes (triangles, squiggles, circles), bright clashing colors, 80s postmodern aesthetic, playful patterns, dotted textures, asymmetric layouts, decorative elements.","clip-path: polygon() for shapes, background: repeating patterns, transform: rotate() for tilted elements, mix-blend-mode for overlays, border: dashed/dotted patterns, bold sans-serif","☐ Geometric shapes visible, ☐ Colors bold/clashing, ☐ Patterns present, ☐ Layout asymmetric, ☐ Playful decorations, ☐ 80s vibe achieved","--memphis-pink: #FF71CE, --memphis-yellow: #FFCE5C, --memphis-teal: #86CCCA, --memphis-purple: #6A7BB4, --pattern-size: 20px, --shape-rotation: 15deg"
|
||||||
|
45,Vaporwave,General,"Synthwave, retro-futuristic, 80s-90s, neon, glitch, nostalgic, sunset gradient, dreamy, aesthetic","#FF71CE (Pink), #01CDFE (Cyan), #05FFA1 (Mint), #B967FF (Purple)","Sunset gradients, glitch overlays, VHS effects, neon accents, pastel variations","text-shadow glow, linear-gradient, filter: hue-rotate(), glitch animations, retro scan lines","Music platforms, gaming, creative portfolios, tech startups, entertainment, artistic projects","Business apps, e-commerce, education, healthcare, enterprise software",✓ Full,✓ Dark focused,⚠ Moderate,⚠ Poor (motion),◐ Medium,◐ Medium,"Tailwind 8/10, CSS-in-JS 9/10",1980s-90s Retro,Medium,"Design a vaporwave aesthetic interface. Use: sunset gradients (pink/cyan/purple), 80s-90s nostalgia, glitch effects, Greek statue imagery, palm trees, grid patterns, neon glow, retro-futuristic feel, dreamy atmosphere.","background: linear-gradient(180deg, #FF71CE, #01CDFE, #B967FF), filter: hue-rotate(), text-shadow: neon glow, retro grid (perspective + linear-gradient), VHS scanlines","☐ Sunset gradient present, ☐ Neon glow applied, ☐ Retro grid visible, ☐ Glitch effects subtle, ☐ Dreamy atmosphere, ☐ 80s-90s aesthetic","--vapor-pink: #FF71CE, --vapor-cyan: #01CDFE, --vapor-mint: #05FFA1, --vapor-purple: #B967FF, --grid-color: rgba(255,255,255,0.1), --glow-intensity: 15px"
|
||||||
|
46,Dimensional Layering,General,"Depth, overlapping, z-index, layers, 3D, shadows, elevation, floating, cards, spatial hierarchy","Neutral base (#FFFFFF, #F5F5F5, #E0E0E0) + brand accent for elevated elements","Shadow variations (sm/md/lg/xl), elevation colors, highlight colors for top layers","z-index stacking, box-shadow elevation (4 levels), transform: translateZ(), backdrop-filter, parallax","Dashboards, card layouts, modals, navigation, product showcases, SaaS interfaces","Print-style layouts, simple blogs, low-end devices, flat design requirements",✓ Full,✓ Full,⚠ Good,⚠ Moderate (SR issues),✓ Good,✓ High,"Tailwind 10/10, MUI 10/10, Chakra 10/10",2020s Modern,Medium,"Design with dimensional layering. Use: z-index depth (multiple layers), overlapping cards, elevation shadows (4 levels), floating elements, parallax depth, backdrop blur for hierarchy, spatial UI feel.","z-index: 1-4 levels, box-shadow: elevation scale (sm/md/lg/xl), transform: translateZ(), backdrop-filter: blur(), position: relative for stacking, parallax on scroll","☐ Layers clearly defined, ☐ Shadows show depth, ☐ Overlaps intentional, ☐ Hierarchy clear, ☐ Performance optimized, ☐ Mobile depth maintained","--elevation-1: 0 1px 3px rgba(0,0,0,0.1), --elevation-2: 0 4px 6px rgba(0,0,0,0.1), --elevation-3: 0 10px 20px rgba(0,0,0,0.1), --elevation-4: 0 20px 40px rgba(0,0,0,0.15), --blur-amount: 8px"
|
||||||
|
47,Exaggerated Minimalism,General,"Bold minimalism, oversized typography, high contrast, negative space, loud minimal, statement design","#000000 (Black), #FFFFFF (White), single vibrant accent only","Minimal - single accent color, no secondary colors, extreme restraint","font-size: clamp(3rem 10vw 12rem), font-weight: 900, letter-spacing: -0.05em, massive whitespace","Fashion, architecture, portfolios, agency landing pages, luxury brands, editorial","E-commerce catalogs, dashboards, forms, data-heavy, elderly users, complex apps",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AA,✓ High,✓ High,"Tailwind 10/10, Typography.js 10/10",2020s Modern,Low,"Design with exaggerated minimalism. Use: oversized typography (clamp 3rem-12rem), extreme negative space, black/white primary, single accent color only, bold statements, minimal elements, dramatic contrast.","font-size: clamp(3rem, 10vw, 12rem), font-weight: 900, letter-spacing: -0.05em, color: #000 or #FFF, padding: 8rem+, single accent, no decorations","☐ Typography oversized, ☐ White space extreme, ☐ Black/white dominant, ☐ Single accent only, ☐ Elements minimal, ☐ Statement clear","--type-giant: clamp(3rem, 10vw, 12rem), --type-weight: 900, --spacing-huge: 8rem, --color-primary: #000000, --color-bg: #FFFFFF, --accent: single color only"
|
||||||
|
48,Kinetic Typography,General,"Motion text, animated type, moving letters, dynamic, typing effect, morphing, scroll-triggered text","Flexible - high contrast recommended, bold colors for emphasis, animation-friendly palette","Accent colors for emphasis, transition colors, gradient text fills","@keyframes text animation, typing effect, background-clip: text, GSAP ScrollTrigger, split text","Hero sections, marketing sites, video platforms, storytelling, creative portfolios, landing pages","Long-form content, accessibility-critical, data interfaces, forms, elderly users",✓ Full,✓ Full,⚠ Moderate,❌ Poor (motion),✓ Good,✓ Very High,"GSAP 10/10, Framer Motion 10/10",2020s Modern,High,"Design with kinetic typography. Use: animated text, scroll-triggered reveals, typing effects, letter-by-letter animations, morphing text, gradient text fills, oversized hero text, text as the main visual element.","@keyframes for text animation, background-clip: text, GSAP SplitText, typing effect (steps()), transform on letters, scroll-triggered (Intersection Observer), variable fonts for morphing","☐ Text animations smooth, ☐ Prefers-reduced-motion respected, ☐ Fallback for no-JS, ☐ Mobile performance ok, ☐ Typing effect timed, ☐ Scroll triggers work","--text-animation-duration: 1s, --letter-delay: 0.05s, --typing-speed: 100ms, --gradient-text: linear-gradient(90deg, #color1, #color2), --morph-duration: 0.5s"
|
||||||
|
49,Parallax Storytelling,General,"Scroll-driven, narrative, layered scrolling, immersive, progressive disclosure, cinematic, scroll-triggered","Story-dependent, often gradients and natural colors, section-specific palettes","Section transition colors, depth layer colors, narrative mood colors","transform: translateY(scroll), position: fixed/sticky, perspective: 1px, scroll-triggered animations","Brand storytelling, product launches, case studies, portfolios, annual reports, marketing campaigns","E-commerce, dashboards, mobile-first, SEO-critical, accessibility-required",✓ Full,✓ Full,❌ Poor,❌ Poor (motion),✗ Low,✓ High,"GSAP ScrollTrigger 10/10, Locomotive Scroll 10/10",2020s Modern,High,"Design a parallax storytelling page. Use: scroll-driven narrative, layered backgrounds (3-5 layers), fixed/sticky sections, cinematic transitions, progressive disclosure, full-screen chapters, depth perception.","position: fixed/sticky, transform: translateY(calc()), perspective: 1px, z-index layering, scroll-snap-type, Intersection Observer for triggers, will-change: transform","☐ Layers parallax smoothly, ☐ Story flows naturally, ☐ Mobile alternative provided, ☐ Performance optimized, ☐ Skip option available, ☐ Reduced motion fallback","--parallax-speed-bg: 0.3, --parallax-speed-mid: 0.6, --parallax-speed-fg: 1, --section-height: 100vh, --transition-duration: 600ms, --perspective: 1px"
|
||||||
|
50,Swiss Modernism 2.0,General,"Grid system, Helvetica, modular, asymmetric, international style, rational, clean, mathematical spacing","#000000, #FFFFFF, #F5F5F5, single vibrant accent only","Minimal secondary, accent for emphasis only, no gradients","display: grid, grid-template-columns: repeat(12 1fr), gap: 1rem, mathematical ratios, clear hierarchy","Corporate sites, architecture, editorial, SaaS, museums, professional services, documentation","Playful brands, children's sites, entertainment, gaming, emotional storytelling",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AAA,✓ High,✓ High,"Tailwind 10/10, Bootstrap 9/10, Foundation 10/10",1950s Swiss + 2020s,Low,"Design with Swiss Modernism 2.0. Use: strict grid system (12 columns), Helvetica/Inter fonts, mathematical spacing, asymmetric balance, high contrast, minimal decoration, clean hierarchy, single accent color.","display: grid, grid-template-columns: repeat(12, 1fr), gap: 1rem (8px base unit), font-family: Inter/Helvetica, font-weight: 400-700, color: #000/#FFF, single accent","☐ 12-column grid strict, ☐ Spacing mathematical, ☐ Typography hierarchy clear, ☐ Single accent only, ☐ No decorations, ☐ High contrast verified","--grid-columns: 12, --grid-gap: 1rem, --base-unit: 8px, --font-primary: Inter, --color-text: #000000, --color-bg: #FFFFFF, --accent: single vibrant"
|
||||||
|
51,HUD / Sci-Fi FUI,General,"Futuristic, technical, wireframe, neon, data, transparency, iron man, sci-fi, interface","Neon Cyan #00FFFF, Holographic Blue #0080FF, Alert Red #FF0000","Transparent Black, Grid Lines #333333","Glow effects, scanning animations, ticker text, blinking markers, fine line drawing","Sci-fi games, space tech, cybersecurity, movie props, immersive dashboards","Standard corporate, reading heavy content, accessible public services",✓ Low,✓ Full,⚠ Moderate (renders),⚠ Poor (thin lines),◐ Medium,✗ Low,"React 9/10, Canvas 10/10",2010s Sci-Fi,High,"Design a futuristic HUD (Heads Up Display) or FUI. Use: thin lines (1px), neon cyan/blue on black, technical markers, decorative brackets, data visualization, monospaced tech fonts, glowing elements, transparency.","border: 1px solid rgba(0,255,255,0.5), color: #00FFFF, background: transparent or rgba(0,0,0,0.8), font-family: monospace, text-shadow: 0 0 5px cyan","☐ Fine lines 1px, ☐ Neon glow text/borders, ☐ Monospaced font, ☐ Dark/Transparent BG, ☐ Decorative tech markers, ☐ Holographic feel","--hud-color: #00FFFF, --bg-color: rgba(0,10,20,0.9), --line-width: 1px, --glow: 0 0 5px, --font: monospace"
|
||||||
|
52,Pixel Art,General,"Retro, 8-bit, 16-bit, gaming, blocky, nostalgic, pixelated, arcade","Primary colors (NES Palette), brights, limited palette","Black outlines, shading via dithering or block colors","Frame-by-frame sprite animation, blinking cursor, instant transitions, marquee text","Indie games, retro tools, creative portfolios, nostalgia marketing, Web3/NFT","Professional corporate, modern SaaS, high-res photography sites",✓ Full,✓ Full,⚡ Excellent,✓ Good (if contrast ok),✓ High,◐ Medium,"CSS (box-shadow) 8/10, Canvas 10/10",1980s Arcade,Medium,"Design a pixel art inspired interface. Use: pixelated fonts, 8-bit or 16-bit aesthetic, sharp edges (image-rendering: pixelated), limited color palette, blocky UI elements, retro gaming feel.","font-family: 'Press Start 2P', image-rendering: pixelated, box-shadow: 4px 0 0 #000 (pixel border), no anti-aliasing","☐ Pixelated fonts loaded, ☐ Images sharp (no blur), ☐ CSS box-shadow for pixel borders, ☐ Retro palette, ☐ Blocky layout","--pixel-size: 4px, --font: pixel font, --border-style: pixel-shadow, --anti-alias: none"
|
||||||
|
53,Bento Grids,General,"Apple-style, modular, cards, organized, clean, hierarchy, grid, rounded, soft","Off-white #F5F5F7, Clean White #FFFFFF, Text #1D1D1F","Subtle accents, soft shadows, blurred backdrops","Hover scale (1.02), soft shadow expansion, smooth layout shifts, content reveal","Product features, dashboards, personal sites, marketing summaries, galleries","Long-form reading, data tables, complex forms",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AA,✓ High,✓ High,"CSS Grid 10/10, Tailwind 10/10",2020s Apple/Linear,Low,"Design a Bento Grid layout. Use: modular grid system, rounded corners (16-24px), different card sizes (1x1, 2x1, 2x2), card-based hierarchy, soft backgrounds (#F5F5F7), subtle borders, content-first, Apple-style aesthetic.","display: grid, grid-template-columns: repeat(auto-fit, minmax(...)), gap: 1rem, border-radius: 20px, background: #FFF, box-shadow: subtle","☐ Grid layout (CSS Grid), ☐ Rounded corners 16-24px, ☐ Varied card spans, ☐ Content fits card size, ☐ Responsive re-flow, ☐ Apple-like aesthetic","--grid-gap: 20px, --card-radius: 24px, --card-bg: #FFFFFF, --page-bg: #F5F5F7, --shadow: soft"
|
||||||
|
55,Spatial UI (VisionOS),General,"Glass, depth, immersion, spatial, translucent, gaze, gesture, apple, vision-pro","Frosted Glass #FFFFFF (15-30% opacity), System White","Vibrant system colors for active states, deep shadows for depth","Parallax depth, dynamic lighting response, gaze-hover effects, smooth scale on focus","Spatial computing apps, VR/AR interfaces, immersive media, futuristic dashboards","Text-heavy documents, high-contrast requirements, non-3D capable devices",✓ Full,✓ Full,⚠ Moderate (blur cost),⚠ Contrast risks,✓ High (if adapted),✓ High,"SwiftUI, React (Three.js/Fiber)",2024 Spatial Era,High,"Design a VisionOS-style spatial interface. Use: frosted glass panels, depth layers, translucent backgrounds (15-30% opacity), vibrant colors for active states, gaze-hover effects, floating windows, immersive feel.","backdrop-filter: blur(40px) saturate(180%), background: rgba(255,255,255,0.2), border-radius: 24px, box-shadow: 0 8px 32px rgba(0,0,0,0.1), transform: scale on focus, depth via shadows","☐ Glass effect visible, ☐ Depth layers clear, ☐ Hover states defined, ☐ Colors vibrant on active, ☐ Floating feel achieved, ☐ Contrast maintained","--glass-bg: rgba(255,255,255,0.2), --glass-blur: 40px, --glass-saturate: 180%, --window-radius: 24px, --depth-shadow: 0 8px 32px rgba(0,0,0,0.1), --focus-scale: 1.02"
|
||||||
|
56,E-Ink / Paper,General,"Paper-like, matte, high contrast, texture, reading, calm, slow tech, monochrome","Off-White #FDFBF7, Paper White #F5F5F5, Ink Black #1A1A1A","Pencil Grey #4A4A4A, Highlighter Yellow #FFFF00 (accent)","No motion blur, distinct page turns, grain/noise texture, sharp transitions (no fade)","Reading apps, digital newspapers, minimal journals, distraction-free writing, slow-living brands","Gaming, video platforms, high-energy marketing, dark mode dependent apps",✓ Full,✗ Low (inverted only),⚡ Excellent,✓ WCAG AAA,✓ High,✓ Medium,"Tailwind 10/10, CSS 10/10",2020s Digital Well-being,Low,"Design an e-ink/paper style interface. Use: high contrast black on off-white, paper texture, no animations (instant transitions), reading-focused, minimal UI chrome, distraction-free, calm aesthetic, monochrome.","background: #FDFBF7 (paper white), color: #1A1A1A, transition: none, font-family: serif for reading, no gradients, border: 1px solid #E0E0E0, texture overlay (noise)","☐ Paper background color, ☐ High contrast text, ☐ No animations, ☐ Reading optimized, ☐ Distraction-free, ☐ Print-friendly","--paper-bg: #FDFBF7, --ink-color: #1A1A1A, --pencil-grey: #4A4A4A, --border-color: #E0E0E0, --font-reading: Georgia, --transition: none"
|
||||||
|
57,Gen Z Chaos / Maximalism,General,"Chaos, clutter, stickers, raw, collage, mixed media, loud, internet culture, ironic","Clashing Brights: #FF00FF, #00FF00, #FFFF00, #0000FF","Gradients, rainbow, glitch, noise, heavily saturated mix","Marquee scrolls, jitter, sticker layering, GIF overload, random placement, drag-and-drop","Gen Z lifestyle brands, music artists, creative portfolios, viral marketing, fashion","Corporate, government, healthcare, banking, serious tools",✓ Full,✓ Full,⚠ Poor (heavy assets),❌ Poor,◐ Medium,✓ High (Viral),CSS-in-JS 8/10,2023+ Internet Core,High,"Design a Gen Z chaos maximalist interface. Use: clashing bright colors, sticker overlays, collage aesthetic, raw/unpolished feel, mixed media, ironic elements, loud typography, GIF-heavy, internet culture references.","mix-blend-mode: multiply/screen, transform: rotate(random), animation: jitter, marquee text, position: absolute for scattered elements, filter: saturate(150%), z-index chaos","☐ Colors clash intentionally, ☐ Stickers/overlays present, ☐ Layout chaotic but usable, ☐ GIFs optimized, ☐ Mobile scrollable, ☐ Performance acceptable","--chaos-pink: #FF00FF, --chaos-green: #00FF00, --chaos-yellow: #FFFF00, --chaos-blue: #0000FF, --jitter-amount: 5deg, --saturate: 150%"
|
||||||
|
58,Biomimetic / Organic 2.0,General,"Nature-inspired, cellular, fluid, breathing, generative, algorithms, life-like","Cellular Pink #FF9999, Chlorophyll Green #00FF41, Bioluminescent Blue","Deep Ocean #001E3C, Coral #FF7F50, Organic gradients","Breathing animations, fluid morphing, generative growth, physics-based movement","Sustainability tech, biotech, advanced health, meditation, generative art platforms","Standard SaaS, data grids, strict corporate, accounting",✓ Full,✓ Full,⚠ Moderate,✓ Good,✓ Good,✓ High,"Canvas 10/10, WebGL 10/10",2024+ Generative,High,"Design a biomimetic organic interface. Use: cellular/fluid shapes, breathing animations, generative patterns, bioluminescent colors, physics-based movement, nature algorithms, life-like elements, flowing gradients.","SVG morphing (SMIL or GSAP), canvas for generative, animation: breathing (scale pulse), filter: blur for organic, clip-path for cellular, WebGL for advanced, physics libraries","☐ Organic shapes present, ☐ Animations feel alive, ☐ Generative elements, ☐ Performance monitored, ☐ Mobile fallback, ☐ Accessibility alt content","--cellular-pink: #FF9999, --chlorophyll: #00FF41, --bioluminescent: #00FFFF, --breathing-duration: 4s, --morph-ease: cubic-bezier(0.4, 0, 0.2, 1), --organic-blur: 20px"
|
||||||
|
59,Anti-Polish / Raw Aesthetic,General,"Hand-drawn, collage, scanned textures, unfinished, imperfect, authentic, human, sketch, raw marks, creative process","Paper White #FAFAF8, Pencil Grey #4A4A4A, Marker Black #1A1A1A, Kraft Brown #C4A77D","Watercolor washes, pencil shading, ink splatters, tape textures, aged paper tones","No smooth transitions, hand-drawn animations, paper texture overlays, jitter effects, sketch reveal","Creative portfolios, artist sites, indie brands, handmade products, authentic storytelling, editorial","Corporate enterprise, fintech, healthcare, government, polished SaaS",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AA,✓ High,✓ High,"CSS 10/10, SVG 10/10",2025+ Anti-Digital,Low,"Design with anti-polish raw aesthetic. Use: hand-drawn elements, scanned textures, unfinished look, paper/pencil textures, collage style, authentic imperfection, sketch marks, tape/sticker overlays, human touch.","background: url(paper-texture.png), filter: grayscale() contrast(), border: hand-drawn SVG, transform: rotate(small random), no smooth transitions, sketch-style fonts, opacity variations","☐ Textures loaded, ☐ Hand-drawn elements present, ☐ Imperfections intentional, ☐ Authentic feel achieved, ☐ Performance ok with textures, ☐ Accessibility maintained","--paper-bg: #FAFAF8, --pencil-color: #4A4A4A, --marker-black: #1A1A1A, --kraft-brown: #C4A77D, --sketch-rotation: random(-3deg, 3deg), --texture-opacity: 0.3"
|
||||||
|
60,Tactile Digital / Deformable UI,General,"Jelly buttons, chrome, clay, squishy, deformable, bouncy, physical, tactile feedback, press response","Gradient metallics, Chrome Silver #C0C0C0, Jelly Pink #FF9ECD, Soft Blue #87CEEB","Glossy highlights, shadow depth, reflection effects, material-specific colors","Press deformation (scale + squish), bounce-back (cubic-bezier), material response, haptic-like feedback, spring physics","Modern mobile apps, playful brands, entertainment, gaming UI, consumer products, interactive demos","Enterprise software, data dashboards, accessibility-critical, professional tools",✓ Full,✓ Full,⚠ Good,⚠ Motion sensitive,✓ High,✓ Very High,"Framer Motion 10/10, React Spring 10/10, GSAP 10/10",2025+ Tactile Era,Medium,"Design a tactile deformable interface. Use: jelly/squishy buttons, press deformation effect, bounce-back animations, chrome/clay materials, spring physics, haptic-like feedback, material response, 3D depth on interaction.","transform: scale(0.95) on active, animation: bounce (cubic-bezier(0.34, 1.56, 0.64, 1)), box-shadow: inset for press, filter: brightness on press, spring physics (react-spring/framer-motion)","☐ Press effect visible, ☐ Bounce-back smooth, ☐ Material feels tactile, ☐ Spring physics tuned, ☐ Mobile touch responsive, ☐ Reduced motion option","--press-scale: 0.95, --bounce-duration: 400ms, --spring-stiffness: 300, --spring-damping: 20, --material-glossy: linear-gradient(135deg, white 0%, transparent 60%), --depth-shadow: 0 10px 30px rgba(0,0,0,0.2)"
|
||||||
|
61,Nature Distilled,General,"Muted earthy, skin tones, wood, soil, sand, terracotta, warmth, organic materials, handmade warmth","Terracotta #C67B5C, Sand Beige #D4C4A8, Warm Clay #B5651D, Soft Cream #F5F0E1","Earth Brown #8B4513, Olive Green #6B7B3C, Warm Stone #9C8B7A, muted gradients","Subtle parallax, natural easing (ease-out), texture overlays, grain effects, soft shadows","Wellness brands, sustainable products, artisan goods, organic food, spa/beauty, home decor","Tech startups, gaming, nightlife, corporate finance, high-energy brands",✓ Full,◐ Partial,⚡ Excellent,✓ WCAG AA,✓ High,✓ High,"Tailwind 10/10, CSS 10/10",2025+ Handmade Warmth,Low,"Design with nature distilled aesthetic. Use: muted earthy colors (terracotta, sand, olive), organic materials feel, warm tones, handmade warmth, natural textures, artisan quality, sustainable vibe, soft gradients.","background: warm earth tones, color: #C67B5C #D4C4A8 #6B7B3C, border-radius: organic (varied), box-shadow: soft natural, texture overlays (grain), font: humanist sans-serif","☐ Earth tones dominant, ☐ Warm feel achieved, ☐ Textures subtle, ☐ Handmade quality, ☐ Sustainable messaging, ☐ Calming aesthetic","--terracotta: #C67B5C, --sand-beige: #D4C4A8, --warm-clay: #B5651D, --soft-cream: #F5F0E1, --olive-green: #6B7B3C, --grain-opacity: 0.1"
|
||||||
|
62,Interactive Cursor Design,General,"Custom cursor, cursor as tool, hover effects, cursor feedback, pointer transformation, cursor trail, magnetic cursor","Brand-dependent, cursor accent color, high contrast for visibility","Trail colors, hover state colors, magnetic zone indicators, feedback colors","Cursor scale on hover, magnetic pull to elements, cursor morphing, trail effects, blend mode cursors, click feedback","Creative portfolios, interactive experiences, agency sites, product showcases, gaming, entertainment","Mobile-first (no cursor), accessibility-critical, data-heavy dashboards, forms",✓ Full,✓ Full,⚡ Good,⚠ Not for touch/SR,✗ No cursor,✓ High,"GSAP 10/10, Framer Motion 10/10, Custom JS 10/10",2025+ Interactive,Medium,"Design with interactive cursor effects. Use: custom cursor, cursor morphing on hover, magnetic cursor pull, cursor trails, blend mode cursors, click feedback animations, cursor as interaction tool, pointer transformation.","cursor: none (custom), position: fixed for cursor element, mix-blend-mode: difference, transform on hover targets, magnetic effect (JS position lerp), trail with opacity fade, scale on click","☐ Custom cursor works, ☐ Hover morph smooth, ☐ Magnetic pull subtle, ☐ Trail performance ok, ☐ Click feedback visible, ☐ Touch fallback provided","--cursor-size: 20px, --cursor-hover-scale: 1.5, --magnetic-distance: 100px, --trail-length: 10, --trail-fade: 0.1, --blend-mode: difference"
|
||||||
|
63,Voice-First Multimodal,General,"Voice UI, multimodal, audio feedback, conversational, hands-free, ambient, contextual, speech recognition","Calm neutrals: Soft White #FAFAFA, Muted Blue #6B8FAF, Gentle Purple #9B8FBB","Audio waveform colors, status indicators (listening/processing/speaking), success/error tones","Voice waveform visualization, listening pulse, processing spinner, speak animation, smooth transitions","Voice assistants, accessibility apps, hands-free tools, smart home, automotive UI, cooking apps","Visual-heavy content, data entry, complex forms, noisy environments",✓ Full,✓ Full,⚡ Excellent,✓ Excellent,✓ High,✓ High,"Web Speech API 10/10, React 10/10",2025+ Voice Era,Medium,"Design a voice-first multimodal interface. Use: voice waveform visualization, listening state indicator, speaking animation, minimal visible UI, audio feedback cues, hands-free optimized, conversational flow, ambient design.","Web Speech API integration, canvas for waveform, animation: pulse for listening, status indicators (color change), audio visualization (Web Audio API), minimal chrome, large touch targets","☐ Voice recognition works, ☐ Visual feedback clear, ☐ Listening state obvious, ☐ Speaking animation smooth, ☐ Fallback UI provided, ☐ Accessibility excellent","--listening-color: #6B8FAF, --speaking-color: #22C55E, --waveform-height: 60px, --pulse-duration: 1.5s, --indicator-size: 24px, --voice-accent: #9B8FBB"
|
||||||
|
64,3D Product Preview,General,"360 product view, rotatable, zoomable, touch-to-spin, AR preview, product configurator, interactive 3D model","Product-dependent, neutral backgrounds: Soft Grey #E8E8E8, Pure White #FFFFFF","Shadow gradients, reflection planes, environment lighting colors, accent highlights","Drag-to-rotate, pinch-to-zoom, spin animation, AR placement, material switching, smooth orbit controls","E-commerce, furniture, fashion, automotive, electronics, jewelry, product configurators","Content-heavy sites, blogs, dashboards, low-bandwidth, accessibility-critical",◐ Partial,◐ Partial,❌ Poor (3D rendering),⚠ Alt content needed,◐ Medium,✓ Very High,"Three.js 10/10, model-viewer 10/10, Spline 9/10",2025+ E-commerce 3D,High,"Design a 3D product preview interface. Use: 360° rotation, drag-to-spin, pinch-to-zoom, AR preview button, material/color switcher, hotspot annotations, orbit controls, product configurator, smooth rendering.","Three.js or model-viewer, OrbitControls, touch events for rotation, WebXR for AR, canvas with WebGL, loading placeholder, LOD for performance, environment lighting","☐ 3D model loads fast, ☐ Rotation smooth, ☐ Zoom works (pinch/scroll), ☐ AR button functional, ☐ Colors switchable, ☐ Mobile touch works","--canvas-bg: #F5F5F5, --hotspot-color: #3B82F6, --loading-spinner: primary, --rotation-speed: 0.5, --zoom-min: 0.5, --zoom-max: 2"
|
||||||
|
65,Gradient Mesh / Aurora Evolved,General,"Complex gradients, mesh gradients, multi-color blend, aurora effect, flowing colors, iridescent, holographic, prismatic","Multi-stop gradients: Cyan #00FFFF, Magenta #FF00FF, Yellow #FFFF00, Blue #0066FF, Green #00FF66","Complementary mesh points, smooth color transitions, iridescent overlays, chromatic shifts","CSS mesh-gradient (experimental), SVG gradients, canvas gradients, smooth color morphing, flowing animation","Hero sections, backgrounds, creative brands, music platforms, fashion, lifestyle, premium products","Data interfaces, text-heavy content, accessibility-critical, conservative brands",✓ Full,✓ Full,⚠ Good,⚠ Text contrast,✓ Good,✓ High,"CSS 8/10, SVG 10/10, Canvas 10/10",2025+ Gradient Evolution,Medium,"Design with gradient mesh aurora effect. Use: multi-color mesh gradients, flowing color transitions, aurora/northern lights feel, iridescent overlays, holographic shimmer, prismatic effects, smooth color morphing.","background: conic-gradient or mesh (SVG), animation: gradient flow (background-position), filter: hue-rotate for shimmer, mix-blend-mode: screen, canvas for complex mesh, multiple gradient layers","☐ Mesh gradient visible, ☐ Colors flow smoothly, ☐ Aurora effect achieved, ☐ Performance acceptable, ☐ Text remains readable, ☐ Mobile renders ok","--mesh-color-1: #00FFFF, --mesh-color-2: #FF00FF, --mesh-color-3: #FFFF00, --mesh-color-4: #00FF66, --flow-duration: 10s, --shimmer-intensity: 0.3"
|
||||||
|
66,Editorial Grid / Magazine,General,"Magazine layout, asymmetric grid, editorial typography, pull quotes, drop caps, column layout, print-inspired","High contrast: Black #000000, White #FFFFFF, accent brand color","Muted supporting, pull quote highlights, byline colors, section dividers","Smooth scroll, reveal on scroll, parallax images, text animations, page-flip transitions","News sites, blogs, magazines, editorial content, long-form articles, journalism, publishing","Dashboards, apps, e-commerce catalogs, real-time data, short-form content",✓ Full,✓ Full,⚡ Excellent,✓ WCAG AAA,✓ High,✓ Medium,"CSS Grid 10/10, Tailwind 10/10",2020s Editorial Digital,Low,"Design an editorial magazine layout. Use: asymmetric grid, pull quotes, drop caps, multi-column text, large imagery, bylines, section dividers, print-inspired typography, article hierarchy, white space balance.","display: grid with named areas, column-count for text, ::first-letter for drop caps, blockquote styling, figure/figcaption, gap variations, font: serif for body, variable widths","☐ Grid asymmetric, ☐ Typography editorial, ☐ Pull quotes styled, ☐ Drop caps present, ☐ Images large/impactful, ☐ Mobile reflows well","--grid-cols: asymmetric, --body-font: Georgia/Merriweather, --heading-font: bold sans, --drop-cap-size: 4em, --pull-quote-size: 1.5em, --column-gap: 2rem"
|
||||||
|
67,Chromatic Aberration / RGB Split,General,"RGB split, color fringing, glitch, retro tech, VHS, analog error, distortion, lens effect","Offset RGB: Red #FF0000, Green #00FF00, Blue #0000FF, Black #000000","Neon accents, scan lines, noise overlays, error colors","RGB offset animation, glitch timing, scan line movement, noise flicker, distortion on hover","Music platforms, gaming, tech brands, creative portfolios, nightlife, entertainment, video platforms","Corporate, healthcare, finance, accessibility-critical, elderly users",✓ Full,✓ Dark preferred,⚠ Good,⚠ Can cause strain,◐ Medium,✓ High,"CSS filters 10/10, GSAP 10/10",2020s Retro-Tech,Medium,"Design with chromatic aberration RGB split effect. Use: color channel offset (R/G/B), glitch aesthetic, retro tech feel, VHS error look, lens distortion, scan lines, noise overlay, analog imperfection.","filter: drop-shadow with offset colors, text-shadow: RGB offset (-2px 0 red, 2px 0 cyan), animation: glitch (random offset), ::before for scanlines, mix-blend-mode: screen for overlays","☐ RGB split visible, ☐ Glitch effect controlled, ☐ Scan lines subtle, ☐ Performance ok, ☐ Readability maintained, ☐ Reduced motion option","--rgb-offset: 2px, --red-channel: #FF0000, --green-channel: #00FF00, --blue-channel: #0000FF, --glitch-duration: 0.3s, --scanline-opacity: 0.1"
|
||||||
|
68,Vintage Analog / Retro Film,General,"Film grain, VHS, cassette tape, polaroid, analog warmth, faded colors, light leaks, vintage photography","Faded Cream #F5E6C8, Warm Sepia #D4A574, Muted Teal #4A7B7C, Soft Pink #E8B4B8","Grain overlays, light leak oranges, shadow blues, vintage paper tones, desaturated accents","Film grain overlay, VHS tracking effect, polaroid shake, fade-in transitions, light leak animations","Photography portfolios, music/vinyl brands, vintage fashion, nostalgia marketing, film industry, cafes","Modern tech, SaaS, healthcare, children's apps, corporate enterprise",✓ Full,◐ Partial,⚡ Good,✓ WCAG AA,✓ High,✓ High,"CSS filters 10/10, Canvas 9/10",1970s-90s Analog Revival,Medium,"Design with vintage analog film aesthetic. Use: film grain overlay, faded/desaturated colors, warm sepia tones, light leaks, VHS tracking effect, polaroid frame, analog warmth, nostalgic photography feel.","filter: sepia() contrast() saturate(0.8), background: noise texture overlay, animation: VHS tracking (transform skew), light leak gradient overlay, border for polaroid frame, grain via SVG filter","☐ Film grain visible, ☐ Colors faded/warm, ☐ Light leaks present, ☐ Nostalgic feel achieved, ☐ Performance with filters, ☐ Images look vintage","--sepia-amount: 20%, --contrast: 1.1, --saturation: 0.8, --grain-opacity: 0.15, --light-leak-color: rgba(255,200,100,0.2), --warm-tint: #F5E6C8"
|
||||||
|
58
.codex/skills/ui-ux-pro-max/data/typography.csv
Normal file
58
.codex/skills/ui-ux-pro-max/data/typography.csv
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
No,Font Pairing Name,Category,Heading Font,Body Font,Mood/Style Keywords,Best For,Google Fonts URL,CSS Import,Tailwind Config,Notes
|
||||||
|
1,Classic Elegant,"Serif + Sans",Playfair Display,Inter,"elegant, luxury, sophisticated, timeless, premium, editorial","Luxury brands, fashion, spa, beauty, editorial, magazines, high-end e-commerce","https://fonts.google.com/share?selection.family=Inter:wght@300;400;500;600;700|Playfair+Display:wght@400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Playfair+Display:wght@400;500;600;700&display=swap');","fontFamily: { serif: ['Playfair Display', 'serif'], sans: ['Inter', 'sans-serif'] }","High contrast between elegant heading and clean body. Perfect for luxury/premium."
|
||||||
|
2,Modern Professional,"Sans + Sans",Poppins,Open Sans,"modern, professional, clean, corporate, friendly, approachable","SaaS, corporate sites, business apps, startups, professional services","https://fonts.google.com/share?selection.family=Open+Sans:wght@300;400;500;600;700|Poppins:wght@400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;500;600;700&family=Poppins:wght@400;500;600;700&display=swap');","fontFamily: { heading: ['Poppins', 'sans-serif'], body: ['Open Sans', 'sans-serif'] }","Geometric Poppins for headings, humanist Open Sans for readability."
|
||||||
|
3,Tech Startup,"Sans + Sans",Space Grotesk,DM Sans,"tech, startup, modern, innovative, bold, futuristic","Tech companies, startups, SaaS, developer tools, AI products","https://fonts.google.com/share?selection.family=DM+Sans:wght@400;500;700|Space+Grotesk:wght@400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=Space+Grotesk:wght@400;500;600;700&display=swap');","fontFamily: { heading: ['Space Grotesk', 'sans-serif'], body: ['DM Sans', 'sans-serif'] }","Space Grotesk has unique character, DM Sans is highly readable."
|
||||||
|
4,Editorial Classic,"Serif + Serif",Cormorant Garamond,Libre Baskerville,"editorial, classic, literary, traditional, refined, bookish","Publishing, blogs, news sites, literary magazines, book covers","https://fonts.google.com/share?selection.family=Cormorant+Garamond:wght@400;500;600;700|Libre+Baskerville:wght@400;700","@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@400;500;600;700&family=Libre+Baskerville:wght@400;700&display=swap');","fontFamily: { heading: ['Cormorant Garamond', 'serif'], body: ['Libre Baskerville', 'serif'] }","All-serif pairing for traditional editorial feel."
|
||||||
|
5,Minimal Swiss,"Sans + Sans",Inter,Inter,"minimal, clean, swiss, functional, neutral, professional","Dashboards, admin panels, documentation, enterprise apps, design systems","https://fonts.google.com/share?selection.family=Inter:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');","fontFamily: { sans: ['Inter', 'sans-serif'] }","Single font family with weight variations. Ultimate simplicity."
|
||||||
|
6,Playful Creative,"Display + Sans",Fredoka,Nunito,"playful, friendly, fun, creative, warm, approachable","Children's apps, educational, gaming, creative tools, entertainment","https://fonts.google.com/share?selection.family=Fredoka:wght@400;500;600;700|Nunito:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Fredoka:wght@400;500;600;700&family=Nunito:wght@300;400;500;600;700&display=swap');","fontFamily: { heading: ['Fredoka', 'sans-serif'], body: ['Nunito', 'sans-serif'] }","Rounded, friendly fonts perfect for playful UIs."
|
||||||
|
7,Bold Statement,"Display + Sans",Bebas Neue,Source Sans 3,"bold, impactful, strong, dramatic, modern, headlines","Marketing sites, portfolios, agencies, event pages, sports","https://fonts.google.com/share?selection.family=Bebas+Neue|Source+Sans+3:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Source+Sans+3:wght@300;400;500;600;700&display=swap');","fontFamily: { display: ['Bebas Neue', 'sans-serif'], body: ['Source Sans 3', 'sans-serif'] }","Bebas Neue for large headlines only. All-caps display font."
|
||||||
|
8,Wellness Calm,"Serif + Sans",Lora,Raleway,"calm, wellness, health, relaxing, natural, organic","Health apps, wellness, spa, meditation, yoga, organic brands","https://fonts.google.com/share?selection.family=Lora:wght@400;500;600;700|Raleway:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Lora:wght@400;500;600;700&family=Raleway:wght@300;400;500;600;700&display=swap');","fontFamily: { serif: ['Lora', 'serif'], sans: ['Raleway', 'sans-serif'] }","Lora's organic curves with Raleway's elegant simplicity."
|
||||||
|
9,Developer Mono,"Mono + Sans",JetBrains Mono,IBM Plex Sans,"code, developer, technical, precise, functional, hacker","Developer tools, documentation, code editors, tech blogs, CLI apps","https://fonts.google.com/share?selection.family=IBM+Plex+Sans:wght@300;400;500;600;700|JetBrains+Mono:wght@400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap');","fontFamily: { mono: ['JetBrains Mono', 'monospace'], sans: ['IBM Plex Sans', 'sans-serif'] }","JetBrains for code, IBM Plex for UI. Developer-focused."
|
||||||
|
10,Retro Vintage,"Display + Serif",Abril Fatface,Merriweather,"retro, vintage, nostalgic, dramatic, decorative, bold","Vintage brands, breweries, restaurants, creative portfolios, posters","https://fonts.google.com/share?selection.family=Abril+Fatface|Merriweather:wght@300;400;700","@import url('https://fonts.googleapis.com/css2?family=Abril+Fatface&family=Merriweather:wght@300;400;700&display=swap');","fontFamily: { display: ['Abril Fatface', 'serif'], body: ['Merriweather', 'serif'] }","Abril Fatface for hero headlines only. High-impact vintage feel."
|
||||||
|
11,Geometric Modern,"Sans + Sans",Outfit,Work Sans,"geometric, modern, clean, balanced, contemporary, versatile","General purpose, portfolios, agencies, modern brands, landing pages","https://fonts.google.com/share?selection.family=Outfit:wght@300;400;500;600;700|Work+Sans:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&family=Work+Sans:wght@300;400;500;600;700&display=swap');","fontFamily: { heading: ['Outfit', 'sans-serif'], body: ['Work Sans', 'sans-serif'] }","Both geometric but Outfit more distinctive for headings."
|
||||||
|
12,Luxury Serif,"Serif + Sans",Cormorant,Montserrat,"luxury, high-end, fashion, elegant, refined, premium","Fashion brands, luxury e-commerce, jewelry, high-end services","https://fonts.google.com/share?selection.family=Cormorant:wght@400;500;600;700|Montserrat:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Cormorant:wght@400;500;600;700&family=Montserrat:wght@300;400;500;600;700&display=swap');","fontFamily: { serif: ['Cormorant', 'serif'], sans: ['Montserrat', 'sans-serif'] }","Cormorant's elegance with Montserrat's geometric precision."
|
||||||
|
13,Friendly SaaS,"Sans + Sans",Plus Jakarta Sans,Plus Jakarta Sans,"friendly, modern, saas, clean, approachable, professional","SaaS products, web apps, dashboards, B2B, productivity tools","https://fonts.google.com/share?selection.family=Plus+Jakarta+Sans:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700&display=swap');","fontFamily: { sans: ['Plus Jakarta Sans', 'sans-serif'] }","Single versatile font. Modern alternative to Inter."
|
||||||
|
14,News Editorial,"Serif + Sans",Newsreader,Roboto,"news, editorial, journalism, trustworthy, readable, informative","News sites, blogs, magazines, journalism, content-heavy sites","https://fonts.google.com/share?selection.family=Newsreader:wght@400;500;600;700|Roboto:wght@300;400;500;700","@import url('https://fonts.googleapis.com/css2?family=Newsreader:wght@400;500;600;700&family=Roboto:wght@300;400;500;700&display=swap');","fontFamily: { serif: ['Newsreader', 'serif'], sans: ['Roboto', 'sans-serif'] }","Newsreader designed for long-form reading. Roboto for UI."
|
||||||
|
15,Handwritten Charm,"Script + Sans",Caveat,Quicksand,"handwritten, personal, friendly, casual, warm, charming","Personal blogs, invitations, creative portfolios, lifestyle brands","https://fonts.google.com/share?selection.family=Caveat:wght@400;500;600;700|Quicksand:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Caveat:wght@400;500;600;700&family=Quicksand:wght@300;400;500;600;700&display=swap');","fontFamily: { script: ['Caveat', 'cursive'], sans: ['Quicksand', 'sans-serif'] }","Use Caveat sparingly for accents. Quicksand for body."
|
||||||
|
16,Corporate Trust,"Sans + Sans",Lexend,Source Sans 3,"corporate, trustworthy, accessible, readable, professional, clean","Enterprise, government, healthcare, finance, accessibility-focused","https://fonts.google.com/share?selection.family=Lexend:wght@300;400;500;600;700|Source+Sans+3:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Lexend:wght@300;400;500;600;700&family=Source+Sans+3:wght@300;400;500;600;700&display=swap');","fontFamily: { heading: ['Lexend', 'sans-serif'], body: ['Source Sans 3', 'sans-serif'] }","Lexend designed for readability. Excellent accessibility."
|
||||||
|
17,Brutalist Raw,"Mono + Mono",Space Mono,Space Mono,"brutalist, raw, technical, monospace, minimal, stark","Brutalist designs, developer portfolios, experimental, tech art","https://fonts.google.com/share?selection.family=Space+Mono:wght@400;700","@import url('https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&display=swap');","fontFamily: { mono: ['Space Mono', 'monospace'] }","All-mono for raw brutalist aesthetic. Limited weights."
|
||||||
|
18,Fashion Forward,"Sans + Sans",Syne,Manrope,"fashion, avant-garde, creative, bold, artistic, edgy","Fashion brands, creative agencies, art galleries, design studios","https://fonts.google.com/share?selection.family=Manrope:wght@300;400;500;600;700|Syne:wght@400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@300;400;500;600;700&family=Syne:wght@400;500;600;700&display=swap');","fontFamily: { heading: ['Syne', 'sans-serif'], body: ['Manrope', 'sans-serif'] }","Syne's unique character for headlines. Manrope for readability."
|
||||||
|
19,Soft Rounded,"Sans + Sans",Varela Round,Nunito Sans,"soft, rounded, friendly, approachable, warm, gentle","Children's products, pet apps, friendly brands, wellness, soft UI","https://fonts.google.com/share?selection.family=Nunito+Sans:wght@300;400;500;600;700|Varela+Round","@import url('https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@300;400;500;600;700&family=Varela+Round&display=swap');","fontFamily: { heading: ['Varela Round', 'sans-serif'], body: ['Nunito Sans', 'sans-serif'] }","Both rounded and friendly. Perfect for soft UI designs."
|
||||||
|
20,Premium Sans,"Sans + Sans",Satoshi,General Sans,"premium, modern, clean, sophisticated, versatile, balanced","Premium brands, modern agencies, SaaS, portfolios, startups","https://fonts.google.com/share?selection.family=DM+Sans:wght@400;500;700","@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap');","fontFamily: { sans: ['DM Sans', 'sans-serif'] }","Note: Satoshi/General Sans on Fontshare. DM Sans as Google alternative."
|
||||||
|
21,Vietnamese Friendly,"Sans + Sans",Be Vietnam Pro,Noto Sans,"vietnamese, international, readable, clean, multilingual, accessible","Vietnamese sites, multilingual apps, international products","https://fonts.google.com/share?selection.family=Be+Vietnam+Pro:wght@300;400;500;600;700|Noto+Sans:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:wght@300;400;500;600;700&family=Noto+Sans:wght@300;400;500;600;700&display=swap');","fontFamily: { sans: ['Be Vietnam Pro', 'Noto Sans', 'sans-serif'] }","Be Vietnam Pro excellent Vietnamese support. Noto as fallback."
|
||||||
|
22,Japanese Elegant,"Serif + Sans",Noto Serif JP,Noto Sans JP,"japanese, elegant, traditional, modern, multilingual, readable","Japanese sites, Japanese restaurants, cultural sites, anime/manga","https://fonts.google.com/share?selection.family=Noto+Sans+JP:wght@300;400;500;700|Noto+Serif+JP:wght@400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@300;400;500;700&family=Noto+Serif+JP:wght@400;500;600;700&display=swap');","fontFamily: { serif: ['Noto Serif JP', 'serif'], sans: ['Noto Sans JP', 'sans-serif'] }","Noto fonts excellent Japanese support. Traditional + modern feel."
|
||||||
|
23,Korean Modern,"Sans + Sans",Noto Sans KR,Noto Sans KR,"korean, modern, clean, professional, multilingual, readable","Korean sites, K-beauty, K-pop, Korean businesses, multilingual","https://fonts.google.com/share?selection.family=Noto+Sans+KR:wght@300;400;500;700","@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700&display=swap');","fontFamily: { sans: ['Noto Sans KR', 'sans-serif'] }","Clean Korean typography. Single font with weight variations."
|
||||||
|
24,Chinese Traditional,"Serif + Sans",Noto Serif TC,Noto Sans TC,"chinese, traditional, elegant, cultural, multilingual, readable","Traditional Chinese sites, cultural content, Taiwan/Hong Kong markets","https://fonts.google.com/share?selection.family=Noto+Sans+TC:wght@300;400;500;700|Noto+Serif+TC:wght@400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@300;400;500;700&family=Noto+Serif+TC:wght@400;500;600;700&display=swap');","fontFamily: { serif: ['Noto Serif TC', 'serif'], sans: ['Noto Sans TC', 'sans-serif'] }","Traditional Chinese character support. Elegant pairing."
|
||||||
|
25,Chinese Simplified,"Sans + Sans",Noto Sans SC,Noto Sans SC,"chinese, simplified, modern, professional, multilingual, readable","Simplified Chinese sites, mainland China market, business apps","https://fonts.google.com/share?selection.family=Noto+Sans+SC:wght@300;400;500;700","@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;700&display=swap');","fontFamily: { sans: ['Noto Sans SC', 'sans-serif'] }","Simplified Chinese support. Clean modern look."
|
||||||
|
26,Arabic Elegant,"Serif + Sans",Noto Naskh Arabic,Noto Sans Arabic,"arabic, elegant, traditional, cultural, RTL, readable","Arabic sites, Middle East market, Islamic content, bilingual sites","https://fonts.google.com/share?selection.family=Noto+Naskh+Arabic:wght@400;500;600;700|Noto+Sans+Arabic:wght@300;400;500;700","@import url('https://fonts.googleapis.com/css2?family=Noto+Naskh+Arabic:wght@400;500;600;700&family=Noto+Sans+Arabic:wght@300;400;500;700&display=swap');","fontFamily: { serif: ['Noto Naskh Arabic', 'serif'], sans: ['Noto Sans Arabic', 'sans-serif'] }","RTL support. Naskh for traditional, Sans for modern Arabic."
|
||||||
|
27,Thai Modern,"Sans + Sans",Noto Sans Thai,Noto Sans Thai,"thai, modern, readable, clean, multilingual, accessible","Thai sites, Southeast Asia, tourism, Thai restaurants","https://fonts.google.com/share?selection.family=Noto+Sans+Thai:wght@300;400;500;700","@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+Thai:wght@300;400;500;700&display=swap');","fontFamily: { sans: ['Noto Sans Thai', 'sans-serif'] }","Clean Thai typography. Excellent readability."
|
||||||
|
28,Hebrew Modern,"Sans + Sans",Noto Sans Hebrew,Noto Sans Hebrew,"hebrew, modern, RTL, clean, professional, readable","Hebrew sites, Israeli market, Jewish content, bilingual sites","https://fonts.google.com/share?selection.family=Noto+Sans+Hebrew:wght@300;400;500;700","@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+Hebrew:wght@300;400;500;700&display=swap');","fontFamily: { sans: ['Noto Sans Hebrew', 'sans-serif'] }","RTL support. Clean modern Hebrew typography."
|
||||||
|
29,Legal Professional,"Serif + Sans",EB Garamond,Lato,"legal, professional, traditional, trustworthy, formal, authoritative","Law firms, legal services, contracts, formal documents, government","https://fonts.google.com/share?selection.family=EB+Garamond:wght@400;500;600;700|Lato:wght@300;400;700","@import url('https://fonts.googleapis.com/css2?family=EB+Garamond:wght@400;500;600;700&family=Lato:wght@300;400;700&display=swap');","fontFamily: { serif: ['EB Garamond', 'serif'], sans: ['Lato', 'sans-serif'] }","EB Garamond for authority. Lato for clean body text."
|
||||||
|
30,Medical Clean,"Sans + Sans",Figtree,Noto Sans,"medical, clean, accessible, professional, healthcare, trustworthy","Healthcare, medical clinics, pharma, health apps, accessibility","https://fonts.google.com/share?selection.family=Figtree:wght@300;400;500;600;700|Noto+Sans:wght@300;400;500;700","@import url('https://fonts.googleapis.com/css2?family=Figtree:wght@300;400;500;600;700&family=Noto+Sans:wght@300;400;500;700&display=swap');","fontFamily: { heading: ['Figtree', 'sans-serif'], body: ['Noto Sans', 'sans-serif'] }","Clean, accessible fonts for medical contexts."
|
||||||
|
31,Financial Trust,"Sans + Sans",IBM Plex Sans,IBM Plex Sans,"financial, trustworthy, professional, corporate, banking, serious","Banks, finance, insurance, investment, fintech, enterprise","https://fonts.google.com/share?selection.family=IBM+Plex+Sans:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600;700&display=swap');","fontFamily: { sans: ['IBM Plex Sans', 'sans-serif'] }","IBM Plex conveys trust and professionalism. Excellent for data."
|
||||||
|
32,Real Estate Luxury,"Serif + Sans",Cinzel,Josefin Sans,"real estate, luxury, elegant, sophisticated, property, premium","Real estate, luxury properties, architecture, interior design","https://fonts.google.com/share?selection.family=Cinzel:wght@400;500;600;700|Josefin+Sans:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@400;500;600;700&family=Josefin+Sans:wght@300;400;500;600;700&display=swap');","fontFamily: { serif: ['Cinzel', 'serif'], sans: ['Josefin Sans', 'sans-serif'] }","Cinzel's elegance for headlines. Josefin for modern body."
|
||||||
|
33,Restaurant Menu,"Serif + Sans",Playfair Display SC,Karla,"restaurant, menu, culinary, elegant, foodie, hospitality","Restaurants, cafes, food blogs, culinary, hospitality","https://fonts.google.com/share?selection.family=Karla:wght@300;400;500;600;700|Playfair+Display+SC:wght@400;700","@import url('https://fonts.googleapis.com/css2?family=Karla:wght@300;400;500;600;700&family=Playfair+Display+SC:wght@400;700&display=swap');","fontFamily: { display: ['Playfair Display SC', 'serif'], sans: ['Karla', 'sans-serif'] }","Small caps Playfair for menu headers. Karla for descriptions."
|
||||||
|
34,Art Deco,"Display + Sans",Poiret One,Didact Gothic,"art deco, vintage, 1920s, elegant, decorative, gatsby","Vintage events, art deco themes, luxury hotels, classic cocktails","https://fonts.google.com/share?selection.family=Didact+Gothic|Poiret+One","@import url('https://fonts.googleapis.com/css2?family=Didact+Gothic&family=Poiret+One&display=swap');","fontFamily: { display: ['Poiret One', 'sans-serif'], sans: ['Didact Gothic', 'sans-serif'] }","Poiret One for art deco headlines only. Didact for body."
|
||||||
|
35,Magazine Style,"Serif + Sans",Libre Bodoni,Public Sans,"magazine, editorial, publishing, refined, journalism, print","Magazines, online publications, editorial content, journalism","https://fonts.google.com/share?selection.family=Libre+Bodoni:wght@400;500;600;700|Public+Sans:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Libre+Bodoni:wght@400;500;600;700&family=Public+Sans:wght@300;400;500;600;700&display=swap');","fontFamily: { serif: ['Libre Bodoni', 'serif'], sans: ['Public Sans', 'sans-serif'] }","Bodoni's editorial elegance. Public Sans for clean UI."
|
||||||
|
36,Crypto/Web3,"Sans + Sans",Orbitron,Exo 2,"crypto, web3, futuristic, tech, blockchain, digital","Crypto platforms, NFT, blockchain, web3, futuristic tech","https://fonts.google.com/share?selection.family=Exo+2:wght@300;400;500;600;700|Orbitron:wght@400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Exo+2:wght@300;400;500;600;700&family=Orbitron:wght@400;500;600;700&display=swap');","fontFamily: { display: ['Orbitron', 'sans-serif'], body: ['Exo 2', 'sans-serif'] }","Orbitron for futuristic headers. Exo 2 for readable body."
|
||||||
|
37,Gaming Bold,"Display + Sans",Russo One,Chakra Petch,"gaming, bold, action, esports, competitive, energetic","Gaming, esports, action games, competitive sports, entertainment","https://fonts.google.com/share?selection.family=Chakra+Petch:wght@300;400;500;600;700|Russo+One","@import url('https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@300;400;500;600;700&family=Russo+One&display=swap');","fontFamily: { display: ['Russo One', 'sans-serif'], body: ['Chakra Petch', 'sans-serif'] }","Russo One for impact. Chakra Petch for techy body text."
|
||||||
|
38,Indie/Craft,"Display + Sans",Amatic SC,Cabin,"indie, craft, handmade, artisan, organic, creative","Craft brands, indie products, artisan, handmade, organic products","https://fonts.google.com/share?selection.family=Amatic+SC:wght@400;700|Cabin:wght@400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Amatic+SC:wght@400;700&family=Cabin:wght@400;500;600;700&display=swap');","fontFamily: { display: ['Amatic SC', 'sans-serif'], sans: ['Cabin', 'sans-serif'] }","Amatic for handwritten feel. Cabin for readable body."
|
||||||
|
39,Startup Bold,"Sans + Sans",Clash Display,Satoshi,"startup, bold, modern, innovative, confident, dynamic","Startups, pitch decks, product launches, bold brands","https://fonts.google.com/share?selection.family=Outfit:wght@400;500;600;700|Rubik:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700&family=Rubik:wght@300;400;500;600;700&display=swap');","fontFamily: { heading: ['Outfit', 'sans-serif'], body: ['Rubik', 'sans-serif'] }","Note: Clash Display on Fontshare. Outfit as Google alternative."
|
||||||
|
40,E-commerce Clean,"Sans + Sans",Rubik,Nunito Sans,"ecommerce, clean, shopping, product, retail, conversion","E-commerce, online stores, product pages, retail, shopping","https://fonts.google.com/share?selection.family=Nunito+Sans:wght@300;400;500;600;700|Rubik:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@300;400;500;600;700&family=Rubik:wght@300;400;500;600;700&display=swap');","fontFamily: { heading: ['Rubik', 'sans-serif'], body: ['Nunito Sans', 'sans-serif'] }","Clean readable fonts perfect for product descriptions."
|
||||||
|
41,Academic/Research,"Serif + Sans",Crimson Pro,Atkinson Hyperlegible,"academic, research, scholarly, accessible, readable, educational","Universities, research papers, academic journals, educational","https://fonts.google.com/share?selection.family=Atkinson+Hyperlegible:wght@400;700|Crimson+Pro:wght@400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible:wght@400;700&family=Crimson+Pro:wght@400;500;600;700&display=swap');","fontFamily: { serif: ['Crimson Pro', 'serif'], sans: ['Atkinson Hyperlegible', 'sans-serif'] }","Crimson for scholarly headlines. Atkinson for accessibility."
|
||||||
|
42,Dashboard Data,"Mono + Sans",Fira Code,Fira Sans,"dashboard, data, analytics, code, technical, precise","Dashboards, analytics, data visualization, admin panels","https://fonts.google.com/share?selection.family=Fira+Code:wght@400;500;600;700|Fira+Sans:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500;600;700&family=Fira+Sans:wght@300;400;500;600;700&display=swap');","fontFamily: { mono: ['Fira Code', 'monospace'], sans: ['Fira Sans', 'sans-serif'] }","Fira family cohesion. Code for data, Sans for labels."
|
||||||
|
43,Music/Entertainment,"Display + Sans",Righteous,Poppins,"music, entertainment, fun, energetic, bold, performance","Music platforms, entertainment, events, festivals, performers","https://fonts.google.com/share?selection.family=Poppins:wght@300;400;500;600;700|Righteous","@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&family=Righteous&display=swap');","fontFamily: { display: ['Righteous', 'sans-serif'], sans: ['Poppins', 'sans-serif'] }","Righteous for bold entertainment headers. Poppins for body."
|
||||||
|
44,Minimalist Portfolio,"Sans + Sans",Archivo,Space Grotesk,"minimal, portfolio, designer, creative, clean, artistic","Design portfolios, creative professionals, minimalist brands","https://fonts.google.com/share?selection.family=Archivo:wght@300;400;500;600;700|Space+Grotesk:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Archivo:wght@300;400;500;600;700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap');","fontFamily: { heading: ['Space Grotesk', 'sans-serif'], body: ['Archivo', 'sans-serif'] }","Space Grotesk for distinctive headers. Archivo for clean body."
|
||||||
|
45,Kids/Education,"Display + Sans",Baloo 2,Comic Neue,"kids, education, playful, friendly, colorful, learning","Children's apps, educational games, kid-friendly content","https://fonts.google.com/share?selection.family=Baloo+2:wght@400;500;600;700|Comic+Neue:wght@300;400;700","@import url('https://fonts.googleapis.com/css2?family=Baloo+2:wght@400;500;600;700&family=Comic+Neue:wght@300;400;700&display=swap');","fontFamily: { display: ['Baloo 2', 'sans-serif'], sans: ['Comic Neue', 'sans-serif'] }","Fun, playful fonts for children. Comic Neue is readable comic style."
|
||||||
|
46,Wedding/Romance,"Script + Serif",Great Vibes,Cormorant Infant,"wedding, romance, elegant, script, invitation, feminine","Wedding sites, invitations, romantic brands, bridal","https://fonts.google.com/share?selection.family=Cormorant+Infant:wght@300;400;500;600;700|Great+Vibes","@import url('https://fonts.googleapis.com/css2?family=Cormorant+Infant:wght@300;400;500;600;700&family=Great+Vibes&display=swap');","fontFamily: { script: ['Great Vibes', 'cursive'], serif: ['Cormorant Infant', 'serif'] }","Great Vibes for elegant accents. Cormorant for readable text."
|
||||||
|
47,Science/Tech,"Sans + Sans",Exo,Roboto Mono,"science, technology, research, data, futuristic, precise","Science, research, tech documentation, data-heavy sites","https://fonts.google.com/share?selection.family=Exo:wght@300;400;500;600;700|Roboto+Mono:wght@300;400;500;700","@import url('https://fonts.googleapis.com/css2?family=Exo:wght@300;400;500;600;700&family=Roboto+Mono:wght@300;400;500;700&display=swap');","fontFamily: { sans: ['Exo', 'sans-serif'], mono: ['Roboto Mono', 'monospace'] }","Exo for modern tech feel. Roboto Mono for code/data."
|
||||||
|
48,Accessibility First,"Sans + Sans",Atkinson Hyperlegible,Atkinson Hyperlegible,"accessible, readable, inclusive, WCAG, dyslexia-friendly, clear","Accessibility-critical sites, government, healthcare, inclusive design","https://fonts.google.com/share?selection.family=Atkinson+Hyperlegible:wght@400;700","@import url('https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible:wght@400;700&display=swap');","fontFamily: { sans: ['Atkinson Hyperlegible', 'sans-serif'] }","Designed for maximum legibility. Excellent for accessibility."
|
||||||
|
49,Sports/Fitness,"Sans + Sans",Barlow Condensed,Barlow,"sports, fitness, athletic, energetic, condensed, action","Sports, fitness, gyms, athletic brands, competition","https://fonts.google.com/share?selection.family=Barlow+Condensed:wght@400;500;600;700|Barlow:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@400;500;600;700&family=Barlow:wght@300;400;500;600;700&display=swap');","fontFamily: { display: ['Barlow Condensed', 'sans-serif'], body: ['Barlow', 'sans-serif'] }","Condensed for impact headlines. Regular Barlow for body."
|
||||||
|
50,Luxury Minimalist,"Serif + Sans",Bodoni Moda,Jost,"luxury, minimalist, high-end, sophisticated, refined, premium","Luxury minimalist brands, high-end fashion, premium products","https://fonts.google.com/share?selection.family=Bodoni+Moda:wght@400;500;600;700|Jost:wght@300;400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Bodoni+Moda:wght@400;500;600;700&family=Jost:wght@300;400;500;600;700&display=swap');","fontFamily: { serif: ['Bodoni Moda', 'serif'], sans: ['Jost', 'sans-serif'] }","Bodoni's high contrast elegance. Jost for geometric body."
|
||||||
|
51,Tech/HUD Mono,"Mono + Mono",Share Tech Mono,Fira Code,"tech, futuristic, hud, sci-fi, data, monospaced, precise","Sci-fi interfaces, developer tools, cybersecurity, dashboards","https://fonts.google.com/share?selection.family=Fira+Code:wght@300;400;500;600;700|Share+Tech+Mono","@import url('https://fonts.googleapis.com/css2?family=Fira+Code:wght@300;400;500;600;700&family=Share+Tech+Mono&display=swap');","fontFamily: { hud: ['Share Tech Mono', 'monospace'], code: ['Fira Code', 'monospace'] }","Share Tech Mono has that classic sci-fi look."
|
||||||
|
52,Pixel Retro,"Display + Sans",Press Start 2P,VT323,"pixel, retro, gaming, 8-bit, nostalgic, arcade","Pixel art games, retro websites, creative portfolios","https://fonts.google.com/share?selection.family=Press+Start+2P|VT323","@import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&family=VT323&display=swap');","fontFamily: { pixel: ['Press Start 2P', 'cursive'], terminal: ['VT323', 'monospace'] }","Press Start 2P is very wide/large. VT323 is better for body text."
|
||||||
|
53,Neubrutalist Bold,"Display + Sans",Lexend Mega,Public Sans,"bold, neubrutalist, loud, strong, geometric, quirky","Neubrutalist designs, Gen Z brands, bold marketing","https://fonts.google.com/share?selection.family=Lexend+Mega:wght@100..900|Public+Sans:wght@100..900","@import url('https://fonts.googleapis.com/css2?family=Lexend+Mega:wght@100..900&family=Public+Sans:wght@100..900&display=swap');","fontFamily: { mega: ['Lexend Mega', 'sans-serif'], body: ['Public Sans', 'sans-serif'] }","Lexend Mega has distinct character and variable weight."
|
||||||
|
54,Academic/Archival,"Serif + Serif",EB Garamond,Crimson Text,"academic, old-school, university, research, serious, traditional","University sites, archives, research papers, history","https://fonts.google.com/share?selection.family=Crimson+Text:wght@400;600;700|EB+Garamond:wght@400;500;600;700;800","@import url('https://fonts.googleapis.com/css2?family=Crimson+Text:wght@400;600;700&family=EB+Garamond:wght@400;500;600;700;800&display=swap');","fontFamily: { classic: ['EB Garamond', 'serif'], text: ['Crimson Text', 'serif'] }","Classic academic aesthetic. Very legible."
|
||||||
|
55,Spatial Clear,"Sans + Sans",Inter,Inter,"spatial, legible, glass, system, clean, neutral","Spatial computing, AR/VR, glassmorphism interfaces","https://fonts.google.com/share?selection.family=Inter:wght@300;400;500;600","@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&display=swap');","fontFamily: { sans: ['Inter', 'sans-serif'] }","Optimized for readability on dynamic backgrounds."
|
||||||
|
56,Kinetic Motion,"Display + Mono",Syncopate,Space Mono,"kinetic, motion, futuristic, speed, wide, tech","Music festivals, automotive, high-energy brands","https://fonts.google.com/share?selection.family=Space+Mono:wght@400;700|Syncopate:wght@400;700","@import url('https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&family=Syncopate:wght@400;700&display=swap');","fontFamily: { display: ['Syncopate', 'sans-serif'], mono: ['Space Mono', 'monospace'] }","Syncopate's wide stance works well with motion effects."
|
||||||
|
57,Gen Z Brutal,"Display + Sans",Anton,Epilogue,"brutal, loud, shouty, meme, internet, bold","Gen Z marketing, streetwear, viral campaigns","https://fonts.google.com/share?selection.family=Anton|Epilogue:wght@400;500;600;700","@import url('https://fonts.googleapis.com/css2?family=Anton&family=Epilogue:wght@400;500;600;700&display=swap');","fontFamily: { display: ['Anton', 'sans-serif'], body: ['Epilogue', 'sans-serif'] }","Anton is impactful and condensed. Good for stickers/badges."
|
||||||
|
101
.codex/skills/ui-ux-pro-max/data/ui-reasoning.csv
Normal file
101
.codex/skills/ui-ux-pro-max/data/ui-reasoning.csv
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
No,UI_Category,Recommended_Pattern,Style_Priority,Color_Mood,Typography_Mood,Key_Effects,Decision_Rules,Anti_Patterns,Severity
|
||||||
|
1,SaaS (General),Hero + Features + CTA,Glassmorphism + Flat Design,Trust blue + Accent contrast,Professional + Hierarchy,Subtle hover (200-250ms) + Smooth transitions,"{""if_ux_focused"": ""prioritize-minimalism"", ""if_data_heavy"": ""add-glassmorphism""}",Excessive animation + Dark mode by default,HIGH
|
||||||
|
2,Micro SaaS,Minimal & Direct + Demo,Flat Design + Vibrant & Block,Vibrant primary + White space,Bold + Clean typography,Large CTA hover (300ms) + Scroll reveal,"{""if_quick_onboarding"": ""reduce-steps"", ""if_demo_available"": ""feature-interactive-demo""}",Complex onboarding flow + Cluttered layout,HIGH
|
||||||
|
3,E-commerce,Feature-Rich Showcase,Vibrant & Block-based,Brand primary + Success green,Engaging + Clear hierarchy,Card hover lift (200ms) + Scale effect,"{""if_luxury"": ""switch-to-liquid-glass"", ""if_conversion_focused"": ""add-urgency-colors""}",Flat design without depth + Text-heavy pages,HIGH
|
||||||
|
4,E-commerce Luxury,Feature-Rich Showcase,Liquid Glass + Glassmorphism,Premium colors + Minimal accent,Elegant + Refined typography,Chromatic aberration + Fluid animations (400-600ms),"{""if_checkout"": ""emphasize-trust"", ""if_hero_needed"": ""use-3d-hyperrealism""}",Vibrant & Block-based + Playful colors,HIGH
|
||||||
|
5,Healthcare App,Social Proof-Focused,Neumorphism + Accessible & Ethical,Calm blue + Health green,Readable + Large type (16px+),Soft box-shadow + Smooth press (150ms),"{""must_have"": ""wcag-aaa-compliance"", ""if_medication"": ""red-alert-colors""}",Bright neon colors + Motion-heavy animations + AI purple/pink gradients,HIGH
|
||||||
|
6,Fintech/Crypto,Conversion-Optimized,Glassmorphism + Dark Mode (OLED),Dark tech colors + Vibrant accents,Modern + Confident typography,Real-time chart animations + Alert pulse/glow,"{""must_have"": ""security-badges"", ""if_real_time"": ""add-streaming-data""}",Light backgrounds + No security indicators,HIGH
|
||||||
|
7,Education,Feature-Rich Showcase,Claymorphism + Micro-interactions,Playful colors + Clear hierarchy,Friendly + Engaging typography,Soft press (200ms) + Fluffy elements,"{""if_gamification"": ""add-progress-animation"", ""if_children"": ""increase-playfulness""}",Dark modes + Complex jargon,MEDIUM
|
||||||
|
8,Portfolio/Personal,Storytelling-Driven,Motion-Driven + Minimalism,Brand primary + Artistic,Expressive + Variable typography,Parallax (3-5 layers) + Scroll-triggered reveals,"{""if_creative_field"": ""add-brutalism"", ""if_minimal_portfolio"": ""reduce-motion""}",Corporate templates + Generic layouts,MEDIUM
|
||||||
|
9,Government/Public,Minimal & Direct,Accessible & Ethical + Minimalism,Professional blue + High contrast,Clear + Large typography,Clear focus rings (3-4px) + Skip links,"{""must_have"": ""wcag-aaa"", ""must_have"": ""keyboard-navigation""}",Ornate design + Low contrast + Motion effects + AI purple/pink gradients,HIGH
|
||||||
|
10,Fintech (Banking),Trust & Authority,Minimalism + Accessible & Ethical,Navy + Trust Blue + Gold,Professional + Trustworthy,Smooth state transitions + Number animations,"{""must_have"": ""security-first"", ""if_dashboard"": ""use-dark-mode""}",Playful design + Unclear fees + AI purple/pink gradients,HIGH
|
||||||
|
11,Social Media App,Feature-Rich Showcase,Vibrant & Block-based + Motion-Driven,Vibrant + Engagement colors,Modern + Bold typography,Large scroll animations + Icon animations,"{""if_engagement_metric"": ""add-motion"", ""if_content_focused"": ""minimize-chrome""}",Heavy skeuomorphism + Accessibility ignored,MEDIUM
|
||||||
|
12,Startup Landing,Hero-Centric + Trust,Motion-Driven + Vibrant & Block,Bold primaries + Accent contrast,Modern + Energetic typography,Scroll-triggered animations + Parallax,"{""if_pre_launch"": ""use-waitlist-pattern"", ""if_video_ready"": ""add-hero-video""}",Static design + No video + Poor mobile,HIGH
|
||||||
|
13,Gaming,Feature-Rich Showcase,3D & Hyperrealism + Retro-Futurism,Vibrant + Neon + Immersive,Bold + Impactful typography,WebGL 3D rendering + Glitch effects,"{""if_competitive"": ""add-real-time-stats"", ""if_casual"": ""increase-playfulness""}",Minimalist design + Static assets,HIGH
|
||||||
|
14,Creative Agency,Storytelling-Driven,Brutalism + Motion-Driven,Bold primaries + Artistic freedom,Bold + Expressive typography,CRT scanlines + Neon glow + Glitch effects,"{""must_have"": ""case-studies"", ""if_boutique"": ""increase-artistic-freedom""}",Corporate minimalism + Hidden portfolio,HIGH
|
||||||
|
15,Wellness/Mental Health,Social Proof-Focused,Neumorphism + Accessible & Ethical,Calm Pastels + Trust colors,Calming + Readable typography,Soft press + Breathing animations,"{""must_have"": ""privacy-first"", ""if_meditation"": ""add-breathing-animation""}",Bright neon + Motion overload,HIGH
|
||||||
|
16,Restaurant/Food,Hero-Centric + Conversion,Vibrant & Block-based + Motion-Driven,Warm colors (Orange Red Brown),Appetizing + Clear typography,Food image reveal + Menu hover effects,"{""must_have"": ""high_quality_images"", ""if_delivery"": ""emphasize-speed""}",Low-quality imagery + Outdated hours,HIGH
|
||||||
|
17,Real Estate,Hero-Centric + Feature-Rich,Glassmorphism + Minimalism,Trust Blue + Gold + White,Professional + Confident,3D property tour zoom + Map hover,"{""if_luxury"": ""add-3d-models"", ""must_have"": ""map-integration""}",Poor photos + No virtual tours,HIGH
|
||||||
|
18,Travel/Tourism,Storytelling-Driven + Hero,Aurora UI + Motion-Driven,Vibrant destination + Sky Blue,Inspirational + Engaging,Destination parallax + Itinerary animations,"{""if_experience_focused"": ""use-storytelling"", ""must_have"": ""mobile-booking""}",Generic photos + Complex booking,HIGH
|
||||||
|
19,SaaS Dashboard,Data-Dense Dashboard,Data-Dense + Heat Map,Cool to Hot gradients + Neutral grey,Clear + Readable typography,Hover tooltips + Chart zoom + Real-time pulse,"{""must_have"": ""real-time-updates"", ""if_large_dataset"": ""prioritize-performance""}",Ornate design + Slow rendering,HIGH
|
||||||
|
20,B2B SaaS Enterprise,Feature-Rich Showcase,Trust & Authority + Minimal,Professional blue + Neutral grey,Formal + Clear typography,Subtle section transitions + Feature reveals,"{""must_have"": ""case-studies"", ""must_have"": ""roi-messaging""}",Playful design + Hidden features + AI purple/pink gradients,HIGH
|
||||||
|
21,Music/Entertainment,Feature-Rich Showcase,Dark Mode (OLED) + Vibrant & Block-based,Dark (#121212) + Vibrant accents + Album art colors,Modern + Bold typography,Waveform visualization + Playlist animations,"{""must_have"": ""audio-player-ux"", ""if_discovery_focused"": ""add-playlist-recommendations""}",Cluttered layout + Poor audio player UX,HIGH
|
||||||
|
22,Video Streaming/OTT,Hero-Centric + Feature-Rich,Dark Mode (OLED) + Motion-Driven,Dark bg + Poster colors + Brand accent,Bold + Engaging typography,Video player animations + Content carousel (parallax),"{""must_have"": ""continue-watching"", ""if_personalized"": ""add-recommendations""}",Static layout + Slow video player,HIGH
|
||||||
|
23,Job Board/Recruitment,Conversion-Optimized + Feature-Rich,Flat Design + Minimalism,Professional Blue + Success Green + Neutral,Clear + Professional typography,Search/filter animations + Application flow,"{""must_have"": ""advanced-search"", ""if_salary_focused"": ""highlight-compensation""}",Outdated forms + Hidden filters,HIGH
|
||||||
|
24,Marketplace (P2P),Feature-Rich Showcase + Social Proof,Vibrant & Block-based + Flat Design,Trust colors + Category colors + Success green,Modern + Engaging typography,Review star animations + Listing hover effects,"{""must_have"": ""seller-profiles"", ""must_have"": ""secure-payment""}",Low trust signals + Confusing layout,HIGH
|
||||||
|
25,Logistics/Delivery,Feature-Rich Showcase + Real-Time,Minimalism + Flat Design,Blue (#2563EB) + Orange (tracking) + Green,Clear + Functional typography,Real-time tracking animation + Status pulse,"{""must_have"": ""tracking-map"", ""must_have"": ""delivery-updates""}",Static tracking + No map integration + AI purple/pink gradients,HIGH
|
||||||
|
26,Agriculture/Farm Tech,Feature-Rich Showcase,Organic Biophilic + Flat Design,Earth Green (#4A7C23) + Brown + Sky Blue,Clear + Informative typography,Data visualization + Weather animations,"{""must_have"": ""sensor-dashboard"", ""if_crop_focused"": ""add-health-indicators""}",Generic design + Ignored accessibility + AI purple/pink gradients,MEDIUM
|
||||||
|
27,Construction/Architecture,Hero-Centric + Feature-Rich,Minimalism + 3D & Hyperrealism,Grey (#4A4A4A) + Orange (safety) + Blueprint Blue,Professional + Bold typography,3D model viewer + Timeline animations,"{""must_have"": ""project-portfolio"", ""if_team_collaboration"": ""add-real-time-updates""}",2D-only layouts + Poor image quality + AI purple/pink gradients,HIGH
|
||||||
|
28,Automotive/Car Dealership,Hero-Centric + Feature-Rich,Motion-Driven + 3D & Hyperrealism,Brand colors + Metallic + Dark/Light,Bold + Confident typography,360 product view + Configurator animations,"{""must_have"": ""vehicle-comparison"", ""must_have"": ""financing-calculator""}",Static product pages + Poor UX,HIGH
|
||||||
|
29,Photography Studio,Storytelling-Driven + Hero-Centric,Motion-Driven + Minimalism,Black + White + Minimal accent,Elegant + Minimal typography,Full-bleed gallery + Before/after reveal,"{""must_have"": ""portfolio-showcase"", ""if_booking"": ""add-calendar-system""}",Heavy text + Poor image showcase,HIGH
|
||||||
|
30,Coworking Space,Hero-Centric + Feature-Rich,Vibrant & Block-based + Glassmorphism,Energetic colors + Wood tones + Brand,Modern + Engaging typography,Space tour video + Amenity reveal animations,"{""must_have"": ""virtual-tour"", ""must_have"": ""booking-system""}",Outdated photos + Confusing layout,MEDIUM
|
||||||
|
31,Cleaning Service,Conversion-Optimized + Trust,Soft UI Evolution + Flat Design,Fresh Blue (#00B4D8) + Clean White + Green,Friendly + Clear typography,Before/after gallery + Service package reveal,"{""must_have"": ""price-transparency"", ""must_have"": ""trust-badges""}",Poor before/after imagery + Hidden pricing,HIGH
|
||||||
|
32,Home Services,Conversion-Optimized + Trust,Flat Design + Trust & Authority,Trust Blue + Safety Orange + Grey,Professional + Clear typography,Emergency contact highlight + Service menu animations,"{""must_have"": ""emergency-contact"", ""must_have"": ""certifications-display""}",Hidden contact info + No certifications,HIGH
|
||||||
|
33,Childcare/Daycare,Social Proof-Focused + Trust,Claymorphism + Vibrant & Block-based,Playful pastels + Safe colors + Warm,Friendly + Playful typography,Parent portal animations + Activity gallery reveal,"{""must_have"": ""parent-communication"", ""must_have"": ""safety-certifications""}",Generic design + Hidden safety info,HIGH
|
||||||
|
34,Senior Care/Elderly,Trust & Authority + Accessible,Accessible & Ethical + Soft UI Evolution,Calm Blue + Warm neutrals + Large text,Large + Clear typography (18px+),Large touch targets + Clear navigation,"{""must_have"": ""wcag-aaa"", ""must_have"": ""family-portal""}",Small text + Complex navigation + AI purple/pink gradients,HIGH
|
||||||
|
35,Medical Clinic,Trust & Authority + Conversion,Accessible & Ethical + Minimalism,Medical Blue (#0077B6) + Trust White,Professional + Readable typography,Online booking flow + Doctor profile reveals,"{""must_have"": ""appointment-booking"", ""must_have"": ""insurance-info""}",Outdated interface + Confusing booking + AI purple/pink gradients,HIGH
|
||||||
|
36,Pharmacy/Drug Store,Conversion-Optimized + Trust,Flat Design + Accessible & Ethical,Pharmacy Green + Trust Blue + Clean White,Clear + Functional typography,Prescription upload flow + Refill reminders,"{""must_have"": ""prescription-management"", ""must_have"": ""drug-interaction-warnings""}",Confusing layout + Privacy concerns + AI purple/pink gradients,HIGH
|
||||||
|
37,Dental Practice,Social Proof-Focused + Conversion,Soft UI Evolution + Minimalism,Fresh Blue + White + Smile Yellow,Friendly + Professional typography,Before/after gallery + Patient testimonial carousel,"{""must_have"": ""before-after-gallery"", ""must_have"": ""appointment-system""}",Poor imagery + No testimonials,HIGH
|
||||||
|
38,Veterinary Clinic,Social Proof-Focused + Trust,Claymorphism + Accessible & Ethical,Caring Blue + Pet colors + Warm,Friendly + Welcoming typography,Pet profile management + Service animations,"{""must_have"": ""pet-portal"", ""must_have"": ""emergency-contact""}",Generic design + Hidden services,MEDIUM
|
||||||
|
39,News/Media Platform,Hero-Centric + Feature-Rich,Minimalism + Flat Design,Brand colors + High contrast,Clear + Readable typography,Breaking news badge + Article reveal animations,"{""must_have"": ""mobile-first-reading"", ""must_have"": ""category-navigation""}",Cluttered layout + Slow loading,HIGH
|
||||||
|
40,Legal Services,Trust & Authority + Minimal,Trust & Authority + Minimalism,Navy Blue (#1E3A5F) + Gold + White,Professional + Authoritative typography,Practice area reveal + Attorney profile animations,"{""must_have"": ""case-results"", ""must_have"": ""credential-display""}",Outdated design + Hidden credentials + AI purple/pink gradients,HIGH
|
||||||
|
41,Beauty/Spa/Wellness Service,Hero-Centric + Social Proof,Soft UI Evolution + Neumorphism,Soft pastels (Pink Sage Cream) + Gold accents,Elegant + Calming typography,Soft shadows + Smooth transitions (200-300ms) + Gentle hover,"{""must_have"": ""booking-system"", ""must_have"": ""before-after-gallery"", ""if_luxury"": ""add-gold-accents""}",Bright neon colors + Harsh animations + Dark mode,HIGH
|
||||||
|
42,Service Landing Page,Hero-Centric + Trust & Authority,Minimalism + Social Proof-Focused,Brand primary + Trust colors,Professional + Clear typography,Testimonial carousel + CTA hover (200ms),"{""must_have"": ""social-proof"", ""must_have"": ""clear-cta""}",Complex navigation + Hidden contact info,HIGH
|
||||||
|
43,B2B Service,Feature-Rich Showcase + Trust,Trust & Authority + Minimalism,Professional blue + Neutral grey,Formal + Clear typography,Section transitions + Feature reveals,"{""must_have"": ""case-studies"", ""must_have"": ""roi-messaging""}",Playful design + Hidden credentials + AI purple/pink gradients,HIGH
|
||||||
|
44,Financial Dashboard,Data-Dense Dashboard,Dark Mode (OLED) + Data-Dense,Dark bg + Red/Green alerts + Trust blue,Clear + Readable typography,Real-time number animations + Alert pulse,"{""must_have"": ""real-time-updates"", ""must_have"": ""high-contrast""}",Light mode default + Slow rendering,HIGH
|
||||||
|
45,Analytics Dashboard,Data-Dense + Drill-Down,Data-Dense + Heat Map,Cool→Hot gradients + Neutral grey,Clear + Functional typography,Hover tooltips + Chart zoom + Filter animations,"{""must_have"": ""data-export"", ""if_large_dataset"": ""virtualize-lists""}",Ornate design + No filtering,HIGH
|
||||||
|
46,Productivity Tool,Interactive Demo + Feature-Rich,Flat Design + Micro-interactions,Clear hierarchy + Functional colors,Clean + Efficient typography,Quick actions (150ms) + Task animations,"{""must_have"": ""keyboard-shortcuts"", ""if_collaboration"": ""add-real-time-cursors""}",Complex onboarding + Slow performance,HIGH
|
||||||
|
47,Design System/Component Library,Feature-Rich + Documentation,Minimalism + Accessible & Ethical,Clear hierarchy + Code-like structure,Monospace + Clear typography,Code copy animations + Component previews,"{""must_have"": ""search"", ""must_have"": ""code-examples""}",Poor documentation + No live preview,HIGH
|
||||||
|
48,AI/Chatbot Platform,Interactive Demo + Minimal,AI-Native UI + Minimalism,Neutral + AI Purple (#6366F1),Modern + Clear typography,Streaming text + Typing indicators + Fade-in,"{""must_have"": ""conversational-ui"", ""must_have"": ""context-awareness""}",Heavy chrome + Slow response feedback,HIGH
|
||||||
|
49,NFT/Web3 Platform,Feature-Rich Showcase,Cyberpunk UI + Glassmorphism,Dark + Neon + Gold (#FFD700),Bold + Modern typography,Wallet connect animations + Transaction feedback,"{""must_have"": ""wallet-integration"", ""must_have"": ""gas-fees-display""}",Light mode default + No transaction status,HIGH
|
||||||
|
50,Creator Economy Platform,Social Proof + Feature-Rich,Vibrant & Block-based + Bento Box Grid,Vibrant + Brand colors,Modern + Bold typography,Engagement counter animations + Profile reveals,"{""must_have"": ""creator-profiles"", ""must_have"": ""monetization-display""}",Generic layout + Hidden earnings,MEDIUM
|
||||||
|
51,Sustainability/ESG Platform,Trust & Authority + Data,Organic Biophilic + Minimalism,Green (#228B22) + Earth tones,Clear + Informative typography,Progress indicators + Impact animations,"{""must_have"": ""data-transparency"", ""must_have"": ""certification-badges""}",Greenwashing visuals + No data,HIGH
|
||||||
|
52,Remote Work/Collaboration,Feature-Rich + Real-Time,Soft UI Evolution + Minimalism,Calm Blue + Neutral grey,Clean + Readable typography,Real-time presence indicators + Notification badges,"{""must_have"": ""status-indicators"", ""must_have"": ""video-integration""}",Cluttered interface + No presence,HIGH
|
||||||
|
53,Pet Tech App,Storytelling + Feature-Rich,Claymorphism + Vibrant & Block-based,Playful + Warm colors,Friendly + Playful typography,Pet profile animations + Health tracking charts,"{""must_have"": ""pet-profiles"", ""if_health"": ""add-vet-integration""}",Generic design + No personality,MEDIUM
|
||||||
|
54,Smart Home/IoT Dashboard,Real-Time Monitoring,Glassmorphism + Dark Mode (OLED),Dark + Status indicator colors,Clear + Functional typography,Device status pulse + Quick action animations,"{""must_have"": ""real-time-controls"", ""must_have"": ""energy-monitoring""}",Slow updates + No automation,HIGH
|
||||||
|
55,EV/Charging Ecosystem,Hero-Centric + Feature-Rich,Minimalism + Aurora UI,Electric Blue (#009CD1) + Green,Modern + Clear typography,Range estimation animations + Map interactions,"{""must_have"": ""charging-map"", ""must_have"": ""range-calculator""}",Poor map UX + Hidden costs,HIGH
|
||||||
|
56,Subscription Box Service,Feature-Rich + Conversion,Vibrant & Block-based + Motion-Driven,Brand + Excitement colors,Engaging + Clear typography,Unboxing reveal animations + Product carousel,"{""must_have"": ""personalization-quiz"", ""must_have"": ""subscription-management""}",Confusing pricing + No unboxing preview,HIGH
|
||||||
|
57,Podcast Platform,Storytelling + Feature-Rich,Dark Mode (OLED) + Minimalism,Dark + Audio waveform accents,Modern + Clear typography,Waveform visualizations + Episode transitions,"{""must_have"": ""audio-player-ux"", ""must_have"": ""episode-discovery""}",Poor audio player + Cluttered layout,HIGH
|
||||||
|
58,Dating App,Social Proof + Feature-Rich,Vibrant & Block-based + Motion-Driven,Warm + Romantic (Pink/Red gradients),Modern + Friendly typography,Profile card swipe + Match animations,"{""must_have"": ""profile-cards"", ""must_have"": ""safety-features""}",Generic profiles + No safety,HIGH
|
||||||
|
59,Micro-Credentials/Badges,Trust & Authority + Feature,Minimalism + Flat Design,Trust Blue + Gold (#FFD700),Professional + Clear typography,Badge reveal animations + Progress tracking,"{""must_have"": ""credential-verification"", ""must_have"": ""progress-display""}",No verification + Hidden progress,MEDIUM
|
||||||
|
60,Knowledge Base/Documentation,FAQ + Minimal,Minimalism + Accessible & Ethical,Clean hierarchy + Minimal color,Clear + Readable typography,Search highlight + Smooth scrolling,"{""must_have"": ""search-first"", ""must_have"": ""version-switching""}",Poor navigation + No search,HIGH
|
||||||
|
61,Hyperlocal Services,Conversion + Feature-Rich,Minimalism + Vibrant & Block-based,Location markers + Trust colors,Clear + Functional typography,Map hover + Provider card reveals,"{""must_have"": ""map-integration"", ""must_have"": ""booking-system""}",No map + Hidden reviews,HIGH
|
||||||
|
62,Luxury/Premium Brand,Storytelling + Feature-Rich,Liquid Glass + Glassmorphism,Black + Gold (#FFD700) + White,Elegant + Refined typography,Slow parallax + Premium reveals (400-600ms),"{""must_have"": ""high-quality-imagery"", ""must_have"": ""storytelling""}",Cheap visuals + Fast animations,HIGH
|
||||||
|
63,Fitness/Gym App,Feature-Rich + Data,Vibrant & Block-based + Dark Mode (OLED),Energetic (Orange #FF6B35) + Dark bg,Bold + Motivational typography,Progress ring animations + Achievement unlocks,"{""must_have"": ""progress-tracking"", ""must_have"": ""workout-plans""}",Static design + No gamification,HIGH
|
||||||
|
64,Hotel/Hospitality,Hero-Centric + Social Proof,Liquid Glass + Minimalism,Warm neutrals + Gold (#D4AF37),Elegant + Welcoming typography,Room gallery + Amenity reveals,"{""must_have"": ""room-booking"", ""must_have"": ""virtual-tour""}",Poor photos + Complex booking,HIGH
|
||||||
|
65,Wedding/Event Planning,Storytelling + Social Proof,Soft UI Evolution + Aurora UI,Soft Pink (#FFD6E0) + Gold + Cream,Elegant + Romantic typography,Gallery reveals + Timeline animations,"{""must_have"": ""portfolio-gallery"", ""must_have"": ""planning-tools""}",Generic templates + No portfolio,HIGH
|
||||||
|
66,Insurance Platform,Conversion + Trust,Trust & Authority + Flat Design,Trust Blue (#0066CC) + Green + Neutral,Clear + Professional typography,Quote calculator animations + Policy comparison,"{""must_have"": ""quote-calculator"", ""must_have"": ""policy-comparison""}",Confusing pricing + No trust signals + AI purple/pink gradients,HIGH
|
||||||
|
67,Banking/Traditional Finance,Trust & Authority + Feature,Minimalism + Accessible & Ethical,Navy (#0A1628) + Trust Blue + Gold,Professional + Trustworthy typography,Smooth number animations + Security indicators,"{""must_have"": ""security-first"", ""must_have"": ""accessibility""}",Playful design + Poor security UX + AI purple/pink gradients,HIGH
|
||||||
|
68,Online Course/E-learning,Feature-Rich + Social Proof,Claymorphism + Vibrant & Block-based,Vibrant learning colors + Progress green,Friendly + Engaging typography,Progress bar animations + Certificate reveals,"{""must_have"": ""progress-tracking"", ""must_have"": ""video-player""}",Boring design + No gamification,HIGH
|
||||||
|
69,Non-profit/Charity,Storytelling + Trust,Accessible & Ethical + Organic Biophilic,Cause-related colors + Trust + Warm,Heartfelt + Readable typography,Impact counter animations + Story reveals,"{""must_have"": ""impact-stories"", ""must_have"": ""donation-transparency""}",No impact data + Hidden financials,HIGH
|
||||||
|
70,Florist/Plant Shop,Hero-Centric + Conversion,Organic Biophilic + Vibrant & Block-based,Natural Green + Floral pinks/purples,Elegant + Natural typography,Product reveal + Seasonal transitions,"{""must_have"": ""delivery-scheduling"", ""must_have"": ""care-guides""}",Poor imagery + No seasonal content,MEDIUM
|
||||||
|
71,Bakery/Cafe,Hero-Centric + Conversion,Vibrant & Block-based + Soft UI Evolution,Warm Brown + Cream + Appetizing accents,Warm + Inviting typography,Menu hover + Order animations,"{""must_have"": ""menu-display"", ""must_have"": ""online-ordering""}",Poor food photos + Hidden hours,HIGH
|
||||||
|
72,Coffee Shop,Hero-Centric + Minimal,Minimalism + Organic Biophilic,Coffee Brown (#6F4E37) + Cream + Warm,Cozy + Clean typography,Menu transitions + Loyalty animations,"{""must_have"": ""menu"", ""if_loyalty"": ""add-rewards-system""}",Generic design + No atmosphere,MEDIUM
|
||||||
|
73,Brewery/Winery,Storytelling + Hero-Centric,Motion-Driven + Storytelling-Driven,Deep amber/burgundy + Gold + Craft,Artisanal + Heritage typography,Tasting note reveals + Heritage timeline,"{""must_have"": ""product-showcase"", ""must_have"": ""story-heritage""}",Generic product pages + No story,HIGH
|
||||||
|
74,Airline,Conversion + Feature-Rich,Minimalism + Glassmorphism,Sky Blue + Brand colors + Trust,Clear + Professional typography,Flight search animations + Boarding pass reveals,"{""must_have"": ""flight-search"", ""must_have"": ""mobile-first""}",Complex booking + Poor mobile,HIGH
|
||||||
|
75,Magazine/Blog,Storytelling + Hero-Centric,Swiss Modernism 2.0 + Motion-Driven,Editorial colors + Brand + Clean white,Editorial + Elegant typography,Article transitions + Category reveals,"{""must_have"": ""article-showcase"", ""must_have"": ""newsletter-signup""}",Poor typography + Slow loading,HIGH
|
||||||
|
76,Freelancer Platform,Feature-Rich + Conversion,Flat Design + Minimalism,Professional Blue + Success Green,Clear + Professional typography,Skill match animations + Review reveals,"{""must_have"": ""portfolio-display"", ""must_have"": ""skill-matching""}",Poor profiles + No reviews,HIGH
|
||||||
|
77,Consulting Firm,Trust & Authority + Minimal,Trust & Authority + Minimalism,Navy + Gold + Professional grey,Authoritative + Clear typography,Case study reveals + Team profiles,"{""must_have"": ""case-studies"", ""must_have"": ""thought-leadership""}",Generic content + No credentials + AI purple/pink gradients,HIGH
|
||||||
|
78,Marketing Agency,Storytelling + Feature-Rich,Brutalism + Motion-Driven,Bold brand colors + Creative freedom,Bold + Expressive typography,Portfolio reveals + Results animations,"{""must_have"": ""portfolio"", ""must_have"": ""results-metrics""}",Boring design + Hidden work,HIGH
|
||||||
|
79,Event Management,Hero-Centric + Feature-Rich,Vibrant & Block-based + Motion-Driven,Event theme colors + Excitement accents,Bold + Engaging typography,Countdown timer + Registration flow,"{""must_have"": ""registration"", ""must_have"": ""agenda-display""}",Confusing registration + No countdown,HIGH
|
||||||
|
80,Conference/Webinar Platform,Feature-Rich + Conversion,Glassmorphism + Minimalism,Professional Blue + Video accent,Professional + Clear typography,Live stream integration + Agenda transitions,"{""must_have"": ""registration"", ""must_have"": ""speaker-profiles""}",Poor video UX + No networking,HIGH
|
||||||
|
81,Membership/Community,Social Proof + Conversion,Vibrant & Block-based + Soft UI Evolution,Community brand colors + Engagement,Friendly + Engaging typography,Member counter + Benefit reveals,"{""must_have"": ""member-benefits"", ""must_have"": ""pricing-tiers""}",Hidden benefits + No community proof,HIGH
|
||||||
|
82,Newsletter Platform,Minimal + Conversion,Minimalism + Flat Design,Brand primary + Clean white + CTA,Clean + Readable typography,Subscribe form + Archive reveals,"{""must_have"": ""subscribe-form"", ""must_have"": ""sample-content""}",Complex signup + No preview,MEDIUM
|
||||||
|
83,Digital Products/Downloads,Feature-Rich + Conversion,Vibrant & Block-based + Motion-Driven,Product colors + Brand + Success green,Modern + Clear typography,Product preview + Instant delivery animations,"{""must_have"": ""product-preview"", ""must_have"": ""instant-delivery""}",No preview + Slow delivery,HIGH
|
||||||
|
84,Church/Religious Organization,Hero-Centric + Social Proof,Accessible & Ethical + Soft UI Evolution,Warm Gold + Deep Purple/Blue + White,Welcoming + Clear typography,Service time highlights + Event calendar,"{""must_have"": ""service-times"", ""must_have"": ""community-events""}",Outdated design + Hidden info,MEDIUM
|
||||||
|
85,Sports Team/Club,Hero-Centric + Feature-Rich,Vibrant & Block-based + Motion-Driven,Team colors + Energetic accents,Bold + Impactful typography,Score animations + Schedule reveals,"{""must_have"": ""schedule"", ""must_have"": ""roster""}",Static content + Poor fan engagement,HIGH
|
||||||
|
86,Museum/Gallery,Storytelling + Feature-Rich,Minimalism + Motion-Driven,Art-appropriate neutrals + Exhibition accents,Elegant + Minimal typography,Virtual tour + Collection reveals,"{""must_have"": ""virtual-tour"", ""must_have"": ""exhibition-info""}",Cluttered layout + No online access,HIGH
|
||||||
|
87,Theater/Cinema,Hero-Centric + Conversion,Dark Mode (OLED) + Motion-Driven,Dark + Spotlight accents + Gold,Dramatic + Bold typography,Seat selection + Trailer reveals,"{""must_have"": ""showtimes"", ""must_have"": ""seat-selection""}",Poor booking UX + No trailers,HIGH
|
||||||
|
88,Language Learning App,Feature-Rich + Social Proof,Claymorphism + Vibrant & Block-based,Playful colors + Progress indicators,Friendly + Clear typography,Progress animations + Achievement unlocks,"{""must_have"": ""progress-tracking"", ""must_have"": ""gamification""}",Boring design + No motivation,HIGH
|
||||||
|
89,Coding Bootcamp,Feature-Rich + Social Proof,Dark Mode (OLED) + Minimalism,Code editor colors + Brand + Success,Technical + Clear typography,Terminal animations + Career outcome reveals,"{""must_have"": ""curriculum"", ""must_have"": ""career-outcomes""}",Light mode only + Hidden results,HIGH
|
||||||
|
90,Cybersecurity Platform,Trust & Authority + Real-Time,Cyberpunk UI + Dark Mode (OLED),Matrix Green (#00FF00) + Deep Black,Technical + Clear typography,Threat visualization + Alert animations,"{""must_have"": ""real-time-monitoring"", ""must_have"": ""threat-display""}",Light mode + Poor data viz,HIGH
|
||||||
|
91,Developer Tool/IDE,Minimal + Documentation,Dark Mode (OLED) + Minimalism,Dark syntax theme + Blue focus,Monospace + Functional typography,Syntax highlighting + Command palette,"{""must_have"": ""keyboard-shortcuts"", ""must_have"": ""documentation""}",Light mode default + Slow performance,HIGH
|
||||||
|
92,Biotech/Life Sciences,Storytelling + Data,Glassmorphism + Clean Science,Sterile White + DNA Blue + Life Green,Scientific + Clear typography,Data visualization + Research reveals,"{""must_have"": ""data-accuracy"", ""must_have"": ""clean-aesthetic""}",Cluttered data + Poor credibility,HIGH
|
||||||
|
93,Space Tech/Aerospace,Immersive + Feature-Rich,Holographic/HUD + Dark Mode,Deep Space Black + Star White + Metallic,Futuristic + Precise typography,Telemetry animations + 3D renders,"{""must_have"": ""high-tech-feel"", ""must_have"": ""precision-data""}",Generic design + No immersion,HIGH
|
||||||
|
94,Architecture/Interior,Portfolio + Hero-Centric,Exaggerated Minimalism + High Imagery,Monochrome + Gold Accent + High Imagery,Architectural + Elegant typography,Project gallery + Blueprint reveals,"{""must_have"": ""high-res-images"", ""must_have"": ""project-portfolio""}",Poor imagery + Cluttered layout,HIGH
|
||||||
|
95,Quantum Computing,Immersive + Interactive,Holographic/HUD + Dark Mode,Quantum Blue (#00FFFF) + Deep Black,Futuristic + Scientific typography,Probability visualizations + Qubit state animations,"{""must_have"": ""complexity-visualization"", ""must_have"": ""scientific-credibility""}",Generic tech design + No viz,HIGH
|
||||||
|
96,Biohacking/Longevity App,Data-Dense + Storytelling,Biomimetic/Organic 2.0 + Minimalism,Cellular Pink/Red + DNA Blue + White,Scientific + Clear typography,Biological data viz + Progress animations,"{""must_have"": ""data-privacy"", ""must_have"": ""scientific-credibility""}",Generic health app + No privacy,HIGH
|
||||||
|
97,Autonomous Drone Fleet,Real-Time + Feature-Rich,HUD/Sci-Fi FUI + Real-Time,Tactical Green + Alert Red + Map Dark,Technical + Functional typography,Telemetry animations + 3D spatial awareness,"{""must_have"": ""real-time-telemetry"", ""must_have"": ""safety-alerts""}",Slow updates + Poor spatial viz,HIGH
|
||||||
|
98,Generative Art Platform,Showcase + Feature-Rich,Minimalism + Gen Z Chaos,Neutral (#F5F5F5) + User Content,Minimal + Content-focused typography,Gallery masonry + Minting animations,"{""must_have"": ""fast-loading"", ""must_have"": ""creator-attribution""}",Heavy chrome + Slow loading,HIGH
|
||||||
|
99,Spatial Computing OS,Immersive + Interactive,Spatial UI (VisionOS) + Glassmorphism,Frosted Glass + System Colors + Depth,Spatial + Readable typography,Depth hierarchy + Gaze interactions,"{""must_have"": ""depth-hierarchy"", ""must_have"": ""environment-awareness""}",2D design + No spatial depth,HIGH
|
||||||
|
100,Sustainable Energy/Climate,Data + Trust,Organic Biophilic + E-Ink/Paper,Earth Green + Sky Blue + Solar Yellow,Clear + Informative typography,Impact viz + Progress animations,"{""must_have"": ""data-transparency"", ""must_have"": ""impact-visualization""}",Greenwashing + No real data,HIGH
|
||||||
|
100
.codex/skills/ui-ux-pro-max/data/ux-guidelines.csv
Normal file
100
.codex/skills/ui-ux-pro-max/data/ux-guidelines.csv
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
No,Category,Issue,Platform,Description,Do,Don't,Code Example Good,Code Example Bad,Severity
|
||||||
|
1,Navigation,Smooth Scroll,Web,Anchor links should scroll smoothly to target section,Use scroll-behavior: smooth on html element,Jump directly without transition,html { scroll-behavior: smooth; },<a href='#section'> without CSS,High
|
||||||
|
2,Navigation,Sticky Navigation,Web,Fixed nav should not obscure content,Add padding-top to body equal to nav height,Let nav overlap first section content,pt-20 (if nav is h-20),No padding compensation,Medium
|
||||||
|
3,Navigation,Active State,All,Current page/section should be visually indicated,Highlight active nav item with color/underline,No visual feedback on current location,text-primary border-b-2,All links same style,Medium
|
||||||
|
4,Navigation,Back Button,Mobile,Users expect back to work predictably,Preserve navigation history properly,Break browser/app back button behavior,history.pushState(),location.replace(),High
|
||||||
|
5,Navigation,Deep Linking,All,URLs should reflect current state for sharing,Update URL on state/view changes,Static URLs for dynamic content,Use query params or hash,Single URL for all states,Medium
|
||||||
|
6,Navigation,Breadcrumbs,Web,Show user location in site hierarchy,Use for sites with 3+ levels of depth,Use for flat single-level sites,Home > Category > Product,Only on deep nested pages,Low
|
||||||
|
7,Animation,Excessive Motion,All,Too many animations cause distraction and motion sickness,Animate 1-2 key elements per view maximum,Animate everything that moves,Single hero animation,animate-bounce on 5+ elements,High
|
||||||
|
8,Animation,Duration Timing,All,Animations should feel responsive not sluggish,Use 150-300ms for micro-interactions,Use animations longer than 500ms for UI,transition-all duration-200,duration-1000,Medium
|
||||||
|
9,Animation,Reduced Motion,All,Respect user's motion preferences,Check prefers-reduced-motion media query,Ignore accessibility motion settings,@media (prefers-reduced-motion: reduce),No motion query check,High
|
||||||
|
10,Animation,Loading States,All,Show feedback during async operations,Use skeleton screens or spinners,Leave UI frozen with no feedback,animate-pulse skeleton,Blank screen while loading,High
|
||||||
|
11,Animation,Hover vs Tap,All,Hover effects don't work on touch devices,Use click/tap for primary interactions,Rely only on hover for important actions,onClick handler,onMouseEnter only,High
|
||||||
|
12,Animation,Continuous Animation,All,Infinite animations are distracting,Use for loading indicators only,Use for decorative elements,animate-spin on loader,animate-bounce on icons,Medium
|
||||||
|
13,Animation,Transform Performance,Web,Some CSS properties trigger expensive repaints,Use transform and opacity for animations,Animate width/height/top/left properties,transform: translateY(),top: 10px animation,Medium
|
||||||
|
14,Animation,Easing Functions,All,Linear motion feels robotic,Use ease-out for entering ease-in for exiting,Use linear for UI transitions,ease-out,linear,Low
|
||||||
|
15,Layout,Z-Index Management,Web,Stacking context conflicts cause hidden elements,Define z-index scale system (10 20 30 50),Use arbitrary large z-index values,z-10 z-20 z-50,z-[9999],High
|
||||||
|
16,Layout,Overflow Hidden,Web,Hidden overflow can clip important content,Test all content fits within containers,Blindly apply overflow-hidden,overflow-auto with scroll,overflow-hidden truncating content,Medium
|
||||||
|
17,Layout,Fixed Positioning,Web,Fixed elements can overlap or be inaccessible,Account for safe areas and other fixed elements,Stack multiple fixed elements carelessly,Fixed nav + fixed bottom with gap,Multiple overlapping fixed elements,Medium
|
||||||
|
18,Layout,Stacking Context,Web,New stacking contexts reset z-index,Understand what creates new stacking context,Expect z-index to work across contexts,Parent with z-index isolates children,z-index: 9999 not working,Medium
|
||||||
|
19,Layout,Content Jumping,Web,Layout shift when content loads is jarring,Reserve space for async content,Let images/content push layout around,aspect-ratio or fixed height,No dimensions on images,High
|
||||||
|
20,Layout,Viewport Units,Web,100vh can be problematic on mobile browsers,Use dvh or account for mobile browser chrome,Use 100vh for full-screen mobile layouts,min-h-dvh or min-h-screen,h-screen on mobile,Medium
|
||||||
|
21,Layout,Container Width,Web,Content too wide is hard to read,Limit max-width for text content (65-75ch),Let text span full viewport width,max-w-prose or max-w-3xl,Full width paragraphs,Medium
|
||||||
|
22,Touch,Touch Target Size,Mobile,Small buttons are hard to tap accurately,Minimum 44x44px touch targets,Tiny clickable areas,min-h-[44px] min-w-[44px],w-6 h-6 buttons,High
|
||||||
|
23,Touch,Touch Spacing,Mobile,Adjacent touch targets need adequate spacing,Minimum 8px gap between touch targets,Tightly packed clickable elements,gap-2 between buttons,gap-0 or gap-1,Medium
|
||||||
|
24,Touch,Gesture Conflicts,Mobile,Custom gestures can conflict with system,Avoid horizontal swipe on main content,Override system gestures,Vertical scroll primary,Horizontal swipe carousel only,Medium
|
||||||
|
25,Touch,Tap Delay,Mobile,300ms tap delay feels laggy,Use touch-action CSS or fastclick,Default mobile tap handling,touch-action: manipulation,No touch optimization,Medium
|
||||||
|
26,Touch,Pull to Refresh,Mobile,Accidental refresh is frustrating,Disable where not needed,Enable by default everywhere,overscroll-behavior: contain,Default overscroll,Low
|
||||||
|
27,Touch,Haptic Feedback,Mobile,Tactile feedback improves interaction feel,Use for confirmations and important actions,Overuse vibration feedback,navigator.vibrate(10),Vibrate on every tap,Low
|
||||||
|
28,Interaction,Focus States,All,Keyboard users need visible focus indicators,Use visible focus rings on interactive elements,Remove focus outline without replacement,focus:ring-2 focus:ring-blue-500,outline-none without alternative,High
|
||||||
|
29,Interaction,Hover States,Web,Visual feedback on interactive elements,Change cursor and add subtle visual change,No hover feedback on clickable elements,hover:bg-gray-100 cursor-pointer,No hover style,Medium
|
||||||
|
30,Interaction,Active States,All,Show immediate feedback on press/click,Add pressed/active state visual change,No feedback during interaction,active:scale-95,No active state,Medium
|
||||||
|
31,Interaction,Disabled States,All,Clearly indicate non-interactive elements,Reduce opacity and change cursor,Confuse disabled with normal state,opacity-50 cursor-not-allowed,Same style as enabled,Medium
|
||||||
|
32,Interaction,Loading Buttons,All,Prevent double submission during async actions,Disable button and show loading state,Allow multiple clicks during processing,disabled={loading} spinner,Button clickable while loading,High
|
||||||
|
33,Interaction,Error Feedback,All,Users need to know when something fails,Show clear error messages near problem,Silent failures with no feedback,Red border + error message,No indication of error,High
|
||||||
|
34,Interaction,Success Feedback,All,Confirm successful actions to users,Show success message or visual change,No confirmation of completed action,Toast notification or checkmark,Action completes silently,Medium
|
||||||
|
35,Interaction,Confirmation Dialogs,All,Prevent accidental destructive actions,Confirm before delete/irreversible actions,Delete without confirmation,Are you sure modal,Direct delete on click,High
|
||||||
|
36,Accessibility,Color Contrast,All,Text must be readable against background,Minimum 4.5:1 ratio for normal text,Low contrast text,#333 on white (7:1),#999 on white (2.8:1),High
|
||||||
|
37,Accessibility,Color Only,All,Don't convey information by color alone,Use icons/text in addition to color,Red/green only for error/success,Red text + error icon,Red border only for error,High
|
||||||
|
38,Accessibility,Alt Text,All,Images need text alternatives,Descriptive alt text for meaningful images,Empty or missing alt attributes,alt='Dog playing in park',alt='' for content images,High
|
||||||
|
39,Accessibility,Heading Hierarchy,Web,Screen readers use headings for navigation,Use sequential heading levels h1-h6,Skip heading levels or misuse for styling,h1 then h2 then h3,h1 then h4,Medium
|
||||||
|
40,Accessibility,ARIA Labels,All,Interactive elements need accessible names,Add aria-label for icon-only buttons,Icon buttons without labels,aria-label='Close menu',<button><Icon/></button>,High
|
||||||
|
41,Accessibility,Keyboard Navigation,Web,All functionality accessible via keyboard,Tab order matches visual order,Keyboard traps or illogical tab order,tabIndex for custom order,Unreachable elements,High
|
||||||
|
42,Accessibility,Screen Reader,All,Content should make sense when read aloud,Use semantic HTML and ARIA properly,Div soup with no semantics,<nav> <main> <article>,<div> for everything,Medium
|
||||||
|
43,Accessibility,Form Labels,All,Inputs must have associated labels,Use label with for attribute or wrap input,Placeholder-only inputs,<label for='email'>,placeholder='Email' only,High
|
||||||
|
44,Accessibility,Error Messages,All,Error messages must be announced,Use aria-live or role=alert for errors,Visual-only error indication,role='alert',Red border only,High
|
||||||
|
45,Accessibility,Skip Links,Web,Allow keyboard users to skip navigation,Provide skip to main content link,No skip link on nav-heavy pages,Skip to main content link,100 tabs to reach content,Medium
|
||||||
|
46,Performance,Image Optimization,All,Large images slow page load,Use appropriate size and format (WebP),Unoptimized full-size images,srcset with multiple sizes,4000px image for 400px display,High
|
||||||
|
47,Performance,Lazy Loading,All,Load content as needed,Lazy load below-fold images and content,Load everything upfront,loading='lazy',All images eager load,Medium
|
||||||
|
48,Performance,Code Splitting,Web,Large bundles slow initial load,Split code by route/feature,Single large bundle,dynamic import(),All code in main bundle,Medium
|
||||||
|
49,Performance,Caching,Web,Repeat visits should be fast,Set appropriate cache headers,No caching strategy,Cache-Control headers,Every request hits server,Medium
|
||||||
|
50,Performance,Font Loading,Web,Web fonts can block rendering,Use font-display swap or optional,Invisible text during font load,font-display: swap,FOIT (Flash of Invisible Text),Medium
|
||||||
|
51,Performance,Third Party Scripts,Web,External scripts can block rendering,Load non-critical scripts async/defer,Synchronous third-party scripts,async or defer attribute,<script src='...'> in head,Medium
|
||||||
|
52,Performance,Bundle Size,Web,Large JavaScript slows interaction,Monitor and minimize bundle size,Ignore bundle size growth,Bundle analyzer,No size monitoring,Medium
|
||||||
|
53,Performance,Render Blocking,Web,CSS/JS can block first paint,Inline critical CSS defer non-critical,Large blocking CSS files,Critical CSS inline,All CSS in head,Medium
|
||||||
|
54,Forms,Input Labels,All,Every input needs a visible label,Always show label above or beside input,Placeholder as only label,<label>Email</label><input>,placeholder='Email' only,High
|
||||||
|
55,Forms,Error Placement,All,Errors should appear near the problem,Show error below related input,Single error message at top of form,Error under each field,All errors at form top,Medium
|
||||||
|
56,Forms,Inline Validation,All,Validate as user types or on blur,Validate on blur for most fields,Validate only on submit,onBlur validation,Submit-only validation,Medium
|
||||||
|
57,Forms,Input Types,All,Use appropriate input types,Use email tel number url etc,Text input for everything,type='email',type='text' for email,Medium
|
||||||
|
58,Forms,Autofill Support,Web,Help browsers autofill correctly,Use autocomplete attribute properly,Block or ignore autofill,autocomplete='email',autocomplete='off' everywhere,Medium
|
||||||
|
59,Forms,Required Indicators,All,Mark required fields clearly,Use asterisk or (required) text,No indication of required fields,* required indicator,Guess which are required,Medium
|
||||||
|
60,Forms,Password Visibility,All,Let users see password while typing,Toggle to show/hide password,No visibility toggle,Show/hide password button,Password always hidden,Medium
|
||||||
|
61,Forms,Submit Feedback,All,Confirm form submission status,Show loading then success/error state,No feedback after submit,Loading -> Success message,Button click with no response,High
|
||||||
|
62,Forms,Input Affordance,All,Inputs should look interactive,Use distinct input styling,Inputs that look like plain text,Border/background on inputs,Borderless inputs,Medium
|
||||||
|
63,Forms,Mobile Keyboards,Mobile,Show appropriate keyboard for input type,Use inputmode attribute,Default keyboard for all inputs,inputmode='numeric',Text keyboard for numbers,Medium
|
||||||
|
64,Responsive,Mobile First,Web,Design for mobile then enhance for larger,Start with mobile styles then add breakpoints,Desktop-first causing mobile issues,Default mobile + md: lg: xl:,Desktop default + max-width queries,Medium
|
||||||
|
65,Responsive,Breakpoint Testing,Web,Test at all common screen sizes,Test at 320 375 414 768 1024 1440,Only test on your device,Multiple device testing,Single device development,Medium
|
||||||
|
66,Responsive,Touch Friendly,Web,Mobile layouts need touch-sized targets,Increase touch targets on mobile,Same tiny buttons on mobile,Larger buttons on mobile,Desktop-sized targets on mobile,High
|
||||||
|
67,Responsive,Readable Font Size,All,Text must be readable on all devices,Minimum 16px body text on mobile,Tiny text on mobile,text-base or larger,text-xs for body text,High
|
||||||
|
68,Responsive,Viewport Meta,Web,Set viewport for mobile devices,Use width=device-width initial-scale=1,Missing or incorrect viewport,<meta name='viewport'...>,No viewport meta tag,High
|
||||||
|
69,Responsive,Horizontal Scroll,Web,Avoid horizontal scrolling,Ensure content fits viewport width,Content wider than viewport,max-w-full overflow-x-hidden,Horizontal scrollbar on mobile,High
|
||||||
|
70,Responsive,Image Scaling,Web,Images should scale with container,Use max-width: 100% on images,Fixed width images overflow,max-w-full h-auto,width='800' fixed,Medium
|
||||||
|
71,Responsive,Table Handling,Web,Tables can overflow on mobile,Use horizontal scroll or card layout,Wide tables breaking layout,overflow-x-auto wrapper,Table overflows viewport,Medium
|
||||||
|
72,Typography,Line Height,All,Adequate line height improves readability,Use 1.5-1.75 for body text,Cramped or excessive line height,leading-relaxed (1.625),leading-none (1),Medium
|
||||||
|
73,Typography,Line Length,Web,Long lines are hard to read,Limit to 65-75 characters per line,Full-width text on large screens,max-w-prose,Full viewport width text,Medium
|
||||||
|
74,Typography,Font Size Scale,All,Consistent type hierarchy aids scanning,Use consistent modular scale,Random font sizes,Type scale (12 14 16 18 24 32),Arbitrary sizes,Medium
|
||||||
|
75,Typography,Font Loading,Web,Fonts should load without layout shift,Reserve space with fallback font,Layout shift when fonts load,font-display: swap + similar fallback,No fallback font,Medium
|
||||||
|
76,Typography,Contrast Readability,All,Body text needs good contrast,Use darker text on light backgrounds,Gray text on gray background,text-gray-900 on white,text-gray-400 on gray-100,High
|
||||||
|
77,Typography,Heading Clarity,All,Headings should stand out from body,Clear size/weight difference,Headings similar to body text,Bold + larger size,Same size as body,Medium
|
||||||
|
78,Feedback,Loading Indicators,All,Show system status during waits,Show spinner/skeleton for operations > 300ms,No feedback during loading,Skeleton or spinner,Frozen UI,High
|
||||||
|
79,Feedback,Empty States,All,Guide users when no content exists,Show helpful message and action,Blank empty screens,No items yet. Create one!,Empty white space,Medium
|
||||||
|
80,Feedback,Error Recovery,All,Help users recover from errors,Provide clear next steps,Error without recovery path,Try again button + help link,Error message only,Medium
|
||||||
|
81,Feedback,Progress Indicators,All,Show progress for multi-step processes,Step indicators or progress bar,No indication of progress,Step 2 of 4 indicator,No step information,Medium
|
||||||
|
82,Feedback,Toast Notifications,All,Transient messages for non-critical info,Auto-dismiss after 3-5 seconds,Toasts that never disappear,Auto-dismiss toast,Persistent toast,Medium
|
||||||
|
83,Feedback,Confirmation Messages,All,Confirm successful actions,Brief success message,Silent success,Saved successfully toast,No confirmation,Medium
|
||||||
|
84,Content,Truncation,All,Handle long content gracefully,Truncate with ellipsis and expand option,Overflow or broken layout,line-clamp-2 with expand,Overflow or cut off,Medium
|
||||||
|
85,Content,Date Formatting,All,Use locale-appropriate date formats,Use relative or locale-aware dates,Ambiguous date formats,2 hours ago or locale format,01/02/03,Low
|
||||||
|
86,Content,Number Formatting,All,Format large numbers for readability,Use thousand separators or abbreviations,Long unformatted numbers,"1.2K or 1,234",1234567,Low
|
||||||
|
87,Content,Placeholder Content,All,Show realistic placeholders during dev,Use realistic sample data,Lorem ipsum everywhere,Real sample content,Lorem ipsum,Low
|
||||||
|
88,Onboarding,User Freedom,All,Users should be able to skip tutorials,Provide Skip and Back buttons,Force linear unskippable tour,Skip Tutorial button,Locked overlay until finished,Medium
|
||||||
|
89,Search,Autocomplete,Web,Help users find results faster,Show predictions as user types,Require full type and enter,Debounced fetch + dropdown,No suggestions,Medium
|
||||||
|
90,Search,No Results,Web,Dead ends frustrate users,Show 'No results' with suggestions,Blank screen or '0 results',Try searching for X instead,No results found.,Medium
|
||||||
|
91,Data Entry,Bulk Actions,Web,Editing one by one is tedious,Allow multi-select and bulk edit,Single row actions only,Checkbox column + Action bar,Repeated actions per row,Low
|
||||||
|
92,AI Interaction,Disclaimer,All,Users need to know they talk to AI,Clearly label AI generated content,Present AI as human,AI Assistant label,Fake human name without label,High
|
||||||
|
93,AI Interaction,Streaming,All,Waiting for full text is slow,Stream text response token by token,Show loading spinner for 10s+,Typewriter effect,Spinner until 100% complete,Medium
|
||||||
|
94,Spatial UI,Gaze Hover,VisionOS,Elements should respond to eye tracking before pinch,Scale/highlight element on look,Static element until pinch,hoverEffect(),onTap only,High
|
||||||
|
95,Spatial UI,Depth Layering,VisionOS,UI needs Z-depth to separate content from environment,Use glass material and z-offset,Flat opaque panels blocking view,.glassBackgroundEffect(),bg-white,Medium
|
||||||
|
96,Sustainability,Auto-Play Video,Web,Video consumes massive data and energy,Click-to-play or pause when off-screen,Auto-play high-res video loops,playsInline muted preload='none',autoplay loop,Medium
|
||||||
|
97,Sustainability,Asset Weight,Web,Heavy 3D/Image assets increase carbon footprint,Compress and lazy load 3D models,Load 50MB textures,Draco compression,Raw .obj files,Medium
|
||||||
|
98,AI Interaction,Feedback Loop,All,AI needs user feedback to improve,Thumps up/down or 'Regenerate',Static output only,Feedback component,Read-only text,Low
|
||||||
|
99,Accessibility,Motion Sensitivity,All,Parallax/Scroll-jacking causes nausea,Respect prefers-reduced-motion,Force scroll effects,@media (prefers-reduced-motion),ScrollTrigger.create(),High
|
||||||
|
31
.codex/skills/ui-ux-pro-max/data/web-interface.csv
Normal file
31
.codex/skills/ui-ux-pro-max/data/web-interface.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
No,Category,Issue,Keywords,Platform,Description,Do,Don't,Code Example Good,Code Example Bad,Severity
|
||||||
|
1,Accessibility,Icon Button Labels,icon button aria-label,Web,Icon-only buttons must have accessible names,Add aria-label to icon buttons,Icon button without label,"<button aria-label='Close'><XIcon /></button>","<button><XIcon /></button>",Critical
|
||||||
|
2,Accessibility,Form Control Labels,form input label aria,Web,All form controls need labels or aria-label,Use label element or aria-label,Input without accessible name,"<label for='email'>Email</label><input id='email' />","<input placeholder='Email' />",Critical
|
||||||
|
3,Accessibility,Keyboard Handlers,keyboard onclick onkeydown,Web,Interactive elements must support keyboard interaction,Add onKeyDown alongside onClick,Click-only interaction,"<div onClick={fn} onKeyDown={fn} tabIndex={0}>","<div onClick={fn}>",High
|
||||||
|
4,Accessibility,Semantic HTML,semantic button a label,Web,Use semantic HTML before ARIA attributes,Use button/a/label elements,Div with role attribute,"<button onClick={fn}>Submit</button>","<div role='button' onClick={fn}>Submit</div>",High
|
||||||
|
5,Accessibility,Aria Live,aria-live polite async,Web,Async updates need aria-live for screen readers,Add aria-live='polite' for dynamic content,Silent async updates,"<div aria-live='polite'>{status}</div>","<div>{status}</div> // no announcement",Medium
|
||||||
|
6,Accessibility,Decorative Icons,aria-hidden decorative icon,Web,Decorative icons should be hidden from screen readers,Add aria-hidden='true' to decorative icons,Decorative icon announced,"<Icon aria-hidden='true' />","<Icon /> // announced as 'image'",Medium
|
||||||
|
7,Focus,Visible Focus States,focus-visible outline ring,Web,All interactive elements need visible focus states,Use :focus-visible with ring/outline,No focus indication,"focus-visible:ring-2 focus-visible:ring-blue-500","outline-none // no replacement",Critical
|
||||||
|
8,Focus,Never Remove Outline,outline-none focus replacement,Web,Never remove outline without providing replacement,Replace outline with visible alternative,Remove outline completely,"focus:outline-none focus:ring-2","focus:outline-none // nothing else",Critical
|
||||||
|
9,Focus,Checkbox Radio Hit Target,checkbox radio label target,Web,Checkbox/radio must share hit target with label,Wrap input and label together,Separate tiny checkbox,"<label class='flex gap-2'><input type='checkbox' /><span>Option</span></label>","<input type='checkbox' id='x' /><label for='x'>Option</label>",Medium
|
||||||
|
10,Forms,Autocomplete Attribute,autocomplete input form,Web,Inputs need autocomplete attribute for autofill,Add appropriate autocomplete value,Missing autocomplete,"<input autocomplete='email' type='email' />","<input type='email' />",High
|
||||||
|
11,Forms,Semantic Input Types,input type email tel url,Web,Use semantic input type attributes,Use email/tel/url/number types,text type for everything,"<input type='email' />","<input type='text' /> // for email",Medium
|
||||||
|
12,Forms,Never Block Paste,paste onpaste password,Web,Never prevent paste functionality,Allow paste on all inputs,Block paste on password/code,"<input type='password' />","<input onPaste={e => e.preventDefault()} />",High
|
||||||
|
13,Forms,Spellcheck Disable,spellcheck email code,Web,Disable spellcheck on emails and codes,Set spellcheck='false' on codes,Spellcheck on technical input,"<input spellCheck='false' type='email' />","<input type='email' /> // red squiggles",Low
|
||||||
|
14,Forms,Submit Button Enabled,submit button disabled loading,Web,Keep submit enabled and show spinner during requests,Show loading spinner keep enabled,Disable button during submit,"<button>{loading ? <Spinner /> : 'Submit'}</button>","<button disabled={loading}>Submit</button>",Medium
|
||||||
|
15,Forms,Inline Errors,error message inline focus,Web,Show error messages inline near the problem field,Inline error with focus on first error,Single error at top,"<input /><span class='text-red-500'>{error}</span>","<div class='error'>{allErrors}</div> // at top",High
|
||||||
|
16,Performance,Virtualize Lists,virtualize list 50 items,Web,Virtualize lists exceeding 50 items,Use virtual list for large datasets,Render all items,"<VirtualList items={items} />","items.map(item => <Item />)",High
|
||||||
|
17,Performance,Avoid Layout Reads,layout read render getboundingclientrect,Web,Avoid layout reads during render phase,Read layout in effects or callbacks,getBoundingClientRect in render,"useEffect(() => { el.getBoundingClientRect() })","const rect = el.getBoundingClientRect() // in render",Medium
|
||||||
|
18,Performance,Batch DOM Operations,batch dom write read,Web,Group DOM operations to minimize reflows,Batch writes then reads,Interleave reads and writes,"writes.forEach(w => w()); reads.forEach(r => r())","write(); read(); write(); read(); // thrashing",Medium
|
||||||
|
19,Performance,Preconnect CDN,preconnect link cdn,Web,Add preconnect links for CDN domains,Preconnect to known domains,"<link rel='preconnect' href='https://cdn.example.com' />","// no preconnect hint",Low
|
||||||
|
20,Performance,Lazy Load Images,lazy loading image below-fold,Web,Lazy-load images below the fold,Use loading='lazy' for below-fold images,Load all images eagerly,"<img loading='lazy' src='...' />","<img src='...' /> // above fold only",Medium
|
||||||
|
21,State,URL Reflects State,url state query params,Web,URL should reflect current UI state,Sync filters/tabs/pagination to URL,State only in memory,"?tab=settings&page=2","useState only // lost on refresh",High
|
||||||
|
22,State,Deep Linking,deep link stateful component,Web,Stateful components should support deep-linking,Enable sharing current view via URL,No shareable state,"router.push({ query: { ...filters } })","setFilters(f) // not in URL",Medium
|
||||||
|
23,State,Confirm Destructive Actions,confirm destructive delete modal,Web,Destructive actions require confirmation,Show confirmation dialog before delete,Delete without confirmation,"if (confirm('Delete?')) delete()","onClick={delete} // no confirmation",High
|
||||||
|
24,Typography,Proper Unicode,unicode ellipsis quotes,Web,Use proper Unicode characters,Use ... curly quotes proper dashes,ASCII approximations,"'Hello...' with proper ellipsis","'Hello...' with three dots",Low
|
||||||
|
25,Typography,Text Overflow,truncate line-clamp overflow,Web,Handle text overflow properly,Use truncate/line-clamp/break-words,Text overflows container,"<p class='truncate'>Long text...</p>","<p>Long text...</p> // overflows",Medium
|
||||||
|
26,Typography,Non-Breaking Spaces,nbsp unit brand,Web,Use non-breaking spaces for units and brand names,Use between number and unit,"10 kg or Next.js 14","10 kg // may wrap",Low
|
||||||
|
27,Anti-Pattern,No Zoom Disable,viewport zoom disable,Web,Never disable zoom in viewport meta,Allow user zoom,"<meta name='viewport' content='width=device-width'>","<meta name='viewport' content='maximum-scale=1'>",Critical
|
||||||
|
28,Anti-Pattern,No Transition All,transition all specific,Web,Avoid transition: all - specify properties,Transition specific properties,transition: all,"transition-colors duration-200","transition-all duration-200",Medium
|
||||||
|
29,Anti-Pattern,Outline Replacement,outline-none ring focus,Web,Never use outline-none without replacement,Provide visible focus replacement,Remove outline with nothing,"focus:outline-none focus:ring-2 focus:ring-blue-500","focus:outline-none // alone",Critical
|
||||||
|
30,Anti-Pattern,No Hardcoded Dates,date format intl locale,Web,Use Intl for date/number formatting,Use Intl.DateTimeFormat,Hardcoded date format,"new Intl.DateTimeFormat('en').format(date)","date.toLocaleDateString() // or manual format",Medium
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
253
.codex/skills/ui-ux-pro-max/scripts/core.py
Normal file
253
.codex/skills/ui-ux-pro-max/scripts/core.py
Normal file
@@ -0,0 +1,253 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
UI/UX Pro Max Core - BM25 search engine for UI/UX style guides
|
||||||
|
"""
|
||||||
|
|
||||||
|
import csv
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
from math import log
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
# ============ CONFIGURATION ============
|
||||||
|
DATA_DIR = Path(__file__).parent.parent / "data"
|
||||||
|
MAX_RESULTS = 3
|
||||||
|
|
||||||
|
CSV_CONFIG = {
|
||||||
|
"style": {
|
||||||
|
"file": "styles.csv",
|
||||||
|
"search_cols": ["Style Category", "Keywords", "Best For", "Type", "AI Prompt Keywords"],
|
||||||
|
"output_cols": ["Style Category", "Type", "Keywords", "Primary Colors", "Effects & Animation", "Best For", "Performance", "Accessibility", "Framework Compatibility", "Complexity", "AI Prompt Keywords", "CSS/Technical Keywords", "Implementation Checklist", "Design System Variables"]
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"file": "colors.csv",
|
||||||
|
"search_cols": ["Product Type", "Notes"],
|
||||||
|
"output_cols": ["Product Type", "Primary (Hex)", "Secondary (Hex)", "CTA (Hex)", "Background (Hex)", "Text (Hex)", "Notes"]
|
||||||
|
},
|
||||||
|
"chart": {
|
||||||
|
"file": "charts.csv",
|
||||||
|
"search_cols": ["Data Type", "Keywords", "Best Chart Type", "Accessibility Notes"],
|
||||||
|
"output_cols": ["Data Type", "Keywords", "Best Chart Type", "Secondary Options", "Color Guidance", "Accessibility Notes", "Library Recommendation", "Interactive Level"]
|
||||||
|
},
|
||||||
|
"landing": {
|
||||||
|
"file": "landing.csv",
|
||||||
|
"search_cols": ["Pattern Name", "Keywords", "Conversion Optimization", "Section Order"],
|
||||||
|
"output_cols": ["Pattern Name", "Keywords", "Section Order", "Primary CTA Placement", "Color Strategy", "Conversion Optimization"]
|
||||||
|
},
|
||||||
|
"product": {
|
||||||
|
"file": "products.csv",
|
||||||
|
"search_cols": ["Product Type", "Keywords", "Primary Style Recommendation", "Key Considerations"],
|
||||||
|
"output_cols": ["Product Type", "Keywords", "Primary Style Recommendation", "Secondary Styles", "Landing Page Pattern", "Dashboard Style (if applicable)", "Color Palette Focus"]
|
||||||
|
},
|
||||||
|
"ux": {
|
||||||
|
"file": "ux-guidelines.csv",
|
||||||
|
"search_cols": ["Category", "Issue", "Description", "Platform"],
|
||||||
|
"output_cols": ["Category", "Issue", "Platform", "Description", "Do", "Don't", "Code Example Good", "Code Example Bad", "Severity"]
|
||||||
|
},
|
||||||
|
"typography": {
|
||||||
|
"file": "typography.csv",
|
||||||
|
"search_cols": ["Font Pairing Name", "Category", "Mood/Style Keywords", "Best For", "Heading Font", "Body Font"],
|
||||||
|
"output_cols": ["Font Pairing Name", "Category", "Heading Font", "Body Font", "Mood/Style Keywords", "Best For", "Google Fonts URL", "CSS Import", "Tailwind Config", "Notes"]
|
||||||
|
},
|
||||||
|
"icons": {
|
||||||
|
"file": "icons.csv",
|
||||||
|
"search_cols": ["Category", "Icon Name", "Keywords", "Best For"],
|
||||||
|
"output_cols": ["Category", "Icon Name", "Keywords", "Library", "Import Code", "Usage", "Best For", "Style"]
|
||||||
|
},
|
||||||
|
"react": {
|
||||||
|
"file": "react-performance.csv",
|
||||||
|
"search_cols": ["Category", "Issue", "Keywords", "Description"],
|
||||||
|
"output_cols": ["Category", "Issue", "Platform", "Description", "Do", "Don't", "Code Example Good", "Code Example Bad", "Severity"]
|
||||||
|
},
|
||||||
|
"web": {
|
||||||
|
"file": "web-interface.csv",
|
||||||
|
"search_cols": ["Category", "Issue", "Keywords", "Description"],
|
||||||
|
"output_cols": ["Category", "Issue", "Platform", "Description", "Do", "Don't", "Code Example Good", "Code Example Bad", "Severity"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
STACK_CONFIG = {
|
||||||
|
"html-tailwind": {"file": "stacks/html-tailwind.csv"},
|
||||||
|
"react": {"file": "stacks/react.csv"},
|
||||||
|
"nextjs": {"file": "stacks/nextjs.csv"},
|
||||||
|
"astro": {"file": "stacks/astro.csv"},
|
||||||
|
"vue": {"file": "stacks/vue.csv"},
|
||||||
|
"nuxtjs": {"file": "stacks/nuxtjs.csv"},
|
||||||
|
"nuxt-ui": {"file": "stacks/nuxt-ui.csv"},
|
||||||
|
"svelte": {"file": "stacks/svelte.csv"},
|
||||||
|
"swiftui": {"file": "stacks/swiftui.csv"},
|
||||||
|
"react-native": {"file": "stacks/react-native.csv"},
|
||||||
|
"flutter": {"file": "stacks/flutter.csv"},
|
||||||
|
"shadcn": {"file": "stacks/shadcn.csv"},
|
||||||
|
"jetpack-compose": {"file": "stacks/jetpack-compose.csv"}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Common columns for all stacks
|
||||||
|
_STACK_COLS = {
|
||||||
|
"search_cols": ["Category", "Guideline", "Description", "Do", "Don't"],
|
||||||
|
"output_cols": ["Category", "Guideline", "Description", "Do", "Don't", "Code Good", "Code Bad", "Severity", "Docs URL"]
|
||||||
|
}
|
||||||
|
|
||||||
|
AVAILABLE_STACKS = list(STACK_CONFIG.keys())
|
||||||
|
|
||||||
|
|
||||||
|
# ============ BM25 IMPLEMENTATION ============
|
||||||
|
class BM25:
|
||||||
|
"""BM25 ranking algorithm for text search"""
|
||||||
|
|
||||||
|
def __init__(self, k1=1.5, b=0.75):
|
||||||
|
self.k1 = k1
|
||||||
|
self.b = b
|
||||||
|
self.corpus = []
|
||||||
|
self.doc_lengths = []
|
||||||
|
self.avgdl = 0
|
||||||
|
self.idf = {}
|
||||||
|
self.doc_freqs = defaultdict(int)
|
||||||
|
self.N = 0
|
||||||
|
|
||||||
|
def tokenize(self, text):
|
||||||
|
"""Lowercase, split, remove punctuation, filter short words"""
|
||||||
|
text = re.sub(r'[^\w\s]', ' ', str(text).lower())
|
||||||
|
return [w for w in text.split() if len(w) > 2]
|
||||||
|
|
||||||
|
def fit(self, documents):
|
||||||
|
"""Build BM25 index from documents"""
|
||||||
|
self.corpus = [self.tokenize(doc) for doc in documents]
|
||||||
|
self.N = len(self.corpus)
|
||||||
|
if self.N == 0:
|
||||||
|
return
|
||||||
|
self.doc_lengths = [len(doc) for doc in self.corpus]
|
||||||
|
self.avgdl = sum(self.doc_lengths) / self.N
|
||||||
|
|
||||||
|
for doc in self.corpus:
|
||||||
|
seen = set()
|
||||||
|
for word in doc:
|
||||||
|
if word not in seen:
|
||||||
|
self.doc_freqs[word] += 1
|
||||||
|
seen.add(word)
|
||||||
|
|
||||||
|
for word, freq in self.doc_freqs.items():
|
||||||
|
self.idf[word] = log((self.N - freq + 0.5) / (freq + 0.5) + 1)
|
||||||
|
|
||||||
|
def score(self, query):
|
||||||
|
"""Score all documents against query"""
|
||||||
|
query_tokens = self.tokenize(query)
|
||||||
|
scores = []
|
||||||
|
|
||||||
|
for idx, doc in enumerate(self.corpus):
|
||||||
|
score = 0
|
||||||
|
doc_len = self.doc_lengths[idx]
|
||||||
|
term_freqs = defaultdict(int)
|
||||||
|
for word in doc:
|
||||||
|
term_freqs[word] += 1
|
||||||
|
|
||||||
|
for token in query_tokens:
|
||||||
|
if token in self.idf:
|
||||||
|
tf = term_freqs[token]
|
||||||
|
idf = self.idf[token]
|
||||||
|
numerator = tf * (self.k1 + 1)
|
||||||
|
denominator = tf + self.k1 * (1 - self.b + self.b * doc_len / self.avgdl)
|
||||||
|
score += idf * numerator / denominator
|
||||||
|
|
||||||
|
scores.append((idx, score))
|
||||||
|
|
||||||
|
return sorted(scores, key=lambda x: x[1], reverse=True)
|
||||||
|
|
||||||
|
|
||||||
|
# ============ SEARCH FUNCTIONS ============
|
||||||
|
def _load_csv(filepath):
|
||||||
|
"""Load CSV and return list of dicts"""
|
||||||
|
with open(filepath, 'r', encoding='utf-8') as f:
|
||||||
|
return list(csv.DictReader(f))
|
||||||
|
|
||||||
|
|
||||||
|
def _search_csv(filepath, search_cols, output_cols, query, max_results):
|
||||||
|
"""Core search function using BM25"""
|
||||||
|
if not filepath.exists():
|
||||||
|
return []
|
||||||
|
|
||||||
|
data = _load_csv(filepath)
|
||||||
|
|
||||||
|
# Build documents from search columns
|
||||||
|
documents = [" ".join(str(row.get(col, "")) for col in search_cols) for row in data]
|
||||||
|
|
||||||
|
# BM25 search
|
||||||
|
bm25 = BM25()
|
||||||
|
bm25.fit(documents)
|
||||||
|
ranked = bm25.score(query)
|
||||||
|
|
||||||
|
# Get top results with score > 0
|
||||||
|
results = []
|
||||||
|
for idx, score in ranked[:max_results]:
|
||||||
|
if score > 0:
|
||||||
|
row = data[idx]
|
||||||
|
results.append({col: row.get(col, "") for col in output_cols if col in row})
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def detect_domain(query):
|
||||||
|
"""Auto-detect the most relevant domain from query"""
|
||||||
|
query_lower = query.lower()
|
||||||
|
|
||||||
|
domain_keywords = {
|
||||||
|
"color": ["color", "palette", "hex", "#", "rgb"],
|
||||||
|
"chart": ["chart", "graph", "visualization", "trend", "bar", "pie", "scatter", "heatmap", "funnel"],
|
||||||
|
"landing": ["landing", "page", "cta", "conversion", "hero", "testimonial", "pricing", "section"],
|
||||||
|
"product": ["saas", "ecommerce", "e-commerce", "fintech", "healthcare", "gaming", "portfolio", "crypto", "dashboard"],
|
||||||
|
"style": ["style", "design", "ui", "minimalism", "glassmorphism", "neumorphism", "brutalism", "dark mode", "flat", "aurora", "prompt", "css", "implementation", "variable", "checklist", "tailwind"],
|
||||||
|
"ux": ["ux", "usability", "accessibility", "wcag", "touch", "scroll", "animation", "keyboard", "navigation", "mobile"],
|
||||||
|
"typography": ["font", "typography", "heading", "serif", "sans"],
|
||||||
|
"icons": ["icon", "icons", "lucide", "heroicons", "symbol", "glyph", "pictogram", "svg icon"],
|
||||||
|
"react": ["react", "next.js", "nextjs", "suspense", "memo", "usecallback", "useeffect", "rerender", "bundle", "waterfall", "barrel", "dynamic import", "rsc", "server component"],
|
||||||
|
"web": ["aria", "focus", "outline", "semantic", "virtualize", "autocomplete", "form", "input type", "preconnect"]
|
||||||
|
}
|
||||||
|
|
||||||
|
scores = {domain: sum(1 for kw in keywords if kw in query_lower) for domain, keywords in domain_keywords.items()}
|
||||||
|
best = max(scores, key=scores.get)
|
||||||
|
return best if scores[best] > 0 else "style"
|
||||||
|
|
||||||
|
|
||||||
|
def search(query, domain=None, max_results=MAX_RESULTS):
|
||||||
|
"""Main search function with auto-domain detection"""
|
||||||
|
if domain is None:
|
||||||
|
domain = detect_domain(query)
|
||||||
|
|
||||||
|
config = CSV_CONFIG.get(domain, CSV_CONFIG["style"])
|
||||||
|
filepath = DATA_DIR / config["file"]
|
||||||
|
|
||||||
|
if not filepath.exists():
|
||||||
|
return {"error": f"File not found: {filepath}", "domain": domain}
|
||||||
|
|
||||||
|
results = _search_csv(filepath, config["search_cols"], config["output_cols"], query, max_results)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"domain": domain,
|
||||||
|
"query": query,
|
||||||
|
"file": config["file"],
|
||||||
|
"count": len(results),
|
||||||
|
"results": results
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def search_stack(query, stack, max_results=MAX_RESULTS):
|
||||||
|
"""Search stack-specific guidelines"""
|
||||||
|
if stack not in STACK_CONFIG:
|
||||||
|
return {"error": f"Unknown stack: {stack}. Available: {', '.join(AVAILABLE_STACKS)}"}
|
||||||
|
|
||||||
|
filepath = DATA_DIR / STACK_CONFIG[stack]["file"]
|
||||||
|
|
||||||
|
if not filepath.exists():
|
||||||
|
return {"error": f"Stack file not found: {filepath}", "stack": stack}
|
||||||
|
|
||||||
|
results = _search_csv(filepath, _STACK_COLS["search_cols"], _STACK_COLS["output_cols"], query, max_results)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"domain": "stack",
|
||||||
|
"stack": stack,
|
||||||
|
"query": query,
|
||||||
|
"file": STACK_CONFIG[stack]["file"],
|
||||||
|
"count": len(results),
|
||||||
|
"results": results
|
||||||
|
}
|
||||||
1067
.codex/skills/ui-ux-pro-max/scripts/design_system.py
Normal file
1067
.codex/skills/ui-ux-pro-max/scripts/design_system.py
Normal file
File diff suppressed because it is too large
Load Diff
114
.codex/skills/ui-ux-pro-max/scripts/search.py
Normal file
114
.codex/skills/ui-ux-pro-max/scripts/search.py
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
UI/UX Pro Max Search - BM25 search engine for UI/UX style guides
|
||||||
|
Usage: python search.py "<query>" [--domain <domain>] [--stack <stack>] [--max-results 3]
|
||||||
|
python search.py "<query>" --design-system [-p "Project Name"]
|
||||||
|
python search.py "<query>" --design-system --persist [-p "Project Name"] [--page "dashboard"]
|
||||||
|
|
||||||
|
Domains: style, prompt, color, chart, landing, product, ux, typography
|
||||||
|
Stacks: html-tailwind, react, nextjs
|
||||||
|
|
||||||
|
Persistence (Master + Overrides pattern):
|
||||||
|
--persist Save design system to design-system/MASTER.md
|
||||||
|
--page Also create a page-specific override file in design-system/pages/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import sys
|
||||||
|
import io
|
||||||
|
from core import CSV_CONFIG, AVAILABLE_STACKS, MAX_RESULTS, search, search_stack
|
||||||
|
from design_system import generate_design_system, persist_design_system
|
||||||
|
|
||||||
|
# Force UTF-8 for stdout/stderr to handle emojis on Windows (cp1252 default)
|
||||||
|
if sys.stdout.encoding and sys.stdout.encoding.lower() != 'utf-8':
|
||||||
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
|
||||||
|
if sys.stderr.encoding and sys.stderr.encoding.lower() != 'utf-8':
|
||||||
|
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
|
||||||
|
|
||||||
|
|
||||||
|
def format_output(result):
|
||||||
|
"""Format results for Claude consumption (token-optimized)"""
|
||||||
|
if "error" in result:
|
||||||
|
return f"Error: {result['error']}"
|
||||||
|
|
||||||
|
output = []
|
||||||
|
if result.get("stack"):
|
||||||
|
output.append(f"## UI Pro Max Stack Guidelines")
|
||||||
|
output.append(f"**Stack:** {result['stack']} | **Query:** {result['query']}")
|
||||||
|
else:
|
||||||
|
output.append(f"## UI Pro Max Search Results")
|
||||||
|
output.append(f"**Domain:** {result['domain']} | **Query:** {result['query']}")
|
||||||
|
output.append(f"**Source:** {result['file']} | **Found:** {result['count']} results\n")
|
||||||
|
|
||||||
|
for i, row in enumerate(result['results'], 1):
|
||||||
|
output.append(f"### Result {i}")
|
||||||
|
for key, value in row.items():
|
||||||
|
value_str = str(value)
|
||||||
|
if len(value_str) > 300:
|
||||||
|
value_str = value_str[:300] + "..."
|
||||||
|
output.append(f"- **{key}:** {value_str}")
|
||||||
|
output.append("")
|
||||||
|
|
||||||
|
return "\n".join(output)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = argparse.ArgumentParser(description="UI Pro Max Search")
|
||||||
|
parser.add_argument("query", help="Search query")
|
||||||
|
parser.add_argument("--domain", "-d", choices=list(CSV_CONFIG.keys()), help="Search domain")
|
||||||
|
parser.add_argument("--stack", "-s", choices=AVAILABLE_STACKS, help="Stack-specific search (html-tailwind, react, nextjs)")
|
||||||
|
parser.add_argument("--max-results", "-n", type=int, default=MAX_RESULTS, help="Max results (default: 3)")
|
||||||
|
parser.add_argument("--json", action="store_true", help="Output as JSON")
|
||||||
|
# Design system generation
|
||||||
|
parser.add_argument("--design-system", "-ds", action="store_true", help="Generate complete design system recommendation")
|
||||||
|
parser.add_argument("--project-name", "-p", type=str, default=None, help="Project name for design system output")
|
||||||
|
parser.add_argument("--format", "-f", choices=["ascii", "markdown"], default="ascii", help="Output format for design system")
|
||||||
|
# Persistence (Master + Overrides pattern)
|
||||||
|
parser.add_argument("--persist", action="store_true", help="Save design system to design-system/MASTER.md (creates hierarchical structure)")
|
||||||
|
parser.add_argument("--page", type=str, default=None, help="Create page-specific override file in design-system/pages/")
|
||||||
|
parser.add_argument("--output-dir", "-o", type=str, default=None, help="Output directory for persisted files (default: current directory)")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# Design system takes priority
|
||||||
|
if args.design_system:
|
||||||
|
result = generate_design_system(
|
||||||
|
args.query,
|
||||||
|
args.project_name,
|
||||||
|
args.format,
|
||||||
|
persist=args.persist,
|
||||||
|
page=args.page,
|
||||||
|
output_dir=args.output_dir
|
||||||
|
)
|
||||||
|
print(result)
|
||||||
|
|
||||||
|
# Print persistence confirmation
|
||||||
|
if args.persist:
|
||||||
|
project_slug = args.project_name.lower().replace(' ', '-') if args.project_name else "default"
|
||||||
|
print("\n" + "=" * 60)
|
||||||
|
print(f"✅ Design system persisted to design-system/{project_slug}/")
|
||||||
|
print(f" 📄 design-system/{project_slug}/MASTER.md (Global Source of Truth)")
|
||||||
|
if args.page:
|
||||||
|
page_filename = args.page.lower().replace(' ', '-')
|
||||||
|
print(f" 📄 design-system/{project_slug}/pages/{page_filename}.md (Page Overrides)")
|
||||||
|
print("")
|
||||||
|
print(f"📖 Usage: When building a page, check design-system/{project_slug}/pages/[page].md first.")
|
||||||
|
print(f" If exists, its rules override MASTER.md. Otherwise, use MASTER.md.")
|
||||||
|
print("=" * 60)
|
||||||
|
# Stack search
|
||||||
|
elif args.stack:
|
||||||
|
result = search_stack(args.query, args.stack, args.max_results)
|
||||||
|
if args.json:
|
||||||
|
import json
|
||||||
|
print(json.dumps(result, indent=2, ensure_ascii=False))
|
||||||
|
else:
|
||||||
|
print(format_output(result))
|
||||||
|
# Domain search
|
||||||
|
else:
|
||||||
|
result = search(args.query, args.domain, args.max_results)
|
||||||
|
if args.json:
|
||||||
|
import json
|
||||||
|
print(json.dumps(result, indent=2, ensure_ascii=False))
|
||||||
|
else:
|
||||||
|
print(format_output(result))
|
||||||
12
.editorconfig
Normal file
12
.editorconfig
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
14
.env
14
.env
@@ -1,21 +1,21 @@
|
|||||||
# 【通用】环境变量
|
# 【通用】环境变量
|
||||||
|
|
||||||
# 版本号
|
# 版本号
|
||||||
VITE_VERSION = 2.4.1.1
|
VITE_VERSION=2.4.1.1
|
||||||
# 端口号
|
# 端口号
|
||||||
VITE_PORT = 3006
|
VITE_PORT=3006
|
||||||
|
|
||||||
# 网站地址前缀
|
# 网站地址前缀
|
||||||
VITE_BASE_URL =
|
VITE_BASE_URL=
|
||||||
|
|
||||||
# API 地址前缀
|
# API 地址前缀
|
||||||
VITE_API_URL = https://cmp-api.boss160.cn
|
VITE_API_URL=https://cmp-api.xm-iot.cn
|
||||||
|
|
||||||
# 权限模式( frontend | backend )
|
# 权限模式( frontend | backend )
|
||||||
VITE_ACCESS_MODE = backend
|
VITE_ACCESS_MODE=backend
|
||||||
|
|
||||||
# 是否打开路由信息
|
# 是否打开路由信息
|
||||||
VITE_OPEN_ROUTE_INFO = false
|
VITE_OPEN_ROUTE_INFO=false
|
||||||
|
|
||||||
# 锁屏加密密钥
|
# 锁屏加密密钥
|
||||||
VITE_LOCK_ENCRYPT_KEY = jfsfjk1938jfj
|
VITE_LOCK_ENCRYPT_KEY=jfsfjk1938jfj
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
# 【开发】环境变量
|
# 【开发】环境变量
|
||||||
|
|
||||||
# 网站地址前缀
|
# 网站地址前缀
|
||||||
VITE_BASE_URL = /
|
VITE_BASE_URL=/
|
||||||
|
|
||||||
# API 地址前缀
|
# API 地址前缀
|
||||||
VITE_API_URL = https://cmp-api.boss160.cn
|
VITE_API_URL=https://cmp-api.boss160.cn
|
||||||
|
|
||||||
# Delete console
|
# Delete console
|
||||||
VITE_DROP_CONSOLE = false
|
VITE_DROP_CONSOLE=false
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
# 【生产】环境变量
|
# 【生产】环境变量
|
||||||
|
|
||||||
# 网站地址前缀
|
# 网站地址前缀
|
||||||
VITE_BASE_URL =
|
VITE_BASE_URL=
|
||||||
|
|
||||||
# API 地址前缀
|
# API 地址前缀
|
||||||
VITE_API_URL = https://cmp-api.boss160.cn
|
VITE_API_URL=https://cmp-api.xm-iot.cn
|
||||||
|
|
||||||
# Delete console
|
# Delete console
|
||||||
VITE_DROP_CONSOLE = true
|
VITE_DROP_CONSOLE=true
|
||||||
|
|||||||
10
.gitignore
vendored
10
.gitignore
vendored
@@ -6,6 +6,7 @@ dist-ssr
|
|||||||
*.local
|
*.local
|
||||||
.cursorrules
|
.cursorrules
|
||||||
.claude
|
.claude
|
||||||
|
.codex
|
||||||
|
|
||||||
# Environment files
|
# Environment files
|
||||||
.env
|
.env
|
||||||
@@ -20,3 +21,12 @@ dist-ssr
|
|||||||
# Logs
|
# Logs
|
||||||
*.log
|
*.log
|
||||||
npminstall-debug.log
|
npminstall-debug.log
|
||||||
|
|
||||||
|
# plan
|
||||||
|
.scratch
|
||||||
|
|
||||||
|
# ai
|
||||||
|
.agents
|
||||||
|
|
||||||
|
#build
|
||||||
|
one-pipe-system-dist.zip
|
||||||
|
|||||||
14
CLAUDE.md
14
CLAUDE.md
@@ -19,3 +19,17 @@ Use `@/openspec/AGENTS.md` to learn:
|
|||||||
Keep this managed block so 'openspec update' can refresh the instructions.
|
Keep this managed block so 'openspec update' can refresh the instructions.
|
||||||
|
|
||||||
<!-- OPENSPEC:END -->
|
<!-- OPENSPEC:END -->
|
||||||
|
|
||||||
|
## Agent skills
|
||||||
|
|
||||||
|
### Issue tracker
|
||||||
|
|
||||||
|
Issues and PRDs are tracked as local markdown files under `.scratch/`; external PRs are not a triage surface. See `docs/agents/issue-tracker.md`.
|
||||||
|
|
||||||
|
### Triage labels
|
||||||
|
|
||||||
|
Uses the default triage state vocabulary: `needs-triage`, `needs-info`, `ready-for-agent`, `ready-for-human`, `wontfix`. See `docs/agents/triage-labels.md`.
|
||||||
|
|
||||||
|
### Domain docs
|
||||||
|
|
||||||
|
Uses a single-context domain documentation layout. See `docs/agents/domain.md`.
|
||||||
|
|||||||
21
CONTEXT.md
Normal file
21
CONTEXT.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# One Pipe System
|
||||||
|
|
||||||
|
This context captures the business language used by the admin system for orders, assets, finance operations, and operational batch tasks.
|
||||||
|
|
||||||
|
## Language
|
||||||
|
|
||||||
|
**Voucher attachment**: A user-provided proof file attached to an order, refund, recharge, or operational task. Voucher attachments may contain any file type and a business record may hold multiple voucher attachment keys. _Avoid_: Voucher image, comma-separated voucher string
|
||||||
|
|
||||||
|
**Voucher key list**: The canonical representation of voucher attachment object-storage keys at the frontend and API submission boundary. Legacy single-key strings or comma-separated strings may be read and normalized for display, but new submissions use key lists. _Avoid_: Comma-separated voucher string
|
||||||
|
|
||||||
|
**Batch import file**: The structured data file that drives an asynchronous operational batch task. Unlike voucher attachments, a batch import file is constrained by the task's required template format. _Avoid_: Voucher, attachment
|
||||||
|
|
||||||
|
**Operational batch task**: An asynchronous admin task created from an uploaded batch import file and tracked through task status, counts, operator identity, and failure details. _Avoid_: Inline order operation, synchronous import
|
||||||
|
|
||||||
|
**Operational remark**: A note captured when an admin creates a financial or operational record. Operational remarks are retained for later review and are not edited after creation. _Avoid_: Editable comment, processing note
|
||||||
|
|
||||||
|
**Recharge order**: A C-side asset recharge order created when a user recharges an IoT card or device asset wallet. It is identified by `recharge_order_no`, is associated with `resource_type` and `resource_id`, and may be rejected while pending payment. _Avoid_: Agent recharge order
|
||||||
|
|
||||||
|
**Rejected recharge order**: A recharge order that an admin has rejected before payment because the recharge request should not proceed. Rejection is an irreversible terminal state and does not involve refunds. _Avoid_: Refunded recharge, closed recharge
|
||||||
|
|
||||||
|
**Agent recharge order**: A financial recharge record for an agent/shop wallet in the admin finance module. It uses a different API contract and status model from C-side recharge orders. _Avoid_: Recharge order
|
||||||
@@ -10,7 +10,7 @@ RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
|
|||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
|
|
||||||
# 安装 pnpm
|
# 安装 pnpm
|
||||||
RUN corepack enable && corepack prepare pnpm@latest --activate
|
RUN corepack enable && corepack prepare pnpm@10.15.0 --activate
|
||||||
|
|
||||||
# 设置 npm 镜像源
|
# 设置 npm 镜像源
|
||||||
RUN pnpm config set registry https://registry.npmmirror.com
|
RUN pnpm config set registry https://registry.npmmirror.com
|
||||||
@@ -25,7 +25,7 @@ RUN pnpm install --frozen-lockfile
|
|||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
# 构建生产版本(跳过类型检查,直接构建)
|
# 构建生产版本(跳过类型检查,直接构建)
|
||||||
RUN pnpm run no
|
RUN pnpm run nd
|
||||||
|
|
||||||
# ================================
|
# ================================
|
||||||
# 阶段 2: 运行阶段
|
# 阶段 2: 运行阶段
|
||||||
|
|||||||
698
PROJECT_TASKS.md
698
PROJECT_TASKS.md
@@ -1,698 +0,0 @@
|
|||||||
# 物联网管理后台 - 功能开发任务清单
|
|
||||||
|
|
||||||
## 项目概述
|
|
||||||
|
|
||||||
基于 Vue 3 + TypeScript + Element Plus 的物联网管理后台系统,管理代理商、网卡、套餐、设备等核心业务。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 模块划分
|
|
||||||
|
|
||||||
### 一、基础架构优化(必须先完成)
|
|
||||||
|
|
||||||
#### 1.1 API 层重构
|
|
||||||
|
|
||||||
**优先级:P0(最高)**
|
|
||||||
|
|
||||||
- [ ] 创建统一的 API 服务基类
|
|
||||||
- [ ] 创建类型定义文件
|
|
||||||
- [ ] `src/types/api/auth.ts` - 认证相关类型
|
|
||||||
- [ ] `src/types/api/role.ts` - 角色相关类型
|
|
||||||
- [ ] `src/types/api/account.ts` - 账号相关类型
|
|
||||||
- [ ] `src/types/api/card.ts` - 网卡相关类型
|
|
||||||
- [ ] `src/types/api/package.ts` - 套餐相关类型
|
|
||||||
- [ ] `src/types/api/device.ts` - 设备相关类型
|
|
||||||
- [ ] `src/types/api/commission.ts` - 佣金相关类型
|
|
||||||
- [ ] 创建 API 服务类
|
|
||||||
- [ ] `src/api/modules/auth.ts` - AuthService
|
|
||||||
- [ ] `src/api/modules/role.ts` - RoleService
|
|
||||||
- [ ] `src/api/modules/account.ts` - AccountService
|
|
||||||
- [ ] `src/api/modules/agent.ts` - AgentService (代理商)
|
|
||||||
- [ ] `src/api/modules/card.ts` - CardService
|
|
||||||
- [ ] `src/api/modules/package.ts` - PackageService
|
|
||||||
- [ ] `src/api/modules/device.ts` - DeviceService
|
|
||||||
- [ ] `src/api/modules/commission.ts` - CommissionService
|
|
||||||
- [ ] `src/api/modules/setting.ts` - SettingService
|
|
||||||
|
|
||||||
#### 1.2 公共配置和常量提取
|
|
||||||
|
|
||||||
**优先级:P0**
|
|
||||||
|
|
||||||
- [ ] 创建 `src/config/constants/` 目录
|
|
||||||
- [ ] `operators.ts` - 运营商配置
|
|
||||||
- [ ] `cardStatus.ts` - 网卡状态配置
|
|
||||||
- [ ] `userRoles.ts` - 用户角色配置
|
|
||||||
- [ ] `packageTypes.ts` - 套餐类型配置
|
|
||||||
- [ ] `deviceStatus.ts` - 设备状态配置
|
|
||||||
- [ ] `commissionStatus.ts` - 佣金状态配置
|
|
||||||
- [ ] 创建 `src/utils/business/` 目录
|
|
||||||
- [ ] `card.ts` - 网卡相关工具函数
|
|
||||||
- [ ] `package.ts` - 套餐相关工具函数
|
|
||||||
- [ ] `commission.ts` - 佣金计算工具函数
|
|
||||||
- [ ] `format.ts` - 格式化工具函数
|
|
||||||
|
|
||||||
#### 1.3 业务 Composables
|
|
||||||
|
|
||||||
**优先级:P0**
|
|
||||||
|
|
||||||
- [ ] `src/composables/useCardManagement.ts` - 网卡管理
|
|
||||||
- [ ] `src/composables/usePackageManagement.ts` - 套餐管理
|
|
||||||
- [ ] `src/composables/useDeviceManagement.ts` - 设备管理
|
|
||||||
- [ ] `src/composables/useAgentManagement.ts` - 代理商管理
|
|
||||||
- [ ] `src/composables/useCommission.ts` - 佣金管理
|
|
||||||
- [ ] `src/composables/usePagination.ts` - 分页管理
|
|
||||||
- [ ] `src/composables/useTableSelection.ts` - 表格选择
|
|
||||||
|
|
||||||
#### 1.4 公共业务组件
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
- [ ] `src/components/business/CardStatusTag.vue` - 网卡状态标签
|
|
||||||
- [ ] `src/components/business/OperatorSelect.vue` - 运营商选择器
|
|
||||||
- [ ] `src/components/business/PackageSelector.vue` - 套餐选择器
|
|
||||||
- [ ] `src/components/business/AgentSelector.vue` - 代理商选择器
|
|
||||||
- [ ] `src/components/business/CommissionDisplay.vue` - 佣金展示组件
|
|
||||||
- [ ] `src/components/business/BatchOperationDialog.vue` - 批量操作对话框
|
|
||||||
- [ ] `src/components/business/ImportDialog.vue` - 导入对话框组件
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 功能模块开发
|
|
||||||
|
|
||||||
### 二、认证与权限模块
|
|
||||||
|
|
||||||
#### 2.1 登录模块
|
|
||||||
|
|
||||||
**优先级:P0** **依赖:1.1 API 层重构**
|
|
||||||
|
|
||||||
- [ ] 后端接口对接
|
|
||||||
- [ ] 登录接口
|
|
||||||
- [ ] 退出登录接口
|
|
||||||
- [ ] 获取用户信息接口
|
|
||||||
- [ ] 刷新 Token 接口
|
|
||||||
- [ ] 前端页面
|
|
||||||
- [ ] 完善登录页面(`src/views/auth/login/index.vue`)
|
|
||||||
- [ ] 添加多角色登录支持(平台账号、代理商、企业客户)
|
|
||||||
- [ ] 添加验证码功能
|
|
||||||
- [ ] 添加记住密码功能
|
|
||||||
- [ ] 权限守卫
|
|
||||||
- [ ] 完善路由守卫逻辑
|
|
||||||
- [ ] 实现基于角色的路由过滤
|
|
||||||
- [ ] 实现按钮级权限控制
|
|
||||||
- [ ] Store 状态管理
|
|
||||||
- [ ] 完善用户 Store(用户信息、权限列表)
|
|
||||||
- [ ] 添加 Token 自动刷新逻辑
|
|
||||||
|
|
||||||
**Mock 数据:**
|
|
||||||
|
|
||||||
- 模拟不同角色的登录响应
|
|
||||||
- 模拟权限列表
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 三、账号管理模块
|
|
||||||
|
|
||||||
#### 3.1 平台角色管理
|
|
||||||
|
|
||||||
**优先级:P1** **依赖:1.1, 1.2, 1.3**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] 角色实体类型
|
|
||||||
- [ ] 角色查询参数类型
|
|
||||||
- [ ] 角色权限类型
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取角色列表
|
|
||||||
- [ ] 创建角色
|
|
||||||
- [ ] 编辑角色
|
|
||||||
- [ ] 删除角色
|
|
||||||
- [ ] 分配权限
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/account-management/platform-role/index.vue`
|
|
||||||
- [ ] 角色列表(表格)
|
|
||||||
- [ ] 新增/编辑角色对话框
|
|
||||||
- [ ] 权限分配对话框(树形结构)
|
|
||||||
- [ ] 组件开发
|
|
||||||
- [ ] `PermissionTreeSelect.vue` - 权限树选择组件
|
|
||||||
- [ ] Mock 数据
|
|
||||||
- [ ] 模拟角色列表
|
|
||||||
- [ ] 模拟权限树
|
|
||||||
|
|
||||||
#### 3.2 平台账号管理
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取平台账号列表
|
|
||||||
- [ ] 创建平台账号
|
|
||||||
- [ ] 编辑平台账号
|
|
||||||
- [ ] 删除/禁用平台账号
|
|
||||||
- [ ] 重置密码
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] 账号列表(支持搜索、筛选)
|
|
||||||
- [ ] 新增/编辑账号对话框
|
|
||||||
- [ ] 角色分配
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 3.3 客户角色管理
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取客户角色列表
|
|
||||||
- [ ] 创建客户角色
|
|
||||||
- [ ] 编辑客户角色
|
|
||||||
- [ ] 删除客户角色
|
|
||||||
- [ ] 设置能力边界
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] 角色列表
|
|
||||||
- [ ] 能力边界配置(功能权限、资源限制)
|
|
||||||
- [ ] 组件开发
|
|
||||||
- [ ] `AbilityBoundaryConfig.vue` - 能力边界配置组件
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 3.4 代理商管理
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] 代理商实体类型
|
|
||||||
- [ ] 代理商层级关系类型
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取代理商列表(树形结构)
|
|
||||||
- [ ] 创建代理商
|
|
||||||
- [ ] 编辑代理商信息
|
|
||||||
- [ ] 禁用/启用代理商
|
|
||||||
- [ ] 查看代理商详情
|
|
||||||
- [ ] 获取代理商下级列表
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] 代理商树形列表
|
|
||||||
- [ ] 新增/编辑代理商对话框
|
|
||||||
- [ ] 代理商详情页面
|
|
||||||
- [ ] 组件开发
|
|
||||||
- [ ] `AgentTreeTable.vue` - 代理商树形表格组件
|
|
||||||
- [ ] Mock 数据
|
|
||||||
- [ ] 模拟代理商层级数据
|
|
||||||
|
|
||||||
#### 3.5 企业客户管理
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取企业客户列表
|
|
||||||
- [ ] 创建企业客户
|
|
||||||
- [ ] 编辑企业客户
|
|
||||||
- [ ] 禁用/启用企业客户
|
|
||||||
- [ ] 分配客户角色
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/account-management/enterprise-customer/index.vue`
|
|
||||||
- [ ] 企业客户列表
|
|
||||||
- [ ] 新增/编辑企业客户对话框
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 3.6 客户账号管理
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取客户账号列表(代理商+企业客户)
|
|
||||||
- [ ] 解绑手机
|
|
||||||
- [ ] 重置密码
|
|
||||||
- [ ] 禁用/启用账号
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] 账号列表(支持筛选)
|
|
||||||
- [ ] 账号操作(解绑、重置密码等)
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 四、账户管理模块
|
|
||||||
|
|
||||||
#### 4.1 客户账户(佣金查看)
|
|
||||||
|
|
||||||
**优先级:P2**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取客户账户列表
|
|
||||||
- [ ] 查看佣金详情
|
|
||||||
- [ ] 查看提现记录
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] 客户账户列表
|
|
||||||
- [ ] 佣金详情展示
|
|
||||||
- [ ] 提现记录列表
|
|
||||||
- [ ] 组件开发
|
|
||||||
- [ ] `CommissionDetailCard.vue` - 佣金详情卡片
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 4.2 佣金提现管理
|
|
||||||
|
|
||||||
**优先级:P2**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取提现申请列表
|
|
||||||
- [ ] 审核提现申请(通过/拒绝)
|
|
||||||
- [ ] 查看提现详情
|
|
||||||
- [ ] 批量审核
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/finance-management/commission-withdrawal/index.vue`
|
|
||||||
- [ ] 提现申请列表
|
|
||||||
- [ ] 审核对话框
|
|
||||||
- [ ] 批量审核功能
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 4.3 佣金提现设置
|
|
||||||
|
|
||||||
**优先级:P2**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取提现设置
|
|
||||||
- [ ] 保存提现设置
|
|
||||||
- [ ] 查看历史设置
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/finance-management/withdrawal-setting/index.vue`
|
|
||||||
- [ ] 提现参数配置表单
|
|
||||||
- [ ] 历史设置列表
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 4.4 我的账户(佣金)
|
|
||||||
|
|
||||||
**优先级:P2**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取当前账号佣金数据
|
|
||||||
- [ ] 获取佣金明细
|
|
||||||
- [ ] 申请提现
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] 佣金概览(卡片展示,非列表)
|
|
||||||
- [ ] 佣金明细列表
|
|
||||||
- [ ] 提现申请对话框
|
|
||||||
- [ ] 组件开发
|
|
||||||
- [ ] `CommissionOverviewCard.vue` - 佣金概览卡片
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 五、我的设置模块
|
|
||||||
|
|
||||||
#### 5.1 收款商户设置
|
|
||||||
|
|
||||||
**优先级:P2**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取支付配置
|
|
||||||
- [ ] 保存支付配置
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/my-settings/payment-merchant/index.vue`
|
|
||||||
- [ ] 支付参数配置表单
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 5.2 开发能力管理
|
|
||||||
|
|
||||||
**优先级:P2**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取开发能力参数
|
|
||||||
- [ ] 生成 API Key
|
|
||||||
- [ ] 刷新 Secret
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/my-settings/dev-capability/index.vue`
|
|
||||||
- [ ] API Key 展示和管理
|
|
||||||
- [ ] 接口文档链接
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 5.3 分佣模板管理
|
|
||||||
|
|
||||||
**优先级:P2**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取分佣模板列表
|
|
||||||
- [ ] 创建分佣模板
|
|
||||||
- [ ] 编辑分佣模板
|
|
||||||
- [ ] 删除分佣模板
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/my-settings/commission-template/index.vue`
|
|
||||||
- [ ] 模板列表
|
|
||||||
- [ ] 新增/编辑模板对话框
|
|
||||||
- [ ] 分佣规则配置
|
|
||||||
- [ ] 组件开发
|
|
||||||
- [ ] `CommissionRuleConfig.vue` - 分佣规则配置组件
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 六、商品管理模块
|
|
||||||
|
|
||||||
#### 6.1 号卡管理
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取号卡商品列表
|
|
||||||
- [ ] 新增号卡商品
|
|
||||||
- [ ] 编辑号卡商品
|
|
||||||
- [ ] 删除号卡商品
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/product-management/simcard/index.vue`
|
|
||||||
- [ ] 号卡列表
|
|
||||||
- [ ] 新增/编辑号卡对话框
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 6.2 号卡分配
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取可分配号卡列表
|
|
||||||
- [ ] 分配号卡给代理
|
|
||||||
- [ ] 设置佣金模式
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/product-management/simcard-assign/index.vue`
|
|
||||||
- [ ] 号卡选择
|
|
||||||
- [ ] 代理商选择
|
|
||||||
- [ ] 佣金模式配置
|
|
||||||
- [ ] 组件开发
|
|
||||||
- [ ] `CommissionModeSelector.vue` - 佣金模式选择组件
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 6.3 套餐系列管理
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取套餐系列列表
|
|
||||||
- [ ] 新增套餐系列
|
|
||||||
- [ ] 编辑套餐系列
|
|
||||||
- [ ] 删除套餐系列
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/product-management/package-series/index.vue` (重命名 package-series)
|
|
||||||
- [ ] 系列列表
|
|
||||||
- [ ] 新增/编辑系列对话框
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 6.4 套餐管理
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取套餐列表(根据角色过滤)
|
|
||||||
- [ ] 创建套餐
|
|
||||||
- [ ] 编辑套餐
|
|
||||||
- [ ] 删除套餐
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] 套餐列表(支持角色过滤)
|
|
||||||
- [ ] 新增/编辑套餐对话框
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 6.5 套餐分配
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取可分配套餐列表
|
|
||||||
- [ ] 分配套餐给直级代理
|
|
||||||
- [ ] 设置佣金模式
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] 重构 `src/views/package-management/package-assign/index.vue`
|
|
||||||
- [ ] 套餐选择
|
|
||||||
- [ ] 直级代理选择
|
|
||||||
- [ ] 佣金模式配置
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 七、资产管理模块
|
|
||||||
|
|
||||||
#### 7.1 单卡信息查询
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 根据 ICCID 查询单卡信息
|
|
||||||
- [ ] 套餐充值
|
|
||||||
- [ ] 停复机操作
|
|
||||||
- [ ] 流量详情查询
|
|
||||||
- [ ] 更改过期时间
|
|
||||||
- [ ] 转新卡
|
|
||||||
- [ ] 停复机记录
|
|
||||||
- [ ] 往期订单
|
|
||||||
- [ ] 增减流量
|
|
||||||
- [ ] 变更钱包余额
|
|
||||||
- [ ] 充值支付密码
|
|
||||||
- [ ] 续充
|
|
||||||
- [ ] 设备操作
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] 单卡信息展示(描述列表)
|
|
||||||
- [ ] 操作按钮组
|
|
||||||
- [ ] 各类操作对话框
|
|
||||||
- [ ] 组件开发
|
|
||||||
- [ ] 复用 `CardOperationDialog.vue` 并扩展功能
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 7.2 网卡管理
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取网卡列表
|
|
||||||
- [ ] 批量操作入口
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] 网卡列表
|
|
||||||
- [ ] 批量操作按钮
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 7.3 设备管理
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取设备列表
|
|
||||||
- [ ] 查看设备卡信息
|
|
||||||
- [ ] 修改设备卡信息
|
|
||||||
- [ ] 设备相关操作
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] 拆分 `src/views/device-management/devices/index.vue` (2022行,需拆分)
|
|
||||||
- [ ] 主页面 `index.vue`
|
|
||||||
- [ ] 设备详情组件 `DeviceDetail.vue`
|
|
||||||
- [ ] 设备操作组件 `DeviceOperation.vue`
|
|
||||||
- [ ] 设备列表
|
|
||||||
- [ ] 设备详情对话框
|
|
||||||
- [ ] 设备操作对话框
|
|
||||||
- [ ] Composables
|
|
||||||
- [ ] `useDeviceManagement.ts` - 设备管理逻辑
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 7.4 资产分配
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 设备批量分配
|
|
||||||
- [ ] 网卡批量分配
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/asset-management/asset-assign/index.vue`
|
|
||||||
- [ ] 分配方式选择(设备/网卡)
|
|
||||||
- [ ] 批量导入 ICCID
|
|
||||||
- [ ] 目标代理选择
|
|
||||||
- [ ] 组件开发
|
|
||||||
- [ ] 复用 `ImportDialog.vue`
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 7.5 换卡申请
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 获取换卡申请列表
|
|
||||||
- [ ] 处理换卡申请
|
|
||||||
- [ ] 填充新 ICCID
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] 申请列表
|
|
||||||
- [ ] 处理对话框
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 八、批量操作模块
|
|
||||||
|
|
||||||
#### 8.1 网卡导入
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 批量导入 ICCID
|
|
||||||
- [ ] 查看导入任务状态
|
|
||||||
- [ ] 查看导入失败记录
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/batch-operation/card-import/index.vue`
|
|
||||||
- [ ] Excel 导入
|
|
||||||
- [ ] 任务列表
|
|
||||||
- [ ] 失败记录查看
|
|
||||||
- [ ] 组件开发
|
|
||||||
- [ ] 复用 `ImportDialog.vue`
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 8.2 设备导入
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 批量导入设备及 ICCID 关系
|
|
||||||
- [ ] 查看导入任务状态
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/batch-operation/device-import/index.vue`
|
|
||||||
- [ ] Excel 导入
|
|
||||||
- [ ] 任务列表
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 8.3 线下批量充值
|
|
||||||
|
|
||||||
**优先级:P1**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 查看批量充值记录
|
|
||||||
- [ ] Excel 批量充值导入
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] 充值记录列表
|
|
||||||
- [ ] 批量充值 Excel 导入
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
#### 8.4 换卡通知
|
|
||||||
|
|
||||||
**优先级:P2**
|
|
||||||
|
|
||||||
**子任务:**
|
|
||||||
|
|
||||||
- [ ] 类型定义
|
|
||||||
- [ ] API 服务
|
|
||||||
- [ ] 单独新建换卡通知
|
|
||||||
- [ ] 批量新建换卡通知
|
|
||||||
- [ ] 查看换卡通知记录
|
|
||||||
- [ ] 页面开发
|
|
||||||
- [ ] `src/views/batch-operation/card-change-notice/index.vue`
|
|
||||||
- [ ] 通知记录列表
|
|
||||||
- [ ] 新建通知对话框(单个/批量)
|
|
||||||
- [ ] Mock 数据
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📅 开发计划建议
|
|
||||||
|
|
||||||
### 第一阶段(1-2 周):基础架构
|
|
||||||
|
|
||||||
- 完成所有 1.x 任务(API 层、配置、Composables、公共组件)
|
|
||||||
- 完成登录模块(2.1)
|
|
||||||
|
|
||||||
### 第二阶段(2-3 周):账号管理
|
|
||||||
|
|
||||||
- 完成账号管理模块所有功能(3.1-3.6)
|
|
||||||
|
|
||||||
### 第三阶段(2 周):商品管理
|
|
||||||
|
|
||||||
- 完成商品管理模块(6.1-6.5)
|
|
||||||
|
|
||||||
### 第四阶段(2-3 周):资产管理
|
|
||||||
|
|
||||||
- 完成资产管理模块(7.1-7.5)
|
|
||||||
|
|
||||||
### 第五阶段(1-2 周):账户管理 + 我的设置
|
|
||||||
|
|
||||||
- 完成账户管理模块(4.1-4.4)
|
|
||||||
- 完成我的设置模块(5.1-5.3)
|
|
||||||
|
|
||||||
### 第六阶段(1-2 周):批量操作 + 优化
|
|
||||||
|
|
||||||
- 完成批量操作模块(8.1-8.4)
|
|
||||||
- 性能优化、测试、Bug 修复
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📌 注意事项
|
|
||||||
|
|
||||||
1. **所有模块先用 Mock 数据开发,便于前后端并行开发**
|
|
||||||
2. **严格遵循组件化原则,提高代码复用率**
|
|
||||||
3. **使用 TypeScript 严格类型,减少运行时错误**
|
|
||||||
4. **每个模块完成后进行代码审查**
|
|
||||||
5. **关键功能需要编写单元测试**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔗 相关文档
|
|
||||||
|
|
||||||
- [项目架构文档](./openspec/project.md)
|
|
||||||
- [API 规范文档](待创建)
|
|
||||||
- [组件使用文档](待创建)
|
|
||||||
1
components.d.ts
vendored
1
components.d.ts
vendored
@@ -14,7 +14,6 @@ declare module 'vue' {
|
|||||||
ArtBreadcrumb: typeof import('./src/components/core/layouts/art-breadcrumb/index.vue')['default']
|
ArtBreadcrumb: typeof import('./src/components/core/layouts/art-breadcrumb/index.vue')['default']
|
||||||
ArtButtonMore: typeof import('./src/components/core/forms/ArtButtonMore.vue')['default']
|
ArtButtonMore: typeof import('./src/components/core/forms/ArtButtonMore.vue')['default']
|
||||||
ArtButtonTable: typeof import('./src/components/core/forms/ArtButtonTable.vue')['default']
|
ArtButtonTable: typeof import('./src/components/core/forms/ArtButtonTable.vue')['default']
|
||||||
ArtCardBanner: typeof import('./src/components/core/banners/ArtCardBanner.vue')['default']
|
|
||||||
ArtChatWindow: typeof import('./src/components/core/layouts/art-chat-window/index.vue')['default']
|
ArtChatWindow: typeof import('./src/components/core/layouts/art-chat-window/index.vue')['default']
|
||||||
ArtCutterImg: typeof import('./src/components/core/media/ArtCutterImg.vue')['default']
|
ArtCutterImg: typeof import('./src/components/core/media/ArtCutterImg.vue')['default']
|
||||||
ArtDataListCard: typeof import('./src/components/core/cards/ArtDataListCard.vue')['default']
|
ArtDataListCard: typeof import('./src/components/core/cards/ArtDataListCard.vue')['default']
|
||||||
|
|||||||
343
docs/API对接说明.md
343
docs/API对接说明.md
@@ -1,343 +0,0 @@
|
|||||||
# API 对接说明
|
|
||||||
|
|
||||||
> 更新时间: 2026-01-09
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ 已完成的修改
|
|
||||||
|
|
||||||
### 1. 创建了认证 API 服务
|
|
||||||
**文件**: `src/api/authApi.ts`
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { AuthService } from '@/api/authApi'
|
|
||||||
|
|
||||||
// 登录
|
|
||||||
AuthService.login({ username, password, remember })
|
|
||||||
|
|
||||||
// 获取用户信息
|
|
||||||
AuthService.getUserInfo()
|
|
||||||
|
|
||||||
// 登出
|
|
||||||
AuthService.logout()
|
|
||||||
|
|
||||||
// 刷新Token
|
|
||||||
AuthService.refreshToken(refreshToken)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 修改了登录逻辑
|
|
||||||
**文件**: `src/composables/useLogin.ts`
|
|
||||||
|
|
||||||
**关键修改**:
|
|
||||||
- ✅ 添加了 `USE_MOCK` 开关(第 29 行)
|
|
||||||
- ✅ 创建了 `handleRealLogin()` 真实API登录函数
|
|
||||||
- ✅ 保留了 `handleMockLogin()` Mock登录函数(方便开发测试)
|
|
||||||
|
|
||||||
**切换方式**:
|
|
||||||
```typescript
|
|
||||||
// 文件: src/composables/useLogin.ts 第 29 行
|
|
||||||
|
|
||||||
// 使用 Mock 数据(开发测试)
|
|
||||||
const USE_MOCK = true
|
|
||||||
|
|
||||||
// 使用真实 API(生产环境)
|
|
||||||
const USE_MOCK = false // ← 当前设置
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔌 API 接口规范
|
|
||||||
|
|
||||||
### 登录接口
|
|
||||||
|
|
||||||
**请求地址**: `POST /api/auth/login`
|
|
||||||
|
|
||||||
**请求参数**:
|
|
||||||
```typescript
|
|
||||||
{
|
|
||||||
username: string // 用户名
|
|
||||||
password: string // 密码
|
|
||||||
remember?: boolean // 是否记住密码
|
|
||||||
captcha?: string // 验证码(可选)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**响应格式**:
|
|
||||||
```typescript
|
|
||||||
{
|
|
||||||
code: number // 状态码:200 成功
|
|
||||||
message: string // 消息
|
|
||||||
data: {
|
|
||||||
token: string // 访问令牌 (必需)
|
|
||||||
refreshToken?: string // 刷新令牌 (可选)
|
|
||||||
expiresIn?: number // 过期时间(秒) (可选)
|
|
||||||
userInfo: { // 用户信息 (推荐返回,避免二次请求)
|
|
||||||
id: string | number
|
|
||||||
username: string
|
|
||||||
realName: string
|
|
||||||
roles: string[] // 角色列表 ['R_SUPER', 'R_ADMIN', ...]
|
|
||||||
permissions: string[] // 权限列表 ['*:*:*', 'user:edit', ...]
|
|
||||||
avatar?: string
|
|
||||||
email?: string
|
|
||||||
phone?: string
|
|
||||||
// ... 其他用户信息
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 获取用户信息接口
|
|
||||||
|
|
||||||
**请求地址**: `GET /api/auth/userInfo`
|
|
||||||
|
|
||||||
**请求头**:
|
|
||||||
```
|
|
||||||
Authorization: Bearer {token}
|
|
||||||
```
|
|
||||||
|
|
||||||
**响应格式**:
|
|
||||||
```typescript
|
|
||||||
{
|
|
||||||
code: 200,
|
|
||||||
message: 'success',
|
|
||||||
data: {
|
|
||||||
id: string | number
|
|
||||||
username: string
|
|
||||||
realName: string
|
|
||||||
roles: string[]
|
|
||||||
permissions: string[]
|
|
||||||
avatar?: string
|
|
||||||
email?: string
|
|
||||||
phone?: string
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔐 权限控制说明
|
|
||||||
|
|
||||||
### 角色定义
|
|
||||||
系统预定义了以下角色(可根据需求调整):
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
enum UserRole {
|
|
||||||
SUPER_ADMIN = 'R_SUPER', // 超级管理员
|
|
||||||
ADMIN = 'R_ADMIN', // 管理员
|
|
||||||
AGENT = 'R_AGENT', // 代理商
|
|
||||||
ENTERPRISE = 'R_ENTERPRISE' // 企业客户
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 权限格式
|
|
||||||
权限使用通配符格式:`模块:操作:范围`
|
|
||||||
|
|
||||||
**示例**:
|
|
||||||
- `*:*:*` - 所有权限
|
|
||||||
- `user:*:*` - 用户模块所有权限
|
|
||||||
- `user:edit:*` - 用户编辑权限
|
|
||||||
- `card:view:own` - 查看自己的卡
|
|
||||||
|
|
||||||
### 前端权限验证
|
|
||||||
|
|
||||||
**路由级权限**(在 `asyncRoutes.ts` 中配置):
|
|
||||||
```typescript
|
|
||||||
{
|
|
||||||
path: '/system/user',
|
|
||||||
meta: {
|
|
||||||
roles: ['R_SUPER', 'R_ADMIN'] // 只有超管和管理员可访问
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**按钮级权限**(使用 `v-auth` 指令):
|
|
||||||
```vue
|
|
||||||
<el-button v-auth="'user:edit'">编辑</el-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 状态码规范
|
|
||||||
|
|
||||||
**推荐使用的状态码** (已在 `src/utils/http/status.ts` 定义):
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
export enum ApiStatus {
|
|
||||||
success = 200, // 成功
|
|
||||||
unauthorized = 401, // 未授权
|
|
||||||
forbidden = 403, // 禁止访问
|
|
||||||
notFound = 404, // 未找到
|
|
||||||
serverError = 500 // 服务器错误
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 快速上手
|
|
||||||
|
|
||||||
### 1. 配置API地址
|
|
||||||
|
|
||||||
**文件**: `.env.development`
|
|
||||||
|
|
||||||
```env
|
|
||||||
# API 地址前缀
|
|
||||||
VITE_API_URL = http://your-backend-api.com
|
|
||||||
|
|
||||||
# 或者使用代理(推荐)
|
|
||||||
VITE_API_URL = /api
|
|
||||||
```
|
|
||||||
|
|
||||||
**文件**: `vite.config.ts` (如果使用代理)
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
server: {
|
|
||||||
proxy: {
|
|
||||||
'/api': {
|
|
||||||
target: 'http://your-backend-api.com', // 后端地址
|
|
||||||
changeOrigin: true,
|
|
||||||
rewrite: (path) => path.replace(/^\/api/, '')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 切换到真实API
|
|
||||||
|
|
||||||
**文件**: `src/composables/useLogin.ts` 第 29 行
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
const USE_MOCK = false // 改为 false
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. 测试登录
|
|
||||||
|
|
||||||
1. 启动开发服务器:`npm run dev`
|
|
||||||
2. 访问登录页面:`http://localhost:3006/#/auth/login`
|
|
||||||
3. 输入后端提供的测试账号密码
|
|
||||||
4. 点击登录
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 调试技巧
|
|
||||||
|
|
||||||
### 1. 查看请求/响应
|
|
||||||
|
|
||||||
打开浏览器开发者工具(F12)→ Network 标签,查看:
|
|
||||||
- 请求URL
|
|
||||||
- 请求参数
|
|
||||||
- 响应数据
|
|
||||||
- 状态码
|
|
||||||
|
|
||||||
### 2. Mock 和真实API切换
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
// src/composables/useLogin.ts
|
|
||||||
|
|
||||||
const USE_MOCK = true // 开发时使用 Mock
|
|
||||||
const USE_MOCK = false // 对接时使用真实 API
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Token 检查
|
|
||||||
|
|
||||||
打开浏览器控制台(F12)→ Application → Local Storage → 查看 `user` 键:
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"isLogin": true,
|
|
||||||
"accessToken": "your-token-here",
|
|
||||||
"info": { ... }
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. 请求拦截器日志
|
|
||||||
|
|
||||||
**文件**: `src/utils/http/interceptors.ts`
|
|
||||||
|
|
||||||
已自动添加请求/响应日志,在控制台可以看到:
|
|
||||||
- 🚀 发送请求
|
|
||||||
- ✅ 请求成功
|
|
||||||
- ❌ 请求失败
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ⚠️ 常见问题
|
|
||||||
|
|
||||||
### Q1: 登录后提示"获取用户角色失败"
|
|
||||||
|
|
||||||
**原因**: 后端返回的用户信息中没有 `roles` 字段
|
|
||||||
|
|
||||||
**解决**:
|
|
||||||
1. 确保后端返回的 `userInfo.roles` 是数组
|
|
||||||
2. 至少包含一个角色,如:`["R_ADMIN"]`
|
|
||||||
|
|
||||||
### Q2: 登录成功但页面一直转圈
|
|
||||||
|
|
||||||
**原因**: 路由守卫中没有通过权限验证
|
|
||||||
|
|
||||||
**解决**:
|
|
||||||
1. 检查用户信息中是否有 `roles` 字段
|
|
||||||
2. 临时开启开发模式跳过权限验证(见下文)
|
|
||||||
|
|
||||||
### Q3: 如何临时跳过权限验证?
|
|
||||||
|
|
||||||
**文件**: `src/router/guards/beforeEach.ts` 第 28 行
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
const DEV_MODE_SKIP_AUTH = true // 改为 true,跳过所有权限验证
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q4: Token 过期如何处理?
|
|
||||||
|
|
||||||
系统已自动处理 Token 过期:
|
|
||||||
1. 检测到 401 状态码自动跳转登录页
|
|
||||||
2. 可实现自动刷新 Token(需要后端支持)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 后端接口开发建议
|
|
||||||
|
|
||||||
### 1. 登录接口返回完整用户信息
|
|
||||||
避免前端登录后再次调用获取用户信息接口,减少请求次数。
|
|
||||||
|
|
||||||
### 2. 用户信息必须包含 roles
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"roles": ["R_ADMIN", "R_USER"] // 必须
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. 支持 Token 刷新机制
|
|
||||||
```typescript
|
|
||||||
// 刷新Token接口
|
|
||||||
POST /api/auth/refresh
|
|
||||||
{
|
|
||||||
"refreshToken": "refresh-token-here"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. 统一响应格式
|
|
||||||
```typescript
|
|
||||||
{
|
|
||||||
code: 200,
|
|
||||||
message: "success",
|
|
||||||
data: { ... }
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✨ 下一步
|
|
||||||
|
|
||||||
1. ✅ 后端提供测试环境API地址
|
|
||||||
2. ✅ 配置 `VITE_API_URL` 或代理
|
|
||||||
3. ✅ 切换 `USE_MOCK = false`
|
|
||||||
4. ✅ 测试登录功能
|
|
||||||
5. ✅ 根据实际API调整请求/响应格式
|
|
||||||
6. ✅ 完善其他业务接口
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**联系支持**:
|
|
||||||
- 前端问题:查看本文档或项目 README
|
|
||||||
- 后端对接:与后端开发人员沟通接口格式
|
|
||||||
|
|
||||||
祝对接顺利!🚀
|
|
||||||
@@ -1,244 +0,0 @@
|
|||||||
# 登录模块说明文档
|
|
||||||
|
|
||||||
## 概述
|
|
||||||
|
|
||||||
本项目的登录模块已完成重构,采用了全新的架构设计,提供了完整的认证流程和权限管理功能。
|
|
||||||
|
|
||||||
## 功能特性
|
|
||||||
|
|
||||||
### 1. Mock 数据支持
|
|
||||||
|
|
||||||
系统内置了 4 个 Mock 账号,用于开发和演示:
|
|
||||||
|
|
||||||
| 账号类型 | 用户名 | 密码 | 角色 | 权限说明 |
|
|
||||||
|---------|--------|------|------|---------|
|
|
||||||
| 超级管理员 | super | 123456 | SUPER_ADMIN | 拥有所有权限 |
|
|
||||||
| 平台管理员 | admin | 123456 | ADMIN | 账号、网卡、套餐、设备等管理权限 |
|
|
||||||
| 代理商 | agent | 123456 | AGENT | 网卡查看/操作、佣金管理等权限 |
|
|
||||||
| 企业客户 | enterprise | 123456 | ENTERPRISE | 自有网卡和设备的查看/操作权限 |
|
|
||||||
|
|
||||||
**文件位置**: `src/mock/auth.ts`
|
|
||||||
|
|
||||||
### 2. 记住密码功能
|
|
||||||
|
|
||||||
- 用户可以勾选"记住密码"选项
|
|
||||||
- 登录成功后,用户名和密码会被加密存储到 localStorage
|
|
||||||
- 下次访问登录页时自动填充账号信息
|
|
||||||
- 取消勾选会清除已保存的凭证
|
|
||||||
|
|
||||||
**实现文件**: `src/utils/auth/rememberPassword.ts`
|
|
||||||
|
|
||||||
**核心函数**:
|
|
||||||
```typescript
|
|
||||||
// 保存凭证
|
|
||||||
saveCredentials(username, password, remember)
|
|
||||||
|
|
||||||
// 获取保存的凭证
|
|
||||||
getRememberedCredentials()
|
|
||||||
|
|
||||||
// 清除凭证
|
|
||||||
clearRememberedCredentials()
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. 完善的表单验证
|
|
||||||
|
|
||||||
提供了多种验证规则,适用于不同场景:
|
|
||||||
|
|
||||||
- **用户名验证**: 3-20个字符,只能包含字母、数字和下划线
|
|
||||||
- **密码验证**: 6-20个字符
|
|
||||||
- **强密码验证**: 8-20个字符,必须包含大小写字母和数字
|
|
||||||
- **确认密码验证**: 必须与密码一致
|
|
||||||
- **手机号验证**: 支持中国大陆手机号格式
|
|
||||||
- **邮箱验证**: 标准邮箱格式验证
|
|
||||||
- **验证码验证**: 4位数字
|
|
||||||
|
|
||||||
**实现文件**: `src/utils/auth/loginValidation.ts`
|
|
||||||
|
|
||||||
**使用示例**:
|
|
||||||
```typescript
|
|
||||||
import { usernameRules, passwordRules } from '@/utils/auth/loginValidation'
|
|
||||||
|
|
||||||
const rules = {
|
|
||||||
username: usernameRules(t),
|
|
||||||
password: passwordRules(t)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. 权限路由守卫
|
|
||||||
|
|
||||||
优化了路由守卫,增加了以下功能:
|
|
||||||
|
|
||||||
#### 白名单机制
|
|
||||||
不需要登录即可访问的路由:
|
|
||||||
- `/login` - 登录页
|
|
||||||
- `/register` - 注册页
|
|
||||||
- `/forget-password` - 忘记密码
|
|
||||||
- `/exception/*` - 异常页面
|
|
||||||
|
|
||||||
**文件位置**: `src/router/guards/permission.ts`
|
|
||||||
|
|
||||||
#### Token 验证
|
|
||||||
- 自动检查 Token 是否存在
|
|
||||||
- 验证 Token 是否有效
|
|
||||||
- Token 过期自动跳转到登录页
|
|
||||||
|
|
||||||
#### 页面级权限验证
|
|
||||||
- 根据路由 meta 中的 `roles` 和 `permissions` 进行验证
|
|
||||||
- 无权限访问时自动跳转到 403 页面
|
|
||||||
- 支持通配符权限(如 `*:*:*` 表示所有权限)
|
|
||||||
|
|
||||||
#### 登录重定向
|
|
||||||
- 访问需要登录的页面时,会记录当前路径
|
|
||||||
- 登录成功后自动跳转回之前访问的页面
|
|
||||||
- 如果是白名单路由,则跳转到首页
|
|
||||||
|
|
||||||
**核心函数**:
|
|
||||||
```typescript
|
|
||||||
// 检查是否在白名单
|
|
||||||
isInWhiteList(path)
|
|
||||||
|
|
||||||
// 检查路由权限
|
|
||||||
hasRoutePermission(route, userInfo)
|
|
||||||
|
|
||||||
// 检查 Token 是否有效
|
|
||||||
isTokenValid(token)
|
|
||||||
|
|
||||||
// 构建登录重定向URL
|
|
||||||
buildLoginRedirect(currentPath)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5. useLogin Composable
|
|
||||||
|
|
||||||
将登录逻辑抽取为可复用的 Composable,提高代码可维护性。
|
|
||||||
|
|
||||||
**文件位置**: `src/composables/useLogin.ts`
|
|
||||||
|
|
||||||
**提供的功能**:
|
|
||||||
- 表单状态管理
|
|
||||||
- Mock 账号切换
|
|
||||||
- 登录逻辑处理
|
|
||||||
- 自动记住密码
|
|
||||||
- 登录成功通知
|
|
||||||
- 重定向处理
|
|
||||||
|
|
||||||
**使用示例**:
|
|
||||||
```vue
|
|
||||||
<script setup>
|
|
||||||
import { useLogin } from '@/composables/useLogin'
|
|
||||||
|
|
||||||
const {
|
|
||||||
formRef,
|
|
||||||
formData,
|
|
||||||
rules,
|
|
||||||
loading,
|
|
||||||
mockAccounts,
|
|
||||||
setupAccount,
|
|
||||||
handleLogin
|
|
||||||
} = useLogin()
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 文件结构
|
|
||||||
|
|
||||||
```
|
|
||||||
src/
|
|
||||||
├── mock/
|
|
||||||
│ └── auth.ts # Mock 账号数据
|
|
||||||
├── utils/auth/
|
|
||||||
│ ├── rememberPassword.ts # 记住密码工具
|
|
||||||
│ ├── loginValidation.ts # 表单验证规则
|
|
||||||
│ └── index.ts # 统一导出
|
|
||||||
├── router/guards/
|
|
||||||
│ ├── permission.ts # 权限验证工具
|
|
||||||
│ ├── beforeEach.ts # 路由前置守卫(已优化)
|
|
||||||
│ └── afterEach.ts # 路由后置守卫
|
|
||||||
├── composables/
|
|
||||||
│ └── useLogin.ts # 登录逻辑 Composable
|
|
||||||
└── views/auth/login/
|
|
||||||
└── index.vue # 登录页面(已重构)
|
|
||||||
```
|
|
||||||
|
|
||||||
## 权限配置示例
|
|
||||||
|
|
||||||
### 路由权限配置
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
// 在路由配置中添加 meta
|
|
||||||
{
|
|
||||||
path: '/account/platform',
|
|
||||||
meta: {
|
|
||||||
title: '平台账号管理',
|
|
||||||
roles: ['R_SUPER', 'R_ADMIN'], // 允许的角色
|
|
||||||
permissions: ['account:view:*'] // 需要的权限
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 用户权限定义
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
// 用户信息中包含角色和权限
|
|
||||||
{
|
|
||||||
roles: ['R_ADMIN'],
|
|
||||||
permissions: [
|
|
||||||
'account:*:*', // 账号管理所有权限
|
|
||||||
'card:view:*', // 网卡查看权限
|
|
||||||
'card:operation:*' // 网卡操作权限
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 开发建议
|
|
||||||
|
|
||||||
### 1. 切换到真实接口
|
|
||||||
|
|
||||||
当后端接口就绪后,只需修改 `useLogin.ts` 中的登录逻辑:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
// 将 Mock 登录替换为真实 API
|
|
||||||
// const loginResult = mockLogin(formData.username, formData.password)
|
|
||||||
const loginResult = await AuthService.login({
|
|
||||||
username: formData.username,
|
|
||||||
password: formData.password
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Token 刷新
|
|
||||||
|
|
||||||
在 `src/router/guards/permission.ts` 的 `isTokenValid` 函数中添加真实的 JWT 验证逻辑。
|
|
||||||
|
|
||||||
### 3. 权限粒度
|
|
||||||
|
|
||||||
根据实际业务需求,可以在以下层级添加权限验证:
|
|
||||||
- **路由级**: 在路由 meta 中配置
|
|
||||||
- **页面级**: 在页面组件中使用 v-if 判断
|
|
||||||
- **按钮级**: 使用自定义指令(如 `v-permission`)
|
|
||||||
|
|
||||||
## 常见问题
|
|
||||||
|
|
||||||
### Q1: 如何添加新的 Mock 账号?
|
|
||||||
|
|
||||||
编辑 `src/mock/auth.ts`,在 `MOCK_ACCOUNTS` 数组中添加新账号即可。
|
|
||||||
|
|
||||||
### Q2: 记住密码的数据存在哪里?
|
|
||||||
|
|
||||||
存储在浏览器的 localStorage 中,key 为 `remembered_credentials`,数据经过 Base64 编码。
|
|
||||||
|
|
||||||
### Q3: 如何自定义白名单路由?
|
|
||||||
|
|
||||||
编辑 `src/router/guards/permission.ts` 的 `LOGIN_WHITE_LIST` 数组。
|
|
||||||
|
|
||||||
### Q4: 为什么登录后还是跳转到登录页?
|
|
||||||
|
|
||||||
检查以下几点:
|
|
||||||
1. Token 是否正确保存到 store
|
|
||||||
2. `userStore.isLogin` 是否设置为 true
|
|
||||||
3. 路由守卫中的权限验证是否通过
|
|
||||||
|
|
||||||
## 下一步计划
|
|
||||||
|
|
||||||
- [ ] 添加双因素认证(2FA)
|
|
||||||
- [ ] 实现 SSO 单点登录
|
|
||||||
- [ ] 添加第三方登录(微信、钉钉等)
|
|
||||||
- [ ] 完善密码强度检测
|
|
||||||
- [ ] 添加登录日志记录
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
touch README.md
|
|
||||||
git init
|
|
||||||
git checkout -b main
|
|
||||||
git add README.md
|
|
||||||
git commit -m "first commit"
|
|
||||||
git remote add origin https://git.boss160.cn/luo/one-pipe-system.git
|
|
||||||
git push -u origin main
|
|
||||||
|
|
||||||
你需要注意下.gitignore 是否需要加一些文件进去
|
|
||||||
870
docs/代理账号管理.md
870
docs/代理账号管理.md
@@ -1,870 +0,0 @@
|
|||||||
# 账号管理下面新增一个代理账号管理, 页面样式可以参考/system/account 都需要token认证
|
|
||||||
|
|
||||||
# 代理账号列表
|
|
||||||
|
|
||||||
## OpenAPI Specification
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
openapi: 3.0.1
|
|
||||||
info:
|
|
||||||
title: ''
|
|
||||||
description: ''
|
|
||||||
version: 1.0.0
|
|
||||||
paths:
|
|
||||||
/api/admin/shop-accounts:
|
|
||||||
get:
|
|
||||||
summary: 代理账号列表
|
|
||||||
deprecated: false
|
|
||||||
description: ''
|
|
||||||
tags:
|
|
||||||
- 代理账号管理
|
|
||||||
- 代理账号管理
|
|
||||||
parameters:
|
|
||||||
- name: page
|
|
||||||
in: query
|
|
||||||
description: 页码
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
description: 页码
|
|
||||||
minimum: 1
|
|
||||||
type: integer
|
|
||||||
- name: page_size
|
|
||||||
in: query
|
|
||||||
description: 每页数量
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
description: 每页数量
|
|
||||||
maximum: 100
|
|
||||||
minimum: 1
|
|
||||||
type: integer
|
|
||||||
- name: shop_id
|
|
||||||
in: query
|
|
||||||
description: 店铺ID过滤
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
description: 店铺ID过滤
|
|
||||||
minimum: 1
|
|
||||||
type: integer
|
|
||||||
nullable: true
|
|
||||||
- name: username
|
|
||||||
in: query
|
|
||||||
description: 用户名(模糊查询)
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
description: 用户名(模糊查询)
|
|
||||||
maxLength: 50
|
|
||||||
type: string
|
|
||||||
- name: phone
|
|
||||||
in: query
|
|
||||||
description: 手机号(精确查询)
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
description: 手机号(精确查询)
|
|
||||||
maxLength: 11
|
|
||||||
minLength: 11
|
|
||||||
type: string
|
|
||||||
- name: status
|
|
||||||
in: query
|
|
||||||
description: 状态 (0:禁用, 1:启用)
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
description: 状态 (0:禁用, 1:启用)
|
|
||||||
type: integer
|
|
||||||
nullable: true
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: OK
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ModelShopAccountPageResult'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'400':
|
|
||||||
description: 请求参数错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: &ref_0
|
|
||||||
$ref: '#/components/schemas/ErrorResponse'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'401':
|
|
||||||
description: 未认证或认证已过期
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'403':
|
|
||||||
description: 无权访问
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'500':
|
|
||||||
description: 服务器内部错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
security:
|
|
||||||
- BearerAuth: []
|
|
||||||
x-apifox:
|
|
||||||
schemeGroups:
|
|
||||||
- id: '-jWpeN1-jYBl-SEBTmsrq'
|
|
||||||
schemeIds:
|
|
||||||
- BearerAuth
|
|
||||||
required: true
|
|
||||||
use:
|
|
||||||
id: '-jWpeN1-jYBl-SEBTmsrq'
|
|
||||||
scopes:
|
|
||||||
'-jWpeN1-jYBl-SEBTmsrq':
|
|
||||||
BearerAuth: []
|
|
||||||
x-apifox-folder: 代理账号管理
|
|
||||||
x-apifox-status: released
|
|
||||||
x-run-in-apifox: https://app.apifox.com/web/project/7591618/apis/api-408366334-run
|
|
||||||
components:
|
|
||||||
schemas:
|
|
||||||
ModelShopAccountPageResult:
|
|
||||||
properties:
|
|
||||||
items:
|
|
||||||
description: 代理账号列表
|
|
||||||
items:
|
|
||||||
$ref: '#/components/schemas/ModelShopAccountResponse'
|
|
||||||
type: array
|
|
||||||
nullable: true
|
|
||||||
page:
|
|
||||||
description: 当前页码
|
|
||||||
type: integer
|
|
||||||
size:
|
|
||||||
description: 每页数量
|
|
||||||
type: integer
|
|
||||||
total:
|
|
||||||
description: 总记录数
|
|
||||||
type: integer
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- items
|
|
||||||
- page
|
|
||||||
- size
|
|
||||||
- total
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ModelShopAccountResponse:
|
|
||||||
properties:
|
|
||||||
created_at:
|
|
||||||
description: 创建时间
|
|
||||||
type: string
|
|
||||||
id:
|
|
||||||
description: 账号ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
phone:
|
|
||||||
description: 手机号
|
|
||||||
type: string
|
|
||||||
shop_id:
|
|
||||||
description: 店铺ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
shop_name:
|
|
||||||
description: 店铺名称
|
|
||||||
type: string
|
|
||||||
status:
|
|
||||||
description: 状态 (0:禁用, 1:启用)
|
|
||||||
type: integer
|
|
||||||
updated_at:
|
|
||||||
description: 更新时间
|
|
||||||
type: string
|
|
||||||
user_type:
|
|
||||||
description: 用户类型 (1:超级管理员, 2:平台用户, 3:代理账号, 4:企业账号)
|
|
||||||
type: integer
|
|
||||||
username:
|
|
||||||
description: 用户名
|
|
||||||
type: string
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- created_at
|
|
||||||
- id
|
|
||||||
- phone
|
|
||||||
- shop_id
|
|
||||||
- shop_name
|
|
||||||
- status
|
|
||||||
- updated_at
|
|
||||||
- user_type
|
|
||||||
- username
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ErrorResponse:
|
|
||||||
properties:
|
|
||||||
code:
|
|
||||||
description: 错误码
|
|
||||||
type: integer
|
|
||||||
message:
|
|
||||||
description: 错误消息
|
|
||||||
type: string
|
|
||||||
timestamp:
|
|
||||||
description: 时间戳
|
|
||||||
format: date-time
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
securitySchemes:
|
|
||||||
BearerAuth:
|
|
||||||
bearerFormat: JWT
|
|
||||||
scheme: bearer
|
|
||||||
type: jwt
|
|
||||||
servers:
|
|
||||||
- url: https://cmp-api.boss160.cn
|
|
||||||
description: 测试环境
|
|
||||||
security: []
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
# 创建代理账号
|
|
||||||
|
|
||||||
## OpenAPI Specification
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
openapi: 3.0.1
|
|
||||||
info:
|
|
||||||
title: ''
|
|
||||||
description: ''
|
|
||||||
version: 1.0.0
|
|
||||||
paths:
|
|
||||||
/api/admin/shop-accounts:
|
|
||||||
post:
|
|
||||||
summary: 创建代理账号
|
|
||||||
deprecated: false
|
|
||||||
description: ''
|
|
||||||
tags:
|
|
||||||
- 代理账号管理
|
|
||||||
- 代理账号管理
|
|
||||||
parameters: []
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ModelCreateShopAccountRequest'
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: OK
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ModelShopAccountResponse'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'400':
|
|
||||||
description: 请求参数错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: &ref_0
|
|
||||||
$ref: '#/components/schemas/ErrorResponse'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'401':
|
|
||||||
description: 未认证或认证已过期
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'403':
|
|
||||||
description: 无权访问
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'500':
|
|
||||||
description: 服务器内部错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
security:
|
|
||||||
- BearerAuth: []
|
|
||||||
x-apifox:
|
|
||||||
schemeGroups:
|
|
||||||
- id: LdX0-6IzkTw-pXBT8t4Km
|
|
||||||
schemeIds:
|
|
||||||
- BearerAuth
|
|
||||||
required: true
|
|
||||||
use:
|
|
||||||
id: LdX0-6IzkTw-pXBT8t4Km
|
|
||||||
scopes:
|
|
||||||
LdX0-6IzkTw-pXBT8t4Km:
|
|
||||||
BearerAuth: []
|
|
||||||
x-apifox-folder: 代理账号管理
|
|
||||||
x-apifox-status: released
|
|
||||||
x-run-in-apifox: https://app.apifox.com/web/project/7591618/apis/api-408366335-run
|
|
||||||
components:
|
|
||||||
schemas:
|
|
||||||
ModelCreateShopAccountRequest:
|
|
||||||
properties:
|
|
||||||
password:
|
|
||||||
description: 密码
|
|
||||||
maxLength: 32
|
|
||||||
minLength: 8
|
|
||||||
type: string
|
|
||||||
phone:
|
|
||||||
description: 手机号
|
|
||||||
maxLength: 11
|
|
||||||
minLength: 11
|
|
||||||
type: string
|
|
||||||
shop_id:
|
|
||||||
description: 店铺ID
|
|
||||||
minimum: 1
|
|
||||||
type: integer
|
|
||||||
username:
|
|
||||||
description: 用户名
|
|
||||||
maxLength: 50
|
|
||||||
minLength: 3
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- password
|
|
||||||
- phone
|
|
||||||
- shop_id
|
|
||||||
- username
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- password
|
|
||||||
- phone
|
|
||||||
- shop_id
|
|
||||||
- username
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ModelShopAccountResponse:
|
|
||||||
properties:
|
|
||||||
created_at:
|
|
||||||
description: 创建时间
|
|
||||||
type: string
|
|
||||||
id:
|
|
||||||
description: 账号ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
phone:
|
|
||||||
description: 手机号
|
|
||||||
type: string
|
|
||||||
shop_id:
|
|
||||||
description: 店铺ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
shop_name:
|
|
||||||
description: 店铺名称
|
|
||||||
type: string
|
|
||||||
status:
|
|
||||||
description: 状态 (0:禁用, 1:启用)
|
|
||||||
type: integer
|
|
||||||
updated_at:
|
|
||||||
description: 更新时间
|
|
||||||
type: string
|
|
||||||
user_type:
|
|
||||||
description: 用户类型 (1:超级管理员, 2:平台用户, 3:代理账号, 4:企业账号)
|
|
||||||
type: integer
|
|
||||||
username:
|
|
||||||
description: 用户名
|
|
||||||
type: string
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- created_at
|
|
||||||
- id
|
|
||||||
- phone
|
|
||||||
- shop_id
|
|
||||||
- shop_name
|
|
||||||
- status
|
|
||||||
- updated_at
|
|
||||||
- user_type
|
|
||||||
- username
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ErrorResponse:
|
|
||||||
properties:
|
|
||||||
code:
|
|
||||||
description: 错误码
|
|
||||||
type: integer
|
|
||||||
message:
|
|
||||||
description: 错误消息
|
|
||||||
type: string
|
|
||||||
timestamp:
|
|
||||||
description: 时间戳
|
|
||||||
format: date-time
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
securitySchemes:
|
|
||||||
BearerAuth:
|
|
||||||
bearerFormat: JWT
|
|
||||||
scheme: bearer
|
|
||||||
type: jwt
|
|
||||||
servers:
|
|
||||||
- url: https://cmp-api.boss160.cn
|
|
||||||
description: 测试环境
|
|
||||||
security: []
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
# 更新代理账号
|
|
||||||
|
|
||||||
## OpenAPI Specification
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
openapi: 3.0.1
|
|
||||||
info:
|
|
||||||
title: ''
|
|
||||||
description: ''
|
|
||||||
version: 1.0.0
|
|
||||||
paths:
|
|
||||||
/api/admin/shop-accounts/{id}:
|
|
||||||
put:
|
|
||||||
summary: 更新代理账号
|
|
||||||
deprecated: false
|
|
||||||
description: ''
|
|
||||||
tags:
|
|
||||||
- 代理账号管理
|
|
||||||
- 代理账号管理
|
|
||||||
parameters:
|
|
||||||
- name: id
|
|
||||||
in: path
|
|
||||||
description: ID
|
|
||||||
required: true
|
|
||||||
example: 0
|
|
||||||
schema:
|
|
||||||
description: ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ModelUpdateShopAccountParams'
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: OK
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ModelShopAccountResponse'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'400':
|
|
||||||
description: 请求参数错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: &ref_0
|
|
||||||
$ref: '#/components/schemas/ErrorResponse'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'401':
|
|
||||||
description: 未认证或认证已过期
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'403':
|
|
||||||
description: 无权访问
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'500':
|
|
||||||
description: 服务器内部错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
security:
|
|
||||||
- BearerAuth: []
|
|
||||||
x-apifox:
|
|
||||||
schemeGroups:
|
|
||||||
- id: TTw5I9JG_CJv8tEsi1Bk6
|
|
||||||
schemeIds:
|
|
||||||
- BearerAuth
|
|
||||||
required: true
|
|
||||||
use:
|
|
||||||
id: TTw5I9JG_CJv8tEsi1Bk6
|
|
||||||
scopes:
|
|
||||||
TTw5I9JG_CJv8tEsi1Bk6:
|
|
||||||
BearerAuth: []
|
|
||||||
x-apifox-folder: 代理账号管理
|
|
||||||
x-apifox-status: released
|
|
||||||
x-run-in-apifox: https://app.apifox.com/web/project/7591618/apis/api-408366336-run
|
|
||||||
components:
|
|
||||||
schemas:
|
|
||||||
ModelUpdateShopAccountParams:
|
|
||||||
properties:
|
|
||||||
username:
|
|
||||||
description: 用户名
|
|
||||||
maxLength: 50
|
|
||||||
minLength: 3
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- username
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- username
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ModelShopAccountResponse:
|
|
||||||
properties:
|
|
||||||
created_at:
|
|
||||||
description: 创建时间
|
|
||||||
type: string
|
|
||||||
id:
|
|
||||||
description: 账号ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
phone:
|
|
||||||
description: 手机号
|
|
||||||
type: string
|
|
||||||
shop_id:
|
|
||||||
description: 店铺ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
shop_name:
|
|
||||||
description: 店铺名称
|
|
||||||
type: string
|
|
||||||
status:
|
|
||||||
description: 状态 (0:禁用, 1:启用)
|
|
||||||
type: integer
|
|
||||||
updated_at:
|
|
||||||
description: 更新时间
|
|
||||||
type: string
|
|
||||||
user_type:
|
|
||||||
description: 用户类型 (1:超级管理员, 2:平台用户, 3:代理账号, 4:企业账号)
|
|
||||||
type: integer
|
|
||||||
username:
|
|
||||||
description: 用户名
|
|
||||||
type: string
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- created_at
|
|
||||||
- id
|
|
||||||
- phone
|
|
||||||
- shop_id
|
|
||||||
- shop_name
|
|
||||||
- status
|
|
||||||
- updated_at
|
|
||||||
- user_type
|
|
||||||
- username
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ErrorResponse:
|
|
||||||
properties:
|
|
||||||
code:
|
|
||||||
description: 错误码
|
|
||||||
type: integer
|
|
||||||
message:
|
|
||||||
description: 错误消息
|
|
||||||
type: string
|
|
||||||
timestamp:
|
|
||||||
description: 时间戳
|
|
||||||
format: date-time
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
securitySchemes:
|
|
||||||
BearerAuth:
|
|
||||||
bearerFormat: JWT
|
|
||||||
scheme: bearer
|
|
||||||
type: jwt
|
|
||||||
servers:
|
|
||||||
- url: https://cmp-api.boss160.cn
|
|
||||||
description: 测试环境
|
|
||||||
security: []
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
# 重置代理账号密码
|
|
||||||
|
|
||||||
## OpenAPI Specification
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
openapi: 3.0.1
|
|
||||||
info:
|
|
||||||
title: ''
|
|
||||||
description: ''
|
|
||||||
version: 1.0.0
|
|
||||||
paths:
|
|
||||||
/api/admin/shop-accounts/{id}/password:
|
|
||||||
put:
|
|
||||||
summary: 重置代理账号密码
|
|
||||||
deprecated: false
|
|
||||||
description: ''
|
|
||||||
tags:
|
|
||||||
- 代理账号管理
|
|
||||||
- 代理账号管理
|
|
||||||
parameters:
|
|
||||||
- name: id
|
|
||||||
in: path
|
|
||||||
description: ID
|
|
||||||
required: true
|
|
||||||
example: 0
|
|
||||||
schema:
|
|
||||||
description: ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ModelUpdateShopAccountPasswordParams'
|
|
||||||
responses:
|
|
||||||
'400':
|
|
||||||
description: 请求参数错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: &ref_0
|
|
||||||
$ref: '#/components/schemas/ErrorResponse'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'401':
|
|
||||||
description: 未认证或认证已过期
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'403':
|
|
||||||
description: 无权访问
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'500':
|
|
||||||
description: 服务器内部错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
security:
|
|
||||||
- BearerAuth: []
|
|
||||||
x-apifox:
|
|
||||||
schemeGroups:
|
|
||||||
- id: IeBLfzHchBWHbFru7Ma0u
|
|
||||||
schemeIds:
|
|
||||||
- BearerAuth
|
|
||||||
required: true
|
|
||||||
use:
|
|
||||||
id: IeBLfzHchBWHbFru7Ma0u
|
|
||||||
scopes:
|
|
||||||
IeBLfzHchBWHbFru7Ma0u:
|
|
||||||
BearerAuth: []
|
|
||||||
x-apifox-folder: 代理账号管理
|
|
||||||
x-apifox-status: released
|
|
||||||
x-run-in-apifox: https://app.apifox.com/web/project/7591618/apis/api-408366337-run
|
|
||||||
components:
|
|
||||||
schemas:
|
|
||||||
ModelUpdateShopAccountPasswordParams:
|
|
||||||
properties:
|
|
||||||
new_password:
|
|
||||||
description: 新密码
|
|
||||||
maxLength: 32
|
|
||||||
minLength: 8
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- new_password
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- new_password
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ErrorResponse:
|
|
||||||
properties:
|
|
||||||
code:
|
|
||||||
description: 错误码
|
|
||||||
type: integer
|
|
||||||
message:
|
|
||||||
description: 错误消息
|
|
||||||
type: string
|
|
||||||
timestamp:
|
|
||||||
description: 时间戳
|
|
||||||
format: date-time
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
securitySchemes:
|
|
||||||
BearerAuth:
|
|
||||||
bearerFormat: JWT
|
|
||||||
scheme: bearer
|
|
||||||
type: jwt
|
|
||||||
servers:
|
|
||||||
- url: https://cmp-api.boss160.cn
|
|
||||||
description: 测试环境
|
|
||||||
security: []
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
列表显示中状态用开关那个组件
|
|
||||||
# 启用/禁用代理账号
|
|
||||||
|
|
||||||
## OpenAPI Specification
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
openapi: 3.0.1
|
|
||||||
info:
|
|
||||||
title: ''
|
|
||||||
description: ''
|
|
||||||
version: 1.0.0
|
|
||||||
paths:
|
|
||||||
/api/admin/shop-accounts/{id}/status:
|
|
||||||
put:
|
|
||||||
summary: 启用/禁用代理账号
|
|
||||||
deprecated: false
|
|
||||||
description: ''
|
|
||||||
tags:
|
|
||||||
- 代理账号管理
|
|
||||||
- 代理账号管理
|
|
||||||
parameters:
|
|
||||||
- name: id
|
|
||||||
in: path
|
|
||||||
description: ID
|
|
||||||
required: true
|
|
||||||
example: 0
|
|
||||||
schema:
|
|
||||||
description: ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ModelUpdateShopAccountStatusParams'
|
|
||||||
responses:
|
|
||||||
'400':
|
|
||||||
description: 请求参数错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: &ref_0
|
|
||||||
$ref: '#/components/schemas/ErrorResponse'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'401':
|
|
||||||
description: 未认证或认证已过期
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'403':
|
|
||||||
description: 无权访问
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'500':
|
|
||||||
description: 服务器内部错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
security:
|
|
||||||
- BearerAuth: []
|
|
||||||
x-apifox:
|
|
||||||
schemeGroups:
|
|
||||||
- id: QRYgZh2IcZgAVmdF1dNBU
|
|
||||||
schemeIds:
|
|
||||||
- BearerAuth
|
|
||||||
required: true
|
|
||||||
use:
|
|
||||||
id: QRYgZh2IcZgAVmdF1dNBU
|
|
||||||
scopes:
|
|
||||||
QRYgZh2IcZgAVmdF1dNBU:
|
|
||||||
BearerAuth: []
|
|
||||||
x-apifox-folder: 代理账号管理
|
|
||||||
x-apifox-status: released
|
|
||||||
x-run-in-apifox: https://app.apifox.com/web/project/7591618/apis/api-408366338-run
|
|
||||||
components:
|
|
||||||
schemas:
|
|
||||||
ModelUpdateShopAccountStatusParams:
|
|
||||||
properties:
|
|
||||||
status:
|
|
||||||
description: 状态 (0:禁用, 1:启用)
|
|
||||||
type: integer
|
|
||||||
required:
|
|
||||||
- status
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- status
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ErrorResponse:
|
|
||||||
properties:
|
|
||||||
code:
|
|
||||||
description: 错误码
|
|
||||||
type: integer
|
|
||||||
message:
|
|
||||||
description: 错误消息
|
|
||||||
type: string
|
|
||||||
timestamp:
|
|
||||||
description: 时间戳
|
|
||||||
format: date-time
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
securitySchemes:
|
|
||||||
BearerAuth:
|
|
||||||
bearerFormat: JWT
|
|
||||||
scheme: bearer
|
|
||||||
type: jwt
|
|
||||||
servers:
|
|
||||||
- url: https://cmp-api.boss160.cn
|
|
||||||
description: 测试环境
|
|
||||||
security: []
|
|
||||||
|
|
||||||
```
|
|
||||||
488
docs/任务规划.md
488
docs/任务规划.md
@@ -1,488 +0,0 @@
|
|||||||
# 物联网卡管理系统 - 开发任务规划
|
|
||||||
|
|
||||||
> 项目开始日期: 2026-01-09
|
|
||||||
> 当前状态: 进行中
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 任务进度总览
|
|
||||||
|
|
||||||
- [ ] 阶段一:基础设施和认证模块(0/2)
|
|
||||||
- [ ] 阶段二:账号管理模块(0/7)
|
|
||||||
- [ ] 阶段三:财务管理模块(0/4)
|
|
||||||
- [ ] 阶段四:商品管理模块(0/5)
|
|
||||||
- [ ] 阶段五:资产管理模块(0/5)
|
|
||||||
- [ ] 阶段六:批量操作模块(0/3)
|
|
||||||
|
|
||||||
**总体完成度**: 0/26 任务
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 阶段一:基础设施和认证模块
|
|
||||||
|
|
||||||
### 1.1 登录模块
|
|
||||||
- [ ] 设计登录页面UI
|
|
||||||
- [ ] 实现用户名密码登录
|
|
||||||
- [ ] 实现记住密码功能
|
|
||||||
- [ ] 集成验证码/滑块验证
|
|
||||||
- [ ] 实现 Token 管理
|
|
||||||
- [ ] 实现自动刷新 Token
|
|
||||||
- [ ] 实现登出功能
|
|
||||||
- [ ] 添加登录错误处理
|
|
||||||
|
|
||||||
### 1.2 权限管理基础
|
|
||||||
- [ ] 设计权限控制策略(RBAC)
|
|
||||||
- [ ] 实现路由权限守卫
|
|
||||||
- [ ] 实现按钮级权限控制
|
|
||||||
- [ ] 实现数据权限过滤
|
|
||||||
- [ ] 完善角色权限映射
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 👥 阶段二:账号管理模块
|
|
||||||
|
|
||||||
### 2.1 平台角色管理
|
|
||||||
- [ ] 角色列表页面(表格展示)
|
|
||||||
- [ ] 新增角色功能
|
|
||||||
- [ ] 角色基础信息表单
|
|
||||||
- [ ] 权限分配(树形结构)
|
|
||||||
- [ ] 编辑角色功能
|
|
||||||
- [ ] 删除角色功能
|
|
||||||
- [ ] 角色搜索和筛选
|
|
||||||
- [ ] 角色权限预览
|
|
||||||
|
|
||||||
### 2.2 平台账号管理
|
|
||||||
- [ ] 平台账号列表页面
|
|
||||||
- [ ] 新增平台账号
|
|
||||||
- [ ] 账号信息表单
|
|
||||||
- [ ] 角色分配
|
|
||||||
- [ ] 账号状态设置
|
|
||||||
- [ ] 编辑平台账号
|
|
||||||
- [ ] 禁用/启用账号
|
|
||||||
- [ ] 重置密码功能
|
|
||||||
- [ ] 账号操作日志查看
|
|
||||||
|
|
||||||
### 2.3 客户角色管理
|
|
||||||
- [ ] 客户角色列表页面
|
|
||||||
- [ ] 新增客户角色
|
|
||||||
- [ ] 角色名称和描述
|
|
||||||
- [ ] 能力边界配置(权限树)
|
|
||||||
- [ ] 编辑客户角色
|
|
||||||
- [ ] 删除客户角色
|
|
||||||
- [ ] 角色能力说明文档
|
|
||||||
|
|
||||||
### 2.4 代理商管理
|
|
||||||
- [ ] 代理商列表页面
|
|
||||||
- [ ] 多级代理商树形展示
|
|
||||||
- [ ] 代理商等级标识
|
|
||||||
- [ ] 新增代理商
|
|
||||||
- [ ] 代理商基础信息
|
|
||||||
- [ ] 上级代理商选择
|
|
||||||
- [ ] 代理商等级设置
|
|
||||||
- [ ] 编辑代理商信息
|
|
||||||
- [ ] 代理商账号管理
|
|
||||||
- [ ] 查看代理商下的账号列表
|
|
||||||
- [ ] 为代理商创建子账号
|
|
||||||
- [ ] 代理商佣金配置
|
|
||||||
- [ ] 代理商数据统计面板
|
|
||||||
|
|
||||||
### 2.5 企业客户管理
|
|
||||||
- [ ] 企业客户列表页面
|
|
||||||
- [ ] 新增企业客户
|
|
||||||
- [ ] 企业基础信息
|
|
||||||
- [ ] 客户角色分配
|
|
||||||
- [ ] 联系人信息
|
|
||||||
- [ ] 编辑企业客户
|
|
||||||
- [ ] 企业客户账号管理
|
|
||||||
- [ ] 创建企业管理账号
|
|
||||||
- [ ] 账号权限设置
|
|
||||||
- [ ] 企业客户数据看板
|
|
||||||
|
|
||||||
### 2.6 客户账号管理
|
|
||||||
- [ ] 客户账号列表页面
|
|
||||||
- [ ] 支持按代理商/企业筛选
|
|
||||||
- [ ] 账号状态筛选
|
|
||||||
- [ ] 查看账号详情
|
|
||||||
- [ ] 解绑手机号
|
|
||||||
- [ ] 重置登录密码
|
|
||||||
- [ ] 禁用/启用账号
|
|
||||||
- [ ] 账号操作记录
|
|
||||||
|
|
||||||
### 2.7 客户账号佣金管理
|
|
||||||
- [ ] 客户账号佣金列表
|
|
||||||
- [ ] 佣金统计卡片
|
|
||||||
- [ ] 佣金明细表格
|
|
||||||
- [ ] 佣金详情查看
|
|
||||||
- [ ] 提现记录查看
|
|
||||||
- [ ] 佣金统计图表
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 💰 阶段三:财务管理模块
|
|
||||||
|
|
||||||
### 3.1 佣金提现管理
|
|
||||||
- [ ] 提现申请列表
|
|
||||||
- [ ] 状态筛选(待审核、已通过、已拒绝)
|
|
||||||
- [ ] 时间范围筛选
|
|
||||||
- [ ] 提现申请详情
|
|
||||||
- [ ] 审核提现申请
|
|
||||||
- [ ] 通过操作
|
|
||||||
- [ ] 拒绝操作(需填写原因)
|
|
||||||
- [ ] 批量审核功能
|
|
||||||
- [ ] 提现记录导出
|
|
||||||
|
|
||||||
### 3.2 佣金提现设置
|
|
||||||
- [ ] 提现参数配置页面
|
|
||||||
- [ ] 最低提现金额
|
|
||||||
- [ ] 提现手续费设置
|
|
||||||
- [ ] 单日提现次数限制
|
|
||||||
- [ ] 提现规则说明
|
|
||||||
- [ ] 配置历史记录
|
|
||||||
- [ ] 参数生效管理
|
|
||||||
|
|
||||||
### 3.3 我的账户(当前登录账号)
|
|
||||||
- [ ] 账户概览页面
|
|
||||||
- [ ] 佣金总额卡片
|
|
||||||
- [ ] 可提现金额卡片
|
|
||||||
- [ ] 待入账金额卡片
|
|
||||||
- [ ] 佣金收入明细
|
|
||||||
- [ ] 提现申请功能
|
|
||||||
- [ ] 收支流水记录
|
|
||||||
- [ ] 佣金统计图表
|
|
||||||
|
|
||||||
### 3.4 收款商户设置
|
|
||||||
- [ ] 支付参数配置页面
|
|
||||||
- [ ] 支付商户信息
|
|
||||||
- [ ] API密钥配置
|
|
||||||
- [ ] 回调地址设置
|
|
||||||
- [ ] 支付方式管理
|
|
||||||
- [ ] 微信支付
|
|
||||||
- [ ] 支付宝
|
|
||||||
- [ ] 银行卡
|
|
||||||
- [ ] 支付测试功能
|
|
||||||
- [ ] 配置安全验证
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🛍️ 阶段四:商品管理模块
|
|
||||||
|
|
||||||
### 4.1 号卡管理
|
|
||||||
- [ ] 号卡列表页面
|
|
||||||
- [ ] 号卡信息展示
|
|
||||||
- [ ] 状态筛选
|
|
||||||
- [ ] 新增号卡
|
|
||||||
- [ ] 号卡基础信息
|
|
||||||
- [ ] 运营商选择
|
|
||||||
- [ ] 套餐配置
|
|
||||||
- [ ] 编辑号卡
|
|
||||||
- [ ] 号卡上下架
|
|
||||||
- [ ] 号卡库存管理
|
|
||||||
- [ ] 号卡详情页面
|
|
||||||
|
|
||||||
### 4.2 号卡分配
|
|
||||||
- [ ] 分配记录列表
|
|
||||||
- [ ] 为代理商分配号卡
|
|
||||||
- [ ] 选择代理商
|
|
||||||
- [ ] 选择号卡商品
|
|
||||||
- [ ] 设置分配数量
|
|
||||||
- [ ] 设置佣金模式
|
|
||||||
- [ ] 查看分配详情
|
|
||||||
- [ ] 撤销分配
|
|
||||||
- [ ] 分配统计报表
|
|
||||||
|
|
||||||
### 4.3 套餐系列管理
|
|
||||||
- [ ] 套餐系列列表
|
|
||||||
- [ ] 新增套餐系列
|
|
||||||
- [ ] 系列名称
|
|
||||||
- [ ] 系列描述
|
|
||||||
- [ ] 系列图标
|
|
||||||
- [ ] 编辑套餐系列
|
|
||||||
- [ ] 删除套餐系列
|
|
||||||
- [ ] 套餐系列排序
|
|
||||||
|
|
||||||
### 4.4 套餐管理
|
|
||||||
- [ ] 套餐列表页面
|
|
||||||
- [ ] 权限过滤(管理员看全部,普通用户看自己的)
|
|
||||||
- [ ] 按套餐系列筛选
|
|
||||||
- [ ] 新增套餐
|
|
||||||
- [ ] 套餐基础信息
|
|
||||||
- [ ] 套餐类型(流量、语音、短信)
|
|
||||||
- [ ] 套餐价格
|
|
||||||
- [ ] 有效期设置
|
|
||||||
- [ ] 编辑套餐
|
|
||||||
- [ ] 套餐上下架
|
|
||||||
- [ ] 套餐详情页面
|
|
||||||
|
|
||||||
### 4.5 套餐分配
|
|
||||||
- [ ] 套餐分配列表
|
|
||||||
- [ ] 为直级代理分配套餐
|
|
||||||
- [ ] 选择代理商
|
|
||||||
- [ ] 选择套餐
|
|
||||||
- [ ] 设置佣金模式
|
|
||||||
- [ ] 固定佣金
|
|
||||||
- [ ] 比例佣金
|
|
||||||
- [ ] 查看分配详情
|
|
||||||
- [ ] 修改佣金设置
|
|
||||||
- [ ] 分配统计
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 阶段五:资产管理模块
|
|
||||||
|
|
||||||
### 5.1 单卡信息查询
|
|
||||||
- [ ] ICCID 查询界面
|
|
||||||
- [ ] 单卡详情页面
|
|
||||||
- [ ] 基础信息展示
|
|
||||||
- [ ] 套餐信息
|
|
||||||
- [ ] 使用情况
|
|
||||||
- [ ] 单卡操作功能
|
|
||||||
- [ ] 套餐充值
|
|
||||||
- [ ] 停机/复机
|
|
||||||
- [ ] 查看流量详情
|
|
||||||
- [ ] 更改过期时间
|
|
||||||
- [ ] 转新卡
|
|
||||||
- [ ] 查看停复机记录
|
|
||||||
- [ ] 查看往期订单
|
|
||||||
- [ ] 增减流量
|
|
||||||
- [ ] 变更钱包余额
|
|
||||||
- [ ] 充值支付密码
|
|
||||||
- [ ] 续充
|
|
||||||
- [ ] 设备操作入口
|
|
||||||
|
|
||||||
### 5.2 网卡管理
|
|
||||||
- [ ] 网卡列表页面
|
|
||||||
- [ ] 高级搜索
|
|
||||||
- [ ] 状态筛选
|
|
||||||
- [ ] 批量选择
|
|
||||||
- [ ] 网卡详情页面
|
|
||||||
- [ ] 批量操作入口
|
|
||||||
- [ ] 批量充值
|
|
||||||
- [ ] 批量停复机
|
|
||||||
- [ ] 批量分配
|
|
||||||
- [ ] 网卡导出功能
|
|
||||||
- [ ] 网卡数据统计
|
|
||||||
|
|
||||||
### 5.3 设备管理
|
|
||||||
- [ ] 设备列表页面
|
|
||||||
- [ ] 设备信息展示
|
|
||||||
- [ ] 在线状态
|
|
||||||
- [ ] 设备详情页面
|
|
||||||
- [ ] 设备基础信息
|
|
||||||
- [ ] 绑定卡信息
|
|
||||||
- [ ] 查看设备卡信息
|
|
||||||
- [ ] 修改设备卡绑定
|
|
||||||
- [ ] 设备相关操作
|
|
||||||
- [ ] 设备重启
|
|
||||||
- [ ] 设备诊断
|
|
||||||
- [ ] 设备数据统计
|
|
||||||
|
|
||||||
### 5.4 资产分配
|
|
||||||
- [ ] 资产分配页面
|
|
||||||
- [ ] 设备批量分配
|
|
||||||
- [ ] 选择代理商
|
|
||||||
- [ ] 上传设备列表
|
|
||||||
- [ ] 确认分配信息
|
|
||||||
- [ ] 网卡批量分配
|
|
||||||
- [ ] 选择代理商
|
|
||||||
- [ ] 上传网卡列表(ICCID)
|
|
||||||
- [ ] 自动关联设备处理
|
|
||||||
- [ ] 分配预览和确认
|
|
||||||
- [ ] 分配记录查看
|
|
||||||
- [ ] 分配回滚功能
|
|
||||||
|
|
||||||
### 5.5 换卡申请管理
|
|
||||||
- [ ] 换卡申请列表
|
|
||||||
- [ ] 状态筛选(待处理、已完成、已拒绝)
|
|
||||||
- [ ] 申请详情查看
|
|
||||||
- [ ] 旧卡信息
|
|
||||||
- [ ] 申请原因
|
|
||||||
- [ ] 处理换卡申请
|
|
||||||
- [ ] 填充新 ICCID
|
|
||||||
- [ ] 确认换卡
|
|
||||||
- [ ] 拒绝申请
|
|
||||||
- [ ] 换卡记录追溯
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔄 阶段六:批量操作模块
|
|
||||||
|
|
||||||
### 6.1 网卡批量导入
|
|
||||||
- [ ] 网卡导入页面
|
|
||||||
- [ ] 模板下载
|
|
||||||
- [ ] Excel 文件上传
|
|
||||||
- [ ] 数据预览
|
|
||||||
- [ ] 导入任务列表
|
|
||||||
- [ ] 任务状态
|
|
||||||
- [ ] 成功/失败统计
|
|
||||||
- [ ] 查看导入详情
|
|
||||||
- [ ] 成功记录
|
|
||||||
- [ ] 失败记录和原因
|
|
||||||
- [ ] 失败数据重新导入
|
|
||||||
|
|
||||||
### 6.2 设备批量导入
|
|
||||||
- [ ] 设备导入页面
|
|
||||||
- [ ] 模板下载
|
|
||||||
- [ ] Excel 文件上传(设备+ICCID关系)
|
|
||||||
- [ ] 数据预览和校验
|
|
||||||
- [ ] 导入任务列表
|
|
||||||
- [ ] 查看导入结果
|
|
||||||
- [ ] 导入失败处理
|
|
||||||
|
|
||||||
### 6.3 线下批量充值
|
|
||||||
- [ ] 批量充值记录列表
|
|
||||||
- [ ] 新建批量充值
|
|
||||||
- [ ] 模板下载
|
|
||||||
- [ ] Excel 上传
|
|
||||||
- [ ] 充值预览
|
|
||||||
- [ ] 确认充值
|
|
||||||
- [ ] 充值详情查看
|
|
||||||
- [ ] 成功列表
|
|
||||||
- [ ] 失败列表
|
|
||||||
- [ ] 充值结果导出
|
|
||||||
|
|
||||||
### 6.4 换卡通知
|
|
||||||
- [ ] 换卡通知列表
|
|
||||||
- [ ] 单独创建换卡通知
|
|
||||||
- [ ] 选择网卡
|
|
||||||
- [ ] 填写通知内容
|
|
||||||
- [ ] 选择通知方式(短信/邮件)
|
|
||||||
- [ ] 批量创建换卡通知
|
|
||||||
- [ ] 上传网卡列表
|
|
||||||
- [ ] 设置通知内容
|
|
||||||
- [ ] 查看通知记录
|
|
||||||
- [ ] 发送状态
|
|
||||||
- [ ] 已读状态
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎨 阶段七:开发能力和其他设置
|
|
||||||
|
|
||||||
### 7.1 开发能力管理
|
|
||||||
- [ ] 开发能力列表页面
|
|
||||||
- [ ] API 密钥管理
|
|
||||||
- [ ] 生成密钥
|
|
||||||
- [ ] 重置密钥
|
|
||||||
- [ ] 密钥权限设置
|
|
||||||
- [ ] Webhook 配置
|
|
||||||
- [ ] API 文档集成
|
|
||||||
- [ ] API 调用统计
|
|
||||||
|
|
||||||
### 7.2 分佣模板管理
|
|
||||||
- [ ] 分佣模板列表
|
|
||||||
- [ ] 新增分佣模板
|
|
||||||
- [ ] 模板名称
|
|
||||||
- [ ] 分佣规则配置
|
|
||||||
- [ ] 适用范围
|
|
||||||
- [ ] 编辑分佣模板
|
|
||||||
- [ ] 删除分佣模板
|
|
||||||
- [ ] 模板应用记录
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 阶段八:数据统计和报表
|
|
||||||
|
|
||||||
### 8.1 数据概览(Dashboard)
|
|
||||||
- [ ] 总体数据统计卡片
|
|
||||||
- [ ] 网卡总数
|
|
||||||
- [ ] 设备总数
|
|
||||||
- [ ] 今日充值金额
|
|
||||||
- [ ] 今日佣金
|
|
||||||
- [ ] 数据趋势图表
|
|
||||||
- [ ] 充值趋势
|
|
||||||
- [ ] 新增网卡趋势
|
|
||||||
- [ ] 代理商排行榜
|
|
||||||
- [ ] 套餐销售排行
|
|
||||||
|
|
||||||
### 8.2 业务报表
|
|
||||||
- [ ] 充值报表
|
|
||||||
- [ ] 佣金报表
|
|
||||||
- [ ] 代理商业绩报表
|
|
||||||
- [ ] 套餐使用报表
|
|
||||||
- [ ] 报表导出功能
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 阶段九:系统优化和完善
|
|
||||||
|
|
||||||
### 9.1 性能优化
|
|
||||||
- [ ] 长列表虚拟滚动
|
|
||||||
- [ ] 图片懒加载
|
|
||||||
- [ ] 接口请求优化
|
|
||||||
- [ ] 打包体积优化
|
|
||||||
|
|
||||||
### 9.2 用户体验优化
|
|
||||||
- [ ] 页面加载状态
|
|
||||||
- [ ] 错误提示优化
|
|
||||||
- [ ] 操作反馈优化
|
|
||||||
- [ ] 响应式适配
|
|
||||||
|
|
||||||
### 9.3 代码质量
|
|
||||||
- [ ] 代码规范检查
|
|
||||||
- [ ] 单元测试编写
|
|
||||||
- [ ] E2E 测试
|
|
||||||
- [ ] 代码注释完善
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 开发规范
|
|
||||||
|
|
||||||
### 命名规范
|
|
||||||
- 组件名:大驼峰,如 `UserManagement.vue`
|
|
||||||
- 文件名:小写+连字符,如 `user-list.vue`
|
|
||||||
- 接口名:RESTful 风格
|
|
||||||
- 路由名:小写+连字符
|
|
||||||
|
|
||||||
### 代码结构
|
|
||||||
```
|
|
||||||
src/
|
|
||||||
├── views/ # 页面组件
|
|
||||||
├── components/ # 公共组件
|
|
||||||
├── api/ # API 接口
|
|
||||||
├── store/ # 状态管理
|
|
||||||
├── router/ # 路由配置
|
|
||||||
├── utils/ # 工具函数
|
|
||||||
└── types/ # TypeScript 类型定义
|
|
||||||
```
|
|
||||||
|
|
||||||
### Git 提交规范
|
|
||||||
- `feat`: 新功能
|
|
||||||
- `fix`: 修复bug
|
|
||||||
- `docs`: 文档更新
|
|
||||||
- `style`: 代码格式调整
|
|
||||||
- `refactor`: 重构
|
|
||||||
- `test`: 测试相关
|
|
||||||
- `chore`: 构建/工具相关
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 里程碑
|
|
||||||
|
|
||||||
- [ ] **M1**: 基础设施完成(登录、权限) - 预计 3 天
|
|
||||||
- [ ] **M2**: 账号管理模块完成 - 预计 7 天
|
|
||||||
- [ ] **M3**: 财务管理模块完成 - 预计 5 天
|
|
||||||
- [ ] **M4**: 商品管理模块完成 - 预计 5 天
|
|
||||||
- [ ] **M5**: 资产管理模块完成 - 预计 7 天
|
|
||||||
- [ ] **M6**: 批量操作模块完成 - 预计 4 天
|
|
||||||
- [ ] **M7**: 数据统计和系统优化 - 预计 5 天
|
|
||||||
|
|
||||||
**预计总工期**: 36 个工作日
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📌 注意事项
|
|
||||||
|
|
||||||
1. **优先级**:按阶段顺序开发,基础设施 > 核心业务 > 辅助功能
|
|
||||||
2. **接口对接**:等待后端 API 完成后再进行集成
|
|
||||||
3. **数据安全**:涉及敏感数据的操作需要二次确认
|
|
||||||
4. **性能考虑**:列表超过 1000 条需要使用虚拟滚动
|
|
||||||
5. **错误处理**:所有接口调用必须有错误处理
|
|
||||||
6. **权限控制**:每个页面和操作都需要权限验证
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔄 更新日志
|
|
||||||
|
|
||||||
### 2026-01-09
|
|
||||||
- 创建任务规划文档
|
|
||||||
- 定义开发阶段和任务拆分
|
|
||||||
- 明确开发规范和里程碑
|
|
||||||
42
docs/功能.md
42
docs/功能.md
@@ -1,42 +0,0 @@
|
|||||||
# 物联网卡管理系统 - 功能列表
|
|
||||||
|
|
||||||
## 账号管理模块
|
|
||||||
- 账号管理-客户角色 客户角色用以决定客户能力边界
|
|
||||||
- 账号管理-代理商管理 用以创建代理商以及管理特定代理商账号
|
|
||||||
- 账号管理-企业客户管理 用以创建企业管理账号,只能登录企业端,依赖客户角色
|
|
||||||
- 账号管理-客户账号管理 管理客户(代理商+企业客户)的账号,解绑手机等或针对该账号的操作
|
|
||||||
|
|
||||||
## 账户管理/财务模块
|
|
||||||
- 账户管理-客户账号 查看账号下全部的客户账号的佣金情况以及提现情况
|
|
||||||
- 账户管理/我的财务-佣金提现 管理全部的提现申请
|
|
||||||
- 账户管理-佣金提现设置 设置提现参数,生效最新的一条
|
|
||||||
- 我的财务-我的账户 获取当前登录账号的佣金相关数据(这里不应该跟奇成一样用列表)
|
|
||||||
|
|
||||||
## 我的设置模块
|
|
||||||
- 我的设置-收款商户设置 设置支付参数
|
|
||||||
- 我的设置-开发能力管理 获取开发能力对接参数以及管理
|
|
||||||
- 我的设置-分佣模板 用以创建以及管理分佣模板方便给代理分配产品时设置分佣规则
|
|
||||||
|
|
||||||
## 商品管理模块
|
|
||||||
- 商品管理-号卡管理 新增管理号卡商品,管理基础信息
|
|
||||||
- 商品管理-号卡分配 为特定代理分配号卡商品,同时设置佣金模式
|
|
||||||
- 商品管理-套餐系列管理 新增以及管理套餐系列
|
|
||||||
- 商品管理-套餐管理 新增以及管理套餐系列(只能看到自己的/管理员可以看到全部)
|
|
||||||
- 商品管理-套餐分配 为直级代理分配套餐同时设置佣金模式
|
|
||||||
|
|
||||||
## 资产管理模块
|
|
||||||
- 资产管理-单卡信息 通过ICCID查询单卡相关信息,以及相关操作如,套餐充值,停复机,流量详情,更改过期时间,转新卡,停复机记录,往期订单,增减流量,变更钱包余额,充值支付密码,续充,设备操作
|
|
||||||
- 资产管理-网卡管理 查询网卡信息,提供相关批量操作入口
|
|
||||||
- 资产管理-设备管理 查看设备信息,提供相关操作入口,查看设备卡信息,修改设备卡信息,设备相关操作
|
|
||||||
- 资产管理-资产分配 为特定代理分配网卡,只支持批量操作,批量操作分为两种,一种是设备批量分配,一种是网卡批量分配,如果使用网卡批量分配且网卡有设备信息,那么会把该卡所属设备以及网卡都分配过去
|
|
||||||
- 资产管理-换卡申请 客户提交的换卡申请管理,处理换卡的申请,填充新的iccid
|
|
||||||
|
|
||||||
## 批量操作模块
|
|
||||||
- 网卡管理-批量操作-网卡导入 批量导入iccid,以及查看导入任务情况
|
|
||||||
- 设备管理-批量操作-设备导入 批量导入设备以及iccid关系,查看导入任务情况
|
|
||||||
- 网卡管理-批量操作-线下批量充值 查看批量充值记录,提供批量充值excel导入
|
|
||||||
- 网卡管理-批量操作-换卡通知 可单独/批量新建换卡通知,查看换卡通知记录
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**总计:25个功能模块**
|
|
||||||
364
docs/完成总结.md
364
docs/完成总结.md
@@ -1,364 +0,0 @@
|
|||||||
# 物联网卡管理系统 - 页面开发完成总结
|
|
||||||
|
|
||||||
## 📊 完成概况
|
|
||||||
|
|
||||||
**完成时间**: 2026-01-09
|
|
||||||
**开发进度**: 13/13 页面 (100%)
|
|
||||||
**总计文件**: 13 个 Vue 页面组件
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ 已完成的页面列表
|
|
||||||
|
|
||||||
### 1. 账号管理模块 (3个页面)
|
|
||||||
|
|
||||||
#### 1.1 客户角色管理
|
|
||||||
- **文件路径**: `src/views/account-management/customer-role/index.vue`
|
|
||||||
- **功能特性**:
|
|
||||||
- 角色列表展示(CRUD操作)
|
|
||||||
- 能力范围配置(使用 ElCheckboxGroup)
|
|
||||||
- 角色启用/禁用状态管理
|
|
||||||
- 应用统计
|
|
||||||
- **组件使用**: ArtTable, ElDialog, ElForm, ElCheckboxGroup, ElTag
|
|
||||||
|
|
||||||
#### 1.2 代理商管理
|
|
||||||
- **文件路径**: `src/views/account-management/agent/index.vue`
|
|
||||||
- **功能特性**:
|
|
||||||
- 多层级代理商管理(支持3级)
|
|
||||||
- 代理商等级展示(一级/二级/三级)
|
|
||||||
- 子账号管理对话框
|
|
||||||
- 佣金配置(固定/比例佣金)
|
|
||||||
- 状态管理(正常/禁用)
|
|
||||||
- **组件使用**: ArtTable, ElDialog, ElDescriptions, ElRadioGroup, ElInputNumber
|
|
||||||
|
|
||||||
#### 1.3 客户账号管理
|
|
||||||
- **文件路径**: `src/views/account-management/customer-account/index.vue`
|
|
||||||
- **功能特性**:
|
|
||||||
- 客户账号列表
|
|
||||||
- 账号类型筛选(个人/企业/代理商)
|
|
||||||
- 账号详情查看
|
|
||||||
- 解绑手机、重置密码、启用/禁用操作
|
|
||||||
- 操作记录追踪
|
|
||||||
- **组件使用**: ArtTable, ElDialog, ElDescriptions, ElTag, ElButton
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 2. 财务管理模块 (3个页面)
|
|
||||||
|
|
||||||
#### 2.1 提现管理
|
|
||||||
- **文件路径**: `src/views/finance/withdrawal/index.vue`
|
|
||||||
- **功能特性**:
|
|
||||||
- 提现申请列表
|
|
||||||
- 状态筛选(待审核/已通过/已拒绝/已完成)
|
|
||||||
- 批量审核功能(ElTable selection)
|
|
||||||
- 审核/拒绝操作(带原因输入)
|
|
||||||
- 详情对话框展示完整提现信息
|
|
||||||
- **组件使用**: ArtTable, ElDialog, ElDescriptions, ElButton, ElTag
|
|
||||||
|
|
||||||
#### 2.2 我的账户
|
|
||||||
- **文件路径**: `src/views/finance/my-account/index.vue`
|
|
||||||
- **功能特性**:
|
|
||||||
- 账户概览卡片(4个统计卡片,渐变背景)
|
|
||||||
- 提现申请表单(带手续费自动计算)
|
|
||||||
- 交易流水列表
|
|
||||||
- 类型筛选(全部/收入/提现)
|
|
||||||
- **组件使用**: ElCard, ElForm, ArtTable, ElTag
|
|
||||||
- **样式特色**: 渐变背景统计卡片
|
|
||||||
|
|
||||||
#### 2.3 提现设置
|
|
||||||
- **文件路径**: `src/views/finance/withdrawal-settings/index.vue`
|
|
||||||
- **功能特性**:
|
|
||||||
- 提现参数配置
|
|
||||||
- 手续费模式(固定/比例)
|
|
||||||
- 单日提现次数限制
|
|
||||||
- 到账时间设置
|
|
||||||
- 工作日限制开关
|
|
||||||
- 提现时间段设置(ElTimePicker)
|
|
||||||
- 配置历史记录
|
|
||||||
- **组件使用**: ElForm, ElInputNumber, ElRadioGroup, ElSwitch, ElTimePicker, ArtTable
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 3. 设置管理模块 (3个页面)
|
|
||||||
|
|
||||||
#### 3.1 支付商户配置
|
|
||||||
- **文件路径**: `src/views/settings/payment-merchant/index.vue`
|
|
||||||
- **功能特性**:
|
|
||||||
- 商户基础信息配置
|
|
||||||
- API配置(AppID, AppSecret, API密钥)
|
|
||||||
- 密钥显示/隐藏切换
|
|
||||||
- 回调地址配置(支付/退款)
|
|
||||||
- 支付方式启用(微信/支付宝/银行卡)
|
|
||||||
- 测试模式开关
|
|
||||||
- 配置说明文档
|
|
||||||
- **组件使用**: ElCard, ElForm, ElInput, ElButton, ElCheckboxGroup, ElSwitch
|
|
||||||
|
|
||||||
#### 3.2 开发者API管理
|
|
||||||
- **文件路径**: `src/views/settings/developer-api/index.vue`
|
|
||||||
- **功能特性**:
|
|
||||||
- API密钥管理(生成/重置/删除)
|
|
||||||
- AppKey/AppSecret 展示(带复制功能)
|
|
||||||
- 密钥显示/隐藏切换
|
|
||||||
- 权限配置(读取/写入/删除)
|
|
||||||
- Webhook配置(URL + 签名密钥)
|
|
||||||
- 事件订阅(多选框)
|
|
||||||
- API调用统计(最近7天)
|
|
||||||
- **组件使用**: ArtTable, ElDialog, ElButton, ElTag, ElCheckboxGroup
|
|
||||||
- **交互特色**: 一键复制到剪贴板
|
|
||||||
|
|
||||||
#### 3.3 分佣模板管理
|
|
||||||
- **文件路径**: `src/views/settings/commission-template/index.vue`
|
|
||||||
- **功能特性**:
|
|
||||||
- 分佣模板 CRUD
|
|
||||||
- 分佣模式(固定佣金/比例佣金)
|
|
||||||
- 佣金规则配置
|
|
||||||
- 适用范围设置
|
|
||||||
- 应用次数统计
|
|
||||||
- 应用记录查看
|
|
||||||
- **组件使用**: ArtTable, ElDialog, ElForm, ElRadioGroup, ElInputNumber, ElTag
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 4. 批量操作模块 (3个页面)
|
|
||||||
|
|
||||||
#### 4.1 网卡批量导入
|
|
||||||
- **文件路径**: `src/views/batch/sim-import/index.vue`
|
|
||||||
- **功能特性**:
|
|
||||||
- Excel模板下载
|
|
||||||
- 拖拽上传(ElUpload drag)
|
|
||||||
- 导入说明提示(ElAlert)
|
|
||||||
- 导入记录列表
|
|
||||||
- 导入进度展示(ElProgress)
|
|
||||||
- 导入状态(处理中/完成/失败)
|
|
||||||
- 详情查看(成功数/失败数/失败原因)
|
|
||||||
- 失败数据下载
|
|
||||||
- **组件使用**: ElCard, ElUpload, ArtTable, ElProgress, ElTag, ElDescriptions
|
|
||||||
|
|
||||||
#### 4.2 设备批量导入
|
|
||||||
- **文件路径**: `src/views/batch/device-import/index.vue`
|
|
||||||
- **功能特性**:
|
|
||||||
- 设备批量导入(带ICCID绑定)
|
|
||||||
- 导入统计卡片(今日导入/成功绑定/失败数/成功率)
|
|
||||||
- 状态筛选
|
|
||||||
- 导入进度跟踪
|
|
||||||
- 失败明细表格
|
|
||||||
- 已绑定ICCID统计
|
|
||||||
- **组件使用**: ElCard, ElUpload, ArtTable, ElProgress, ElTag, ElTable
|
|
||||||
- **特色**: 统计卡片带图标
|
|
||||||
|
|
||||||
#### 4.3 换卡通知管理
|
|
||||||
- **文件路径**: `src/views/batch/card-change-notice/index.vue`
|
|
||||||
- **功能特性**:
|
|
||||||
- 通知列表(标题/类型/状态)
|
|
||||||
- 通知类型(卡片更换/激活/停用/套餐变更)
|
|
||||||
- 目标用户设置(全部/指定/批量导入)
|
|
||||||
- 发送方式(短信/邮件/App推送)
|
|
||||||
- 定时发送功能
|
|
||||||
- 发送进度实时展示
|
|
||||||
- 立即发送操作
|
|
||||||
- 详情查看
|
|
||||||
- **组件使用**: ArtTable, ElDialog, ElForm, ElRadioGroup, ElCheckboxGroup, ElUpload, ElProgress
|
|
||||||
- **交互特色**: 实时发送进度动画
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 5. 产品管理模块 (1个页面)
|
|
||||||
|
|
||||||
#### 5.1 网卡产品管理
|
|
||||||
- **文件路径**: `src/views/product/sim-card/index.vue`
|
|
||||||
- **功能特性**:
|
|
||||||
- 网卡产品 CRUD
|
|
||||||
- 运营商筛选(移动/联通/电信)
|
|
||||||
- 套餐规格配置
|
|
||||||
- 价格设置
|
|
||||||
- 库存管理
|
|
||||||
- 上线/下线状态
|
|
||||||
- **组件使用**: ArtTable, ElDialog, ElForm, ElSelect, ElInputNumber, ElSwitch
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 配置文件更新
|
|
||||||
|
|
||||||
### 1. 路由别名配置
|
|
||||||
**文件**: `src/router/routesAlias.ts`
|
|
||||||
|
|
||||||
新增路由别名:
|
|
||||||
```typescript
|
|
||||||
// 账号管理
|
|
||||||
CustomerRole = '/account-management/customer-role'
|
|
||||||
AgentManagement = '/account-management/agent'
|
|
||||||
CustomerAccount = '/account-management/customer-account'
|
|
||||||
|
|
||||||
// 产品管理
|
|
||||||
SimCardManagement = '/product/sim-card'
|
|
||||||
|
|
||||||
// 财务管理
|
|
||||||
WithdrawalManagement = '/finance/withdrawal'
|
|
||||||
MyAccount = '/finance/my-account'
|
|
||||||
WithdrawalSettings = '/finance/withdrawal-settings'
|
|
||||||
|
|
||||||
// 设置管理
|
|
||||||
PaymentMerchant = '/settings/payment-merchant'
|
|
||||||
DeveloperApi = '/settings/developer-api'
|
|
||||||
CommissionTemplate = '/settings/commission-template'
|
|
||||||
|
|
||||||
// 批量操作
|
|
||||||
SimImport = '/batch/sim-import'
|
|
||||||
DeviceImport = '/batch/device-import'
|
|
||||||
CardChangeNotice = '/batch/card-change-notice'
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 异步路由配置
|
|
||||||
**文件**: `src/router/routes/asyncRoutes.ts`
|
|
||||||
|
|
||||||
新增路由模块:
|
|
||||||
- **账号管理模块**: 扩展了3个子路由
|
|
||||||
- **产品管理模块**: 新增模块,1个子路由
|
|
||||||
- **财务管理模块**: 新增模块,3个子路由
|
|
||||||
- **设置管理模块**: 新增模块,3个子路由
|
|
||||||
- **批量操作模块**: 新增模块,3个子路由
|
|
||||||
|
|
||||||
### 3. 国际化配置
|
|
||||||
**文件**: `src/locales/langs/zh.json`
|
|
||||||
|
|
||||||
新增菜单标题:
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"menus": {
|
|
||||||
"accountManagement": {
|
|
||||||
"customerRole": "客户角色",
|
|
||||||
"agent": "代理商管理",
|
|
||||||
"customerAccount": "客户账号"
|
|
||||||
},
|
|
||||||
"product": {
|
|
||||||
"title": "产品管理",
|
|
||||||
"simCard": "网卡产品管理"
|
|
||||||
},
|
|
||||||
"finance": {
|
|
||||||
"title": "财务管理",
|
|
||||||
"withdrawal": "提现管理",
|
|
||||||
"myAccount": "我的账户",
|
|
||||||
"withdrawalSettings": "提现设置"
|
|
||||||
},
|
|
||||||
"settings": {
|
|
||||||
"title": "设置管理",
|
|
||||||
"paymentMerchant": "支付商户",
|
|
||||||
"developerApi": "开发者API",
|
|
||||||
"commissionTemplate": "分佣模板"
|
|
||||||
},
|
|
||||||
"batch": {
|
|
||||||
"title": "批量操作",
|
|
||||||
"simImport": "网卡批量导入",
|
|
||||||
"deviceImport": "设备批量导入",
|
|
||||||
"cardChangeNotice": "换卡通知"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 开发规范遵循
|
|
||||||
|
|
||||||
### 1. 代码风格
|
|
||||||
- ✅ 使用 Vue 3 Composition API
|
|
||||||
- ✅ 使用 `<script setup>` 语法
|
|
||||||
- ✅ TypeScript 类型定义完整
|
|
||||||
- ✅ 使用 defineOptions 定义组件名称
|
|
||||||
|
|
||||||
### 2. 组件使用
|
|
||||||
- ✅ 优先使用项目自定义组件(ArtTable)
|
|
||||||
- ✅ 使用 Element Plus 组件库
|
|
||||||
- ✅ 统一的表单验证规则
|
|
||||||
- ✅ 统一的对话框样式
|
|
||||||
|
|
||||||
### 3. 数据管理
|
|
||||||
- ✅ 使用 ref 和 reactive 管理状态
|
|
||||||
- ✅ 使用 computed 处理派生数据
|
|
||||||
- ✅ Mock 数据结构完整
|
|
||||||
- ✅ 包含完整的 CRUD 操作
|
|
||||||
|
|
||||||
### 4. 用户体验
|
|
||||||
- ✅ 操作反馈(ElMessage)
|
|
||||||
- ✅ 确认对话框(ElMessageBox)
|
|
||||||
- ✅ 加载状态展示
|
|
||||||
- ✅ 进度条展示
|
|
||||||
- ✅ 标签状态提示
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎨 界面特色
|
|
||||||
|
|
||||||
### 统计卡片
|
|
||||||
- 渐变背景色
|
|
||||||
- 图标装饰
|
|
||||||
- 数据对比
|
|
||||||
- 响应式布局
|
|
||||||
|
|
||||||
### 表格功能
|
|
||||||
- 搜索过滤
|
|
||||||
- 状态筛选
|
|
||||||
- 批量操作
|
|
||||||
- 排序功能
|
|
||||||
- 分页展示
|
|
||||||
|
|
||||||
### 表单交互
|
|
||||||
- 动态表单项(根据选择显示/隐藏)
|
|
||||||
- 实时验证
|
|
||||||
- 条件渲染
|
|
||||||
- 默认值设置
|
|
||||||
|
|
||||||
### 文件上传
|
|
||||||
- 拖拽上传
|
|
||||||
- 文件类型限制
|
|
||||||
- 大小限制
|
|
||||||
- 模板下载
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 下一步工作建议
|
|
||||||
|
|
||||||
### 1. API 对接
|
|
||||||
- 将所有 Mock 数据替换为真实 API 调用
|
|
||||||
- 统一错误处理
|
|
||||||
- 添加请求拦截器
|
|
||||||
- 实现 Token 刷新机制
|
|
||||||
|
|
||||||
### 2. 权限控制
|
|
||||||
- 按钮级权限控制
|
|
||||||
- 数据权限过滤
|
|
||||||
- 角色权限映射
|
|
||||||
|
|
||||||
### 3. 数据验证
|
|
||||||
- 表单验证规则完善
|
|
||||||
- 后端数据校验
|
|
||||||
- 异常数据处理
|
|
||||||
|
|
||||||
### 4. 性能优化
|
|
||||||
- 列表分页加载
|
|
||||||
- 虚拟滚动
|
|
||||||
- 图片懒加载
|
|
||||||
- 组件懒加载
|
|
||||||
|
|
||||||
### 5. 测试
|
|
||||||
- 单元测试
|
|
||||||
- 集成测试
|
|
||||||
- E2E 测试
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📚 相关文档
|
|
||||||
|
|
||||||
- [任务规划文档](./任务规划.md)
|
|
||||||
- [页面创建模板](./页面创建模板.md)
|
|
||||||
- [API对接说明](./API对接说明.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✨ 总结
|
|
||||||
|
|
||||||
本次开发共完成 **13 个页面组件**,涵盖账号管理、财务管理、设置管理、批量操作和产品管理 5 大模块。所有页面均遵循统一的代码规范,使用 Mock 数据进行开发,界面美观、交互流畅,为后续 API 对接和功能扩展打下了坚实基础。
|
|
||||||
|
|
||||||
**开发完成度**: 100% ✅
|
|
||||||
**代码质量**: 优秀 ⭐⭐⭐⭐⭐
|
|
||||||
**可维护性**: 良好 👍
|
|
||||||
875
docs/店铺管理.md
875
docs/店铺管理.md
@@ -1,875 +0,0 @@
|
|||||||
# 在商品管理 /account-management 下面新增一个 店铺管理 需要对接的API如下, 然后页面样式可以参考 /account-management/account
|
|
||||||
|
|
||||||
# 店铺列表
|
|
||||||
|
|
||||||
## OpenAPI Specification
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
openapi: 3.0.1
|
|
||||||
info:
|
|
||||||
title: ''
|
|
||||||
description: ''
|
|
||||||
version: 1.0.0
|
|
||||||
paths:
|
|
||||||
/api/admin/shops:
|
|
||||||
get:
|
|
||||||
summary: 店铺列表
|
|
||||||
deprecated: false
|
|
||||||
description: ''
|
|
||||||
tags:
|
|
||||||
- 店铺管理
|
|
||||||
- 店铺管理
|
|
||||||
parameters:
|
|
||||||
- name: page
|
|
||||||
in: query
|
|
||||||
description: 页码
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
description: 页码
|
|
||||||
minimum: 1
|
|
||||||
type: integer
|
|
||||||
- name: page_size
|
|
||||||
in: query
|
|
||||||
description: 每页数量
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
description: 每页数量
|
|
||||||
maximum: 100
|
|
||||||
minimum: 1
|
|
||||||
type: integer
|
|
||||||
- name: shop_name
|
|
||||||
in: query
|
|
||||||
description: 店铺名称模糊查询
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
description: 店铺名称模糊查询
|
|
||||||
maxLength: 100
|
|
||||||
type: string
|
|
||||||
- name: shop_code
|
|
||||||
in: query
|
|
||||||
description: 店铺编号模糊查询
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
description: 店铺编号模糊查询
|
|
||||||
maxLength: 50
|
|
||||||
type: string
|
|
||||||
- name: parent_id
|
|
||||||
in: query
|
|
||||||
description: 上级店铺ID
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
description: 上级店铺ID
|
|
||||||
minimum: 1
|
|
||||||
type: integer
|
|
||||||
nullable: true
|
|
||||||
- name: level
|
|
||||||
in: query
|
|
||||||
description: 店铺层级 (1-7级)
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
description: 店铺层级 (1-7级)
|
|
||||||
maximum: 7
|
|
||||||
minimum: 1
|
|
||||||
type: integer
|
|
||||||
nullable: true
|
|
||||||
- name: status
|
|
||||||
in: query
|
|
||||||
description: 状态 (0:禁用, 1:启用)
|
|
||||||
required: false
|
|
||||||
schema:
|
|
||||||
description: 状态 (0:禁用, 1:启用)
|
|
||||||
type: integer
|
|
||||||
nullable: true
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: OK
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ModelShopPageResult'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'400':
|
|
||||||
description: 请求参数错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: &ref_0
|
|
||||||
$ref: '#/components/schemas/ErrorResponse'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'401':
|
|
||||||
description: 未认证或认证已过期
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'403':
|
|
||||||
description: 无权访问
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'500':
|
|
||||||
description: 服务器内部错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
security:
|
|
||||||
- BearerAuth: []
|
|
||||||
x-apifox:
|
|
||||||
schemeGroups:
|
|
||||||
- id: AiK0MKfrzIq2Np2gS4yVd
|
|
||||||
schemeIds:
|
|
||||||
- BearerAuth
|
|
||||||
required: true
|
|
||||||
use:
|
|
||||||
id: AiK0MKfrzIq2Np2gS4yVd
|
|
||||||
scopes:
|
|
||||||
AiK0MKfrzIq2Np2gS4yVd:
|
|
||||||
BearerAuth: []
|
|
||||||
x-apifox-folder: 店铺管理
|
|
||||||
x-apifox-status: released
|
|
||||||
x-run-in-apifox: https://app.apifox.com/web/project/7591618/apis/api-408366339-run
|
|
||||||
components:
|
|
||||||
schemas:
|
|
||||||
ModelShopPageResult:
|
|
||||||
properties:
|
|
||||||
items:
|
|
||||||
description: 店铺列表
|
|
||||||
items:
|
|
||||||
$ref: '#/components/schemas/ModelShopResponse'
|
|
||||||
type: array
|
|
||||||
nullable: true
|
|
||||||
page:
|
|
||||||
description: 当前页码
|
|
||||||
type: integer
|
|
||||||
size:
|
|
||||||
description: 每页数量
|
|
||||||
type: integer
|
|
||||||
total:
|
|
||||||
description: 总记录数
|
|
||||||
type: integer
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- items
|
|
||||||
- page
|
|
||||||
- size
|
|
||||||
- total
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ModelShopResponse:
|
|
||||||
properties:
|
|
||||||
address:
|
|
||||||
description: 详细地址
|
|
||||||
type: string
|
|
||||||
city:
|
|
||||||
description: 城市
|
|
||||||
type: string
|
|
||||||
contact_name:
|
|
||||||
description: 联系人姓名
|
|
||||||
type: string
|
|
||||||
contact_phone:
|
|
||||||
description: 联系人电话
|
|
||||||
type: string
|
|
||||||
created_at:
|
|
||||||
description: 创建时间
|
|
||||||
type: string
|
|
||||||
district:
|
|
||||||
description: 区县
|
|
||||||
type: string
|
|
||||||
id:
|
|
||||||
description: 店铺ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
level:
|
|
||||||
description: 店铺层级 (1-7级)
|
|
||||||
type: integer
|
|
||||||
parent_id:
|
|
||||||
description: 上级店铺ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
nullable: true
|
|
||||||
province:
|
|
||||||
description: 省份
|
|
||||||
type: string
|
|
||||||
shop_code:
|
|
||||||
description: 店铺编号
|
|
||||||
type: string
|
|
||||||
shop_name:
|
|
||||||
description: 店铺名称
|
|
||||||
type: string
|
|
||||||
status:
|
|
||||||
description: 状态 (0:禁用, 1:启用)
|
|
||||||
type: integer
|
|
||||||
updated_at:
|
|
||||||
description: 更新时间
|
|
||||||
type: string
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- address
|
|
||||||
- city
|
|
||||||
- contact_name
|
|
||||||
- contact_phone
|
|
||||||
- created_at
|
|
||||||
- district
|
|
||||||
- id
|
|
||||||
- level
|
|
||||||
- parent_id
|
|
||||||
- province
|
|
||||||
- shop_code
|
|
||||||
- shop_name
|
|
||||||
- status
|
|
||||||
- updated_at
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ErrorResponse:
|
|
||||||
properties:
|
|
||||||
code:
|
|
||||||
description: 错误码
|
|
||||||
type: integer
|
|
||||||
message:
|
|
||||||
description: 错误消息
|
|
||||||
type: string
|
|
||||||
timestamp:
|
|
||||||
description: 时间戳
|
|
||||||
format: date-time
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
securitySchemes:
|
|
||||||
BearerAuth:
|
|
||||||
bearerFormat: JWT
|
|
||||||
scheme: bearer
|
|
||||||
type: jwt
|
|
||||||
servers:
|
|
||||||
- url: https://cmp-api.boss160.cn
|
|
||||||
description: 测试环境
|
|
||||||
security: []
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
# 创建店铺
|
|
||||||
|
|
||||||
## OpenAPI Specification
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
openapi: 3.0.1
|
|
||||||
info:
|
|
||||||
title: ''
|
|
||||||
description: ''
|
|
||||||
version: 1.0.0
|
|
||||||
paths:
|
|
||||||
/api/admin/shops:
|
|
||||||
post:
|
|
||||||
summary: 创建店铺
|
|
||||||
deprecated: false
|
|
||||||
description: ''
|
|
||||||
tags:
|
|
||||||
- 店铺管理
|
|
||||||
- 店铺管理
|
|
||||||
parameters: []
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ModelCreateShopRequest'
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: OK
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ModelShopResponse'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'400':
|
|
||||||
description: 请求参数错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: &ref_0
|
|
||||||
$ref: '#/components/schemas/ErrorResponse'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'401':
|
|
||||||
description: 未认证或认证已过期
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'403':
|
|
||||||
description: 无权访问
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'500':
|
|
||||||
description: 服务器内部错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
security:
|
|
||||||
- BearerAuth: []
|
|
||||||
x-apifox:
|
|
||||||
schemeGroups:
|
|
||||||
- id: CgtLTd_zQ5XPrx3y7BdLh
|
|
||||||
schemeIds:
|
|
||||||
- BearerAuth
|
|
||||||
required: true
|
|
||||||
use:
|
|
||||||
id: CgtLTd_zQ5XPrx3y7BdLh
|
|
||||||
scopes:
|
|
||||||
CgtLTd_zQ5XPrx3y7BdLh:
|
|
||||||
BearerAuth: []
|
|
||||||
x-apifox-folder: 店铺管理
|
|
||||||
x-apifox-status: released
|
|
||||||
x-run-in-apifox: https://app.apifox.com/web/project/7591618/apis/api-408366340-run
|
|
||||||
components:
|
|
||||||
schemas:
|
|
||||||
ModelCreateShopRequest:
|
|
||||||
properties:
|
|
||||||
address:
|
|
||||||
description: 详细地址
|
|
||||||
maxLength: 255
|
|
||||||
type: string
|
|
||||||
city:
|
|
||||||
description: 城市
|
|
||||||
maxLength: 50
|
|
||||||
type: string
|
|
||||||
contact_name:
|
|
||||||
description: 联系人姓名
|
|
||||||
maxLength: 50
|
|
||||||
type: string
|
|
||||||
contact_phone:
|
|
||||||
description: 联系人电话
|
|
||||||
maxLength: 11
|
|
||||||
minLength: 11
|
|
||||||
type: string
|
|
||||||
district:
|
|
||||||
description: 区县
|
|
||||||
maxLength: 50
|
|
||||||
type: string
|
|
||||||
init_password:
|
|
||||||
description: 初始账号密码
|
|
||||||
maxLength: 32
|
|
||||||
minLength: 8
|
|
||||||
type: string
|
|
||||||
init_phone:
|
|
||||||
description: 初始账号手机号
|
|
||||||
maxLength: 11
|
|
||||||
minLength: 11
|
|
||||||
type: string
|
|
||||||
init_username:
|
|
||||||
description: 初始账号用户名
|
|
||||||
maxLength: 50
|
|
||||||
minLength: 3
|
|
||||||
type: string
|
|
||||||
parent_id:
|
|
||||||
description: 上级店铺ID(一级店铺可不填)
|
|
||||||
minimum: 1
|
|
||||||
type: integer
|
|
||||||
nullable: true
|
|
||||||
province:
|
|
||||||
description: 省份
|
|
||||||
maxLength: 50
|
|
||||||
type: string
|
|
||||||
shop_code:
|
|
||||||
description: 店铺编号
|
|
||||||
maxLength: 50
|
|
||||||
minLength: 1
|
|
||||||
type: string
|
|
||||||
shop_name:
|
|
||||||
description: 店铺名称
|
|
||||||
maxLength: 100
|
|
||||||
minLength: 1
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- init_password
|
|
||||||
- init_phone
|
|
||||||
- init_username
|
|
||||||
- shop_code
|
|
||||||
- shop_name
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- address
|
|
||||||
- city
|
|
||||||
- contact_name
|
|
||||||
- contact_phone
|
|
||||||
- district
|
|
||||||
- init_password
|
|
||||||
- init_phone
|
|
||||||
- init_username
|
|
||||||
- parent_id
|
|
||||||
- province
|
|
||||||
- shop_code
|
|
||||||
- shop_name
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ModelShopResponse:
|
|
||||||
properties:
|
|
||||||
address:
|
|
||||||
description: 详细地址
|
|
||||||
type: string
|
|
||||||
city:
|
|
||||||
description: 城市
|
|
||||||
type: string
|
|
||||||
contact_name:
|
|
||||||
description: 联系人姓名
|
|
||||||
type: string
|
|
||||||
contact_phone:
|
|
||||||
description: 联系人电话
|
|
||||||
type: string
|
|
||||||
created_at:
|
|
||||||
description: 创建时间
|
|
||||||
type: string
|
|
||||||
district:
|
|
||||||
description: 区县
|
|
||||||
type: string
|
|
||||||
id:
|
|
||||||
description: 店铺ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
level:
|
|
||||||
description: 店铺层级 (1-7级)
|
|
||||||
type: integer
|
|
||||||
parent_id:
|
|
||||||
description: 上级店铺ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
nullable: true
|
|
||||||
province:
|
|
||||||
description: 省份
|
|
||||||
type: string
|
|
||||||
shop_code:
|
|
||||||
description: 店铺编号
|
|
||||||
type: string
|
|
||||||
shop_name:
|
|
||||||
description: 店铺名称
|
|
||||||
type: string
|
|
||||||
status:
|
|
||||||
description: 状态 (0:禁用, 1:启用)
|
|
||||||
type: integer
|
|
||||||
updated_at:
|
|
||||||
description: 更新时间
|
|
||||||
type: string
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- address
|
|
||||||
- city
|
|
||||||
- contact_name
|
|
||||||
- contact_phone
|
|
||||||
- created_at
|
|
||||||
- district
|
|
||||||
- id
|
|
||||||
- level
|
|
||||||
- parent_id
|
|
||||||
- province
|
|
||||||
- shop_code
|
|
||||||
- shop_name
|
|
||||||
- status
|
|
||||||
- updated_at
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ErrorResponse:
|
|
||||||
properties:
|
|
||||||
code:
|
|
||||||
description: 错误码
|
|
||||||
type: integer
|
|
||||||
message:
|
|
||||||
description: 错误消息
|
|
||||||
type: string
|
|
||||||
timestamp:
|
|
||||||
description: 时间戳
|
|
||||||
format: date-time
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
securitySchemes:
|
|
||||||
BearerAuth:
|
|
||||||
bearerFormat: JWT
|
|
||||||
scheme: bearer
|
|
||||||
type: jwt
|
|
||||||
servers:
|
|
||||||
- url: https://cmp-api.boss160.cn
|
|
||||||
description: 测试环境
|
|
||||||
security: []
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
# 删除店铺
|
|
||||||
|
|
||||||
## OpenAPI Specification
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
openapi: 3.0.1
|
|
||||||
info:
|
|
||||||
title: ''
|
|
||||||
description: ''
|
|
||||||
version: 1.0.0
|
|
||||||
paths:
|
|
||||||
/api/admin/shops/{id}:
|
|
||||||
delete:
|
|
||||||
summary: 删除店铺
|
|
||||||
deprecated: false
|
|
||||||
description: ''
|
|
||||||
tags:
|
|
||||||
- 店铺管理
|
|
||||||
- 店铺管理
|
|
||||||
parameters:
|
|
||||||
- name: id
|
|
||||||
in: path
|
|
||||||
description: ID
|
|
||||||
required: true
|
|
||||||
example: 0
|
|
||||||
schema:
|
|
||||||
description: ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
responses:
|
|
||||||
'400':
|
|
||||||
description: 请求参数错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: &ref_0
|
|
||||||
$ref: '#/components/schemas/ErrorResponse'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'401':
|
|
||||||
description: 未认证或认证已过期
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'403':
|
|
||||||
description: 无权访问
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'500':
|
|
||||||
description: 服务器内部错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
security:
|
|
||||||
- BearerAuth: []
|
|
||||||
x-apifox:
|
|
||||||
schemeGroups:
|
|
||||||
- id: ivp0VlbXbNhnY2xcsCWbS
|
|
||||||
schemeIds:
|
|
||||||
- BearerAuth
|
|
||||||
required: true
|
|
||||||
use:
|
|
||||||
id: ivp0VlbXbNhnY2xcsCWbS
|
|
||||||
scopes:
|
|
||||||
ivp0VlbXbNhnY2xcsCWbS:
|
|
||||||
BearerAuth: []
|
|
||||||
x-apifox-folder: 店铺管理
|
|
||||||
x-apifox-status: released
|
|
||||||
x-run-in-apifox: https://app.apifox.com/web/project/7591618/apis/api-408366341-run
|
|
||||||
components:
|
|
||||||
schemas:
|
|
||||||
ErrorResponse:
|
|
||||||
properties:
|
|
||||||
code:
|
|
||||||
description: 错误码
|
|
||||||
type: integer
|
|
||||||
message:
|
|
||||||
description: 错误消息
|
|
||||||
type: string
|
|
||||||
timestamp:
|
|
||||||
description: 时间戳
|
|
||||||
format: date-time
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
securitySchemes:
|
|
||||||
BearerAuth:
|
|
||||||
bearerFormat: JWT
|
|
||||||
scheme: bearer
|
|
||||||
type: jwt
|
|
||||||
servers:
|
|
||||||
- url: https://cmp-api.boss160.cn
|
|
||||||
description: 测试环境
|
|
||||||
security: []
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
# 更新店铺
|
|
||||||
|
|
||||||
## OpenAPI Specification
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
openapi: 3.0.1
|
|
||||||
info:
|
|
||||||
title: ''
|
|
||||||
description: ''
|
|
||||||
version: 1.0.0
|
|
||||||
paths:
|
|
||||||
/api/admin/shops/{id}:
|
|
||||||
put:
|
|
||||||
summary: 更新店铺
|
|
||||||
deprecated: false
|
|
||||||
description: ''
|
|
||||||
tags:
|
|
||||||
- 店铺管理
|
|
||||||
- 店铺管理
|
|
||||||
parameters:
|
|
||||||
- name: id
|
|
||||||
in: path
|
|
||||||
description: ID
|
|
||||||
required: true
|
|
||||||
example: 0
|
|
||||||
schema:
|
|
||||||
description: ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
requestBody:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ModelUpdateShopParams'
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: OK
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ModelShopResponse'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'400':
|
|
||||||
description: 请求参数错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: &ref_0
|
|
||||||
$ref: '#/components/schemas/ErrorResponse'
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'401':
|
|
||||||
description: 未认证或认证已过期
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'403':
|
|
||||||
description: 无权访问
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
'500':
|
|
||||||
description: 服务器内部错误
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema: *ref_0
|
|
||||||
headers: {}
|
|
||||||
x-apifox-name: ''
|
|
||||||
security:
|
|
||||||
- BearerAuth: []
|
|
||||||
x-apifox:
|
|
||||||
schemeGroups:
|
|
||||||
- id: 2BoHA3GVAX6-zd8XmFxez
|
|
||||||
schemeIds:
|
|
||||||
- BearerAuth
|
|
||||||
required: true
|
|
||||||
use:
|
|
||||||
id: 2BoHA3GVAX6-zd8XmFxez
|
|
||||||
scopes:
|
|
||||||
2BoHA3GVAX6-zd8XmFxez:
|
|
||||||
BearerAuth: []
|
|
||||||
x-apifox-folder: 店铺管理
|
|
||||||
x-apifox-status: released
|
|
||||||
x-run-in-apifox: https://app.apifox.com/web/project/7591618/apis/api-408366342-run
|
|
||||||
components:
|
|
||||||
schemas:
|
|
||||||
ModelUpdateShopParams:
|
|
||||||
properties:
|
|
||||||
address:
|
|
||||||
description: 详细地址
|
|
||||||
maxLength: 255
|
|
||||||
type: string
|
|
||||||
city:
|
|
||||||
description: 城市
|
|
||||||
maxLength: 50
|
|
||||||
type: string
|
|
||||||
contact_name:
|
|
||||||
description: 联系人姓名
|
|
||||||
maxLength: 50
|
|
||||||
type: string
|
|
||||||
contact_phone:
|
|
||||||
description: 联系人电话
|
|
||||||
maxLength: 11
|
|
||||||
minLength: 11
|
|
||||||
type: string
|
|
||||||
district:
|
|
||||||
description: 区县
|
|
||||||
maxLength: 50
|
|
||||||
type: string
|
|
||||||
province:
|
|
||||||
description: 省份
|
|
||||||
maxLength: 50
|
|
||||||
type: string
|
|
||||||
shop_name:
|
|
||||||
description: 店铺名称
|
|
||||||
maxLength: 100
|
|
||||||
minLength: 1
|
|
||||||
type: string
|
|
||||||
status:
|
|
||||||
description: 状态 (0:禁用, 1:启用)
|
|
||||||
type: integer
|
|
||||||
required:
|
|
||||||
- shop_name
|
|
||||||
- status
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- address
|
|
||||||
- city
|
|
||||||
- contact_name
|
|
||||||
- contact_phone
|
|
||||||
- district
|
|
||||||
- province
|
|
||||||
- shop_name
|
|
||||||
- status
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ModelShopResponse:
|
|
||||||
properties:
|
|
||||||
address:
|
|
||||||
description: 详细地址
|
|
||||||
type: string
|
|
||||||
city:
|
|
||||||
description: 城市
|
|
||||||
type: string
|
|
||||||
contact_name:
|
|
||||||
description: 联系人姓名
|
|
||||||
type: string
|
|
||||||
contact_phone:
|
|
||||||
description: 联系人电话
|
|
||||||
type: string
|
|
||||||
created_at:
|
|
||||||
description: 创建时间
|
|
||||||
type: string
|
|
||||||
district:
|
|
||||||
description: 区县
|
|
||||||
type: string
|
|
||||||
id:
|
|
||||||
description: 店铺ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
level:
|
|
||||||
description: 店铺层级 (1-7级)
|
|
||||||
type: integer
|
|
||||||
parent_id:
|
|
||||||
description: 上级店铺ID
|
|
||||||
minimum: 0
|
|
||||||
type: integer
|
|
||||||
nullable: true
|
|
||||||
province:
|
|
||||||
description: 省份
|
|
||||||
type: string
|
|
||||||
shop_code:
|
|
||||||
description: 店铺编号
|
|
||||||
type: string
|
|
||||||
shop_name:
|
|
||||||
description: 店铺名称
|
|
||||||
type: string
|
|
||||||
status:
|
|
||||||
description: 状态 (0:禁用, 1:启用)
|
|
||||||
type: integer
|
|
||||||
updated_at:
|
|
||||||
description: 更新时间
|
|
||||||
type: string
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- address
|
|
||||||
- city
|
|
||||||
- contact_name
|
|
||||||
- contact_phone
|
|
||||||
- created_at
|
|
||||||
- district
|
|
||||||
- id
|
|
||||||
- level
|
|
||||||
- parent_id
|
|
||||||
- province
|
|
||||||
- shop_code
|
|
||||||
- shop_name
|
|
||||||
- status
|
|
||||||
- updated_at
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
ErrorResponse:
|
|
||||||
properties:
|
|
||||||
code:
|
|
||||||
description: 错误码
|
|
||||||
type: integer
|
|
||||||
message:
|
|
||||||
description: 错误消息
|
|
||||||
type: string
|
|
||||||
timestamp:
|
|
||||||
description: 时间戳
|
|
||||||
format: date-time
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
type: object
|
|
||||||
x-apifox-orders:
|
|
||||||
- code
|
|
||||||
- message
|
|
||||||
- timestamp
|
|
||||||
x-apifox-ignore-properties: []
|
|
||||||
x-apifox-folder: ''
|
|
||||||
securitySchemes:
|
|
||||||
BearerAuth:
|
|
||||||
bearerFormat: JWT
|
|
||||||
scheme: bearer
|
|
||||||
type: jwt
|
|
||||||
servers:
|
|
||||||
- url: https://cmp-api.boss160.cn
|
|
||||||
description: 测试环境
|
|
||||||
security: []
|
|
||||||
|
|
||||||
```
|
|
||||||
194
docs/开发进度.md
194
docs/开发进度.md
@@ -1,194 +0,0 @@
|
|||||||
# 物联网卡管理系统 - 开发进度
|
|
||||||
|
|
||||||
> 更新时间: 2026-01-09
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ 已完成的页面(5个)
|
|
||||||
|
|
||||||
### 账号管理模块 (4/4) ✅
|
|
||||||
- [x] **客户角色管理** `account-management/customer-role/index.vue`
|
|
||||||
- 角色列表、新增、编辑、删除
|
|
||||||
- 能力边界配置(多选框)
|
|
||||||
- 状态管理
|
|
||||||
|
|
||||||
- [x] **代理商管理** `account-management/agent/index.vue`
|
|
||||||
- 代理商列表(多级代理)
|
|
||||||
- 新增/编辑代理商
|
|
||||||
- 账号管理(子账号列表)
|
|
||||||
- 佣金配置(固定/比例佣金)
|
|
||||||
|
|
||||||
- [x] **客户账号管理** `account-management/customer-account/index.vue`
|
|
||||||
- 客户账号列表
|
|
||||||
- 账号详情(Descriptions)
|
|
||||||
- 解绑手机、重置密码
|
|
||||||
- 禁用/启用账号
|
|
||||||
- 操作记录查看
|
|
||||||
|
|
||||||
- [x] **企业客户管理** `account-management/customer/index.vue`
|
|
||||||
- ⚠️ 已存在,无需创建
|
|
||||||
|
|
||||||
### 商品管理模块 (1/2)
|
|
||||||
- [x] **号卡管理** `product/sim-card/index.vue`
|
|
||||||
- 号卡列表(运营商筛选)
|
|
||||||
- 新增/编辑号卡
|
|
||||||
- 上架/下架管理
|
|
||||||
- 库存管理
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 待创建的页面(10个)
|
|
||||||
|
|
||||||
### 1. 账号管理模块
|
|
||||||
- [ ] **客户账号佣金** `account-management/customer-commission/index.vue`
|
|
||||||
- 佣金统计卡片
|
|
||||||
- 佣金明细列表
|
|
||||||
- 提现记录
|
|
||||||
|
|
||||||
### 2. 财务管理模块 (0/3)
|
|
||||||
- [ ] **佣金提现管理** `finance/withdrawal/index.vue`
|
|
||||||
- 提现申请列表(状态筛选)
|
|
||||||
- 审核功能(通过/拒绝)
|
|
||||||
- 批量审核
|
|
||||||
- 提现记录导出
|
|
||||||
|
|
||||||
- [ ] **佣金提现设置** `finance/withdrawal-settings/index.vue`
|
|
||||||
- 提现参数配置(最低金额、手续费等)
|
|
||||||
- 配置历史记录
|
|
||||||
|
|
||||||
- [ ] **我的账户** `finance/my-account/index.vue`
|
|
||||||
- 账户概览(卡片统计)
|
|
||||||
- 佣金收入明细
|
|
||||||
- 提现申请功能
|
|
||||||
- 收支流水记录
|
|
||||||
|
|
||||||
### 3. 设置管理模块 (0/3)
|
|
||||||
- [ ] **收款商户设置** `settings/payment-merchant/index.vue`
|
|
||||||
- 支付商户信息配置
|
|
||||||
- API 密钥管理
|
|
||||||
- 回调地址设置
|
|
||||||
- 支付方式管理(微信/支付宝/银行卡)
|
|
||||||
|
|
||||||
- [ ] **开发能力管理** `settings/developer-api/index.vue`
|
|
||||||
- API 密钥列表
|
|
||||||
- 生成/重置密钥
|
|
||||||
- Webhook 配置
|
|
||||||
- API 调用统计
|
|
||||||
|
|
||||||
- [ ] **分佣模板** `settings/commission-template/index.vue`
|
|
||||||
- 分佣模板列表
|
|
||||||
- 新增/编辑模板
|
|
||||||
- 分佣规则配置
|
|
||||||
- 模板应用记录
|
|
||||||
|
|
||||||
### 4. 商品管理模块
|
|
||||||
- [ ] **号卡分配** `product/sim-card-assign/index.vue`
|
|
||||||
- 分配记录列表
|
|
||||||
- 为代理商分配号卡
|
|
||||||
- 设置佣金模式
|
|
||||||
- 分配统计报表
|
|
||||||
|
|
||||||
### 5. 批量操作模块 (0/3)
|
|
||||||
- [ ] **网卡批量导入** `batch/sim-import/index.vue`
|
|
||||||
- Excel 上传(模板下载)
|
|
||||||
- 导入任务列表
|
|
||||||
- 导入结果查看(成功/失败)
|
|
||||||
|
|
||||||
- [ ] **设备批量导入** `batch/device-import/index.vue`
|
|
||||||
- Excel 上传(设备+ICCID关系)
|
|
||||||
- 导入任务列表
|
|
||||||
- 导入结果查看
|
|
||||||
|
|
||||||
- [ ] **换卡通知** `batch/card-change-notice/index.vue`
|
|
||||||
- 换卡通知列表
|
|
||||||
- 单独/批量创建通知
|
|
||||||
- 通知方式选择(短信/邮件)
|
|
||||||
- 通知记录查看
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📂 项目文件结构
|
|
||||||
|
|
||||||
```
|
|
||||||
src/views/
|
|
||||||
├── account-management/ # 账号管理
|
|
||||||
│ ├── customer/ ✅ 已存在
|
|
||||||
│ ├── customer-role/ ✅ 已创建
|
|
||||||
│ ├── agent/ ✅ 已创建
|
|
||||||
│ ├── customer-account/ ✅ 已创建
|
|
||||||
│ └── customer-commission/ ❌ 待创建
|
|
||||||
├── finance/ # 财务管理
|
|
||||||
│ ├── withdrawal/ ❌ 待创建
|
|
||||||
│ ├── withdrawal-settings/ ❌ 待创建
|
|
||||||
│ └── my-account/ ❌ 待创建
|
|
||||||
├── settings/ # 设置管理
|
|
||||||
│ ├── payment-merchant/ ❌ 待创建
|
|
||||||
│ ├── developer-api/ ❌ 待创建
|
|
||||||
│ └── commission-template/ ❌ 待创建
|
|
||||||
├── product/ # 商品管理
|
|
||||||
│ ├── sim-card/ ✅ 已创建
|
|
||||||
│ └── sim-card-assign/ ❌ 待创建
|
|
||||||
└── batch/ # 批量操作
|
|
||||||
├── sim-import/ ❌ 待创建
|
|
||||||
├── device-import/ ❌ 待创建
|
|
||||||
└── card-change-notice/ ❌ 待创建
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 快速创建指南
|
|
||||||
|
|
||||||
### 方法1: 使用模板快速创建
|
|
||||||
参考 `docs/页面创建模板.md` 中的标准模板,只需:
|
|
||||||
1. 复制模板代码
|
|
||||||
2. 修改组件名和接口定义
|
|
||||||
3. 调整 Mock 数据
|
|
||||||
4. 根据需求调整表单和表格
|
|
||||||
|
|
||||||
### 方法2: 复制现有页面修改
|
|
||||||
推荐复制以下页面作为基础:
|
|
||||||
- **列表+CRUD**: 复制 `customer-role/index.vue`
|
|
||||||
- **复杂列表+多对话框**: 复制 `agent/index.vue`
|
|
||||||
- **详情查看**: 复制 `customer-account/index.vue`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📌 下一步工作
|
|
||||||
|
|
||||||
### 优先级1 - 核心业务页面
|
|
||||||
1. ⚠️ 财务管理模块(3个页面)- 核心功能
|
|
||||||
2. ⚠️ 商品管理 - 号卡分配
|
|
||||||
|
|
||||||
### 优先级2 - 辅助功能页面
|
|
||||||
3. 设置管理模块(3个页面)
|
|
||||||
4. 批量操作模块(3个页面)
|
|
||||||
5. 客户账号佣金页面
|
|
||||||
|
|
||||||
### 优先级3 - 路由和配置
|
|
||||||
6. 更新 `src/router/routesAlias.ts` 添加新路由别名
|
|
||||||
7. 更新 `src/router/routes/asyncRoutes.ts` 添加路由配置
|
|
||||||
8. 测试所有页面是否正常访问
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✨ 已完成的文档
|
|
||||||
|
|
||||||
- ✅ `docs/任务规划.md` - 完整的任务规划和分解
|
|
||||||
- ✅ `docs/页面创建模板.md` - 标准页面模板和快速创建指南
|
|
||||||
- ✅ `docs/开发进度.md` - 当前开发进度追踪
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 💡 开发建议
|
|
||||||
|
|
||||||
1. **使用模板**:严格按照模板创建,保持代码风格一致
|
|
||||||
2. **Mock 数据**:确保 Mock 数据完整且真实,方便测试
|
|
||||||
3. **组件复用**:最大化使用 ArtTable 等现有组件
|
|
||||||
4. **渐进开发**:先完成基础功能,再添加高级特性
|
|
||||||
5. **及时测试**:每完成一个页面立即测试功能
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**总体完成度**: 5/15 页面 (33.3%)
|
|
||||||
|
|
||||||
继续加油!🚀
|
|
||||||
378
docs/新功能.md
378
docs/新功能.md
@@ -1,378 +0,0 @@
|
|||||||
# 在账号管理下面新增一个平台账号, 然后需要写页面对接API, 页面样式可以参考/system/account 都需要token认证 逻辑啥的跟/system/account差不多
|
|
||||||
|
|
||||||
## 1. 平台账号列表
|
|
||||||
|
|
||||||
```json
|
|
||||||
"url": "/api/admin/platform-accounts",
|
|
||||||
"methods": "GET",
|
|
||||||
Query 参数:
|
|
||||||
export interface ApifoxModel {
|
|
||||||
/**
|
|
||||||
* 页码
|
|
||||||
*/
|
|
||||||
page?: number;
|
|
||||||
/**
|
|
||||||
* 每页数量
|
|
||||||
*/
|
|
||||||
page_size?: number;
|
|
||||||
/**
|
|
||||||
* 手机号模糊查询
|
|
||||||
*/
|
|
||||||
phone?: string;
|
|
||||||
/**
|
|
||||||
* 状态 (0:禁用, 1:启用)
|
|
||||||
*/
|
|
||||||
status?: number | null;
|
|
||||||
/**
|
|
||||||
* 用户名模糊查询
|
|
||||||
*/
|
|
||||||
username?: string;
|
|
||||||
[property: string]: any;
|
|
||||||
}
|
|
||||||
返回响应
|
|
||||||
/**
|
|
||||||
* ModelAccountPageResult
|
|
||||||
*/
|
|
||||||
export interface ApifoxModel {
|
|
||||||
/**
|
|
||||||
* 账号列表
|
|
||||||
*/
|
|
||||||
items?: ModelAccountResponse[] | null;
|
|
||||||
/**
|
|
||||||
* 当前页码
|
|
||||||
*/
|
|
||||||
page?: number;
|
|
||||||
/**
|
|
||||||
* 每页数量
|
|
||||||
*/
|
|
||||||
size?: number;
|
|
||||||
/**
|
|
||||||
* 总记录数
|
|
||||||
*/
|
|
||||||
total?: number;
|
|
||||||
[property: string]: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ModelAccountResponse
|
|
||||||
*/
|
|
||||||
export interface ModelAccountResponse {
|
|
||||||
/**
|
|
||||||
* 创建时间
|
|
||||||
*/
|
|
||||||
created_at?: string;
|
|
||||||
/**
|
|
||||||
* 创建人ID
|
|
||||||
*/
|
|
||||||
creator?: number;
|
|
||||||
/**
|
|
||||||
* 关联企业ID
|
|
||||||
*/
|
|
||||||
enterprise_id?: number | null;
|
|
||||||
/**
|
|
||||||
* 账号ID
|
|
||||||
*/
|
|
||||||
id?: number;
|
|
||||||
/**
|
|
||||||
* 手机号
|
|
||||||
*/
|
|
||||||
phone?: string;
|
|
||||||
/**
|
|
||||||
* 关联店铺ID
|
|
||||||
*/
|
|
||||||
shop_id?: number | null;
|
|
||||||
/**
|
|
||||||
* 状态 (0:禁用, 1:启用)
|
|
||||||
*/
|
|
||||||
status?: number;
|
|
||||||
/**
|
|
||||||
* 更新时间
|
|
||||||
*/
|
|
||||||
updated_at?: string;
|
|
||||||
/**
|
|
||||||
* 更新人ID
|
|
||||||
*/
|
|
||||||
updater?: number;
|
|
||||||
/**
|
|
||||||
* 用户类型 (1:超级管理员, 2:平台用户, 3:代理账号, 4:企业账号)
|
|
||||||
*/
|
|
||||||
user_type?: number;
|
|
||||||
/**
|
|
||||||
* 用户名
|
|
||||||
*/
|
|
||||||
username?: string;
|
|
||||||
[property: string]: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
"items": [
|
|
||||||
{
|
|
||||||
"created_at": "string",
|
|
||||||
"creator": 0,
|
|
||||||
"enterprise_id": 0,
|
|
||||||
"id": 0,
|
|
||||||
"phone": "string",
|
|
||||||
"shop_id": 0,
|
|
||||||
"status": 0,
|
|
||||||
"updated_at": "string",
|
|
||||||
"updater": 0,
|
|
||||||
"user_type": 0,
|
|
||||||
"username": "string"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"page": 0,
|
|
||||||
"size": 0,
|
|
||||||
"total": 0
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 2. 新增平台账号
|
|
||||||
url: /api/admin/platform-accounts,
|
|
||||||
methods: post,
|
|
||||||
Body 参数
|
|
||||||
/**
|
|
||||||
* ModelCreateAccountRequest
|
|
||||||
*/
|
|
||||||
export interface ApifoxModel {
|
|
||||||
/**
|
|
||||||
* 关联企业ID(企业账号必填)
|
|
||||||
*/
|
|
||||||
enterprise_id?: number | null;
|
|
||||||
/**
|
|
||||||
* 密码
|
|
||||||
*/
|
|
||||||
password: string;
|
|
||||||
/**
|
|
||||||
* 手机号
|
|
||||||
*/
|
|
||||||
phone: string;
|
|
||||||
/**
|
|
||||||
* 关联店铺ID(代理账号必填)
|
|
||||||
*/
|
|
||||||
shop_id?: number | null;
|
|
||||||
/**
|
|
||||||
* 用户类型 (1:超级管理员, 2:平台用户, 3:代理账号, 4:企业账号)
|
|
||||||
*/
|
|
||||||
user_type: number;
|
|
||||||
/**
|
|
||||||
* 用户名
|
|
||||||
*/
|
|
||||||
username: string;
|
|
||||||
[property: string]: any;
|
|
||||||
}
|
|
||||||
返回响应:
|
|
||||||
/**
|
|
||||||
* ModelAccountResponse
|
|
||||||
*/
|
|
||||||
export interface ApifoxModel {
|
|
||||||
/**
|
|
||||||
* 创建时间
|
|
||||||
*/
|
|
||||||
created_at?: string;
|
|
||||||
/**
|
|
||||||
* 创建人ID
|
|
||||||
*/
|
|
||||||
creator?: number;
|
|
||||||
/**
|
|
||||||
* 关联企业ID
|
|
||||||
*/
|
|
||||||
enterprise_id?: number | null;
|
|
||||||
/**
|
|
||||||
* 账号ID
|
|
||||||
*/
|
|
||||||
id?: number;
|
|
||||||
/**
|
|
||||||
* 手机号
|
|
||||||
*/
|
|
||||||
phone?: string;
|
|
||||||
/**
|
|
||||||
* 关联店铺ID
|
|
||||||
*/
|
|
||||||
shop_id?: number | null;
|
|
||||||
/**
|
|
||||||
* 状态 (0:禁用, 1:启用)
|
|
||||||
*/
|
|
||||||
status?: number;
|
|
||||||
/**
|
|
||||||
* 更新时间
|
|
||||||
*/
|
|
||||||
updated_at?: string;
|
|
||||||
/**
|
|
||||||
* 更新人ID
|
|
||||||
*/
|
|
||||||
updater?: number;
|
|
||||||
/**
|
|
||||||
* 用户类型 (1:超级管理员, 2:平台用户, 3:代理账号, 4:企业账号)
|
|
||||||
*/
|
|
||||||
user_type?: number;
|
|
||||||
/**
|
|
||||||
* 用户名
|
|
||||||
*/
|
|
||||||
username?: string;
|
|
||||||
[property: string]: any;
|
|
||||||
}
|
|
||||||
*
|
|
||||||
{
|
|
||||||
"created_at": "string",
|
|
||||||
"creator": 0,
|
|
||||||
"enterprise_id": 0,
|
|
||||||
"id": 0,
|
|
||||||
"phone": "string",
|
|
||||||
"shop_id": 0,
|
|
||||||
"status": 0,
|
|
||||||
"updated_at": "string",
|
|
||||||
"updater": 0,
|
|
||||||
"user_type": 0,
|
|
||||||
"username": "string"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 3. 移除角色
|
|
||||||
url: /api/admin/platform-accounts/{account_id}/roles/{role_id}
|
|
||||||
methods: delete
|
|
||||||
path参数:
|
|
||||||
export interface ApifoxModel {
|
|
||||||
/**
|
|
||||||
* 账号ID
|
|
||||||
*/
|
|
||||||
account_id: number;
|
|
||||||
/**
|
|
||||||
* 角色ID
|
|
||||||
*/
|
|
||||||
role_id: number;
|
|
||||||
[property: string]: any;
|
|
||||||
}
|
|
||||||
* 返回响应:
|
|
||||||
* {
|
|
||||||
"code": 0,
|
|
||||||
"message": "string",
|
|
||||||
"timestamp": "2019-08-24T14:15:22.123Z"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
## 4. 删除平台账号
|
|
||||||
url: /api/admin/platform-accounts/{id}
|
|
||||||
methods: delete
|
|
||||||
path参数:
|
|
||||||
export interface ApifoxModel {
|
|
||||||
/**
|
|
||||||
* ID
|
|
||||||
*/
|
|
||||||
id: number;
|
|
||||||
[property: string]: any;
|
|
||||||
}
|
|
||||||
响应:
|
|
||||||
* {
|
|
||||||
"code": 0,
|
|
||||||
"message": "string",
|
|
||||||
"timestamp": "2019-08-24T14:15:22.123Z"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
## 5. 获取平台账号详情
|
|
||||||
url: /api/admin/platform-accounts/{id}
|
|
||||||
methods: get
|
|
||||||
响应: {
|
|
||||||
"created_at": "string",
|
|
||||||
"creator": 0,
|
|
||||||
"enterprise_id": 0,
|
|
||||||
"id": 0,
|
|
||||||
"phone": "string",
|
|
||||||
"shop_id": 0,
|
|
||||||
"status": 0,
|
|
||||||
"updated_at": "string",
|
|
||||||
"updater": 0,
|
|
||||||
"user_type": 0,
|
|
||||||
"username": "string"
|
|
||||||
}
|
|
||||||
|
|
||||||
## 6. 编辑平台账号
|
|
||||||
url: /api/admin/platform-accounts/{id}
|
|
||||||
methods: put
|
|
||||||
body:/**
|
|
||||||
* ModelUpdateAccountParams
|
|
||||||
*/
|
|
||||||
export interface ApifoxModel {
|
|
||||||
/**
|
|
||||||
* 密码
|
|
||||||
*/
|
|
||||||
password?: null | string;
|
|
||||||
/**
|
|
||||||
* 手机号
|
|
||||||
*/
|
|
||||||
phone?: null | string;
|
|
||||||
/**
|
|
||||||
* 状态 (0:禁用, 1:启用)
|
|
||||||
*/
|
|
||||||
status?: number | null;
|
|
||||||
/**
|
|
||||||
* 用户名
|
|
||||||
*/
|
|
||||||
username?: null | string;
|
|
||||||
[property: string]: any;
|
|
||||||
}
|
|
||||||
响应: {
|
|
||||||
"created_at": "string",
|
|
||||||
"creator": 0,
|
|
||||||
"enterprise_id": 0,
|
|
||||||
"id": 0,
|
|
||||||
"phone": "string",
|
|
||||||
"shop_id": 0,
|
|
||||||
"status": 0,
|
|
||||||
"updated_at": "string",
|
|
||||||
"updater": 0,
|
|
||||||
"user_type": 0,
|
|
||||||
"username": "string"
|
|
||||||
}
|
|
||||||
|
|
||||||
## 7. 修改密码
|
|
||||||
url: /api/admin/platform-accounts/{id}/password
|
|
||||||
methods: put
|
|
||||||
body:{
|
|
||||||
"new_password": "stringst"
|
|
||||||
}
|
|
||||||
response: {
|
|
||||||
"code": 0,
|
|
||||||
"message": "string",
|
|
||||||
"timestamp": "2019-08-24T14:15:22.123Z"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 8. 获取账号角色
|
|
||||||
url: /api/admin/platform-accounts/{id}/roles
|
|
||||||
methods: get
|
|
||||||
响应: [
|
|
||||||
{
|
|
||||||
"creator": 0,
|
|
||||||
"role_desc": "string",
|
|
||||||
"role_name": "string",
|
|
||||||
"role_type": 0,
|
|
||||||
"status": 0,
|
|
||||||
"updater": 0
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
## 9. 分配角色
|
|
||||||
url: /api/admin/platform-accounts/{id}/roles,
|
|
||||||
methods: post
|
|
||||||
body: {
|
|
||||||
"role_ids": [
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
|
||||||
响应: {
|
|
||||||
"code": 0,
|
|
||||||
"message": "string",
|
|
||||||
"timestamp": "2019-08-24T14:15:22.123Z"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
## 10. 启用/禁用账号
|
|
||||||
url: /api/admin/platform-accounts/{id}/status
|
|
||||||
methods: put,
|
|
||||||
body: {
|
|
||||||
"status": 0
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
# 角色管理中少了三个接口对接
|
|
||||||
|
|
||||||
## 1. 获取角色权限
|
|
||||||
url: /api/admin/roles/{id}/permissions
|
|
||||||
methods: get
|
|
||||||
response: [
|
|
||||||
{
|
|
||||||
"available_for_role_types": "string",
|
|
||||||
"creator": 0,
|
|
||||||
"parent_id": 0,
|
|
||||||
"perm_code": "string",
|
|
||||||
"perm_name": "string",
|
|
||||||
"perm_type": 0,
|
|
||||||
"platform": "string",
|
|
||||||
"sort": 0,
|
|
||||||
"status": 0,
|
|
||||||
"updater": 0,
|
|
||||||
"url": "string"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
/**
|
|
||||||
* ModelPermission
|
|
||||||
*/
|
|
||||||
export interface ApifoxModel {
|
|
||||||
available_for_role_types?: string;
|
|
||||||
creator?: number;
|
|
||||||
parent_id?: number | null;
|
|
||||||
perm_code?: string;
|
|
||||||
perm_name?: string;
|
|
||||||
perm_type?: number;
|
|
||||||
platform?: string;
|
|
||||||
sort?: number;
|
|
||||||
status?: number;
|
|
||||||
updater?: number;
|
|
||||||
url?: string;
|
|
||||||
[property: string]: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
## 2. 分配权限
|
|
||||||
url: /api/admin/roles/{id}/permissions
|
|
||||||
methods: post
|
|
||||||
body: {
|
|
||||||
"perm_ids": [
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
|
||||||
response: {
|
|
||||||
"code": 0,
|
|
||||||
"message": "string",
|
|
||||||
"timestamp": "2019-08-24T14:15:22.123Z"
|
|
||||||
}
|
|
||||||
## 3. 移除权限
|
|
||||||
url: /api/admin/roles/{role_id}/permissions/{perm_id}
|
|
||||||
export interface ApifoxModel {
|
|
||||||
/**
|
|
||||||
* 权限ID
|
|
||||||
*/
|
|
||||||
perm_id: number;
|
|
||||||
/**
|
|
||||||
* 角色ID
|
|
||||||
*/
|
|
||||||
role_id: number;
|
|
||||||
[property: string]: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
methods: delete
|
|
||||||
|
|
||||||
响应: {
|
|
||||||
"code": 0,
|
|
||||||
"message": "string",
|
|
||||||
"timestamp": "2019-08-24T14:15:22.123Z"
|
|
||||||
}
|
|
||||||
6146
docs/部分API.md
6146
docs/部分API.md
File diff suppressed because it is too large
Load Diff
297
docs/页面创建模板.md
297
docs/页面创建模板.md
@@ -1,297 +0,0 @@
|
|||||||
# 页面创建模板
|
|
||||||
|
|
||||||
本文档提供快速创建页面的模板,所有页面遵循统一的风格和结构。
|
|
||||||
|
|
||||||
## 📋 已完成的页面
|
|
||||||
|
|
||||||
### ✅ 账号管理模块
|
|
||||||
- [x] 客户角色管理 (`account-management/customer-role`)
|
|
||||||
- [x] 代理商管理 (`account-management/agent`)
|
|
||||||
- [x] 客户账号管理 (`account-management/customer-account`)
|
|
||||||
- [ ] 客户账号佣金 (`account-management/customer-commission`) - 待创建
|
|
||||||
|
|
||||||
### ✅ 商品管理模块
|
|
||||||
- [x] 号卡管理 (`product/sim-card`)
|
|
||||||
- [ ] 号卡分配 (`product/sim-card-assign`) - 待创建
|
|
||||||
|
|
||||||
## 🔨 待创建的页面
|
|
||||||
|
|
||||||
### 财务管理模块 (`finance/`)
|
|
||||||
1. **佣金提现管理** (`withdrawal/index.vue`)
|
|
||||||
2. **佣金提现设置** (`withdrawal-settings/index.vue`)
|
|
||||||
3. **我的账户** (`my-account/index.vue`)
|
|
||||||
|
|
||||||
### 设置管理模块 (`settings/`)
|
|
||||||
1. **收款商户设置** (`payment-merchant/index.vue`)
|
|
||||||
2. **开发能力管理** (`developer-api/index.vue`)
|
|
||||||
3. **分佣模板** (`commission-template/index.vue`)
|
|
||||||
|
|
||||||
### 批量操作模块 (`batch/`)
|
|
||||||
1. **网卡批量导入** (`sim-import/index.vue`)
|
|
||||||
2. **设备批量导入** (`device-import/index.vue`)
|
|
||||||
3. **换卡通知** (`card-change-notice/index.vue`)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 标准页面模板
|
|
||||||
|
|
||||||
### 基础列表页面模板
|
|
||||||
|
|
||||||
```vue
|
|
||||||
<template>
|
|
||||||
<div class="page-content">
|
|
||||||
<!-- 搜索栏 -->
|
|
||||||
<ElRow>
|
|
||||||
<ElCol :xs="24" :sm="12" :lg="6">
|
|
||||||
<ElInput v-model="searchQuery" placeholder="搜索关键词" clearable></ElInput>
|
|
||||||
</ElCol>
|
|
||||||
<div style="width: 12px"></div>
|
|
||||||
<ElCol :xs="24" :sm="12" :lg="6" class="el-col2">
|
|
||||||
<ElButton v-ripple @click="handleSearch">搜索</ElButton>
|
|
||||||
<ElButton v-ripple @click="showDialog('add')">新增</ElButton>
|
|
||||||
</ElCol>
|
|
||||||
</ElRow>
|
|
||||||
|
|
||||||
<!-- 表格 -->
|
|
||||||
<ArtTable :data="filteredData" index>
|
|
||||||
<template #default>
|
|
||||||
<ElTableColumn label="名称" prop="name" />
|
|
||||||
<ElTableColumn label="编码" prop="code" />
|
|
||||||
<ElTableColumn label="状态" prop="status">
|
|
||||||
<template #default="scope">
|
|
||||||
<ElTag :type="scope.row.status === 'active' ? 'success' : 'info'">
|
|
||||||
{{ scope.row.status === 'active' ? '启用' : '禁用' }}
|
|
||||||
</ElTag>
|
|
||||||
</template>
|
|
||||||
</ElTableColumn>
|
|
||||||
<ElTableColumn label="创建时间" prop="createTime" width="180" />
|
|
||||||
<ElTableColumn fixed="right" label="操作" width="180">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-button link @click="showDialog('edit', scope.row)">编辑</el-button>
|
|
||||||
<el-button link @click="handleDelete(scope.row)">删除</el-button>
|
|
||||||
</template>
|
|
||||||
</ElTableColumn>
|
|
||||||
</template>
|
|
||||||
</ArtTable>
|
|
||||||
|
|
||||||
<!-- 新增/编辑对话框 -->
|
|
||||||
<ElDialog
|
|
||||||
v-model="dialogVisible"
|
|
||||||
:title="dialogType === 'add' ? '新增' : '编辑'"
|
|
||||||
width="600px"
|
|
||||||
align-center
|
|
||||||
>
|
|
||||||
<ElForm ref="formRef" :model="form" :rules="rules" label-width="120px">
|
|
||||||
<ElFormItem label="名称" prop="name">
|
|
||||||
<ElInput v-model="form.name" placeholder="请输入名称" />
|
|
||||||
</ElFormItem>
|
|
||||||
<ElFormItem label="编码" prop="code">
|
|
||||||
<ElInput v-model="form.code" placeholder="请输入编码" />
|
|
||||||
</ElFormItem>
|
|
||||||
<ElFormItem label="状态">
|
|
||||||
<ElSwitch v-model="form.status" active-value="active" inactive-value="inactive" />
|
|
||||||
</ElFormItem>
|
|
||||||
</ElForm>
|
|
||||||
<template #footer>
|
|
||||||
<div class="dialog-footer">
|
|
||||||
<ElButton @click="dialogVisible = false">取消</ElButton>
|
|
||||||
<ElButton type="primary" @click="handleSubmit(formRef)">提交</ElButton>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</ElDialog>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
||||||
import type { FormInstance, FormRules } from 'element-plus'
|
|
||||||
|
|
||||||
defineOptions({ name: 'YourPageName' })
|
|
||||||
|
|
||||||
interface DataItem {
|
|
||||||
id?: string
|
|
||||||
name: string
|
|
||||||
code: string
|
|
||||||
status: 'active' | 'inactive'
|
|
||||||
createTime?: string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mock 数据
|
|
||||||
const mockData = ref<DataItem[]>([
|
|
||||||
{
|
|
||||||
id: '1',
|
|
||||||
name: '示例数据1',
|
|
||||||
code: 'CODE001',
|
|
||||||
status: 'active',
|
|
||||||
createTime: '2026-01-01 10:00:00'
|
|
||||||
}
|
|
||||||
])
|
|
||||||
|
|
||||||
const searchQuery = ref('')
|
|
||||||
const dialogVisible = ref(false)
|
|
||||||
const dialogType = ref<'add' | 'edit'>('add')
|
|
||||||
const formRef = ref<FormInstance>()
|
|
||||||
|
|
||||||
const form = reactive<DataItem>({
|
|
||||||
name: '',
|
|
||||||
code: '',
|
|
||||||
status: 'active'
|
|
||||||
})
|
|
||||||
|
|
||||||
const rules = reactive<FormRules>({
|
|
||||||
name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
|
|
||||||
code: [{ required: true, message: '请输入编码', trigger: 'blur' }]
|
|
||||||
})
|
|
||||||
|
|
||||||
const filteredData = computed(() => {
|
|
||||||
if (!searchQuery.value) return mockData.value
|
|
||||||
return mockData.value.filter((item) =>
|
|
||||||
item.name.toLowerCase().includes(searchQuery.value.toLowerCase())
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
const handleSearch = () => {}
|
|
||||||
|
|
||||||
const showDialog = (type: 'add' | 'edit', row?: DataItem) => {
|
|
||||||
dialogType.value = type
|
|
||||||
dialogVisible.value = true
|
|
||||||
if (type === 'edit' && row) {
|
|
||||||
Object.assign(form, row)
|
|
||||||
} else {
|
|
||||||
Object.assign(form, { name: '', code: '', status: 'active' })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleSubmit = async (formEl: FormInstance | undefined) => {
|
|
||||||
if (!formEl) return
|
|
||||||
await formEl.validate((valid) => {
|
|
||||||
if (valid) {
|
|
||||||
if (dialogType.value === 'add') {
|
|
||||||
mockData.value.push({
|
|
||||||
...form,
|
|
||||||
id: Date.now().toString(),
|
|
||||||
createTime: new Date().toLocaleString('zh-CN')
|
|
||||||
})
|
|
||||||
ElMessage.success('新增成功')
|
|
||||||
} else {
|
|
||||||
const index = mockData.value.findIndex((item) => item.id === form.id)
|
|
||||||
if (index !== -1) mockData.value[index] = { ...form }
|
|
||||||
ElMessage.success('修改成功')
|
|
||||||
}
|
|
||||||
dialogVisible.value = false
|
|
||||||
formEl.resetFields()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleDelete = (row: DataItem) => {
|
|
||||||
ElMessageBox.confirm('确定删除吗?', '删除确认', {
|
|
||||||
confirmButtonText: '确定',
|
|
||||||
cancelButtonText: '取消',
|
|
||||||
type: 'error'
|
|
||||||
}).then(() => {
|
|
||||||
const index = mockData.value.findIndex((item) => item.id === row.id)
|
|
||||||
if (index !== -1) mockData.value.splice(index, 1)
|
|
||||||
ElMessage.success('删除成功')
|
|
||||||
})
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.page-content {
|
|
||||||
// 自定义样式
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 快速创建步骤
|
|
||||||
|
|
||||||
1. **复制模板**:复制上面的标准模板
|
|
||||||
2. **修改组件名**:修改 `defineOptions({ name: 'YourPageName' })`
|
|
||||||
3. **调整接口**:根据业务需求修改 `DataItem` 接口
|
|
||||||
4. **修改 Mock 数据**:替换 `mockData` 中的示例数据
|
|
||||||
5. **调整表单字段**:根据需求增删表单项
|
|
||||||
6. **调整表格列**:修改 `ElTableColumn` 配置
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📚 常用组件
|
|
||||||
|
|
||||||
### 1. ArtTable - 表格组件
|
|
||||||
```vue
|
|
||||||
<ArtTable :data="tableData" index>
|
|
||||||
<template #default>
|
|
||||||
<ElTableColumn label="列名" prop="propName" />
|
|
||||||
</template>
|
|
||||||
</ArtTable>
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 搜索栏布局
|
|
||||||
```vue
|
|
||||||
<ElRow>
|
|
||||||
<ElCol :xs="24" :sm="12" :lg="6">
|
|
||||||
<ElInput v-model="search" placeholder="搜索" clearable />
|
|
||||||
</ElCol>
|
|
||||||
<div style="width: 12px"></div>
|
|
||||||
<ElCol :xs="24" :sm="12" :lg="6">
|
|
||||||
<ElSelect v-model="filter" placeholder="筛选" clearable style="width: 100%">
|
|
||||||
<ElOption label="选项1" value="1" />
|
|
||||||
</ElSelect>
|
|
||||||
</ElCol>
|
|
||||||
<div style="width: 12px"></div>
|
|
||||||
<ElCol :xs="24" :sm="12" :lg="6" class="el-col2">
|
|
||||||
<ElButton v-ripple>搜索</ElButton>
|
|
||||||
</ElCol>
|
|
||||||
</ElRow>
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. 状态标签
|
|
||||||
```vue
|
|
||||||
<ElTag :type="getStatusType(status)">
|
|
||||||
{{ getStatusText(status) }}
|
|
||||||
</ElTag>
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. 操作按钮
|
|
||||||
```vue
|
|
||||||
<el-button link @click="handleEdit(row)">编辑</el-button>
|
|
||||||
<el-button link type="danger" @click="handleDelete(row)">删除</el-button>
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 💡 开发规范
|
|
||||||
|
|
||||||
1. **命名规范**
|
|
||||||
- 组件名:大驼峰 `YourComponent`
|
|
||||||
- 变量名:小驼峰 `yourVariable`
|
|
||||||
- 文件名:小写+连字符 `your-file.vue`
|
|
||||||
|
|
||||||
2. **Mock 数据格式**
|
|
||||||
- 统一使用 `ref<Type[]>([])` 定义
|
|
||||||
- 包含 `id`, `createTime` 等公共字段
|
|
||||||
- 数据应具有代表性,便于测试
|
|
||||||
|
|
||||||
3. **表单验证**
|
|
||||||
- 必填字段添加 `required` 规则
|
|
||||||
- 手机号/邮箱使用正则验证
|
|
||||||
- 提供友好的错误提示
|
|
||||||
|
|
||||||
4. **用户体验**
|
|
||||||
- 操作前使用 `ElMessageBox.confirm` 确认
|
|
||||||
- 操作后使用 `ElMessage` 提示结果
|
|
||||||
- 表单提交后关闭对话框并重置
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔄 下一步
|
|
||||||
|
|
||||||
1. 根据模板快速创建剩余页面
|
|
||||||
2. 完善 Mock 数据使其更真实
|
|
||||||
3. 添加路由配置
|
|
||||||
4. 测试页面功能
|
|
||||||
5. 优化用户体验
|
|
||||||
|
|
||||||
祝开发顺利!🚀
|
|
||||||
433
docs/项目完成总结.md
433
docs/项目完成总结.md
@@ -1,433 +0,0 @@
|
|||||||
# 物联网卡管理系统 - 完整项目总结
|
|
||||||
|
|
||||||
## 📊 完成概况
|
|
||||||
|
|
||||||
**完成时间**: 2026-01-09
|
|
||||||
**开发进度**: 18/18 页面 (100%)
|
|
||||||
**总计文件**: 18 个 Vue 页面组件
|
|
||||||
**状态**: ✅ 全部完成
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ 新创建的页面列表(18个)
|
|
||||||
|
|
||||||
### 第一批:基础模块(13个页面)
|
|
||||||
|
|
||||||
#### 1. 账号管理模块 (3个)
|
|
||||||
1. **客户角色管理** - `src/views/account-management/customer-role/index.vue`
|
|
||||||
2. **代理商管理** - `src/views/account-management/agent/index.vue`
|
|
||||||
3. **客户账号管理** - `src/views/account-management/customer-account/index.vue`
|
|
||||||
|
|
||||||
#### 2. 财务管理模块 (3个)
|
|
||||||
4. **提现管理** - `src/views/finance/withdrawal/index.vue`
|
|
||||||
5. **我的账户** - `src/views/finance/my-account/index.vue`
|
|
||||||
6. **提现设置** - `src/views/finance/withdrawal-settings/index.vue`
|
|
||||||
|
|
||||||
#### 3. 设置管理模块 (3个)
|
|
||||||
7. **支付商户配置** - `src/views/settings/payment-merchant/index.vue`
|
|
||||||
8. **开发者API管理** - `src/views/settings/developer-api/index.vue`
|
|
||||||
9. **分佣模板管理** - `src/views/settings/commission-template/index.vue`
|
|
||||||
|
|
||||||
#### 4. 批量操作模块 (3个)
|
|
||||||
10. **网卡批量导入** - `src/views/batch/sim-import/index.vue`
|
|
||||||
11. **设备批量导入** - `src/views/batch/device-import/index.vue`
|
|
||||||
12. **换卡通知管理** - `src/views/batch/card-change-notice/index.vue`
|
|
||||||
|
|
||||||
#### 5. 产品管理模块 (1个)
|
|
||||||
13. **网卡产品管理** - `src/views/product/sim-card/index.vue`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 第二批:补充模块(5个页面)
|
|
||||||
|
|
||||||
#### 6. 账号管理扩展 (2个)
|
|
||||||
14. **企业客户管理** - `src/views/account-management/enterprise-customer/index.vue`
|
|
||||||
- 创建企业管理账号,只能登录企业端
|
|
||||||
- 依赖客户角色,决定能力边界
|
|
||||||
- 营业执照上传,统一社会信用代码管理
|
|
||||||
- 角色分配和初始余额设置
|
|
||||||
|
|
||||||
15. **客户账号佣金** - `src/views/account-management/customer-commission/index.vue`
|
|
||||||
- 查看账号下全部客户的佣金情况
|
|
||||||
- 提现情况统计和查询
|
|
||||||
- 佣金明细和提现记录
|
|
||||||
- 统计卡片展示(总佣金、已提现、待提现)
|
|
||||||
|
|
||||||
#### 7. 商品管理扩展 (1个)
|
|
||||||
16. **号卡分配** - `src/views/product/sim-card-assign/index.vue`
|
|
||||||
- 为特定代理分配号卡商品
|
|
||||||
- 设置分佣模式(固定/比例/模板)
|
|
||||||
- 特殊折扣设置
|
|
||||||
- 分配记录和取消分配功能
|
|
||||||
|
|
||||||
#### 8. 资产管理模块 (2个)
|
|
||||||
17. **资产分配** - `src/views/asset-management/asset-assign/index.vue`
|
|
||||||
- 支持三种分配模式:网卡批量分配、设备批量分配、网卡+设备分配
|
|
||||||
- 网卡有设备信息时,可同时分配网卡和设备
|
|
||||||
- 批量选择和分配给代理商
|
|
||||||
- 分配记录和批次管理
|
|
||||||
|
|
||||||
18. **换卡申请管理** - `src/views/asset-management/card-replacement-request/index.vue`
|
|
||||||
- 客户提交的换卡申请管理
|
|
||||||
- 处理换卡申请,填充新ICCID
|
|
||||||
- 新卡验证和自动换卡操作
|
|
||||||
- 申请审核(通过/拒绝)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 已存在的页面(复用)
|
|
||||||
|
|
||||||
项目中以下页面已经存在,功能完整,无需重复创建:
|
|
||||||
|
|
||||||
### 卡片管理(card-management)
|
|
||||||
- ✓ 单卡信息 - `card-management/single-card`
|
|
||||||
- ✓ 网卡管理 - `card-management/card-list`
|
|
||||||
- ✓ 网卡明细 - `card-management/card-detail`
|
|
||||||
- ✓ 网卡分配 - `card-management/card-assign`
|
|
||||||
- ✓ 停机管理 - `card-management/card-shutdown`
|
|
||||||
- ✓ 我的网卡 - `card-management/my-cards`
|
|
||||||
- ✓ 线下批量充值 - `card-management/offline-batch-recharge`
|
|
||||||
- ✓ 网卡转接 - `card-management/card-transfer`
|
|
||||||
- ✓ 换卡管理 - `card-management/card-replacement`
|
|
||||||
- ✓ 套餐赠送 - `card-management/package-gift`
|
|
||||||
- ✓ 换卡网卡 - `card-management/card-change-card`
|
|
||||||
|
|
||||||
### 套餐管理(package-management)
|
|
||||||
- ✓ 新建套餐 - `package-management/package-create`
|
|
||||||
- ✓ 批量管理 - `package-management/package-batch`
|
|
||||||
- ✓ 我的套餐 - `package-management/package-list`
|
|
||||||
- ✓ 套餐变更 - `package-management/package-change`
|
|
||||||
- ✓ 套餐分配 - `package-management/package-assign`
|
|
||||||
- ✓ 套餐系列 - `package-management/package-series`
|
|
||||||
- ✓ 套餐佣金 - `package-management/package-commission`
|
|
||||||
|
|
||||||
### 设备管理(device-management)
|
|
||||||
- ✓ 设备管理 - `device-management/devices`
|
|
||||||
|
|
||||||
### 客户管理(account-management)
|
|
||||||
- ✓ 客户管理 - `account-management/customer`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔄 功能与页面对应关系
|
|
||||||
|
|
||||||
根据你提供的完整需求,所有功能已全部实现:
|
|
||||||
|
|
||||||
| 序号 | 功能名称 | 对应页面 | 状态 |
|
|
||||||
|------|---------|---------|------|
|
|
||||||
| 1 | 账号管理-客户角色 | account-management/customer-role | ✅ 已创建 |
|
|
||||||
| 2 | 账号管理-代理商管理 | account-management/agent | ✅ 已创建 |
|
|
||||||
| 3 | 账号管理-企业客户管理 | account-management/enterprise-customer | ✅ 已创建 |
|
|
||||||
| 4 | 账号管理-客户账号管理 | account-management/customer-account | ✅ 已创建 |
|
|
||||||
| 5 | 账户管理-客户账号佣金 | account-management/customer-commission | ✅ 已创建 |
|
|
||||||
| 6 | 账户管理-佣金提现 | finance/withdrawal | ✅ 已创建 |
|
|
||||||
| 7 | 账户管理-佣金提现设置 | finance/withdrawal-settings | ✅ 已创建 |
|
|
||||||
| 8 | 我的财务-我的账户 | finance/my-account | ✅ 已创建 |
|
|
||||||
| 9 | 我的设置-收款商户设置 | settings/payment-merchant | ✅ 已创建 |
|
|
||||||
| 10 | 我的设置-开发能力管理 | settings/developer-api | ✅ 已创建 |
|
|
||||||
| 11 | 我的设置-分佣模板 | settings/commission-template | ✅ 已创建 |
|
|
||||||
| 12 | 商品管理-号卡管理 | product/sim-card | ✅ 已创建 |
|
|
||||||
| 13 | 商品管理-号卡分配 | product/sim-card-assign | ✅ 已创建 |
|
|
||||||
| 14 | 商品管理-套餐系列管理 | package-management/package-series | ✅ 已存在 |
|
|
||||||
| 15 | 商品管理-套餐管理 | package-management/package-list | ✅ 已存在 |
|
|
||||||
| 16 | 商品管理-套餐分配 | package-management/package-assign | ✅ 已存在 |
|
|
||||||
| 17 | 资产管理-单卡信息 | card-management/single-card | ✅ 已存在 |
|
|
||||||
| 18 | 资产管理-网卡管理 | card-management/card-list | ✅ 已存在 |
|
|
||||||
| 19 | 资产管理-设备管理 | device-management/devices | ✅ 已存在 |
|
|
||||||
| 20 | 资产管理-资产分配 | asset-management/asset-assign | ✅ 已创建 |
|
|
||||||
| 21 | 资产管理-换卡申请 | asset-management/card-replacement-request | ✅ 已创建 |
|
|
||||||
| 22 | 批量操作-网卡导入 | batch/sim-import | ✅ 已创建 |
|
|
||||||
| 23 | 批量操作-设备导入 | batch/device-import | ✅ 已创建 |
|
|
||||||
| 24 | 批量操作-线下批量充值 | card-management/offline-batch-recharge | ✅ 已存在 |
|
|
||||||
| 25 | 批量操作-换卡通知 | batch/card-change-notice | ✅ 已创建 |
|
|
||||||
|
|
||||||
**总计:25个功能全部实现 ✅**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 配置文件更新
|
|
||||||
|
|
||||||
### 1. 路由别名配置
|
|
||||||
**文件**: `src/router/routesAlias.ts`
|
|
||||||
|
|
||||||
新增路由别名:
|
|
||||||
```typescript
|
|
||||||
// 账号管理(扩展)
|
|
||||||
EnterpriseCustomer = '/account-management/enterprise-customer'
|
|
||||||
CustomerCommission = '/account-management/customer-commission'
|
|
||||||
|
|
||||||
// 产品管理(扩展)
|
|
||||||
SimCardAssign = '/product/sim-card-assign'
|
|
||||||
|
|
||||||
// 资产管理(新增模块)
|
|
||||||
AssetAssign = '/asset-management/asset-assign'
|
|
||||||
CardReplacementRequest = '/asset-management/card-replacement-request'
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 异步路由配置
|
|
||||||
**文件**: `src/router/routes/asyncRoutes.ts`
|
|
||||||
|
|
||||||
新增路由模块:
|
|
||||||
- 账号管理模块:扩展2个子路由(企业客户、客户佣金)
|
|
||||||
- 产品管理模块:扩展1个子路由(号卡分配)
|
|
||||||
- 资产管理模块:新增模块,2个子路由(资产分配、换卡申请)
|
|
||||||
|
|
||||||
### 3. 国际化配置
|
|
||||||
**文件**: `src/locales/langs/zh.json`
|
|
||||||
|
|
||||||
新增菜单标题:
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"menus": {
|
|
||||||
"accountManagement": {
|
|
||||||
"enterpriseCustomer": "企业客户管理",
|
|
||||||
"customerCommission": "客户账号佣金"
|
|
||||||
},
|
|
||||||
"product": {
|
|
||||||
"simCardAssign": "号卡分配"
|
|
||||||
},
|
|
||||||
"assetManagement": {
|
|
||||||
"title": "资产管理",
|
|
||||||
"assetAssign": "资产分配",
|
|
||||||
"cardReplacementRequest": "换卡申请"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 页面功能特性
|
|
||||||
|
|
||||||
### 🔑 核心功能亮点
|
|
||||||
|
|
||||||
#### 1. 企业客户管理(EnterpriseCustomer)
|
|
||||||
- ✨ 企业信息完整管理(企业名称、统一社会信用代码、地址)
|
|
||||||
- 📄 营业执照上传功能
|
|
||||||
- 👤 联系人信息管理
|
|
||||||
- 🔐 企业端独立登录账号(不能登录管理端)
|
|
||||||
- 🎭 角色分配,依赖客户角色决定能力边界
|
|
||||||
- 💰 初始余额设置
|
|
||||||
- 📊 卡片和设备数量统计
|
|
||||||
- ✅ 状态管理(正常/禁用/待审核)
|
|
||||||
|
|
||||||
#### 2. 客户账号佣金(CustomerCommission)
|
|
||||||
- 📈 统计卡片展示(客户总数、累计佣金、已提现、待提现)
|
|
||||||
- 🔍 多维度筛选(客户类型、佣金范围)
|
|
||||||
- 💵 佣金明细查看(来源、订单号、佣金金额、比例)
|
|
||||||
- 📜 提现记录追踪(提现单号、金额、手续费、状态)
|
|
||||||
- 📊 排序功能(按佣金、提现金额排序)
|
|
||||||
- 📤 数据导出功能
|
|
||||||
|
|
||||||
#### 3. 号卡分配(SimCardAssign)
|
|
||||||
- 🎯 为代理商分配号卡产品
|
|
||||||
- 💰 三种分佣模式:
|
|
||||||
- 固定佣金(每张固定金额)
|
|
||||||
- 比例佣金(按百分比)
|
|
||||||
- 模板佣金(使用预设模板)
|
|
||||||
- 🎁 特殊折扣设置
|
|
||||||
- 📊 库存管理和分配数量追踪
|
|
||||||
- 📝 分配记录查询
|
|
||||||
- ❌ 取消分配功能(恢复库存)
|
|
||||||
|
|
||||||
#### 4. 资产分配(AssetAssign)
|
|
||||||
- 🔀 三种分配模式:
|
|
||||||
- 网卡批量分配(仅分配网卡)
|
|
||||||
- 设备批量分配(仅分配设备)
|
|
||||||
- 网卡+设备分配(网卡有绑定设备时同时分配)
|
|
||||||
- ✅ 批量选择功能
|
|
||||||
- 🎯 分配给指定代理商
|
|
||||||
- 📝 分配说明和备注
|
|
||||||
- 📊 分配历史记录
|
|
||||||
- ⚠️ 资产所有权转移警告
|
|
||||||
|
|
||||||
#### 5. 换卡申请管理(CardReplacementRequest)
|
|
||||||
- 📈 统计卡片(待处理、处理中、已完成、已拒绝)
|
|
||||||
- 🔄 状态流转:待处理 → 处理中 → 已完成
|
|
||||||
- 🆕 填充新卡ICCID功能
|
|
||||||
- ✅ ICCID验证(长度、是否已使用)
|
|
||||||
- ❌ 申请拒绝(需填写拒绝原因)
|
|
||||||
- 📊 申请详情查看
|
|
||||||
- 🔍 多条件筛选(状态、日期范围)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎨 统一设计规范
|
|
||||||
|
|
||||||
### UI组件使用
|
|
||||||
- ✅ ArtTable - 自定义表格组件
|
|
||||||
- ✅ ElCard - 卡片容器
|
|
||||||
- ✅ ElDialog - 对话框
|
|
||||||
- ✅ ElForm - 表单
|
|
||||||
- ✅ ElDescriptions - 描述列表
|
|
||||||
- ✅ ElTag - 标签
|
|
||||||
- ✅ ElProgress - 进度条
|
|
||||||
- ✅ ElUpload - 文件上传
|
|
||||||
|
|
||||||
### 交互模式
|
|
||||||
- ✅ 搜索 + 筛选 + 操作按钮布局
|
|
||||||
- ✅ 列表 + 详情对话框模式
|
|
||||||
- ✅ 确认对话框(删除、状态变更)
|
|
||||||
- ✅ 表单验证和错误提示
|
|
||||||
- ✅ 加载状态和进度展示
|
|
||||||
|
|
||||||
### 数据展示
|
|
||||||
- ✅ 统计卡片(带图标和渐变色)
|
|
||||||
- ✅ 状态标签(不同颜色区分)
|
|
||||||
- ✅ 金额格式化显示
|
|
||||||
- ✅ 时间格式化显示
|
|
||||||
- ✅ 空状态提示
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 如何访问新页面
|
|
||||||
|
|
||||||
开发服务器运行在 `http://localhost:3006`
|
|
||||||
|
|
||||||
### 账号管理模块
|
|
||||||
- `/account-management/customer-role` - 客户角色
|
|
||||||
- `/account-management/agent` - 代理商管理
|
|
||||||
- `/account-management/customer-account` - 客户账号管理
|
|
||||||
- `/account-management/enterprise-customer` - 企业客户管理 ⭐ 新增
|
|
||||||
- `/account-management/customer-commission` - 客户账号佣金 ⭐ 新增
|
|
||||||
|
|
||||||
### 财务管理模块
|
|
||||||
- `/finance/withdrawal` - 提现管理
|
|
||||||
- `/finance/my-account` - 我的账户
|
|
||||||
- `/finance/withdrawal-settings` - 提现设置
|
|
||||||
|
|
||||||
### 设置管理模块
|
|
||||||
- `/settings/payment-merchant` - 支付商户
|
|
||||||
- `/settings/developer-api` - 开发者API
|
|
||||||
- `/settings/commission-template` - 分佣模板
|
|
||||||
|
|
||||||
### 商品管理模块
|
|
||||||
- `/product/sim-card` - 网卡产品管理
|
|
||||||
- `/product/sim-card-assign` - 号卡分配 ⭐ 新增
|
|
||||||
|
|
||||||
### 资产管理模块
|
|
||||||
- `/asset-management/asset-assign` - 资产分配 ⭐ 新增
|
|
||||||
- `/asset-management/card-replacement-request` - 换卡申请 ⭐ 新增
|
|
||||||
|
|
||||||
### 批量操作模块
|
|
||||||
- `/batch/sim-import` - 网卡批量导入
|
|
||||||
- `/batch/device-import` - 设备批量导入
|
|
||||||
- `/batch/card-change-notice` - 换卡通知
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 开发统计
|
|
||||||
|
|
||||||
### 代码规模
|
|
||||||
- **Vue组件**: 18个
|
|
||||||
- **总代码行数**: 约 6000+ 行
|
|
||||||
- **TypeScript接口**: 50+ 个
|
|
||||||
- **Mock数据**: 完整覆盖
|
|
||||||
|
|
||||||
### 开发时间
|
|
||||||
- **第一批页面**: 13个(约2小时)
|
|
||||||
- **第二批页面**: 5个(约1小时)
|
|
||||||
- **配置更新**: 路由+国际化(约30分钟)
|
|
||||||
- **总计**: 约3.5小时
|
|
||||||
|
|
||||||
### 功能覆盖率
|
|
||||||
- ✅ CRUD操作: 100%
|
|
||||||
- ✅ 搜索筛选: 100%
|
|
||||||
- ✅ 状态管理: 100%
|
|
||||||
- ✅ 表单验证: 100%
|
|
||||||
- ✅ 数据统计: 100%
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 下一步工作建议
|
|
||||||
|
|
||||||
### 1. API 对接 🔌
|
|
||||||
- [ ] 将所有 Mock 数据替换为真实 API 调用
|
|
||||||
- [ ] 统一错误处理和提示
|
|
||||||
- [ ] 添加请求拦截器和响应拦截器
|
|
||||||
- [ ] 实现 Token 刷新机制
|
|
||||||
- [ ] 处理接口超时和重试
|
|
||||||
|
|
||||||
### 2. 权限控制 🔐
|
|
||||||
- [ ] 按钮级权限控制(v-permission 指令)
|
|
||||||
- [ ] 数据权限过滤(根据用户角色)
|
|
||||||
- [ ] 路由权限守卫(动态路由注册)
|
|
||||||
- [ ] 操作日志记录
|
|
||||||
|
|
||||||
### 3. 数据验证 ✅
|
|
||||||
- [ ] 完善表单验证规则
|
|
||||||
- [ ] 后端数据校验
|
|
||||||
- [ ] 异常数据处理
|
|
||||||
- [ ] 防重复提交
|
|
||||||
|
|
||||||
### 4. 性能优化 ⚡
|
|
||||||
- [ ] 列表虚拟滚动(大数据量)
|
|
||||||
- [ ] 组件懒加载
|
|
||||||
- [ ] 图片懒加载
|
|
||||||
- [ ] 防抖节流
|
|
||||||
- [ ] 缓存策略
|
|
||||||
|
|
||||||
### 5. 用户体验 ✨
|
|
||||||
- [ ] 骨架屏loading
|
|
||||||
- [ ] 空状态优化
|
|
||||||
- [ ] 错误页面优化
|
|
||||||
- [ ] 操作引导(新手引导)
|
|
||||||
- [ ] 快捷键支持
|
|
||||||
|
|
||||||
### 6. 测试 🧪
|
|
||||||
- [ ] 单元测试(Vitest)
|
|
||||||
- [ ] 集成测试
|
|
||||||
- [ ] E2E 测试(Playwright)
|
|
||||||
- [ ] 性能测试
|
|
||||||
- [ ] 兼容性测试
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📚 相关文档
|
|
||||||
|
|
||||||
- [任务规划文档](./任务规划.md)
|
|
||||||
- [页面创建模板](./页面创建模板.md)
|
|
||||||
- [API对接说明](./API对接说明.md)
|
|
||||||
- [功能需求文档](./功能.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✨ 项目亮点
|
|
||||||
|
|
||||||
### 1. 完整性 ✅
|
|
||||||
- 25个功能需求全部实现
|
|
||||||
- 页面布局统一美观
|
|
||||||
- 交互流程完整合理
|
|
||||||
|
|
||||||
### 2. 规范性 📐
|
|
||||||
- 代码风格统一
|
|
||||||
- TypeScript 类型完整
|
|
||||||
- 组件复用率高
|
|
||||||
- 命名规范清晰
|
|
||||||
|
|
||||||
### 3. 可维护性 🔧
|
|
||||||
- 模块化清晰
|
|
||||||
- Mock数据结构完整
|
|
||||||
- 注释清晰
|
|
||||||
- 易于扩展
|
|
||||||
|
|
||||||
### 4. 用户体验 🎨
|
|
||||||
- 界面美观大方
|
|
||||||
- 操作流程顺畅
|
|
||||||
- 反馈及时明确
|
|
||||||
- 状态提示清晰
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎉 总结
|
|
||||||
|
|
||||||
本次开发共完成 **18 个新页面组件**,配合项目中已有的页面,完整实现了物联网卡管理系统的全部 **25 个功能模块**。
|
|
||||||
|
|
||||||
**开发完成度**: 100% ✅
|
|
||||||
**代码质量**: 优秀 ⭐⭐⭐⭐⭐
|
|
||||||
**可维护性**: 优秀 👍
|
|
||||||
**用户体验**: 优秀 🎨
|
|
||||||
|
|
||||||
所有页面均遵循统一的代码规范,使用 Mock 数据进行开发,界面美观、交互流畅,为后续 API 对接和功能扩展打下了坚实基础。
|
|
||||||
|
|
||||||
项目已经具备完整的功能框架,可以直接对接后端API进行真实数据调试。恭喜项目顺利完成!🎊
|
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
# Design: 后台任务页与操作审计日志文件下载入口
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
当前项目已经具备对象存储上传与下载地址获取能力:
|
||||||
|
|
||||||
|
- `StorageService.getUploadUrl()` 已用于上传导入文件
|
||||||
|
- `StorageService.batchDownloadUrls()` 已封装 `POST /api/admin/storage/batch-download-urls`
|
||||||
|
|
||||||
|
但在后台实际业务入口上,下载链路还没有被接起来:
|
||||||
|
|
||||||
|
- IoT 卡任务页和设备任务页只有“失败数据”等操作,没有“下载原始导入文件”
|
||||||
|
- 共享的资产操作审计日志组件虽然会显示 `文件存储键`,但只能看见 `file_key` 字符串,不能直接下载
|
||||||
|
|
||||||
|
此外,操作审计日志组件是共享组件,同时用于:
|
||||||
|
|
||||||
|
- 资产详情页
|
||||||
|
- IoT 卡列表中的操作审计日志弹窗
|
||||||
|
- 设备列表中的操作审计日志弹窗
|
||||||
|
|
||||||
|
这意味着“下载文件”能力既要复用统一实现,又要允许三个入口使用不同权限编码。
|
||||||
|
|
||||||
|
## Goals / Non-Goals
|
||||||
|
|
||||||
|
- Goals:
|
||||||
|
- 为 IoT 卡任务页增加原始导入文件下载入口
|
||||||
|
- 为设备任务页增加原始导入文件下载入口
|
||||||
|
- 为三个后台审计日志入口增加基于 `file_key` 的内联下载入口
|
||||||
|
- 为以上 5 个入口分别施加独立权限控制
|
||||||
|
- 复用现有 `batch-download-urls` 接口完成下载
|
||||||
|
- Non-Goals:
|
||||||
|
- 不改造对象存储上传流程
|
||||||
|
- 不增加批量下载多个文件的 UI
|
||||||
|
- 不扩展到 C 端页面
|
||||||
|
- 不在本次提案中统一所有历史权限命名差异
|
||||||
|
|
||||||
|
## Decisions
|
||||||
|
|
||||||
|
- Decision: 所有“下载文件”入口统一通过 `POST /api/admin/storage/batch-download-urls` 获取下载 URL
|
||||||
|
|
||||||
|
- Rationale: 现有基础设施已经覆盖私有文件下载,不需要新增独立接口;单文件下载可直接以 `file_keys: [file_key]` 方式复用批量接口。
|
||||||
|
|
||||||
|
- Decision: 任务页“下载文件”继续放在现有操作列中,而不是新增文件列
|
||||||
|
|
||||||
|
- Rationale: IoT 卡任务页和设备任务页已经有行级操作模式;把下载文件放入操作列,和“失败数据”等现有动作一致,改动面更小。
|
||||||
|
|
||||||
|
- Decision: 审计日志中的“下载文件”必须紧跟在 `文件存储键` / `file_key` 值后,而不是放到日志行外层操作区
|
||||||
|
|
||||||
|
- Rationale: 需求明确指出“如果变更内容出现了文件存储键,后面也要跟上下载文件”,因此入口应与该字段形成强绑定。
|
||||||
|
|
||||||
|
- Decision: 共享 `OperationLogsCard` 作为唯一实现,但下载权限由调用入口传入
|
||||||
|
|
||||||
|
- Rationale: 三个审计日志入口复用同一组件,如果把权限写死在组件内部,就无法满足“3 个不同权限编码”的要求。
|
||||||
|
|
||||||
|
- Decision: 本提案默认新增权限编码建议如下
|
||||||
|
|
||||||
|
- 任务页:
|
||||||
|
- `iot_card_task:download_file`
|
||||||
|
- `device_task:download_file`
|
||||||
|
- 审计日志入口:
|
||||||
|
- `asset_info:download_log_file`
|
||||||
|
- `iot_card:download_log_file`
|
||||||
|
- `device:download_log_file`
|
||||||
|
- Rationale: 任务页下载权限与现有同页行级动作前缀保持一致;日志下载权限与各自入口页面前缀保持一致,便于角色配置时理解来源。
|
||||||
|
|
||||||
|
- Decision: 不在本次变更中顺带统一 IoT 卡任务页历史上的 `lot_task:*` / `iot_card_task:*` 前缀差异
|
||||||
|
|
||||||
|
- Rationale: 当前需求只要求增加下载文件权限入口;若同时做权限前缀清理,会把提案扩大为权限命名治理,超出本次范围。
|
||||||
|
|
||||||
|
- Decision: 当 `file_key` 缺失、为空或下载 URL 获取失败时,页面只提示失败,不影响列表或日志正常渲染
|
||||||
|
|
||||||
|
- Rationale: 下载属于增强能力,不应把原有任务列表和审计日志变成硬依赖下载服务的阻塞页面。
|
||||||
|
|
||||||
|
## Risks / Trade-offs
|
||||||
|
|
||||||
|
- 任务列表前端类型当前未显式声明 `file_key`,实施时若接口已返回但类型未补齐,容易出现“功能依赖字段存在但类型缺口”的问题。
|
||||||
|
- `OperationLogsCard` 的 props 和渲染逻辑一旦调整,会同时影响资产详情页、IoT 卡列表弹窗和设备列表弹窗,需要联动验证。
|
||||||
|
- IoT 卡任务页现存 `lot_task:bulk_import` 与 `iot_card_task:*` 并存,新增权限虽可落地,但会继续保留命名历史包袱。
|
||||||
|
|
||||||
|
## Migration Plan
|
||||||
|
|
||||||
|
1. 明确导入任务记录的 `file_key` 契约,并补齐前端类型。
|
||||||
|
2. 在 IoT 卡任务页和设备任务页的操作列增加“下载文件”。
|
||||||
|
3. 为两个任务页接入各自独立的下载权限编码。
|
||||||
|
4. 扩展共享 `OperationLogsCard`,在 `file_key` 场景渲染内联“下载文件”入口。
|
||||||
|
5. 由资产详情页、IoT 卡列表、设备列表分别传入对应的日志下载权限编码。
|
||||||
|
6. 联调验证 5 个入口的权限隔离与下载行为。
|
||||||
|
|
||||||
|
## Open Questions
|
||||||
|
|
||||||
|
- IoT 卡任务新增下载权限默认建议使用 `iot_card_task:download_file`。如果后端权限树仍希望完全沿用 `lot_task:*` 前缀,需要在评审阶段确认是否改为 `lot_task:download_file`。
|
||||||
|
- 当前导入任务列表接口是否已经返回 `file_key` 需要评审确认;若未返回,则实施范围需要同步包含接口契约补齐。
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
# Change: 为后台任务页与操作审计日志补充文件下载入口
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
当前后台已经具备对象存储上传能力和下载 URL 获取接口,但与“下载文件”相关的运营入口仍然缺失两块关键能力:
|
||||||
|
|
||||||
|
- IoT 卡任务页和设备任务页虽然展示了导入任务记录,但操作列里没有“下载文件”入口,运营无法直接回看任务原始导入文件。
|
||||||
|
- 资产操作审计日志已经会显示 `文件存储键` / `file_key`,但仍然只是纯文本,无法直接从日志里发起下载。
|
||||||
|
|
||||||
|
同时,本次需求明确要求这些下载入口按页面上下文拆分权限,不允许任务页和三个审计日志入口共用同一个按钮权限编码。
|
||||||
|
|
||||||
|
如果不补齐这些入口,后台用户仍然需要依赖复制 `file_key`、跳外部系统或人工排查对象存储文件,审计与任务追溯链路会继续断裂。
|
||||||
|
|
||||||
|
本提案仅覆盖后台管理端(admin)能力,不包含 C 端页面和 C 端接口消费逻辑。
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- 为后台任务管理增加原始导入文件下载入口:
|
||||||
|
- 在 IoT 卡任务列表操作列增加“下载文件”
|
||||||
|
- 在设备任务列表操作列增加“下载文件”
|
||||||
|
- 两个任务页分别使用独立按钮权限编码
|
||||||
|
- 为后台资产操作审计日志增加基于 `file_key` 的下载入口:
|
||||||
|
- 当日志变更内容包含 `文件存储键` / `file_key` 时,在对应值后追加“下载文件”
|
||||||
|
- 资产详情页、IoT 卡列表审计日志弹窗、设备列表审计日志弹窗分别使用独立按钮权限编码
|
||||||
|
- 共享日志组件需要支持由不同入口传入对应的下载权限上下文
|
||||||
|
- 明确复用现有下载接口:
|
||||||
|
- 所有下载入口统一通过 `POST /api/admin/storage/batch-download-urls` 获取预签名下载 URL
|
||||||
|
- 本次不新增新的对象存储下载 API
|
||||||
|
- 范围约束:
|
||||||
|
- 不改造上传流程
|
||||||
|
- 不扩展为“文件中心”或批量多文件下载能力
|
||||||
|
- 不顺带统一现有全部权限命名历史差异,仅为本次新增入口定义可审查的权限编码
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Affected specs:
|
||||||
|
- `admin-file-download`
|
||||||
|
- Affected code:
|
||||||
|
- `src/api/modules/storage.ts`
|
||||||
|
- `src/views/asset-management/task-management/iot-card-task/index.vue`
|
||||||
|
- `src/views/asset-management/task-management/device-task/index.vue`
|
||||||
|
- `src/views/asset-management/asset-information/components/OperationLogsCard.vue`
|
||||||
|
- `src/components/business/OperationLogsDialog.vue`
|
||||||
|
- `src/views/asset-management/asset-information/index.vue`
|
||||||
|
- `src/views/asset-management/iot-card-management/index.vue`
|
||||||
|
- `src/views/asset-management/device-list/index.vue`
|
||||||
|
- `src/types/api/card.ts`
|
||||||
|
- `src/types/api/device.ts`
|
||||||
|
- Dependencies:
|
||||||
|
- 依赖现有 `POST /api/admin/storage/batch-download-urls` 可为单个 `file_key` 返回可直接下载的预签名 URL
|
||||||
|
- 与活跃变更 `update-admin-asset-device-signal-and-audit-logs` 存在 `OperationLogsCard.vue` 共享组件交集,实施前需要基于其最新状态合并
|
||||||
|
- 导入任务列表/详情接口需要提供可下载所需的 `file_key`;如果当前接口尚未返回,实施阶段需要同步补齐契约
|
||||||
|
- Breaking changes:
|
||||||
|
- 无外部接口路径和 HTTP 方法层面的破坏性变更;主要是后台入口、权限和前端类型契约的增量扩展
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Admin Import Tasks Provide Source File Download Actions
|
||||||
|
|
||||||
|
The admin import task pages SHALL provide a source-file download action for eligible task rows and SHALL gate the action with page-specific permissions.
|
||||||
|
|
||||||
|
#### Scenario: Show download action on IoT card task rows
|
||||||
|
|
||||||
|
- **GIVEN** 后台 IoT 卡任务列表中的某条任务记录包含可下载的原始文件标识
|
||||||
|
- **AND** 当前用户具备该页面的下载文件权限
|
||||||
|
- **WHEN** 任务列表渲染该条记录
|
||||||
|
- **THEN** 该条记录的操作列 MUST 显示“下载文件”
|
||||||
|
- **AND** 用户点击后,页面 MUST 通过 `POST /api/admin/storage/batch-download-urls` 获取该文件的下载地址并发起下载
|
||||||
|
|
||||||
|
#### Scenario: Show download action on device task rows
|
||||||
|
|
||||||
|
- **GIVEN** 后台设备任务列表中的某条任务记录包含可下载的原始文件标识
|
||||||
|
- **AND** 当前用户具备该页面的下载文件权限
|
||||||
|
- **WHEN** 任务列表渲染该条记录
|
||||||
|
- **THEN** 该条记录的操作列 MUST 显示“下载文件”
|
||||||
|
- **AND** 用户点击后,页面 MUST 通过 `POST /api/admin/storage/batch-download-urls` 获取该文件的下载地址并发起下载
|
||||||
|
|
||||||
|
#### Scenario: Hide task download action when permission or file key is missing
|
||||||
|
|
||||||
|
- **GIVEN** 某条任务记录缺少可下载文件标识,或当前用户不具备该页面的下载文件权限
|
||||||
|
- **WHEN** 任务列表渲染该条记录
|
||||||
|
- **THEN** 页面 MUST NOT 显示“下载文件”入口
|
||||||
|
|
||||||
|
### Requirement: Admin Operation Logs Provide Inline File Download Actions
|
||||||
|
|
||||||
|
The admin asset operation log views SHALL append an inline download action next to `文件存储键` / `file_key` values when a downloadable file exists.
|
||||||
|
|
||||||
|
#### Scenario: Asset detail operation log shows inline download action
|
||||||
|
|
||||||
|
- **GIVEN** 用户在资产详情页查看操作审计日志
|
||||||
|
- **AND** 某条日志变更内容包含 `文件存储键` 或 `file_key`
|
||||||
|
- **AND** 当前用户具备资产详情页日志下载权限
|
||||||
|
- **WHEN** 该日志内容被渲染
|
||||||
|
- **THEN** 页面 MUST 在对应文件键值后显示“下载文件”
|
||||||
|
- **AND** 用户点击后,页面 MUST 通过 `POST /api/admin/storage/batch-download-urls` 获取该文件的下载地址并发起下载
|
||||||
|
|
||||||
|
#### Scenario: IoT card list log dialog shows inline download action
|
||||||
|
|
||||||
|
- **GIVEN** 用户从 IoT 卡列表打开操作审计日志弹窗
|
||||||
|
- **AND** 某条日志变更内容包含 `文件存储键` 或 `file_key`
|
||||||
|
- **AND** 当前用户具备 IoT 卡列表日志下载权限
|
||||||
|
- **WHEN** 该日志内容被渲染
|
||||||
|
- **THEN** 页面 MUST 在对应文件键值后显示“下载文件”
|
||||||
|
|
||||||
|
#### Scenario: Device list log dialog shows inline download action
|
||||||
|
|
||||||
|
- **GIVEN** 用户从设备列表打开操作审计日志弹窗
|
||||||
|
- **AND** 某条日志变更内容包含 `文件存储键` 或 `file_key`
|
||||||
|
- **AND** 当前用户具备设备列表日志下载权限
|
||||||
|
- **WHEN** 该日志内容被渲染
|
||||||
|
- **THEN** 页面 MUST 在对应文件键值后显示“下载文件”
|
||||||
|
|
||||||
|
#### Scenario: Hide inline log download action without permission or file key
|
||||||
|
|
||||||
|
- **GIVEN** 某条日志不包含可下载文件键值,或当前用户不具备当前入口的日志下载权限
|
||||||
|
- **WHEN** 该日志内容被渲染
|
||||||
|
- **THEN** 页面 MUST NOT 显示“下载文件”入口
|
||||||
|
|
||||||
|
### Requirement: Admin File Download Permissions Remain Entry-Specific
|
||||||
|
|
||||||
|
The admin file-download entry points MUST use distinct permission checks per page context instead of sharing one global download permission.
|
||||||
|
|
||||||
|
#### Scenario: Task page permissions are isolated
|
||||||
|
|
||||||
|
- **GIVEN** 某用户具备设备任务页的下载文件权限,但不具备 IoT 卡任务页的下载文件权限
|
||||||
|
- **WHEN** 用户分别访问两个任务页
|
||||||
|
- **THEN** 设备任务页 MAY 显示“下载文件”
|
||||||
|
- **AND** IoT 卡任务页 MUST NOT 因设备任务权限而显示该入口
|
||||||
|
|
||||||
|
#### Scenario: Shared log component respects caller-specific permissions
|
||||||
|
|
||||||
|
- **GIVEN** 某用户具备 IoT 卡列表日志下载权限,但不具备设备列表日志下载权限
|
||||||
|
- **WHEN** 同一共享日志组件分别在两个入口渲染包含 `file_key` 的日志
|
||||||
|
- **THEN** IoT 卡列表入口 MAY 显示“下载文件”
|
||||||
|
- **AND** 设备列表入口 MUST NOT 因共享组件复用而错误显示该入口
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
## 1. Proposal Review
|
||||||
|
|
||||||
|
- [x] 1.1 确认本提案仅覆盖后台管理端,不包含 C 端页面与 C 端接口消费逻辑。
|
||||||
|
- [x] 1.2 确认 5 个新增下载入口需要使用彼此独立的权限编码。
|
||||||
|
- [x] 1.3 确认 IoT 卡任务下载权限是否沿用提案建议 `iot_card_task:download_file`,还是改为 `lot_task:download_file`。
|
||||||
|
- [ ] 1.4 确认导入任务列表/详情接口是否已经提供原始文件下载所需的 `file_key`。
|
||||||
|
|
||||||
|
## 2. Implementation
|
||||||
|
|
||||||
|
- [x] 2.1 补齐 IoT 卡导入任务与设备导入任务的前端类型契约,接收原始文件下载所需字段。
|
||||||
|
- [x] 2.2 在 IoT 卡任务列表操作列增加“下载文件”,并接入独立权限编码。
|
||||||
|
- [x] 2.3 在设备任务列表操作列增加“下载文件”,并接入独立权限编码。
|
||||||
|
- [x] 2.4 复用 `POST /api/admin/storage/batch-download-urls` 实现单文件下载流程。
|
||||||
|
- [x] 2.5 扩展共享操作审计日志组件,在 `文件存储键` / `file_key` 后增加“下载文件”入口。
|
||||||
|
- [x] 2.6 让资产详情页、IoT 卡列表日志弹窗、设备列表日志弹窗分别传入各自的日志下载权限编码。
|
||||||
|
- [x] 2.7 确保无权限或无 `file_key` 时不显示下载入口,且下载失败不影响原有内容渲染。
|
||||||
|
|
||||||
|
## 3. Verification
|
||||||
|
|
||||||
|
- [ ] 3.1 验证 IoT 卡任务页仅在具备对应权限且记录存在可下载文件时显示“下载文件”。
|
||||||
|
- [ ] 3.2 验证设备任务页仅在具备对应权限且记录存在可下载文件时显示“下载文件”。
|
||||||
|
- [ ] 3.3 验证资产详情页操作审计日志中,`文件存储键` 后可按权限显示“下载文件”。
|
||||||
|
- [ ] 3.4 验证 IoT 卡列表操作审计日志弹窗中,`文件存储键` 后可按权限显示“下载文件”。
|
||||||
|
- [ ] 3.5 验证设备列表操作审计日志弹窗中,`文件存储键` 后可按权限显示“下载文件”。
|
||||||
|
- [ ] 3.6 验证 5 个下载入口均通过 `batch-download-urls` 正常发起下载。
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# Change: 补充资产详情 gateway_extend 卡状态扩展展示
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
当前后台“资产信息”页还没有消费接口新增的 `gateway_extend` 字段,因此运营人员无法在资产详情中直接看到运营商侧实际停机原因。
|
||||||
|
|
||||||
|
最新接口契约已经补充两类返回:
|
||||||
|
|
||||||
|
- 设备资产的绑定卡列表项新增 `gateway_extend`
|
||||||
|
- 卡资产详情新增 `gateway_extend`
|
||||||
|
|
||||||
|
如果前端不补齐这部分契约和展示规范,资产详情页会继续丢失上游已经返回的停机原因信息,影响停机排查和运营判断。
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- 为后台“资产信息”页新增 `gateway_extend` 消费规范:
|
||||||
|
- 卡资产详情需接收并保留 `gateway_extend`
|
||||||
|
- 设备资产绑定卡列表项需接收并保留 `gateway_extend`
|
||||||
|
- 页面展示时需按上游原样展示该字段,不做二次翻译或改写
|
||||||
|
- 为后台“资产信息”页新增 `gateway_extend` 展示规范:
|
||||||
|
- 卡资产在“卡信息”区域展示运营商侧实际停机原因
|
||||||
|
- 设备资产在“绑定卡列表”中展示每张卡的运营商侧实际停机原因
|
||||||
|
- 字段为空时展示稳定占位内容
|
||||||
|
- 范围约束:
|
||||||
|
- 仅覆盖后台管理端资产详情页
|
||||||
|
- 不要求本次同步修改卡列表、设备列表或 C 端页面
|
||||||
|
- 不改变后端接口路径、方法和字段命名
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Affected specs:
|
||||||
|
- `asset-information`
|
||||||
|
- Affected code:
|
||||||
|
- `src/types/api/asset.ts`
|
||||||
|
- `src/views/asset-management/asset-information/composables/useAssetInfo.ts`
|
||||||
|
- `src/views/asset-management/asset-information/components/BasicInfoCard.vue`
|
||||||
|
- `src/views/asset-management/asset-information/types.ts`
|
||||||
|
- Dependencies:
|
||||||
|
- 依赖后端资产详情相关响应已返回 `gateway_extend`
|
||||||
|
- Breaking changes:
|
||||||
|
- 无
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Admin Asset Gateway Extend Contract
|
||||||
|
|
||||||
|
The admin asset information integration SHALL accept and preserve `gateway_extend` for card asset details and device bound-card entries.
|
||||||
|
|
||||||
|
#### Scenario: Card asset detail preserves gateway_extend
|
||||||
|
|
||||||
|
- **GIVEN** 用户正在查看后台“资产信息”中的卡资产详情
|
||||||
|
- **AND** 资产详情响应返回 `gateway_extend`
|
||||||
|
- **WHEN** 前端解析并映射卡资产详情数据
|
||||||
|
- **THEN** 页面状态 MUST 保留 `gateway_extend` 原始字符串
|
||||||
|
- **AND** 后续页面渲染 MUST 可以直接消费该字段
|
||||||
|
|
||||||
|
#### Scenario: Device bound-card entries preserve gateway_extend
|
||||||
|
|
||||||
|
- **GIVEN** 用户正在查看后台“资产信息”中的设备资产详情
|
||||||
|
- **AND** 绑定卡列表数据中的某条记录返回 `gateway_extend`
|
||||||
|
- **WHEN** 前端解析初次详情响应或后续刷新返回的绑定卡数据
|
||||||
|
- **THEN** 对应卡记录 MUST 保留各自的 `gateway_extend` 原始字符串
|
||||||
|
- **AND** 绑定卡列表的刷新合并过程 MUST NOT 无故丢失已有的 `gateway_extend`
|
||||||
|
|
||||||
|
### Requirement: Admin Asset Gateway Extend Display
|
||||||
|
|
||||||
|
The admin asset information view SHALL display `gateway_extend` as the carrier-side actual stop reason for card assets and device bound cards.
|
||||||
|
|
||||||
|
#### Scenario: Show gateway_extend on card asset page
|
||||||
|
|
||||||
|
- **GIVEN** 用户正在查看后台“资产信息”中的卡资产详情
|
||||||
|
- **WHEN** 页面渲染“卡信息”区域
|
||||||
|
- **THEN** 页面 MUST 提供“运营商停机原因”或等效标签来展示 `gateway_extend`
|
||||||
|
- **AND** 展示内容 MUST 与上游返回的 `gateway_extend` 保持一致
|
||||||
|
- **AND** 当 `gateway_extend` 为空时,页面 MUST 显示稳定占位内容
|
||||||
|
|
||||||
|
#### Scenario: Show gateway_extend in device bound-card list
|
||||||
|
|
||||||
|
- **GIVEN** 用户正在查看后台“资产信息”中的设备资产详情
|
||||||
|
- **WHEN** 页面渲染“绑定卡列表”
|
||||||
|
- **THEN** 每条绑定卡记录 MUST 提供“运营商停机原因”或等效展示位来展示本卡的 `gateway_extend`
|
||||||
|
- **AND** 展示内容 MUST 与该卡返回的 `gateway_extend` 保持一致
|
||||||
|
- **AND** 当某条卡记录的 `gateway_extend` 为空时,该行 MUST 显示稳定占位内容
|
||||||
15
openspec/changes/add-asset-gateway-extend-display/tasks.md
Normal file
15
openspec/changes/add-asset-gateway-extend-display/tasks.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
## 1. Contract Alignment
|
||||||
|
|
||||||
|
- [x] 1.1 扩展后台资产详情相关类型,支持卡资产详情与设备绑定卡列表中的 `gateway_extend`。
|
||||||
|
- [x] 1.2 调整资产详情数据映射与设备绑定卡刷新合并逻辑,确保 `gateway_extend` 在初次加载和后续刷新后都不会丢失。
|
||||||
|
|
||||||
|
## 2. UI Display
|
||||||
|
|
||||||
|
- [x] 2.1 在卡资产“卡信息”区域新增 `gateway_extend` 展示,作为运营商侧实际停机原因。
|
||||||
|
- [x] 2.2 在设备资产“绑定卡列表”中新增 `gateway_extend` 展示,并为缺失值提供稳定占位内容。
|
||||||
|
|
||||||
|
## 3. Verification
|
||||||
|
|
||||||
|
- [ ] 3.1 验证卡资产详情返回 `gateway_extend` 时页面可按原样展示。
|
||||||
|
- [ ] 3.2 验证设备资产绑定卡列表返回 `gateway_extend` 时每条卡记录展示正确。
|
||||||
|
- [ ] 3.3 验证资产刷新或实时状态更新后,已展示的 `gateway_extend` 不会被错误清空。
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
## Context
|
||||||
|
|
||||||
|
The feature exposes high-impact package usage adjustments from the asset information package list. Because it can change real package consumption and expiration, the UI gate must combine deployment environment, account type, and production button permissions.
|
||||||
|
|
||||||
|
## Goals / Non-Goals
|
||||||
|
|
||||||
|
- Goals: Add two package-list operations, call the documented PATCH APIs, validate operator input, and refresh page data after success.
|
||||||
|
- Goals: Keep production access limited to platform users (`user_type=2`) with explicit button permissions.
|
||||||
|
- Goals: Keep test/development access limited to super admins (`user_type=1`) without requiring button permissions.
|
||||||
|
- Non-Goals: Add backend endpoints, change package list data retrieval, or change existing refund/package display behavior.
|
||||||
|
|
||||||
|
## Decisions
|
||||||
|
|
||||||
|
- Decision: Treat non-production as `import.meta.env.DEV` or a project-defined test mode discovered during implementation; production behavior MUST be used for production builds.
|
||||||
|
- Decision: Use separate permission codes for the two production-only buttons so operators can be granted one action without the other.
|
||||||
|
- Decision: Prefer small modal forms from the package list component unless an existing asset-operation dialog pattern provides a clearer reuse point.
|
||||||
|
- Decision: Send `data_usage_mb` as a non-negative integer MB value and `expires_at` as the selected formatted datetime string.
|
||||||
|
|
||||||
|
## Risks / Trade-offs
|
||||||
|
|
||||||
|
- Permission code names are not specified in the request. Implementation MUST confirm or define final codes before wiring production checks.
|
||||||
|
- Environment naming can vary by deployment. Implementation MUST inspect existing env conventions and avoid making test-only access available in production mode.
|
||||||
|
- Adjusting real used data can make displayed virtual/remaining values stale if the list is not refreshed. The UI MUST refresh after success.
|
||||||
|
|
||||||
|
## Open Questions
|
||||||
|
|
||||||
|
- What are the final production permission codes for “修改已用量” and “修改过期时间”?
|
||||||
|
- Which env flag identifies the requested “测试环境” if it is not `import.meta.env.DEV`?
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# Change: Add asset package admin adjustment actions
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
资产信息页的套餐列表目前只能查看套餐使用记录,缺少运营侧直接修正套餐真实已用量和过期时间的入口。后端已提供对应 PATCH 接口,前端需要补齐受环境、账号类型和按钮权限约束的操作能力。
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- 在资产信息页“套餐列表”的“操作”列新增两个操作:
|
||||||
|
- 修改已用量
|
||||||
|
- 修改过期时间
|
||||||
|
- 新增两个 PATCH 接口的前端契约:
|
||||||
|
- `PATCH /api/admin/assets/{identifier}/packages/{package_usage_id}/used-data`
|
||||||
|
- `PATCH /api/admin/assets/{identifier}/packages/{package_usage_id}/expires-at`
|
||||||
|
- 两个操作按钮使用环境差异化可见性规则:
|
||||||
|
- 线上环境:仅 `user_type=2` 且拥有对应按钮权限时显示
|
||||||
|
- 测试/开发环境:仅 `user_type=1` 显示,不要求按钮权限
|
||||||
|
- 为两个操作提供弹窗表单、输入校验、提交 loading、成功提示和刷新套餐列表行为。
|
||||||
|
- 不改变套餐列表既有字段展示、退款入口或现有套餐流量展示口径。
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Affected specs:
|
||||||
|
- `asset-package-admin-adjustments`
|
||||||
|
- Affected code:
|
||||||
|
- `src/api/modules/asset.ts`
|
||||||
|
- `src/types/api/asset.ts`
|
||||||
|
- `src/views/asset-management/asset-information/components/PackageListCard.vue`
|
||||||
|
- Potential dialog component(s) under `src/views/asset-management/asset-information/components/dialogs/`
|
||||||
|
- Dependencies:
|
||||||
|
- Current asset identifier from asset information page context
|
||||||
|
- Current logged-in account `user_type`
|
||||||
|
- Button permissions for production visibility
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Package List Adjustment Actions
|
||||||
|
|
||||||
|
The asset information package list SHALL provide operator actions to update a package usage record's real used data and expiration time.
|
||||||
|
|
||||||
|
#### Scenario: Render adjustment actions in the package list
|
||||||
|
|
||||||
|
- **GIVEN** 用户正在查看资产信息页的“套餐列表”
|
||||||
|
- **AND** 当前登录账号满足对应操作的可见性规则
|
||||||
|
- **WHEN** 页面渲染套餐列表操作列
|
||||||
|
- **THEN** 系统 MUST 显示“修改已用量”操作
|
||||||
|
- **AND** 系统 MUST 显示“修改过期时间”操作
|
||||||
|
|
||||||
|
#### Scenario: Open used-data adjustment form
|
||||||
|
|
||||||
|
- **GIVEN** 用户可见“修改已用量”操作
|
||||||
|
- **WHEN** 用户点击某条套餐记录的“修改已用量”
|
||||||
|
- **THEN** 系统 MUST 打开修改已用量弹窗
|
||||||
|
- **AND** 弹窗 MUST 展示当前套餐记录上下文
|
||||||
|
- **AND** 表单 MUST 要求输入新的套餐真实已用量 MB
|
||||||
|
|
||||||
|
#### Scenario: Open expiration adjustment form
|
||||||
|
|
||||||
|
- **GIVEN** 用户可见“修改过期时间”操作
|
||||||
|
- **WHEN** 用户点击某条套餐记录的“修改过期时间”
|
||||||
|
- **THEN** 系统 MUST 打开修改过期时间弹窗
|
||||||
|
- **AND** 弹窗 MUST 展示当前套餐记录上下文
|
||||||
|
- **AND** 表单 MUST 要求输入新的套餐过期时间
|
||||||
|
|
||||||
|
### Requirement: Used Data Update API Integration
|
||||||
|
|
||||||
|
The frontend SHALL update a package usage record's real used data through `PATCH /api/admin/assets/{identifier}/packages/{package_usage_id}/used-data`.
|
||||||
|
|
||||||
|
#### Scenario: Submit valid used-data update
|
||||||
|
|
||||||
|
- **GIVEN** 用户正在修改某条套餐记录的已用量
|
||||||
|
- **AND** 当前资产标识符为 `identifier`
|
||||||
|
- **AND** 当前套餐使用记录 ID 为 `package_usage_id`
|
||||||
|
- **WHEN** 用户输入非负整数 `data_usage_mb` 并提交
|
||||||
|
- **THEN** 系统 MUST send `PATCH /api/admin/assets/{identifier}/packages/{package_usage_id}/used-data`
|
||||||
|
- **AND** 请求体 MUST be JSON with `data_usage_mb`
|
||||||
|
- **AND** `data_usage_mb` MUST be a non-negative integer MB value
|
||||||
|
|
||||||
|
#### Scenario: Reject invalid used-data input
|
||||||
|
|
||||||
|
- **GIVEN** 用户正在修改套餐已用量
|
||||||
|
- **WHEN** 用户未输入值、输入负数或输入非整数
|
||||||
|
- **THEN** 系统 MUST block submission
|
||||||
|
- **AND** 系统 MUST show a validation message explaining that the used data must be a non-negative integer MB value
|
||||||
|
- **AND** 系统 MUST NOT call the PATCH endpoint
|
||||||
|
|
||||||
|
#### Scenario: Used-data update succeeds
|
||||||
|
|
||||||
|
- **GIVEN** used-data PATCH request returns `code=0`
|
||||||
|
- **WHEN** 系统收到响应
|
||||||
|
- **THEN** 系统 MUST show a success message
|
||||||
|
- **AND** 系统 MUST close the edit dialog
|
||||||
|
- **AND** 系统 MUST refresh the asset package list so the latest package usage data is displayed
|
||||||
|
|
||||||
|
### Requirement: Expiration Time Update API Integration
|
||||||
|
|
||||||
|
The frontend SHALL update a package usage record's expiration time through `PATCH /api/admin/assets/{identifier}/packages/{package_usage_id}/expires-at`.
|
||||||
|
|
||||||
|
#### Scenario: Submit valid expiration update
|
||||||
|
|
||||||
|
- **GIVEN** 用户正在修改某条套餐记录的过期时间
|
||||||
|
- **AND** 当前资产标识符为 `identifier`
|
||||||
|
- **AND** 当前套餐使用记录 ID 为 `package_usage_id`
|
||||||
|
- **WHEN** 用户输入有效的 `expires_at` 并提交
|
||||||
|
- **THEN** 系统 MUST send `PATCH /api/admin/assets/{identifier}/packages/{package_usage_id}/expires-at`
|
||||||
|
- **AND** 请求体 MUST be JSON with `expires_at`
|
||||||
|
- **AND** `expires_at` MUST be formatted as `YYYY-MM-DD HH:MM:SS` or another backend-accepted RFC3339 string
|
||||||
|
|
||||||
|
#### Scenario: Reject missing expiration input
|
||||||
|
|
||||||
|
- **GIVEN** 用户正在修改套餐过期时间
|
||||||
|
- **WHEN** 用户未选择或未输入过期时间
|
||||||
|
- **THEN** 系统 MUST block submission
|
||||||
|
- **AND** 系统 MUST show a validation message explaining that expiration time is required
|
||||||
|
- **AND** 系统 MUST NOT call the PATCH endpoint
|
||||||
|
|
||||||
|
#### Scenario: Expiration update succeeds
|
||||||
|
|
||||||
|
- **GIVEN** expires-at PATCH request returns `code=0`
|
||||||
|
- **WHEN** 系统收到响应
|
||||||
|
- **THEN** 系统 MUST show a success message
|
||||||
|
- **AND** 系统 MUST close the edit dialog
|
||||||
|
- **AND** 系统 MUST refresh the asset package list so the latest expiration time is displayed
|
||||||
|
|
||||||
|
### Requirement: Environment And Account Visibility Gate
|
||||||
|
|
||||||
|
The frontend SHALL gate both package adjustment actions by environment, current account `user_type`, and production button permissions.
|
||||||
|
|
||||||
|
#### Scenario: Production platform user with permission sees matching action
|
||||||
|
|
||||||
|
- **GIVEN** 当前运行环境为线上环境
|
||||||
|
- **AND** 当前登录账号的 `user_type` 为 `2`
|
||||||
|
- **AND** 当前登录账号拥有“修改已用量”的按钮权限
|
||||||
|
- **WHEN** 页面渲染套餐列表操作列
|
||||||
|
- **THEN** 系统 MUST show “修改已用量”
|
||||||
|
|
||||||
|
#### Scenario: Production platform user without permission cannot see matching action
|
||||||
|
|
||||||
|
- **GIVEN** 当前运行环境为线上环境
|
||||||
|
- **AND** 当前登录账号的 `user_type` 为 `2`
|
||||||
|
- **AND** 当前登录账号缺少“修改过期时间”的按钮权限
|
||||||
|
- **WHEN** 页面渲染套餐列表操作列
|
||||||
|
- **THEN** 系统 MUST NOT show “修改过期时间”
|
||||||
|
|
||||||
|
#### Scenario: Production super admin cannot see adjustment actions
|
||||||
|
|
||||||
|
- **GIVEN** 当前运行环境为线上环境
|
||||||
|
- **AND** 当前登录账号的 `user_type` 为 `1`
|
||||||
|
- **WHEN** 页面渲染套餐列表操作列
|
||||||
|
- **THEN** 系统 MUST NOT show “修改已用量”
|
||||||
|
- **AND** 系统 MUST NOT show “修改过期时间”
|
||||||
|
|
||||||
|
#### Scenario: Test environment super admin sees actions without permissions
|
||||||
|
|
||||||
|
- **GIVEN** 当前运行环境为测试或开发环境
|
||||||
|
- **AND** 当前登录账号的 `user_type` 为 `1`
|
||||||
|
- **AND** 当前登录账号没有两个调整操作的按钮权限
|
||||||
|
- **WHEN** 页面渲染套餐列表操作列
|
||||||
|
- **THEN** 系统 MUST show “修改已用量”
|
||||||
|
- **AND** 系统 MUST show “修改过期时间”
|
||||||
|
|
||||||
|
#### Scenario: Test environment non-super-admin cannot see actions
|
||||||
|
|
||||||
|
- **GIVEN** 当前运行环境为测试或开发环境
|
||||||
|
- **AND** 当前登录账号的 `user_type` is not `1`
|
||||||
|
- **WHEN** 页面渲染套餐列表操作列
|
||||||
|
- **THEN** 系统 MUST NOT show “修改已用量”
|
||||||
|
- **AND** 系统 MUST NOT show “修改过期时间”
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
## 1. Implementation
|
||||||
|
|
||||||
|
- [x] 1.1 Add API request/response types for package used-data and expires-at updates.
|
||||||
|
- [x] 1.2 Add AssetService PATCH methods for `/assets/{identifier}/packages/{package_usage_id}/used-data` and `/assets/{identifier}/packages/{package_usage_id}/expires-at`.
|
||||||
|
- [x] 1.3 Pass the current asset identifier to the package list component if it is not already available there.
|
||||||
|
- [x] 1.4 Add operation buttons to the package list with environment, `user_type`, and permission visibility rules.
|
||||||
|
- [x] 1.5 Add edit-used-data dialog/form with non-negative integer MB validation and submit handling.
|
||||||
|
- [x] 1.6 Add edit-expires-at dialog/form with required datetime validation and submit handling.
|
||||||
|
- [x] 1.7 Refresh package list data and show success feedback after each successful update.
|
||||||
|
- [x] 1.8 Run targeted lint/type checks for changed files and document any unrelated existing failures.
|
||||||
|
|
||||||
|
## 2. Permission Setup
|
||||||
|
|
||||||
|
- [x] 2.1 Confirm final production permission codes for “修改已用量” and “修改过期时间”.
|
||||||
|
- [x] 2.2 Wire the confirmed permission codes into button visibility checks.
|
||||||
|
|
||||||
|
## 3. Validation
|
||||||
|
|
||||||
|
- [x] 3.1 Verify production-mode behavior: `user_type=2` requires the matching permission for each button.
|
||||||
|
- [x] 3.2 Verify test/development-mode behavior: only `user_type=1` sees the buttons and permissions are ignored.
|
||||||
|
- [x] 3.3 Verify unauthorized account types do not see either operation.
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# Change: 新增资产业务状态和世代编号字段
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
后端已在 IoT 卡和设备的资产详情接口中新增 `asset_status`(业务状态)和 `generation`(资产世代编号)字段,前端需要展示这些字段供运营人员查看。
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- 资产信息详情新增 `asset_status` 和 `asset_status_name` 字段,展示业务状态(1:在库, 2:已销售, 3:已换货, 4:已停用)
|
||||||
|
- 资产信息详情新增 `generation` 字段,展示资产世代编号(初始值1,每次换货转新后+1)
|
||||||
|
- 相关格式化函数更新以支持新字段
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Affected specs:
|
||||||
|
- `asset-information`
|
||||||
|
- Affected code:
|
||||||
|
- `src/views/asset-management/asset-information/types.ts` - AssetInfo 接口
|
||||||
|
- `src/views/asset-management/asset-information/components/BasicInfoCard.vue` - 详情展示
|
||||||
|
- `src/views/asset-management/asset-information/composables/useAssetFormatters.ts` - 格式化函数
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Asset Status and Generation Display
|
||||||
|
|
||||||
|
The admin frontend SHALL display `asset_status`, `asset_status_name`, and `generation` fields in the asset information detail page for both IoT cards and devices.
|
||||||
|
|
||||||
|
#### Scenario: Display IoT card asset status and generation
|
||||||
|
|
||||||
|
- **GIVEN** 用户打开 IoT 卡资产信息详情页
|
||||||
|
- **WHEN** 后端返回 `asset_status`、`asset_status_name` 和 `generation` 字段
|
||||||
|
- **THEN** 页面 MUST display the asset status with appropriate tag type
|
||||||
|
- **AND** 页面 MUST display the generation number
|
||||||
|
|
||||||
|
#### Scenario: Display device asset status and generation
|
||||||
|
|
||||||
|
- **GIVEN** 用户打开设备资产信息详情页
|
||||||
|
- **WHEN** 后端返回 `asset_status`、`asset_status_name` 和 `generation` 字段
|
||||||
|
- **THEN** 页面 MUST display the asset status with appropriate tag type
|
||||||
|
- **AND** 页面 MUST display the generation number
|
||||||
|
|
||||||
|
### Requirement: Asset Status Formatting
|
||||||
|
|
||||||
|
The admin frontend SHALL format asset status values with appropriate labels and tag types.
|
||||||
|
|
||||||
|
#### Scenario: Map asset status to display name
|
||||||
|
|
||||||
|
- **GIVEN** `asset_status` value is 1
|
||||||
|
- **THEN** display name MUST be "在库"
|
||||||
|
- **WHEN** `asset_status` value is 2
|
||||||
|
- **THEN** display name MUST be "已销售"
|
||||||
|
- **WHEN** `asset_status` value is 3
|
||||||
|
- **THEN** display name MUST be "已换货"
|
||||||
|
- **WHEN** `asset_status` value is 4
|
||||||
|
- **THEN** display name MUST be "已停用"
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
## 1. Proposal Review
|
||||||
|
|
||||||
|
- [ ] 1.1 确认 `asset_status` 字段含义:1:在库, 2:已销售, 3:已换货, 4:已停用
|
||||||
|
- [ ] 1.2 确认 `generation` 字段含义:资产世代编号,初始值1,每次换货转新后+1
|
||||||
|
|
||||||
|
## 2. Type Updates
|
||||||
|
|
||||||
|
- [ ] 2.1 在 `AssetInfo` 接口中添加 `asset_status?: number`
|
||||||
|
- [ ] 2.2 在 `AssetInfo` 接口中添加 `asset_status_name?: string`
|
||||||
|
- [ ] 2.3 在 `AssetInfo` 接口中添加 `generation?: number`
|
||||||
|
|
||||||
|
## 3. Formatter Functions
|
||||||
|
|
||||||
|
- [ ] 3.1 在 `useAssetFormatters` 中添加 `getAssetStatusName` 函数(如果不存在)
|
||||||
|
- [ ] 3.2 在 `useAssetFormatters` 中添加 `getAssetStatusType` 函数(如果不存在)
|
||||||
|
|
||||||
|
## 4. BasicInfoCard Component
|
||||||
|
|
||||||
|
- [ ] 4.1 在卡信息区域添加「业务状态」展示行
|
||||||
|
- [ ] 4.2 在卡信息区域添加「资产世代」展示行
|
||||||
|
- [ ] 4.3 在设备信息区域添加「业务状态」展示行
|
||||||
|
- [ ] 4.4 在设备信息区域添加「资产世代」展示行
|
||||||
|
|
||||||
|
## 5. Verification
|
||||||
|
|
||||||
|
- [ ] 5.1 验证 IoT 卡详情页正确显示业务状态和世代编号
|
||||||
|
- [ ] 5.2 验证设备详情页正确显示业务状态和世代编号
|
||||||
|
- [ ] 5.3 验证格式化函数正确处理各状态值
|
||||||
@@ -9,12 +9,14 @@
|
|||||||
### 1. 套餐管理模块 (Package Management) ✅
|
### 1. 套餐管理模块 (Package Management) ✅
|
||||||
|
|
||||||
- [x] **套餐系列页面** (`/package-management/package-series`)
|
- [x] **套餐系列页面** (`/package-management/package-series`)
|
||||||
|
|
||||||
- ✅ 引入 `useAuth` composable
|
- ✅ 引入 `useAuth` composable
|
||||||
- ✅ 为"新增套餐系列"按钮添加 `v-permission="'package_series:add'"`
|
- ✅ 为"新增套餐系列"按钮添加 `v-permission="'package_series:add'"`
|
||||||
- ✅ 为状态切换添加 `disabled: !hasAuth('package_series:update_status')`
|
- ✅ 为状态切换添加 `disabled: !hasAuth('package_series:update_status')`
|
||||||
- ✅ 在操作列中使用 `hasAuth()` 判断编辑权限 (`package_series:edit`)和删除权限 (`package_series:delete`)
|
- ✅ 在操作列中使用 `hasAuth()` 判断编辑权限 (`package_series:edit`)和删除权限 (`package_series:delete`)
|
||||||
|
|
||||||
- [x] **套餐列表页面** (`/package-management/package-list`)
|
- [x] **套餐列表页面** (`/package-management/package-list`)
|
||||||
|
|
||||||
- ✅ 引入 `useAuth` composable
|
- ✅ 引入 `useAuth` composable
|
||||||
- ✅ 为"新增套餐"按钮添加 `v-permission="'package:add'"`
|
- ✅ 为"新增套餐"按钮添加 `v-permission="'package:add'"`
|
||||||
- ✅ 为上/下架切换添加 `disabled: !hasAuth('package:update_away')`
|
- ✅ 为上/下架切换添加 `disabled: !hasAuth('package:update_away')`
|
||||||
@@ -22,6 +24,7 @@
|
|||||||
- ✅ 在操作列中使用 `hasAuth()` 判断编辑 (`package:edit`) 和删除 (`package:delete`) 权限
|
- ✅ 在操作列中使用 `hasAuth()` 判断编辑 (`package:edit`) 和删除 (`package:delete`) 权限
|
||||||
|
|
||||||
- [x] **单套餐分配页面** (`/package-management/package-assign`)
|
- [x] **单套餐分配页面** (`/package-management/package-assign`)
|
||||||
|
|
||||||
- ✅ 引入 `useAuth` composable
|
- ✅ 引入 `useAuth` composable
|
||||||
- ✅ 为"新增分配"按钮添加 `v-permission="'package_assign:add'"`
|
- ✅ 为"新增分配"按钮添加 `v-permission="'package_assign:add'"`
|
||||||
- ✅ 为状态切换添加 `disabled: !hasAuth('package_assign:update_status')`
|
- ✅ 为状态切换添加 `disabled: !hasAuth('package_assign:update_status')`
|
||||||
@@ -60,6 +63,7 @@
|
|||||||
### 4. 资产管理模块 (Asset Management) ✅
|
### 4. 资产管理模块 (Asset Management) ✅
|
||||||
|
|
||||||
- [x] **IoT卡管理页面** (`/asset-management/iot-card-management`)
|
- [x] **IoT卡管理页面** (`/asset-management/iot-card-management`)
|
||||||
|
|
||||||
- ✅ 引入 `useAuth` composable
|
- ✅ 引入 `useAuth` composable
|
||||||
- ✅ 为表格头部操作按钮添加权限控制:
|
- ✅ 为表格头部操作按钮添加权限控制:
|
||||||
- 批量分配: `v-permission="'iot_card:batch_allocation'"`
|
- 批量分配: `v-permission="'iot_card:batch_allocation'"`
|
||||||
@@ -73,16 +77,19 @@
|
|||||||
- ✅ 验证权限控制正确工作
|
- ✅ 验证权限控制正确工作
|
||||||
|
|
||||||
- [x] **IoT卡任务页面** (`/asset-management/iot-card-task`)
|
- [x] **IoT卡任务页面** (`/asset-management/iot-card-task`)
|
||||||
|
|
||||||
- ✅ 引入 `useAuth` composable
|
- ✅ 引入 `useAuth` composable
|
||||||
- ✅ 为"批量导入IoT卡"按钮添加 `v-permission="''"`
|
- ✅ 为"批量导入IoT卡"按钮添加 `v-permission="''"`
|
||||||
- ✅ 验证权限控制正确工作
|
- ✅ 验证权限控制正确工作
|
||||||
|
|
||||||
- [x] **设备任务页面** (`/asset-management/device-task`)
|
- [x] **设备任务页面** (`/asset-management/device-task`)
|
||||||
|
|
||||||
- ✅ 引入 `useAuth` composable
|
- ✅ 引入 `useAuth` composable
|
||||||
- ✅ 为"批量导入设备"按钮添加 `v-permission="'device_task:bulk_import'"`
|
- ✅ 为"批量导入设备"按钮添加 `v-permission="'device_task:bulk_import'"`
|
||||||
- ✅ 验证权限控制正确工作
|
- ✅ 验证权限控制正确工作
|
||||||
|
|
||||||
- [x] **设备管理页面** (`/asset-management/device-list`)
|
- [x] **设备管理页面** (`/asset-management/device-list`)
|
||||||
|
|
||||||
- ✅ 引入 `useAuth` composable
|
- ✅ 引入 `useAuth` composable
|
||||||
- ✅ 为表格头部操作按钮添加权限控制:
|
- ✅ 为表格头部操作按钮添加权限控制:
|
||||||
- 批量分配: `v-permission="'devices:batch_allocation'"`
|
- 批量分配: `v-permission="'devices:batch_allocation'"`
|
||||||
@@ -101,6 +108,7 @@
|
|||||||
### 5. 账户管理模块 (Account Module) ✅
|
### 5. 账户管理模块 (Account Module) ✅
|
||||||
|
|
||||||
- [x] **企业客户页面** (`/account/enterprise-customer`)
|
- [x] **企业客户页面** (`/account/enterprise-customer`)
|
||||||
|
|
||||||
- ✅ 引入 `useAuth` composable
|
- ✅ 引入 `useAuth` composable
|
||||||
- ✅ 为"新增企业客户"按钮添加 `v-permission="'enterprise_customer:add'"`
|
- ✅ 为"新增企业客户"按钮添加 `v-permission="'enterprise_customer:add'"`
|
||||||
- ✅ 在操作列中使用 `hasAuth()` 判断以下权限:
|
- ✅ 在操作列中使用 `hasAuth()` 判断以下权限:
|
||||||
@@ -111,6 +119,7 @@
|
|||||||
- ✅ 验证权限控制正确工作
|
- ✅ 验证权限控制正确工作
|
||||||
|
|
||||||
- [x] **运营商管理页面** (`/account/carrier-management`)
|
- [x] **运营商管理页面** (`/account/carrier-management`)
|
||||||
|
|
||||||
- ✅ 引入 `useAuth` composable
|
- ✅ 引入 `useAuth` composable
|
||||||
- ✅ 为"新增运营商"按钮添加 `v-permission="'carrier:add'"`
|
- ✅ 为"新增运营商"按钮添加 `v-permission="'carrier:add'"`
|
||||||
- ✅ 为状态切换添加 `disabled: !hasAuth('carrier:update_status')`
|
- ✅ 为状态切换添加 `disabled: !hasAuth('carrier:update_status')`
|
||||||
@@ -118,16 +127,19 @@
|
|||||||
- ✅ 验证权限控制正确工作
|
- ✅ 验证权限控制正确工作
|
||||||
|
|
||||||
- [x] **订单管理页面** (`/account/orders`)
|
- [x] **订单管理页面** (`/account/orders`)
|
||||||
|
|
||||||
- ✅ 引入 `useAuth` composable
|
- ✅ 引入 `useAuth` composable
|
||||||
- ✅ 为"创建订单"按钮添加 `v-permission="'orders:add'"`
|
- ✅ 为"创建订单"按钮添加 `v-permission="'orders:add'"`
|
||||||
- ✅ 验证权限控制正确工作
|
- ✅ 验证权限控制正确工作
|
||||||
|
|
||||||
- [x] **提现配置页面** (`/account/commission/withdrawal-settings`)
|
- [x] **提现配置页面** (`/account/commission/withdrawal-settings`)
|
||||||
|
|
||||||
- ✅ 引入 `useAuth` composable
|
- ✅ 引入 `useAuth` composable
|
||||||
- ✅ 为"新增配置"按钮添加 `v-permission="'withdrawal_settings:add'"`
|
- ✅ 为"新增配置"按钮添加 `v-permission="'withdrawal_settings:add'"`
|
||||||
- ✅ 验证权限控制正确工作
|
- ✅ 验证权限控制正确工作
|
||||||
|
|
||||||
- [x] **我的佣金页面** (`/account/commission/my-commission`)
|
- [x] **我的佣金页面** (`/account/commission/my-commission`)
|
||||||
|
|
||||||
- ✅ 引入 `useAuth` composable
|
- ✅ 引入 `useAuth` composable
|
||||||
- ✅ 为"发起提现"按钮添加 `v-permission="'my_commission:add'"`
|
- ✅ 为"发起提现"按钮添加 `v-permission="'my_commission:add'"`
|
||||||
- ✅ 验证权限控制正确工作
|
- ✅ 验证权限控制正确工作
|
||||||
@@ -148,6 +160,7 @@
|
|||||||
### 7. 测试与文档
|
### 7. 测试与文档
|
||||||
|
|
||||||
- [ ] **权限控制测试**
|
- [ ] **权限控制测试**
|
||||||
|
|
||||||
- 创建不同权限组合的测试用户
|
- 创建不同权限组合的测试用户
|
||||||
- 验证每个页面的按钮显示/隐藏符合预期
|
- 验证每个页面的按钮显示/隐藏符合预期
|
||||||
- 验证状态切换的启用/禁用符合预期
|
- 验证状态切换的启用/禁用符合预期
|
||||||
|
|||||||
73
openspec/changes/add-export-task-management/design.md
Normal file
73
openspec/changes/add-export-task-management/design.md
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
## Context
|
||||||
|
|
||||||
|
`docs/api.md` 定义了统一导出任务接口,支持 `device` 和 `iot_card` 两个场景,导出格式支持 `xlsx` / `csv`。前端需要提供两个业务列表的导出入口,以及一个可复用的导出任务管理视角,用于查看任务进度、查看详情、下载结果和取消任务。
|
||||||
|
|
||||||
|
现有项目使用 Vue 3 + TypeScript + Element Plus,API 按业务模块放在 `src/api/modules`,类型放在 `src/types/api`,按钮权限通过 `useAuth` 和 `v-permission` 接入。
|
||||||
|
|
||||||
|
## Goals / Non-Goals
|
||||||
|
|
||||||
|
- Goals: 提供统一导出任务 API 封装、可复用创建弹窗、资产管理下导出列表页面、IoT 卡和设备列表导出入口、按钮权限控制。
|
||||||
|
- Goals: 创建导出任务时传入当前列表检索条件快照,避免用户修改筛选条件后影响已经提交的任务。
|
||||||
|
- Non-Goals: 不实现后端导出任务调度、文件生成、对象存储上传或 JWT 鉴权逻辑。
|
||||||
|
- Non-Goals: 不替换现有导入任务页面,也不将导出任务与导入任务合并成同一个页面。
|
||||||
|
- Non-Goals: 不在前端根据 `file_key` 拼接下载地址,下载必须使用详情接口返回的 `download_url`。
|
||||||
|
|
||||||
|
## Decisions
|
||||||
|
|
||||||
|
- Decision: 新增独立能力 `export-task-management`,不复用导入任务能力命名。
|
||||||
|
- Rationale: 导出任务接口、状态流转、下载逻辑和业务入口与导入任务不同,独立能力更容易扩展到更多导出场景。
|
||||||
|
|
||||||
|
- Decision: 创建导出任务弹窗做成业务无关组件,只通过 props 接收 `scene`、`query`、`format`、标题和说明文案。
|
||||||
|
- Rationale: IoT 卡管理和设备管理只需传入不同场景与当前筛选条件,后续其他业务列表可以复用同一组件。
|
||||||
|
|
||||||
|
- Decision: 导出列表页面做成可按 `scene` 筛选的管理视角,而不是为 `device` 和 `iot_card` 各建一套页面。
|
||||||
|
- Rationale: `GET /api/admin/export-tasks` 已提供 `scene` 过滤,统一列表能减少重复代码,也支持未来新增默认场景视角。
|
||||||
|
|
||||||
|
- Decision: 下载操作先调用 `GET /api/admin/export-tasks/{id}`,再使用详情中的 `download_url`。
|
||||||
|
- Rationale: 文档说明下载地址仅在已完成任务详情中返回且有效期 24 小时,列表中的 `file_key` 不应被前端直接用于下载。
|
||||||
|
|
||||||
|
- Decision: 权限编码按业务入口隔离。
|
||||||
|
- Rationale: 创建任务属于来源业务列表权限,导出任务列表中的详情、下载、取消属于导出任务管理权限,避免用户拥有某个列表导出权限后自动获得管理全部导出任务的权限。
|
||||||
|
|
||||||
|
## Data Model
|
||||||
|
|
||||||
|
- `scene`: `device` / `iot_card`。
|
||||||
|
- `format`: `xlsx` / `csv`。
|
||||||
|
- `status`: `1` 待处理、`2` 处理中、`3` 已完成、`4` 失败、`5` 已取消。
|
||||||
|
- `query`: 任意对象,保存发起导出时的业务列表筛选条件快照。
|
||||||
|
|
||||||
|
## Permission Codes
|
||||||
|
|
||||||
|
- `iot_card:export`: IoT 卡管理页导出按钮。
|
||||||
|
- `devices:export`: 设备管理页导出按钮。
|
||||||
|
- `export_task:list`: 导出列表页面访问和查询入口。
|
||||||
|
- `export_task:detail`: 导出列表行详情操作。
|
||||||
|
- `export_task:download`: 导出列表行下载操作。
|
||||||
|
- `export_task:cancel`: 导出列表行取消操作。
|
||||||
|
|
||||||
|
最终权限编码以产品/后端权限配置为准;如需调整,应在实施前同步更新本提案与任务。
|
||||||
|
|
||||||
|
## Risks / Trade-offs
|
||||||
|
|
||||||
|
- Risk: 业务列表筛选字段与后端导出任务 `query` 支持字段不一致。
|
||||||
|
- Mitigation: 复用列表请求参数构造逻辑,并在提测时分别验证 `iot_card` 和 `device` 场景。
|
||||||
|
|
||||||
|
- Risk: 下载地址有效期为 24 小时,用户在旧页面点击下载时可能失效。
|
||||||
|
- Mitigation: 每次下载前重新调用详情接口获取最新可用的 `download_url`。
|
||||||
|
|
||||||
|
- Risk: 取消处理中任务时后端可能只是标记 `cancel_requested`,不是立即变成已取消。
|
||||||
|
- Mitigation: 取消成功后刷新列表并展示后端返回的状态和提示信息。
|
||||||
|
|
||||||
|
## Migration Plan
|
||||||
|
|
||||||
|
1. 增加 API、类型、路由、菜单和组件。
|
||||||
|
2. 在 IoT 卡管理和设备管理接入导出弹窗。
|
||||||
|
3. 新增导出列表页面并接入详情、下载、取消操作。
|
||||||
|
4. 接入权限编码并验证不同权限组合。
|
||||||
|
5. 如后端权限菜单需要同步,按上述权限编码补齐配置。
|
||||||
|
|
||||||
|
## Open Questions
|
||||||
|
|
||||||
|
- 导出格式是否需要在第一版开放给用户选择,还是固定 `xlsx`。
|
||||||
|
- 权限编码是否采用本设计建议,还是需对齐后端已有权限命名。
|
||||||
|
- 导出列表是否需要默认按当前入口过滤场景,还是资产管理下统一列表默认展示全部场景。
|
||||||
44
openspec/changes/add-export-task-management/proposal.md
Normal file
44
openspec/changes/add-export-task-management/proposal.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# Change: 新增统一导出任务管理
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
资产管理中的 IoT 卡与设备列表需要按当前检索条件执行全量导出,直接在前端同步导出容易超时且无法追踪进度。`docs/api.md` 已定义统一导出任务接口,需要在后台管理端补齐创建导出任务、查看任务列表、查看详情、下载结果和取消任务的前端能力。
|
||||||
|
|
||||||
|
同时,导出入口会覆盖多个业务列表和后续可扩展的导出视角,必须做成可复用的弹窗与任务管理能力,并按现有 RBAC 体系为所有按钮和操作补充权限编码。
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- 在资产管理下新增“导出管理”,并在其下新增“导出列表”页面。
|
||||||
|
- 新增统一导出任务前端 API 与类型契约,对接:
|
||||||
|
- `GET /api/admin/export-tasks`
|
||||||
|
- `POST /api/admin/export-tasks`
|
||||||
|
- `GET /api/admin/export-tasks/{id}`
|
||||||
|
- `POST /api/admin/export-tasks/{id}/cancel`
|
||||||
|
- 新增可复用的创建导出任务弹窗,打开时说明“导出规则基于列表中的检索条件全量导出”。
|
||||||
|
- 在 IoT 卡管理页增加导出按钮,默认创建 `scene=iot_card` 的导出任务。
|
||||||
|
- 在设备管理页增加导出按钮,默认创建 `scene=device` 的导出任务。
|
||||||
|
- 导出列表支持分页、场景、状态、创建时间范围筛选,列表数据调用导出任务列表接口,详情/下载调用详情接口,取消操作调用取消接口。
|
||||||
|
- 所有新增按钮和行操作均需要接入权限编码,不允许无权限用户看到或触发对应操作。
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Affected specs:
|
||||||
|
- `export-task-management`
|
||||||
|
- Affected code:
|
||||||
|
- `src/api/modules/exportTask.ts`
|
||||||
|
- `src/types/api/exportTask.ts`
|
||||||
|
- `src/types/api/index.ts`
|
||||||
|
- `src/api/modules/index.ts`
|
||||||
|
- `src/router/routesAlias.ts`
|
||||||
|
- `src/router/routes/asyncRoutes.ts`
|
||||||
|
- `src/views/asset-management/iot-card-management/index.vue`
|
||||||
|
- `src/views/asset-management/device-list/index.vue`
|
||||||
|
- `src/views/asset-management/export-task-management/export-task-list/index.vue`
|
||||||
|
- `src/components/business/ExportTaskCreateDialog.vue`
|
||||||
|
- 菜单与国际化文案配置文件
|
||||||
|
- Dependencies:
|
||||||
|
- 依赖后端按 `docs/api.md` 提供导出任务接口和 JWT 鉴权。
|
||||||
|
- 依赖现有 `useAuth` / `v-permission` 权限基础设施。
|
||||||
|
- 导出创建时传入的 `query` 需要与对应业务列表接口的检索参数保持一致。
|
||||||
|
- Breaking changes:
|
||||||
|
- 无。新增页面、按钮、API 模块和类型均为增量能力。
|
||||||
@@ -0,0 +1,146 @@
|
|||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Export Task API Integration
|
||||||
|
|
||||||
|
The admin frontend SHALL provide a typed API integration for unified export tasks using the REST contract from `docs/api.md`.
|
||||||
|
|
||||||
|
#### Scenario: Query export tasks with filters
|
||||||
|
|
||||||
|
- **GIVEN** 用户打开导出列表页面
|
||||||
|
- **WHEN** 用户按分页、场景、状态或创建时间范围查询导出任务
|
||||||
|
- **THEN** 系统 MUST call `GET /api/admin/export-tasks`
|
||||||
|
- **AND** 系统 MUST support optional query parameters `page`, `page_size`, `scene`, `status`, `start_time`, and `end_time`
|
||||||
|
- **AND** 系统 MUST parse `data.page`, `data.size`, `data.total`, and `data.items` from the response
|
||||||
|
|
||||||
|
#### Scenario: Create export task
|
||||||
|
|
||||||
|
- **GIVEN** 用户在业务列表中确认创建导出任务
|
||||||
|
- **WHEN** 系统提交导出任务
|
||||||
|
- **THEN** 系统 MUST call `POST /api/admin/export-tasks`
|
||||||
|
- **AND** 请求体 MUST include required `scene` and `format`
|
||||||
|
- **AND** 请求体 MAY include `query` containing the current list filter conditions
|
||||||
|
- **AND** 系统 MUST handle the response fields `task_id`, `task_no`, `status`, `status_name`, and `message`
|
||||||
|
|
||||||
|
#### Scenario: Fetch export task detail
|
||||||
|
|
||||||
|
- **GIVEN** 用户需要查看或下载某个导出任务
|
||||||
|
- **WHEN** 系统读取任务详情
|
||||||
|
- **THEN** 系统 MUST call `GET /api/admin/export-tasks/{id}` with the numeric task id
|
||||||
|
- **AND** 系统 MUST support detail fields including progress, row counts, shard counts, `file_key`, `error_message`, timestamps, `download_url`, and `download_expires_at`
|
||||||
|
- **AND** 系统 MUST treat `download_url` as available only when the task is completed and the backend returns it
|
||||||
|
|
||||||
|
#### Scenario: Cancel export task
|
||||||
|
|
||||||
|
- **GIVEN** 用户取消待处理或处理中的导出任务
|
||||||
|
- **WHEN** 系统提交取消请求
|
||||||
|
- **THEN** 系统 MUST call `POST /api/admin/export-tasks/{id}/cancel`
|
||||||
|
- **AND** 系统 MUST handle `task_id`, `status`, `status_name`, `cancel_requested`, and `message` from the response
|
||||||
|
|
||||||
|
### Requirement: Reusable Export Task Creation Dialog
|
||||||
|
|
||||||
|
The admin frontend SHALL provide a reusable dialog for creating export tasks from business list pages.
|
||||||
|
|
||||||
|
#### Scenario: Explain full export rule before task creation
|
||||||
|
|
||||||
|
- **GIVEN** 用户点击业务列表中的导出按钮
|
||||||
|
- **WHEN** 导出弹窗打开
|
||||||
|
- **THEN** 弹窗 MUST clearly state that export rules are based on the current list search conditions and export the full matched result set
|
||||||
|
- **AND** 弹窗 MUST NOT imply that only the current page rows will be exported
|
||||||
|
|
||||||
|
#### Scenario: Create IoT card export task from IoT card management
|
||||||
|
|
||||||
|
- **GIVEN** 用户在 IoT 卡管理页设置了列表检索条件
|
||||||
|
- **AND** 当前用户具备 IoT 卡导出权限
|
||||||
|
- **WHEN** 用户确认创建导出任务
|
||||||
|
- **THEN** 系统 MUST submit `scene="iot_card"`
|
||||||
|
- **AND** 系统 MUST submit the current IoT card list filter conditions as `query`
|
||||||
|
|
||||||
|
#### Scenario: Create device export task from device management
|
||||||
|
|
||||||
|
- **GIVEN** 用户在设备管理页设置了列表检索条件
|
||||||
|
- **AND** 当前用户具备设备导出权限
|
||||||
|
- **WHEN** 用户确认创建导出任务
|
||||||
|
- **THEN** 系统 MUST submit `scene="device"`
|
||||||
|
- **AND** 系统 MUST submit the current device list filter conditions as `query`
|
||||||
|
|
||||||
|
#### Scenario: Snapshot current filters at submission time
|
||||||
|
|
||||||
|
- **GIVEN** 用户修改业务列表筛选条件并重新搜索
|
||||||
|
- **WHEN** 用户随后打开弹窗并确认导出
|
||||||
|
- **THEN** 系统 MUST use the latest applied search conditions in the export task `query`
|
||||||
|
- **AND** 已提交任务的 `query` MUST NOT change when the user later edits the page filters
|
||||||
|
|
||||||
|
### Requirement: Asset Export Task List Page
|
||||||
|
|
||||||
|
The admin frontend SHALL add an export task list under Asset Management > Export Management for viewing and operating export tasks.
|
||||||
|
|
||||||
|
#### Scenario: Render export management navigation
|
||||||
|
|
||||||
|
- **GIVEN** 当前用户具备导出任务列表访问权限
|
||||||
|
- **WHEN** 系统渲染资产管理菜单
|
||||||
|
- **THEN** 系统 MUST provide an Export Management group under Asset Management
|
||||||
|
- **AND** 系统 MUST provide an Export List entry under that group
|
||||||
|
- **AND** 导出列表路由 MUST load the export task list page
|
||||||
|
|
||||||
|
#### Scenario: Display export task rows
|
||||||
|
|
||||||
|
- **GIVEN** 导出任务列表接口返回任务记录
|
||||||
|
- **WHEN** 页面渲染表格
|
||||||
|
- **THEN** 页面 MUST display task number, scene, status name, progress, format, total rows, processed rows, shard counts, file key, error message, and task timestamps when present
|
||||||
|
- **AND** 页面 MUST use stable empty placeholders for missing optional fields
|
||||||
|
|
||||||
|
#### Scenario: View task detail from row action
|
||||||
|
|
||||||
|
- **GIVEN** 用户具备导出任务详情权限
|
||||||
|
- **WHEN** 用户点击某条任务的详情操作
|
||||||
|
- **THEN** 系统 MUST call the task detail API for that row
|
||||||
|
- **AND** 页面 MUST present the returned task detail without losing the current list filters and pagination state
|
||||||
|
|
||||||
|
#### Scenario: Download completed task from row action
|
||||||
|
|
||||||
|
- **GIVEN** 某条导出任务状态为已完成
|
||||||
|
- **AND** 当前用户具备导出任务下载权限
|
||||||
|
- **WHEN** 用户点击下载操作
|
||||||
|
- **THEN** 系统 MUST call the task detail API to obtain `download_url`
|
||||||
|
- **AND** 系统 MUST open or download the file using the returned `download_url`
|
||||||
|
- **AND** 系统 MUST NOT construct a download URL from `file_key` on the frontend
|
||||||
|
|
||||||
|
#### Scenario: Cancel cancellable task from row action
|
||||||
|
|
||||||
|
- **GIVEN** 某条导出任务状态为待处理或处理中
|
||||||
|
- **AND** 当前用户具备导出任务取消权限
|
||||||
|
- **WHEN** 用户确认取消该任务
|
||||||
|
- **THEN** 系统 MUST call the cancel API for that task
|
||||||
|
- **AND** 系统 MUST refresh the list or update the row using the backend response
|
||||||
|
|
||||||
|
#### Scenario: Hide unavailable row actions
|
||||||
|
|
||||||
|
- **GIVEN** 某条导出任务状态为已完成、失败或已取消
|
||||||
|
- **WHEN** 页面渲染该行操作
|
||||||
|
- **THEN** 页面 MUST NOT show the cancel action for that row
|
||||||
|
- **AND** 页面 MUST show the download action only when the task is completed and the user has download permission
|
||||||
|
|
||||||
|
### Requirement: Export Task Permissions
|
||||||
|
|
||||||
|
The admin frontend MUST gate every export-task-related button and row action with explicit permission codes.
|
||||||
|
|
||||||
|
#### Scenario: Hide business export buttons without permission
|
||||||
|
|
||||||
|
- **GIVEN** 当前用户 lacks the IoT card export permission
|
||||||
|
- **WHEN** 用户打开 IoT 卡管理页
|
||||||
|
- **THEN** 页面 MUST NOT display the IoT card export button
|
||||||
|
- **AND** 缺少设备导出权限时,设备管理页 MUST NOT display the device export button
|
||||||
|
|
||||||
|
#### Scenario: Hide export task management operations without permission
|
||||||
|
|
||||||
|
- **GIVEN** 当前用户可以访问导出列表但 lacks download or cancel permissions
|
||||||
|
- **WHEN** 页面渲染导出任务行操作
|
||||||
|
- **THEN** 页面 MUST NOT display the download action without download permission
|
||||||
|
- **AND** 页面 MUST NOT display the cancel action without cancel permission
|
||||||
|
|
||||||
|
#### Scenario: Keep permissions isolated by entry point
|
||||||
|
|
||||||
|
- **GIVEN** 当前用户具备 `iot_card` 导出权限但不具备 `device` 导出权限
|
||||||
|
- **WHEN** 用户分别访问 IoT 卡管理页和设备管理页
|
||||||
|
- **THEN** IoT 卡管理页 MAY display its export button
|
||||||
|
- **AND** 设备管理页 MUST NOT display its export button because of the IoT card permission
|
||||||
51
openspec/changes/add-export-task-management/tasks.md
Normal file
51
openspec/changes/add-export-task-management/tasks.md
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
## 1. Proposal Review
|
||||||
|
|
||||||
|
- [x] 1.1 确认导出按钮权限编码:IoT 卡管理使用 `iot_card:export`,设备管理使用 `devices:export`。
|
||||||
|
- [x] 1.2 确认导出任务管理权限编码:使用 `export_task:list`、`export_task:detail`、`export_task:download`、`export_task:cancel`。
|
||||||
|
- [x] 1.3 确认导出格式默认 `xlsx`,并允许用户在弹窗中切换 `xlsx` / `csv`。
|
||||||
|
- [x] 1.4 确认 IoT 卡和设备列表现有筛选参数作为导出任务 `query` 传给后端。
|
||||||
|
|
||||||
|
## 2. API And Types
|
||||||
|
|
||||||
|
- [x] 2.1 新增导出任务状态、场景、格式、列表项、详情、创建请求、取消响应等 TypeScript 类型。
|
||||||
|
- [x] 2.2 新增 `ExportTaskService`,实现列表、创建、详情、取消接口。
|
||||||
|
- [x] 2.3 在 API 和类型入口文件导出新增模块。
|
||||||
|
- [x] 2.4 对齐统一响应结构 `code`、`msg`、`timestamp`、`data` 和分页结构 `page`、`size`、`total`、`items`。
|
||||||
|
|
||||||
|
## 3. Reusable Export Dialog
|
||||||
|
|
||||||
|
- [x] 3.1 新增可复用创建导出任务弹窗组件,支持传入 `scene`、当前列表查询条件和默认导出格式。
|
||||||
|
- [x] 3.2 弹窗中明确展示导出规则说明:导出规则基于列表中的检索条件全量导出。
|
||||||
|
- [x] 3.3 提交时调用创建导出任务接口,并在成功后提示任务已创建。
|
||||||
|
- [x] 3.4 确保弹窗确认按钮和触发按钮均受对应权限控制。
|
||||||
|
|
||||||
|
## 4. Business Entry Points
|
||||||
|
|
||||||
|
- [x] 4.1 在 IoT 卡管理页增加导出按钮,打开弹窗时默认 `scene=iot_card`,并传入当前筛选条件快照。
|
||||||
|
- [x] 4.2 在设备管理页增加导出按钮,打开弹窗时默认 `scene=device`,并传入当前筛选条件快照。
|
||||||
|
- [x] 4.3 确保重置筛选、分页切换、重新搜索后导出使用最新检索条件。
|
||||||
|
|
||||||
|
## 5. Export Task List Page
|
||||||
|
|
||||||
|
- [x] 5.1 在资产管理下新增“导出管理”分组和“导出列表”路由、菜单、路由别名。
|
||||||
|
- [x] 5.2 导出列表支持分页、场景、状态、创建开始时间、创建结束时间筛选。
|
||||||
|
- [x] 5.3 表格展示任务编号、场景、状态、进度、格式、行数、分片、错误信息和时间字段;列表不展示文件 key。
|
||||||
|
- [x] 5.4 任务编号支持点击进入导出任务详情页,行操作支持下载已完成任务、取消待处理/处理中任务。
|
||||||
|
- [x] 5.5 下载操作必须先调用详情接口获取 `download_url`,且仅在已完成任务可用。
|
||||||
|
- [x] 5.6 取消操作必须调用取消接口,并在成功后刷新列表。
|
||||||
|
|
||||||
|
## 6. Permissions And UX
|
||||||
|
|
||||||
|
- [x] 6.1 为所有新增按钮和行操作添加权限编码检查。
|
||||||
|
- [x] 6.2 无权限时不显示对应入口,不依赖禁用态作为唯一保护。
|
||||||
|
- [x] 6.3 对创建、详情、下载、取消失败提供稳定错误提示,不破坏列表渲染。
|
||||||
|
|
||||||
|
## 7. Verification
|
||||||
|
|
||||||
|
- [x] 7.1 验证 IoT 卡管理页可按当前筛选条件创建 `iot_card` 导出任务。
|
||||||
|
- [x] 7.2 验证设备管理页可按当前筛选条件创建 `device` 导出任务。
|
||||||
|
- [x] 7.3 验证导出列表分页和筛选参数与接口契约一致,且文件 key 不在列表字段中展示。
|
||||||
|
- [x] 7.4 验证点击任务编号进入详情页,已完成任务可通过详情接口获取下载地址并下载。
|
||||||
|
- [x] 7.5 验证待处理/处理中任务可取消,已完成/失败/已取消任务不可取消。
|
||||||
|
- [x] 7.6 验证所有新增按钮和操作在无权限时不可见。
|
||||||
|
- [x] 7.7 运行类型检查和相关 lint;新增文件 lint 通过,整仓构建受既有 TypeScript 债务阻塞。
|
||||||
24
openspec/changes/add-order-export-scene/proposal.md
Normal file
24
openspec/changes/add-order-export-scene/proposal.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Change: 新增订单导出场景
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
导出管理现已支持设备管理和IoT卡管理两个导出场景,需要扩展至订单管理,以便订单列表也能按当前检索条件全量导出。
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- 在导出任务中新增 `order` 导出场景支持
|
||||||
|
- 导出管理列表的场景筛选中新增「订单管理」选项
|
||||||
|
- 订单列表页面新增导出按钮,创建 `scene=order` 的导出任务
|
||||||
|
- 订单导出按钮需要权限编码控制
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Affected specs:
|
||||||
|
- `export-task-management`
|
||||||
|
- Affected code:
|
||||||
|
- `src/types/api/exportTask.ts` - ExportTaskScene 类型
|
||||||
|
- `src/views/asset-management/export-task-management/export-task-list/index.vue` - 场景选项
|
||||||
|
- `src/components/business/ExportTaskCreateDialog.vue` - sceneName 映射
|
||||||
|
- `src/views/order-management/order-list/index.vue` - 导出按钮
|
||||||
|
- Dependencies:
|
||||||
|
- 依赖后端 export task API 支持 `scene=order`
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Order Export Scene Support
|
||||||
|
|
||||||
|
The system SHALL support `scene="order"` for creating export tasks from the order management list.
|
||||||
|
|
||||||
|
#### Scenario: Create order export task from order management
|
||||||
|
|
||||||
|
- **GIVEN** 用户在订单管理页设置了列表检索条件
|
||||||
|
- **AND** 当前用户具备订单导出权限
|
||||||
|
- **WHEN** 用户确认创建导出任务
|
||||||
|
- **THEN** 系统 MUST submit `scene="order"`
|
||||||
|
- **AND** 系统 MUST submit the current order list filter conditions as `query`
|
||||||
|
|
||||||
|
### Requirement: Order Export in Export Task List
|
||||||
|
|
||||||
|
The admin frontend SHALL display "订单管理" as a selectable scene option when filtering export tasks.
|
||||||
|
|
||||||
|
#### Scenario: Filter export tasks by order scene
|
||||||
|
|
||||||
|
- **GIVEN** 用户打开导出列表页面
|
||||||
|
- **WHEN** 用户选择「订单管理」作为场景筛选条件
|
||||||
|
- **THEN** 系统 MUST call `GET /api/admin/export-tasks` with `scene=order`
|
||||||
|
|
||||||
|
## MODIFIED Requirements
|
||||||
|
|
||||||
|
### Requirement: Reusable Export Task Creation Dialog
|
||||||
|
|
||||||
|
The admin frontend already provides a reusable dialog for creating export tasks. This requirement adds the order scene to the scene name mapping.
|
||||||
|
|
||||||
|
#### Scenario: Display order scene name in dialog
|
||||||
|
|
||||||
|
- **GIVEN** 导出弹窗通过 `scene="order"` 打开
|
||||||
|
- **WHEN** 弹窗渲染
|
||||||
|
- **THEN** 弹窗 MUST display "订单管理" as the scene name
|
||||||
33
openspec/changes/add-order-export-scene/tasks.md
Normal file
33
openspec/changes/add-order-export-scene/tasks.md
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
## 1. Proposal Review
|
||||||
|
|
||||||
|
- [ ] 1.1 确认订单导出权限编码(如 `orders:export`)
|
||||||
|
- [ ] 1.2 确认导出任务 scene 值使用 `order`
|
||||||
|
|
||||||
|
## 2. Type Updates
|
||||||
|
|
||||||
|
- [ ] 2.1 在 `ExportTaskScene` 类型中添加 `order` 选项
|
||||||
|
|
||||||
|
## 3. Export Task List Page
|
||||||
|
|
||||||
|
- [ ] 3.1 在导出列表的场景筛选选项中添加「订单管理」
|
||||||
|
|
||||||
|
## 4. Export Dialog Component
|
||||||
|
|
||||||
|
- [ ] 4.1 在 `ExportTaskCreateDialog` 的 `sceneName` 映射中添加 `order` → '订单管理'
|
||||||
|
|
||||||
|
## 5. Order List Page
|
||||||
|
|
||||||
|
- [ ] 5.1 在订单列表页添加导出按钮
|
||||||
|
- [ ] 5.2 使用 `ExportTaskCreateDialog`,传入 `scene="order"` 和当前筛选条件
|
||||||
|
- [ ] 5.3 添加权限控制(按钮需检查 `orders:export` 权限)
|
||||||
|
|
||||||
|
## 6. Permissions And UX
|
||||||
|
|
||||||
|
- [ ] 6.1 导出按钮在无权限时隐藏
|
||||||
|
- [ ] 6.2 创建导出任务成功后提示
|
||||||
|
|
||||||
|
## 7. Verification
|
||||||
|
|
||||||
|
- [ ] 7.1 验证订单列表页可按当前筛选条件创建 `order` 导出任务
|
||||||
|
- [ ] 7.2 验证导出管理列表可按场景筛选 `order` 任务
|
||||||
|
- [ ] 7.3 验证无权限时导出按钮不显示
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
# Design: 支付配置管理能力对齐 MVP 文档
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
`docs/mvp/支付配置.md` 已经给出了后台支付配置的接口文档,包括:
|
||||||
|
|
||||||
|
- 支付配置列表查询
|
||||||
|
- 支付配置创建
|
||||||
|
- 支付配置详情
|
||||||
|
- 支付配置更新
|
||||||
|
- 当前生效配置查询
|
||||||
|
|
||||||
|
但当前仓库没有对应的 OpenSpec 能力说明,现有前端代码也仍沿用 `wechat-config` 命名,容易把“微信配置页面”误读成“仅支持微信支付的页面”。
|
||||||
|
|
||||||
|
同时,MVP 文档里存在一个需要明确记录的歧义:
|
||||||
|
|
||||||
|
- `provider_type` 只列出了 `wechat`、`wechat_v2`、`fuiou`
|
||||||
|
- 字段模型中又出现了完整的 `ali_*` 支付宝字段组
|
||||||
|
|
||||||
|
如果不先明确这层假设,后续实现时很容易在 `provider_type` 是否应支持 `alipay` 上出现分叉。
|
||||||
|
|
||||||
|
## Goals / Non-Goals
|
||||||
|
|
||||||
|
- Goals:
|
||||||
|
- 为支付配置能力建立统一的 OpenSpec 能力边界
|
||||||
|
- 把列表、创建、详情、更新和当前生效配置查询的契约写清楚
|
||||||
|
- 明确敏感字段脱敏和“已配置/未配置”状态展示语义
|
||||||
|
- Non-Goals:
|
||||||
|
- 不在本次 spec 中补充文档未描述的删除接口
|
||||||
|
- 不在本次 spec 中补充文档未描述的激活/停用写接口
|
||||||
|
- 不擅自把 `provider_type` 扩展为文档未枚举的值
|
||||||
|
|
||||||
|
## Decisions
|
||||||
|
|
||||||
|
- Decision: 能力名称使用 `payment-configuration-management`,而不是沿用页面路径中的 `wechat-config`
|
||||||
|
|
||||||
|
- Rationale: 该能力已经覆盖微信、小程序、公众号、支付宝和富友相关字段,业务边界明显大于“微信配置”。
|
||||||
|
|
||||||
|
- Decision: `provider_type` 在本次 spec 中严格按文档限定为 `wechat`、`wechat_v2`、`fuiou`
|
||||||
|
|
||||||
|
- Rationale: 这是文档明确枚举出的渠道主类型,spec 不应凭猜测新增 `alipay`。
|
||||||
|
|
||||||
|
- Decision: `ali_*` 字段在本次 spec 中被视为支付配置对象支持的可选扩展字段,但不单独引入新的 `provider_type`
|
||||||
|
|
||||||
|
- Rationale: 文档已经明确给出这些字段;在没有更正枚举之前,先把它们作为统一字段模型的一部分记录下来。
|
||||||
|
|
||||||
|
- Decision: 所有读取响应中的敏感信息都必须采用脱敏或配置状态标记,不能返回明文密钥
|
||||||
|
|
||||||
|
- Rationale: 文档的详情和当前生效配置示例已经给出了 `***`、`已配置`、`未配置` 这类语义。
|
||||||
|
|
||||||
|
- Decision: 更新接口采用部分更新语义,只要求提交实际需要修改的字段
|
||||||
|
- Rationale: 文档明确说明更新请求“仅传需要修改的字段”,spec 需要保留这个约束。
|
||||||
|
|
||||||
|
## Risks / Trade-offs
|
||||||
|
|
||||||
|
- 风险: 当前前端类型定义尚未覆盖 `ali_*` 字段,按 spec 对齐后会触发类型和页面联动修改。
|
||||||
|
|
||||||
|
- Mitigation: 实施时先调整 `src/types/api/wechatConfig.ts`,再逐步修改列表、表单和详情展示。
|
||||||
|
|
||||||
|
- 风险: 文档没有给出“如何切换当前生效配置”的写接口,只有 `is_active` 状态和 `/active` 查询接口。
|
||||||
|
- Mitigation: 本次 spec 仅约束读取和编辑契约,不推断未文档化的激活写流程。
|
||||||
|
|
||||||
|
## Migration Plan
|
||||||
|
|
||||||
|
1. 先补齐支付配置类型定义和 API 契约。
|
||||||
|
2. 再对齐设置页列表、创建/编辑表单和详情页展示。
|
||||||
|
3. 最后核对首页“当前生效支付配置”展示组件是否遵循相同的脱敏语义。
|
||||||
|
4. 通过文档示例验证列表、详情、更新和当前生效配置的典型返回结构。
|
||||||
|
|
||||||
|
## Open Questions
|
||||||
|
|
||||||
|
- `provider_type` 是否最终应该补充 `alipay`,使其与 `ali_*` 字段组形成一致的一对一渠道语义?
|
||||||
|
- 删除、激活、停用接口是否属于正式 MVP 范围,是否需要在后续文档和 spec 中补齐?
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# Change: 新增支付配置管理规范
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
`docs/mvp/支付配置.md` 已经定义了后台支付配置的 MVP 接口契约,但当前仓库缺少对应的 OpenSpec 能力说明。
|
||||||
|
|
||||||
|
现有前端实现仍以 `wechat-config` 命名该能力,且字段范围与读取语义和文档并不完全一致,例如文档包含统一的 `ali_*` 字段组、敏感字段脱敏规则和“当前生效配置”查询语义。如果不先把能力范围和契约写入 spec,后续 API、类型和页面实现会继续失同步。
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- 新增 `payment-configuration-management` capability,覆盖支付配置列表、创建、详情、更新和当前生效配置查询。
|
||||||
|
- 定义统一的支付配置字段模型:
|
||||||
|
- 基础字段:`id`、`name`、`description`、`provider_type`、`is_active`、`created_at`、`updated_at`
|
||||||
|
- 渠道扩展字段:`wx_*`、`miniapp_*`、`oa_*`、`ali_*`、`fy_*`
|
||||||
|
- 定义读取场景下的敏感字段脱敏规则和“已配置/未配置”状态展示语义。
|
||||||
|
- 明确 `provider_type` 枚举、分页筛选参数,以及更新接口按需提交字段的语义。
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Affected specs:
|
||||||
|
- `payment-configuration-management`
|
||||||
|
- Affected code:
|
||||||
|
- `src/api/modules/wechatConfig.ts`
|
||||||
|
- `src/types/api/wechatConfig.ts`
|
||||||
|
- `src/views/settings/wechat-config/index.vue`
|
||||||
|
- `src/views/settings/wechat-config/detail.vue`
|
||||||
|
- `src/views/dashboard/analysis/widget/ActiveWechatConfig.vue`
|
||||||
|
- Dependencies:
|
||||||
|
- `docs/mvp/支付配置.md`
|
||||||
|
- 后端 `/api/admin/wechat-configs` 相关接口契约
|
||||||
|
- Breaking changes:
|
||||||
|
- 不引入新的路由级破坏性变更,但前端现有 `wechat-config` 类型与展示可能需要补齐文档字段和脱敏语义
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
# Payment Configuration Management Specification
|
||||||
|
|
||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: 支付渠道类型定义
|
||||||
|
|
||||||
|
系统 SHALL 使用统一的 `provider_type` 枚举标识支付渠道主类型。
|
||||||
|
|
||||||
|
#### Scenario: 支持文档定义的渠道枚举
|
||||||
|
|
||||||
|
- **WHEN** 系统接收或返回支付配置对象的 `provider_type`
|
||||||
|
- **THEN** 该值 MUST 为 `wechat`、`wechat_v2` 或 `fuiou` 之一
|
||||||
|
|
||||||
|
### Requirement: 支付配置字段模型
|
||||||
|
|
||||||
|
系统 SHALL 在支付配置的读取和写入契约中支持统一的字段模型。
|
||||||
|
|
||||||
|
#### Scenario: 支持基础字段和渠道扩展字段
|
||||||
|
|
||||||
|
- **WHEN** 系统处理支付配置对象
|
||||||
|
- **THEN** 对象 MUST 支持基础字段 `id`、`name`、`description`、`provider_type`、`is_active`、`created_at`、`updated_at`
|
||||||
|
- **AND** 对象 MUST 支持微信支付字段 `wx_mch_id`、`wx_api_v2_key`、`wx_api_v3_key`、`wx_serial_no`、`wx_notify_url`、`wx_cert_content`、`wx_key_content`
|
||||||
|
- **AND** 对象 MUST 支持小程序字段 `miniapp_app_id`、`miniapp_app_secret`
|
||||||
|
- **AND** 对象 MUST 支持公众号字段 `oa_app_id`、`oa_app_secret`、`oa_token`、`oa_aes_key`、`oa_oauth_redirect_url`
|
||||||
|
- **AND** 对象 MUST 支持支付宝字段 `ali_app_id`、`ali_private_key`、`ali_public_key`、`ali_notify_url`、`ali_return_url`、`ali_pay_expire_minutes`、`ali_production`
|
||||||
|
- **AND** 对象 MUST 支持富友字段 `fy_api_url`、`fy_ins_cd`、`fy_mchnt_cd`、`fy_term_id`、`fy_notify_url`、`fy_private_key`、`fy_public_key`
|
||||||
|
|
||||||
|
### Requirement: 支付配置列表查询
|
||||||
|
|
||||||
|
系统 SHALL 提供支付配置列表查询能力,支持分页和条件筛选。
|
||||||
|
|
||||||
|
#### Scenario: 查询分页支付配置列表
|
||||||
|
|
||||||
|
- **WHEN** 管理员请求 `/api/admin/wechat-configs?page=1&page_size=20`
|
||||||
|
- **THEN** 系统 MUST 返回包含 `code`、`msg`、`timestamp` 和 `data` 的响应
|
||||||
|
- **AND** `data` MUST 包含 `items`、`page`、`size`、`total`
|
||||||
|
- **AND** `page` MUST 从 `1` 开始
|
||||||
|
- **AND** `page_size` MUST 支持 `1-100` 范围内的请求值
|
||||||
|
- **AND** `items` 中的每个配置对象 MUST 至少包含 `id`、`name`、`description`、`provider_type`、`is_active`、`created_at`、`updated_at`
|
||||||
|
|
||||||
|
#### Scenario: 按支付渠道类型筛选
|
||||||
|
|
||||||
|
- **WHEN** 管理员使用 `provider_type=wechat_v2` 查询支付配置列表
|
||||||
|
- **THEN** 系统 MUST 只返回 `provider_type` 为 `wechat_v2` 的配置
|
||||||
|
|
||||||
|
#### Scenario: 按激活状态筛选
|
||||||
|
|
||||||
|
- **WHEN** 管理员使用 `is_active=true` 查询支付配置列表
|
||||||
|
- **THEN** 系统 MUST 只返回当前已激活的支付配置
|
||||||
|
|
||||||
|
### Requirement: 创建支付配置
|
||||||
|
|
||||||
|
系统 SHALL 允许管理员创建支付配置,并保存与所选渠道相关的字段。
|
||||||
|
|
||||||
|
#### Scenario: 创建微信直连支付配置
|
||||||
|
|
||||||
|
- **GIVEN** 管理员提交的请求体包含 `name`、`provider_type=wechat`、`wx_mch_id`、`wx_api_v3_key`、`wx_serial_no`、`wx_cert_content`、`wx_key_content`
|
||||||
|
- **WHEN** 管理员向 `/api/admin/wechat-configs` 发起创建请求
|
||||||
|
- **THEN** 系统 MUST 创建新的支付配置记录
|
||||||
|
- **AND** 响应 MUST 返回新建后的支付配置对象
|
||||||
|
- **AND** 系统 MUST 同时保存请求中提供的可选 `description`、`miniapp_*`、`oa_*`、`ali_*`、`fy_*` 字段
|
||||||
|
|
||||||
|
#### Scenario: 缺少基础必填字段时拒绝创建
|
||||||
|
|
||||||
|
- **WHEN** 创建请求缺少 `name` 或 `provider_type`
|
||||||
|
- **THEN** 系统 MUST 拒绝该请求
|
||||||
|
|
||||||
|
#### Scenario: 缺少微信直连必填字段时拒绝创建
|
||||||
|
|
||||||
|
- **WHEN** 创建请求的 `provider_type=wechat` 且缺少文档要求的微信直连必填字段
|
||||||
|
- **THEN** 系统 MUST 拒绝该请求
|
||||||
|
|
||||||
|
### Requirement: 获取支付配置详情
|
||||||
|
|
||||||
|
系统 SHALL 提供按 ID 查询单个支付配置详情的能力。
|
||||||
|
|
||||||
|
#### Scenario: 返回完整的支付配置详情
|
||||||
|
|
||||||
|
- **WHEN** 管理员请求 `/api/admin/wechat-configs/{id}`
|
||||||
|
- **THEN** 系统 MUST 返回单个支付配置对象
|
||||||
|
- **AND** 返回对象 MUST 包含基础字段和所有已支持的渠道扩展字段
|
||||||
|
|
||||||
|
### Requirement: 更新支付配置
|
||||||
|
|
||||||
|
系统 SHALL 支持按 ID 对支付配置进行部分更新。
|
||||||
|
|
||||||
|
#### Scenario: 仅更新提交的字段
|
||||||
|
|
||||||
|
- **WHEN** 管理员向 `/api/admin/wechat-configs/{id}` 提交只包含 `name` 的更新请求
|
||||||
|
- **THEN** 系统 MUST 只更新已提交的字段
|
||||||
|
- **AND** 系统 MUST 保留未提交字段的原值
|
||||||
|
|
||||||
|
#### Scenario: 更新微信密钥和证书字段
|
||||||
|
|
||||||
|
- **WHEN** 管理员提交包含 `wx_api_v3_key`、`wx_cert_content`、`wx_key_content` 的更新请求
|
||||||
|
- **THEN** 系统 MUST 更新目标支付配置对应的字段值
|
||||||
|
|
||||||
|
### Requirement: 获取当前生效支付配置
|
||||||
|
|
||||||
|
系统 SHALL 提供当前生效支付配置查询能力。
|
||||||
|
|
||||||
|
#### Scenario: 返回当前生效的支付配置
|
||||||
|
|
||||||
|
- **WHEN** 管理员请求 `/api/admin/wechat-configs/active`
|
||||||
|
- **THEN** 系统 MUST 返回当前生效的支付配置对象
|
||||||
|
- **AND** 返回对象中的 `is_active` MUST 等于 `true`
|
||||||
|
- **AND** 返回对象 MUST 遵循与详情接口一致的字段模型
|
||||||
|
|
||||||
|
### Requirement: 敏感字段脱敏与配置状态展示
|
||||||
|
|
||||||
|
系统 SHALL 在读取支付配置时保护敏感信息,并使用配置状态标记展示证书和密钥内容。
|
||||||
|
|
||||||
|
#### Scenario: 读取响应中的密钥字段必须脱敏
|
||||||
|
|
||||||
|
- **WHEN** 系统返回支付配置的读取响应(列表、详情或当前生效配置)
|
||||||
|
- **THEN** `miniapp_app_secret`、`oa_app_secret`、`oa_token`、`oa_aes_key`、`wx_api_v2_key`、`wx_api_v3_key` MUST 以脱敏值返回
|
||||||
|
- **AND** 系统 MUST NOT 在读取响应中返回这些字段的明文值
|
||||||
|
|
||||||
|
#### Scenario: 证书和私钥字段以配置状态表示
|
||||||
|
|
||||||
|
- **WHEN** 系统返回支付配置中的证书或私钥相关字段
|
||||||
|
- **THEN** `wx_cert_content`、`wx_key_content`、`ali_private_key`、`ali_public_key`、`fy_private_key`、`fy_public_key` MUST 以配置状态值返回
|
||||||
|
- **AND** 该状态值 MUST 至少能够区分 `已配置` 和 `未配置`
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# Implementation Tasks
|
||||||
|
|
||||||
|
## 1. 契约与类型对齐
|
||||||
|
|
||||||
|
- [x] 1.1 对齐 `src/types/api/wechatConfig.ts` 的请求与响应类型,补齐 `ali_*` 字段、统一字段模型和分页响应字段。
|
||||||
|
- [x] 1.2 校准 `src/api/modules/wechatConfig.ts` 对列表、详情、创建、更新和当前生效配置接口的调用契约。
|
||||||
|
|
||||||
|
## 2. 设置页能力对齐
|
||||||
|
|
||||||
|
- [x] 2.1 更新 `src/views/settings/wechat-config/index.vue` 的列表筛选、分页和列展示,覆盖文档中的 `provider_type`、`is_active` 和渠道关键字段。
|
||||||
|
- [x] 2.2 更新创建/编辑表单,支持文档定义的微信、小程序、公众号、支付宝和富友字段及其校验规则。
|
||||||
|
- [x] 2.3 更新 `src/views/settings/wechat-config/detail.vue`,按 spec 展示完整字段分组、脱敏信息和配置状态。
|
||||||
|
|
||||||
|
## 3. 当前生效配置展示
|
||||||
|
|
||||||
|
- [x] 3.1 校准 `src/views/dashboard/analysis/widget/ActiveWechatConfig.vue` 对当前生效配置接口及脱敏字段的展示语义。
|
||||||
|
|
||||||
|
## 4. 验证
|
||||||
|
|
||||||
|
- [ ] 4.1 联调并验证列表、详情、创建、更新和当前生效配置查询的典型场景。
|
||||||
|
- [x] 4.2 运行 `cmd /c openspec validate add-payment-configuration-management --strict`。
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
# Design: 后台资产信息设备信号摘要与审计日志可读化
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
当前后台资产信息相关页面已经具备设备实时信息区块和共享的操作审计日志组件,但和最新要求相比存在两个核心问题:
|
||||||
|
|
||||||
|
- 设备实时信息依赖前端根据 `RSRP/RSRQ/SINR` 计算“信号强度”,并直接展示 `RSSI/RSRP/RSRQ/SINR` 原始指标;而最新要求希望后台直接消费后端总结好的 `signal_quality` 与 `signal_bad_reason`。
|
||||||
|
- 操作审计日志虽然已经开始消费 `operation_content_*`,但规则仍不够稳定,容易继续暴露 `xxxid/xxxID` 这类内部字段,也没有围绕新增可读字段形成明确展示约束。
|
||||||
|
|
||||||
|
同时,操作审计日志组件是共享组件,既出现在资产详情页,也出现在卡/设备列表页的审计日志弹窗中,因此展示规则需要一次性收敛。
|
||||||
|
|
||||||
|
## Goals / Non-Goals
|
||||||
|
|
||||||
|
- Goals:
|
||||||
|
- 后台设备实时信息直接展示后端返回的信号摘要字段
|
||||||
|
- 后台页面不再把原始信号指标作为核心展示项
|
||||||
|
- 操作审计日志优先展示业务可读字段,并系统性隐藏内部 ID 字段
|
||||||
|
- 让资产详情页与日志弹窗共用同一套展示规则
|
||||||
|
- Non-Goals:
|
||||||
|
- 不改造 C 端接口与 C 端页面
|
||||||
|
- 不修改后端信号判断规则或日志生成逻辑
|
||||||
|
- 不把本次提案扩展成设备列表、卡列表其他非日志字段的全面重构
|
||||||
|
|
||||||
|
## Decisions
|
||||||
|
|
||||||
|
- Decision: 后台设备实时信息以 `signal_quality` 和 `signal_bad_reason` 作为信号展示真值来源
|
||||||
|
|
||||||
|
- Rationale: 最新接口已经把信号综合判断和可能原因抽象成稳定文案,继续沿用前端启发式计算会造成“双重口径”。
|
||||||
|
|
||||||
|
- Decision: `RSSI/RSRP/RSRQ/SINR` 原始字段仍保留在类型层,但从后台页面展示中移除
|
||||||
|
|
||||||
|
- Rationale: 文档明确说明原始字段仍保留,只是不再作为当前页面的展示主体;保留类型兼容性更稳妥。
|
||||||
|
|
||||||
|
- Decision: 操作审计日志统一优先展示可读业务字段,内部 `id` / `*_id` / `*Id` / `*ID` 一律隐藏
|
||||||
|
|
||||||
|
- Rationale: 新增日志字段的目的就是减少运营对内部标识的理解成本,因此展示层应明确偏向业务字段。
|
||||||
|
|
||||||
|
- Decision: 共享 `OperationLogsCard` 作为唯一日志展示实现,不在资产详情页和弹窗中分叉规则
|
||||||
|
|
||||||
|
- Rationale: 当前弹窗与资产详情页共用同一组件,保持单一规则可以避免不同入口出现展示漂移。
|
||||||
|
|
||||||
|
- Decision: `signal_bad_reason` 按“有值就展示,无值则显示占位”的方式处理
|
||||||
|
- Rationale: 文档把它定义为信号较弱时的怀疑原因提示,但接口仍可能返回空值或缺失值,前端需要稳定兜底。
|
||||||
|
|
||||||
|
## Risks / Trade-offs
|
||||||
|
|
||||||
|
- 活跃变更 `update-order-upload-and-device-switch-mode` 同样修改 `BasicInfoCard.vue`,落地时需要避免覆盖其尚未归档的页面调整。
|
||||||
|
- 共享日志组件的规则收紧后,会同时影响资产详情页和列表页弹窗;这是预期收益,但也要求验证面更广。
|
||||||
|
- 统一隐藏 `xxxid/xxxID` 字段后,若后端暂未补齐某些操作类型的可读字段,个别日志行的展示信息可能变少。
|
||||||
|
|
||||||
|
## Migration Plan
|
||||||
|
|
||||||
|
1. 扩展 admin 资产实时状态类型,接收新增信号摘要字段。
|
||||||
|
2. 调整后台设备实时信息 UI,用摘要字段替代旧信号展示。
|
||||||
|
3. 收敛旧信号计算逻辑的页面使用点。
|
||||||
|
4. 调整共享操作审计日志组件的字段优先级与 ID 过滤规则。
|
||||||
|
5. 在资产详情页和列表页日志弹窗中完成联调验证。
|
||||||
|
|
||||||
|
## Open Questions
|
||||||
|
|
||||||
|
- 暂无。本提案默认“C 端不纳入本次范围”已经确定。
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
# Change: 更新后台资产信息设备信号摘要与操作审计日志展示
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
当前后台资产信息页与操作审计日志展示和最新接口/产品口径存在两类偏差:
|
||||||
|
|
||||||
|
- 设备实时信息仍以前端推导的“信号强度”加 `RSSI/RSRP/RSRQ/SINR` 原始字段为主,而最新需求要求后台直接展示后端摘要字段 `signal_quality` 和 `signal_bad_reason`。
|
||||||
|
- 资产操作审计日志接口已经补充了更多可直接面向运营展示的业务字段,但前端仍可能显示内部 `xxxid/xxxID` 或缺少对可读字段的系统性支持。
|
||||||
|
|
||||||
|
如果不收敛这两类差异,后台页面会继续出现“展示口径与接口设计不一致”“日志可读性不足”的问题。
|
||||||
|
|
||||||
|
本提案仅覆盖后台管理端(admin)能力,不包含 C 端接口和 C 端页面。
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- 更新后台“资产信息”中的设备实时信息展示:
|
||||||
|
- 接入并展示 `data.device_realtime.signal_quality`
|
||||||
|
- 接入并展示 `data.device_realtime.signal_bad_reason`
|
||||||
|
- 从后台页面移除 `RSSI/RSRP/RSRQ/SINR` 及前端推导的旧“信号强度”展示
|
||||||
|
- 保留原始信号字段在类型契约中的可用性,但不再作为后台页面主展示内容
|
||||||
|
- 更新后台“资产操作审计日志”展示:
|
||||||
|
- 支持直接展示 `operation_content_before` / `operation_content_after` 中新增的可读业务字段
|
||||||
|
- 优先展示 `iccid`、`iccids`、`device_virtual_no`、`device_virtual_nos`、`device_imei`、`device_sn`、`shop_name`、`to_shop_name`、`target_shop_name`、`source_shop_name`
|
||||||
|
- 统一隐藏内部 `id` / `*_id` / `*Id` / `*ID` 字段,避免继续向运营暴露内部标识
|
||||||
|
- 明确覆盖 `card_allocate`、`card_recall`、`device_allocate`、`device_recall`、`device_bind_card`、`device_unbind_card` 等关键日志类型
|
||||||
|
- 范围约束:
|
||||||
|
- 不修改 C 端 spec
|
||||||
|
- 不要求本次提案改造 C 端接口消费逻辑
|
||||||
|
- 不改变后端接口路径、HTTP 方法和返回字段命名
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Affected specs:
|
||||||
|
- `asset-information`
|
||||||
|
- `asset-operation-logs`
|
||||||
|
- Affected code:
|
||||||
|
- `src/types/api/asset.ts`
|
||||||
|
- `src/views/asset-management/asset-information/components/BasicInfoCard.vue`
|
||||||
|
- `src/views/asset-management/asset-information/composables/useAssetFormatters.ts`
|
||||||
|
- `src/views/asset-management/asset-information/components/OperationLogsCard.vue`
|
||||||
|
- `src/components/business/OperationLogsDialog.vue`
|
||||||
|
- Dependencies:
|
||||||
|
- 与活跃变更 `update-order-upload-and-device-switch-mode` 存在同页组件交集,实施前需要先对齐 `BasicInfoCard.vue` 的最新状态
|
||||||
|
- 依赖后端已按文档提供 admin 侧新增字段与日志内容
|
||||||
|
- Breaking changes:
|
||||||
|
- 无外部接口破坏性变更;本次主要是后台展示契约与类型定义的增量调整
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Admin Device Realtime Signal Summary
|
||||||
|
|
||||||
|
The admin asset information view SHALL use backend-provided signal summary fields for device assets and MUST NOT continue using raw signal metrics as primary displayed signal content.
|
||||||
|
|
||||||
|
#### Scenario: Show backend signal summary on device asset page
|
||||||
|
|
||||||
|
- **GIVEN** 用户正在查看后台“资产信息”中的设备资产详情
|
||||||
|
- **AND** `device_realtime` 返回了 `signal_quality`
|
||||||
|
- **WHEN** 设备实时信息区块完成渲染
|
||||||
|
- **THEN** 页面 MUST 显示 `signal_quality`
|
||||||
|
- **AND** 页面 MUST 在 `signal_bad_reason` 有值时显示该字段
|
||||||
|
- **AND** 页面 MUST 在 `signal_bad_reason` 为空时显示稳定占位内容
|
||||||
|
|
||||||
|
#### Scenario: Raw signal metrics are no longer shown in admin device realtime section
|
||||||
|
|
||||||
|
- **GIVEN** 用户正在查看后台“资产信息”中的设备实时信息
|
||||||
|
- **WHEN** 页面渲染设备信号相关内容
|
||||||
|
- **THEN** 页面 MUST NOT 显示 `信号强度(RSSI)`、`接收功率(RSRP)`、`接收质量(RSRQ)`、`信噪比(SINR)` 这些原始信号指标标签
|
||||||
|
- **AND** 页面 MUST NOT 继续展示前端推导的旧“信号强度”字段
|
||||||
|
|
||||||
|
### Requirement: Admin Device Realtime Contract Compatibility
|
||||||
|
|
||||||
|
The admin asset information integration SHALL preserve additive signal summary fields in device realtime responses without changing non-signal realtime field behavior.
|
||||||
|
|
||||||
|
#### Scenario: Accept additive signal summary fields from realtime API
|
||||||
|
|
||||||
|
- **GIVEN** `GET /api/admin/assets/:identifier/realtime-status` 或 `POST /api/admin/assets/:identifier/refresh` 返回设备资产实时数据
|
||||||
|
- **WHEN** 前端解析 `data.device_realtime`
|
||||||
|
- **THEN** 前端类型契约 MUST 支持 `signal_quality`
|
||||||
|
- **AND** 前端类型契约 MUST 支持 `signal_bad_reason`
|
||||||
|
- **AND** 其他非信号实时字段 MUST 保持原有展示行为
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Admin Operation Logs Prefer Readable Business Fields
|
||||||
|
|
||||||
|
The admin asset operation log view SHALL prefer readable business fields from operation log content over internal identifiers when rendering change content.
|
||||||
|
|
||||||
|
#### Scenario: Show readable fields for card allocation and recall logs
|
||||||
|
|
||||||
|
- **GIVEN** 一条 `card_allocate` 或 `card_recall` 日志包含 `iccid`、`iccids`、`shop_name`、`to_shop_name` 或 `target_shop_name`
|
||||||
|
- **WHEN** 日志列表渲染该条记录
|
||||||
|
- **THEN** 页面 MUST 优先展示这些可读业务字段
|
||||||
|
- **AND** 用户 MUST NOT 依赖内部店铺 ID 或其他内部标识来理解日志含义
|
||||||
|
|
||||||
|
#### Scenario: Show readable fields for device allocation and recall logs
|
||||||
|
|
||||||
|
- **GIVEN** 一条 `device_allocate` 或 `device_recall` 日志包含 `device_virtual_no`、`device_virtual_nos`、`device_imei`、`shop_name`、`target_shop_name`
|
||||||
|
- **WHEN** 日志列表渲染该条记录
|
||||||
|
- **THEN** 页面 MUST 优先展示这些设备和店铺的可读字段
|
||||||
|
|
||||||
|
#### Scenario: Show readable fields for device bind and unbind logs
|
||||||
|
|
||||||
|
- **GIVEN** 一条 `device_bind_card` 或 `device_unbind_card` 日志包含 `device_virtual_no`、`device_imei`、`device_sn`、`iccid`
|
||||||
|
- **WHEN** 日志列表渲染该条记录
|
||||||
|
- **THEN** 页面 MUST 直接展示这些可读业务字段
|
||||||
|
|
||||||
|
### Requirement: Admin Operation Logs Hide Internal ID Fields
|
||||||
|
|
||||||
|
The admin asset operation log view MUST suppress internal ID-like fields from rendered change content.
|
||||||
|
|
||||||
|
#### Scenario: Hide internal id fields in change content
|
||||||
|
|
||||||
|
- **GIVEN** 某条日志的 `operation_content_before`、`operation_content_after` 或相关字段说明中包含 `id`、`*_id`、`*Id` 或 `*ID`
|
||||||
|
- **WHEN** 日志变更内容被渲染
|
||||||
|
- **THEN** 这些内部 ID 字段 MUST NOT 出现在界面上
|
||||||
|
- **AND** `ICCID`、`IMEI`、`SN`、设备虚拟号、店铺名称等业务可读标识 MUST 仍然允许显示
|
||||||
|
|
||||||
|
#### Scenario: Shared log dialog follows the same hidden-id rule
|
||||||
|
|
||||||
|
- **GIVEN** 用户从资产详情页、设备列表页或卡列表页打开后台操作审计日志
|
||||||
|
- **WHEN** 同一条日志在不同入口被渲染
|
||||||
|
- **THEN** 各入口 MUST 使用一致的字段过滤规则
|
||||||
|
- **AND** 各入口 MUST 一致隐藏内部 `xxxid/xxxID` 字段
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
## 1. Proposal Review
|
||||||
|
|
||||||
|
- [x] 1.1 与产品/需求方确认本提案仅覆盖后台管理端,不包含 C 端范围。
|
||||||
|
- [ ] 1.2 确认设备实时信息中应保留的非信号字段范围,避免误删其他设备状态信息。
|
||||||
|
- [x] 1.3 确认操作审计日志中 `xxxid/xxxID` 字段统一隐藏的展示规则。
|
||||||
|
|
||||||
|
## 2. Implementation
|
||||||
|
|
||||||
|
- [x] 2.1 扩展 admin 资产实时状态相关类型,接收 `device_realtime.signal_quality` 与 `device_realtime.signal_bad_reason`。
|
||||||
|
- [x] 2.2 调整后台资产信息页的设备实时信息展示,改为展示后端摘要字段,并移除旧的信号强度推导与原始信号指标展示。
|
||||||
|
- [x] 2.3 清理或收敛只为旧信号展示服务的前端格式化逻辑,避免残留无效 UI 计算。
|
||||||
|
- [x] 2.4 调整操作审计日志展示逻辑,优先展示新增可读业务字段。
|
||||||
|
- [x] 2.5 统一隐藏日志中的 `id` / `*_id` / `*Id` / `*ID` 字段,同时保留 `ICCID`、`IMEI`、`SN`、设备虚拟号等业务标识展示。
|
||||||
|
- [x] 2.6 验证资产详情页与列表页中的操作审计日志弹窗展示一致。
|
||||||
|
|
||||||
|
## 3. Verification
|
||||||
|
|
||||||
|
- [ ] 3.1 验证 `GET /api/admin/assets/:identifier/realtime-status` 的设备资产返回可正确映射新增字段。
|
||||||
|
- [ ] 3.2 验证 `POST /api/admin/assets/:identifier/refresh` 刷新后设备实时信息展示一致。
|
||||||
|
- [ ] 3.3 验证 `card_allocate` / `card_recall` / `device_allocate` / `device_recall` / `device_bind_card` / `device_unbind_card` 的日志展示可直接阅读。
|
||||||
|
- [ ] 3.4 验证日志中不再显示内部 `xxxid/xxxID` 字段。
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# Change: Add asset links to main wallet transactions
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
The agent fund overview detail drawer shows main wallet transaction records, but users cannot identify or navigate to the related asset for deductions tied to asset activity. The backend now returns `asset_identifier` from `GET /api/admin/shops/{shop_id}/main-wallet/transactions`, so the UI should expose it.
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- Add an "资产标识" column to the "预充值钱包流水" table inside the agent fund overview commission detail drawer.
|
||||||
|
- Read and type the new `asset_identifier` response field from main wallet transaction rows.
|
||||||
|
- Render non-empty asset identifiers as clickable links that navigate to the asset information page for that identifier.
|
||||||
|
- Render empty asset identifiers as `-` and do not make them clickable.
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Affected specs: `commission-management`
|
||||||
|
- Affected code:
|
||||||
|
- `src/types/api/commission.ts`
|
||||||
|
- `src/views/commission-management/agent-fund-overview/index.vue`
|
||||||
|
- Asset information route query handling is reused via `RoutesAlias.AssetInformation` and `identifier` search behavior.
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Main Wallet Transaction Asset Identifier Link
|
||||||
|
|
||||||
|
The agent fund overview commission detail drawer SHALL display the `asset_identifier` returned by `GET /api/admin/shops/{shop_id}/main-wallet/transactions` in the "预充值钱包流水" table as "资产标识" and allow users to navigate from that value to the asset information page.
|
||||||
|
|
||||||
|
#### Scenario: Display asset identifier in main wallet transactions
|
||||||
|
|
||||||
|
- **WHEN** a user opens an agent's commission detail drawer
|
||||||
|
- **AND** selects the "预充值钱包流水" tab
|
||||||
|
- **AND** a transaction row contains a non-empty `asset_identifier`
|
||||||
|
- **THEN** the table displays that value in a column labeled "资产标识"
|
||||||
|
- **AND** the value is visually presented as a clickable link
|
||||||
|
|
||||||
|
#### Scenario: Navigate to asset information from asset identifier
|
||||||
|
|
||||||
|
- **WHEN** a user clicks a non-empty "资产标识" value in the "预充值钱包流水" table
|
||||||
|
- **THEN** the system navigates to the asset information page
|
||||||
|
- **AND** the asset information page searches or loads using the clicked asset identifier
|
||||||
|
|
||||||
|
#### Scenario: Empty asset identifier is not clickable
|
||||||
|
|
||||||
|
- **WHEN** a main wallet transaction row has no `asset_identifier`
|
||||||
|
- **THEN** the "资产标识" column displays `-`
|
||||||
|
- **AND** no navigation action is available for that cell
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
## 1. Implementation
|
||||||
|
|
||||||
|
- [x] 1.1 Add optional `asset_identifier` to `MainWalletTransactionItem`.
|
||||||
|
- [x] 1.2 Add an "资产标识" column to the agent fund overview detail drawer's "预充值钱包流水" table.
|
||||||
|
- [x] 1.3 Render `asset_identifier` as a clickable link when present and `-` when absent.
|
||||||
|
- [x] 1.4 Navigate clicks to the asset information page using the clicked asset identifier as the search query.
|
||||||
|
- [x] 1.5 Ensure the click does not trigger unrelated row/table interactions.
|
||||||
|
|
||||||
|
## 2. Verification
|
||||||
|
|
||||||
|
- [x] 2.1 Verify the changed Vue file with lint or equivalent available project checks.
|
||||||
|
- [ ] 2.2 Manually verify rows with `asset_identifier` display and navigate correctly.
|
||||||
|
- [ ] 2.3 Manually verify rows without `asset_identifier` display `-` and are not clickable.
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# Change: 为资产卡信息月内流量字段增加权限控制
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
资产信息页卡信息中的“本月已用流量”和“运营商周期月内已用流量”属于敏感用量字段,需要统一通过同一个权限编码控制可见性,并对代理账号和企业账号强制隐藏。
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- 为资产信息页卡信息中的“本月已用流量”增加权限控制。
|
||||||
|
- 为资产信息页卡信息中的“运营商周期月内已用流量”增加相同权限控制。
|
||||||
|
- 两个字段统一使用权限编码 `asset_info:view_card_month_usage`。
|
||||||
|
- 当当前登录账号 `user_type` 为 `3` 代理账号或 `4` 企业账号时,即使拥有权限也不显示这两个字段。
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Affected specs:
|
||||||
|
- `asset-card-usage-field-permission`
|
||||||
|
- Affected code:
|
||||||
|
- `src/views/asset-management/asset-information/components/BasicInfoCard.vue`
|
||||||
|
- 角色/权限树配置中与 `asset_info:view_card_month_usage` 相关的注册位置
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Asset Card Month Usage Field Permission
|
||||||
|
|
||||||
|
The asset information page SHALL gate the card information fields `本月已用流量` and `运营商周期月内已用流量` with the same permission code `asset_info:view_card_month_usage`.
|
||||||
|
|
||||||
|
The asset information page MUST hide both fields for logged-in accounts whose `user_type` is `3` (代理账号) or `4` (企业账号), regardless of whether the account has `asset_info:view_card_month_usage`.
|
||||||
|
|
||||||
|
#### Scenario: Show both fields when platform user has permission
|
||||||
|
|
||||||
|
- **GIVEN** 当前登录账号的 `user_type` 不是 `3` 也不是 `4`
|
||||||
|
- **AND** 用户拥有 `asset_info:view_card_month_usage`
|
||||||
|
- **WHEN** 页面渲染资产信息的卡信息区域
|
||||||
|
- **THEN** 页面 MUST 显示 `本月已用流量`
|
||||||
|
- **AND** 页面 MUST 显示 `运营商周期月内已用流量`
|
||||||
|
|
||||||
|
#### Scenario: Hide both fields when permission is missing
|
||||||
|
|
||||||
|
- **GIVEN** 当前登录账号的 `user_type` 不是 `3` 也不是 `4`
|
||||||
|
- **AND** 用户不拥有 `asset_info:view_card_month_usage`
|
||||||
|
- **WHEN** 页面渲染资产信息的卡信息区域
|
||||||
|
- **THEN** 页面 MUST NOT 显示 `本月已用流量`
|
||||||
|
- **AND** 页面 MUST NOT 显示 `运营商周期月内已用流量`
|
||||||
|
|
||||||
|
#### Scenario: Hide both fields for agent accounts
|
||||||
|
|
||||||
|
- **GIVEN** 当前登录账号的 `user_type` 是 `3`
|
||||||
|
- **WHEN** 页面渲染资产信息的卡信息区域
|
||||||
|
- **THEN** 页面 MUST NOT 显示 `本月已用流量`
|
||||||
|
- **AND** 页面 MUST NOT 显示 `运营商周期月内已用流量`
|
||||||
|
|
||||||
|
#### Scenario: Hide both fields for enterprise accounts
|
||||||
|
|
||||||
|
- **GIVEN** 当前登录账号的 `user_type` 是 `4`
|
||||||
|
- **WHEN** 页面渲染资产信息的卡信息区域
|
||||||
|
- **THEN** 页面 MUST NOT 显示 `本月已用流量`
|
||||||
|
- **AND** 页面 MUST NOT 显示 `运营商周期月内已用流量`
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
## 1. Implementation
|
||||||
|
|
||||||
|
- [x] 1.1 在资产信息页卡信息中为“本月已用流量”接入 `asset_info:view_card_month_usage` 权限
|
||||||
|
- [x] 1.2 在资产信息页卡信息中为“运营商周期月内已用流量”接入同一个 `asset_info:view_card_month_usage` 权限
|
||||||
|
- [x] 1.3 确保 `user_type` 为 `3` 代理账号或 `4` 企业账号时隐藏上述两个字段
|
||||||
|
- [x] 1.4 完成 OpenSpec 严格校验
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# Change: 更新资产运营商状态文案与区间分配数量提示
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
当前后台“资产信息”页的“卡信息”区域会把 `gateway_extend` 展示为“运营商停机原因”,但最新业务要求需要统一改为更宽泛的“运营商状态”文案。
|
||||||
|
|
||||||
|
同时,IoT 卡管理和设备管理里的“批量设置套餐系列绑定”弹窗已经支持区间选择,但在输入起始/结束标识后没有给出本次将覆盖多少张卡或多少台设备的直观提示,运营人员需要手工心算范围,容易误判分配数量。
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- 调整资产信息卡资产详情中“卡信息”区域的 `gateway_extend` 展示标签,将“运营商停机原因”改为 `运营商状态`
|
||||||
|
- 为 IoT 卡“批量设置套餐系列绑定”弹窗的区间模式新增提示文案:`共分配xxx张卡`
|
||||||
|
- 计算方式为 `结束ICCID - 起始ICCID + 1`
|
||||||
|
- 仅在起止值可计算且结果为正整数时显示
|
||||||
|
- 为设备管理“批量设置设备套餐系列绑定”弹窗的区间模式新增提示文案:`共分配xxx台设备`
|
||||||
|
- 计算方式为 `结束设备号 - 起始设备号 + 1`
|
||||||
|
- 仅在起止值可计算且结果为正整数时显示
|
||||||
|
- 不调整后端接口字段,仅补充前端展示与交互约束
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Affected specs:
|
||||||
|
- `asset-information`
|
||||||
|
- `iot-card-series-binding`
|
||||||
|
- `device-series-binding`
|
||||||
|
- Affected code:
|
||||||
|
- `src/views/asset-management/asset-information/components/BasicInfoCard.vue`
|
||||||
|
- `src/views/asset-management/iot-card-management/index.vue`
|
||||||
|
- `src/views/asset-management/device-list/index.vue`
|
||||||
|
- Dependencies:
|
||||||
|
- `add-asset-gateway-extend-display`
|
||||||
|
- `update-batch-series-binding-contract`
|
||||||
|
- Breaking changes:
|
||||||
|
- 无外部接口破坏性变更;本次仅调整文案和区间模式提示
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Admin Asset Card Carrier Status Label
|
||||||
|
|
||||||
|
The admin asset information view SHALL label `gateway_extend` as `运营商状态` within the card information section.
|
||||||
|
|
||||||
|
#### Scenario: Show carrier status label in card information
|
||||||
|
|
||||||
|
- **GIVEN** 用户正在查看后台“资产信息”中的卡资产详情
|
||||||
|
- **WHEN** 页面渲染“卡信息”区域中的 `gateway_extend`
|
||||||
|
- **THEN** 字段标签 MUST 显示为 `运营商状态`
|
||||||
|
- **AND** 字段值 MUST 继续直接展示上游返回的 `gateway_extend`
|
||||||
|
- **AND** 当 `gateway_extend` 为空时,页面 MUST 显示稳定的占位内容
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Device Batch Series Binding Range Allocation Hint
|
||||||
|
|
||||||
|
The device batch series binding dialog SHALL provide a derived allocation-count hint for device-number range selection.
|
||||||
|
|
||||||
|
The hint MUST appear immediately below the `virtual_no_start` and `virtual_no_end` inputs.
|
||||||
|
|
||||||
|
The count MUST be computed as `结束设备号 - 起始设备号 + 1` using the same numeric range values accepted by the dialog.
|
||||||
|
|
||||||
|
#### Scenario: Show allocation count for a valid device-number range
|
||||||
|
|
||||||
|
- **GIVEN** 用户打开“批量设置设备套餐系列绑定”弹窗
|
||||||
|
- **AND** 用户选择 `selection_type="range"`
|
||||||
|
- **WHEN** 用户输入 `virtual_no_start` 和 `virtual_no_end`,且计算结果为正整数
|
||||||
|
- **THEN** 弹窗 MUST 显示 `共分配xxx台设备`
|
||||||
|
- **AND** `xxx` MUST 等于 `结束设备号 - 起始设备号 + 1`
|
||||||
|
- **AND** 当任一端点变化时,提示 MUST 立即更新
|
||||||
|
|
||||||
|
#### Scenario: Hide count hint for incomplete or invalid device-number ranges
|
||||||
|
|
||||||
|
- **GIVEN** 用户选择 `selection_type="range"`
|
||||||
|
- **WHEN** 任一起止设备号为空、无法按有效数值范围计算,或计算结果小于 `1`
|
||||||
|
- **THEN** 弹窗 MUST NOT 显示误导性的分配数量提示
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: IoT Card Batch Series Binding Range Allocation Hint
|
||||||
|
|
||||||
|
The IoT card batch series binding dialog SHALL provide a derived allocation-count hint for ICCID range selection.
|
||||||
|
|
||||||
|
The hint MUST appear immediately below the `iccid_start` and `iccid_end` inputs.
|
||||||
|
|
||||||
|
The count MUST be computed with exact integer arithmetic as `iccid_end - iccid_start + 1` so that long ICCID values do not lose precision.
|
||||||
|
|
||||||
|
#### Scenario: Show allocation count for a valid ICCID range
|
||||||
|
|
||||||
|
- **GIVEN** 用户打开“批量设置套餐系列绑定”弹窗
|
||||||
|
- **AND** 用户选择 `selection_type="range"`
|
||||||
|
- **WHEN** 用户输入 `iccid_start` 和 `iccid_end`,且计算结果为正整数
|
||||||
|
- **THEN** 弹窗 MUST 显示 `共分配xxx张卡`
|
||||||
|
- **AND** `xxx` MUST 等于 `iccid_end - iccid_start + 1`
|
||||||
|
- **AND** 当任一端点变化时,提示 MUST 立即更新
|
||||||
|
|
||||||
|
#### Scenario: Hide count hint for incomplete or invalid ICCID ranges
|
||||||
|
|
||||||
|
- **GIVEN** 用户选择 `selection_type="range"`
|
||||||
|
- **WHEN** 任一起止 ICCID 为空、无法按整数计算,或计算结果小于 `1`
|
||||||
|
- **THEN** 弹窗 MUST NOT 显示误导性的分配数量提示
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
## 1. Asset Information
|
||||||
|
|
||||||
|
- [x] 1.1 将资产信息“卡信息”区域的 `gateway_extend` 标签从“运营商停机原因”改为 `运营商状态`
|
||||||
|
- [x] 1.2 确认该字段仍直接展示 `gateway_extend` 原值,并保留空值占位行为
|
||||||
|
|
||||||
|
## 2. Range Allocation Hints
|
||||||
|
|
||||||
|
- [x] 2.1 在 IoT 卡“批量设置套餐系列绑定”弹窗的区间模式下,于起始/结束 ICCID 输入框下方新增 `共分配xxx张卡` 提示
|
||||||
|
- [x] 2.2 在设备管理“批量设置设备套餐系列绑定”弹窗的区间模式下,于起始/结束设备号输入框下方新增 `共分配xxx台设备` 提示
|
||||||
|
- [x] 2.3 让两个提示都随起止值变化实时更新,并在范围不完整、不可计算或结果小于 1 时隐藏
|
||||||
|
|
||||||
|
## 3. Verification
|
||||||
|
|
||||||
|
- [x] 3.1 验证卡资产详情“卡信息”区域展示标签为 `运营商状态`
|
||||||
|
- [x] 3.2 验证 ICCID 区间提示按 `结束ICCID - 起始ICCID + 1` 计算且不出现精度丢失
|
||||||
|
- [x] 3.3 验证设备号区间提示按 `结束设备号 - 起始设备号 + 1` 计算,并在无效范围时不显示误导性数量
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# Change: 更新资产信息当前生效套餐的到期计时基准展示
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
资产信息页的“当前生效套餐”依赖 `GET /api/admin/assets/:identifier/current-package` 获取套餐详情。后端现已在该接口中新增返回 `expiry_base` 字段,用于标识套餐到期时间的计时基准,但当前前端侧还没有建立对应的契约与展示规范。
|
||||||
|
|
||||||
|
如果不先补齐这份 spec,后续实现时容易出现类型未对齐、数据映射丢失,或页面根据开始/到期时间自行推断口径的情况,导致运营人员无法直接判断套餐是“实名激活时起算”还是“购买时起算”。
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- 为资产信息页“当前生效套餐”补充 `expiry_base` 契约规范:
|
||||||
|
- `GET /api/admin/assets/:identifier/current-package` 支持返回 `expiry_base`
|
||||||
|
- 前端当前套餐类型与页面状态需要保留该字段
|
||||||
|
- 为资产信息页“当前生效套餐”补充“到期计时基准”展示规范:
|
||||||
|
- `from_activation` 显示为“实名激活时起算”
|
||||||
|
- `from_purchase` 显示为“购买时起算”
|
||||||
|
- 字段为空或未知时显示稳定占位内容
|
||||||
|
- 明确页面必须优先使用后端返回的 `expiry_base`,不得根据 `start_time`、`expire_time` 等字段自行推断
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Affected specs:
|
||||||
|
- `asset-information`
|
||||||
|
- Affected code:
|
||||||
|
- `src/types/api/asset.ts`
|
||||||
|
- `src/views/asset-management/asset-information/composables/useAssetInfo.ts`
|
||||||
|
- `src/views/asset-management/asset-information/components/CurrentPackageCard.vue`
|
||||||
|
- Dependencies:
|
||||||
|
- `GET /api/admin/assets/:identifier/current-package` 已新增返回 `expiry_base`
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user