- {/*
*/}
-
- {loadingProgress > 0 &&
}
- {!isPlaying && (
+ {!selectedUser && (
<>
- {toggleThreeD &&
}
-
-
+
+ {loadingProgress > 0 &&
}
+ {!isPlaying && (
+ <>
+ {toggleThreeD &&
}
+
+
+ >
+ )}
+
+ {activeModule === "market" &&
}
+ {activeModule !== "market" &&
}
+ {isPlaying && activeModule === "simulation" &&
}
>
)}
- {/*
-
- */}
- {activeModule === "market" &&
}
-
- {activeModule !== "market" &&
}
- {isPlaying && activeModule === "simulation" &&
}
- {/* {
} */}
+
+ createHandleDrop({
+ widgetSubOption,
+ visualizationSocket,
+ selectedZone,
+ setFloatingWidget,
+ event,
+ })
+ }
+ onDragOver={(event) => event.preventDefault()}
+ >
+
+
{selectedUser &&
}
+ {isLogListVisible && (
+
+
+
+ )}
+
);
};
diff --git a/app/src/store/visualization/useDroppedObjectsStore.ts b/app/src/store/visualization/useDroppedObjectsStore.ts
index 5c4527b..bbe4cde 100644
--- a/app/src/store/visualization/useDroppedObjectsStore.ts
+++ b/app/src/store/visualization/useDroppedObjectsStore.ts
@@ -1,5 +1,4 @@
import { create } from "zustand";
-import { addingFloatingWidgets } from "../../services/visulization/zone/addFloatingWidgets";
import { useSocketStore } from "../store";
import useChartStore from "./useChartStore";
diff --git a/app/src/styles/abstracts/variables.scss b/app/src/styles/abstracts/variables.scss
index f4a6495..29976dc 100644
--- a/app/src/styles/abstracts/variables.scss
+++ b/app/src/styles/abstracts/variables.scss
@@ -22,7 +22,11 @@ $text-button-color-dark: #f3f3fd;
// background colors
// ---------- light mode ----------
$background-color: linear-gradient(-45deg, #fcfdfd71 0%, #fcfdfd79 100%);
-$background-color-solid-gradient: linear-gradient(-45deg, #fcfdfd 0%, #fcfdfd 100%);
+$background-color-solid-gradient: linear-gradient(
+ -45deg,
+ #fcfdfd 0%,
+ #fcfdfd 100%
+);
$background-color-solid: #fcfdfd;
$background-color-secondary: #fcfdfd4d;
$background-color-accent: #6f42c1;
@@ -45,7 +49,11 @@ $background-radial-gray-gradient: radial-gradient(
// ---------- dark mode ----------
$background-color-dark: linear-gradient(-45deg, #333333b3 0%, #2d2437b3 100%);
-$background-color-solid-gradient-dark: linear-gradient(-45deg, #333333 0%, #2d2437 100%);
+$background-color-solid-gradient-dark: linear-gradient(
+ -45deg,
+ #333333 0%,
+ #2d2437 100%
+);
$background-color-solid-dark: #19191d;
$background-color-secondary-dark: #19191d99;
$background-color-accent-dark: #6f42c1;
@@ -104,6 +112,21 @@ $color3: #b186ff;
$color4: #8752e8;
$color5: #c7a8ff;
+// log indication colors
+// ------------ text -------------
+$log-default-text-color: #6f42c1;
+$log-info-text-color: #488ef6;
+$log-warn-text-color: #f3a50c;
+$log-error-text-color: #f65648;
+$log-success-text-color: #43c06d;
+
+// ------------ background -------------
+$log-default-backgroung-color: #6e42c133;
+$log-info-background-color: #488ef633;
+$log-warn-background-color: #f3a50c33;
+$log-error-background-color: #f6564833;
+$log-success-background-color: #43c06d33;
+
// old variables
$accent-color: #6f42c1;
$accent-color-dark: #c4abf1;
diff --git a/app/src/styles/base/base.scss b/app/src/styles/base/base.scss
index bf53164..4555ed9 100644
--- a/app/src/styles/base/base.scss
+++ b/app/src/styles/base/base.scss
@@ -37,11 +37,9 @@
// old colors
--accent-color: #{$accent-color};
- --highlight-accent-color: #{$highlight-accent-color};
--accent-gradient-color: #{$acent-gradient};
--faint-gradient-color: #{$faint-gradient};
--background-color-gray: #{$background-color-gray};
- --border-color: #{$border-color};
--shadow-main-light: #{$shadow-color};
--box-shadow-light: 0px 2px 4px var(--shadow-main-light);
--box-shadow-medium: 0px 4px 8px var(--shadow-main-light);
@@ -75,7 +73,7 @@
--background-radial-gray-gradient: #{$background-radial-gray-gradient-dark};
// border colors
- --border-color: #{$border-color};
+ --border-color: #{$border-color-dark};
--input-border-color: #{$input-border-color-dark};
--border-color-accent: #{$border-color-accent-dark};
@@ -89,11 +87,9 @@
// old colors
--accent-color: #{$accent-color-dark};
- --highlight-accent-color: #{$highlight-accent-color-dark};
--accent-gradient-color: #{$acent-gradient-dark};
--faint-gradient-color: #{$faint-gradient-dark};
--background-color-gray: #{$background-color-gray-dark};
- --border-color: #{$border-color-dark};
--shadow-main-dark: #{$shadow-color};
--box-shadow-light: 0px 2px 4px var(--shadow-main-dark);
--box-shadow-medium: 0px 4px 8px var(--shadow-main-dark);
diff --git a/app/src/styles/base/global.scss b/app/src/styles/base/global.scss
index d90e6fb..f13344e 100644
--- a/app/src/styles/base/global.scss
+++ b/app/src/styles/base/global.scss
@@ -1,11 +1,30 @@
@use "../abstracts/variables" as *;
@use "../abstracts/mixins" as *;
-section, .section{
- padding: 4px;
- outline: 1px solid var(--border-color);
- outline-offset: -1px;
- border-radius: #{$border-radius-large};
- background: var(--background-color);
- margin: 4px 0;
+section,
+.section {
+ padding: 4px;
+ outline: 1px solid var(--border-color);
+ outline-offset: -1px;
+ border-radius: #{$border-radius-large};
+ background: var(--background-color);
+ margin: 4px 0;
+}
+
+.scene-container {
+ width: calc(100% - (320px + 270px + 90px));
+ height: calc(100% - (250px));
+ position: absolute;
+ top: 50%;
+ left: calc(270px + 45px);
+ overflow: hidden;
+ z-index: 1;
+ transform: translate(0, -50%);
+ transition: all 0.2s;
+ box-shadow: $box-shadow-medium;
+ background: var(--background-color-solid);
+ canvas {
+ outline: none;
+ border: none;
+ }
}
diff --git a/app/src/styles/base/reset.scss b/app/src/styles/base/reset.scss
index ab77f9a..82d286e 100644
--- a/app/src/styles/base/reset.scss
+++ b/app/src/styles/base/reset.scss
@@ -12,10 +12,3 @@ input[type="password"]::-webkit-clear-button, /* For Chrome/Safari clear button
input[type="password"]::-webkit-inner-spin-button { /* Just in case */
display: none;
}
-
-button{
- border: none;
- outline: none;
- background: none;
- cursor: pointer;
-}
\ No newline at end of file
diff --git a/app/src/styles/components/analysis/ROISummary.scss b/app/src/styles/components/analysis/ROISummary.scss
deleted file mode 100644
index 96b4a5d..0000000
--- a/app/src/styles/components/analysis/ROISummary.scss
+++ /dev/null
@@ -1,311 +0,0 @@
-.roiSummary-container {
- .roiSummary-wrapper {
- background-color: var(--background-color);
-
- .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: var(--text-color);
- }
- }
- }
- }
-
- .roi-details {
- display: flex;
- align-items: center;
- gap: 12px;
-
- .progress-wrapper {
- width: 250px;
- display: flex;
- flex-direction: column;
- gap: 6px;
-
- .content {
- display: flex;
- flex-direction: column;
- gap: 3px;
- align-items: center;
-
- .key {
- font-size: var(--font-size-xlarge);
- color: var(--accent-color);
- }
- }
- }
-
- .roi-progress {
- width: 100%;
- }
-
- .metrics {
- display: flex;
- flex-direction: column;
- gap: 6px;
-
- .metric-item {
- width: 100%;
- border-radius: 6px;
- border: 1px solid #00FF56;
- background: #436D51;
- 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;
- justify-content: space-between;
- gap: 8px;
- margin-bottom: 16px;
-
- .section-wrapper {
- display: flex;
- gap: 4px;
- align-items: center;
- }
-
- .section-number {
- font-size: 20px;
- color: #00aaff;
- }
-
- .section-title {
- font-size: var(--font-size-regular);
- color: var(--text-color);
- }
-
- .expand-icon {
- font-size: 16px;
- color: var(--text-color);
- cursor: pointer;
- transform: rotate(90deg);
- transition: transform 0.2s linear;
- }
-
- .expand-icon.open {
- transform: rotate(0deg);
-
- }
- }
-
- .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);
- }
-
- th:first-child,
- td:first-child {
- border-left: 1px solid var(--text-disabled);
- }
-
- th: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 {
- font-size: var(--font-size-xlarge);
- color: #34C759;
-
- &:first-child {
- color: #34C759;
- }
-
- &:nth-child(2) {
- color: #488EF6;
- }
- }
- }
- }
-
- .get-tips-button {
- border: none;
- border-radius: 5px;
- cursor: pointer;
- font-size: 14px;
- margin-top: 8px;
- display: inline-block;
- display: flex;
- justify-content: flex-end;
- background: none;
-
- .btn {
- background-color: var(--accent-color);
- color: var(--background-color);
- padding: 4px 6px;
- border-radius: 5px;
- display: inline-block;
- font-size: 14px;
- text-align: center;
- }
- }
- }
-
- .semi-circle-wrapper {
- width: 100%;
- height: 125px;
- overflow-y: hidden;
- position: relative;
- .semi-circle {
- width: 100%;
- height: 250px;
- border-radius: 50%;
- position: relative;
- transition: background 0.5s ease;
- }
- .progress-cover {
- position: absolute;
- width: 75%;
- height: 75%;
- top: 12.5%;
- left: 12.5%;
- background: #000000cc;
- border-radius: 50%;
- }
- }
-
-
-
- .label-wrapper {
- .label {
- font-size: var(--font-size-xxxlarge);
- }
-
- position: absolute;
- bottom: 0%;
- left: 50%;
- transform: translate(-50%, 0%);
- font-weight: bold;
- font-size: 1.2rem;
- color: #333;
- display: flex;
- justify-content: center;
- align-items: center;
- flex-direction: column;
- }
-}
-
-// Breakdown Table Open/Close Logic
-
-.breakdown-table-wrapper {
- &.closed {
- max-height: 0;
- padding: 0;
- }
-
- &.open {
- max-height: 500px;
- }
-
-
-
-
-
- .breakdown-table {
- width: 100%;
- border-collapse: collapse;
-
- th,
- td {
- padding: 10px;
- border: 1px solid #ddd;
- text-align: left;
- }
-
-
-
- }
-}
\ No newline at end of file
diff --git a/app/src/styles/components/analysis/analysis.scss b/app/src/styles/components/analysis/analysis.scss
deleted file mode 100644
index 030a79f..0000000
--- a/app/src/styles/components/analysis/analysis.scss
+++ /dev/null
@@ -1,279 +0,0 @@
-.analysis {
- position: fixed;
- top: 0;
- left: 0;
- display: flex;
- justify-content: space-between;
- align-items: start;
- width: 100%;
- height: 100vh;
- // pointer-events: none;
- z-index: 10000;
-
- .analysis-wrapper {
- display: flex;
- flex-direction: column;
- gap: 12px;
- }
-}
-
-.analysis-card {
- min-width: 333px;
- background: var(--background-color);
- border-radius: 20px;
-
- padding: 8px;
-
- .analysis-card-wrapper {
- width: 100%;
- 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;
- width: 100%;
- height: 4px;
- border-radius: 13px;
- overflow: hidden;
- background: #FBEBD7;
-
- .bar-fill {
- position: absolute;
- height: 100%;
- top: 0;
- left: 0;
- background: #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: 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: #F3C64D;
- }
-
- &:nth-child(2) {
- background: #67B3F4;
- }
-
- &:nth-child(3) {
- background: #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: #F3C64D;
- }
- }
-
- &:nth-child(2) {
- .indicator {
-
- background: #67B3F4;
- }
- }
-
- &:nth-child(3) {
- .indicator {
-
- background: #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/components/button.scss b/app/src/styles/components/button.scss
index e69de29..dad9120 100644
--- a/app/src/styles/components/button.scss
+++ b/app/src/styles/components/button.scss
@@ -0,0 +1,24 @@
+@use "../abstracts/variables" as *;
+@use "../abstracts/mixins" as *;
+
+.labeled-button-container {
+ @include flex-space-between;
+ padding: 6px 12px;
+
+ button {
+ padding: 2px 32px;
+ border: none;
+ border-radius: #{$border-radius-large};
+ color: var(--text-button-color);
+ background: var(--background-color-button);
+ transition: all 0.2s;
+ cursor: pointer;
+ }
+}
+
+button {
+ border: none;
+ outline: none;
+ background: none;
+ cursor: pointer;
+}
diff --git a/app/src/styles/components/footer/footer.scss b/app/src/styles/components/footer/footer.scss
new file mode 100644
index 0000000..b2d85d0
--- /dev/null
+++ b/app/src/styles/components/footer/footer.scss
@@ -0,0 +1,71 @@
+@use "../../abstracts/variables" as *;
+@use "../../abstracts/mixins" as *;
+
+.footer-wrapper {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ z-index: 1;
+ display: flex;
+ justify-content: space-between;
+ padding: 2px 12px;
+
+ .selection-wrapper {
+ display: flex;
+ gap: 6px;
+
+ .selector-wrapper {
+ display: flex;
+ gap: 6px;
+ align-items: center;
+ background: var(--background-color);
+ padding: 3px 6px;
+ border-radius: 12px;
+ color: var(--text-color);
+
+ .selector {
+ color: var(--text-color);
+ }
+ }
+ }
+
+ .logs-wrapper {
+ display: flex;
+ gap: 6px;
+
+ .logs-detail,
+ .version {
+ border-radius: 12px;
+ background: var(--background-color);
+ padding: 3px 6px;
+ color: var(--text-color);
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ }
+
+ .logs-detail {
+ padding: 2px 12px;
+ cursor: pointer;
+ .log-icon {
+ @include flex-center;
+ }
+ .log-message {
+ max-width: 40vw;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ }
+
+ .version {
+ font-size: var(--font-size-tiny);
+ display: flex;
+ gap: 6px;
+ .icon{
+ @include flex-center;
+ }
+ }
+ }
+}
diff --git a/app/src/styles/components/input.scss b/app/src/styles/components/input.scss
index e3b9585..d4c6544 100644
--- a/app/src/styles/components/input.scss
+++ b/app/src/styles/components/input.scss
@@ -639,21 +639,6 @@ input[type="number"] {
}
}
-.labeled-button-container {
- @include flex-space-between;
- padding: 6px 12px;
-
- button {
- padding: 2px 32px;
- border: none;
- border-radius: #{$border-radius-large};
- color: var(--text-button-color);
- background: var(--background-color-button);
- transition: all 0.2s;
- cursor: pointer;
- }
-}
-
.value-field-container {
margin-bottom: 6px;
padding: 6px 12px;
diff --git a/app/src/styles/components/layouts.scss b/app/src/styles/components/layouts.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/app/src/styles/components/logs/logs.scss b/app/src/styles/components/logs/logs.scss
new file mode 100644
index 0000000..f07708b
--- /dev/null
+++ b/app/src/styles/components/logs/logs.scss
@@ -0,0 +1,105 @@
+@use "../../abstracts/variables" as *;
+@use "../../abstracts/mixins" as *;
+
+.log-list-container {
+ width: 100vw;
+ height: 100vh;
+ background: var(--background-color-secondary);
+
+ .log-list-wrapper {
+ height: 50%;
+ min-width: 50%;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ z-index: 5;
+ background: var(--background-color);
+ padding: 14px 12px;
+ border-radius: 15px;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ backdrop-filter: blur(50px);
+ outline: 1px solid var(--border-color);
+
+ .log-header {
+ display: flex;
+ justify-content: space-between;
+
+ .log-header-wrapper {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ }
+
+ .close {
+ @include flex-center;
+ height: 28px;
+ width: 28px;
+ cursor: pointer;
+ svg {
+ scale: 1.6;
+ }
+ }
+ }
+
+ .log-nav-wrapper {
+ display: flex;
+ gap: 6px;
+
+ .log-nav {
+ padding: 8px 16px;
+ border-radius: 19px;
+ }
+
+ .log-nav.active {
+ background-color: var(--background-color-accent);
+ color: var(--text-button-color);
+ }
+ }
+
+ .log-entry-wrapper {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ background: var(--background-color);
+ padding: 18px 10px;
+ border-radius: 16px;
+ outline: 1px solid var(--border-color);
+ outline-offset: -1px;
+
+ .log-entry {
+ padding: 4px;
+ border-radius: 4px;
+ font-size: var(--font-size-small);
+ display: flex;
+ align-items: center;
+ gap: 6px;
+
+ .log-icon {
+ @include flex-center;
+ }
+ .log-entry-message-container {
+ @include flex-space-between;
+ gap: 12px;
+ width: 100%;
+ .message-time {
+ font-size: var(--font-size-tiny);
+ font-weight: 300;
+ opacity: 0.8;
+ text-wrap: nowrap;
+ }
+ .log-entry-message{
+ width: 100%;
+ }
+ }
+
+ &:nth-child(odd) {
+ background: var(--background-color);
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/styles/components/simulation/analysis.scss b/app/src/styles/components/simulation/analysis.scss
new file mode 100644
index 0000000..9aed5c8
--- /dev/null
+++ b/app/src/styles/components/simulation/analysis.scss
@@ -0,0 +1,557 @@
+@use "../../abstracts/variables" as *;
+@use "../../abstracts/mixins" as *;
+
+.analysis {
+ position: fixed;
+ top: 0;
+ left: 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: start;
+ width: 100%;
+ height: 100vh;
+ pointer-events: none;
+ padding: 10px;
+ z-index: 2;
+
+ .analysis-wrapper {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ }
+ .analysis-card {
+ min-width: 333px;
+ border-radius: 20px;
+ padding: 8px;
+ pointer-events: all;
+
+ .analysis-card-wrapper {
+ width: 100%;
+ background: var(--background-color);
+ border-radius: 14px;
+ padding: 16px;
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+ backdrop-filter: blur(10px);
+ outline: 1px solid var(--border-color);
+ outline-offset: -1px;
+
+ .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: 100%;
+ height: 4px;
+ border-radius: 13px;
+ overflow: hidden;
+ background: #fbebd7;
+
+ .bar-fill {
+ position: absolute;
+ height: 100%;
+ top: 0;
+ left: 0;
+ background: #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-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: 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: #f3c64d;
+ }
+
+ &:nth-child(2) {
+ background: #67b3f4;
+ }
+
+ &:nth-child(3) {
+ background: #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: #f3c64d;
+ }
+ }
+
+ &:nth-child(2) {
+ .indicator {
+ background: #67b3f4;
+ }
+ }
+
+ &:nth-child(3) {
+ .indicator {
+ background: #7981f5;
+ }
+ }
+
+ label {
+ font-size: var(--font-size-small);
+ position: relative;
+ }
+
+ .indicator {
+ display: inline-block;
+ width: 5px;
+ height: 5px;
+ border-radius: 50%;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ .roiSummary-wrapper {
+ max-width: 470px;
+ background-color: var(--background-color);
+
+ .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: var(--text-color);
+ }
+ }
+ }
+ }
+
+ .roi-details {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .progress-wrapper {
+ width: 250px;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+
+ .content {
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+ align-items: center;
+
+ .key {
+ font-size: var(--font-size-xlarge);
+ color: var(--accent-color);
+ }
+ }
+ }
+
+ .roi-progress {
+ width: 100%;
+ }
+
+ .metrics {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+
+ .metric-item {
+ width: 100%;
+ border-radius: #{$border-radius-xxx};
+ border: 1px solid #00ff56;
+ background: #17eb5e42;
+ display: flex;
+ flex-direction: column;
+ padding: 4px 8px;
+
+ &:last-child {
+ align-items: center;
+ }
+
+ .metric-label {
+ opacity: 0.8;
+ font-size: 10px;
+ font-weight: 300;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .metric-value {
+ text-align: center;
+ line-height: 20px;
+ }
+ }
+
+ .metric-wrapper {
+ display: flex;
+ gap: 6px;
+
+ .metric-item {
+ border-radius: #{$border-radius-large};
+ background-color: var(--background-color);
+ border: 1px solid var(--border-color);
+ }
+ }
+ }
+ }
+
+ .cost-breakdown {
+ background-color: var(--background-color);
+ border: 1px solid var(--border-color);
+ border-radius: #{$border-radius-extra-large};
+ padding: 16px;
+
+ .breakdown-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+
+ .section-wrapper {
+ display: flex;
+ gap: 4px;
+ align-items: center;
+ }
+
+ .section-number {
+ color: #00aaff;
+ }
+
+ .section-title {
+ font-size: var(--font-size-regular);
+ color: var(--text-color);
+ }
+
+ .expand-icon {
+ font-size: 16px;
+ color: var(--text-color);
+ cursor: pointer;
+ transform: rotate(90deg);
+ transition: transform 0.2s linear;
+ }
+
+ .expand-icon.open {
+ transform: rotate(0deg);
+ }
+ }
+
+ .breakdown-table {
+ width: 100%;
+ border-collapse: collapse;
+ border-radius: 8px;
+ overflow: hidden;
+ outline: 1px solid var(--border-color);
+ outline-offset: -1px;
+ margin-top: 12px;
+
+ th,
+ td {
+ color: var(--text-color);
+ padding: 8px;
+ text-align: left;
+ border: 1px solid var(--border-color);
+ }
+ th {
+ background-color: var(--background-color);
+ }
+ }
+ }
+
+ .tips-section {
+ background-color: var(--background-color);
+ border-radius: #{$border-radius-large};
+ outline: 1px solid var(--border-color);
+ 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 {
+ font-size: var(--font-size-xlarge);
+ color: #34c759;
+
+ &:first-child {
+ color: #34c759;
+ }
+
+ &:nth-child(2) {
+ color: #488ef6;
+ }
+ }
+ }
+ }
+
+ .get-tips-button {
+ border: none;
+ border-radius: 5px;
+ cursor: pointer;
+ font-size: 14px;
+ margin-top: 8px;
+ display: inline-block;
+ display: flex;
+ justify-content: flex-end;
+ background: none;
+
+ .btn {
+ color: var(--text-button-color);
+ background: var(--background-color-button);
+ padding: 4px 12px;
+ border-radius: #{$border-radius-large};
+ display: inline-block;
+ text-align: center;
+ }
+ }
+ }
+
+ .semi-circle-wrapper {
+ width: 100%;
+ height: 125px;
+ overflow-y: hidden;
+ position: relative;
+ .semi-circle {
+ width: 100%;
+ height: 250px;
+ border-radius: 50%;
+ position: relative;
+ }
+ .progress-cover {
+ position: absolute;
+ width: 75%;
+ height: 75%;
+ top: 12.5%;
+ left: 12.5%;
+ border-radius: 50%;
+ }
+ }
+
+ .label-wrapper {
+ .label {
+ font-size: var(--font-size-xxxlarge);
+ }
+
+ position: absolute;
+ bottom: 0%;
+ left: 50%;
+ transform: translate(-50%, 0%);
+ font-weight: bold;
+ font-size: 1.2rem;
+ color: #333;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+ }
+}
+
+.breakdown-table-wrapper {
+ &.closed {
+ max-height: 0;
+ padding: 0;
+ }
+
+ &.open {
+ max-height: 500px;
+ }
+
+ .breakdown-table {
+ width: 100%;
+ border-collapse: collapse;
+
+ th,
+ td {
+ padding: 10px;
+ border: 1px solid #ddd;
+ text-align: left;
+ }
+ }
+}
+
+// Breakdown Table Open/Close Logic
+
diff --git a/app/src/styles/components/simulation/simulation.scss b/app/src/styles/components/simulation/simulation.scss
index 0fc3df8..88f85dc 100644
--- a/app/src/styles/components/simulation/simulation.scss
+++ b/app/src/styles/components/simulation/simulation.scss
@@ -32,10 +32,17 @@
}
.controls-container {
- @include flex-center;
+ @include flex-space-between;
gap: 12px;
justify-content: space-between;
-
+ .header{
+ @include flex-center;
+ gap: 6px;
+ padding: 0 8px;
+ svg{
+ scale: 1.3;
+ }
+ }
.production-details,
.controls-wrapper {
@include flex-center;
@@ -72,7 +79,7 @@
.expand-icon-container {
@include flex-center;
- padding: 6px 8px;
+ padding: 0 8px;
cursor: pointer;
}
@@ -307,6 +314,22 @@
font-size: var(--font-size-tiny);
}
+ .timmer {
+ width: auto;
+ position: absolute;
+ bottom: 0;
+ font-size: var(--font-size-tiny);
+ }
+
+ .start-displayer {
+ left: 8px;
+ }
+
+ .end-displayer {
+ width: auto;
+ right: 8px;
+ }
+
.start-displayer {
bottom: 4px;
left: 16px;
@@ -347,6 +370,12 @@
}
.simulation-player-container.open {
+
+ .start-displayer,
+ .end-displayer {
+ display: none;
+ }
+
.timmer {
display: none;
}
diff --git a/app/src/styles/components/tools.scss b/app/src/styles/components/tools.scss
index e476c3c..29d37b4 100644
--- a/app/src/styles/components/tools.scss
+++ b/app/src/styles/components/tools.scss
@@ -15,7 +15,7 @@
transition: width 0.2s;
background: var(--background-color);
backdrop-filter: blur(8px);
- z-index: #{$z-index-default};
+ z-index: 2;
outline: 1px solid var(--border-color);
outline-offset: -1px;
@@ -124,6 +124,8 @@
padding: 4px;
border-radius: #{$border-radius-medium};
background: var(--background-color);
+ outline: 1px solid var(--border-color);
+ outline-offset: -1px;
gap: 5px;
position: relative;
diff --git a/app/src/styles/layout/sidebar.scss b/app/src/styles/layout/sidebar.scss
index c7f1694..f8c022f 100644
--- a/app/src/styles/layout/sidebar.scss
+++ b/app/src/styles/layout/sidebar.scss
@@ -58,12 +58,8 @@
fill: var(--icon-default-color-active);
}
&:hover {
- rect {
- stroke: var(--icon-default-color);
- }
- circle {
- fill: var(--icon-default-color);
- }
+ filter: saturate(0.8);
+ background: var(--background-color-accent);
}
}
}
@@ -420,7 +416,7 @@
outline: none;
path {
stroke: var(--text-button-color);
- stroke-width: 1.3;
+ strokeWidth: 1.3;
}
}
}
@@ -686,7 +682,7 @@
path {
stroke: var(--accent-color);
- stroke-width: 1.5px;
+ strokeWidth: 1.5px;
}
&:hover {
@@ -714,10 +710,10 @@
.add-button {
@include flex-center;
- padding: 2px 4px;
+ padding: 4px 8px;
background: var(--background-color-button);
color: var(--text-button-color);
- border-radius: #{$border-radius-small};
+ border-radius: #{$border-radius-large};
cursor: pointer;
outline: none;
border: none;
@@ -832,10 +828,10 @@
transform: translateX(4px);
&:hover {
- background: var(--accent-color);
+ background: var(--background-color-accent);
path {
- stroke: var(--primary-color);
+ stroke: var(--text-button-color);
}
}
}
@@ -1003,10 +999,10 @@
border-radius: 8px 0 0 8px;
&:hover {
- background: var(--accent-color);
+ background: var(--background-color-accent);
path {
- stroke: var(--primary-color);
+ stroke: var(--text-button-color);
}
}
}
@@ -1067,7 +1063,13 @@
.dropdown-content-container {
padding: 6px 12px;
}
-
+ .value-field-container {
+ padding: 6px;
+ .dropdown {
+ min-width: 44px;
+ text-align: center;
+ }
+ }
.input-range-container {
.input-container {
width: 75%;
diff --git a/app/src/styles/main.scss b/app/src/styles/main.scss
index 66a60e7..3adfc0f 100644
--- a/app/src/styles/main.scss
+++ b/app/src/styles/main.scss
@@ -13,7 +13,6 @@
@use 'components/button';
@use 'components/form';
@use 'components/input';
-@use 'components/layouts';
@use 'components/lists';
@use 'components/moduleToggle';
@use 'components/templates';
@@ -22,11 +21,12 @@
@use 'components/visualization/ui/styledWidgets';
@use 'components/visualization/floating/common';
@use 'components/marketPlace/marketPlace';
-@use 'components/simulation/simulation';
@use 'components/menu/menu';
@use 'components/confirmationPopUp';
-@use 'components/analysis/analysis';
-@use 'components/analysis/ROISummary.scss';
+@use 'components/simulation/simulation';
+@use 'components/simulation/analysis';
+@use 'components/logs/logs';
+@use 'components/footer/footer.scss';
// layout
@use 'layout/loading';
diff --git a/app/src/styles/pages/realTimeViz.scss b/app/src/styles/pages/realTimeViz.scss
index fa1b86c..abc626a 100644
--- a/app/src/styles/pages/realTimeViz.scss
+++ b/app/src/styles/pages/realTimeViz.scss
@@ -3,8 +3,6 @@
// Main Container
.realTime-viz {
- background: #131313;
- box-shadow: $box-shadow-medium;
width: calc(100% - (320px + 270px + 90px));
height: calc(100% - (250px));
position: absolute;
@@ -12,8 +10,8 @@
left: calc(270px + 45px);
transform: translate(0, -50%);
border-radius: #{$border-radius-medium};
- transition: all 0.2s;
- z-index: #{$z-index-default};
+ z-index: 2;
+ pointer-events: none;
.realTime-viz-wrapper {
width: 100%;
@@ -39,10 +37,6 @@
z-index: 1;
}
- .scene-container {
- overflow: hidden;
- }
-
.icon {
display: flex;
align-items: center;
@@ -74,6 +68,8 @@
z-index: 3;
transform: translate(-50%, -10%);
transition: transform 0.5s linear;
+ pointer-events: all;
+
&::-webkit-scrollbar {
display: none;
}
@@ -367,6 +363,7 @@
border-radius: 2px;
transition: transform 0.3s ease;
box-shadow: #{$box-shadow-medium};
+ pointer-events: all;
svg {
stroke: var(--icon-default-color) !important;
@@ -426,10 +423,8 @@
path {
stroke: #f65648;
- stroke-width: 1.3;
+ strokeWidth: 1.3;
}
-
-
}
}
@@ -778,17 +773,10 @@
}
}
-
-
-
.panel-content {
background: var(--background-color);
-
}
-
-
-
/* RIGHT */
.panel-content.right-opening {
animation: rightExpand 0.5s ease-in-out forwards;
@@ -913,9 +901,6 @@
}
}
-
-
-
// Add button
.extra-Bs-addopening {
@@ -926,7 +911,6 @@
animation: slideUp 0.3s ease forwards;
}
-
@keyframes slideDown {
from {
opacity: 0;