@robotical/raftjs 2.1.0 → 2.1.3

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.
Files changed (172) hide show
  1. package/devdocs/devbin-backwards-compatibility.md +105 -0
  2. package/devdocs/pseudocode-to-js-transpiler.md +563 -0
  3. package/dist/react-native/PseudocodeTranspiler.d.ts +6 -0
  4. package/dist/react-native/PseudocodeTranspiler.js +115 -0
  5. package/dist/react-native/PseudocodeTranspiler.js.map +1 -0
  6. package/dist/react-native/RaftAttributeHandler.d.ts +1 -1
  7. package/dist/react-native/RaftAttributeHandler.js +108 -32
  8. package/dist/react-native/RaftAttributeHandler.js.map +1 -1
  9. package/dist/react-native/RaftChannelBLE.web.d.ts +4 -0
  10. package/dist/react-native/RaftChannelBLE.web.js +59 -21
  11. package/dist/react-native/RaftChannelBLE.web.js.map +1 -1
  12. package/dist/react-native/RaftChannelSimulated.d.ts +1 -0
  13. package/dist/react-native/RaftChannelSimulated.js +9 -5
  14. package/dist/react-native/RaftChannelSimulated.js.map +1 -1
  15. package/dist/react-native/RaftChannelWebSocket.js +16 -1
  16. package/dist/react-native/RaftChannelWebSocket.js.map +1 -1
  17. package/dist/react-native/RaftConnector.d.ts +29 -1
  18. package/dist/react-native/RaftConnector.js +177 -11
  19. package/dist/react-native/RaftConnector.js.map +1 -1
  20. package/dist/react-native/RaftCustomAttrHandler.d.ts +2 -2
  21. package/dist/react-native/RaftCustomAttrHandler.js +32 -44
  22. package/dist/react-native/RaftCustomAttrHandler.js.map +1 -1
  23. package/dist/react-native/RaftDeviceInfo.d.ts +18 -0
  24. package/dist/react-native/RaftDeviceInfo.js +8 -0
  25. package/dist/react-native/RaftDeviceInfo.js.map +1 -1
  26. package/dist/react-native/RaftDeviceManager.d.ts +30 -3
  27. package/dist/react-native/RaftDeviceManager.js +618 -107
  28. package/dist/react-native/RaftDeviceManager.js.map +1 -1
  29. package/dist/react-native/RaftDeviceMgrIF.d.ts +11 -2
  30. package/dist/react-native/RaftDeviceStates.d.ts +27 -3
  31. package/dist/react-native/RaftDeviceStates.js +31 -6
  32. package/dist/react-native/RaftDeviceStates.js.map +1 -1
  33. package/dist/react-native/RaftFileHandler.d.ts +1 -1
  34. package/dist/react-native/RaftFileHandler.js +101 -34
  35. package/dist/react-native/RaftFileHandler.js.map +1 -1
  36. package/dist/react-native/RaftMicroPythonConsoleClient.d.ts +38 -0
  37. package/dist/react-native/RaftMicroPythonConsoleClient.js +45 -0
  38. package/dist/react-native/RaftMicroPythonConsoleClient.js.map +1 -0
  39. package/dist/react-native/RaftMsgHandler.d.ts +1 -1
  40. package/dist/react-native/RaftMsgHandler.js +6 -3
  41. package/dist/react-native/RaftMsgHandler.js.map +1 -1
  42. package/dist/react-native/RaftPublish.d.ts +2 -0
  43. package/dist/react-native/RaftPublish.js +81 -0
  44. package/dist/react-native/RaftPublish.js.map +1 -0
  45. package/dist/react-native/RaftStreamHandler.d.ts +11 -0
  46. package/dist/react-native/RaftStreamHandler.js +66 -0
  47. package/dist/react-native/RaftStreamHandler.js.map +1 -1
  48. package/dist/react-native/RaftStruct.d.ts +2 -2
  49. package/dist/react-native/RaftStruct.js +97 -26
  50. package/dist/react-native/RaftStruct.js.map +1 -1
  51. package/dist/react-native/RaftSystemType.d.ts +1 -0
  52. package/dist/react-native/RaftSystemUtils.d.ts +17 -1
  53. package/dist/react-native/RaftSystemUtils.js +51 -0
  54. package/dist/react-native/RaftSystemUtils.js.map +1 -1
  55. package/dist/react-native/RaftTimezone.d.ts +16 -0
  56. package/dist/react-native/RaftTimezone.js +153 -0
  57. package/dist/react-native/RaftTimezone.js.map +1 -0
  58. package/dist/react-native/RaftTypes.d.ts +46 -1
  59. package/dist/react-native/RaftTypes.js.map +1 -1
  60. package/dist/react-native/RaftUpdateManager.js +1 -1
  61. package/dist/react-native/RaftUpdateManager.js.map +1 -1
  62. package/dist/react-native/main.d.ts +3 -0
  63. package/dist/react-native/main.js +8 -1
  64. package/dist/react-native/main.js.map +1 -1
  65. package/dist/web/PseudocodeTranspiler.d.ts +6 -0
  66. package/dist/web/PseudocodeTranspiler.js +115 -0
  67. package/dist/web/PseudocodeTranspiler.js.map +1 -0
  68. package/dist/web/RaftAttributeHandler.d.ts +1 -1
  69. package/dist/web/RaftAttributeHandler.js +108 -32
  70. package/dist/web/RaftAttributeHandler.js.map +1 -1
  71. package/dist/web/RaftChannelBLE.web.d.ts +4 -0
  72. package/dist/web/RaftChannelBLE.web.js +59 -21
  73. package/dist/web/RaftChannelBLE.web.js.map +1 -1
  74. package/dist/web/RaftChannelSimulated.d.ts +1 -0
  75. package/dist/web/RaftChannelSimulated.js +9 -5
  76. package/dist/web/RaftChannelSimulated.js.map +1 -1
  77. package/dist/web/RaftChannelWebSocket.js +16 -1
  78. package/dist/web/RaftChannelWebSocket.js.map +1 -1
  79. package/dist/web/RaftConnector.d.ts +29 -1
  80. package/dist/web/RaftConnector.js +177 -11
  81. package/dist/web/RaftConnector.js.map +1 -1
  82. package/dist/web/RaftCustomAttrHandler.d.ts +2 -2
  83. package/dist/web/RaftCustomAttrHandler.js +32 -44
  84. package/dist/web/RaftCustomAttrHandler.js.map +1 -1
  85. package/dist/web/RaftDeviceInfo.d.ts +18 -0
  86. package/dist/web/RaftDeviceInfo.js +8 -0
  87. package/dist/web/RaftDeviceInfo.js.map +1 -1
  88. package/dist/web/RaftDeviceManager.d.ts +30 -3
  89. package/dist/web/RaftDeviceManager.js +618 -107
  90. package/dist/web/RaftDeviceManager.js.map +1 -1
  91. package/dist/web/RaftDeviceMgrIF.d.ts +11 -2
  92. package/dist/web/RaftDeviceStates.d.ts +27 -3
  93. package/dist/web/RaftDeviceStates.js +31 -6
  94. package/dist/web/RaftDeviceStates.js.map +1 -1
  95. package/dist/web/RaftFileHandler.d.ts +1 -1
  96. package/dist/web/RaftFileHandler.js +101 -34
  97. package/dist/web/RaftFileHandler.js.map +1 -1
  98. package/dist/web/RaftMicroPythonConsoleClient.d.ts +38 -0
  99. package/dist/web/RaftMicroPythonConsoleClient.js +45 -0
  100. package/dist/web/RaftMicroPythonConsoleClient.js.map +1 -0
  101. package/dist/web/RaftMsgHandler.d.ts +1 -1
  102. package/dist/web/RaftMsgHandler.js +6 -3
  103. package/dist/web/RaftMsgHandler.js.map +1 -1
  104. package/dist/web/RaftPublish.d.ts +2 -0
  105. package/dist/web/RaftPublish.js +81 -0
  106. package/dist/web/RaftPublish.js.map +1 -0
  107. package/dist/web/RaftStreamHandler.d.ts +11 -0
  108. package/dist/web/RaftStreamHandler.js +66 -0
  109. package/dist/web/RaftStreamHandler.js.map +1 -1
  110. package/dist/web/RaftStruct.d.ts +2 -2
  111. package/dist/web/RaftStruct.js +97 -26
  112. package/dist/web/RaftStruct.js.map +1 -1
  113. package/dist/web/RaftSystemType.d.ts +1 -0
  114. package/dist/web/RaftSystemUtils.d.ts +17 -1
  115. package/dist/web/RaftSystemUtils.js +51 -0
  116. package/dist/web/RaftSystemUtils.js.map +1 -1
  117. package/dist/web/RaftTimezone.d.ts +16 -0
  118. package/dist/web/RaftTimezone.js +153 -0
  119. package/dist/web/RaftTimezone.js.map +1 -0
  120. package/dist/web/RaftTypes.d.ts +46 -1
  121. package/dist/web/RaftTypes.js.map +1 -1
  122. package/dist/web/RaftUpdateManager.js +1 -1
  123. package/dist/web/RaftUpdateManager.js.map +1 -1
  124. package/dist/web/main.d.ts +3 -0
  125. package/dist/web/main.js +8 -1
  126. package/dist/web/main.js.map +1 -1
  127. package/examples/dashboard/package.json +2 -2
  128. package/examples/dashboard/src/DeviceActionsForm.tsx +177 -17
  129. package/examples/dashboard/src/DeviceLineChart.tsx +16 -3
  130. package/examples/dashboard/src/DevicePanel.tsx +92 -11
  131. package/examples/dashboard/src/DeviceSelectDialog.tsx +224 -0
  132. package/examples/dashboard/src/DeviceStatsPanel.tsx +76 -0
  133. package/examples/dashboard/src/DevicesPanel.tsx +11 -0
  134. package/examples/dashboard/src/LogConfigPanel.tsx +357 -0
  135. package/examples/dashboard/src/LogFilesPanel.tsx +200 -0
  136. package/examples/dashboard/src/LoggingPanel.tsx +264 -0
  137. package/examples/dashboard/src/Main.tsx +12 -2
  138. package/examples/dashboard/src/SettingsScreen.tsx +9 -4
  139. package/examples/dashboard/src/SystemTypeCog/CogStateInfo.ts +10 -3
  140. package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +37 -3
  141. package/examples/dashboard/src/SystemTypeGeneric/StateInfoGeneric.ts +10 -2
  142. package/examples/dashboard/src/SystemTypeGeneric/SystemTypeGeneric.ts +41 -7
  143. package/examples/dashboard/src/SystemTypeMarty/RICStateInfo.ts +34 -3
  144. package/examples/dashboard/src/styles.css +766 -1
  145. package/notes/web-ble-reconnect-retry.md +69 -0
  146. package/package.json +10 -7
  147. package/src/PseudocodeTranspiler.test.ts +372 -0
  148. package/src/PseudocodeTranspiler.ts +127 -0
  149. package/src/RaftAttributeHandler.ts +152 -76
  150. package/src/RaftChannelBLE.web.ts +62 -20
  151. package/src/RaftChannelSimulated.ts +10 -5
  152. package/src/RaftChannelWebSocket.ts +16 -2
  153. package/src/RaftConnector.ts +204 -17
  154. package/src/RaftCustomAttrHandler.ts +35 -45
  155. package/src/RaftDeviceInfo.ts +27 -0
  156. package/src/RaftDeviceManager.test.ts +164 -0
  157. package/src/RaftDeviceManager.ts +705 -127
  158. package/src/RaftDeviceMgrIF.ts +13 -2
  159. package/src/RaftDeviceStates.ts +49 -8
  160. package/src/RaftFileHandler.ts +112 -39
  161. package/src/RaftMicroPythonConsoleClient.ts +78 -0
  162. package/src/RaftMsgHandler.ts +8 -4
  163. package/src/RaftPublish.ts +92 -0
  164. package/src/RaftStreamHandler.ts +84 -1
  165. package/src/RaftStruct.test.ts +229 -0
  166. package/src/RaftStruct.ts +101 -37
  167. package/src/RaftSystemType.ts +1 -0
  168. package/src/RaftSystemUtils.ts +59 -0
  169. package/src/RaftTimezone.ts +151 -0
  170. package/src/RaftTypes.ts +57 -1
  171. package/src/RaftUpdateManager.ts +1 -1
  172. package/src/main.ts +3 -0
@@ -94,10 +94,19 @@ h1 {
94
94
  gap: 10px;
95
95
  }
96
96
 
97
+ .connection-info {
98
+ flex: 0 0 auto;
99
+ max-width: 140px;
100
+ }
101
+
102
+ .connection-info .info-box {
103
+ padding: 8px 12px;
104
+ }
105
+
97
106
  .connected-panel {
98
107
  display: flex;
99
108
  justify-content: flex-start;
100
- gap: 20px;
109
+ gap: 10px;
101
110
  align-items: stretch;
102
111
  flex-direction: row;
103
112
  width: 100%;
@@ -335,6 +344,15 @@ h1 {
335
344
  /* Slightly lighter dark background for distinction */
336
345
  }
337
346
 
347
+ .action-status {
348
+ margin-top: 6px;
349
+ padding: 4px 8px;
350
+ font-size: 0.85em;
351
+ color: #aef;
352
+ background: #335;
353
+ border-radius: 3px;
354
+ }
355
+
338
356
  .device-line-chart {
339
357
  flex: 1 1 auto;
340
358
  min-width: 50%;
@@ -381,6 +399,168 @@ h1 {
381
399
  background-color: #555;
382
400
  }
383
401
 
402
+ .menu-item-toggle {
403
+ padding: 6px 10px;
404
+ }
405
+
406
+ .menu-toggle {
407
+ display: flex;
408
+ align-items: center;
409
+ gap: 8px;
410
+ cursor: pointer;
411
+ }
412
+
413
+ .menu-toggle input {
414
+ margin: 0;
415
+ }
416
+
417
+ .device-stats-panel {
418
+ flex: 0 0 220px;
419
+ min-width: 220px;
420
+ padding: 10px;
421
+ border: 1px solid #666;
422
+ border-radius: 4px;
423
+ background: #444;
424
+ display: flex;
425
+ flex-direction: column;
426
+ gap: 10px;
427
+ }
428
+
429
+ .device-stats-header {
430
+ display: flex;
431
+ justify-content: space-between;
432
+ align-items: center;
433
+ font-weight: bold;
434
+ }
435
+
436
+ .device-stats-reset {
437
+ background: #555;
438
+ color: #fff;
439
+ border: none;
440
+ border-radius: 4px;
441
+ padding: 4px 8px;
442
+ cursor: pointer;
443
+ font-size: 0.8em;
444
+ }
445
+
446
+ .device-stats-reset:hover {
447
+ background: #666;
448
+ }
449
+
450
+ .device-stats-grid {
451
+ display: grid;
452
+ grid-template-columns: 1fr;
453
+ gap: 8px;
454
+ }
455
+
456
+ .device-stats-item {
457
+ display: flex;
458
+ justify-content: space-between;
459
+ gap: 10px;
460
+ }
461
+
462
+ .device-stats-label {
463
+ color: #bbb;
464
+ font-size: 0.85em;
465
+ }
466
+
467
+ .device-stats-value {
468
+ font-weight: 600;
469
+ font-size: 0.9em;
470
+ }
471
+
472
+ .poll-rate-dialog-overlay {
473
+ position: fixed;
474
+ inset: 0;
475
+ background: rgba(0, 0, 0, 0.5);
476
+ z-index: 100;
477
+ display: flex;
478
+ align-items: center;
479
+ justify-content: center;
480
+ }
481
+
482
+ .poll-rate-dialog {
483
+ background: #333;
484
+ border: 1px solid #666;
485
+ border-radius: 6px;
486
+ padding: 18px 22px;
487
+ min-width: 240px;
488
+ display: flex;
489
+ flex-direction: column;
490
+ gap: 10px;
491
+ color: #fff;
492
+ }
493
+
494
+ .poll-rate-dialog-title {
495
+ font-size: 1em;
496
+ font-weight: bold;
497
+ margin-bottom: 4px;
498
+ }
499
+
500
+ .poll-rate-dialog-row {
501
+ display: flex;
502
+ align-items: center;
503
+ gap: 8px;
504
+ }
505
+
506
+ .poll-rate-input {
507
+ flex: 1;
508
+ background: #222;
509
+ border: 1px solid #666;
510
+ border-radius: 4px;
511
+ color: #fff;
512
+ padding: 6px 8px;
513
+ font-size: 1em;
514
+ width: 100%;
515
+ }
516
+
517
+ .poll-rate-unit {
518
+ color: #aaa;
519
+ font-size: 0.9em;
520
+ }
521
+
522
+ .poll-rate-preview {
523
+ font-size: 0.8em;
524
+ color: #aaa;
525
+ }
526
+
527
+ .poll-rate-status {
528
+ font-size: 0.85em;
529
+ color: #f90;
530
+ }
531
+
532
+ .poll-rate-dialog-buttons {
533
+ display: flex;
534
+ gap: 8px;
535
+ justify-content: flex-end;
536
+ }
537
+
538
+ .poll-rate-btn {
539
+ padding: 6px 14px;
540
+ border: none;
541
+ border-radius: 4px;
542
+ cursor: pointer;
543
+ font-size: 0.9em;
544
+ }
545
+
546
+ .poll-rate-btn-set {
547
+ background: #4a7;
548
+ color: #fff;
549
+ }
550
+
551
+ .poll-rate-btn-set:hover {
552
+ background: #5b8;
553
+ }
554
+
555
+ .poll-rate-btn-cancel {
556
+ background: #555;
557
+ color: #fff;
558
+ }
559
+
560
+ .poll-rate-btn-cancel:hover {
561
+ background: #666;
562
+ }
563
+
384
564
  /* Adjust height for portrait orientation */
385
565
  @media (orientation: portrait) {
386
566
  .device-line-chart {
@@ -405,4 +585,589 @@ h1 {
405
585
  height: 20vh;
406
586
  /* Slightly reduce the height for very wide screens */
407
587
  }
588
+ }
589
+
590
+ /* Logging Panel */
591
+ .logging-panel {
592
+ min-width: 220px;
593
+ }
594
+
595
+ .logging-status-active {
596
+ display: flex;
597
+ align-items: center;
598
+ gap: 8px;
599
+ margin-bottom: 10px;
600
+ font-weight: bold;
601
+ color: #4f4;
602
+ }
603
+
604
+ .logging-indicator {
605
+ width: 12px;
606
+ height: 12px;
607
+ border-radius: 50%;
608
+ background-color: #4f4;
609
+ animation: logging-pulse 1.5s ease-in-out infinite;
610
+ }
611
+
612
+ @keyframes logging-pulse {
613
+ 0%, 100% { opacity: 1; }
614
+ 50% { opacity: 0.3; }
615
+ }
616
+
617
+ .logging-start-controls {
618
+ display: flex;
619
+ flex-direction: column;
620
+ gap: 10px;
621
+ width: 100%;
622
+ }
623
+
624
+ .logging-label-input {
625
+ padding: 8px 10px;
626
+ border: 1px solid #666;
627
+ border-radius: 4px;
628
+ background: #222;
629
+ color: #fff;
630
+ width: 100%;
631
+ box-sizing: border-box;
632
+ }
633
+
634
+ .logging-button-row {
635
+ display: flex;
636
+ gap: 8px;
637
+ }
638
+
639
+ .logging-simulate-button {
640
+ background-color: #555;
641
+ }
642
+
643
+ .logging-simulate-button:hover {
644
+ background-color: #666;
645
+ }
646
+
647
+ .logging-stop-button {
648
+ background-color: #c33;
649
+ margin-top: 10px;
650
+ }
651
+
652
+ .logging-stop-button:hover {
653
+ background-color: #e44;
654
+ }
655
+
656
+ .logging-error {
657
+ margin-top: 8px;
658
+ padding: 6px 10px;
659
+ background: #533;
660
+ border-radius: 4px;
661
+ color: #faa;
662
+ font-size: 0.85em;
663
+ }
664
+
665
+ /* Log Config Panel */
666
+ .log-config-panel {
667
+ min-width: 280px;
668
+ max-width: 400px;
669
+ align-items: stretch;
670
+ }
671
+
672
+ .log-config-empty {
673
+ color: #888;
674
+ font-style: italic;
675
+ margin: 10px 0;
676
+ }
677
+
678
+ .log-config-select-buttons {
679
+ display: flex;
680
+ gap: 6px;
681
+ margin-bottom: 10px;
682
+ }
683
+
684
+ .log-config-select-btn {
685
+ padding: 3px 12px;
686
+ border: 1px solid #666;
687
+ border-radius: 3px;
688
+ background: #333;
689
+ color: #ccc;
690
+ cursor: pointer;
691
+ font-size: 0.8em;
692
+ }
693
+
694
+ .log-config-select-btn:hover {
695
+ background: #444;
696
+ }
697
+
698
+ .log-config-device-list {
699
+ display: flex;
700
+ flex-direction: column;
701
+ gap: 8px;
702
+ width: 100%;
703
+ }
704
+
705
+ .log-config-device {
706
+ border: 1px solid #555;
707
+ border-radius: 6px;
708
+ padding: 8px 10px;
709
+ background: #1e1e1e;
710
+ }
711
+
712
+ .log-config-device-disabled {
713
+ opacity: 0.5;
714
+ }
715
+
716
+ .log-config-device-header {
717
+ display: flex;
718
+ justify-content: space-between;
719
+ align-items: center;
720
+ gap: 8px;
721
+ }
722
+
723
+ .log-config-checkbox-label {
724
+ display: flex;
725
+ align-items: center;
726
+ gap: 6px;
727
+ cursor: pointer;
728
+ }
729
+
730
+ .log-config-checkbox-label input[type="checkbox"] {
731
+ width: 16px;
732
+ height: 16px;
733
+ cursor: pointer;
734
+ accent-color: #4a9eff;
735
+ }
736
+
737
+ .log-config-device-name {
738
+ font-weight: 500;
739
+ font-size: 0.9em;
740
+ }
741
+
742
+ .log-config-device-addr {
743
+ font-size: 0.75em;
744
+ color: #888;
745
+ white-space: nowrap;
746
+ }
747
+
748
+ .log-config-rate-control {
749
+ margin-top: 8px;
750
+ padding-top: 6px;
751
+ border-top: 1px solid #333;
752
+ }
753
+
754
+ .log-config-rate-row {
755
+ display: flex;
756
+ align-items: center;
757
+ gap: 8px;
758
+ margin-bottom: 4px;
759
+ }
760
+
761
+ .log-config-rate-label {
762
+ font-size: 0.8em;
763
+ color: #aaa;
764
+ white-space: nowrap;
765
+ }
766
+
767
+ .log-config-rate-preset {
768
+ padding: 3px 6px;
769
+ border: 1px solid #555;
770
+ border-radius: 3px;
771
+ background: #222;
772
+ color: #ddd;
773
+ font-size: 0.8em;
774
+ cursor: pointer;
775
+ flex: 1;
776
+ }
777
+
778
+ .log-config-slider-row {
779
+ display: flex;
780
+ align-items: center;
781
+ gap: 6px;
782
+ margin: 4px 0;
783
+ }
784
+
785
+ .log-config-slider-label {
786
+ font-size: 0.7em;
787
+ color: #777;
788
+ white-space: nowrap;
789
+ }
790
+
791
+ .log-config-slider {
792
+ flex: 1;
793
+ height: 4px;
794
+ -webkit-appearance: none;
795
+ appearance: none;
796
+ background: #444;
797
+ border-radius: 2px;
798
+ outline: none;
799
+ cursor: pointer;
800
+ }
801
+
802
+ .log-config-slider::-webkit-slider-thumb {
803
+ -webkit-appearance: none;
804
+ appearance: none;
805
+ width: 14px;
806
+ height: 14px;
807
+ border-radius: 50%;
808
+ background: #4a9eff;
809
+ cursor: pointer;
810
+ }
811
+
812
+ .log-config-slider::-moz-range-thumb {
813
+ width: 14px;
814
+ height: 14px;
815
+ border-radius: 50%;
816
+ background: #4a9eff;
817
+ cursor: pointer;
818
+ border: none;
819
+ }
820
+
821
+ .log-config-rate-display {
822
+ font-size: 0.8em;
823
+ color: #8cf;
824
+ text-align: center;
825
+ margin-top: 2px;
826
+ }
827
+
828
+ .log-config-poll-rate {
829
+ color: #888;
830
+ }
831
+
832
+ /* Format Selection and Attribute Controls */
833
+ .log-config-format-row {
834
+ display: flex;
835
+ align-items: center;
836
+ gap: 8px;
837
+ margin-bottom: 8px;
838
+ padding-bottom: 8px;
839
+ border-bottom: 1px solid #333;
840
+ }
841
+
842
+ .log-config-csv-header-label {
843
+ font-size: 0.85em;
844
+ color: #ccc;
845
+ display: flex;
846
+ align-items: center;
847
+ gap: 4px;
848
+ margin-left: auto;
849
+ cursor: pointer;
850
+ }
851
+
852
+ .log-config-csv-header-label input[type="checkbox"] {
853
+ margin: 0;
854
+ }
855
+
856
+ .log-config-mode-select {
857
+ background: #1a1a2e;
858
+ color: #e0e0e0;
859
+ border: 1px solid #444;
860
+ border-radius: 3px;
861
+ padding: 2px 6px;
862
+ font-size: 0.85em;
863
+ }
864
+
865
+ .log-config-attrs {
866
+ margin-top: 4px;
867
+ }
868
+
869
+ .log-config-attrs-label {
870
+ font-size: 0.8em;
871
+ color: #8cf;
872
+ margin-bottom: 2px;
873
+ }
874
+
875
+ .log-config-attrs-list {
876
+ display: flex;
877
+ flex-wrap: wrap;
878
+ gap: 2px 10px;
879
+ }
880
+
881
+ .log-config-attr-checkbox {
882
+ font-size: 0.8em;
883
+ color: #ccc;
884
+ display: flex;
885
+ align-items: center;
886
+ gap: 3px;
887
+ cursor: pointer;
888
+ }
889
+
890
+ .log-config-attr-checkbox input[type="checkbox"] {
891
+ margin: 0;
892
+ }
893
+
894
+ /* Duration Controls and Estimates */
895
+ .log-config-duration-row {
896
+ display: flex;
897
+ align-items: center;
898
+ gap: 8px;
899
+ margin-bottom: 4px;
900
+ }
901
+
902
+ .log-config-duration-slider-row {
903
+ display: flex;
904
+ align-items: center;
905
+ gap: 6px;
906
+ margin-bottom: 2px;
907
+ }
908
+
909
+ .log-config-duration-display {
910
+ font-size: 0.85em;
911
+ color: #8cf;
912
+ margin-bottom: 6px;
913
+ text-align: center;
914
+ }
915
+
916
+ .log-config-estimates {
917
+ font-size: 0.8em;
918
+ color: #aaa;
919
+ display: flex;
920
+ align-items: center;
921
+ gap: 6px;
922
+ margin-bottom: 8px;
923
+ padding-bottom: 8px;
924
+ border-bottom: 1px solid #333;
925
+ }
926
+
927
+ .log-config-max-duration {
928
+ color: #888;
929
+ }
930
+
931
+ /* Device Summary & Edit Button */
932
+ .log-config-devices-summary {
933
+ border-top: 1px solid #333;
934
+ padding-top: 8px;
935
+ }
936
+
937
+ .log-config-summary-header {
938
+ display: flex;
939
+ align-items: center;
940
+ justify-content: space-between;
941
+ margin-bottom: 4px;
942
+ }
943
+
944
+ .log-config-edit-btn {
945
+ padding: 3px 12px;
946
+ border: 1px solid #666;
947
+ border-radius: 3px;
948
+ background: #333;
949
+ color: #ccc;
950
+ cursor: pointer;
951
+ font-size: 0.8em;
952
+ }
953
+
954
+ .log-config-edit-btn:hover {
955
+ background: #444;
956
+ }
957
+
958
+ .log-config-edit-btn:disabled {
959
+ opacity: 0.5;
960
+ cursor: default;
961
+ }
962
+
963
+ .log-config-summary-text {
964
+ font-size: 0.8em;
965
+ color: #aaa;
966
+ line-height: 1.5;
967
+ }
968
+
969
+ /* Device Select Dialog */
970
+ .dev-select-overlay {
971
+ position: fixed;
972
+ inset: 0;
973
+ background: rgba(0, 0, 0, 0.5);
974
+ z-index: 100;
975
+ display: flex;
976
+ align-items: center;
977
+ justify-content: center;
978
+ }
979
+
980
+ .dev-select-dialog {
981
+ background: #2a2a2a;
982
+ border: 1px solid #666;
983
+ border-radius: 8px;
984
+ padding: 18px 22px;
985
+ min-width: 320px;
986
+ max-width: 480px;
987
+ max-height: 80vh;
988
+ display: flex;
989
+ flex-direction: column;
990
+ gap: 10px;
991
+ color: #fff;
992
+ }
993
+
994
+ .dev-select-title {
995
+ margin: 0 0 4px 0;
996
+ font-size: 1.1em;
997
+ }
998
+
999
+ .dev-select-list {
1000
+ display: flex;
1001
+ flex-direction: column;
1002
+ gap: 8px;
1003
+ overflow-y: auto;
1004
+ max-height: 60vh;
1005
+ padding-right: 4px;
1006
+ }
1007
+
1008
+ .dev-select-buttons {
1009
+ display: flex;
1010
+ gap: 8px;
1011
+ justify-content: flex-end;
1012
+ margin-top: 6px;
1013
+ padding-top: 8px;
1014
+ border-top: 1px solid #444;
1015
+ }
1016
+
1017
+ .dev-select-btn {
1018
+ padding: 6px 18px;
1019
+ border: none;
1020
+ border-radius: 4px;
1021
+ cursor: pointer;
1022
+ font-size: 0.9em;
1023
+ }
1024
+
1025
+ .dev-select-btn-cancel {
1026
+ background: #555;
1027
+ color: #ddd;
1028
+ }
1029
+
1030
+ .dev-select-btn-cancel:hover {
1031
+ background: #666;
1032
+ }
1033
+
1034
+ .dev-select-btn-save {
1035
+ background: #4a7;
1036
+ color: #fff;
1037
+ }
1038
+
1039
+ .dev-select-btn-save:hover {
1040
+ background: #5b8;
1041
+ }
1042
+
1043
+ /* Log Files Panel */
1044
+ .log-files-panel {
1045
+ min-width: 220px;
1046
+ }
1047
+
1048
+ .log-files-header {
1049
+ display: flex;
1050
+ align-items: center;
1051
+ gap: 10px;
1052
+ width: 100%;
1053
+ }
1054
+
1055
+ .log-files-header h3 {
1056
+ margin: 0;
1057
+ flex: 1;
1058
+ }
1059
+
1060
+ .log-files-refresh-button {
1061
+ background: #555;
1062
+ color: #fff;
1063
+ border: none;
1064
+ border-radius: 4px;
1065
+ padding: 4px 10px;
1066
+ cursor: pointer;
1067
+ font-size: 1.2em;
1068
+ line-height: 1;
1069
+ }
1070
+
1071
+ .log-files-refresh-button:hover {
1072
+ background: #666;
1073
+ }
1074
+
1075
+ .log-files-disk-info {
1076
+ font-size: 0.8em;
1077
+ color: #aaa;
1078
+ margin-top: 4px;
1079
+ }
1080
+
1081
+ .log-files-loading,
1082
+ .log-files-empty {
1083
+ color: #888;
1084
+ font-size: 0.9em;
1085
+ margin-top: 10px;
1086
+ }
1087
+
1088
+ .log-files-list {
1089
+ display: flex;
1090
+ flex-direction: column;
1091
+ gap: 4px;
1092
+ margin-top: 10px;
1093
+ width: 100%;
1094
+ max-height: 300px;
1095
+ overflow-y: auto;
1096
+ }
1097
+
1098
+ .log-file-item {
1099
+ display: flex;
1100
+ align-items: center;
1101
+ justify-content: space-between;
1102
+ padding: 6px 8px;
1103
+ background: #383838;
1104
+ border-radius: 4px;
1105
+ gap: 8px;
1106
+ }
1107
+
1108
+ .log-file-info {
1109
+ display: flex;
1110
+ flex-direction: column;
1111
+ min-width: 0;
1112
+ flex: 1;
1113
+ }
1114
+
1115
+ .log-file-name {
1116
+ font-size: 0.85em;
1117
+ overflow: hidden;
1118
+ text-overflow: ellipsis;
1119
+ white-space: nowrap;
1120
+ }
1121
+
1122
+ .log-file-size {
1123
+ font-size: 0.75em;
1124
+ color: #888;
1125
+ }
1126
+
1127
+ .log-file-download-button {
1128
+ background: #007bff;
1129
+ color: #fff;
1130
+ border: none;
1131
+ border-radius: 4px;
1132
+ padding: 4px 10px;
1133
+ cursor: pointer;
1134
+ font-size: 0.9em;
1135
+ min-width: 36px;
1136
+ text-align: center;
1137
+ }
1138
+
1139
+ .log-file-download-button:hover {
1140
+ background: #0056b3;
1141
+ }
1142
+
1143
+ .log-file-download-button:disabled {
1144
+ background: #444;
1145
+ cursor: not-allowed;
1146
+ }
1147
+
1148
+ .log-file-actions {
1149
+ display: flex;
1150
+ gap: 4px;
1151
+ align-items: center;
1152
+ }
1153
+
1154
+ .log-file-delete-button {
1155
+ background: #dc3545;
1156
+ color: #fff;
1157
+ border: none;
1158
+ border-radius: 4px;
1159
+ padding: 4px 8px;
1160
+ cursor: pointer;
1161
+ font-size: 0.85em;
1162
+ min-width: 32px;
1163
+ text-align: center;
1164
+ }
1165
+
1166
+ .log-file-delete-button:hover {
1167
+ background: #a71d2a;
1168
+ }
1169
+
1170
+ .log-file-delete-button:disabled {
1171
+ background: #444;
1172
+ cursor: not-allowed;
408
1173
  }