- Add placeholder property to TextFieldMD3 component and props interface
- Fix vite.config.ts to import defineConfig from vitest/config instead of vite
- Add type guard for validate property in schemas/index.ts to handle readonly array union types
- Remove unused StepIndicatorWithDispatch placeholder function from tests
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Add vitest globals type definitions to tsconfig.app.json
- Enable globals in vite.config.ts test configuration
- Add explicit vitest imports and type references to all .test.ts files
- Add missing `placeholder` property to PasswordFieldProps interface
- Add missing `required` field to test field definitions in FieldRenderer.test.tsx
- Update FieldDef and BackendMeta interfaces to support readonly arrays
- Fix readonly array type incompatibilities in BackendSelectionStep.tsx
- Fix form submission handler type mismatch in RemoteConfigStep.tsx
- Remove unused helper functions and imports from StepIndicator.test.tsx
These changes resolve all TypeScript compilation errors preventing the Docker build from completing.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Adds Gitea CI/CD workflow that builds and pushes Docker images to the registry on tag push or manual trigger.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Two-stage build: node builds the static bundle, nginx serves it. The bundle is
built against a placeholder base token that the entrypoint rewrites to $BASE_URL
at start, so one image serves from any path without a rebuild.
nginx config caches hashed assets forever, never caches index.html, and applies
security headers (CSP, no framing, no referrer) suited to an app that handles
cloud credentials client-side.
.gitattributes pins LF on the container-consumed files, since core.autocrlf
would otherwise give the entrypoint a CRLF shebang.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The absolute /vite.svg path breaks once the app is served from a base path,
and the file was never replaced with a real logo. Leave instructions for
restoring it with the %BASE_URL% placeholder instead.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Archives v1.3 milestone (Phase 13: 18 rclone backends), updates PROJECT.md
with all 30 validated requirements, reorganizes ROADMAP.md with all 4 milestones
in collapsed details blocks, adds v1.2 and v1.3 retrospective entries.
Also commits minor CSS token fixes in src/ (text-on-surface-container class
alignment) that were uncommitted from phase 13 execution.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Test gdrive: GdriveAuthToggle with OAuth Token and Service Account tabs
- Test dropbox: OAuthInstructions toggle button visible
- Test ftp: host, username, password, port, TLS mode fields
- Test webdav: URL, username, password, vendor select fields
- Test smb: host and username fields
- Test http: only URL field, no username/password
- BackendCard accepts optional icon prop rendered in flex row with name
- BackendSelectionStep groups 18 backends into 3 category sections
- Search bar (type=search/searchbox role) filters across displayName, description, category label, field labels
- Empty categories hidden via conditional rendering
- BACKEND_ICONS wired to BackendCard icon prop
- Changed search input to type=search to preserve getByRole('textbox') selector in existing tests
- GdriveAuthToggle: two-tab segmented control (OAuth Token / Service Account)
following AzureAuthToggle pattern; both fields always registered via CSS
hidden/block; OAuth tab embeds OAuthInstructions component
- BackendIcons: inline SVG icon map for all 18 backends (Partial<Record<BackendType,...>>)
using fill="currentColor" for MD3 dark-mode compatibility, no external deps
- Created src/components/icons/ directory
4 plans across 3 waves to expand from 7 to 17 rclone backends:
- Plan 01 (W1): Registry refactoring, BackendType derivation, 10 new entries
- Plan 02 (W2): OAuthInstructions, GdriveAuthToggle, BackendIcons components
- Plan 03 (W2): BackendSelectionStep UX overhaul with categories, search, icons
- Plan 04 (W3): RemoteConfigStep wiring for all new backends + visual verify
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- SUMMARY.md: dark mode h2 and form control semantic token fixes
- STATE.md: position updated, decisions recorded
- ROADMAP.md: phase 12 marked complete
- REQUIREMENTS.md: DARK-01, DARK-02 marked complete
- Added bg-surface-container and text-on-surface semantic token classes to select element className
- Fixes select dropdown invisible text in dark mode (browser-applied white background)
- 204 tests pass, zero regressions
- BackendSelectionStep: add onInvalidSubmit scrolling to remote-name input
- BackendSelectionStep: pass onInvalidSubmit to form onSubmit and handleCardClick
- RemoteConfigStep: add FieldErrors import from react-hook-form
- RemoteConfigStep: add onInvalidSubmit scrolling to first errored field by key
- RemoteConfigStep: pass onInvalidSubmit to form onSubmit
- Add scrollIntoView mock (vi.fn()) in beforeEach to both test files
- Add POLISH-04 test in BackendSelectionStep: scrolls to remote-name on empty submit
- Add POLISH-04 test in RemoteConfigStep: scrolls to first errored field on empty submit
- md3-buttons.ts: upgrade ring-2/50 to ring-3 on all three constants (FILLED, OUTLINED, TEXT)
- BackendCard: add focus-visible:outline-none focus-visible:ring-3 focus-visible:ring-primary
- StepIndicator: upgrade group-focus-visible completed-step circle from ring-2/50 to ring-3
- ThemeToggle: add focus-visible ring-3 with ring-inset to both selected/unselected branches
- FieldRenderer: select uses focus-visible:ring-2 (was focus:ring-2); tooltip buttons get focus-visible:ring-2 rounded
- BackendSelectionStep: responsive grid (1-col mobile, 2-col desktop) for cards; button row stacks vertically on mobile
- BackendCard: add w-full to fill grid cell on all viewports
- RemoteConfigStep/DeploymentStep/ReviewStep: flex-col sm:flex-row button rows; w-full sm:w-auto on Back/Next buttons
- StepIndicator: add hidden sm:block to all three label spans (completed, active, future)