adithya9903 commited on
Commit
982afcc
·
1 Parent(s): 1c495e4
openenv-polypharmacy/frontend/src/App.jsx CHANGED
@@ -240,6 +240,7 @@ export default function App() {
240
  <header className="topbar glass">
241
  <div className="title-wrap">
242
  <h1>Polypharmacy Control Center</h1>
 
243
  </div>
244
  <div className={`status-chip ${hasValidEpisode ? "live" : "idle"}`}>
245
  {hasValidEpisode ? "Session Live" : "Waiting for reset"}
 
240
  <header className="topbar glass">
241
  <div className="title-wrap">
242
  <h1>Polypharmacy Control Center</h1>
243
+ <p>Metaverse Clinical Ops Console</p>
244
  </div>
245
  <div className={`status-chip ${hasValidEpisode ? "live" : "idle"}`}>
246
  {hasValidEpisode ? "Session Live" : "Waiting for reset"}
openenv-polypharmacy/frontend/src/styles.css CHANGED
@@ -1,15 +1,18 @@
1
  :root {
2
- --bg: #eef5ff;
3
- --panel: rgba(255, 255, 255, 0.82);
4
- --panel-solid: #ffffff;
5
- --text: #0b2445;
6
- --muted: #5b7596;
7
- --primary: #1f8bff;
8
- --primary-2: #69beff;
9
- --accent: #0dd3ff;
10
- --border: rgba(93, 156, 219, 0.22);
11
- --shadow: 0 20px 50px rgba(25, 83, 143, 0.12);
12
- --shadow-strong: 0 20px 42px rgba(31, 112, 182, 0.24);
 
 
 
13
  }
14
 
15
  * {
@@ -18,156 +21,197 @@
18
 
19
  body {
20
  margin: 0;
21
- font-family: "Inter", "SF Pro Text", "Segoe UI", sans-serif;
22
- background:
23
- radial-gradient(circle at 8% 0%, #cce7ff 0%, rgba(204, 231, 255, 0) 42%),
24
- radial-gradient(circle at 92% 100%, #d5efff 0%, rgba(213, 239, 255, 0) 42%),
25
- var(--bg);
26
  color: var(--text);
 
 
 
 
 
 
 
27
  }
28
 
29
  .shell {
30
  min-height: 100vh;
31
  position: relative;
32
- padding: 28px 22px;
33
  overflow: hidden;
 
34
  }
35
 
36
  .container {
37
- width: min(1300px, 100%);
38
  margin: 0 auto;
39
  position: relative;
40
- z-index: 1;
41
  }
42
 
43
  .bg-orb {
44
  position: absolute;
45
  border-radius: 50%;
46
- filter: blur(18px);
47
  opacity: 0.9;
 
48
  }
 
49
  .orb-a {
50
- width: 420px;
51
- height: 420px;
52
- right: -120px;
53
- top: -100px;
54
- background: radial-gradient(circle, rgba(72, 168, 255, 0.5), rgba(72, 168, 255, 0.1));
55
  }
 
56
  .orb-b {
57
- width: 360px;
58
- height: 360px;
59
- left: -100px;
60
- bottom: -120px;
61
- background: radial-gradient(circle, rgba(110, 200, 255, 0.4), rgba(141, 205, 255, 0.06));
62
  }
63
 
64
  .glass {
65
- backdrop-filter: blur(12px);
 
 
66
  border: 1px solid var(--border);
67
- background: var(--panel);
68
  box-shadow: var(--shadow);
 
69
  }
70
 
71
  .topbar {
72
- border-radius: 20px;
73
- padding: 18px;
74
  display: grid;
75
- grid-template-columns: 1.2fr auto 1fr;
76
- justify-content: space-between;
77
  align-items: center;
78
- gap: 12px;
79
  }
80
 
81
  .title-wrap h1 {
82
  margin: 0;
83
- font-size: clamp(1.1rem, 1.5vw, 1.45rem);
84
- letter-spacing: 0.01em;
 
 
85
  }
86
 
87
  .title-wrap p {
88
- margin: 4px 0 0;
 
89
  color: var(--muted);
90
- font-size: 0.92rem;
 
91
  }
92
 
93
  .status-chip {
94
  justify-self: center;
 
95
  border-radius: 999px;
96
- padding: 7px 12px;
97
- font-size: 0.76rem;
98
  font-weight: 700;
99
- letter-spacing: 0.04em;
100
  text-transform: uppercase;
101
  border: 1px solid transparent;
102
  }
103
 
104
  .status-chip.live {
105
- color: #0d6a3f;
106
- background: rgba(130, 245, 195, 0.18);
107
- border-color: rgba(70, 199, 142, 0.3);
108
  }
109
 
110
  .status-chip.idle {
111
- color: #24527f;
112
- background: rgba(114, 194, 255, 0.18);
113
- border-color: rgba(62, 152, 223, 0.28);
114
  }
115
 
116
  .actions {
117
  display: flex;
118
  justify-content: flex-end;
119
- gap: 10px;
120
  flex-wrap: wrap;
 
121
  }
122
 
123
  button,
124
  select,
125
  input {
126
- border: 1px solid var(--border);
 
127
  border-radius: 12px;
128
- padding: 10px 13px;
129
  font-size: 0.92rem;
130
- background: #fff;
131
  color: var(--text);
132
- min-height: 42px;
 
 
 
 
 
 
 
 
 
 
 
 
133
  }
134
 
135
  button {
136
  cursor: pointer;
137
- background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 78%, var(--accent) 100%);
138
- color: #fff;
139
- border: none;
140
  font-weight: 700;
 
 
141
  box-shadow: var(--shadow-strong);
142
- transition: transform 120ms ease, filter 120ms ease;
143
  }
144
 
145
  button:hover {
146
  transform: translateY(-1px);
147
- filter: brightness(1.02);
 
 
 
 
 
148
  }
149
 
150
  button.secondary {
151
- background: linear-gradient(135deg, #68c2ff, #9dd9ff);
152
  }
153
 
154
  button:disabled {
155
- opacity: 0.58;
156
  cursor: not-allowed;
 
 
157
  transform: none;
158
  }
159
 
160
  .layout {
161
- margin-top: 18px;
162
  display: grid;
163
- gap: 16px;
164
- grid-template-columns: 1.15fr 0.85fr;
165
  align-items: start;
166
  }
167
 
168
  .panel {
169
- border-radius: 18px;
170
- padding: 18px;
 
 
 
 
 
 
 
 
 
 
171
  }
172
 
173
  .panel-wide {
@@ -177,31 +221,36 @@ button:disabled {
177
  .panel h2 {
178
  margin: 0 0 12px;
179
  font-size: 1rem;
180
- letter-spacing: 0.01em;
 
 
181
  }
182
 
183
  .kpi-grid {
184
  display: grid;
 
185
  grid-template-columns: repeat(3, minmax(0, 1fr));
186
- gap: 12px;
187
  }
188
 
189
  .kpi-grid div {
190
- background: rgba(255, 255, 255, 0.9);
191
  border: 1px solid var(--border);
192
- border-radius: 14px;
193
- padding: 12px;
194
  }
195
 
196
  .kpi-grid span {
197
  display: block;
198
- font-size: 0.74rem;
199
- color: var(--muted);
200
  margin-bottom: 4px;
 
 
 
 
201
  }
202
 
203
  .kpi-grid strong {
204
- font-size: 1.05rem;
 
205
  }
206
 
207
  .action-row,
@@ -211,6 +260,13 @@ button:disabled {
211
  margin-bottom: 12px;
212
  }
213
 
 
 
 
 
 
 
 
214
  .stack-two {
215
  grid-template-columns: repeat(2, minmax(0, 1fr));
216
  }
@@ -219,22 +275,22 @@ button:disabled {
219
  display: grid;
220
  grid-template-columns: repeat(3, minmax(0, 1fr));
221
  gap: 10px;
222
- max-height: 420px;
223
  overflow: auto;
224
- padding-right: 2px;
225
  }
226
 
227
  .med-card {
228
- border: 1px solid var(--border);
229
  border-radius: 14px;
230
- padding: 12px;
231
  background: var(--panel-solid);
232
- transition: transform 120ms ease, box-shadow 120ms ease;
 
233
  }
234
 
235
  .med-card:hover {
236
  transform: translateY(-1px);
237
- box-shadow: 0 10px 25px rgba(44, 105, 165, 0.12);
238
  }
239
 
240
  .med-card p {
@@ -243,37 +299,42 @@ button:disabled {
243
  text-transform: capitalize;
244
  }
245
 
 
 
 
 
246
  .logs {
247
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
248
- font-size: 0.85rem;
249
  max-height: 300px;
250
  overflow: auto;
 
251
  display: grid;
252
- gap: 6px;
253
- padding-right: 2px;
 
254
  }
255
 
256
  .logs div {
257
- background: rgba(255, 255, 255, 0.78);
258
- border: 1px solid var(--border);
259
  border-radius: 10px;
 
 
260
  padding: 8px 10px;
 
261
  }
262
 
263
  .muted {
264
- color: var(--muted);
265
  margin: 0;
 
266
  }
267
 
268
  .budget-note {
269
  margin-top: 10px;
270
- padding: 10px 12px;
271
  border: 1px solid var(--border);
272
  border-radius: 12px;
273
- background: rgba(255, 255, 255, 0.78);
 
274
  }
275
 
276
- @media (max-width: 1120px) {
277
  .layout {
278
  grid-template-columns: 1fr;
279
  }
@@ -293,7 +354,21 @@ button:disabled {
293
 
294
  @media (max-width: 760px) {
295
  .shell {
296
- padding: 18px 12px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
  }
298
 
299
  .kpi-grid,
@@ -301,4 +376,8 @@ button:disabled {
301
  .stack-two {
302
  grid-template-columns: 1fr;
303
  }
 
 
 
 
304
  }
 
1
  :root {
2
+ --bg: #070814;
3
+ --bg-layer: #0a1026;
4
+ --panel: rgba(14, 22, 44, 0.72);
5
+ --panel-solid: rgba(20, 28, 52, 0.92);
6
+ --text: #e8f1ff;
7
+ --muted: #9ab2db;
8
+ --primary: #37d4ff;
9
+ --primary-2: #5a8dff;
10
+ --accent: #9d59ff;
11
+ --success: #6dfbcf;
12
+ --border: rgba(122, 162, 255, 0.28);
13
+ --line: rgba(109, 143, 225, 0.18);
14
+ --shadow: 0 16px 45px rgba(5, 8, 23, 0.6);
15
+ --shadow-strong: 0 14px 32px rgba(44, 105, 255, 0.4);
16
  }
17
 
18
  * {
 
21
 
22
  body {
23
  margin: 0;
 
 
 
 
 
24
  color: var(--text);
25
+ font-family: "Segoe UI", "SF Pro Text", "Helvetica Neue", sans-serif;
26
+ background:
27
+ radial-gradient(circle at 8% 12%, rgba(121, 87, 255, 0.22), transparent 38%),
28
+ radial-gradient(circle at 88% 20%, rgba(59, 204, 255, 0.26), transparent 34%),
29
+ radial-gradient(circle at 50% 100%, rgba(43, 128, 255, 0.26), transparent 40%),
30
+ linear-gradient(145deg, var(--bg) 0%, var(--bg-layer) 60%, #04060f 100%);
31
+ background-attachment: fixed;
32
  }
33
 
34
  .shell {
35
  min-height: 100vh;
36
  position: relative;
 
37
  overflow: hidden;
38
+ padding: 24px 16px 34px;
39
  }
40
 
41
  .container {
42
+ width: min(1320px, 100%);
43
  margin: 0 auto;
44
  position: relative;
45
+ z-index: 2;
46
  }
47
 
48
  .bg-orb {
49
  position: absolute;
50
  border-radius: 50%;
51
+ pointer-events: none;
52
  opacity: 0.9;
53
+ filter: blur(18px);
54
  }
55
+
56
  .orb-a {
57
+ width: min(46vw, 530px);
58
+ aspect-ratio: 1 / 1;
59
+ right: -9%;
60
+ top: -10%;
61
+ background: radial-gradient(circle, rgba(52, 203, 255, 0.35), rgba(52, 203, 255, 0.04) 70%);
62
  }
63
+
64
  .orb-b {
65
+ width: min(40vw, 460px);
66
+ aspect-ratio: 1 / 1;
67
+ left: -9%;
68
+ bottom: -15%;
69
+ background: radial-gradient(circle, rgba(160, 102, 255, 0.3), rgba(160, 102, 255, 0.06) 72%);
70
  }
71
 
72
  .glass {
73
+ background:
74
+ linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.01)),
75
+ var(--panel);
76
  border: 1px solid var(--border);
 
77
  box-shadow: var(--shadow);
78
+ backdrop-filter: blur(12px);
79
  }
80
 
81
  .topbar {
82
+ border-radius: 24px;
83
+ padding: clamp(14px, 2vw, 20px);
84
  display: grid;
85
+ gap: 12px 16px;
86
+ grid-template-columns: minmax(220px, 1.2fr) auto minmax(280px, 1fr);
87
  align-items: center;
 
88
  }
89
 
90
  .title-wrap h1 {
91
  margin: 0;
92
+ font-size: clamp(1.15rem, 2.2vw, 1.95rem);
93
+ letter-spacing: 0.02em;
94
+ text-transform: uppercase;
95
+ text-shadow: 0 0 16px rgba(106, 192, 255, 0.3);
96
  }
97
 
98
  .title-wrap p {
99
+ margin: 6px 0 0;
100
+ font-size: 0.84rem;
101
  color: var(--muted);
102
+ letter-spacing: 0.03em;
103
+ text-transform: uppercase;
104
  }
105
 
106
  .status-chip {
107
  justify-self: center;
108
+ padding: 7px 14px;
109
  border-radius: 999px;
110
+ font-size: 0.72rem;
 
111
  font-weight: 700;
112
+ letter-spacing: 0.08em;
113
  text-transform: uppercase;
114
  border: 1px solid transparent;
115
  }
116
 
117
  .status-chip.live {
118
+ color: #052c24;
119
+ background: linear-gradient(90deg, rgba(126, 255, 220, 0.9), rgba(84, 244, 196, 0.95));
120
+ box-shadow: 0 0 14px rgba(96, 244, 198, 0.36);
121
  }
122
 
123
  .status-chip.idle {
124
+ color: #d8e8ff;
125
+ border-color: rgba(117, 186, 255, 0.48);
126
+ background: rgba(60, 106, 198, 0.25);
127
  }
128
 
129
  .actions {
130
  display: flex;
131
  justify-content: flex-end;
 
132
  flex-wrap: wrap;
133
+ gap: 10px;
134
  }
135
 
136
  button,
137
  select,
138
  input {
139
+ width: 100%;
140
+ min-height: 42px;
141
  border-radius: 12px;
142
+ border: 1px solid var(--border);
143
  font-size: 0.92rem;
144
+ padding: 10px 12px;
145
  color: var(--text);
146
+ background: rgba(11, 19, 38, 0.84);
147
+ }
148
+
149
+ select,
150
+ input {
151
+ transition: border-color 120ms ease, box-shadow 120ms ease;
152
+ }
153
+
154
+ select:focus,
155
+ input:focus {
156
+ outline: none;
157
+ border-color: rgba(119, 200, 255, 0.88);
158
+ box-shadow: 0 0 0 2px rgba(95, 187, 255, 0.18);
159
  }
160
 
161
  button {
162
  cursor: pointer;
163
+ border: 0;
164
+ width: auto;
 
165
  font-weight: 700;
166
+ letter-spacing: 0.02em;
167
+ background: linear-gradient(135deg, var(--primary), var(--primary-2) 55%, var(--accent));
168
  box-shadow: var(--shadow-strong);
169
+ transition: transform 140ms ease, filter 140ms ease, box-shadow 140ms ease;
170
  }
171
 
172
  button:hover {
173
  transform: translateY(-1px);
174
+ filter: brightness(1.04);
175
+ box-shadow: 0 18px 32px rgba(50, 141, 255, 0.48);
176
+ }
177
+
178
+ button:active {
179
+ transform: translateY(0);
180
  }
181
 
182
  button.secondary {
183
+ background: linear-gradient(135deg, rgba(95, 185, 255, 0.9), rgba(154, 102, 255, 0.86));
184
  }
185
 
186
  button:disabled {
187
+ opacity: 0.56;
188
  cursor: not-allowed;
189
+ filter: grayscale(0.2);
190
+ box-shadow: none;
191
  transform: none;
192
  }
193
 
194
  .layout {
195
+ margin-top: 16px;
196
  display: grid;
197
+ gap: 14px;
198
+ grid-template-columns: 1.12fr 0.88fr;
199
  align-items: start;
200
  }
201
 
202
  .panel {
203
+ border-radius: 20px;
204
+ padding: clamp(14px, 1.8vw, 20px);
205
+ position: relative;
206
+ }
207
+
208
+ .panel::after {
209
+ content: "";
210
+ position: absolute;
211
+ inset: 0;
212
+ border-radius: inherit;
213
+ border: 1px solid var(--line);
214
+ pointer-events: none;
215
  }
216
 
217
  .panel-wide {
 
221
  .panel h2 {
222
  margin: 0 0 12px;
223
  font-size: 1rem;
224
+ font-weight: 700;
225
+ letter-spacing: 0.05em;
226
+ text-transform: uppercase;
227
  }
228
 
229
  .kpi-grid {
230
  display: grid;
231
+ gap: 10px;
232
  grid-template-columns: repeat(3, minmax(0, 1fr));
 
233
  }
234
 
235
  .kpi-grid div {
236
+ border-radius: 13px;
237
  border: 1px solid var(--border);
238
+ background: var(--panel-solid);
239
+ padding: 11px 12px;
240
  }
241
 
242
  .kpi-grid span {
243
  display: block;
 
 
244
  margin-bottom: 4px;
245
+ font-size: 0.72rem;
246
+ color: var(--muted);
247
+ text-transform: uppercase;
248
+ letter-spacing: 0.05em;
249
  }
250
 
251
  .kpi-grid strong {
252
+ font-size: 1.06rem;
253
+ line-height: 1.2;
254
  }
255
 
256
  .action-row,
 
260
  margin-bottom: 12px;
261
  }
262
 
263
+ .action-row label {
264
+ color: var(--muted);
265
+ font-size: 0.78rem;
266
+ letter-spacing: 0.05em;
267
+ text-transform: uppercase;
268
+ }
269
+
270
  .stack-two {
271
  grid-template-columns: repeat(2, minmax(0, 1fr));
272
  }
 
275
  display: grid;
276
  grid-template-columns: repeat(3, minmax(0, 1fr));
277
  gap: 10px;
278
+ max-height: 430px;
279
  overflow: auto;
280
+ padding-right: 4px;
281
  }
282
 
283
  .med-card {
 
284
  border-radius: 14px;
285
+ border: 1px solid var(--border);
286
  background: var(--panel-solid);
287
+ padding: 11px 12px;
288
+ transition: transform 130ms ease, border-color 130ms ease;
289
  }
290
 
291
  .med-card:hover {
292
  transform: translateY(-1px);
293
+ border-color: rgba(109, 224, 255, 0.72);
294
  }
295
 
296
  .med-card p {
 
299
  text-transform: capitalize;
300
  }
301
 
302
+ .med-card small {
303
+ color: #c7d9ff;
304
+ }
305
+
306
  .logs {
 
 
307
  max-height: 300px;
308
  overflow: auto;
309
+ padding-right: 4px;
310
  display: grid;
311
+ gap: 7px;
312
+ font-size: 0.84rem;
313
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
314
  }
315
 
316
  .logs div {
 
 
317
  border-radius: 10px;
318
+ border: 1px solid var(--border);
319
+ background: rgba(10, 16, 31, 0.84);
320
  padding: 8px 10px;
321
+ color: #dbebff;
322
  }
323
 
324
  .muted {
 
325
  margin: 0;
326
+ color: var(--muted);
327
  }
328
 
329
  .budget-note {
330
  margin-top: 10px;
 
331
  border: 1px solid var(--border);
332
  border-radius: 12px;
333
+ padding: 10px 12px;
334
+ background: rgba(13, 22, 42, 0.82);
335
  }
336
 
337
+ @media (max-width: 1180px) {
338
  .layout {
339
  grid-template-columns: 1fr;
340
  }
 
354
 
355
  @media (max-width: 760px) {
356
  .shell {
357
+ padding: 14px 10px 24px;
358
+ }
359
+
360
+ .topbar,
361
+ .panel {
362
+ border-radius: 16px;
363
+ }
364
+
365
+ .actions {
366
+ width: 100%;
367
+ }
368
+
369
+ .actions button,
370
+ .actions select {
371
+ width: 100%;
372
  }
373
 
374
  .kpi-grid,
 
376
  .stack-two {
377
  grid-template-columns: 1fr;
378
  }
379
+
380
+ .logs {
381
+ max-height: 240px;
382
+ }
383
  }