@@ -13,6 +13,7 @@ import { PrintReport } from './components/overlays/PrintReport';
1313import { Collapsible } from './components/advisor/Collapsible' ;
1414import { GuidedBanner } from './components/chrome/GuidedBanner' ;
1515import { StepTracker } from './components/chrome/StepTracker' ;
16+ import { StepSection } from './components/chrome/StepSection' ;
1617import { PresetBar } from './components/advisor/PresetBar' ;
1718import { Toolbar } from './components/chrome/Toolbar' ;
1819import { C4Preview } from './components/advisor/C4Preview' ;
@@ -295,45 +296,41 @@ export default function App() {
295296
296297 < div className = "f-div" />
297298
298- { /* Step 1 — project factors + derived priorities */ }
299- < div style = { { display : 'flex' , alignItems : 'center' , gap : '8px' , marginBottom : '14px' } } >
300- < span className = "f-num" > 1</ span >
301- < span style = { { fontSize : '15px' , fontWeight : 500 } } >
302- < span className = "guided-only" > { t ( 'step1.g' ) } </ span >
303- < span className = "expert-only" > { t ( 'step1.e' ) } </ span >
304- </ span >
305- </ div >
306- < div style = { { display : 'grid' , gridTemplateColumns : 'repeat(auto-fit,minmax(280px,1fr))' , gap : '18px' } } >
299+ { /* Step 1 — project factors (its own dropdown section; owner feedback: factors and
300+ priorities must be SEPARATE so nobody gets confused). */ }
301+ < StepSection id = "aa-sec-1" n = "1" titleG = "step1.g" titleE = "step1.e" >
307302 < FactorInputs levels = { levels } onChange = { setLevels } />
308- { /* The adjust editor opens RIGHT under the priorities card (owner feedback: it used to
309- land far below the tall factor column, so nobody connected it to "Adjust"). */ }
310- < div style = { { display : 'grid' , gap : '14px' , alignContent : 'start' } } >
311- < PrioritiesCard weights = { weights } onAdjust = { ( ) => setEditWeights ( ( v ) => ! v ) } editing = { mode === 'expert' && editWeights } />
312- { mode === 'expert' && editWeights && < QaOverridePanel weights = { weights } overrides = { overrides } onChange = { setOverrides } /> }
303+ </ StepSection >
304+
305+ < div className = "f-div" />
306+
307+ { /* Step 2 — derived quality priorities; the adjust editor opens right underneath.
308+ Ungated (Fase 2d rev.3, owner): guided users can customise weights too — the
309+ plain-language adjuster is newcomer-safe. */ }
310+ < StepSection id = "aa-sec-2" n = "2" titleG = "step2.g" titleE = "step2.e" >
311+ < div style = { { display : 'grid' , gap : '14px' } } >
312+ < PrioritiesCard weights = { weights } onAdjust = { ( ) => setEditWeights ( ( v ) => ! v ) } editing = { editWeights } />
313+ { editWeights && < QaOverridePanel weights = { weights } overrides = { overrides } onChange = { setOverrides } /> }
313314 </ div >
314- </ div >
315+ </ StepSection >
315316
316317 < div className = "f-div" />
317318
318- { /* Step 3 — recommendation across dimensions */ }
319- < div id = "adv-plan" style = { { display : 'flex' , alignItems : 'center' , gap : '8px' , marginBottom : '13px' , scrollMarginTop : '12px' } } >
320- < span className = "f-num" > 3</ span >
321- < span style = { { fontSize : '15px' , fontWeight : 500 } } >
322- < span className = "guided-only" > { t ( 'results.title.g' ) } </ span >
323- < span className = "expert-only" > { t ( 'results.title.e' ) } </ span >
324- </ span >
325- </ div >
326- < DimensionCards rankings = { rankings } current = { currentDim } onSelect = { setCurrentDim } />
327- < DimensionDetail dim = { currentDim } ranked = { rankings [ currentDim ] } weights = { weights } />
328- < RadarPanel weights = { weights } mode = { mode } />
319+ { /* Step 3 — recommendation across dimensions (collapsible card, Fase 2d). */ }
320+ < div id = "adv-plan" style = { { scrollMarginTop : '132px' } } />
321+ < StepSection id = "aa-sec-3" n = "3" titleG = "results.title.g" titleE = "results.title.e" >
322+ < DimensionCards rankings = { rankings } current = { currentDim } onSelect = { setCurrentDim } />
323+ < DimensionDetail dim = { currentDim } ranked = { rankings [ currentDim ] } weights = { weights } />
324+ < RadarPanel weights = { weights } mode = { mode } />
329325
330- < div style = { { display : 'grid' , gridTemplateColumns : 'repeat(auto-fit,minmax(250px,1fr))' , gap : '14px' , marginTop : '16px' } } >
331- < SensitivityCard flips = { flips } levels = { levels } />
332- < MigrationCard value = { migKey } onChange = { setMigKey } />
333- </ div >
326+ < div style = { { display : 'grid' , gridTemplateColumns : 'repeat(auto-fit,minmax(250px,1fr))' , gap : '14px' , marginTop : '16px' } } >
327+ < SensitivityCard flips = { flips } levels = { levels } />
328+ < MigrationCard value = { migKey } onChange = { setMigKey } />
329+ </ div >
334330
335- < AntiPatternWarning rules = { antiPatterns } mode = { mode } />
336- < HowItDecides />
331+ < AntiPatternWarning rules = { antiPatterns } mode = { mode } />
332+ < HowItDecides />
333+ </ StepSection >
337334
338335 { /* Expert-only depth (build-spec features beyond the prototype mockup). Guided mode
339336 stays faithful to the prototype; experts get the extra analysis. */ }
@@ -364,8 +361,11 @@ export default function App() {
364361 </ div >
365362 </ section >
366363
367- < div id = "adv-save" className = "f-div" style = { { scrollMarginTop : '12px' } } />
368- < Toolbar run = { run } status = { exportStatus } setStatus = { setExportStatus } mode = { mode } onImport = { importScenario } />
364+ < div id = "adv-save" className = "f-div" style = { { scrollMarginTop : '132px' } } />
365+ { /* Step 4 — save & share (collapsible card, Fase 2d). */ }
366+ < StepSection id = "aa-sec-4" n = "4" titleG = "step4.g" titleE = "step4.e" >
367+ < Toolbar run = { run } status = { exportStatus } setStatus = { setExportStatus } mode = { mode } onImport = { importScenario } />
368+ </ StepSection >
369369
370370 < p
371371 className = "f-gloss"
@@ -402,21 +402,27 @@ export default function App() {
402402 } }
403403 />
404404
405- { /* Global footer — always visible (both Advisor & Insights); browser guidance (FR-EDGE-4 / SRS §2.3)
406- + copyright & identity (Fase 1, DECISIONS.md). Borderless: whitespace, no hairline. */ }
405+ { /* Global footer (Fase 2d rev.2 — owner: "rapi & simple"): a tidy two-line centered
406+ stack — brand line, then one short legal line. Browser guidance (FR-EDGE-4)
407+ lives in the hover title. */ }
407408 < footer
408409 className = "screen-only"
410+ title = { t ( 'footer.browsers' ) }
409411 style = { {
410- padding : 'var(--aa-space-6) var(--aa-panel-pad) var(--aa-space-4)' ,
411- fontSize : 'var(--aa-fs-2xs)' ,
412- color : 'var(--color-text-tertiary)' ,
412+ display : 'grid' ,
413+ justifyItems : 'center' ,
414+ gap : '6px' ,
415+ padding : 'var(--aa-space-7) var(--aa-panel-pad) var(--aa-space-5)' ,
413416 textAlign : 'center' ,
414417 } }
415418 >
416- < div > { t ( 'footer.browsers' ) } </ div >
417- < div style = { { marginTop : 'var(--aa-space-2)' } } >
419+ < span style = { { display : 'inline-flex' , alignItems : 'center' , gap : '8px' , color : 'var(--color-text-secondary)' , fontFamily : 'var(--font-display)' , fontSize : '12.5px' , fontWeight : 600 , letterSpacing : '-0.01em' } } >
420+ < BrandMark size = { 15 } />
421+ { t ( 'app.title' ) }
422+ </ span >
423+ < span style = { { fontSize : 'var(--aa-fs-2xs)' , color : 'var(--color-text-tertiary)' } } >
418424 { SITE_COPYRIGHT } · { t ( 'footer.rights' ) }
419- </ div >
425+ </ span >
420426 </ footer >
421427 </ div >
422428 </ div >
0 commit comments