Wideband autonomous SDR analysis engine forked from sdr-visual-suite
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

295 líneas
4.3KB

  1. :root {
  2. --bg: #0b0f14;
  3. --panel: #111821;
  4. --grid: #1c2a39;
  5. --text: #d6e3f0;
  6. --accent: #48d1b8;
  7. --muted: #7f93aa;
  8. }
  9. * { box-sizing: border-box; }
  10. body {
  11. margin: 0;
  12. font-family: "IBM Plex Sans", "Segoe UI", sans-serif;
  13. background: radial-gradient(circle at 20% 20%, #14202e, #0b0f14 60%);
  14. color: var(--text);
  15. height: 100vh;
  16. display: flex;
  17. flex-direction: column;
  18. }
  19. header, footer {
  20. padding: 12px 20px;
  21. display: flex;
  22. align-items: center;
  23. justify-content: space-between;
  24. background: linear-gradient(90deg, #0f1824, #0b0f14);
  25. border-bottom: 1px solid #0f2233;
  26. }
  27. footer {
  28. border-top: 1px solid #0f2233;
  29. border-bottom: none;
  30. }
  31. .title {
  32. font-weight: 600;
  33. letter-spacing: 0.02em;
  34. }
  35. .meta {
  36. font-size: 0.9rem;
  37. color: var(--muted);
  38. }
  39. main {
  40. flex: 1;
  41. display: grid;
  42. grid-template-columns: 2fr 1fr;
  43. grid-template-rows: auto 1fr;
  44. gap: 12px;
  45. padding: 12px;
  46. }
  47. .panel {
  48. background: var(--panel);
  49. border: 1px solid #13263b;
  50. border-radius: 10px;
  51. padding: 8px;
  52. position: relative;
  53. }
  54. canvas {
  55. width: 100%;
  56. height: 100%;
  57. border-radius: 6px;
  58. background: #06090d;
  59. }
  60. .controls-panel {
  61. display: flex;
  62. flex-direction: column;
  63. gap: 12px;
  64. grid-column: 2;
  65. grid-row: 1;
  66. }
  67. .spectrum-panel {
  68. grid-column: 1;
  69. grid-row: 1;
  70. }
  71. .waterfall-panel {
  72. grid-column: 1;
  73. grid-row: 2;
  74. }
  75. .timeline-panel {
  76. grid-column: 2;
  77. grid-row: 2;
  78. }
  79. .controls-grid {
  80. display: grid;
  81. grid-template-columns: 1fr;
  82. gap: 10px;
  83. font-size: 0.9rem;
  84. }
  85. .control-label {
  86. color: var(--muted);
  87. text-transform: uppercase;
  88. font-size: 0.75rem;
  89. letter-spacing: 0.08em;
  90. }
  91. .control-row {
  92. display: grid;
  93. grid-template-columns: 1fr;
  94. gap: 8px;
  95. }
  96. .control-row input[type="number"],
  97. .control-row select {
  98. width: 100%;
  99. background: #0b111a;
  100. border: 1px solid #20344b;
  101. color: var(--text);
  102. border-radius: 8px;
  103. padding: 6px 8px;
  104. }
  105. .control-row input[type="range"] {
  106. width: 100%;
  107. }
  108. .preset-row {
  109. display: flex;
  110. gap: 8px;
  111. flex-wrap: wrap;
  112. }
  113. .preset-btn {
  114. background: #142233;
  115. color: var(--text);
  116. border: 1px solid #1f3248;
  117. border-radius: 8px;
  118. padding: 4px 10px;
  119. cursor: pointer;
  120. }
  121. .preset-btn:hover {
  122. border-color: #2b4b68;
  123. }
  124. .toggle-row {
  125. display: flex;
  126. flex-wrap: wrap;
  127. gap: 10px;
  128. }
  129. .toggle {
  130. display: inline-flex;
  131. align-items: center;
  132. gap: 6px;
  133. font-size: 0.85rem;
  134. color: var(--text);
  135. }
  136. .toggle input {
  137. accent-color: var(--accent);
  138. }
  139. .timeline-panel {
  140. display: flex;
  141. flex-direction: column;
  142. gap: 8px;
  143. }
  144. .timeline-panel canvas {
  145. flex: 1;
  146. cursor: crosshair;
  147. }
  148. .panel-header {
  149. display: flex;
  150. align-items: center;
  151. justify-content: space-between;
  152. font-size: 0.95rem;
  153. color: var(--text);
  154. }
  155. .panel-subtitle {
  156. font-size: 0.8rem;
  157. color: var(--muted);
  158. }
  159. #spectrum {
  160. cursor: grab;
  161. }
  162. #spectrum:active {
  163. cursor: grabbing;
  164. }
  165. .drawer {
  166. position: fixed;
  167. right: 12px;
  168. top: 70px;
  169. bottom: 70px;
  170. width: 320px;
  171. background: #0d141e;
  172. border: 1px solid #13263b;
  173. border-radius: 12px;
  174. box-shadow: 0 20px 60px rgba(0, 0, 0, 0.45);
  175. display: none;
  176. flex-direction: column;
  177. z-index: 10;
  178. }
  179. .drawer.open {
  180. display: flex;
  181. }
  182. .drawer-header {
  183. padding: 12px 16px;
  184. border-bottom: 1px solid #13263b;
  185. display: flex;
  186. align-items: center;
  187. justify-content: space-between;
  188. font-weight: 600;
  189. }
  190. .drawer-close {
  191. background: #162030;
  192. border: 1px solid #20344b;
  193. color: var(--text);
  194. padding: 4px 10px;
  195. border-radius: 8px;
  196. cursor: pointer;
  197. }
  198. .drawer-body {
  199. padding: 12px 16px 16px;
  200. overflow: auto;
  201. display: flex;
  202. flex-direction: column;
  203. gap: 12px;
  204. }
  205. .detail-grid {
  206. display: grid;
  207. grid-template-columns: 1fr 1fr;
  208. gap: 8px 12px;
  209. font-size: 0.9rem;
  210. }
  211. .detail-label {
  212. color: var(--muted);
  213. }
  214. .detail-section-title {
  215. font-size: 0.85rem;
  216. color: var(--muted);
  217. text-transform: uppercase;
  218. letter-spacing: 0.08em;
  219. }
  220. #detailSpectrogram {
  221. height: 90px;
  222. }
  223. .clips-empty {
  224. color: var(--muted);
  225. font-size: 0.9rem;
  226. }
  227. #status {
  228. color: var(--muted);
  229. }
  230. @media (max-width: 820px) {
  231. main {
  232. grid-template-columns: 1fr;
  233. grid-template-rows: auto auto auto auto;
  234. }
  235. .controls-panel,
  236. .spectrum-panel,
  237. .waterfall-panel,
  238. .timeline-panel {
  239. grid-row: auto;
  240. grid-column: auto;
  241. }
  242. .drawer {
  243. left: 12px;
  244. right: 12px;
  245. width: auto;
  246. top: auto;
  247. bottom: 12px;
  248. height: 45vh;
  249. }
  250. }