Files
Ready2Blob/.planning/STATE.md
T
kawaandClaude Sonnet 4.6 a26608791f chore: complete v1.3 milestone — Backend Expansion
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>
2026-04-16 16:54:45 +02:00

104 lines
7.5 KiB
Markdown

---
gsd_state_version: 1.0
milestone: v1.3
milestone_name: Backend Expansion
status: milestone_complete
stopped_at: v1.3 milestone archived and closed
last_updated: "2026-04-16T15:00:00.000Z"
last_activity: 2026-04-16 — v1.3 Backend Expansion milestone complete, archived, git tagged
progress:
total_phases: 6
completed_phases: 6
total_plans: 18
completed_plans: 18
percent: 100
---
# Project State
## Project Reference
See: .planning/PROJECT.md (updated 2026-03-31)
**Core value:** An IT pro can go from zero to a deployable rclone setup in minutes — without needing to know rclone's config syntax or PowerShell deployment conventions.
**Current focus:** Planning next milestone (v1.4)
## Current Position
Milestone v1.3 complete and archived. Ready for next milestone planning.
Status: 4 milestones shipped (v1.0 → v1.3), 13 phases, 40 plans — all complete
Last activity: 2026-04-16 — v1.3 Backend Expansion milestone archived and git tagged
Progress: [██████████] 100% (v1.3 — milestone complete)
## Accumulated Context
### Decisions
Decisions are logged in PROJECT.md Key Decisions table.
Recent decisions affecting current work:
- v1.2 roadmap: Zero new runtime dependencies — Tailwind v4 @theme + CSS custom properties only
- v1.2 roadmap: Bottom-up migration order (tokens -> primitives -> migration -> content -> polish)
- v1.2 roadmap: ThemeToggle via DOM class toggle, not React Context (avoids re-render cascade)
- [Phase 08-01]: Two-layer CSS token pattern: @theme var() references + @layer base :root/.dark raw values — required for .dark cascade in Tailwind v4
- [Phase 08-01]: vi.stubGlobal for localStorage/matchMedia in tests — Node v25 experimental WebStorage breaks standard Storage API in jsdom environment
- [Phase 08-02]: Mechanical migration only — zero DOM structure changes, only className strings replaced
- [Phase 08-02]: Post-migration grep check is mandatory — replace_all can miss occurrences in dual-branch components with identical className strings
- [Phase 08-02]: User visually confirmed light/dark theme renders correctly across all 4 wizard steps — THEME-01 and THEME-02 complete
- [Phase 09-02]: Label text inside button element (not adjacent) preserves test selector compatibility: textContent includes step name
- [Phase 09-02]: Pre-existing TextFieldMD3.test.tsx failure scoped out — component not yet built, belongs to future plan
- [Phase 09-md3-components]: TextFieldMD3 uses CSS-only floating label via peer-[:not(:placeholder-shown)] without JS state
- [Phase 09-md3-components]: DEBT-01 fix: tooltip buttons use aria-label directly; RemoteConfigStep.test updated with { selector: 'input' } to prevent aria-label/label ambiguity
- [Phase 09-03]: Tooltip button rendered ABOVE TextFieldMD3 in FieldRenderer (tooltip is separate concern, TextFieldMD3 is self-contained)
- [Phase 09-03]: PasswordField show/hide toggle passed as suffix prop to TextFieldMD3 — suffix slot is right-aligned inside input container
- [Phase 09-03]: OutputBlock Copy/Download buttons use MD3_BTN_OUTLINED with !text-xs !px-3 !py-1.5 overrides to preserve small utility button size
- [Phase 09-md3-components]: BackendSelectionStep gap: plain label+input replaced with TextFieldMD3; no test changes required because TextFieldMD3 preserves textbox role and role=alert contract
- [Phase 09-05]: Tooltip hover uses dual-state (hoverTooltip + showTooltip); click-unpin explicitly clears hoverTooltip to prevent sticky tooltip after dismiss
- [Phase 09-05]: helpTextPrefix prop guard is (helpText || helpTextPrefix) so tooltip icon renders on fields without helpText
- [Phase 10-content-clarity]: showIntro is local useState in WizardShell — not persisted, resets on page reload by design
- [Phase 10-content-clarity]: IntroSection declared as a local component in App.tsx — appropriate for small co-located UI
- [Phase 10-content-clarity]: ReviewStep lacked h2 heading — added 'Step 4: Review & Download' before description paragraph
- [Phase 10-03]: S3 region gets tooltipText only (no helpText) — placeholder is already descriptive
- [Phase 10-03]: SFTP host and user intentionally omitted from tooltipText — self-explanatory per user decision
- [Phase 10-03]: getByLabelText selector ambiguity fixed with { selector: 'input' } across all affected tests (same DEBT-01 pattern as Phase 09-03)
- [Phase 10-content-clarity]: RemoteNamePreview renders only div/span elements (no form controls) to preserve single-textbox selector contract in BackendSelectionStep tests
- [Phase 11-polish-responsiveness]: ring-inset on ThemeToggle focus ring because overflow-hidden on container clips outset rings
- [Phase 11-polish-responsiveness]: No ring-offset-2 on BackendCard to avoid dark mode surface color issues
- [Phase 11-polish-responsiveness]: FieldRenderer select uses focus-visible:ring-2 (not focus:ring-2) for keyboard-only ring on selects
- [Phase 11-polish-responsiveness]: CSS-only reduced-motion guard via @media (prefers-reduced-motion: reduce) — no JS listener needed
- [Phase 11-polish-responsiveness]: key={state.currentStep} on step wrapper forces React remount triggering CSS animation from initial state
- [Phase 12-dark-mode-visibility-fixes]: bg-surface-container text-on-surface added to FieldRenderer select className — semantic tokens ensure correct rendering in both light and dark themes without dark: prefix
- [Phase 12-dark-mode-visibility-fixes]: accent-[var(--r2b-warning)] arbitrary value used for ReviewStep security checkbox — accent-warning class not confirmed generated by Tailwind v4
- [Phase 12-dark-mode-visibility-fixes]: Removed {' '} space-before-text pattern in DeploymentStep labels — replaced with flex gap-2 layout for consistent spacing
- [Phase 13-01]: BackendType derived from keyof typeof BACKEND_REGISTRY — eliminates manual union maintenance at 18+ backends
- [Phase 13-01]: Registry uses as const (not Record<BackendType,...> cast) — cast was circular when BackendType derived from registry
- [Phase 13-01]: BACKEND_SCHEMAS auto-generated via Object.fromEntries over registry keys — no per-backend buildZodSchema call needed
- [Phase 13-01]: Registry has 18 backends (http and seafile are separate entries; plan's "17" was a counting error)
- [Phase 13-add-remaining-rclone-remotes]: OAuthInstructions uses step-prefix detection to render authorize command in a code element, keeping test assertions compatible
- [Phase 13-add-remaining-rclone-remotes]: BACKEND_ICONS is Partial<Record<BackendType,...>> — missing entries mean no icon rendered on the card
- [Phase 13-03]: type=search for search input: prevents getByRole('textbox') collision with remote name field in existing tests
- [Phase 13-03]: Empty categories return null (not CSS hidden) — makes queryByText assertions reliable in tests
- [Phase 13-04]: renderBackendFields() switch statement instead of nested ternaries - 7 branches requires readable structure
- [Phase 13-04]: backendLabel derived via Object.fromEntries(BACKEND_REGISTRY) eliminates manual displayName maintenance
- [Phase 13-04]: getByLabelText partial regex (/label/i not /^label$/i) - TextFieldMD3 required fields append * to label text
### Roadmap Evolution
- Phase 12 added: Dark mode visibility fixes
- Phase 13 added: Add remaining RClone remotes
### Pending Todos
None yet.
### Blockers/Concerns
- 131 test selectors could break during component restyling — one-component-at-a-time discipline required (ongoing, Phase 10+)
## Session Continuity
Last session: 2026-04-16
Stopped at: v1.3 milestone complete — MILESTONES.md, PROJECT.md, ROADMAP.md, RETROSPECTIVE.md updated; git tagged v1.3
Resume file: None