/
spirzen
/
it-knowledge-base
Обзор
Документация
Войти
/
spirzen
/
it-knowledge-base
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
Mobile
src/components/SoftwareLifecycleDemo.module.css
643 строки
11 KB
Spirzen
Components Rework
19 май 2026, 19:17
19 май 2026, 19:17
d8d92a3
Код
Авторство
О чём код?
.root { --sdlc-plan: #3b82f6; --sdlc-analyze: #8b5cf6; --sdlc-design: #ec4899; --sdlc-dev: #10b981; --sdlc-test: #f59e0b; --sdlc-deploy: #ef4444; --sdlc-ops: #06b6d4; --sdlc-retire: #6b7280; } .toolbar { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; margin-bottom: 1rem; } .modelPanel { padding: 0.85rem 1rem; border-radius: 8px; border-left: 4px solid var(--ifm-color-primary); background: color-mix(in srgb, var(--ifm-color-primary) 8%, var(--ifm-background-surface-color)); margin-bottom: 1rem; font-size: 0.875rem; line-height: 1.55; } .modelName { font-weight: 700; margin: 0 0 0.35rem; color: var(--ifm-color-content); } .modelDesc { margin: 0 0 0.65rem; color: var(--demo-muted, var(--ifm-color-content-secondary)); } .prosCons { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 0.5rem; font-size: 0.8rem; } .pros { color: var(--demo-success, #2e7d32); } .cons { color: var(--demo-error, #c62828); } /* —— Визуализация модели —— */ .modelViz { margin: 1rem 0; padding: 1rem; border-radius: 10px; border: 1px dashed var(--demo-border, var(--ifm-color-emphasis-300)); background: var(--ifm-background-surface-color); min-height: 5rem; } .modelVizLabel { margin: 0 0 0.65rem; font-size: 0.72rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; color: var(--demo-muted, var(--ifm-color-content-secondary)); } .waterfallFlow { display: flex; align-items: center; gap: 0; overflow-x: auto; padding-bottom: 0.25rem; -webkit-overflow-scrolling: touch; } .waterfallBlock { flex-shrink: 0; padding: 0.45rem 0.6rem; font-size: 0.68rem; font-weight: 600; border-radius: 6px; border: 2px solid var(--demo-border); background: var(--ifm-background-color); color: var(--demo-muted); transition: border-color 0.25s ease, background 0.25s ease, color 0.25s ease, transform 0.25s ease; white-space: nowrap; } .waterfallBlockActive { border-color: var(--phase-color, var(--ifm-color-primary)); background: color-mix(in srgb, var(--phase-color) 18%, transparent); color: var(--ifm-color-content); transform: scale(1.05); } .waterfallBlockDone { border-color: var(--demo-success); background: color-mix(in srgb, var(--demo-success) 12%, transparent); color: var(--demo-success); } .waterfallArrow { flex-shrink: 0; color: var(--demo-muted); font-size: 0.75rem; padding: 0 0.15rem; opacity: 0.5; } .waterfallArrowLit { opacity: 1; color: var(--ifm-color-primary); } .agileGrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 0.65rem; } .sprintCard { padding: 0.65rem; border-radius: 8px; border: 2px solid var(--demo-border); background: var(--ifm-background-color); transition: border-color 0.25s ease, box-shadow 0.25s ease; } .sprintCardActive { border-color: var(--ifm-color-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ifm-color-primary) 20%, transparent); } .sprintTitle { margin: 0 0 0.35rem; font-size: 0.75rem; font-weight: 700; color: var(--ifm-color-primary); } .sprintPhases { margin: 0; padding: 0; list-style: none; font-size: 0.72rem; line-height: 1.5; color: var(--demo-muted); } .sprintPhases li { padding: 0.1rem 0; } .sprintPhasesLiActive { color: var(--ifm-color-content); font-weight: 600; } .vDiagram { display: grid; grid-template-columns: 1fr auto 1fr; gap: 0.5rem; align-items: stretch; } @media (max-width: 640px) { .vDiagram { grid-template-columns: 1fr; } .vCenter { order: 3; } } .vColumn { display: flex; flex-direction: column; gap: 0.35rem; } .vCenter { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 0 0.25rem; } .vArm { width: 3px; flex: 1; min-height: 1.5rem; background: var(--demo-border); border-radius: 999px; transition: background 0.3s ease; } .vArmLit { background: linear-gradient( var(--v-dir, 180deg), var(--ifm-color-primary), var(--demo-success) ); } .vNode { padding: 0.35rem 0.5rem; font-size: 0.68rem; font-weight: 600; text-align: center; border-radius: 6px; border: 2px solid var(--demo-border); background: var(--ifm-background-color); color: var(--demo-muted); transition: all 0.25s ease; } .vNodeActive { border-color: var(--phase-color, var(--ifm-color-primary)); background: color-mix(in srgb, var(--phase-color) 18%, transparent); color: var(--ifm-color-content); } .vNodeDone { border-color: var(--demo-success); color: var(--demo-success); } .vBottom { padding: 0.5rem 0.75rem; font-size: 0.72rem; font-weight: 700; text-align: center; border-radius: 8px; border: 2px solid var(--demo-border); background: var(--ifm-background-color); color: var(--demo-muted); transition: all 0.25s ease; } .vBottomActive { border-color: var(--sdlc-test); background: color-mix(in srgb, var(--sdlc-test) 18%, transparent); color: var(--ifm-color-content); } /* —— Таймлайн фаз —— */ .timelineWrap { position: relative; margin: 1rem 0; padding: 0.75rem 0; overflow-x: auto; -webkit-overflow-scrolling: touch; } .timelineTrack { position: absolute; top: 2.65rem; left: 2.5rem; right: 2.5rem; height: 4px; background: var(--demo-border); border-radius: 999px; pointer-events: none; } .timelineFill { height: 100%; border-radius: 999px; background: linear-gradient( 90deg, var(--ifm-color-primary-dark), var(--ifm-color-primary) ); transition: width 0.4s ease; } .timeline { display: flex; gap: 0.35rem; position: relative; min-width: min-content; padding: 0 0.5rem; } .phaseBtn { flex: 0 0 auto; width: 5.5rem; padding: 0; border: none; background: none; cursor: pointer; font-family: inherit; text-align: center; transition: opacity 0.25s ease; } .phaseBtn:disabled { cursor: default; } .phaseBtnPending { opacity: 0.45; } .phaseOrb { position: relative; width: 3.25rem; height: 3.25rem; margin: 0 auto 0.4rem; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 1.5rem; border: 2px solid var(--demo-border); background: var(--ifm-background-surface-color); transition: border-color 0.25s ease, box-shadow 0.25s ease, transform 0.25s ease; } .phaseBtn:hover .phaseOrb:not(.phaseOrbActive) { border-color: var(--ifm-color-primary); transform: translateY(-2px); } .phaseOrbActive { border-color: var(--phase-color); box-shadow: 0 0 0 4px color-mix(in srgb, var(--phase-color) 25%, transparent); transform: scale(1.08); } .phaseOrbDone { border-color: var(--demo-success); background: color-mix(in srgb, var(--demo-success) 10%, transparent); } .phaseOrbRunning::after { content: ''; position: absolute; inset: -4px; border-radius: 50%; border: 2px solid var(--phase-color); animation: sdlc-pulse 1.2s ease-out infinite; } @keyframes sdlc-pulse { 0% { transform: scale(1); opacity: 0.8; } 100% { transform: scale(1.25); opacity: 0; } } .phaseLabel { font-size: 0.65rem; line-height: 1.25; color: var(--demo-muted); word-break: break-word; } .phaseLabelActive { color: var(--phase-color); font-weight: 700; } .phaseCheck { font-size: 0.65rem; color: var(--demo-success); margin-top: 0.15rem; } /* —— Детали фазы —— */ .detail { animation: sdlc-fade-in 0.35s ease; } @keyframes sdlc-fade-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } .detailHeader { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 1rem; flex-wrap: wrap; } .detailIcon { width: 3.25rem; height: 3.25rem; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 1.65rem; flex-shrink: 0; } .detailTitle { margin: 0; font-size: 1.15rem; font-weight: 700; } .detailMeta { margin: 0.15rem 0 0; font-size: 0.8rem; color: var(--demo-muted); } .detailGrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 1rem; } .detailBlock h5 { margin: 0 0 0.35rem; font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; color: var(--ifm-color-primary); } .detailBlock p, .detailBlock ul { margin: 0; font-size: 0.85rem; line-height: 1.5; } .detailBlock ul { padding-left: 1.1rem; } .riskLow { color: var(--demo-success); font-weight: 600; } .riskMid { color: var(--demo-warning); font-weight: 600; } .riskHigh { color: var(--demo-error); font-weight: 600; } .simNote { margin-top: 0.85rem; padding: 0.55rem 0.75rem; font-size: 0.8rem; border-radius: 8px; background: color-mix(in srgb, var(--demo-success) 12%, transparent); border: 1px solid color-mix(in srgb, var(--demo-success) 35%, transparent); color: var(--demo-success); } /* —— Бюджет и метрики —— */ .costSection { margin: 1rem 0; } .costTitle { margin: 0 0 0.5rem; font-size: 0.8rem; font-weight: 600; color: var(--demo-muted); } .costBar { display: flex; height: 1.25rem; border-radius: 6px; overflow: hidden; border: 1px solid var(--demo-border); } .costSegment { transition: opacity 0.3s ease, filter 0.3s ease; min-width: 2px; } .costSegmentDim { opacity: 0.35; } .costLegend { display: flex; flex-wrap: wrap; gap: 0.5rem 0.85rem; margin-top: 0.5rem; font-size: 0.68rem; color: var(--demo-muted); } .costLegendItem { display: flex; align-items: center; gap: 0.3rem; } .costDot { width: 0.55rem; height: 0.55rem; border-radius: 2px; flex-shrink: 0; } .metricsGrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 0.75rem; } .metricCard { padding: 0.65rem; border-radius: 8px; border: 1px solid var(--demo-border); background: var(--ifm-background-surface-color); } .metricLabel { font-size: 0.72rem; color: var(--demo-muted); margin-bottom: 0.2rem; } .metricValue { font-size: 1.25rem; font-weight: 700; font-variant-numeric: tabular-nums; transition: color 0.3s ease; } .metricGood { color: var(--demo-success); } .metricWarn { color: var(--demo-warning); } .metricBad { color: var(--demo-error); } .metricInfo { color: var(--ifm-color-primary); } .bestPractices { margin-top: 1rem; padding: 0.85rem 1rem; border-radius: 8px; background: color-mix(in srgb, var(--ifm-color-primary) 6%, var(--ifm-background-surface-color)); border: 1px solid var(--demo-border); } .bestTitle { margin: 0 0 0.5rem; font-size: 0.85rem; font-weight: 700; color: var(--ifm-color-primary); } .bestList { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 0.35rem 0.75rem; margin: 0; padding: 0; list-style: none; font-size: 0.8rem; line-height: 1.45; } .bestList li::before { content: '✓ '; color: var(--demo-success); font-weight: 700; } .controls { margin-top: 1rem; gap: 0.5rem; } .sprintBadge { display: inline-block; margin-left: 0.35rem; padding: 0.1rem 0.45rem; font-size: 0.68rem; font-weight: 700; border-radius: 999px; background: color-mix(in srgb, var(--ifm-color-primary) 15%, transparent); color: var(--ifm-color-primary); vertical-align: middle; } @media (prefers-reduced-motion: reduce) { .phaseOrbRunning::after { animation: none; } .detail { animation: none; } }