ai-analysis-panel.component.scss 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. .ai-panel-section {
  2. margin-bottom: 0;
  3. }
  4. .ai-panel-header {
  5. display: flex;
  6. align-items: center;
  7. gap: 12px;
  8. margin-bottom: 16px;
  9. }
  10. .ai-panel-title {
  11. font-size: 18px;
  12. font-weight: 600;
  13. color: #343A40;
  14. padding-left: 12px;
  15. border-left: 4px solid #343A40;
  16. margin: 0;
  17. flex: 1;
  18. }
  19. .ai-btn-refresh {
  20. padding: 5px 14px;
  21. font-size: 12px;
  22. font-weight: 500;
  23. border-radius: 6px;
  24. border: 1px solid #343A40;
  25. background: #343A40;
  26. color: white;
  27. cursor: pointer;
  28. white-space: nowrap;
  29. &:hover:not(:disabled) {
  30. background: #1E1E20;
  31. border-color: #1E1E20;
  32. }
  33. &:disabled {
  34. opacity: 0.65;
  35. cursor: not-allowed;
  36. }
  37. }
  38. .ai-summary-card {
  39. background: #F8F9FA;
  40. border: 1px solid #E9ECEF;
  41. border-radius: 8px;
  42. padding: 20px 24px;
  43. min-height: 72px;
  44. display: flex;
  45. align-items: flex-start;
  46. width: 100%;
  47. }
  48. .ai-loading {
  49. display: flex;
  50. flex-direction: column;
  51. gap: 12px;
  52. color: #868E96;
  53. font-size: 14px;
  54. padding: 8px 0;
  55. }
  56. .ai-loading-main {
  57. display: flex;
  58. align-items: center;
  59. gap: 12px;
  60. }
  61. .ai-progress-wrap {
  62. display: flex;
  63. align-items: center;
  64. gap: 10px;
  65. width: 100%;
  66. }
  67. .ai-progress-bar {
  68. flex: 1;
  69. max-width: 300px;
  70. height: 4px;
  71. background: #e8e8e8;
  72. border-radius: 2px;
  73. overflow: hidden;
  74. }
  75. .ai-progress-fill {
  76. height: 100%;
  77. background: linear-gradient(90deg, #3b82f6, #60a5fa);
  78. border-radius: 2px;
  79. transition: width 0.8s ease;
  80. }
  81. .ai-elapsed {
  82. font-size: 11px;
  83. color: #adb5bd;
  84. white-space: nowrap;
  85. }
  86. .ai-dots {
  87. display: flex;
  88. gap: 4px;
  89. span {
  90. width: 6px;
  91. height: 6px;
  92. border-radius: 50%;
  93. background: #3b82f6;
  94. animation: ai-bounce 1.2s ease-in-out infinite;
  95. &:nth-child(2) { animation-delay: 0.2s; }
  96. &:nth-child(3) { animation-delay: 0.4s; }
  97. }
  98. }
  99. @keyframes ai-bounce {
  100. 0%, 80%, 100% { transform: scale(0.6); opacity: 0.4; }
  101. 40% { transform: scale(1); opacity: 1; }
  102. }
  103. .ai-summary-body {
  104. display: flex;
  105. gap: 16px;
  106. width: 100%;
  107. }
  108. .ai-summary-body-visual {
  109. display: block;
  110. }
  111. .ai-visual-pending {
  112. display: flex;
  113. align-items: center;
  114. gap: 12px;
  115. color: #475467;
  116. font-size: 14px;
  117. padding: 8px 0;
  118. }
  119. .ai-visual-streaming {
  120. display: flex;
  121. align-items: center;
  122. gap: 12px;
  123. color: #475467;
  124. font-size: 13px;
  125. padding: 8px 0;
  126. }
  127. .ai-icon-wrap {
  128. flex-shrink: 0;
  129. width: 28px;
  130. height: 28px;
  131. border-radius: 50%;
  132. background: #3b82f6;
  133. display: flex;
  134. align-items: center;
  135. justify-content: center;
  136. margin-top: 2px;
  137. .ai-icon {
  138. color: white;
  139. font-size: 13px;
  140. line-height: 1;
  141. }
  142. }
  143. .ai-text {
  144. flex: 1;
  145. font-size: 14px;
  146. line-height: 1.8;
  147. color: #1f2937;
  148. margin: 0;
  149. }
  150. .ai-markdown {
  151. ::ng-deep {
  152. h1, h2, h3, h4 {
  153. font-size: 15px;
  154. font-weight: 600;
  155. color: #111827;
  156. margin: 12px 0 6px;
  157. padding: 0;
  158. line-height: 1.5;
  159. &:first-child { margin-top: 0; }
  160. }
  161. h3, h4 { font-size: 14px; }
  162. p {
  163. margin: 4px 0;
  164. line-height: 1.75;
  165. }
  166. strong {
  167. font-weight: 600;
  168. color: #111827;
  169. }
  170. em { color: #4b5563; }
  171. ul, ol {
  172. margin: 4px 0;
  173. padding-left: 20px;
  174. }
  175. li {
  176. margin: 2px 0;
  177. line-height: 1.7;
  178. }
  179. blockquote {
  180. margin: 8px 0;
  181. padding: 6px 12px;
  182. border-left: 3px solid #93c5fd;
  183. background: #f0f7ff;
  184. border-radius: 0 6px 6px 0;
  185. color: #374151;
  186. font-size: 13px;
  187. }
  188. code {
  189. padding: 1px 5px;
  190. background: #f3f4f6;
  191. border-radius: 3px;
  192. font-size: 13px;
  193. color: #dc2626;
  194. }
  195. pre {
  196. width: 100%;
  197. box-sizing: border-box;
  198. margin: 10px 0;
  199. border: 1px solid #d8dee8;
  200. border-radius: 8px;
  201. background: #f8fafc;
  202. color: #111827;
  203. padding: 12px 14px;
  204. overflow-x: auto;
  205. white-space: pre;
  206. font-family: Consolas, Menlo, ui-monospace, SFMono-Regular, monospace;
  207. font-size: 13px;
  208. line-height: 1.65;
  209. code {
  210. padding: 0;
  211. background: transparent;
  212. color: inherit;
  213. font-size: inherit;
  214. }
  215. }
  216. table {
  217. width: 100%;
  218. border-collapse: collapse;
  219. margin: 12px 0;
  220. font-size: 13px;
  221. border: 1px solid #e5e7eb;
  222. border-radius: 8px;
  223. overflow: hidden;
  224. display: block;
  225. overflow-x: auto;
  226. thead {
  227. background: linear-gradient(135deg, #f0f4ff 0%, #e8ecff 100%);
  228. th {
  229. padding: 10px 14px;
  230. text-align: left;
  231. font-weight: 600;
  232. color: #1f2937;
  233. border-bottom: 2px solid #d1d5db;
  234. border-right: 1px solid #e5e7eb;
  235. white-space: nowrap;
  236. font-size: 12px;
  237. letter-spacing: 0.3px;
  238. &:last-child { border-right: none; }
  239. }
  240. }
  241. tbody {
  242. tr {
  243. transition: background 0.15s;
  244. &:nth-child(even) { background: #f9fafb; }
  245. &:hover { background: #eef2ff; }
  246. td {
  247. padding: 8px 14px;
  248. border-bottom: 1px solid #f0f0f0;
  249. border-right: 1px solid #f0f0f0;
  250. color: #374151;
  251. line-height: 1.6;
  252. vertical-align: top;
  253. &:last-child { border-right: none; }
  254. }
  255. &:last-child td { border-bottom: none; }
  256. }
  257. }
  258. }
  259. hr {
  260. border: none;
  261. border-top: 1px solid #e5e7eb;
  262. margin: 10px 0;
  263. }
  264. & > *:last-child { margin-bottom: 0; }
  265. span.review-phrase-link {
  266. color: #0958d9;
  267. background: #e6f4ff;
  268. border: 1px dashed #91caff;
  269. border-radius: 12px;
  270. padding: 1px 8px;
  271. text-decoration: none;
  272. cursor: pointer;
  273. font-size: 13px;
  274. transition: all 0.2s;
  275. white-space: nowrap;
  276. &:hover {
  277. background: #bae0ff;
  278. border-color: #69b1ff;
  279. }
  280. }
  281. span.review-name-link {
  282. color: #7c3aed;
  283. background: #f5f3ff;
  284. border: 1px dashed #c4b5fd;
  285. border-radius: 12px;
  286. padding: 1px 8px;
  287. text-decoration: none;
  288. cursor: pointer;
  289. font-size: 13px;
  290. transition: all 0.2s;
  291. white-space: nowrap;
  292. &:hover {
  293. background: #ede9fe;
  294. border-color: #a78bfa;
  295. box-shadow: 0 1px 4px rgba(124, 58, 237, 0.15);
  296. }
  297. }
  298. }
  299. }
  300. .ai-cursor {
  301. display: inline-block;
  302. color: #3b82f6;
  303. font-weight: 700;
  304. animation: blink 0.8s step-end infinite;
  305. }
  306. @keyframes blink {
  307. 0%, 100% { opacity: 1; }
  308. 50% { opacity: 0; }
  309. }
  310. // ── Mini mode overrides ──
  311. .ai-size-mini {
  312. .ai-summary-card {
  313. padding: 12px 16px;
  314. min-height: 36px;
  315. border-radius: 8px;
  316. background: linear-gradient(135deg, #f8faff 0%, #f0f4ff 100%);
  317. }
  318. .ai-icon-wrap {
  319. width: 22px;
  320. height: 22px;
  321. margin-top: 1px;
  322. .ai-icon { font-size: 11px; }
  323. }
  324. .ai-summary-body { gap: 10px; }
  325. .ai-text {
  326. font-size: 13px;
  327. line-height: 1.7;
  328. }
  329. .ai-loading-text { font-size: 12px; }
  330. .ai-dots span {
  331. width: 5px;
  332. height: 5px;
  333. }
  334. }
  335. .ai-mini-idle {
  336. display: flex;
  337. align-items: center;
  338. width: 100%;
  339. }
  340. .ai-btn-mini-gen {
  341. padding: 4px 14px;
  342. font-size: 12px;
  343. font-weight: 500;
  344. border-radius: 6px;
  345. border: 1px dashed #93c5fd;
  346. background: transparent;
  347. color: #3b82f6;
  348. cursor: pointer;
  349. transition: all 0.2s;
  350. &:hover {
  351. background: #eff6ff;
  352. border-style: solid;
  353. }
  354. }
  355. // ---- Chat button ----
  356. .ai-chat-action {
  357. display: flex;
  358. justify-content: flex-end;
  359. margin-top: 10px;
  360. }
  361. .ai-btn-chat {
  362. background: #343A40;
  363. color: #fff;
  364. border: none;
  365. border-radius: 20px;
  366. padding: 7px 20px;
  367. font-size: 13px;
  368. font-weight: 500;
  369. cursor: pointer;
  370. transition: opacity 0.2s, box-shadow 0.2s;
  371. &:hover {
  372. opacity: 0.9;
  373. box-shadow: 0 2px 10px rgba(52, 58, 64, 0.15);
  374. }
  375. }
  376. .ai-mini-actions {
  377. display: flex;
  378. justify-content: flex-end;
  379. margin-top: 4px;
  380. }
  381. .ai-btn-mini-refresh {
  382. padding: 0;
  383. font-size: 11px;
  384. color: #9ca3af;
  385. background: none;
  386. border: none;
  387. cursor: pointer;
  388. text-decoration: underline;
  389. &:hover { color: #3b82f6; }
  390. }