@symerian/symi 3.4.30 → 3.4.31

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 (177) hide show
  1. package/dist/{agent-O3PihJOY.js → agent-ZFfYdexc.js} +10 -10
  2. package/dist/{agents-C2MpIr16.js → agents-C8naPegc.js} +5 -5
  3. package/dist/{audit-yf3H4Y1h.js → audit-DOfexJi4.js} +8 -8
  4. package/dist/{auth-choice-CyBcsQ9T.js → auth-choice-DxH-c3vK.js} +4 -4
  5. package/dist/{banner-D7__HlM-.js → banner-D7zYLyA8.js} +1 -1
  6. package/dist/{browser-cli-B_6WWHm_.js → browser-cli-MYIql1Ic.js} +3 -3
  7. package/dist/build-info.json +1 -1
  8. package/dist/bundled/boot-md/handler.js +4 -4
  9. package/dist/bundled/session-memory/handler.js +4 -4
  10. package/dist/{call-IfleM0ap.js → call-D9U2Sfhp.js} +1 -1
  11. package/dist/{channel-options-B5974x-7.js → channel-options-9PzSNQLG.js} +1 -1
  12. package/dist/{channels-cli-C6Nv9mzy.js → channels-cli-C3XnNkE5.js} +30 -30
  13. package/dist/{chrome-DT1fIVG1.js → chrome-B4P7ycw5.js} +7 -7
  14. package/dist/{chrome-DJCkCRLf.js → chrome-ClVIwINy.js} +1 -1
  15. package/dist/{cli-DZoms4qg.js → cli-DhTdzhjk.js} +26 -26
  16. package/dist/{command-registry--D98SJ6k.js → command-registry-BOwku-e8.js} +11 -11
  17. package/dist/{completion-cli-CHYvpIPw.js → completion-cli-KZYbGY4H.js} +2 -2
  18. package/dist/{config-BTSBEAnk.js → config-Byd2Y9rr.js} +5 -5
  19. package/dist/{config-cli-DstpcB33.js → config-cli-CJ1CRfG8.js} +5 -5
  20. package/dist/{config-guard-CCJrDmON.js → config-guard-zt0zhFHl.js} +2 -2
  21. package/dist/{config-validation-YCrMlM9Z.js → config-validation-CRazk6Kd.js} +1 -1
  22. package/dist/{configure-B-UvSZZ7.js → configure-CFY_XEps.js} +10 -10
  23. package/dist/{control-service-CwRG4M_O.js → control-service-DN6-IdFk.js} +4 -4
  24. package/dist/{cron-cli-DUETe3Of.js → cron-cli-fmiz43Pz.js} +3 -3
  25. package/dist/{daemon-cli-Dy5eY4M7.js → daemon-cli-BilAL40g.js} +6 -6
  26. package/dist/{daemon-runtime-ChztAKDA.js → daemon-runtime-D4KHzQq2.js} +1 -1
  27. package/dist/{deliver-59sRVaYQ.js → deliver-BkCYBlzi.js} +4 -4
  28. package/dist/{deliver-BHmK4isn.js → deliver-CnsfN7km.js} +1 -1
  29. package/dist/{devices-cli-BCZ2HHjT.js → devices-cli-D7HdOwRI.js} +2 -2
  30. package/dist/{directory-cli-BVGd0l0T.js → directory-cli-ed6QacBC.js} +1 -1
  31. package/dist/{dns-cli-DH-ksmiI.js → dns-cli-RPa1dGTQ.js} +1 -1
  32. package/dist/{docs-cli-BuX8FDdh.js → docs-cli-ZTdS_Gak.js} +2 -2
  33. package/dist/{doctor-completion-C4Sf8CFV.js → doctor-completion-DpGX8dau.js} +1 -1
  34. package/dist/{doctor-config-flow-BhmF6EAq.js → doctor-config-flow-CIrG_yW_.js} +4 -4
  35. package/dist/entry.js +3 -3
  36. package/dist/{exec-approvals-cli-CyXTXgft.js → exec-approvals-cli-65pcsa1y.js} +6 -6
  37. package/dist/{frontmatter-BH3ExkUY.js → frontmatter-B4levtVg.js} +2 -2
  38. package/dist/{gateway-cli-fT43bqlv.js → gateway-cli-CTi7Wl2k.js} +50 -50
  39. package/dist/{gateway-rpc-BEqCo2JK.js → gateway-rpc-2VPLhMhx.js} +1 -1
  40. package/dist/{glass-ui-ws-BfMKuf9v.js → glass-ui-ws-Bah_A-jn.js} +38 -38
  41. package/dist/{gmail-setup-utils-Cz9Tb30q.js → gmail-setup-utils-C9WBC6Cd.js} +1 -1
  42. package/dist/{health-DDxrkioj.js → health-B5rRzhyV.js} +3 -3
  43. package/dist/{hooks-cli-Btgk__9z.js → hooks-cli-CSDCGO-W.js} +29 -29
  44. package/dist/{hooks-status-BaV4_YaJ.js → hooks-status-OorbLcc2.js} +2 -2
  45. package/dist/index.js +0 -0
  46. package/dist/{lifecycle-core-B0tG8ERp.js → lifecycle-core-BRc-XqTk.js} +2 -2
  47. package/dist/llm-slug-generator.js +4 -4
  48. package/dist/{logs-cli-CUhZrDw7.js → logs-cli-D5phVUOT.js} +3 -3
  49. package/dist/{manager-BeNnzSJv.js → manager-BfhHvsI9.js} +1 -1
  50. package/dist/{manager-Di9qtuZF.js → manager-DzBH9uQG.js} +1 -1
  51. package/dist/{memory-BDeydRz3.js → memory-BCj0cj5v.js} +3 -3
  52. package/dist/{memory-cli-D4hZiGr5.js → memory-cli-9WUMBHol.js} +3 -3
  53. package/dist/{model-catalog-DPnCNs5N.js → model-catalog-CD2kTz4V.js} +2 -2
  54. package/dist/{model-picker-DuPommMc.js → model-picker-CVd5UuXV.js} +2 -2
  55. package/dist/{models-cli-CL5K06Wu.js → models-cli-rd4eX_6P.js} +30 -30
  56. package/dist/{models-config-CPlvO1b0.js → models-config-oxaGiRUT.js} +1 -1
  57. package/dist/{models-B0wNKA18.js → models-sbKIrJBG.js} +9 -9
  58. package/dist/{node-cli-CWWMajKF.js → node-cli-ClLXSdFL.js} +9 -9
  59. package/dist/{nodes-cli-YmE7S-JB.js → nodes-cli-DY38p5In.js} +3 -3
  60. package/dist/{onboard-HqUZVKyD.js → onboard-BAyp_UFm.js} +7 -7
  61. package/dist/{onboard-channels-BbF5-N3g.js → onboard-channels-CUpkV_IJ.js} +1 -1
  62. package/dist/{onboard-custom-63SI3jrk.js → onboard-custom-BMgLK-vo.js} +2 -2
  63. package/dist/{onboard-helpers-Cb3WFLl9.js → onboard-helpers-DIQjpQ-s.js} +2 -2
  64. package/dist/{onboard-hooks-DXXg3YH9.js → onboard-hooks-KZKmj5Dk.js} +3 -3
  65. package/dist/{onboard-remote-CqtCrqtm.js → onboard-remote-C-_NUgBl.js} +1 -1
  66. package/dist/{onboard-skills-CS3l5fhH.js → onboard-skills-CwvicFTi.js} +3 -3
  67. package/dist/{onboarding-Be_HJIFA.js → onboarding-BxCNNo75.js} +11 -11
  68. package/dist/{onboarding.finalize-dsCUTKCQ.js → onboarding.finalize-DgMPXTtO.js} +18 -18
  69. package/dist/{onboarding.gateway-config-Ctd1_QW4.js → onboarding.gateway-config-BAaWvPSX.js} +4 -4
  70. package/dist/{outbound-send-deps-DPsU_Xdy.js → outbound-send-deps-qhFaNYAY.js} +1 -1
  71. package/dist/{pairing-cli-PtlNv7Gr.js → pairing-cli-CFkiSx8t.js} +1 -1
  72. package/dist/{pi-embedded-helpers-CVKIHnFv.js → pi-embedded-helpers-CRG5LMS7.js} +1 -1
  73. package/dist/{pi-tools.policy-8_wTu7v2.js → pi-tools.policy-De6xHjVL.js} +2 -2
  74. package/dist/{plugin-registry-BG51uZOA.js → plugin-registry-BNe5jtPK.js} +2 -2
  75. package/dist/plugin-sdk/index.js +6 -6
  76. package/dist/{plugins-cli-B-zVOiQN.js → plugins-cli-CWj33_Hj.js} +27 -27
  77. package/dist/{program-BOh0XGsA.js → program-Z2OLlhsB.js} +33 -33
  78. package/dist/{prompt-select-styled-Bj-hrPCx.js → prompt-select-styled-BNwbBBcH.js} +16 -16
  79. package/dist/{provider-auth-helpers-BK6NFk2Q.js → provider-auth-helpers-5qb15Hje.js} +2 -2
  80. package/dist/{push-apns-CMxk3Hxf.js → push-apns-D6qV5P4h.js} +1 -1
  81. package/dist/{pw-ai-C5MJKzUM.js → pw-ai-BsEf8C15.js} +1 -1
  82. package/dist/{pw-ai-CE2TBGif.js → pw-ai-C7mvVllB.js} +2 -2
  83. package/dist/{qr-cli-BeHlC33g.js → qr-cli-oENcXq8d.js} +1 -1
  84. package/dist/{redact-identifier-B1VHIbnd.js → redact-identifier-ZE8OIUof.js} +1 -1
  85. package/dist/{register.agent-COv5OPLQ.js → register.agent-DpiHPMca.js} +36 -36
  86. package/dist/{register.configure-RhKVlfWH.js → register.configure-DRFaroYF.js} +40 -40
  87. package/dist/{register.maintenance-BAK-DiQY.js → register.maintenance-BGNNTt_1.js} +38 -38
  88. package/dist/{register.message-CCBmn5ja.js → register.message-R4AIHhlU.js} +28 -28
  89. package/dist/{register.onboard-B3jO_Goy.js → register.onboard-Cl-_Suyv.js} +13 -13
  90. package/dist/{register.setup-CYSISTDO.js → register.setup-Dt98v2V3.js} +15 -15
  91. package/dist/{register.status-health-sessions-CGbg9k6d.js → register.status-health-sessions-DiX5lVyr.js} +23 -23
  92. package/dist/{register.subclis-loifbhVx.js → register.subclis-DVObuR_P.js} +28 -28
  93. package/dist/{replies-Dj640LxQ.js → replies-VTJu1jUK.js} +1 -1
  94. package/dist/{routes-B5y-oAKp.js → routes-DOFg6X5M.js} +3 -3
  95. package/dist/{rpc-qWm1bRo5.js → rpc-BIHKXdlN.js} +1 -1
  96. package/dist/{run-main-B7Ria3zD.js → run-main-NAgYKzSu.js} +44 -44
  97. package/dist/{sandbox-BJgHc4Vu.js → sandbox-EB7cFSML.js} +6 -6
  98. package/dist/{sandbox-cli-CSudrHYL.js → sandbox-cli-D4dy6sUK.js} +8 -8
  99. package/dist/{security-cli-B2lCR2xX.js → security-cli-DwCKOrFm.js} +11 -11
  100. package/dist/{send-CY9na-Jw.js → send-CkRtuQbr.js} +1 -1
  101. package/dist/{server-context-DdWWaDf6.js → server-context-ww1jytet.js} +5 -5
  102. package/dist/{server-methods-Dk_EnINI.js → server-methods-BDiZyPvS.js} +23 -23
  103. package/dist/{server-node-events-BHegSgG9.js → server-node-events-9cY40B4m.js} +29 -29
  104. package/dist/{session-utils-CAVPV2Hh.js → session-utils-CStjqGE6.js} +3 -3
  105. package/dist/{sessions-BDM9kNY0.js → sessions-BSRHJH8T.js} +3 -3
  106. package/dist/{sessions-CqLQkkWg.js → sessions-CInbrqsF.js} +1 -1
  107. package/dist/{shared-CpwtQRJB.js → shared-DEAo94kI.js} +1 -1
  108. package/dist/{skill-commands-CRQniaHy.js → skill-commands-BkKfrbHt.js} +2 -2
  109. package/dist/{skills-CTcjFd_F.js → skills-CFLijAZ-.js} +1 -1
  110. package/dist/{skills-cli-9Mlb7VRg.js → skills-cli-BbagnO6p.js} +5 -5
  111. package/dist/{skills-install-D5ikt72d.js → skills-install-dLRO1KGp.js} +2 -2
  112. package/dist/{skills-remote-BASG1Doo.js → skills-remote-DQVB-3Pj.js} +1 -1
  113. package/dist/{skills-status-1iVfuVIG.js → skills-status-HWybfj0K.js} +2 -2
  114. package/dist/{status-Bci6O3aA.js → status-BSrVEUoJ.js} +2 -2
  115. package/dist/{status-D5RhVO0A.js → status-FIp7UKru.js} +12 -12
  116. package/dist/{status.update-D5CachQ_.js → status.update-Cm8Fm8QD.js} +1 -1
  117. package/dist/{subagent-registry-CsXaK_sy.js → subagent-registry-DqryocLT.js} +31 -31
  118. package/dist/{synthesis-dplLmFIP.js → synthesis-CS-lrEGy.js} +4 -4
  119. package/dist/{synthesis-BoZf8BeO.js → synthesis-DKhH0YwU.js} +26 -26
  120. package/dist/{system-cli-D5FffFX5.js → system-cli-DYSI6cIB.js} +3 -3
  121. package/dist/{systemd-hints-CufcSfMk.js → systemd-hints-EIfW5y8K.js} +1 -1
  122. package/dist/{tui-DZ8gksSZ.js → tui-C20rHOeB.js} +4 -4
  123. package/dist/{tui-cli-CyBJYh9u.js → tui-cli-JwlzHCza.js} +11 -11
  124. package/dist/{unified-runner-BFLLzEHE.js → unified-runner-AM9tFC5q.js} +10 -10
  125. package/dist/{update-cli-yW6Xl6fs.js → update-cli-BYfA3RPc.js} +41 -41
  126. package/dist/{update-runner-CIgLduhH.js → update-runner-CBG8p9iG.js} +1 -1
  127. package/dist/{webhooks-cli-4bmyKzwb.js → webhooks-cli-MuG_QGLp.js} +4 -4
  128. package/dist/{with-timeout-bWr6yBeX.js → with-timeout-BvxaeAo6.js} +1 -1
  129. package/dist/{workspace-DxscDsm6.js → workspace-D0d7Gi4-.js} +1 -1
  130. package/extensions/memory-core/node_modules/.bin/symi +0 -0
  131. package/extensions/msteams/node_modules/.bin/symi +0 -0
  132. package/extensions/outlook/node_modules/.bin/symi +0 -0
  133. package/extensions/slack/node_modules/.bin/symi +0 -0
  134. package/package.json +108 -79
  135. package/dist/control-ui/css/revert-red-theme.md +0 -141
  136. package/dist/control-ui/css/style.css +0 -5843
  137. package/dist/control-ui/css/style.css.backup-2026-03-03-162525 +0 -3546
  138. package/dist/control-ui/css/style.css.backup-before-red-2026-03-03-162525 +0 -3546
  139. package/dist/control-ui/css/style.css.backup-before-red-theme-2026-03-03-162530 +0 -3546
  140. package/dist/control-ui/css/style.css.pre-2row +0 -2165
  141. package/dist/control-ui/css/style.css.pre-brand +0 -1776
  142. package/dist/control-ui/css/style.css.pre-history +0 -1974
  143. package/dist/control-ui/css/style.css.pre-nav +0 -2264
  144. package/dist/control-ui/css/style.css.pre-newsession +0 -1898
  145. package/dist/control-ui/css/style.css.pre-queue +0 -2195
  146. package/dist/control-ui/css/style.css.pre-red-prompt +0 -2524
  147. package/dist/control-ui/css/style.css.pre-stop +0 -2239
  148. package/dist/control-ui/css/style.css.pre-textarea +0 -2184
  149. package/dist/control-ui/css/style.css.pre-watchdog +0 -1848
  150. package/dist/control-ui/css/style.css.red-theme +0 -2999
  151. package/dist/control-ui/index.html +0 -1042
  152. package/dist/control-ui/js/app.js +0 -1304
  153. package/dist/control-ui/js/app.js.pre-2row +0 -463
  154. package/dist/control-ui/js/app.js.pre-heartbeat-filter +0 -595
  155. package/dist/control-ui/js/app.js.pre-newsession +0 -408
  156. package/dist/control-ui/js/app.js.pre-queue +0 -476
  157. package/dist/control-ui/js/app.js.pre-stop +0 -564
  158. package/dist/control-ui/js/app.js.pre-textarea +0 -467
  159. package/dist/control-ui/js/app.js.pre-watchdog +0 -293
  160. package/dist/control-ui/js/connections.js +0 -438
  161. package/dist/control-ui/js/gateway.js +0 -233
  162. package/dist/control-ui/js/gateway.js.pre-stop +0 -110
  163. package/dist/control-ui/js/history.js +0 -732
  164. package/dist/control-ui/js/logs.js +0 -238
  165. package/dist/control-ui/js/menu.js +0 -230
  166. package/dist/control-ui/js/menu.js.pre-nav +0 -66
  167. package/dist/control-ui/js/metrics.js +0 -53
  168. package/dist/control-ui/js/models.js +0 -138
  169. package/dist/control-ui/js/render.js +0 -882
  170. package/dist/control-ui/js/render.test.js +0 -112
  171. package/dist/control-ui/js/scheduling.js +0 -461
  172. package/dist/control-ui/js/settings.js +0 -909
  173. package/dist/control-ui/js/slash-autocomplete.js +0 -168
  174. package/dist/control-ui/js/subagents.js +0 -560
  175. package/dist/control-ui/js/utils.js +0 -29
  176. package/dist/control-ui/vendor/highlight.min.js +0 -2518
  177. package/dist/control-ui/vendor/marked.min.js +0 -69
@@ -1,3546 +0,0 @@
1
- /* ── Reset & Base ─────────────────────────────────────────────────── */
2
- *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
3
-
4
- :root {
5
- --bg: #07070f;
6
- --glass-bg: rgba(255,255,255,0.04);
7
- --glass-bg-hover: rgba(255,255,255,0.07);
8
- --glass-border: rgba(255,255,255,0.08);
9
- --glass-border-strong: rgba(255,255,255,0.14);
10
- --text: rgba(255,255,255,0.92);
11
- --text-muted: rgba(255,255,255,0.45);
12
- --text-dim: rgba(255,255,255,0.25);
13
- --accent-cyan: #00d4ff;
14
- --accent-purple: #8b5cf6;
15
- --accent-pink: #f472b6;
16
- --accent-green: #34d399;
17
- --accent-blue: #60a5fa;
18
- --shadow: 0 8px 32px rgba(0,0,0,0.5);
19
- --blur: blur(24px) saturate(160%);
20
- --font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
21
- --font-mono: 'JetBrains Mono', 'Fira Code', 'SF Mono', Consolas, monospace;
22
- }
23
-
24
- html, body {
25
- height: 100%;
26
- width: 100%;
27
- overflow: hidden;
28
- background: var(--bg);
29
- color: var(--text);
30
- font-family: var(--font);
31
- font-size: 13px;
32
- line-height: 1.5;
33
- -webkit-font-smoothing: antialiased;
34
- }
35
-
36
- /* ── Background ───────────────────────────────────────────────────── */
37
- .bg-orbs {
38
- position: fixed;
39
- inset: 0;
40
- pointer-events: none;
41
- z-index: 0;
42
- overflow: hidden;
43
- }
44
-
45
- .orb {
46
- position: absolute;
47
- border-radius: 50%;
48
- filter: blur(120px);
49
- opacity: 0.18;
50
- animation: drift 20s ease-in-out infinite alternate;
51
- }
52
-
53
- .orb-1 {
54
- width: 700px; height: 700px;
55
- background: radial-gradient(circle, var(--accent-cyan), transparent 70%);
56
- top: -200px; left: -150px;
57
- animation-duration: 25s;
58
- }
59
-
60
- .orb-2 {
61
- width: 600px; height: 600px;
62
- background: radial-gradient(circle, var(--accent-purple), transparent 70%);
63
- bottom: -100px; right: -100px;
64
- animation-duration: 30s;
65
- animation-delay: -8s;
66
- }
67
-
68
- .orb-3 {
69
- width: 500px; height: 500px;
70
- background: radial-gradient(circle, var(--accent-pink), transparent 70%);
71
- top: 40%; left: 45%;
72
- animation-duration: 22s;
73
- animation-delay: -4s;
74
- opacity: 0.1;
75
- }
76
-
77
- @keyframes drift {
78
- 0% { transform: translate(0, 0) scale(1); }
79
- 33% { transform: translate(60px, -40px) scale(1.05); }
80
- 66% { transform: translate(-40px, 60px) scale(0.95); }
81
- 100% { transform: translate(30px, 20px) scale(1.02); }
82
- }
83
-
84
- .bg-grid {
85
- position: fixed;
86
- inset: 0;
87
- z-index: 0;
88
- pointer-events: none;
89
- background-image:
90
- linear-gradient(rgba(255,255,255,0.015) 1px, transparent 1px),
91
- linear-gradient(90deg, rgba(255,255,255,0.015) 1px, transparent 1px);
92
- background-size: 48px 48px;
93
- mask-image: radial-gradient(ellipse 80% 80% at 50% 50%, black 40%, transparent 100%);
94
- }
95
-
96
- /* ── Glass Panel ──────────────────────────────────────────────────── */
97
- .glass-panel {
98
- position: relative;
99
- background: var(--glass-bg);
100
- backdrop-filter: var(--blur);
101
- -webkit-backdrop-filter: var(--blur);
102
- border: 1px solid var(--glass-border);
103
- border-radius: 14px;
104
- padding: 14px;
105
- box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.06);
106
- transition: border-color 0.3s, box-shadow 0.3s;
107
- }
108
-
109
- .glass-panel:hover {
110
- border-color: var(--glass-border-strong);
111
- box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.1), 0 0 0 1px rgba(0,212,255,0.05);
112
- }
113
-
114
- .glass-panel::before {
115
- content: '';
116
- position: absolute;
117
- inset: 0;
118
- border-radius: 16px;
119
- background: linear-gradient(135deg, rgba(255,255,255,0.04) 0%, transparent 60%);
120
- pointer-events: none;
121
- }
122
-
123
- .panel-sm { padding: 10px 12px; }
124
-
125
- .panel-label {
126
- font-size: 10px;
127
- font-family: var(--font-mono);
128
- font-weight: 600;
129
- letter-spacing: 0.18em;
130
- color: var(--accent-cyan);
131
- margin-bottom: 12px;
132
- opacity: 0.9;
133
- }
134
-
135
- /* ── Brand Panel ─────────────────────────────────────────────────── */
136
- .brand-panel {
137
- display: flex;
138
- align-items: center;
139
- gap: 14px;
140
- padding: 14px 16px;
141
- overflow: hidden;
142
- }
143
-
144
- .brand-panel::after {
145
- content: '';
146
- position: absolute;
147
- inset: 0;
148
- border-radius: 14px;
149
- background: linear-gradient(
150
- 120deg,
151
- rgba(0,212,255,0.06) 0%,
152
- rgba(139,92,246,0.06) 50%,
153
- rgba(0,212,255,0.03) 100%
154
- );
155
- pointer-events: none;
156
- }
157
-
158
- .brand-mark {
159
- flex-shrink: 0;
160
- width: 36px;
161
- height: 36px;
162
- border-radius: 10px;
163
- background: linear-gradient(135deg, rgba(0,212,255,0.15), rgba(139,92,246,0.15));
164
- border: 1px solid rgba(0,212,255,0.2);
165
- display: flex;
166
- align-items: center;
167
- justify-content: center;
168
- font-size: 16px;
169
- box-shadow: 0 0 16px rgba(0,212,255,0.1), inset 0 1px 0 rgba(255,255,255,0.1);
170
- }
171
-
172
- .brand-text {
173
- display: flex;
174
- flex-direction: column;
175
- gap: 2px;
176
- min-width: 0;
177
- }
178
-
179
- .brand-name {
180
- font-family: var(--font-mono);
181
- font-size: 18px;
182
- font-weight: 700;
183
- letter-spacing: 0.22em;
184
- background: linear-gradient(90deg, #00d4ff 0%, #a78bfa 60%, #00d4ff 120%);
185
- background-size: 200% auto;
186
- -webkit-background-clip: text;
187
- -webkit-text-fill-color: transparent;
188
- background-clip: text;
189
- animation: brand-shimmer 6s linear infinite;
190
- line-height: 1;
191
- }
192
-
193
- .brand-sub {
194
- font-family: var(--font-mono);
195
- font-size: 9px;
196
- letter-spacing: 0.16em;
197
- color: var(--text-dim);
198
- opacity: 0.6;
199
- text-transform: uppercase;
200
- }
201
-
202
- @keyframes brand-shimmer {
203
- 0% { background-position: 0% center; }
204
- 100% { background-position: 200% center; }
205
- }
206
-
207
- /* ── Metric Rows ──────────────────────────────────────────────────── */
208
- .metric-row {
209
- display: flex;
210
- align-items: center;
211
- gap: 8px;
212
- margin-bottom: 7px;
213
- }
214
-
215
- .metric-row:last-child { margin-bottom: 0; }
216
-
217
- .metric-name {
218
- font-family: var(--font-mono);
219
- font-size: 10px;
220
- color: var(--text-muted);
221
- width: 38px;
222
- flex-shrink: 0;
223
- }
224
-
225
- .metric-bar {
226
- flex: 1;
227
- height: 3px;
228
- background: rgba(255,255,255,0.08);
229
- border-radius: 99px;
230
- overflow: hidden;
231
- }
232
-
233
- .metric-fill {
234
- --accent: var(--accent-cyan);
235
- height: 100%;
236
- width: 0%;
237
- border-radius: 99px;
238
- background: var(--accent);
239
- box-shadow: 0 0 6px var(--accent);
240
- transition: width 1s cubic-bezier(0.4, 0, 0.2, 1);
241
- }
242
-
243
- .metric-val {
244
- font-family: var(--font-mono);
245
- font-size: 10px;
246
- color: var(--text-muted);
247
- width: 40px;
248
- text-align: right;
249
- flex-shrink: 0;
250
- }
251
-
252
- /* ── Network / Status Rows ────────────────────────────────────────── */
253
- .net-row {
254
- display: flex;
255
- align-items: center;
256
- gap: 7px;
257
- margin-bottom: 8px;
258
- min-height: 20px;
259
- }
260
- .net-row:last-child { margin-bottom: 0; }
261
-
262
- .net-name {
263
- font-size: 12px;
264
- color: var(--text);
265
- flex: 1;
266
- }
267
- .net-name.muted { color: var(--text-muted); }
268
-
269
- .net-ip {
270
- font-family: var(--font-mono);
271
- font-size: 11px;
272
- color: var(--text-muted);
273
- }
274
-
275
- .status-dot {
276
- width: 7px; height: 7px;
277
- border-radius: 50%;
278
- flex-shrink: 0;
279
- }
280
- .dot-green { background: var(--accent-green); box-shadow: 0 0 6px var(--accent-green); }
281
- .dot-blue { background: var(--accent-blue); box-shadow: 0 0 6px var(--accent-blue); }
282
- .dot-yellow { background: #fbbf24; box-shadow: 0 0 6px #fbbf24; }
283
-
284
- .pulse {
285
- animation: pulse-glow 2s ease-in-out infinite;
286
- }
287
- @keyframes pulse-glow {
288
- 0%, 100% { opacity: 1; box-shadow: 0 0 6px var(--accent-green); }
289
- 50% { opacity: 0.5; box-shadow: 0 0 12px var(--accent-green), 0 0 24px var(--accent-green); }
290
- }
291
-
292
- .divider {
293
- height: 1px;
294
- background: var(--glass-border);
295
- margin: 8px 0;
296
- }
297
-
298
- .badge {
299
- font-family: var(--font-mono);
300
- font-size: 9px;
301
- font-weight: 700;
302
- letter-spacing: 0.08em;
303
- padding: 2px 7px;
304
- border-radius: 99px;
305
- }
306
- .badge-green { background: rgba(52,211,153,0.12); color: var(--accent-green); border: 1px solid rgba(52,211,153,0.2); }
307
- .badge-blue { background: rgba(96,165,250,0.12); color: var(--accent-blue); border: 1px solid rgba(96,165,250,0.2); }
308
- .badge-cyan { background: rgba(0,212,255,0.10); color: var(--accent-cyan); border: 1px solid rgba(0,212,255,0.2); }
309
-
310
- /* ── Big Stats ────────────────────────────────────────────────────── */
311
- .big-stat {
312
- font-family: var(--font-mono);
313
- font-size: 15px;
314
- font-weight: 600;
315
- color: var(--text);
316
- letter-spacing: 0.02em;
317
- margin: 2px 0 2px;
318
- }
319
- .stat-sub {
320
- font-size: 10px;
321
- color: var(--text-dim);
322
- letter-spacing: 0.05em;
323
- }
324
-
325
- /* ── Model rows ───────────────────────────────────────────────────── */
326
- .model-row {
327
- display: flex;
328
- align-items: center;
329
- gap: 8px;
330
- margin-bottom: 8px;
331
- }
332
- .model-row:last-child { margin-bottom: 0; }
333
-
334
- .model-icon {
335
- font-size: 15px;
336
- color: var(--accent-cyan);
337
- flex-shrink: 0;
338
- text-shadow: 0 0 8px var(--accent-cyan);
339
- }
340
- .model-icon.dim { color: var(--text-dim); text-shadow: none; }
341
-
342
- .model-name {
343
- font-family: var(--font-mono);
344
- font-size: 12px;
345
- color: var(--text);
346
- }
347
- .model-name.dim { color: var(--text-dim); }
348
-
349
- .model-sub {
350
- font-size: 10px;
351
- color: var(--text-dim);
352
- letter-spacing: 0.06em;
353
- margin-top: 2px;
354
- }
355
-
356
- .active-model .model-name { color: var(--accent-cyan); }
357
-
358
- /* ── Model Select Dropdown ──────────────────────────────────────────── */
359
- .model-select-wrap {
360
- margin: 6px 0 4px;
361
- }
362
- .model-select {
363
- width: 100%;
364
- background: rgba(255,255,255,0.04);
365
- border: 1px solid var(--glass-border);
366
- border-radius: 6px;
367
- color: var(--text);
368
- font-family: var(--font-mono);
369
- font-size: 11px;
370
- padding: 5px 8px;
371
- cursor: pointer;
372
- outline: none;
373
- appearance: none;
374
- -webkit-appearance: none;
375
- }
376
- .model-select:hover {
377
- border-color: var(--accent-cyan);
378
- }
379
- .model-select:focus {
380
- border-color: var(--accent-cyan);
381
- box-shadow: 0 0 6px rgba(0,212,255,0.15);
382
- }
383
- .model-select optgroup {
384
- font-weight: 600;
385
- color: var(--text-muted);
386
- }
387
- .model-select option {
388
- background: #1a1a2e;
389
- color: var(--text);
390
- padding: 4px;
391
- }
392
-
393
- /* ── Agent Status Orb ─────────────────────────────────────────────── */
394
- .agent-status-panel { text-align: center; }
395
-
396
- .aso-orb-wrap {
397
- width: 120px;
398
- height: 120px;
399
- margin: 10px auto 14px;
400
- }
401
-
402
- .aso-svg {
403
- width: 100%;
404
- height: 100%;
405
- overflow: visible;
406
- }
407
-
408
- /* Orbit guide tracks — faint rings */
409
- .aso-track {
410
- fill: none;
411
- stroke: rgba(255,255,255,0.07);
412
- stroke-width: 1;
413
- }
414
-
415
- /* Arc segments */
416
- .aso-arc {
417
- fill: none;
418
- stroke: var(--aso-color);
419
- stroke-width: 1.8;
420
- stroke-linecap: round;
421
- filter: drop-shadow(0 0 3px var(--aso-color));
422
- }
423
- .aso-arc-dim { opacity: 0.5; }
424
-
425
- /* Core halo */
426
- .aso-core-halo {
427
- fill: var(--aso-color);
428
- opacity: 0.12;
429
- filter: blur(6px);
430
- }
431
-
432
- /* Core dot */
433
- .aso-core {
434
- fill: var(--aso-color);
435
- filter: drop-shadow(0 0 5px var(--aso-color));
436
- }
437
-
438
- /* Rotation groups — transform-origin at SVG center (50,50) */
439
- .aso-rot {
440
- transform-box: fill-box;
441
- transform-origin: center;
442
- }
443
-
444
- /* ── State: idle — slow cyan ── */
445
- #agent-status-panel[data-state="idle"] { --aso-color: rgba(0,212,255,0.75); }
446
- #agent-status-panel[data-state="idle"] .aso-rot1 { animation: aso-spin 8s linear infinite; }
447
- #agent-status-panel[data-state="idle"] .aso-rot2 { animation: aso-spin 13s linear infinite reverse; }
448
- #agent-status-panel[data-state="idle"] .aso-rot3 { animation: aso-spin 10s linear infinite; }
449
- #agent-status-panel[data-state="idle"] .aso-rot4 { animation: aso-spin 17s linear infinite reverse; }
450
- #agent-status-panel[data-state="idle"] .aso-rot5 { animation: aso-spin 12s linear infinite; }
451
- #agent-status-panel[data-state="idle"] .aso-core { animation: aso-breathe 3.5s ease-in-out infinite; }
452
-
453
- /* ── State: waiting — amber, a bit faster ── */
454
- #agent-status-panel[data-state="waiting"] { --aso-color: #f59e0b; }
455
- #agent-status-panel[data-state="waiting"] .aso-rot1 { animation: aso-spin 4s linear infinite; }
456
- #agent-status-panel[data-state="waiting"] .aso-rot2 { animation: aso-spin 6s linear infinite reverse; }
457
- #agent-status-panel[data-state="waiting"] .aso-rot3 { animation: aso-spin 5s linear infinite; }
458
- #agent-status-panel[data-state="waiting"] .aso-rot4 { animation: aso-spin 9s linear infinite reverse; }
459
- #agent-status-panel[data-state="waiting"] .aso-rot5 { animation: aso-spin 6s linear infinite; }
460
- #agent-status-panel[data-state="waiting"] .aso-core { animation: aso-pulse 1s ease-in-out infinite; }
461
-
462
- /* ── State: thinking — violet, fast spin ── */
463
- #agent-status-panel[data-state="thinking"] { --aso-color: #a78bfa; }
464
- #agent-status-panel[data-state="thinking"] .aso-rot1 { animation: aso-spin 1.1s linear infinite; }
465
- #agent-status-panel[data-state="thinking"] .aso-rot2 { animation: aso-spin 0.7s linear infinite reverse; }
466
- #agent-status-panel[data-state="thinking"] .aso-rot3 { animation: aso-spin 1.4s linear infinite; }
467
- #agent-status-panel[data-state="thinking"] .aso-rot4 { animation: aso-spin 0.5s linear infinite reverse; }
468
- #agent-status-panel[data-state="thinking"] .aso-rot5 { animation: aso-spin 1.8s linear infinite; }
469
- #agent-status-panel[data-state="thinking"] .aso-core { animation: aso-pulse 0.45s ease-in-out infinite; }
470
-
471
- /* ── State: streaming — green, medium flow ── */
472
- #agent-status-panel[data-state="streaming"] { --aso-color: #34d399; }
473
- #agent-status-panel[data-state="streaming"] .aso-rot1 { animation: aso-spin 2.2s linear infinite; }
474
- #agent-status-panel[data-state="streaming"] .aso-rot2 { animation: aso-spin 3.5s linear infinite reverse; }
475
- #agent-status-panel[data-state="streaming"] .aso-rot3 { animation: aso-spin 2.8s linear infinite; }
476
- #agent-status-panel[data-state="streaming"] .aso-rot4 { animation: aso-spin 4.5s linear infinite reverse; }
477
- #agent-status-panel[data-state="streaming"] .aso-rot5 { animation: aso-spin 3.2s linear infinite; }
478
- #agent-status-panel[data-state="streaming"] .aso-core { animation: aso-pulse 0.7s ease-in-out infinite; }
479
-
480
- /* ── State: done — brief flash, stays green ── */
481
- #agent-status-panel[data-state="done"] { --aso-color: #34d399; }
482
- #agent-status-panel[data-state="done"] .aso-rot1 { animation: aso-spin 0.4s linear infinite; }
483
- #agent-status-panel[data-state="done"] .aso-rot2 { animation: aso-spin 0.3s linear infinite reverse; }
484
- #agent-status-panel[data-state="done"] .aso-rot3 { animation: aso-spin 0.5s linear infinite; }
485
- #agent-status-panel[data-state="done"] .aso-rot4 { animation: aso-spin 0.25s linear infinite reverse; }
486
- #agent-status-panel[data-state="done"] .aso-rot5 { animation: aso-spin 0.6s linear infinite; }
487
- #agent-status-panel[data-state="done"] .aso-core { animation: aso-flash 0.4s ease-out forwards; }
488
-
489
- /* ERROR state — red/pink, irregular erratic pulse to signal distress */
490
- #agent-status-panel[data-state="error"] { --aso-color: #f87171; }
491
- #agent-status-panel[data-state="error"] .aso-rot1 { animation: aso-spin 2.1s linear infinite; }
492
- #agent-status-panel[data-state="error"] .aso-rot2 { animation: aso-spin 1.4s linear infinite reverse; }
493
- #agent-status-panel[data-state="error"] .aso-rot3 { animation: aso-spin 3.3s linear infinite; }
494
- #agent-status-panel[data-state="error"] .aso-rot4 { animation: aso-spin 1.8s linear infinite reverse; }
495
- #agent-status-panel[data-state="error"] .aso-rot5 { animation: aso-spin 2.7s linear infinite; }
496
- #agent-status-panel[data-state="error"] .aso-core { animation: aso-error-pulse 0.6s ease-in-out infinite; }
497
-
498
- @keyframes aso-error-pulse {
499
- 0%, 100% { opacity: 1; transform: scale(1); }
500
- 50% { opacity: 0.4; transform: scale(0.75); }
501
- }
502
-
503
- /* ── Run error bubble (failure message in the feed) ──────────────── */
504
- .run-error-bubble {
505
- display: flex;
506
- align-items: flex-start;
507
- gap: 10px;
508
- background: rgba(248, 113, 113, 0.06) !important;
509
- border-color: rgba(248, 113, 113, 0.25) !important;
510
- }
511
-
512
- .run-error-icon {
513
- font-size: 15px;
514
- flex-shrink: 0;
515
- margin-top: 1px;
516
- color: #f87171;
517
- filter: drop-shadow(0 0 4px rgba(248,113,113,0.5));
518
- }
519
-
520
- .run-error-text {
521
- color: #fca5a5 !important;
522
- font-size: 13px;
523
- line-height: 1.5;
524
- }
525
-
526
- /* Partial/failed stream bubble — dim to indicate incomplete */
527
- .stream-failed {
528
- opacity: 0.6;
529
- border-color: rgba(248,113,113,0.2) !important;
530
- }
531
- .stream-failed::after {
532
- content: ' [incomplete]';
533
- font-size: 11px;
534
- color: #f87171;
535
- font-family: var(--font-mono);
536
- opacity: 0.7;
537
- }
538
-
539
- /* ── Keyframes ── */
540
- @keyframes aso-spin {
541
- from { transform: rotate(0deg); }
542
- to { transform: rotate(360deg); }
543
- }
544
- @keyframes aso-breathe {
545
- 0%, 100% { transform: scale(1); opacity: 0.75; }
546
- 50% { transform: scale(1.45); opacity: 1; }
547
- }
548
- @keyframes aso-pulse {
549
- 0%, 100% { transform: scale(1); }
550
- 50% { transform: scale(1.6); }
551
- }
552
- @keyframes aso-flash {
553
- 0% { transform: scale(2.5); opacity: 1; }
554
- 60% { transform: scale(1.2); opacity: 1; }
555
- 100% { transform: scale(1); opacity: 1; }
556
- }
557
-
558
- /* ── Status label & sub-text ── */
559
- .aso-label {
560
- font-family: var(--font-mono);
561
- font-size: 11px;
562
- font-weight: 700;
563
- letter-spacing: 0.22em;
564
- color: var(--aso-color);
565
- margin-bottom: 5px;
566
- text-shadow: 0 0 8px var(--aso-color);
567
- transition: color 0.4s ease, text-shadow 0.4s ease;
568
- }
569
- .aso-sub {
570
- font-size: 10px;
571
- color: var(--text-dim);
572
- letter-spacing: 0.04em;
573
- }
574
-
575
- /* ── Layout columns ───────────────────────────────────────────────── */
576
- .metrics-col {
577
- position: fixed;
578
- top: 24px;
579
- bottom: 120px;
580
- width: 360px;
581
- display: flex;
582
- flex-direction: column;
583
- gap: 12px;
584
- z-index: 10;
585
- overflow-y: auto;
586
- scrollbar-width: none;
587
- padding-bottom: 8px;
588
- }
589
- .metrics-col::-webkit-scrollbar { display: none; }
590
-
591
- /* Anchor panels adjacent to the centered 740px chat column, 16px gap */
592
- .metrics-left { left: calc(50% - 370px - 16px - 360px); }
593
- .metrics-right { right: calc(50% - 370px - 16px - 360px); }
594
-
595
- /* ── Response Area ────────────────────────────────────────────────── */
596
- .response-area {
597
- position: fixed;
598
- top: 0;
599
- left: calc(50% - 370px);
600
- right: calc(50% - 370px);
601
- bottom: 150px;
602
- z-index: 5;
603
- display: flex;
604
- flex-direction: column;
605
- justify-content: flex-start;
606
- padding: 32px 0 16px;
607
- overflow-y: auto;
608
- overflow-x: hidden;
609
- pointer-events: none;
610
- }
611
-
612
- /* Constrain all response content to a readable column, centered */
613
- .response-area > * {
614
- width: 100%;
615
- max-width: 740px;
616
- margin-left: auto;
617
- margin-right: auto;
618
- flex-shrink: 0;
619
- pointer-events: auto;
620
- }
621
-
622
- /* ── Message Bubbles ──────────────────────────────────────────────── */
623
- .message {
624
- pointer-events: auto;
625
- width: 100%;
626
- max-width: 740px;
627
- margin-bottom: 16px;
628
- animation: waterfall 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards;
629
- opacity: 0;
630
- transform: translateY(-20px);
631
- /* Allow bubble to fit content — don't impose a forced width on the child */
632
- display: block;
633
- }
634
-
635
- @keyframes waterfall {
636
- to { opacity: 1; transform: translateY(0); }
637
- }
638
-
639
- .message.user-msg .bubble {
640
- background: rgba(0,212,255,0.07);
641
- border: 1px solid rgba(0,212,255,0.18);
642
- border-radius: 12px 12px 4px 12px;
643
- padding: 10px 14px;
644
- display: inline-block;
645
- float: right;
646
- max-width: 75%;
647
- backdrop-filter: blur(12px);
648
- color: var(--text);
649
- font-size: 14.5px;
650
- clear: both;
651
- }
652
-
653
- .message.symi-msg .bubble {
654
- background: var(--glass-bg);
655
- border: 1px solid var(--glass-border);
656
- border-radius: 4px 12px 12px 12px;
657
- padding: 12px 16px;
658
- backdrop-filter: var(--blur);
659
- -webkit-backdrop-filter: var(--blur);
660
- box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.04);
661
- font-size: 14.5px;
662
- line-height: 1.75;
663
- color: var(--text);
664
- position: relative;
665
- clear: both;
666
- display: inline-block;
667
- width: fit-content;
668
- max-width: 100%;
669
- box-sizing: border-box;
670
- overflow: visible;
671
- }
672
-
673
- .message.symi-msg .bubble::before {
674
- content: '';
675
- position: absolute;
676
- top: 0; left: 0; right: 0;
677
- height: 1px;
678
- background: linear-gradient(90deg, transparent, rgba(0,212,255,0.3), transparent);
679
- }
680
-
681
- .message-clearfix { clear: both; }
682
-
683
- .typing-cursor {
684
- display: inline-block;
685
- width: 2px;
686
- height: 1em;
687
- background: var(--accent-cyan);
688
- margin-left: 2px;
689
- vertical-align: text-bottom;
690
- animation: blink 1s step-end infinite;
691
- box-shadow: 0 0 4px var(--accent-cyan);
692
- }
693
- @keyframes blink {
694
- 0%, 100% { opacity: 1; }
695
- 50% { opacity: 0; }
696
- }
697
-
698
- /* ── Floating Prompt Bar ──────────────────────────────────────────── */
699
- .prompt-wrap {
700
- position: fixed;
701
- bottom: 28px;
702
- left: calc(50% - 370px);
703
- right: calc(50% - 370px);
704
- z-index: 20;
705
- display: flex;
706
- justify-content: center;
707
- }
708
-
709
- .prompt-bar {
710
- width: 100%;
711
- max-width: 720px;
712
- display: flex;
713
- flex-direction: column;
714
- gap: 10px;
715
- background: rgba(255,255,255,0.05);
716
- backdrop-filter: blur(32px) saturate(200%);
717
- -webkit-backdrop-filter: blur(32px) saturate(200%);
718
- border: 1px solid rgba(255,255,255,0.12);
719
- border-radius: 20px;
720
- padding: 14px 16px 12px;
721
- box-shadow:
722
- 0 0 0 1px rgba(0,212,255,0.08),
723
- 0 8px 40px rgba(0,0,0,0.6),
724
- 0 0 60px rgba(0,212,255,0.04),
725
- inset 0 1px 0 rgba(255,255,255,0.08);
726
- transition: border-color 0.3s, box-shadow 0.3s;
727
- cursor: text;
728
- }
729
-
730
- /* ── Prompt rows ──────────────────────────────────────────────────── */
731
- .prompt-row-main {
732
- display: flex;
733
- align-items: center;
734
- gap: 12px;
735
- width: 100%;
736
- }
737
-
738
- .prompt-row-actions {
739
- display: flex;
740
- align-items: center;
741
- justify-content: flex-end;
742
- gap: 8px;
743
- width: 100%;
744
- padding-top: 2px;
745
- border-top: 1px solid rgba(255,255,255,0.05);
746
- }
747
-
748
- .prompt-bar:focus-within {
749
- border-color: rgba(0,212,255,0.3);
750
- box-shadow:
751
- 0 0 0 1px rgba(0,212,255,0.15),
752
- 0 8px 40px rgba(0,0,0,0.6),
753
- 0 0 80px rgba(0,212,255,0.08),
754
- inset 0 1px 0 rgba(255,255,255,0.1);
755
- }
756
-
757
- .prompt-icon {
758
- color: var(--accent-cyan);
759
- opacity: 0.7;
760
- flex-shrink: 0;
761
- display: flex;
762
- align-items: center;
763
- filter: drop-shadow(0 0 4px var(--accent-cyan));
764
- }
765
-
766
- .prompt-bar textarea {
767
- flex: 1;
768
- background: transparent;
769
- border: none;
770
- outline: none;
771
- color: var(--text);
772
- font-family: var(--font);
773
- font-size: 14px;
774
- line-height: 1.55;
775
- letter-spacing: 0.01em;
776
- caret-color: var(--accent-cyan);
777
- resize: none;
778
- overflow-y: hidden;
779
- min-height: 22px;
780
- max-height: calc(3 * 1.55 * 14px); /* 3 lines */
781
- padding: 0;
782
- margin: 0;
783
- display: block;
784
- scrollbar-width: none;
785
- }
786
-
787
- .prompt-bar textarea::-webkit-scrollbar { display: none; }
788
-
789
- .prompt-bar textarea::placeholder {
790
- color: var(--text-dim);
791
- }
792
-
793
- .send-btn {
794
- background: rgba(0,212,255,0.12);
795
- border: 1px solid rgba(0,212,255,0.2);
796
- border-radius: 50%;
797
- width: 32px;
798
- height: 32px;
799
- display: flex;
800
- align-items: center;
801
- justify-content: center;
802
- color: var(--accent-cyan);
803
- cursor: pointer;
804
- flex-shrink: 0;
805
- transition: background 0.2s, transform 0.15s, box-shadow 0.2s;
806
- }
807
-
808
- .send-btn:hover {
809
- background: rgba(0,212,255,0.22);
810
- box-shadow: 0 0 16px rgba(0,212,255,0.25);
811
- transform: scale(1.05);
812
- }
813
-
814
- .send-btn:active {
815
- transform: scale(0.95);
816
- }
817
-
818
- /* ── New Session Button ───────────────────────────────────────────── */
819
- .prompt-divider {
820
- width: 1px;
821
- height: 18px;
822
- background: rgba(255,255,255,0.08);
823
- flex-shrink: 0;
824
- }
825
-
826
- .new-session-btn {
827
- display: flex;
828
- align-items: center;
829
- gap: 5px;
830
- background: rgba(139,92,246,0.1);
831
- border: 1px solid rgba(139,92,246,0.2);
832
- border-radius: 8px;
833
- padding: 0 11px;
834
- height: 28px;
835
- color: rgba(139,92,246,0.85);
836
- cursor: pointer;
837
- flex-shrink: 0;
838
- transition: background 0.2s, box-shadow 0.2s, transform 0.15s, opacity 0.2s;
839
- }
840
-
841
- .new-session-btn:hover {
842
- background: rgba(139,92,246,0.2);
843
- box-shadow: 0 0 16px rgba(139,92,246,0.2);
844
- transform: scale(1.03);
845
- }
846
-
847
- .new-session-btn:active {
848
- transform: scale(0.96);
849
- }
850
-
851
- .new-session-btn:disabled {
852
- opacity: 0.3;
853
- cursor: not-allowed;
854
- transform: none;
855
- }
856
-
857
- .new-session-label {
858
- font-family: var(--font-mono);
859
- font-size: 11px;
860
- letter-spacing: 0.08em;
861
- font-weight: 600;
862
- }
863
-
864
- /* ── New Session Cleared State ───────────────────────────────────── */
865
- .session-cleared {
866
- display: flex;
867
- flex-direction: column;
868
- align-items: center;
869
- justify-content: center;
870
- gap: 10px;
871
- padding: 60px 20px;
872
- opacity: 0;
873
- animation: session-cleared-in 0.5s ease forwards;
874
- }
875
-
876
- .session-cleared-icon {
877
- font-size: 28px;
878
- opacity: 0.3;
879
- }
880
-
881
- .session-cleared-text {
882
- font-family: var(--font-mono);
883
- font-size: 12px;
884
- letter-spacing: 0.12em;
885
- color: var(--text-dim);
886
- opacity: 0.5;
887
- }
888
-
889
- @keyframes session-cleared-in {
890
- from { opacity: 0; transform: translateY(8px); }
891
- to { opacity: 1; transform: translateY(0); }
892
- }
893
-
894
- /* ── Thinking Bubble ──────────────────────────────────────────────── */
895
- .thinking-bubble {
896
- background: rgba(0,212,255,0.04) !important;
897
- border-color: rgba(0,212,255,0.15) !important;
898
- padding: 10px 16px !important;
899
- }
900
-
901
- .think-header {
902
- display: flex;
903
- align-items: center;
904
- gap: 10px;
905
- margin-bottom: 8px;
906
- }
907
-
908
- .think-badge {
909
- font-family: var(--font-mono);
910
- font-size: 9px;
911
- font-weight: 700;
912
- letter-spacing: 0.15em;
913
- color: var(--accent-cyan);
914
- text-shadow: 0 0 8px var(--accent-cyan);
915
- }
916
-
917
- .think-dots span {
918
- display: inline-block;
919
- color: var(--accent-cyan);
920
- animation: dot-pulse 1.2s ease-in-out infinite;
921
- font-size: 14px;
922
- opacity: 0;
923
- }
924
- .think-dots span:nth-child(1) { animation-delay: 0s; }
925
- .think-dots span:nth-child(2) { animation-delay: 0.2s; }
926
- .think-dots span:nth-child(3) { animation-delay: 0.4s; }
927
-
928
- @keyframes dot-pulse {
929
- 0%, 100% { opacity: 0; transform: translateY(0); }
930
- 50% { opacity: 1; transform: translateY(-3px); }
931
- }
932
-
933
- .think-bar-wrap {
934
- height: 2px;
935
- background: rgba(255,255,255,0.06);
936
- border-radius: 99px;
937
- overflow: hidden;
938
- }
939
-
940
- .think-bar {
941
- height: 100%;
942
- width: 0%;
943
- background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
944
- border-radius: 99px;
945
- animation: think-scan 1s ease-in-out infinite;
946
- }
947
-
948
- @keyframes think-scan {
949
- 0% { width: 0%; margin-left: 0%; opacity: 1; }
950
- 50% { width: 60%; margin-left: 20%; opacity: 1; }
951
- 100% { width: 0%; margin-left: 100%; opacity: 0; }
952
- }
953
-
954
- /* ── Streaming Bubble ─────────────────────────────────────────────── */
955
- .stream-bubble {
956
- position: relative;
957
- }
958
-
959
- .stream-bubble.streaming {
960
- width: 100% !important;
961
- border-color: rgba(0,212,255,0.25) !important;
962
- box-shadow:
963
- 0 8px 32px rgba(0,0,0,0.5),
964
- 0 0 20px rgba(0,212,255,0.06),
965
- inset 0 1px 0 rgba(255,255,255,0.06) !important;
966
- animation: stream-pulse 1.8s ease-in-out infinite;
967
- }
968
-
969
- @keyframes stream-pulse {
970
- 0%, 100% { box-shadow: 0 8px 32px rgba(0,0,0,0.5), 0 0 20px rgba(0,212,255,0.06), inset 0 1px 0 rgba(255,255,255,0.06); }
971
- 50% { box-shadow: 0 8px 32px rgba(0,0,0,0.5), 0 0 40px rgba(0,212,255,0.12), inset 0 1px 0 rgba(255,255,255,0.06); }
972
- }
973
-
974
- .stream-bubble.streaming::after {
975
- content: '';
976
- position: absolute;
977
- top: 0; left: 0; right: 0;
978
- height: 1px;
979
- background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
980
- opacity: 0.6;
981
- animation: top-scan 2s linear infinite;
982
- }
983
-
984
- @keyframes top-scan {
985
- 0% { transform: scaleX(0); transform-origin: left; opacity: 0.8; }
986
- 50% { transform: scaleX(1); transform-origin: left; opacity: 0.6; }
987
- 100% { transform: scaleX(0); transform-origin: right; opacity: 0; }
988
- }
989
-
990
- .stream-bubble.done {
991
- width: fit-content;
992
- max-width: 100%;
993
- border-color: rgba(255,255,255,0.1) !important;
994
- transition: border-color 0.8s, box-shadow 0.8s, width 0.3s ease;
995
- }
996
-
997
- /* ── Character spawn animation ────────────────────────────────────── */
998
- .char-spawn {
999
- display: inline;
1000
- color: transparent;
1001
- text-shadow: none;
1002
- transition: color 0.12s ease, text-shadow 0.2s ease;
1003
- }
1004
-
1005
- .char-spawn.char-visible {
1006
- color: var(--text);
1007
- text-shadow: 0 0 8px rgba(0,212,255,0.4);
1008
- animation: char-settle 0.4s ease forwards;
1009
- }
1010
-
1011
- @keyframes char-settle {
1012
- 0% { color: var(--accent-cyan); text-shadow: 0 0 12px var(--accent-cyan), 0 0 24px rgba(0,212,255,0.3); }
1013
- 40% { color: rgba(200,240,255,0.95); text-shadow: 0 0 6px rgba(0,212,255,0.2); }
1014
- 100% { color: var(--text); text-shadow: none; }
1015
- }
1016
-
1017
- /* ── Telemetry footer ─────────────────────────────────────────────── */
1018
- .telemetry {
1019
- display: flex;
1020
- align-items: center;
1021
- gap: 6px;
1022
- margin-top: 10px;
1023
- padding-top: 8px;
1024
- border-top: 1px solid rgba(255,255,255,0.05);
1025
- opacity: 0;
1026
- transform: translateY(4px);
1027
- transition: opacity 0.5s ease 0.2s, transform 0.5s ease 0.2s;
1028
- }
1029
-
1030
- .telemetry.tele-visible {
1031
- opacity: 1;
1032
- transform: translateY(0);
1033
- }
1034
-
1035
- .tele-item {
1036
- font-family: var(--font-mono);
1037
- font-size: 9px;
1038
- color: var(--text-dim);
1039
- letter-spacing: 0.06em;
1040
- }
1041
-
1042
- .tele-sep {
1043
- color: rgba(255,255,255,0.12);
1044
- font-size: 9px;
1045
- }
1046
-
1047
- /* ── Send button loading state ────────────────────────────────────── */
1048
- .send-btn.btn-loading {
1049
- animation: btn-spin 1s linear infinite;
1050
- }
1051
- @keyframes btn-spin {
1052
- to { transform: rotate(360deg); }
1053
- }
1054
-
1055
- /* ── Connection status ────────────────────────────────────────────── */
1056
- .conn-status {
1057
- position: fixed;
1058
- top: 16px;
1059
- left: 50%;
1060
- transform: translateX(-50%);
1061
- z-index: 30;
1062
- display: flex;
1063
- align-items: center;
1064
- gap: 7px;
1065
- background: var(--glass-bg);
1066
- backdrop-filter: var(--blur);
1067
- -webkit-backdrop-filter: var(--blur);
1068
- border: 1px solid var(--glass-border);
1069
- border-radius: 99px;
1070
- padding: 5px 12px;
1071
- pointer-events: none;
1072
- }
1073
-
1074
- .conn-label {
1075
- font-family: var(--font-mono);
1076
- font-size: 9px;
1077
- letter-spacing: 0.1em;
1078
- color: var(--text-dim);
1079
- }
1080
-
1081
- .dot-red { background: #f87171; box-shadow: 0 0 6px #f87171; }
1082
-
1083
- /* ── UI Toggle button ─────────────────────────────────────────────── */
1084
- .ui-toggle {
1085
- position: fixed;
1086
- top: 16px;
1087
- right: 24px;
1088
- z-index: 30;
1089
- display: flex;
1090
- align-items: center;
1091
- gap: 7px;
1092
- background: var(--glass-bg);
1093
- backdrop-filter: var(--blur);
1094
- -webkit-backdrop-filter: var(--blur);
1095
- border: 1px solid var(--glass-border);
1096
- border-radius: 99px;
1097
- padding: 6px 14px;
1098
- color: var(--text-muted);
1099
- font-size: 11px;
1100
- font-family: var(--font-mono);
1101
- letter-spacing: 0.05em;
1102
- text-decoration: none;
1103
- transition: border-color 0.2s, color 0.2s, box-shadow 0.2s;
1104
- }
1105
-
1106
- .ui-toggle:hover {
1107
- border-color: var(--glass-border-strong);
1108
- color: var(--text);
1109
- box-shadow: 0 0 16px rgba(0,212,255,0.08);
1110
- }
1111
-
1112
- /* ── Scrollbar ────────────────────────────────────────────────────── */
1113
- .response-area::-webkit-scrollbar { display: none; }
1114
- .response-area { scrollbar-width: none; }
1115
-
1116
- /* ═══════════════════════════════════════════════════════════════════
1117
- CONTENT TYPES — Markdown, Thinking, Tool Cards, Code
1118
- ═══════════════════════════════════════════════════════════════════ */
1119
-
1120
- /* ── Markdown prose ────────────────────────────────────────────────── */
1121
- .msg-text {
1122
- font-size: 14.5px;
1123
- line-height: 1.75;
1124
- color: var(--text);
1125
- word-wrap: break-word;
1126
- overflow-wrap: anywhere;
1127
- word-break: break-word;
1128
- }
1129
-
1130
- /* Paragraph spacing */
1131
- .msg-text :where(p, ul, ol, pre, blockquote, table) { margin: 0; }
1132
- .msg-text :where(p + p,
1133
- p + ul, p + ol, p + pre, p + blockquote, p + table,
1134
- ul + p, ol + p, pre + p, blockquote + p, table + p) { margin-top: 0.75em; }
1135
- .msg-text :where(li + li) { margin-top: 0.25em; }
1136
-
1137
- /* Headings */
1138
- .msg-text :where(h1, h2, h3, h4, h5, h6) {
1139
- font-weight: 600;
1140
- line-height: 1.3;
1141
- color: rgba(255,255,255,0.96);
1142
- margin: 1.1em 0 0.4em;
1143
- }
1144
- .msg-text :where(h1) { font-size: 1.35em; border-bottom: 1px solid var(--glass-border); padding-bottom: 0.3em; }
1145
- .msg-text :where(h2) { font-size: 1.18em; border-bottom: 1px solid rgba(255,255,255,0.05); padding-bottom: 0.2em; }
1146
- .msg-text :where(h3) { font-size: 1.06em; }
1147
- .msg-text :where(h4, h5, h6) { font-size: 1em; color: rgba(255,255,255,0.8); }
1148
- .msg-text :where(h1, h2, h3, h4, h5, h6):first-child { margin-top: 0.3em; }
1149
-
1150
- /* Lists */
1151
- .msg-text :where(ul, ol) { padding-left: 1.4em; }
1152
- .msg-text :where(ul) { list-style-type: disc; }
1153
- .msg-text :where(ol) { list-style-type: decimal; }
1154
- .msg-text :where(ul ul) { list-style-type: circle; margin-top: 0.25em; }
1155
-
1156
- /* Text formatting */
1157
- .msg-text :where(strong) { font-weight: 600; color: rgba(255,255,255,0.97); }
1158
- .msg-text :where(em) { font-style: italic; color: rgba(255,255,255,0.82); }
1159
- .msg-text :where(del) { text-decoration: line-through; opacity: 0.6; }
1160
- .msg-text :where(mark) { background: rgba(251,191,36,0.2); color: #fbbf24; border-radius: 2px; padding: 0 3px; }
1161
- .msg-text :where(sup) { font-size: 0.75em; vertical-align: super; }
1162
- .msg-text :where(sub) { font-size: 0.75em; vertical-align: sub; }
1163
-
1164
- /* Links */
1165
- .msg-text :where(a) { color: var(--accent-cyan); text-decoration: none; border-bottom: 1px solid rgba(0,212,255,0.3); }
1166
- .msg-text :where(a:hover) { border-bottom-color: var(--accent-cyan); }
1167
-
1168
- /* Horizontal rule */
1169
- .msg-text :where(hr) {
1170
- border: none;
1171
- border-top: 1px solid var(--glass-border);
1172
- margin: 1em 0;
1173
- }
1174
-
1175
- /* Blockquote */
1176
- .msg-text :where(blockquote) {
1177
- border-left: 2px solid rgba(0,212,255,0.3);
1178
- margin: 0.6em 0;
1179
- padding: 6px 14px;
1180
- background: rgba(0,212,255,0.03);
1181
- color: var(--text-muted);
1182
- border-radius: 0 6px 6px 0;
1183
- }
1184
- .msg-text :where(blockquote blockquote) {
1185
- border-left-color: rgba(139,92,246,0.4);
1186
- background: rgba(139,92,246,0.03);
1187
- margin-top: 6px;
1188
- }
1189
-
1190
- /* ── Tables ─────────────────────────────────────────────────────────── */
1191
- .msg-text :where(table) {
1192
- width: 100%;
1193
- border-collapse: collapse;
1194
- font-size: 13px;
1195
- margin-top: 0.75em;
1196
- border: 1px solid var(--glass-border);
1197
- border-radius: 8px;
1198
- overflow: hidden;
1199
- }
1200
-
1201
- .msg-text :where(thead) {
1202
- background: rgba(0,212,255,0.06);
1203
- }
1204
-
1205
- .msg-text :where(th) {
1206
- font-family: var(--font-mono);
1207
- font-size: 10.5px;
1208
- font-weight: 600;
1209
- letter-spacing: 0.08em;
1210
- text-transform: uppercase;
1211
- color: var(--accent-cyan);
1212
- border: 1px solid var(--glass-border);
1213
- padding: 8px 12px;
1214
- text-align: left;
1215
- background: rgba(0,0,0,0.15);
1216
- }
1217
-
1218
- .msg-text :where(td) {
1219
- border: 1px solid var(--glass-border);
1220
- padding: 7px 12px;
1221
- vertical-align: top;
1222
- color: var(--text);
1223
- line-height: 1.5;
1224
- }
1225
-
1226
- .msg-text :where(tr:nth-child(even) td) {
1227
- background: rgba(255,255,255,0.015);
1228
- }
1229
-
1230
- .msg-text :where(tr:hover td) {
1231
- background: rgba(0,212,255,0.03);
1232
- }
1233
-
1234
- /* ── Inline code ────────────────────────────────────────────────────── */
1235
- .inline-code,
1236
- .msg-text :where(:not(pre) > code) {
1237
- font-family: var(--font-mono);
1238
- font-size: 0.875em;
1239
- background: rgba(255,255,255,0.08);
1240
- border: 1px solid rgba(255,255,255,0.1);
1241
- border-radius: 4px;
1242
- padding: 0.1em 0.4em;
1243
- color: var(--accent-cyan);
1244
- }
1245
-
1246
- /* ── Code blocks — full-featured ────────────────────────────────────── */
1247
- .code-block {
1248
- margin: 0.75em 0;
1249
- border: 1px solid var(--glass-border);
1250
- border-radius: 10px;
1251
- overflow: hidden;
1252
- background: rgba(0,0,0,0.45);
1253
- font-family: var(--font-mono);
1254
- }
1255
-
1256
- /* Full-width breakout — code gets the whole column regardless of bubble */
1257
- .code-block-full {
1258
- width: 100%;
1259
- max-width: 100%;
1260
- }
1261
-
1262
- /* ── Header ── */
1263
- .code-header {
1264
- display: flex;
1265
- align-items: center;
1266
- justify-content: space-between;
1267
- padding: 7px 12px;
1268
- background: rgba(255,255,255,0.04);
1269
- border-bottom: 1px solid var(--glass-border);
1270
- gap: 10px;
1271
- }
1272
-
1273
- .code-header-left { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; }
1274
- .code-header-right { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
1275
-
1276
- /* Language badge with per-language color */
1277
- .code-lang-badge {
1278
- font-family: var(--font-mono);
1279
- font-size: 10px;
1280
- font-weight: 700;
1281
- letter-spacing: 0.06em;
1282
- text-transform: uppercase;
1283
- color: var(--lang-color, var(--accent-cyan));
1284
- display: flex;
1285
- align-items: center;
1286
- gap: 2px;
1287
- flex-shrink: 0;
1288
- text-shadow: 0 0 8px var(--lang-color, var(--accent-cyan));
1289
- }
1290
-
1291
- /* Filename */
1292
- .code-filename {
1293
- font-family: var(--font-mono);
1294
- font-size: 11px;
1295
- color: var(--text-muted);
1296
- background: rgba(255,255,255,0.05);
1297
- border: 1px solid var(--glass-border);
1298
- border-radius: 4px;
1299
- padding: 1px 7px;
1300
- white-space: nowrap;
1301
- overflow: hidden;
1302
- text-overflow: ellipsis;
1303
- max-width: 200px;
1304
- }
1305
-
1306
- /* Line count */
1307
- .code-lines-count {
1308
- font-family: var(--font-mono);
1309
- font-size: 9.5px;
1310
- color: var(--text-dim);
1311
- white-space: nowrap;
1312
- }
1313
-
1314
- /* Expand button */
1315
- .code-expand-btn {
1316
- font-size: 14px;
1317
- background: transparent;
1318
- border: none;
1319
- color: var(--text-dim);
1320
- cursor: pointer;
1321
- padding: 0 4px;
1322
- line-height: 1;
1323
- transition: color 0.2s;
1324
- }
1325
- .code-expand-btn:hover { color: var(--text); }
1326
-
1327
- /* Copy button */
1328
- .code-copy {
1329
- display: flex;
1330
- align-items: center;
1331
- gap: 5px;
1332
- font-family: var(--font-mono);
1333
- font-size: 10px;
1334
- color: var(--text-dim);
1335
- background: transparent;
1336
- border: none;
1337
- cursor: pointer;
1338
- padding: 3px 8px;
1339
- border-radius: 4px;
1340
- transition: color 0.2s, background 0.2s;
1341
- white-space: nowrap;
1342
- }
1343
- .code-copy:hover { color: var(--text); background: rgba(255,255,255,0.06); }
1344
- .code-copy.copied { color: var(--accent-green); }
1345
-
1346
- /* ── Code body ── */
1347
- .code-body { overflow: hidden; }
1348
- .code-body-collapsed { max-height: 400px; overflow: hidden; position: relative; }
1349
- .code-body-collapsed::after {
1350
- content: '';
1351
- position: absolute;
1352
- bottom: 0; left: 0; right: 0;
1353
- height: 80px;
1354
- background: linear-gradient(to bottom, transparent, rgba(0,0,0,0.8));
1355
- pointer-events: none;
1356
- }
1357
- .code-expanded .code-body-collapsed { max-height: none; overflow: auto; }
1358
- .code-expanded .code-body-collapsed::after { display: none; }
1359
-
1360
- /* Show more button */
1361
- .code-show-more {
1362
- display: block;
1363
- width: 100%;
1364
- padding: 8px;
1365
- background: rgba(255,255,255,0.03);
1366
- border: none;
1367
- border-top: 1px solid var(--glass-border);
1368
- color: var(--text-dim);
1369
- font-family: var(--font-mono);
1370
- font-size: 10px;
1371
- cursor: pointer;
1372
- letter-spacing: 0.06em;
1373
- transition: background 0.2s, color 0.2s;
1374
- text-align: center;
1375
- }
1376
- .code-show-more:hover { background: rgba(255,255,255,0.06); color: var(--text); }
1377
-
1378
- /* ── Line numbers ── */
1379
- .code-pre {
1380
- margin: 0;
1381
- padding: 12px 0;
1382
- overflow-x: auto;
1383
- font-size: 12.5px;
1384
- line-height: 1.65;
1385
- }
1386
-
1387
- .code-numbered { display: block; }
1388
-
1389
- .code-line {
1390
- display: flex;
1391
- min-height: 1.65em;
1392
- }
1393
-
1394
- .code-line:hover { background: rgba(255,255,255,0.03); }
1395
-
1396
- .line-num {
1397
- display: inline-block;
1398
- min-width: 44px;
1399
- padding: 0 12px 0 14px;
1400
- color: rgba(255,255,255,0.2);
1401
- text-align: right;
1402
- user-select: none;
1403
- border-right: 1px solid rgba(255,255,255,0.06);
1404
- flex-shrink: 0;
1405
- font-size: 11px;
1406
- line-height: inherit;
1407
- }
1408
-
1409
- .line-content {
1410
- display: inline-block;
1411
- padding: 0 16px;
1412
- white-space: pre;
1413
- flex: 1;
1414
- }
1415
-
1416
- .hljs { background: transparent !important; padding: 0 !important; }
1417
-
1418
- /* ── Thinking block ─────────────────────────────────────────────────── */
1419
- .msg-thinking { margin: 4px 0 8px; }
1420
-
1421
- .thinking-toggle {
1422
- display: flex;
1423
- align-items: center;
1424
- gap: 7px;
1425
- background: transparent;
1426
- border: none;
1427
- cursor: pointer;
1428
- padding: 4px 0;
1429
- color: var(--text-dim);
1430
- font-size: 11px;
1431
- font-family: var(--font-mono);
1432
- letter-spacing: 0.05em;
1433
- transition: color 0.2s;
1434
- }
1435
- .thinking-toggle:hover { color: var(--text-muted); }
1436
- .thinking-icon { color: var(--accent-purple); }
1437
- .thinking-chevron { font-size: 9px; transition: transform 0.2s; }
1438
-
1439
- .thinking-body {
1440
- max-height: 0;
1441
- overflow: hidden;
1442
- transition: max-height 0.35s ease;
1443
- }
1444
- .thinking-body.thinking-open { max-height: 600px; overflow-y: auto; }
1445
-
1446
- .thinking-text {
1447
- margin-top: 6px;
1448
- padding: 10px 14px;
1449
- border: 1px dashed rgba(139,92,246,0.25);
1450
- border-radius: 8px;
1451
- background: rgba(139,92,246,0.04);
1452
- font-size: 12px;
1453
- line-height: 1.65;
1454
- color: var(--text-muted);
1455
- white-space: pre-wrap;
1456
- font-family: var(--font-mono);
1457
- }
1458
-
1459
- /* ── Tool call card ─────────────────────────────────────────────────── */
1460
- .msg-tool-card {
1461
- margin: 4px 0;
1462
- border: 1px solid var(--glass-border);
1463
- border-radius: 8px;
1464
- overflow: hidden;
1465
- background: rgba(255,255,255,0.02);
1466
- }
1467
-
1468
- .tool-header {
1469
- display: flex;
1470
- align-items: center;
1471
- gap: 8px;
1472
- width: 100%;
1473
- padding: 8px 12px;
1474
- background: transparent;
1475
- border: none;
1476
- cursor: pointer;
1477
- text-align: left;
1478
- color: var(--text-muted);
1479
- font-size: 12px;
1480
- transition: background 0.2s;
1481
- }
1482
- .tool-header:hover { background: rgba(255,255,255,0.03); }
1483
- .tool-icon { font-size: 13px; flex-shrink: 0; }
1484
- .tool-name { flex: 1; font-family: var(--font-mono); font-size: 11px; color: var(--text); }
1485
- .tool-chevron { font-size: 9px; color: var(--text-dim); }
1486
-
1487
- .tool-body {
1488
- max-height: 0;
1489
- overflow: hidden;
1490
- transition: max-height 0.3s ease;
1491
- border-top: 0 solid var(--glass-border);
1492
- }
1493
- .tool-body.tool-open { max-height: 320px; overflow-y: auto; border-top-width: 1px; }
1494
-
1495
- .tool-input {
1496
- margin: 0;
1497
- padding: 10px 14px;
1498
- font-family: var(--font-mono);
1499
- font-size: 11.5px;
1500
- line-height: 1.5;
1501
- color: var(--text-muted);
1502
- white-space: pre-wrap;
1503
- word-break: break-all;
1504
- background: rgba(0,0,0,0.25);
1505
- }
1506
-
1507
- /* ── Tool result ────────────────────────────────────────────────────── */
1508
- .msg-tool-result {
1509
- margin: 2px 0 6px;
1510
- border: 1px solid rgba(52,211,153,0.14);
1511
- border-radius: 8px;
1512
- overflow: hidden;
1513
- background: rgba(52,211,153,0.02);
1514
- }
1515
-
1516
- .result-header {
1517
- display: flex;
1518
- align-items: center;
1519
- gap: 8px;
1520
- padding: 6px 12px;
1521
- font-size: 11px;
1522
- color: var(--text-dim);
1523
- }
1524
- .result-icon { color: var(--accent-green); font-size: 12px; }
1525
- .result-label { font-family: var(--font-mono); letter-spacing: 0.06em; flex: 1; }
1526
-
1527
- .result-expand {
1528
- font-family: var(--font-mono);
1529
- font-size: 9px;
1530
- background: transparent;
1531
- border: 1px solid var(--glass-border);
1532
- border-radius: 4px;
1533
- color: var(--text-dim);
1534
- cursor: pointer;
1535
- padding: 2px 8px;
1536
- transition: color 0.2s;
1537
- }
1538
- .result-expand:hover { color: var(--text); }
1539
-
1540
- .result-preview { max-height: 0; overflow: hidden; transition: max-height 0.3s ease; border-top: 0 solid rgba(52,211,153,0.14); }
1541
- .result-open { max-height: 260px; overflow-y: auto; border-top-width: 1px; }
1542
-
1543
- .result-text {
1544
- margin: 0;
1545
- padding: 8px 14px;
1546
- font-family: var(--font-mono);
1547
- font-size: 11.5px;
1548
- line-height: 1.5;
1549
- color: var(--text-muted);
1550
- white-space: pre-wrap;
1551
- word-break: break-all;
1552
- background: rgba(0,0,0,0.2);
1553
- }
1554
-
1555
- /* ── Message image ──────────────────────────────────────────────────── */
1556
- .msg-image img {
1557
- max-width: 100%;
1558
- border-radius: 8px;
1559
- border: 1px solid var(--glass-border);
1560
- margin: 4px 0;
1561
- }
1562
-
1563
- /* ── Copy button ────────────────────────────────────────────────────── */
1564
- .msg-copy-btn {
1565
- position: absolute;
1566
- top: 8px;
1567
- right: 8px;
1568
- background: rgba(255,255,255,0.06);
1569
- border: 1px solid var(--glass-border);
1570
- border-radius: 6px;
1571
- color: var(--text-dim);
1572
- cursor: pointer;
1573
- padding: 5px 6px;
1574
- opacity: 0;
1575
- transition: opacity 0.2s, color 0.2s, background 0.2s;
1576
- display: flex;
1577
- align-items: center;
1578
- line-height: 1;
1579
- }
1580
- .stream-bubble:hover .msg-copy-btn,
1581
- .msg-copy-visible { opacity: 1; }
1582
- .msg-copy-btn:hover { color: var(--text); background: rgba(255,255,255,0.1); }
1583
- .msg-copy-btn.copied { color: var(--accent-green); }
1584
-
1585
- /* ── Timestamp ──────────────────────────────────────────────────────── */
1586
- .msg-timestamp {
1587
- font-family: var(--font-mono);
1588
- font-size: 9.5px;
1589
- color: var(--text-dim);
1590
- margin-top: 10px;
1591
- letter-spacing: 0.05em;
1592
- }
1593
-
1594
-
1595
- /* ── Task lists ─────────────────────────────────────────────────────── */
1596
- .msg-text :where(li.task-item) {
1597
- list-style: none;
1598
- margin-left: -1.4em;
1599
- padding-left: 0.2em;
1600
- display: flex;
1601
- align-items: baseline;
1602
- gap: 7px;
1603
- }
1604
-
1605
- .task-cb {
1606
- appearance: none;
1607
- -webkit-appearance: none;
1608
- width: 14px;
1609
- height: 14px;
1610
- border: 1.5px solid var(--glass-border-strong);
1611
- border-radius: 3px;
1612
- background: transparent;
1613
- flex-shrink: 0;
1614
- position: relative;
1615
- top: 2px;
1616
- cursor: default;
1617
- }
1618
-
1619
- .task-cb:checked {
1620
- background: var(--accent-cyan);
1621
- border-color: var(--accent-cyan);
1622
- }
1623
-
1624
- .task-cb:checked::after {
1625
- content: '';
1626
- position: absolute;
1627
- top: 1px; left: 3px;
1628
- width: 5px; height: 8px;
1629
- border: 2px solid #000;
1630
- border-top: none;
1631
- border-left: none;
1632
- transform: rotate(45deg);
1633
- }
1634
-
1635
- .task-done > * { opacity: 0.55; }
1636
- .task-done .task-cb + span,
1637
- .task-done .task-cb ~ * { text-decoration: line-through; }
1638
-
1639
- /* ── Table overflow wrapper ──────────────────────────────────────────── */
1640
- .msg-text :where(table) {
1641
- display: block;
1642
- overflow-x: auto;
1643
- white-space: nowrap;
1644
- }
1645
- /* Allow cells to wrap when content isn't too wide */
1646
- .msg-text :where(th, td) {
1647
- white-space: normal;
1648
- min-width: 80px;
1649
- }
1650
-
1651
- /* ── Details / Summary (collapsible sections) ─────────────────────────── */
1652
- .msg-text :where(details) {
1653
- border: 1px solid var(--glass-border);
1654
- border-radius: 8px;
1655
- padding: 0;
1656
- margin: 0.6em 0;
1657
- overflow: hidden;
1658
- background: rgba(255,255,255,0.02);
1659
- }
1660
-
1661
- .msg-text :where(summary) {
1662
- padding: 8px 14px;
1663
- cursor: pointer;
1664
- font-weight: 600;
1665
- font-size: 13px;
1666
- color: var(--text-muted);
1667
- list-style: none;
1668
- display: flex;
1669
- align-items: center;
1670
- gap: 8px;
1671
- user-select: none;
1672
- transition: background 0.2s;
1673
- }
1674
- .msg-text :where(summary):hover { background: rgba(255,255,255,0.03); }
1675
- .msg-text :where(summary)::before {
1676
- content: '▸';
1677
- font-size: 9px;
1678
- color: var(--accent-cyan);
1679
- transition: transform 0.2s;
1680
- }
1681
- .msg-text :where(details[open] summary)::before {
1682
- transform: rotate(90deg);
1683
- }
1684
- .msg-text :where(details) > *:not(summary) {
1685
- padding: 0 14px 10px;
1686
- }
1687
-
1688
- /* ── Spacing improvements ────────────────────────────────────────────── */
1689
- .bubble-content + .bubble-content { margin-top: 0.5em; }
1690
-
1691
- .msg-text :where(h1 + p, h2 + p, h3 + p) { margin-top: 0.4em; }
1692
- .msg-text :where(p:last-child, ul:last-child, ol:last-child) { margin-bottom: 0; }
1693
-
1694
- /* Separator after heading when followed by block content */
1695
- .msg-text :where(h2, h3) {
1696
- padding-top: 0.3em;
1697
- }
1698
-
1699
- /* Better nested list indent */
1700
- .msg-text :where(ul ul, ol ol, ul ol, ol ul) {
1701
- margin-top: 0.25em;
1702
- margin-bottom: 0.25em;
1703
- padding-left: 1.2em;
1704
- }
1705
-
1706
- /* ── Keyboard shortcut styling ───────────────────────────────────────── */
1707
- .msg-text :where(kbd) {
1708
- font-family: var(--font-mono);
1709
- font-size: 0.8em;
1710
- background: rgba(255,255,255,0.1);
1711
- border: 1px solid rgba(255,255,255,0.2);
1712
- border-bottom: 2px solid rgba(255,255,255,0.15);
1713
- border-radius: 4px;
1714
- padding: 1px 5px;
1715
- color: var(--text);
1716
- }
1717
-
1718
- /* ── Abbr tooltip ────────────────────────────────────────────────────── */
1719
- .msg-text :where(abbr[title]) {
1720
- border-bottom: 1px dotted var(--text-muted);
1721
- cursor: help;
1722
- text-decoration: none;
1723
- }
1724
-
1725
- /* ── Scrollbar ────────────────────────────────────────────────────── */
1726
- .response-area::-webkit-scrollbar { display: none; }
1727
- .response-area { scrollbar-width: none; }
1728
-
1729
- /* ══════════════════════════════════════════════════════════════════════
1730
- COMMAND MENU SYSTEM
1731
- ══════════════════════════════════════════════════════════════════════ */
1732
-
1733
- /* ── Group accent colours ─────────────────────────────────────────── */
1734
- :root {
1735
- --cmd-chat: #00d4ff;
1736
- --cmd-control: #60a5fa;
1737
- --cmd-agent: #a78bfa;
1738
- --cmd-settings: #f59e0b;
1739
- --cmd-resources: #34d399;
1740
- }
1741
-
1742
- /* ── Menu Trigger Button ──────────────────────────────────────────── */
1743
- .menu-trigger {
1744
- position: fixed;
1745
- top: 20px;
1746
- left: 20px;
1747
- z-index: 50;
1748
- width: 38px;
1749
- height: 38px;
1750
- display: flex;
1751
- align-items: center;
1752
- justify-content: center;
1753
- background: var(--glass-bg);
1754
- backdrop-filter: var(--blur);
1755
- -webkit-backdrop-filter: var(--blur);
1756
- border: 1px solid var(--glass-border);
1757
- border-radius: 10px;
1758
- color: var(--text-muted);
1759
- cursor: pointer;
1760
- transition: color 0.2s, border-color 0.2s, box-shadow 0.2s, transform 0.2s;
1761
- }
1762
- .menu-trigger:hover {
1763
- color: var(--accent-cyan);
1764
- border-color: rgba(0,212,255,0.35);
1765
- box-shadow: 0 0 12px rgba(0,212,255,0.15);
1766
- }
1767
- .menu-trigger:active { transform: scale(0.93); }
1768
-
1769
- /* Icon swap: grid → close */
1770
- .menu-icon-close { display: none; }
1771
- .menu-trigger.menu-open .menu-icon-grid { display: none; }
1772
- .menu-trigger.menu-open .menu-icon-close { display: block; color: var(--accent-cyan); }
1773
- .menu-trigger.menu-open {
1774
- color: var(--accent-cyan);
1775
- border-color: rgba(0,212,255,0.4);
1776
- box-shadow: 0 0 16px rgba(0,212,255,0.2);
1777
- }
1778
-
1779
- /* ── Full-Screen Overlay ──────────────────────────────────────────── */
1780
- .cmd-overlay {
1781
- position: fixed;
1782
- inset: 0;
1783
- z-index: 40;
1784
- display: flex;
1785
- align-items: center;
1786
- justify-content: center;
1787
- /* Hidden state */
1788
- opacity: 0;
1789
- pointer-events: none;
1790
- transform: scale(0.97);
1791
- transition: opacity 0.28s ease, transform 0.28s ease;
1792
- }
1793
- .cmd-overlay.open {
1794
- opacity: 1;
1795
- pointer-events: auto;
1796
- transform: scale(1);
1797
- }
1798
-
1799
- /* Dark glass backdrop */
1800
- .cmd-backdrop {
1801
- position: absolute;
1802
- inset: 0;
1803
- background: rgba(6, 8, 14, 0.9);
1804
- backdrop-filter: blur(24px);
1805
- -webkit-backdrop-filter: blur(24px);
1806
- }
1807
-
1808
- /* Shell (content on top of backdrop) */
1809
- .cmd-shell {
1810
- position: relative;
1811
- z-index: 1;
1812
- width: 100%;
1813
- max-width: 1080px;
1814
- padding: 0 32px;
1815
- display: flex;
1816
- flex-direction: column;
1817
- gap: 24px;
1818
- }
1819
-
1820
- /* ── Header Bar ───────────────────────────────────────────────────── */
1821
- .cmd-header {
1822
- display: flex;
1823
- align-items: center;
1824
- justify-content: space-between;
1825
- padding-bottom: 16px;
1826
- border-bottom: 1px solid var(--glass-border);
1827
- }
1828
- .cmd-brand {
1829
- display: flex;
1830
- align-items: center;
1831
- gap: 10px;
1832
- }
1833
- .cmd-brand-glyph {
1834
- font-size: 22px;
1835
- color: var(--accent-cyan);
1836
- text-shadow: 0 0 12px var(--accent-cyan);
1837
- animation: aso-breathe 3s ease-in-out infinite;
1838
- }
1839
- .cmd-brand-name {
1840
- font-family: var(--font-mono);
1841
- font-size: 18px;
1842
- font-weight: 700;
1843
- color: var(--text);
1844
- letter-spacing: 0.15em;
1845
- }
1846
- .cmd-brand-sep {
1847
- font-size: 16px;
1848
- color: var(--text-dim);
1849
- margin: 0 2px;
1850
- }
1851
- .cmd-brand-sub {
1852
- font-family: var(--font-mono);
1853
- font-size: 11px;
1854
- color: var(--text-dim);
1855
- letter-spacing: 0.22em;
1856
- padding-top: 2px;
1857
- }
1858
- .cmd-esc-hint {
1859
- font-size: 11px;
1860
- color: var(--text-dim);
1861
- display: flex;
1862
- align-items: center;
1863
- gap: 5px;
1864
- }
1865
- .cmd-kbd {
1866
- font-family: var(--font-mono);
1867
- font-size: 10px;
1868
- padding: 2px 6px;
1869
- background: rgba(255,255,255,0.07);
1870
- border: 1px solid rgba(255,255,255,0.12);
1871
- border-radius: 4px;
1872
- color: var(--text-muted);
1873
- }
1874
-
1875
- /* ── Command Grid ─────────────────────────────────────────────────── */
1876
- .cmd-grid {
1877
- display: grid;
1878
- grid-template-columns: 200px 1fr 200px;
1879
- grid-template-rows: auto auto;
1880
- gap: 14px;
1881
- width: 100%;
1882
- }
1883
-
1884
- .cmd-group--chat { grid-column: 1; grid-row: 1 / 3; }
1885
- .cmd-group--control { grid-column: 2; grid-row: 1; }
1886
- .cmd-group--agent { grid-column: 3; grid-row: 1; }
1887
- .cmd-group--settings { grid-column: 2; grid-row: 2; }
1888
- .cmd-group--resources { grid-column: 3; grid-row: 2; }
1889
-
1890
- /* ── Group Card ───────────────────────────────────────────────────── */
1891
- .cmd-group {
1892
- background: var(--glass-bg);
1893
- border: 1px solid var(--glass-border);
1894
- border-radius: 16px;
1895
- padding: 18px;
1896
- display: flex;
1897
- flex-direction: column;
1898
- gap: 14px;
1899
- /* Stagger-reveal when overlay opens */
1900
- opacity: 0;
1901
- transform: translateY(14px);
1902
- transition: border-color 0.25s, box-shadow 0.25s;
1903
- }
1904
- .cmd-overlay.open .cmd-group {
1905
- animation: cmd-card-in 0.32s ease forwards;
1906
- }
1907
- .cmd-overlay.open .cmd-group:nth-child(1) { animation-delay: 30ms; }
1908
- .cmd-overlay.open .cmd-group:nth-child(2) { animation-delay: 80ms; }
1909
- .cmd-overlay.open .cmd-group:nth-child(3) { animation-delay: 130ms; }
1910
- .cmd-overlay.open .cmd-group:nth-child(4) { animation-delay: 180ms; }
1911
- .cmd-overlay.open .cmd-group:nth-child(5) { animation-delay: 230ms; }
1912
-
1913
- @keyframes cmd-card-in {
1914
- from { opacity: 0; transform: translateY(14px); }
1915
- to { opacity: 1; transform: translateY(0); }
1916
- }
1917
-
1918
- /* Per-group accent borders & hover glow */
1919
- .cmd-group--chat:hover { border-color: rgba(0,212,255,0.35); box-shadow: 0 0 20px rgba(0,212,255,0.06); }
1920
- .cmd-group--control:hover { border-color: rgba(96,165,250,0.35); box-shadow: 0 0 20px rgba(96,165,250,0.06); }
1921
- .cmd-group--agent:hover { border-color: rgba(167,139,250,0.35); box-shadow: 0 0 20px rgba(167,139,250,0.06); }
1922
- .cmd-group--settings:hover { border-color: rgba(245,158,11,0.35); box-shadow: 0 0 20px rgba(245,158,11,0.06); }
1923
- .cmd-group--resources:hover { border-color: rgba(52,211,153,0.35); box-shadow: 0 0 20px rgba(52,211,153,0.06); }
1924
-
1925
- /* ── Group Header ─────────────────────────────────────────────────── */
1926
- .cmd-group-hd {
1927
- display: flex;
1928
- align-items: center;
1929
- gap: 9px;
1930
- padding-bottom: 10px;
1931
- border-bottom: 1px solid var(--glass-border);
1932
- }
1933
- .cmd-group-svg {
1934
- width: 16px;
1935
- height: 16px;
1936
- flex-shrink: 0;
1937
- }
1938
- .cmd-group-label {
1939
- font-family: var(--font-mono);
1940
- font-size: 10px;
1941
- font-weight: 700;
1942
- letter-spacing: 0.2em;
1943
- }
1944
-
1945
- /* Accent colours on group labels and icons */
1946
- .cmd-group--chat .cmd-group-hd { color: var(--cmd-chat); }
1947
- .cmd-group--control .cmd-group-hd { color: var(--cmd-control); }
1948
- .cmd-group--agent .cmd-group-hd { color: var(--cmd-agent); }
1949
- .cmd-group--settings .cmd-group-hd { color: var(--cmd-settings); }
1950
- .cmd-group--resources .cmd-group-hd { color: var(--cmd-resources); }
1951
-
1952
- /* ── Items List ───────────────────────────────────────────────────── */
1953
- .cmd-items {
1954
- display: flex;
1955
- flex-direction: column;
1956
- gap: 6px;
1957
- flex: 1;
1958
- }
1959
-
1960
- /* 3-column sub-grid for CONTROL (6 items) */
1961
- .cmd-items--grid {
1962
- display: grid;
1963
- grid-template-columns: 1fr 1fr 1fr;
1964
- gap: 8px;
1965
- }
1966
-
1967
- /* ── Individual Item ──────────────────────────────────────────────── */
1968
- .cmd-item {
1969
- display: flex;
1970
- align-items: center;
1971
- gap: 10px;
1972
- padding: 10px 12px;
1973
- border-radius: 10px;
1974
- border: 1px solid transparent;
1975
- background: rgba(255,255,255,0.025);
1976
- text-decoration: none;
1977
- cursor: pointer;
1978
- transition: background 0.18s, border-color 0.18s, transform 0.15s;
1979
- }
1980
- .cmd-item:hover {
1981
- background: rgba(255,255,255,0.06);
1982
- transform: translateY(-1px);
1983
- }
1984
- /* Per-group item hover accent */
1985
- .cmd-group--chat .cmd-item:hover { border-color: rgba(0,212,255,0.3); }
1986
- .cmd-group--control .cmd-item:hover { border-color: rgba(96,165,250,0.3); }
1987
- .cmd-group--agent .cmd-item:hover { border-color: rgba(167,139,250,0.3); }
1988
- .cmd-group--settings .cmd-item:hover { border-color: rgba(245,158,11,0.3); }
1989
- .cmd-group--resources .cmd-item:hover { border-color: rgba(52,211,153,0.3); }
1990
-
1991
- .cmd-item-icon {
1992
- font-size: 16px;
1993
- flex-shrink: 0;
1994
- width: 20px;
1995
- text-align: center;
1996
- opacity: 0.7;
1997
- }
1998
- .cmd-group--chat .cmd-item-icon { color: var(--cmd-chat); }
1999
- .cmd-group--control .cmd-item-icon { color: var(--cmd-control); }
2000
- .cmd-group--agent .cmd-item-icon { color: var(--cmd-agent); }
2001
- .cmd-group--settings .cmd-item-icon { color: var(--cmd-settings); }
2002
- .cmd-group--resources .cmd-item-icon { color: var(--cmd-resources); }
2003
-
2004
- .cmd-item-body {
2005
- display: flex;
2006
- flex-direction: column;
2007
- gap: 2px;
2008
- min-width: 0;
2009
- flex: 1;
2010
- }
2011
- .cmd-item-name {
2012
- font-family: var(--font-mono);
2013
- font-size: 12px;
2014
- font-weight: 600;
2015
- color: var(--text);
2016
- white-space: nowrap;
2017
- overflow: hidden;
2018
- text-overflow: ellipsis;
2019
- }
2020
- .cmd-item-desc {
2021
- font-size: 10px;
2022
- color: var(--text-dim);
2023
- white-space: nowrap;
2024
- overflow: hidden;
2025
- text-overflow: ellipsis;
2026
- }
2027
- .cmd-item-badge {
2028
- font-family: var(--font-mono);
2029
- font-size: 8px;
2030
- font-weight: 700;
2031
- letter-spacing: 0.1em;
2032
- padding: 2px 6px;
2033
- border-radius: 99px;
2034
- background: rgba(0,212,255,0.12);
2035
- color: var(--accent-cyan);
2036
- border: 1px solid rgba(0,212,255,0.25);
2037
- flex-shrink: 0;
2038
- }
2039
-
2040
- /* ── History button ─────────────────────────────────────────────────── */
2041
- .history-btn {
2042
- display: flex; align-items: center; gap: 5px;
2043
- padding: 5px 11px;
2044
- height: 28px;
2045
- background: rgba(139,92,246,0.08);
2046
- border: 1px solid rgba(139,92,246,0.2);
2047
- border-radius: 8px;
2048
- color: rgba(139,92,246,0.85);
2049
- font-size: 10px; font-family: var(--font-mono); letter-spacing: 0.08em; font-weight: 600;
2050
- cursor: pointer; transition: all 0.2s; white-space: nowrap; flex-shrink: 0;
2051
- }
2052
- .history-btn:hover {
2053
- background: rgba(139,92,246,0.16);
2054
- border-color: rgba(139,92,246,0.4);
2055
- box-shadow: 0 0 12px rgba(139,92,246,0.12);
2056
- }
2057
- .history-btn-label { font-size: 10px; }
2058
-
2059
- /* ── History overlay + drawer ───────────────────────────────────────── */
2060
- .history-overlay {
2061
- position: fixed; inset: 0; z-index: 1100;
2062
- background: rgba(0,0,0,0.55);
2063
- backdrop-filter: blur(4px);
2064
- opacity: 0; pointer-events: none;
2065
- transition: opacity 0.25s ease;
2066
- }
2067
- .history-overlay.open { opacity: 1; pointer-events: auto; }
2068
-
2069
- .history-drawer {
2070
- position: fixed; top: 0; right: -440px; height: 100vh; width: 420px;
2071
- z-index: 1101;
2072
- background: rgba(10,12,20,0.97);
2073
- border-left: 1px solid rgba(139,92,246,0.25);
2074
- box-shadow: -20px 0 60px rgba(0,0,0,0.6);
2075
- display: flex; flex-direction: column;
2076
- transition: right 0.3s cubic-bezier(0.4, 0, 0.2, 1);
2077
- }
2078
- .history-drawer.open { right: 0; }
2079
-
2080
- .history-drawer-header {
2081
- display: flex; align-items: center; justify-content: space-between;
2082
- padding: 16px 18px 14px;
2083
- border-bottom: 1px solid rgba(139,92,246,0.15);
2084
- flex-shrink: 0;
2085
- }
2086
- .history-drawer-title {
2087
- display: flex; align-items: center; gap: 7px;
2088
- font-family: var(--font-mono); font-size: 11px; font-weight: 700;
2089
- letter-spacing: 0.14em; color: rgba(139,92,246,0.9);
2090
- }
2091
- .history-close-btn {
2092
- background: none; border: none; color: var(--text-dim);
2093
- font-size: 13px; cursor: pointer; padding: 4px 6px; border-radius: 4px;
2094
- transition: color 0.15s, background 0.15s;
2095
- }
2096
- .history-close-btn:hover { color: var(--text-primary); background: rgba(255,255,255,0.06); }
2097
-
2098
- .history-drawer-body {
2099
- flex: 1; overflow-y: auto; padding: 12px 0;
2100
- }
2101
- .history-drawer-body::-webkit-scrollbar { width: 4px; }
2102
- .history-drawer-body::-webkit-scrollbar-track { background: transparent; }
2103
- .history-drawer-body::-webkit-scrollbar-thumb { background: rgba(139,92,246,0.3); border-radius: 2px; }
2104
-
2105
- .history-loading {
2106
- padding: 24px 18px;
2107
- color: var(--text-dim);
2108
- font-size: 12px; font-family: var(--font-mono);
2109
- text-align: center;
2110
- }
2111
-
2112
- /* ── Session list items ─────────────────────────────────────────────── */
2113
- .history-session-item {
2114
- padding: 12px 18px;
2115
- cursor: pointer;
2116
- border-bottom: 1px solid rgba(255,255,255,0.04);
2117
- transition: background 0.15s;
2118
- position: relative;
2119
- }
2120
- .history-session-item:hover { background: rgba(139,92,246,0.07); }
2121
- .history-session-item:last-child { border-bottom: none; }
2122
-
2123
- .history-session-meta {
2124
- display: flex; align-items: center; justify-content: space-between;
2125
- margin-bottom: 5px;
2126
- }
2127
- .history-session-date {
2128
- font-family: var(--font-mono); font-size: 10px; font-weight: 600;
2129
- color: rgba(139,92,246,0.8); letter-spacing: 0.06em;
2130
- }
2131
- .history-session-count {
2132
- font-family: var(--font-mono); font-size: 9px;
2133
- color: var(--text-dim); letter-spacing: 0.05em;
2134
- }
2135
- .history-session-preview {
2136
- font-size: 12px; color: var(--text-secondary);
2137
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
2138
- line-height: 1.4;
2139
- }
2140
- .history-session-badge {
2141
- display: inline-block; margin-bottom: 4px;
2142
- font-family: var(--font-mono); font-size: 9px; font-weight: 700;
2143
- letter-spacing: 0.1em; padding: 2px 6px; border-radius: 99px;
2144
- }
2145
- .history-session-badge.live {
2146
- background: rgba(0,212,255,0.12); color: var(--accent-cyan);
2147
- border: 1px solid rgba(0,212,255,0.25);
2148
- }
2149
- .history-session-badge.archived {
2150
- background: rgba(139,92,246,0.1); color: rgba(139,92,246,0.7);
2151
- border: 1px solid rgba(139,92,246,0.2);
2152
- }
2153
-
2154
- /* ── Archive viewer banner ──────────────────────────────────────────── */
2155
- .archive-banner {
2156
- display: flex; align-items: center; justify-content: space-between;
2157
- padding: 10px 14px; margin: 0 0 8px;
2158
- background: rgba(139,92,246,0.1);
2159
- border-bottom: 1px solid rgba(139,92,246,0.2);
2160
- flex-shrink: 0;
2161
- }
2162
- .archive-banner-label {
2163
- font-family: var(--font-mono); font-size: 10px;
2164
- color: rgba(139,92,246,0.8); letter-spacing: 0.08em;
2165
- }
2166
- .archive-banner-back {
2167
- font-family: var(--font-mono); font-size: 10px; font-weight: 600;
2168
- color: rgba(139,92,246,0.9); cursor: pointer;
2169
- background: none; border: none; padding: 3px 8px;
2170
- border: 1px solid rgba(139,92,246,0.3); border-radius: 6px;
2171
- transition: all 0.15s;
2172
- }
2173
- .archive-banner-back:hover { background: rgba(139,92,246,0.15); }
2174
-
2175
- .history-transcript {
2176
- flex: 1; overflow-y: auto; padding: 8px 12px;
2177
- }
2178
- .history-transcript::-webkit-scrollbar { width: 4px; }
2179
- .history-transcript::-webkit-scrollbar-thumb { background: rgba(139,92,246,0.3); border-radius: 2px; }
2180
-
2181
- .history-msg {
2182
- margin-bottom: 12px; font-size: 12.5px; line-height: 1.5;
2183
- }
2184
- .history-msg-role {
2185
- font-family: var(--font-mono); font-size: 9px; font-weight: 700;
2186
- letter-spacing: 0.1em; margin-bottom: 3px;
2187
- }
2188
- .history-msg-role.user { color: var(--accent-cyan); }
2189
- .history-msg-role.assistant { color: rgba(139,92,246,0.8); }
2190
- .history-msg-text {
2191
- color: var(--text-secondary); padding: 6px 10px;
2192
- background: rgba(255,255,255,0.025);
2193
- border-radius: 6px; border-left: 2px solid rgba(255,255,255,0.08);
2194
- white-space: pre-wrap; word-break: break-word;
2195
- }
2196
- .history-msg.assistant .history-msg-text {
2197
- border-left-color: rgba(139,92,246,0.3);
2198
- }
2199
- .history-msg.user .history-msg-text {
2200
- border-left-color: rgba(0,212,255,0.25);
2201
- }
2202
-
2203
- .history-empty {
2204
- padding: 32px 18px; text-align: center;
2205
- color: var(--text-dim); font-size: 12px; font-family: var(--font-mono);
2206
- }
2207
-
2208
- /* ── Archive toast ──────────────────────────────────────────────────── */
2209
- .session-archive-toast {
2210
- position: fixed; bottom: 80px; left: 50%; transform: translateX(-50%) translateY(20px);
2211
- z-index: 1200;
2212
- display: flex; align-items: center; gap: 7px;
2213
- padding: 8px 16px;
2214
- background: rgba(15,17,28,0.95);
2215
- border: 1px solid rgba(139,92,246,0.35);
2216
- border-radius: 99px;
2217
- font-size: 11.5px; font-family: var(--font-mono); color: var(--text-secondary);
2218
- box-shadow: 0 4px 24px rgba(0,0,0,0.5), 0 0 20px rgba(139,92,246,0.08);
2219
- opacity: 0; pointer-events: none;
2220
- transition: opacity 0.25s ease, transform 0.25s ease;
2221
- white-space: nowrap;
2222
- }
2223
- .session-archive-toast.show {
2224
- opacity: 1; pointer-events: auto; transform: translateX(-50%) translateY(0);
2225
- }
2226
- #session-archive-link {
2227
- color: rgba(139,92,246,0.9); cursor: pointer; font-weight: 600;
2228
- text-decoration: underline; text-underline-offset: 2px;
2229
- }
2230
- #session-archive-link:hover { color: rgba(139,92,246,1); }
2231
-
2232
- /* ── Queue button ───────────────────────────────────────────────────── */
2233
- .queue-btn {
2234
- display: none; /* hidden until streaming starts */
2235
- align-items: center;
2236
- gap: 5px;
2237
- padding: 0 11px;
2238
- height: 28px;
2239
- background: rgba(0,212,255,0.08);
2240
- border: 1px solid rgba(0,212,255,0.2);
2241
- border-radius: 8px;
2242
- color: rgba(0,212,255,0.8);
2243
- font-size: 10px; font-family: var(--font-mono); letter-spacing: 0.08em; font-weight: 600;
2244
- cursor: pointer; flex-shrink: 0;
2245
- transition: background 0.2s, border-color 0.2s, box-shadow 0.2s;
2246
- white-space: nowrap;
2247
- }
2248
- .queue-btn.visible { display: flex; }
2249
- .queue-btn:hover {
2250
- background: rgba(0,212,255,0.15);
2251
- border-color: rgba(0,212,255,0.4);
2252
- box-shadow: 0 0 12px rgba(0,212,255,0.12);
2253
- }
2254
-
2255
- /* Active state — item is queued */
2256
- .queue-btn.has-queue {
2257
- background: rgba(0,212,255,0.14);
2258
- border-color: rgba(0,212,255,0.45);
2259
- color: var(--accent-cyan);
2260
- box-shadow: 0 0 14px rgba(0,212,255,0.1);
2261
- }
2262
-
2263
- .queue-cancel-x {
2264
- display: none;
2265
- margin-left: 2px;
2266
- font-size: 10px;
2267
- opacity: 0.6;
2268
- line-height: 1;
2269
- padding: 1px 3px;
2270
- border-radius: 3px;
2271
- transition: opacity 0.15s, background 0.15s;
2272
- }
2273
- .queue-btn.has-queue .queue-cancel-x { display: inline; }
2274
- .queue-cancel-x:hover { opacity: 1; background: rgba(255,255,255,0.1); }
2275
-
2276
- /* ── Stop button ────────────────────────────────────────────────────── */
2277
- .stop-btn {
2278
- display: none; /* hidden until streaming starts */
2279
- align-items: center;
2280
- gap: 5px;
2281
- padding: 0 11px;
2282
- height: 28px;
2283
- background: rgba(239,68,68,0.08);
2284
- border: 1px solid rgba(239,68,68,0.22);
2285
- border-radius: 8px;
2286
- color: rgba(239,68,68,0.85);
2287
- font-size: 10px; font-family: var(--font-mono); letter-spacing: 0.08em; font-weight: 600;
2288
- cursor: pointer; flex-shrink: 0;
2289
- transition: background 0.2s, border-color 0.2s, box-shadow 0.2s;
2290
- white-space: nowrap;
2291
- }
2292
- .stop-btn.visible { display: flex; }
2293
- .stop-btn:hover {
2294
- background: rgba(239,68,68,0.18);
2295
- border-color: rgba(239,68,68,0.5);
2296
- box-shadow: 0 0 14px rgba(239,68,68,0.14);
2297
- color: rgba(239,68,68,1);
2298
- }
2299
- .stop-btn-label { font-size: 10px; }
2300
-
2301
- /* ── Page Navigation Overlay ────────────────────────────────────────── */
2302
- .page-overlay {
2303
- position: fixed;
2304
- inset: 0;
2305
- z-index: 1050;
2306
- display: flex;
2307
- flex-direction: column;
2308
- background: rgba(8, 10, 18, 0.98);
2309
- backdrop-filter: blur(24px);
2310
- opacity: 0;
2311
- pointer-events: none;
2312
- transform: translateY(12px);
2313
- transition: opacity 0.22s ease, transform 0.22s ease;
2314
- }
2315
- .page-overlay.open {
2316
- opacity: 1;
2317
- pointer-events: auto;
2318
- transform: translateY(0);
2319
- }
2320
-
2321
- .page-overlay-header {
2322
- display: flex;
2323
- align-items: center;
2324
- gap: 12px;
2325
- padding: 10px 16px;
2326
- border-bottom: 1px solid rgba(139,92,246,0.18);
2327
- background: rgba(10,12,20,0.95);
2328
- flex-shrink: 0;
2329
- height: 46px;
2330
- }
2331
-
2332
- .page-back-btn {
2333
- display: flex; align-items: center; gap: 6px;
2334
- padding: 5px 12px; height: 28px;
2335
- background: rgba(139,92,246,0.1);
2336
- border: 1px solid rgba(139,92,246,0.25);
2337
- border-radius: 8px;
2338
- color: rgba(139,92,246,0.9);
2339
- font-size: 11px; font-family: var(--font-mono); font-weight: 600; letter-spacing: 0.07em;
2340
- cursor: pointer; white-space: nowrap; flex-shrink: 0;
2341
- transition: all 0.15s;
2342
- }
2343
- .page-back-btn:hover {
2344
- background: rgba(139,92,246,0.2);
2345
- border-color: rgba(139,92,246,0.45);
2346
- }
2347
-
2348
- .page-overlay-title {
2349
- flex: 1;
2350
- font-family: var(--font-mono);
2351
- font-size: 11px; font-weight: 700; letter-spacing: 0.14em;
2352
- color: rgba(255,255,255,0.6);
2353
- text-align: center;
2354
- }
2355
-
2356
- .page-popout-btn {
2357
- display: flex; align-items: center; gap: 5px;
2358
- padding: 5px 11px; height: 28px;
2359
- background: rgba(0,212,255,0.06);
2360
- border: 1px solid rgba(0,212,255,0.15);
2361
- border-radius: 8px;
2362
- color: rgba(0,212,255,0.6);
2363
- font-size: 10px; font-family: var(--font-mono); letter-spacing: 0.07em;
2364
- cursor: pointer; text-decoration: none; flex-shrink: 0;
2365
- transition: all 0.15s;
2366
- }
2367
- .page-popout-btn:hover {
2368
- background: rgba(0,212,255,0.12);
2369
- border-color: rgba(0,212,255,0.35);
2370
- color: rgba(0,212,255,0.9);
2371
- }
2372
-
2373
- .page-overlay-frame {
2374
- flex: 1;
2375
- border: none;
2376
- width: 100%;
2377
- background: transparent;
2378
- }
2379
-
2380
- /* ══════════════════════════════════════════════════════════════════════════
2381
- CONNECTIONS PANEL
2382
- ══════════════════════════════════════════════════════════════════════════ */
2383
-
2384
- .connections-panel {
2385
- display: flex;
2386
- flex-direction: column;
2387
- gap: 8px;
2388
- }
2389
-
2390
- .conn-btn {
2391
- position: relative;
2392
- display: flex;
2393
- align-items: center;
2394
- gap: 12px;
2395
- width: 100%;
2396
- padding: 10px 12px;
2397
- background: rgba(255,255,255,0.02);
2398
- border: 1px solid rgba(255,255,255,0.06);
2399
- border-radius: 10px;
2400
- cursor: pointer;
2401
- transition: all 0.25s ease;
2402
- text-align: left;
2403
- color: var(--text);
2404
- font-family: inherit;
2405
- }
2406
- .conn-btn:hover {
2407
- background: rgba(255,255,255,0.05);
2408
- border-color: rgba(255,255,255,0.12);
2409
- transform: translateX(2px);
2410
- }
2411
- .conn-btn:active {
2412
- transform: translateX(2px) scale(0.99);
2413
- }
2414
-
2415
- .conn-btn[data-state="connected"] {
2416
- border-color: rgba(52, 211, 153, 0.25);
2417
- background: rgba(52, 211, 153, 0.04);
2418
- }
2419
- .conn-btn[data-state="connected"]:hover {
2420
- border-color: rgba(52, 211, 153, 0.4);
2421
- background: rgba(52, 211, 153, 0.08);
2422
- }
2423
- .conn-btn[data-state="error"] {
2424
- border-color: rgba(248, 113, 113, 0.25);
2425
- background: rgba(248, 113, 113, 0.04);
2426
- }
2427
- .conn-btn[data-state="pending"] {
2428
- border-color: rgba(251, 191, 36, 0.25);
2429
- background: rgba(251, 191, 36, 0.04);
2430
- }
2431
-
2432
- .conn-icon {
2433
- flex-shrink: 0;
2434
- width: 32px;
2435
- height: 32px;
2436
- border-radius: 8px;
2437
- display: flex;
2438
- align-items: center;
2439
- justify-content: center;
2440
- transition: all 0.25s ease;
2441
- }
2442
- .conn-icon svg {
2443
- width: 18px;
2444
- height: 18px;
2445
- }
2446
-
2447
- .conn-icon-slack {
2448
- background: linear-gradient(135deg, rgba(74, 21, 75, 0.3), rgba(54, 197, 171, 0.2));
2449
- border: 1px solid rgba(224, 30, 90, 0.2);
2450
- color: #E01E5A;
2451
- }
2452
- .conn-btn[data-state="connected"] .conn-icon-slack {
2453
- box-shadow: 0 0 12px rgba(224, 30, 90, 0.2);
2454
- }
2455
-
2456
- .conn-icon-email {
2457
- background: linear-gradient(135deg, rgba(96, 165, 250, 0.2), rgba(139, 92, 246, 0.2));
2458
- border: 1px solid rgba(96, 165, 250, 0.2);
2459
- color: var(--accent-blue);
2460
- }
2461
- .conn-btn[data-state="connected"] .conn-icon-email {
2462
- box-shadow: 0 0 12px rgba(96, 165, 250, 0.2);
2463
- }
2464
-
2465
- .conn-icon-teams {
2466
- background: linear-gradient(135deg, rgba(98, 100, 167, 0.3), rgba(139, 92, 246, 0.2));
2467
- border: 1px solid rgba(98, 100, 167, 0.25);
2468
- color: #6264A7;
2469
- }
2470
- .conn-btn[data-state="connected"] .conn-icon-teams {
2471
- box-shadow: 0 0 12px rgba(98, 100, 167, 0.2);
2472
- }
2473
-
2474
- .conn-info {
2475
- flex: 1;
2476
- min-width: 0;
2477
- display: flex;
2478
- flex-direction: column;
2479
- gap: 2px;
2480
- }
2481
- .conn-name {
2482
- font-size: 12px;
2483
- font-weight: 600;
2484
- color: var(--text);
2485
- letter-spacing: 0.02em;
2486
- }
2487
- .conn-btn-status {
2488
- font-size: 10px;
2489
- font-family: var(--font-mono);
2490
- font-weight: 500;
2491
- color: var(--text-muted);
2492
- letter-spacing: 0.03em;
2493
- }
2494
- .conn-btn[data-state="connected"] .conn-btn-status {
2495
- color: var(--accent-green);
2496
- }
2497
- .conn-btn[data-state="error"] .conn-btn-status {
2498
- color: #f87171;
2499
- }
2500
- .conn-btn[data-state="pending"] .conn-btn-status {
2501
- color: #fbbf24;
2502
- }
2503
-
2504
- .conn-state {
2505
- flex-shrink: 0;
2506
- width: 24px;
2507
- display: flex;
2508
- align-items: center;
2509
- justify-content: center;
2510
- }
2511
- .conn-state .conn-dot {
2512
- width: 8px;
2513
- height: 8px;
2514
- border-radius: 50%;
2515
- background: var(--text-dim);
2516
- transition: all 0.3s ease;
2517
- }
2518
- .conn-btn[data-state="connected"] .conn-state .conn-dot {
2519
- background: var(--accent-green);
2520
- box-shadow: 0 0 8px rgba(52, 211, 153, 0.5);
2521
- animation: conn-pulse 2s ease-in-out infinite;
2522
- }
2523
- .conn-btn[data-state="error"] .conn-state .conn-dot {
2524
- background: #f87171;
2525
- box-shadow: 0 0 8px rgba(248, 113, 113, 0.4);
2526
- }
2527
- .conn-btn[data-state="pending"] .conn-state .conn-dot {
2528
- background: #fbbf24;
2529
- animation: conn-blink 1s ease-in-out infinite;
2530
- }
2531
-
2532
- @keyframes conn-pulse {
2533
- 0%, 100% { opacity: 1; transform: scale(1); }
2534
- 50% { opacity: 0.7; transform: scale(0.9); }
2535
- }
2536
- @keyframes conn-blink {
2537
- 0%, 100% { opacity: 1; }
2538
- 50% { opacity: 0.4; }
2539
- }
2540
-
2541
- .conn-notif {
2542
- position: absolute;
2543
- top: -4px;
2544
- right: -4px;
2545
- min-width: 18px;
2546
- height: 18px;
2547
- padding: 0 5px;
2548
- background: linear-gradient(135deg, #f43f5e, #ec4899);
2549
- border-radius: 9px;
2550
- font-size: 10px;
2551
- font-weight: 700;
2552
- color: white;
2553
- display: none;
2554
- align-items: center;
2555
- justify-content: center;
2556
- box-shadow: 0 2px 8px rgba(244, 63, 94, 0.4);
2557
- animation: notif-bounce 0.4s ease;
2558
- }
2559
- .conn-notif:not(:empty) {
2560
- display: flex;
2561
- }
2562
- @keyframes notif-bounce {
2563
- 0% { transform: scale(0); }
2564
- 50% { transform: scale(1.2); }
2565
- 100% { transform: scale(1); }
2566
- }
2567
-
2568
- /* ── Connection Modal ────────────────────────────────────────────────── */
2569
- .conn-modal-overlay {
2570
- position: fixed;
2571
- inset: 0;
2572
- z-index: 9000;
2573
- display: flex;
2574
- align-items: center;
2575
- justify-content: center;
2576
- background: rgba(0, 0, 0, 0.7);
2577
- backdrop-filter: blur(8px);
2578
- opacity: 0;
2579
- visibility: hidden;
2580
- transition: opacity 0.25s ease, visibility 0.25s ease;
2581
- }
2582
- .conn-modal-overlay.open {
2583
- opacity: 1;
2584
- visibility: visible;
2585
- }
2586
-
2587
- .conn-modal {
2588
- position: relative;
2589
- width: 90%;
2590
- max-width: 420px;
2591
- background: linear-gradient(135deg, rgba(15, 15, 25, 0.98), rgba(10, 10, 18, 0.98));
2592
- border: 1px solid rgba(255, 255, 255, 0.1);
2593
- border-radius: 16px;
2594
- box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6), 0 0 1px rgba(255, 255, 255, 0.1);
2595
- transform: scale(0.95) translateY(10px);
2596
- transition: transform 0.25s ease;
2597
- overflow: hidden;
2598
- }
2599
- .conn-modal-overlay.open .conn-modal {
2600
- transform: scale(1) translateY(0);
2601
- }
2602
-
2603
- .conn-modal-header {
2604
- display: flex;
2605
- align-items: center;
2606
- gap: 14px;
2607
- padding: 20px 20px 16px;
2608
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
2609
- }
2610
- .conn-modal-icon {
2611
- width: 44px;
2612
- height: 44px;
2613
- border-radius: 12px;
2614
- display: flex;
2615
- align-items: center;
2616
- justify-content: center;
2617
- }
2618
- .conn-modal-icon svg {
2619
- width: 24px;
2620
- height: 24px;
2621
- }
2622
- .conn-modal-icon.slack {
2623
- background: linear-gradient(135deg, rgba(74, 21, 75, 0.4), rgba(54, 197, 171, 0.3));
2624
- border: 1px solid rgba(224, 30, 90, 0.3);
2625
- color: #E01E5A;
2626
- }
2627
- .conn-modal-icon.email {
2628
- background: linear-gradient(135deg, rgba(96, 165, 250, 0.3), rgba(139, 92, 246, 0.3));
2629
- border: 1px solid rgba(96, 165, 250, 0.3);
2630
- color: var(--accent-blue);
2631
- }
2632
- .conn-modal-icon.msteams {
2633
- background: linear-gradient(135deg, rgba(98, 100, 167, 0.4), rgba(139, 92, 246, 0.3));
2634
- border: 1px solid rgba(98, 100, 167, 0.35);
2635
- color: #6264A7;
2636
- }
2637
- .conn-modal-title {
2638
- flex: 1;
2639
- font-size: 18px;
2640
- font-weight: 600;
2641
- color: var(--text);
2642
- letter-spacing: 0.02em;
2643
- }
2644
- .conn-modal-close {
2645
- width: 32px;
2646
- height: 32px;
2647
- border: none;
2648
- background: rgba(255, 255, 255, 0.05);
2649
- border-radius: 8px;
2650
- color: var(--text-muted);
2651
- cursor: pointer;
2652
- display: flex;
2653
- align-items: center;
2654
- justify-content: center;
2655
- transition: all 0.2s ease;
2656
- }
2657
- .conn-modal-close:hover {
2658
- background: rgba(255, 255, 255, 0.1);
2659
- color: var(--text);
2660
- }
2661
- .conn-modal-body {
2662
- padding: 20px;
2663
- }
2664
- .conn-modal-status {
2665
- display: flex;
2666
- align-items: center;
2667
- gap: 12px;
2668
- padding: 14px 16px;
2669
- background: rgba(255, 255, 255, 0.03);
2670
- border: 1px solid rgba(255, 255, 255, 0.06);
2671
- border-radius: 10px;
2672
- margin-bottom: 16px;
2673
- }
2674
- .conn-modal-status-dot {
2675
- width: 10px;
2676
- height: 10px;
2677
- border-radius: 50%;
2678
- background: var(--text-dim);
2679
- }
2680
- .conn-modal-status.connected .conn-modal-status-dot {
2681
- background: var(--accent-green);
2682
- box-shadow: 0 0 10px rgba(52, 211, 153, 0.5);
2683
- }
2684
- .conn-modal-status.disconnected .conn-modal-status-dot {
2685
- background: var(--text-dim);
2686
- }
2687
- .conn-modal-status-text {
2688
- flex: 1;
2689
- font-size: 13px;
2690
- color: var(--text);
2691
- }
2692
- .conn-modal-status-badge {
2693
- font-size: 10px;
2694
- font-family: var(--font-mono);
2695
- font-weight: 600;
2696
- padding: 4px 10px;
2697
- border-radius: 20px;
2698
- letter-spacing: 0.08em;
2699
- }
2700
- .conn-modal-status.connected .conn-modal-status-badge {
2701
- background: rgba(52, 211, 153, 0.15);
2702
- color: var(--accent-green);
2703
- }
2704
- .conn-modal-status.disconnected .conn-modal-status-badge {
2705
- background: rgba(255, 255, 255, 0.08);
2706
- color: var(--text-muted);
2707
- }
2708
- .conn-modal-info {
2709
- font-size: 13px;
2710
- line-height: 1.6;
2711
- color: var(--text-muted);
2712
- margin-bottom: 16px;
2713
- }
2714
- .conn-modal-info code {
2715
- background: rgba(255, 255, 255, 0.08);
2716
- padding: 2px 6px;
2717
- border-radius: 4px;
2718
- font-family: var(--font-mono);
2719
- font-size: 12px;
2720
- color: var(--accent-cyan);
2721
- }
2722
- .conn-modal-config {
2723
- background: rgba(0, 0, 0, 0.3);
2724
- border: 1px solid rgba(255, 255, 255, 0.06);
2725
- border-radius: 8px;
2726
- padding: 12px 14px;
2727
- font-family: var(--font-mono);
2728
- font-size: 11px;
2729
- color: var(--text-muted);
2730
- overflow-x: auto;
2731
- white-space: pre;
2732
- }
2733
- .conn-modal-footer {
2734
- padding: 16px 20px 20px;
2735
- border-top: 1px solid rgba(255, 255, 255, 0.06);
2736
- display: flex;
2737
- justify-content: flex-end;
2738
- }
2739
- .conn-modal-docs {
2740
- display: flex;
2741
- align-items: center;
2742
- gap: 8px;
2743
- font-size: 12px;
2744
- font-weight: 500;
2745
- color: var(--accent-cyan);
2746
- text-decoration: none;
2747
- padding: 8px 14px;
2748
- background: rgba(0, 212, 255, 0.1);
2749
- border: 1px solid rgba(0, 212, 255, 0.2);
2750
- border-radius: 8px;
2751
- transition: all 0.2s ease;
2752
- }
2753
- .conn-modal-docs:hover {
2754
- background: rgba(0, 212, 255, 0.15);
2755
- border-color: rgba(0, 212, 255, 0.35);
2756
- }
2757
-
2758
-
2759
- /* ══════════════════════════════════════════════════════════════════════════
2760
- SUBAGENTS PANEL
2761
- ══════════════════════════════════════════════════════════════════════════ */
2762
-
2763
- .subagents-panel {
2764
- display: flex;
2765
- flex-direction: column;
2766
- gap: 0;
2767
- }
2768
-
2769
- .subagents-count {
2770
- font-size: 10px;
2771
- font-family: var(--font-mono);
2772
- color: var(--accent-cyan);
2773
- margin-left: 6px;
2774
- font-weight: 600;
2775
- }
2776
-
2777
- /* Quick Deploy */
2778
- .quick-deploy-section {
2779
- margin-bottom: 10px;
2780
- }
2781
- .quick-deploy-label {
2782
- font-size: 9px;
2783
- font-family: var(--font-mono);
2784
- font-weight: 700;
2785
- letter-spacing: 0.12em;
2786
- color: var(--text-muted);
2787
- margin-bottom: 8px;
2788
- }
2789
- .quick-deploy-grid {
2790
- display: grid;
2791
- grid-template-columns: 1fr 1fr;
2792
- gap: 6px;
2793
- }
2794
- .quick-deploy-btn {
2795
- display: flex;
2796
- align-items: center;
2797
- gap: 6px;
2798
- padding: 7px 10px;
2799
- background: rgba(255,255,255,0.02);
2800
- border: 1px solid rgba(255,255,255,0.06);
2801
- border-radius: 8px;
2802
- color: var(--text);
2803
- font-size: 12px;
2804
- font-weight: 500;
2805
- font-family: inherit;
2806
- cursor: pointer;
2807
- transition: all 0.2s ease;
2808
- }
2809
- .quick-deploy-btn svg {
2810
- width: 14px;
2811
- height: 14px;
2812
- flex-shrink: 0;
2813
- opacity: 0.7;
2814
- }
2815
- .quick-deploy-btn:hover {
2816
- background: rgba(0, 212, 255, 0.06);
2817
- border-color: rgba(0, 212, 255, 0.2);
2818
- color: var(--accent-cyan);
2819
- }
2820
- .quick-deploy-btn:hover svg {
2821
- opacity: 1;
2822
- }
2823
- .quick-deploy-btn.selected {
2824
- background: rgba(0, 212, 255, 0.1);
2825
- border-color: rgba(0, 212, 255, 0.3);
2826
- color: var(--accent-cyan);
2827
- }
2828
- .quick-deploy-btn.selected svg {
2829
- opacity: 1;
2830
- }
2831
-
2832
- /* Staging Box */
2833
- .staging-box {
2834
- display: flex;
2835
- align-items: center;
2836
- gap: 8px;
2837
- padding: 8px 10px;
2838
- background: rgba(255,255,255,0.015);
2839
- border: 1px solid rgba(255,255,255,0.05);
2840
- border-radius: 8px;
2841
- margin-bottom: 12px;
2842
- min-height: 38px;
2843
- }
2844
- .staging-chips {
2845
- flex: 1;
2846
- display: flex;
2847
- flex-wrap: wrap;
2848
- gap: 4px;
2849
- min-height: 22px;
2850
- align-items: center;
2851
- }
2852
- .staging-empty {
2853
- font-size: 10px;
2854
- color: var(--text-muted);
2855
- font-family: var(--font-mono);
2856
- letter-spacing: 0.04em;
2857
- }
2858
- .staging-chip {
2859
- display: inline-flex;
2860
- align-items: center;
2861
- gap: 4px;
2862
- padding: 3px 8px;
2863
- background: rgba(0, 212, 255, 0.1);
2864
- border: 1px solid rgba(0, 212, 255, 0.2);
2865
- border-radius: 12px;
2866
- font-size: 10px;
2867
- font-family: var(--font-mono);
2868
- color: var(--accent-cyan);
2869
- cursor: default;
2870
- }
2871
- .staging-chip-remove {
2872
- cursor: pointer;
2873
- opacity: 0.6;
2874
- font-size: 12px;
2875
- line-height: 1;
2876
- }
2877
- .staging-chip-remove:hover {
2878
- opacity: 1;
2879
- }
2880
- .staging-deploy-btn {
2881
- display: flex;
2882
- align-items: center;
2883
- gap: 5px;
2884
- padding: 6px 12px;
2885
- background: rgba(0, 212, 255, 0.12);
2886
- border: 1px solid rgba(0, 212, 255, 0.25);
2887
- border-radius: 8px;
2888
- color: var(--accent-cyan);
2889
- font-size: 11px;
2890
- font-weight: 600;
2891
- font-family: inherit;
2892
- cursor: pointer;
2893
- transition: all 0.2s ease;
2894
- white-space: nowrap;
2895
- }
2896
- .staging-deploy-btn svg {
2897
- width: 13px;
2898
- height: 13px;
2899
- }
2900
- .staging-deploy-btn:disabled {
2901
- opacity: 0.35;
2902
- cursor: not-allowed;
2903
- }
2904
- .staging-deploy-btn:not(:disabled):hover {
2905
- background: rgba(0, 212, 255, 0.2);
2906
- border-color: rgba(0, 212, 255, 0.4);
2907
- }
2908
-
2909
- /* Active subagents */
2910
- .subagents-active-label {
2911
- font-size: 9px;
2912
- font-family: var(--font-mono);
2913
- font-weight: 700;
2914
- letter-spacing: 0.12em;
2915
- color: var(--text-muted);
2916
- margin-bottom: 6px;
2917
- }
2918
- .subagents-list {
2919
- display: flex;
2920
- flex-direction: column;
2921
- gap: 4px;
2922
- margin-bottom: 10px;
2923
- max-height: 240px;
2924
- overflow-y: auto;
2925
- }
2926
- .subagents-empty {
2927
- display: flex;
2928
- flex-direction: column;
2929
- align-items: center;
2930
- gap: 6px;
2931
- padding: 16px 0;
2932
- }
2933
- .subagents-empty-icon {
2934
- width: 32px;
2935
- height: 32px;
2936
- display: flex;
2937
- align-items: center;
2938
- justify-content: center;
2939
- opacity: 0.35;
2940
- }
2941
- .subagents-empty-icon svg {
2942
- width: 24px;
2943
- height: 24px;
2944
- }
2945
- .subagents-empty-text {
2946
- font-size: 11px;
2947
- font-family: var(--font-mono);
2948
- color: var(--text-muted);
2949
- letter-spacing: 0.04em;
2950
- }
2951
-
2952
- /* Individual subagent item */
2953
- .subagent-item {
2954
- display: flex;
2955
- align-items: center;
2956
- gap: 10px;
2957
- padding: 8px 10px;
2958
- background: rgba(255,255,255,0.02);
2959
- border: 1px solid rgba(255,255,255,0.05);
2960
- border-radius: 8px;
2961
- cursor: pointer;
2962
- transition: all 0.2s ease;
2963
- }
2964
- .subagent-item:hover {
2965
- background: rgba(255,255,255,0.04);
2966
- border-color: rgba(255,255,255,0.1);
2967
- }
2968
- .subagent-item[data-status="running"] {
2969
- border-color: rgba(0, 212, 255, 0.2);
2970
- background: rgba(0, 212, 255, 0.03);
2971
- }
2972
- .subagent-item[data-status="completed"] {
2973
- border-color: rgba(52, 211, 153, 0.15);
2974
- }
2975
- .subagent-item[data-status="error"] {
2976
- border-color: rgba(248, 113, 113, 0.2);
2977
- }
2978
-
2979
- .subagent-icon {
2980
- flex-shrink: 0;
2981
- width: 20px;
2982
- height: 20px;
2983
- display: flex;
2984
- align-items: center;
2985
- justify-content: center;
2986
- font-size: 14px;
2987
- }
2988
- .subagent-info {
2989
- flex: 1;
2990
- min-width: 0;
2991
- display: flex;
2992
- flex-direction: column;
2993
- gap: 1px;
2994
- }
2995
- .subagent-label {
2996
- font-size: 12px;
2997
- font-weight: 600;
2998
- color: var(--text);
2999
- white-space: nowrap;
3000
- overflow: hidden;
3001
- text-overflow: ellipsis;
3002
- }
3003
- .subagent-task {
3004
- font-size: 10px;
3005
- font-family: var(--font-mono);
3006
- color: var(--text-muted);
3007
- white-space: nowrap;
3008
- overflow: hidden;
3009
- text-overflow: ellipsis;
3010
- }
3011
- .subagent-runtime {
3012
- flex-shrink: 0;
3013
- font-size: 10px;
3014
- font-family: var(--font-mono);
3015
- color: var(--text-muted);
3016
- letter-spacing: 0.04em;
3017
- }
3018
-
3019
- /* Spawn button */
3020
- .subagent-spawn-btn {
3021
- display: flex;
3022
- align-items: center;
3023
- justify-content: center;
3024
- gap: 6px;
3025
- width: 100%;
3026
- padding: 8px;
3027
- background: rgba(139, 92, 246, 0.08);
3028
- border: 1px dashed rgba(139, 92, 246, 0.25);
3029
- border-radius: 8px;
3030
- color: rgba(139, 92, 246, 0.85);
3031
- font-size: 12px;
3032
- font-weight: 600;
3033
- font-family: inherit;
3034
- cursor: pointer;
3035
- transition: all 0.2s ease;
3036
- }
3037
- .subagent-spawn-btn svg {
3038
- width: 14px;
3039
- height: 14px;
3040
- }
3041
- .subagent-spawn-btn:hover {
3042
- background: rgba(139, 92, 246, 0.12);
3043
- border-color: rgba(139, 92, 246, 0.35);
3044
- color: var(--accent-purple);
3045
- }
3046
-
3047
- /* ── Subagent Modal ──────────────────────────────────────────────────── */
3048
- .subagent-modal-overlay {
3049
- position: fixed;
3050
- inset: 0;
3051
- z-index: 9000;
3052
- display: flex;
3053
- align-items: center;
3054
- justify-content: center;
3055
- background: rgba(0, 0, 0, 0.7);
3056
- backdrop-filter: blur(8px);
3057
- opacity: 0;
3058
- visibility: hidden;
3059
- transition: opacity 0.25s ease, visibility 0.25s ease;
3060
- }
3061
- .subagent-modal-overlay.open {
3062
- opacity: 1;
3063
- visibility: visible;
3064
- }
3065
-
3066
- .subagent-modal {
3067
- position: relative;
3068
- width: 90%;
3069
- max-width: 460px;
3070
- background: linear-gradient(135deg, rgba(15, 15, 25, 0.98), rgba(10, 10, 18, 0.98));
3071
- border: 1px solid rgba(255, 255, 255, 0.1);
3072
- border-radius: 16px;
3073
- box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6), 0 0 1px rgba(255, 255, 255, 0.1);
3074
- transform: scale(0.95) translateY(10px);
3075
- transition: transform 0.25s ease;
3076
- overflow: hidden;
3077
- }
3078
- .subagent-modal-overlay.open .subagent-modal {
3079
- transform: scale(1) translateY(0);
3080
- }
3081
-
3082
- .subagent-modal-header {
3083
- display: flex;
3084
- align-items: center;
3085
- justify-content: space-between;
3086
- padding: 18px 20px 14px;
3087
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
3088
- }
3089
- .subagent-modal-title {
3090
- font-size: 16px;
3091
- font-weight: 600;
3092
- color: var(--text);
3093
- letter-spacing: 0.02em;
3094
- }
3095
- .subagent-modal-close {
3096
- width: 32px;
3097
- height: 32px;
3098
- border: none;
3099
- background: rgba(255, 255, 255, 0.05);
3100
- border-radius: 8px;
3101
- color: var(--text-muted);
3102
- cursor: pointer;
3103
- display: flex;
3104
- align-items: center;
3105
- justify-content: center;
3106
- transition: all 0.2s ease;
3107
- }
3108
- .subagent-modal-close:hover {
3109
- background: rgba(255, 255, 255, 0.1);
3110
- color: var(--text);
3111
- }
3112
-
3113
- .subagent-modal-body {
3114
- padding: 20px;
3115
- display: flex;
3116
- flex-direction: column;
3117
- gap: 14px;
3118
- }
3119
-
3120
- .subagent-form-group {
3121
- display: flex;
3122
- flex-direction: column;
3123
- gap: 5px;
3124
- }
3125
- .subagent-form-label {
3126
- font-size: 10px;
3127
- font-family: var(--font-mono);
3128
- font-weight: 600;
3129
- letter-spacing: 0.1em;
3130
- color: var(--text-muted);
3131
- text-transform: uppercase;
3132
- }
3133
- .subagent-form-input,
3134
- .subagent-form-select,
3135
- .subagent-form-textarea {
3136
- width: 100%;
3137
- padding: 9px 12px;
3138
- background: rgba(255, 255, 255, 0.04);
3139
- border: 1px solid rgba(255, 255, 255, 0.08);
3140
- border-radius: 8px;
3141
- color: var(--text);
3142
- font-size: 13px;
3143
- font-family: inherit;
3144
- outline: none;
3145
- transition: border-color 0.2s ease;
3146
- }
3147
- .subagent-form-input:focus,
3148
- .subagent-form-select:focus,
3149
- .subagent-form-textarea:focus {
3150
- border-color: rgba(139, 92, 246, 0.4);
3151
- }
3152
- .subagent-form-textarea {
3153
- min-height: 80px;
3154
- resize: vertical;
3155
- font-family: var(--font-mono);
3156
- font-size: 12px;
3157
- }
3158
- .subagent-form-select {
3159
- appearance: none;
3160
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='rgba(255,255,255,0.4)' viewBox='0 0 16 16'%3E%3Cpath d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E");
3161
- background-repeat: no-repeat;
3162
- background-position: right 12px center;
3163
- padding-right: 32px;
3164
- }
3165
- .subagent-form-select option {
3166
- background: #0f0f19;
3167
- color: var(--text);
3168
- }
3169
-
3170
- .subagent-modal-footer {
3171
- padding: 14px 20px 18px;
3172
- border-top: 1px solid rgba(255, 255, 255, 0.06);
3173
- display: flex;
3174
- justify-content: flex-end;
3175
- gap: 10px;
3176
- }
3177
- .subagent-modal-cancel {
3178
- padding: 8px 16px;
3179
- background: rgba(255, 255, 255, 0.05);
3180
- border: 1px solid rgba(255, 255, 255, 0.08);
3181
- border-radius: 8px;
3182
- color: var(--text-muted);
3183
- font-size: 12px;
3184
- font-weight: 500;
3185
- font-family: inherit;
3186
- cursor: pointer;
3187
- transition: all 0.2s ease;
3188
- }
3189
- .subagent-modal-cancel:hover {
3190
- background: rgba(255, 255, 255, 0.08);
3191
- color: var(--text);
3192
- }
3193
- .subagent-modal-spawn {
3194
- padding: 8px 18px;
3195
- background: rgba(139, 92, 246, 0.15);
3196
- border: 1px solid rgba(139, 92, 246, 0.3);
3197
- border-radius: 8px;
3198
- color: var(--accent-purple);
3199
- font-size: 12px;
3200
- font-weight: 600;
3201
- font-family: inherit;
3202
- cursor: pointer;
3203
- transition: all 0.2s ease;
3204
- }
3205
- .subagent-modal-spawn:hover {
3206
- background: rgba(139, 92, 246, 0.25);
3207
- border-color: rgba(139, 92, 246, 0.5);
3208
- }
3209
-
3210
-
3211
- /* ══════════════════════════════════════════════════════════════════════════
3212
- SCHEDULING PANEL
3213
- ══════════════════════════════════════════════════════════════════════════ */
3214
-
3215
- .scheduling-panel {
3216
- display: flex;
3217
- flex-direction: column;
3218
- gap: 0;
3219
- }
3220
-
3221
- .schedule-count {
3222
- font-size: 10px;
3223
- font-family: var(--font-mono);
3224
- color: var(--accent-green);
3225
- margin-left: 6px;
3226
- font-weight: 600;
3227
- }
3228
-
3229
- .schedule-list {
3230
- display: flex;
3231
- flex-direction: column;
3232
- gap: 4px;
3233
- margin-bottom: 10px;
3234
- max-height: 260px;
3235
- overflow-y: auto;
3236
- }
3237
-
3238
- /* Empty state */
3239
- .schedule-empty {
3240
- display: flex;
3241
- flex-direction: column;
3242
- align-items: center;
3243
- gap: 6px;
3244
- padding: 16px 0;
3245
- }
3246
- .schedule-empty-icon {
3247
- width: 32px;
3248
- height: 32px;
3249
- display: flex;
3250
- align-items: center;
3251
- justify-content: center;
3252
- opacity: 0.35;
3253
- }
3254
- .schedule-empty-icon svg {
3255
- width: 24px;
3256
- height: 24px;
3257
- }
3258
- .schedule-empty-text {
3259
- font-size: 11px;
3260
- font-family: var(--font-mono);
3261
- color: var(--text-muted);
3262
- letter-spacing: 0.04em;
3263
- }
3264
-
3265
- /* Schedule items */
3266
- .schedule-item {
3267
- display: flex;
3268
- align-items: center;
3269
- gap: 10px;
3270
- padding: 8px 10px;
3271
- background: rgba(255,255,255,0.02);
3272
- border: 1px solid rgba(255,255,255,0.05);
3273
- border-radius: 8px;
3274
- cursor: pointer;
3275
- transition: all 0.2s ease;
3276
- }
3277
- .schedule-item:hover {
3278
- background: rgba(255,255,255,0.04);
3279
- border-color: rgba(255,255,255,0.1);
3280
- }
3281
- .schedule-item[data-active="true"] {
3282
- border-color: rgba(52, 211, 153, 0.15);
3283
- }
3284
- .schedule-item[data-active="false"] {
3285
- opacity: 0.5;
3286
- }
3287
-
3288
- /* Toggle dot */
3289
- .schedule-toggle {
3290
- flex-shrink: 0;
3291
- width: 12px;
3292
- height: 12px;
3293
- border-radius: 50%;
3294
- background: var(--text-dim);
3295
- border: 2px solid rgba(255,255,255,0.1);
3296
- transition: all 0.2s ease;
3297
- cursor: pointer;
3298
- }
3299
- .schedule-item[data-active="true"] .schedule-toggle {
3300
- background: var(--accent-green);
3301
- border-color: rgba(52, 211, 153, 0.3);
3302
- box-shadow: 0 0 6px rgba(52, 211, 153, 0.3);
3303
- }
3304
- .schedule-toggle:hover {
3305
- border-color: rgba(255,255,255,0.3);
3306
- }
3307
-
3308
- .schedule-info {
3309
- flex: 1;
3310
- min-width: 0;
3311
- display: flex;
3312
- flex-direction: column;
3313
- gap: 1px;
3314
- }
3315
- .schedule-name {
3316
- font-size: 12px;
3317
- font-weight: 600;
3318
- color: var(--text);
3319
- white-space: nowrap;
3320
- overflow: hidden;
3321
- text-overflow: ellipsis;
3322
- }
3323
- .schedule-next {
3324
- font-size: 10px;
3325
- font-family: var(--font-mono);
3326
- color: var(--text-muted);
3327
- white-space: nowrap;
3328
- overflow: hidden;
3329
- text-overflow: ellipsis;
3330
- }
3331
- .schedule-interval {
3332
- flex-shrink: 0;
3333
- font-size: 10px;
3334
- font-family: var(--font-mono);
3335
- color: var(--text-muted);
3336
- letter-spacing: 0.04em;
3337
- padding: 3px 8px;
3338
- background: rgba(255,255,255,0.03);
3339
- border-radius: 6px;
3340
- }
3341
-
3342
- /* Add schedule button */
3343
- .schedule-add-btn {
3344
- display: flex;
3345
- align-items: center;
3346
- justify-content: center;
3347
- gap: 6px;
3348
- width: 100%;
3349
- padding: 8px;
3350
- background: rgba(52, 211, 153, 0.08);
3351
- border: 1px dashed rgba(52, 211, 153, 0.25);
3352
- border-radius: 8px;
3353
- color: rgba(52, 211, 153, 0.85);
3354
- font-size: 12px;
3355
- font-weight: 600;
3356
- font-family: inherit;
3357
- cursor: pointer;
3358
- transition: all 0.2s ease;
3359
- }
3360
- .schedule-add-btn svg {
3361
- width: 14px;
3362
- height: 14px;
3363
- }
3364
- .schedule-add-btn:hover {
3365
- background: rgba(52, 211, 153, 0.12);
3366
- border-color: rgba(52, 211, 153, 0.35);
3367
- color: var(--accent-green);
3368
- }
3369
-
3370
- /* ── Schedule Modal ──────────────────────────────────────────────────── */
3371
- .schedule-modal-overlay {
3372
- position: fixed;
3373
- inset: 0;
3374
- z-index: 9000;
3375
- display: flex;
3376
- align-items: center;
3377
- justify-content: center;
3378
- background: rgba(0, 0, 0, 0.7);
3379
- backdrop-filter: blur(8px);
3380
- opacity: 0;
3381
- visibility: hidden;
3382
- transition: opacity 0.25s ease, visibility 0.25s ease;
3383
- }
3384
- .schedule-modal-overlay.open {
3385
- opacity: 1;
3386
- visibility: visible;
3387
- }
3388
-
3389
- .schedule-modal {
3390
- position: relative;
3391
- width: 90%;
3392
- max-width: 460px;
3393
- background: linear-gradient(135deg, rgba(15, 15, 25, 0.98), rgba(10, 10, 18, 0.98));
3394
- border: 1px solid rgba(255, 255, 255, 0.1);
3395
- border-radius: 16px;
3396
- box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6), 0 0 1px rgba(255, 255, 255, 0.1);
3397
- transform: scale(0.95) translateY(10px);
3398
- transition: transform 0.25s ease;
3399
- overflow: hidden;
3400
- }
3401
- .schedule-modal-overlay.open .schedule-modal {
3402
- transform: scale(1) translateY(0);
3403
- }
3404
-
3405
- .schedule-modal-header {
3406
- display: flex;
3407
- align-items: center;
3408
- justify-content: space-between;
3409
- padding: 18px 20px 14px;
3410
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
3411
- }
3412
- .schedule-modal-title {
3413
- font-size: 16px;
3414
- font-weight: 600;
3415
- color: var(--text);
3416
- letter-spacing: 0.02em;
3417
- }
3418
- .schedule-modal-close {
3419
- width: 32px;
3420
- height: 32px;
3421
- border: none;
3422
- background: rgba(255, 255, 255, 0.05);
3423
- border-radius: 8px;
3424
- color: var(--text-muted);
3425
- cursor: pointer;
3426
- display: flex;
3427
- align-items: center;
3428
- justify-content: center;
3429
- transition: all 0.2s ease;
3430
- }
3431
- .schedule-modal-close:hover {
3432
- background: rgba(255, 255, 255, 0.1);
3433
- color: var(--text);
3434
- }
3435
-
3436
- .schedule-modal-body {
3437
- padding: 20px;
3438
- display: flex;
3439
- flex-direction: column;
3440
- gap: 14px;
3441
- }
3442
-
3443
- .schedule-form-group {
3444
- display: flex;
3445
- flex-direction: column;
3446
- gap: 5px;
3447
- }
3448
- .schedule-form-label {
3449
- font-size: 10px;
3450
- font-family: var(--font-mono);
3451
- font-weight: 600;
3452
- letter-spacing: 0.1em;
3453
- color: var(--text-muted);
3454
- text-transform: uppercase;
3455
- }
3456
- .schedule-form-input,
3457
- .schedule-form-textarea {
3458
- width: 100%;
3459
- padding: 9px 12px;
3460
- background: rgba(255, 255, 255, 0.04);
3461
- border: 1px solid rgba(255, 255, 255, 0.08);
3462
- border-radius: 8px;
3463
- color: var(--text);
3464
- font-size: 13px;
3465
- font-family: inherit;
3466
- outline: none;
3467
- transition: border-color 0.2s ease;
3468
- }
3469
- .schedule-form-input:focus,
3470
- .schedule-form-textarea:focus {
3471
- border-color: rgba(52, 211, 153, 0.4);
3472
- }
3473
- .schedule-form-textarea {
3474
- min-height: 70px;
3475
- resize: vertical;
3476
- font-family: var(--font-mono);
3477
- font-size: 12px;
3478
- }
3479
-
3480
- /* Interval presets */
3481
- .schedule-interval-presets {
3482
- display: flex;
3483
- flex-wrap: wrap;
3484
- gap: 6px;
3485
- }
3486
- .schedule-interval-btn {
3487
- padding: 6px 12px;
3488
- background: rgba(255,255,255,0.04);
3489
- border: 1px solid rgba(255,255,255,0.08);
3490
- border-radius: 8px;
3491
- color: var(--text-muted);
3492
- font-size: 11px;
3493
- font-family: var(--font-mono);
3494
- cursor: pointer;
3495
- transition: all 0.2s ease;
3496
- }
3497
- .schedule-interval-btn:hover {
3498
- background: rgba(52, 211, 153, 0.08);
3499
- border-color: rgba(52, 211, 153, 0.2);
3500
- color: var(--accent-green);
3501
- }
3502
- .schedule-interval-btn.selected {
3503
- background: rgba(52, 211, 153, 0.12);
3504
- border-color: rgba(52, 211, 153, 0.3);
3505
- color: var(--accent-green);
3506
- }
3507
-
3508
- .schedule-modal-footer {
3509
- padding: 14px 20px 18px;
3510
- border-top: 1px solid rgba(255, 255, 255, 0.06);
3511
- display: flex;
3512
- justify-content: flex-end;
3513
- gap: 10px;
3514
- }
3515
- .schedule-modal-cancel {
3516
- padding: 8px 16px;
3517
- background: rgba(255, 255, 255, 0.05);
3518
- border: 1px solid rgba(255, 255, 255, 0.08);
3519
- border-radius: 8px;
3520
- color: var(--text-muted);
3521
- font-size: 12px;
3522
- font-weight: 500;
3523
- font-family: inherit;
3524
- cursor: pointer;
3525
- transition: all 0.2s ease;
3526
- }
3527
- .schedule-modal-cancel:hover {
3528
- background: rgba(255, 255, 255, 0.08);
3529
- color: var(--text);
3530
- }
3531
- .schedule-modal-save {
3532
- padding: 8px 18px;
3533
- background: rgba(52, 211, 153, 0.15);
3534
- border: 1px solid rgba(52, 211, 153, 0.3);
3535
- border-radius: 8px;
3536
- color: var(--accent-green);
3537
- font-size: 12px;
3538
- font-weight: 600;
3539
- font-family: inherit;
3540
- cursor: pointer;
3541
- transition: all 0.2s ease;
3542
- }
3543
- .schedule-modal-save:hover {
3544
- background: rgba(52, 211, 153, 0.25);
3545
- border-color: rgba(52, 211, 153, 0.5);
3546
- }