diff --git a/app/src/components/icons/analysis.tsx b/app/src/components/icons/analysis.tsx
new file mode 100644
index 0000000..3a5542b
--- /dev/null
+++ b/app/src/components/icons/analysis.tsx
@@ -0,0 +1,93 @@
+export function ThroughputSummaryIcon() {
+ return (
+
+ );
+}
+export function ProductionCapacityIcon() {
+ return (
+
+ );
+}
+export function ROISummaryIcon() {
+ return (
+
+ );
+}
+export function PowerIcon() {
+ return (
+
+ );
+}
diff --git a/app/src/components/ui/analysis/ProductionCapacity.tsx b/app/src/components/ui/analysis/ProductionCapacity.tsx
new file mode 100644
index 0000000..268ea81
--- /dev/null
+++ b/app/src/components/ui/analysis/ProductionCapacity.tsx
@@ -0,0 +1,62 @@
+import React from "react";
+import { ProductionCapacityIcon } from "../../icons/analysis";
+
+const ProductionCapacity = () => {
+ const totalBars = 6;
+ const progressPercent = 50;
+
+ const barsToFill = Math.floor((progressPercent / 100) * totalBars);
+ const partialFillPercent =
+ ((progressPercent / 100) * totalBars - barsToFill) * 100;
+
+ return (
+
+
- {loadingProgress &&
}
+ {/* {loadingProgress &&
} */}
{!isPlaying && (
<>
{toggleThreeD &&
}
diff --git a/app/src/styles/components/analysis/ROISummary.scss b/app/src/styles/components/analysis/ROISummary.scss
new file mode 100644
index 0000000..f4ee414
--- /dev/null
+++ b/app/src/styles/components/analysis/ROISummary.scss
@@ -0,0 +1,269 @@
+.roiSummary-container {
+
+ .roiSummary-wrapper {
+ background-color: #F2F2F7;
+
+ .product-info {
+ display: flex;
+ }
+
+ .playBack {
+ display: flex;
+ background-color: var(--background-color);
+ border-radius: 12px;
+ padding: 6px;
+
+ .info {
+ span {
+ font-size: var(--font-size-xlarge);
+
+ &:first-child {
+ color: #31C756;
+ }
+
+ &:last-child {
+ color: #2B3344;
+ }
+ }
+ }
+ }
+
+ .roi-details {
+ display: flex;
+
+ .roi-progress {
+ width: 60%;
+ }
+
+ .metrics {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+
+ .metric-item {
+ width: 100%;
+ border-radius: 6px;
+ border: 1px solid var(--axis-colors-green, #43C06D);
+ background: var(--axis-colors-green-lite, #BEEECF);
+ display: flex;
+ flex-direction: column;
+ padding: 4px 6px;
+
+ &:last-child {
+ align-items: center;
+ }
+
+ .metric-label {
+ font-size: 10px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+
+ }
+
+ .metric-value {
+ text-align: center;
+ line-height: 20px;
+ }
+ }
+
+ .metric-wrapper {
+ display: flex;
+ gap: 6px;
+
+ .metric-item {
+ background-color: var(--background-color);
+ border: 1px solid var(--Grays-Gray-6, #F2F2F7);
+
+ }
+ }
+ }
+ }
+
+
+ .cost-breakdown {
+ background-color: var(--background-color);
+ border: 1px solid var(--text-disabled);
+ border-radius: 8px;
+ padding: 16px;
+
+ .breakdown-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 16px;
+
+ .section-number {
+ font-size: 20px;
+ color: #00aaff;
+ }
+
+ .section-title {
+ font-size: var(--font-size-regular);
+ color: #333;
+ }
+
+ .expand-icon {
+ font-size: 16px;
+ color: #666;
+ cursor: pointer;
+ }
+ }
+
+
+
+ .breakdown-table {
+ width: 100%;
+ border-collapse: collapse;
+ border-radius: 8px;
+
+ th,
+ td {
+ padding: 8px;
+ text-align: left;
+ border-top: 1px solid var(--text-disabled);
+ border-bottom: 1px solid var(--text-disabled);
+ }
+
+ /* Apply left border to first child */
+ th:first-child {
+ border-left: 1px solid var(--text-disabled);
+ }
+
+ /* Apply right border to last child */
+ th:last-child {
+ border-right: 1px solid var(--text-disabled);
+ }
+
+ td:first-child {
+ border-left: 1px solid var(--text-disabled);
+ }
+
+ /* Apply right border to last child */
+ td:last-child {
+ border-right: 1px solid var(--text-disabled);
+ }
+
+ th {
+ background-color: var(--background-color);
+
+ color: #333;
+ }
+
+ .total-row,
+ .net-profit-row {
+ font-weight: bold;
+ color: #333;
+ }
+ }
+
+
+
+ }
+
+
+ .tips-section {
+ background-color: var(--background-color);
+ border-radius: 8px;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ padding: 12px;
+
+ .tip-header {
+ display: flex;
+ align-items: center;
+
+ .tip-title {
+ color: var(--text-color);
+ font-weight: 600;
+ }
+ }
+
+ .tip-description {
+ span {
+ color: #34C759;
+ /* Default color for the first span */
+
+ &:first-child {
+ color: #34C759;
+ /* Color for the first span */
+ }
+
+ &:nth-child(2) {
+ color: #488EF6;
+ /* Color for the second span */
+ }
+ }
+ }
+ }
+
+ .get-tips-button {
+ border: none;
+
+ border-radius: 5px;
+ cursor: pointer;
+ font-size: 14px;
+ margin-top: 8px;
+
+ /* Make the button content-width dependent */
+ display: inline-block;
+ display: flex;
+ justify-content: flex-end;
+ background: none;
+
+ .btn {
+ background-color: var(--accent-color);
+ color: var(--background-color);
+ padding: 4px 6px;
+ /* Add padding to ensure it has space around the text */
+ border-radius: 5px;
+ display: inline-block;
+ /* Ensure button width adjusts to its content */
+ font-size: 14px;
+ text-align: center;
+ /* Ensure text is centered */
+ }
+ }
+
+
+
+ }
+}
+
+
+.semi-circle-wrapper {
+ width: 250px;
+ height: 125px;
+ overflow: hidden;
+ position: relative;
+ }
+
+ .semi-circle {
+ width: 250px;
+ height: 250px;
+ border-radius: 50%;
+ position: relative;
+ transition: background 0.5s ease;
+ transform: rotate(180deg); /* rotate so 0% is at left */
+ }
+
+ .progress-cover {
+ position: absolute;
+ width: 75%;
+ height: 75%;
+ top: 12.5%;
+ left: 12.5%;
+ background-color: white;
+ border-radius: 50%;
+ }
+
+ .label {
+ position: absolute;
+ top: 40%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ font-weight: bold;
+ font-size: 1.2rem;
+ }
+
\ No newline at end of file
diff --git a/app/src/styles/components/analysis/analysis.scss b/app/src/styles/components/analysis/analysis.scss
new file mode 100644
index 0000000..bc33556
--- /dev/null
+++ b/app/src/styles/components/analysis/analysis.scss
@@ -0,0 +1,270 @@
+.analysis {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ height: 100vh;
+ z-index: 100000000000000000000000000000;
+}
+
+.analysis-card {
+ min-width: 333px;
+ // background: var(--primary-color);
+ border-radius: 20px;
+
+ padding: 8px;
+
+ .analysis-card-wrapper {
+ background: var(--background-color);
+ border-radius: 14px;
+ padding: 16px;
+
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+
+ .card-header {
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .main-header {
+ line-height: 20px;
+ font-size: var(--font-size-regular);
+ }
+ }
+
+ .process-container {
+ display: flex;
+ flex-direction: column;
+
+ .throughput-value {
+ font-size: 1rem;
+
+ .value {
+ font-weight: bold;
+ font-size: 1.5rem;
+ }
+ }
+
+ .progress-bar-wrapper {
+ display: flex;
+ gap: 8px;
+ margin-top: 6px;
+ }
+
+ .progress-bar {
+ position: relative;
+ width: 36px;
+ height: 4px;
+ border-radius: 13px;
+ overflow: hidden;
+ background-color: #FBEBD7;
+
+ .bar-fill {
+ position: absolute;
+ height: 100%;
+ top: 0;
+ left: 0;
+ background-color: #FC9D2F;
+ border-radius: 13px;
+ }
+
+ .bar-fill.full {
+ width: 100%;
+ }
+
+ .bar-fill.partial {
+ width: 0; // inline style will override this
+ }
+ }
+ }
+
+ .metrics-section {
+ padding-top: 16px;
+ border-top: 1px solid var(--background-color-gray);
+
+ .metric {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-size: 14px;
+ margin-bottom: 8px;
+
+ .label {
+ color: var(--text-color);
+ }
+
+ .value {
+ font-weight: bold;
+ }
+ }
+ }
+ }
+}
+
+
+.throughoutSummary {
+ .throughoutSummary-wrapper {
+ .process-container {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-start;
+ gap: 16px;
+ width: 100%;
+
+ .throughput-value {
+ font-size: var(--font-size-small);
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+
+ .value {
+ color: var(--accent-color);
+ }
+
+ /* Let the text take available space */
+ }
+
+ .lineChart {
+ max-width: 200px;
+ height: 100px;
+ position: relative;
+
+ .assetUsage {
+ text-align: right;
+ position: absolute;
+ right: 0;
+ top: 0;
+ }
+
+ canvas {
+ background-color: transparent;
+ }
+ }
+ }
+
+ .footer {
+ display: flex;
+ gap: 16px; // Space between cards
+ margin-top: 24px;
+
+ .footer-card {
+ width: 100%;
+ background: var(--background-color-gray);
+ border-radius: 6px;
+ padding: 8px;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+
+ &:first-child {
+ width: 85%;
+ }
+
+ .header {
+ font-size: var(--font-size-regular);
+ }
+
+ .value-container {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: end;
+ gap: 6px;
+ }
+ }
+
+ .shiftUtilization {
+ .value-container {
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: flex-start;
+
+ .value {
+ font-size: var(--font-size-xlarge);
+ }
+
+ .progress-wrapper {
+ width: 100%;
+ display: flex;
+ gap: 6px;
+
+ .progress {
+ border-radius: 6px;
+ height: 5px;
+
+ &:nth-child(1) {
+ background-color: #F3C64D;
+ }
+
+ &:nth-child(2) {
+ background-color: #67B3F4;
+ }
+
+ &:nth-child(3) {
+ background-color: #7981F5;
+ }
+ }
+ }
+
+ .progress-indicator {
+ display: flex;
+ justify-content: space-between;
+ width: 100%;
+ gap: 6px;
+
+ .shift-wrapper {
+ display: flex;
+ align-items: center;
+ gap: 5px;
+
+ /* Align items vertically */
+ &:nth-child(1) {
+ .indicator {
+
+ background-color: #F3C64D;
+ }
+ }
+
+ &:nth-child(2) {
+ .indicator {
+
+ background-color: #67B3F4;
+ }
+ }
+
+ &:nth-child(3) {
+ .indicator {
+
+ background-color: #7981F5;
+ }
+ }
+
+ label {
+ font-size: var(--font-size-small);
+ position: relative;
+ }
+
+ .indicator {
+ display: inline-block;
+ width: 5px;
+ height: 5px;
+ border-radius: 50%;
+
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/styles/main.scss b/app/src/styles/main.scss
index 5e46dd4..f0f7704 100644
--- a/app/src/styles/main.scss
+++ b/app/src/styles/main.scss
@@ -25,6 +25,8 @@
@use 'components/simulation/simulation';
@use 'components/menu/menu';
@use 'components/confirmationPopUp';
+@use 'components/analysis/analysis';
+@use 'components/analysis/ROISummary.scss';
// layout
@use 'layout/loading';