oh-my-opencode-dashboard 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/styles.css ADDED
@@ -0,0 +1,457 @@
1
+ :root {
2
+ --bg-cream: #f5efe2;
3
+ --bg-cream-2: #efe6d2;
4
+ --paper: rgba(255, 255, 255, 0.52);
5
+ --paper-strong: rgba(255, 255, 255, 0.72);
6
+ --ink: #1f2426;
7
+ --muted: rgba(31, 36, 38, 0.62);
8
+ --line: rgba(31, 36, 38, 0.10);
9
+ --shadow: 0 18px 40px rgba(29, 32, 33, 0.09);
10
+
11
+ --teal-ink: #0f3f3a;
12
+ --teal: #0f5a51;
13
+ --teal-soft: rgba(15, 90, 81, 0.13);
14
+
15
+ --sand: #6a5b3d;
16
+ --sand-soft: rgba(135, 114, 71, 0.14);
17
+
18
+ --red: #7a2b2b;
19
+ --red-soft: rgba(122, 43, 43, 0.12);
20
+
21
+ --radius: 18px;
22
+ }
23
+
24
+ * {
25
+ box-sizing: border-box;
26
+ }
27
+
28
+ html,
29
+ body {
30
+ height: 100%;
31
+ }
32
+
33
+ body {
34
+ margin: 0;
35
+ color: var(--ink);
36
+ background:
37
+ radial-gradient(1200px 500px at 16% 0%, rgba(15, 90, 81, 0.10), transparent 60%),
38
+ radial-gradient(900px 420px at 80% 12%, rgba(135, 114, 71, 0.12), transparent 62%),
39
+ linear-gradient(180deg, var(--bg-cream), var(--bg-cream-2));
40
+ font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
41
+ text-rendering: geometricPrecision;
42
+ }
43
+
44
+ .page {
45
+ min-height: 100%;
46
+ position: relative;
47
+ }
48
+
49
+ .page::before {
50
+ content: "";
51
+ position: fixed;
52
+ inset: 0;
53
+ pointer-events: none;
54
+ background:
55
+ repeating-linear-gradient(
56
+ 90deg,
57
+ rgba(0, 0, 0, 0.012),
58
+ rgba(0, 0, 0, 0.012) 1px,
59
+ transparent 1px,
60
+ transparent 6px
61
+ ),
62
+ repeating-linear-gradient(
63
+ 0deg,
64
+ rgba(0, 0, 0, 0.010),
65
+ rgba(0, 0, 0, 0.010) 1px,
66
+ transparent 1px,
67
+ transparent 10px
68
+ );
69
+ mix-blend-mode: multiply;
70
+ opacity: 0.16;
71
+ }
72
+
73
+ .container {
74
+ width: min(1120px, calc(100% - 44px));
75
+ margin: 0 auto;
76
+ padding: 28px 0 36px;
77
+ }
78
+
79
+ .topbar {
80
+ display: flex;
81
+ align-items: flex-start;
82
+ justify-content: space-between;
83
+ gap: 18px;
84
+ }
85
+
86
+ .brand {
87
+ display: flex;
88
+ align-items: flex-start;
89
+ gap: 14px;
90
+ }
91
+
92
+ .brandMark {
93
+ width: 44px;
94
+ height: 44px;
95
+ border-radius: 14px;
96
+ background:
97
+ radial-gradient(14px 14px at 28% 28%, rgba(255, 255, 255, 0.62), rgba(255, 255, 255, 0) 70%),
98
+ linear-gradient(135deg, #0f5a51, #0d3f3a);
99
+ box-shadow: 0 10px 22px rgba(15, 60, 55, 0.18);
100
+ position: relative;
101
+ }
102
+
103
+ .brandMark::after {
104
+ content: "";
105
+ position: absolute;
106
+ inset: 7px;
107
+ border-radius: 12px;
108
+ border: 1px solid rgba(255, 255, 255, 0.22);
109
+ }
110
+
111
+ .brandText h1 {
112
+ margin: 0;
113
+ font-size: 34px;
114
+ line-height: 1.05;
115
+ font-weight: 650;
116
+ letter-spacing: -0.02em;
117
+ font-family: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;
118
+ }
119
+
120
+ .brandText p {
121
+ margin: 6px 0 0;
122
+ font-size: 13px;
123
+ color: var(--muted);
124
+ }
125
+
126
+ .hint {
127
+ color: rgba(122, 43, 43, 0.72);
128
+ }
129
+
130
+ .topbarActions {
131
+ display: flex;
132
+ align-items: center;
133
+ gap: 10px;
134
+ padding-top: 6px;
135
+ }
136
+
137
+ .button {
138
+ appearance: none;
139
+ border: 1px solid rgba(31, 36, 38, 0.14);
140
+ background: rgba(255, 255, 255, 0.64);
141
+ padding: 9px 12px;
142
+ border-radius: 999px;
143
+ color: var(--ink);
144
+ font-size: 12px;
145
+ line-height: 1;
146
+ cursor: pointer;
147
+ box-shadow: 0 6px 16px rgba(29, 32, 33, 0.06);
148
+ transition: transform 120ms ease, background 120ms ease, border-color 120ms ease;
149
+ }
150
+
151
+ .button:hover {
152
+ transform: translateY(-1px);
153
+ background: rgba(255, 255, 255, 0.78);
154
+ border-color: rgba(31, 36, 38, 0.18);
155
+ }
156
+
157
+ .button:active {
158
+ transform: translateY(0px);
159
+ }
160
+
161
+ .pill {
162
+ display: inline-flex;
163
+ align-items: center;
164
+ gap: 8px;
165
+ padding: 7px 12px;
166
+ border-radius: 999px;
167
+ border: 1px solid rgba(31, 36, 38, 0.12);
168
+ background: var(--paper);
169
+ color: var(--ink);
170
+ font-size: 12px;
171
+ line-height: 1;
172
+ white-space: nowrap;
173
+ }
174
+
175
+ .pillDot {
176
+ width: 8px;
177
+ height: 8px;
178
+ border-radius: 99px;
179
+ background: currentColor;
180
+ opacity: 0.82;
181
+ }
182
+
183
+ .pill-teal {
184
+ background: var(--teal-soft);
185
+ border-color: rgba(15, 90, 81, 0.22);
186
+ color: var(--teal-ink);
187
+ }
188
+
189
+ .pill-sand {
190
+ background: var(--sand-soft);
191
+ border-color: rgba(135, 114, 71, 0.26);
192
+ color: var(--sand);
193
+ }
194
+
195
+ .pill-red {
196
+ background: var(--red-soft);
197
+ border-color: rgba(122, 43, 43, 0.26);
198
+ color: var(--red);
199
+ }
200
+
201
+ .stack {
202
+ display: flex;
203
+ flex-direction: column;
204
+ gap: 18px;
205
+ margin-top: 18px;
206
+ }
207
+
208
+ .grid2 {
209
+ display: grid;
210
+ grid-template-columns: 1fr 1fr;
211
+ gap: 18px;
212
+ }
213
+
214
+ .card {
215
+ border-radius: var(--radius);
216
+ border: 1px solid rgba(31, 36, 38, 0.12);
217
+ background: rgba(255, 255, 255, 0.56);
218
+ box-shadow: var(--shadow);
219
+ padding: 18px;
220
+ backdrop-filter: blur(7px);
221
+ }
222
+
223
+ .cardHeader {
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: space-between;
227
+ gap: 12px;
228
+ margin-bottom: 12px;
229
+ }
230
+
231
+ .cardHeader h2 {
232
+ margin: 0;
233
+ font-size: 16px;
234
+ font-weight: 680;
235
+ font-family: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;
236
+ }
237
+
238
+ .kv {
239
+ display: grid;
240
+ gap: 10px;
241
+ }
242
+
243
+ .kvRow {
244
+ display: grid;
245
+ grid-template-columns: 150px 1fr;
246
+ align-items: baseline;
247
+ gap: 12px;
248
+ }
249
+
250
+ .kvKey {
251
+ font-size: 11px;
252
+ letter-spacing: 0.08em;
253
+ color: rgba(31, 36, 38, 0.58);
254
+ }
255
+
256
+ .kvVal {
257
+ font-size: 14px;
258
+ color: var(--ink);
259
+ }
260
+
261
+ .mono {
262
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
263
+ }
264
+
265
+ .muted {
266
+ color: var(--muted);
267
+ }
268
+
269
+ .divider {
270
+ height: 1px;
271
+ background: var(--line);
272
+ margin: 14px 0;
273
+ }
274
+
275
+ .progressWrap {
276
+ margin-top: 12px;
277
+ }
278
+
279
+ .progressTrack {
280
+ height: 12px;
281
+ border-radius: 999px;
282
+ border: 1px solid rgba(31, 36, 38, 0.12);
283
+ background: rgba(255, 255, 255, 0.42);
284
+ overflow: hidden;
285
+ }
286
+
287
+ .progressFill {
288
+ height: 100%;
289
+ width: 0;
290
+ background: linear-gradient(90deg, #0f5a51, #0d3f3a);
291
+ border-radius: 999px;
292
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.18);
293
+ transition: width 420ms ease;
294
+ }
295
+
296
+ .path {
297
+ margin-top: 10px;
298
+ color: rgba(31, 36, 38, 0.70);
299
+ font-size: 12px;
300
+ }
301
+
302
+ .badge {
303
+ width: 28px;
304
+ height: 28px;
305
+ border-radius: 999px;
306
+ display: grid;
307
+ place-items: center;
308
+ background: rgba(255, 255, 255, 0.66);
309
+ border: 1px solid rgba(31, 36, 38, 0.14);
310
+ font-size: 12px;
311
+ }
312
+
313
+ .tableWrap {
314
+ overflow: auto;
315
+ }
316
+
317
+ .table {
318
+ width: 100%;
319
+ border-collapse: collapse;
320
+ }
321
+
322
+ .table th {
323
+ text-align: left;
324
+ font-size: 11px;
325
+ letter-spacing: 0.08em;
326
+ color: rgba(31, 36, 38, 0.58);
327
+ padding: 12px 10px;
328
+ border-bottom: 1px solid var(--line);
329
+ white-space: nowrap;
330
+ }
331
+
332
+ .table td {
333
+ padding: 14px 10px;
334
+ border-bottom: 1px solid rgba(31, 36, 38, 0.07);
335
+ vertical-align: top;
336
+ font-size: 13px;
337
+ }
338
+
339
+ .taskTitle {
340
+ font-weight: 630;
341
+ }
342
+
343
+ .taskSub {
344
+ margin-top: 4px;
345
+ font-size: 12px;
346
+ color: rgba(31, 36, 38, 0.62);
347
+ }
348
+
349
+ .details {
350
+ border-radius: var(--radius);
351
+ border: 1px solid rgba(31, 36, 38, 0.12);
352
+ background: rgba(255, 255, 255, 0.52);
353
+ box-shadow: 0 18px 40px rgba(29, 32, 33, 0.07);
354
+ overflow: hidden;
355
+ }
356
+
357
+ .detailsSummary {
358
+ list-style: none;
359
+ cursor: pointer;
360
+ padding: 16px 18px;
361
+ display: flex;
362
+ align-items: center;
363
+ justify-content: space-between;
364
+ gap: 10px;
365
+ }
366
+
367
+ .detailsSummary::-webkit-details-marker {
368
+ display: none;
369
+ }
370
+
371
+ .detailsTitle {
372
+ font-size: 16px;
373
+ font-weight: 680;
374
+ font-family: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;
375
+ }
376
+
377
+ .chev {
378
+ width: 10px;
379
+ height: 10px;
380
+ border-right: 2px solid rgba(31, 36, 38, 0.42);
381
+ border-bottom: 2px solid rgba(31, 36, 38, 0.42);
382
+ transform: rotate(45deg);
383
+ transition: transform 150ms ease;
384
+ }
385
+
386
+ .details[open] .chev {
387
+ transform: rotate(-135deg);
388
+ }
389
+
390
+ .detailsBody {
391
+ border-top: 1px solid var(--line);
392
+ padding: 16px 18px 18px;
393
+ }
394
+
395
+ .code {
396
+ margin: 0;
397
+ padding: 14px;
398
+ border-radius: 14px;
399
+ border: 1px solid rgba(31, 36, 38, 0.10);
400
+ background: rgba(255, 255, 255, 0.70);
401
+ overflow: auto;
402
+ font-size: 12px;
403
+ line-height: 1.5;
404
+ }
405
+
406
+ .footer {
407
+ display: flex;
408
+ align-items: center;
409
+ justify-content: space-between;
410
+ gap: 12px;
411
+ margin-top: 18px;
412
+ padding: 10px 2px 0;
413
+ color: rgba(31, 36, 38, 0.60);
414
+ font-size: 12px;
415
+ }
416
+
417
+ @media (max-width: 920px) {
418
+ .grid2 {
419
+ grid-template-columns: 1fr;
420
+ }
421
+
422
+ .kvRow {
423
+ grid-template-columns: 140px 1fr;
424
+ }
425
+
426
+ .table th:nth-child(6),
427
+ .table td:nth-child(6) {
428
+ display: none;
429
+ }
430
+ }
431
+
432
+ @media (max-width: 520px) {
433
+ .container {
434
+ width: min(1120px, calc(100% - 28px));
435
+ padding-top: 22px;
436
+ }
437
+
438
+ .topbar {
439
+ flex-direction: column;
440
+ align-items: stretch;
441
+ }
442
+
443
+ .topbarActions {
444
+ justify-content: flex-start;
445
+ flex-wrap: wrap;
446
+ }
447
+
448
+ .kvRow {
449
+ grid-template-columns: 1fr;
450
+ gap: 6px;
451
+ }
452
+
453
+ .footer {
454
+ flex-direction: column;
455
+ align-items: flex-start;
456
+ }
457
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,15 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
5
+ "module": "ESNext",
6
+ "moduleResolution": "Bundler",
7
+ "jsx": "react-jsx",
8
+ "strict": true,
9
+ "types": ["bun-types"],
10
+ "isolatedModules": true,
11
+ "useDefineForClassFields": true,
12
+ "skipLibCheck": true
13
+ },
14
+ "include": ["src", "vite.config.ts", "vitest.config.ts"]
15
+ }
package/vite.config.ts ADDED
@@ -0,0 +1,14 @@
1
+ import react from "@vitejs/plugin-react";
2
+ import { defineConfig } from "vite";
3
+
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ server: {
7
+ proxy: {
8
+ "/api": {
9
+ target: `http://127.0.0.1:${process.env.OMO_DASHBOARD_API_PORT ?? "51234"}`,
10
+ changeOrigin: true,
11
+ },
12
+ },
13
+ },
14
+ });