Skip to content

Commit 5fe5900

Browse files
Styling2 (#24)
* Styling: smaller gap between pairs; Bob label below row on mobile * styling drawer button * aligned top header * controlPanel/drawer header styling * styling density martix * moved simulation controls to top + styling
1 parent 4217ec2 commit 5fe5900

15 files changed

Lines changed: 738 additions & 301 deletions

src/components/App.css

Lines changed: 70 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,21 @@
1414
}
1515

1616
header {
17-
text-align: center;
18-
margin-bottom: 32px;
17+
display: flex;
18+
align-items: center;
19+
justify-content: center;
20+
margin-bottom: 16px;
1921
padding-bottom: 24px;
2022
border-bottom: 1px solid var(--soft-gray);
23+
position: relative;
2124
}
2225

2326
header h1 {
2427
color: var(--secondary-color);
2528
font-size: 32px;
2629
font-weight: 700;
2730
margin-bottom: 8px;
31+
text-align: center;
2832
}
2933

3034
header h2 {
@@ -33,13 +37,63 @@ header h2 {
3337
font-size: 18px;
3438
}
3539

40+
/* Drawer toggle button */
41+
.drawer-toggle {
42+
display: none;
43+
/* position: absolute; */
44+
left: 0;
45+
background: var(--primary-color);
46+
color: white;
47+
border: none;
48+
border-radius: var(--border-radius);
49+
width: 56px;
50+
height: 56px;
51+
font-size: 1.1rem;
52+
font-weight: 500;
53+
cursor: pointer;
54+
box-shadow: var(--box-shadow);
55+
transition: all 0.2s ease;
56+
backdrop-filter: blur(8px);
57+
-webkit-backdrop-filter: blur(8px);
58+
align-items: center;
59+
justify-content: center;
60+
}
61+
62+
.drawer-toggle:hover {
63+
background: var(--primary-color);
64+
transform: translateY(-2px);
65+
box-shadow: 0 6px 16px rgba(59, 130, 246, 0.3);
66+
}
67+
68+
.drawer-toggle:active {
69+
transform: translateY(0);
70+
box-shadow: 0 2px 8px rgba(59, 130, 246, 0.2);
71+
}
72+
73+
.drawer-toggle svg {
74+
transition: all 0.2s ease;
75+
width: 24px;
76+
height: 24px;
77+
}
78+
79+
.drawer-toggle:hover svg {
80+
transform: scale(1.1);
81+
}
82+
3683
main {
3784
display: flex;
3885
flex-direction: column;
3986
width: 100%;
4087
}
4188

4289
.simulation-area {
90+
display: flex;
91+
flex-direction: column;
92+
gap: 20px;
93+
width: 100%;
94+
}
95+
96+
.simulation-content {
4397
display: flex;
4498
gap: 30px;
4599
align-items: flex-start;
@@ -49,7 +103,7 @@ main {
49103
/* ControlPanel is already set to flex: 0 0 320px in its own CSS file */
50104

51105
/* EnsembleDisplay needs to take remaining space */
52-
.simulation-area > :nth-child(2) {
106+
.simulation-content > :nth-child(2) {
53107
flex: 1;
54108
}
55109

@@ -127,8 +181,11 @@ footer {
127181
}
128182

129183
header {
130-
margin-left: 60px;
131-
margin-bottom: 24px;
184+
margin-bottom: 12px;
185+
}
186+
187+
.drawer-toggle {
188+
display: flex;
132189
}
133190

134191
header h1 {
@@ -140,20 +197,20 @@ footer {
140197
}
141198

142199
main {
143-
padding-top: 20px; /* Add space for the fixed toggle button */
200+
/*padding-top: 20px; !* Add space for the fixed toggle button *!*/
144201
width: 100%;
145202
overflow-x: hidden;
146203
}
147204

148-
.simulation-area {
205+
.simulation-content {
149206
flex-direction: column;
150207
gap: 16px;
151208
width: 100%;
152209
max-width: 100%;
153210
}
154211

155212
/* The drawer now handles the control panel display independently */
156-
.simulation-area > :nth-child(2) {
213+
.simulation-content > :nth-child(2) {
157214
width: 100%;
158215
max-width: 100%;
159216
}
@@ -165,9 +222,7 @@ footer {
165222
overflow-x: auto;
166223
}
167224

168-
.drawer-toggle.open {
169-
display: none;
170-
}
225+
171226

172227
.drawer-overlay {
173228
position: fixed;
@@ -186,8 +241,10 @@ footer {
186241
padding: 12px;
187242
}
188243

189-
header {
190-
margin-left: 55px;
244+
.drawer-toggle {
245+
width: 52px;
246+
height: 52px;
247+
font-size: 1rem;
191248
}
192249

193250
.simulation-display {

src/components/App.tsx

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import React, { useState, useEffect } from 'react';
2+
import { HiMenu, HiX } from 'react-icons/hi';
23
import { SimulationController } from '../controller/simulationController';
34
import { SimulationState, SimulationParameters, EngineType, Basis, NoiseChannel } from '../engine/types';
45
import ControlPanel from './ControlPanel';
56
import EnsembleDisplay from './EnsembleDisplay';
7+
import SimulationControls from './SimulationControls';
68
import InfoWindow from './InfoWindow';
79
import Attribution from './Attribution';
810
import './App.css';
@@ -45,6 +47,13 @@ const App: React.FC = () => {
4547
return (
4648
<div className="app-container">
4749
<header>
50+
<button
51+
className={`drawer-toggle${drawerOpen ? ' open' : ''}`}
52+
aria-label="Toggle controls"
53+
onClick={() => setDrawerOpen(o => !o)}
54+
>
55+
<HiMenu size={24} />
56+
</button>
4857
<h1>Quantum Entanglement Purification Simulator</h1>
4958
</header>
5059

@@ -56,40 +65,39 @@ const App: React.FC = () => {
5665
onClick={() => setDrawerOpen(false)}
5766
/>
5867
)}
59-
<button
60-
className={`drawer-toggle${drawerOpen ? ' open' : ''}`}
61-
aria-label="Toggle controls"
62-
onClick={() => setDrawerOpen(o => !o)}
63-
>
64-
65-
</button>
6668
<div className="simulation-area">
67-
<ControlPanel
68-
className={drawerOpen ? 'open' : ''}
69-
isDrawerOpen={drawerOpen}
70-
onDrawerClose={() => setDrawerOpen(false)}
69+
<SimulationControls
7170
onNextStep={() => controller.nextStep()}
7271
onCompleteRound={() => controller.completeRound()}
7372
onRunAll={() => controller.runUntilComplete()}
7473
onReset={() => controller.reset()}
75-
onParametersChanged={(params) => controller.updateParameters(params)}
76-
onEngineTypeChanged={handleEngineTypeChange}
77-
onViewBasisChanged={setViewBasis}
7874
isComplete={state.complete}
79-
currentRound={state.round}
8075
currentStep={state.purificationStep}
81-
pairsRemaining={state.pairs.length}
82-
averageFidelity={state.averageFidelity}
83-
engineType={engineType}
84-
viewBasis={viewBasis}
8576
/>
8677

87-
<EnsembleDisplay
88-
pairs={state.pairs}
89-
pendingPairs={state.pendingPairs}
90-
purificationStep={state.purificationStep}
91-
viewBasis={viewBasis}
92-
/>
78+
<div className="simulation-content">
79+
<ControlPanel
80+
className={drawerOpen ? 'open' : ''}
81+
isDrawerOpen={drawerOpen}
82+
onDrawerClose={() => setDrawerOpen(false)}
83+
onParametersChanged={(params) => controller.updateParameters(params)}
84+
onEngineTypeChanged={handleEngineTypeChange}
85+
onViewBasisChanged={setViewBasis}
86+
currentRound={state.round}
87+
currentStep={state.purificationStep}
88+
pairsRemaining={state.pairs.length}
89+
averageFidelity={state.averageFidelity}
90+
engineType={engineType}
91+
viewBasis={viewBasis}
92+
/>
93+
94+
<EnsembleDisplay
95+
pairs={state.pairs}
96+
pendingPairs={state.pendingPairs}
97+
purificationStep={state.purificationStep}
98+
viewBasis={viewBasis}
99+
/>
100+
</div>
93101
</div>
94102
</main>
95103

0 commit comments

Comments
 (0)