feat(web): add iwooos concrete work map
This commit is contained in:
@@ -1041,6 +1041,40 @@ const iwooosProgressMovementSignalBoundaries = [
|
||||
'gitea_disablement_authorized=false',
|
||||
] as const
|
||||
|
||||
const iwooosConcreteSecurityWorkStreams = [
|
||||
{ key: 'frontstageVisibility', work: 'W1', state: '已前台化', icon: SearchCheck, tone: 'steady' },
|
||||
{ key: 'hostScopeInventory', work: 'W2', state: '框架完成', icon: Activity, tone: 'warn' },
|
||||
{ key: 'sourceControlMigration', work: 'W3', state: '待回覆', icon: GitBranch, tone: 'warn' },
|
||||
{ key: 'ownerEvidenceIntake', work: 'W4', state: '下一真門檻', icon: ClipboardCheck, tone: 'warn' },
|
||||
{ key: 'reviewerHumanFlow', work: 'W5', state: '只讀序列', icon: ListChecks, tone: 'locked' },
|
||||
{ key: 'runtimeExecutionGate', work: 'W6', state: '未開閘', icon: Lock, tone: 'locked' },
|
||||
] as const
|
||||
|
||||
const iwooosConcreteSecurityWorkMapBoundaries = [
|
||||
'iwooos_concrete_security_workstream_count=6',
|
||||
'iwooos_concrete_security_visible_workstream_count=6',
|
||||
'iwooos_concrete_security_framework_only_stream_count=6',
|
||||
'iwooos_concrete_security_runtime_workstream_count=0',
|
||||
'iwooos_concrete_security_next_real_gate=s4_9_owner_response_accepted',
|
||||
'iwooos_concrete_security_owner_response_received_count=0',
|
||||
'iwooos_concrete_security_owner_response_accepted_count=0',
|
||||
'iwooos_concrete_security_redacted_payload_ingested=false',
|
||||
'iwooos_concrete_security_active_runtime_gate_count=0',
|
||||
'iwooos_concrete_security_github_primary_ready_count=0',
|
||||
'iwooos_concrete_security_kali_scan_authorized=false',
|
||||
'iwooos_concrete_security_host_change_authorized=false',
|
||||
'runtime_execution_authorized=false',
|
||||
'active_runtime_gate_count=0',
|
||||
'action_buttons_allowed=false',
|
||||
'not_authorization=true',
|
||||
'secret_value_collection_allowed=false',
|
||||
'repo_creation_authorized=false',
|
||||
'refs_sync_authorized=false',
|
||||
'workflow_modification_authorized=false',
|
||||
'github_primary_switch_authorized=false',
|
||||
'gitea_disablement_authorized=false',
|
||||
] as const
|
||||
|
||||
const iwooosFirstProgressUnlockPathSteps = [
|
||||
{ key: 'ownerResponseScope', step: '01', state: '待收件', icon: ClipboardCheck, tone: 'warn' },
|
||||
{ key: 'redactedEvidencePointer', step: '02', state: '待補證', icon: FileText, tone: 'warn' },
|
||||
@@ -4138,6 +4172,118 @@ function IwoooSProgressMovementSignalsBoard() {
|
||||
)
|
||||
}
|
||||
|
||||
function IwoooSConcreteSecurityWorkMapBoard() {
|
||||
const t = useTranslations('iwooos.concreteSecurityWorkMap')
|
||||
const summaryItems = [
|
||||
{ key: 'streams', value: '6', tone: 'warn' as const },
|
||||
{ key: 'visible', value: '6', tone: 'steady' as const },
|
||||
{ key: 'realGate', value: 'S4.9', tone: 'warn' as const },
|
||||
{ key: 'runtime', value: '0', tone: 'locked' as const },
|
||||
]
|
||||
const textWrap = { overflowWrap: 'anywhere' as const, wordBreak: 'break-word' as const }
|
||||
|
||||
return (
|
||||
<section style={{ marginBottom: 14 }} data-testid="iwooos-concrete-security-work-map-board">
|
||||
<div style={{ ...band, padding: 16, background: '#f6faf8' }}>
|
||||
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(min(100%, 312px), 1fr))', gap: 16 }}>
|
||||
<div>
|
||||
<div style={{ marginBottom: 14 }}>
|
||||
<h2 style={{ fontSize: 17, margin: 0 }}>{t('title')}</h2>
|
||||
<p style={{ fontSize: 12, color: '#596761', margin: '6px 0 0', lineHeight: 1.55, ...textWrap }}>
|
||||
{t('subtitle')}
|
||||
</p>
|
||||
</div>
|
||||
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(126px, 1fr))', gap: 8, marginBottom: 14 }}>
|
||||
{summaryItems.map(item => (
|
||||
<div key={item.key} style={{ border: '0.5px solid #d8e5df', borderRadius: 8, padding: 12, background: '#fff' }}>
|
||||
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>
|
||||
<span style={{ fontSize: 11, color: '#687872' }}>{t(`summary.${item.key}.label` as never)}</span>
|
||||
<ToneDot tone={item.tone} />
|
||||
</div>
|
||||
<div style={{ fontSize: 20, fontWeight: 700, lineHeight: 1.1, marginTop: 8, color: '#141413' }}>
|
||||
{item.value}
|
||||
</div>
|
||||
<p style={{ fontSize: 11, color: '#596761', lineHeight: 1.45, margin: '8px 0 0', ...textWrap }}>
|
||||
{t(`summary.${item.key}.detail` as never)}
|
||||
</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(196px, 1fr))', gap: 10 }}>
|
||||
{iwooosConcreteSecurityWorkStreams.map(item => {
|
||||
const Icon = item.icon
|
||||
return (
|
||||
<div
|
||||
key={item.key}
|
||||
style={{
|
||||
display: 'grid',
|
||||
gap: 8,
|
||||
minHeight: 168,
|
||||
border: '0.5px solid #d8e5df',
|
||||
borderRadius: 8,
|
||||
background: '#fff',
|
||||
padding: 13,
|
||||
color: '#141413',
|
||||
...textWrap,
|
||||
}}
|
||||
>
|
||||
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>
|
||||
<span style={{ color: toneColors[item.tone], fontSize: 12, fontWeight: 700 }}>
|
||||
{t('workLabel')} {item.work}
|
||||
</span>
|
||||
<Icon size={18} color={toneColors[item.tone]} />
|
||||
</div>
|
||||
<div style={{ fontSize: 15, fontWeight: 700, color: toneColors[item.tone], lineHeight: 1.2 }}>
|
||||
{item.state}
|
||||
</div>
|
||||
<h3 style={{ fontSize: 14, margin: 0, color: '#141413', lineHeight: 1.3 }}>
|
||||
{t(`items.${item.key}.title` as never)}
|
||||
</h3>
|
||||
<p style={{ fontSize: 11, color: '#596761', lineHeight: 1.5, margin: 0, ...textWrap }}>
|
||||
{t(`items.${item.key}.body` as never)}
|
||||
</p>
|
||||
<span style={{ color: '#6b786f', fontSize: 11, lineHeight: 1.4, ...textWrap }}>
|
||||
{t(`items.${item.key}.evidence` as never)}
|
||||
</span>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
<div style={{ ...band, padding: 14, background: '#edf5f1', alignSelf: 'stretch' }}>
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 10 }}>
|
||||
<ClipboardCheck size={16} color={toneColors.warn} />
|
||||
<h3 style={{ fontSize: 14, margin: 0 }}>{t('boundaryTitle')}</h3>
|
||||
</div>
|
||||
<p style={{ fontSize: 12, color: '#596761', lineHeight: 1.55, margin: '0 0 10px', ...textWrap }}>
|
||||
{t('boundaryIntro')}
|
||||
</p>
|
||||
<div style={{ display: 'grid', gap: 7 }}>
|
||||
{iwooosConcreteSecurityWorkMapBoundaries.map(item => (
|
||||
<span
|
||||
key={item}
|
||||
style={{
|
||||
border: '0.5px solid #d2e1db',
|
||||
borderRadius: 8,
|
||||
padding: '7px 9px',
|
||||
color: '#43544c',
|
||||
fontSize: 11,
|
||||
lineHeight: 1.4,
|
||||
background: '#fff',
|
||||
overflowWrap: 'anywhere',
|
||||
}}
|
||||
>
|
||||
{item}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
function IwoooSFirstProgressUnlockPathBoard() {
|
||||
const t = useTranslations('iwooos.firstProgressUnlockPath')
|
||||
const summaryItems = [
|
||||
@@ -8867,6 +9013,8 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) {
|
||||
|
||||
<IwoooSProgressMovementSignalsBoard />
|
||||
|
||||
<IwoooSConcreteSecurityWorkMapBoard />
|
||||
|
||||
<IwoooSFirstProgressUnlockPathBoard />
|
||||
|
||||
<IwoooSFirstUnlockEvidencePacketBoard />
|
||||
|
||||
Reference in New Issue
Block a user