Files
zeekay 56dec4912c feat: Enhanced builder page with loading states and improved UX
Implemented comprehensive improvements to builder page:

āœ… Loading States:
- Skeleton cards during initial load (8 cards with pulsing animation)
- Per-iframe loading spinners with "Loading preview..." text
- Error states with retry buttons for failed iframes
- Smooth fade-in animations (300ms opacity transition)
- Minimum 200ms display time to prevent flashing

āœ… Visual Design:
- Rounded corners (rounded-lg) for modern look
- Subtle shadows (shadow-sm) with hover increase (shadow-lg)
- Smooth hover effects (scale-[1.02], bg-accent/5)
- Better typography (text-base font-semibold for block names)
- Category badges (outline variant)
- Subcategory badges (secondary variant)
- Improved spacing (p-4) and layout

āœ… UX Improvements:
- Header loading spinner during block fetch
- Disabled input during loading
- Dynamic count display ("Loading..." vs "X blocks")
- Empty state with clear filter button
- Proper error handling with retry mechanism

āœ… Technical:
- Removed lazy loading for eager iframe loading
- Changed from aspect-video to aspect-[4/3]
- Added min-h-[400px] for better previews
- State management per iframe (loaded, error, showContent)
- Proper cleanup with useEffect returns

Note: Iframe content still not rendering - needs investigation of /view/[name] route
2025-11-15 23:39:32 -08:00

258 lines
7.1 KiB
JSON

{
"config": {
"configFile": "/Users/z/work/hanzo/ui/playwright.config.ts",
"rootDir": "/Users/z/work/hanzo/ui/tests",
"forbidOnly": false,
"fullyParallel": true,
"globalSetup": null,
"globalTeardown": null,
"globalTimeout": 0,
"grep": {},
"grepInvert": null,
"maxFailures": 0,
"metadata": {
"actualWorkers": 1
},
"preserveOutput": "always",
"reporter": [
[
"html",
{
"outputFolder": "tests/reports/playwright-report"
}
],
[
"json",
{
"outputFile": "tests/reports/test-results.json"
}
],
[
"list",
null
]
],
"reportSlowTests": {
"max": 5,
"threshold": 300000
},
"quiet": false,
"projects": [
{
"outputDir": "/Users/z/work/hanzo/ui/test-results",
"repeatEach": 1,
"retries": 0,
"metadata": {
"actualWorkers": 1
},
"id": "chromium",
"name": "chromium",
"testDir": "/Users/z/work/hanzo/ui/tests",
"testIgnore": [],
"testMatch": [
"**/*.@(spec|test).?(c|m)[jt]s?(x)"
],
"timeout": 30000
},
{
"outputDir": "/Users/z/work/hanzo/ui/test-results",
"repeatEach": 1,
"retries": 0,
"metadata": {
"actualWorkers": 1
},
"id": "firefox",
"name": "firefox",
"testDir": "/Users/z/work/hanzo/ui/tests",
"testIgnore": [],
"testMatch": [
"**/*.@(spec|test).?(c|m)[jt]s?(x)"
],
"timeout": 30000
},
{
"outputDir": "/Users/z/work/hanzo/ui/test-results",
"repeatEach": 1,
"retries": 0,
"metadata": {
"actualWorkers": 1
},
"id": "webkit",
"name": "webkit",
"testDir": "/Users/z/work/hanzo/ui/tests",
"testIgnore": [],
"testMatch": [
"**/*.@(spec|test).?(c|m)[jt]s?(x)"
],
"timeout": 30000
},
{
"outputDir": "/Users/z/work/hanzo/ui/test-results",
"repeatEach": 1,
"retries": 0,
"metadata": {
"actualWorkers": 1
},
"id": "Mobile Chrome",
"name": "Mobile Chrome",
"testDir": "/Users/z/work/hanzo/ui/tests",
"testIgnore": [],
"testMatch": [
"**/*.@(spec|test).?(c|m)[jt]s?(x)"
],
"timeout": 30000
},
{
"outputDir": "/Users/z/work/hanzo/ui/test-results",
"repeatEach": 1,
"retries": 0,
"metadata": {
"actualWorkers": 1
},
"id": "Mobile Safari",
"name": "Mobile Safari",
"testDir": "/Users/z/work/hanzo/ui/tests",
"testIgnore": [],
"testMatch": [
"**/*.@(spec|test).?(c|m)[jt]s?(x)"
],
"timeout": 30000
},
{
"outputDir": "/Users/z/work/hanzo/ui/test-results",
"repeatEach": 1,
"retries": 0,
"metadata": {
"actualWorkers": 1
},
"id": "visual",
"name": "visual",
"testDir": "/Users/z/work/hanzo/ui/tests",
"testIgnore": [],
"testMatch": [
"/visual\\/.*.spec.ts/"
],
"timeout": 30000
}
],
"shard": null,
"updateSnapshots": "missing",
"updateSourceMethod": "patch",
"version": "1.56.1",
"workers": 5,
"webServer": {
"command": "cd app && rm -rf .next && E2E_TEST=true pnpm dev",
"port": 3333,
"reuseExistingServer": true,
"timeout": 120000
}
},
"suites": [
{
"title": "review-builder-scroll.spec.ts",
"file": "review-builder-scroll.spec.ts",
"column": 0,
"line": 0,
"specs": [
{
"title": "Review builder page with scrolling screenshots",
"ok": true,
"tags": [],
"tests": [
{
"timeout": 30000,
"annotations": [],
"expectedStatus": "passed",
"projectId": "chromium",
"projectName": "chromium",
"results": [
{
"workerIndex": 0,
"parallelIndex": 0,
"status": "passed",
"duration": 7791,
"errors": [],
"stdout": [
{
"text": "\nšŸ” BUILDER PAGE REVIEW TEST\n"
},
{
"text": "============================================================\n"
},
{
"text": "\nšŸ“ø Capturing screenshots at different scroll positions...\n\n"
},
{
"text": "āœ“ Captured: review-builder-top.png\n"
},
{
"text": "āœ“ Captured: review-builder-scroll-500.png\n"
},
{
"text": "āœ“ Captured: review-builder-scroll-1500.png\n"
},
{
"text": "āœ“ Captured: review-builder-scroll-2500.png\n"
},
{
"text": "āœ“ Captured: review-builder-middle.png\n"
},
{
"text": "āœ“ Captured: review-builder-bottom.png\n"
},
{
"text": "āœ“ Captured: review-builder-FULL.png (complete page)\n"
},
{
"text": "\n============================================================\n"
},
{
"text": "šŸ“Š PAGE ANALYSIS:\n"
},
{
"text": "============================================================\n"
},
{
"text": "Header: Blocks\n"
},
{
"text": "Count Display: 80 blocks\n"
},
{
"text": "Actual Iframes: 80\n"
},
{
"text": "\nāœ… All screenshots captured in tests/ directory\n"
},
{
"text": "============================================================\n"
}
],
"stderr": [],
"retry": 0,
"startTime": "2025-11-16T07:38:07.132Z",
"annotations": [],
"attachments": []
}
],
"status": "expected"
}
],
"id": "77562e6deb6e4d1063f6-4b9f052a42fe5600378b",
"file": "review-builder-scroll.spec.ts",
"line": 3,
"column": 1
}
]
}
],
"errors": [],
"stats": {
"startTime": "2025-11-16T07:38:06.701Z",
"duration": 8520.823,
"expected": 1,
"skipped": 0,
"unexpected": 0,
"flaky": 0
}
}