- updateElementStyle(selectedBlock, selectedElement, {
- color: e.target.value,
- })
- }
- className="color-input"
- />
+
+
setSelectType("design")}>
+ Design
+
+
setSelectType("data")}>
+ Data
- )}
-
-
-
-
-
-
-
- updateElementStyle(selectedBlock, selectedElement, {
- fontSize: Number(e.target.value),
- })
- }
- className="form-input"
- />
-
-
-
-
- updateElementSize(selectedBlock, selectedElement, {
- ...currentElement.size!,
- width: Number(e.target.value),
- })
- }
- className="form-input"
- />
-
-
-
-
-
- updateElementSize(selectedBlock, selectedElement, {
- ...currentElement.size!,
- height: Number(e.target.value),
- })
- }
- className="form-input"
- />
-
-
-
-
-
- updateElementStyle(selectedBlock, selectedElement, {
- padding: Number(e.target.value),
- })
- }
- className="form-input"
- />
-
-
-
-
-
-
-
- {currentElement.positionType === "absolute" && (
+ {selectType === "design" && (
<>
-
-
-
- updateElementPosition(selectedBlock, selectedElement, {
- ...currentElement.position!,
- x: Number(e.target.value),
- })
- }
- className="form-input"
- />
-
-
-
-
- updateElementPosition(selectedBlock, selectedElement, {
- ...currentElement.position!,
- y: Number(e.target.value),
- })
- }
- className="form-input"
- />
-
- >
- )}
-
- {currentElement.positionType === "fixed" && (
- <>
-
-
-
- updateElementPosition(selectedBlock, selectedElement, {
- ...currentElement.position!,
- x: Number(e.target.value),
- })
- }
- className="form-input"
- />
-
-
-
-
- updateElementPosition(selectedBlock, selectedElement, {
- ...currentElement.position!,
- y: Number(e.target.value),
- })
- }
- className="form-input"
- />
-
- >
- )}
-
-
-
- updateElementZIndex(selectedBlock, selectedElement, Number(e.target.value))}
- className="form-input"
- />
-
-
- {currentElement.type === "graph" && (
- <>
-
-
-
-
-
-
-
- updateGraphTitle(selectedBlock, selectedElement, e.target.value)}
- className="form-input"
- />
-
- >
- )}
-
-
-
-
-
- {/* Data Binding Section */}
-
-
Data Binding
-
-
-
-
-
-
-
- {currentElement.data?.dataSource === "static" && (
- <>
- {currentElement.type === "label-value" && (
-
-
-
- updateElementData(selectedBlock, selectedElement, {
- label: e.target.value,
- })
- }
- className="form-input"
- />
-
- )}
-
-
-
- updateElementData(selectedBlock, selectedElement, {
- staticValue: e.target.value,
- })
- }
- className="form-input"
- />
-
- >
- )}
-
- {currentElement.data?.dataSource === "dynamic" && (
- <>
- {currentElement.type === "label-value" && (
-
-
-
- updateElementData(selectedBlock, selectedElement, {
- label: e.target.value,
- })
- }
- className="form-input"
- />
-
- )}
-
-
-
-
- >
- )}
-
- {currentElement.data?.dataSource === "formula" && (
- <>
- {currentElement.type === "label-value" && (
-
-
-
- updateElementData(selectedBlock, selectedElement, {
- label: e.target.value,
- })
- }
- className="form-input"
- />
-
- )}
-
-
-
- updateElementData(selectedBlock, selectedElement, {
- formula: e.target.value,
- })
- }
- className="form-input"
- />
-
- Use {"{key}"} to reference data values. Example: {"{totalUsers} * {growthRate}"}
-
-
- >
- )}
-
- {currentElement.type === "graph" && (
-
);
};
diff --git a/app/src/components/icons/ExportCommonIcons.tsx b/app/src/components/icons/ExportCommonIcons.tsx
index 5cd6b26..6659ac8 100644
--- a/app/src/components/icons/ExportCommonIcons.tsx
+++ b/app/src/components/icons/ExportCommonIcons.tsx
@@ -1748,3 +1748,118 @@ export const PerformanceStatsIcon = () => {
);
};
+
+export const DeviceIcon = () => {
+ return (
+
+ );
+};
+
+export const ParametersIcon = () => {
+ return (
+
+
+ );
+};
+
+
+export const AlignRightIcon = () => {
+ return (
+
+ );
+};
+
+
+export const AlignJustifyIcon = () => {
+ return (
+
+ );
+};
+
+
+export const AlignLeftIcon = () => {
+ return (
+
+ );
+};
+
+export const FlexRowIcon = () => {
+ return (
+
+ );
+};
+
+export const FlexColumnIcon = () => {
+ return (
+
+ );
+};
+
+export const FlexRowReverseIcon = () => {
+ return (
+
+ );
+};
+
+export const FlexColumnReverseIcon = () => {
+ return (
+
+ );
+};
\ No newline at end of file
diff --git a/app/src/components/ui/analysis/ProductionCapacity.tsx b/app/src/components/ui/analysis/ProductionCapacity.tsx
index d5b0951..47c1898 100644
--- a/app/src/components/ui/analysis/ProductionCapacity.tsx
+++ b/app/src/components/ui/analysis/ProductionCapacity.tsx
@@ -3,7 +3,7 @@ import { Line } from "react-chartjs-2";
import { Chart as ChartJS, LineElement, CategoryScale, LinearScale, PointElement } from "chart.js";
import { PowerIcon, ProductionCapacityIcon } from "../../icons/analysis";
import SkeletonUI from "../../templates/SkeletonUI";
-import { useInputValues, useMachineUptime, useProductionCapacityData, useThroughPutData } from "../../../store/builder/store";
+import { useInputValues, useMachineUptime, useProductionCapacityData } from "../../../store/builder/store";
ChartJS.register(LineElement, CategoryScale, LinearScale, PointElement);
@@ -28,7 +28,6 @@ const ThroughputSummary: React.FC = () => {
];
const { productionCapacityData } = useProductionCapacityData();
- const { throughputData: data } = useThroughPutData();
const chartOptions = {
responsive: true,
diff --git a/app/src/components/ui/analysis/ROISummary.tsx b/app/src/components/ui/analysis/ROISummary.tsx
index 5e52cc0..f856270 100644
--- a/app/src/components/ui/analysis/ROISummary.tsx
+++ b/app/src/components/ui/analysis/ROISummary.tsx
@@ -1,7 +1,6 @@
import React, { useEffect, useState } from "react";
import {
CostBreakDownIcon,
- LightBulpIcon,
ROISummaryIcon,
ROISummaryProductName,
SonarCrownIcon,
diff --git a/app/src/components/ui/analysis/ThroughputSummary.tsx b/app/src/components/ui/analysis/ThroughputSummary.tsx
index 52fa9f4..d0b23d2 100644
--- a/app/src/components/ui/analysis/ThroughputSummary.tsx
+++ b/app/src/components/ui/analysis/ThroughputSummary.tsx
@@ -1,99 +1,111 @@
import { useEffect, useState } from "react";
-import { useInputValues, useMachineCount, useMachineUptime, useMaterialCycle, useProductionCapacityData, useThroughPutData } from "../../../store/builder/store";
import {
- ThroughputSummaryIcon,
-} from "../../icons/analysis";
+ useInputValues,
+ useMachineUptime,
+ useMaterialCycle,
+ useThroughPutData,
+} from "../../../store/builder/store";
+import { ThroughputSummaryIcon } from "../../icons/analysis";
import SkeletonUI from "../../templates/SkeletonUI";
const ProductionCapacity = ({
- avgProcessTime = "28.4 Secs/unit",
- machineUtilization = "78%",
- throughputValue = 128,
- timeRange = { startTime: "08:00 AM", endTime: "09:00 AM" },
+ avgProcessTime = "28.4 Secs/unit",
+ machineUtilization = "78%",
+ throughputValue = 128,
+ timeRange = { startTime: "08:00 AM", endTime: "09:00 AM" },
}) => {
- const { machineActiveTime } = useMachineUptime();
- const { materialCycleTime } = useMaterialCycle();
- const { throughputData } = useThroughPutData()
- const { inputValues } = useInputValues();
+ const { machineActiveTime } = useMachineUptime();
+ const { materialCycleTime } = useMaterialCycle();
+ const { throughputData } = useThroughPutData();
+ const { inputValues } = useInputValues();
- const progressPercent = machineActiveTime;
+ const progressPercent = machineActiveTime;
- const shiftLength = parseFloat(inputValues["Shift length"]);
+ const shiftLength = parseFloat(inputValues["Shift length"]);
- const totalBars = 6;
- const barsToFill = Math.floor((progressPercent / 100) * totalBars);
- const partialFillPercent = ((progressPercent / 1000) * totalBars - barsToFill) * 100;
+ const totalBars = 6;
+ const barsToFill = Math.floor((progressPercent / 100) * totalBars);
+ const partialFillPercent = ((progressPercent / 1000) * totalBars - barsToFill) * 100;
- const [isLoading, setIsLoading] = useState(true);
+ const [isLoading, setIsLoading] = useState(true);
- useEffect(() => {
- if (throughputData > 0) {
- setIsLoading(false);
- } else {
- setIsLoading(false);
- }
- }, [throughputData])
+ useEffect(() => {
+ if (throughputData > 0) {
+ setIsLoading(false);
+ } else {
+ setIsLoading(false);
+ }
+ }, [throughputData]);
- const Units_per_hour = ((shiftLength * 60) / (materialCycleTime / 60) / shiftLength)
+ const Units_per_hour = (shiftLength * 60) / (materialCycleTime / 60) / shiftLength;
- return (
- <>
- {!isLoading &&
-
-
-
-
Throughput Summary
-
- {timeRange.startTime} - {timeRange.endTime}
-
-
-
-
-
-
- {!isLoading ? (
- <>
-
-
- {(Units_per_hour).toFixed(2) === "Infinity"? 0 : (Units_per_hour).toFixed(2) } Units/hour
-
+ return (
+ <>
+ {!isLoading && (
+
+
+
+
+
Throughput Summary
+
+ {timeRange.startTime} - {timeRange.endTime}
+
+
+
+
+
+
+ {!isLoading ? (
+ <>
+
+
+
+ {Units_per_hour.toFixed(2) === "Infinity"
+ ? 0
+ : Units_per_hour.toFixed(2)}
+ {" "}
+ Units/hour
+
- {/* Dynamic Progress Bar */}
-
- {[...Array(totalBars)].map((_, i) => (
-
- {i < barsToFill ? (
-
- ) : i === barsToFill ? (
-
- ) : null}
+ {/* Dynamic Progress Bar */}
+
+ {[...Array(totalBars)].map((_, i) => (
+
+ {i < barsToFill ? (
+
+ ) : i === barsToFill ? (
+
+ ) : null}
+
+ ))}
+
+
+
+
+
+ Avg. Process Time
+
+ {materialCycleTime} secs/unit{" "}
+
+
+
+ Machine Utilization
+ {machineActiveTime}
+ {/* {machineActiveTime} */}
+
+
+ >
+ ) : (
+
+ )}
- ))}
-
-
-
-
- Avg. Process Time
- {materialCycleTime} secs/unit
-
-
- Machine Utilization
- {machineActiveTime}
- {/* {machineActiveTime} */}
-
-
- >
- ) : (
-
- )}
-
-
}
- >
- );
+ )}
+ >
+ );
};
export default ProductionCapacity;
diff --git a/app/src/components/ui/inputs/DataDetailedDropdown.tsx b/app/src/components/ui/inputs/DataDetailedDropdown.tsx
new file mode 100644
index 0000000..c96293e
--- /dev/null
+++ b/app/src/components/ui/inputs/DataDetailedDropdown.tsx
@@ -0,0 +1,128 @@
+import React, { useState, useMemo, useRef, useEffect } from "react";
+import { EyeDroperIcon, SearchIcon } from "../../icons/ExportCommonIcons";
+
+export type DropdownItem = {
+ id: string;
+ label: string;
+ icon?: React.ReactNode;
+};
+
+type DataDetailedDropdownProps = {
+ title: string;
+ placeholder?: string;
+ sections: {
+ title?: string;
+ items: DropdownItem[];
+ }[];
+ value?: DropdownItem | null;
+ onChange?: (item: DropdownItem) => void;
+ dropDownHeader?: string;
+ eyedroper?: boolean;
+};
+
+const DataDetailedDropdown: React.FC
= ({
+ title,
+ placeholder = "Select value",
+ sections,
+ value,
+ onChange,
+ dropDownHeader,
+ eyedroper,
+}) => {
+ const [open, setOpen] = useState(false);
+ const [search, setSearch] = useState("");
+ const [isEyeDroperActive, setIsEyeDroperActive] = useState(false)
+ const containerRef = useRef(null);
+
+ // Close dropdown on outside click
+ useEffect(() => {
+ const handleClickOutside = (event: MouseEvent) => {
+ if (containerRef.current && !containerRef.current.contains(event.target as Node)) {
+ setOpen(false);
+ }
+ };
+
+ document.addEventListener("mousedown", handleClickOutside);
+ return () => document.removeEventListener("mousedown", handleClickOutside);
+ }, []);
+
+ const filteredSections = useMemo(() => {
+ if (!search) return sections;
+
+ return sections
+ .map((section) => ({
+ ...section,
+ items: section.items.filter((item) =>
+ item.label.toLowerCase().includes(search.toLowerCase())
+ ),
+ }))
+ .filter((section) => section.items.length > 0);
+ }, [search, sections]);
+
+ return (
+
+
{title}
+
+
+
setOpen((v) => !v)}>
+ {value?.label || placeholder}
+
▾
+
+
+ {open && (
+
+ {dropDownHeader &&
{dropDownHeader}
}
+
+
+
+
+
+
setSearch(e.target.value)}
+ />
+
+
+ {filteredSections.map((section, index) => (
+
+ {section.title && (
+
+
{section.title}
+
{section.items.length}
+
+ )}
+
+ {section.items.map((item) => (
+
{
+ onChange?.(item);
+ setOpen(false);
+ }}
+ >
+ {item.icon && {item.icon}}
+ {item.label}
+
+ ))}
+
+ ))}
+
+ )}
+
+
+ {eyedroper && (
+
setIsEyeDroperActive(!isEyeDroperActive)}
+ >
+
+
+ )}
+
+
+ );
+};
+
+export default DataDetailedDropdown;
diff --git a/app/src/components/ui/inputs/DataSourceSelector.tsx b/app/src/components/ui/inputs/DataSourceSelector.tsx
new file mode 100644
index 0000000..4d8ae66
--- /dev/null
+++ b/app/src/components/ui/inputs/DataSourceSelector.tsx
@@ -0,0 +1,55 @@
+import React, { useState } from "react";
+import RegularDropDown from "./RegularDropDown";
+import { EyeDroperIcon } from "../../icons/ExportCommonIcons";
+
+type DataSourceSelectorProps = {
+ label?: string;
+ options: string[];
+ selected?: string;
+ onSelect: (value: string) => void;
+ eyeDropperActive?: boolean; // initial state
+ showEyeDropper?: boolean;
+};
+
+const DataSourceSelector: React.FC = ({
+ label = "Data Source",
+ options,
+ selected,
+ onSelect,
+ showEyeDropper = true,
+}) => {
+ // Local state to toggle EyeDropper
+ const [isEyeActive, setIsEyeActive] = useState(false);
+
+ return (
+
+
{label}
+
+
+
+
+ {showEyeDropper && (
+
setIsEyeActive(!isEyeActive)}
+ style={{ cursor: "pointer" }}
+ >
+ {/* Pass the local state here */}
+
+
+ )}
+
+
+ );
+};
+
+export default DataSourceSelector;
+
+
+
+
diff --git a/app/src/components/ui/inputs/InputWithDropDown.tsx b/app/src/components/ui/inputs/InputWithDropDown.tsx
index 486faea..cc2ccd5 100644
--- a/app/src/components/ui/inputs/InputWithDropDown.tsx
+++ b/app/src/components/ui/inputs/InputWithDropDown.tsx
@@ -88,3 +88,7 @@ const InputWithDropDown: React.FC = ({
};
export default InputWithDropDown;
+
+
+
+
diff --git a/app/src/components/ui/inputs/RenameInput.tsx b/app/src/components/ui/inputs/RenameInput.tsx
index d1679b9..aa1460a 100644
--- a/app/src/components/ui/inputs/RenameInput.tsx
+++ b/app/src/components/ui/inputs/RenameInput.tsx
@@ -1,10 +1,5 @@
import React, { useState, useRef, useEffect } from "react";
-// interface RenameInputProps {
-// value: string;
-// onRename?: (newText: string) => void;
-// }
-
interface RenameInputProps {
value: string;
onRename?: (newText: string) => void;
diff --git a/app/src/styles/components/simulationDashboard/_simulationDashBoard.scss b/app/src/styles/components/simulationDashboard/_simulationDashBoard.scss
index 73aac03..8de5c8f 100644
--- a/app/src/styles/components/simulationDashboard/_simulationDashBoard.scss
+++ b/app/src/styles/components/simulationDashboard/_simulationDashBoard.scss
@@ -12,7 +12,7 @@
left: 0;
pointer-events: none;
- * > {
+ *> {
pointer-events: auto;
}
@@ -272,11 +272,22 @@
box-shadow: 0px 4px 8px rgba(60, 60, 67, 0.1019607843);
z-index: 3;
+
+ display: flex;
+ flex-direction: column;
+ gap: 11px;
+ min-width: 280px;
+ height: fit-content;
+ min-width: 320px;
+ min-height: 60vh;
+ padding: 12px;
+
+
.header {
display: flex;
justify-content: space-between;
align-items: center;
- margin: 0 0 10px 0;
+ // margin: 0 0 10px 0;
border-bottom: 1px solid gray;
padding-bottom: 10px;
@@ -296,6 +307,223 @@
}
}
+ .icon {
+ display: flex;
+ }
+
+ .design-section {
+
+ padding: 4px;
+ outline: 1px solid var(--border-color);
+ outline-offset: -1px;
+ border-radius: 12px;
+ background: var(--background-color);
+
+ padding: 14px 12px;
+
+ display: flex;
+ flex-direction: column;
+ gap: 11px;
+
+ .value-field-container {
+ padding: 0;
+ margin: 0;
+ // padding: 6px 0px;
+ }
+
+ .select-type {
+ display: flex;
+
+ .type {
+ flex: 1;
+ padding: 4px 0;
+ text-align: center;
+ border-radius: 100px;
+
+ &.active {
+ background-color: var(--background-color-button);
+ }
+ }
+ }
+
+ .position-canvas {
+ background: #8D70AD33;
+ height: 110px;
+ border-radius: 17px;
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ position: relative;
+
+ .canvas {
+ width: 60%;
+ height: 27px;
+ background: #E0DFFF80;
+ // position: relative;
+
+ .value {
+ position: absolute;
+
+ input {
+ // border: none;
+ // outline: none;
+ width: 20px;
+ background: transparent;
+ }
+
+ &:nth-child(1) {
+ top: 20px;
+ left: 50%;
+ transform: translateX(-50%);
+ }
+
+ &:nth-child(2) {
+ top: 50%;
+ right: 35px;
+ transform: translateY(-50%);
+ }
+
+ &:nth-child(3) {
+ bottom: 20px;
+ left: 50%;
+ transform: translateX(-50%);
+ }
+
+ &:nth-child(4) {
+ top: 50%;
+ left: 35px;
+ transform: translateY(-50%);
+ }
+ }
+ }
+ }
+
+ .alignments-section {
+ display: flex;
+ justify-content: center;
+ gap: 7px;
+
+ .section {
+ border-radius: 100px;
+ padding: 6px;
+ display: flex;
+ gap: 10px;
+ width: fit-content;
+
+ }
+
+ .icon {
+ &.active {
+ background-color: var(--background-color-button);
+ border-radius: 2px;
+ }
+ }
+ }
+
+ .input-range-container {
+ margin: 0;
+ padding: 0;
+ }
+
+ .data-picker {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .label {
+ width: 50%;
+ white-space: nowrap;
+ }
+
+ input[type="color"] {
+ width: 42px;
+ padding: 0;
+ background: transparent;
+ outline: none;
+ }
+
+ .left {
+ width: 100%;
+ display: flex;
+ align-items: center;
+ gap: 6px;
+
+ .colorValue {
+ width: 100%;
+ background: linear-gradient(90.85deg, rgba(240, 228, 255, 0.3) 3.6%, rgba(211, 174, 253, 0.3) 96.04%);
+ text-align: center;
+ padding: 4px 0;
+ border-radius: 100px;
+ }
+ }
+ }
+
+ .design-section-footer {
+ display: flex;
+ gap: 7px;
+
+ label,
+ .input {
+ width: auto;
+ }
+
+ input {
+ width: 40px;
+ }
+
+ .input-range-container,
+ .value-field-container {
+ width: 100%;
+ display: flex;
+ gap: 6px;
+
+ .input-container {
+ width: 100%;
+ display: flex;
+ gap: 6px;
+
+ input[type="range"] {
+ margin: 0;
+ width: 70px;
+ }
+ }
+ }
+ }
+ }
+
+ .datas {
+ // width: 100% ;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .datas__label,
+ .datas__class {
+ flex: 1;
+
+ }
+ }
+
+
+ .type-switch {
+ display: flex;
+ padding: 6px 12px;
+
+ .type {
+ flex: 1;
+ text-align: center;
+ padding: 4px 0;
+ border-radius: 19px;
+ cursor: pointer;
+
+ &.active {
+ background: var(--background-color-button);
+ }
+ }
+ }
+
&.data-model-panel {
left: 20px;
top: 50px;
@@ -311,21 +539,171 @@
}
}
- &.block-editor-panel {
- min-width: 280px;
- height: fit-content;
+ &.block-editor-panel {
// h4 {
// color: #4caf50;
// }
+
+
+
+ .design-section-wrapper {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+
+
+ }
+
+ }
+ .data-details {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+
+ .data-wrapper {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ padding: 6px 12px;
+
+ .value-field-container {
+ margin: 0;
+ padding: 0;
+
+ .label,
+ .input.default {
+ width: auto;
+ flex: 1;
+ }
+
+ input,
+ .input-wrapper {
+ background: transparent;
+ }
+ }
+
+ .data {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 9px;
+
+ .datas_label,
+ .regularDropdown-container {
+ flex: 1;
+ }
+ }
+ }
+
+ .data-mapping {
+ display: flex;
+ flex-direction: column;
+ gap: 9px;
+ background: var(--background-color);
+ border: 1px solid var(--border-color);
+ box-shadow: var(--box-shadow-medium);
+ padding: 15px 12px;
+ border-radius: 25px;
+
+ .heading {
+ text-align: center;
+ }
+
+ .type-switch {}
+
+ .fields-wrapper {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+
+ .datas {
+ width: 100%;
+ display: flex;
+ align-items: center;
+ // padding: 6px 12px;
+
+ .datas__label,
+ .datas__class {
+ flex: 1;
+ }
+
+ .datas__label {
+ flex: 0.8;
+ }
+
+ .datas__class {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ .icon {
+ display: flex;
+ padding: 3px;
+ border-radius: 2px;
+
+ &.active {
+
+ background: var(--background-color-button);
+ }
+ }
+
+ .regularDropdown-container {
+ .icon {
+ padding: 0;
+ }
+ }
+ }
+ }
+
+ .add-field {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+
+ svg path {
+ stroke: #CCACFF !important;
+ }
+
+ .label {
+ color: #CCACFF;
+ }
+ }
+ }
+ }
}
&.element-editor-panel {
right: 20px;
top: 50px;
- min-width: 300px;
+ // min-width: 300px;
max-height: 84vh;
overflow: auto;
+
+ max-width: 320px;
+
+ .appearance {
+ .design-datas-wrapper {
+
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 16px 16px;
+
+ .value-field-container {
+ label {
+ width: 80%;
+ text-wrap: nowrap;
+ }
+
+ }
+ }
+ }
+
+ .footer {
+ text-align: center;
+ color: #CCACFF;
+ }
}
}
@@ -534,3 +912,143 @@
}
}
}
+
+
+
+
+
+
+
+// DataDetailedDropdown
+.data-detailed-dropdown {
+ display: flex;
+ width: 100%;
+
+ .title,
+ .input-container {
+ flex: 1;
+ }
+
+ .input-container {
+ width: 100%;
+ display: flex;
+ align-items: center;
+ gap: 6px;
+
+ .input-wrapper {
+ width: 100%;
+ background: transparent;
+ }
+
+ .icon {
+ display: flex;
+ padding: 2px;
+ border-radius: 2px;
+
+ &.active {
+ background: var(--background-color-button);
+ }
+
+ cursor: pointer;
+ }
+ }
+
+ .input-wrapper {
+
+ outline: 1px solid var(--input-border-color);
+ outline-offset: -1px;
+ border: none;
+ background: var(--background-color-input);
+ color: var(--input-text-color);
+
+ border-radius: 100px;
+ position: relative;
+
+ .input {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 4px 8px;
+ }
+
+ .dropdown-panel {
+ position: absolute;
+ z-index: 1;
+ top: 0;
+ right: 0;
+ transform: translateY(30px);
+ min-width: 200px;
+ padding: 12px;
+
+ outline: 1px solid var(--border-color);
+ outline-offset: -1px;
+ border-radius: 12px;
+
+ background: var(--background-color);
+ backdrop-filter: blur(20px);
+
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .search {
+
+ outline: 1px solid var(--border-color);
+ outline-offset: -1px;
+ border-radius: 12px;
+ background: var(--background-color);
+
+ display: flex;
+ align-items: center;
+
+ padding: 4px 9px;
+
+ .icon {
+ height: 10px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ input {
+ outline: none;
+ border: none;
+ background: transparent;
+ padding: 0;
+ padding-left: 3px;
+ }
+ }
+
+ .data-section {
+ .data-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .data-section-count {
+ font-size: 10px;
+ }
+ }
+
+ .item {
+ padding: 8px 0;
+ display: flex;
+ gap: 2px;
+ align-items: center;
+
+ .icon {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ &.active {
+ span {
+ color: #CCACFF;
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file