diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d204878..d65e3ce 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -48,8 +48,8 @@ Review screenshots in `output/playwright/` before considering UI work complete. ## Code Style - Backend code lives in `app/` and uses async FastAPI + SQLAlchemy patterns. -- Frontend code lives in `frontend/` and uses React, React Router, and - TanStack Query. +- Frontend code lives in `frontend/` and uses Vue 3, TypeScript, Pinia, and + the OpenCloud design system. - Keep browser file preview/download flows authenticated through the API client. - Prefer clear names and small modules over clever abstractions. diff --git a/docs/assets/iron-demo.gif b/docs/assets/iron-demo.gif index 8230c87..48f2b29 100644 Binary files a/docs/assets/iron-demo.gif and b/docs/assets/iron-demo.gif differ diff --git a/docs/development.md b/docs/development.md index 2db1778..bd45d3f 100644 --- a/docs/development.md +++ b/docs/development.md @@ -85,16 +85,21 @@ Required workflow: The E2E flow currently covers: - login -- files page render +- files page render with OpenCloud-style navigation icons - create folder +- enter a folder and return to the parent directory - upload text file - authenticated file download - upload image file - authenticated inline image preview -- file storage replica inspector -- search -- uploads, recycle bin, storage batch checks, backend edit dialog, policies save, and jobs page render -- browser `/api` 4xx/5xx failures during the flow +- file storage replica inspector and read-only replica detail drawer +- More menu actions, Escape dismissal, and click-outside dismissal +- delete confirmation button readability +- file search, file pagination, and page-size changes +- recycle bin, storage batch checks, backend edit/create dialogs, policies save, and jobs detail render +- desktop and mobile screenshots for visual review +- browser `/api`, `/assets`, and `/icons` 4xx/5xx failures during the flow +- label/value spacing checks for narrow inspector panels ## Secrets diff --git a/scripts/generate_readme_demo.py b/scripts/generate_readme_demo.py index 1d4c0fa..2d62c6f 100644 --- a/scripts/generate_readme_demo.py +++ b/scripts/generate_readme_demo.py @@ -74,7 +74,7 @@ def capture_demo_frames(base_url: str) -> list[Path]: page.get_by_label("Password").fill("changeme-iron") page.get_by_role("button", name="Sign in").click() page.wait_for_url(f"{base_url}/app/files") - page.locator(".files-header .crumb-button").filter(has_text="/").first.wait_for() + page.locator(".files-header").filter(has_text="Personal").first.wait_for() frame_paths.append(capture_frame(page, "02-files")) page.locator(".panel-toolbar").get_by_role("button", name="New").click() @@ -102,8 +102,9 @@ def capture_demo_frames(base_url: str) -> list[Path]: page.locator("img.preview-frame").wait_for(timeout=15000) frame_paths.append(capture_frame(page, "05-preview")) - page.get_by_role("button", name="Storage").click() - page.get_by_role("button", name="Reconcile File").wait_for() + page.locator(".detail-panel").get_by_role("button", name="More Info").click() + page.locator(".detail-drawer", has_text="Replica Info").wait_for() + page.locator(".detail-drawer", has_text="Desired Backends").wait_for() frame_paths.append(capture_frame(page, "06-storage")) page.goto(f"{base_url}/app/storage", wait_until="networkidle")