docs(10-content-clarity): create phase plan

3 plans in 1 wave covering UX-01 through UX-04: intro section,
remote name preview, step descriptions, and credential help text.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-01 12:43:38 +02:00
co-authored by Claude Opus 4.6
parent 5052e9e66e
commit 8078664f05
4 changed files with 576 additions and 3 deletions
@@ -0,0 +1,199 @@
---
phase: 10-content-clarity
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- src/App.tsx
- src/App.test.tsx
- src/components/wizard/BackendSelectionStep.tsx
- src/components/wizard/RemoteConfigStep.tsx
- src/components/wizard/DeploymentStep.tsx
- src/components/wizard/ReviewStep.tsx
autonomous: true
requirements:
- UX-01
- UX-03
must_haves:
truths:
- "First-time visitor sees an intro section explaining what Ready2Blob does before the wizard loads"
- "Clicking Get Started hides the intro and reveals Step 1 with StepIndicator"
- "On page reload, intro shows again (no persistence)"
- "Each of the 4 wizard steps has a 1-2 sentence description below the heading"
artifacts:
- path: "src/App.tsx"
provides: "IntroSection component and showIntro state gate in WizardShell"
contains: "showIntro"
- path: "src/App.test.tsx"
provides: "Tests for intro rendering and Get Started button behavior"
contains: "Get Started"
- path: "src/components/wizard/BackendSelectionStep.tsx"
provides: "Step 1 description paragraph"
contains: "text-sm"
- path: "src/components/wizard/RemoteConfigStep.tsx"
provides: "Step 2 description paragraph"
contains: "text-sm"
- path: "src/components/wizard/DeploymentStep.tsx"
provides: "Step 3 description paragraph"
contains: "text-sm"
- path: "src/components/wizard/ReviewStep.tsx"
provides: "Step 4 description paragraph"
contains: "text-sm"
key_links:
- from: "src/App.tsx"
to: "IntroSection"
via: "showIntro state toggle"
pattern: "setShowIntro\\(false\\)"
- from: "src/App.tsx"
to: "StepIndicator"
via: "conditional render when showIntro is false"
pattern: "showIntro.*StepIndicator"
---
<objective>
Add the intro section that greets first-time visitors and step descriptions for all 4 wizard steps.
Purpose: A first-time user immediately understands what Ready2Blob does and what each step expects, without external documentation.
Output: IntroSection in App.tsx with CTA, step description paragraphs in all 4 step components, updated App.test.tsx.
</objective>
<execution_context>
@C:/Users/SebastienQUEROL/.claude/get-shit-done/workflows/execute-plan.md
@C:/Users/SebastienQUEROL/.claude/get-shit-done/templates/summary.md
</execution_context>
<context>
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
@.planning/phases/10-content-clarity/10-CONTEXT.md
@.planning/phases/10-content-clarity/10-RESEARCH.md
<interfaces>
<!-- Key types and contracts the executor needs -->
From src/App.tsx (current structure):
```tsx
function WizardShell() {
const { state } = useWizard();
// steps array, stepIndex clamped, renders StepIndicator + CurrentStep
return (
<div className="min-h-screen bg-surface flex flex-col items-center py-12 px-4">
<div className="w-full max-w-2xl">
<div className="flex items-center justify-between mb-8">
<h1 className="text-3xl font-bold text-on-surface">Ready2Blob</h1>
<ThemeToggle />
</div>
<StepIndicator />
<div className="mt-8">{CurrentStep}</div>
</div>
</div>
);
}
```
From src/App.test.tsx (line 55-63 — WILL BREAK, must update):
```tsx
it('renders BackendSelectionStep when currentStep is 0', () => {
render(<App />);
const heading = screen.getByText(/Select Backend/);
expect(heading).toBeDefined();
const stepNav = screen.getByRole('navigation', { name: /Wizard steps/i });
expect(stepNav).toBeDefined();
});
```
Note: The renderAtStep() helper bypasses WizardShell entirely, so step 1/2 tests are UNAFFECTED.
MD3 button constant available:
```tsx
import { MD3_BTN_FILLED } from '../components/ui/TextFieldMD3'; // or wherever exported
```
Check actual export location — may be in a shared constants file.
</interfaces>
</context>
<tasks>
<task type="auto">
<name>Task 1: Add IntroSection and showIntro gate to App.tsx</name>
<files>src/App.tsx</files>
<action>
Add `useState` import from React. Add `showIntro` local state (default `true`) to `WizardShell`.
When `showIntro` is true, render an IntroSection inline (can be a local component or JSX block) INSTEAD of StepIndicator + step content. The intro section must:
- Keep the existing header layout (h1 "Ready2Blob" + ThemeToggle) at the top
- Show action-first copy: "Go from zero to a deployable rclone setup in minutes" per user decision
- Mention "Azure Blob, S3, OneDrive, and 4 more cloud backends" per user decision
- Briefly explain what the tool generates (rclone config + deployment scripts)
- Show a "Get Started" CTA button using MD3_BTN_FILLED style that sets `showIntro(false)`
- Use MD3 tokens for all styling: `bg-surface`, `text-on-surface`, `bg-primary`, `text-on-primary`, etc.
- No persistence — on page reload, intro shows again (wizard state is ephemeral)
- No collapse/shrink behavior — intro simply disappears when wizard starts
When `showIntro` is false, render the existing wizard content (StepIndicator + step) unchanged.
IMPORTANT: Do NOT add intro state to useReducer/WizardState. This is purely local UI state via useState.
IMPORTANT: Check where MD3_BTN_FILLED is exported from — grep for it. Use the correct import path.
</action>
<verify>
<automated>npx vitest run src/App.test.tsx</automated>
</verify>
<done>App renders IntroSection on initial load with "Get Started" button. Clicking it reveals the wizard. Page reload shows intro again.</done>
</task>
<task type="auto">
<name>Task 2: Update App.test.tsx and add step descriptions to all 4 step components</name>
<files>src/App.test.tsx, src/components/wizard/BackendSelectionStep.tsx, src/components/wizard/RemoteConfigStep.tsx, src/components/wizard/DeploymentStep.tsx, src/components/wizard/ReviewStep.tsx</files>
<action>
**App.test.tsx updates:**
The existing test "renders BackendSelectionStep when currentStep is 0" will fail because `<App />` now shows IntroSection first. Update this test to:
1. First assert that IntroSection content is visible (e.g., check for "Get Started" button or the intro copy)
2. Click "Get Started"
3. THEN assert "Select Backend" heading and StepIndicator navigation are visible
Add a new test:
- "shows intro section on initial render" — render `<App />`, assert intro copy is present, assert StepIndicator is NOT in the DOM
The renderAtStep() tests (step 1, step 2) bypass WizardShell entirely so they need NO changes.
**Step descriptions (UX-03):**
Add a `<p>` element immediately after the `<h2>` in each of the 4 step components. Use className `text-sm text-on-surface-variant mt-1 mb-4`. Claude has discretion on wording, but each must be 1-2 sentences explaining what the user is doing and why. Suggested tone — direct, practical, no jargon:
- BackendSelectionStep: Explain that the user names their remote and picks a cloud storage provider
- RemoteConfigStep: Explain that the user enters credentials for the selected backend
- DeploymentStep: Explain that the user chooses how the config gets deployed to the target machine
- ReviewStep: Explain that the user reviews generated files and downloads them
IMPORTANT: Do NOT change any heading text (h2 content must remain identical). Only ADD a `<p>` after the `<h2>`.
IMPORTANT: Use `text-on-surface-variant` (not `text-on-surface-container/70`) — this is the standard MD3 secondary text token.
</action>
<verify>
<automated>npx vitest run</automated>
</verify>
<done>All tests pass. Intro renders on initial App load, clicking Get Started reveals wizard. All 4 steps show a description paragraph below the heading.</done>
</task>
</tasks>
<verification>
1. `npx vitest run` — full suite green
2. IntroSection visible on initial `<App />` render
3. "Get Started" click transitions to wizard with StepIndicator
4. Each step component has a descriptive `<p>` after its `<h2>`
</verification>
<success_criteria>
- First-time visitor sees intro with "Get Started" CTA before wizard
- Clicking CTA reveals Step 1 with StepIndicator
- Page reload brings back intro (no persistence)
- All 4 steps have description text below headings
- All existing tests pass (including updated App.test.tsx)
</success_criteria>
<output>
After completion, create `.planning/phases/10-content-clarity/10-01-SUMMARY.md`
</output>