148148 </div >
149149 </div >
150150
151- <ul class =" artefact-list" >
151+ <ul :id = " `artefact-list-${stage.id}` " class =" artefact-list" >
152152 <li
153- v-for =" item in stage.items"
153+ v-for =" item in stage.items.slice(0, isArtefactStageExpanded(stage.id) ? stage.items.length : 4) "
154154 :key =" item.label"
155155 class =" artefact-item"
156156 :class =" `artefact-item--${item.status}`"
157157 >
158158 <button
159- v-if =" item.source === 'business_case' "
159+ v-if =" item.source && TILE_ROUTES[item.source] "
160160 type =" button"
161161 class =" artefact-item__link"
162162 :disabled =" !canNavigate(item.source, 'tile')"
182182 </template >
183183 </li >
184184 </ul >
185+ <button
186+ v-if =" stage.items.length > 4"
187+ :aria-controls =" `artefact-list-${stage.id}`"
188+ :aria-expanded =" isArtefactStageExpanded(stage.id)"
189+ class =" artefact-list__toggle"
190+ type =" button"
191+ @click =" toggleArtefactStage(stage.id)"
192+ >
193+ {{ isArtefactStageExpanded(stage.id) ? 'Show fewer' : `Show all ${stage.items.length} items` }}
194+ </button >
185195 </div >
186196
187197 <footer class =" artefact-card__foot" >
@@ -386,6 +396,17 @@ const ARTEFACT_STATUS_LABEL = {
386396 not_started: ' Not started'
387397}
388398
399+ const expandedArtefactStages = ref (new Set ())
400+
401+ const isArtefactStageExpanded = (stageId ) => expandedArtefactStages .value .has (stageId)
402+
403+ const toggleArtefactStage = (stageId ) => {
404+ const expanded = new Set (expandedArtefactStages .value )
405+ if (expanded .has (stageId)) expanded .delete (stageId)
406+ else expanded .add (stageId)
407+ expandedArtefactStages .value = expanded
408+ }
409+
389410// `source` links an artefact to an existing tracked step id; artefacts without a
390411// source have no system of record yet and stay "Not started".
391412const ARTEFACT_STAGES = [
@@ -397,10 +418,17 @@ const ARTEFACT_STAGES = [
397418 icon: ' mi-play-circle' ,
398419 color: ' #2d8cff' ,
399420 items: [
400- { label: ' Project Charter / mandate' , source: ' intake' },
401- { label: ' Business case' , source: ' business_case' },
402- { label: ' Stakeholder register' , source: ' approvals' },
403- { label: ' High-level scope statement' , source: ' opportunity' }
421+ { label: ' Opportunity Assessment/Task details' , source: ' opportunity' },
422+ { label: ' Scope Statement' , source: null },
423+ { label: ' Stakeholder Registration' , source: ' approvals' },
424+ { label: ' Business Case' , source: ' business_case' },
425+ { label: ' Project Charter' , source: ' intake' },
426+ { label: ' Tollgate Automation' , source: null },
427+ { label: ' People Consultation & Compliance' , source: null },
428+ { label: ' Resources' , source: null },
429+ { label: ' Access & Enablement Requirements' , source: null },
430+ { label: ' Business Impact Analysis' , source: null },
431+ { label: ' Gantt' , source: ' gantt' }
404432 ]
405433 },
406434 {
@@ -502,7 +530,7 @@ const QUICK_STATUS_LABEL = {
502530 pending: ' Not started'
503531}
504532
505- // Ids reuse TILE_ROUTES so clicking a card opens the same page as the stepper below .
533+ // Ids reuse TILE_ROUTES so cards open the existing destination for each artefact .
506534const quickCards = [
507535 {
508536 id: ' opportunity' ,
@@ -986,6 +1014,30 @@ onBeforeUnmount(() => {
9861014 padding: 0 ;
9871015}
9881016
1017+ .artefact - list__toggle {
1018+ background: transparent;
1019+ border: 0 ;
1020+ color: #0077b8 ;
1021+ cursor: pointer;
1022+ font: inherit;
1023+ font- size: 11px ;
1024+ font- weight: 700 ;
1025+ margin- top: 8px ;
1026+ padding: 4px 0 ;
1027+ text- align: left;
1028+ }
1029+
1030+ .artefact - list__toggle: hover {
1031+ color: #005f93 ;
1032+ text- decoration: underline;
1033+ }
1034+
1035+ .artefact - list__toggle: focus- visible {
1036+ border- radius: 3px ;
1037+ outline: 2px solid rgba (0 , 119 , 184 , 0.45 );
1038+ outline- offset: 2px ;
1039+ }
1040+
9891041.artefact - item {
9901042 align- items: flex- start;
9911043 background: #f7f9fa;
0 commit comments