analyzer.component.scss 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. .analyzer-root {
  2. display: flex;
  3. flex-direction: column;
  4. gap: 1.5rem;
  5. padding: 1.5rem;
  6. max-width: 900px;
  7. margin: 0 auto;
  8. }
  9. // ── Header ───────────────────────────────────────────────────────────────────
  10. .analyzer-header {
  11. display: flex;
  12. align-items: center;
  13. gap: 0.75rem;
  14. .header-icon {
  15. font-size: 2rem;
  16. width: 2rem;
  17. height: 2rem;
  18. color: #558b2f;
  19. }
  20. .header-title {
  21. margin: 0;
  22. font-size: 1.4rem;
  23. font-weight: 600;
  24. color: #1b5e20;
  25. }
  26. .mpob-badge {
  27. margin-left: auto;
  28. background: #e8f5e9;
  29. color: #2e7d32;
  30. border: 1px solid #a5d6a7;
  31. border-radius: 12px;
  32. padding: 2px 10px;
  33. font-size: 0.72rem;
  34. font-weight: 600;
  35. letter-spacing: 0.04em;
  36. text-transform: uppercase;
  37. }
  38. }
  39. // ── Engine selector row ──────────────────────────────────────────────────────
  40. .engine-selector-row {
  41. display: flex;
  42. align-items: center;
  43. gap: 1rem;
  44. .engine-field {
  45. width: 280px;
  46. }
  47. .engine-status-badge {
  48. padding: 4px 12px;
  49. border-radius: 8px;
  50. font-size: 0.8rem;
  51. font-weight: 600;
  52. &.remote {
  53. background: #e3f2fd;
  54. color: #1565c0;
  55. border: 1px solid #90caf9;
  56. }
  57. &.local {
  58. background: #f3e5f5;
  59. color: #6a1b9a;
  60. border: 1px solid #ce93d8;
  61. }
  62. &.n8n {
  63. background: #fff8e1;
  64. color: #e65100;
  65. border: 1px solid #ffcc02;
  66. }
  67. }
  68. }
  69. // ── Input mode toggle ────────────────────────────────────────────────────────
  70. .input-mode-toggle {
  71. display: flex;
  72. gap: 0.5rem;
  73. button {
  74. border: 1px solid #c8e6c9;
  75. border-radius: 8px;
  76. color: #546e7a;
  77. &.active {
  78. background: #e8f5e9;
  79. color: #2e7d32;
  80. border-color: #a5d6a7;
  81. }
  82. }
  83. }
  84. // ── Drop zone ────────────────────────────────────────────────────────────────
  85. .drop-zone {
  86. position: relative;
  87. display: flex;
  88. flex-direction: column;
  89. align-items: center;
  90. justify-content: center;
  91. gap: 0.6rem;
  92. min-height: 220px;
  93. border: 2px dashed #a5d6a7;
  94. border-radius: 12px;
  95. background: #f9fbe7;
  96. transition: border-color 0.2s, background 0.2s;
  97. cursor: pointer;
  98. &.drag-over {
  99. border-color: #2e7d32;
  100. background: #e8f5e9;
  101. }
  102. .drop-icon {
  103. font-size: 3rem;
  104. width: 3rem;
  105. height: 3rem;
  106. color: #81c784;
  107. }
  108. .drop-primary {
  109. margin: 0;
  110. font-size: 1rem;
  111. color: #37474f;
  112. font-weight: 500;
  113. }
  114. .drop-secondary {
  115. margin: 0;
  116. font-size: 0.85rem;
  117. color: #90a4ae;
  118. }
  119. .loading-overlay {
  120. display: flex;
  121. flex-direction: column;
  122. align-items: center;
  123. gap: 0.75rem;
  124. .loading-label {
  125. font-size: 0.9rem;
  126. color: #546e7a;
  127. }
  128. }
  129. }
  130. // ── Camera section ───────────────────────────────────────────────────────────
  131. .camera-section {
  132. position: relative;
  133. display: flex;
  134. flex-direction: column;
  135. align-items: center;
  136. gap: 0.75rem;
  137. padding: 1rem;
  138. border: 2px solid #a5d6a7;
  139. border-radius: 12px;
  140. background: #1a1a2e;
  141. min-height: 200px;
  142. overflow: hidden;
  143. .camera-preview {
  144. display: none;
  145. width: 100%;
  146. max-width: 640px;
  147. border-radius: 8px;
  148. &.visible {
  149. display: block;
  150. }
  151. }
  152. .camera-loading {
  153. position: absolute;
  154. inset: 0;
  155. background: rgba(0, 0, 0, 0.55);
  156. display: flex;
  157. flex-direction: column;
  158. align-items: center;
  159. justify-content: center;
  160. gap: 0.75rem;
  161. border-radius: 10px;
  162. .loading-label {
  163. font-size: 0.9rem;
  164. color: #fff;
  165. }
  166. }
  167. .camera-controls {
  168. display: flex;
  169. gap: 0.75rem;
  170. }
  171. }
  172. // ── Live batch report wrapper ────────────────────────────────────────────────
  173. .live-report-wrapper {
  174. border: 1px solid #a5d6a7;
  175. border-radius: 12px;
  176. overflow: hidden;
  177. background: #ffffff;
  178. }
  179. .live-report-header {
  180. display: flex;
  181. align-items: center;
  182. gap: 0.6rem;
  183. padding: 0.65rem 1rem;
  184. background: #f1f8e9;
  185. border-bottom: 1px solid #c8e6c9;
  186. .report-icon {
  187. color: #558b2f;
  188. font-size: 1.1rem;
  189. width: 1.1rem;
  190. height: 1.1rem;
  191. }
  192. .report-label {
  193. font-size: 0.82rem;
  194. font-weight: 600;
  195. color: #37474f;
  196. flex: 1;
  197. }
  198. .new-scan-btn {
  199. color: #546e7a;
  200. border-color: #a5d6a7;
  201. font-size: 0.78rem;
  202. height: 30px;
  203. line-height: 30px;
  204. mat-icon {
  205. font-size: 0.9rem;
  206. width: 0.9rem;
  207. height: 0.9rem;
  208. }
  209. &:hover {
  210. color: #2e7d32;
  211. border-color: #2e7d32;
  212. }
  213. }
  214. }