signalk-compass-calibrator 0.2.0

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.
@@ -0,0 +1,527 @@
1
+ :root {
2
+ color-scheme: light;
3
+ --bg: #f6f7f4;
4
+ --surface: #ffffff;
5
+ --text: #19211d;
6
+ --muted: #65716b;
7
+ --line: #d8ded8;
8
+ --accent: #11685d;
9
+ --accent-strong: #0b4e47;
10
+ --warn: #9b5c00;
11
+ --bad: #a32222;
12
+ --good: #137547;
13
+ }
14
+
15
+ * {
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ body {
20
+ margin: 0;
21
+ background: var(--bg);
22
+ color: var(--text);
23
+ font: 14px/1.5 system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
24
+ }
25
+
26
+ button,
27
+ input,
28
+ select {
29
+ font: inherit;
30
+ }
31
+
32
+ button {
33
+ border: 0;
34
+ border-radius: 6px;
35
+ background: var(--accent);
36
+ color: #fff;
37
+ padding: 9px 13px;
38
+ cursor: pointer;
39
+ }
40
+
41
+ button:hover {
42
+ background: var(--accent-strong);
43
+ }
44
+
45
+ button.secondary {
46
+ background: #e8eeea;
47
+ color: var(--text);
48
+ }
49
+
50
+ button.secondary:hover {
51
+ background: #d8e2de;
52
+ }
53
+
54
+ button:disabled {
55
+ background: #9facab;
56
+ cursor: not-allowed;
57
+ }
58
+
59
+ button.busy {
60
+ position: relative;
61
+ }
62
+
63
+ button.busy::after {
64
+ content: "";
65
+ display: inline-block;
66
+ width: 0.85em;
67
+ height: 0.85em;
68
+ margin-left: 8px;
69
+ border: 2px solid rgba(255, 255, 255, 0.55);
70
+ border-top-color: #fff;
71
+ border-radius: 50%;
72
+ vertical-align: -0.1em;
73
+ animation: spin 0.8s linear infinite;
74
+ }
75
+
76
+ @keyframes spin {
77
+ to {
78
+ transform: rotate(360deg);
79
+ }
80
+ }
81
+
82
+ .shell {
83
+ width: min(1180px, calc(100vw - 32px));
84
+ margin: 0 auto;
85
+ padding: 24px 0 40px;
86
+ }
87
+
88
+ .topbar {
89
+ display: flex;
90
+ align-items: center;
91
+ justify-content: space-between;
92
+ gap: 16px;
93
+ margin-bottom: 18px;
94
+ }
95
+
96
+ h1,
97
+ h2,
98
+ p {
99
+ margin: 0;
100
+ }
101
+
102
+ h1 {
103
+ font-size: 28px;
104
+ }
105
+
106
+ h2 {
107
+ font-size: 18px;
108
+ margin-bottom: 14px;
109
+ }
110
+
111
+ h3 {
112
+ font-size: 15px;
113
+ margin: 16px 0 8px;
114
+ }
115
+
116
+ code {
117
+ font-family: ui-monospace, "SFMono-Regular", Consolas, monospace;
118
+ font-size: 12px;
119
+ }
120
+
121
+ .topbar p,
122
+ .muted {
123
+ color: var(--muted);
124
+ }
125
+
126
+ .panel {
127
+ background: var(--surface);
128
+ border: 1px solid var(--line);
129
+ border-radius: 8px;
130
+ padding: 18px;
131
+ margin-top: 14px;
132
+ }
133
+
134
+ .tabs {
135
+ display: flex;
136
+ flex-wrap: wrap;
137
+ gap: 8px;
138
+ margin-bottom: 10px;
139
+ }
140
+
141
+ .tabButton {
142
+ background: #e8eeea;
143
+ color: var(--text);
144
+ }
145
+
146
+ .tabButton.active {
147
+ background: var(--accent);
148
+ color: #fff;
149
+ }
150
+
151
+ .tabPanel {
152
+ display: none;
153
+ }
154
+
155
+ .tabPanel.active {
156
+ display: block;
157
+ }
158
+
159
+ .message {
160
+ border: 1px solid var(--line);
161
+ border-radius: 6px;
162
+ padding: 10px 12px;
163
+ margin: 0 0 14px;
164
+ background: #fbfcfb;
165
+ }
166
+
167
+ .message.error {
168
+ border-color: #e2b5b5;
169
+ background: #fff3f3;
170
+ color: var(--bad);
171
+ font-weight: 700;
172
+ }
173
+
174
+ .message.ok {
175
+ border-color: #add4bf;
176
+ background: #f0faf4;
177
+ color: var(--good);
178
+ font-weight: 700;
179
+ }
180
+
181
+ .message.warning {
182
+ border-color: #e0c38e;
183
+ background: #fff8ea;
184
+ color: var(--warn);
185
+ font-weight: 700;
186
+ }
187
+
188
+ .grid {
189
+ display: grid;
190
+ grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
191
+ gap: 12px;
192
+ }
193
+
194
+ label {
195
+ display: grid;
196
+ gap: 5px;
197
+ color: var(--muted);
198
+ font-size: 12px;
199
+ font-weight: 650;
200
+ }
201
+
202
+ input,
203
+ select {
204
+ width: 100%;
205
+ border: 1px solid var(--line);
206
+ border-radius: 6px;
207
+ color: var(--text);
208
+ background: #fff;
209
+ padding: 8px 10px;
210
+ }
211
+
212
+ .actions {
213
+ display: flex;
214
+ align-items: center;
215
+ gap: 10px;
216
+ flex-wrap: wrap;
217
+ margin-top: 14px;
218
+ }
219
+
220
+ .inlineStatus {
221
+ color: var(--muted);
222
+ font-size: 13px;
223
+ font-weight: 650;
224
+ }
225
+
226
+ .advanced {
227
+ margin-top: 14px;
228
+ }
229
+
230
+ .advanced summary {
231
+ color: var(--accent);
232
+ cursor: pointer;
233
+ font-weight: 750;
234
+ margin-bottom: 10px;
235
+ }
236
+
237
+ .summary {
238
+ border: 1px solid var(--line);
239
+ border-radius: 6px;
240
+ padding: 12px;
241
+ background: #fbfcfb;
242
+ }
243
+
244
+ .summaryGrid {
245
+ display: grid;
246
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
247
+ gap: 10px;
248
+ }
249
+
250
+ .metric {
251
+ display: grid;
252
+ gap: 2px;
253
+ }
254
+
255
+ .metric span {
256
+ color: var(--muted);
257
+ font-size: 12px;
258
+ }
259
+
260
+ .metric strong {
261
+ font-size: 18px;
262
+ }
263
+
264
+ .runtimeGrid {
265
+ display: grid;
266
+ grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
267
+ gap: 10px;
268
+ }
269
+
270
+ .runtimeMetric {
271
+ border-left: 3px solid var(--line);
272
+ display: grid;
273
+ gap: 3px;
274
+ min-width: 0;
275
+ padding-left: 10px;
276
+ }
277
+
278
+ .runtimeMetric span {
279
+ color: var(--muted);
280
+ font-size: 12px;
281
+ }
282
+
283
+ .runtimeMetric strong {
284
+ font-size: 16px;
285
+ line-height: 1.25;
286
+ overflow-wrap: anywhere;
287
+ word-break: break-word;
288
+ }
289
+
290
+ .tableWrap {
291
+ overflow: auto;
292
+ margin-top: 14px;
293
+ }
294
+
295
+ .timelineLegend {
296
+ display: flex;
297
+ flex-wrap: wrap;
298
+ gap: 14px;
299
+ color: var(--muted);
300
+ font-size: 12px;
301
+ margin: 4px 0 8px;
302
+ }
303
+
304
+ .timelineLegend span {
305
+ align-items: center;
306
+ display: inline-flex;
307
+ gap: 6px;
308
+ }
309
+
310
+ .timelineLegend i {
311
+ border-radius: 999px;
312
+ display: inline-block;
313
+ height: 8px;
314
+ width: 22px;
315
+ }
316
+
317
+ .legendNavigation {
318
+ background: #5077a7;
319
+ }
320
+
321
+ .legendStable {
322
+ background: var(--good);
323
+ }
324
+
325
+ .legendRejected {
326
+ background: var(--bad);
327
+ }
328
+
329
+ .timelineScale {
330
+ display: flex;
331
+ justify-content: space-between;
332
+ color: var(--muted);
333
+ font-size: 11px;
334
+ margin-top: 8px;
335
+ }
336
+
337
+ .timelineTrack {
338
+ position: relative;
339
+ height: 34px;
340
+ margin-top: 5px;
341
+ border: 1px solid var(--line);
342
+ border-radius: 6px;
343
+ background: #f1f3ef;
344
+ overflow: hidden;
345
+ }
346
+
347
+ .coveragePanel {
348
+ display: grid;
349
+ grid-template-columns: minmax(220px, 280px) minmax(220px, 1fr);
350
+ gap: 16px;
351
+ align-items: center;
352
+ margin: 6px 0 14px;
353
+ }
354
+
355
+ .coveragePanel h4 {
356
+ margin: 0 0 6px;
357
+ }
358
+
359
+ .coverageNotes {
360
+ color: var(--muted);
361
+ display: grid;
362
+ gap: 5px;
363
+ }
364
+
365
+ .coverageRose {
366
+ width: 260px;
367
+ max-width: 100%;
368
+ height: 260px;
369
+ border: 1px solid var(--line);
370
+ border-radius: 6px;
371
+ background: #fff;
372
+ }
373
+
374
+ .coverageRose.small {
375
+ width: 180px;
376
+ height: 180px;
377
+ margin-top: 10px;
378
+ }
379
+
380
+ .timelineBlock {
381
+ position: absolute;
382
+ border-radius: 5px;
383
+ }
384
+
385
+ .timelineBlock.navigation {
386
+ top: 8px;
387
+ height: 18px;
388
+ background: #5077a7;
389
+ }
390
+
391
+ .timelineBlock.stable {
392
+ top: 12px;
393
+ height: 10px;
394
+ background: var(--good);
395
+ z-index: 2;
396
+ }
397
+
398
+ .timelineBlock.rejected {
399
+ top: 8px;
400
+ height: 18px;
401
+ background: var(--bad);
402
+ }
403
+
404
+ .periodZooms {
405
+ display: grid;
406
+ gap: 10px;
407
+ margin-top: 12px;
408
+ }
409
+
410
+ .periodZoom {
411
+ border-top: 1px solid var(--line);
412
+ padding-top: 10px;
413
+ }
414
+
415
+ .periodZoom summary {
416
+ cursor: pointer;
417
+ font-weight: 750;
418
+ }
419
+
420
+ .periodZoom summary small {
421
+ color: var(--muted);
422
+ display: block;
423
+ font-weight: 500;
424
+ }
425
+
426
+ .zoomSummary {
427
+ display: grid;
428
+ grid-template-columns: repeat(auto-fit, minmax(135px, 1fr));
429
+ gap: 8px;
430
+ margin-top: 10px;
431
+ }
432
+
433
+ table {
434
+ width: 100%;
435
+ border-collapse: collapse;
436
+ min-width: 720px;
437
+ }
438
+
439
+ th,
440
+ td {
441
+ border-bottom: 1px solid var(--line);
442
+ padding: 8px 10px;
443
+ text-align: left;
444
+ white-space: nowrap;
445
+ }
446
+
447
+ th {
448
+ color: var(--muted);
449
+ font-size: 12px;
450
+ font-weight: 750;
451
+ }
452
+
453
+ .quality-good {
454
+ color: var(--good);
455
+ font-weight: 750;
456
+ }
457
+
458
+ .quality-weak,
459
+ .warning {
460
+ color: var(--warn);
461
+ font-weight: 750;
462
+ }
463
+
464
+ .quality-missing,
465
+ .quality-rejected,
466
+ .error {
467
+ color: var(--bad);
468
+ font-weight: 750;
469
+ }
470
+
471
+ canvas {
472
+ width: 100%;
473
+ height: 340px;
474
+ border: 1px solid var(--line);
475
+ border-radius: 6px;
476
+ margin-top: 14px;
477
+ background: #fff;
478
+ }
479
+
480
+ .contextSummary {
481
+ align-items: center;
482
+ border: 1px solid var(--line);
483
+ border-radius: 6px;
484
+ display: flex;
485
+ gap: 8px;
486
+ padding: 10px 12px;
487
+ }
488
+
489
+ .contextSummary.ok {
490
+ border-color: #add4bf;
491
+ background: #f0faf4;
492
+ }
493
+
494
+ .contextSummary.warning {
495
+ border-color: #e0c38e;
496
+ background: #fff8ea;
497
+ }
498
+
499
+ .contextSummary.error {
500
+ border-color: #e2b5b5;
501
+ background: #fff3f3;
502
+ }
503
+
504
+ .contextIcon {
505
+ font-size: 17px;
506
+ line-height: 1;
507
+ }
508
+
509
+ .compactDetails {
510
+ margin-top: 10px;
511
+ }
512
+
513
+ @media (max-width: 680px) {
514
+ .shell {
515
+ width: min(100vw - 20px, 1180px);
516
+ padding-top: 12px;
517
+ }
518
+
519
+ .topbar {
520
+ align-items: flex-start;
521
+ flex-direction: column;
522
+ }
523
+
524
+ .coveragePanel {
525
+ grid-template-columns: 1fr;
526
+ }
527
+ }